Страница 2 из 4
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 11:26:45
zub
Всё может быть))
Придется всетаки разобраться, а не тупо хватать любую чушь
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 11:33:00
vitaly_l
zub писал(а):Придется всетаки разобраться, а не тупо хватать любую чушь
Давайте разберёмся, вот полный код вместе с обработкой в середине.
Код: Выделить всё
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.someName();
var
b:byte;
begin
for b := 0 to 22 do begin
// ......
Image1.Picture.Bitmap.LoadFromFile('xxx'+IntToStr(b)+'.png');
arrBitmap[b].Assign(Image1.Picture.Bitmap);
Canvas.StretchDraw(aRect,arrBitmap[b]);
end;
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;

Что-то может там УДАЛЯТЬСЯ без моего ведома и потом в конце программы выдавать SIGSEGV при for b := 0 to 22 do arrBitmap[b].Free; ?
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 11:39:04
zub
Я не знаю LCL и не могу сказать приводит ли Assign к ссылкам внутри arrBitmap[] на одно и тоже. Думаю не должен.
Дальнейшие разбирательства с моим участием только при наличии минимального компилируемого примера с ошибкой.
Re: (решено) SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 11:47:32
pupsik
- это динамический массив?
а что тогда это?
Упс... сам наплутал (решение верное но не в данном варианте).
Но: Бородатый Пупсик - оказался прав!
я ошибся... Не ведитесь на бородатых

Придется всетаки разобраться, а не тупо хватать любую чушь
во..во.
или
п.с.
По идее, при закрытии формы массив удаляется.
Плюс: если вы хотите хранить что то в массиве то не надо так делать. Т.е. сами обрабатывайте запись в массив и удаление. А не наляписто
Или воспользуйтесь модулем fgl - для хранения объектов (если не охота писать работу с массивом).
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 11:51:23
grot
зачем вообще здесь нужен массив ???
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 11:56:11
zub
>>а что тогда это?
Я имел ввиду что нет разницы статический или динамический - в этом случае у них одинаковое поведение, но чето не сложилось и "перередактировал" сообщение
Дело не в массиве а в ссылках на одно и тоже. как не заверни - дин\стат массив, список, чтото из fgl - ошибка не уйдет пока будет "двойной" вызов деструкторов
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 12:03:38
vitaly_l
zub писал(а):Дело не в массиве а в ссылках на одно и тоже. как не заверни - дин\стат массив, список, чтото из fgl - ошибка не уйдет пока будет "двойной" вы зов деструкторов
В общем я попробовал сделать пример, но в примере ошибка исчезла...
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, Grids;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
StringGrid1: TStringGrid;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
arrBitmap : array[0..33] of TBitmap;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
b:byte;
begin
for b := 0 to 22 do arrBitmap[b] := TBitmap.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
b:byte;
aRect:TRect;
begin
aRect.Top := 0;
aRect.Left := 0;
aRect.Bottom := Height;
aRect.Right := Width;
for b := 0 to 22 do begin
Image1.Picture.LoadFromFile('1.png');
arrBitmap[b].Assign(Image1.Picture.Bitmap);
Canvas.StretchDraw(aRect,arrBitmap[b]);
end;
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
b:byte;
begin
try
finally
for b := 0 to 22 do arrBitmap[b].Free; // <== вот на этом коде вылетает SIGSEGV - почему?
end;
end;
end.
В вышеприведённом примере - ошибка не выскакивает.
Сбой - где-то в другом месте
(
Только assign остаётся... попробую по другому предать битмап, и нарисовать его... рисование явно не assign - может повезёт...
grot писал(а):зачем вообще здесь нужен массив ???
Массив хранит картинки, которые используются очень часто на протяжении работы программы.
.
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 12:14:19
zub
>>но в примере ошибка исчезла...
к вопросу о пользе минимальных примеров, а не к обрывком какойто лабуды в стартовых постах
Добавлено спустя 5 минут 43 секунды:
>>Только assign остаётся... попробую по другому предать битмап, и нарисовать его... рисование явно не assign - может повезёт...
Остается например посмотреть на каком индексе вылет, или например "распечатать" массив и посмотреть нет ли сразу в массиве ссылок на одно и тоже?. Потом глянуть стек и таки узнать на освобождении чего вылет... А вот гадать ассигн это или не ассигн не остается...
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 12:16:46
vitaly_l
zub писал(а):о пользе минимальных примеров
ну... ошибка-то, где то, здесь прячется...
pupsik писал(а):FreeAndNil(arrBitmap[b]);
Вот так, точно, перестала выскакивать: for b := 8 downto 0 do FreeAndNil(arrBitmap[b]); Проверил несколько раз.

Программисты дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free; ???
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 12:19:45
pupsik
zub интересует: насколько правильный данный код...
И можно ли его по другому написать?
Добавлено спустя 2 минуты 45 секунд:Программисты дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free;
по идее: дело в другом.
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 12:26:35
zub
Я не специалист по правильным кодам. вылетов вроде нет, утечек вроде нет - потянет. Но имхо для классов генерики никаких плюсов не несут
Добавлено спустя 1 минуту 2 секунды:
>>дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free; ???
Дают, но после того как ты устранишь ошибки
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 12:30:36
pupsik
Я не специалист по правильным кодам.
а я по иной причине спросил. Вы же, если не ошибаюсь, с ними плотно работаете.
Но имхо для классов генерики никаких плюсов не несут
в принципе да.
п.с.
Код не несет полезности, тем более пара строчек. Просто стало интересно...
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 12:37:42
vitaly_l
pupsik писал(а): im_col.7z
Так как в примере, более правильно создавать массивы картинок? Не понимаю, почему?
zub писал(а):Дают, но после того как ты устранишь ошибки
Нет никаких ошибок, всё работает.
zub писал(а):посмотреть на каком индексе вылет,
или например "распечатать" массив и посмотреть нет ли сразу в массиве ссылок на одно и тоже?.
Потом глянуть стек и таки узнать на освобождении чего вылет...
Вот на эти действия можно получить инструкцию? ( только, пожалуйста, без отправки в гууугл, я не хочу стоять в гуу-углу )
/
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 12:40:32
zub
Что значит плотно? Обычно. использую в виде велосипедов и в виде fpc-stl.
Re: SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 25.01.2017 12:51:14
Дож
Но имхо для классов генерики никаких плюсов не несут
Статическая проверка типа значения, присваиваемого элементу коллекции