Вложенная структура с динамическим размером в C ++ - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь напечатать данные в showValues ​​(mainStruct *), но я не могу это сделать ..

#include <iostream>
#include <string>
#include <vector>
#include <memory>

typedef struct
{
  uint32_t someNumber;    
}subStruct;

typedef struct{
    uint32_t sizeofSubStruct;
    subStruct subStructArray[1];
}mainStruct;

Эта функция создает mainStruct и заполняет его некоторыми значениями

mainStruct* constructMainStruct()
{
    mainStruct* msPtr;
    msPtr = (mainStruct*)malloc(sizeof(mainStruct)*10);
    msPtr->sizeofSubStruct = 10;

    subStruct* ssPtr = msPtr->subStructArray;
    for(uint32_t i=0; i < msPtr->sizeofSubStruct; i++)
    {
        ssPtr->someNumber = i+10;
        ssPtr++;       
    }             
    return msPtr;
}

Следующая функция ничего не печатает

void showValues(mainStruct* msPtr)
{
    subStruct* ssPtr = msPtr->subStructArray;
    for(uint32_t i=0; i < msPtr->sizeofSubStruct; i++)
    {   
     std::cout << " - " + ssPtr->someNumber <<std::endl;
    }
}

Основная функция

int main()
{
    //contructing mainStruct with some values
    mainStruct* msPtr = constructMainStruct();

    //trying to print values which has been created in above step
    showValues(msPtr);
}

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

Помимо того, что @SoronelHaetir уже заметил, функция showValues не увеличивает значение указателя subStruct.

Код должен выглядеть следующим образом;

void showValues(mainStruct* msPtr)
{
    subStruct* ssPtr = msPtr->subStructArray;
    for (uint32_t i = 0; i < msPtr->sizeofSubStruct; i++)
    {
        std::cout << " - " + ssPtr->someNumber << std::endl;
        ++ssPtr;
    }
}
0 голосов
/ 03 февраля 2019

Ниже приведен рабочий код для showValues ​​

void showValues(mainStruct* msPtr)
{
    subStruct* ssPtr = msPtr->subStructArray;
    for(uint32_t i=0; i < msPtr->sizeofSubStruct; i++)
    {   
     std::cout << (ssPtr+i)->someNumber <<std::endl;
    }
}

, а полный код программы приведен ниже:

#include <iostream>

typedef struct
{
  uint32_t someNumber;    
}subStruct;

typedef struct{
    uint32_t sizeofSubStruct;
    subStruct subStructArray[1];
}mainStruct;

mainStruct* constructMainStruct()
{
    mainStruct* msPtr;
    msPtr = (mainStruct*)malloc(sizeof(mainStruct)*10);
    msPtr->sizeofSubStruct = 10;

    subStruct* ssPtr = msPtr->subStructArray;
    for(uint32_t i=0; i < msPtr->sizeofSubStruct; i++)
    {
        ssPtr->someNumber = i+10;
        ssPtr++;       
    }             
    return msPtr;
}
void showValues(mainStruct* msPtr)
{
    subStruct* ssPtr = msPtr->subStructArray;
    for(uint32_t i=0; i < msPtr->sizeofSubStruct; i++)
    {   
     std::cout << (ssPtr+i)->someNumber <<std::endl;
    }
}

int main()
{
    //contructing mainStruct with some values
    mainStruct* msPtr = constructMainStruct();

    //trying to print values which has been created in above step
    showValues(msPtr);
}
0 голосов
/ 03 февраля 2019

Ваша проблема с печатью (которая ни в коем случае не единственная проблема) находится в строке:

for(uint32_t i=0; i > msPtr->sizeofSubStruct; i++)

Вы инициализируете i в 0, но используете тест "i> msPtr-> sizeofSubStruct;",оно должно быть меньше чем, а не больше чем.

Другие проблемы связаны с размером выделенного файла, это должно быть sizeof (mainStruct) + sizeof (subStruct) * 9, это не большая проблема с вашим SubStructесть сейчас, но как только subStruct станет чем-то сложным, это будет.

...