18.12.2012, 16:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Запутался в указателях
Добрый!
AVR, avrstudio, c#, FatFS lib, sdmmc.
Есть функция:
Код:
|
//////////////////////////////////////////////////////////////////////////
// get date and time
char *get_datetime(){
char datetime[15];
sprintf(datetime, "%06lu:%06lu›", gnss_data[0].ndate,gnss_data[0].utc_time_h);
return datetime;
} |
Первое использование:
Код:
|
RS485_send_str(get_datetime());RS485_send_str("\r\n"); |
выводит правильно. При попытке записать в sd
Код:
|
f_lseek(&fil_obj,fil_obj.fsize);
f_write(&fil_obj,get_datetime(),14,&ByteWrite);
f_err_code = f_write(&fil_obj,_v,strlen(_v),&ByteWrite); |
пишет
чего я недопонимаю?
|
|
|
|
18.12.2012, 16:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: запутался в указателях)
Должно быть так (как и выводится в терминал)
|
|
|
|
18.12.2012, 16:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: запутался в указателях)
Сообщение от whoim
|
char *get_datetime(){
char datetime[15];
sprintf(datetime, "%06lu:%06lu›", gnss_data[0].ndate,gnss_data[0].utc_time_h);
return datetime;
}
|
Вы возвращаете указатель datatime на нечто заведеное в стеке; А стек - это СТЕК; Кто Вам гарантирует сохранность этих 15 байт?
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
18.12.2012, 16:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: запутался в указателях)
Да, мусолил это в голове..
Но тем не менее при использовании вывода в терминал все ОК. Там до \0 цикл шлет побайтно, все ок.
Разве что сам fwrite портит данные, но неверится..
эээ
счас, мысль
|
|
|
|
18.12.2012, 16:45
|
|
Частый гость
Регистрация: 12.10.2010
Сообщений: 27
Сказал спасибо: 0
Сказали Спасибо 19 раз(а) в 14 сообщении(ях)
|
Re: запутался в указателях)
Сообщение от whoim
|
Да, мусолил это в голове..
Но тем не менее при использовании вывода в терминал все ОК. Там до \0 цикл шлет побайтно, все ок.
Разве что сам fwrite портит данные, но неверится..
эээ счас, мысль
|
Возвращение указателя или ссылки на временный объект на стеке функции - это undefined behavior. Оно может включать всебя все, в том чисте и нормальное функционирование.
Обсуждению не подлежит.
|
|
|
Сказали "Спасибо" Красный Свин
|
|
|
18.12.2012, 17:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: запутался в указателях)
я понял, согласен, переделаю
|
|
|
|
18.12.2012, 17:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: запутался в указателях)
ну так и есть, отказался от памяти/указателей в пользу классики.. все работает
|
|
|
|
18.12.2012, 18:38
|
|
Частый гость
Регистрация: 12.10.2010
Сообщений: 27
Сказал спасибо: 0
Сказали Спасибо 19 раз(а) в 14 сообщении(ях)
|
Re: запутался в указателях)
Сообщение от whoim
|
ну так и есть, отказался от памяти/указателей в пользу классики.. все работает
|
В смысле ? Указатели в с и есть классика Только пользоваться ими надо аккуратно..
- классический C подход:
void PrintDateTime(char* aBuf)
{
sprintf(aBuf, "....");
}
- правильно-параноидальный C подход:
void PrintDateTime(char* aBuf, int aBufLen)
{
snprintf(aBuf, aBufLen, ".....")
}
|
|
|
|
18.12.2012, 22:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: запутался в указателях)
Что такое классический подход?
А типа char *Text = ( char* ) AllocMem( Size ) ? Это что?
|
|
|
|
18.12.2012, 22:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: запутался в указателях)
Сообщение от Красный Свин
|
- классический C подход:
void PrintDateTime(char* aBuf)
|
Вот где б глянуть такой классический void Print(.... )
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:55.
|
|