Как скормить большой JSON массив плагину ?

x330122

Участник
Сообщения
357
Реакции
152
✌ Вопрос следует из темы.
В общем у меня есть большой JSON массив, примерно 30000 строк, так вот, как можно взять данные из него ?

Использую инклуд JSON: clugg/sm-json
Сообщения автоматически склеены:

Возможно ли создать отдельный файл .json и как-то его в виде строки весь представить ? 🤪
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #2
Можно смело забыть. Он написан на чистом SourcePawn, а у SourcePawn ограничение на длину буфера в 4096 символов, кажется (включая NULL-терминатор).

Проще взять реализацию на сях. Например, заюзать соответствующий объект из REST in Pawn или перейти на SMJansson.
 

x330122

Участник
Сообщения
357
Реакции
152
REST помог, HTTP запросик 🙏
Сообщения автоматически склеены:

А возможно ли сохранить полученный ответ в плагине чтобы получить ответ один раз и все и чтобы я уже мог в дальнейшем уже из ответа значения дергать
 
Последнее редактирование:

Rostu

Добрая душа
Сообщения
986
Реакции
623
Можно смело забыть. Он написан на чистом SourcePawn, а у SourcePawn ограничение на длину буфера в 4096 символов, кажется (включая NULL-терминатор).

Проще взять реализацию на сях. Например, заюзать соответствующий объект из REST in Pawn или перейти на SMJansson.
На чистом SourcePawn, на 1.10 компиляторе изначально выделяется => 16384 байт => Вы можете создать максимум буффер с таким размером:
C-подобный:
char sBuffer[18544];

На самом деле - я не особо знаю и понимаю как это работает, и я был бы рад, если мне объяснили бы, но максимальный размер буффера = Stack/heap size + 2160

Если вам необходим буффер с 30000 символами т.е
C-подобный:
char sBuffer[30000]
То можно вычесть по такой мини-формуле [(Необходимый размер массива - 2160) / 4 [ размер ячейки памяти составляет 4 байта] => (30000 - 2160) / 4 = 6960
И в начале плагина вы можете написать
C-подобный:
#pragma dynamic 6960
и теперь можно такой буффер возможно будет создать.

Оффтоп
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #6
и теперь можно такой буффер возможно будет создать.
Ну, попробуй)
Буфер-то создастся, но работать с ним адекватно не получится.

Оффтоп
 

Rostu

Добрая душа
Сообщения
986
Реакции
623
Ну, попробуй)
Буфер-то создастся, но работать с ним адекватно не получится.

Оффтоп
Прежде чем писать сюда - я действительно проверял. Немного не понимаю, что значит адекватно не будет работать - надеюсь буду объяснения :(
Возьмем код из темы с обходом ограничения Hint => [CS:GO] Обходим ограничения символов в PrintToChat/PrintHintText
Там использовался такой код
C-подобный:
#pragma dynamic 7460

public void OnPluginStart()
{
    char sHint[30000];

    static const int iOneLength = 32;
    int iResult = sizeof(sHint) / iOneLength;

    for(int x = 1; x <= iResult; x++)
    {
        Format(sHint, sizeof(sHint), "%s <font color=\'#FFC100\'>%d</font>%s", sHint, x, (x % 20 == 0) ? "\n" : "");
    }
    Format(sHint, sizeof(sHint), "<pre> %s </pre>", sHint);

    PrintToServer("StrLen %d", strlen(sHint));
    //PrintHintTextToAll2(sHint);
}

Выводимый результат =>
1577924961247.png

Вроде все адекватно, или проблема в другом?

Насчет размера буффера, которые всегда кратен 4 - действительно я ошибся, спасибо что разъяснил мне то, что я не зря до сих пор его делаю кратным 4 :)
 
Сверху Снизу