Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.07;
Скачать: CL | DM;

Вниз

Разбор кода подсчета трафика   Найти похожие ветки 

 
ob_kun   (2008-07-07 16:14) [0]

Поясните, пожалуйста, как понять следующий отрывок кода:
caption:=Trim(TMibIfTable(_p^).table[i].bDescr);

точнее, если есть структура TMibIfTable, то как понять обращение к ней через указатель? Вот код процедуры:

procedure TForm1.Timer1Timer(Sender: TObject);
var
 _MibIfTable:PMibIfTable;// в программе объявлено, что PMibIfTable = ^TMibIfTable;
 _P:Pointer;
  i:integer;
 _buflen:dword;
 _error:dword;
begin
listview1.Items.Clear;
_buflen:=sizeof(_MibIfTable^);
New(_MibIfTable);
_P:=_MibIfTable;
_error:=GetIfTable(_MibIfTable, @_buflen, false);

if _error <> NO_ERROR then
 begin
  ShowMessage("Произошла ошибка!");
  Exit;
 end;

for i:=0 to TMibIfTable(_P^).dwNumEntries-1 do
 with ListView1.Items.Add do
  begin
   caption:=Trim(TMibIfTable(_p^).table[i].bDescr);
   subitems.Add(GetInterfaceType(TMibIfTable(_P^).table[i].dwtype));
   subitems.Add(GetStrMac(TMacAddress(TMibIfTable(_p^).Table[i].bPhysAddr),
               TMibIfTable(_p^).table[i].dwPhysAddrLen));
   subitems.add(SpeedToStr(TMibIfTable(_p^).table[i].dwSpeed));
   subitems.Add(Traff(TMibIfTable(_p^).table[i].dwOutOctets));
   subitems.Add(Traff(TMibIfTable(_p^).table[i].dwInOctets));
   subitems.Add(IntToStr(TMibIfTable(_p^).table[i].dwOutErrors));
   subitems.Add(IntToStr(TMibIfTable(_p^).table[i].dwInErrors));
  end;
dispose(_MibIfTable);

end;



Собственно интересует только интерпретация этого выражения для понимания "человеческим" языком. Помогите, Мастера!


 
Поросенок Винни-Пух ©   (2008-07-07 16:23) [1]

точнее, если есть структура TMibIfTable, то как понять обращение к ней через указатель?

вот так буквально и понять


 
ob_kun   (2008-07-07 16:26) [2]

Пожалуйста, без издевательств, поясните, почему обращение происходит именно таким образом?


 
Поросенок Винни-Пух ©   (2008-07-07 16:34) [3]

Потому что кто-то не хотел передавать всю струткуру, а только четыре байта указателя на нее


 
ketmar ©   (2008-07-07 16:36) [4]

потому что автору так захотелось. кстати, автор несколько неумён.

---
All Your Base Are Belong to Us


 
ob_kun   (2008-07-07 16:39) [5]

То есть, в общем случае, если существует запись

Type
TStruct = record
  x1: Integer;
  x2 : string;
end;

и объявлено, что PStruct = ^TStruct, то можно использовать

_pstruct: pstruct;
p : ponter;
...
new(_pstruct); // это обязательно?
p = _pstruct;
...
и такую конструкцию: TStruct(p^) ? Верно? И еще: что она вернет?


 
Поросенок Винни-Пух ©   (2008-07-07 16:41) [6]

new(_pstruct); // это обязательно?

нет. не обязательно. только если нужно.

и такую конструкцию: TStruct(p^) ? Верно? И еще: что она вернет?
TStruct и вернет.


 
wl ©   (2008-07-07 16:41) [7]

какая-то жуткая помесь турбопаскаля и делфи


 
ob_kun   (2008-07-07 16:44) [8]

Не совсем ясно, как это? То есть она вернет структуру, заполненную данными (ну был вызов GetIfTable), или пустую, с начальными значениями (после инициализации)? То есть таким образом, имея разные указатели и передавая их как TStruct(p1^), TStruct(p2^), мы будем получать различные наполненные (ессно, после вызова функций заполнения или делая это сами, типа TStruct(p2^).x1 L= 5;) структуры? Я верно понял?

2: Кетмар: а в чем сглупил автор?


 
ketmar ©   (2008-07-07 16:44) [9]

>[7] wl © (2008-07-07 16:41:00)
это no-brain порт с C, похоже.

---
All Your Base Are Belong to Us


 
ob_kun   (2008-07-07 16:45) [10]

2 wl : простите, я только учусь....


 
ketmar ©   (2008-07-07 16:45) [11]

>[8] ob_kun (2008-07-07 16:44:00)
>а в чем сглупил автор?

в том, что вовремя лечебной эвтаназии не выпил. тут весь код -- сплошная бугогашечка, проще сказать, в чём не сглупил: begin и end правильно написал.

---
Understanding is not required. Only obedience.


 
Поросенок Винни-Пух ©   (2008-07-07 16:46) [12]

Не совсем ясно, как это?

Да вот так.


 
Поросенок Винни-Пух ©   (2008-07-07 16:47) [13]

или пустую, с начальными значениями

Что лежало в p^ на момент приведения к TStruct то и вернет


 
ob_kun   (2008-07-07 16:48) [14]


> Да вот так.

Ответьте, пожалуйста, я верно понял про то, что, имея различные указатели, мы можем таким образом обращаться к различным структурам?

2 ketmar: а как бы сделали Вы?


 
ob_kun   (2008-07-07 16:49) [15]


> Что лежало в p^ на момент приведения к TStruct то и вернет

p - указатель, по сути, на структуру. А почему нельяз просто написать так: p^.x1, например?


 
Поросенок Винни-Пух ©   (2008-07-07 16:51) [16]

Можно. Кто сказал что нельзя?


 
ob_kun   (2008-07-07 16:52) [17]

А зачем тогда заключать указатель внутрь такой конструкции?


 
Поросенок Винни-Пух ©   (2008-07-07 16:55) [18]

Это чтобы тебе не скучно было


 
ob_kun   (2008-07-07 16:57) [19]

Извините, но серьезно можно ответить? Вы намекаете, что будет синтаксическая ошибка при варианте p^.x1 ?


 
Поросенок Винни-Пух ©   (2008-07-07 17:04) [20]

не будет никакой ошибки


 
Сергей М. ©   (2008-07-07 17:05) [21]

Тебе намекают, что переменная p тут вообще не нужна.

Вот этого достаточно с тем же успехом:

caption:=Trim(_MibIfTable.table[i].bDescr);


 
ketmar ©   (2008-07-07 17:12) [22]

>[14] ob_kun (2008-07-07 16:48:00)
>а как бы сделали Вы?

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

---
Do what thou wilt shall be the whole of the Law.


 
ketmar ©   (2008-07-07 17:15) [23]

>[14] ob_kun (2008-07-07 16:48:00)
ну и, кстати, код вообще фиготень. глянуть вот сюда: http://msdn.microsoft.com/en-us/library/aa365943(VS.85).aspx и понять, что если ЭТО работает, то оно не виновато, оно нечаянно.

---
Understanding is not required. Only obedience.


 
int64   (2008-07-07 18:08) [24]

Как я люблю ShowMessage("Произошла ошибка!");
в таймере !!!


 
ketmar ©   (2008-07-07 18:34) [25]

>[24] int64 (2008-07-07 18:08:00)
кстати, да. этот чудесный момент я вообще провтыкал. за это автору отдельный респектище, юзеры будут очень довольны. %-)

---
Understanding is not required. Only obedience.


 
ob_kun   (2008-07-08 10:46) [26]

2 Сергей М :
то есть автор просто замудрил с записью, и можно писать проще?

Int64, ketmar: как я понял, делаем в этом случае ShowMessage и Timer1.Enabled := False;

:-)


 
ob_kun   (2008-07-08 10:57) [27]

2 ketmar: и еще, Вы предлагаете делать, как я понял, изменение трафика (числа ошибок/скорости etc.) для элемента, название которого в списке соотвествует возвращенному функцией, на первый отсчет таймера - просто производить добавление всех элементов, на последующие - только изменять в соответственных строках значения параметров (поскольку маловероятно внезапное подключение сетевой карты ;) ). Верно я понял?


 
ketmar ©   (2008-07-08 11:26) [28]

>[26] ob_kun (2008-07-08 10:46:00)
>делаем в этом случае ShowMessage и Timer1.Enabled := False;

или так. (ц)
но вообще-то, рисовать диалоговые окна из обработчика таймера — моветон.

>[27] ob_kun (2008-07-08 10:57:00)
и это тоже. так эстетичней. плюс — внимательно почитать ссылку на msdn, которую я привёл, потом код из вопроса, и понять, что код неверный. переписать в соответствии с msdn. потом ещё подумать и вообще прекратить выдылеять/освобождать память в обработчике таймера (кроме самого первого раза, когда поле проинициализируется).

хинт: локальную переменную делаем полем формы. поскольку вызов пинается по таймеру — явно не стоит дополнительно память насиловать, ей и так от строк печально.

---
Do what thou wilt shall be the whole of the Law.


 
Сергей М. ©   (2008-07-08 11:30) [29]


> ob_kun   (08.07.08 10:46) [26]


Это же очевидно)


 
ketmar ©   (2008-07-08 11:35) [30]

>[29] Сергей М. © (2008-07-08 11:30:00)
ага, как штаны получил — загордился, перестал разгромные ответы писать!
%-)

---
All Your Base Are Belong to Us


 
Сергей М. ©   (2008-07-08 11:45) [31]


> ketmar ©   (08.07.08 11:35) [30]


Подожди, еще не вечер)
Вожжа под хвост - неприятность малопредсказуемая)


 
ketmar ©   (2008-07-08 12:00) [32]

>[31] Сергей М. © (2008-07-08 11:45:00)
>Вожжа под хвост — неприятность малопредсказуемая)

я даже боюсь представить, чем ещё штаны оборудованы…

---
All Your Base Are Belong to Us


 
ob_kun   (2008-07-08 15:29) [33]

2 ketmar : Извините, не могли бы вы помочь перевести (или хотя бы пояснить смысл) сишной строки
 pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));
Также: как я понимаю, заголовочника для Delphi нет, необходимо экспортировать функцию из динамической библиотеки, а описания структур оставить в программе, которые и были?


 
Palladin ©   (2008-07-08 15:35) [34]


>  pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));

New(pIfTable);


 
ob_kun   (2008-07-08 15:36) [35]


> Palladin

я и не ожидал, что так коротко) А разве в C++ нет ничего типа New?


 
Palladin ©   (2008-07-08 15:37) [36]

MALLOC как видишь


 
ketmar ©   (2008-07-08 15:46) [37]

>[33] ob_kun (2008-07-08 15:29:00)
>как я понимаю, заголовочника для Delphi нет

не факт. у джедаев этих заголовков…

---
Do what thou wilt shall be the whole of the Law.


 
ketmar ©   (2008-07-08 15:47) [38]

>[35] ob_kun (2008-07-08 15:36:00)
>А разве в C++ нет ничего типа New?

есть. так и называется — new. только оно совсем для другого. остальное — GetMem(sizeof(…)).

---
Understanding is not required. Only obedience.


 
AlexKniga ©   (2008-07-08 15:52) [39]

ob_kun
Дополнение к ketmar
Джедаи это delphi-jedi.org


 
ketmar ©   (2008-07-08 15:54) [40]

>[39] AlexKniga © (2008-07-08 15:52:00)
а, ну да. tnx. провтыкал, должен был сам адрес дать. %-)

---
Understanding is not required. Only obedience.



Страницы: 1 2 3 вся ветка

Текущий архив: 2008.09.07;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.02 c
15-1216181257
dreamse
2008-07-16 08:07
2008.09.07
Написание спам фильтра


2-1217309805
Оксана Вл.
2008-07-29 09:36
2008.09.07
Не срабатывает dbEditing


15-1216036018
wl
2008-07-14 15:46
2008.09.07
Win XP x64 + поддержка иероглифов


15-1216219995
Украинец
2008-07-16 18:53
2008.09.07
Что для вас важнее в работе?


15-1216577333
programmer90
2008-07-20 22:08
2008.09.07
Список ошибок.