Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помощь в отладке функции BOOL parsing(), VISUAL C++ 
:(
    Опции темы
En_t_end
Дата 2.7.2005, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



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

Это сообщение отредактировал(а) En_t_end - 4.7.2005, 18:37
PM MAIL ICQ Skype GTalk Jabber   Вверх
Fixin
Дата 2.7.2005, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 5
Всего: 18



Цитата
http://forum.vingrad.ru/index.php?showtopic=42954&view=findpost&p=330416
Немного изменить... и готово.
PM MAIL ICQ   Вверх
En_t_end
Дата 4.7.2005, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



Вроде написал... а работает не так, как хотелось... ПомоЖите от ДебаЖить 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;
}


Это сообщение отредактировал(а) En_t_end - 4.7.2005, 18:25
PM MAIL ICQ Skype GTalk Jabber   Вверх
S.A.P.
Дата 4.7.2005, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 1
Всего: 71



ИМХО для таких случаев как раз подойдет RegExp.
PM MAIL   Вверх
En_t_end
Дата 4.7.2005, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



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

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

А что это ? Что-то знакомое..
PM MAIL ICQ Skype GTalk Jabber   Вверх
En_t_end
Дата 4.7.2005, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



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

Это сообщение отредактировал(а) En_t_end - 4.7.2005, 18:35
PM MAIL ICQ Skype GTalk Jabber   Вверх
En_t_end
Дата 5.7.2005, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



Блин всю ночь просидел, а корень проблемы так и не нашел smile
PM MAIL ICQ Skype GTalk Jabber   Вверх
En_t_end
Дата 5.7.2005, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



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

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;
}

PM MAIL ICQ Skype GTalk Jabber   Вверх
Fixin
Дата 5.7.2005, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 5
Всего: 18



А еще засунуть эту штуку в коллбэк... такая крутая муть получится smile (шутка)
PM MAIL ICQ   Вверх
En_t_end
Дата 7.7.2005, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



Fixin
Чего-то я шутки не понял smile
ЗЫ но эта функция действует по тому же принципу, что и твоя smile
PM MAIL ICQ Skype GTalk Jabber   Вверх
Fixin
Дата 7.7.2005, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 5
Всего: 18



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

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

Вот.
PM MAIL ICQ   Вверх
En_t_end
Дата 8.7.2005, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



Fixin
Да с встречался я с ними... Часто оконные процедуры делаю именно таковыми... хммм... Но вот об особенностях возвращения значения догадаться не мог. Вероятно даже есть таймаут какой-нибудь, который контролирует время порции ? Ладны посмотрю МСДН.
PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0966 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.