Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/95: Рейтинг темы: голосов - 95, средняя оценка - 4.58
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255

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

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

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Допустим, что имеется класс
C++
1
2
3
4
5
6
7
class A
{
....
public:
static int array[];
....
};
Как инициализировать массив в stdafx.h, если в нём будет 700 элементов, вводимых не вручную?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.05.2011, 23:37
Ответы с готовыми решениями:

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

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

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

45
18 / 18 / 7
Регистрация: 07.11.2010
Сообщений: 136
08.05.2011, 23:51
дык можно в конструкторе.... ну и лучше сразу пропиши тогда int array[700] или же сделай его динамичным и в констркторе выдели память и заполни
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.05.2011, 00:39
mansp, В конструкторе статику придерживаясь текущего стандарта? Ну-ну
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 10:42  [ТС]
Сделал следующее в 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
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.05.2011, 15:27
Если 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
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 16:14  [ТС]
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
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.05.2011, 16:16
Цитата Сообщение от alexsvk Посмотреть сообщение
Выводятся нули, т.е. ф-ция initDaysTillJan1() не сработала
А ты её вообще запускал?
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 16:18  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
А ты её вообще запускал?
Выше подправил пост.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.05.2011, 16:33
Так объяви функцию в файле *.cpp, а не *.h.

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

Хотя на мой взгляд куда логичнее было бы в Date создать статический метод для инициализации массива, чем сбоку рисовать функцию initDaysTillJan1
Почему статический метод, разве это критично?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.05.2011, 18:42
Цитата Сообщение от alexsvk Посмотреть сообщение
Почему статический метод, разве это критично?
Нестатический метод как бы содержит this и как бы требует объекта. В данном случае сие не нужно и как бы потребуется создавать объект, чтобы запустить нестатический метод.
1
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 19:01  [ТС]
Допустим, в классе есть поле
static const int array[];
При инициализации оного, снимая в цикле константность с помощью оператора приведения типа, вернётся ли константность для каждого элемента после?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.05.2011, 19:09
То, что помечено как const, может быть только явным образом статически проинциаилизировано. В коды ты уже проинициализировать не сможешь. Я согласен с тем, что возможность заманчивая, когда можно динамически проинициализировать, а потом сказать, что это будет const, но сие в языке низкого уровня не реализуемо
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 19:19  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
То, что помечено как const, может быть только явным образом статически проинциаилизировано.
Это связано с тем, что константе свойственны глобальность и уникальность имени?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.05.2011, 23:01
Константность - это запрет на запись. К глобальности и универсальности имени вообще никакого отношения не имеет
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 23:56  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Константность - это запрет на запись. К глобальности и универсальности имени вообще никакого отношения не имеет
Да, но меня заинтересовала фраза "статически инициализирована..". Что это значит?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
10.05.2011, 08: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
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
10.05.2011, 21:44  [ТС]
Немного отдалюсь от главной темы.
Что значит описатель volatile, его отличия от const?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
10.05.2011, 22:13
Цитата Сообщение от alexsvk Посмотреть сообщение
Что значит описатель volatile, его отличия от const?
Это вообще два разных ключевых слова, о различиях говорить бессмысленно.
По идее ключевое слово volatile должно запрещать оптимизацию переменной. Подразумевается, что переменная может быть изменена внешне, чем-то еще кроме текущего исполняемого кода. Компилятор обязан выполнять все указанные действия над переменной, отмеченной как volatile.
const - это запрет на изменение (запись).
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
10.05.2011, 22:15  [ТС]
Не достаточно ясное объяснение...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.05.2011, 22:15
Помогаю со студенческими работами здесь

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

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

Размер статического массива
Можно ли задавть размер статического массива во время работы программы? Если нет, то почему?#include &lt;iostream&gt; using namespace...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru