powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / PHP Array VS Delphi Array
25 сообщений из 61, страница 2 из 3
PHP Array VS Delphi Array
    #39955915
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Массивы и TDictionary... Какая связь?

Словарь - это частный случай ассоциативного массива.

з.ы.

Не спорь с Няшиком. Чувак берет сишную библиотеку с реализацией ассоциативного массива и на серьёзных щщах говорит, что это PHP.

...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955919
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик, а почему ты в функцию P(), ожидающую последовательность байт в UTF-8, передаешь последовательность в UTF-16? Подозреваю, что такие последовательности будут интерпретированы, как однобайтовые
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955920
Kazantsev Alexey
щщах говорит, что это PHP.


ВсеРазумный
php zend array


ВсеРазумный
zend array



В любом случае это PHP массивы которые используются в интерпретаторе. Но я нигде не говорил что это чисты PHP интерпретатор.


ВсеРазумный
Разумеется с чистым общением ZendAPI без интерпретатора. Дабы знать на сколько поссосанная система в Delphi
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955921
Kazantsev Alexey
Няшик, а почему ты в функцию P(), ожидающую последовательность байт в UTF-8, передаешь последовательность в UTF-16? Подозреваю, что такие последовательности будут интерпретированы, как однобайтовые



Не Няшик. Всё верно понимаете, именно так и работает правильно. Так как строки там все array of byte в сях, костыль такой


Код: 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.
procedure PreHandler(Execute_data, Return_value: Pointer); cdecl;
var
  Count: Integer;
  Ptr, v: Pointer;
  W: UTF8String;
begin
  W := '';
  with php^ do
  begin
    Ptr := ARG_CALL(Execute_data, 1); // Поулчим стэк-массив аргументов
    Count := ARGS_NUM(Execute_data); // Количество вызываемых аргументов
    while Count > 0 do
    begin
      dec(Count);

      v := PByte(Ptr) + (Count * SizeZval); // ARG_GET (Функция работает так)

      if Z_TYPE_P(v) in [IS_ARRAY, IS_OBJECT, IS_RESOURCE] then
        W := UTF8String(printR(v, 0)) + W
      else
        W := UTF8String(Z_STRVAL_P(Zval_Type(v, IS_STRING))) + W;
    end;
    ShowMessage(string(W));
  end;
end;




Ещё по этому, работает только так. Конвертация PAnsiChar в UTF8String что бы юникод отображался верно.
Код: pascal
1.
    W := UTF8String(printR(v, 0)) + W
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955922
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Всё верно понимаете, именно так и работает правильно. Так как строки там все array of byte в сях, костыль такой

Тогда давай результаты с преобразованием, а то у тебя все ключи получились односимвольными. Либо, если нет преобразований, делай тест контролирующий правильность заполнения массива.
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955923
Kazantsev Alexey,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
static zend_always_inline zend_string *zend_string_init(const char *str, size_t len, int persistent)
{
	zend_string *ret = zend_string_alloc(len, persistent);

	memcpy(ZSTR_VAL(ret), str, len);
	ZSTR_VAL(ret)[len] = '\0';
	return ret;
}



Вот она заветная. Все строки - линейный массив. Именно так и получаем, и отдаём. Иначе будут кракозябры
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955924
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
делай тест контролирующий правильность заполнения массива
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955925
Kazantsev Alexey,

Код: pascal
1.
EvalCode: procedure(Str: UTF8String; Retval_ptr: TPtr; String_name: UTF8String; Handle_exceptions: Integer); cdecl;



Код: pascal
1.
ub_write: function(const Str: PAnsiChar; Len: Size_t): Size_t; cdecl;




Отправляем на выполнение строку с юникодом, и говорим что бы он вывел в буфер через echo

И буфер пишется в memo снизу под кодом выполнения
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955944
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик, ты тень на плетень не наводи. Давай тест контролирующий корректность заполнения массива строковыми значениями по строковым ключам.
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955951
Kazantsev Alexey,

Он приведён. Если бы было некорректно заполнено, код не выполнился. Демонстрирую 3 вариант как это выглядит с другими типами - пример некорректного типа

Вызываемая функция имеет char*
Код: plaintext
1.
ZEND_API int zend_eval_string_ex(char *str, zval *retval_ptr, char *string_name, int handle_exceptions);



Из чего мы можем предположить, что нужен PAnsiChar



Ой, мимо. Кракозябры.

Возможные варианты вызова (Первый самый правильный)


Ну раз не PAnsiChar то возможно PWideChar ?


Опять мимо! Заработал но опять же выдал syntax error
Код: pascal
1.
 EvalCode(PWideChar(UTF8String(Code.Text)), nil, 'Test Runner', 1);




Ну и третий вариант объявить UTF8String и не парится. Всё работает 100% правильно
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955955
Просто офигенный пример корректной работы и правильного типа

Код: pascal
1.
 RegPHPClass: function(const Str: UTF8String): TPtr; cdecl; 
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955959
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумныйпример корректной работы

Вообще-то это называется "дуракам везёт", что у UTF8String совпадают адреса класса и
внутреннего буфера. А ведь в приведении UTF8String к PUTF8Char могло быть и чуть-чуть
больше compiler magic...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955962
Dimitry Sibiryakov,

Там копирование идёт, что ты думал, ZendAPI даёт управлять память кому попало? Тыы смеешШшшНООоой))

...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955963
Вы думали для чего Я привёл функцию

22130627

??!!! Просто от балды ??? Нуу конечно...
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955964
Dimitry Sibiryakov
к PUTF8Char могло быть и чуть-чуть больше compiler magic...


Код: pascal
1.
PUTF8Char = PAnsiChar;



ГенеААльно.


Вообще даёт компилировать просто без приведений, но класс всё равно не находит.
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955968
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Няшик, твои пляски с EvalCode мимо кассы. EvalСode у тебя принимает параметры конкретного типа - Utf8String. Когда ты туда отдаёшь строку, дельфя её конвертирует и сишная dll получает сырой указатель на правильную последовательность. В случае с вызовом P() всё совсем по-другому - указатели отдаются на последовательность UTF-16 (а dll думает, что ей дают UTF-8), поэтому такая последовательность будет восприниматься, как односимвольная. В результате, в твоём массиве всего одна пара ключ-значение. Поэтому говорю ещё раз: делай тест корректности заполнения массива.
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955972
Kazantsev Alexey,

Всё корректно работает.

Код: pascal
1.
 RegPHPClass: function(const Str: UTF8String): TPtr; cdecl;



Тот же самый UTF8String

void *RegPHPClass(const char *ClassName)


Эта та же самая хэш таблица zend array она не даст соврать




Если сделать PUTF8Char как сказал мудрец Dimitry Sibiryakov



Fatal error: Uncaught Error: Class 'Test✔ClassНаРусском' not found in Test Runner:2
Stack trace:
#0 {main}
thrown in Test Runner on line 2



Обрати внимания, что он даже линию показал правильно. Что свидетельствует о верной передачи текста
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955973
В принципе все исходники в шапке. Никому не проблема скачать и всё перепробовать
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955977
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Няшик, читай до просветления, а потом пиши тест.
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955978
Kazantsev Alexey,

Не Няшик Я.

Всё что НЕ UTF8String Не работает. Вы понимаете ??? Корректно - ничего. Не имеет смысла что - то менять и искать, если корректно работает UTF8String
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955985
Ну вот, строки UTF8 а значит UTF8String это верное решение.
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955990
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Не Няшик Я

Нам-то не гони! (с).

ВсеРазумный
Всё что НЕ UTF8String Не работает. Вы понимаете ??? Корректно - ничего. Не имеет смысла что - то менять и искать, если корректно работает UTF8String

Ты вообще не понимаешь о чём я написал уже несколько раз? У тебя нет преобразований строк в UTF-8 при вызове P().
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955992
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Си функции в принципе не могут принимать дельфиские строки. Никакие. Любая работа,
выглядящая корректно - не более чем результат удачного совпадения и тщательно разложенные
грабли на будущее. Только указатели: PAnsiChar, PUtf8Char, PWideChar.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955996
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

В dll и отдаётся указатель на первый символ строки т.ч. с этим тут проблем нет.
...
Рейтинг: 0 / 0
PHP Array VS Delphi Array
    #39955999
Kazantsev Alexey
У тебя нет преобразований строк в UTF-8 при вызове P().


Это и так было понятно КЭЭП по этому и используется UTF8String что бы строки изначально были UTF8String и автоматически string конвертировался в UTF8String без ручного процесса

Если присвоить string к UTF8String то произойдёт вызов _LStrFromPWCharLen автоматической конвертации.

Ты думал это дубой Си???? Где ты руками все типы манипулируешь. Ага.. Щасз


Dimitry Sibiryakov

Си функции в принципе не могут принимать дельфиские строки. Никакие. Любая работа,
выглядящая корректно - не более чем результат удачного совпадения и тщательно разложенные
грабли на будущее. Только указатели: PAnsiChar, PUtf8Char, PWideChar.


Могут, ещё как. А как по твоему работают модельные библиотеки php_* ? Их писать можно на любом языке.

Просто zend Api забирает себе строки.
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / PHP Array VS Delphi Array
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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