en ru

Передача строковых параметров

При реализации AIKernel столкнулся с проблемой передачи строк в виде параметров между модулями. Есть несколько вариантов: char* (PChar), string (класс Си++), string (массив символов с указанием длины). Но строки в разных компиляторах реализованы по разному. Кроме PChar, но при использование PChar не очень удобное и могут возникать проблемы, если в строке присутствуют нулевые символы.

...

Я решил пока реализовать передачу строк между модулей с помощью указателя на структуру AString_Type. При этом внутреннее содержание пока не раскрываю, а вместо этого будут реализованы примерно такие функции (Pascal):
Код:

type
  AString = ^AString_Type; // Указатель. Можно записать и так: AString = Pointer;

function A_String_New(S: AString): AString; stdcall;
function A_String_NewC(S: PChar; Len: AInteger): AString; stdcall; // Ansi
function A_String_NewU(S: PChar; Size: ASize): AString; stdcall; // UTF-8

А работу со строками реализовать внутри одного из основных модулей в виде примерно таких функций:
Код:

function A_System_String_Length(S: AString): AInteger; stdcall;
function A_System_String_Compare(Str1, Str2: AString): AInteger; stdcall;
function A_System_String_CompareA(Str1, Str2: AString; IgnoreCase: ABoolean): AInteger; stdcall;
function A_System_String_Concat(Str1, Str2: AString): AString; stdcall;
function A_System_String_ConcatA(Str1, Str2, Str3: AString): AString; stdcall;
function A_System_String_IndexOfCh(S: AString; Ch: AChar): AInteger; stdcall;
function A_System_String_IndexOfStr(S, Str: AString): AInteger; stdcall;
function A_System_String_LastIndexOfCh(S: AString; Ch: AChar): AInteger; stdcall;
function A_System_String_LastIndexOfStr(S, Str: AString): AInteger; stdcall;

Реализовать для начала основные. А за тем, по мере необходимости добавлять еще функций.
А для использования строки преобразовывать примерно так:
Код:

function String_ToWideString(S: AString): WideString; stdcall;

Обсуждение: project-ai.org/forum/viewtopic.php?t=6












© AiKernel 2010-2013
02.06.2011 - 28.12.2012