#struct #malloc #typedef
#структура #malloc #typedef
Вопрос:
Я определил два typedef struct
s, а второй имеет первый в качестве объекта:
typedef struct
{
int numFeatures;
float* levelNums;
} Symbol;
typedef struct
{
int numSymbols;
Symbol* symbols;
} Data_Set;
Затем я определил numFeatures
и numSymbols
и выделил память для обоих symbols
и levelNums
, затем заполнил levelNums
внутри цикла for значением индекса внутреннего цикла, просто чтобы убедиться, что он работает должным образом.
Data_Set lung_cancer;
lung_cancer.numSymbols = 5;
lung_cancer.symbols = (Symbol*)malloc( lung_cancer.numSymbols * sizeof( Symbol ) );
lung_cancer.symbols->numFeatures = 3;
lung_cancer.symbols->levelNums = (float*)malloc( lung_cancer.symbols->numFeatures * sizeof( float ) );
for(int symbol = 0; symbol < lung_cancer.numSymbols; symbol )
for( int feature = 0; feature < lung_cancer.symbols->numFeatures; feature )
*(lung_cancer.symbols->levelNums symbol * lung_cancer.symbols->numFeatures feature ) = feature;
for(int symbol = 0; symbol < lung_cancer.numSymbols; symbol )
for( int feature = 0; feature < lung_cancer.symbols->numFeatures; feature )
cout << *(lung_cancer.symbols->levelNums symbol * lung_cancer.symbols->numFeatures feature ) << endl;
return 0;
Когда levelNums
int
я получаю то, что ожидаю (т.Е. 0,1,2,0,1,2, …), но когда они есть float
, только первые 3 являются правильными, а остальные имеют очень маленькие или очень большие значения, а не 0,1,2, как ожидалось. Тогда у меня есть два вопроса:
- Как
symbols
он узнает, насколько велик aSymbol
, поскольку я еще не определил, насколько большимlevelNums
будет. - Как мне правильно вводить
float
значенияlevelNums
.
Причина, по которой я делаю это так, заключается в том, что это структура данных, которая будет отправлена на графический процессор для программирования GPGPU в CUDA, и массивы не распознаются. Я могу явно отправлять только непрерывный блок памяти, а typedef struct
s используются только для передачи / определения структуры памяти данных.
Комментарии:
1. Я не понимаю часть CUDA. Если у вас есть
int *ptr
, тоptr[i]
это точно так же, как*(ptr i)
. Почему вы делаете эти странные вещи?2. Какой компилятор вы используете? Я попробовал ваш код на Ubuntu, используя gcc 4.4.3, и работает, как ожидалось. Как для int, так и для float результат равен 0,1,2,0,1,2,0,1,2 …
3. @pQB g . Я не ожидал никаких проблем, поэтому я в замешательстве.
4. @kan CUDA является стандартным только для C, но по-прежнему не распознает такие вещи, как ptr [i] [j] . Он распознает ptr[i] Я просто не хотел делать это таким образом.
5. Я тоже. Это связано не с CUDA или GPGPU, а с компилятором / платформой. Не могли бы вы добавить версию g / операционной системы?
Ответ №1:
При встрече выскакивает пара вещей. Во-первых, вы выделили буфер только для уровней первого символа. Аналогично, ваши внутренние циклы всегда повторяют числовые характеристики первого символа.
Вы выполняете множество разыменований массивов, что в целом нормально, но присвоение в частности (внутри первого набора циклов) выглядит очень странно. Вполне возможно, я просто не понимаю, что вы пытаетесь там сделать, но я думаю, что это было бы намного менее запутанным, если бы вы использовали некоторые средства доступа к массиву квадратных скобок.