2017-07-06 3 views
0

Essayer de minimiser nombre de lignes pour un tableau CICO chercher en stockant une struct contenant un tampon char dans un vecteur, le code ci-dessous:CICO - setDataBuffer + vecteur <struct>

struct Columns { char buffer[1000][300]; }; 

    int i = 1; 
    Columns col; 
    ub4* ub = NULL; 
    results->setDataBuffer(i++, col.buffer, OCCI_SQLT_STR, sizeof(col.buffer[ 0 ]), ub); 
     vec.push_back(col); 

    cout << "Before, vec size: " << vec.size() << "\n"; // prints 1, as expected 
    while (results->next(1000)) { 
     for (size_t j = 0; j < results->getNumArrayRows(); ++j) { 
      cout << vec[ 0 ].buffer[ j ] << endl; 
     } 

Maintenant, pour une raison quelconque, ce travail ne marche pas . Toutefois, si au lieu d'utiliser col.buffer, je crée un tampon de char [1000] [300] et jetez-le dans setDataBuffer puis dans la partie cout faire: cout < < tampon [j] < < endl;

qui fonctionne très bien. Donc, je ne suis pas vraiment sûr d'où je me fous?

le tampon de caractères est exactement la même chose que le fichier col.buffer, n'est-ce pas?

Je ne pense pas que cela soit important, mais struct Columns est défini dans le fichier d'en-tête.

Répondre

1

Je suppose que le setDataBuffer remplit le tampon que vous passez comme paramètre (qui est col.buffer ici), vous le poussez dans le vecteur, donc une nouvelle struct Columns est attribuée par vec et copier le contenu col. Maintenant col et vec[0] sont deux objets différents.

Ensuite, vous appelez certaines méthodes qui remplissent le tampon que vous lui avez d'abord transmis. Donc, il remplit col.buffer, et vous lisez vec[0].buffer, qui sont différents parce qu'ils sont 2 objets différents.

Une solution serait plutôt de faire vec.emplace_back(); pour créer une instance, puis passer vec[0].buffer à setDataBuffer. Mais attention aux adresses d'éléments dans les vecteurs. Si vous modifiez le vecteur (en ajoutant ou en supprimant des éléments), il peut réaffecter son contenu et les adresses des éléments peuvent changer.

+0

Donc, push_back ne copie pas le contenu du tampon char? C'est confus, la documentation sur elle dit qu'il copie, pensé qu'il copierait tout. La solution emplace_back a cependant fonctionné, merci. – user1324674

+0

Eh bien, il le copie, mais une fois qu'il est copié c'est un autre objet, seulement avec un contenu identique. Peut-être que vous avez l'habitude de dev dans un langage différent tel que C# de JS qui utilise l'objet comme référence par défaut. Cela signifie que si vous faites une copie d'un objet 'a' nommé' b' et modifiez 'b', le contenu de' a' est également modifié. Si vous voulez une copie réelle, vous devez le cloner. En C/C++ c'est différent, il utilise des valeurs par défaut. Cela signifie que si vous faites 'a = b',' a' est un clone de 'b', si vous modifiez l'un d'entre eux, l'autre n'est pas modifié (sauf si vous avez explicitement défini' a' comme référence, comme ' int &a = b; ') – Ludonope

+0

Alors, que se passe-t-il exactement? L'original sort de la portée/remplacé puis pouf, les données sont parties? Cependant, utiliser un vecteur ne semble pas fonctionner avec la fonction setdatabuffer. Je ne comprends pas très bien pourquoi, le saurais-tu? Cela fonctionne avec 1 colonne, mais s'il y a plus de 1 colonnes, il se bloque. – user1324674