Entwickler-Ecke

Sonstiges (Delphi) - If satz macht das gegenteil von dem was er machen soll


elbucko - Mo 13.09.04 23:03
Titel: If satz macht das gegenteil von dem was er machen soll
HAllo erst mal. mein erster tag im forum beginnt natürlich mit meinem ersten problem.
hab in der suche nichts ähnliches gefunden:

hab eine function geschrieben, die angibt ob ein string (STR1) in einem anderen (STR2) enthalten ist:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
function IsStrIn(STR1: String; STR2: String): Boolean;
var
L1,L2 : Integer;   //Länge 1 und 2
P1,P2 : Integer;   //Position 1 und 2
Z1 : Integer;      //Zähler 1
b1 : Boolean;      //Boolean 1

begin

L1 := length(STR1);
L2 := length(STR2);
P1 := 0;
P2 := 0;
Z1 := 0;
b1 := false;


If L1 > L2 then IsStrIn := false else
 begin
  repeat

   if STR1[P1] = STR2[P2] then
    begin
     Z1 := Z1 + 1;
     P1 := P1 + 1;
     P2 := P2 + 1;
    end
    else
    begin
     P2 := P2 + 1;
     P1 := 0;
     Z1 := 0;
    end;

    if Z1 = L1 then b1 := true;
    if P2 > L2 then b1 := true;
    if P1 > L1 then b1 := true;

  until B1;

  if Z1 = L1 then IsStrIn := true else IsStrIn := false;
 end;
end;


rein logisch gesehen müsste das ganze funktionieren. aber der if-satz in zeile 22 - 33 macht genau das gegenteil von dem was er machen soll:

wenn "STR1[P1] = STR2[P2]" also zum beispiel 'a' = 'a' (also TRUE) dann führt er die befehle hinter dem "else" aus, obwohl er diese ja nur dann ausführen sollte wenn z.B. 'a' = 'b' (also FALSE).

Wenn ich aus "STR1[P1] = STR2[P2]" -> "STR1[P1] <> STR2[P2]" mache, dann funktioniert es zwar, aber das macht doch keinen sinn oder? kann mir einer erklären was ich falsch mache oder wo mein denkfehler liegt?

ach so, noch etwas: wenn STR1 am Anfang von STR2 vorkommt:
STR1 := '<TABLE';
STR2 := '<TABLE width=100%>;
dann tritt der fehler nicht auf.

wenn aber
STR1 := 'ABLE';
STR2 := '<TABLE width=100%>;
dann tritt obiger fehler auf.

obwohl 'a' <> '<' (mit P1 = P2 = 0 )führt er trotzdem die befehle
Z1 := Z1 + 1;
P1 := P1 + 1;
P2 := P2 + 1;
aus.



HILLLFFFFEEEEEEE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Moderiert von user profile iconMotzi: Code- durch Delphi-Tags ersetzt.


Delete - Mo 13.09.04 23:45

Was soll den deine ganze Funktion eigentlich machen? Und ganz nebenbei bemerkt, das erste Zeichen eines Strings steht an der Stelle 1 und nicht 0.


hansa - Di 14.09.04 01:49

Luckie hat Recht, der Code ist für die Sau. :lol:


Delphi-Quelltext
1:
if Z1 = L1 then b1 := true;                    


schreibe das besser so :


Delphi-Quelltext
1:
bl := Z1 = L1;                    


Der Rest ist für so ein einfaches Problem zu kompliziert. 8)


Delete - Di 14.09.04 02:12

@hansa: Das ist geschmackssache.


hansa - Di 14.09.04 02:14

und was wird grundsätzlich initiiert, false oder true :?:


Delete - Di 14.09.04 02:16

False, hat er doch oben geschrieben beim Initialisieren der Variablen.


merlin83 - Di 14.09.04 06:32

Moin!

Wenn du prüfen willst, ob ein String in einem anderen enthalten ist, geht das am besten (finde ich) mit If copy(String1,Startzeichen,length(String2))=String2 then Anweisungen;

Das mach ich eigentlich immer so und funktioniert perfekt.

Viele Grüße,


merlin83


jasocul - Di 14.09.04 07:10

Ich mag mich ja irren, aber genügt nicht die Pos-Funktion ??


Delphi-Quelltext
1:
if Pos(STR1,STR2) > 0 then "Denn isser enthalten"                    


opfer.der.genauigkeit - Di 14.09.04 10:37

Gehen wir halt noch nen Schritt weiter. *gg*

Wie wär's mit der Funktion:


Quelltext
1:
                    


jasocul - Di 14.09.04 10:43

Ich glaube, wir haben hier was falsch verstanden. Ich denke, er hat eine Hausaufgabe, in der er die vorgestellten Funktionen nicht benutzen darf.

Somit war der Hinweis, dass er P1 und P2 erst bei 1 anfangen lassen darf, der richtige Tip.

Auf jeden Fall sollte die Routine aber noch prüfen, ob die Strings nicht leer sind.


opfer.der.genauigkeit - Di 14.09.04 11:25

Dann soll er sie nachprogrammieren :)

Am besten ne Pos - Funktion die auch Case- Sensitiv ist. :wink:


jasocul - Di 14.09.04 11:42

Aber bitte in asm. Dann gehts schneller.

Zitat:

Am besten ne Pos - Funktion die auch Case- Sensitiv ist

Wie war das mit dem Hilfe-Text zur Pos-Funktion? Die sollte man besser nicht lesen, damit man die Funktion versteht.


Delete - Di 14.09.04 11:45

jasocul hat folgendes geschrieben:
Aber bitte in asm. Dann gehts schneller.

Zitat:

Am besten ne Pos - Funktion die auch Case- Sensitiv ist

Wie war das mit dem Hilfe-Text zur Pos-Funktion? Die sollte man besser nicht lesen, damit man die Funktion versteht.

Wieso? ist doch klar verständlich. Wenn man die deutsche Hilfe hat, sollte man nur wissen, dass dort ein fehler drin ist. Denn pos ist casesensitive und nicht, anderes rum, wie es die deutsche Hilfe behauptet.


jasocul - Di 14.09.04 12:05

Sorry, nächstes mal hebe ich die Ironie deutlicher hervor.


opfer.der.genauigkeit - Di 14.09.04 12:23

siehe: http://www.delphi-forum.de/viewtopic.php?t=14616&highlight=


elbucko - Mi 15.09.04 18:54

@luckie:

Zitat:
Und ganz nebenbei bemerkt, das erste Zeichen eines Strings steht an der Stelle 1 und nicht 0.


da lag der fehler, jetzt funktioniert alles wie es soll. Danke!


@Hansa:

ob nun

Delphi-Quelltext
1:
if Z1 = L1 then b1 := true;                    

oder

Delphi-Quelltext
1:
bl := Z1 = L1;                    

ist doch wurst. kenne beide schreibweisen und finde meine übersichtlicher.

@jasocul:

ja, die pos-funktion genügt zunächst vollkommen. allerdings ist das hier erstmal die vorarbeit für eine grössere funktion, die in dreidimensionalen string-arrays nach bestimmten würfeln suchen soll. wollte bevor ich das in angriff nehme erst mal einfache strings unter kontrolle bringen. (woran ich ja fast gescheitert wäre :lol: )

ach ja: es ist keine hausaufgabe. hab schon lange keine schule mehr von innen gesehen. 8)


hansa - Mi 15.09.04 19:01

elbucko hat folgendes geschrieben:
@Hansa:

ob nun

Delphi-Quelltext
1:
if Z1 = L1 then b1 := true;                    

oder

Delphi-Quelltext
1:
bl := Z1 = L1;                    

ist doch wurst. kenne beide schreibweisen und finde meine übersichtlicher.


Im Prinzip hast du da Recht, aber : 1. im zweiten Fall erhält b1 garantiert einen definierten Wert, ohne ihn initialisieren zu müssen, was ich aber trotzdem machen würde. 8) 2. ich spare gerne Zeilen :lol:


elbucko - Mi 15.09.04 19:37

hast gewonnen, so gesehen macht deine version mehr sinn. :flehan: :D