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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.83
-=ЮрА=-
Заблокирован
Автор FAQ
#1

use /Zm to specify a higher limit - C++

23.07.2011, 19:43. Просмотров 2255. Ответов 12
Метки нет (Все метки)

Работаю с областью памяти около 20 Мб, при линковке компилятор выдал сообщение
fatal error C1076: compiler limit : internal heap limit reached; use /Zm to specify a higher limit

Где и как прописать /Zm???

Смотрел тут
http://msdn.microsoft.com/en-us/libr...(v=vs.71).aspx
но что то не въеду(
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
23.07.2011, 19:51     use /Zm to specify a higher limit #2
To set this compiler option in the Visual Studio development environment
Open the project's Property Pages dialog box. For details, see Setting Visual C++ Project Properties.
Click the C/C++ folder.
Click the Command Line property page.
Type the compiler option in the Additional Options box.
vycnherwbz lkz ьымы

Добавлено через 57 секунд
это инструкция для ms vs
-=ЮрА=-
Заблокирован
Автор FAQ
23.07.2011, 19:56  [ТС]     use /Zm to specify a higher limit #3
Я выставил не помогло....
Работаю в 6-й версии.
Миниатюры
use /Zm to specify a higher limit  
LosAngeles
Заблокирован
23.07.2011, 20:04     use /Zm to specify a higher limit #4
If C1076 occurs immediately after the build starts, the value specified for /Zm is probably too high for your program. Reduce the /Zm value.
а это?

Добавлено через 47 секунд
возможно и не повышать надо
-=ЮрА=-
Заблокирован
Автор FAQ
23.07.2011, 20:15  [ТС]     use /Zm to specify a higher limit #5
internal heap limit reached; use /Zm to specify a higher limit спустил на 50 Мб, думаю дело не в этом, пытаюсь запихнуть в программу массив из 10 000 000 элементов, вчера когда динамически память выделял программа хоть както работала, а сейчас вообще не компилится...
Изначально опция Zm вообще отсутствовала.
LosAngeles
Заблокирован
23.07.2011, 20:37     use /Zm to specify a higher limit #6
Possible solutions
Eliminate unnecessary global variables, for example, by allocating memory dynamically instead of declaring a large array

Добавлено через 13 минут
не знаю, может поможет - попробуй вобще предкомпильные хидеры отключить
-=ЮрА=-
Заблокирован
Автор FAQ
23.07.2011, 21:28  [ТС]     use /Zm to specify a higher limit #7
LosAngeles, спасибо за отклик, к сожалению при динамическом выделении такого количества памяти программа работает некорректно, поэтому и решил статически выделить память под массив и инициализировать его из файла прямым включением в проект директивой #include
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
23.07.2011, 21:41     use /Zm to specify a higher limit #8
а если использовать VirtualAlloc? должно быть быстрее heap'a
-=ЮрА=-
Заблокирован
Автор FAQ
23.07.2011, 21:54  [ТС]     use /Zm to specify a higher limit #9
Я пробовал динамику, с malloc работало кое как, мне это надоело и решил статически вбить массив
вот как пытаюсь ввести в проект матрицу и вектор с размерностями 3638 элементов

C++
1
2
3
4
5
6
7
8
#include <math.h>
#include <stdio.h>
#include <windows.h>
 
#define N 3638
 
#include "input_A.txt"
#include "input_B.txt"
В самих txt-шниках вбито double A[][N]={{....},....{}}; double B[] = {....}

Я делал чтение этих массивов, но даже само время считывания с инициализацией элементов значительно, вот и хотел себе упростить жизнь


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
double * str2vec(char * s, char delim, double * vec, int &m)
{
    m = 0;
    char * chBuf = strrchr(s,delim);
    while(chBuf)
    {
        vec[m] = atof(chBuf + 1);
    //  printf("vec[%04d] = %lf\r\n",m + 1, vec[m]);
        vec = (double *)realloc
            (
                (void *)vec,
                (1 + (m = m + 1))*sizeof(double)
            );
        s[strlen(s) - strlen(chBuf)] = '\0';
        chBuf = strrchr(s,delim);
    }
    if(s)
    {
        vec[m] = atof(s + 3);
//      printf("vec[%04d] = %lf\r\n",m + 1, vec[m]);
        vec = (double *)realloc
            (
                (void *)vec,
                (1 + (m = m + 1))*sizeof(double)
            );
    }
    return vec;
}
 
double * swapvec(int m, double * vec)
{
    double buf;
    for(int i = 0; i < m/2; i++)
    {
        buf = vec[m - i -1];
        vec[m - i -1] = vec[i];
        vec[i] = buf;
    }
    return vec;
}
Теперь выставив параметр /Zm 1553 получаю от компилятора уже такую ошибку

fatal error C1063:
Error executing cl.exe.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
23.07.2011, 22:03     use /Zm to specify a higher limit #10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
vec = (double *)realloc
неплохо бы проверять, что возвращает realloc
во-вторых
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
к сожалению при динамическом выделении такого количества памяти программа работает некорректно
как именно?

и для быстроты можно хранить матрицу в бинарном, а не текстовом виде
-=ЮрА=-
Заблокирован
Автор FAQ
23.07.2011, 22:18  [ТС]     use /Zm to specify a higher limit #11
Реаллок по ходу ближе к концу начинал сбоить, но вначале при небольшом считанном числе строк алгоритм шёл как по маслу. За бинарку - идея, как то недодумал, обязательно попробую!
xAtom
914 / 739 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
24.07.2011, 07:52     use /Zm to specify a higher limit #12
Вообще для больших объёмов данных более 10-15 MB лучше работать с VirtualAlloc. Пример работы с 19-20 МБ, после вызова функции страницы будут освобождены.
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
BOOL CApplicationDlg::OnInitDialog() {
    CDialog::OnInitDialog();
 
    CString  str;
    long* ptr = NULL;
 
    DWORD   size = 5000 * 1024 * sizeof(long);
 
    ptr = (long*) VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
 
            if(ptr == NULL) {
                    MessageBox("F_OUTEMEMORY", "Ошибка", MB_OK | MB_ICONSTOP);
                   return FALSE;
            }   
 
          if(IsBadReadPtr((LPVOID)ptr, size)) {  
           MessageBox("Неточное выделение page-памяти !", "Ошибка", MB_OK | MB_ICONSTOP);
          goto jump;
           }
 
    long  len = 5000 * 1024;
    for(long l = 0L; l < len; l++)
            ptr[l] =  1;
    
    unsigned long sum = 0;
    long* iter = ptr;
    while(len--)
         sum += *iter++;
 
    str.Format("%u - byte ~ %d MB", sum * sizeof(long), sum * sizeof(long) / (1024 * 1024));
    SetWindowText(str);
 
jump:;
    VirtualFree(ptr, 0U,  MEM_RELEASE);
    ptr = NULL;
   
     return TRUE;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2011, 08:03     use /Zm to specify a higher limit
Еще ссылки по теме:
Limit
LIMIT MySQL
LIMIT MySQL
Limit
MySQL update и limit

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.07.2011, 08:03     use /Zm to specify a higher limit #13
Ну круто! Ошибка компилятора, ты /Zm для компоновщика указываешь.

Добавлено через 1 минуту
Зачем в С++ проекте использовать malloc?

Добавлено через 1 минуту
ОМГ! ОМГ! ОМГ!
Если с динамическим распределение памяти программа работает не правильно, это не повод использовать статическую память! Это повод искать ошибки в алгоритме и, в первую очередь, искать выход за границы массивов!
Yandex
Объявления
24.07.2011, 08:03     use /Zm to specify a higher limit
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru