Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.17 c
3-1205487538
Bless
2008-03-14 12:38
2008.09.07
ADO 2.8 в MSDN и Delphi 7 - две большие разницы?


3-1205314401
Avds
2008-03-12 12:33
2008.09.07
ошибка в ХП (expression evaluation not supported.)


2-1217069073
agress0r
2008-07-26 14:44
2008.09.07
Прога вылетает при подключениие dll в vista


15-1216142835
Guest
2008-07-15 21:27
2008.09.07
Вегетарианство


2-1217251593
alex-drob
2008-07-28 17:26
2008.09.07
Выборка из таблицы по дате





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский