Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2013, 18:19   #1
Skrypnyk
Новичок
Джуниор
 
Регистрация: 12.01.2013
Сообщений: 14
По умолчанию Изменение ограничений компилятора

Здравствуйте!
Я недавно начал учить С++ и сейчас, делая небольшой проект, столкнулся с о следующей проблемой: я создаю трехмерный массив [100][100][100], после запуска программы работа завершается до выполнения. Никаких ошибок или предупреждений не выдает. Когда меняю массив на [10][10][10], то все работает исправно. Вероятно компилятор накладывает ограничения. Как их можно изменить? Компилятор GNU GCC. Среда разработки CodeBlocks 10.05. На форуме уже поднимался подобный вопрос, но решения для себя не нашел. Опишите пожалуйста, что нужно делать для профана.
Заранее благодарен!

Послесловие 1: если это важно, то я пользуюсь Windows 7 x64.
Послесловие 2: на всякий случай даю часть моего кода:

Код:
#include <iostream>

using std::cout;
using std::endl;

struct Atom
{
    float x, y, z; // coordinates of the atoms
};

typedef struct Atom AtomType;

int main ()
{
    AtomType FccLattice[10][10][10]; // create a 3 dimensional array to fill the space with atoms of the FCC lattice
    float x, y, z;
    int i, j, k;

    for (i=0; i<10; i++)
    {
        for (j=0; j<10; j++)
        {
            for (k=0; k<10; k++)
            {
                FccLattice[i][j][k].x=i;
                FccLattice[i][j][k].y=j;
                FccLattice[i][j][k].z=k;
                cout << "Everything is fine" << endl;
            }
        }
    }

    return 0;
}

Последний раз редактировалось Skrypnyk; 13.01.2013 в 01:38.
Skrypnyk вне форума Ответить с цитированием
Старый 12.01.2013, 18:27   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

попробуй вот так:

Код:
#include <iostream>

using std::cout; using std::endl;

// coordinates of the atoms
struct Atom{    float x, y, z; };

typedef struct Atom AtomType;

 AtomType FccLattice[100][100][100]; // create an 3 dimensional array to fill the space with atoms of the FCC lattice

int main ()
{
    float x, y, z;    int i, j, k;

    for (i=0; i<10; i++)
            for (j=0; j<10; j++)
                for (k=0; k<10; k++)   {  FccLattice[i][j][k].x=i;  FccLattice[i][j][k].y=j;  FccLattice[i][j][k].z=k;   cout << "Everything is fine" << endl;    }
 
    return 0;
}

Последний раз редактировалось _Bers; 12.01.2013 в 18:30.
_Bers вне форума Ответить с цитированием
Старый 12.01.2013, 18:41   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Код:
    AtomType FccLattice[10][10][10];
Уж никак не AtomType FccLattice[100][100][100]; C++ не делает проверку границ массивов.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 13.01.2013, 01:30   #4
Skrypnyk
Новичок
Джуниор
 
Регистрация: 12.01.2013
Сообщений: 14
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
попробуй вот так:
Спасибо Вам. Да, так меня не выбрасывает из программы. Почему вынос объявления массива за пределы функции main исправляет это? Но тогда переменные не получают правильных значений:

Код:
#include <iostream>

using std::cout;
using std::endl;

struct Atom
{
    float x, y, z; // coordinates of the atoms
};

typedef struct Atom AtomType;

AtomType FccLattice[100][100][100]; // create a 3 dimensional array to fill the space with atoms of the FCC lattice

int main ()
{

    float x, y, z;
    int i, j, k;

    for (i=0; i<100; i++)
    {
        for (j=0; j<100; j++)
        {
            for (k=0; k<100; k++)
            {
                FccLattice[i][j][k].x=i-49;
                FccLattice[i][j][k].y=j-49;
                FccLattice[i][j][k].z=k-49;
            }
        }
    cout << FccLattice[i][j][k].x << FccLattice[i][j][k].y << FccLattice[i][j][k].z << endl;
    }

    return 0;
}
При выводе данных я получаю одни нули. Что я делаю не так?

Последний раз редактировалось Skrypnyk; 13.01.2013 в 01:38.
Skrypnyk вне форума Ответить с цитированием
Старый 13.01.2013, 01:33   #5
Skrypnyk
Новичок
Джуниор
 
Регистрация: 12.01.2013
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Код:
    AtomType FccLattice[10][10][10];
Уж никак не AtomType FccLattice[100][100][100]; C++ не делает проверку границ массивов.
Да, как я и писал, массив 10х10х10 работает, а 100х100х100 - нет. Насколько мне известно, компилятор может ограничивать размер файла.

Последний раз редактировалось Skrypnyk; 13.01.2013 в 01:35.
Skrypnyk вне форума Ответить с цитированием
Старый 13.01.2013, 01:46   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас в стеке есть место в размере sizeof(AtomType)*100*100*100?

дело не в размере памяти, а в том где она выделена.
в статической памяти такое место есть, в динамическое тоже должно быть.
но в локальной(стек) такого места не оказалось.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.01.2013, 02:00   #7
Skrypnyk
Новичок
Джуниор
 
Регистрация: 12.01.2013
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
у вас в стеке есть место в размере sizeof(AtomType)*100*100*100?
Спасибо, а как это узнать и что делать если не оказалось, как у меня?
Skrypnyk вне форума Ответить с цитированием
Старый 13.01.2013, 02:19   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

большие объекты не создаем на стеке, а выделяем динамически, или статически.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.01.2013, 02:25   #9
Skrypnyk
Новичок
Джуниор
 
Регистрация: 12.01.2013
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
большие объекты не создаем на стеке, а выделяем динамически, или статически.
Я Вас не очень понимаю. Нужно использовать malloc или указатели? Но мой профессор говорил, что он создавал массивы [1000 000][1000 000][1000 000] - значит как-то это решается.
Skrypnyk вне форума Ответить с цитированием
Старый 13.01.2013, 03:24   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну да, в адресном пространстве в 2Гб он создал массив более этого размера.

malloc(в С++ new) и указатели так или иначе связаны.
или они, или глобальная переменная.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Microsoft SQL: создание ограничений для ячейки Борцуха Помощь студентам 1 13.12.2012 07:51
добавление ограничений по множественным условия выбора значений algeka Microsoft Office Excel 0 31.03.2011 14:55
Word 2010, VBA, изменение форм ворда или накладывание ограничений simplecs Microsoft Office Word 4 25.01.2011 11:45
Проблема с вводом ограничений в Solver kovalevskivf Microsoft Office Excel 0 12.11.2009 23:41
Задача - через Поиск решения и Прописывания ограничений Angelholy Microsoft Office Excel 3 22.03.2009 13:08