Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Помощь в отладке функции BOOL parsing()


Автор: En_t_end 2.7.2005, 09:16
Есть строка примерно такого формата setdt(%DAY%, %MONTH%, %YEAR%, %HOUR%, %MINUTE%)
Нужно вытащить из строки типа char[] соответсвенно DAY, MONTH, YEAR, HOUR, MINUTE.

Автор: Fixin 2.7.2005, 18:36
Цитата
http://forum.vingrad.ru/index.php?showtopic=42954&view=findpost&p=330416
Немного изменить... и готово.

Автор: En_t_end 4.7.2005, 18:12
Вроде написал... а работает не так, как хотелось... ПомоЖите от ДебаЖить smile
Код

BOOL parsing(const char *string, char **result, const unsigned long max_long, const unsigned long max_long_part, const unsigned long max_part) 
{
    if(string == NULL)
        return FALSE;
    unsigned long point_in_str = 0;
    unsigned long part = 0;
    unsigned int part_long = 0;
    while(string[point_in_str] != ')')
    {
        part_long = 0;
        while(string[point_in_str] != ',')
        {
            if(string[point_in_str] == '-' && part_long == 0)
            {
                result[part][part_long] = string[point_in_str];
                break;
            }
            if(string[point_in_str] != ' ')
                result[part][part_long] = string[point_in_str];
            part_long++;point_in_str++;
            if(part_long > max_long_part)
                return FALSE;
        }
        result[part][part_long] = '\0'; 
        part++;
        if(point_in_str > max_long || part > max_part || part < max_part)
            return FALSE;
    }

    return TRUE;
}

Автор: S.A.P. 4.7.2005, 18:18
ИМХО для таких случаев как раз подойдет RegExp.

Автор: En_t_end 4.7.2005, 18:19
ТАкс сам нашел описку :  result[part_long] = '\0'; заменить на  result[part][part_long] = '\0';
Добавлено @ 18:23
Но работать не хочет smile

Цитата(Perchilla @ 4.7.2005, 22:18)
ИМХО для таких случаев как раз подойдет RegExp.

А что это ? Что-то знакомое..

Автор: En_t_end 4.7.2005, 18:30
Еще логическая ошибка... ведь я получаю кроме параметров ещё и начальное слово setdt( а это нам надо отрубить, поэтому:
while(string[point_in_str++] != '('){} ставим перед использованием основного цикла.

Автор: En_t_end 5.7.2005, 07:07
Блин всю ночь просидел, а корень проблемы так и не нашел smile

Автор: En_t_end 5.7.2005, 16:39
Пришлось отказаться от прошлой сигнатуры функции... слишком она заковыристая, чтобы найти в ней логическую ошибку. Сделал так, как не хотел с самого начала, зато работает:
Код

unsigned int parsing(const char *string, char *result, unsigned int last_position) 
{
    if(string == NULL || result == NULL)
        return 0;
    if(last_position == 0)
        while(string[last_position++] != '('){}
    unsigned int tempo = 0;
    while(string[last_position] != ',' && string[last_position] != ')')
    {
        result[tempo] = string[last_position];
        tempo++;last_position++;
    }
    result[tempo] = '\0';
    return ++last_position;
}

Автор: Fixin 5.7.2005, 20:54
А еще засунуть эту штуку в коллбэк... такая крутая муть получится smile (шутка)

Автор: En_t_end 7.7.2005, 07:13
Fixin
Чего-то я шутки не понял smile
ЗЫ но эта функция действует по тому же принципу, что и твоя smile

Автор: Fixin 7.7.2005, 19:13
Коллбэки знаешь, наверное. Эта фукнкция работает "порционально", а между порциями можно выполнять другие процедуры. Коллбэки нужны, если функция может выполняться очень долго и нужно, чтобы процесс не заключался только в этой функции. Например, если тебе нужно будет вынуть 999999999999999999 smile переменных, то уйдет много времени. Ты можешь вставить какую-нибудь анимацию, которая будет двигаться во время возврата функции, и пользователь будет видеть, что процесс идет.

Видел такую штуку: программа для прошивки мобилы закачивает данные в мобилу 40 минут. Интерфейс - региооный (самодельный, фигурный) и если перекрыть окно другим, то перерисовки не будет и уже не видишь состояния перепрошивки и очень неприятно становится. А если бы была организована коллбэка, то ОнПаинт вызывалась бы... или ИнвалидейтРект на худой конец.

Вот.

Автор: En_t_end 8.7.2005, 07:42
Fixin
Да с встречался я с ними... Часто оконные процедуры делаю именно таковыми... хммм... Но вот об особенностях возвращения значения догадаться не мог. Вероятно даже есть таймаут какой-нибудь, который контролирует время порции ? Ладны посмотрю МСДН.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)