Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 12.10.2014, 10:04  
giran
Частый гость
 
Регистрация: 01.08.2006
Сообщений: 10
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
giran на пути к лучшему
По умолчанию Не могу вернуть указатель из функции

задача- в функции есть массив (7 ячеек от DS1307). Хочу вернуть указатель из этой функции в основную программу (вроде как объявлять глобальные переменные- дурной тон).
Вернее указатель-то возвращается, и первый (в смысле нулевой)элемент массива выводится корректно, а вот начиная со второго выводится мусор. Что не так делаю????
Запускал на Ардуино, на Dev-C++ - один и тот же результат, то есть ошибка не в компиляторе. В примере (для Dev-C++) я поубирал всё лишнее, только массивы-указатели-функция. Где грабли, подскажите, плиз.

PHP код:
#include ‹iostream›
#include ‹cctype›
using namespace std;
    
int *readDateTime();
int main()
{
    
int *DatTim;
    
DatTimreadDateTime();
for (
int j=0j8j++)
{   
cout ‹‹ *DatTim ‹‹ " ";
    
DatTim++;
}
         
system("pause"); 
    return 
0;
}

int *readDateTime() {
int DateTime[7];

for (
int i=0i8i++)
 {   
DateTime[i]=i+10;
    
cout ‹‹ *(DateTime+i) ‹‹' ';
    }
    
cout‹‹ "\n";
            return 
DateTime;    
            } 
Реклама:
giran вне форума  
Непрочитано 12.10.2014, 10:17  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,861
Сказал спасибо: 2,532
Сказали Спасибо 11,773 раз(а) в 5,897 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: не могу вернуть указатель из функции

Сообщение от giran Посмотреть сообщение
Где грабли, подскажите, плиз.
Компилятору, видимо, надо знать, сколько места от указателя нельзя использовать по своему усмотрению. Пока это один "инт", что Вы и видите.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Сказали "Спасибо" akegor
giran (12.10.2014)
Непрочитано 12.10.2014, 10:39  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: не могу вернуть указатель из функции

Потому что массив в функции существует до тех пор пока выполняется функция. Его надо объявить static или сделать глобальным.
realid вне форума  
Сказали "Спасибо" realid
giran (12.10.2014)
Непрочитано 12.10.2014, 10:41  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,330
Сказал спасибо: 85
Сказали Спасибо 596 раз(а) в 361 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: не могу вернуть указатель из функции

У вас возвращается указатель на локальную переменную внутри функции. А эта переменная размещается во время вызова функции в стеке данных.
После выхода из функции данное место в стеке будет использоваться под другие цели (другими функциями). Т.е. сохранность данных по данному адресу после выхода из функции не гарантируется совсем. Т.е. Ваш указатель по сути указывает на уже несуществующую DateTime, отсюда и мусор.
По хорошему, передавайте данной функции указатель в параметрах, функция должна его только заполнить нужными данными. Ну и указатель должен быть на "валидную" область памяти - т.е., либо специально динамически выделенную из кучи, либо на статический массив.
pambaru вне форума  
Сказали "Спасибо" pambaru
giran (12.10.2014)
Непрочитано 12.10.2014, 12:06  
giran
Частый гость
 
Регистрация: 01.08.2006
Сообщений: 10
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
giran на пути к лучшему
По умолчанию Re: не могу вернуть указатель из функции

Я взял за основу пример Г.Шилдта, где он без всяких заморочек передаёт из функции указатель и получает оставшуюся часть подстроки -
PHP код:
#include ‹iostream›
#include ‹cctype›
using namespace std;
               
char *get_substr(char *subchar *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 *subchar *str) {
int t;
char *p, *p2, *start;
for (
t=0str[t]; t++) {
  
p= &str[t];
  
start p;
  
p2sub;
  while (*
p2 && *p2==*p) {
        
p++;
        
p2++;
        }
  if(!*
p2)
          return 
start;
}
return 
0;

и пример замечательно компилирутся и выдаёт что надо без всяких типов static и резервирования места. У меня примерно тоже самое, только работаю не со строкой а с массивом, а результата нет.
ЗЫ. А объявление static помогло, спасибо.

Последний раз редактировалось giran; 12.10.2014 в 12:21.
giran вне форума  
Непрочитано 12.10.2014, 12:48  
Boba_spb
Почётный гражданин KAZUS.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: не могу вернуть указатель из функции

int DateTime[7];

for (int i=0; i‹8; i++)
{ DateTime[i]=i+10;

Вас не смущет, что в массив из 7 элементов засаживаете 8 элементов?
Посмотрите в отладчике что там портится а стеке за массивом
Boba_spb вне форума  
Непрочитано 12.10.2014, 14:24  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,330
Сказал спасибо: 85
Сказали Спасибо 596 раз(а) в 361 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: не могу вернуть указатель из функции

Сообщение от giran Посмотреть сообщение
Я взял за основу пример Г.Шилдта, где он без всяких заморочек передаёт из функции указатель
У него этот указатель получается из внешнего, передаваемого в функцию, т.е. указывает на "внешний", реально существующий адрес (внутри строки, адрес которой передается в функцию). У Вас же - указатель указывает на адрес локальной переменной данной функции, которая перестает существовать по выходу из функции.
pambaru вне форума  
Сказали "Спасибо" pambaru
Bagaj (23.10.2014)
Непрочитано 12.10.2014, 14:33  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,861
Сказал спасибо: 2,532
Сказали Спасибо 11,773 раз(а) в 5,897 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: не могу вернуть указатель из функции

Сообщение от giran Посмотреть сообщение
А объявление static помогло,
как наждачная бумага отучила кота задницу об ковер вытирать.
Очень ли корректно залазить внутрь функции извне? Чем это отличается от глобальной переменной? Только извращенным обращением/хранением?
Не корректней ли глобальный массив для подобных переменных?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 12.10.2014, 14:43  
Yurkin2014
Заблокирован
 
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
Yurkin2014 на пути к лучшему
По умолчанию Re: не могу вернуть указатель из функции

Если много подобных функций, то можно использовать одни и те же имена для объявления локальных переменных. Например, Data [] в каждой функции, и конец мучениям в придумывании названий переменных. Области видимости у них не будут пересекаться.
Yurkin2014 вне форума  
Непрочитано 12.10.2014, 15:05  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: не могу вернуть указатель из функции

Сообщение от akegor Посмотреть сообщение
как наждачная бумага отучила кота задницу об ковер вытирать.
C++ тоже как-то с микроконтроллерами ну никак не вяжется!
__________________
Смерть бандеровской мразоте!
eddy вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изучение PIC C Compiler(CCS C) CERGEI1982 Embedd С 1984 30.08.2023 14:10
Книги dosikus Делимся опытом 11242 29.12.2015 23:45
Помогите найти функции чтения-записи для 24с64 begun AVR 15 05.03.2014 00:00
Расчет функции косинус Nihoden TTL и CMOS логика 26 14.05.2013 16:49
[Решено] Всем эмбеддерам посвящается... Decan Отвлекитесь, эмбеддеры! 0 24.10.2005 14:43


Часовой пояс GMT +4, время: 13:20.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot