C++ kann Verzweifelung verursachen

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Mathias
Beiträge: 6162
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

C++ kann Verzweifelung verursachen

Beitrag von Mathias »

Dieser Ardunino Sketch hatte mich fast Verzweifelt. Als Normalsterblicher würde man eine Ausgabe von 50'000 erwarten. Aber Serial.printeln liefert -15'536 .
Ein Hinweis: int ist beim Arduino nur 16Bit und long 32Bit.

Code: Alles auswählen

long getTime() {
   int sw = 50;
   return sw * 1000;
}
 
void setup() {
   Serial.begin(9600);
   Serial.println("start");
}
 
void loop() {
   long t = getTime();
   Serial.println(t);
 
   delay(1000);
}

Nach langer Suche habe ich den Fehler gefunden.
Es müsste so heissen, man beachte das L hinter 1000.

Code: Alles auswählen

   return sw * 1000L;

Da verwundert es mich nicht, das die Entwicklung mit C++ sehr viel Zeit frisst, wen man sich um solchen Müll kümmern muss. :evil:

Wie liebe ich sehr Pascal. :idea:


Noch krasser:

Code: Alles auswählen

long getTime() {
   int a = 50;
   int b = 1000;
   return a * b;
}

Pascal gibt 50'00 zurück, so wie erwartet.

Code: Alles auswählen

function getTime: integer;
var
  a, b: Int16;
begin
  a := 50;
  b := 1000;
  Result := a * b;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: C++ kann Verzweifelung verursachen

Beitrag von siro »

Ich kann den Frust SEHR gut nachvollziehen, ich MUSS nämlich auch in "C" in der Firma programmieren.

Was da alles NICHT funktioniert ist kaum zu glauben.

Code: Alles auswählen

/*----------------------------------------*/
signed   short istWert;
unsigned short sollWert;
int dummy;
 
int main(void)
{ U32 time;
 
  istWert  = -1;
  sollWert = 12;
  if (istWert < sollWert)
  {
     dummy = 1;  /* hier geht es */
  }   
}
/*----------------------------------------*/
signed   int istWert;
unsigned int sollWert;
int dummy;
 
int main(void)
{ U32 time;
 
  istWert  = -1;
  sollWert = 12;
  if (istWert < sollWert)
  {
     dummy = 1;  /* !!!!! hier geht es NICHT !!!!! */
  }   
}


Pascal macht das immer richtig.

x := 1 SHL 8 + 1; in Pascal kommt dabei 257 heraus
x = 1 << 8 + 1; in C kommt dabei 512 heraus.......

Eine Shift links Operation ist eine Multiplikation mit 2 hoch n.
Eine Shift rechts Operation ist eine Division durch 2 hoch n.
Wie wir mal gelernt haben: Punktrechnung VOR Strichrechnung.
!!! gilt nicht in C, siehe Präzedenztabelle von „C“

Klammerung in C zwingend erforderlich:

C kann nichtmal die simpelsten Vorzeichengerechten Vergleiche,
Das größte Chaos ist die sogenannte "Integer Promotion"
Dann die Präzedenztabelle jenseits jeder Vernunft.
Ich könnt inzwischen Bücher schreiben was da für Problme aufgetreten sind, die es in anderen Sprachen garnicht gibt.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: C++ kann Verzweifelung verursachen

Beitrag von gladio »

Ihr habt mich überzeugt.
Da ich nie was mit C/C++ gamacht habe, bleibe ich bei Pascal. :lol:

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

Re: C++ kann Verzweifelung verursachen

Beitrag von Mathias »

Komisch, das dein obiger Code nicht funktioniert, ein short ist doch ein 16Bit Int ?
Es wird ja nicht mal die Byte-Grenze überwunden. :roll:

Nicht mal so eine primitive For-Schleife geht in C/C++. :evil:

Code: Alles auswählen

var
  b: byte;
begin
  for b := 0 to 255 do begin
    Write(b, ' ');
  end


Ich kann den Frust SEHR gut nachvollziehen, ich MUSS nämlich auch in "C" in der Firma programmieren.

Ich brauche C++ ausser für den Arduino zum Glück nie. In der Firma darf ich zum Glück Lazarus verwenden.
Zum Glück sind die Sketch meistens sehr klein, ansonsten würde alles sehr noch unübersichtlicher werden. Den Müll mit den Headern brauche ich da zum Glück auch nicht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: C++ kann Verzweifelung verursachen

Beitrag von Christian »

Da gibts nichts zu überzeugen.
Jede Sprache hat ihre Vor/Nachteile.
C++ und QT sind um ein vielfaches abgehangener als die Lazarus Widgetsets. Die Zeit die man mit Fehlern verbringen kann, das sich Controls in unterschiedlichen Widgetsets unterschiedlich/fehlerhaft verhalten KANN die Sprachelichen Probleme die der OP beschrieben hat um ein vielfaches aufwiegen. Genauso gibts in C/C++ viel mehr Bibliotheken. Es hat schon seinen Charm nen WebDAV/CalDAV/CardDAV Server einfach benutzen zu können und nicht von grund auf neuschreiben zu müssen.
Auf der anderen Seite ist man bei kleinen bis mittleren projekten mit Delphi oder Lazarus um ein vielfaches schneller als mit anderen Tools.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Re: C++ kann Verzweifelung verursachen

Beitrag von Mathias »

C++ und QT sind um ein vielfaches abgehangener als die Lazarus Widgetsets. Die Zeit die man mit Fehlern verbringen kann, das sich Controls in unterschiedlichen Widgetsets unterschiedlich/fehlerhaft verhalten KANN die Sprachelichen Probleme die der OP beschrieben hat um ein vielfaches aufwiegen

Mit den Widgetsets hatte ich bis jetzt keine Probleme, ich musste mir noch die Gedanken darüber machen, ich schreibe und kompiliere mit Lazarus und das Zeugs läuft. :wink:

Genauso gibts in C/C++ viel mehr Bibliotheken. Es hat schon seinen Charm nen WebDAV/CalDAV/CardDAV Server einfach benutzen zu können und nicht von grund auf neuschreiben zu müssen.
Dies liegt nicht an der Sprache selbst, sondern daran, das es viel verbreiteter ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: C++ kann Verzweifelung verursachen

Beitrag von Marsmännchen »

C++ hatte ich schon seit vielen Jahren mal lernen wollen. Hat lange gedauert, bis ich ein passendes Buch gefunden habe (Schrödinger-Serie), mit der ich die ganzen komischen Sachen in C++ verstanden habe.
An sich eine sehr interessante Sprache, aber ich hatte keine Freude dran, damit weiter zu arbeiten. Ich finde, der Code ist schwer lesbar und spätestens bei dem ganzen Make-Geschwurbel hatte ich keine Lust mehr.
Da ich nicht hardwarenah programmiere, bin ich bei ObjectPascal viel besser aufgehoben.
Just my two cents
Ich mag Pascal...

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: C++ kann Verzweifelung verursachen

Beitrag von Socke »

Marsmännchen hat geschrieben:Da ich nicht hardwarenah programmiere, bin ich bei ObjectPascal viel besser aufgehoben.

Auch mit dem FPC kann man hardwarenah programmieren: es werden verschiedene AVR- und ARM-Microcontroller sowie die x86-Architektur unterstützt. Wer also sein eigenes Betriebssystem in Pascal schreiben möchte, kann das gerne tun ;-)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: C++ kann Verzweifelung verursachen

Beitrag von MacWomble »

Socke hat geschrieben:Auch mit dem FPC kann man hardwarenah programmieren: es werden verschiedene AVR- und ARM-Microcontroller sowie die x86-Architektur unterstützt. Wer also sein eigenes Betriebssystem in Pascal schreiben möchte, kann das gerne tun ;-)


Was heute u.a. auch Thema auf dem Stuttgarter Treffen war. kupferstecher hat die Programmierung von AVR und STM32 vorgestellt, wobei er seine selbst geschriebenen Tools zum Einsatz brachte. Sein Projektmanager z.B vereinfacht das Anlegen eines Projektes ungemein durch die Durchführung der Kompilereinstellungen und die Bereitstellung von Projekt-Templates.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: C++ kann Verzweifelung verursachen

Beitrag von Soner »

Mathias hat geschrieben:Dieser Ardunino Sketch hatte mich fast Verzweifelt. Als Normalsterblicher würde man eine Ausgabe von 50'000 erwarten. Aber Serial.printeln liefert -15'536 .
Ein Hinweis: int ist beim Arduino nur 16Bit und long 32Bit.
....

Noch krasser:

Code: Alles auswählen

long getTime() {
   int a = 50;
   int b = 1000;
   return a * b;
}

Pascal gibt 50'00 zurück, so wie erwartet.

Code: Alles auswählen

function getTime: integer;
var
  a, b: Int16;
begin
  a := 50;
  b := 1000;
  Result := a * b;
end;


Ich frage mich ob hier nicht der Pascal Fehler macht. Wenn int 16 Bit lang ist, dann ist maximale Wert 2^15= 32768 (1 Bit Vorzeichen) . Also stellt der c++ Wert, den man wegen überlaufen erwartet. Pascal Wert ist mathematisch korrekt aber EDV-Technisch falsch. Oder mach ich Gedanken Fehler?

Edit: Vergießt das, Ich habe Rückgabetypen nicht beachtet, hab' sie auch als 16bit-Integer angenommen.
Zuletzt geändert von Soner am So 9. Jul 2017, 00:38, insgesamt 1-mal geändert.

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

Re: C++ kann Verzweifelung verursachen

Beitrag von wp_xyz »

Soner hat geschrieben:
Mathias hat geschrieben:Dieser Ardunino Sketch hatte mich fast Verzweifelt. Als Normalsterblicher würde man eine Ausgabe von 50'000 erwarten. Aber Serial.printeln liefert -15'536 .
Ein Hinweis: int ist beim Arduino nur 16Bit und long 32Bit.
....

Noch krasser:

Code: Alles auswählen

long getTime() {
   int a = 50;
   int b = 1000;
   return a * b;
}

Pascal gibt 50'00 zurück, so wie erwartet.

Code: Alles auswählen

function getTime: integer;
var
  a, b: Int16;
begin
  a := 50;
  b := 1000;
  Result := a * b;
end;


Ich frage mich ob hier nicht der Pascal Fehler macht. Wenn int 16 Bit lang ist, dann ist maximale Wert 2^15= 32768 (1 Bit Vorzeichen) . Also stellt der c++ Wert, den man wegen überlaufen erwartet. Pascal Wert ist mathematisch korrekt aber EDV-Technisch falsch. Oder mach ich Gedanken Fehler?

Ja. Als Ergebnistyp steht da Integer, somit sind 32 Bit verfügbar. Setzt man den Ergebnistyp auch auf Int16, erhält man das C++ Ergebnis.

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: C++ kann Verzweifelung verursachen

Beitrag von Soner »

Ich habe den unterschiedlichen Funktionsrückgabetyp nachhinein gesehen, wollte gerade mein Beitrag editieren.

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: C++ kann Verzweifelung verursachen

Beitrag von Soner »

Der Gcc 4.9.2 liefert auch 50000.
Hier online compiler: http://cpp.sh/3qsg

Code: Alles auswählen

 
// Example program
#include <iostream>
#include <string>
 
    long getTime() {
       int a = 50;
       int b = 1000;
       return a * b;
    }
 
int main()
{
  std::cout << getTime();
}
 

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: C++ kann Verzweifelung verursachen

Beitrag von Soner »

Mathias hat geschrieben:..
Nicht mal so eine primitive For-Schleife geht in C/C++. :evil:

Code: Alles auswählen

var
  b: byte;
begin
  for b := 0 to 255 do begin
    Write(b, ' ');
  end

...


Ich mag c/c++ auch nicht, aber wahrscheinlich das einzige was an c++ gut ist,ist die For-Schleife. Es liefert gleiches Ergebnis wie bei Pascal:

Code: Alles auswählen

 
#include <iostream>
#include <string>
int main()
{
  for (unsigned b = 0; b<=255; b++)
    std::cout << b << ' ';
}
 

Zum Online-Test: http://cpp.sh/8mvbi

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: C++ kann Verzweifelung verursachen

Beitrag von mschnell »

Die C-Logik ist eigentlich klar und eindeutig:
- eine Konstante ohne weitere Angabe ist vom Typ int
- eine Operation zwischen zwei Operanden desselben Typs wird in eben diesem Typ ausgeführt und liefert ein Ergebnis dieses Typen
- nach der Operation erfolgt eine Umwandlung, wenn für die nächste Operation (auch "=") ein anderer Typ benötigt wird.
- der Typ "int" ist von der Architektur abhängig.

Ich nehme deshalb nur selten den Typ int sondern die in Linux definierten Typen mit definierter Bit-Anzahl (z.B. "int32_t")., Wenn die bei einer Architektur nicht automatisch definiert sind, mache ich das in einer entsprechenden h-Datei.

-Michael

Antworten