Вопросы и ответы по программированию.

Для тех, кто хочет сделать мир лучше.
Сообщение
Автор
Аватара пользователя
GanGSISoft
Полковник
Полковник
Сообщения: 1430
Зарегистрирован: 27.03.2008
Откуда: Бацькаўшчына
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

#106 Сообщение 19.06.2011, 22:32

Pr0Ger
спасибо большое, всё ясно и понятно, так всё и было, не было ноля, и много где не было, однако волшебным образом он следовал сразу за концом выделенной памяти и всё работало.

Вот только одно, те мистические утечки есть что в простом примере что я приводил, и valgrind их не видит. Пишет что утечек нет, однако когда моей программе попадаются не UTF8 файлы, то она "набирает вес" после каждого файл. Экспериментально я установил что "набор веса" совершенно не звисит от наличия delete в определённых местах, то есть delete не работает, но как утечка это не valgrind'ом не считается. Почему же тогда увеличивается объём занимаемой памяти? И в core лежат куски этих неUTF8 файлов.

Ну да ладно, я надоел этим уже наверное,видимо просто опять накриворучил.
Последний раз редактировалось GanGSISoft 19.06.2011, 22:36, всего редактировалось 2 раза.

[user]
Эксперты no-Steam
Эксперты no-Steam
Сообщения: 3501
Зарегистрирован: 18.07.2008
Благодарил (а): 2 раза
Поблагодарили: 17 раз
Контактная информация:

#107 Сообщение 20.06.2011, 09:27

Код: Выделить всё

void * realloc ( void * ptr, size_t size )
"На скорую руку" написал тестовую программу. Массив без проблем расширил до 1000 байт с шагом в 1 байт. Хз, что не так было раньше.

А уменьшать массив с её помощью можно?

Код: Выделить всё

<var_pointer> = (<type>*)realloc(<var_pointer>, --array_len);
© [user]

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#108 Сообщение 20.06.2011, 12:49

[user]
Можно и уменьшать.
Вот только одно, те мистические утечки есть что в простом примере что я приводил, и valgrind их не видит. Пишет что утечек нет, однако когда моей программе попадаются не UTF8 файлы, то она "набирает вес" после каждого файл. Экспериментально я установил что "набор веса" совершенно не звисит от наличия delete в определённых местах, то есть delete не работает, но как утечка это не valgrind'ом не считается. Почему же тогда увеличивается объём занимаемой памяти? И в core лежат куски этих неUTF8 файлов.
По стандарту функция free не обязана возвращать освобожденную память операционной системе. Она лишь помечает её как свободную для дальнейшего использования в программе (чтобы потом выделить эту же память через malloc, calloc). И тем более free не зануляет память, поэтому куски текстовых файлов останутся в оперативной памяти.
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
ArsNG
Полковник
Полковник
Сообщения: 3059
Зарегистрирован: 20.12.2007
Благодарил (а): 1069 раз
Поблагодарили: 2893 раза

#109 Сообщение 20.06.2011, 15:07

Делай memset 0 и потом free, не будет кусков.
Последний раз редактировалось NiGHt-LEshiY 20.06.2011, 15:31, всего редактировалось 1 раз.
Причина: Это не даёт ничего, кроме лишней работы.

[user]
Эксперты no-Steam
Эксперты no-Steam
Сообщения: 3501
Зарегистрирован: 18.07.2008
Благодарил (а): 2 раза
Поблагодарили: 17 раз
Контактная информация:

#110 Сообщение 21.06.2011, 12:55

NiGHt-LEshiY
При уменьшении проверять возвращаемое realloc'ом значение обязательно? Думаю, что не обязательно, но всё таки...
© [user]

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#111 Сообщение 21.06.2011, 13:31

[user]
Всегда обязательно. В случае неудачи возвращается NULL. Если после этого использовать "увеличенную", как думает программист, память - будут неприятности.
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

[user]
Эксперты no-Steam
Эксперты no-Steam
Сообщения: 3501
Зарегистрирован: 18.07.2008
Благодарил (а): 2 раза
Поблагодарили: 17 раз
Контактная информация:

#112 Сообщение 21.06.2011, 14:04

NiGHt-LEshiY писал(а):Если после этого использовать "увеличенную", как думает программист, память - будут неприятности.
Не совсем понимаю... Я же уменьшаю выделенную область. Значения, по идеи, остаются в тех же адресах. При увеличении понятно - памяти может не хватить, а при уменьшении...
© [user]

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#113 Сообщение 21.06.2011, 14:13

Ах, упустил это.
Проверять хорошо бы в любом случае. А вдруг дальнейшее поведение программы зависит от выделенной памяти?
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
x_000
Полковник
Полковник
Сообщения: 4889
Зарегистрирован: 25.02.2008
Откуда: Deutsches Reich
Благодарил (а): 6 раз
Поблагодарили: 18 раз

#114 Сообщение 22.06.2011, 20:50

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

[user]
Эксперты no-Steam
Эксперты no-Steam
Сообщения: 3501
Зарегистрирован: 18.07.2008
Благодарил (а): 2 раза
Поблагодарили: 17 раз
Контактная информация:

#115 Сообщение 11.07.2011, 16:11

и ещё 1 очень тупой вопрос... Я с дельфи мало знаком, изучаю преимущественно С/С++. В каком модуле описан класс TFileStream? Погуглил - без толку. Совершенно случайно наткнулся на информацию о нём... Он вроде предоставляет схожий с Си (fread, fwrite) функционал для работы с двоичными файлами.
© [user]

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#116 Сообщение 11.07.2011, 16:29

[user]
TFileStream, насколько я помню, наследуется от TStream и реализует какой-то там интерфейс (предположительно IStream %) )... В какой IDE ты работаешь?
Google выдаёт вот что по этому вопросу: http://www.firststeps.ru/cbuilder/r.php?49 - там годно описано что это такое (правда синтаксис сишный, а не дельфёвый... но в дельфи также).
Описан он в модуле Classes.

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#117 Сообщение 12.07.2011, 06:15

А WinAPI уже не торт? На любом языке доступны функции ReadFile, WriteFile, CreateFile...

Аватара пользователя
GanGSISoft
Полковник
Полковник
Сообщения: 1430
Зарегистрирован: 27.03.2008
Откуда: Бацькаўшчына
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

#118 Сообщение 01.08.2011, 19:46

Пишу gtk приложение. Как обрабатывать нажатия на клавиши? То есть, я нажимаю на клавишу с кодом , например 45, и вызывается функция обработки, её указывается что пользователь нажал клавишу 45.

Добавлено спустя 15 минут 24 секунды:
И какой смысл в типах gint, gboolean и др.?
Последний раз редактировалось GanGSISoft 01.08.2011, 19:33, всего редактировалось 1 раз.

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#119 Сообщение 01.08.2011, 20:00

Как обрабатывать нажатия на клавиши?
ncurses
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#120 Сообщение 01.08.2011, 21:23

[user]
Копай в Classes ;)

GanGSISoft
Я реализовывал реакцию на мышь таким образом (если криво, просьба не пинать, кусок с первой программы в GTK:

Код: Выделить всё

  gtk_signal_connect(GTK_OBJECT(box), "motion_notify_event", (GtkSignalFunc)mouse_move, NULL);
  gtk_signal_connect(GTK_OBJECT(box), "button_press_event", (GtkSignalFunc)mouse_down, NULL);
....
static gint mouse_move(GtkWidget *widget, GdkEventButton *event)
{ }
static gint mouse_down(GtkWidget *widget, GdkEventButton *event)
{ }
И какой смысл в типах gint, gboolean и др.?
Для кросплатформы и различных сред, ибо тип данных int может оказаться и int32 и int16 и int64 (как будет объявлено и переназначено пользователем.
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

Ответить Вложения 1