Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как дописать int в char* 
V
    Опции темы
Демидрол
Дата 6.10.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



Доброго времени суток.У меня такой вопрос:
Имеется код
Код

char *buf = "1";
unsigned long i = sizeof(buf);
unsigned short res = CRCobject->CaleCRC16CheckSum(buf,i);

Но в buf может быть все что угодно  smile , не в этом дело.Проблема в следующем:мне нужно в конец buf записать полученное значение res и затем снова вызвать функцию CaleCRC16CheckSum.
Сложность состоит в том,что использование функции наподобие itoa для перевода res в char* и последующего копирования res в конец buf будет неверно,так как в данном примере в  buf будет записано "1", а мне надо,чтобы туда был записан двоичный код числа  res, а не двоичный код, соответствующий символу "1" в данном примере.
Как сделать дозапись res в buf?
PM MAIL   Вверх
azesmcar
Дата 6.10.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



немного непонятно 4то имеется ввиду...функция возвращяет short. а у тебя char*...
так пойдет?

Код

char buf[10] = "1";
unsigned long i = sizeof(buf);
unsigned short res = CRCobject->CaleCRC16CheckSum(buf,i);
buf[1] = *((char*)&res);
buf[2] = *((char*)(&res + 1));

PM   Вверх
Демидрол
Дата 6.10.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



ммм!!!!!!Прошу прощения за ошибку,вместо int действительно нужен short.  smile 
вариант через массив не пойдет,нужно именно в просто char* smile 
PM MAIL   Вверх
UniBomb
Дата 6.10.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 97



Демидрол, если ты объявиш buf[10], то *buf и будет просто указателем.


--------------------
PM MAIL ICQ Skype   Вверх
Демидрол
Дата 6.10.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



понятно...
buf[1] = *((char*)&res); - это понятно для чего
buf[2] = *((char*)(&res + 1)); - а это зачем?  smile 
а если buf будет указатель не на массив,а на строку, тогда можно будет сделать такую операцию(дописать в конец)???

Это сообщение отредактировал(а) Демидрол - 6.10.2008, 16:38
PM MAIL   Вверх
azesmcar
Дата 6.10.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

а если buf будет указатель не на массив,а на строку, тогда можно будет сделать такую операцию(дописать в конец)???

а он никогда не был указателем на массив.
указатель на тип char - динами4еский массив (который ты кстати в своем примере не создал)
массив - стати4еский массив типа char
в использовании в данном слу4ае никакой разницы.

Цитата

buf[1] = *((char*)&res); - это понятно для чего
buf[2] = *((char*)(&res + 1)); - а это зачем?  smile 

buf[1] = *((char*)&res); - берем первый элемент
buf[2] = *((char*)(&res + 1)); - берем второй элемент
у тебя short - 2 byte -а. я добавил в конец два байта которые вернула функция.
PM   Вверх
Демидрол
Дата 6.10.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



Цитата(azesmcar @  6.10.2008,  16:42 Найти цитируемый пост)
buf[1] = *((char*)&res); - берем первый элемент
buf[2] = *((char*)(&res + 1)); - берем второй элемент
у тебя short - 2 byte -а. я добавил в конец два байта которые вернула функция. 

мммм...тупак напал,чтоли.... smile 
первый и второй элементы чего?
PM MAIL   Вверх
UniBomb
Дата 6.10.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 97



Демидрол, вторая строчка нужна потому, чтобы записать второй бойт контрольной суммы (ибо crc 16-ти разрядная). 


Цитата(Демидрол @  6.10.2008,  16:35 Найти цитируемый пост)
а если buf будет указатель не на массив,а на строку, тогда можно будет сделать такую операцию(дописать в конец)???

строка и массив - это почти одно и тоже.

Код

char buf[12];
char *bbuf;

*buf = "Hello world!"; //допустимо
bbuf[1] = '1';  //допустимо



--------------------
PM MAIL ICQ Skype   Вверх
Демидрол
Дата 6.10.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



Цитата(UniBomb @  6.10.2008,  16:45 Найти цитируемый пост)
Демидрол, вторая строчка нужна потому, чтобы записать второй бойт контрольной суммы (ибо crc 16-ти разрядная). 

Чего-то я запутался:
buf[1] = *((char*)&res); - в этой строчке разве копируется только один байт,а не весь res? 
PM MAIL   Вверх
UniBomb
Дата 6.10.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 97



Демидрол, да, только один байт

Это сообщение отредактировал(а) UniBomb - 6.10.2008, 16:55


--------------------
PM MAIL ICQ Skype   Вверх
Демидрол
Дата 6.10.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



если я правильно понимаю, то в *((char*)&res) первая * - это указатель на оставшееся, (char*)&res - приведение к char* собственно &res, а &res - это первый байт res??? smile 
PM MAIL   Вверх
UniBomb
Дата 6.10.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 97



res - результат
&res - ссылка на результат
(char*)&res - приведение к типу
*((char*)&res) - указатель на ячейку памяти с первым байтом результата

Это сообщение отредактировал(а) UniBomb - 6.10.2008, 17:01


--------------------
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 6.10.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



процесс примерно такой..
у тебя 2 байта short (2 byte) - представляем их как массив (а то4нее указатель) размера 2 из char (1 byte). В результате полу4аем указатель на первый элемент сконвертированного массива, разименовываем - первый элемент полу4ен, записываем в строку. Даль6е, берем второй элемент, для этого прибавляем 1 к указатель (см. арифмети4еские операции с указателями), разименовываем - второй элемент полу4ен..вот и все.
PM   Вверх
Демидрол
Дата 6.10.2008, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



 smile 
 smile 
 smile 
 smile 
О_оооо
вот это да!!!Нив жинь бы не додумался...
Спасибо большое за помощь,а отдельное БОЛЬШОЕ-ПРЕБОЛЬШОЕ СПАСИБО за то,что объяснили что к чему!!!
PM MAIL   Вверх
J0ker
Дата 6.10.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



еще раз о разнице:

char x[] = "test";
означает создание МАССИВА размером strlen("test")+1=5 и иницилизация его элементами {'t','e','s','t',0}

char *x = "test";
означает создание УКАЗАТЕЛЯ, котоый инициализируется адресом ЛИТЕРАЛА расположенного в ЗЩИЩЕННОЙ ОТ ЗАПИСИ области памяти. Поэтому при попытке записи например x[2] = 'S'; - вы получите с высокой степенью вероятности run-time error (Segmentation fault/Access violation)
Поэтому эти литералы по своей природе КОНСТАНТЫ, и должны объявляться как
const char *x = "test";



--------------------
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0984 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.