2016-08-20 2 views
-1

私は配列personとquantity_persons_countをmain()に戻そうとしていますが、動作させることはできません。私はintと人にvoidを変更しようとしましたが、obv doesntの仕事。関数から構造体とintを渡してメインに戻すにはどうしたらいいですか? C

struct person{..} 
int main(){ 
int o; 
int quantity_persons_count = 0; 
struct person persons[100]; 

while(1){ 

    printf("1.Add a new person"); 
    scanf("%i",&o); 

    switch(o) 
    { 
     case 1: AddPerson(persons,quantity_persons_count); 
       break; 
} 

void AddPerson(struct person *persons, int quantity_persons_count){ 
if(quantity_persons_count == 100){ 
    printf("ERROR.\n"); 
} 
else{ 
    printf("name\n"); 
    scanf("%s",persons[quantity_persons_count+1].name); 
    quantity_persons_count++; 
    printf("done\n"); 

} 

} 
+1

知りません'scanf("%s "、&persons [quantity_persons_count + 1] .name);の宣言は、間違った型のデータを渡すことによって*未定義の動作*を呼び出すようです。 'persons_persons_count + 1] .name'が' char'の配列であれば、 '&'は取り除かなければなりません。 – MikeCAT

+0

戻す配列は何ですか?この関数を 'main()'からどのように呼び出すのですか?どのようにテストしますか? [最小限の、完全で検証可能な例](http://stackoverflow.com/help/mcve)の投稿を検討してください。 – MikeCAT

+0

あなたが知りたいことは、[パラメータは値によって渡されます](http://stackoverflow.com/documentation/c/1006/function-parameters/10900/parameters-are-passed-by-value#t=20160820014330354564) 。 – MikeCAT

答えて

2

あなたはquantity_persons_countへの変更がmainに見えるようにしたい場合は、それへのポインタを渡す必要があります。

void AddPerson(struct person *persons, int *quantity_persons_count){ 

    if(*quantity_persons_count == 100){ 
     printf("ERROR.\n"); 
    } 
    else{ 
     printf("name\n"); 
     scanf("%s",persons[*quantity_persons_count+1].name); 
     (*quantity_persons_count)++; 
     printf("done\n"); 

    } 

} 

その後、あなたはこのようにそれを呼び出す:

AddPerson(persons,&quantity_persons_count); 
+0

エラーが発生しました: 'AddPerson'の相反するタイプ – anon

+1

@anon定義に一致するように関数プロトタイプを変更する必要があります。 – dbush

+0

ありがとう! – anon

関連する問題