Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8

Тема: sscanf

  1. #1
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±

    sscanf

    Здравствуйте.Обычно использовал sscanf в простых целях sscanf(string,"dd",params[0],params[1]).Но настал день,когда мне нужно от него больше.
    В базе данных есть поле типа varchar.В нем будут хранится строки,отделенные запятой("aaa,bbb,c,gdgggg..."). Мне нужно это дело считать и записать в трехмерный массив.Я пробовал делать так:
     Код

    PHP код:
    #define MAX_FRAC 10
    #define MAX_RANGS 10
    new fRangsNames[MAX_FRAC][MAX_RANGS][25];
    new 
    connectionHandle;
    //...вызов OnFracLoad() из OnGameModeInit();
    //паблик загрузки
    @OnFracLoad();
    @
    OnFracLoad()
    {
        new 
    rf;
        
    cache_get_data(rf,connectionHandle);
        for(new 
    iri++)
        {
            new 
    string[MAX_RANGS*24+9+1];
            
    cache_get_field_content(i"fRangsNames"string), sscanf(string"p<,>a<s[25]>["#MAX_RANGS"]",fRangsNames[i]);
            
    for(new j;j<MAX_RANGS;j++) printf("FRAC:%d  %d - %s",i+1,j+1,fRangsNames[i][j]);
         }
         return 
    1;


    И как вы могли догадаться, у меня ничего не получилось.
    И да, в базе данных во второй фракции была такая запись:
    PHP код:
    a,a,a,a,a,a,a,a,a,
     логи

    [14:54:36] FRAC:1 1 -
    [14:54:36] FRAC:1 2 -
    [14:54:36] FRAC:1 3 -
    [14:54:36] FRAC:1 4 -
    [14:54:36] FRAC:1 5 -
    [14:54:36] FRAC:1 6 -
    [14:54:36] FRAC:1 7 -
    [14:54:36] FRAC:1 8 -
    [14:54:36] FRAC:1 9 -
    [14:54:36] FRAC:1 10 -
    [14:54:36] FRAC:2 1 -
    [14:54:36] FRAC:2 2 -
    [14:54:36] FRAC:2 3 -
    [14:54:36] FRAC:2 4 -
    [14:54:36] FRAC:2 5 -
    [14:54:36] FRAC:2 6 -
    [14:54:36] FRAC:2 7 -
    [14:54:36] FRAC:2 8 -
    [14:54:36] FRAC:2 9 -
    [14:54:36] FRAC:2 10 -

    Но если в sscanf поставить массив без указания его размерности,
    PHP код:
    sscanf(string"p<,>a<s>["#MAX_RANGS"]",fRangsNames[i]); 
    то будет следующее:
     Логи

    [14:56:48] FRAC:1 1 -
    [14:56:48] FRAC:1 2 -
    [14:56:48] FRAC:1 3 -
    [14:56:48] FRAC:1 4 -
    [14:56:48] FRAC:1 5 -
    [14:56:48] FRAC:1 6 -
    [14:56:48] FRAC:1 7 -
    [14:56:48] FRAC:1 8 -
    [14:56:48] FRAC:1 9 -
    [14:56:48] FRAC:1 10 -
    [14:56:48] sscanf warning: Strings without a length are deprecated, please add a destination size.
    [14:56:48] FRAC:2 1 - a
    [14:56:48] FRAC:2 2 - a
    [14:56:48] FRAC:2 3 - a
    [14:56:48] FRAC:2 4 -
    [14:56:48] FRAC:2 5 -
    [14:56:48] FRAC:2 6 -
    [14:56:48] FRAC:2 7 -
    [14:56:48] FRAC:2 8 -
    [14:56:48] FRAC:2 9 -
    [14:56:48] FRAC:2 10 -

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

    Буду благодарен за помощь.Возможно плохо прочитал офф.документацию по sscanf v2.8.1




    UPDATE: заменил sscanf(string, "p<,>a<s>["#MAX_RANGS"]",fRangsNames[i]);
    на sscanf(string, "p<,>a<s>[250]",fRangsNames[i]); //250 - это MAX_RANGS * 24 + 9 + 1
    Получилось следующее:
     лог

    [16:23:59] FRAC:1 1 -
    [16:23:59] FRAC:1 2 -
    [16:23:59] FRAC:1 3 -
    [16:23:59] FRAC:1 4 -
    [16:23:59] FRAC:1 5 -
    [16:23:59] FRAC:1 6 -
    [16:23:59] FRAC:1 7 -
    [16:23:59] FRAC:1 8 -
    [16:23:59] FRAC:1 9 -
    [16:23:59] FRAC:1 10 -
    [16:23:59] sscanf warning: Strings without a length are deprecated, please add a destination size.
    [16:23:59] FRAC:2 1 - aaaaaaaaaaaaaaaaaaaaaaa
    [16:23:59] FRAC:2 2 - aaaaaaaaaaaaaaaaaaaaaaa
    [16:23:59] FRAC:2 3 - aaaaaaaaaaaaaaaaaaaaaaa
    [16:23:59] FRAC:2 4 - aaaaaaaaaaaaaaaaaaaaaaa
    [16:23:59] FRAC:2 5 - aaaaaaaaaaaaaaaaaaaaaaa
    [16:23:59] FRAC:2 6 - aaaaaaaaaaaaaaaaaaaaaaa
    [16:23:59] FRAC:2 7 - aaaaaaaaaaaaaaaaaaaaaaa
    [16:23:59] FRAC:2 8 - aaaaaaaaaaaaaaaaaaaaaaa
    [16:23:59] FRAC:2 9 - aaaaaaaaaaaaaaaaaaaaaaa
    [16:23:59] FRAC:2 10 - aaaaaaaaaaaaaaaaaaaaaaa


    Но выдает warning (sscanf warning: Strings without a length are deprecated, please add a destination size.).Я считаю, что это не правильно, т.к каждый раз будет выводит этот warning,а это не есть хорошо.
    Последний раз редактировалось Profyan; 26.12.2015 в 14:26.



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  2. #2
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Видимо,никто не знает? Придется отказаться от двумерных массивов в sscanf?



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  3. #3
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Profyan Посмотреть сообщение
    "p<,>a<s>[250]"
    sscanf2 интерпретирует "[250]", как размер массива (т.е. количество отделяемых подстрок), а размер строкового буфера не указан.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  4. #4
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    sscanf2 интерпретирует "[250]", как размер массива (т.е. количество отделяемых подстрок), а размер строкового буфера не указан.
    я это понимаю.Но если указать размер строки, то ничего не выведет(



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  5. #5
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    PHP код:
    p<,>a<s[25]>["#MAX_RANGS"
    Это правильно, всё должно работать. Проверь то, что находится в string.

  6. #6
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    PHP код:
    p<,>a<s[25]>["#MAX_RANGS"
    Это правильно, всё должно работать. Проверь то, что находится в string.
    a,a,a,a,a,a,a,a,a,a - в стринге это. Т.е верно, но не работает почему - то.



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  7. #7
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    По всей видимости, ошибка в sscanf. Я проверил и заметил, что он не очень хорошо работает с трёхмерными массивами. Попробуй использовать двумерные.

  8. Пользователь сказал cпасибо:
    Profyan (30.12.2015)
  9. #8
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    По всей видимости, ошибка в sscanf. Я проверил и заметил, что он не очень хорошо работает с трёхмерными массивами. Попробуй использовать двумерные.
    Жаль,а я ведь так надеялся,что не придется делать костыль(



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •