Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler: Inkompatible Typen - 'Char' und 'String'? (https://www.delphipraxis.net/122641-fehler-inkompatible-typen-char-und-string.html)

mo_greene 19. Okt 2008 20:00


Fehler: Inkompatible Typen - 'Char' und 'String'?
 
Hallo,

habe gerade ein Problem und irgendwie ein Brett vorm Kopf - finde keine Lösung:

Delphi-Quellcode:
function TForm1.wert(zeichenkette : string) : Integer;
var
  i, zaehler : Integer;
begin
  for i := 1 to Length(zeichenkette) do
  begin
    case zeichenkette[i] of
    'A..Z' : zaehler := zaehler + 1;
    'a..z' : zaehler := zaehler + 1;
    '0..9' : zaehler := zaehler + 2;
    end;
  end;

  result := zaehler;
   
end;
Da spuckt Delphi doch glatt die Fehlermeldung aus:

Zitat:

[Pascal Fehler] uView.pas(68): E2010 Inkompatible Typen: 'Char' und 'string'
Woran liegts?

Danke!

Apollonius 19. Okt 2008 20:05

Re: Fehler: Inkompatible Typen - 'Char' und 'String'?
 
'A..Z' ist ein String. 'A'..'Z' wäre ein Unterbereich von Char.

mo_greene 19. Okt 2008 20:05

Re: Fehler: Inkompatible Typen - 'Char' und 'String'?
 
Danke!

peschai 20. Okt 2008 05:22

Re: Fehler: Inkompatible Typen - 'Char' und 'String'?
 
Hallo

Noch ein kleiner tip, verwende wenn möglich "const" bei Zeichenketten bei der Parameterübergabe von Funktionen. Das spart eine kopie des strings auf dem Stack ein ... (besser für performance und speicherverbrauch). Desweiteren hast du deine Variable "Zaehler" nicht initialisiert, aber besser noch verwende gleich "result" anstelle "zaehler" ...

Vorschlag ...
Delphi-Quellcode:
function TForm1.wert(const zeichenkette : string) : Integer;
var
  i : Integer;
begin
  result := 0;
  for i := 1 to Length(zeichenkette) do
  begin
    case zeichenkette[i] of
    'A'..'Z' : result := result + 1;
    'a'..'z' : result := result + 1;
    '0'..'9' : result := result + 2;
    end;
  end;
end;

bernau 20. Okt 2008 08:29

Re: Fehler: Inkompatible Typen - 'Char' und 'String'?
 
Man kann's auch so schreiben

Delphi-Quellcode:
var
  i : Integer;
begin
  result := 0;
  for i := 1 to Length(zeichenkette) do
    if zeichenkette[i] in ['A'..'Z','a'..'z','0'..'9'] then
       result := result + 1;
end;
Gerd

DeddyH 20. Okt 2008 08:33

Re: Fehler: Inkompatible Typen - 'Char' und 'String'?
 
Stimmt nicht ganz, bei Ziffern soll um 2 erhöht werden ;)

bernau 20. Okt 2008 08:42

Re: Fehler: Inkompatible Typen - 'Char' und 'String'?
 
Zitat:

Zitat von DeddyH
Stimmt nicht ganz, bei Ziffern soll um 2 erhöht werden ;)

Übersehen. :oops:

nicodex 20. Okt 2008 08:52

Re: Fehler: Inkompatible Typen - 'Char' und 'String'?
 
Zitat:

Zitat von bernau
Man kann's auch so schreiben

Sorgt das nicht für Probleme mit Unicode-Strings (Delphi 2009)?
Wenn ich mich recht erinnere, dann können Delphi-Sets nur 256 Elemente abbilden. Man müsste dann wieder eine case-Abfrage daraus machen.

bernau 20. Okt 2008 08:56

Re: Fehler: Inkompatible Typen - 'Char' und 'String'?
 
Zitat:

Zitat von nicodex
Zitat:

Zitat von bernau
Man kann's auch so schreiben

Sorgt das nicht für Probleme mit Unicode-Strings (Delphi 2009)?
Wenn ich mich recht erinnere, dann können Delphi-Sets nur 256 Elemente abbilden. Man müsste dann wieder eine case-Abfrage daraus machen.

Das Set selber kann 256 verschiedene Elemente beinhalten. In diesem Fall sind es 26+26+10 = 62. Das sind weniger als 256.


Gerd

alzaimar 20. Okt 2008 09:14

Re: Fehler: Inkompatible Typen - 'Char' und 'String'?
 
Zitat:

Zitat von bernau
Das Set selber kann 256 verschiedene Elemente beinhalten. In diesem Fall sind es 26+26+10 = 62. Das sind weniger als 256.

Das ist zwar richtig, für das 'SET' aber irrelevant. Bei einer Menge ist nicht die Anzahl der Elemente limitiert, sondern die höchste Ordnungszahl eines Elementes.

Ein 'SET' (Menge) wird intern als 32 Byte langer Bitvektor abgebildet, das entspricht einem 'Packed Array [0..255] Of Boolean'. Daraus folgt nun, das die Elemente einer Menge nur aus einem ordinalen Typ bestehen kann, der
1. maximal 256 verschiedene Werte annehmen kann und
2. dessen höchster Ordinalwert (also Ord(High(TType))) kleiner als 256 sein muss.

Ein "Char" ist somit der größte Datentyp, bei dem man mit Mengen arbeiten kann ("Byte" ist äquivalent)

Es kann sein, das Delphi 2009 dies für 'Set Of Char'-Ausdrücke anders implementiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz