powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / AV Указатель на массив байт
25 сообщений из 29, страница 1 из 2
AV Указатель на массив байт
    #39459202
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример типов.

Код: pascal
1.
str: PString; 



Код: pascal
1.
2.
3.
4.
5.
type
 Test = TArray<Byte>;
 PTest = ^Test;
var
str: PTest; 



При попытке задать значения - увеличить (SetLength) вылетает ошибка
Код: pascal
1.
2.
3.
4.
  str^ := 'Test';

...
   SetLength(str^, 5);



В чём зарыт крот ? ... Вроде, по логике мы должны получить указатель на массив байт, и выделить там память
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459210
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикВ чём зарыт крот ?
В том, что эти типы - вовсе не то, что ты о них думаешь. Прочитай в документации о их
истинной сущности.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459211
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВ том, что эти типы - вовсе не то, что ты о них думаешь. Прочитай в документации о их
истинной сущности.



В документации на F1 написано. По этому у меня нету повода думать, что это не тоже самое что и a:string;

Is a pointer to a String.
PString is a pointer to a String

Можно на вашу документацию ??

Кстати, это работает как и ожидается

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
  str: Pointer;
....

        SetLength(string(str), 5);
        string(str)[1] := '1';
        string(str)[2] := '2';
        string(str)[3] := '3';
        string(str)[4] := '4';
        string(str)[5] := '5';
        pre(string(str));
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459212
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, вот ещё странное поведение..

Вот так, он выделит память, и запишет всё 12345 в переменную str типа PString как мы можем видеть в отладчике

Код: pascal
1.
2.
3.
4.
5.
6.
7.
        SetLength(string(str^), 5);
        str^[1] := '1';
        str^[2] := '2';
        str^[3] := '3';
        str^[4] := '4';
        str^[5] := '5';
        pre(string(str)); // последняя строка



Но если мы изменим последнюю строку на
Код: pascal
1.
        pre(string(str^));



То при выделение памяти - SetLength он нас кинет на

CMP [EAX-skew].StrRec.refCnt,1 // !!! MT safety

и снова AV
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459225
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так работает адекватно

Код: pascal
1.
2.
3.
4.
5.
   
var
 str : PString;

SetLength(string(str), 5); 
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459231
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик, по логике мы должны получить указатель на массив байт,и где твой 'на' ?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure Test;
var
 pS : PString;
begin
 New(pS);
 Initialize(pS^);

 pS^ := 'будка сгорела, адрес остался?';

 Finalize(pS^);
 Dispose(pS);
end;
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459313
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик, так чего добиться-то хочешь? Из твоего потока сознания это не очевидно, всё в кучу смешал
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459377
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автортак чего добиться-то хочешь?
Наверное, чтобы AV возникал гораздо чаще. :)
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459456
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикВ документации на F1 написано. По этому у меня нету повода думать, что это не тоже самое
что и a:string;

Is a pointer to a String.
PString is a pointer to a String

Да, но знаешь ли ты что такое String? А это (сурпрайз!) таки тоже поинтер.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459618
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM,

Либо New/Dispose, либо GetMem+Initialize/Finalize+FreeMem
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459689
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я в общем делаю универсальный бокс контейнер, и сразу же нашёл решения на свой вопрос.. Просто стало интересно чего это он мне ошибку то выдаёт..

А остановился на на функции _UStrAsg которая умеет выделять память, а так же увеличивать счётчик на переменную и помещать новый указатель на существующую.

Вот это работает адекватно

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    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));
      end;
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459693
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикЯ в общем делаю универсальный бокс контейнер

Variant уже давно сделали - вполне универсальный
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459701
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НяшикВот это работает адекватно
Нет, не работает. )))
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459716
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiНяшикЯ в общем делаю универсальный бокс контейнер

Variant уже давно сделали - вполне универсальный

Медленный, непонятный. И нафиг не нужный. Мой поддерживает все типы стандартные

Код: pascal
1.
2.
3.
  TEngineVarTypes = (SUInt8, SUInt16, SUInt32, SUInt64, SInt8, SInt16, SInt32,
    SInt64, SSingle, SDouble, SExtended, SCurrency, SPointer, SString,
    SWideChar, SAnsiChar);





jmp_originalНяшикВот это работает адекватно
Нет, не работает. )))

Работает, прекрасно отдаёт текст если сделать

Код: pascal
1.
             pre(UnicodeString(FData.TPointer));



Уже загружал туда файлик длинной 1 413 720 символов, используя как буффер. И всё отработало отлично.
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459723
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459727
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикИ всё отработало отлично

Если что-то работает - это ещё не значит, что это работает правильно .

По написанному тобой коду видно, что ты не понимаешь, что ты делаешь, а программируешь методом тыка. Ничего путного на выходе получиться не может, даже если тебе кажется иначе. Подтяни немного теорию.
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459733
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmokerНяшикИ всё отработало отлично

Если что-то работает - это ещё не значит, что это работает правильно .

По написанному тобой коду видно, что ты не понимаешь, что ты делаешь, а программируешь методом тыка. Ничего путного на выходе получиться не может, даже если тебе кажется иначе. Подтяни немного теорию.

Ну от счастья и методом тыка, только я заранее изучаю исходники самого дельфи, и прекрасно вижу что и там это всё используется

К примеру из функции _CopyRecord

Код: pascal
1.
2.
3.
4.
5.
        tkUString:
          begin
            _UStrAsg(PUnicodeString(DestOff)^, PUnicodeString(SrcOff)^);
            Inc(Offset, SizeOf(Pointer));
          end;



Так как я не передаю указатели, мне не нужно делать смещения ^ ... По этому я сразу и пишу UnicodeString
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459752
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик> Медленный, непонятный. И нафиг не нужный. Мой поддерживает все типы стандартные
это что, SOFT FOR YOU трусы сменил шо ле?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459762
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшикschiпропущено...


Variant уже давно сделали - вполне универсальный

Медленный, непонятный. И нафиг не нужный.

Умного учить - только портить.

Let it float by itself :)
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459769
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МимопроходящийНяшик> Медленный, непонятный. И нафиг не нужный. Мой поддерживает все типы стандартные
это что, SOFT FOR YOU трусы сменил шо ле?


Нет.

Мне от моего контейнера нужны чётко поставленные задачи, а именно - получение конкретного значения с возможностью преобразования автоматически исходя из типа. А так - же, конвертирование текущего значения в N тип.

Так же, нужно учитывать расход памяти на контейнер, и учитывать то - что он будет вызывать не один раз за всю жизнь программы (А это значит, он должен максимально быстро уметь орудовать текущими значениями во всех смыслах.)

Следовательно, если будут утечки памяти, они будут обнаружены сразу - же.

На данный момент я добился того, что упакованный контейнер весит 11 байт по SizeOf когда тот же zval контейнер от PHP держит 16 байт

Мой контейнер более многофункционален и предоставляет лёгкий интерфейс что позволит вызывать методы на других языках - спокойно без всяких муссоров и так далее..

Что принесёт разработку дополнительных расширений. без каких либо затрад на изучения мокросов и.т.д.
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459773
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик> Нет.таки да.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459783
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МимопроходящийНяшик> Нет.таки да.


Ну что можно сказать о людях, которые судят по почерку в интернете ....


Пусть админята ip'шки сверят на сякий пожарный... А то, ай - я по почерку похож...
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459870
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшикя заранее изучаю исходники самого дельфи, и прекрасно вижу что и там это всё используется

Упражнение: обоснуй, что делает вот эта строчка:

Код: pascal
1.
SetLength(string(FData.TPointer), SizeOf(string));



и чем:

Код: pascal
1.
_UStrAsg(UnicodeString(FData.TPointer), UnicodeString(Value));



отличается от:

Код: pascal
1.
String(FData.TPointer) := Value;


в предположении, что Value у тебя - строка, иначе - от:
Код: pascal
1.
String(FData.TPointer) := String(Value);



Ну и чтобы два раза не вставать: почему некоторые процедуры в System начинаются на '_'.

А также, где выделяется память для str в этом коде:
Код: pascal
1.
str^ := 'Test';
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459890
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Bred eFeM,

Либо New/Dispose, либо GetMem+Initialize/Finalize+FreeMemЭто для ТС-а было (чтобы магия компилятора не скрывала суть происходящего), но ...
...
Рейтинг: 0 / 0
AV Указатель на массив байт
    #39459927
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker, смеёшься ???...


GunSmokerи чем:

Код: pascal
1.
_UStrAsg(UnicodeString(FData.TPointer), UnicodeString(Value));



отличается от:

Код: pascal
1.
String(FData.TPointer) := Value;





НяшикА остановился на на функции _UStrAsg которая умеет выделять память, а так же увеличивать счётчик на переменную и помещать новый указатель на существующую.







GunSmokerУпражнение: обоснуй, что делает вот эта строчка:

Код: pascal
1.
SetLength(string(FData.TPointer), SizeOf(string));




Что бы понять, что она делает - надо посмотреть реализацию _LStrAsg

Она берёт адрес
Код: pascal
1.
D := Pointer(Dest);



Если предварительно не выделить, код рухнет (Сам должен понимать)

В выделенную область пишется информацию структуры PStrRec

....

GunSmokerНу и чтобы два раза не вставать: почему некоторые процедуры в System начинаются на '_'.

А также, где выделяется память для str в этом коде:
Код: pascal
1.
str^ := 'Test';




Хз почему - но я вынес себе нужный функционал.

Выделение идёт опять же в функции UStrAsg Которая между прочим - смотрит, если существует переменная с текстом - копирует на неё ссылку - .. а если нет, выделяет память

Код: pascal
1.
2.
      Len := PInteger(PByte(S) - 4)^;
      S := _NewAnsiString(Len, PWord(PByte(S) - 12)^);
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / AV Указатель на массив байт
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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