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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно отдебажить функцию, C++ 
:(
    Опции темы
En_t_end
Дата 22.9.2005, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

void DelID(const DWORD ID, DWORD *ID_storage, const DWORD ID_storage_count)
{
    unsigned long i = 0;
    while(i < ID_storage_count)
    {
        if(ID_storage[i] == ID)
        {
            do{ID_storage[i] = ID_storage[i+1];
            }while(++i < ID_storage_count-1);
            break;
        }
        i++;
    }
}

Функция для удаления элемента со значением ID из хранилища ID_storage и смещение хранилища на место удаленного элемента.
Мне кажется в таком алгоритме кроется какой-то баг, ибо при частом приминении функции наблюдается эффект "проскакивания" элементов.
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mayk
Дата 22.9.2005, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Я бы делал примерно так
Код

void DelID( DWORD ID, DWORD *ID_storage, DWORD ID_storage_count)
{
    unsigned long i = 0;
    while(i < ID_storage_count)
    {
        if(ID_storage[i] == ID)
        {
            int elementsToMove = ID_storage_count - i - 1;
            if(elementsToMove > 0)
              memmove(&ID_storage[i], &ID_storage[i+1], elementsToMove*sizeof(DWORD));
            return;
        }
        i++;
    }
}

У тебя при удалении последнего элемента может произойти выход за границы массива(кстати, а где ты хранишь кол-во элементов?).
Еще вопрос - ID_storage сортирован? Можно применить двоичный поиск? Это здорово бы сократило время работы.




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
En_t_end
Дата 22.9.2005, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Mayk
Цитата(Mayk @ 22.9.2005, 22:34)
кстати, а где ты хранишь кол-во элементов

Как раз в ID_storage_count

Добавлено @ 18:43
Цитата(Mayk @ 22.9.2005, 22:34)
Еще вопрос - ID_storage сортирован? Можно применить двоичный поиск? Это здорово бы сократило время работы.

Нет, там храниться бяка, причем в реале эта функция состоит в сложной отсинхронизированной многопоточной системе, поэтому я не могу гарантировать сортировку, а даже если я её сделаю, то только увеличу время обработки, так как сортировку придется делать в отдельном треде, а у меня их и так в некоторые моменты больше 100 работают.
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mayk
Дата 22.9.2005, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Цитата(En_t_end @ 22.9.2005, 22:39)
Как раз в ID_storage_count

Мне почему-то кажется, что это значение не плохо бы изменить в случае успешно удаленного элемента и не трогать в случае когда элемент не был найден.
Кстати, для линейного поиска можно юзать lfind.





--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
En_t_end
Дата 22.9.2005, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А.... теперь я увидел свою ошибку... ID_storage_count в обязательном порядке должна уменьшаться при сдвиге. Ибо в обратном случае, я тогда получаю непредсказуемый ID в совершенно не нужном мне месте, сейчас исправлю, ну конечно, ID_storage_count ни в коем случае не должен быть const!
Добавлено @ 18:48
Цитата(Mayk @ 22.9.2005, 22:45)
Мне почему-то кажется, что это значение не плохо бы изменить в случае успешно удаленного элемента и не трогать в случае когда элемент не был найден.
Кстати, для линейного поиска можно юзать lfind.

Угу, мой предыдущий пост я писал, не видя твой. Спасибо!
PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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