7

何らかの理由で、この case スイッチはコンパイルされません

var
    c: char;
begin
    case c of
        #32..#33, #35..pred('\'), succ('\')..#255, #256..#65535:
        ...

コンパイラは、「[DCC エラー] poparser.pas(206): E2030 Duplicate case label」と表示します

確認したところ、SizeOf(c) は 2、Low(c) は 0、High(c) は 65535 です。つまり、範囲は問題ないはずです。pred('\') は 91 のようで、succ('\') は 93 のようですが、これも OK です。他のケースもコメントアウトしましたが、結果は同じです。では、ここで何が問題なのですか?

完全な手順は次のとおりです。

function String2PO (s:string):string;
// Converts a string to the syntax that is used in .po files
var
  i: integer;
  c: char;
  escnext:boolean;
begin
  Result := '';
  escnext:=False;
  for i := 1 to length(s) do begin
    c := s[i];
    case c of
      #32..#33, #35..pred('\'),succ('\')..#255, #256..#65535:
        begin
          if escnext then Result:=Result+'\';
          Result := Result + c;
          escnext:=False;
        end;
      '\':begin
            Result:=Result+'\\';
            escnext:=False;
          end;
      #13:; // Do nothing
      #10:begin
            Result := Result + '\n';
            escnext:=False;
          end;
      #34:begin
            Result := Result + '\"';
            escnext:=False;
          end;
      #0:begin
           Result := Result + '\0';
           escnext:=True;
         end;
      #9:begin
           Result:=Result+'\t';
           escnext:=False;
         end;
    else
      Result := Result + '\x' + IntToHex(ord(c),2);
      escnext:=True;
    end;
  end;
  Result := '"' + Result + '"';
end;

行を次のように変更すると、

#32..#33, #35..pred('\'),succ('\')..#65535:

(..#255、#256..を削除すると、コンパイルされます:)

注:それはデルファイ2009です

4

0 に答える 0