Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.78/59: Рейтинг темы: голосов - 59, средняя оценка - 4.78
alexsvk
8 / 8 / 0
Регистрация: 15.07.2010
Сообщений: 255
1

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

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

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

Инициализация статического массива
Ребята, помогите пожалуйста. Не получается проинициализировать NULL-ами...

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

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

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

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

45
mansp
18 / 18 / 7
Регистрация: 07.11.2010
Сообщений: 136
08.05.2011, 23:51 2
дык можно в конструкторе.... ну и лучше сразу пропиши тогда int array[700] или же сделай его динамичным и в констркторе выдели память и заполни
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
09.05.2011, 00:39 3
mansp, В конструкторе статику придерживаясь текущего стандарта? Ну-ну
0
alexsvk
8 / 8 / 0
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 10:42  [ТС] 4
Сделал следующее в stdafx.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void initDaysTillJan1()
{
    int j, i;
    Date::DAYS_TILL_JAN1 [0] = 0;
    for(i = 1, j = 1800; i < 700; ++i, ++j)
    {
        if(j%4 == 0 && j%100 != 0)
            Date::DAYS_TILL_JAN1 [i] = Date::DAYS_TILL_JAN1 [i-1] + 366;
        else
            if(j%4 == 0 && j%100 == 0 && j%400 == 0)
                Date::DAYS_TILL_JAN1 [i] = Date::DAYS_TILL_JAN1 [i-1] + 366;
            else
                Date::DAYS_TILL_JAN1 [i] = Date::DAYS_TILL_JAN1 [i-1] + 365;
    }
};
В результате:
1>Date.obj : error LNK2001: unresolved external symbol "public: static int * Date:AYS_TILL_JAN1" (?DAYS_TILL_JAN1@Date@@2PAHA)
1>stdafx.obj : error LNK2001: unresolved external symbol "public: static int * Date:AYS_TILL_JAN1" (?DAYS_TILL_JAN1@Date@@2PAHA)
1>C:\Users\AlexSvk\Documents\Visual Studio 2010\Projects\M_A_WEISS\chapter_2\2-23\Debug\2-23.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
0
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
09.05.2011, 15:27 5
Если Date и DAYS_TILL_JAN1 второго исходника есть A и array первого исходника, то тебе нужно где-то ещё и определить (define) массив, потому как static объявление переменной в теле класса - это только описание (declare)

Т.е.

C++
1
2
3
4
5
6
7
8
9
10
// Это, грубо говоря, в файле *.h
class Date
{
  ...
  static int DAYS_TILL_JAN1[700];
  ...
};
 
// Это, грубо говоря, в файле *.cpp
int Date::DAYS_TILL_JAN1[700];
Почитай ещё этот пост (да и всю ту тему) Массивы в заголовочных файлах
0
alexsvk
8 / 8 / 0
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 16:14  [ТС] 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
class Date
{
public:
    Date(int y = FIRST_YEAR, int m = 1, int d = 1);
    ~Date();
 
    const Date& operator+=(const Date&);
    int operator-(const Date&);
    int operator+(const int);
    bool operator<(const Date&);
 
    static int DAYS_TILL_FIRST_OF_MONTH[];
    static int DAYS_TILL_JAN1[700];
 
    bool isLeapYear(int) const;
private:
    enum {FIRST_YEAR = 1800, MAX_YEAR = 2500};
    int totalDays;
};
 
std::istream& operator>>(std::istream&, Date&);
std::ostream& operator<<(std::ostream&, const Date&);
.cpp
C++
1
2
3
4
5
6
#include "StdAfx.h"
#include "Date.h"
 
int Date::DAYS_TILL_JAN1[700];
int Date::DAYS_TILL_FIRST_OF_MONTH [] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
...
stdafx.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// stdafx.h : in    clude file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
 
#pragma once
 
#include "targetver.h"
 
#include <stdio.h>
#include <tchar.h>
#include <iostream>
 
#include "Date.h"
 
 
 
void initDaysTillJan1()
{
    int j, i;
    Date::DAYS_TILL_JAN1 [0] = 0;
    for(i = 1, j = 1800; i < 700; ++i, ++j)
    {
        if(j%4 == 0 && j%100 != 0)
            Date::DAYS_TILL_JAN1 [i] = Date::DAYS_TILL_JAN1 [i-1] + 366;
        else
            if(j%4 == 0 && j%100 == 0 && j%400 == 0)
                Date::DAYS_TILL_JAN1 [i] = Date::DAYS_TILL_JAN1 [i-1] + 366;
            else
                Date::DAYS_TILL_JAN1 [i] = Date::DAYS_TILL_JAN1 [i-1] + 365;
    }
};
Вывожу все элементы массива Date:AYS_TILL_JAN1. Выводятся нули, т.е. ф-ция initDaysTillJan1() не сработала.

Ах, да, если вызываю ф-цию в main'е, то следующая хрень в итоге:
2-23.obj : error LNK2005: "void __cdecl initDaysTillJan1(void)" (?initDaysTillJan1@@YAXXZ) already defined in stdafx.obj
0
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
09.05.2011, 16:16 7
Цитата Сообщение от alexsvk Посмотреть сообщение
Выводятся нули, т.е. ф-ция initDaysTillJan1() не сработала
А ты её вообще запускал?
0
alexsvk
8 / 8 / 0
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 16:18  [ТС] 8
Цитата Сообщение от Evg Посмотреть сообщение
А ты её вообще запускал?
Выше подправил пост.
0
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
09.05.2011, 16:33 9
Так объяви функцию в файле *.cpp, а не *.h.

Хотя на мой взгляд куда логичнее было бы в Date создать статический метод для инициализации массива, чем сбоку рисовать функцию initDaysTillJan1
2
alexsvk
8 / 8 / 0
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 16:58  [ТС] 10
Цитата Сообщение от Evg Посмотреть сообщение
Так объяви функцию в файле *.cpp, а не *.h.

Хотя на мой взгляд куда логичнее было бы в Date создать статический метод для инициализации массива, чем сбоку рисовать функцию initDaysTillJan1
Почему статический метод, разве это критично?
0
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
09.05.2011, 18:42 11
Цитата Сообщение от alexsvk Посмотреть сообщение
Почему статический метод, разве это критично?
Нестатический метод как бы содержит this и как бы требует объекта. В данном случае сие не нужно и как бы потребуется создавать объект, чтобы запустить нестатический метод.
1
alexsvk
8 / 8 / 0
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 19:01  [ТС] 12
Допустим, в классе есть поле
static const int array[];
При инициализации оного, снимая в цикле константность с помощью оператора приведения типа, вернётся ли константность для каждого элемента после?
0
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
09.05.2011, 19:09 13
То, что помечено как const, может быть только явным образом статически проинциаилизировано. В коды ты уже проинициализировать не сможешь. Я согласен с тем, что возможность заманчивая, когда можно динамически проинициализировать, а потом сказать, что это будет const, но сие в языке низкого уровня не реализуемо
0
alexsvk
8 / 8 / 0
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 19:19  [ТС] 14
Цитата Сообщение от Evg Посмотреть сообщение
То, что помечено как const, может быть только явным образом статически проинциаилизировано.
Это связано с тем, что константе свойственны глобальность и уникальность имени?
0
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
09.05.2011, 23:01 15
Константность - это запрет на запись. К глобальности и универсальности имени вообще никакого отношения не имеет
0
alexsvk
8 / 8 / 0
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 23:56  [ТС] 16
Цитата Сообщение от Evg Посмотреть сообщение
Константность - это запрет на запись. К глобальности и универсальности имени вообще никакого отношения не имеет
Да, но меня заинтересовала фраза "статически инициализирована..". Что это значит?
0
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
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;
  ...
}
1
alexsvk
8 / 8 / 0
Регистрация: 15.07.2010
Сообщений: 255
10.05.2011, 21:44  [ТС] 18
Немного отдалюсь от главной темы.
Что значит описатель volatile, его отличия от const?
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
10.05.2011, 22:13 19
Цитата Сообщение от alexsvk Посмотреть сообщение
Что значит описатель volatile, его отличия от const?
Это вообще два разных ключевых слова, о различиях говорить бессмысленно.
По идее ключевое слово volatile должно запрещать оптимизацию переменной. Подразумевается, что переменная может быть изменена внешне, чем-то еще кроме текущего исполняемого кода. Компилятор обязан выполнять все указанные действия над переменной, отмеченной как volatile.
const - это запрет на изменение (запись).
0
alexsvk
8 / 8 / 0
Регистрация: 15.07.2010
Сообщений: 255
10.05.2011, 22:15  [ТС] 20
Не достаточно ясное объяснение...
0
10.05.2011, 22:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2011, 22:15

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

Размер статического массива
Можно ли задавть размер статического массива во время работы программы? Если...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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