выделение достаточного количества памяти с помощью объекта структуры typedef, размер которого изменяется в другой структуре typedef - PullRequest
0 голосов
/ 26 октября 2011

Я определил два typedef struct с, а второй имеет первое как объект:

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, как ожидалось.Затем у меня есть два вопроса:

  1. Когда выделяется память для symbols, как он узнает, насколько велик Symbol, поскольку я еще не определил, насколько большим будет levelNums.
  2. Как правильно получить float значения в levelNums.

Причина, по которой я это делаю, заключается в том, что это структура данных, которая будет отправлена ​​в графический процессор дляПрограммирование GPGPU в CUDA и массивах не распознаются.Я могу только явно отправлять непрерывный блок памяти, а typedef struct только для передачи / определения структуры памяти данных.

1 Ответ

0 голосов
/ 11 января 2012

Пара вещей выпрыгивают при встрече.С одной стороны, вы только выделили буфер для levelNums первого символа.Точно так же ваши внутренние циклы всегда зацикливаются на numFeatures первого символа.

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

...