Преобразование указателя C в трехмерный массив - PullRequest
0 голосов
/ 14 марта 2019

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

По сути, я просто хочу временно обработать целочисленную группу и трехмерный массив, чтобы быть уверенным, что я не ошибаюсь в математике указателя.(Я смотрю на это в настоящее время, потому что предыдущий код сделал несогласованные назначения памяти).

#include <stdlib.h>
#define GROUPCOUNT 16
#define SENSORCOUNT 6
#define SENSORDIM   3
int main()
{
int *groupdata = (int *)calloc(GROUPCOUNT * SENSORCOUNT * SENSORDIM,sizeof(int));
int sensordata[SENSORCOUNT*SENSORDIM];
sensordata[7] = 42;  //assign some data 
int (*group3d)[GROUPCOUNT][SENSORCOUNT][SENSORDIM] = groupdata; //<---Here is the problem
group3d[1][5][1] = sensordata[7];  //I want to do this
free(groupdata);
}

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

примечание: Трехмерный актерский состав должен использоваться функциональным образом в недрах программы.Пример - просто минимально жизнеспособная программа для меня, чтобы попытаться разобраться в коде.

Ответы [ 3 ]

1 голос
/ 14 марта 2019
  int l = 5, w = 10, h = 15;
  int Data = 45;
  int *k = malloc(l * w * h * sizeof *k);
  // not use this k[a][b][c] = Data;
  //use this is right
   k[a*l*w + b*l + c] = Data;
1 голос
/ 14 марта 2019

Когда group3d определено с int (*group3d)[GROUPCOUNT][SENSORCOUNT][SENSORDIM], тогда *group3d - это трехмерный массив. Это позволит вам использовать его с (*group3d)[1][5][1].

Чтобы использовать его с group3d[1][5][1], вам нужно group3d, чтобы быть указателем на двумерный массив:

int (*group3d)[SENSORCOUNT][SENSORDIM] = (int (*)[SENSORCOUNT][SENSORDIM]) groupdata;

(Существуют некоторые технические проблемы с семантикой C при наложении псевдонима массива int в виде массива массива массива int, но это не проблема в обычных компиляторах с настройками по умолчанию. Однако это будет предпочтительнее всегда использовать память как массив массивов массива int, а не как массив int.)

0 голосов
/ 14 марта 2019

В приведенном выше примере я хочу временно обрабатывать групповые данные как group3d для назначений, и я просто не могу обернуться вокруг кастинга.

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

int (*group3d)[GROUPCOUNT][SENSORCOUNT][SENSORDIM] = calloc(1, sizeof(int [GROUPCOUNT][SENSORCOUNT][SENSORDIM]));

(*group3d)[1][5][1] = sensordata[7];  //I want to do this

/* Then you can print it like */
printf("%d\r\n", (*group3d)[1][5][1]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...