Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Warum stürzt es immer ab? (https://www.delphipraxis.net/125224-warum-stuerzt-es-immer-ab.html)

reyka 2. Dez 2008 20:57


Warum stürzt es immer ab?
 
Ich will mit folgendem Code meinen String nach Zahlen durchsuchen, jedoch stürzt das Progamm ab sobald man den Button clickt (Edit1.text muss Inhalt haben.)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var

l,j,i,x : integer;
s: string;
begin
j:=1;
s:=edit1.text;
l:= length(s);
for i:=0 to l - 1 do
begin
    repeat
    if s[i] in ['0'..'9'] then
       z[j]:=z[j]+s[i];
    until
         s[i]='';
         j:=j+1;

end;
end;
end.
was mach ich da falsch? =(

SirThornberry 2. Dez 2008 20:58

Re: Warum stürzt es immer ab?
 
was heißt abstürzen? Welche Fehlermeldung bekommst du?
Verstehst du den Quelltext eigentlich selbst?

Unter welchen Umständen meinst du das folgende Anweisung eintritt?
Delphi-Quellcode:
until s[i]='';
Ich glaube wenn du den Quelltext entsprechend des offiziellen Styleguides einrückst findest du eher den Fehler.

mkinzler 2. Dez 2008 20:59

Re: Warum stürzt es immer ab?
 
Strings beginnen bei 1
Delphi-Quellcode:
for i:=1 to l do

reyka 2. Dez 2008 21:04

Re: Warum stürzt es immer ab?
 
Zitat:

was heißt abstürzen? Welche Fehlermeldung bekommst du?
es stürzt ohne Fehlermeldung ab


Zitat:

Zitat von mkinzler
Strings beginnen bei 1
Delphi-Quellcode:
for i:=1 to l do

Ok damit stürzt es nich ab sobald etwas drin steht, aber sobald mehr als 1 Zeichen im String vorhanden sind stürzt es wieder ab.

Zitat:

Unter welchen Umständen meinst du das folgende Anweisung eintritt?
Delphi-Quellcode:
until s[i]='';

Sobald ein Leerzeichen "erkannt" wird

mkinzler 2. Dez 2008 21:13

Re: Warum stürzt es immer ab?
 
Delphi-Quellcode:
until s[i]='' or i = l;
Oder die Position des Leerzeichens vorher ermitteln und die Grenze der Schleife entsprechend setzen

Forlan 2. Dez 2008 21:15

Re: Warum stürzt es immer ab?
 
Zitat:

Zitat von reyka
Zitat:

was heißt abstürzen? Welche Fehlermeldung bekommst du?
es stürzt ohne Fehlermeldung ab


Zitat:

Zitat von mkinzler
Strings beginnen bei 1
Delphi-Quellcode:
for i:=1 to l do

Ok damit stürzt es nich ab sobald etwas drin steht, aber sobald mehr als 1 Zeichen im String vorhanden sind stürzt es wieder ab.

Zitat:

Unter welchen Umständen meinst du das folgende Anweisung eintritt?
Delphi-Quellcode:
until s[i]='';

Sobald ein Leerzeichen "erkannt" wird

wäre ein Leerzeichen nicht dies hier?:
Delphi-Quellcode:
 until s[i]=' ';
und nicht
Delphi-Quellcode:
s[i]=''

reyka 2. Dez 2008 21:23

Re: Warum stürzt es immer ab?
 
[quote="Forlan"]
Zitat:

Zitat von reyka
Zitat:

was heißt abstürzen? Welche Fehlermeldung bekommst du?
wäre ein Leerzeichen nicht dies hier?:
Delphi-Quellcode:
 until s[i]=' ';
und nicht
Delphi-Quellcode:
s[i]=''

macht kein Unterschied stürzt es auch ab wenn ich nu '12' eingebe sobald mehr als 1 zeichen vorhanden ist -> Absturz

mkinzler 2. Dez 2008 21:26

Re: Warum stürzt es immer ab?
 
Klar, das es über die grenze geht, deshalb auch Abbruch bei Stringende

reyka 2. Dez 2008 21:28

Re: Warum stürzt es immer ab?
 
Zitat:

Zitat von mkinzler
Klar, das es über die grenze geht, deshalb auch Abbruch bei Stringende

:wiejetzt: was meinste damit?

lbccaleb 2. Dez 2008 21:29

Re: Warum stürzt es immer ab?
 
Was ist denn "z"??

reyka 2. Dez 2008 21:33

Re: Warum stürzt es immer ab?
 
Delphi-Quellcode:
var
  Form1: TForm1;
  z:Array[1..3]of string;
  j: integer;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
...
z is ein Array

mkinzler 2. Dez 2008 21:33

Re: Warum stürzt es immer ab?
 
Und was soll die Reapet-Schleife überhaupt bewirken? Da du den Index in ihr nicht änderst, wird sie zur Endlosschleife

reyka 2. Dez 2008 21:45

Re: Warum stürzt es immer ab?
 
repeat schleife soll bewirken, dass der Inhalt von s an der Stelle i immer z[j] hinzugefügt wird, im Falle dass es eine Zahl ist.

aber nicht das ALLe Zahlen in eine Variable geschrieben werden sondern in mehrere.
Deshalb der Array.

Beispiel:

Hans kauft 20 Äpfel und 77 LCDFlachbildschirme in Form einer Tomate.

so soll '20' in eine Variable (in z[1]) und '77' in eine andere Variable (z[2]) geschrieben werden

mkinzler 2. Dez 2008 21:47

Re: Warum stürzt es immer ab?
 
Das Pronlem ist halt nur, das sich der Wert in s[i] nicht ändert, weil i ja in der Schleife konstant ist!

reyka 2. Dez 2008 21:51

Re: Warum stürzt es immer ab?
 
autsch ^^ simmt. Wie kann ich das beheben? Stehe gerade auf dem Schlauch :gruebel:

mkinzler 2. Dez 2008 21:56

Re: Warum stürzt es immer ab?
 
Splitte den String vorher in Teilstrings

SirThornberry 2. Dez 2008 21:58

Re: Warum stürzt es immer ab?
 
Was ich eigentlich wissen wollte - was verstehst du unter abstürzen?

mkinzler 2. Dez 2008 22:00

Re: Warum stürzt es immer ab?
 
Er hat sich eine Endlosschleife gebastelt, in welcher einem String, der Maximal 3 Zeiccehn haben kann, pro Durchgang ein Zeichen anhängt.

reyka 2. Dez 2008 22:02

Re: Warum stürzt es immer ab?
 
Zitat:

Zitat von mkinzler
Splitte den String vorher in Teilstrings


wie sähe das dann aus? Sorry ich bin halt noch ein ziemlicher Anfänger :snowball:

mkinzler 2. Dez 2008 22:03

Re: Warum stürzt es immer ab?
 
Z.B. mit Explode(), Pos()/PosEx(), Stringliste (.Delimiter/.DelimitedText)

reyka 2. Dez 2008 22:08

Re: Warum stürzt es immer ab?
 
nein ^^ wo wir wieder da sind :( Stringlist scheidet aus -> hab Delphi 4, Explode() und Pos() versteh ich nich ... es gibt nirgends eine Idioten/Änfänger-erklärung (Nein, das in der CL versteh ich nich ;))

mkinzler 2. Dez 2008 22:12

Re: Warum stürzt es immer ab?
 
Pos() liefert dir die 1. Position eines Teilstrings innerhalb eines String zurück:

Delphi-Quellcode:
p := Pos( ' ', s);
liefert dir die Position des 1. Leerzeichens

PosEx() macht das Ganze mit Offset

Blackheart 2. Dez 2008 22:15

Re: Warum stürzt es immer ab?
 
Schau mal hier.
Pos & Copy

hurzli 2. Dez 2008 22:15

Re: Warum stürzt es immer ab?
 
Leider kann man nur erahnen, was das Beispiel tun soll.
Man hat mir heute auch schon hier geholfen, das wird nun meine gute Tat für heute.

Erst habe ich einmal eine übersichtliche Einrückung verwendet.
Deinen Quellcode kann man (respektive ich und mein Vorredner/-schreiber auch) nicht lesen.
Scheinbar du selbst auch nicht, denn es ist lauter überflüssiges Zeug darin enthalten.
Und die Benennung der Variablen solltest du auch sprechender wählen.
Sonst guckst du in einem Monat wieder auf diese Zeilen und fragst dich, was das um Himmels Willen sein soll.
Kommentare, sprechende Variablennamen und Leerzeichen sind auf Dauer hilfreich!

Zum Code:

Warum nichts passiert ? until s[i] = ''; 1. Der Zähler [i] wird nie erhöht ==> der Klassiker, die Endlosschleife. Das ist eigentlich schon genug. Und 2. s[i] kann NIEMALS '' sein!
Also: wenn die Endlosschleife nicht reicht, setzt man eben noch eine unerfüllbare Abbruchbedingung obendrauf !
(Für die einzeilige, doppelte Endlosschleife sollte man eigentlich einen Preis vergeben :lol:)
Genug jetzt!

Wenn ich den Code richtig interpretiert habe, willst du damit alle Ziffern aus einem String in einen anderen übertragen.
[z] konnte ich nicht finden, desshalb habe ich diese Variable als String definiert.
Den String [s] hole ich nicht aus einem Edit-Feld sondern setze ihn für das Beispiel direkt in der Funktion.
Übrig bleibt folgender Code. Ich habe absichtlich die auskommentierten Zeilen drin gelassen, damit du die Fehler sehen kannst.

Delphi-Quellcode:
uses ...., Dialogs, ...;

procedure TForm1.Button1Click(Sender: TObject);

var
   len,{j,}
   i{,x}     : integer;
   s        : string;
   z        : string;
   iErg     : integer;

begin
//   j := 0;
//   s:=edit1.text;
   s := 'Hallali_123_hallo*45*lala-678?(uiui)-90';
   len := Length( s );
//   for i := 0 to l - 1 do
   for i := 1 to len do
      begin
//         repeat
            if( s[ i ] in [ '0'..'9' ] ) then
               begin
//                  SetLength( z, j + 1 ); // ist z ein Array ? Dann SetLength verwenden !
//                  z[ j ] := z[ j ] + s[ i ]; // <== ????
                  z := z + s[ i ]; // <== meinst du das ?
               end;
//         until s[ i ] = '';

//         j := j + 1;

      end;

    // Nachdem keine Vorzeichen berücksichtigt werden, kann der Wert NIE kleiner 0 werden.
    // ==> -1 ist das Ergebnis, wenn im String keine Ziffern enthalten waren.
   iErg := StrToIntDef( z, -1 );

   ShowMessage( Format( 'Ergebnis z : [%s], iErg : [%d]', [ z, iErg ] ));

end;
Das sollte es gewesen sein.

Grüßle
hurzli

reyka 2. Dez 2008 22:34

Re: Warum stürzt es immer ab?
 
ja gut mit dem Code bekomme ich ALLE zahlen in eine Variable will aber jeden "Zahlen" Block in eine extra Variable speichern deshalb hatte ich auch z als Array festgelegt!

wie sähe das aus?

oldmax 3. Dez 2008 07:02

Re: Warum stürzt es immer ab?
 
Hi
Letzter Vorschlag war ja nicht schlecht, aber eben etwas unvollständig. Im Grundgerüst können wir schon den Code lassen, aber wenn du zusammenhängende Zahlen erkennen und in ein Array schreiben willst, dann solltest du auch mal ganz einfach und unkompliziert daran denken, wie du aus dem Text die Zahlen filterst. Genau das ist mit einem PC nachzubilden...
also:
es existiert ein globales Array Z für die Zahlen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  len    : Integer;
  i      : integer;
  j      : Integer;
  s      : string;
  ZahlStr : String;
begin
  j := 1;            // Zeiger auf 1. Arrayfeld
  s:=edit1.text;     // hab ich mal so übernommen
  ZahlStr:='';       // der ist ersmal ganz leer
  len := Length( s ); // nun hab ich die Anzahl der Zeichen im String
  for i := 1 to len do // und damit untersuch ich jedes einzelne Zeichem
  begin
    if( s[ i ] in [ '0'..'9' ] ) then ZahlStr:=ZahlStr+'s[i]; // wenn Zahl dann an den Zahlstr
    If (ZahlStr<>'') and (( S[i]<'0') or ( S]i]>'9') or (i=Len)) then // hier den Wechsel von Zahl auf Char erkennen
    begin
      Z[j]:=ZahlStr; // und Zahlstr ins Array eintragen
      ZahlStr:='';  // Zahlstr wieder leeren
      Inc(j);       // Index vom Array erhöhen....
    end;
  end;
end;
die Abfrage erklär ich mal:
Delphi-Quellcode:
If (ZahlStr<>'') // Zahlstr ist nicht leer, das gilt immer
and
(( S[i]<'0')    // Zeichen ist <'0' also unterhalb vom Zahlenbereich
or ( S]i]>'9')  // Zeichen ist >'9', also oberhalb vom Zahlenbereich
or (i=Len))     // oder das letzte Zeichen im String, falls der String mit Zahl endet
then
Nun mußt du nur noch sicherstellen, das du entweder nicht mehr als 3 Zahlenn im String hast, oder dein Array entsprechend größer ist. Außerdem, zum Rechnen mußt du die Strings in Zahlen wandeln.....
Gruß oldmax

reyka 3. Dez 2008 16:34

Re: Warum stürzt es immer ab?
 
Hat geklappt!! Danke dir sind noch 2 Schreibfehler drin

Delphi-Quellcode:
if( s[ i ] in [ '0'..'9' ] ) then ZahlStr:=ZahlStr+'s[i]; // wenn Zahl dann an den Zahlstr
Da muss das Hochkomma vor dem s weg[/delphi]

Delphi-Quellcode:
or ( S]i]>'9')  // Zeichen ist >'9', also oberhalb vom Zahlenbereich
Dort muss die klammer vor dem i um gedreht werden.


Super Oldmax, danke dir wirklich unglaublich !! :kiss:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr.

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