Как задать размер массива объектов, через переменную?
От: The_Wizzer Узбекистан  
Дата: 05.07.03 08:06
Оценка:
Привет!

Имеется такой код:

char NumberOfSectionsToShow_buf[255]; memset (NumberOfSectionsToShow_buf,0,255);

GetPrivateProfileString("SETTINGS","NumberOfSectionsToShow","",NumberOfSectionsToShow_buf,255,".\\Panel.ini");


const int NumberOfSectionsToShow=atoi(NumberOfSectionsToShow_buf);

SettingsClass Sets[NumberOfSectionsToShow];
^^^^^^^^^^^^^^^^^^^^^^
ЗДЕСЬ ПРОБЛЕМА!

Ругается типа, что не знаю размер для инициализации
если прописываю статически, все ок.

const int NumberOfSectionsToShow=5;
SettingsClass Sets[NumberOfSectionsToShow];


Как же можно проинитить динамически?

Заранее спасибо.
Re: перенаправление стандартного вывода
От: GarikTot  
Дата: 05.07.03 08:38
Оценка: 2 (1)
Здравствуйте, The_Wizzer, Вы писали:


T_W> SettingsClass Sets[NumberOfSectionsToShow];


T_W>Как же можно проинитить динамически?


Нельзя создать на стеке массив, размер которого заранее неизвестен
Единственный выход, видимо, выделять память из кучи
Хотя я могу и ошибаться
Re[2]: перенаправление стандартного вывода
От: Alexmoon Украина  
Дата: 05.07.03 10:39
Оценка:
Здравствуйте, GarikTot, Вы писали:

GT>Здравствуйте, The_Wizzer, Вы писали:



T_W>> SettingsClass Sets[NumberOfSectionsToShow];


T_W>>Как же можно проинитить динамически?


GT>Нельзя создать на стеке массив, размер которого заранее неизвестен

GT>Единственный выход, видимо, выделять память из кучи
GT>Хотя я могу и ошибаться

ты не ошибаешся. Компилятор сначала выделяет память под глобальные объекты в стеке, а потом последовательно их инициализирует и в данном случае и получается неопределенная длинна. Позаносить значения переменных потом в качестве параметров можно, тут уже если я не ошибаюсь, а вот при подобного рода задании размеров извини.
Re[3]: перенаправление стандартного вывода
От: Alexmoon Украина  
Дата: 05.07.03 11:04
Оценка:
Здравствуйте, Alexmoon, Вы писали:

A>Здравствуйте, GarikTot, Вы писали:


GT>>Здравствуйте, The_Wizzer, Вы писали:


int i = 0;
int f() {return ++i};

//вот такой код надеюсь нормальный компилятор пропустит и даже как мы ожидали проинициализирует
int array[2] = {f(), f()};//{1,2}
//а вот такой фиг, хотя мы возможно и догадываемся о размере массива
int array1[i] = {f(), f()};//{3,4}
//вот это уже правильная его интерпритация
int array1[2] = {f(), f()};//{3,4}


надеюсь краткий смысл инициализации в подобном случае продемонстрировал
Re: Как задать размер массива объектов, через переменную?
От: Saddam Россия http://saddam.narod.ru
Дата: 06.07.03 09:44
Оценка: 1 (1)
Здравствуйте, The_Wizzer, Вы писали:

T_W>Имеется такой код:


T_W> char NumberOfSectionsToShow_buf[255]; memset (NumberOfSectionsToShow_buf,0,255);


T_W> GetPrivateProfileString("SETTINGS","NumberOfSectionsToShow","",NumberOfSectionsToShow_buf,255,".\\Panel.ini");



T_W> const int NumberOfSectionsToShow=atoi(NumberOfSectionsToShow_buf);


T_W> SettingsClass Sets[NumberOfSectionsToShow];

T_W> ^^^^^^^^^^^^^^^^^^^^^^
T_W> ЗДЕСЬ ПРОБЛЕМА!

T_W>Ругается типа, что не знаю размер для инициализации

T_W> если прописываю статически, все ок.

T_W> const int NumberOfSectionsToShow=5;

T_W> SettingsClass Sets[NumberOfSectionsToShow];


T_W>Как же можно проинитить динамически?


SettingsClass *Sets=new SettingsClass[NumberOfSectionsToShow];
....
работаем  с ним
.....
delete[] Sets;
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Re[2]: Как задать размер массива объектов, через переменную?
От: The_Wizzer Узбекистан  
Дата: 07.07.03 10:29
Оценка:
Здравствуйте, Saddam, Вы писали:


S>Здравствуйте, The_Wizzer, Вы писали:


T_W>>Имеется такой код:


T_W>> char NumberOfSectionsToShow_buf[255]; memset (NumberOfSectionsToShow_buf,0,255);


T_W>> GetPrivateProfileString("SETTINGS","NumberOfSectionsToShow","",NumberOfSectionsToShow_buf,255,".\\Panel.ini");



T_W>> const int NumberOfSectionsToShow=atoi(NumberOfSectionsToShow_buf);


T_W>> SettingsClass Sets[NumberOfSectionsToShow];

T_W>> ^^^^^^^^^^^^^^^^^^^^^^
T_W>> ЗДЕСЬ ПРОБЛЕМА!

T_W>>Ругается типа, что не знаю размер для инициализации

T_W>> если прописываю статически, все ок.

T_W>> const int NumberOfSectionsToShow=5;

T_W>> SettingsClass Sets[NumberOfSectionsToShow];


T_W>>Как же можно проинитить динамически?


S>
S>SettingsClass *Sets=new SettingsClass[NumberOfSectionsToShow];
S>....
S>работаем  с ним
S>.....
S>delete[] Sets;

S>


Возможно и так, но при попытки переделать уже имеющийся код, я столкнулся с массой ошибок компиляции и др.
Короче выход я нашел такой:

vector <SettingsClass> SectionSettings;

SectionSettings.resize(NumberOfSectionsToShow);

и дальше просто SectionSettings[x] , где х- нужный элемент, и ВСЕ.
Проверено, в программе, которая в одном ЛистКонтроле, по выбору пользователя показывает, различные секции с иконками
все работает отлично.

Все равно спасибо...
Re[3]: Как задать размер массива объектов, через переменную?
От: Saddam Россия http://saddam.narod.ru
Дата: 07.07.03 10:39
Оценка:
Здравствуйте, The_Wizzer, Вы писали:

S>>
S>>SettingsClass *Sets=new SettingsClass[NumberOfSectionsToShow];
S>>....
S>>работаем  с ним
S>>.....
S>>delete[] Sets;

S>>


T_W>Возможно и так, но при попытки переделать уже имеющийся код, я столкнулся с массой ошибок компиляции и др.

T_W>Короче выход я нашел такой:

T_W>vector <SettingsClass> SectionSettings;


T_W>SectionSettings.resize(NumberOfSectionsToShow);


T_W>и дальше просто SectionSettings[x] , где х- нужный элемент, и ВСЕ.

T_W>Проверено, в программе, которая в одном ЛистКонтроле, по выбору пользователя показывает, различные секции с иконками
T_W>все работает отлично.
Дело в том, что при конструировании вектора делается malloc, а потом при resize — realloc, что занимает приличное время. Если оптимиззация по скорости не волнует — можно и resize.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.