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
122k14 gold badges220 silver badges437 bronze badges
asked Jul 21, 2022 at 11:55
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
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
Всё, всё понял, огромное спасибо, исправил! Еще раз спасибо!!!
Добавлено спустя 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; |
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 |
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; |
Error: Control flow statements aren’t allowed in a finally block |
Не допускается использовать операторы управления потоком, такие как break, continue и exit внутри оператора finally. Следующий пример показывает проблему: … Если в процедуре 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 страдают от этого тоже. |