Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структуры данных, массив неизвестного размера 
:(
    Опции темы
svk521
Дата 26.6.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!

подскажите, пожалуйста, каким образом можно наиболее рационально реализовать следующую задачу:

Ведется перехват пакетов по сети при помощи библиотеки WinPcap, далее предполагается помещать информацию в базу данных (с этим проблем нет).
Каким образом можно удерживать в виртуальной памяти информацию о пакетах в течении определенного интервала времени (например 5 минут), проверять каждый новый пришедший пакет с уже имеющимися, и при выполнении определенных условий либо добавлять информацию о пакете как новый элемент, либо проводить с пакетом какие-то иные действия? (получается работа с массивом, каждым элементом которого является структура, и размер такого массива заранее не известен)

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

Привожу описание структуры:
Код

struct TR {AnsiString      ip_comp;
           char            *NetBIOS_name;
           unsigned int    port_num;
           unsigned int    bytes_in;
           unsigned int    bytes_out;
           AnsiString      ip_src;
           double          dtime;
           unsigned int    id ;
           TR              *next;};
struct TR      *baseptr = NULL;
struct TR      *tmp = NULL;

PM MAIL   Вверх
Nat
Дата 26.6.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В таких случаях удобно использовать вектор из STL. 
В хедере объявляют

std::vector<STRUKTURA>struktura_v;          //вектор 
std::vector<STRUKTURA>::iterator struktura_p;    //указатель

а в программе в конец вектора записывают новые элементы (структуры) с помощью push_back.
 

PM MAIL   Вверх
Lazin
Дата 26.6.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата

В таких случаях удобно использовать вектор из STL.

Если нужно часто удалять - добавлять пакеты, то лучше использовать std::list. 
PM MAIL Skype GTalk   Вверх
Fazil6
Дата 26.6.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата(svk521 @  26.6.2007,  12:33 Найти цитируемый пост)
Мое решение - это использовать структуры данных, имеющих указатель на следующий элемент, но вот почитал книжки и вероятно можно еще использовать массив связных списков, но вот точнее мне солжно разобраться..

забей... Не надо тебе это. 
std::vector спасет Отца Русской демократии. 
Цитата(Lazin @  26.6.2007,  12:52 Найти цитируемый пост)
Если нужно часто удалять - добавлять пакеты, то лучше использовать std::list

это справедливо только если требуется вставка в определенную позицию, а здесь нужен std::vector или может быть очередь std::queue или std::deque  

Это сообщение отредактировал(а) Fazil6 - 26.6.2007, 13:24
PM MAIL   Вверх
Lazin
Дата 26.6.2007, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата

Цитата

Цитата(Lazin @  26.6.2007,  12:52 Найти цитируемый пост)
Если нужно часто удалять - добавлять пакеты, то лучше использовать std::list


это справедливо только если требуется вставка в определенную позицию, а здесь нужен std::vector или может быть очередь std::queue или std::deque  

при большом размере структуры и активном использовании, бдет часто происходить изменение размеров массива, следовательно его копирование. Тогда лучше использовать ветор указателей на структуру, копирование намного быстрей будет происходить.
PM MAIL Skype GTalk   Вверх
Fazil6
Дата 26.6.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата(Lazin @  26.6.2007,  13:44 Найти цитируемый пост)
при большом размере структуры и активном использовании, бдет часто происходить изменение размеров массива, следовательно его копирование.

вопервых изменение размера массива никак не зависит от размера структуры, а зависит от количества элементов, 
во-вторых при использовании vector можно избавиться от перераспределения вызовом reserve, 
в-третих при использовании очереди гарантируется остсутствие копирования элементов при вставке нового

и самое главное. Сложно и нежелательно хранить указатели в контейнерах. Если приходится работать с указателями, то тогда это желательно делать через интелектуальные указатели.
И в отношении структуры из первого поста, то комп не надорвется такую структуру копировать.
PM MAIL   Вверх
svk521
  Дата 26.6.2007, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое всем отозвавшимся!!!

Вы мне столько всего несоветовали.. теперь надо будет разобраться с каждым сообщением и почитать про 
vector, list. 

Про очередь я уже тоже думал, но не оказалось рядом советчика по конкретному примеру.

Мне конечно было бы полезно если кто-нибудь приведет код-пример, на парочке элементов в случае использования
vectora   smile 
PM MAIL   Вверх
Fazil6
Дата 26.6.2007, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата(svk521 @  26.6.2007,  17:30 Найти цитируемый пост)
Мне конечно было бы полезно если кто-нибудь приведет код-пример, на парочке элементов в случае использования vectora


vector позволяет работать с собой как с обычным массивом
Код

#include <iostream>
#include <vector>
#include <boost/shared_ptr.hpp>




struct TR
{
    int x;
    int y;
};
typedef boost::shared_ptr<TR> TR_t ;

void main( )
{
    std::vector<int>             v1;   // массив интов
    std::vector<TR>        v2;   // массив структур
    std::vector<TR_t>    v3;   // масив интелектуальных указателей

    v1.push_back(0);
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);

    TR t1;
    t1.x   = 0;
    t1.y   = 5;

    v2.reserve(100);    // задание размера не меньше 100 элементов
    v2.push_back(t1);


    TR_t pt1(new TR());
    pt1->x = 1;
    TR_t pt2(new TR());
    pt2->y = 2;

    v3.push_back(pt1);
    v3.push_back(pt2);


    std::cout << "vector<int> size     = " << v1.size() << "\n";
    std::cout << "vector<int> capacity = " << v1.capacity() << "\n";
    std::cout << "vector<int> first    = " << v1[0] << "\n";
    std::cout << "*****************************************\n\n";
    
    std::cout << "vector<TR> size      = " << v2.size() << "\n";
    std::cout << "vector<TR> capacity  = " << v2.capacity() << "\n";
    std::cout << "vector<TR> first     = " << v2[0].x <<" " << v2[0].y << "\n";
    std::cout << "*****************************************\n\n";

    std::cout << "vector<TR_t> size      = " << v3.size() << "\n";
    std::cout << "vector<TR_t> capacity  = " << v3.capacity() << "\n";
    std::cout << "vector<TR_t> first     = " << v3[0]->x << " " << v3[0]->y << "\n";
    std::cout << "*****************************************\n\n";
    
}

PM MAIL   Вверх
svk521
Дата 27.6.2007, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

#include <boost/shared_ptr.hpp>

Цитата

typedef boost::shared_ptr<TR> TR_t ;


это под Visual C++ ? Мне надо С++ Builder...
PM MAIL   Вверх
zkv
Дата 27.6.2007, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(svk521 @  27.6.2007,  05:39 Найти цитируемый пост)
это под Visual C++ ?

это под буст  smile, если не хочешь ставить буст, то убери и не парься. 

Это сообщение отредактировал(а) zkv - 27.6.2007, 06:33
PM MAIL   Вверх
svk521
Дата 27.6.2007, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile 
я уже разобрался и скачал нужную библиотеку!! Спасибо

PM MAIL   Вверх
svk521
Дата 3.7.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое за приведенный прмер, он мне очень помог.
Вот только желаемого я так и не могу найти. 

Каким образом просматривать элементы вектора в моем случае?

я использую 

Код

for() {}


Заранее спасибо за ответ!
PM MAIL   Вверх
JackYF
Дата 3.7.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

Репутация: 4
Всего: 162



svk521
Код

for ( int i = 0; i < vt.size(); ++i )
{
  func( v[i] );
}


Проход по вектору vt с действиями над i-м элементом.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Fazil6
Дата 3.7.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата(svk521 @  3.7.2007,  16:46 Найти цитируемый пост)
Каким образом просматривать элементы вектора в моем случае?

доступ по индексу как с обычным массивом
Код

std::vector<int> v;

....

for(int i = 0; i < v.size(); ++i)
{
    std::cout << v[i]    <<  "\n";
}

// или через итератор
std::vector<int>::iterator i = v.begin();
while( i != v.end())
{
       std::cout << *i    <<  "\n";
       ++i;




Это сообщение отредактировал(а) Fazil6 - 3.7.2007, 17:44
PM MAIL   Вверх
svk521
Дата 3.7.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



да-да -да
только ЭЛЕМЕНТАМИ ВЕКТОРА являются СТРУКТУРЫ

Код

struct TR {AnsiString      ip_comp;
           char            *NetBIOS_name;
           unsigned int    port_num;
           unsigned int    bytes_in;
           unsigned int    bytes_out;
           AnsiString      ip_src;
           TDateTime       dtime;
           unsigned int    id ;};

struct TR baseptr;
std::vector<TR>        v_tr; 


Вот таким образом обращаюсь к элементам структуры

Код

for(int i = 0; i<v_tr.size(); i++)
 {
 v_tr[i].id;
 v_tr[i].ip_comp
 v_tr[i].NetBIOS_name
совершаем какие-то действия с элементами структуры
и так далее
}



Мне кажется что в данном случае не правильно обращаюсь к элементам структуры через вектор

Это сообщение отредактировал(а) svk521 - 3.7.2007, 18:23
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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