2010-10-13 4 views
2

Cependant, lorsque j'essaie de copier un tableau dans un vecteur, lorsque les données sont copiées dans le vecteur, elles diffèrent de celles du tableau d'origine.Problème de tableau vers vecteur vectoriel 0 +

int arraySize = 640000; 

std::vector<unsigned char> vector_buffer; 
unsigned char buffer[arraySize]; 

populateArray(&buffer); 

for(int i = 0; i < arraySize; i++) 
    cout << buffer[i]; // this prints out data 


std::copy (buffer, buffer + arraySize, std::back_inserter(vector_buffer)); 


for(int i = 0; i < arraySize; i++) 
    cout << vector_buffer[i]; // this prints out different data 

Les données semblent compressées d'une manière ou d'une autre. Toute approche pour copier le tableau sur un vecteur fait la même chose. Je l'utilise pour créer une vidéo à partir d'images. Si j'utilise les données du tableau tout va bien, mais si j'utilise les données vectorielles cela ne fonctionne pas.

Toute aide serait grandement appréciée.

Vive

+0

Ceci est le plus troublant.S'agit-il d'une erreur de sortie ou compare-t-on les différences d'identification octet-octet du tampon et du vecteur? Si c'est vrai, que sont-ils? Est-ce qu'ils suivent un modèle quelconque, comme des compensations régulières ou seulement certaines valeurs qui sont affectées? –

+0

Le code tel que présenté devrait fonctionner. Est-ce le vrai code qui échoue? Les types du tableau et du vecteur sont-ils les mêmes? - Remarquez que vous pouvez utiliser (et être plus efficace) 'vector_buffer.insert (buffer, buffer + arraySize)', mais cela n'a aucun rapport avec le problème rencontré. –

+0

Pouvez-vous essayer avec array_size étant 10 ou 20 et nous montrer le putput? En outre, je ne suis pas sûr que le tampon char non signé [arraySize] peut compiler sur tous les compilateurs. –

Répondre

9

Les

int arraySize = 640000; 

a besoin d'être const dans la norme C++. g ++ permet des tableaux de longueur variable comme une extension de langage inspirée de C99. Il est préférable de désactiver cette extension. :-)

std::vector<unsigned char> vector_buffer; 
unsigned char buffer[arraySize]; 

OK lorsque arraySize est const, mais ne compilera pas avec par exemple Visual C++ avec votre code d'origine.

populateArray(&buffer); 

Cela devrait très probablement être populateArray(buffer), sauf si vous avez une déclaration vraiment bizarre de populateArray.

for(int i = 0; i < arraySize; i++) 
    cout << buffer[i]; // this prints out data 

Ce qui précède imprime les données sans espacement entre les éléments. Mieux vaut ajouter un peu d'espacement. Ou nouvelles lignes.

std::copy (buffer, buffer + arraySize, std::back_inserter(vector_buffer)); 

Mieux il suffit d'utiliser la méthode assign de std:.vector, comme vector_buffer.assign(buffer, buffer + arraySize).

for(int i = 0; i < arraySize; i++) 
    cout << vector_buffer[i]; // this prints out different data 

De nouveau, ceci affiche les éléments sans espacement entre eux.

Y a-t-il encore un problème apparent lorsque vous avez résolu ces problèmes?

Si c'est le cas, veuillez également publier votre fonction populateArray.

+1

+1 pour utiliser 'assign()'. Je soupçonne que, dans le code d'OP, 'vector_buffer' est en quelque sorte modifié entre sa déclaration et l'appel à' std :: copy() '. Si possible, mieux vaut retarder la construction 'vector_buffer' jusqu'à ce que' buffer' soit prêt, puis faire 'vector_buffer (buffer, buffer + arraySize);' comme dans le code de @ sbi. – Arun

3

Je ne vois rien de mal à votre code. Le code suivant

#include <iostream> 
#include <vector> 

int main() 
{ 
    const std::size_t arraySize = 640000; 

    unsigned char buffer[arraySize]; 

    for(std::size_t idx = 0; idx < arraySize; ++idx) 
     buffer[idx] = idx; 

    std::vector<unsigned char> vector_buffer(buffer, buffer + arraySize); 
    //std::vector<unsigned char> vector_buffer; 
    //std::copy (buffer, buffer + arraySize, std::back_inserter(vector_buffer)); 

    for(std::size_t idx = 0; idx < arraySize; ++idx) 
     if(buffer[idx] != vector_buffer[idx]) 
     { 
      std::cout << "error @" << idx << '\n'; 
      return 1; 
     } 
    std::cout << "Ok.\n"; 

    return 0; 
} 

imprime Ok. pour moi. (Même si j'utilise la méthode de copie non optimale dans le vecteur.)

Du fait que le code que vous avez montré ne compile pas, je conclus que vous ne montrez pas le vrai code. S'il-vous-plaît faites ainsi. Quelque part dans les différences entre votre code réel et mon code doit être le problème.

1

J'ai écrit un programme compilable complet pour vous. Le code semble bien. Je cours et obtient la production attendue. Peut-être que vous avez besoin de re-vérifier le code que vous avez publié par rapport au code réel.

#include <cstdlib> 
#include <vector> 
#include <iostream> 
#include <iterator> 
using namespace std; 

void populateArray(unsigned char* buf, size_t buf_size) 
{ 
    unsigned char* buf_end = &buf[buf_size]; 
    for(unsigned char c = 'A'; buf != buf_end; c = (c=='Z'?'A':c+1), ++buf) 
     *buf = c; 
} 

int main() 
{ 

    static const int arraySize = 64; 

    std::vector<unsigned char> vector_buffer; 
    unsigned char buffer[arraySize]; 

    populateArray(buffer, sizeof(buffer)); 

    for(int i = 0; i < arraySize; i++) 
      cout << buffer[i]; // this prints out data 

    cout << endl; 


    std::copy (buffer, buffer + arraySize, std::back_inserter(vector_buffer)); 


    for(int i = 0; i < arraySize; i++) 
      cout << vector_buffer[i]; // this prints out different data 

    return 0; 
}