2009-10-04 6 views
0
#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; 
} 

dans le code ci-dessus im obtenir une erreurerreur dans la structure retour fonction

ne peut pas convertir à l'amiable à l'amiable * en retour

+0

Je marquerais la langue aussi :) –

+0

@meder: Done :) –

+0

btw, la mise en forme est assez foiré. – gimpf

Répondre

6

Vous retournez un (à l'amiable *) - un pointeur à un amiable, mais votre fonction crée un (amiable) (pas un pinter à un).

Au lieu de déclarer

 
amicable record; 

vous devez faire (ou un équivalent):

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

et ensuite accéder via "Record->" plutôt que "enregistrement".

Remarque: Avec l'approche ci-dessus, vous devrez libérer() l'allocation ci-dessus lorsque vous en aurez fini.

+0

Merci dribeas - faute de frappe! Maintenant corrigé. –

8

getAmicablePairs déclare renvoyer un pointeur vers un amicable:

amicable *getAmicablePairs(...) 

mais vous essayez ensuite de retourner un amicable:

return record; 

plutôt qu'un pointeur vers un.

Notez que l'on fixe « évidente », ce qui est de retourner un pointeur vers record:

return &record; 

ne fonctionnera pas, parce que vous seriez renvoyant un pointeur sur une variable qui était sur le point d'aller dès que getAmicablePairs revient. Au lieu de cela, vous devez créer un enregistrement en utilisant malloc et le renvoyer; quelque chose comme ceci:

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

Vous aurez besoin de changer tous vos record. en record->.

Notez également que vous écrivez dans le membre amicablePair de votre structure sans l'allouer - cela va provoquer un plantage. Vous devez malloc le amicablePair ainsi que le amicable.

Questions connexes