2017-01-26 3 views
0

Я пытаюсь передать структуру по ссылке в C, чтобы я мог изменять значения внутри функции. Это код, который у меня есть до сих пор, но он вызывает некоторые предупреждения и одну ошибку.C - передать структуру по ссылке

main.c

#include <stdio.h> 
#include "myfunctions.h" 
#include "structures.h" 

int main(int argc, char const *argv[] { 

    struct MyStruct data; 

    data.value = 6; 

    printf("Before change: %d\n", data.value); 

    changeData(data); 

    printf("After change: %d\n", data.value); 

} 

myfunctions.c

#include "structures.h" 

void changeData(MyStruct data) { 
    data.value = 7; 
} 

myfunctions.h

#ifndef MyStruct 
#define MyStruct 

void changeData(MyStruct data); 

#endif 

structures.h

typedef struct { 

    int value; 

} MyStruct; 

Ошибки Произведено

In file included from main.c:2:0: 
myfunctions.h:4:1: warning: parameter names (without types) in function declaration 
void changeData(MyStruct data); 
^ 
In file included from main.c:3:0: 
structures.h:5:1: warning: unnamed struct/union that defines no instances 
} MyStruct; 
^ 
main.c: In function ‘main’: 
main.c:9:5: error: ‘data’ undeclared (first use in this function) 
    data.value = 6; 
    ^
main.c:9:5: note: each undeclared identifier is reported only once for each function it appears in 
+1

'недействительным changeData (MyStruct * данные)' и 'changeData (& data) ' –

+0

Если вы хотите передать указатель на структуру, вам нужно сделать это явно. –

+0

Убедитесь, что вы указали ** Связанные ** в правой части страницы. Ваш заголовок появляется много раз. –

ответ

6

Вот и все, вызванные

#define MyStruct 

С этой линией, вы определили MyStruct как макрос, который ничего не содержит. То есть вы эффективно удалить все вхождения MyStruct в следующем коде, поэтому компилятор так путаются видеть вещи, как

typedef struct { 

    int value; 

} ; 

или

void changeData(data); 

Чтобы исправить это, используйте

#ifndef MYFUNCTIONS_H_ 
#define MYFUNCTIONS_H_ 

вместо этого. (Вот почему мы используем имена ALL_UPPERCASE для макросов: во избежание случайных совпадений имен с обычными идентификаторами.)

0

, применяя все мои комментарии и устраняя ненужный «typedef» и помещая все это в один файл (Примечание: нет никаких проблем с извлечением различных файлов), результаты в следующем коде:

#ifndef STRUCTURES_H 
#define STRUCTURES_H 

struct MyStruct 
{ 
    int value; 
}; 
#endif // STRUCTURES_H 



#ifndef MYFUNCTIONS_H 
#define MYFUNCTIONS_H 

void changeData(struct MyStruct *data); 

#endif // MYFUNCTIONS_H 





#include <stdio.h> 
//#include "myfunctions.h" 
//#include "structures.h" 

int main(void) 
{ 
    struct MyStruct data; 

    data.value = 6; 

    printf("Before change: %d\n", data.value); 

    changeData(&data); 

    printf("After change: %d\n", data.value); 
} // end function: main 



//#include "structures.h" 

void changeData(struct MyStruct *data) 
{ 
    data->value = 7; 
} // end function: changeData 

, который аккуратно собирает и действительно делает нужную операцию