2016-08-16 2 views
-2

так что я получил следующие структуры:Как инициализировать массив структуры внутри другой структуры?

typedef struct typeData{ 
    char name[20]; 
    double weightIn; 
    double weightOut; 
}dataType; 

typedef struct fifoTable{ 
    unsigned short int start; 
    unsigned short int end; 
    dataType data[N]; 
} fifoTable; 

и следующую функцию, которая должна инициализировать структуру:

fifoTable *initFifo(){ 
    fifoTable table; 
    table.start = 0; 
    table.start = 0; 
    dataType data[N]; 
    table.data = data; 
    return table; 
} 

Проблемы я сталкиваюсь, что я получаю сообщение об ошибке, говорящее: «назначение к выражению с типом массива ". Я просмотрел его, поэтому решил, что инициализировать массив внутри такой структуры невозможно. Я нашел несколько примеров с массивами char, int и т. Д. Но поскольку в структуре dataType есть другие элементы, я не могу найти способ инициализировать эту таблицу:/Как я могу это сделать?

Спасибо за ваши ответы.

+2

Вы пытаетесь вернуть переменную стека в качестве указателя в код инициализации. Вы должны использовать malloc. –

+0

@ChristopherSchneider: На языке C нет стека. 'table' - автоматическая переменная. Но да, переменная не работает после возвращения, таким образом, любой доступ - UB. Однако это не причина ошибки компилятора. – Olaf

+0

@Olaf Где я могу прочитать об этом? Это первый раз, когда я это слышал. –

ответ

1

Это не будет работать по ряду причин.

Во-первых, массив не является назначаемым значением lvalue. Это означает, что он не может появиться с левой стороны задания, как вы пытаетесь сделать.

Обратите внимание, что инициализация (которая происходит во время определения переменной) не совпадает с назначением. Например, вы можете сделать это:

int a[3] = { 3, 4, 5 }; 

Но не так:

int a[3] = { 3, 4, 5 }; 
int b[3]; 
b = a; 

Вы также возвращающая fifoTable из вашей функции в то время как он объявил вернуть fifoTable *.

Возможно, вам захочется динамически выделять память для вашей структуры, обнулить ее и вернуть указатель. Вы делаете это следующим образом:

fifoTable *initFifo(){ 
    fifoTable *retval = calloc(1, sizeof(fifoTable)); 
    if (!retval) { 
     perror("calloc failed"); 
     exit(1); 
    } 
    return retval; 
} 
1

Вы объявляете «данные» и «стол» в стек и возвращает указатель на него, но объем этих деклараций заканчивается в функции так указатели являются недействительными.

Если вы хотите вернуть «fifoTable», используйте malloc для распределения памяти и возврата указателя на это, например.

fifoTable *initFifo(){ 
    fifoTable* table = malloc(sizeof(fifoTable)); 
    table->start = 0; 
    table->start = 0; 
    dataType data[N]; 
    /* initialize data somehow */ 
    memcpy(table.data, data, sizeof(table.data)); 
    return table; 
} 
+1

Почему бы не установить данные элемента напрямую? – 2501

1

Задача 1

проблема ... "присваивание выражения с типом массива".

table.data = data; 

Я полагал, что это не возможно, чтобы инициализировать массив внутри структуры, как это.

Код не является Инициализация массив. Код пытается выполнить назначение .

Чтобы скопировать содержимое массива в другой массив, используйте memcpy()

memcpy(table.data, data, sizeof table.data);` 

Проблему 2

возврат Функции типа является указателем: fifoTable *, но код пытается вернуть структуру: fifoTable

fifoTable *initFifo(void){ 
    fifoTable table; 
    ... 
    return table; 
} 

Чтобы вернуть структуру (к возвращать указатель является более распространенным), объявить тип возвращаемого значения, чтобы соответствовать

fifoTable initFifo(void){ 
    fifoTable table; 
    ... 
    return table; 
} 

Чтобы вернуть указатель, возвращает указатель на действительный memroy, возможно, путем выделения его.

fifoTable *initFifo(void) { 
    return calloc(1, sizeof(fifoTable)); 
} 

Задача 3 (вопрос название)

Как я могу инициализировать массив в структуры внутри другой структуры?

Один элемент за раз.

#define N 4 

fifoTable initFifo(void) { 
    dataType data[N]; 
    fifoTable table = { 0, 0, {data[0], data[1], data[2], data[3]} }; 
    return table; 
} 
Смежные вопросы