AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Funktionen und Prozeduren

Ein Thema von Slashmob · begonnen am 5. Jan 2012 · letzter Beitrag vom 8. Jan 2012
Antwort Antwort
Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#1

AW: Funktionen und Prozeduren

  Alt 6. Jan 2012, 21:39
Ich hab's mal Überflogen, wenn ich es richtig verstanden habe, ist die Eingabedatei so etwas ähnliches wie eine Plottersteuerung. Das DIN-Programm wird durch die Eingabedatei gesteuert. Dein Job ist es die Eingabedatei zu prüfen und ggf. zu korrigieren/modifizieren?

Um Dich schlau zu machen solltest Du nach "Compiler" und "Parser" suchen.

Für einen ersten Einstieg
a) Kommentare löschen
b) Leerzeilen löschen
c) Sonderzeichen ("-") entfernen und melden
d) alles in Großbuchstaben
e) verbleibenden Text auf Gültigkeit prüfen (DELTAX/DELTAY HF#)

Gruß
K-H
Hab das DIN-Programm jetzt mal getestet. Das Programm erstellt eine Textdatei mit Hilfsfunktionen (Stiftwerkzeuge) und Datensätzen in Form von absoluten und relativen Koordinaten. So eine Textdatei sieht dann z.B. so aus:
Code:
HF1
X240Y132
HF2
X171Y241
X71Y162
DELTAX88DELTAY-63
DELTAX-36DELTAY178
HF3
DELTAX66DELTAY50
DELTAX71DELTAY-71
HF1
DELTAX-150DELTAY74
HF0
DELTAX181DELTAY-127
HF3
DELTAX-38DELTAY176
HF0
DELTAX-200DELTAY-43
HF1
DELTAX-43DELTAY-173
HF2
DELTAX37DELTAY-75
DELTAX97DELTAY-4
Die Hilfsfunktion HF1 bedeutet "Schneiden". "X240Y132" sind absolute Koordinaten und alles mit Delta sind relative Koordinaten.
Hab ich das jetzt richtig verstanden, dass das Bahnsteuerungsprogramm, die Textdatei vom DIN-Prgm auf Fehler untersuchen und verbessern soll? Und
Laut Aufgabenstellung soll z.B. eine Kommentarzeile verworfen werden. Was heißt verwerfen genau? Löschen oder überspringen, ignorieren ....?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Funktionen und Prozeduren

  Alt 6. Jan 2012, 22:11
Also es wird da einen Programmteil geben, der die ganzen Befehle abarbeiten soll.

Somit wäre es doch besser, wenn dieser Programmteil nur die reinen Befehle bekommt und nicht die ganzen Leer-/Kommentarzeilen, bzw. Kommentare am Ende einer Zeile

Aus diesem Grund schickt man die Datei mit den Befehlen erst mal durch einen "Filter" und entfernt alle unnötigen Sachen
Vor dem Filter:
Code:
// Mega-Super-Skript
HF1 // ganz was tolles
X240Y132 // noch toller

  // jetzt kommt was ganz großes

HF2 // :o)
X171Y241

// vom OberGuru geschrieben
und nach dem Filter
Code:
HF1
X240Y132
HF2
X171Y241
Als nächsten Schritt kann man jetzt die Syntax grob prüfen (z.B. ob in einer Zeile Leerzeichen vorkommen), was ja ein Fehler wäre

Am Besten du nimmst dir mal so ein "WorstCase"-Skript vor und arbeitest das "Step-By-Step" ab.
Code:
// Mega-Super-Skript
 Hf1 // ganz was tolles
  X240y132 // noch toller

// jetzt kommt was ganz großes

  hf2 // :o)
x171y241

// vom OberGuru geschrieben
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 6. Jan 2012 um 22:16 Uhr)
  Mit Zitat antworten Zitat
Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#3

AW: Funktionen und Prozeduren

  Alt 6. Jan 2012, 22:33
Ah ok ok...da kommen wir der Sache schon ein bisschen näher.
Nun muss ich also nur noch die ganzen Funktionen und Prozeduren fertigmachen, damit die Eingabedatei "bereinigt" wird.


Das hab ich schon gemacht...ist das korrekt so? Wenn nein, wo ist der Fehler?
Danke schon mal für die ganzen Tipps!

Delphi-Quellcode:
function Verwerfe_Kommentarzeile(s:string):boolean;
    // führt zum Überspringen der Kommentarzeile
    var return_wert:boolean; // ??
        posi:integer;
       begin
            posi:=pos('//',s);
            If (s[1]='/') and (s[2]='/') then
            delete(s,posi,length(s));
       end;

    procedure loesche_fuehrende_Leerzeichen(var s:string);
       begin
            If (s <=0) then exit;
            While (s>0) and (s[1]= ' ') do // Nur wenn String größer als 0
            delete (s,1,1); // löscht erstes Zeichen (das Leerzeichen) im String
       end;

    procedure erlaube_gross_Kleinschreibung(var s:string);
       begin
            s:=uppercase(s);
            s:=lowercase(s);
       end;

    procedure bereinige_Datensatz_von_Kommentaren(var s:string);
    // löscht im Datensatz den folgenden Kommentar
    var
        posi // Position
        :integer;
       begin
            posi:=pos('//',s);
            delete(s,posi,length(s));
       end;

Geändert von Slashmob ( 6. Jan 2012 um 22:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Funktionen und Prozeduren

  Alt 6. Jan 2012, 23:07
Ein wenig Konfus?
Delphi-Quellcode:

function Loesche_Kommentar(s:string):string;
var
  posi:integer;
begin
  posi:=pos('//',s);
  if Posi>0 then delete(s,posi,maxint);
  result:=s
end;
 
function Loesche_fuehrende_Leerzeichen(s:string):string;
begin
  result:=trimleft(s);
end;
 
function Erstelle_Grossschreibung(s:string):string;
begin
  result:=uppercase(s);
end;

procedure Satzverarbeitung(s:string);
var
  temps:string;

begin
  temps:=s;
  temps:=Loesche_Kommentar(temps);
  temps:=Loesche_fuehrende_Leerzeichen(temps);
  if length(temps)>0 then begin
    temps:=Erstelle_Grossschreibung(temps);
    // weitere Prüfungen
    // wenn Fehler dann Showmessage('Satz:'+s+' ist fehlerhaft!');
  end;
 
end;
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#5

AW: Funktionen und Prozeduren

  Alt 7. Jan 2012, 14:12
Ok, danke soweit. Das hat mir schon viel geholfen das zu verstehen. Im Prinzip besteht die Aufgabe darin mit pos,copy und delete zu arbeiten.

Nun soll ich ja eine Prozedur schreiben, die mir die Absolutwerte der Koordinaten erstellt.

Delphi-Quellcode:
procedure berechne_absolutwerte(deltax,deltay:double);
    // berechnet die Absolutwerte mit Hilfe der incrementellen
       var x,y: integer;
       begin
            x:=x+deltax;
            y:=y+deltay;
       end;
Was wäre hier die einfachste Art x und y zu berechnen.
Muss ich hier in der Textdatei nach den Werten von X und Y und den Deltawerten suchen?
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Funktionen und Prozeduren

  Alt 7. Jan 2012, 15:46
Ok, danke soweit. Das hat mir schon viel geholfen das zu verstehen. Im Prinzip besteht die Aufgabe darin mit pos,copy und delete zu arbeiten.

Nun soll ich ja eine Prozedur schreiben, die mir die Absolutwerte der Koordinaten erstellt.

Delphi-Quellcode:
procedure berechne_absolutwerte(deltax,deltay:double);
    // berechnet die Absolutwerte mit Hilfe der incrementellen
       var x,y: integer;
       begin
            x:=x+deltax;
            y:=y+deltay;
       end;
Was wäre hier die einfachste Art x und y zu berechnen.
Muss ich hier in der Textdatei nach den Werten von X und Y und den Deltawerten suchen?
Das wird wohl ohne Parser nicht gehen, weil du ja auch auf das prüfen mußt:

X100X80 // hier Fehler melden

BTW:
Was ist hier denn falsch??
X96Y151 // hier Fehler melden

Du mußt auch zuerst den Kommentar entfernen und dann erst den Trim machen, da zwischen Code und Kommentar ein Leerzeichen sein kann (also so, wie es K.-H. gemacht hat).

MFG
Thomas
  Mit Zitat antworten Zitat
Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#7

AW: Funktionen und Prozeduren

  Alt 7. Jan 2012, 16:26

Das wird wohl ohne Parser nicht gehen, weil du ja auch auf das prüfen mußt:

X100X80 // hier Fehler melden

BTW:
Was ist hier denn falsch??
X96Y151 // hier Fehler melden

Du mußt auch zuerst den Kommentar entfernen und dann erst den Trim machen, da zwischen Code und Kommentar ein Leerzeichen sein kann (also so, wie es K.-H. gemacht hat).

MFG
Thomas
BTW:
Was ist hier denn falsch??
X96Y151 // hier Fehler melden

Gute Frage.Glaube ist korrekt so.

X100X80 // hier Fehler melden
Wie überprüf ich das?

Denk ich jetzt zu kompliziert oder geht das auch einfacher??
Delphi-Quellcode:
procedure berechne_absolutwerte(deltax,deltay:double);
    // berechnet die Absolutwerte mit Hilfe der incrementellen
       var x,y: integer;
       begin
            Position_X:=pos('X',s); // Stelle vom Zeichen 'X' im String
            Position_Y:=pos('Y',s); // Stelle vom Zeichen 'Y' im String
            x:=Position_X + strtoint(Position_X+1); // X-Koordinaten, ist Zahl nach dem Zeichen 'X'
            y:=Position_Y + strtoint(Position_Y+1); // Y-Koordinaten, ist Zahl nach dem Zeichen 'Y'
            Position_deltax:=pos('DELTAX',s); // Stelle von 'DELTAX' im String
            Position_deltay:=pos('DELTAY',s); // Stelle von 'DELTAY' im String
            deltax:= Position_deltax + strtoint(Position_deltax+1); // Deltax-Zahlenwert nach 'DELTAX'
            deltay:= Position_deltay + strtoint(Position_deltay+1); // Deltay-Zahlenwert nach 'DELTAY'

            x:=x+deltax;
            y:=y+deltay;
       end;
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 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