-
Поясните, пожалуйста, как понять следующий отрывок кода: caption:=Trim(TMibIfTable(_p^).table[i].bDescr);
точнее, если есть структура TMibIfTable, то как понять обращение к ней через указатель? Вот код процедуры:
procedure TForm1.Timer1Timer(Sender: TObject);
var
_MibIfTable:PMibIfTable; _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;
Собственно интересует только интерпретация этого выражения для понимания "человеческим" языком. Помогите, Мастера!
-
точнее, если есть структура TMibIfTable, то как понять обращение к ней через указатель?
вот так буквально и понять
-
Пожалуйста, без издевательств, поясните, почему обращение происходит именно таким образом?
-
Потому что кто-то не хотел передавать всю струткуру, а только четыре байта указателя на нее
-
потому что автору так захотелось. кстати, автор несколько неумён.
--- All Your Base Are Belong to Us
-
То есть, в общем случае, если существует запись
Type TStruct = record x1: Integer; x2 : string; end;
и объявлено, что PStruct = ^TStruct, то можно использовать
_pstruct: pstruct; p : ponter; ... new(_pstruct); // это обязательно? p = _pstruct; ... и такую конструкцию: TStruct(p^) ? Верно? И еще: что она вернет?
-
new(_pstruct); // это обязательно?
нет. не обязательно. только если нужно.
и такую конструкцию: TStruct(p^) ? Верно? И еще: что она вернет? TStruct и вернет.
-
какая-то жуткая помесь турбопаскаля и делфи
-
Не совсем ясно, как это? То есть она вернет структуру, заполненную данными (ну был вызов GetIfTable), или пустую, с начальными значениями (после инициализации)? То есть таким образом, имея разные указатели и передавая их как TStruct(p1^), TStruct(p2^), мы будем получать различные наполненные (ессно, после вызова функций заполнения или делая это сами, типа TStruct(p2^).x1 L= 5;) структуры? Я верно понял?
2: Кетмар: а в чем сглупил автор?
-
>[7] wl © (2008-07-07 16:41:00) это no-brain порт с C, похоже.
--- All Your Base Are Belong to Us
-
2 wl : простите, я только учусь....
-
>[8] ob_kun (2008-07-07 16:44:00) >а в чем сглупил автор? в том, что вовремя лечебной эвтаназии не выпил. тут весь код -- сплошная бугогашечка, проще сказать, в чём не сглупил: begin и end правильно написал.
--- Understanding is not required. Only obedience.
-
Не совсем ясно, как это?
Да вот так.
-
или пустую, с начальными значениями
Что лежало в p^ на момент приведения к TStruct то и вернет
-
> Да вот так.
Ответьте, пожалуйста, я верно понял про то, что, имея различные указатели, мы можем таким образом обращаться к различным структурам?
2 ketmar: а как бы сделали Вы?
-
> Что лежало в p^ на момент приведения к TStruct то и вернет
p - указатель, по сути, на структуру. А почему нельяз просто написать так: p^.x1, например?
-
Можно. Кто сказал что нельзя?
-
А зачем тогда заключать указатель внутрь такой конструкции?
-
Это чтобы тебе не скучно было
-
Извините, но серьезно можно ответить? Вы намекаете, что будет синтаксическая ошибка при варианте p^.x1 ?
|