2015-10-19 2 views
0

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

struct information{ 
     int number; 
}; 
typedef struct information Jack; 
typedef struct information Joe; 

а затем функция.

foo(struct information Name , int randomNumber) { 
    Name.number = randomNumber; 
} 

Однако, когда я печатаю Jack.number и Joe.number, он печатает 0.

void main() { 
    int h =5; 
    foo(Joe,h); 
    foo(Jack,h); 
    printf("%d",Jack.number); 
    printf("%d",Joe.number); 
    } 

Есть ли способ решить эту проблему и создать такую ​​обобщенную функцию?

+0

Где находится ваш код для печати? – owacoder

+0

Как вы уверены, randomNumber не был 0. –

+0

Ваша функция foo должна возвращать структуру информации или использовать указатели void use. – harre

ответ

1

Вы пропусканием struct по значению. Независимо от того, какие изменения вы внесете в Name в foo, действует только на копию объекта в foo. Он не изменяет значение объекта в вызывающей функции.

Если вы хотите, чтобы изменения вступили в силу в вызывающей функции, вам необходимо передать указатель на него. Для этого вам необходимо изменить интерфейс foo.

foo(struct information* Name , int randomNumber) { 
    Name->number = randomNumber; 
} 

Вам также нужно будет изменить вызов, чтобы он соответствовал интерфейсу.

foo(&Joe,h); 
foo(&Jack,h); 
+0

Что делать, если я хотел бы получить доступ к значению внутри «foo»? Так, например, внутри foo я бы хотел сделать: Joe.name = Joe.name - 2? –

+0

Кажется, я получаю ошибку: ожидаемое выражение перед Джо –

+0

@JohnnyBravo, вы можете это сделать, но не делайте этого. Пусть функция работает только с переданными ей аргументами. –

1

C передает структуры по значению (как и любой другой тип аргумента). Если вы хотите, чтобы увидеть изменения за пределами функции, передать его по ссылке:

void foo(struct information *name, int randomNumber) { 
    name->number = randomNumber; 
} 

foo(&joe, 42); 
2

Может быть, вы должны передать указатель на вашу структуру, как это:

foo(struct information *Name , int randomNumber) { 
    Name->number = randomNumber; 
} 

Вы могли бы назвать вашу функцию, как это :

foo (&Jack, 42); 

[Изменить] О, и что-то не так с вашими объявлениями. Может быть, вы могли бы объявить свои объекты, как это:

typedef struct informationStruct { 
     int number; 
} Information; 

Information Jack; 
Information Joe; 

и вашу функцию:

foo(Information *Name , int randomNumber) { 
    Name->number = randomNumber; 
} 
0

Помните, что C передает значения, а не значения. Так как все упомянули, вы можете передать адрес структуры (которую вы хотите изменить) в функцию, а затем изменения, внесенные в структуру внутри этой функции, будут автоматически отражены в основной функции.

Смежные вопросы