Новое в структурах C и C - Как взять структуру в качестве параметра в функции - PullRequest
1 голос
/ 09 сентября 2010

Новый для StackOverflow и новый для C. Я пытаюсь взять struct в качестве параметра в функции 'add_fields', которая добавляет первые два целых поля 'a' и 'b' и помещает результат в поле int «с». Я ничего не получаю от компилятора, поэтому, очевидно, я делаю что-то не так. Я просто не знаю что. Любая помощь будет оценена.

    #include <stdio.h>

    struct add{
    int a;
    int b;
    int c;
    }

    void add_fields(struct add *d){
    d->c = a + b;

    }

    main(){

    struct add data;
    data.a = 1;
    data.b = 2;
    data.c = 0;
    add_fields(data);
    printf("%d + %d = %d", data.a, data.b, data.c);
}

Ответы [ 5 ]

9 голосов
/ 09 сентября 2010

Вы очень близки, но переменные a и b не существуют в этом контексте, вам нужно обращаться к полям через указатель на структуру d:

d->c = d->a + d->b;

Во-вторых, вам нужно передать ссылку на структуру (поскольку add_fields ожидает указатель), когда вы вызываете add_fields:

add_fields(&data);

& указывает, что вы собираетесь передатьадрес переменной data, а не значение.

3 голосов
/ 09 сентября 2010

Вот ваш исправленный код:

#include <stdio.h>

struct add{
    int a;
    int b;
    int c;
};

void add_fields(struct add *d){
    d->c = d->a + d->b;
}

int main(){

    struct add data;
    data.a = 1;
    data.b = 2;
    data.c = 0;
    add_fields(&data);
    printf("%d + %d = %d", data.a, data.b, data.c);

    return 0;
}
  • Вы забыли точку с запятой после определения struct.

  • Мне пришлосьисправьте вашу add_fields функцию.Вы не использовали свои struct для a и b.

  • Вам нужно было передать указатель на add_fields (следовательно, &) в функциивызов.Передав указатель, ваши изменения в add_fields отразились на внешнем вызове struct.

  • main всегда возвращает int.

1 голос
/ 09 сентября 2010

Существует несколько проблем:

В main, data имеет тип struct add.Когда вы звоните add_field, вам нужно передать ему struct add* (то есть указатель на struct add).Чтобы получить указатель на data в main, вам необходимо использовать оператор &:

add_fields(&data);

В add_fields вам необходимо использовать «синтаксис доступа к элементу» (1016 *) для доступа к a и b.

Две другие незначительные проблемы: main должен иметь тип возврата int:

int main() { ...

, и вам необходимопоставьте точку с запятой после закрытия } определения структуры.

0 голосов
/ 09 сентября 2010

Вы должны передавать адрес памяти структуры в функцию add_fields.

add_fields(&data)

** Ух ты, я был очень медленным на этом: P

0 голосов
/ 09 сентября 2010

C - язык вызовов по значению. Когда вы передаете данные, вы передаете копию объекта типа struct add. В вашем поле add_fields вы принимаете указатель на структуру. Поскольку вы хотите изменить поля структуры, вы должны передать адрес структуры данных (и принять указатель на него в add_fields). Для этого

add_fields (& данные);

Кроме того, в add_fields у вас нет неопределенных переменных (a и b). Я предполагаю, что они должны быть из структуры, а?

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