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 в моём случае что-то даст? В репозитории, насколько я помню, он есть.