Интерпретация линейного пространства памяти как 1D, 2D, ..., ND эффективно в C - PullRequest
0 голосов
/ 30 июля 2010

Можно ли выделить 1D памяти

int *x=(int *)malloc(100*sizeof(int));

, а затем преобразовать возвращенный указатель в двумерный массив, например,

int **y=(int **)x;

и получить к нему доступ, как если бы это был двумерный массив, например y[1][2] = 12;

Моя цель - взять сегмент общей памяти и вернуть массив 1D, 2D, ... ND в зависимости от того, как пользователь хочет интерпретировать это линейное пространство с максимальной эффективностью (то есть без объявления нового N-мерного массива и копирования данных в он).

Во второй ноте, есть ли библиотека для C, которая обрабатывает N-мерные массивы, получает из них срезы и эффективно их транспонирует (например, преобразовывает мажор строки в мажор)?

спасибо, bliako

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

Это поможет, заметьте, что d2 не нужно знать во время компиляции.

int *y[d2];
y=(int (*)[d2])x;
1 голос
/ 30 июля 2010

Я не совсем уверен, что приведение вашего int * даст желаемый эффект.

После вашего начального утверждения, x указывает на вашу недавно выделенную память, так что можно делать что-то вроде x[1] = 8;. Память хранит ваши данные (то есть значения вашего массива).

Однако, после вашего второго утверждения, y думает, что оно указывает на int *, эффективно превращая ваши прежние данные в набор int указателей. Все значения, которые вы сохранили ранее, теперь обрабатываются как адреса в других местах в памяти. Вы не просто переопределяете, как вы обращаетесь к памяти, выделенной ранее; Вы полностью переделываете память.

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

Что касается библиотеки для обработки многомерных массивов, прочитайте этот пост: Как мне лучше всего обрабатывать динамические многомерные массивы в C / C ++?

...