Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
Труд вопреки насмешкам
288 / 165 / 40
Регистрация: 13.07.2017
Сообщений: 3,000
Записей в блоге: 8
1

Выделить под программу максимум памяти

29.10.2018, 12:32. Показов 8315. Ответов 42
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня присутствует такая ошибка компилятора:
fatal error C1060: компилятору не хватает размера кучи
Я так понимаю, что программе не хватает памяти. Хотя на компьютере ее хватает - 8 ГБ ОЗУ + 50 ГБ файл подкачки на съемном диске. Как заставить программу использовать этот объем по максимуму? Компилировать только под x64, я правильно понял? У меня новейшая версия Windows и Visual Studio.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2018, 12:32
Ответы с готовыми решениями:

Можно ли в С++ выделить память под объект в заданную мной область памяти?
Есть код static inline void convertFromTextAlternative(quint8* dst, const QVariant& src){ ...

Выделение памяти под массив в классе. Почему не могу правильно выделить?
Все привет! не могу понять почему в классе не получается выделить память из стека для массива....

Выделить в памяти 1024 ячейки по 8 байт и вывести их адреса(МИНИ менеджер памяти))
Вот тут появилась такая интересная задача: требуется сделать программу которая управляет 1024...

1.Написать программу, вычисляющую размер памяти, отводимой компилятором под тип int
#include "iostream.h" int main() { int x; cin>>x; cout<<"razmer tipa...

42
Эксперт .NET
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
29.10.2018, 14:28 21
Author24 — интернет-сервис помощи студентам
Etyuhibosecyu, что из себя представляет "рекурсивный тип"?
0
Труд вопреки насмешкам
288 / 165 / 40
Регистрация: 13.07.2017
Сообщений: 3,000
Записей в блоге: 8
29.10.2018, 14:33  [ТС] 22
Пример:
Код
Тип : Т = Число
Т : А = 3.14159
Т = Целое
q::Сейчас А=3
Т = Строка
q::Сейчас А="3"
Добавлено через 1 минуту
Вообще-то это раздел по C++, а не по DCASTF... Так не знаете, как исправить эту ошибку?
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
29.10.2018, 14:39 23
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Компилировать только под x64, я правильно понял?
Да, ну можно и х86 там есть свои уловки, если для Виндовс, но проще х64
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Хотя на компьютере ее хватает - 8 ГБ ОЗУ + 50 ГБ файл подкачки на съемном диске.
Почитайте о виртуальной памяти и как она работает в ОС
0
165 / 108 / 57
Регистрация: 30.08.2018
Сообщений: 357
29.10.2018, 14:48 24
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Вообще-то это раздел по C++, а не по DCASTF...
Etyuhibosecyu, Что такое DCASTF ?
0
Труд вопреки насмешкам
288 / 165 / 40
Регистрация: 13.07.2017
Сообщений: 3,000
Записей в блоге: 8
29.10.2018, 14:50  [ТС] 25
JaponDemon, это наша с Usaga и еще одним-двумя пользователями тайна.
0
165 / 108 / 57
Регистрация: 30.08.2018
Сообщений: 357
29.10.2018, 14:55 26
deleted
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
29.10.2018, 15:08 27
Цитата Сообщение от Usaga Посмотреть сообщение
Etyuhibosecyu, если компилятор ругается на нехватку памяти, то ни о каком выполнении функций в коде речи не идёт. Т.е. до запуска вашего проекта дело не доходит.
Компилятору нужно память под переменные распределить. Если у вас несколько статических массивов по мегабайту он может сообразить что стека не хватит.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
29.10.2018, 15:11 28
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
стека не хватит
но там вроде дело о куче было или нет?
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
29.10.2018, 15:45 29
Да кто его знает. В первом посте да, куча. Но ТС не желает делиться подробностями, так что может быть что угодно. Вообще-то 4 ГБ для компиляции одного файла - многовато как-то. Может он там шаблоны зациклил как-то или статический анализатор запустил.

Добавлено через 46 секунд
Для ТСа важно что увеличением памяти его проблема скорее всего не решится. Явно же какая-то ошибка в исходном коде.
0
Труд вопреки насмешкам
288 / 165 / 40
Регистрация: 13.07.2017
Сообщений: 3,000
Записей в блоге: 8
29.10.2018, 15:47  [ТС] 30
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
ТС не желает делиться подробностями
Вот же код.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
29.10.2018, 16:03 31
COKPOWEHEU, у Etyuhibosecyu пропущена важная вещь - конструкция if constexpr(), без которой рекурсивное раскрытие шаблона нельзя заблокировать. А конструкция эта поддерживается только в С++17, и видимо у автора темы в проекте не поддерживается. А без неё нужно перебор типов писать вручную, т.к. иным способом блокировать компиляцию вызова функции в шаблоне, вероятно, нельзя никак.

Добавлено через 2 минуты
Исходный код здесь - Преобразовать std::vector в массив параметров

Добавлено через 5 минут
Цитата Сообщение от TRam_ Посмотреть сообщение
А без неё нужно перебор типов писать вручную
Имеется в виду внутри switch'а 1-го аргумента switch'и для 2 аргумента, внутри каждого switch'а 2-го аргумента - switch'и для 3го и т.д. На сколько у автора копипасты хватит. А мой код просто это генерирует, правда за счёт рекурсивных вызовов шаблона функции.
0
Труд вопреки насмешкам
288 / 165 / 40
Регистрация: 13.07.2017
Сообщений: 3,000
Записей в блоге: 8
29.10.2018, 16:06  [ТС] 32
TRam_, у меня Visual Studio 2017, добавил эту конструкцию, теперь такой код:
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
105
106
107
108
109
110
111
112
113
114
    template<int current_level, typename... T> static int dll_call(HMODULE h, const char *fname, const std::vector<three_values> &parameters, T... args) {
        constexpr int current_level2 = current_level;
        long int count = (long int)parameters[0];
        if (((std::string)parameters[current_level].type).find("Пустота") == 0 || ((std::string)parameters[current_level].type).find("Универ") == 0) {
            if (count > current_level) {
                if constexpr (current_level2 <= 10) {
                    return dll_call<current_level + 1, T..., int>(h, fname, parameters, args..., (int)parameters[current_level]);
                }
                else {
                    return 0;
                }
            }
            return ((int (*)(T..., int))GetProcAddress(h, fname))(args... , (int)parameters[current_level]);
        }
        else if (((std::string)parameters[current_level].type).find("Число") == 0) {
            if (count > current_level) {
                if constexpr (current_level2 <= 10) {
                    return dll_call<current_level + 1, T..., double>(h, fname, parameters, args..., (double)parameters[current_level]);
                }
                else {
                    return 0;
                }
            }
            return ((int (*)(T..., double))GetProcAddress(h, fname))(args..., (double)parameters[current_level]);
        }
        else if (((std::string)parameters[current_level].type).find("Целое") == 0) {
            if (count > current_level) {
                if constexpr (current_level2 <= 10) {
                    return dll_call<current_level + 1, T..., long int>(h, fname, parameters, args..., (long int)parameters[current_level]);
                }
                else {
                    return 0;
                }
            }
            return ((int (*)(T..., long int))GetProcAddress(h, fname))(args..., (long int)parameters[current_level]);
        }
        else if (((std::string)parameters[current_level].type).find("Целое без знака") == 0) {
            if (count > current_level) {
                if constexpr (current_level2 <= 10) {
                    return dll_call<current_level + 1, T..., unsigned long int>(h, fname, parameters, args..., (unsigned long int)parameters[current_level]);
                }
                else {
                    return 0;
                }
            }
            return ((int (*)(T..., unsigned long int))GetProcAddress(h, fname))(args..., (unsigned long int)parameters[current_level]);
        }
        else if (((std::string)parameters[current_level].type).find("Строка") == 0 || ((std::string)parameters[current_level].type).find("Короткая строка") == 0) {
            if (count > current_level) {
                if constexpr (current_level2 <= 10) {
                    return dll_call<current_level + 1, T..., const char *>(h, fname, parameters, args..., (const char *)parameters[current_level]);
                }
                else {
                    return 0;
                }
            }
            return ((int (*)(T..., const char *))GetProcAddress(h, fname))(args..., (const char *)parameters[current_level]);
        }
        else {
            if (count > current_level) {
                if constexpr (current_level2 <= 10) {
                    return dll_call<current_level + 1, T..., int>(h, fname, parameters, args..., (int)parameters[current_level]);
                }
                else {
                    return 0;
                }
            }
            return ((int (*)(T..., int))GetProcAddress(h, fname))(args..., (int)parameters[current_level]);
        }
        return 0;
    }
 
    static int dll_call(HMODULE h, const char *fname, const std::vector<three_values> &parameters) {
        long int count = (long int)parameters[0];
        if (count > 0) {
            if (((std::string)parameters[1].type).find("Пустота") == 0 || ((std::string)parameters[1].type).find("Универ") == 0) {
                if (count > 1) {
                    return dll_call<2, int>(h, fname, parameters, (int)parameters[1]);
                }
                return ((int (*)(int))GetProcAddress(h, fname))((int)parameters[1]);
            }
            else if (((std::string)parameters[1].type).find("Число") == 0) {
                if (count > 1) {
                    return dll_call<2, double>(h, fname, parameters, (double)parameters[1]);
                }
                return ((int (*)(double))GetProcAddress(h, fname))((double)parameters[1]);
            }
            else if (((std::string)parameters[1].type).find("Целое") == 0) {
                if (count > 1) {
                    return dll_call<2, long int>(h, fname, parameters, (long int)parameters[1]);
                }
                return ((int (*)(long int))GetProcAddress(h, fname))((long int)parameters[1]);
            }
            else if (((std::string)parameters[1].type).find("Целое без знака") == 0) {
                if (count > 1) {
                    return dll_call<2, unsigned long int>(h, fname, parameters, (unsigned long int)parameters[1]);
                }
                return ((int (*)(unsigned long int))GetProcAddress(h, fname))((unsigned long int)parameters[1]);
            }
            else if (((std::string)parameters[1].type).find("Строка") == 0 || ((std::string)parameters[1].type).find("Короткая строка") == 0) {
                if (count > 1) {
                    return dll_call<2, const char *>(h, fname, parameters, (const char *)parameters[1]);
                }
                return ((int (*)(const char *))GetProcAddress(h, fname))((const char *)parameters[1]);
            }
            else {
                if (count > 1) {
                    return dll_call<2, int>(h, fname, parameters, (int)parameters[1]);
                }
                return ((int (*)(int))GetProcAddress(h, fname))((int)parameters[1]);
            }
        }
        return ((int (*)())GetProcAddress(h, fname))();
    }
Но не компилируется в равной степени. Что еще исправить? Возможно, я сделал эту конструкцию не во всех местах, где она нужна?
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
29.10.2018, 16:12 33
https://stackoverflow.com/ques... -2017-15-3

Добавлено через 36 секунд
И начни не с 10 аргументов, а с 3.

Добавлено через 58 секунд
И наверно
C++
1
constexpr int current_level2 = current_level+1;
0
Труд вопреки насмешкам
288 / 165 / 40
Регистрация: 13.07.2017
Сообщений: 3,000
Записей в блоге: 8
29.10.2018, 16:20  [ТС] 34
TRam_, на 4 аргумента идет, на 5 уже нет. Как быть, если мне нужно до 10?
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
29.10.2018, 16:33 35
Искать иной способ, мой не подойдёт.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
29.10.2018, 16:33 36
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Вот же код.
Не путайте. Это выдранный непонятно откуда кусок, который даже не компилируется. В основном компилятор ругается на HMODULE, который нигде не объявлен:
ругань gcc
Код
$ g++ main.c
main.c:3:64: error: ‘HMODULE’ was not declared in this scope
     template<int current_level, typename... T> static int func(HMODULE h, const char *fname, const std::vector<three_values> &parameters, T... args) {
                                                                ^~~~~~~
main.c:3:75: error: expected primary-expression before ‘const’
     template<int current_level, typename... T> static int func(HMODULE h, const char *fname, const std::vector<three_values> &parameters, T... args) {
                                                                           ^~~~~
main.c:3:94: error: expected primary-expression before ‘const’
 late<int current_level, typename... T> static int func(HMODULE h, const char *fname, const std::vector<three_values> &parameters, T... args) {
                                                                                      ^~~~~
main.c:3:140: error: expected primary-expression before ‘...’ token
 int func(HMODULE h, const char *fname, const std::vector<three_values> &parameters, T... args) {
                                                                                      ^~~
main.c:3:148: error: expression list treated as compound expression in initializer [-fpermissive]
 int func(HMODULE h, const char *fname, const std::vector<three_values> &parameters, T... args) {
                                                                                              ^
main.c:3:150: error: expected ‘;’ before ‘{’ token
 int func(HMODULE h, const char *fname, const std::vector<three_values> &parameters, T... args) {
                                                                                                ^
main.c:74:21: error: ‘int func’ redeclared as different kind of symbol
     static int func(HMODULE h, const char *fname, const std::vector<three_values> &parameters) {
                     ^~~~~~~
main.c:3:64: note: previous declaration ‘template<int current_level, class ... T> int func<current_level, T ...>’
     template<int current_level, typename... T> static int func(HMODULE h, const char *fname, const std::vector<three_values> &parameters, T... args) {
                                                                ^~~~~~~
main.c:74:21: error: ‘HMODULE’ was not declared in this scope
     static int func(HMODULE h, const char *fname, const std::vector<three_values> &parameters) {
                     ^~~~~~~
main.c:74:32: error: expected primary-expression before ‘const’
     static int func(HMODULE h, const char *fname, const std::vector<three_values> &parameters) {
                                ^~~~~
main.c:74:51: error: expected primary-expression before ‘const’
     static int func(HMODULE h, const char *fname, const std::vector<three_values> &parameters) {
0
Труд вопреки насмешкам
288 / 165 / 40
Регистрация: 13.07.2017
Сообщений: 3,000
Записей в блоге: 8
29.10.2018, 16:38  [ТС] 37
TRam_, теперь ошибки нет? Не подскажете, как сделать, чтобы программа использовала больше памяти и поддерживала большее число аргументов?
P. S. Не хотите в список друзей?
0
Rius
29.10.2018, 17:12
  #38

Не по теме:

Цитата Сообщение от JaponDemon Посмотреть сообщение
Etyuhibosecyu, Что такое DCASTF ?
DCASTF. Каким он будет? (Идеи и предложения по поводу будущего создателя окон)

0
Эксперт .NET
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
29.10.2018, 17:55 39
Etyuhibosecyu, на самом деле, тут галимая "проблема X-Y". Т.е. вы придумали неправильное решение (Y) неозвученной проблемы (X).

Если это - реакция на моё замечание о том, что ваш DCASF должен предоставлять клиентскому коду возможность вызывать любые функции любых DLL, то решение выглядит максимально кривым. Вы в одном коде смешали систему типов С++ и своего изобретаемого языка.

Вам достаточно напихать все аргументы в стёк. Знать их типы вам не надо, только значения, размеры и порядок добавления в стёк. Тоже самое с возвращаемым значением. О этих типах должен знать только код транслируемого языка. А у вас всё в кучу.

И что за наркоманская система типов? "Число" - double, а "Целое" - long int. Т.е. целое нифина не число?

Я вам уже говорил о том, что вам код вашего языка нужно транслировать во внутреннее представление и уже его исполнять.

Я рекомедую закрыть тему, ибо тут обсуждается решение проблемы возникшее при совершенно кривом и костыльном решении другой проблемы.
0
Труд вопреки насмешкам
288 / 165 / 40
Регистрация: 13.07.2017
Сообщений: 3,000
Записей в блоге: 8
29.10.2018, 18:47  [ТС] 40
Окей, закрываю тему. Обсуждение других вариантов решения здесь.
0
29.10.2018, 18:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2018, 18:47
Помогаю со студенческими работами здесь

Как узнать сколько памяти в можно выделить под текстуры в мобильном устройстве?
Здравствуйте, как можно узнать насколько много и насколько большого размера текстуры можно...

Максимум памяти одной планки памяти для P5K
Добрый день. подскажите пожалуйста сколько может потянуть одной линейкой мат. плата ASUS P5K....

выделить максимум
Помогите, пожалуйста, выделить максимальное значение w и ее индекс. v - вектор (строка или...

Распределение оперативной памяти выделенной под программу
Здравствуйте. Помогите с объяснением некоторых тем, нигде не могу найти. №1 Целый тип данных....


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru