Конференция "Прочее" » Разбор кода подсчета трафика
 
  • ob_kun (07.07.08 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;




    Собственно интересует только интерпретация этого выражения для понимания "человеческим" языком. Помогите, Мастера!
  • Поросенок Винни-Пух © (07.07.08 16:23) [1]
    точнее, если есть структура TMibIfTable, то как понять обращение к ней через указатель?

    вот так буквально и понять
  • ob_kun (07.07.08 16:26) [2]
    Пожалуйста, без издевательств, поясните, почему обращение происходит именно таким образом?
  • Поросенок Винни-Пух © (07.07.08 16:34) [3]
    Потому что кто-то не хотел передавать всю струткуру, а только четыре байта указателя на нее
  • ketmar © (07.07.08 16:36) [4]
    потому что автору так захотелось. кстати, автор несколько неумён.

    ---
    All Your Base Are Belong to Us
  • ob_kun (07.07.08 16:39) [5]
    То есть, в общем случае, если существует запись

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

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

    _pstruct: pstruct;
    p : ponter;
    ...
    new(_pstruct); // это обязательно?
    p = _pstruct;
    ...
    и такую конструкцию: TStruct(p^) ? Верно? И еще: что она вернет?
  • Поросенок Винни-Пух © (07.07.08 16:41) [6]
    new(_pstruct); // это обязательно?

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

    и такую конструкцию: TStruct(p^) ? Верно? И еще: что она вернет?
    TStruct и вернет.
  • wl © (07.07.08 16:41) [7]
    какая-то жуткая помесь турбопаскаля и делфи
  • ob_kun (07.07.08 16:44) [8]
    Не совсем ясно, как это? То есть она вернет структуру, заполненную данными (ну был вызов GetIfTable), или пустую, с начальными значениями (после инициализации)? То есть таким образом, имея разные указатели и передавая их как TStruct(p1^), TStruct(p2^), мы будем получать различные наполненные (ессно, после вызова функций заполнения или делая это сами, типа TStruct(p2^).x1 L= 5;) структуры? Я верно понял?

    2: Кетмар: а в чем сглупил автор?
  • ketmar © (07.07.08 16:44) [9]
    >[7] wl © (2008-07-07 16:41:00)
    это no-brain порт с C, похоже.

    ---
    All Your Base Are Belong to Us
  • ob_kun (07.07.08 16:45) [10]
    2 wl : простите, я только учусь....
  • ketmar © (07.07.08 16:45) [11]
    >[8] ob_kun (2008-07-07 16:44:00)
    >а в чем сглупил автор?

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

    ---
    Understanding is not required. Only obedience.
  • Поросенок Винни-Пух © (07.07.08 16:46) [12]
    Не совсем ясно, как это?

    Да вот так.
  • Поросенок Винни-Пух © (07.07.08 16:47) [13]
    или пустую, с начальными значениями

    Что лежало в p^ на момент приведения к TStruct то и вернет
  • ob_kun (07.07.08 16:48) [14]

    > Да вот так.

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

    2 ketmar: а как бы сделали Вы?
  • ob_kun (07.07.08 16:49) [15]

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

    p - указатель, по сути, на структуру. А почему нельяз просто написать так: p^.x1, например?
  • Поросенок Винни-Пух © (07.07.08 16:51) [16]
    Можно. Кто сказал что нельзя?
  • ob_kun (07.07.08 16:52) [17]
    А зачем тогда заключать указатель внутрь такой конструкции?
  • Поросенок Винни-Пух © (07.07.08 16:55) [18]
    Это чтобы тебе не скучно было
  • ob_kun (07.07.08 16:57) [19]
    Извините, но серьезно можно ответить? Вы намекаете, что будет синтаксическая ошибка при варианте p^.x1 ?
 
Конференция "Прочее" » Разбор кода подсчета трафика
Есть новые Нет новых   [134439   +47][b:0][p:0.001]