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

时间:2013-10-23 00:28:52

标签: c struct

我是这个网站的新手,对编程很新。

我试图声明一个结构数组,然后能够在函数调用中初始化它。然后能够在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 个答案:

答案 0 :(得分: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;等等。

对于第二个问题,您声明了一个接受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_NAMESi < 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$