(решено) SIGSEGV do arrBitmap[b].Free; - что не так?

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

(решено) SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение vitaly_l » 25.01.2017 11:13:27

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

private
arrBitmap : array[0..33] of TBitmap;


procedure TFormMain.FormCreate(Sender: TObject);
var
  b:byte;
begin
  for b := 0 to 22 do arrBitmap[b] := TBitmap.Create;
end; 


procedure TFormMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
  b:byte; 
begin
  try

  finally
    for b := 0 to 22 do arrBitmap[b].Free; // <== вот на этом коде вылетает SIGSEGV - почему?
  end;
end;


Если строчку: "for b := 0 to 22 do arrBitmap[b].Free; " - закомментировать, то всё работает нормально.
:?: :arrow: for b := 0 to 22 do arrBitmap[b].Free; // <== вот на этом коде вылетает SIGSEGV - почему? <== Что я делаю неправильно?


.
Последний раз редактировалось vitaly_l 25.01.2017 21:02:00, всего редактировалось 4 раз(а).
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV for b := 0 to 22 do arrBitmap[b].Free; - что не

Сообщение zub » 25.01.2017 11:21:55

Уничтожаешь чтото 2 раза.
Будь у тебя прямой доступ к видеокарте такого бы точно небыло))
Последний раз редактировалось zub 25.01.2017 11:39:25, всего редактировалось 2 раз(а).
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: SIGSEGV for b := 0 to 22 do arrBitmap[b].Free; - что не

Сообщение pupsik » 25.01.2017 11:29:24

Вот что значит флуд на феерические отступления. :mrgreen:
Когда удаляется первый элемент массива... что происходит с остальными элементами? Где будет находиться вторая запись перед удалением? Какое кол-во элементов?

Если мне карма не изменяет то надо вроде как так:
Код: Выделить всё
for b := 0 to 22 do arrBitmap[0].Free;

т.е. удаляем первую запись массива. Хотя... Куда мне до Бога с корабликом :lol:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: SIGSEGV for b := 0 to 22 do arrBitmap[b].Free; - что не

Сообщение zub » 25.01.2017 11:44:29

pupsik
В порядке тролинга?

vitaly_l
Ты сам пробовал то что ты привел в первом посте? Чесно?
Проблема гдето между FormCreate FormClose в голом виде всё ок.
Вангую так: ты своим высокохудожественным кодом между FormCreate FormClose приводишь к тому что в массиве появляются ссылки на одно и тоже - потом пытаешся это одно и тоже освободить несколько раз.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: SIGSEGV for b := 0 to 22 do arrBitmap[b].Free; - что не

Сообщение vitaly_l » 25.01.2017 11:49:12

pupsik писал(а):Где будет находиться вторая запись перед удалением?

Мысль понятна...
Последний раз редактировалось vitaly_l 25.01.2017 11:51:08, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV for b := 0 to 22 do arrBitmap[b].Free; - что не

Сообщение pupsik » 25.01.2017 11:49:30

В порядке тролинга?
В смысле? Или вы считаете что ответ не верен? Учитывая что статический массив из 33-х "строк" и vitaly_l пытается удалить 22 "строки", начиная с первой...
Если я не прав то... скажите: что произойдет при в=22. Т.е. на какой части будем находиться?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: (решено) SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение vitaly_l » 25.01.2017 11:50:54

pupsik писал(а):Если я не прав то... скажите: что произойдет при в=22. Т.е. на какой части будем находиться?

pupsik писал(а):Где будет находиться вторая запись перед удалением?

Мысль понятна... исправил! Работает. Вам засчитан респект, от Бога с корабликом :wink:
И в подарок хорошее настроение, :roll: Респектно-Бородатому пупсику :wink: .
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV for b := 0 to 22 do arrBitmap[b].Free; - что не

Сообщение zub » 25.01.2017 11:50:59

Люди вы совсем уже?
Я перестал понимать юмор?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: (решено) SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение vitaly_l » 25.01.2017 11:52:47

zub писал(а):Люди вы совсем уже?
Я перестал понимать юмор?

Никакого юмора, после его подсказки - я поправил и ошибка исчезла. Для меня это тоже нонсенс... но это так!

Добавлено спустя 444 секунды:
PS: Спасибо!
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение zub » 25.01.2017 11:53:57

>>В смысле? Или вы считаете что ответ не верен?
Конечно неверен. Массив не статический а динамический. но это монопесуально. После arrBitmap[0].Free; в arrBitmap[0] будет ссылка на мусор, а повторная попытка удалить мусор пришлет вам лучей добра.

Добавлено спустя 100500 секунд:
>>Для меня это тоже нонсенс... но это так!
ЭТО НЕ ТАК
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: (решено) SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение vitaly_l » 25.01.2017 11:57:43

вот это естественно лажа ==> arrBitmap[0].Free; в arrBitmap[0]. Решение в другом месте:
Вот на эту строчку Пупсика внимательно смотрите и вникайте:
pupsik писал(а):Когда удаляется первый элемент массива... что происходит с остальными элементами? Где будет находиться вторая запись перед удалением?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение zub » 25.01.2017 12:00:57

Давай вникнем.
>>Когда удаляется первый элемент массива... что происходит с остальными элементами? Где будет находиться вторая запись перед удалением?
Но это тоже монописуально, и до и после вторая записб будет на томже месте, ниче не сдвигается если вы об этом
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: (решено) SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение vitaly_l » 25.01.2017 12:08:33

zub писал(а):Но это тоже монописуально, и до и после вторая записб будет на томже месте, ниче не сдвигается если вы об этом

Я сделал вот так (стал удалять в обратном порядке):
Код: Выделить всё
// for b := 0 to 22 do arrBitmap[b].Free; // <== так сбой
for b := 22 downto 0 do arrBitmap[b].Free; // <== а так работает


Вы программисты, Вы и решайте, что там не так? Но: Бородатый Пупсик - оказался прав!

.

Добавлено спустя 9 минут:
Re: SIGSEGV do arrBitmap[b].Free; - что не так?

СТОП!
Респект - отзывается обратно, хорошее настроение остаётся.
Проблема не решена. Не помогло, всё равно выскакивает ошибка SIGSEGV.


Там ещё в середине программы, есть вот такой кусочек:
Код: Выделить всё
arrBitmap[b].Assign(Image1.Picture.Bitmap);
Canvas.StretchDraw(aRect,arrBitmap[b]);


Это может как-то влиять?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV for b := 0 to 22 do arrBitmap[b].Free; - что не

Сообщение zub » 25.01.2017 12:20:56

Фееричненько было. Художники... и pupsik заодно
zub писал(а):Ты сам пробовал то что ты привел в первом посте? Чесно?
Проблема гдето между FormCreate FormClose в голом виде всё ок.
Вангую так: ты своим высокохудожественным кодом между FormCreate FormClose приводишь к тому что в массиве появляются ссылки на одно и тоже - потом пытаешся это одно и тоже освободить несколько раз.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение vitaly_l » 25.01.2017 12:23:43

zub писал(а):Вангую так: пытаешся одно и тоже освободить несколько раз.

Там ещё в середине программы, есть вот такой кусочек:
Код: Выделить всё
arrBitmap[b].Assign(Image1.Picture.Bitmap);
Canvas.StretchDraw(aRect,arrBitmap[b]);


Это может как-то влиять?

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru