Массив стрктур, Listbox и другое C++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fire64, 12 Jun 2009.

  1. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Помогите пожалуйста разобраться с массивом структур

    точнее с моим кодом

    при нажатии на кнопку должен появиться меседжбокс с именем выбранного сервера, но появляется всегда с именем сервера который находится на самом верху

    PHP:
    struct serverinfo 
    {
        
    char *name;
        
    short int port;
        
    char *ipadres;
    };
    PHP:
    serverinfo *ServerInfo;
    PHP:
    void test()
    {

        
    ServerInfo = new serverinfo[100];

        for( 
    int servers 0>= 6-= 6+= )
        {

            
    ServerInfo[servers].ipadres ipadres;
            
    ServerInfo[servers].port port;
            
    ServerInfo[servers].name firsthdr->name;
            
    m_serverlist.AddStringServerInfo[servers].name );
            
    servers++;
        }



    }
    PHP:
    void CGuiSteamListDlg::OnButton2() 
    {
        
    UpdateDataTRUE );

        
    int idx m_serverlist.GetCurSel();

        
    AfxMessageBox(ServerInfo[idx].name);
    }
     
    #1 fire64, 12 Jun 2009
    Last edited: 12 Jun 2009
  2. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    ну во первых в строках ServerInfo[servers].ipadres = ipadres; ты в цикле всем задаешь указатель на одну строку. но если допустить, что это просто набросок, то.

    int idx = m_serverlist.GetCurSel();

    AfxMessageBox(ServerInfo[idx].name);

    ты получаешь индекс в листбоксе. во первых, я не уверен что порядок добавления верный. нужно использовать InsertString(-1, ...) вместо AddString. Точно не помню, но нужно внимательно посмотреть, какой порядок у записей. ВО вторых for( int servers = 0; n >= 6; n -= 6, p += 6 ) заполнение массива идет с шагом в 6, а в лисбоксе индексы последовательные. Это главный минус смешения структуры данных(твоего массива) с отображением(листбокс). Правильным делать нада по другому. Считываешь строку из листбокса, делаешь функцию поиска в массиве по ключу, передаешь ей считанную строку, ищешь элемент и выводишь. Прямое связывание порядка в двух разныых списках это оооооочень бажно.
     
  3. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Ra$cal, ок сделал

    PHP:
    m_serverlist.InsertString(serversServerInfo[servers].name );
    теперь список серверов отображается в правильном порядке


    да конечно это набросок кода


    я сделал

    PHP:
    AfxMessageBox(ServerInfo[12].name);
    и пришел к выводу что в не зависимости от индекса ServerInfo всегда возвращает один и тот же результат
     
  4. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    результат один и тот же потому что ты передаешь указатель. измени структуру на

    struct serverinfo
    {
    char name[100];
    short int port;
    char ipadres[15];
    };

    и в цикле заполнения копируй туда строки через strcpy. иначе ты во всех элементах ссылаешься на один и тот же участок памяти. угадай, что это даст при изменении содержимого этого блока памяти =)
     
    1 person likes this.
  5. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Ra$cal, огромнейшее спасибо

    теперь все работает
     
    #5 fire64, 13 Jun 2009
    Last edited: 13 Jun 2009
    1 person likes this.