2

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

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

4

1 回答 1

2

首先,有了这个:

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;等等。

对于第二个问题,您声明了一个接受 a 的函数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$
于 2013-10-23T00:41:24.113 回答