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

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

СообщениеДобавлено: 25.01.2017 12:26:45
zub
Всё может быть))
Придется всетаки разобраться, а не тупо хватать любую чушь

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

СообщениеДобавлено: 25.01.2017 12: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 12:39:04
zub
Я не знаю LCL и не могу сказать приводит ли Assign к ссылкам внутри arrBitmap[] на одно и тоже. Думаю не должен.
Дальнейшие разбирательства с моим участием только при наличии минимального компилируемого примера с ошибкой.

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

СообщениеДобавлено: 25.01.2017 12:47:32
pupsik
Код: Выделить всё
arrBitmap : array[0..33] of TBitmap;
- это динамический массив? :shock:
Код: Выделить всё
arrBitmap : array of TBitmap;
а что тогда это?

Упс... сам наплутал (решение верное но не в данном варианте).
Но: Бородатый Пупсик - оказался прав!
я ошибся... Не ведитесь на бородатых :)
Придется всетаки разобраться, а не тупо хватать любую чушь
во..во.

Код: Выделить всё
FreeAndNil(arrBitmap[b]);

или
Код: Выделить всё
(arrBitmap[b] as TBitmap).Free;



п.с.
По идее, при закрытии формы массив удаляется.
Плюс: если вы хотите хранить что то в массиве то не надо так делать. Т.е. сами обрабатывайте запись в массив и удаление. А не наляписто
Код: Выделить всё
arrBitmap[b] := TBitmap.Create;

Или воспользуйтесь модулем fgl - для хранения объектов (если не охота писать работу с массивом).

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

СообщениеДобавлено: 25.01.2017 12:51:23
grot
зачем вообще здесь нужен массив ???

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

СообщениеДобавлено: 25.01.2017 12:56:11
zub
>>а что тогда это?
Я имел ввиду что нет разницы статический или динамический - в этом случае у них одинаковое поведение, но чето не сложилось и "перередактировал" сообщение

Дело не в массиве а в ссылках на одно и тоже. как не заверни - дин\стат массив, список, чтото из fgl - ошибка не уйдет пока будет "двойной" вызов деструкторов

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

СообщениеДобавлено: 25.01.2017 13: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 13:08:36
zub
>>но в примере ошибка исчезла...
к вопросу о пользе минимальных примеров, а не к обрывком какойто лабуды в стартовых постах

Добавлено спустя 5 минут 43 секунды:
>>Только assign остаётся... попробую по другому предать битмап, и нарисовать его... рисование явно не assign - может повезёт...
Остается например посмотреть на каком индексе вылет, или например "распечатать" массив и посмотреть нет ли сразу в массиве ссылок на одно и тоже?. Потом глянуть стек и таки узнать на освобождении чего вылет... А вот гадать ассигн это или не ассигн не остается...

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

СообщениеДобавлено: 25.01.2017 13:16:46
vitaly_l
zub писал(а):о пользе минимальных примеров

ну... ошибка-то, где то, здесь прячется...
pupsik писал(а):FreeAndNil(arrBitmap[b]);

Вот так, точно, перестала выскакивать: for b := 8 downto 0 do FreeAndNil(arrBitmap[b]); Проверил несколько раз.
:idea: :?: :arrow: Программисты дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free; ???

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

СообщениеДобавлено: 25.01.2017 13:17:00
pupsik
zub интересует: насколько правильный данный код...
И можно ли его по другому написать?

Добавлено спустя 2 минуты 45 секунд:
Программисты дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free;
по идее: дело в другом.

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

СообщениеДобавлено: 25.01.2017 13:25:33
zub
Я не специалист по правильным кодам. вылетов вроде нет, утечек вроде нет - потянет. Но имхо для классов генерики никаких плюсов не несут

Добавлено спустя 1 минуту 2 секунды:
>>дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free; ???
Дают, но после того как ты устранишь ошибки

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

СообщениеДобавлено: 25.01.2017 13:30:36
pupsik
Я не специалист по правильным кодам.
а я по иной причине спросил. Вы же, если не ошибаюсь, с ними плотно работаете.
Но имхо для классов генерики никаких плюсов не несут
в принципе да.

п.с.
Код не несет полезности, тем более пара строчек. Просто стало интересно...

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

СообщениеДобавлено: 25.01.2017 13:37:42
vitaly_l
pupsik писал(а): im_col.7z

Так как в примере, более правильно создавать массивы картинок? Не понимаю, почему?

zub писал(а):Дают, но после того как ты устранишь ошибки

Нет никаких ошибок, всё работает.

zub писал(а):посмотреть на каком индексе вылет,
или например "распечатать" массив и посмотреть нет ли сразу в массиве ссылок на одно и тоже?.
Потом глянуть стек и таки узнать на освобождении чего вылет...

Вот на эти действия можно получить инструкцию? ( только, пожалуйста, без отправки в гууугл, я не хочу стоять в гуу-углу )


/

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

СообщениеДобавлено: 25.01.2017 13:40:32
zub
Что значит плотно? Обычно. использую в виде велосипедов и в виде fpc-stl.

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

СообщениеДобавлено: 25.01.2017 13:51:14
Дож
Но имхо для классов генерики никаких плюсов не несут

Статическая проверка типа значения, присваиваемого элементу коллекции