C++ kann Verzweifelung verursachen

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

Re: C++ kann Verzweifelung verursachen

Beitragvon MmVisual » 9. Jul 2017, 06:08 Re: C++ kann Verzweifelung verursachen

Wenn man mit einem C Compiler auf einem µC arbeitet dann ist die Datenbreite einer int Variable abhängig vom µC.
Bei einem AVR (Arduino) ist das 16 Bit, bei einem STM32 32 Bit.

Für jemanden der wenig/keine Ahnung von µC hat sehen diese Effekte verwirrend und buggy aus, jedoch ist das so im C Compiler hinterlegt. (so auch bei 32 / 64 Bit Programmen im PC!)

Die einzige Abhilfe ist die Datei
#include <stdint.h>
mit ein zu binden. Diese Datei definiert Integer Datentypen so, dass die auch genau das Format haben wie man will.

int8_t
int16_t
int32_t
int64_t
uint8_t
uint16_t
uint32_t
uint64_t

Und das ganze funktioniert garantiert, auch wenn man den Quellcode man von einem AVR >> STM32 µC portieren sollte, falls man doch mal feststellen sollte dass der AVR eine olle Krücke, die schon steinalt ist.

:idea: Merke: NIEMALS den Datenty int im µC UND PC verwenden!

Das Verhalten vom C Compiler ist schon so, seit dem es den ersten C Compiler gab.

Konstante:
1000 >> irgend ein int typ, der Compiler muss selbst was erfinden
1000L >> eine Konstante vom Typ "long"
1000UL >> eine Konstante vom Typ "unsigned long"

Um heraus zu finden wie viele bytes ein Datentyp belegt kann man das abfragen:
SizeOfDatentyp = sizeof(int); // beim AVR > 2 Byte, beim STM32 > 4 Byte
SizeOfDatentyp = sizeof(long); // beim AVR > 4 Byte, beim STM32 > 4 Byte
SizeOfDatentyp = sizeof(long long);
MmVisual
 
Beiträge: 945
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Marsmännchen » 9. Jul 2017, 08:16 Re: C++ kann Verzweifelung verursachen

Socke hat geschrieben:
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 ;-)
Hatte ich gar nicht mehr auf dem Radar :-)
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 siro » 9. Jul 2017, 09:03 Re: C++ kann Verzweifelung verursachen

Hallo MmVisual,
da Du Dich augenscheinlich gut in C auskennst, möcht ich gleich eine Frage dazu stellen,
Man vergebe mir, :wink: ist ja eigentlich nen Pascal-Forum... :D

Ich habe mir für meine C-Programme folgende Header Datei gebaut,
da ich es wesentlich leserlicher finde als die vielen Unterstriche der Typdefinitionen.

Code: Alles auswählen
#ifndef Types_H_Included    
  #define Types_H_Included
 
  #define FALSE (0)           /* only the 0 is FALSE */
  #define TRUE  (!FALSE)      /* all others are TRUE */
 
  typedef unsigned char  BOOL; /*  0=FALSE  all others are TRUE */
  typedef unsigned char  U8;   /*  8 Bit without sign */
  typedef signed char    S8;   /*  8 Bit with    sign */
  typedef unsigned short U16;  /* 16 Bit without sign */
  typedef signed short   S16;  /* 16 Bit with    sign */
  typedef unsigned int   U32;  /* 32 Bit without sign */
  typedef signed int     S32;  /* 32 Bit with    sign */
  typedef float          F32;  /* 32 Bit floating point ==> entspricht in Delphi dem Typ Single */
 
#endif


is es dann besser "sinnvoller" dass ich dies entsprechend ändere, also demnach:
Code: Alles auswählen
 
  typedef uint8_t  U8;   /*  8 Bit without sign */
  typedef int8_t   S8;   /*  8 Bit with    sign */
  typedef uint16_t U16;  /* 16 Bit without sign */
  typedef int16_t  S16;  /* 16 Bit with    sign */
  typedef uint32_t U32;  /* 32 Bit without sign */
  typedef int32_t  S32;  /* 32 Bit with    sign */


löst das vielleicht auch die signed / unsigned Probleme bei Vergleichen mit gemischten Datentypen ?
Siro
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 Mathias » 9. Jul 2017, 12:52 Re: C++ kann Verzweifelung verursachen

is es dann besser "sinnvoller" dass ich dies entsprechend ändere, also demnach:

Ich würde dies auf jeden Fall machen, beim int hast du keine Garantie, das dieser 32Bit breit ist, auch nicht auf dem PC.
http://www.mrknowing.com/2013/10/08/dat ... ergroesse/
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3249
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 9. Jul 2017, 12:54 Re: C++ kann Verzweifelung verursachen

Soner hat geschrieben: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();
}
 


Beim GCC ist der int auch 32Bit breit und nicht nur 16Bit.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3249
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon MmVisual » 9. Jul 2017, 15:16 Re: C++ kann Verzweifelung verursachen

Binde das ein:
#include <stdint.h>
und erfinde nichts neues / eigenes. Die Datei ist bei jedem GCC irgendwo im lib/include Verzeichnis fix und fertig vorhanden.

Beschreibung z.B. hier:
http://pubs.opengroup.org/onlinepubs/00 ... int.h.html
MmVisual
 
Beiträge: 945
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon braunbär » 9. Jul 2017, 21:44 Re: C++ kann Verzweifelung verursachen

Code: Alles auswählen
 
 #define FALSE (0)           /* only the 0 is FALSE */
 #define TRUE  (!FALSE)      /* all others are TRUE */
 

Der Kommentar ist jedenfalls irreführend, weil diese Definition macht true synonym zu 1, und natürlich nicht Synonym zu "all others" - so etwas ist ja gar nicht möglich.
braunbär
 
Beiträge: 164
Registriert: 8. Jun 2017, 17:21

Beitragvon Soner » 10. Jul 2017, 01:40 Re: C++ kann Verzweifelung verursachen

braunbär hat geschrieben:
Code: Alles auswählen
 
 #define FALSE (0)           /* only the 0 is FALSE */
 #define TRUE  (!FALSE)      /* all others are TRUE */
 

Der Kommentar ist jedenfalls irreführend, weil diese Definition macht true synonym zu 1, und natürlich nicht Synonym zu "all others" - so etwas ist ja gar nicht möglich.

Ich glaube schon das der Kommentar richtig ist.
In C und C++ ist Ausrufezeichen '!' not-Operator, also 'not 0' heißt dann alle Zahlen die nicht Null sind.
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 m.fuchs » 10. Jul 2017, 05:34 Re: C++ kann Verzweifelung verursachen

Soner hat geschrieben:Ich glaube schon das der Kommentar richtig ist.
In C und C++ ist Ausrufezeichen '!' not-Operator, also 'not 0' heißt dann alle Zahlen die nicht Null sind.

Von der Logik her her würde ich dir zustimmen. Allerdings ist im C-Standard etwas anderes definiert:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf hat geschrieben:The result of the logical negation operator ! is 0 if the value of its operand compares
unequal to 0, 1 if the value of its operand compares equal to 0.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
 
Beiträge: 1687
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.6, FPC 3.0) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon siro » 10. Jul 2017, 07:54 Re: C++ kann Verzweifelung verursachen

Guten Morgen zusammen,

Alles außer 0 ist doch "true" weil eine Abfrage:

if (x).... führt die Anweisung NUR dann aus, wenn x NICHT 0 ist.
Also auch wenn x -12 oder +2456 ist.

somit ist die Deklaration von TRUE = (! FALSE) doch korrekt.
Falsch wäre es, wenn ich #define TRUE (1) schreiben würde.
Dann wäre eine -12 oder +2456 plötzlich FALSE, was dem Ablauf von if (x) wiedersprechen würde.

.....

Deklaration / Definition ist auch so eine Wortspielerei....
ein #define ist nicht etwa eine Definition, sondern eine Deklaration :shock:
da fragt man sich auch was das soll....
Es gab mal eine Sprache, da hiess eine Deklarartion sinnvollerweise auch "DECLARE" PL/M-80 falls das noch jemand kennt, ist schon ein bischen her :wink:
kommt aber dem Pascal SEHR nahe.

Siro

Eine schöne "C" Mecker Ecke hier.... :mrgreen:
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 braunbär » 10. Jul 2017, 08:23 Re: C++ kann Verzweifelung verursachen

Eine Konstantendeklaration hat den Sinn, eine Bezeichnung einzuführen, die in der Folge im Programm beliebig an Stelle des angegebenen Werts verwendet werden kann.
Die Konstante FALSE kann im Programm beliebig an Stelle des Werts 0 verwendet werden.
Die Konstante TRUE kannst du aber im Programm nur bei Zuweisunngen verwenden, if (b==true) wird ein falsches (unerwartetes) Ergebnis liefern, wenn man sie dem Kommentar folgend verwendet.
Denn if (b==true) bedeutet etwas ganz anderes als !(b==false). Wenn du schreibst
Code: Alles auswählen
 
#define FALSE (0)           /* only the 0 is FALSE */
#define TRUE  (1)           /* any other value different from 0 also means TRUE */
 

dann ist kein Missverständnis möglich. Der Fehler, boolean Variable auf Gleichheit mit boolean Konstanten zu vergleichen, kommt vor allem bei Anfängern sehr häufig vor, und kann auch in Pascal zu Problemen führen. Deshalb mein Hinweis.

in C heißt es übrigens #define, weil mit der Zeile eine Variable nicht nur deklariert, sondern auch gleich definiert wird. Es steht ja in der Zeile, was die Variable FALSE bedeutet.
braunbär
 
Beiträge: 164
Registriert: 8. Jun 2017, 17:21

Beitragvon MmVisual » 10. Jul 2017, 08:40 Re: C++ kann Verzweifelung verursachen

braunbär hat geschrieben:in C heißt es übrigens #define, weil mit der Zeile eine Variable nicht nur deklariert, sondern auch gleich definiert wird. Es steht ja in der Zeile, was die Variable FALSE bedeutet.


Bitte "C" Fragen nicht in einem Pascal Forum posten. Da bekommt man viele falsche Antworten.

das #define ist ein Präprozessor direktive, da läuft ein Parser durch den Code und ersetzt alle Texte "FALSE" in "(0)", nichts anderes. Erst danach geht der so manipulierte Code zum C Compiler, der sieht dann die (0) und nicht mehr FALSE. Da wird weder eine Variable deklariert noch Speicher angelegt.
MmVisual
 
Beiträge: 945
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon braunbär » 10. Jul 2017, 11:49 Re: C++ kann Verzweifelung verursachen

Du hast Recht, aber im Endeffekt läuft es (zumindest in so einfachen Fällen) auf die Definition einer Konstanten hinaus. ""Variable" war das falsche Wort, richtig wäre "Bezeichner" gewesen.
Erst wollte ich schreiben, #define definiert ein Makro - das wäre wohl besser gewesen. Ich wollte es aber nicht weiter komplizieren.
Jedenfalls handelt es sich bei #define um eine Definition und nicht nur um eine Deklaration, denn aus der Zeile ergibt sich die Bedeutung des Namens.

Konstantendefinitionen legen generell keinen Speicher an, außer im Fall von typed constants.
braunbär
 
Beiträge: 164
Registriert: 8. Jun 2017, 17:21

Beitragvon Mathias » 10. Jul 2017, 16:50 Re: C++ kann Verzweifelung verursachen

Alles außer 0 ist doch "true" weil eine Abfrage:

if (x).... führt die Anweisung NUR dann aus, wenn x NICHT 0 ist.
Also auch wenn x -12 oder +2456 ist.

somit ist die Deklaration von TRUE = (! FALSE) doch korrekt.
Falsch wäre es, wenn ich #define TRUE (1) schreiben würde.
Dann wäre eine -12 oder +2456 plötzlich FALSE, was dem Ablauf von if (x) wiedersprechen würde.

Ist das in Pascal nicht auch so ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3249
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 10. Jul 2017, 18:08 Re: C++ kann Verzweifelung verursachen

Mathias hat geschrieben:
if (x).... führt die Anweisung NUR dann aus, wenn x NICHT 0 ist.
Also auch wenn x -12 oder +2456 ist.

Ist das in Pascal nicht auch so ?

Nein, da kann man keine Zahl als Prüfbedingung für ein if verwenden.
Code: Alles auswählen
Error: Incompatible types: got "ShortInt" expected "Boolean"
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
 
Beiträge: 1687
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.6, FPC 3.0) | 
CPU-Target: x86, x64, arm
Nach oben

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

Zurück zu Programmierung



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried