[Anfänger] Versuche mich gerade an TYPE Deklarierung

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
CaptainJens
Beiträge: 1
Registriert: So 2. Okt 2016, 20:21

[Anfänger] Versuche mich gerade an TYPE Deklarierung

Beitrag von CaptainJens »

Hallo Leute,

ich bin gerade dabei mich mit Lazarus für die Uni auseinander zu setzen. Lazarus sind auch meine ersten Schritte auf dem Gebiet der Programmierung. Ich hangel mich durch dieses Tutorial. Ich wollte ein Programm schreiben, dass zwei Zahlen miteinander addiert, solange bis man zur Frage, ob man es Beenden soll mit "Y" antwortet.

Code: Alles auswählen

program Addition;
USES Crt;
TYPE Wertebereich = 0..50;
YN = (Y, N);
VAR Summand1, Summand2: Wertebereich;
    Beenden: YN;
    Summe: integer;
 
 
begin
  ClrScr;
 
Repeat
  WriteLn ('Mit diesem Programm werden 2 Zahlen addiert, von 1 bis 50');
  Write ('Bitte geben Sie die erste Zahl ein: ');
  ReadLn (Summand1);
  Write ('Bitte geben Sie die zweite Zahl ein: ');
  ReadLn (Summand2);
Summe := Summand1 + Summand2;
Write ('Das Ergebnis ist: ');
WriteLn (Summe);
WriteLn ('Beenden? (Y/N)');
ReadLn (Beenden);
Until (Beenden = 'Y');
 
End.


Ich kriege den Fehler "Addition.lpr(24,16) Error: Operator is not overloaded: "YN" = "Char"" und die Zeile bei "Until (Beenden = 'Y')" wird mir markiert. Ich verstehe einfach nicht was ich falsch gemacht habe.

Liebe Grüße

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: [Anfänger] Versuche mich gerade an TYPE Deklarierung

Beitrag von compmgmt »

Beenden ist ein Aufzählungstyp, du versuchst aber einen String zu übergeben. Das sind zwei unterschiedliche Typen. ReadLn() übergibt ein String. Was du brauchst ist ReadKey aus der unit crt.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: [Anfänger] Versuche mich gerade an TYPE Deklarierung

Beitrag von mse »

Etwas vereinfacht: 'Y' ist eine Stringkonstante und kann nur mit strings (=Zeichenkette) verglichen werden.

Code: Alles auswählen

 
type
 YN = (Y, N);
var
 Beenden: YN;
 

definiert einen Aufzählungstyp welcher intern als Ganzzahl dargestellt wird, wobei 0 der Bezeichnung Y entspricht und 1 -> N. Darum kann der Vergleich bei

Code: Alles auswählen

 
 Until (Beenden = 'Y');
 

nicht kompiliert werden, da Beenden vom Typ YN->Ganzzahl ist und 'Y' vom Typ string.
Also:

Code: Alles auswählen

 
 Until (Beenden = Y);
 

Hier wird intern Ganzzahl mit Ganzzahlkonstante verglichen.
Wird weder Y oder y noch N oder n eingegeben bricht das Programm mit einer Fehlermeldung ab. Alternative:

Code: Alles auswählen

 
VAR
 Summand1, Summand2: Wertebereich;
 Beenden: string;
 Summe: integer;
[...]
 ReadLn(Beenden);
 Until (Beenden = 'Y');
 

Hier wird string mit Stringkonstante verglichen.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: [Anfänger] Versuche mich gerade an TYPE Deklarierung

Beitrag von Mathias »

Wen man Pascal-Konform einen Typ deklariert, schreibt man ein T davor, zB. so:

Code: Alles auswählen

type
 TYN = (Y, N);
var
 Beenden: TYN;

Dies macht das Ganze übersichtlicher. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: [Anfänger] Versuche mich gerade an TYPE Deklarierung

Beitrag von Warf »

Wirf dieses Tutorial mal bitte ganz schnell weg. Wenn es dir keine Konventionen wie Ungarische Notation, die Pascal interne Namenkonvention (T für Typ, P für Pointer, E für Exception, I für Interface) und eine vernünftige (englische) Benennungskonvention beibringt ist es kompletter Müll. Grade wenn du im Team arbeitest und man sich nicht an diese Konventionen hält ist Chaos vorprogrammiert. Außerdem ist die letzte Aktualisierung 2009 gewesen, seit dem hat sich zwischen Version 2.2 und 3.0 einiges getan. (Noch dazu finde ich die Caps Schreibweise für Schlüsselwörter grauenhaft, das ist aber Geschmacksache).

Im FreePascal wiki gibt es ein Tutorial: Link (Englisch)
und auch wenn Eigenlob stinkt, ich schreibe aktuell an einem FreePascal Tutorial: Link (Deutsch)
Bin allerdings nur mit klassischem Pascal bisher fertig, OOP fehlt bisher komplett, aber die Grundlagen sind alle drin. Hatte bisher auch noch keine Lust einige Rechtschreibfehler zu korrigieren.
Das Tutorial habe ich für ein anderes geschrieben, daher findest du die neueren Kapitel dort (Link) da ich dafür noch keine Lust hatte diese in HTML zu übersetzen.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: [Anfänger] Versuche mich gerade an TYPE Deklarierung

Beitrag von Mathias »

Wirf dieses Tutorial mal bitte ganz schnell weg. Wenn es dir keine Konventionen wie Ungarische Notation, die Pascal interne Namenkonvention (T für Typ, P für Pointer, E für Exception, I für Interface) und eine vernünftige (englische) Benennungskonvention beibringt ist es kompletter Müll.

Dies ist recht Schade, da gibt man sich Mühe ein Tutorial zu schreiben und bringt dem Anwender falsches bei.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: [Anfänger] Versuche mich gerade an TYPE Deklarierung

Beitrag von wp_xyz »

Warf hat geschrieben:Wirf dieses Tutorial mal bitte ganz schnell weg. Wenn es dir keine Konventionen wie Ungarische Notation, die Pascal interne Namenkonvention (T für Typ, P für Pointer, E für Exception, I für Interface) und eine vernünftige (englische) Benennungskonvention beibringt ist es kompletter Müll. (...) und auch wenn Eigenlob stinkt, ich schreibe aktuell an einem FreePascal Tutorial: Link (Deutsch).

Habe gerade dein Tutorial überflogen. Gefällt mir eigentlich gut. Aber über Konventionen wie Ungarische Notation, die Pascal interne Namenskonvention (T für Typ, P für Pointer, E für Exception, I für Interface) und eine vernünftige (englische) Benennungskonvention habe ich nichts gefunden --> leider auch nur kompletter Müll.

Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: [Anfänger] Versuche mich gerade an TYPE Deklarierung

Beitrag von Warf »

wp_xyz hat geschrieben:
Warf hat geschrieben:Wirf dieses Tutorial mal bitte ganz schnell weg. Wenn es dir keine Konventionen wie Ungarische Notation, die Pascal interne Namenkonvention (T für Typ, P für Pointer, E für Exception, I für Interface) und eine vernünftige (englische) Benennungskonvention beibringt ist es kompletter Müll. (...) und auch wenn Eigenlob stinkt, ich schreibe aktuell an einem FreePascal Tutorial: Link (Deutsch).

Habe gerade dein Tutorial überflogen. Gefällt mir eigentlich gut. Aber über Konventionen wie Ungarische Notation, die Pascal interne Namenskonvention (T für Typ, P für Pointer, E für Exception, I für Interface) und eine vernünftige (englische) Benennungskonvention habe ich nichts gefunden --> leider auch nur kompletter Müll.


Englische Namen:
Konvention: Bei der Namensgebung in der Programmierung sollte man am besten Englische Namen vergeben, also statt z.B. Berechne nehmen wir Evaluate


Camel Hop notation:
Konvention: In Pascal spielt Groß- und Kleinschreibung keine Rolle, daher hat man sich auf die Konvention geeinigt, alle Namen mit einem Großbuchstaben anzufangen, und jedes weitere Wort auch wieder groß zu schreiben (z.B. WriteLn besteht aus dem Wort Write und Ln als Abkürzung für Line, d.h. wir schreiben das W und das L groß). Bei Variablennamen braucht man sich allerdings nicht an diese Konvention zu halten.


Klammernotation:
Konvention: Pascal benötigt zwar nicht die Leeren klammern () nach einem Funktion, doch um direkt unterscheiden zu können, bei was es sich um einem Funktion, sog. Funktion, handelt, und was eine Variable ist, schreibt man sie für gewöhnlich dennoch hin.


Benennung:
Konvention: Die Benennung von Typen geht TTypName für normale Typen (T für Type) PTyp für Zeiger (P für Pointer) und ETyp für Fehler (E für Exception). Zeiger haben hierbei den selben Namen wie der Typ nur das T wird durch ein P ersetzt.


Einfach mal bei dem Tutorial STRG+F drücken und Konvention suchen, da findet man einiges :P
In den Bemerkungen und Warnungen stehen auch noch einige lustige kleine Informationen über solche Konventionen, und in jedem Praktischen Beispiel halte ich mich auch daran. der Teufel liegt im Detail :D

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: [Anfänger] Versuche mich gerade an TYPE Deklarierung

Beitrag von wp_xyz »

Ich will das nicht vertiefen, und ich finde das Tutorial auch wirklich gut (bis auf das, dass ich Navigationslinks z.B. ins Inhaltsverzeichnis vermisse). Der Rest war sarkastisch gemeint, denn arrogante Bemerkungen wie "das ist kompletter Müll" reizen zum Widerspruch. Und sooo schlecht finde ich das andere Tutorial auch wieder nicht.

P.S. Bei den Konventionen würde ich aus leidiger Erfahrung sogar auch dafür stimmen, dass Kommentare auf Englisch sind, zumindest wenn es die geringste Chance gibt, dass jemand ohne Deutschkenntnisse die Quelltexte zu Gesicht bekommt. Leider gibt es auch in der LCL manche Unit mit portugiesischen/spanischen (?) Kommentaren und sogar Variablenbezeichnungen (grids).

mischi
Beiträge: 206
Registriert: Di 10. Nov 2009, 18:49
OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x
CPU-Target: 32Bit/64bit

Re: [Anfänger] Versuche mich gerade an TYPE Deklarierung

Beitrag von mischi »

Ein Tutorial aus dem Jahr 2009, dessen "Hello World"-Beispiel die Units crt und dos benutzt, erweckt nicht gerade den Eindruck, dass es aktuell ist. Aus den Kapiteln 1-10 könnte man allerdings ein Tutorial für iso-Pascal machen.
MiSchi macht die fink-Pakete

Antworten