powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / AV Указатель на массив байт
4 сообщений из 29, страница 2 из 2
AV Указатель на массив байт
    #39459930
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
type
  // For System.pas internal use only.
  // Note, this type is duplicated in getmem.inc for diagnostic purposes. Keep in sync.
  PStrRec = ^StrRec;

  StrRec = packed record
{$IF defined(CPU64BITS)}
    _Padding: Integer; // Make 16 byte align for payload..
{$ENDIF}
    CodePage: Word;
    elemSize: Word;
    refCnt: Integer;
    Length: Integer;
  end;

function _NewUnicodeString(CharLength: Integer): Pointer;
var
  P: PStrRec;
begin
  Result := nil;
  if CharLength > 0 then
  begin
    // Allocate a memory with record and extra wide-null terminator.
    if CharLength >= (MaxInt - SizeOf(StrRec)) div SizeOf(WideChar) then
    begin
      asm
        MOV     AL,reIntOverflow
        JMP     Error
      end;
    end;
    GetMem(P, SizeOf(StrRec) + (CharLength + 1) * SizeOf(WideChar));
    Result := Pointer(PByte(P) + SizeOf(StrRec));
    P.Length := CharLength;
    P.refCnt := 1;
    P.elemSize := SizeOf(WideChar);
    P.CodePage := Word(DefaultUnicodeCodePage);
    PWideChar(Result)[CharLength] := #0;
  end;
end;

function _UStrClr(var S): Pointer;
var
  P: PStrRec;
begin
  if Pointer(S) <> nil then
  begin
    P := Pointer(PByte(S) - SizeOf(StrRec));
    Pointer(S) := nil;
    if P.refCnt > 0 then
    begin
      if AtomicDecrement(P.refCnt) = 0 then
        FreeMem(P);
    end;
  end;
  Result := @S;
end;

procedure _UStrAsg(var Dest: UnicodeString; const Source: UnicodeString);
var
  S, D: Pointer;
  P: PStrRec;
  Len: Integer;
begin
  S := Pointer(Source);
  if S <> nil then
  begin
    if PInteger(PByte(Source) - 8)^ < 0 then // make copy of string literal
    begin
      Len := PInteger(PByte(Source) - 4)^;
      S := _NewUnicodeString(Len);
      MyMove(Pointer(Source)^, S^, Len * SizeOf(WideChar));
    end
    else
    begin
      P := PStrRec(PByte(S) - SizeOf(StrRec));
      AtomicIncrement(P.refCnt);
    end;
  end;
  D := Pointer(Dest);
  Pointer(Dest) := S;
  _UStrClr(D);
end;

function _NewAnsiString(CharLength: Integer; CodePage: Word): Pointer;
var
  P: PStrRec;
begin
  Result := nil;
  if CharLength > 0 then
  begin
    if CharLength >= MaxInt - SizeOf(StrRec) then
      asm
        MOV     AL,reIntOverflow
        JMP     Error
      end;
    GetMem(P, CharLength + SizeOf(StrRec) + 1 + ((CharLength + 1) and 1));
    Result := Pointer(PByte(P) + SizeOf(StrRec));
    P.Length := CharLength;
    P.refCnt := 1;
    if CodePage = 0 then
      CodePage := Word(DefaultSystemCodePage);
    P.CodePage := CodePage;
    P.elemSize := 1;
    PWideChar(Result)[CharLength div 2] := #0; // length guaranteed >= 2
  end;
end;

function _LStrClr(var S): Pointer;
var
  P: PStrRec;
begin
  if Pointer(S) <> nil then
  begin
    P := Pointer(PByte(S) - SizeOf(StrRec));
    Pointer(S) := nil;
    if P.refCnt > 0 then
    begin
      if AtomicDecrement(P.refCnt) = 0 then
        FreeMem(P);
    end;
  end;
  Result := @S;
end;

procedure _LStrAsg(var Dest: AnsiString; const Source: AnsiString);
var
  S, D: Pointer;
  P: PStrRec;
  Len: Integer;
begin
  S := Pointer(Source);
  if S <> nil then
  begin
    if PInteger(PByte(S) - 8)^ < 0 then // make copy of string literal
    begin
      Len := PInteger(PByte(S) - 4)^;
      S := _NewAnsiString(Len, PWord(PByte(S) - 12)^);
      Move(PAnsiChar(Source)^, S^, Len);
    end
    else
    begin
      P := PStrRec(PByte(S) - SizeOf(StrRec));
      AtomicIncrement(P.refCnt);
    end;
  end;
  D := Pointer(Dest);
  Pointer(Dest) := S;
  _LStrClr(D);
end;

constructor TSPHPValue.Create(_Type: TEngineVarTypes; var Value);
var
  S, D: Pointer;
  Len: Integer;
begin
  FData._Type := _Type;
  case _Type of
    SUInt8:
      FData.TByte := UInt8(Value);
    SUInt16:
      FData.TWord := UInt16(Value);
    SUInt32:
      FData.TCardinal := UInt32(Value);
    SUInt64:
      FData.TUInt64 := UInt64(Value);
    SInt8:
      FData.TShortInt := Int8(Value);
    SInt16:
      FData.TSmallInt := Int16(Value);
    SInt32:
      FData.TInteger := Int32(Value);
    SInt64:
      FData.TInt64 := Int64(Value);
    SSingle:
      FData.TSingle := Single(Value);
    SDouble:
      FData.TDouble := Double(Value);
    SExtended:
      FData.TExtended := Extended(Value);
    SCurrency:
      FData.TCurrency := Currency(Value);
    SPointer:
      FData.TPointer := Pointer(Value);
    SString:
      begin
        SetLength(string(FData.TPointer), SizeOf(string));
        _UStrAsg(UnicodeString(FData.TPointer), UnicodeString(Value));

      end;
    SWideChar:
      begin
        SetLength(UnicodeString(FData.TPointer), SizeOf(WideString));
        _UStrAsg(UnicodeString(FData.TPointer), UnicodeString(Value));

        pre(UnicodeString(FData.TPointer));
      end;
    SAnsiChar:
      begin
        SetLength(AnsiString(FData.TPointer), SizeOf(AnsiString));
        _LStrAsg(PAnsiString(FData.TPointer)^, PAnsiChar(Value));
      end;
  end;
end;
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39460466
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очередной скриптовый движок штоле?

открой исходники того же pax'а, например. Там все, вообще все сделано в виде оберток\надстроек над стандартными типами и операциями дельфей.
Но чтобы понимать как и почему там все устроено - действительно, стоит почитать теорию сначала. Так-то пихать строку в виде указателя и удивляться ошибке - это показательно, да.
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39460691
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик, молодец, но меня интересует зачем и что это:
Код: pascal
1.
2.
3.
SetLength(string(FData.TPointer), SizeOf(string));             // уже проверил, что будет, если FData.TPointer не будет равен nil ?
SetLength(UnicodeString(FData.TPointer), SizeOf(WideString));
SetLength(AnsiString(FData.TPointer), SizeOf(AnsiString));

и
Код: pascal
1.
_LStrAsg(PAnsiString(FData.TPointer)^, PAnsiChar(Value));

чёт не похож на аналог из SWideChar ?


А ещё есть такая штука
Код: plaintext
ReportMemoryLeaksOnShutdown := True;
которою можно воткнуть сразе после begin в dpr



P.S.
GunSmoker-у в задачки:
Код: pascal
1.
2.
3.
        { FData.TPointer := nil; }
        SetLength(AnsiString(FData.TPointer), SizeOf(AnsiString));
        _LStrAsg(PAnsiString(FData.TPointer)^, PAnsiChar(Value));

почему ж это 'работает' ?
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39460710
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM, в предположении, что это часть объекта - работать-то оно будет корректно. Только смысла не имеет.

Тут такая мешанина в голове, что лучше никому это не показывать.
...
Рейтинг: 0 / 0
4 сообщений из 29, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / AV Указатель на массив байт
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]