Martin Frb wrote:

Drat- a dangling else in a case! I should have spotted that, but instead spent an hour or so picking at it.

1) If you use Lazarus then you can have case-labels highlighted (e.g add underline/border, blend foreground by mixing in another color, bold, ...) It is in the color config.

That will (in this case) not highlight the else, so you will know the else is part of the if.

Thanks, noted.

2) I tried your code and it compiles (2.6.2 win32)

{$mode objfpc}{$H+}


procedure TForm1.FormCreate(Sender: TObject);
var
  a: (help, help_, quit_);
  b: Integer;
begin
   try
    case a of
      help:        begin
                   end;
      help_:       begin
                   end;
      quit_:       if b = 1 then begin
                   end
    else
    end // line 323
  finally
  end;
end;

There were additional statements in between the else and the final end. Since the else associated with a case accepts multiple statements while the else associated with an if doesn't, the compiler was getting confused by what it thought was a spurious end statement. I'm sure I've been bitten by this one before, and recently enough for it to be embarrassing.

I find myself habitually putting in an explicit else part in each case statement, even if it's empty. That's a habit from Modula-2 days, I can't remember what the spec said but some (if not all) compilers insisted on it. In view of the potential for a dangling else, I'm not sure whether that's a good or a bad habit.

--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to