2012-08-21 5 views
5

Ich möchte etwas Code umschreiben, der viele unsigned char Arrays verwendet, statt std::vector<unsigned char> Objekte zu verwenden. Das Problem, das ich habe, ist, dass diese derzeit verwendet werden, um die Daten zu speichern, die entweder in einen seriellen Port oder einen Socket-Schreibpuffer geschrieben werden, und die Bibliotheksfunktionen dafür entweder void* oder unsigned char* benötigen. Ein Beispiel für eine solche Funktion istKann ich Funktionen, die ein Array/Pointer-Argument verwenden, stattdessen mit einem std :: vector aufrufen?

WriteToSocketBuffer(unsigned char* pBuffer, int iSize); 

so aktuell I-Code des Formulars haben

unsigned char* pArray = new unsigned char[iSize]; 
// populate array with data 
WriteToSocketBuffer(pArray,iSize); 
delete [] pArray; 

Meine Frage ist folgende: Wenn ich meine Klasse ändern, um eine std::vector<unsigned char> anstelle eines rohen Array haben können ich habe einfach meine Bibliothek Funktion aufrufen mit

std::vector<unsigned char> myVector; 
    WriteToSocketBuffer(&myVector[0],myVector.size()); 

im Vektor wirken auf die gleiche die Adresse des ersten Elements hat vorbei war in der Adresse des ersten Elements in einem rohen als vorbei Array. Ist es so einfach?

+0

In C++ 11 ist, können Sie Verwenden Sie auch std :: array. –

+0

Haben Sie es versucht? – KRyan

+3

@DragoonWraith, wie versucht würde helfen? Dinge wie das Zulassen nicht zusammenhängender Repräsentation können es im Allgemeinen brechen und dennoch in grundlegenden Tests erfolgreich sein. – AProgrammer

Antwort

12

Ja, die Elemente eines Vektors sind sicher zusammenhängend ähnlich einem Array.

Referenz:

C++ 03 Standard:[lib.vector] 23.2.4 Klasse Vorlage Vektor

......
Die Elemente einer Vektor sind zusammenhängend gespeichert, was bedeutet, dass wenn v ist ein vector<T, Allocator> wo T ist ein anderer Typ als bool, dann gehorcht es die Identität &v[n] == &v[0] + n für alle 0 <= n < v.size()

+0

Ich dachte, es wäre wahrscheinlich in Ordnung, aber danke für die Bestätigung. – mathematician1975

6

C++ 98 haben zusammenhängende Zuweisung für die Daten in einem std::vector nicht Mandat, aber das ist, was alle bekannten Implementierungen ohnehin tat.

Seit C++ 03 war das als Anforderung standardisiert, also ist es jetzt erforderlich, nicht nur, wie die Dinge gerade sind.

3

Ja, Sie können das tun, solange der Puffer nie leer ist.

Wenn der Vektor immer leer ist, dann ist &buffer[0] ein Fehler, und es wird wahrscheinlich auch wenn die aufgerufene Funktion den Zeiger dereferenzieren abstürzen würde normalerweise nicht, da die Größe 0.

Verwandte Themen