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

Ваш аккаунт

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

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

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

Возврат массива

10K
30 января 2010 года
s-haman
64 / / 27.03.2007
Здравствуйте довольно тривиальная задача но возникла одна проблема. Суть в чем есть две функции которые возвращают массивы символьного типа, одна функция переводи число с плавающей точкой вторая переводит число. вот коды этих функция
первая
Код:
unsigned char* summtocode(double d)
{
 unsigned char cod[5];
 cod[0]=0;
 cod[1]=0;
 cod[2]=0;
 cod[3]=0;
 cod[4]=0;
 if(d==0.0)
 return cod;
...код сильно большой вкратце тут идут расчеты
 return cod;
}
функция возвращает все нормально
вторая функция
Код:
unsigned char* chektocode(int i1)
{
   unsigned char cod[2];
   cod[0]=0;
   cod[1]=0;
   if(i1<=255)
   {
   cod[0]=i1;
   }
   else
   {
   z=i1/256;
   cod[1]=z;
   cod[0]=i1-(z*256);
   }
   return cod;
}
функция всегда возвращает массив с одним элементов значение которого равно 69, причем на этапе трассировки все расчеты идут нормально перед самим возвратом значение верные но когда происходит присвоение значения массиву присваивается символ с кодом 69 немогу понять в чем ошибка первая функция работает правильно, вторая не работает
1
30 января 2010 года
kot_
7.3K / / 20.01.2000
Вашу задачу можно использовать в качестве примера как делать не надо. Причем классической - ибо настолько часто описанной, что оскома на зубах.
Ваш указатель указывает на переменную, время жизни которой уже давным давно закончилось.
Советую читать статьи в которых присутсвуют слова "область видимости переменных в С++".
Как вариант - использование ссылок.
10K
01 февраля 2010 года
s-haman
64 / / 27.03.2007
Спасибо за указание ошибки. :rolleyes: действительно сразу не обратил внимание
10K
04 февраля 2010 года
s-haman
64 / / 27.03.2007
Создал указатель на тип char с общей областью видимости
 
Код:
unsigned char * pointer;

функцию изменил таким образом:
Код:
unsigned char* chektocode(int i1)
{
   unsigned char cod[2];
   cod[0]=0;
   cod[1]=0;
   if(i1<=255)
   {
   cod[0]=i1;
   }
   else
   {
   z=i1/256;
   cod[1]=z;
   cod[0]=i1-(z*256);
   }
   pointer=cod;
   return pointer;
}

перед возвратом через трассировку проверяю в массиве pointer правильные значения, но когда вернул его в нем по прежнему только один элемент с постоянным значением 69, пробовал после вызова функции обращаться не к массиву который вернул а напрямую к массиву pointer результат тот же
1
04 февраля 2010 года
kot_
7.3K / / 20.01.2000
Вы наверное верите в симпатическую магию, иначе мне трудно понять - что все таки у вас изменилось. Правильный ответ: НИЧЕГО.
Ваш указатель по прежнему указывает на неопределенную область памяти. Это С/С++. Смиритесь и прочтите чтото для ньюбов :)
1
04 февраля 2010 года
kot_
7.3K / / 20.01.2000
Для вас наиболее очевидным вариантом является передача в функцию указатель на массив, числового значения и границы массива (например).
386
04 февраля 2010 года
newcss
297 / / 05.04.2005
Абсолютно согласен, С-шаман, С\С++ это не PHP, да и в PHP у вас наврядли такой фокус прокатит. Советую открыть Герберта Шилдта, справочник по С. Там на первых же страницах рассказывается как правильно работать с указателями.
Дам небольшую подсказку - *,& - вот про эти значки почитайте внимательно и разберитесь с ними, либо переходите на C#.
3
05 февраля 2010 года
Green
4.8K / / 20.01.2000
 
Код:
unsigned char cod[5];
 cod[0]=0;
 cod[1]=0;
 cod[2]=0;
 cod[3]=0;
 cod[4]=0;

страшно подумать если массив будет, к примеру, 10к

 
Код:
if(d==0.0)
 return cod;
...код сильно большой вкратце тут идут расчеты
 return cod;
}

d == 0 - для float такое условие некорректно

 
Код:
if(i1<=255)
   {
   cod[0]=i1;
   }
   else
   {
   z=i1/256;
   cod[1]=z;
   cod[0]=i1-(z*256);
   }

забавно...
а почему не 4 if, параметр то int ? ;)
а ведь можно без единого if...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог