【问题标题】:Reinitializing array of structs in function在函数中重新初始化结构数组
【发布时间】:2013-10-23 09:16:07
【问题描述】:

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

我正在尝试声明一个结构数组,然后能够在函数调用中对其进行初始化。然后能够在 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|错误:“{”标记之前的预期表达式

【问题讨论】:

    标签: c struct


    【解决方案1】:

    首先,这个:

    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 &lt;= MAX_NAMESi &lt; 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$
    

    【讨论】:

    • 真棒:快速,干净,完整的答案。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多