Конференция "Прочее" » Разбор кода подсчета трафика
 
  • 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 ?
  • Поросенок Винни-Пух © (07.07.08 17:04) [20]
    не будет никакой ошибки
  • Сергей М. © (07.07.08 17:05) [21]
    Тебе намекают, что переменная p тут вообще не нужна.

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

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

  • ketmar © (07.07.08 17:12) [22]
    >[14] ob_kun (2008-07-07 16:48:00)
    >а как бы сделали Вы?

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

    ---
    Do what thou wilt shall be the whole of the Law.
  • ketmar © (07.07.08 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 (07.07.08 18:08) [24]
    Как я люблю ShowMessage('Произошла ошибка!');
    в таймере !!!
  • ketmar © (07.07.08 18:34) [25]
    >[24] int64 (2008-07-07 18:08:00)
    кстати, да. этот чудесный момент я вообще провтыкал. за это автору отдельный респектище, юзеры будут очень довольны. %-)

    ---
    Understanding is not required. Only obedience.
  • ob_kun (08.07.08 10:46) [26]
    2 Сергей М :
    то есть автор просто замудрил с записью, и можно писать проще?

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

    :-)
  • ob_kun (08.07.08 10:57) [27]
    2 ketmar: и еще, Вы предлагаете делать, как я понял, изменение трафика (числа ошибок/скорости etc.) для элемента, название которого в списке соотвествует возвращенному функцией, на первый отсчет таймера - просто производить добавление всех элементов, на последующие - только изменять в соответственных строках значения параметров (поскольку маловероятно внезапное подключение сетевой карты ;) ). Верно я понял?
  • ketmar © (08.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.
  • Сергей М. © (08.07.08 11:30) [29]

    > ob_kun   (08.07.08 10:46) [26]


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

    ---
    All Your Base Are Belong to Us
  • Сергей М. © (08.07.08 11:45) [31]

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


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

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

    ---
    All Your Base Are Belong to Us
  • ob_kun (08.07.08 15:29) [33]
    2 ketmar : Извините, не могли бы вы помочь перевести (или хотя бы пояснить смысл) сишной строки
     pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));


    Также: как я понимаю, заголовочника для Delphi нет, необходимо экспортировать функцию из динамической библиотеки, а описания структур оставить в программе, которые и были?
  • Palladin © (08.07.08 15:35) [34]

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

    New(pIfTable);
  • ob_kun (08.07.08 15:36) [35]

    > Palladin

    я и не ожидал, что так коротко) А разве в C++ нет ничего типа New?
  • Palladin © (08.07.08 15:37) [36]
    MALLOC как видишь
  • ketmar © (08.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 © (08.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 © (08.07.08 15:52) [39]
    ob_kun
    Дополнение к ketmar
    Джедаи это delphi-jedi.org
  • ketmar © (08.07.08 15:54) [40]
    >[39] AlexKniga © (2008-07-08 15:52:00)
    а, ну да. tnx. провтыкал, должен был сам адрес дать. %-)

    ---
    Understanding is not required. Only obedience.
  • wl © (08.07.08 15:55) [41]

    > ketmar ©   (08.07.08 15:47) [38]

    а код похоже на чистом С, там вроде не было new
  • ob_kun (08.07.08 15:58) [42]
    Еще один вопрос: насколько я разобрался в коде, там идет показание параметров соединений только один раз. Стоит так и оставить таймер для обновления данных?
  • ketmar © (08.07.08 15:58) [43]
    >[41] wl © (2008-07-08 15:55:00)
    >а код похоже на чистом С

    неа. цпп. в чистом C можно void * присваивать любому указателю, а цпп это запрещает. отсюда там приведение типа.

    ---
    Do what thou wilt shall be the whole of the Law.
  • ketmar © (08.07.08 15:59) [44]
    >[42] ob_kun (2008-07-08 15:58:00)
    а это тебе видней. там же не готовая софтина, там просто пример правильного использования API.

    ---
    All Your Base Are Belong to Us
  • ob_kun (08.07.08 16:34) [45]
    ketmar, а как понять вашу фразу про "локальную переменную"? Все переменные, использующиеся в var внутри Timer1Timer, перенести в private у формы?
  • ketmar © (08.07.08 16:52) [46]
    >[45] ob_kun (2008-07-08 16:34:00)
    зачем же все? только буфер с результатом.

    зыж я тут один, лучше на ты.

    ---
    All Your Base Are Belong to Us
  • ketmar © (08.07.08 16:53) [47]
    >[45] ob_kun (2008-07-08 16:34:00)
    точнее, буфер и его размер.

    ---
    Understanding is not required. Only obedience.
  • ob_kun (08.07.08 16:57) [48]
    То, что обозначено как pIfTable и dwSize в указанном тобой примере?
  • ketmar © (08.07.08 17:06) [49]
    >[48] ob_kun (2008-07-08 16:57:00)
    угу. с достаточно большой вероятностью они после первого «устаканивания» размера изменяться не будут, зачем каждый раз создавать и уничтожать буфер? это имеет смысл, если функция вызывается один раз, а если по таймеру — никакого смысла нет. вообще, вызов GetIfTable() вместе с "устаканиванием" есть смысл вытащить в отдельный метод, нечего обработчик захламлять деталями. да и обновление списка тоже. пусть в обработчике останется нечто типа:

    GetIfInfo();
    UpdateIfList();


    и хватит.

    зыж pdwSize (какой, всё-таки, идиот их научил понимать венгерскую нотацию так…)

    ---
    Understanding is not required. Only obedience.
  • ob_kun (08.07.08 17:08) [50]
    Извини, я написал простой код, он чисто показать, как я понял переписывание функции, можешь посмотреть, если сюда напишу?
  • ob_kun (08.07.08 17:12) [51]
    procedure TForm2.tmrTimer(Sender: TObject);
    var
    dwSize : DWORD;
    dwRetVal : DWORD;
    i, j : Integer;
    pIfTable : PMibIfTable;
    pIfRow :  PMibIfRow; // pIfTable и dwSize вынесу позже в private
    begin
     New(pIfTable);
     if pIfTable = Nil then exit;
     dwSize := sizeOf(TMibIfTable);
     if GetIfTable(pIfTable, @dwSize, False) = ERROR_INSUFFICIENT_BUFFER then
     begin
       Dispose(pIfTable);
       GetMem(pIfTable, dwSize);  // иначе будет как-то глупо вновь писать New(pIfTable)
       if pIfTable = Nil then exit;
     end;
     dwRetVal := GetIfTable(pIfTable, @dwSize, False);
     if dwRetVal <> NO_ERROR then exit;
       for i := 0  to pIfTable.dwNumEntries-1 do
       begin
         if not Flag then begin
           with lv.Items.Add do
           begin
             Caption := Trim(IntToStr(pIfTable.Table[i].dwIndex)+' '+pIfTable.Table[i].bDescr);
             // а тут дальнейшее заполнение
           end;
         end;
       end;
       if not Flag then Flag := True;
    end;

  • ketmar © (08.07.08 17:12) [52]
    >[50] ob_kun (2008-07-08 17:08:00)
    посмотреть могу. и не только я. %-) я тут далеко не самый умный.

    ---
    Do what thou wilt shall be the whole of the Law.
  • ob_kun (08.07.08 17:16) [53]
    Ну вот, собственно, мой убогий сорец ;)
  • ketmar © (08.07.08 17:17) [54]
    >[51] ob_kun (2008-07-08 17:12:00)
    не совсем так. а точнее, совсем не так. ну, проверки пока опустим, фиг с ними. ты про обновление списка не понял.

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

    ну, и BeginUpdate()/EndUpdate() нелохо бы, в виде той же косметики.

    ---
    Do what thou wilt shall be the whole of the Law.
  • ketmar © (08.07.08 17:20) [55]
    >[51] ob_kun (2008-07-08 17:12:00)
    т.е. "в лоб" нечто вроде:

    foreach ifItem in pIfTable do
     if IsItemInList(ifItem) then ОбновитьЭлементИОтметитьКакОбновлённый();
     else ДобавитьЭлементИОтметитьКакОбновлённый();
     end;
    end;
    ...
    foreach liItem in list do
     if НеОтмеченКакОбновлённый(liItem) then УдлалитьИзСписка(liItem); end;
    end;


    думаю, псевдокод понятен? %-)

    ---
    Do what thou wilt shall be the whole of the Law.
  • ob_kun (08.07.08 17:23) [56]
    Да нет, это как раз я понял. Я уже дописал вариант, но он падает, взгляни: (SubItems[3] - это скорость)


    procedure TForm2.tmrTimer(Sender: TObject);
    var
    dwSize : DWORD;
    dwRetVal : DWORD;
    i, j : Integer;
    pIfTable : PMibIfTable;
    pIfRow :  PMibIfRow; // pIfTable и dwSize вынесу позже в private
    begin
     New(pIfTable);
     if pIfTable = Nil then exit;
     dwSize := sizeOf(TMibIfTable);
     if GetIfTable(pIfTable, @dwSize, False) = ERROR_INSUFFICIENT_BUFFER then
     begin
       Dispose(pIfTable);
       GetMem(pIfTable, dwSize);  // иначе будет как-то глупо вновь писать New(pIfTable)
       if pIfTable = Nil then exit;
     end;
     dwRetVal := GetIfTable(pIfTable, @dwSize, False);
     if dwRetVal <> NO_ERROR then exit;
       for i := 0  to pIfTable.dwNumEntries-1 do
       begin
         if not Flag then begin
           with lv.Items.Add do
           begin
             Caption := Trim(pIfTable.Table[i].bDescr);
             // а тут дальнейшее заполнение
             SubItems.Add('');
             SubItems.Add('');
             SubItems.Add(SpeedToStr(pIfTable.Table[i].dwSpeed));
           end;
         end
         else
         begin
           for j := 0 to pIfTable.dwNumEntries-1 do
           begin
             if Trim(pIfTable.Table[j].bDescr)=lv.Items[j].Caption then
             begin
               lv.Items[j].SubItems[3] := SpeedToStr(pIfTable.Table[i].dwSpeed);
               exit;
             end;
           end;
         end;
       end;
       if not Flag then Flag := True;
    end;

  • ob_kun (08.07.08 17:30) [57]
    Подправил ошибки, но все равно бага.... правлю...
  • ketmar © (08.07.08 17:31) [58]
    >[56] ob_kun (2008-07-08 17:23:00)
    зачем тебе Flag? процесс заполнения/изменения списка абсолютно не зависит от того, вызвали ли его в первый раз или в сотый. в первый раз ветка «если ли уже всписке» просто всегда будет возвращать false — и что? пусть себе. алгоритм не меняется.

    алсо, с чего ты решил, что pIfTable.dwNumEntries и lv.Items.Count равны? это никак не гарантируется, нет такого обещания.

    почитай мой псевдокод внимательней, он совсем не то, что ты написал.

    ---
    All Your Base Are Belong to Us
  • ketmar © (08.07.08 17:32) [59]
    >[57] ob_kun (2008-07-08 17:30:00)
    бага для начала в логике.

    ---
    Understanding is not required. Only obedience.
  • ob_kun (08.07.08 17:35) [60]
    Так и есть, убедился эмпирически сейчас ;)

    > ОбновитьЭлементИОтметитьКакОбновлённый();

    как понять - отметить как обновленный?
  • ob_kun (08.07.08 17:36) [61]
    foreach ifItem in pIfTable do

    и откуда взялось ifItem?
  • ob_kun (08.07.08 17:47) [62]
    Кроме того, не совсем ясна твоя логика: смотри, вот у нас список
    1    5
    2    300
    3    44

    и если 1 есть, то обновим его и пометим как обновленный, если, скажем, 4 нету, то добавим и пометим как обновленный. А откуда ж тогда возьмутся необновленные?
  • ketmar © (08.07.08 17:53) [63]
    >[60] ob_kun (2008-07-08 17:35:00)
    >как понять — отметить как обновленный?

    у каждого элемента свой флажок «меня на этой итерации трогали».

    >[61] ob_kun (2008-07-08 17:36:00)
    >и откуда взялось ifItem?

    это переменная-итератор. в данном смысле конструкция foreach примерно так раскрывается:

    var
     a: array [1..10] of Integer;
     item: Integer;
     cnt: Integer;

    //foreach item in a do это:
    for cnt := 0 to High(a) do
     item := a[cnt];
     ….
    end;



    >[62] ob_kun (2008-07-08 17:47:00)
    >А откуда ж тогда возьмутся необновленные?

    пришёл марсианец и украл один сетевой интерфейс.

    ---
    Do what thou wilt shall be the whole of the Law.
  • ob_kun (08.07.08 17:56) [64]

    > у каждого элемента свой флажок «меня на этой итерации трогали».

    а флажок этот как реализуется?

    > это переменная-итератор.

    а тип у нее какой?
    > пришёл марсианец и украл один сетевой интерфейс.

    вот заразна душа)
  • ob_kun (08.07.08 17:59) [65]

    > а флажок этот как реализуется?

    неужто придется вводить доп лист, индексы которого соответствуют индексам в ListView?
  • ketmar © (08.07.08 18:00) [66]
    >[64] ob_kun (2008-07-08 17:56:00)
    >а флажок этот как реализуется?

    как программист захочет. главное, чтобы с каждым элементом был чётко связан свой флажок.

    >а тип у нее какой?
    посмотри на мой код-расшифровку внимательно.

    >вот заразна душа)
    — Цан, извини, а вот такие, с хоботками, это кто? — спросил Гедеван.
    — Никто. Фитюльки.
    — В каком смысле?
    — Во всех. Болтают, что они тут раньше, до плюкан жили.  Но это так… Треп.



    ---
    All Your Base Are Belong to Us
  • ketmar © (08.07.08 18:01) [67]
    >[65] ob_kun (2008-07-08 17:59:00)
    >неужто придется вводить доп лист, индексы которого соответствуют индексам в
    >ListView?

    у item есть чудное свойство data.

    ---
    All Your Base Are Belong to Us
  • ob_kun (08.07.08 18:06) [68]

    > посмотри на мой код-расшифровку внимательно.

    такое чувство, что коли все типа Integer, а pIfTable типа PMibIfTable, то и ifItem должна быть типа PMibIfTable ))))
  • ob_kun (08.07.08 18:10) [69]
    Свойство это типа Pointer, а как его припихнуть, на что сослаться - тоже вопрос....

    a = 1; // отмечен
    lv.Items[0].Data := @a;

    ?
  • ob_kun (08.07.08 18:12) [70]
    Или просто

    lv.Items[0].Data := Pointer(1);

    ...

    lv.Items[1].Data := Pointer(0);

    ?
  • ketmar © (08.07.08 18:25) [71]
    >[70] ob_kun (2008-07-08 18:12:00)
    вот это мысль верная. %-)

    >[68] ob_kun (2008-07-08 18:06:00)
    >такое чувство, что коли все типа Integer, а pIfTable типа PMibIfTable, то и ifItem
    >должна быть типа PMibIfTable ))))

    это потому, что в Delphi нет foreach. точнее, не было. %-) вот и непривычно. ничего, потом пригодится когда-нибудь.

    ---
    Understanding is not required. Only obedience.
  • ob_kun (08.07.08 23:42) [72]
    Так по поводу типа ifItem я верно угадал???
  • ob_kun (09.07.08 12:58) [73]
    Я просто не совсем понимаю, как переложить аналогию с массивом на структуру.
  • ketmar © (09.07.08 13:50) [74]
    >[73] ob_kun (2008-07-09 12:58:00)
    да пофигу. первый цикл у тебя верный, оставь тот псевдокод. я просто твой цикл короче переписал, потому что ленивый.

    ---
    All Your Base Are Belong to Us
  • ob_kun (09.07.08 14:01) [75]
    Ты имеешь ввиду, оставить for i := 0  to pIfTable.dwNumEntries-1 do
      begin
    ....

    ?
  • ketmar © (09.07.08 14:05) [76]
    >[75] ob_kun (2008-07-09 14:01:00)
    угу. это и есть foreach, только выраженый более многословно. %-)

    ---
    All Your Base Are Belong to Us
  • ob_kun (09.07.08 23:34) [77]
    Завтра постараюсь написать процедуру в более-менее нормальном варианте. Остался еще вопрос - как ты представляешь себе, что суть процедура IsItemInList ? Как она должна осуществлять поиск элемента? По имени интерфейса (добавить отображение wszName) ?
  • ketmar © (10.07.08 13:08) [78]
    >[77] ob_kun (2008-07-09 23:34:00)
    да хоть и так. или по адресу, например.

    ---
    All Your Base Are Belong to Us
  • ob_kun (10.07.08 13:35) [79]
    А есть какая-то возможность, чтобы поля в ListView были, но их не было видно? Или стоит просто писать в Tag у элементов первой колонки значение wszName?
  • ketmar © (10.07.08 14:18) [80]
    >[79] ob_kun (2008-07-10 13:35:00)
    а зачем ты вообще к полям привязался? у тебя вон целый pointer на что угодно без дела простаивает.

    ---
    All Your Base Are Belong to Us
  • ob_kun (10.07.08 14:55) [81]
    Pointer идет для отметки. А для идентификации наличия такого элемента?!
  • ob_kun (10.07.08 23:07) [82]
    Ау...
  • ob_kun (11.07.08 11:07) [83]
    Или есть еще какой-то вариант?
  • ketmar © (13.07.08 00:35) [84]
    >[83] ob_kun (2008-07-11 11:07:00)
    а что тут непонятного-то? поинтер, например, может указывать на структуру.

    ---
    All Your Base Are Belong to Us
  • ob_kun (14.07.08 14:18) [85]
    О! Точно, спасибо. Итак, я создаю

    type TIdentStruct = packed record
    Flag : Byte; // как я понимаю, хватит для 0 и 1 )
    Index : Integer; // решил использовать не wszName, а dwIndex
    end;

    так?
  • wl © (14.07.08 14:40) [86]
    > [84] ketmar ©   (13.07.08 00:35)

    мальчик никогда не видел ассемблера, ему непонятно, как в 4 байта упихать целую структуру. Лучше напиши ему всю программу, будет гораздо проще и быстрее
  • ketmar © (15.07.08 18:11) [87]
    >[86] wl © (2008-07-14 14:40:00)
    человек вполне поддаётся обучению, по моему. какой толк ему заклинания давать?

    >[85] ob_kun (2008-07-14 14:18:00)
    можно и так. это не важно. указателю пофигу, на что указывать. %-)

    ---
    All Your Base Are Belong to Us
  • ob_kun (16.07.08 00:22) [88]

    > wl ©   (14.07.08 14:40) [86]

    Вы правы, ассемблер я видел только в страшных промежутках программ asm...end; хотя о назначении JMP, JNZ и прочего я представление имею.... А по поводу полностью кода - это плохо, я сам хочу разбираться.
 
Конференция "Прочее" » Разбор кода подсчета трафика
Есть новые Нет новых   [134439   +49][b:0.001][p:0.005]