Fragen zu Pascal

  • Guten Tag,

    ich versuche mich aktuell sehr intensiv in Pascal und kämpfe mich dabei auch im Prinzip durch sämtliche Script-Dateien, die ich finden kann. Dabei ist mir so ein bisschen was aufgefallen zur Syntax, wo ich noch nicht ganz geschnallt habe, wann was der Fall ist.

    Desweiteren meckert das Content-Tool aktuell noch bei ein paar Stellen in meinem Script rum, wo ich nicht ganz genau weiß, warum.

    Frage 1:

    Ich habe mir gerade mal ein eigenes Objekt angelegt (wie man unschwer erkennen kann handelt es sich um Türen). Da hatte ich eine Version, bei der das Content-Tool einen Fehler angezeigt hat. Dieser rührte daher, dass ich bei der Position, dem Value und dem ganzen anderen Rest danach ein Gleichzeichen geschrieben habe. Meine Frage daher: wann schreibt man ein Gleichzeichen, wann einen Doppelpunkt und wann Doppelpunkt und ein Gleichzeichen?


    Frage 2:

    Frage zwei dreht sich um Value und Pos. Da habe ich auch noch nicht so ganz verstanden, was es damit auf sich hat, insbesondere beim Value. Hinter Pos versteckt sich schätzungweise eine Abkürzung für die Posititon.


    Frage 3: Bei Frage drei handelt es sich um die Türtaster und die damit ausgelöste procedure (logischerweise will ich, das beim drücken der Türtaster die Türen aufgehen). Da die Türtaster nunmal ein Knopf sind, die nach der Betätigung wieder in die Anfangsposititon springen, habe ich die als PushButton gescriptet. Mein Porblem ist dann nur, dass wenn ich die Animation der Türen an diese Türtaster binde, dass dann auch die Türen wieder sofort in die Ausgangslage zurück springen, was nicht so ganz Sinn der Sache ist. Meine Frage: muss ich die Türtaster irgendwie anders definieren, als On Off Switch oder so oder muss ich der Tür sagen, dass sie nicht sofort wieder wurück springen soll.


    Und nun noch der Fehler im Script:

    Code
    1. procedure OnButton(id: string; value: boolean; cockpitIndex: byte);
    2. begin
    3. Cockpit_OnButton(id, value);
    4. Beschleunigen_Pedal_OnButton(id, value);
    5. Bremsen_Pedal_OnButton(id, value);
    6. Bremsen_anders_OnButton(id, value);
    7. Doors_OnButton(id, value);
    8. end;

    Bei denen in der Main-Datei befindlichen Zeilen 104-108 sagt mir das Content-Tool, dass dort eine "Invalid number of parameters" wäre. Was habe ich falsch geamcht?

    Umfahren ist das Gegenteil von umfahren

  • Also, zu den beiden ersten Fragen kann ich wohl nicht helfen, aber hoffentlich zu den letzteren zwei.

    3. Da bin ich selber anfangs auch schon länger bei gesessen. Der Trick hier ist, eine Art übergangsvariable zu haben. Will heißen, der knopf löst nicht das Türscript aus, sondern aktiviert diese variable. Die Variable ist dann wiederum dafür zuständig, die Türe zu öffnen. Das Problem dabei wird sein, dass die Türe bei Wert 0 zu ist und bei 1 offen. Der Taster ist aber nur 1 wenn er gedrückt ist und geht danach wieder zu 0.


    Zum letzten Problem. Invalid number of parameters bedeutet in diesem Fall das variablen fehlen. Bei der Prozedur oben sind drei, also müssten und auch drei sein.


    Code
    1. procedure OnButton(id: string; value: boolean; cockpitIndex: byte);
    2. begin
    3. Cockpit_OnButton(id, value, cockpitIndex);
    4. Beschleunigen_Pedal_OnButton(id, value, cockpitIndex);
    5. Bremsen_Pedal_OnButton(id, value, cockpitIndex);
    6. Bremsen_anders_OnButton(id, value, cockpitIndex);
    7. Doors_OnButton(id, value, cockpitIndex);
    8. end;


    Ich hoffe, ich konnte dir ein bisschen helfen:)

    18384-titelbild1-jpg

    2 Mal editiert, zuletzt von Fabian13 () aus folgendem Grund: Zu früh abgeschickt

  • Zitat

    Frage 1:

    Ich habe mir gerade mal ein eigenes Objekt angelegt (wie man unschwer erkennen kann handelt es sich um Türen). Da hatte ich eine Version, bei der das Content-Tool einen Fehler angezeigt hat. Dieser rührte daher, dass ich bei der Position, dem Value und dem ganzen anderen Rest danach ein Gleichzeichen geschrieben habe. Meine Frage daher: wann schreibt man ein Gleichzeichen, wann einen Doppelpunkt und wann Doppelpunkt und ein Gleichzeichen?

    Doppelpunkt für Variablendeklarationen -> Pos: Integer; (Die Variable Pos wird als Integer deklariert)

    Doppelpunkt und Gleichzeichen für Zuweisungen -> Wert1 := Wert2; (Der Variable Wert1 wird der Wert von Wert2 zugewiesen)

    Gleichzeichen für Vergleiche (z.B. in If-Verzweigungen) oder um Konstanten einen Wert zuzuweisen -> if (Wert1 = Wert2)... oder Konstante = 10;

  • Doppelpunkt für Variablendeklarationen -> Pos: Integer; (Die Variable Pos wird als Integer deklariert)

    Doppelpunkt und Gleichzeichen für Zuweisungen -> Wert1 := Wert2; (Der Variable Wert1 wird der Wert von Wert2 zugewiesen)

    Gleichzeichen für Vergleiche (z.B. in If-Verzweigungen) oder um Konstanten einen Wert zuzuweisen -> if (Wert1 = Wert2)... oder Konstante = 10;

    Ok danke für die Erklärung



    Also, zu den beiden ersten Fragen kann ich wohl nicht helfen, aber hoffentlich zu den letzteren zwei.

    3. Da bin ich selber anfangs auch schon länger bei gesessen. Der Trick hier ist, eine Art übergangsvariable zu haben. Will heißen, der knopf löst nicht das Türscript aus, sondern aktiviert diese variable. Die Variable ist dann wiederum dafür zuständig, die Türe zu öffnen. Das Problem dabei wird sein, dass die Türe bei Wert 0 zu ist und bei 1 offen. Der Taster ist aber nur 1 wenn er gedrückt ist und geht danach wieder zu 0.

    Ok, ich werde mich daran ein wenig probieren, danke auf jeden Fall für den Ansatz.


    Code
    1. procedure OnButton(id: string; value: boolean; cockpitIndex: byte);
    2. begin
    3. Cockpit_OnButton(id, value, cockpitIndex);
    4. Beschleunigen_Pedal_OnButton(id, value, cockpitIndex);
    5. Bremsen_Pedal_OnButton(id, value, cockpitIndex);
    6. Bremsen_anders_OnButton(id, value, cockpitIndex);
    7. Doors_OnButton(id, value, cockpitIndex);
    8. end;

    Funktioniert leider auch damit nicht.

    Vielleicht noch als wichtiger Hinweis: der Fehler "Invalid number of parameters" bezieht sich auf die Stelle vor dem Semikolon, falls das weiter hilft

    Umfahren ist das Gegenteil von umfahren

    Einmal editiert, zuletzt von bobjunior99 ()

  • Zitat

    Frage 2:

    Frage zwei dreht sich um Value und Pos. Da habe ich auch noch nicht so ganz verstanden, was es damit auf sich hat, insbesondere beim Value. Hinter Pos versteckt sich schätzungweise eine Abkürzung für die Posititon.

    Wenn ich mich nicht irre, bekommst du mit Pos (Position) einen Wert zwischen 0 und 1 welcher z.B für die Button-Animationen verwendet wird und mit value (Wert) übergibst du (kannst den Wert natürlich auch auslesen) entweder den Wert true (soeben gedrückt) oder false (soeben losgelassen).

  • Wenn ich mich nicht irre, bekommst du mit Pos (Position) einen Wert zwischen 0 und 1 welcher z.B für die Button-Animationen verwendet wird und mit value (Wert) übergibst du entweder den Wert true (soeben gedrückt) oder false (soeben losgelassen).

    Das klingt sinnvoll

    Umfahren ist das Gegenteil von umfahren

  • Invalid number of parameters taucht auf, wenn Du Prozeduren mit eben der falschen Anzahl an mitgegebenen Variablen aufrufst. In Deiner OnButton-Prozedur rufst Du ja zum Beispiel die Prozedur Cockpit_OnButton auf. Die solltest Du dann mal suchen, und feststellen, welche Variablen Du dorthin übergeben musst. Sieht sie irgendwie so aus procedure Cockpit_OnButton(xxx: string; yyy: boolean; zzz: byte;, dann solltest Du auch alle drei Variablen dorthin übergeben, wie Fabian13 das vorgemacht hat. Ansonsten fehlt der Zielprozedur ja eine Variable.


    Allerdings gibt es auch OnButton-Prozeduren, bei denen es egal ist, aus welchem Führerstand heraus eine Taste gedrückt wird. Die sehen dann eher so aus procedure Diesdas_OnButton(xxx: string; yyy: boolean);. Bei denen darfst Du auch lediglich diese beiden Werte übergeben, wie Du das am Anfang überall zu stehen hattest. Mit dem dritten Wert wüsste die Zielprozedur ja gar nichts anzufangen.


    Das kann so natürlich nicht nur bei OnButton-Prozeduren passieren sondern überall, wo Du Variablen direkt beim Aufruf der Prozedur mitgibst. Also immer schön gucken, was benötigt die Prozedur, und dann ihr auch genau das geben, was sie haben will.



    Bezüglich Value und Pos hat Nutzer 5.158 grundsätzlich recht, wobei aber zu betonen ist: Das sind alles nur selbstgewählte Namen, die für den Programmablauf per se völlig egal sind. Du kannst genauso gut auch Position: single; und IstAktiv: boolean; nehmen. Und wenn Du die Variablen überhaupt nicht brauchst, dann kannst du sie auch weglassen. Die müssen nicht zwingend in jedem Objekt vorkommen. Marcel hat sich bloß dafür entschieden, die Ausgabevariablen seiner Objekte einheitlich mit Pos für die physikalische Position und Value für die systemseitige Position (ist an, ja/nein) zu bezeichnen.

  • So, Rätsel gelöst. Danke nochmal für die ausrürliche Erklärung Kartoffelphantom. Das Problem war, das in dieser procedure in meiner Cockpit.pas noch gar nichts passiert, der deswegen natürlich gar keine Parameter brauchte, diese also auch nicht verarbeiten konnte. Danke aber natürlich auch an Fabian13 und Nutzer 5.158

    Umfahren ist das Gegenteil von umfahren

  • So. Da ich hier den Script-Programmierungsbereich nicht unnötig vollmüllen will, reaktiviere ich einfach mal das Thema hier.

    Und zwar folgendes:

    Ich hab mal in letzter Zeit wieder ein wenig in Pascal rumgespielt, hab erstmals eigene funktionale Objekte inklusive Prozedur angelegt.

    Erstmal habe ich folgende Frage:

    Bei dieser Prozedur handelt es sich um eine die das zentrale Öffnen einer beliebigen Tram beschreibt.

    Folgendes: wie kann man beim Öffnungsprozess der Türen die zeitliche Dauer einbauen?

    Ich habe dafür wie man sieht schon entsprechende Konstanten konfiguriert.


    Und jetzt noch eine allgemeinere Frage: was genau ist der unterschied zwischen einer "procedure" und einer "function"?


    Grüße

    Umfahren ist das Gegenteil von umfahren

  • Ich gehe da erstmal auf die 2. Frage ein.

    Ist ganz simpel.

    Eine procedure hat keine Rückgabe, eine function jedoch schon.

    Beispiel aus den TechElements:

    Eine Prozedur:

    procedure Switch_Toggle(var sw: TSwitch); <- Es wird nichts zurück gegeben

    Eine Funktion:

    function Switch_On(var sw: TSwitch): boolean; <- Es wird eine Wert vom Typ Boolean, zurück gegeben.


    Jetzt zur ersten Frage. Falls ich sie falsch verstehe, bitte nochmal konkretisieren.

    Ich verstehe es so, dass die Türen nicht *plopp* auf und zu springen sollen, sonder eine flüssige Bewegung machen sollen.


    Wenn du sowas haben willst, kannst du die Positon nicht einfach von 0 auf 1 und umgekehrt setzten, sondern musst das langsam machen.


    Hier mal eine vereinfachter Auszug aus meinen Türen.
    Fluegel_A_Pos := Fluegel_A_Pos + DOOR_SPEED_OPEN * Timegap;

    In jedem durchlaufen des SimSteps wird die Tür nur um den Wert DOOR_SPEED_OPEN * Timegap bewegt.

    DOOR_SPEED_OPEN ist dabei der Laufzeitfaktor der Tür und Timegap die interne Zeit seit dem letzten druchlauf des SimSteps

    Würdest du deine Tür wie folgt bewegen lassen:

    Fluegel_A_Pos := Fluegel_A_Pos + Timegap;

    Würde sie genau eine Sekunde brauchen. Mit dem Fakor DOOR_SPEED_OPEN (kann auch anders heißen) kannst du dies Verändern. Dabei ist der Kehrwert deines Faktors die Laufzeit der Tür in Sekunden.

    Beispiel:

    DOOR_SPEED_OPEN = 0.8

    Der Kehrwert von 0.8 (1/0.8) ist 1.25.

    Die Tür braucht also 1.25 Sekunden zum öffnen.



    Ich hoffe, das beantwortet deine Fragen.

    Ja äh, hier irgendwas mit Dingen und so...

    2 Mal editiert, zuletzt von Pandemist ()

  • Neu erstellte Beiträge unterliegen der Moderation und werden erst sichtbar, wenn sie durch einen Moderator geprüft und freigeschaltet wurden.

    Die letzte Antwort auf dieses Thema liegt mehr als 60 Tage zurück. Das Thema ist womöglich bereits veraltet. Bitte erstellen Sie ggf. ein neues Thema.

    Maximale Anzahl an Dateianhängen: 5
    Maximale Dateigröße: 500 kB
    Erlaubte Dateiendungen: bmp, cfg, ini, jpeg, jpg, lct, ldl, llg, lob, log, lpmtl, lptmt, ltx, pas, pdf, png, railtrack, rar, txt, veh, wav