Страница 1 из 4

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

СообщениеДобавлено: 25.01.2017 11:13:27
vitaly_l
Код: Выделить всё

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 - почему? <== Что я делаю неправильно?


.

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

СообщениеДобавлено: 25.01.2017 11:21:55
zub
Уничтожаешь чтото 2 раза.
Будь у тебя прямой доступ к видеокарте такого бы точно небыло))

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

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

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

т.е. удаляем первую запись массива. Хотя... Куда мне до Бога с корабликом :lol:

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

СообщениеДобавлено: 25.01.2017 11:44:29
zub
pupsik
В порядке тролинга?

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

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

СообщениеДобавлено: 25.01.2017 11:49:12
vitaly_l
pupsik писал(а):Где будет находиться вторая запись перед удалением?

Мысль понятна...

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

СообщениеДобавлено: 25.01.2017 11:49:30
pupsik
В порядке тролинга?
В смысле? Или вы считаете что ответ не верен? Учитывая что статический массив из 33-х "строк" и vitaly_l пытается удалить 22 "строки", начиная с первой...
Если я не прав то... скажите: что произойдет при в=22. Т.е. на какой части будем находиться?

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

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

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

Мысль понятна... исправил! Работает. Вам засчитан респект, от Бога с корабликом :wink:
И в подарок хорошее настроение, :roll: Респектно-Бородатому пупсику :wink: .

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

СообщениеДобавлено: 25.01.2017 11:50:59
zub
Люди вы совсем уже?
Я перестал понимать юмор?

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

СообщениеДобавлено: 25.01.2017 11:52:47
vitaly_l
zub писал(а):Люди вы совсем уже?
Я перестал понимать юмор?

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

Добавлено спустя 444 секунды:
PS: Спасибо!

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

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

Добавлено спустя 100500 секунд:
>>Для меня это тоже нонсенс... но это так!
ЭТО НЕ ТАК

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

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

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

СообщениеДобавлено: 25.01.2017 12:00:57
zub
Давай вникнем.
>>Когда удаляется первый элемент массива... что происходит с остальными элементами? Где будет находиться вторая запись перед удалением?
Но это тоже монописуально, и до и после вторая записб будет на томже месте, ниче не сдвигается если вы об этом

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

СообщениеДобавлено: 25.01.2017 12:08:33
vitaly_l
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]);


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


.

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

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

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

СообщениеДобавлено: 25.01.2017 12:23:43
vitaly_l
zub писал(а):Вангую так: пытаешся одно и тоже освободить несколько раз.

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


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

.