Подскажите, как создавать статический массив!
Подскажите пожалуйста. У меня есть диалоговое окно, на нём выпадающие списки - ComboBox . Каждый список описывается своим Case в оконной процедуре. Значения передаю в динамический массив (double massiv = new double[21]). А затем, при нажатии кнопки обработать (тоже описывается своим Case) мне нужен заполненный массив значений, но массив уже изменил адрес! Я понимаю, что он динамический, но как тогда делать такой, чтобы он был неразрывным, и имел постоянное место в памяти? Огромное спасиБог за ответ!
- Ничего не понял. от CassandraDied, 11 июня 2012 года
Хотя есть вариант получше: выделять память под массив и сохранять адрес в свойствах окна списка. Вот пример:
Код:
//Получили память под 21 элемент массива
double *hMem=(double *)GlobalAlloc(LPTR,sizeof(double)*21);
//Сохраним его в свойствах окна
SetProp(hWndList,L"#HMEM#",(HANDLE)hMem);
//Тут получим адрес массива из свойств окна
double *hM=(double *)GetProp(hWndList,L"#HMEM#");
double *hMem=(double *)GlobalAlloc(LPTR,sizeof(double)*21);
//Сохраним его в свойствах окна
SetProp(hWndList,L"#HMEM#",(HANDLE)hMem);
//Тут получим адрес массива из свойств окна
double *hM=(double *)GetProp(hWndList,L"#HMEM#");
Если вы пишете на .NET - то у каждого контрола есть свойство Tag - туда и присваивайте при загрузке новосозданный массив. Вот пример (С++/CLI):
Код:
//создаем переменную для массива
cli::array<System::Double> ^arr;
//Создаем массив и сразу же присваиваем его свойству Tag списка
this->comboBox1->Tag=gcnew cli::array<System::Double>(21);
//Для удобства получаем ссылку на него
arr=(cli::array<System::Double> ^)this->comboBox1->Tag;
//Заполняем в цикле весь массив (попутно внося значения в список)
for(System::UInt32 i=0;i<21;i++){
arr[i]=System::Convert::ToDouble(i);
this->comboBox1->Items->Add(arr[i].ToString());
}
//В принципе, все
//************************************
//Произошло чудо и мы щелкнули кнопку на форме
//Получим ссылку на массив, который создали при загрузке (прочитаем из свойства Tag списка)
cli::array<System::Double> ^arr=(cli::array<System::Double> ^)this->comboBox1->Tag;
//В строку будем собирать все значения массива - чтобы потом показать их миру
System::String ^strMsg=L"";
//Идем в цикле по массиву
for(System::UInt32 i=0;i<21;i++){
//И сохраняем в строке очередное значение
strMsg+=System::Convert::ToString(arr[i])+L"\n";
}
//Покажем их все
System::Windows::Forms::MessageBox::Show(strMsg);
cli::array<System::Double> ^arr;
//Создаем массив и сразу же присваиваем его свойству Tag списка
this->comboBox1->Tag=gcnew cli::array<System::Double>(21);
//Для удобства получаем ссылку на него
arr=(cli::array<System::Double> ^)this->comboBox1->Tag;
//Заполняем в цикле весь массив (попутно внося значения в список)
for(System::UInt32 i=0;i<21;i++){
arr[i]=System::Convert::ToDouble(i);
this->comboBox1->Items->Add(arr[i].ToString());
}
//В принципе, все
//************************************
//Произошло чудо и мы щелкнули кнопку на форме
//Получим ссылку на массив, который создали при загрузке (прочитаем из свойства Tag списка)
cli::array<System::Double> ^arr=(cli::array<System::Double> ^)this->comboBox1->Tag;
//В строку будем собирать все значения массива - чтобы потом показать их миру
System::String ^strMsg=L"";
//Идем в цикле по массиву
for(System::UInt32 i=0;i<21;i++){
//И сохраняем в строке очередное значение
strMsg+=System::Convert::ToString(arr[i])+L"\n";
}
//Покажем их все
System::Windows::Forms::MessageBox::Show(strMsg);
Дружище спасибо, работает. Я правда работаю на WInApi с Net пока не работал, но всё равно помогло)