проблема с memcpy(..)
Возникли проблемы, при работе с памятью. Почему-то функция memcpy не работа как должно (а если точнее - вообще не работает)
задача - перевести все члены-данные объекта в char*, т.е. в опер. память
в начало строки надо поставить ее длину, которая вычесляется методом BinaryLength()
{
return strlen(title)+sizeof(float)+2*sizeof(int)+strlen(album)+2;
}
title = char*
между этими двумя кусками строки надо "впихнуть" нулевой байт - '\0'!
album = char*
bitrate = int
length = float
year = int
для наглядности прилагается карта-схема =)
[длинна строки]+[titel]+['\0']+[album]+[bitrate]+[length]+[year]
1 байт + strlen(..) + 1 байт + strlen(..) + sizeof(..) + sizeof(..) + sizeof(..) = binaryLength()
как я пытаюсь это сделать:
char* str = new char[buffer];
int i(0);
memcpy(str[i++],buffer,1);
strcpy(&str,title);
i+=strlen(title);
str[i++]='\0';
strcpy(&str,album);
i+=strlen(album);
memcpy(&str,&bitrate,sizeof(int));
i+=sizeof(int);
memcpy(&str,&length,sizeof(float));
i+=sizeof(float);
memcpy(&str,&year,sizeof(int));
i+=sizeof(int);
return str;
найдите ошибку, пжалста!! я уже замучался! буду бесконечно благодарен! ;)
если уверен что binaryLength()<=255 то использовал бы уже
byte buffer;
memcpy(&str[i++],&buffer,1);
проблема в том, что memcpy ничерта не копирует
Читаем хелп
"Если источник и приёмник пересекаются, результат непредсказуем" - как один из вариантов причины.
у меня тоже MVS .NET 2003. не копируется и все тут, даже с
=(
вместо введеных значений (123,128,2006) memcpy копирует "что-то" (по другому не назавешь) скирншот состояния памяти прилагается(length,bitrate,year скопированы неверно; включение '\0'-байта убрал, для простоты).
может ли быть причина в настройке VC++ ?
2 el scorpio
нет там пересечения источника и приемника
у меня тоже MVS .NET 2003. не копируется и все тут, даже с
=(
вместо введеных значений (123,128,2006) memcpy копирует "что-то" (по другому не назавешь) скирншот состояния памяти прилагается(length,bitrate,year скопированы неверно; включение '\0'-байта убрал, для простоты).
КАК НЕВЕРНО????????????????
Ты на картинке неправильно все отметил!
Посмотри прогу: сначала записывается bitrate - вот же он, после "album" : 80 00, а в десятичной СС это и есть 128, учитывая обратный порядок байтов в памяти;
потом - length 4 байт, а потом и year = 2006 = 07D6 или при обратном порядке D607
На снимке памяти все это есть, ты не видишь?
почему тогда при попытке записать эту строку в бинарный файл(функцией _write(..) ) отображается только name и album?
у меня есть такая строка в памяти
07 00 00
где:
====
17 -> bufferLength()=23
6e 61 6d 65 -> titel = "name"
00 -> '\0'
61 6c 62 75 6d -> album = "album"
80 00 00 00 -> bitrate = 128
00 00 ce 43 -> length = 412
d6 07 00 00 -> year = 2006
====
хехе...видите! Я не так безнадежно туп, как вы думали =)
а как тогда записать все 23 байта в бинарный файл?
в программе у меня используется не _write(fd, string,buffer), а _write(fd, string,strlen(string))
а strlen(string) как раз по 00 и судит о конце строки, т.е. фактически была равна bufferLength()+name= 5 байт
эти первые 5 байт и записывались в мой бинарный файл, вместо всей строки (явно задал _write'у запись 23 байт - все получилось)
Всем БОЛЬШОЕ СПАСИБО!!
Буду благодарен, если дадите линки на хорошие статьи по системам счислений!
это так, чисто поправка небольшая, для лучшего понимания ситуации :)