Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pos Routine nachprogrammieren ohne den Assembler zu benutzen? (https://www.delphipraxis.net/158686-pos-routine-nachprogrammieren-ohne-den-assembler-zu-benutzen.html)

hoan504 26. Feb 2011 19:09

Delphi-Version: 7

Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Hallo Delphi - Praxis,

Ich soll für die Schule die Pos - Funktion aus Delphi nachprogrammieren. Dafür soll ich nicht den Assembler benutzen(so etwas ist ja auch schon in der Code Libary).
Leider funktioniert auf meinem Windows 7 die Delphihilfe auch nicht und an Sysutils oder an die Systemunit komme ich nicht dran.

Mein Plan wäre jetzt über eine Schleife den String nach dem ersten Zeichen des Teilstrings durchsuchen zu lassen und
dann zu prüfen ob die anderen Zeichen in der richtigen Reihenfolge dahinterstehen und nur dann die Position des ersten auszugeben.
Die Frage ist nur wie ich das machen soll?

Vll. fällt ja irgendwem eine Lösung dazu ein.

SirThornberry 26. Feb 2011 19:11

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
wo genau liegt jetzt dein Problem? Die Lösung hast du ja bereits beschreiben. Fertigen Code werden wir dir nicht geben. Wie sieht dein bisheriger Code aus und was funktioniert daran anders als erwartet?

hoan504 26. Feb 2011 19:12

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
moment da muss ich jetzt erst schaffen den code wieder von meinem Server zu ziehen

hoan504 26. Feb 2011 19:14

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
ist es denn wenigstens möglich mir einen Tipp zu geben welche Schleife ich am besten nehmen sollte

s.h.a.r.k 26. Feb 2011 19:16

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Wenn wir dir jetzt sagen, dass es mit allen drei (for/repeat/while) geht, wirst du nicht wirklich glücklicher damit werden ;) Fang doch einfach mal mit einer davon an und überleg dir, wie es gehen könnte. Kommst du nicht weiter, dann poste hier und wir versuchen dir zu helfen.

himitsu 26. Feb 2011 20:12

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Überleg dir ja erstmal, wie du es "manuell" machen würdest.

Da könnte man sich nun Scrabble-Steine nehmen, daraus zwei "Strings" zusammenstellen und sich dann überlegen, wie man am einfachsten vorgeht.

Dann schreibt man sich z.B. einen Ablauflan auf und versucht anschließend daraus einen Code zu entwickeln.

Als Schleife(en) kann man sich nur für While oder For-To entscheiden.
Repeat-Until ginge auch, aber es wäre hier wohl einfacher, wenn man die Schleifenbedingung erst prüft, bevor man darin was abarbeitet, aber zusammen mit einem If-Then ginge auch das Repeat.
Außerdem kann man nun die Strings zeichenweise verglichen, über
Delphi-Quellcode:
s[i]
, oder man geht z.B. über Copy oder Dergleichen.

hoan504 27. Feb 2011 10:18

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Hier erstmal mein Quellcode:

function ipos (Const Substr : string; s : String) : integer;
Var i,j : integer;
begin
ipos := 0;
If (length(substr) = 1) then
begin
for i:=1 to length(s) if (s[i]= Substr) then ipos := i;
end
else
If (length(substr) > 1) then
begin
for i:=1 to length(s) do
if (s[i]= Substr[1]) then
for j:=2 to length(substr) do
if (substr[j] = s[i+1]) then ipos := i
else
ipos := -1;
end;
end;

funktioniert so erstmal ganz gut, aufgrund der for-schleife gibt es nur ein Problem: es wird immer die letzte stelle geliefert an der etwas gefunden wurde.
Wie kann ich denn die For - Schleife verlassen sobald der if-befehl erfüllt ist?

-187- 27. Feb 2011 10:47

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Exit ?

PS: Setz dein Code mal in Delphi Tags und formatier ihn ordentlich^

Notxor 27. Feb 2011 10:50

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Wohl eher
Delphi-Quellcode:
break
.
Delphi-Quellcode:
exit
verlässt die gesamte Prozedur/Funktion

-187- 27. Feb 2011 10:53

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Er will doch auch die Methode verlassen wenn die if Bedingung erfüllt ist ?

Edit: hoan504, da fehlt ein "do" in deinem Code :D

himitsu 27. Feb 2011 11:04

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
For-Downto, Delphi-Referenz durchsuchenExit oder Delphi-Referenz durchsuchenBreak

Notxor 27. Feb 2011 11:12

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
der Index in der letzten If-Abfrage scheint auch nicht zu stimmen. mMn gehört da auf alle Fälle ein "j" mit hinein, nicht nur "i+1"

-187- 27. Feb 2011 11:26

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Nach der letzten else Bedingung wäre auch Result:=0; richtig anstelle von Result:=-1;

Oder täusche ich mich ?

Sir Rufo 27. Feb 2011 11:42

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Ich habe da mal einen möglichen Ablauf aufgeschrieben ...
Code:
// Beispiel-Daten
SubStr ist "test" // Länge 4
SuchStr ist "Dieses ist nur zum testen gedacht!" // Länge 34

// Das Ergebnis ist erst mal 0
Ergebnis = 0

Durchlaufen von 1 bis {Länge SuchStr=34} - {Länge SubStr=4} + 1 // also bis 31
  TempStr = Hole {Länge SubStr} Zeichen von SuchStr ab der aktuellen Position
  Wenn TempStr = SubStr Dann
    Ergebnis = Aktuelle Position
    Durchlaufen abbrechen

hoan504 27. Feb 2011 12:39

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
an '187'

die -1 ist da nur anstatt 0 damit in meinem editfeld klar wird, dass sich das gesuchte ergebnis nicht im string befindet

-187- 27. Feb 2011 12:43

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Und was ist dann der Unterschied zur 0 ? :D

Kein Ergebnis = 0 afaik :)


Edit: Also es kommt jetzt drauf an..Wenn du die Pos Funktion nachbauen willst ist Kein Ergebnis = 0. Du dachtest wahrscheinlich das dass erste Vorkommnis = 0 ist, dem ist aber nicht so :)

Oooder aber du willst dir eine Custom Pos Funktion bauen wobei das auch da kein Sinn macht :D

Greetz

hoan504 27. Feb 2011 15:13

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
tja aber die die pos-funktion ist an mein programm angepasst, bzw. an edit felder angepasst. die 0 oder die -1 gibt nur an dass kein ergebnis gefunden wurde. Genauso gut hätte ich auch eine string ausgeben können.

-187- 27. Feb 2011 15:33

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Naja das macht ja noch weniger Sinn :D

Wozu brauchst du -1 für "kein Ergebnis" wenn 0 dafür schon vorhanden ist :?:

Notxor 27. Feb 2011 15:49

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Code:
Durchlaufen von 1 bis {Länge SuchStr=34} - {Länge SubStr=4} // also bis 30
Gehört da nicht " 1 bis 34-4 +1" ?

Wenn man bei 30 anfängt, vergleicht man ja {30,31,32,33} es sollte jedoch mit 34 enden(wenn man bei 1 zu zählen beginnt; wäre 0 nicht sinnvoller?)

Sir Rufo 27. Feb 2011 16:25

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Zitat:

Zitat von Notxor (Beitrag 1084678)
Code:
Durchlaufen von 1 bis {Länge SuchStr=34} - {Länge SubStr=4} // also bis 30
Gehört da nicht " 1 bis 34-4 +1" ?

Wenn man bei 30 anfängt, vergleicht man ja {30,31,32,33} es sollte jedoch mit 34 enden(wenn man bei 1 zu zählen beginnt; wäre 0 nicht sinnvoller?)

Ja, es muss +1 dazu

Und nein, bei 0 anfangen ist nicht sinnvoller, da ein String bei 1 anfängt und nicht bei 0.

-187- 27. Feb 2011 17:06

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1084689)
Und nein, bei 0 anfangen ist nicht sinnvoller, da ein String bei 1 anfängt und nicht bei 0.

Eben, und aus diesem Grund ist ein -1 für kein Ergebnis auch sinnfrei :)

hoan504 27. Feb 2011 17:26

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
ihr habt natürlich völlig recht, irgendwie habe ich das vorher garnicht bemerkt :wall:

allerdings versteh ich das mit dem teilstring vom ganzen string abziehen nicht so ganz

-187- 27. Feb 2011 17:42

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Was genau meinst du damit :?: ?

Immer wenn ein Wort gefunden und umgedreht wurde wird der Satz Ausgangsatz natürlich verkürzt damit das nächste Wort gefunden werden kann. Sonst w+rde man immer das selbe Wort finden :)

War das deine Frage?

Edit: Hast du denn was eigenes geschrieben ? Zeig uns deinen Code :P

Sir Rufo 27. Feb 2011 19:05

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Zitat:

Zitat von hoan504 (Beitrag 1084704)
allerdings versteh ich das mit dem teilstring vom ganzen string abziehen nicht so ganz

wo, wie, was, wer sagt denn was davon?

Wenn du von einem String nur einen Teil haben möchtest, dann nimmst du am besten die Funktion copy
Delphi-Quellcode:
// Copy( AString, APosition, ALänge ) -> liefert einen String zurück
ShowMessage( Copy( 'Hallo wie gehts?', 7, 3 ) ); // zeigt "wie" an
// Der Parameter für die Länge kann auch weggelassen werden
ShowMessage( Copy( 'Hallo wie gehts?', 7 ) ); // zeigt "wie gehts?" an

Notxor 27. Feb 2011 19:16

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Zitat:

Zitat von Sir Rufo
Und nein, bei 0 anfangen ist nicht sinnvoller, da ein String bei 1 anfängt und nicht bei 0.

Tatsächlich :shock:

War der Meinung, ein String beginnt mit 0, ähnlich einem dyn. Array. Gut zu wissen :idea:

himitsu 27. Feb 2011 19:19

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Nein, Strings fangen immer bei 1 an.

Grund ist der "Urstring" aka ShotString.

Dort ist bei [0] das Längenbyte und das erste Zeichen fing demnach bei 1 an.

hoan504 27. Feb 2011 19:23

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
ich versteh gar nicht wie wir auf einmal auf copy gekommen sind :gruebel:

eigentlich habe ich nur deinen ersten Programmartigen Code gemeint. Inzwischen funktioniert das Programm aber sowieso einwandfrei, dank der vielen Tipps.

omata 27. Feb 2011 21:08

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Zitat:

Zitat von hoan504 (Beitrag 1084627)
Wie kann ich denn die For - Schleife verlassen sobald der if-befehl erfüllt ist?

Wenn man eine Schleife vorzeitig beenden möchte, dann benutzt man eine kopf- oder fussgesteuerte Schleife. Also garantiert keine FOR-Schleife, sondern WHILE oder REPEAT.

himitsu 27. Feb 2011 21:16

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Zitat:

Zitat von omata (Beitrag 1084748)
Also garantiert keine FOR-Schleife

Das würde ich so nicht unterschreiben.

Break existiert nicht umsonst und damit kann man alle Schleifen abbrechen.

Luckie 27. Feb 2011 21:19

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Aber omatas Lösung ist schöner, da man die Abbruchbedingung sofort sieht. Break ist eigentlich nur ein verstecktes goto und darüber müssen wir wohl nicht diskutieren. ;)

himitsu 27. Feb 2011 21:27

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Ich fand cool, daß Delphi Break und Exit auch mal als stille Exception löst, wenn es nicht anders gehn.

-187- 28. Feb 2011 05:27

AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
 
Ja break ist hart :D Eine repeat/until bzw while/do Schleife ist aufjedenfall eleganter :)

Grade für eine Schulübung kann man das Problem mal mit jeder Schleife lösen :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:06 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-2025 by Thomas Breitkreuz