LINUX.ORG.RU

Glib g_ascii_formatd, возвращяет странные значения.


0

1

Есть функция возвращающея ghar *

#define MAX_BUF 10
gchar buf[MAX_BUF];
...
result = 12.345;
//g_print( "result = %g.\n", 12.345 );	
return g_ascii_formatd(buf, MAX_BUF, "%g", result );
При первом вызове выводит: Returned string - ???

На следующий вызов уже нормально: Returned string - 12.345

Но если расскоментировать строку с g_print, то вывод с первого раза нормальный. С чем это может быть связанно? Как исправить?

★★

Последнее исправление: greek_31 (всего исправлений: 1)
Ответ на: комментарий от legolegs

Почему плохой? В некоторых случаях оправдан. Thread-safe тут никакой, но чтобы часто не дёргать кучу через alloc()/free(), совет вполне подойдёт.

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

Slavaz ★★★★★
()
Ответ на: комментарий от kemm

А, блин, мой факап, я не обратил внимание что он возвращает потом ссылку на буфер в стеке

vertexua ★★★★★
()
Ответ на: комментарий от legolegs

да, это тоже случай скрытых граблей. Но в некоторых случаях подход со статиком всё-таки оправдан. Это как пистолет: можно мирно лупасить пивные банки, а можно себе в ногу... Повторюсь: нужно знать больше исходных данных от топикстартера, чтобы дать правильный совет.
Я просто прямо ответил на вопрос ТС «почему оно в таком исполнении глючит». Потому что стек, в котором выделяется память под локальные переменные, в последствии перезаписывается указателями и локальными данными других функций. При использовании g_print() происходит забивка стека другими данными, при выходе из функции забивается та часть стека, в которой были данные от g_print() при этом память, где была сама переменная, каким-то чудом остаётся нетронутой.
Чтобы такого избежать, достаточно объявить локальную переменную как static. При этом щедро раскидываем грабли на многопотоках или при повторном вызове в качестве аргументов другой функции.
Совет не плох и не хорош: он точен без лишних рассуждений. Другими словами, за что ТС боролся, на то и напоролся :)

Slavaz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.