Что я делаю неправильно? (C программирование, указатели, структуры, функции) - PullRequest
3 голосов
/ 09 января 2011

Я не уверен, правильно ли я использую malloc, но меня беспокоит невозможность передать структуру в указатель функции put_age (). Это выглядит правильно для меня, но, видимо, это не так.

#include <stdio.h>
#include <stdlib.h>

typedef struct{
  int age;
  // NPC methods
 int (*put_age)(NPC *character, int age);
} NPC;

////////////////////////////////////

int set_age(NPC *character, int age);

int main(){
  NPC *zelda = malloc(sizeof(NPC));
  zelda->put_age = set_age;
  zelda->put_age(zelda, 25);
  printf("Zelda's age is %d\n", zelda->age);

  return 0;
}

int set_age(NPC *character, int age){
  character->age = age;     
  return 0;
}

ВЫХОД КОМПИЛЕРА:

$ gcc ~/test.c
/test.c:7:21: error: expected ‘)’ before ‘*’ token
/test.c:8:1: warning: no semicolon at end of struct or union
/test.c: In function ‘main’:
/test.c:16:8: error: ‘NPC’ has no member named ‘put_age’
/test.c:17:8: error: ‘NPC’ has no member named ‘put_age’

Ответы [ 5 ]

16 голосов
/ 09 января 2011

Ваша проблема в том, что NPC не является именем типа до тех пор, пока не будет завершено объявление struct typedef.Вы можете изменить это, указав имя структуры, например,

typedef struct tagNPC {
  int age;
  // NPC methods
  int (*put_age)(struct tagNPC *character, int age);
} NPC;

или

typedef struct tagNPC NPC;

struct tagNPC {
  int age;
  // NPC methods
  int (*put_age)(NPC *character, int age);
};
3 голосов
/ 09 января 2011

Не думаю, что вы можете использовать typedef "NPC" внутри struct def.Это потому, что пока компилятор не увидит закрывающий "}", он не знает, что такое NPC.

Пожалуйста, попробуйте изменить:

typedef struct{
  int age;
  // NPC methods
 int (*put_age)(NPC *character, int age);
} NPC;

на:

typedf struct node_npc NPC;

struct node_npc
{
    int age;
    int (*put_age)(NPC *character, int age);
};
2 голосов
/ 09 января 2011

Попробуйте изменить это:

int set_age(NPC *character, int age){
  zelda->age = age;     
  return 0;
}

Кому:

int set_age(NPC *character, int age){
  character->age = age;     
  return 0;
}
1 голос
/ 09 января 2011

В set_age() имя вашей переменной - character, а не zelda, поэтому код должен быть:

int set_age(NPC *character, int age){
  character->age = age;     
  return 0;
}
0 голосов
/ 09 января 2014

У меня была такая проблема, когда в моем коде было определенное постоянное программное обеспечение, которое было названо как член структуры. Ex.

#define N 10 

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