Деление на ноль?

Вопросы программирования и использования среды Lazarus.

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

Деление на ноль?

Сообщение noscow » 08.07.2022 23:12:04

Добрый день!
Недавно начал учиться программированию, ещё более недавно - Паскалю в Лазарусе.
Делаю незамысловатую игру, пока что без сторонних библиотек, средствами ИДЕ. ОС - Линукс Xubutnu.
Возникает периодически ошибка такого плана:

Проект вызвал класс исключения 'External: Unknown exception code 8'.
В файле 'laztracer.pas' на строке 50
LazTracer, в свою очередь, указывает на такую строку:
procedure RaiseGDBException(const Msg: string);
begin
DebugLn(lrsERRORInCode, Msg);
// creates an exception, that gdb catches:
DebugLn(lrsCreatingGdbCatchableError);
DumpStack;
{$ifndef HASAMIGA} // On Amiga Division by 0 is not catchable, just crash
if (length(Msg) div (length(Msg) div 10000))=0 then ;
{$endif}
end;

Происходит это временами, всё чаще. Последний раз после того, как в модуле попытался присвоить переменной случайное значение:
function filler(var name: string): Oblast;
var
Obl: Oblast;
RandBG: integer;
begin
Randomize;
RandBG:= Random(3);

После этого я изменил код, удалив всё, что написал с момента, когда программа работала исправно:
function filler(var name: string): Oblast;
var
Obl: Oblast;
begin

Не помогло. Тогда запустил программу без ИДЕ. Она тоже сообщила о делении на ноль, но, после того, как я проигнорировал это сообщение, запустилась. И через ИДЕ после этого снова всё собралось... А потом (ничего не менял, просто попробовал ещё раз запустить в ИДЕ) - опять не работало...
Короче, я не вижу связи между этим сообщением и своими действиями. То работает, то нет.
Иногда появляется сообщение и после каких-то других действий. Откатываюсь назад, пишу снова вроде то же самое - работает.
Короче, работать невозможно. Подскажите, в чём может быть беда. Или хотя бы направление, в котором надо копать.
Спасибо.
noscow
незнакомец
 
Сообщения: 8
Зарегистрирован: 08.07.2022 22:55:17

Re: Деление на ноль?

Сообщение Vadim » 09.07.2022 04:28:54

Из Вашего сообщения невозможно понять, где именно у Вас ошибка. Следовательно, подсказать
noscow писал(а):в чём может быть беда. Или хотя бы направление, в котором надо копать.

никак невозможно.
Можете ли Вы выложить сюда ваш код, максимально урезанный, но чтобы он давал описываемую Вами ошибку?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Деление на ноль?

Сообщение noscow » 09.07.2022 12:09:01

Сложность в том, что ошибка непостоянна.
Сейчас, например, я удалил в программе строку с объявлением нескольких переменных TBitmap, и программа стабильно работает :| При этом, в прошлый раз ошибку вызвало написание куска кода в модуле. То есть я даже не знаю, а пропала ли она окончательно, когда я что-то поменял.
У меня возникло подозрение, что проблема с самим Лазарусом (была небольшая проблема при установке), я попробую сейчас всё переустановить и проверить, как будет работать, может сейчас направсно начну Вас грузить своим кодом. Если не спасёт - постараюсь сократить и скину код, спасибо.

Добавлено спустя 9 часов 44 минуты 22 секунды:
Сейчас запускается нормально. Если в течение нескольких дней не будет ошибки, то, видимо, помогла переустановка.
Правда, теперь другая проблема - не отображаются кнопки, а Лазарус жалуется, что не найдены ctrbeninS.o и crtbeginS.o. Чтобы тем не плодить - подскажите здесь, что я недоустановил?..
До этого работало, но у меня был Убунту с xfse, а теперь Debian с GNOME. До этого кнопки были в порядке. Сейчас, вроде, они даже нажимаются, если тыкать по форме, но вот не видно их.
Я могу создать новую форму с кнопкой, там она будет работать. А на старой не видит. Возможно, быстрее будет просто заново создать формы с кнопками и вставить туда весь код...

Добавлено спустя 1 час 31 минуту 40 секунд:
А нет, и старая проблема никуда не делась.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
noscow
незнакомец
 
Сообщения: 8
Зарегистрирован: 08.07.2022 22:55:17

Re: Деление на ноль?

Сообщение svk12 » 10.07.2022 02:57:40

Не установлен пакет для разработки, например glibc-devel.
svk12
постоялец
 
Сообщения: 408
Зарегистрирован: 09.06.2008 18:42:47

Re: Деление на ноль?

Сообщение Vadim » 10.07.2022 03:52:34

noscow писал(а):а Лазарус жалуется, что не найдены ctrbeninS.o и crtbeginS.o.

GCC установлен?
Файлы crtbegin*.o и crtend*.o - это стандартные объектные файлы, которые добавляются в любую (или почти любую) откомпилированную программу и служат в качестве её стандартного начала и завершения, до того (и, соответственно, после того), как начинает (заканчивает) непосредственно действовать Ваш код.
Как правило устанавливаются вместе с GCC.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Деление на ноль?

Сообщение noscow » 10.07.2022 23:54:56

GCC уже установлен, только что попробовал через терминал - говорит, последняя версия.
Получается, эти файлы не установились вместе с ним, нужно просто каким-то образом отдельно их добавить?
svk12 писал(а):Не установлен пакет для разработки, например glibc-devel.

А как определить, какого именно пакета не хватает?
noscow
незнакомец
 
Сообщения: 8
Зарегистрирован: 08.07.2022 22:55:17

Re: Деление на ноль?

Сообщение Vadim » 11.07.2022 03:12:49

noscow писал(а):Получается, эти файлы не установились вместе с ним, нужно просто каким-то образом отдельно их добавить?

А давайте проверим. Откройте консоль (терминал) и наберите там:
Код: Выделить всё
find /usr -type f -name "crtbegin*"

Т.е. искать будем в каталоге "/usr" (совершенно точно, эти файлы должны лежать там), только файлы и по шаблону в названии. Если найдётся - перейдите в найденный каталог и убедитесь, что "crtend*.o" лежат там-же.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Деление на ноль?

Сообщение noscow » 11.07.2022 09:48:07

Да, лежат все в папке, gcc, на месте. Странно, что Лазарус не видит. Теперь можно ему вручную указать путь в настройках?

Добавлено спустя 3 часа 43 минуты 16 секунд:
Заработало, отлично, спасибо большое.
Но я указал в настройках проекта путь к папке. Раньше Лазарус сам находил... Из-за чего такое может быть? Это не критично, но тем не менее.
noscow
незнакомец
 
Сообщения: 8
Зарегистрирован: 08.07.2022 22:55:17

Re: Деление на ноль?

Сообщение svk12 » 11.07.2022 14:08:39

Vadim писал(а):А как определить, какого именно пакета не хватает?

В такой ситуации в каталоге, где собирается бинарник программы, должен появляться файл 'link.res'. В нём можно поискать что именно не нашлось. Но для начала стоит проверить установлены ли пакеты вроде 'binutils', 'buildutils', 'build-essencilals', в зависимости от дистрибутива.
svk12
постоялец
 
Сообщения: 408
Зарегистрирован: 09.06.2008 18:42:47

Re: Деление на ноль?

Сообщение Vadim » 11.07.2022 15:55:36

noscow писал(а):Из-за чего такое может быть?

Заходите в файл настроек компилятора FreePascal (/etc/fpc.cfg) и смотрите, правильно ли у Вас там указан путь к GCC:
Screenshot_20220711_184642.png

Примечание: у Вас версия GCC может быть другая, не 10 как у меня... ;-)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Деление на ноль?

Сообщение noscow » 11.07.2022 22:50:33

У меня эти строчки выглядят так:
# path to the gcclib


# searchpath for libraries
#-Fl/usr/lib/fpc/$fpcversion/lib
#-Fl/lib;/usr/lib
-Fl/usr/lib/fpc/$fpcversion/lib/$FPCTARGET



Нужно вписать в последнюю на нужный путь, верно?
noscow
незнакомец
 
Сообщения: 8
Зарегистрирован: 08.07.2022 22:55:17

Re: Деление на ноль?

Сообщение Vadim » 12.07.2022 02:35:12

noscow писал(а):Нужно вписать в последнюю на нужный путь, верно?

Верно.
Если Вы не заморачиваетесь с кроссплатформенным программированием, то достаточно будет одной строки "-Fl" для gcclib без обвязки её ifdef'ами.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Деление на ноль?

Сообщение noscow » 12.07.2022 15:06:01

А если нужна кроссплатформенность?

И касательно изначальной проблемы. Похоже, я нашёл участок кода, закомментировав который я никогда не получаю той ошибки. Вот он:
Код: Выделить всё
procedure TForm1.Timer1Timer(Sender: TObject);
var y, x, yD, xD: integer;
    BGBmpHolder: TBitmap;
    IcoBmpHolder: TBitmap;
begin
  WhereNow.Caption:= Materium[Ger.GlobalLvl, Ger.GlobalY, Ger.GlobalX].Imya;

  yD:= 0;
  xD:= 0;
  for y:= Ger.GlobalY-2 to Ger.GlobalY+2 do
  begin
    for x:= Ger.GlobalX-2 to Ger.GlobalX+2 do
    begin
     if (y<0) or (x<0) or (y>SizeY-1) or (x>SizeX-1) then
        BGBmpHolder:= Alarm
     else
        case Materium[Ger.GlobalLvl, y, x].MapBmpBG of
        0: BGBmpHolder:= Alarm;
        10: BGBmpHolder:= GreenBG0;
        11: BGBmpHolder:= GreenBG1;
        12: BGBmpHolder:= GreenBG2;
        2: BGBmpHolder:= BoneBG;
        3: BGBmpHolder:= BlueBG
        else
          BGBmpHolder:= Alarm
     end;

      if (y<0) or (x<0) or (y>SizeY-1) or (x>SizeX-1) then
        IcoBmpHolder:= Alarm
      else
        case Materium[Ger.GlobalLvl, y, x].MapBmpIco of
        0: IcoBmpHolder:= Alarm;
        1: IcoBmpHolder:= Meadow;
        2: IcoBmpHolder:= Hill;
        3: IcoBmpHolder:= Meadow;
        4: IcoBmpHolder:= Forest
        else
          IcoBmpHolder:= Alarm
      end;

    BUFF.Canvas.Draw(xD*48, yD*48, GreenSurf);
    BUFF.Canvas.Draw(xD*48, yD*48, BGBmpHolder);
    BUFF.Canvas.Draw(xD*48, yD*48, IcoBmpHolder);
    BUFF.Canvas.Draw(2*48, 2*48, Hero);
    BUFF.Canvas.Draw(0, 0, Baget);
    Karta.Canvas.Draw(0, 0, BUFF);

    xD += 1
    end;
    yD += 1;
    xD:= 0
  end

end;

Здесь происходит просмотр ячеек, которые находятся вокруг игрока. В зависимости от того, какой фон и значок присвоены ячейке (MapBmpBG, MapBmpIco), рисуется на буфер нужная картинка, потом на форме рисуется сам буфер. Получается карта (во вложениях есть).
Без этого куска кода всё запускается, если его раскомментить - через раз выдаёт ошибку. Причём иногда работает, иногда нет.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
noscow
незнакомец
 
Сообщения: 8
Зарегистрирован: 08.07.2022 22:55:17

Re: Деление на ноль?

Сообщение Vadim » 12.07.2022 16:10:34

noscow писал(а):А если нужна кроссплатформенность?

Если ориентироваться на мой рисунок, то там единственная кроссрлатформеннось - это разная разрядность процессора (Intel-совместимого). Соответственно, если процессор 32-ух разрядный или надо будет собрать программу для 32-ух разрядного процессора, то расположение 32-ух разрядных библиотек GCC нужно указать после "#ifdef cpui386", пути к 64-ёх разрядным библиотекам - после "#ifdef cpux86_64". По аналогии делается и для других типов процессоров.
По поводу ошибки. Скажите, а если я захочу протестировать Ваш код, который Вы сюда выложили, как Вы думаете, мне это удастся? ;-)
Если взглянуть одним глазком, то операций деления там не видно. Следовательно, ошибка происходит не здесь, а где-то ещё, в каком-то другом коде, который опосредованно вызывается из этого. Вот, например, есть некий юноша с именем "Alarm". Один раз Вы память под него выделили, а при повторном использовании? Или вот, к примеру, "TBitMap" - это объект или структура?
К каждой строчке Вашего кода возникают вопросы. Так что до помощи таким образом мы вряд ли доберёмся в текущем сезоне... :-)

Поскольку ничего не понятно, комментируйте не весь этот кусок кода, а построчно. Авось какая-нибудь ошибочная строка и попадётся...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Деление на ноль?

Сообщение noscow » 12.07.2022 19:25:42

Сделать его работоспособным сложно, так как он использует локальные файлы и пользовательские типы, да.
Вообще проблема в том, что сейчас в программе нет операций деления. Во всяком случае, я ими напрямую не пользовался.
Находил в интернете схожие ошибки, но, похоже, там не про деление:
https://gitlab.com/freepascal.org/lazarus/lazarus/-/issues/36786
https://forum.lazarus.freepascal.org/index.php/topic,38333.0.html
https://forum.lazarus.freepascal.org/index.php?topic=54015.0

В общем, попробую небольшими кусками код комментировать, да, спасибо. Может докопаюсь.
noscow
незнакомец
 
Сообщения: 8
Зарегистрирован: 08.07.2022 22:55:17

След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 6

Рейтинг@Mail.ru