Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2009, 18:24   #1
Shadovv13
Пользователь
 
Регистрация: 02.03.2008
Сообщений: 11
По умолчанию Структуры

Привет!

На этом страницэ http://www.winpcap.org/docs/docs_40_...ce.html#l00148 есть вот такая структура

00148 struct pcap_if {
00149 struct pcap_if *next;
00150 char*name;
00151 char*description;
00152 struct pcap_addr *addresses;
00153 u_int flags;
00154 };

Может ли кто её обяснить. Ато никак немогу переписать под PowerBasic
Shadovv13 вне форума Ответить с цитированием
Старый 11.10.2009, 18:34   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Описывается структура pcap_if.
Первым элементом в ней идёт указатель на такую же структуру.
Вторым элементом идёт указатель на символьный массив(строку)
Третий элемент всё тот же указатель на строку.
Четвёртый элемент - указатель на структуру типа pcap_addr.
Пятым элементом очевидно есть беззнаковая целочисленная переменная
netrino вне форума Ответить с цитированием
Старый 11.10.2009, 18:49   #3
Shadovv13
Пользователь
 
Регистрация: 02.03.2008
Сообщений: 11
По умолчанию

Описывается структура pcap_if.
Первым элементом в ней идёт указатель на такую же структуру.


Как это???

struct test {
struct test *next;
};


И как это будет работать!?
Shadovv13 вне форума Ответить с цитированием
Старый 11.10.2009, 19:05   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Да очень просто) Указатель для всех типов имеет определённый размер(на 32-х битных машинах он равен 4 байтам), то есть размер структуры компилятор вполне способен вычислить на стадии компиляции. В данном случае он будет 20 байт.
netrino вне форума Ответить с цитированием
Старый 11.10.2009, 20:39   #5
Shadovv13
Пользователь
 
Регистрация: 02.03.2008
Сообщений: 11
По умолчанию

Если я всьо правилно понял, то вид оно имеет следущий.

pcap_if
1. next* = 4 byte (point pcsp_if)
2. name* = 4 byte (point char)
3. description* = 4 byte (point char)
4. addresses* = 4 byte (point pcap_addr)
5. flags = 2 byte

Если все так, тогда первые 4 байта указывают на саму структуру!?
И ещё, если указатель 4 байта, тогда зачем char во 2,3 строках.
Shadovv13 вне форума Ответить с цитированием
Старый 11.10.2009, 20:51   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
И ещё, если указатель 4 байта, тогда зачем char во 2,3 строках.
указатель на символ.
обычно так указывается на символьную строку с терминальным нулем в конце.
Цитата:
. flags = 2 byte
u_int=int=4 байта(поидее так)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.10.2009, 20:51   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

последний(5) элемент тоже будет 4 байта, на 32-х битных машинах(по меньшей мере на большинстве).
В первые четыре байта можно будет положить адрес, который будет указывать на память размером в 20 байт. Описание этого указателя как struct pcap_if нужно лишь для удобного доступа к этой памяти. Раз он описан так, то тогда становится возможным нечто вроде такого:
Код:
struct pcap_if s;
s.next = (struct pcap_if*)malloc(sizeof(s));
s.next->flags = 8;
То есть, говоря, что этот указатель указывает на структуру типа pcap_if, мы можем получать доступ к этой памяти, как к структуре типа pcap_if. Не знаю как проще пояснить)
* - спецификатор указателя. Но компилятор не знает, сколько именно брать байт из памяти, на какую он указывает. Для этого ввели указание типа перед *, дабы было ясно с каким кол-ством байт работать по данному адресу.
char* c - указатель на память. c + 1 - будет указывать на следующий байт относительно начала. char sym = *c; возьмёт 1 байт по адресу.
int* i - точно так же, как и char* есть указатель на память. i+1 указывает на следующие 4 байта, относительно начала. int integer = *i; возьмёт 4 байта по адресу
даже более того:
Код:
int* i;
char* c = (char*)malloc(100);
int c1 = (int)(*c); // в c1 положит 1 байт из выделенной памяти.
i = (int*)c;
int c2 = *i; // в c2 будет положено 4 байта из всё того же куска памяти

Последний раз редактировалось netrino; 11.10.2009 в 20:55.
netrino вне форума Ответить с цитированием
Старый 11.10.2009, 21:06   #8
Shadovv13
Пользователь
 
Регистрация: 02.03.2008
Сообщений: 11
По умолчанию

Угу! тут то разобрался!

Возник следующий вопрос!

00161 struct pcap_addr {
00162 struct pcap_addr *next;
00163 struct sockaddr *addr;
00164 struct sockaddr *netmask;
00165 struct sockaddr *broadaddr;
00166 struct sockaddr *dstaddr;
00167 };

Как понять ету структуру?
Shadovv13 вне форума Ответить с цитированием
Старый 11.10.2009, 21:12   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А что именно в ней непонятно?) Точно так же, как и с предыдущей, только все 5 элементов являются указателями на структуры
netrino вне форума Ответить с цитированием
Старый 11.10.2009, 21:22   #10
Shadovv13
Пользователь
 
Регистрация: 02.03.2008
Сообщений: 11
По умолчанию

Все кроме sockaddr, необявлена!

А может быть, что sockaddrобявлена в (например) stdio.h

Последний раз редактировалось Shadovv13; 11.10.2009 в 21:41.
Shadovv13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структуры masha.dongyz Помощь студентам 2 19.12.2011 20:29
С++ структуры KOLYTFR Помощь студентам 2 24.05.2009 19:02
Структуры BaSk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 16.05.2009 15:33
Структуры Centyrion Общие вопросы C/C++ 4 06.05.2008 20:33
Структуры в С++ bloo[d] Помощь студентам 1 30.01.2008 22:27