Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблема с memcpy(..)

6.8K
09 февраля 2007 года
Аццкий программер
91 / / 27.11.2006
Здравствуйте!
Возникли проблемы, при работе с памятью. Почему-то функция memcpy не работа как должно (а если точнее - вообще не работает)

задача - перевести все члены-данные объекта в char*, т.е. в опер. память

в начало строки надо поставить ее длину, которая вычесляется методом BinaryLength()
Цитата:
int CTag::binaryLength(void)
{
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()
как я пытаюсь это сделать:

Цитата:
int buffer = 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;



найдите ошибку, пжалста!! я уже замучался! буду бесконечно благодарен! ;)

18K
10 февраля 2007 года
max_br
34 / / 10.12.2006
memcpy(str[i++],buffer,1);-????
если уверен что binaryLength()<=255 то использовал бы уже
byte buffer;
memcpy(&str[i++],&buffer,1);
6.8K
10 февраля 2007 года
Аццкий программер
91 / / 27.11.2006
byte - это в VB, а не в VC
6.8K
10 февраля 2007 года
Аццкий программер
91 / / 27.11.2006
и проблема не в этом, это я как-нть разрулю
проблема в том, что memcpy ничерта не копирует
355
10 февраля 2007 года
&lt;SCORP&gt;
786 / / 21.10.2006
а у меня всё отлично копирует. только пришлось подправить малец, потому что изначальный вариант 2003 визуальная студия не компилила
 
Код:
memcpy((void*)&str[i++],&buffer,1);
309
10 февраля 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Возникли проблемы, при работе с памятью. Почему-то функция memcpy не работа как должно (а если точнее - вообще не работает)


Читаем хелп

Цитата:
memcpy copies a block of n bytes from src to dest. If src and dest overlap, the behavior of memcpy is undefined.


"Если источник и приёмник пересекаются, результат непредсказуем" - как один из вариантов причины.

6.8K
10 февраля 2007 года
Аццкий программер
91 / / 27.11.2006
2 <SCORP>
у меня тоже MVS .NET 2003. не копируется и все тут, даже с
Цитата:
memcpy((void*)&str[i++],&buffer,1);

=(
вместо введеных значений (123,128,2006) memcpy копирует "что-то" (по другому не назавешь) скирншот состояния памяти прилагается(length,bitrate,year скопированы неверно; включение '\0'-байта убрал, для простоты).

может ли быть причина в настройке VC++ ?

2 el scorpio
нет там пересечения источника и приемника

17K
10 февраля 2007 года
Bosheit
26 / / 28.10.2006
2 <SCORP>
у меня тоже MVS .NET 2003. не копируется и все тут, даже с
=(
вместо введеных значений (123,128,2006) memcpy копирует "что-то" (по другому не назавешь) скирншот состояния памяти прилагается(length,bitrate,year скопированы неверно; включение '\0'-байта убрал, для простоты).


КАК НЕВЕРНО????????????????
Ты на картинке неправильно все отметил!
Посмотри прогу: сначала записывается bitrate - вот же он, после "album" : 80 00, а в десятичной СС это и есть 128, учитывая обратный порядок байтов в памяти;
потом - length 4 байт, а потом и year = 2006 = 07D6 или при обратном порядке D607
На снимке памяти все это есть, ты не видишь?

6.8K
10 февраля 2007 года
Аццкий программер
91 / / 27.11.2006
как это не печально, не вижу, т.к. плохо пока что разбираюсь

почему тогда при попытке записать эту строку в бинарный файл(функцией _write(..) ) отображается только name и album?
Цитата:
namealbumх

6.8K
10 февраля 2007 года
Аццкий программер
91 / / 27.11.2006
епть...я, кажется, понял..(благодаря Bosheit'у)

у меня есть такая строка в памяти
Цитата:
17 6e 61 6d 65 00 61 6c 62 75 6d 80 00 00 00 00 00 ce 43 d6
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
====
хехе...видите! Я не так безнадежно туп, как вы думали =)

6.8K
10 февраля 2007 года
Аццкий программер
91 / / 27.11.2006
вот только функция _write(fd, string,buffer) как только натыкается на "00" прекращает запись в файл(возможно, считая это концом строки?)

а как тогда записать все 23 байта в бинарный файл?
6.8K
10 февраля 2007 года
Аццкий программер
91 / / 27.11.2006
епть..пока писал предыдущий вопрос, сам нашел на него ответ =)

в программе у меня используется не _write(fd, string,buffer), а _write(fd, string,strlen(string))

а strlen(string) как раз по 00 и судит о конце строки, т.е. фактически была равна bufferLength()+name= 5 байт

эти первые 5 байт и записывались в мой бинарный файл, вместо всей строки (явно задал _write'у запись 23 байт - все получилось)

Всем БОЛЬШОЕ СПАСИБО!!
Буду благодарен, если дадите линки на хорошие статьи по системам счислений!
355
11 февраля 2007 года
&lt;SCORP&gt;
786 / / 21.10.2006
да, только год у тебя инт -- 4 байта, а не 8, как ты говорил.
это так, чисто поправка небольшая, для лучшего понимания ситуации :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог