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

Какие существуют ограничения на размер двумерных массивов? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
21.04.2012, 08:04     Какие существуют ограничения на размер двумерных массивов? #1
Пишу в Visual Studio 2010
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
using namespace std;
 
int main()
{
    const long int size_time = 1000; // временные слои: t_0, t_1, t_2, ... , t_size_time    
    const long int SIZE_TIME = size_time + 1; // SIZE_TIME - количество временных слоёв
    // SIZE_TIME = size_time + 1 (1 слой - нулевой)
 
    const long int size_dist = 1000; // узлы по координате: r_-2, r_-1, r_0, ... , r_size_dist, r_size_dist_+1, r_size_dist_+2
    const long int SIZE_DIST = size_dist + 5; // SIZE_DIST - количество узлов по координате
    // SIZE_DIST = size_dist + 1 + 2 + 2 (1 - нулевой, 2 вспомогательных слева и 2 вспомогательных справа)
 
    // Создаём 5 двумерных массивов, в которых будут храниться решения в консервативных переменных:
    double solution_array_U0 [SIZE_TIME][SIZE_DIST];
    double solution_array_U1 [SIZE_TIME][SIZE_DIST];
    double solution_array_U2 [SIZE_TIME][SIZE_DIST];
    double solution_array_U3 [SIZE_TIME][SIZE_DIST];
    double solution_array_U4 [SIZE_TIME][SIZE_DIST];
 
    // Заполняем их всех нулями:
    for (int i = 0; i < SIZE_TIME; i++)
    {
        for (int j = 0; j < SIZE_DIST; j++)
        {
            solution_array_U0 [i][j] = 0.0;
            solution_array_U1 [i][j] = 0.0;
            solution_array_U2 [i][j] = 0.0;
            solution_array_U3 [i][j] = 0.0;
            solution_array_U4 [i][j] = 0.0;
        }
    }
 
        // Решил вывести один на экран и посмотреть:
    for (int i = 0; i < SIZE_TIME; i++)
    {
        for (int j = 0; j < SIZE_DIST; j++)
        {
            cout << solution_array_U0 [i][j] << " ";            
        }
        cout << endl;
    }           
     
    char response;         // эти 2 строчки для
    std::cin >> response;  // задержки экрана
    
    return 0;
}
Я думал, увижу на экране таблицу нулей: 1001 строчку и 1005 столбцов.
Когда запускаю, вылазиет окно. Там надпись: "Необработанное исключение в "0x01063fd7" в "MHDAccelerator.exe": 0xC00000FD: Stack overflow." И 2 варианта: "Прервать", "Продолжить". Причём окно исчезает только если нажать "Прервать". В текстовом редакторе появляется вкладка: chkstk.asm. Там написано:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
        page    ,132
        title   chkstk - C stack checking routine
;***
;chkstk.asm - C stack checking routine
;
;       Copyright (c) Microsoft Corporation. All rights reserved.
;
;Purpose:
;       Provides support for automatic stack checking in C procedures
;       when stack checking is enabled.
;
;*******************************************************************************
 
.xlist
        include cruntime.inc
.list
 
; size of a page of memory
 
_PAGESIZE_      equ     1000h
 
 
        CODESEG
 
page
;***
;_chkstk - check stack upon procedure entry
;
;Purpose:
;       Provide stack checking on procedure entry. Method is to simply probe
;       each page of memory required for the stack in descending order. This
;       causes the necessary pages of memory to be allocated via the guard
;       page scheme, if possible. In the event of failure, the OS raises the
;       _XCPT_UNABLE_TO_GROW_STACK exception.
;
;       NOTE:  Currently, the (EAX < _PAGESIZE_) code path falls through
;       to the "lastpage" label of the (EAX >= _PAGESIZE_) code path.  This
;       is small; a minor speed optimization would be to special case
;       this up top.  This would avoid the painful save/restore of
;       ecx and would shorten the code path by 4-6 instructions.
;
;Entry:
;       EAX = size of local frame
;
;Exit:
;       ESP = new stackframe, if successful
;
;Uses:
;       EAX
;
;Exceptions:
;       _XCPT_GUARD_PAGE_VIOLATION - May be raised on a page probe. NEVER TRAP
;                                    THIS!!!! It is used by the OS to grow the
;                                    stack on demand.
;       _XCPT_UNABLE_TO_GROW_STACK - The stack cannot be grown. More precisely,
;                                    the attempt by the OS memory manager to
;                                    allocate another guard page in response
;                                    to a _XCPT_GUARD_PAGE_VIOLATION has
;                                    failed.
;
;*******************************************************************************
 
public  _alloca_probe
 
_chkstk proc
 
_alloca_probe    =  _chkstk
 
        push    ecx
 
; Calculate new TOS.
 
        lea     ecx, [esp] + 8 - 4      ; TOS before entering function + size for ret value
        sub     ecx, eax                ; new TOS
 
; Handle allocation size that results in wraparound.
; Wraparound will result in StackOverflow exception.
 
        sbb     eax, eax                ; 0 if CF==0, ~0 if CF==1
        not     eax                     ; ~0 if TOS did not wrapped around, 0 otherwise
        and     ecx, eax                ; set to 0 if wraparound
 
        mov     eax, esp                ; current TOS
        and     eax, not ( _PAGESIZE_ - 1) ; Round down to current page boundary
 
cs10:
        cmp     ecx, eax                ; Is new TOS
        jb      short cs20              ; in probed page?
        mov     eax, ecx                ; yes.
        pop     ecx
        xchg    esp, eax                ; update esp
        mov     eax, dword ptr [eax]    ; get return address
        mov     dword ptr [esp], eax    ; and put it at new TOS
        ret
 
; Find next lower page and probe
cs20:
        sub     eax, _PAGESIZE_         ; decrease by PAGESIZE
        test    dword ptr [eax],eax     ; probe page.
        jmp     short cs10
 
_chkstk endp
 
        end
Причём на 99-ую строчку:
C++
1
        test    dword ptr [eax],eax     ; probe page.
слева указывает жёлтая стрелочка. И ничего не происходит. Наверху написано "Отладка". Чтобы всё это прекратилось жму в меню: Отладка -> Остановить отладку.
Кто-нибудь знает, что происходит? Может это потому, что массив слишком большой? У меня ничего больше в голову не приходит.

Добавлено через 12 минут
Нет. Поставил малое количество строк и столбцов. Всё равно не работает. По-ходу, это тут вообще не при чём.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2012, 08:04     Какие существуют ограничения на размер двумерных массивов?
Посмотрите здесь:

Какие существуют способы возведения в степень C++
Какие существуют виды условного оператора и чем они отличаются C++
Подскажите пожалуйста, существует ли какие либо ограничения на тип информационного поля списка? C++
C++ Какие ограничения накладываются на объявления в операторах
C++ Какие ограничения накладываются на имена функций?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
21.04.2012, 10:16     Какие существуют ограничения на размер двумерных массивов? #2
Динамические массивы используйте. Размер стека ограничен.
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
21.04.2012, 11:20  [ТС]     Какие существуют ограничения на размер двумерных массивов? #3
Цитата Сообщение от KuKu Посмотреть сообщение
Динамические массивы используйте. Размер стека ограничен.
Я поставил размер массивов 10 на 10. Всё равно не работает.

Чтобы массив стал динамическим, что надо перед ним дописать?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
21.04.2012, 11:25     Какие существуют ограничения на размер двумерных массивов? #4
Ничего не нужно дописывать, нужно просто использовать динамические массивы.
C++
1
int *a = new int[ sizeOfArray ];
или
C++
1
2
3
int *a = 0;
//какой то код
a = new int[ sizeOfArray ];
Yandex
Объявления
21.04.2012, 11:25     Какие существуют ограничения на размер двумерных массивов?
Ответ Создать тему
Опции темы

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