Казалось бы, близнецы...

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

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

Казалось бы, близнецы...

Сообщение СерП » 04.12.2010 02:46:18

Писал программу, подключил свой модуль. Компилирую - компилятор все нужные функции из модуля находит, кроме одной:
Код: Выделить всё
Error: Identifier not found "U8Symb"

Думаю, может в модуле чего не так (функцию добавил недавно)? Открываю, вроде всё нормально, в интерфейсной части прописана, реализация есть. Ничего не понимаю.
Потом вспоминаю, что есть ещё аналогичный модуль (u8b), не помню зачем делал; в нём правда не все функции из u8base (это в котором не находит), но нужная есть. Подключаю u8b в uses программы - нормально компилируется, программа работает. Удаляю из uses - опять не находит. Функция в модулях одна и та же (на всякий случай скопировал из того, в котором находит, в тот, в котором не находит), оба модуля в одной папке с программой. Явно что-то "тупое", но не могу понять - что?
СерП
новенький
 
Сообщения: 13
Зарегистрирован: 04.12.2010 01:20:10

Re: Казалось бы, близнецы...

Сообщение Vadim » 04.12.2010 07:01:58

СерП
Без кода вряд ли что-то можно толковое сказать. Выложите здесь эти два модуля - который с функцией и в котором этот модуль в Uses прописан и функция не находится.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Казалось бы, близнецы...

Сообщение Odyssey » 04.12.2010 13:34:45

Ещё попробуйте Запуск - Собрать всё (или как-то так, в англ. локализации Run - Build All)
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Казалось бы, близнецы...

Сообщение СерП » 04.12.2010 15:49:28

Vadim писал(а):СерП
Без кода вряд ли что-то можно толковое сказать. Выложите здесь эти два модуля - который с функцией и в котором этот модуль в Uses прописан и функция не находится.

Вот u8base (в нём компилятор не находит функцию U8Symb):
Код: Выделить всё
unit u8base;

{$MODE objfpc}

interface

function U8SymByte (const StrU8SB: UTF8String): Integer;
//function U8Code (const StrU8Cd: UTF8String): Integer;
function U8Length (const StrU8L: UTF8String): Integer;
function U8Pos (const SubU8P: UTF8String; const StrU8P: UTF8String): Integer;
function U8Copy (const StrU8Cp: UTF8String; Index, Count: Integer): UTF8String;
function U8Symb (const StrU8Sy: UTF8String; Index: Integer): UTF8String;
procedure U8Delete (var StrU8D: UTF8String; Index, Count: Integer);
procedure U8Insert (SubU8I: UTF8String; var StrU8I: UTF8String; Index: Integer);
function U8UpperCase (const StrU8UC: UTF8String): UTF8String;
function U8LowerCase (const StrU8LC: UTF8String): UTF8String;

implementation

uses sysutils, cwstring;

function U8SymByte (const StrU8SB: UTF8String): Integer;
begin  // по первому байту полученной UTF8-строки определяет байтовую длину её первого UTF8-символа
  case Byte (StrU8SB[1]) of
    0..127: Result:= 1;
  192..223: Result:= 2;
  224..239: Result:= 3;
  240..247: Result:= 4;
  else      Result:= 0;  // либо не UTF8, либо какая-то байтовая ошибка - первый байт StrU8SB не является первым байтом UTF8-символа
  end;
end;

{function U8Code (const StrU8Cd: UTF8String): Integer;
var
  i: Integer;
begin
  Result:= 0;
  for i:=  1 to U8SymByte (StrU8Cd)
  do  Result:= Result + (Byte (StrU8Cd[i]) shl (8*(U8SymByte (StrU8Cd) - i)));
end;}

function U8Length (const StrU8L: UTF8String): Integer; // считает длину UTF8-строки в символах(!)
var
  i, BLen: Integer;  // счётчик байтов(!) в UTF8-строке и байтовая длина строки
begin
  Result:= 0;      // длину в символах устанавливаем в 0
  i:= 1; BLen:= Length (StrU8L);
  while i <= BLen                       // пока байтовый счётчик в пределах байтовой длины UTF8-строки
  do    begin
        Inc (Result);                    // находим очередной UTF8-символ и считаем его, затем
        if   U8SymByte (StrU8L[i]) = 0
        then Exit // СДЕЛАТЬ исключение?
        else Inc (i, U8SymByte (StrU8L[i]));  // "прыгаем" к первому байту следующего UTF8-символа
        end;
end;

function U8Pos (const SubU8P: UTF8String; const StrU8P: UTF8String): Integer; // позиция подстроки в строке в символах(!)
var
  i, BLen, BSubLen: Integer;  // счётчик байтов(!) в UTF8-строке, байтовая длина строки и подстроки
begin
  if (StrU8P = '') or (SubU8P = '') then begin Result:= 0; Exit; end;
  Result:= 1;
  i:= 1; BLen:= Length (StrU8P); BSubLen:= Length (SubU8P);
  while i <= BLen   // ищем в пределах байтовой длины UTF8-строки
  do    if   SubU8P = Copy (StrU8P, i, BSubLen)  // если заданная подстрока равна выделенной из строки в очередной позиции
        then Exit                                // то текущий результат и есть искомая позиция, выходим
        else begin                               // в противном случае
             Inc (i, U8SymByte (StrU8P[i]));     // переходим к первому байту следующего UTF8-символа
             Inc (Result);                       // увеличиваем индекс позиции
             end;
  Result:= 0;  // если до сих пор не вышли, значит подстроки в строке нет
end;

function U8Copy (const StrU8Cp: UTF8String; Index, Count: Integer): UTF8String;
var
  UCn, BIn, i, U8Len: Integer;
begin
  Result:= '';
  U8Len:= U8Length (StrU8Cp);
  if ((Index < 1) or (Index > U8Len) or (Count < 1)) then Exit;
  UCn:= 1; BIn:= 1;
  while UCn <= U8Len
  do    begin
        if   (UCn >= Index) and (UCn <= (Index + Count - 1))
        then for i:= BIn to (BIn + U8SymByte (StrU8Cp [BIn]))
             do  Result:= Result + StrU8Cp [i];
        Inc (UCn);
        Inc (BIn, U8SymByte (StrU8Cp [BIn]));
        end;
end;

function U8Symb (const StrU8Sy: UTF8String; Index: Integer): UTF8String;
var
  UCn, BIn, i, U8Len: Integer;
begin
  Result:= ''; U8Len:= U8Length (StrU8Sy);
  if ((Index < 1) or (Index > U8Len)) then Exit;
  UCn:= 1; BIn:= 1;
  while UCn <= U8Len
  do    begin
        if   UCn = Index
        then for i:= BIn to (BIn + U8SymByte (StrU8Sy [BIn]) - 1)
             do  Result:= Result + StrU8Sy [i];
        Inc (UCn);
        Inc (BIn, U8SymByte (StrU8Sy [BIn]));
        end;
end;

procedure U8Delete (var StrU8D: UTF8String; Index, Count: Integer);
var
  UCn, BIn, BLn: Integer;
begin
  if   (StrU8D = '') or (Index < 1) or (Index > U8Length (StrU8D)) or (Count < 1) or (Index + Count - 1 > U8Length (StrU8D))
  then Exit;
  UCn:= 1;
  BIn:= 0;
  {ищем байтовую позицию индекса}
  while UCn < Index
  do    begin
        Inc (BIn, U8SymByte (StrU8D[BIn+1]));
        Inc (UCn);
        end;
  BLn:= 0;
  {ищем длину выделяемой подстроки в байтах}
  while UCn < (Index + Count)
  do    begin
        Inc (BLn, U8SymByte (StrU8D[BIn+BLn+1]));
        Inc (UCn);
        end;
  StrU8D:= Copy (StrU8D, 1, BIn) + Copy (StrU8D, BIn + BLn + 1, Length (StrU8D));
end;

procedure U8Insert (SubU8I: UTF8String; var StrU8I: UTF8String; Index: Integer);
begin // вставить перед первым или после последнего символа - ?
  if (StrU8I = '') or (SubU8I = '') or (Index < 1) or (Index > U8Length (StrU8I)) then Exit;
  StrU8I:= U8Copy (StrU8I, 1, Index - 1) + SubU8I + U8Copy (StrU8I, Index, U8Length (StrU8I));
end;

function U8UpperCase (const StrU8UC: UTF8String): UTF8String;
begin
  Result:= UTF8Encode (WideUpperCase (UTF8Decode (StrU8UC)));
end;

function U8LowerCase (const StrU8LC: UTF8String): UTF8String;
begin
  Result:= UTF8Encode (WideLowerCase (UTF8Decode (StrU8LC)));
end;

end.

А вот u8b (в нём находит):
Код: Выделить всё
unit u8b;

{$MODE objfpc}

interface

uses sysutils, cwstring;

function U8SymByte (const StrU8SB: UTF8String): Integer;
//function U8Code (const StrU8Cd: UTF8String): Integer;
function U8Length (const StrU8L: UTF8String): Integer;
function U8Pos (const SubU8P: UTF8String; const StrU8P: UTF8String): Integer;
function U8Copy (const StrU8Cp: UTF8String; Index, Count: Integer): UTF8String;
function U8Symb (const StrU8Sy: UTF8String; Index: Integer): UTF8String;

implementation

function U8SymByte (const StrU8SB: UTF8String): Integer;
begin  // по первому байту полученной UTF8-строки определяет байтовую длину её первого UTF8-символа
  case Byte (StrU8SB[1]) of
    0..127: Result:= 1;
  192..223: Result:= 2;
  224..239: Result:= 3;
  240..247: Result:= 4;
  else      Result:= 0;  // либо не UTF8, либо какая-то байтовая ошибка - первый байт StrU8SB не является первым байтом UTF8-символа
  end;
end;

{function U8Code (const StrU8Cd: UTF8String): Integer;
var
  i: Integer;
begin
  Result:= 0;
  for i:=  1 to U8SymByte (StrU8Cd)
  do  Result:= Result + (Byte (StrU8Cd[i]) shl (8*(U8SymByte (StrU8Cd) - i)));
end;}

function U8Length (const StrU8L: UTF8String): Integer; // считает длину UTF8-строки в символах(!)
var
  i: Integer;  // счётчик байтов(!) в UTF8-строке
begin
  Result:= 0;      // начальную вычисляемую символьную длину устанавливаем в 0
  i:= 1;           // инициализируем байтовый счётчик
  while i <= Length (StrU8L)             // пока байтовый счётчик в пределах байтовой длины UTF8-строки
  do    begin
        Inc (Result);                    // находим очередной UTF8-символ и считаем его, затем
        if   U8SymByte (StrU8L[i]) = 0
        then Exit // СДЕЛАТЬ исключение?
        else Inc (i, U8SymByte (StrU8L[i]));  // "прыгаем" к первому байту следующего UTF8-символа
        end;
end;

function U8Pos (const SubU8P: UTF8String; const StrU8P: UTF8String): Integer; // позиция подстроки в строке в символах(!)
var
  i: Integer;  // счётчик байтов(!) в UTF8-строке
begin
  Result:= 1;
  i:= 1;
  while i <= Length (StrU8P)   // ищем в пределах байтовой длины UTF8-строки
  do    if   SubU8P = Copy (StrU8P, i, Length (SubU8P))  // если заданная подстрока равна выделенной из строки в очередной позиции
        then Exit                                        // то текущий результат и есть искомая позиция, выходим
        else begin                            // в противном случае
             Inc (i, U8SymByte (StrU8P[i]));  // переходим к первому байту следующего UTF8-символа
             Inc (Result);                    // увеличиваем индекс позиции
             end;
  Result:= 0;  // если до сих пор не вышли, значит подстроки в строке нет
end;

function U8Copy (const StrU8Cp: UTF8String; Index, Count: Integer): UTF8String;
var
  UCn, BIn, i: Integer;
begin
  Result:= '';
  if   ((StrU8Cp = '') or (Index < 1) or (Index > U8Length (StrU8Cp)) or (Count < 1))
  then Exit;
  UCn:= 1;
  BIn:= 1;
  while UCn <= U8Length (StrU8cp)
  do    begin
        if   (UCn >= Index) and (UCn <= (Index + Count - 1))
        then for i:= BIn to (BIn + U8SymByte (StrU8Cp [BIn]) - 1)
             do  Result:= Result + StrU8Cp [i];
        Inc (UCn);
        Inc (BIn, U8SymByte (StrU8Cp [BIn]));
        end;
end;

function U8Symb (const StrU8Sy: UTF8String; Index: Integer): UTF8String;
var
  UCn, BIn, i, U8Len: Integer;
begin
  Result:= ''; U8Len:= U8Length (StrU8Sy);
  if ((Index < 1) or (Index > U8Len)) then Exit;
  UCn:= 1; BIn:= 1;
  while UCn <= U8Len
  do    begin
        if   UCn = Index
        then for i:= BIn to (BIn + U8SymByte (StrU8Sy [BIn]) - 1)
             do  Result:= Result + StrU8Sy [i];
        Inc (UCn);
        Inc (BIn, U8SymByte (StrU8Sy [BIn]));
        end;
end;

end.


Честно говоря, сколько ни смотрел, ничего не "нарыл". Может чего-то слишком очевидного не вижу? Если найдёте ошибку, ткните носом. Но если не сами модули, тогда что? Компилятор? По идее, не должно быть. А тогда я вообще не понимаю, что. До двух ночи колупался, только мозг "сломал".

Odyssey писал(а):Ещё попробуйте Запуск - Собрать всё (или как-то так, в англ. локализации Run - Build All)

Я вообще пишу в текстовом редакторе и компилирую в командной строке (система Linux, если что); переход на Lazarus в моём случае что-то даст? В репозитории, насколько я помню, он есть.
СерП
новенький
 
Сообщения: 13
Зарегистрирован: 04.12.2010 01:20:10

Re: Казалось бы, близнецы...

Сообщение Odyssey » 04.12.2010 18:22:41

СерП писал(а):Я вообще пишу в текстовом редакторе и компилирую в командной строке (система Linux, если что);
Тогда можно попробовать:
* компилировать с опцией "-B";
* удалить из папки проекта все файлы ppu/o/a и попробовать ещё раз.

Существенная разница в модулях, по сути, только в расположении секции uses: в u8base она только в implementation. Если ничего из вышеперечисленного не поможет, можно от безысходности попробовать переместить uses в interface и проверить.

СерП писал(а):переход на Lazarus в моём случае что-то даст?
* В плане устранения проблемы -- не знаю. Проблема может исчезнуть из-за другого набора опций, передаваемых Lazarus'ом FPC (по сравнению с опциями, которые вы сейчас передаёте), а может и остаться. Но, имхо, убирать такую проблему сменой инструмента -- это не дело, лучше понять что именно её вызывает.
* А в целом -- это уже как вам удобнее. Переход даст функции автоматического дополнения идентификаторов, фрагментов кода, шаблоны кода, рефакторинг -- в общем всё, что обычно бывает в IDE. Но могут обнаружиться и баги, а ещё от автоматических функций довольно трудно отвыкать.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Казалось бы, близнецы...

Сообщение Sergei I. Gorelkin » 04.12.2010 19:23:13

После директивы {$mode objfpc} по-хорошему нужно добавить {$h+}. Без нее все строковые выражения будут вычисляться как shortstring, что даст много неприятных сюрпризов. Возможно даже, что данная проблема - один из таких сюрпризов.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Казалось бы, близнецы...

Сообщение СерП » 04.12.2010 19:38:40

Тогда можно попробовать:
* компилировать с опцией "-B";
* удалить из папки проекта все файлы ppu/o/a и попробовать ещё раз.

Существенная разница в модулях, по сути, только в расположении секции uses: в u8base она только в implementation. Если ничего из вышеперечисленного не поможет, можно от безысходности попробовать переместить uses в interface и проверить.

Я раньше без опций компилировал (пишу простые программы для самообучения), всё было нормально. "-B" попробывал, не помогло. Перенёс секцию uses - то же самое. Но вот что меня совсем в ступор ввело.
Создал новую папку, перенёс туда только файлы pas (сама программа и необходимые модули). u8base вообще не компилируется. Для остальных модулей ppu и o файлы появляются, для него нет. Это тем более удивительно, что в u8b нет одной процедуры, которая нужна программе, она есть только в u8base. Ладно, изменил название на u8bas - проблема исчезла. Модуль компилируется, ошибки не возникают. Дело в названии?!
* В плане устранения проблемы -- не знаю. Проблема может исчезнуть из-за другого набора опций, передаваемых Lazarus'ом FPC (по сравнению с опциями, которые вы сейчас передаёте), а может и остаться. Но, имхо, убирать такую проблему сменой инструмента -- это не дело, лучше понять что именно её вызывает.
* А в целом -- это уже как вам удобнее. Переход даст функции автоматического дополнения идентификаторов, фрагментов кода, шаблоны кода, рефакторинг -- в общем всё, что обычно бывает в IDE. Но могут обнаружиться и баги, а ещё от автоматических функций довольно трудно отвыкать.

Тогда поставлю, когда дойду до приложений с GUI.

Добавлено спустя 1 минуту 12 секунд:
Sergei I. Gorelkin писал(а):После директивы {$mode objfpc} по-хорошему нужно добавить {$h+}. Без нее все строковые выражения будут вычисляться как shortstring, что даст много неприятных сюрпризов. Возможно даже, что данная проблема - один из таких сюрпризов.

Попробывал, не помогло. Но на будущее запомню.
СерП
новенький
 
Сообщения: 13
Зарегистрирован: 04.12.2010 01:20:10

Re: Казалось бы, близнецы...

Сообщение GAMER » 04.12.2010 19:46:39

Показать начало своей программы можете? Где подключаете модули.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Казалось бы, близнецы...

Сообщение Vadim » 04.12.2010 19:51:12

СерП
У меня функция нормально видится компилятором. Однако функции будут работать только тогда, когда будет и в модуле и в программе стоять {$h+}, как сказал Сергей.
Код для проверки:
Код: Выделить всё
{$MODE objfpc}{$H+}
Uses cwstring, u8base;
Const
  st: utf8string = 'Это такая строка';

Begin
  WriteLn(st);
  WriteLn(U8Symb(st, 6));
  ReadLn;
End.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Казалось бы, близнецы...

Сообщение Odyssey » 04.12.2010 20:23:54

Подтверждаю, вышеприведённый модуль с программой Vadim'а у меня тоже компилируется нормально. Пример прилагаю. Остаётся только искать отличия.

Т.к. у меня и у Vadim'а u8base компилируется, скорее всего проблема не в имени.

Ещё остаётся неизвестной кодировка файлов и версия FPC. И есть предложение выложить проблемные файлы, чтобы можно было протестить их компиляцию вне вашего компа.

P.S. И ещё было бы неплохо узнать полный путь к компилируемым файлам.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Казалось бы, близнецы...

Сообщение СерП » 04.12.2010 20:28:55

GAMER писал(а):Показать начало своей программы можете? Где подключаете модули.

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

{$MODE objfpc}
{$H+}

uses u8base, u8subs, u8subsen, u8subsi, sysutils;

В программе {$H+} добавил, как советуют, но не помогло.
Vadim писал(а):СерП
У меня функция нормально видится компилятором. Однако функции будут работать только тогда, когда будет и в модуле и в программе стоять {$h+}, как сказал Сергей.
Код для проверки:
Код: Выделить всё
{$MODE objfpc}{$H+}
Uses cwstring, u8base;
Const
  st: utf8string = 'Это такая строка';

Begin
  WriteLn(st);
  WriteLn(U8Symb(st, 6));
  ReadLn;
End.

А у меня ваша программа не компилируется с той же ошибкой. Т.е., дело в моей системе?

Добавлено спустя 7 минут 1 секунду:
Odyssey писал(а):Подтверждаю, вышеприведённый модуль с программой Vadim'а у меня тоже компилируется нормально. Пример прилагаю. Остаётся только искать отличия.

Т.к. у меня и у Vadim'а u8base компилируется, скорее всего проблема не в имени.

Ещё остаётся неизвестной кодировка файлов и версия FPC. И есть предложение выложить проблемные файлы, чтобы можно было протестить их компиляцию вне вашего компа.

P.S. И ещё было бы неплохо узнать полный путь к компилируемым файлам.


Кодировка UTF-8. Версия FPC
Код: Выделить всё
Free Pascal Compiler version 2.4.0 [2010/05/19] for x86_64

Полный путь /home/sergey/Progs/pc/
Файлы и результаты проверки вашего примера выложу позже, сейчас вынужден уйти.
СерП
новенький
 
Сообщения: 13
Зарегистрирован: 04.12.2010 01:20:10

Re: Казалось бы, близнецы...

Сообщение Odyssey » 04.12.2010 20:48:00

Кодировка нормальная (надеюсь ни один текстовый редактор под Linux не страдает UTF-8 c BOM по умолчанию), компилятор нормальный (правда уже есть 2.4.2, но я тоже проверял на 2.4.0), путь нормальный. Единственное, что у нас различается, это x86_64 (у меня "for i386").

Поэтому предложения только такие:
- попробовать обновить компилятор;
- попробовать поставить компилятор для i386, если это возможно на 64-битной Linux (тут я пас).
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Казалось бы, близнецы...

Сообщение Sergei I. Gorelkin » 04.12.2010 23:57:29

Можно еще предположить, что где-то на машине есть еще один модуль u8base, который находится раньше, чем тот, который нужно. Это можно проверить путем компиляции с ключом -va и поиска упоминаний проблемного модуля в полученной простыне.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Казалось бы, близнецы...

Сообщение СерП » 05.12.2010 01:47:06

Sergei I. Gorelkin писал(а):Можно еще предположить, что где-то на машине есть еще один модуль u8base, который находится раньше, чем тот, который нужно. Это можно проверить путем компиляции с ключом -va и поиска упоминаний проблемного модуля в полученной простыне.

:lol: :oops: :lol: :oops: :lol:
Старая версия u8base, без U8Symb, лежала в домашней папке. Я только что обратил внимание (надо было сразу дать полный вывод компилятора):
Код: Выделить всё
Free Pascal Compiler version 2.4.0 [2010/05/19] for x86_64
Copyright (c) 1993-2009 by Florian Klaempfl
Target OS: Linux for x86-64
Compiling /home/sergey/Progs/pc/picalc.pas
Compiling u8base.pas
Compiling /home/sergey/Progs/pc/picalclib.pas
picalc.pas(21,28) Error: Identifier not found "U8Symb"
picalc.pas(26,26) Error: Identifier not found "U8Symb"
picalc.pas(156) Fatal: There were 2 errors compiling module, stopping
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode (normal if you did not specify a source file to be compiled)

Compiling u8base.pas без пути.
Но я был твёрдо убеждён (хотя не знаю, почему), что если путь к пользовательскому модулю не прописан в uses (кстати, совсем забыл об этом), то компилятор начинает искать его с папки, в которой находится программа. А посмотрел "простыню":
Код: Выделить всё
[0.036] Compiling /home/sergey/Progs/pc/picalc.pas
[0.037] Searching file /home/sergey/Progs/pc/picalc.pas... found
2 142/768 Kb Used
[0.037] Handling switch "$MODE"
[0.037] Macro defined: FPC_OBJFPC
[0.037] Registering new unit SYSTEM
[0.037] Load from PICALC (implementation) unit SYSTEM
[0.037] Loading unit SYSTEM
[0.037] Unitsearch: system.ppu
[0.040] Searching file system.ppu... not found
[0.041] Searching file SYSTEM.PPU... not found
[0.041] Unitsearch: /home/sergey/Progs/pc/system.ppu
[0.041] Searching file /home/sergey/Progs/pc/system.ppu... not found
[0.041] Searching file /home/sergey/Progs/pc/SYSTEM.PPU... not found
[0.041] Unitsearch: system.pp
[0.041] Searching file system.pp... not found
[0.041] Searching file SYSTEM.PP... not found
[0.041] Unitsearch: system.pas
[0.041] Searching file system.pas... not found
[0.041] Searching file SYSTEM.PAS... not found
[0.041] Unitsearch: /home/sergey/Progs/pc/system.pp
[0.041] Searching file /home/sergey/Progs/pc/system.pp... not found
[0.041] Searching file /home/sergey/Progs/pc/SYSTEM.PP... not found
[0.041] Unitsearch: /home/sergey/Progs/pc/system.pas
[0.041] Searching file /home/sergey/Progs/pc/system.pas... not found
[0.041] Searching file /home/sergey/Progs/pc/SYSTEM.PAS... not found
[0.041] Unitsearch: ./Progs/pc/system.ppu
[0.042] Searching file ./Progs/pc/system.ppu... not found
[0.042] Searching file ./Progs/pc/SYSTEM.PPU... not found
[0.042] Unitsearch: ./Progs/pc/system.pp
[0.042] Searching file ./Progs/pc/system.pp... not found
[0.042] Searching file ./Progs/pc/SYSTEM.PP... not found
[0.042] Unitsearch: ./Progs/pc/system.pas
[0.042] Searching file ./Progs/pc/system.pas... not found
[0.042] Searching file ./Progs/pc/SYSTEM.PAS... not found
[0.042] Unitsearch: /usr/lib64/fpc/2.4.0/units/x86_64-linux/rtl/system.ppu
[0.047] Searching file /usr/lib64/fpc/2.4.0/units/x86_64-linux/rtl/system.ppu... found

компилятор не только мои модули, но даже system.ppu пытается сначала найти в домашнем каталоге, потом переходит к папке с программой, а находит (вот сюрприз-то) в /usr/lib64/fpc/2.4.0/units/x86_64-linux/rtl/
Почему так?

Добавлено спустя 10 часов 48 минут 41 секунду:
По крайней мере с последовательностью поиска разобрался. Компилятор начинает с текущей папки, потом переходит к папке с исходником программы, далее к папке с собственным бинарником, и в последнюю очередь ищет в папках, указанных в unit search path. В терминале Linux, если не поменять с помощью cd, текущая папка и есть домашняя папка пользователя.

В общем, понял, что язык языком, а как компилятор работает, тоже знать надо.

P.S. Спасибо всем, кто откликнулся.
СерП
новенький
 
Сообщения: 13
Зарегистрирован: 04.12.2010 01:20:10


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

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

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

Рейтинг@Mail.ru