LINUX.ORG.RU

[Ужос] PChar(PChar(ptr^)^)^ := PChar(b^.ptr)^


0

0

Господа, есть ли здесь знающие паскаль и могущие объяснить смысл сей записи:
PChar(PChar(ptr^)^)^ := PChar(b^.ptr)^
здесь ptr и b.ptr - типа Pointer
А также как этот ужас можно привести к виду, который бы скомпилировался на FreePascal: на delphi работает, а fpc говорит, что разные размеры при приведении типов.

anonymous

Убей аффтара.

p.S. Ниасилил.

redgremlin ★★★★★
()

>> PChar(PChar(ptr^)^)^ := PChar(b^.ptr)^

Если я правильно вспоминаю, то ptr^ не имеет смысла. Это примерно то же самое, что в C:

void *ptr;
*ptr = 123; /* OH SHI-! */

Deleted
()

Эквивалентная запись на С:

* (char*) * (char*) * ptr = * (char*) b->ptr;

если я, конечно, не забыл Delphi.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

>> А как вы определили, что у ptr-а тип void* ?

Из первопоста:

>> здесь ptr и b.ptr - типа Pointer

Pointer - это просто указатель на какие-то нетипизированные данные, аналогично void*.

Deleted
()

смысл этого кода -- присвоить указатели, забив на неприводимые типы.

В Си вместо PChar был бы void *. Можно сделать аналогичный финт ушами в Си через union'ы с полями разных типов: присвоить через одно поле, использовать через другое. Поля накладываются на одну область памяти, поэтому получается неявное приведение типов.

чтобы распарсить, раскручивай назад отдельно левую и правую часть: y^ {паскаль, y - это указатель} = (*y) /*си*/

PChar (x)^ {pas} = f(x) = ( * ( (char*) x) ) /*ñè*/ PChar(PChar (ptr^)^ )^ =f(f(ptr^)) = (* ( (char*) ( (* ( (char*) (*ptr) )) ) ) ) PChar( b^.ptr )^ = f( b^.ptr) = (* ( (char*) (b->ptr) ))

буквальный аналог в Си:

X *ptr; X x; * ( (char*) ( (void *) (ptr) ) ) = 'c' ; /* был указатель типа Х, стал указатель на char, приведённый через void, присвоили значение как union, затёрли первый байт этого типа */

или сравни с * ( (char*) ( (void*) &x ) ) = 'Y' ; /* аналогично union { X xv; char cv;} ux; ux.cv = 'Y'; some_func ( ux.xv ); ... */

От скобок рябит в глазах, через union {..} T; T* p->cv, p-> xv читается проще.

anonymous
()
Ответ на: комментарий от anonymous

а вообще это быдлокод -- забить на неприводимость типов указателей и запихать дуром, как в тот чемодан, что не закрывается

anonymous
()
Ответ на: комментарий от anonymous

>В Си вместо PChar был бы void *.

вместо Pointer был бы (void *), конечно. Вместо PChar(x)^:='c' был бы (* ( (char*) x )) = 'c', конечно. В том смысле, как указатели непонятного типа приводятся к (char*)

anonymous
()
Ответ на: комментарий от anonymous

PChar (x)^ {pas} = f(x) = ( * ( (char*) x) ) /*си*/
PChar(PChar (ptr^)^ )^ =f(f(ptr^)) = (* ( (char*) ( (* ( (char*) (*ptr)  )) ) ) )
PChar( b^.ptr )^ = f( b^.ptr) = (* ( (char*) (b->ptr) ))


форматирование, блин...

anonymous
()
Ответ на: комментарий от anonymous

потому что указатели разных типов. ptr - указатель неопределённого типа, поэтому ptr^ не определён. Присвоить указатели разных (или неопределённых) типов нельзя, поэтому указатель на void приводится к указателю на char. То есть, ptr^ -- не определён, а PChar(ptr^)^ -- определён, с типами всё корректно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.