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

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

  1. Как symbols он узнает, насколько велик a Symbol , поскольку я еще не определил, насколько большим levelNums будет.
  2. Как мне правильно вводить 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:

При встрече выскакивает пара вещей. Во-первых, вы выделили буфер только для уровней первого символа. Аналогично, ваши внутренние циклы всегда повторяют числовые характеристики первого символа.

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