C++ kann Verzweifelung verursachen

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.

C++ kann Verzweifelung verursachen

Beitragvon Mathias » 8. Jul 2017, 16:45 C++ kann Verzweifelung verursachen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3255
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon siro » 8. Jul 2017, 18:25 Re: C++ kann Verzweifelung verursachen

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
"C" verCehnfacht die Entwicklungszeit...
siro
 
Beiträge: 227
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon gladio » 8. Jul 2017, 19:03 Re: C++ kann Verzweifelung verursachen

Ihr habt mich überzeugt.
Da ich nie was mit C/C++ gamacht habe, bleibe ich bei Pascal. :lol:
gladio
 
Beiträge: 76
Registriert: 21. Jun 2014, 05:15
Wohnort: Ostseestrand
OS, Lazarus, FPC: Win7/10-32/64 | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Mathias » 8. Jul 2017, 19:17 Re: C++ kann Verzweifelung verursachen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3255
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Christian » 8. Jul 2017, 19:20 Re: C++ kann Verzweifelung verursachen

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/
Christian
 
Beiträge: 6092
Registriert: 21. Sep 2006, 06:51
Wohnort: Dessau
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z) | 
CPU-Target: AVR,ARM,x86(-64)
Nach oben

Beitragvon Mathias » 8. Jul 2017, 19:25 Re: C++ kann Verzweifelung verursachen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3255
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Marsmännchen » 8. Jul 2017, 21:03 Re: C++ kann Verzweifelung verursachen

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...
Marsmännchen
 
Beiträge: 291
Registriert: 4. Mai 2014, 20:32
Wohnort: Berlin
OS, Lazarus, FPC: Ubuntu 16.04, FPC 3.0.2, Lazarus 1.6.4 | 
CPU-Target: 64bit
Nach oben

Beitragvon Socke » 8. Jul 2017, 21:47 Re: C++ kann Verzweifelung verursachen

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
Socke
 
Beiträge: 2393
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon MacWomble » 8. Jul 2017, 22:06 Re: C++ kann Verzweifelung verursachen

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.
MacWomble
 
Beiträge: 389
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 18.3 Cinnamon / CodeTyphon Generation V Plan 6.00 (FPC 3.1.1) | 
CPU-Target: 32/64 Nit
Nach oben

Beitragvon Soner » 8. Jul 2017, 23:18 Re: C++ kann Verzweifelung verursachen

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 8. Jul 2017, 23:38, insgesamt 1-mal geändert.
Soner
 
Beiträge: 371
Registriert: 26. Sep 2012, 23:07
Wohnort: Hamburg
OS, Lazarus, FPC: Win7Pro-32Bit, Immer letzte Lazarus Release mit SVN-Fixes | 
CPU-Target: 32Bit
Nach oben

Beitragvon wp_xyz » 8. Jul 2017, 23:30 Re: C++ kann Verzweifelung verursachen

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.
wp_xyz
 
Beiträge: 2276
Registriert: 8. Apr 2011, 08:01

Beitragvon Soner » 8. Jul 2017, 23:36 Re: C++ kann Verzweifelung verursachen

Ich habe den unterschiedlichen Funktionsrückgabetyp nachhinein gesehen, wollte gerade mein Beitrag editieren.
Soner
 
Beiträge: 371
Registriert: 26. Sep 2012, 23:07
Wohnort: Hamburg
OS, Lazarus, FPC: Win7Pro-32Bit, Immer letzte Lazarus Release mit SVN-Fixes | 
CPU-Target: 32Bit
Nach oben

Beitragvon Soner » 8. Jul 2017, 23:46 Re: C++ kann Verzweifelung verursachen

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: 371
Registriert: 26. Sep 2012, 23:07
Wohnort: Hamburg
OS, Lazarus, FPC: Win7Pro-32Bit, Immer letzte Lazarus Release mit SVN-Fixes | 
CPU-Target: 32Bit
Nach oben

Beitragvon Soner » 8. Jul 2017, 23:56 Re: C++ kann Verzweifelung verursachen

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
Soner
 
Beiträge: 371
Registriert: 26. Sep 2012, 23:07
Wohnort: Hamburg
OS, Lazarus, FPC: Win7Pro-32Bit, Immer letzte Lazarus Release mit SVN-Fixes | 
CPU-Target: 32Bit
Nach oben

Beitragvon mschnell » 9. Jul 2017, 05:51 Re: C++ kann Verzweifelung verursachen

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
mschnell
 
Beiträge: 3159
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Programmierung



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried