Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   C# Werden weitere Bedingungen geprüft wenn das Ergebnis.. (https://www.delphipraxis.net/63978-werden-weitere-bedingungen-geprueft-wenn-das-ergebnis.html)

Pseudemys Nelsoni 25. Feb 2006 16:07


Werden weitere Bedingungen geprüft wenn das Ergebnis..
 
...schon klar ist?

In Delphi hatte ich folgende Funktion:

Delphi-Quellcode:
function TTokenizer.NumTok(const S: string): Integer;
var
  I: Integer;
begin
  Result := 0;
  for I := 1 to Length(S) do
    if (S[I] <> C) and ((I = 1) or (S[I-1] = C)) then
      Inc(Result);
end;
Sie kann _niemals_ einen Fehler verursachen indem "S[I-1]" kleiner ist als 1, bedingt durch die vorigen Bedingungen.

Ich habe mir den Code nun in C# umgeschrieben:

Code:
        public static int NumTok(string S, char C)
        {
            int Count = 0;

            for(int i = 0; i <= S.Length; i++)
                if(((S[i] != C) && (i == 1)) || (S[i-1] == C))
                    Count++;

            return Count;

        }

Nun bekomm ich ich beim aufruf von:

Code:
textBox1.Text = Tokenizer.NumTok("blubb.jo", '.').ToString();
den Fehler:

Zitat:

Unhandled exception at @($0,$0,$0). Exception class System.IndexOutOfRangeException with message 'Der Index war außerhalb des Arraybereichs.'. Process Project3.exe (90044)
Der Fehler kann nur dadurch kommen, dass weitere Bedingungen auch geprüft werden, wenn das Ergebnis auf jeden Fall schon 100% klar ist. Ist dies so in C#?

Christian S. 25. Feb 2006 16:13

Re: Werden weitere Bedingungen geprüft wenn das Ergebnis..
 
Hallo!

Zum einen schaut mir die Klammerung der beiden Ausdrücke (also Delphi und C#) nicht identisch aus. Kann aber auch täuschen ;-)

Zum anderen lässt Du den Index in C# bis zu S.Length laufen. Richtig wäre S.Length-1, weil ja auch schon bei 0 gestartet wird. Also aus dem "<=" ein "<" machen.

Grüße
Christian

Die Muhkuh 25. Feb 2006 16:15

Re: Werden weitere Bedingungen geprüft wenn das Ergebnis..
 
Hi,

Code:
if((S[i] != C) && ((i == 1) || (S[i-1] == C)))
Müssten die Klammern nicht so gesetzt werden, damit es wieder auf den Delphi-Code passt?

Pseudemys Nelsoni 25. Feb 2006 16:32

Re: Werden weitere Bedingungen geprüft wenn das Ergebnis..
 
Moin Christian,

mit -1 bekomme ich immernoch den Fehler ;).

@Spider:

Nope, es muss "entweder die ersten beiden oder nur das letzte" nicht aber "nur das erste oder die letzteren beiden"

JasonDX 25. Feb 2006 16:33

Re: Werden weitere Bedingungen geprüft wenn das Ergebnis..
 
fang mal die Exception ab und lass dir im except-Teil den index ausgeben, bei dem die Exception ausgelöst wurde. Wenn dieser bspw. 0 ist wäre das Problem ja relativ klar ;)

greetz
Mike

Die Muhkuh 25. Feb 2006 16:34

Re: Werden weitere Bedingungen geprüft wenn das Ergebnis..
 
Zitat:

Zitat von Pseudemys Nelsoni
@Spider:

Nope, es muss "entweder die ersten beiden oder nur das letzte" nicht aber "nur das erste oder die letzteren beiden"

Dann ist dein Delphi-Source aber auch falsch :stupid:

Pseudemys Nelsoni 25. Feb 2006 16:35

Re: Werden weitere Bedingungen geprüft wenn das Ergebnis..
 
Stimmt, jetzt wo Du(ihr) es sagt... die C# Variante stimmt von den Klammenr her nicht :mrgreen:

Danke :P

Elvis 25. Feb 2006 17:30

Re: Werden weitere Bedingungen geprüft wenn das Ergebnis..
 
Deine Tokenizerfunktionen sind in .Net schlichtweg nicht mehr notwendig. ;)


Code:
string[] tokens = "blubb.jo".Split(new char[1] {'.'});
int countTokens = tokens.Length;
foreach(string token in tokens)
  Console.WriteLine(token);
Oder in meiner fav. .Net-Sprache:
Delphi-Quellcode:
var tokens := 'blubb.jo'.Split(['.']);
var countTokens := tokens.Length;
for token : String in tokens do
  Console.WriteLine(token);

Pseudemys Nelsoni 25. Feb 2006 18:21

Re: Werden weitere Bedingungen geprüft wenn das Ergebnis..
 
Ahh wow, wusste gar nicht, dass es da sowas gibt - Genial.

Danke :)))


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:02 Uhr.

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