Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Большие константы, Проблема с большими константами 
:(
    Опции темы
HMLd
  Дата 29.6.2006, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: 1
Всего: 0



При объявлении константы типа 
Код
 #define MAX 4000000000

и объявлении массива 
Код

int tmp[MAX]
for (unsigned long i = 0; i < MAX; i++)
tmp[i] = 0;

программа компилируется нормально, но при выполнении виснет. При отладке по шагам выдаёт ошибку на первой же строке программы. Фишка в том, что если задать значение данной константы равное 4 294 967 295 - т.е. максимальное значение long - всё работает на ура...Теряюсь в догадках. Компилятор - Borland c++ 5.02
(При использование const всё так же). Может - борландовский глюк? 
PM MAIL   Вверх
ptr
Дата 29.6.2006, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 1
Всего: 14



Если sizeof(int)=4, то получается где-то, 15 Гбайт памяти. Компилятор должен выдать ошибку, что размер массива слишком большой. Да и у тебя, кроме того, будет stack overflow. 


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
chich
Дата 29.6.2006, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 20.6.2006

Репутация: нет
Всего: нет



может у него оперативки много  smile 
и вообще для выделения больших массивов (но не таких как этот) помоему лучше пользоваться new и delete 
PM MAIL   Вверх
MAKCim
Дата 29.6.2006, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

#define MAX 4000000000

Цитата

int tmp[MAX];

на 32-ой архитектуре виртуальное адресное пространство составляет обычно 4Gb (физической памяти итого меньше)
а ты хочешь выделить ~ 15Gb, да еще и в стеке, не круто ли?  smile  


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
HMLd
Дата 29.6.2006, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: 1
Всего: 0



Цитата
лучше пользоваться new и delete

Точно....Всё, спасибо. Разобрался...smile 
PM MAIL   Вверх
Rockie
Дата 29.6.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(HMLd @  29.6.2006,  12:07 Найти цитируемый пост)
Цитата    
лучше пользоваться new и delete    

Точно....Всё, спасибо. Разобрался... 

..получилось? 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Xenon
Дата 29.6.2006, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



...
И почему макрос обозвали константой? 


--------------------
user posted image  
PM MAIL   Вверх
DeadSoul
Дата 29.6.2006, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(ptr @  29.6.2006,  07:35 Найти цитируемый пост)
Да и у тебя, кроме того, будет stack overflow.  

Это почему? 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
586
Дата 29.6.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Цитата(DeadSoul @  29.6.2006,  22:55 Найти цитируемый пост)
Цитата(ptr @  29.6.2006,  07:35 Найти цитируемый пост)
Да и у тебя, кроме того, будет stack overflow.  

Это почему?  

Потому что локальные переменные хранятся в стеке. 
PM   Вверх
DeadSoul
Дата 29.6.2006, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(586 @  29.6.2006,  22:17 Найти цитируемый пост)
Цитата(DeadSoul @  29.6.2006,  22:55 )
Цитата(ptr @  29.6.2006,  07:35 )
Да и у тебя, кроме того, будет stack overflow.  
Это почему?  
Потому что локальные переменные хранятся в стеке.  

Переполнение стека обычно бывает от другого
 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
586
Дата 29.6.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Цитата(DeadSoul @  29.6.2006,  23:24 Найти цитируемый пост)
Переполнение стека обычно бывает от другого

И от этого бывает. Ведь под эти переменные создается фрейм в стеке. 
PM   Вверх
HMLd
Дата 30.6.2006, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: 1
Всего: 0



Цитата
И почему макрос обозвали константой? 

Мне кажется, что в данном контексте строки 
Код

#define MAX 12345
int array[MAX];

и
Код

const int MAX 12345;
int array[MAX];

идентичны.
Разве нет?...

Цитата

Ведь под эти переменные создается фрейм в стеке. 

фрейм - smile 
PM MAIL   Вверх
Xenon
Дата 30.6.2006, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



HMLd Константа хранится в памяти и даже тип имеет, а макрос - автозамена данного выражение на другое во время компиляции.     

Это сообщение отредактировал(а) XenonSk - 30.6.2006, 00:35


--------------------
user posted image  
PM MAIL   Вверх
HMLd
Дата 30.6.2006, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: 1
Всего: 0



Цитата
Константа хранится в памяти и даже тип имеет, а макрос - автозамена данного выражение на другое во время компиляции.

Это ясно, и я это не оспариваю, просто в вышеприведённом коде работа и смысл программы не изменится, если вместо const писать #define.
В другом контексте это может и играть роль... smile 
PM MAIL   Вверх
586
Дата 30.6.2006, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Цитата(HMLd @  30.6.2006,  01:29 Найти цитируемый пост)
фрейм -   smile 

Фрейм - это выделенный участок памяти в стеке.
Вот пример:
Код
void test()
{
 int i[2];
 i[0]=1;
 i[1]=i[0];
}

Диззасемблированный код:
Код
00401000 55               push    ebp        // int i[2]; // создание фрейма - выделение памяти в стеке
00401001 8bec             mov     ebp,esp    // ^^
00401003 83ec08           sub     esp,0x8    // ^^ // sizeof(int[2])=0x8;
00401006 c745f801000000   mov     dword ptr [ebp-0x8],0x1   // int[0]=1;  // работа с переменной
0040100d 8b45f8           mov     eax,[ebp-0x8]            // i[1]=i[0];
00401010 8945fc           mov     [ebp-0x4],eax            // i[1]=i[0];
00401015 8be5             mov     esp,ebp    // удаление фрейма
00401017 5d               pop     ebp        // ^^
00401018 c3               ret
  

Это сообщение отредактировал(а) 586 - 30.6.2006, 02:37
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0883 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.