delphicompiler-errorsbreakbubble-sortfreepascal

FPC does not allow me to use break in for loop


I am trying to create a for loop for my bubble sort algorithm and use break as a condition if there are no more numbers to be sorted anymore. But then the compiler complains:

Error: BREAK not allowed

Here is part of 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;

Solution

  • 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;