Witam!
dosc dlugo nie zagladalem na 4p, jednak chcialbym was prosic o pomoc poniewaz napotkalem na problem z ktorym od dwoch dni nie moge sobie poradzic :(
Problem polega na tym, ze w bazie danych w polu typu BLOB zapisuje bufor do ktorego wczesniej wrzucam rozne dane. aby pozniej bylo mozliwe ponowne odczytanie zawartych informacji z ciagu bajtow potrzebuje okreslac np jakiej dlugosci string zostanie zapisany, problem polega na tym ze jezeli mam dlugosc zapisana na 2 bajtach ale, wartosc jest na tyle mala ze wystarczy do jej zapisania jeden bajt, to funkcja mempcy kopiuje do bufora tylko jeden bajt :/
pozniej nie moge tego odczytac poniewaz nie moge zmodyfikowac funkcji odczytujacej bufor.
(tzn moge ale wiazaloby sie to z powaznymi zmianami w calym projekcie na co nie moge sobie pozwolic).
jezeli zmienna add ma wartosc powyzej 2^8 czyli zajmuje wiecej niz 1 bajt a jej typ to unsigned short to oczywiscie funkcja
memcpy(&buffer[size], &add, sizeof(T));
kopiuje do bufora dwa bajty.
Jezeli natomiast wartosc zmiennej add zajmuje tylko jeden bajt to funkcja mempcy kopiuje do bufora jeden bajt. Nie mam pojecia co z tym zrobic poniewaz funkcja odczytujaca z bufora zawsze pobiera pierwsze dwa bajty w celu sprawdzenia jaka dlugosc ma zapisany dalszy ciag znakow.
i prawdopodobnie to jest glowna przyczyna nieprawidlowego dzialania funkcji.
co ciekawe podobno ten kod prawidlowo dziala skompilowany w DevC++
ja uzywam do kompilaci MSVC 2005, probowalem juz na rozne sposoby przerobic ta funkcje ale nic z tego... wypadaloby dodawac ten pierwszy pusty bajt (skladajacy sie z samych zer) jednak jak probuje skopiowac do bufora pojedynczy pusty bajt to nic nie jest dodawane, moze tak ma byc? kopiuje zero to jest nic? :D
ponizej jest funkcja ktora dodaje wartosc danego typu do bufora i tak np moze to byc zmienna x o wartosci 2 typu uint16_t i do bufora dodany zostanie jeden bajt, lub ta sama zmienna o wartosci zajmujacej 2 bajty gdzie do bufora zostanie dodane 2 bajty.
typedef unsigned short uint16_t;
template <typename T>
inline void ADD_VALUE(T add){
if((buffer_size - size) < sizeof(T)){
buffer_size = buffer_size + ((sizeof(T) + 0x1F) & 0xFFFFFFE0);
buffer = (char*)realloc(buffer,buffer_size);
}
memcpy(&buffer[size], &add, sizeof(T));
size = size + sizeof(T);
}
Jezeli ktos ma jakies informacje z jakiego podowu tak sie dzieje i czy tak w ogole powinno sie dziac? to bylbym bardzo wdzieczny za informacje. Rowniez pomyslami na rozwiazanie tego problemu nie pogardze ;)