-2
votes

Struct imbriquée avec une taille dynamique en C ++

J'essaie d'imprimer des données dans Showvalues ​​(grand public *) mais je suis incapable de le faire ..

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

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


14 commentaires

Un membre de tableau flexible est en C, cette question a des balises C ++. C ++ n'a pas de matrices flexibles. Vous devez utiliser std :: vecteur ou std :: tableau en fonction des exigences.


Pourquoi malloc utilisé? Pourquoi pas neuf?


Pourquoi utiliser des pointeurs bruts et des matrices brutes? Il suffit d'utiliser des classes de conteneurs comme std :: vecteur et std :: tableau .


En C ++, l'idiome d'élément de tableau flexible est un comportement indéfini.


Non! Malheureusement, je ne peux pas utiliser de vecteur ou de tableau, cela devrait être tel qu'il est. En ce qui concerne la matrice flexible, car il est c ++, je dois donner une taille [1] telle qu'elle est mentionnée dans le code.


S'il vous plaît expliquer: pourquoi substructurray de sous-transformation [1]; a la taille 1? N'est-ce pas la même chose que substruct_var; ? Ou pourquoi pas Substruct * Substruct_array; ?


Je parle d'un code de production qui est écrit dans 80 et ne peut pas être modifié et les interfaces sont définies comme ces structures.


@Ali "Je parle d'un code de production qui est écrit dans des années 80" bonne chance avec ce code dans la production. Je considère sérieusement que je prendrais sérieusement les efforts et le refacteur qui shite.


@ ννντα ῥεῖ Yep, sûr :)


ConstructMainStructeur est incorrect. Il ne construit pas la matrice de Substruct correctement. Il mélange des pointeurs de domestique et Substruct . Il crée 10 standard (code> s), puis itération comme si 10 Substructs ont été créés. Ceci est tout simplement faux. Rien à faire, mais jetez-le et réécrivez-le correctement.


showvalues ​​ affiche simplement la valeur de SSPTR-> Somenumumber - répétablement la même valeur. SSPTR n'est jamais changé pour pointer quelque chose d'autre.


Envisager de remplacer les instructions d'impression avec l'équivalent C et la procédure en C avec un compilateur C.


Vous avez manqué la balise C ++, mais cela fait une autre partie du code plutôt curieux ... Par exemple, pourquoi utiliser Typedef pour définir les types-alias pour les structures? Les noms de classe et de structure sont également des noms de type, donc par ex. Struct Substruct {...}; est suffisant pour définir un "type" Substructeur .


En C ++, pour effectuer l'élément de tableau flexible, utilisé typedef struct {uint32_t tailleofsubtructructeur; Substructarrata de sous-transformation [1024]; } Mainstruct; puis réduisez 1024 à la valeur la moins nécessaire. Ce sera non ub (et aussi bien pour le code C aussi).


3 Réponses :


3
votes

Votre problème d'impression (qui n'est en aucun cas le seul problème) est dans la ligne:

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


3 commentaires

La taille doit être offsetof (supporters, substructarrataray) + Tailleof (Substruct) * 10 . Mais c'est probablement tout ub quand même.


Oui! Vous avez raison de "i> msptr-> ..", c'était une faute de frappe tout en écrivant un exemple de code ici. Malgré la correction de cela, il n'imprime pas.


@Ali je pense que cela devrait, mais en tout cas de savoir ce qui se passe, vous devez utiliser un débogueur.



1
votes

Outre ce que @soronelhaetir a déjà remarqué, la fonction showvalues ​​ n'émendait pas le pointeur Substructeur .

Le code doit ressembler à ceci; < Pré> xxx


0 commentaires

0
votes

Voici suivi est le code de travail pour showvalues ​​ xxx

et complet code programme est comme ci-dessous: xxx


0 commentaires