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

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

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

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

08.05.2011, 23:37. Просмотров 9420. Ответов 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++
Максимальная размерность статического массива C++
C++ Очередь на основе статического массива
Размер статического массива C++
Стек на базе статического массива C++
C++ Инициализация константного статического объекта - члена класса
Инициализация статического члена std::vector в шаблонном классе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mansp
18 / 18 / 0
Регистрация: 07.11.2010
Сообщений: 136
08.05.2011, 23:51     Инициализация статического массива #2
дык можно в конструкторе.... ну и лучше сразу пропиши тогда int array[700] или же сделай его динамичным и в констркторе выдели память и заполни
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
09.05.2011, 00:39     Инициализация статического массива #3
mansp, В конструкторе статику придерживаясь текущего стандарта? Ну-ну
alexsvk
8 / 8 / 1
Регистрация: 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 ==========
Evg
Эксперт CАвтор FAQ
17275 / 5529 / 345
Регистрация: 30.03.2009
Сообщений: 15,041
Записей в блоге: 26
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];
Почитай ещё этот пост (да и всю ту тему) Массивы в заголовочных файлах
alexsvk
8 / 8 / 1
Регистрация: 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
Evg
Эксперт CАвтор FAQ
17275 / 5529 / 345
Регистрация: 30.03.2009
Сообщений: 15,041
Записей в блоге: 26
09.05.2011, 16:16     Инициализация статического массива #7
Цитата Сообщение от alexsvk Посмотреть сообщение
Выводятся нули, т.е. ф-ция initDaysTillJan1() не сработала
А ты её вообще запускал?
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 16:18  [ТС]     Инициализация статического массива #8
Цитата Сообщение от Evg Посмотреть сообщение
А ты её вообще запускал?
Выше подправил пост.
Evg
Эксперт CАвтор FAQ
17275 / 5529 / 345
Регистрация: 30.03.2009
Сообщений: 15,041
Записей в блоге: 26
09.05.2011, 16:33     Инициализация статического массива #9
Так объяви функцию в файле *.cpp, а не *.h.

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

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

C++ Из статического массива в динамический
Инициализация статического поля C++
Инициализация статического массива C++
Инициализация статического члена из шаблонного класса C++
C++ Обнуление статического массива

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

Или воспользуйтесь поиском по форуму:
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
10.05.2011, 22:15  [ТС]     Инициализация статического массива #20
Не достаточно ясное объяснение...
Yandex
Объявления
10.05.2011, 22:15     Инициализация статического массива
Ответ Создать тему
Опции темы

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