Не компилируется в fpc под Linux

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Не компилируется в fpc под Linux

Сообщение Mavlyudov » 18.09.2019 00:14:11

При пеерводе программы из-под винды в линукс возникла проблема.
Код не кмпилируется. В коде ничего не менял.
Под win32 средствами free pascal компилируется без проблем.

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

TYPE
FUNIN = FUNCTION : INTEGER;
VAR
SGETMAXY : FUNIN;
K7:INTEGER;
BEGIN
K7:=SGETMAXY DIV 50;
END.


Под Ubuntu выдает ошибку
Код: Выделить всё
TEST1.PAS(12,5) Warning: Variable "SGETMAXY" does not seem to be initialized
TEST1.PAS(12,5) Error: Incompatible types: got "<procedure variable type of function:SmallInt;Register>" expected "SmallInt"
TEST1.PAS(14) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted


Как поправить?
Mavlyudov
новенький
 
Сообщения: 34
Зарегистрирован: 24.01.2010 20:35:23

Re: Не компилируется в fpc под Linux

Сообщение Дож » 18.09.2019 01:05:12

Проинициализировать SGETMAXY.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 812
Зарегистрирован: 12.10.2008 16:14:47

Re: Не компилируется в fpc под Linux

Сообщение Mavlyudov » 18.09.2019 02:21:57

Дож
Как? Вообще это отдельный модуль, я для простоты переделал в программу.
В винде компилируется.
Mavlyudov
новенький
 
Сообщения: 34
Зарегистрирован: 24.01.2010 20:35:23

Re: Не компилируется в fpc под Linux

Сообщение Дож » 18.09.2019 03:27:29

SGETMAXY := nil;

А, у вас не компилируется из-за ошибки, а не варнинга... Не сразу заметил. Тогда ещё попробуйте добавить скобочки
Код: Выделить всё
K7:=SGETMAXY() DIV 50;
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 812
Зарегистрирован: 12.10.2008 16:14:47

Re: Не компилируется в fpc под Linux

Сообщение Vadim » 18.09.2019 06:47:21

Mavlyudov писал(а):При пеерводе программы из-под винды в линукс возникла проблема.
Код не кмпилируется. В коде ничего не менял.
Под win32 средствами free pascal компилируется без проблем.

Ваша неправда, в винде этот код тоже не компилируется. Такое впечатление, что у Вас на компе одно, а сюда нам Вы выкладываете совсем другое. И как по Вашему мы сможем определить в чём ошибка? Постарайтесь быть внимательнее, иначе все Ваши вопросы будут оставаться гласом вопиющего в пустыне... ;-)
Конкретно по выложенному коду:
Вне зависимости от успехов компиляции, этот дурной код работать не будет.
SGETMAXY - у Вас имеет процедурный тип. Прежде чем использовать переменную (любого типа) ей нужно присвоить значение, соответствующее её типу. Вы этого не сделали! Ошибка именно в этом. Хотя компилятор по этому поводу выдал всего лишь предупреждение (warning), но это как раз ошибка. Компилятору, по идее, абсолютно всё равно, есть у Вас в переменной какое-нибудь значение или только мусор, поэтому он и оформил этот момент как предупреждение. Однако с Вашей стороны - это ошибка.
И, как сказал Дож, поставьте там скобочки, чтобы компилятор знал, что это уже не переменная, а именно функция. Потому что компилятору нужны точные указания, а то, что Вы имели в виду, Вы сами то знаете, а вот компилятору сказать об этом забыли. За что он Вам плюху и выдал... ;-)
Vadim
долгожитель
 
Сообщения: 3803
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Не компилируется в fpc под Linux

Сообщение Dakor » 18.09.2019 08:46:38

Mavlyudov писал(а):Как поправить?

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

TYPE
FUNIN = FUNCTION : INTEGER;

function MyFunc: Integer;
begin
  MyFunc:= 100; // здесь Ваш расчет нужного значения
end;

VAR
SGETMAXY : FUNIN;
K7:INTEGER;
BEGIN
SGETMAXY:= @MyFunc;
K7:=SGETMAXY DIV 50;
END.


Процедурный тип мало объявить, нужно написать и соответствующую функцию, адрес которой и присвоить переменной процедурного типа.
Dakor
новенький
 
Сообщения: 13
Зарегистрирован: 15.04.2018 00:01:01

Re: Не компилируется в fpc под Linux

Сообщение Mavlyudov » 18.09.2019 12:15:01

Vadim
Компилируется в винде! Я записал видео в подтверждение: https://youtu.be/KL39Oz9ltZ4.
Но, я вспомнил, что версия компилятора ppc386 у меня довольно старая на винде.
Если в видео не видно, то приведу тут:
Код: Выделить всё
Free Pascal Compiler version 1.0.10 [2003/06/27] for i386
Copyright (c) 1993-2003 by Florian Klaempfl
Hint: Path "d:\sss\units\win32\" not found
Hint: Path "d:\sss\units\win32\rtl\" not found
Target OS: Win32 for i386
Compiling test1.pas
syswin32.pp(3,1) Hint: Conditional I386 was set at startup in last compilation of syswin32.pp
test1.pas(9,13) Warning: Variable SGETMAXY does not seem to be initialized
test1.pas(7,1) Note: Local variable K7 is assigned but never used
Linking test1.exe
10 Lines compiled, 0.3 sec


А параметры bat-файла, которым компилирую такие:
Код: Выделить всё
\SSS\cmp\ppc386 -Sd -Sg -Un -O1 -Xs %1 -FU\S000\MOD -Fo\S000\MOD -WG -WN


Версия минимального моего компилятора тут https://dropmefiles.com/1YM5J
Mavlyudov
новенький
 
Сообщения: 34
Зарегистрирован: 24.01.2010 20:35:23

Re: Не компилируется в fpc под Linux

Сообщение Vadim » 18.09.2019 13:42:19

Mavlyudov писал(а):Но, я вспомнил, что версия компилятора ppc386 у меня довольно старая на винде.

Вот я и говорю - у Вас там одно, а у нас здесь совершенно другое. Если мы будем беседовать без знания таких основополагающих нюансов, то вряд ли будем ясно понимать друг друга... ;-) Могу по этому поводу сказать, что разработчики с тех пор, когда была версия 1.0.10, поняли, что от программистов трудно ожидать понимания того, что они делают, поэтому проверку кода в компиляторе ужесточили.
Безотносительно версии компилятора. Всё, что я Вам говорил, по поводу приведённого Вами в начале кода, не перестаёт быть справедливым. Учтите это. ;-)
Vadim
долгожитель
 
Сообщения: 3803
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Не компилируется в fpc под Linux

Сообщение Дож » 18.09.2019 15:07:31

Mavlyudov,
Компилируется в винде! Я записал видео в подтверждение: https://youtu.be/KL39Oz9ltZ4.

уберите ключик -Sd и выдаст ту же ошибку, что и в линуксе.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 812
Зарегистрирован: 12.10.2008 16:14:47

Re: Не компилируется в fpc под Linux

Сообщение alexs » 18.09.2019 15:19:42

Mavlyudov
Всё дело в волшебных пузырьках - добавь скобки:
Код: Выделить всё
PROGRAM TEST1;
TYPE
  FUNIN = FUNCTION : INTEGER;
VAR
  SGETMAXY : FUNIN;
  K7:INTEGER;
BEGIN
  K7:=SGETMAXY() DIV 50;
END.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3870
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru