Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
Массив стрктур, Listbox и другое C++ |

12.06.2009, 19:19
|
|
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме: 1059196
Репутация:
39
|
|
Массив стрктур, Listbox и другое C++
Помогите пожалуйста разобраться с массивом структур
точнее с моим кодом
при нажатии на кнопку должен появиться меседжбокс с именем выбранного сервера, но появляется всегда с именем сервера который находится на самом верху
PHP код:
struct serverinfo
{
char *name;
short int port;
char *ipadres;
};
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);
}
Последний раз редактировалось fire64; 12.06.2009 в 19:23..
|
|
|

13.06.2009, 03:13
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
ну во первых в строках 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, а в лисбоксе индексы последовательные. Это главный минус смешения структуры данных(твоего массива) с отображением(листбокс). Правильным делать нада по другому. Считываешь строку из листбокса, делаешь функцию поиска в массиве по ключу, передаешь ей считанную строку, ищешь элемент и выводишь. Прямое связывание порядка в двух разныых списках это оооооочень бажно.
|
|
|

13.06.2009, 11:55
|
|
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме: 1059196
Репутация:
39
|
|
Ra$cal, ок сделал
PHP код:
m_serverlist.InsertString(servers, ServerInfo[servers].name );
теперь список серверов отображается в правильном порядке
да конечно это набросок кода
я сделал
PHP код:
AfxMessageBox(ServerInfo[12].name);
и пришел к выводу что в не зависимости от индекса ServerInfo всегда возвращает один и тот же результат
|
|
|

13.06.2009, 16:44
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
результат один и тот же потому что ты передаешь указатель. измени структуру на
struct serverinfo
{
char name[100];
short int port;
char ipadres[15];
};
и в цикле заполнения копируй туда строки через strcpy. иначе ты во всех элементах ссылаешься на один и тот же участок памяти. угадай, что это даст при изменении содержимого этого блока памяти =)
|
|
|

13.06.2009, 18:56
|
|
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме: 1059196
Репутация:
39
|
|
Ra$cal, огромнейшее спасибо
теперь все работает
Последний раз редактировалось fire64; 13.06.2009 в 19:07..
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|