проблема при обьявлении большого масива в С++

Тема в разделе "WASM.BEGINNERS", создана пользователем Psionic, 25 сен 2008.

  1. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    В общем проблема такова - при попытке обьявить большой масив (но всеже много меньше положенных 256мб) собраный файл дает такое окно [​IMG] как так, ведь размер масива (по данным sizeof) крутиться в районе примерно 130000 байт? Использую MVS 2008 (пробывал на 2005 студии стемже результатом)
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Может все таки не стоит делать того чего не стоит делать, тем более что компилятор сам об этом Вам ненавязчиво намекает? Может лучше выделять массив в памяти или засунуть его в файл?
     
  3. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    Файл неудобно - с быстродействием проблемы, а с выделением памяти знаком плохо. Потомуто "В лоб" и работаю, а что мне всетаки мешает?
     
  4. driver

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    мешает тебе пустая твоя голова - иди на форум, где тусуются такие же любители птичьих языков програмирования и спрашивай там :dntknw:(
     
  5. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    Прошу ссылочку =D, где самые лутшие форумы по птичьим языкам програмирования.
     
  6. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Оладушек. Дай угадаю. Объявление массива где-то в теле функции
    Код (Text):
    1. int A[130000]
    . А ты не думал, что стек в программе не резиновый.
    Сделай его глобальным. Если не поможет, то динамически выделять!
     
  7. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    видать придется хотя вторгаюсь на неосвоенную для себя територию, а все таки что происходило? Отказ от зборки только если масив >256mb? Даже предупреждений от студии никаких не было.
     
  8. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Стек за раз позволяет 4кб выделить (одну страницу памяти)
     
  9. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Psionic
    Код (Text):
    1. //
    2. // Here are 128K integers for you!
    3. //
    4. int* pData = (int*) VirtualAlloc (NULL, sizeof (int) * 128 * 1024, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    5.  
    6. //
    7. // Get that integer at index 62511!
    8. //
    9. int b = pData [62511];
     
  10. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Юзай std::vector раз уж на С++ пишешь, он будет выделять память сам по мере надобности.
     
  11. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    std::vector - не годится, в нем лиш одно измерение как я понял, а выделение памяти тоже не идет, вся проблема исче во многомероности моего масива. Програма физическая и статистическая - нужно большое и многомерное множество. Я не профисионал и у меня не професиональный подход. А какой подход применил бы професионал?
     
  12. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Тебе уже ответили - профессионалы выделяют память в таких количествах динамически.
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Psionic
    Прочти Джефри Рихтера "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows" он очень подробно и популярно разьясняет как работать с динамически выделяемой памятью. Книга в сети валяется очень много где.
     
  14. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    Y_Mur
    Пасибо, качаю.
    А вообще есть шанс выделить многомерный масив в памяти?
    Код (Text):
    1. int *matrix1=new int[20]; //тут только одно измерение
    2. int matrix2[40][40]; //нужно такое только пообьемистей
    Есть шанс решить задачу именно так?
     
  15. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Psionic
    Вообще-то max7C4 уже подсказывал, что для этого достаточно определять массив за пределами функций (в том числе и main) тогда он будет не в стеке и всё будет пучком ;)
    Только что проверил int matrix2[18000][18000]; (1,235 Гбайт :)) всё прекрасно работает (студия 2005, наверняка и в 2008 сработает).
     
  16. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Y_Mur
    я вот еще что скажу. Psionic а кто мешает из одномерного массива сделать двухмерный. есть i и j, так линейный адрес i*w+j - где w - ширина двухмерной матрицы (количество столбцов или строк, смотря как располагать)
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    max7C4
    Да нет у него явно проблема не в размерности, а в том что он в стек этот массив засунуть пытается ;)
    там и одномерный заглючит ;)

    Psionic
    Студия 2005 ругается если массив (который конечно не в стеке) достигает 2Гбайт, а вин XP 32 у меня отказывается выделять память такой проге если она хочет больше 1,6 Гбайт, а до этих пределов усё работает ;)
     
  18. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    boost::multi_array
     
  19. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Y_Mur
    Про размерности я начал говорить т.к. W4FhLF посоветовал
    , но Psionic не знал как решить проблему многомерности при использование линейной адресации
     
  20. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    Вот оно и есть. Действительно за приделами мейна собранный файл не ругается, теперь этот масив можно погонять по циклам =D.
    max7C4
    Предлагаеш из линий зделать плоскость. Неплохой подход.
    P.S. Вот такая вот вещь физика, бывает надо то чего в стек не положиш ;) . И вот что бывает когда учят физики-преподы учат програмировать физиков-студентов. Веть четко помню фразу "В С++ переменные можно обьявлять где угодно", уже привычка все в мейне писать, а особенности оказывается есть. Глупо как-то вышло :-\. Хотя это не самый хутший случай, имбо когда численные методы преподы-математики (знающие лиш турбопаскаль)пишут как матанализ - выходит матанализ (тавтология) и как с помошью этого считать на машине?