Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 74, средняя оценка - 4.89
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
#1

Инициализация статического массива - C++

08.05.2011, 23:37. Просмотров 9741. Ответов 45
Метки нет (Все метки)

Добрый вечер!
Допустим, что имеется класс
C++
1
2
3
4
5
6
7
class A
{
....
public:
static int array[];
....
};
Как инициализировать массив в stdafx.h, если в нём будет 700 элементов, вводимых не вручную?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2011, 23:37     Инициализация статического массива
Посмотрите здесь:

Инициализация статического массива - C++
Ребята, помогите пожалуйста. Не получается проинициализировать NULL-ами статиеский массив указателей. Пишет слудеющее (прикрепил скриншот)....

Инициализация статического поля - C++
Добрый день, как объяснить необходимость объявить все статические поля, даже те у которых есть конструктор по умолчанию, вне класса до...

Инициализация статического члена из шаблонного класса - C++
Добрый день. Есть код: template<int test> class Test { template<int a> struct Inner { static bool...

Инициализация константного статического объекта - члена класса - C++
Здравствуйте, у меня возникла проблема с инициализацией статического объекта, который является членом класса. Этот объект должен быть...

Инициализация статического члена std::vector в шаблонном классе - C++
есть класс myclass , владеющий классом struct template<class T> class myclass { struct mystruct {}; public: static...

Из статического массива в динамический - C++
Здравствуйте . Помогите , пожалуйста , переделать эту программу(сортировку) , чтобы она работала с динамическим массивом . #include...

Размер статического массива - C++
Можно ли задавть размер статического массива во время работы программы? Если нет, то почему?#include <iostream> using namespace std; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 23:56  [ТС]     Инициализация статического массива #16
Цитата Сообщение от Evg Посмотреть сообщение
Константность - это запрет на запись. К глобальности и универсальности имени вообще никакого отношения не имеет
Да, но меня заинтересовала фраза "статически инициализирована..". Что это значит?
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
10.05.2011, 08:17     Инициализация статического массива #17
Цитата Сообщение от alexsvk Посмотреть сообщение
Да, но меня заинтересовала фраза "статически инициализирована..". Что это значит?
Это значит НЕ в тексте исполняемой части программы. Другими словами, инициализация прямо в момент объявления (definition) переменной. Статическая в том смысле, что не динамическая

C
1
2
/* Статическая инициализация */
int const a = 5;
C
1
2
3
4
5
6
7
8
/* Динамическая инициализация. const нельзя */
int a;
 
int main (void)
{
  a = 5;
  ...
}
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
10.05.2011, 21:44  [ТС]     Инициализация статического массива #18
Немного отдалюсь от главной темы.
Что значит описатель volatile, его отличия от const?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
10.05.2011, 22:13     Инициализация статического массива #19
Цитата Сообщение от alexsvk Посмотреть сообщение
Что значит описатель volatile, его отличия от const?
Это вообще два разных ключевых слова, о различиях говорить бессмысленно.
По идее ключевое слово volatile должно запрещать оптимизацию переменной. Подразумевается, что переменная может быть изменена внешне, чем-то еще кроме текущего исполняемого кода. Компилятор обязан выполнять все указанные действия над переменной, отмеченной как volatile.
const - это запрет на изменение (запись).
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
10.05.2011, 22:15  [ТС]     Инициализация статического массива #20
Не достаточно ясное объяснение...
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
10.05.2011, 22:23     Инициализация статического массива #21
Не помню точную формулировку, но с точки зрения стандарты выглядит что-то типа такого. Все обращения (чтение и запись) к переменной volatile должны быть ровно в том количестве и ровно в том порядке, как это вытекает из исходника. Такое же соотношение должно соблюдаться и между разными обращениями к volatile: т.е. чтения и записи различных volatile объектов или обращений по указателям нельзя переставлять и оптимизировать

Если есть, к примеру, исходник:

C
1
2
3
4
5
6
7
8
9
10
vaoltile int x;
volatile int y;
 
x = 0;
y = 0;
for (i = 0; i < 10; i++)
{
  x++;
  y++;
}
То без модификатора volatile оптимизатор превратил бы этот код в

C
1
2
x = 10;
y = 10;
но с volatile оптимизатор не может сделать вообще ничего. Даже переставить местами обращение к x и y.

volatile обычно используют для адресов, которые являются портами ввода-вывода (т.е. являются не обычной памятью, а связанной с аппаратурой). Чтение из такого адреса может поменять состояние порта ввода-вывода, а потому компилятор не должен ничего оптимизировать с такими обращениями
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
12.05.2011, 20:48  [ТС]     Инициализация статического массива #22
Evg, значит volatile была создан сугубо радио определённых целей, связанных с аппаратурой?
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
12.05.2011, 21:48     Инициализация статического массива #23
Цитата Сообщение от alexsvk Посмотреть сообщение
Evg, значит volatile была создан сугубо радио определённых целей, связанных с аппаратурой?
Грубо говоря, да. Си проектировался как замена ассемблера, т.е. язык по сути низкого уровня
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
12.05.2011, 21:59  [ТС]     Инициализация статического массива #24
C++
1
2
3
4
5
6
7
8
9
*.h
...
const wchar_t lpszClassName[];
...
 
*.cpp
#include *.h
const wchar_t cWnd::lpszClassName [] ="habadubada";
...
Результат:
>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\listing_2\cwnd.h(20): warning C4200: nonstandard extension used : zero-sized array in struct/union
1> Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\listing_2\cwnd.cpp(3): error C2761: 'const wchar_t cWnd::lpszClassName[]' : member function redeclaration not allowed

т.е. инициализация не static полей вне объявления класса невозможна?
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
12.05.2011, 23:07     Инициализация статического массива #25
"nonstandard extension used : zero-sized array in struct/union"
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
12.05.2011, 23:24  [ТС]     Инициализация статического массива #26
Цитата Сообщение от Evg Посмотреть сообщение
"nonstandard extension used : zero-sized array in struct/union"
ага, значит указание размера обязательно по текущему стандарту?

Хм...
C++
1
2
*.h
const wchar_t lpszClassName [10] = L"cWndClass";
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\listing_2\cwnd.h(20): error C2864: 'cWnd::lpszClassName' : only static const integral data members can be initialized within a class
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\listing_2\cwnd.cpp(10): error C2439: 'cWnd::lpszClassName' : member could not be initialized
1> c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\listing_2\cwnd.h(20) : see declaration of 'cWnd::lpszClassName'
1> Hello2.cpp
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\listing_2\cwnd.h(20): error C2864: 'cWnd::lpszClassName' : only static const integral data members can be initialized within a class
1> Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
13.05.2011, 09:56     Инициализация статического массива #27
В .h надо extern указывать. Без extern у тебя описание (declaration) превратилось в определение (definition). И именно про это место выдавалась ошибка из поста #24 (если внимательно посмотреть на привязку ошибки к исходнику)
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
13.05.2011, 11:49  [ТС]     Инициализация статического массива #28
Цитата Сообщение от Evg Посмотреть сообщение
В .h надо extern указывать. Без extern у тебя описание (declaration) превратилось в определение (definition). И именно про это место выдавалась ошибка из поста #24 (если внимательно посмотреть на привязку ошибки к исходнику)
Но extern - аналог static. Почему при указании static на сработало?
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
13.05.2011, 11:54     Инициализация статического массива #29
extern ни разу не аналог static - кто это вам сказал?
static - это прямое указание размещения переменной в static storage. А extern - это указание о том, что в данной единице трансляции переменная не определена. Это линкер найдет ее в другом модуле и "подклеит".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2011, 12:02     Инициализация статического массива
Еще ссылки по теме:

Обнуление статического массива - C++
Нужна помощь с обнулением массива,который записан в файл и выведен на экран Надо его обнулить и снова записать в файл и на экран вывести ...

Передача статического массива в функцию - C++
Подскажите как передать двумерный статический массив в функцию void func(int arr); void main(){ const int s=5; int arr; ...

Стек на базе статического массива - C++
Здравствуйте помогите, верней напишите за меня пожалуйста стек на базе статического массива. требования для массива: 1)тип элементов -...

Очередь на основе статического массива - C++
в очередь с экрана вводятся строки,когда вводится строка end,элементы извлекаются из очереди и записываются в файл. xD.h #include...

Автоматическое заполнение статического массива - C++
Ребят, хэлп! Мне нужно для статистического массива, заполненного рандомно (через randomize()), создать новый внутренний (в main()), в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
13.05.2011, 12:02  [ТС]     Инициализация статического массива #30
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
extern ни разу не аналог static - кто это вам сказал?
static - это прямое указание размещения переменной в static storage. А extern - это указание о том, что в данной единице трансляции переменная не определена. Это линкер найдет ее в другом модуле и "подклеит".
Массивы в заголовочных файлах
39 пост
Yandex
Объявления
13.05.2011, 12:02     Инициализация статического массива
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru