Помогите пожалуйста разобраться с массивом структур точнее с моим кодом при нажатии на кнопку должен появиться меседжбокс с именем выбранного сервера, но появляется всегда с именем сервера который находится на самом верху PHP: struct serverinfo { char *name; short int port; char *ipadres; }; PHP: serverinfo *ServerInfo; PHP: void test() { ServerInfo = new serverinfo[100]; for( int servers = 0; n >= 6; n -= 6, p += 6 ) { ServerInfo[servers].ipadres = ipadres; ServerInfo[servers].port = port; ServerInfo[servers].name = firsthdr->name; m_serverlist.AddString( ServerInfo[servers].name ); servers++; } } PHP: void CGuiSteamListDlg::OnButton2() { UpdateData( TRUE ); int idx = m_serverlist.GetCurSel(); AfxMessageBox(ServerInfo[idx].name); }
ну во первых в строках 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, а в лисбоксе индексы последовательные. Это главный минус смешения структуры данных(твоего массива) с отображением(листбокс). Правильным делать нада по другому. Считываешь строку из листбокса, делаешь функцию поиска в массиве по ключу, передаешь ей считанную строку, ищешь элемент и выводишь. Прямое связывание порядка в двух разныых списках это оооооочень бажно.
Ra$cal, ок сделал PHP: m_serverlist.InsertString(servers, ServerInfo[servers].name ); теперь список серверов отображается в правильном порядке да конечно это набросок кода я сделал PHP: AfxMessageBox(ServerInfo[12].name); и пришел к выводу что в не зависимости от индекса ServerInfo всегда возвращает один и тот же результат
результат один и тот же потому что ты передаешь указатель. измени структуру на struct serverinfo { char name[100]; short int port; char ipadres[15]; }; и в цикле заполнения копируй туда строки через strcpy. иначе ты во всех элементах ссылаешься на один и тот же участок памяти. угадай, что это даст при изменении содержимого этого блока памяти =)