c - 使用结构时出错,C

标签 c parsing struct

我的所有 4 个项目结构都收到错误“a3.c:221:20:错误:‘gold’的存储大小未知”。我的代码如下:

void parser(int argc, char **argv)
{
FILE * rooms;
char * theString;
char * theToken;
int numberElements;
int side;
int k;

int placeInt;
int posX;
int posY;
char a[ROOM_STRING_LENGTH];
numberElements = 0;
rooms = fopen(argv[1], "r");

if(rooms == NULL)
{
    printf("error opening file\n");
}
while(fgets(a, ROOM_STRING_LENGTH, rooms) != NULL)
{

    theString = malloc((sizeof(char)*(strlen(a)+1)));
    strcpy(theString, a);

    for(theToken = strtok(theString, " "); theToken; theToken = strtok(NULL, " "))
    {
        printf("the next token: %s\n", theToken);
        if(theToken[0] == '1')
        {

        }
        if(theToken[0] == 'd')
        {
            switch(theToken[1])
            {
                case 'e':
                {
                    side = 1;
                    placeInt = theToken[2] - '0';
                    printf("the side: %d, the place: %d\n", side, placeInt);
                    break;
                }
                case 'w':
                {
                    side = 2;
                    placeInt = theToken[2] - '0';
                    printf("the side: %d, the place: %d\n", side, placeInt);
                    break;
                }
                case 's':
                {
                    side = 3;
                    placeInt = theToken[2] - '0';
                    printf("the side: %d, the place: %d\n", side, placeInt);
                    break;
                }
                case 'n':
                {
                    side = 4;
                    placeInt = theToken[2] - '0';
                    printf("the side: %d, the place: %d\n", side, placeInt);
                    break;
                }
                default:
                {
                    break;
                } 
            }       
        }

        else if(theToken[0] == 'g' || theToken[0] == 'm' || theToken[0] == 'p' || theToken[0] == 'h')
        {
             k = 0;
             while(k <= (strlen(theToken)))
             {

                 switch(theToken[k])
                 {
                     case 'g':
                     posY = theToken[1] - '0';
                     posX = theToken[3] - '0';
                     struct item gold;
                     gold.Xposition = posX;
                     gold.Yposition = posY;
                     printf("the y position: %d, the x position: %d\n",  posY, posX);
                     break;

                     case 'm':
                     posY = theToken[1] - '0';
                     posX = theToken[3] - '0';
                     struct item monster;
                     monster.Xposition = posX;
                     monster.Yposition = posY;
                     printf("the y position: %d, the x position: %d\n",  posY, posX);
                     break;

                     case 'p':
                     posY = theToken[1] - '0';
                     posX = theToken[3] - '0';
                     struct item potion;
                     potion.Xposition = posX;
                     potion.Yposition = posY;
                     printf("the y position: %d, the x position: %d\n",  posY, posX);
                     break;

                     case 'h':
                     posY = theToken[1] - '0';
                     posX = theToken[3] - '0';
                     struct item hero;
                     hero.Xposition = posX;
                     hero.Yposition = posY;
                     printf("the y position: %d, the x position: %d\n", posY, posX);                         
                     break;
                 }
                 k++;
             }
        }
        else if(theToken == NULL)
        {
            printf("end of file");
        }
        numberElements++;
    }

    if(theToken == NULL)
    {
        printf("You've reached the end of the line\n");
    }
    printf("%d\n", numberElements);
}

free(theString);
fclose(rooms);
}



struct item
{
    int Xposition;
    int Yposition;
};

另外,我想知道我将如何访问我刚刚存储在不同函数中的那些结构中的信息。

最佳答案

正如 keltar 和 nonsensickle 已经提到的,您必须先定义 struct item,然后才能使用它的实例:

struct item { int x; int y; }; // this must come first

// ...

struct item item1 {4, 2};

但是,只要您已经声明了结构,就可以在定义之前使用指针:

struct item; // declaration, no definition

// ...

struct item *pitem1;

// ...

struct item { int x; int y; }; // defined later

要在另一个函数中使用 struct 的成员,您可以将 structstruct* 传递给该函数:

void use_struct (struct item i)
{
    int a = i.x, b = i.y;
}

void use_struct_pointer (struct item *pi)
{
    int a = pi->x, b = pi->y;
}

int main()
{
    struct item i {4, 2};
    use_struct(i);
    use_struct_pointer(&i);
    return 0;
}

关于c - 使用结构时出错,C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22395385/

相关文章:

java - 如果我使用 JNI 从 C 的多个线程调用 java 函数会怎样?

C 选择性#define

c++ - 灵气: How can I write a nonterminal parser?

java - simpleDateFormat 不适用于 websphere

c - 在另一个函数中编辑结构体数组

c - 将数据写入双向链表时发生访问冲突

c - C中的双向链表

c# - 解析来自 C# 的 Oracle 查询参数

ios - 类变量值未更新

c - 初始化 C 结构预期的表达式