12.10.2014, 10:04
|
#1
|
Частый гость
Регистрация: 01.08.2006
Сообщений: 10
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Не могу вернуть указатель из функции
задача- в функции есть массив (7 ячеек от DS1307). Хочу вернуть указатель из этой функции в основную программу (вроде как объявлять глобальные переменные- дурной тон).
Вернее указатель-то возвращается, и первый (в смысле нулевой)элемент массива выводится корректно, а вот начиная со второго выводится мусор. Что не так делаю????
Запускал на Ардуино, на Dev-C++ - один и тот же результат, то есть ошибка не в компиляторе. В примере (для Dev-C++) я поубирал всё лишнее, только массивы-указатели-функция. Где грабли, подскажите, плиз.
PHP код:
|
#include ‹iostream›
#include ‹cctype›
using namespace std;
int *readDateTime();
int main()
{
int *DatTim;
DatTim= readDateTime();
for (int j=0; j‹8; j++)
{ cout ‹‹ *DatTim ‹‹ " ";
DatTim++;
}
system("pause");
return 0;
}
int *readDateTime() {
int DateTime[7];
for (int i=0; i‹8; i++)
{ DateTime[i]=i+10;
cout ‹‹ *(DateTime+i) ‹‹' ';
}
cout‹‹ "\n";
return DateTime;
}
|
|
|
|
|
12.10.2014, 10:17
|
#2
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,033
Сказал спасибо: 2,559
Сказали Спасибо 11,881 раз(а) в 5,958 сообщении(ях)
|
Re: не могу вернуть указатель из функции
Сообщение от giran
|
Где грабли, подскажите, плиз.
|
Компилятору, видимо, надо знать, сколько места от указателя нельзя использовать по своему усмотрению. Пока это один "инт", что Вы и видите.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
12.10.2014, 10:39
|
#3
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,532
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
|
Re: не могу вернуть указатель из функции
Потому что массив в функции существует до тех пор пока выполняется функция. Его надо объявить static или сделать глобальным.
|
|
|
|
12.10.2014, 10:41
|
#4
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,357
Сказал спасибо: 85
Сказали Спасибо 613 раз(а) в 371 сообщении(ях)
|
Re: не могу вернуть указатель из функции
У вас возвращается указатель на локальную переменную внутри функции. А эта переменная размещается во время вызова функции в стеке данных.
После выхода из функции данное место в стеке будет использоваться под другие цели (другими функциями). Т.е. сохранность данных по данному адресу после выхода из функции не гарантируется совсем. Т.е. Ваш указатель по сути указывает на уже несуществующую DateTime, отсюда и мусор.
По хорошему, передавайте данной функции указатель в параметрах, функция должна его только заполнить нужными данными. Ну и указатель должен быть на "валидную" область памяти - т.е., либо специально динамически выделенную из кучи, либо на статический массив.
|
|
|
Сказали "Спасибо" pambaru
|
|
|
12.10.2014, 12:06
|
#5
|
Частый гость
Регистрация: 01.08.2006
Сообщений: 10
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: не могу вернуть указатель из функции
Я взял за основу пример Г.Шилдта, где он без всяких заморочек передаёт из функции указатель и получает оставшуюся часть подстроки -
PHP код:
|
#include ‹iostream›
#include ‹cctype›
using namespace std;
char *get_substr(char *sub, char *str);
int main()
{
char *substr;
substr = get_substr("three", "one two three four");
cout ‹‹ "Substring ---›" ‹‹ substr ‹‹ "\n";
system("pause");
return 0;
}
char *get_substr(char *sub, char *str) {
int t;
char *p, *p2, *start;
for (t=0; str[t]; t++) {
p= &str[t];
start = p;
p2= sub;
while (*p2 && *p2==*p) {
p++;
p2++;
}
if(!*p2)
return start;
}
return 0;
}
|
и пример замечательно компилирутся и выдаёт что надо без всяких типов static и резервирования места. У меня примерно тоже самое, только работаю не со строкой а с массивом, а результата нет.
ЗЫ. А объявление static помогло, спасибо.
Последний раз редактировалось giran; 12.10.2014 в 12:21.
|
|
|
|
12.10.2014, 12:48
|
#6
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: не могу вернуть указатель из функции
int DateTime[ 7];
for (int i=0; i‹ 8; i++)
{ DateTime[i]=i+10;
Вас не смущет, что в массив из 7 элементов засаживаете 8 элементов?
Посмотрите в отладчике что там портится а стеке за массивом
|
|
|
|
12.10.2014, 14:24
|
#7
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,357
Сказал спасибо: 85
Сказали Спасибо 613 раз(а) в 371 сообщении(ях)
|
Re: не могу вернуть указатель из функции
Сообщение от giran
|
Я взял за основу пример Г.Шилдта, где он без всяких заморочек передаёт из функции указатель
|
У него этот указатель получается из внешнего, передаваемого в функцию, т.е. указывает на "внешний", реально существующий адрес (внутри строки, адрес которой передается в функцию). У Вас же - указатель указывает на адрес локальной переменной данной функции, которая перестает существовать по выходу из функции.
|
|
|
Сказали "Спасибо" pambaru
|
|
|
12.10.2014, 14:33
|
#8
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,033
Сказал спасибо: 2,559
Сказали Спасибо 11,881 раз(а) в 5,958 сообщении(ях)
|
Re: не могу вернуть указатель из функции
Сообщение от giran
|
А объявление static помогло,
|
как наждачная бумага отучила кота задницу об ковер вытирать.
Очень ли корректно залазить внутрь функции извне? Чем это отличается от глобальной переменной? Только извращенным обращением/хранением?
Не корректней ли глобальный массив для подобных переменных?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
12.10.2014, 14:43
|
#9
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: не могу вернуть указатель из функции
Если много подобных функций, то можно использовать одни и те же имена для объявления локальных переменных. Например, Data [] в каждой функции, и конец мучениям в придумывании названий переменных. Области видимости у них не будут пересекаться.
|
|
|
|
12.10.2014, 15:05
|
#10
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: не могу вернуть указатель из функции
Сообщение от akegor
|
как наждачная бумага отучила кота задницу об ковер вытирать.
|
C++ тоже как-то с микроконтроллерами ну никак не вяжется!
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:33.
|
|