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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача массива символов из функции 
:(
    Опции темы
Sawa920
Дата 19.2.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день.
в представленном ниже коде функция передает в программу массив символов, но данные искожаются, буквально из "\x02\v" в "\х12\0". Подскажите, пожалуйста, что не правильно я делаю? Код из С++Builder.
Код

char* IntTo2Char(int Value)    //функция разбивает число на две части и записывает
{                                              //его в масив из 2-х символов(для представления в hex виде),
char x[2]={NULL};                   // который возвращается в вызывающую функцию
x[1]=Value&255;
x[0] = Value>>8;

return x;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
char z[2]={NULL};


strcpy(z,IntTo2Char(523));

Edit1->Text=Char2ToInt(z);//это обратная функция, она работает нормально)))

PM MAIL   Вверх
mrbrooks
Дата 19.2.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Sawa920, как на счет того что бы использовать union?

Добавлено через 13 минут и 43 секунды
Код

String IntTo2Char(short Value)    
{                                              
union{char buf[2]; short sh};               
return String().sprintf("0x%x 0x%x",(byte)buf[0],(byte)buf[1]);
}

//--------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit1->Text = IntTo2Char(2009);
}

PM MAIL   Вверх
bsa
Дата 19.2.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Sawa920, твоя ошибка в том, что ты пытаешься возвратить указатель на массив, который уничтожается сразу после выхода из функции. Есть два варианта решения:
1. выделять память через new/malloc и возвращать указатель на нее
2. сделать массив статическим (только будут проблемы в многопоточных приложениях)
PM   Вверх
math64
Дата 19.2.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1. Для двухсимвольной строки нужно 3 байта (+'\0' в конце)
2. Возвращаемое значение не должно быть на стеке
Код

char* IntTo2Char(int Value)
{
static char x[3];
x[2] = 0;
x[1]=Value&255;
x[0] = Value>>8;
return x;
}

или
Код

char* IntTo2Char(int Value, char x[])
{
x[2] = 0;
x[1]=Value&255;
x[0] = Value>>8;
return x;
}

PM   Вверх
Sawa920
Дата 19.2.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @  19.2.2009,  16:54 Найти цитируемый пост)
Sawa920, твоя ошибка в том, что ты пытаешься возвратить указатель на массив, который уничтожается сразу после выхода из функции. Есть два варианта решения:
1. выделять память через new/malloc и возвращать указатель на нее


Спасибо, все сразу стало понятно))). Мне больше понравился первый вариант. Вот что я получил (надеюсь я правельно освобождаю память):
Код

char* IntTo2Char(int Value)
{
char *x = new char[2];
x[1]=Value&255;
x[0] = Value>>8;
return x;
delete [] x;
}


Цитата(math64 @  19.2.2009,  16:59 Найти цитируемый пост)
1. Для двухсимвольной строки нужно 3 байта (+'\0' в конце)
2. Возвращаемое значение не должно быть на стеке

1. Необязательно, я использую массив для хранения байтов данных, а не для вывода
2. Этот вариант я  попробывал, еще до публикации темы, просто хотелось разобраться. Но все равно спасибо))))


Цитата(mrbrooks @  19.2.2009,  16:17 Найти цитируемый пост)
Sawa920, как на счет того что бы использовать union?


Почитаю, попробую...впринципе все, что хотел, прояснил...но обязательно разбирусь)

PM MAIL   Вверх
bsa
Дата 19.2.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



после return операции не выполняются. Поэтому память не освобождается.
Используй лучше AnsiString или std::string.
PM   Вверх
math64
Дата 20.2.2009, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ты делаешь strcpy() в своём примере - поэтому '\0' в конце обязателен. Кроме того, если первый байт '\0', второй байт не скопируется.
В данном случае, IntToChar может быть макросом, в котором делается просто приведение типов:
Код

#define IntToChar(Value) ((char*)(&Value))
int Value = 523;
char z[2];
memcpy(z, IntToChar(Value), 2);

PM   Вверх
mrbrooks
Дата 20.2.2009, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Код

char* IntTo2Char(int Value)
{
char *x = new char[2];
x[1]=Value&255;
x[0] = Value>>8;
return x;
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
 char *buf = IntTo2Char(2009);
 Edit1->Text = String().sprintf("0x%x 0x%x",(byte)buf[0],(byte)buf[1]);
 delete [] buf;
}

Sawa920, bsa трижды прав - работать с массивом символов это уже не современно. Тем более в такой задаче
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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