Error break not allowed

I try to create a for looping for my Bubble Sort Algorithm and use break as a condition if there is no more number to be sorted anymore. But then the compiler said that BREAK not allowed. Here is m...

I try to create a for looping for my Bubble Sort Algorithm and use break as a condition if there is no more number to be sorted anymore. But then the compiler said that BREAK not allowed. Here is my code

Procedure Sort(var data : arr; j : integer);
var
    temp: integer;

begin
    temp := data[j];
    data[j] := data[j + 1];
    data[j + 1] := temp;
end;

Procedure sortDescending(var data : arr; n : integer);
var
    i, j : integer;
    marker : boolean;

begin
    for i := 1 to n do
    marker := false;
    begin
        for j := 1 to n do
        begin
            if(data[j] < data[j + 1]) then
            begin
                Sort(data, j);
                marker := true;
            end;
        end;
        if(marker = false) then
        begin
        break;
        end;
    end;
end;

Ken White's user avatar

Ken White

122k14 gold badges220 silver badges437 bronze badges

asked Jul 21, 2022 at 11:55

Muhammad Bayu Wicaksana's user avatar

4

Here’s your code.

for i := 1 to n do
marker := false;
begin
    for j := 1 to n do
    begin
        if(data[j] < data[j + 1]) then
        begin
            Sort(data, j);
            marker := true;
        end;
    end;
    if(marker = false) then
    begin
    break;
    end;
end;

Let’s add some whitespace after loops and indentation to make the issue clearer.

for i := 1 to n do
    marker := false;

begin
    for j := 1 to n do
    begin
        if (data[j] < data[j + 1]) then
        begin
            Sort(data, j);
            marker := true;
        end;
    end;

    if (marker = false) then
    begin
        break;
    end;
end;

Which is equivalent to:

for i := 1 to n do
    marker := false;

for j := 1 to n do
begin
    if (data[j] < data[j + 1]) then
    begin
        Sort(data, j);
        marker := true;
    end;
end;

if (marker = false) then
begin
    break;
end;

The break is not within a loop.

You likely meant to put begin before marker := false;.

for i := 1 to n do
begin
    marker := false;

    for j := 1 to n do
    begin
        if (data[j] < data[j + 1]) then
        begin
            Sort(data, j);
            marker := true;
        end;
    end;

    if (marker = false) then
    begin
        break;
    end;
end;

answered Aug 5, 2022 at 22:22

Chris's user avatar

ChrisChris

20.9k5 gold badges18 silver badges41 bronze badges

1

Модераторы: Oleg_D, Модераторы

Randomize, пишу программу

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

Код: Выделить всё
var x, y, z : integer;
a : string;
begin
randomize;
repeat
write ('С какого числа начинать? прим. начинать с 0 или с 1:');
readln (x);
write ('До какого числа '' рандромировать''? прим. до 10 или 5, или как вам угодно:');
readln (y);
repeat
z := x + random (y);
writeln (z);
readln;
write ('Если хотите поменять параметры, нажмите 0. Если хотите выйти нажмите 1. если хотите рандомнуть ещё раз нажмите 2. (после ввода нажмите enter)');
readln (a);
if a = '0' then
until;
else
if a = '1' then
break;
else
if a = '2' then
until;
else
writeln ('Чё?');
readln
end.

Не компилируется! Помогите пожалуйста.

JetV97
новенький
 
Сообщения: 11
Зарегистрирован: 29.11.2012 15:28:11
Откуда: Россия, Москва

Re: Randomize, пишу программу

Сообщение Paster Fob » 04.01.2013 16:21:57

JetV97 писал(а):Не компилируется!

Ещё бы!
Перед else ; не должно быть .Нет условия выхода из цикла.Вместо условных операторов лучше применить оператор выбора.

Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Randomize, пишу программу

Сообщение JetV97 » 04.01.2013 16:24:55

Спасибо.

JetV97
новенький
 
Сообщения: 11
Зарегистрирован: 29.11.2012 15:28:11
Откуда: Россия, Москва

Re: Randomize, пишу программу

Сообщение Paster Fob » 04.01.2013 16:47:25

побыстрому накалякал.Посмотри и изменяй как тебе угодно

Код: Выделить всё
var
  i,n,x,y,z:integer;

begin
  randomize;
  write('введите диапозон чисел x..y');
  readln(x,y);
  write('введите кол-во чисел : ');
  readln(n);
  for i:=1 to n do begin
    z:=random(y-x)+1+x;
    writeln(z);
  end;
  readln
end.

Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Randomize, пишу программу

Сообщение JetV97 » 04.01.2013 16:58:12

Спасибо еще раз. Пока вы не написали, я пробовал изменять свою программу. Все вроде правильно, но говорит, что break not’ allowed. скажите что тут не так

Код: Выделить всё
var x, y, z : integer;
a, b : string;
begin
randomize;
repeat
write ('С какого числа начинать? прим. начинать с 0 или с 1:');
readln (x);
write ('До какого числа '' рандромировать''? прим. до 10 или 5, или как вам угодно:');
readln (y);
z := x + random (y);
writeln (z);
readln;
write ('Если хотите поменять параметры, нажмите 0. Если хотите выйти нажмите 1. если хотите рандомнуть ещё раз c такими же параметрами оставте поле пустым. (после ввода нажмите enter)');
readln (a);
until a = '0';
if a = '1' then break;
repeat
if a = '' then
z := x + random (y);
writeln (z);
writeln ('Еще разок? Если да, введите 1, оставте поле пустым (не забудте нажать Enter)');
readln (b);
until b = '1'
end.
JetV97
новенький
 
Сообщения: 11
Зарегистрирован: 29.11.2012 15:28:11
Откуда: Россия, Москва

Re: Randomize, пишу программу

Сообщение A.N.Onim » 04.01.2013 17:06:02

Кажется у вас break идёт после цикла:

Код: Выделить всё
until a = '0';
if a = '1' then break;
A.N.Onim
новенький
 
Сообщения: 17
Зарегистрирован: 24.12.2012 00:18:52

Re: Randomize, пишу программу

Сообщение JetV97 » 04.01.2013 17:49:35

Ну… Если ‘1’, то repeat, если ‘0’, то break

JetV97
новенький
 
Сообщения: 11
Зарегистрирован: 29.11.2012 15:28:11
Откуда: Россия, Москва

Re: Randomize, пишу программу

Сообщение sign » 04.01.2013 18:01:45

JetV97, употребляйте отступы. Будет читабельней и ошибки видней.
Переписал (не исправляя и не правя (кроме одного write)) вашу программу:

Код: Выделить всё
var x, y, z : integer;
    a, b : string;
begin
  randomize;
  repeat
    write ('С какого числа начинать? прим. начинать с 0 или с 1:');
    readln (x);
    write ('До какого числа '' рандромировать''? прим. до 10 или 5, или как вам угодно:');
    readln (y);
    z := x + random (y);
    writeln (z);
    readln;
    write('Если хотите поменять параметры, нажмите 0.');
    write('Если хотите выйти нажмите 1.');
    write('Если хотите повторить нажмите Enter)');
    readln (a);
  until a = '0';
  if a = '1' then break;
  repeat
    if a = '' then z := x + random (y);
    writeln (z);
    writeln ('Еще разок? Если да, введите 1, оставте поле пустым (не забудте нажать Enter)');
    readln (b);
  until b = '1'
end.

Последний раз редактировалось sign 05.01.2013 09:30:52, всего редактировалось 1 раз.

sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Randomize, пишу программу

Сообщение Oleg_D » 04.01.2013 18:09:39

Спасибо, sign, я то же самое хотел предложить, но вы опередили.
В этом случае хорошо видно, что Break расположен за пределами циклов, а это недопустимо.

Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: Randomize, пишу программу

Сообщение JetV97 » 04.01.2013 18:47:57

Всё, всё понял, огромное спасибо, исправил! Еще раз спасибо!!! :D

Добавлено спустя 17 минут 48 секунд:
Чё-то я сильно накосячил…

JetV97
новенький
 
Сообщения: 11
Зарегистрирован: 29.11.2012 15:28:11
Откуда: Россия, Москва


Вернуться в Книга «Песни о Паскале»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

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

Сообщение

Описание

Error: Parameter list size exceeds 65535 bytes

Для процессора I386 ограничен список параметров 65535 байтами (тому причиной инструкция RET).

Error: File types must be var parameters

Вы не можете указать файлы как значения параметров, то есть они всегда должны быть объявлены как параметры var.

Error: The use of a far pointer isn’t allowed there

Free Pascal не поддерживает указатели far, поэтому вы не можете взять адрес выражения, которое имеет связь far. Конструкция mem имеет связь far, поэтому следующий код вызовет эту ошибку:

var p : pointer;

p:=@mem[a000:000];
 

Error: EXPORT declared functions can’t be called

Больше не используется.

Warning: Possible illegal call of constructor or destructor

Компилятор обнаружил, что конструктор или деструктор вызываются внутри метода. Это вероятно приведёт к проблемам, так как конструкторы/деструкторы требуют входных параметров.

Note: Inefficient code

Ваш оператор вызывает сомнения у компилятора.

Warning: unreachable code

Вы указали конструкцию, которая никогда не будет выполнена. Например:

while false do
begin
  {.. Код …}
end;

Error: Abstract methods can’t be called directly

Вы не можете вызвать абстрактный метод напрямую. Вместо этого вы должны перегружаемый дочерний метод, потому что абстрактный метод не выполняется.

Register Сообщ1 weight Сообщ2 Сообщ3

Отладочное сообщение. Отображается, если компилятор ожидает переменную для сохранения в регистрах.

Stack frame is omitted

Некоторые процедуры/функции не нуждаются в полном стековом фрейме, и им пренебрегают. Это сообщение появляется, если используется опция –vd.

Error: Object or class methods can’t be inline.

Вы не можете иметь предопределённые методы объекта.

Error: Procvar calls cannot be inline.

Процедура с процедурной переменной не может быть предопределённой.

Error: No code for inline procedure stored

Компилятор не может записать код для предопределённой процедуры.

Error: Element zero of an ansi/wide­ or longstring can’t be accessed, use (set)length instead

Вы должны использовать setlength для установки длины для типов ansi/wide/longstring и length, чтобы получить длину такого строкового типа.

Error: Constructors or destructors cannot be called inside a ’with’ clause

Внутри предложения with вы не можете вызвать конструктор или деструктор для объекта, который находится внутри этого предложения with.

Error: Cannot call message handler methods directly

Метод обработчика сообщений не может быть вызван напрямую, если он содержит явно аргумент Self.

Error: Jump in or outside of an exception block

Не допускается выполнять переход в или из блока обработки исключения, подобно этому: try..finally..end;. Например, следующий код приведёт к такой ошибке:

label 1;

try
 if not(final) then
   goto 1; // Эта строка вызовет ошибку
finally
 …
end;
1:

Error: Control flow statements aren’t allowed in a finally block

Не допускается использовать операторы управления потоком, такие как break, continue и exit внутри оператора finally. Следующий пример показывает проблему:


try
p;
finally

exit; // Этот exit недопустим
end;

Если в процедуре p произойдёт исключение, то будет выполнен блок finally. Если выполнение подойдёт к exit, то будет непонятно, что делать – выходить из процедуры или искать другой обработчик исключения.

Warning: Parameters size exceeds limit for certain cpu’s

Это означает, что вы объявили больше чем 64К параметров, что не поддерживается данным целевым процессором.

Warning: Local variable size exceed limit for certain cpu’s

Это означает, что вы объявили больше чем 32К локальных переменных, что не поддерживается данным целевым процессором.

Error: Local variables size exceeds supported limit

Это означает, что вы объявили больше чем 32К локальных переменных, что не поддерживается этим процессором.

Error: BREAK not allowed

Вы пытаетесь использовать break вне тела цикла.

Error: CONTINUE not allowed

Вы пытаетесь использовать continue вне тела цикла.

Fatal: Unknown compilerproc «Сообщение». Check if you use the correct run time library.

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

Fatal: Cannot find system type «Сообщение». Check if you use the correct run time library.

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

Hint: Inherited call to abstract method ignored

Это сообщение появляется только в режиме Delphi, если вы вызываете абстрактный метод родительского класса через наследование (через inherited;). Такой вызов игнорируется.

Error: Goto label «Сообщение» not defined or optimized away

Метка, использованная в определении goto, не определена или находится в коде слишком далеко.

Fatal: Cannot find type ”arg1” in unit ”arg2”. Check if you use the correct run time library.

The compiler expects that the runtime library contains certain type definitions. If you see this error and you didn’t change the runtime library code, it’s very likely that the runtime library you’re using doesn’t match the compiler in use. If you changed the runtime library this error means that you removed a type which the compiler needs for internal use.

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

Error: Interprocedural gotos are allowed only to outer subroutines

Gotos between subroutines are only allowed if the goto jumps from an inner to an outer subroutine or from a subroutine to the main program

GOTOS между подпрограммами разрешается только при перейти прыжки с внутренней к внешней подпрограммы или из подпрограммы в основную программу

Error: Label must be defined in the same scope as it is declared

In ISO mode, labels must be defined in the same scope as they are declared.

В режиме ISO, этикетки должны быть определены в том же объеме, как они были объявлены.

Error: Leaving procedures containing explicit or implicit exceptions frames using goto is not allowed

Non-local gotos might not be used to leave procedures using exceptions either implicitly or explicitly. Procedures which use automated types like ansistrings or class constructurs are affected by this too.

Номера для местных GOTOS не могут быть использованы, чтобы оставить процедур с использованием исключений явно или неявно. Процедуры, которые используют автоматизированные типы как AnsiStrings или класса constructurs страдают от этого тоже.

Понравилась статья? Поделить с друзьями:
  • Error braces around scalar initializer
  • Error bp fileid 0x00006c 464
  • Error box tkinter
  • Error box shadow
  • Error boundary перевод