Назначить массив массиву в структуре - PullRequest
1 голос
/ 04 июня 2019

Я пытаюсь присвоить массив одному из полей структуры typedef, и я не могу найти способ сделать это практически.

Я искал эту проблему, но, похоже, всенайти ответы для массивов char *, а это не то, что я ищу, я просто пытаюсь присвоить массив массиву int и ищу практичный способ работы кода ниже без инициализации всехпеременные в структуре (они будут инициализированы позже, но я просто хочу установить переменную массива):

typedef struct {
    int array[5];
    int number;
} Rot;

Rot RA;

void config()
{
    RA.array = {1, 2, 3, 4, 5}; //This returns an "expected expression before "{"" error
    int arr[5];
    int i;
    for (i = 0; i < 5; i++)
    {
        arr[i] = i + 1;
    }
    RA.array = arr; //I understand why this fails, but I need to do this in a practical way
}

Пожалуйста, предположите, что config вызывается позже, и структура и RA все доступны для него.

Ответы [ 3 ]

3 голосов
/ 04 июня 2019

RA.array = {1, 2, 3, 4, 5};

memcpy(RA.array, (int[]){1, 2, 3, 4, 5}, sizeof RA.array);

RA.array = arr;

memcpy(RA.array, arr, sizeof arr); // better: sizeof RA.array
1 голос
/ 04 июня 2019

Вы можете использовать memcpy, как показано в другом ответе, или скопировать всю структуру, как показано в другом ответе (хотя в вашем вопросе говорится, что вы просто хотите установить массив, а не остаток структуры).

Другой вариант - встроить только массив в другую структуру:

typedef struct {
    int elem[5];
} RotArr;

typedef struct {
    RotArr arr;
    int number;
} Rot;

Затем вы можете получить доступ к элементу i массива в Rot RA как RA.arr.elem[i]. Также вы можете присвоить значения всему объекту RotArr. Остальная часть вашего кода может выглядеть примерно так:

Rot RA;

void config(void)
{
    RA.arr = (RotArr){{1, 2, 3, 4, 5}};
    RotArr arr;
    int i;
    for (i = 0; i < 5; i++)
    {
        arr.elem[i] = i + 1;
    }
    RA.arr = arr;
}

Обратите внимание, что (RotArr){{1, 2, 3, 4, 5}} представляет собой составной литерал значение типа RotArr. Это также может быть записано как (RotArr){ .elem = {1, 2, 3, 4, 5} } или (RotArr){ .elem = { [0] = 1, [1] = 2, [2] = 3, [3] = 4, [4] = 5 } }, чтобы было абсолютно ясно, какие части составного литерала устанавливаются явно (все остальные части будут установлены в 0), но, поскольку он имеет только один член, эти формы составное литеральное значение немного чрезмерно.

1 голос
/ 04 июня 2019

Вы можете использовать memcpy, как показано в другом ответе.Или, в качестве альтернативы, скопируйте всю структуру, а не только массив, используя временную переменную в виде составного литерала :

RA = (Rot) { {1, 2, 3, 4, 5}, 0 };

Это возможно, поскольку C не позволяетво время выполнения присваивает массивы, это позволяет ему структур.

...