recv() + vector

Odpowiedz Nowy wątek
2011-10-19 20:09
regi
0

czy moge pogodzic ze soba funkcję recv() z vectorem? chodzi mi tu o przekazywanie wskaznika vectorowi wraz z nadejsciem pakietu. z funkcja send() nie mam takiego problemu co z wyzej wymieniona. przy recv() wyskakuje blad krytyczny podczas debugowania wspominajacy cos o pamieci. ale dlaczego, jezeli ja roznego rodzaju typy tablic i zmiennych - ich wskazniki przekazuje do tej funkcji i jest wszystko okey, zas z vectorem jest blad wczesniej wspomniany?

dziala bez zarzutu:

int tab[6];
recv(sock,(char*)&tab,24,NULL);

blad krytyczny podczas debugowania:

vector<void*> v;
recv(sock,(char*)&v,24,NULL);

Pozostało 580 znaków

2011-10-19 20:24
q
0

jesteś pewien że chcesz stworzyć vector<void*> v ?

Pozostało 580 znaków

2011-10-19 20:24
0
static_cast<char *>(&(v[0]))

To będzie odpowiednik tego ze zwykłą tablicą. Czy to zadziała i ma sens użycie takiego vectora - nie wiem.


"(...) otherwise, the behavior is undefined".
edytowany 1x, ostatnio: Endrju, 2011-10-19 20:24

Pozostało 580 znaków

2011-10-19 20:41
0

Pamiętajmy, aby nadać vectorowi odpowiedni rozmiar i nie zakładajmy, że pomieści wszystkie dane, czyli:
vector<char> v(24) lub vector<char> v(24, 0); - jak kto woli, ustalamy rozmiar przy tworzeniu vectora lub używamy resize()
v.resize(24) lub v.resize(24, 0);

a potem
recv(sock, &v.front(), 24, null);

edytowany 1x, ostatnio: Tomek2, 2011-10-19 20:43

Pozostało 580 znaków

2011-10-19 21:30
regi
0

Nie pomaga to. Hmm same problemy z tym STD'owym vectorem (jeśli chodzi o zewnętrzność). Lepiej napisze wlasna klase ktora bedzie przyjmowac i zdejmowac ze stosu dane, a takze zawierac inne potrzebne informacje. Ok dzieki chlopaki za pomoc :)

Pozostało 580 znaków

2011-10-19 21:50
0

A możesz pokazać swój kod? Bo wydaje mi się, że nie jest to wina vectora, tylko tego jak go użyłeś.

Pozostało 580 znaków

2011-10-19 22:12
0

Spróbuj raczej reinterpret_cast<char>(&v[0])
Miałem podobny problem ze zmianą z void
na int, bo przy dodawaniu wyskakiwało mi, że próbuję wykonywać działania na void i program się nie kompilował.


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

2011-10-20 17:22
0

No co Ty, wskaźnik na void się robi za pomocą static_cast. Dopiero w nowym standardzie w ogóle dodali możliwość używania do tego reinterpret_cast.

http://stackoverflow.com/ques[...]en-casting-a-void-to-whatever


"(...) otherwise, the behavior is undefined".

Pozostało 580 znaków

2011-10-20 19:03
regi
0

vector<void> myvec;
int i1 = 54363;
int i2 = 10678;
int i3 = 15578;
int i4 = 99665;
myvec.push_back(&i1);
myvec.push_back(&i2);
myvec.push_back(&i3);
myvec.push_back(&i4);
send(client->_socket,(char
)&myvec,20,NULL);

Cholera nie mam konta, a niechcacy wyslalem posta...

A tutaj odbieranie:

vector<void> message;
message.resize(4);
recv(this->sockclient,(char
)&message.front(),20,NULL);

Pozostało 580 znaków

2011-10-20 20:51
0

Czyli robisz tak: ustawiasz wielkość vectora na 4 elementy (poprzez push_back() w pierwszym przypadku i resize(4) w drugim). Zakładam maszynę 32-bit - czyli sizeof(void*) to 4 bajty - razem 16 bajtów pamięci zarezerwowanej przez vector. Następnie używasz send() i recv() i w obu przypadkach podajesz, że mają do wysłania/odczytania 20 bajtów - więc funkcje wyjeżdżają poza zaalokowany obszar pamięci.

EDIT: prawdopodobne jest, że vector::capacity() zwróci większą wartość, ale i tak proponuję sprawdzenie kodu. Dodatkowo właśnie zauważyłem, że w send() podajesz adres vectora zamiast adres pierwszego jego elementu (powinno być &myvec.front()).

edytowany 1x, ostatnio: Tomek2, 2011-10-20 21:02

Pozostało 580 znaków

2011-10-21 11:06
0

po co wysyłasz wskaźniki do intów przez sockety, lepiej wyślij te liczby :P

vector<int> myvec;
int i1 = 54363;
int i2 = 10678;
int i3 = 15578;
int i4 = 99665;
myvec.push_back(i1);
myvec.push_back(i2);
myvec.push_back(i3);
myvec.push_back(i4);
send(client->_socket,(char*)(&myvec[0]),sizeof(int)*myvec.size(),NULL);

░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0