代码之家  ›  专栏  ›  技术社区  ›  Samuel

重新初始化函数中的结构数组

  •  2
  • Samuel  · 技术社区  · 12 年前

    我是这个网站的新手,对编程也有点陌生。

    我试图声明一个结构数组,然后能够在函数调用中初始化它。然后可以在Main中用不同的值重新初始化它,也可以调用函数来加载不同的值。我遇到了一些需要帮助的编译错误。

    我的代码:

    #include <stdio.h>
    #define MAX_NAMES 5
    
    typedef struct name // Struct template
    {
    int   int_value;
    char *string_value;
    }Name;
    
    void init_struct(struct name SETTINGS); // Function prototype
    
    int main()
    {
    int i;
    
    Name settings[MAX_NAMES];
    
    for(i=0; i<=MAX_NAMES; i++) // Initializes struct
        {
        settings[i] = {1, "Test"};
        }
    
    printf("Before function call:\n-------------\n");
    
    for (i=0; i < MAX_NAMES; i++) // Prints struct
        printf("%i : int_value = %i, string_value = %s\n",
        i, settings[i].int_value, settings[i].string_value);
    
    init_struct(settings[MAX_NAMES]); // Calls function to reinitalize struct
    
    printf("\n\nAfter function call:\n-------------\n");
    
    for (i=0; i < MAX_NAMES; i++) // Prints struct
        printf("%i : int_value = %i, string_value = %s\n",
        i, settings[i].int_value, settings[i].string_value);
    
    return 0;
    }
    void init_struct(struct name SETTINGS)
    {
    int i;
    
    for(i=0; i<=MAX_NAMES; i++) // Redefines struct
        {
        SETTINGS[i] = {{2, "Test2"}};
        }
    }
    

    编译错误:

    在函数“main”中:
    |20 |错误:“{”标记之前应为表达式
    在函数“init_struct”中:
    |45|错误:下标值既不是数组也不是指针也不是矢量
    |45|错误:“{”标记之前应为表达式

    1 回复  |  直到 12 年前
        1
  •  2
  •   Crowman    12 年前

    首先,有了这个:

    Name settings[MAX_NAMES];
    
    for(i=0; i<=MAX_NAMES; i++) // Initializes struct
        {
        settings[i] = {1, "Test"};
        }
    

    只有在 决定性的 一个结构,您已经使用它 Name settings[MAX_NAMES] .你必须这样做 settings[i].int_value = 1; 等等

    对于第二个问题,您声明了一个函数,该函数接受 struct name ,但您试图将其视为一个数组。您应该将其更改为:

    void init_struct(struct name * SETTINGS) {
        int i;
    
        for(i=0; i < MAX_NAMES; i++) {
            SETTINGS[i].int_value = 2;
            SETTINGS[i].string_value = "Test2";
        }
    }
    

    注意从 i <= MAX_NAMES 到 i < MAX_NAMES 。你需要在第一次做这个改变 for 循环。

    你还需要改变 init_struct(settings[MAX_NAMES]); 到 init_struct(settings) 当您调用该函数时。

    就像这样:

    #include <stdio.h>
    #define MAX_NAMES 5
    
    typedef struct name             // Struct template
    {
        int int_value;
        char *string_value;
    } Name;
    
    void init_struct(struct name *SETTINGS);        // Function prototype
    
    int main() {
        int i;
    
        Name settings[MAX_NAMES];
    
        for (i = 0; i < MAX_NAMES; i++)     // Initializes struct
        {
            settings[i].int_value = 1;
            settings[i].string_value = "Test";
        }
    
        printf("Before function call:\n-------------\n");
    
        for (i = 0; i < MAX_NAMES; i++)     // Prints struct
            printf("%i : int_value = %i, string_value = %s\n",
                   i, settings[i].int_value, settings[i].string_value);
    
        init_struct(settings);      // Calls function to reinitalize struct
    
        printf("\n\nAfter function call:\n-------------\n");
    
        for (i = 0; i < MAX_NAMES; i++)     // Prints struct
            printf("%i : int_value = %i, string_value = %s\n",
                   i, settings[i].int_value, settings[i].string_value);
    
        return 0;
    }
    
    void init_struct(struct name *SETTINGS) {
        int i;
    
        for (i = 0; i < MAX_NAMES; i++)     // Redefines struct
        {
            SETTINGS[i].int_value = 2;
            SETTINGS[i].string_value = "Test2";
        }
    }
    

    输出:

    paul@local:~/src/c/scratch$ ./stu
    Before function call:
    -------------
    0 : int_value = 1, string_value = Test
    1 : int_value = 1, string_value = Test
    2 : int_value = 1, string_value = Test
    3 : int_value = 1, string_value = Test
    4 : int_value = 1, string_value = Test
    
    
    After function call:
    -------------
    0 : int_value = 2, string_value = Test2
    1 : int_value = 2, string_value = Test2
    2 : int_value = 2, string_value = Test2
    3 : int_value = 2, string_value = Test2
    4 : int_value = 2, string_value = Test2
    paul@local:~/src/c/scratch$