C ist "freier" als Pascal

Für sonstige Unterhaltungen, welche nicht direkt mit Lazarus zu tun haben
Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: C ist "freier" als Pascal

Beitrag von m.fuchs »

Warf hat geschrieben:Und dann versucht der Anfänger was zu ändern, kapiert die Array grenzen nicht, baut Müll, und dann landet im nächsten Forum die Frage: "Warum geht das nicht ???!!!??!?!?".

Na und? Wenn er die Frage so formulieren kann, dass das Problem ersichtlich ist wird ihm geholfen werden. Zumindest habe ich den Eindruck dass in diesem Forum nur wenige Fragen nicht beantwortet werden.
Also wird der Anfänger dann von jemanden über die Funktionen Low() und High() informiert und wird in Zukunft keine Probleme mit Array-Grenzen haben.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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

Re: C ist "freier" als Pascal

Beitrag von Warf »

m.fuchs hat geschrieben:
Warf hat geschrieben:Und dann versucht der Anfänger was zu ändern, kapiert die Array grenzen nicht, baut Müll, und dann landet im nächsten Forum die Frage: "Warum geht das nicht ???!!!??!?!?".

Na und? Wenn er die Frage so formulieren kann, dass das Problem ersichtlich ist wird ihm geholfen werden. Zumindest habe ich den Eindruck dass in diesem Forum nur wenige Fragen nicht beantwortet werden.
Also wird der Anfänger dann von jemanden über die Funktionen Low() und High() informiert und wird in Zukunft keine Probleme mit Array-Grenzen haben.

Das bezog sich auf die aussage von braunbär

Das ist ja schon einmal eine ganze Menge. Allein wenn ich mir anschaue, wieviel Zeit in den Foren draufgeht, Programmieranfängern zu erklären, dass sie von 0 bis n-1 zählen müssen statt von 1 bis n wie jeder normale Mensch...


Und ich wollte nur verdeutlichen das es deutlich mehr aufwand ist einem Programmieranfänger Dynamische Grenzen zu erklären, als zu sagen dass es mit 0 anfängt (bzw das die Möglichen Fehler schlimmer/schwerer zu finden sind)

Und High und Low sind schön und gut, aber Anfänger verwenden sowas nicht, die benutzen (aus meiner Erfahrung) immer Magic Numbers, und das kann zu tollen Fehlern führen. Außerdem ist 0 Kürzer als Low(Array), und für ein Feature was man nicht braucht dennoch jeden Algorithmus dafür zu schreiben dass er damit umgehen kann, finde ich halt irgendwie unnütz

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: C ist "freier" als Pascal

Beitrag von Timm Thaler »

Ich hab zu Schülerzeiten zuhause AmigaBasic und in der Schule TurboPascal programmiert. Da stolpert man öfter mal über die verschiedenen Array-Anfänge. Irgendwann kapiert man das dann. Die ; setzen oder nicht setzen war nerviger.

Der Witz ist, ohne Internet hat man sich halt hingesetzt und aus irgendwelchen Büchern Beispiele abgetippt. Man konnte ja keinen Fragen. Heut wird halt erstmal im Forum gefragt. Was ich nicht schlechtreden will...

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: C ist "freier" als Pascal

Beitrag von braunbär »

Warf hat geschrieben:Deine erste aussage verstehe ich nicht, wenn ich einen Record mit 2 Strings brauche, dann nützt mir einer mit 3 Bytes gar nichts, warum sollte man da was vereinheitlichen?

Datenstrukturen dienen dazu, irgend etwas zu modellieren. Die obere und untere Grenze eines Array entspricht normalerweise genauso irgend etwas, was im Modell abgebildet wird, wie die drei bytes oder zwei Strings des record irgend etwas entspricht, was in diesem Record abgebildet wird. Und natürlich kann ich statt von 10 bis 20 - was eben gerade den abzubildenden Daten entspricht - genauso von 0 bis 10 gehen, 0 entspricht dann eben 10, 1 entspricht 11, usw. Aber das ist doch kein Vorteil.
Man könnte ja in records prinzipiell alle Daten als Strings speichern , das wäre doch eine super "Vereinheitlichung". Manche simple Datenbanksysteme arbeiten ja sogar so.

Warf hat geschrieben:Ein Anfänger hat eine Idee, weiß nicht wie er sie umsetzen soll, googled sich was zu sammeln, copy & paste 3 Sources, und dann hat er plötzlich 3 Arrays. Das Wort plötzlich passt da ziemlich gut. Und natürlich haben Programmierer Gründe die Grenzen zu wählen, ein Anfänger der sich aber nur Sources aus dem Internet kopiert, für den ist der Sinn der Grenzen komplett egal, für den ist da kein Sinn, keine Gründe.

Man kann sich zu allem irgend welche absurde Szenarien ausdenken. Dein Anfänger wird auf die Art sowieso nicht weit kommen, und wird auch ohne flexible array-Grenzen ohne intensivte Unterstützung sein Programm nicht zum Laufen bringen. Ich rede nicht von einem blutigen Anfänger, der sich an einer Aufgabe versucht, mit der er hoffnungslos überfordert ist.

Dass du dich inzwischen gezwungenermaßen daran gewöhnt hast derart schief zu denken, heißt ja nicht, dass das für alle anderen auch gelten muss. Ein gewöhnlicher Mensch beginnt beim Zählen mit 1, und ohne diese 0-basierten offenen Felder wäre das völlig selbstverständlich. Wir haben Jahrzehntelang in Turbo-Pascal Software entwickelt, da wäre es keinem Programmierer im Traum eingefallen, alle Felder mit 0 als untersten Index anzulegen. Manche Felder, wo man es braucht, natürlich schon. Und in seltenen, begründeten Ausnahmefällen eine ganz andere untere Array-Grenze, da ist dann auch kein Mißverständnis möglich.

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: C ist "freier" als Pascal

Beitrag von mischi »

C beginnt immer mit 0, Fortran immer mit 1. Im echten Leben können sich die Menschen ja bei den Stockwerken auch nicht darauf einigen, ob mit 1. Stock das Erdgeschoss oder das 1. OG gemeint ist. Also auch da gibt es welche, die mit 0 anfangen zu zählen und welche, die mit 1 anfangen. Pascal habe ich immer deshalb geschätzt, weil man da die Indexgrenzen so setzen konnte, wie sich das Problem darstellt, also auch den seltenen Fall, der zum Beispiel mit 4 anfängt und mit 11 aufhört. Da wird es dann nämlich richtig lustig, äh fehleranfällig, wenn man das auf 0 oder 1 umsetzen muss. Schon mal eine Fortran-routine nach C übersetzt? Klappt praktisch nie auf Anhieb. Low und high sind natürlich große Hilfen, aber wenn ein Index direkt angesprochen wird, muss man immer noch umrechnen, was für Menschen erfahrungsgemäß fehleranfällig ist. Wieso soll man das also nicht dem Compiler überlassen? Genau dafür sind doch eigentlich Hochsprachen da.

Aus meiner Sicht ist also Pascal freier als C oder Fortran, weil ich die Indexgrenzen frei wählen kann, zumindest bei statischen Arrays. Leider ist dieser Vorteil mit den dynamischen Arrays verloren gegangen. Hätte man auch da die freie Wahl, würde sich die generelle Diskussion hier erübrigen und nur noch im speziellen Fall stellen, wie in dem Problem oben mit den Stockwerken eines Gebäudes. Dazu fällt mir ein Gebäudekomplex an einem Hang ein. Bei vielen Gebäudeteilen lag der Keller deshalb nicht auf 0 oder -1 sondern zum Beispiel auf Ebene 4. Für Übergänge zwischen Gebäudeteilen war es schon praktisch, dass man auf einer Ebene blieb.

MiSchi.
MiSchi macht die fink-Pakete

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: C ist "freier" als Pascal

Beitrag von kupferstecher »

Warf hat geschrieben:Das ding ist, Arrays mit 1 zu beginnen bringt nun mal gar nichts (außer das es natürlicher ist), und man verliert also auch nichts wenn man mit 0 anfängt.


Arrays werden oft durchiteriert, die nullbasierten Schleifengrenzen sind dann schon hässlich.

Code: Alles auswählen

for ii:= 0 to AList.Count-1
do AList.Add('Bsp');

vs.

Code: Alles auswählen

for ii:= 1 to AList.Count
do AList.Add('Bsp');

Aber man gewöhnt sich dran und merkt dann gar nicht mehr wie verquer das ist.

Die Fälle wo die Nullbasierung sinnvoller ist erkenne ich genauso an und bin der Meinung, dass das ein unlösbares intrinsisches Problem ist, weil die Vor- und Nachteile oft gleichzeitig auftreten.

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: C ist "freier" als Pascal

Beitrag von compmgmt »

Ein Beispiel wo beides geht

Code: Alles auswählen

for i := 0 to AList.Count - 1 do
  AList[i].DoSomething;
oder

Code: Alles auswählen

for i := 1 to AList.Count do
  AList[i - 1].DoSomething;

Wobei ich das obere schöner finde, weil da i gleich dem index ist.

Code: Alles auswählen

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

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

Re: C ist "freier" als Pascal

Beitrag von Warf »

braunbär hat geschrieben:Datenstrukturen dienen dazu, irgend etwas zu modellieren. Die obere und untere Grenze eines Array entspricht normalerweise genauso irgend etwas, was im Modell abgebildet wird, wie die drei bytes oder zwei Strings des record irgend etwas entspricht, was in diesem Record abgebildet wird. Und natürlich kann ich statt von 10 bis 20 - was eben gerade den abzubildenden Daten entspricht - genauso von 0 bis 10 gehen, 0 entspricht dann eben 10, 1 entspricht 11, usw. Aber das ist doch kein Vorteil.
Man könnte ja in records prinzipiell alle Daten als Strings speichern , das wäre doch eine super "Vereinheitlichung". Manche simple Datenbanksysteme arbeiten ja sogar so.


Das beispiel ist sehr schlecht, da Strings Zahlen in Log(10) abspeichern, Binäre Datentypen allerdings in Log(2). Rechnen wir Log(10)/Log(2) ergibt das Ungefähr 3, also ist die String Variante um einen Faktor 3 Schlechter (Einfaches Beispiel, die Zahl 100 als String 3 Byte, als Binärer Datentyp passt sie in 1 Byte). Darum veränderst du damit das Asymptotische Verhalten deines Programmes, was Arraygrenzen nicht tuen.

braunbär hat geschrieben:Man kann sich zu allem irgend welche absurde Szenarien ausdenken. Dein Anfänger wird auf die Art sowieso nicht weit kommen, und wird auch ohne flexible array-Grenzen ohne intensivte Unterstützung sein Programm nicht zum Laufen bringen. Ich rede nicht von einem blutigen Anfänger, der sich an einer Aufgabe versucht, mit der er hoffnungslos überfordert ist.


Du findest das absurd? ich habe erst vor kurzem von einem Anfänger in einer Skriptsprache die Frage gesehen warum man Strings nicht als Funktionen verwenden kann (also "Funktion1()" statt Funktion1()). Das sich Anfänger Code den sie nicht verstehen aus dem Internet zusammenkopieren sehe ich Täglich (ich bin in verschiedenen Foren unterwegs, u.a. in einem mit sehr vielen neueinsteigern), da kommt dann die Frage auf warum ein Fehler auftritt, wenn sie DWord für 64 Bit Zahlen verwenden, oder ähnliches, weil die sich einfach komplett hirnlos alles zusammenkopieren, und hoffen das es funktioniert.
Tatsächlich habe ich das Problem das Arrays mit 0 nicht 1 anfangen (vor dem du dich in einem vorherigen Post ja so ausgelassen hast) so gut wie nie gesehen, copy & paste errors sehe ich allerdings wirklich fast täglich.

braunbär hat geschrieben:Dass du dich inzwischen gezwungenermaßen daran gewöhnt hast derart schief zu denken, heißt ja nicht, dass das für alle anderen auch gelten muss. Ein gewöhnlicher Mensch beginnt beim Zählen mit 1, und ohne diese 0-basierten offenen Felder wäre das völlig selbstverständlich. Wir haben Jahrzehntelang in Turbo-Pascal Software entwickelt, da wäre es keinem Programmierer im Traum eingefallen, alle Felder mit 0 als untersten Index anzulegen. Manche Felder, wo man es braucht, natürlich schon. Und in seltenen, begründeten Ausnahmefällen eine ganz andere untere Array-Grenze, da ist dann auch kein Mißverständnis möglich.


Ich sehe ein das es natürlicher ist mit 1 anzufangen, ich finde nur das es öfter Praktischer ist mit 0 anzufangen. Darum wenn ich die Wahl hätte zwischen immer mit 0 anzufangen und immer mit 1 anzufangen würde ich 0 wählen. Und wenn ich die Wahl hätte immer mit 0 anzufangen, oder Frei wählen zu dürfen würde ich immer 0 anfangen, da dies eine Unnötige Fehlerquelle ist. Wenn ich unnötige Fehlerquellen möchte würde ich C++ Programmieren, aber ich habe Pascal extra gewählt da darin die meisten Unnötigen Fehlerquellen wegfallen.
Es wäre einfach eine Sache mehr bei der ein Fehler auftreten kann, während wenn es immer bei 0 Anfängt, muss man nicht drüber nachdenken und die Fehlerchance ist Praktisch 0 (wenn man doch ne 1 hinschreibt sollte man den Fehler beim erneuten durchlesen sehr schnell finden)

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: C ist "freier" als Pascal

Beitrag von Timm Thaler »

Warf hat geschrieben:Du findest das absurd? ich habe erst vor kurzem von einem Anfänger in einer Skriptsprache die Frage gesehen warum man Strings nicht als Funktionen verwenden kann (also "Funktion1()" statt Funktion1()).


Kann man nicht?

Code: Alles auswählen

  <script type="text/javascript" >
    window.setTimeout('load_content()', 100);
    function load_content() {
    ...
    }; 
  </script>


Warf hat geschrieben:Das sich Anfänger Code den sie nicht verstehen aus dem Internet zusammenkopieren sehe ich Täglich


Es ist aber auch ein Kreuz, dass Leute einfach mit Programmieren anfangen, ohne vorher 8 Semester Informatik studiert zu haben. Das ist fast so schlimm wie die ganzen Kiddies, die LED auf Steckbretter stecken, ohne vorher eine Ausbildung als Elektrotechniker mit anschließendem Aufbaustudium als Master of Electronics zu machen.

Obiges JS zum Einlesen meiner Messdaten aus der Heizungssteuerung in eine interne Webseite habe ich mir aus dem Internet zusammenkopiert. Ich hab nämlich im Studium nur Pascal gehabt.

AmigaBasic, QBasic, QuickBasic, ASM, C, JS habe ich größtenteils anhand von zusammenkopierten Programmen "gelernt". Das einzige Buch, was ich zum Programmieren in der Hand hatte war "Basic auf dem KC85". Ich hab kein Problem damit, wenn sich Leute Programme zusammenkopieren, solange sie dabei was lernen.

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: C ist "freier" als Pascal

Beitrag von Timm Thaler »

kupferstecher hat geschrieben:

Code: Alles auswählen

for ii:= 0 to AList.Count-1
do AList.Add('Bsp');

Aber man gewöhnt sich dran und merkt dann gar nicht mehr wie verquer das ist.


Vor allem merkt man nicht, wie Quatsch das ist. ;-)

In Pascal rettet Dic die Tatsache, dass AList.Count vor der Schleife ausgewertet und dann nicht mehr verändert wird. Macht aber sicher nicht, was Du bezweckst.

In C rennst Du damit in den Speicherüberlauf, weil natürlich jedes AList.Add auch AList.Count erhöht und damit die Schleife nie endet.

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

Re: C ist "freier" als Pascal

Beitrag von Warf »

Timm Thaler hat geschrieben:Kann man nicht?

Code: Alles auswählen

  <script type="text/javascript" >
    window.setTimeout('load_content()', 100);
    function load_content() {
    ...
    }; 
  </script>


Naja das script von ihm sah eher so aus:

Code: Alles auswählen

$var = 'function1()'

und da hat er sich gefragt warum in var function1() steht und nicht der ausgerechnete wert
Timm Thaler hat geschrieben:Es ist aber auch ein Kreuz, dass Leute einfach mit Programmieren anfangen, ohne vorher 8 Semester Informatik studiert zu haben. Das ist fast so schlimm wie die ganzen Kiddies, die LED auf Steckbretter stecken, ohne vorher eine Ausbildung als Elektrotechniker mit anschließendem Aufbaustudium als Master of Electronics zu machen.

Obiges JS zum Einlesen meiner Messdaten aus der Heizungssteuerung in eine interne Webseite habe ich mir aus dem Internet zusammenkopiert. Ich hab nämlich im Studium nur Pascal gehabt.

AmigaBasic, QBasic, QuickBasic, ASM, C, JS habe ich größtenteils anhand von zusammenkopierten Programmen "gelernt". Das einzige Buch, was ich zum Programmieren in der Hand hatte war "Basic auf dem KC85". Ich hab kein Problem damit, wenn sich Leute Programme zusammenkopieren, solange sie dabei was lernen.


Ich habe das gar nicht negativ gemeint das Anfänger das machen (ich habe als ich angefangen habe auch so gelernt), es ist nur etwas womit man rechnen muss. Deshalb bin ich der Meinung das Sprachen Fehler welche durch so etwas schnell auftauchen können und schwer zu finden sind, versuchen sollten diese durch intelligentes Sprachdesign zu vermeiden. Darum bin ich absolut kein fan vom break in C Switch-Case statements, im gegensatz dazu mag ich dafür den ? Operator aus Swift um Nullpointer Errors zu verhindern. Daher sehe ich in Selbstbestimmten Arraygrenzen für Dynamsiche Arrays zum größten Teil das Potential Fehler zu machen, da man in jedem Zugriff abfragen der Boundaries machen muss, um einen Überlauf zu vermeiden, ein Risiko welches den Vorteil eindeutig überwiegt
Zuletzt geändert von Warf am Mi 9. Aug 2017, 15:31, insgesamt 2-mal geändert.

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: C ist "freier" als Pascal

Beitrag von kupferstecher »

Timm Thaler hat geschrieben:Vor allem merkt man nicht, wie Quatsch das ist. ;-)

Oh oh, das Beispiel ist deutlich daneben gegangen.
Zeigt wieder wie fehleranfaellig doch die ganze Programmiererei ist~

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

Re: C ist "freier" als Pascal

Beitrag von Warf »

kupferstecher hat geschrieben:
Timm Thaler hat geschrieben:Vor allem merkt man nicht, wie Quatsch das ist. ;-)

Oh oh, das Beispiel ist deutlich daneben gegangen.
Zeigt wieder wie fehleranfaellig doch die ganze Programmiererei ist~


Lustigerweise hatte ich in einem Uni Projekt ein ganz ähnliches Problem, für die Erkenung von vorgegebenen Mustern in einer Punktemenge, sollten alle Punkte die nicht valide sind aus der Menge gelöscht werden (dafür ist die C For Schleife übrigens deutlich besser als die Pascal For Schleife). Nur leider wurde statt remove die Funktion append aufgerufen. Da der For Block zu groß war, wurde dennoch in jeder Iteration der Code zur Erkennung ausgeführt, und da das ganze in einem Thread als Endlosschleife lief und nur events gefeurt hat, hat es zunächst funktioniert. Nur wurde das ganze dann immer langsamer, da das ganze aber auf einem Rechner mit sehr viel Leistung lief haben wir es zunächst nicht bemerkt. Als ich dann neue Features hinzufügen wollte habe ich diesen Müll gesehen, bin aber immernoch fasziniert, das das ganze funktioniert hat, dank weiterer Fehler.

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: C ist "freier" als Pascal

Beitrag von Timm Thaler »

braunbär hat geschrieben:Warum müssen dynamische arrays immer bei 0 anfangen?


Warum kann man Prozeduren keine statischen Arrays übergeben?

Aber gut, dass wir drüber gesprochen haben. Ich hatte gerade den Fall: Ein Array [1..max] definiert und an eine Prozedur übergeben und mich gewundert, dass alle Werte um eins versetzt erscheinen. Jetzt ist das Array halt [0..max], wobei Index 0 nicht verwendet wird. In Basic wäre das nicht passiert. ;-)

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

Re: C ist "freier" als Pascal

Beitrag von Mathias »

Warum kann man Prozeduren keine statischen Arrays übergeben?

Bei mir geht dies

Code: Alles auswählen

procedure WriteArray(a: array of byte);
var
  i: integer;
begin
  for i := 0 to Length(a) - 1 do begin
    Write(a[i], ' ');
  end;
  WriteLn();
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  sa: array[50..100] of byte;
  i: integer;
begin
  WriteArray(sa);
  for i := Low(sa) to High(sa) do begin
    sa[i] := i;
  end;
  WriteArray(sa);
end;   

Dabei habe ich einen Nebeneffekt entdeckt, das die Werte der Arrray am Anfang undefiniert sind.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten