Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / AV Указатель на массив байт / 25 сообщений из 29, страница 1 из 2
24.05.2017, 23:50:54
    #39459202
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
Пример типов.

Код: 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
25.05.2017, 00:02:41
    #39459210
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
НяшикВ чём зарыт крот ?
В том, что эти типы - вовсе не то, что ты о них думаешь. Прочитай в документации о их
истинной сущности.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.05.2017, 00:11:18
    #39459211
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
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
25.05.2017, 00:18:24
    #39459212
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
Кстати, вот ещё странное поведение..

Вот так, он выделит память, и запишет всё 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
25.05.2017, 01:28:44
    #39459225
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
Вот так работает адекватно

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

SetLength(string(str), 5); 
...
Рейтинг: 0 / 0
25.05.2017, 02:01:21
    #39459231
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
Няшик, по логике мы должны получить указатель на массив байт,и где твой 'на' ?
Код: 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
25.05.2017, 09:22:58
    #39459313
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
Няшик, так чего добиться-то хочешь? Из твоего потока сознания это не очевидно, всё в кучу смешал
...
Рейтинг: 0 / 0
25.05.2017, 10:16:43
    #39459377
Любезный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
автортак чего добиться-то хочешь?
Наверное, чтобы AV возникал гораздо чаще. :)
...
Рейтинг: 0 / 0
25.05.2017, 11:25:34
    #39459456
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
НяшикВ документации на 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
25.05.2017, 13:43:20
    #39459618
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
Bred eFeM,

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

А остановился на на функции _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
25.05.2017, 14:37:17
    #39459693
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
НяшикЯ в общем делаю универсальный бокс контейнер

Variant уже давно сделали - вполне универсальный
...
Рейтинг: 0 / 0
25.05.2017, 14:41:11
    #39459701
jmp_original
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
НяшикВот это работает адекватно
Нет, не работает. )))
...
Рейтинг: 0 / 0
25.05.2017, 14:50:43
    #39459716
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
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
25.05.2017, 14:54:14
    #39459723
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
...
Рейтинг: 0 / 0
25.05.2017, 14:57:18
    #39459727
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
НяшикИ всё отработало отлично

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

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

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

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

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

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

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



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


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

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

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

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


Нет.

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

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

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

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

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

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


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


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

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

Код: 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
25.05.2017, 17:44:31
    #39459890
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
_Vasilisk_Bred eFeM,

Либо New/Dispose, либо GetMem+Initialize/Finalize+FreeMemЭто для ТС-а было (чтобы магия компилятора не скрывала суть происходящего), но ...
...
Рейтинг: 0 / 0
25.05.2017, 18:43:09
    #39459927
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AV Указатель на массив байт
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / AV Указатель на массив байт / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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