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

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

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

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

Сообщение zub » 25.01.2017 14:09:30

>>Статическая проверка типа значения, присваиваемого элементу коллекции
Это конечно да, только для классов не так уж и нужно. ИМХО
zub
долгожитель
 
Сообщения: 1969
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitaly_l » 25.01.2017 15:02:02

zub писал(а):А вот гадать ассигн это или не ассигн не остается...

Это не assign :( - заменил его на отрисовку и всё равно вылетает, значит увы не assign :oops: :evil: :cry: .

В общем, работает только вариант Бородатого Пупсика, вот этот: FreeAndNil(arrBitmap[b])
Бородатое СПАСИБО и бородатый респект - бородатому Пупсику и всем кто принимал участие тоже спасибо, :roll: но не бородатое.

Итог: Проблема на 55% решена, про остальные 45% :roll: никому не рассказывайте! :wink:
Вот чего она ещё пишет, но мне это реально непонятно, даже с моим крохотным знанием asm:
Вложения
error25.01.2017.jpg
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 2475
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение zub » 25.01.2017 16:29:55

>>Проблема на 55% решена,
Это как подорожник подкладывать под йодную сетку при открытом переломе))
Хорошо что у тебя хобби - паскаль, а не медицина...
zub
долгожитель
 
Сообщения: 1969
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitaly_l » 25.01.2017 16:48:02

zub писал(а):Это как подорожник подкладывать под йодную сетку при открытом переломе))
Хорошо что у тебя хобби - паскаль, а не медицина...

Не так всё и страшно, в реальности - это Вы перегибаете. Я месяц держал эту строчку закомментированной и ничего страшного не было. Программа отключалась и снова включалась и так по 1000 раз в день и ничего. Просто, решил в итоге пробить и проверить, а ВДРУГ я неправильно делаю?

А сейчас - 100% можно быть уверенным, что память Free And Nill и если там что-то само без моего ведома чистит память (как Вы предположили), то метод Бородатого Пупсика - прекрасно выполняет оставшуюся задачу и присваивает переменным nil.

Ну а если же, сбой вдруг серьёзный как перелом, то он потом ещё где нить всплывёт. Я для себя пишу утилитку, поэтому тут же замечу любой сбой.

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

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

Сообщение MysticCoder » 25.01.2017 17:03:11

Вангую, что проблема вернется чуть позже
MysticCoder
новенький
 
Сообщения: 86
Зарегистрирован: 14.09.2013 00:20:28

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

Сообщение vitaly_l » 25.01.2017 17:07:41

Нашёл, ещё одну странную зависимость...

В коде, на: FormCloseQuery, у меня появляется: messageDlg, который всплывает в случае наличия изменений и предлагает сохранить сделанную работу. Так вот, если запретить появление messageDlg, а значит и последующее появление OpenDialog, то память с arrBitmap[ b ].Free; - отчищается - без ошибки и программа закрывается - без сбоя.

В общем, всё пропало, виноват var MR : TModalResult;, который в FormCloseQuery...
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 2475
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение MysticCoder » 25.01.2017 17:15:12

давай весь код, хорош в экстрасенсов играть
MysticCoder
новенький
 
Сообщения: 86
Зарегистрирован: 14.09.2013 00:20:28

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

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

MysticCoder писал(а):давай весь код, хорош в экстрасенсов играть

Код: Выделить всё
procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
var MR : TModalResult;
begin
  boModify := false; // блокирует появление диалога и тогда всё работает без сбоя.
  try
    if boModify then begin
      MR := QuestionDlg('Вопрос', 'Сохранить изменения в проекте '+OpenDialog1.FileName+'?'+#13, mtConfirmation, [mrOK, 'Да', mrNo,'Нет', mrCancel,'Отмена'], 0);
      case MR of
        mrOK: if OpenDialog1.FileName <> ''
                then actSaveExecute(Self)
                else actSaveAsXMLExecute(Self);
        mrNo: CanClose := true;
        mrCancel: CanClose := false;
      end;
    end;
  except
    on e:exception do ShowMessage('Сбой при закрытии программы: '+#13+e.Message);
  end;

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

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

Сообщение MysticCoder » 25.01.2017 17:28:52

-_-
весь код юнита. ты где то портишь память, и явно не в этих огрызках кода, что выдаешь.
MysticCoder
новенький
 
Сообщения: 86
Зарегистрирован: 14.09.2013 00:20:28

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

Сообщение zub » 25.01.2017 17:31:54

>>В общем, всё пропало, виноват var MR : TModalResult;, который в FormCloseQuery...
actSaveExecute или actSaveAsXMLExecute

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

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

Сообщение vitaly_l » 25.01.2017 17:36:15

MysticCoder писал(а):весь код юнита. ты где то портишь память, и явно не в этих огрызках кода, что выдаешь.

Весь код, где я заполняю битмапы - приведён выше. Дело не в битмапах, а в MR : TModalResult;

zub писал(а):actSaveExecute или actSaveAsXMLExecute

Абсолютно точно не они, вот я их закомментировал и всё равно сбой:
Код: Выделить всё
procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
var MR : TModalResult;
begin
  // boModify := false;
  try
    if boModify then begin
      MR := QuestionDlg('Вопрос', 'Сохранить изменения в проекте '+OpenDialog1.FileName+'?'+#13, mtConfirmation, [mrOK, 'Да', mrNo,'Нет', mrCancel,'Отмена'], 0);
      case MR of
        mrOK: CanClose := true; //if OpenDialog1.FileName <> ''
                // then CanClose := true  // actSaveExecute(Self)
                // else CanClose := true; // actSaveAsXMLExecute(Self);
        mrNo: CanClose := true;
        mrCancel: CanClose := false;
      end;
    end;
  except
    on e:exception do ShowMessage('Сбой при закрытии программы: '+#13+e.Message);
  end;
end; 


Выполняется только вот этот код MR := QuestionDlg (итд) и выскакивает сбой, а если отключить, то всё чистится, как положено. Дело не в памяти, а в этом TModalResult ... Там видимо какой-то параллельный процесс запускается и успевает почистить память ?

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

Я просто спросил, чтобы удостовериться - все ли мои действия верны.
Последний раз редактировалось vitaly_l 25.01.2017 17:40:16, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 2475
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение zub » 25.01.2017 17:38:50

>>Дело не в памяти, а в этом TModalResult ...
Нда..
zub
долгожитель
 
Сообщения: 1969
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitaly_l » 25.01.2017 17:47:25

zub писал(а):>>Дело не в памяти, а в этом TModalResult ...
Нда..


Вот так всё работает - 100% без сбоя:

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

procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
//var MR : TModalResult;
begin
  // boModify := false;
  try
    if boModify then begin
      //MR := ;
      case QuestionDlg('Вопрос', 'Сохранить изменения в проекте '+OpenDialog1.FileName+'?'+#13, mtConfirmation, [mrOK, 'Да', mrNo,'Нет', mrCancel,'Отмена'], 0) of
        mrOK: if OpenDialog1.FileName <> ''
                then  actSaveExecute(Self)
                else   actSaveAsXMLExecute(Self);
        mrNo: CanClose := true;
        mrCancel: CanClose := false;
      end;
    end;
  except
    on e:exception do ShowMessage('Сбой при закрытии программы: '+#13+e.Message);
  end;
end;     



Я просто запретил создание: //var MR : TModalResult; и всё перестало сбоить <== Объяснить это художники не могут, может кто в курсе почему???
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 2475
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение MysticCoder » 25.01.2017 17:49:18

vitaly_l писал(а):Дело не в битмапах, а в MR : TModalResult;


конечно же в MR : TModalResult; , это же на первом курсе еще объясняется, что им пользоваться нельзя и что он придуман только для того, чтобы сбои вызывать.
MysticCoder писал(а):Вангую, что проблема вернется чуть позже


vitaly_l писал(а):Нашёл, ещё одну странную зависимость...

вот этих странных зависимостей еще кучу найдешь, пока корень проблемы не найдешь. т.к. при порче памяти в одном положении системы все работает, а при любом чихе все катится к чертям.
MysticCoder
новенький
 
Сообщения: 86
Зарегистрирован: 14.09.2013 00:20:28

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

Сообщение vitaly_l » 25.01.2017 18:20:34

MysticCoder писал(а):вот этих странных зависимостей еще кучу найдешь, пока корень проблемы не найдешь. т.к. при порче памяти в одном положении системы все работает, а при любом чихе все катится к чертям.

У меня неправильное образование, в смысле у меня не было первого курса и сразу пришлось стать Великим и неповторимым магистром.
:arrow: :?: Как обнаружить порчу памяти???
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 2475
Зарегистрирован: 31.01.2012 16:41:41

Пред.След.

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

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

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

Рейтинг@Mail.ru