ошибка в функции, возвращающей структуру - PullRequest
0 голосов
/ 04 октября 2009
#include<stdio.h>
#include "amicablenumber.h"

int i,j;
struct amicable         
{
    int **amicablePair;
    int size;
};

main()
{

int startnum = 250;
int endnum = 1000;
struct amicable* ami;

ami = getAmicablePairs(startnum, endnum);   

printf("{");
for(int i = 0; i<ami->size; i++)
{
printf("{%d, %d}",ami->amicablePair[i][0], ami->amicablePair[i][1]);
}
printf("}");
}

amicable *getAmicablePairs(int startnum,int endnum)
{
    int size=0;
    int sumfactors(int);
    amicable record;
 for(i=startnum;i<=endnum;i++)
 {
 for(j=endnum;j>=startnum;j--)
 {
 if((sumfactors(i)==j)&&(sumfactors(j)==i) && (i!=j))
 {
  record.amicablePair[size][0]=i;
  record.amicablePair[size][1]=j;

  size++;
 }}}
 record.size=size;
 return record;
 }

  int sumfactors(int number)
 {
 int sum=0;
 for(i=1;i<number;i++)
 {
 if(number%i==0)
 sum +=i;
 }
 return sum;
 }

в приведенном выше коде я получаю сообщение об ошибке

не может преобразовать мировое соглашение в мировое * взамен

Ответы [ 2 ]

8 голосов
/ 04 октября 2009

getAmicablePairs объявлено как возвращающее указатель на amicable:

amicable *getAmicablePairs(...)

но затем вы пытаетесь вернуть amicable:

return record;

, а не указатель на единицу.

Обратите внимание, что есть одно "очевидное" исправление, которое заключается в возвращении указателя на record:

return &record;

не будет работать, потому что вы вернете указатель на переменную, которая должна была исчезнуть, как только вернется getAmicablePairs. Вместо этого вам нужно создать запись, используя malloc и вернуть ее; как то так:

amicable *record = (amicable*) malloc(sizeof(amicable));

Вам нужно будет изменить все ваши record. на record->.

Обратите внимание, что вы записываете в amicablePair элемент вашей структуры, не выделяя его - это вызовет сбой. Вам нужно malloc amicablePair, а также amicable.

6 голосов
/ 04 октября 2009

Вы возвращаете (amicable *) - указатель на amicable, но ваша функция создает (amicable) (не pinter to one).

Вместо объявления

amicable record;

вам нужно сделать это (или эквивалент):

amicable *record = (amicable *) malloc(sizeof(amicable));

, а затем получить доступ через «запись->» вместо «запись».

Примечание. При вышеуказанном подходе вам нужно будет освободить () указанное выше распределение, когда вы закончите с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...