Autor Beitrag
elbucko
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 13.09.04 23:03 
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:

ausblenden volle Höhe 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Di 14.09.04 01:49 
Luckie hat Recht, der Code ist für die Sau. :lol:

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


schreibe das besser so :

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


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

_________________
Gruß
Hansa
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 14.09.04 02:12 
@hansa: Das ist geschmackssache.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Di 14.09.04 02:14 
und was wird grundsätzlich initiiert, false oder true :?:

_________________
Gruß
Hansa
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 14.09.04 02:16 
False, hat er doch oben geschrieben beim Initialisieren der Variablen.
merlin83
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 89

Win 98, Win 2000, SuSE Linux 9.3 Prof
D7 Personal, D2k5 Personal, Kylix
BeitragVerfasst: 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

_________________
If ProblemExists=True
Then ProblemExists:=False;
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 14.09.04 07:10 
Ich mag mich ja irren, aber genügt nicht die Pos-Funktion ??

ausblenden Delphi-Quelltext
1:
if Pos(STR1,STR2) > 0 then "Denn isser enthalten"					
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Di 14.09.04 10:37 
Gehen wir halt noch nen Schritt weiter. *gg*

Wie wär's mit der Funktion:

ausblenden Quelltext
1:
					

_________________
Stellen Sie sich bitte Zirkusmusik vor.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Di 14.09.04 11:25 
Dann soll er sie nachprogrammieren :)

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

_________________
Stellen Sie sich bitte Zirkusmusik vor.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 14.09.04 12:05 
Sorry, nächstes mal hebe ich die Ironie deutlicher hervor.
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Di 14.09.04 12:23 

_________________
Stellen Sie sich bitte Zirkusmusik vor.
elbucko Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
if Z1 = L1 then b1 := true;					

oder
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 15.09.04 19:01 
elbucko hat folgendes geschrieben:
@Hansa:

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

oder
ausblenden 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:

_________________
Gruß
Hansa
elbucko Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 15.09.04 19:37 
hast gewonnen, so gesehen macht deine version mehr sinn. :flehan: :D