Правка. Теперь мне известно о путанице между массивом и указателем. Я ценю замечания, но не буду уточнять вопрос, так как он потеряет часть причины, по которой я его написал.
Я пытаюсь инициализировать структуру, состоящую из структур, каждая из которых содержит массив. Более четко, у меня есть эта матричная структура:
typedef struct
{
uint16_t numRows; /**< number of rows of the matrix. */
uint16_t numCols; /**< number of columns of the matrix. */
float32_t *pData; /**< points to the data of the matrix. */
} arm_matrix_instance_f32;
и мне нужно объединить несколько этих матричных объектов в большую структуру
typedef struct
{
arm_matrix_instance_f32 A;
arm_matrix_instance_f32 B;
arm_matrix_instance_f32 C;
} dataset;
Для справки: это определение матрицы и функция инициализации, используемая позже, взяты из библиотеки arm_math
в CMSIS. .
Мне трудно понять, как мне создать переменную dataset
. После ответов и обсуждения на этой странице вопросов я понимаю Я не могу волшебным образом ожидать, что C узнает, сколько памяти выделить с помощью такого объявления, как dataset d
.
Следуя только решению связанного вопроса, я придумал функцию для инициализации достаточного пространства для dataset
и функцию для создания переменной типа dataset
. У меня сейчас что-то вроде этого:
dataset* create_dataset( void ) {
uint8_t n_matrices = 3;
uint8_t n_elements = 9;
dataset* d= malloc( n_matrices * (sizeof(float32_t)*n_elements + sizeof(uint16_t)*2));
memset(d, 0, sizeof(*d));
const float32_t zeros33_f32[9] =
{
0.0, 0.0, 0.0,
0.0, 0.0, 0.0,
0.0, 0.0, 0.0,
};
const float32_t zeros31_f32[3] =
{
0.0,
0.0,
0.0,
};
const float32_t zeros13_f32[3] =
{
0.0, 0.0, 0.0,
};
arm_mat_init_f32( &(d->A), 3, 3, (float32_t *)zeros33_f32);
arm_mat_init_f32( &(d->B), 3, 1, (float32_t *)zeros31_f32);
arm_mat_init_f32( &(d->C), 1, 3, (float32_t *)zeros13_f32);
return d;
}
В основном я исхожу из предположения, что известно как количество матриц, так и максимальное количество содержащихся в них элементов, и, следовательно, резервируется достаточно памяти.
У меня есть следующие вопросы:
- Является ли общий подход правильным для таких вложенных структур?
- Правильно ли распределено пространство для структуры
dataset
? - Действительно ли я гарантирую, что все элементы
arm_matrix_instance_f32
, содержащиеся в структуреdataset
, которую я создаю, имеют достаточно места для всех своих элементов? - Я объявил структуру как содержащую
A, B, C
. Что произойдет, если я инициализирую их в другом порядке? Например, как структура узнает, сколько места нужно оставить междуA
иC
, еслиB
еще не объявлено?
memset(d, 0, sizeof(*d));
не собирается обнулять ваши данные. Используйте для этогоcalloc
- person Jean-François Fabre   schedule 18.07.2018arm_mat_init_f32
здесь: cs.indiana. edu/~bhimebau/CMSIS/Documentation/DSP/html/ Интересно, а где такая функция, какarm_mat_release_f32
? Если такой функции не существует, я могу предположить, чтоarm_mat_init_f32
просто заполняет поляarm_matrix_instance_f32
и не делает никаких распределений. В этом случае ваш код неверен, потому что после выхода из функцииcreate_dataset
все указателиpData
становятся недействительными. - person Alex F   schedule 18.07.2018struct
нет массива. Указатель не является массивом. И это, кажется, какая-то система MCU с голым железом. Как правило, очень плохая идея использоватьmalloc
& co в таких системах. - person too honest for this site   schedule 18.07.2018dataset
, в которой указатели на структурыarm_matrix_instance_f32
не должны теряться. Я ошибся? - person raggot   schedule 18.07.2018pData
становятся недействительными, когда возвращаетсяcreate_dataset
, поскольку они указывают на локальные массивы. - person Alex F   schedule 18.07.2018