C - Отображение одномерного массива в два - Почему это не работает? - PullRequest
0 голосов
/ 08 декабря 2010

Сначала ошибка:

 error: a value of type "float *" cannot be used to initialize an entity of type "float (*)[2000]"

Вот соответствующий код:

#define opType float
const int N = 2000;
opType *a_h,*b_h,*d_h, *a_d,*b_d, *d_d;
opType (*normalized_a)[N] = a_h;
opType (*normalized_b)[N] = b_h;
opType (*normalized_d)[N] = d_h;

opType (*normalized_a_d)[N] = a_d;
opType (*normalized_b_d)[N] = b_d;
opType (*normalized_d_d)[N] = d_d;

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

Эта конструкция заимствована из http://forums.nvidia.com/index.php?showtopic=83941&view=findpost&p=475901

int linear[10*32]; // linear array
int (*twodim)[32] = linear; // interpreted as a two-dimensional [10][32] array.
assert(&twodim[2][4] == &linear[2*32 + 4]); // these are the same

Ответы [ 3 ]

2 голосов
/ 08 декабря 2010

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

Так в каком виде ваши базовые данные и как вы хотите их использовать?

Edit: Хорошо, на основании вашего комментария у вас есть что-то вроде

float myData[N][N];

заполнено значениями. В этой форме вы уже можете получить к нему доступ как myData [i] [j]. Теперь, если вы просто приведете его к указателю с плавающей точкой, как

float *myDataFlat = (float*)myData;

вы также можете получить к нему доступ через myDataFlat [i * N + j].

0 голосов
/ 08 декабря 2010

Я не эксперт в Си;Я думаю, что ошибка из-за несоответствия типов (как это было бы в C ++).
Я думаю, что вы должны выполнить некоторое приведение в присваивании.Чтобы сделать его читабельным, вы должны ввести typedef:

typedef float opType;
const int N = 2000;
typedef opType (*TPointerToArray)[N]; // may be defined outside of a function
opType *a_h; // no value assigned yet
TPointerToArray normalized_a; // no value assigned yet

void MyCode()
{
    ...
    a_h = ...; // i don't know how the value is assigned; it should be done first
    ...
    normalized_a = (TPointerToArray)a_h; // "normalization"
    normalized_a[100][200] = 900; // usage
    ...
}

Я предполагаю, что вы используете глобальные переменные просто для удовольствия;это не имеет большого значения.
В этом коде, технически, normalized_a является указателем на массив, но я могу думать о нем как о массиве массивов или двумерном массиве.

0 голосов
/ 08 декабря 2010

Вы не можете инициализировать массив переменной.Вы можете инициализировать некоторые члены в константу .В этом случае это будет:

opType (*normalized_a)[N] = {0}; /* all members 0 */

или вы можете использовать цикл или memset.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...