2012-08-21 10 views
5

Chcę przepisać niektóre kod, który używa wielu tablic unsigned char, aby zamiast tego korzystać z obiektów std::vector<unsigned char>. Problemem jest to, że są one obecnie używane do przechowywania danych, które zostaną zapisane do portu szeregowego lub bufora zapisu gniazda, a funkcje biblioteczne do tego powodują albo void* lub unsigned char*. Przykładem takiej funkcji jestCzy mogę wywoływać funkcje, które pobierają argument tablica/wskaźnik używając std :: vector?

WriteToSocketBuffer(unsigned char* pBuffer, int iSize); 

więc obecnie mam kodu formularza

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

Moje pytanie jest następujące: Jeżeli mogę zmienić klasę mieć std::vector<unsigned char> zamiast surowego tablica może po prostu zadzwoń do mojej funkcji biblioteki przy użyciu

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

Czy przekazując adres pierwszego elementu w akcie wektorowych w taki sam sposób jak przekazując adres pierwszego elementu w surowym tablica. Czy to takie proste?

+0

w C++ 11 można również użyj std :: array. –

+0

Czy próbowałeś? – KRyan

+3

@DragoonWraith, jak próbowanie mogłoby pomóc? Rzeczy takie jak zezwalanie na nieciągłe reprezentacje mogą je ogólnie złamać, a jednak odnieść sukces w podstawowych testach. – AProgrammer

Odpowiedz

12

Tak, elementy wektora są zapewnione przylegle do tablicy.

odniesienia:

C++ 03 standard:[lib.vector] 23.2.4 klasy szablon

......
z elementów wektor jest przechowywany w sposób ciągły, co oznacza, że ​​jeśli v jest vector<T, Allocator>, gdzie T jest innego rodzaju niż bool, to przestrzega tożsamości &v[n] == &v[0] + n dla wszystkich 0 <= n < v.size()

+0

Myślałem, że to będzie w porządku, ale dzięki za potwierdzenie tego. – mathematician1975

6

C++ 98 nie określała ciągły przydział dla danych w std::vector, ale to, co wszystkie znane implementacje nie tak.

Począwszy od wersji C++ 03, została ona znormalizowana jako wymaganie, więc teraz jest wymagana, a nie tylko jak się rzeczy mają.

3

Tak, możesz to zrobić, o ile bufor nigdy nie jest pusty.

Jeśli wektor jest zawsze pusty, a następnie &buffer[0] jest błędem, i to będzie prawdopodobnie awarii chociaż wywoływana funkcja nie będzie normalnie nieprawidłowego wskaźnika, ponieważ rozmiar 0.

Powiązane problemy