(Примечание: вопрос был отредактирован с тех пор, как я его написал)
Из-за способа компиляции C он должен знать, куда переходить при вызове функции. Поскольку вы можете вызывать его из любого места, или даже где-то разрыв не имеет смысла, вы не можете иметь оператор break;
в своей функции и заставить его работать так.
В других ответах предлагались ужасные решения, такие как установка глобальной переменной с использованием #define
или longjumping (!) Из функции. Это очень плохие решения. Вместо этого вы должны использовать решение, которое вы ошибочно отклонили в своем первом абзаце, и вернуть значение из вашей функции, которое указывает состояние, в котором вы хотите вызвать break
в этом случае, и сделать что-то вроде этого:
#include <stdbool.h>
bool checkAndDisplay(int n)
{
printf("%d\n", n);
return (n == 14);
}
int main(void) {
for (int i = 0; i <= 100; i++) {
if (checkAndDisplay(i))
break;
}
return 0;
}
Попытка найти неясные способы достижения подобных целей вместо правильного способа достижения того же конечного результата - верный способ создания кода ужасного качества, который является кошмаром для обслуживания и отладки.
Вы упомянули, скрытые в комментарии, что вы должны использовать возврат void, это не проблема, просто передайте параметр break в качестве указателя:
#include <stdbool.h>
void checkAndDisplay(int n, bool* wantBreak)
{
printf("%d\n", n);
if (n == 14)
wantBreak = true;
}
int main(void) {
bool wantBreak = false;
for (int i = 0; i <= 100; i++) {
checkAndDisplay(i, &wantBreak);
if (wantBreak)
break;
}
return 0;
}
Поскольку ваши параметры имеют фиксированный тип Я предлагаю вам использовать приведение для передачи указателя на один из параметров, например foo(a, b, (long)&out);
Вы превысили максимальный размер кучи JVM. Это зависит как от JVM, так и от ОС. В большинстве 32-битных систем максимальное значение будет 2 ГБ, независимо от доступной физической памяти.
По умолчанию Java работает в 32-битном режиме. Обязательно укажите параметр -d64, чтобы перевести его в 64-битный режим. В 64-битном режиме у вас не должно возникнуть проблем с выделением JVM объемом 6 ГБ.
На самом деле максимальный размер памяти в 32-битных системах может варьироваться и составлять до 4 ГБ, но обычно 2 ГБ. Часто возможно повторно связать ядро, чтобы увеличить его до 3 или 3,5 ГБ. Проблема, конечно, в том, что у вас просто нет адресного пространства для отображения дополнительной памяти. Вы пробовали 64-битную машину?
Кроме того, не забудьте установить более высокий предел перед этим.