C++ kann Verzweifelung verursachen

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
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 »

Danke für die Diskussion hier. Ich weiß jetzt wieder genauer, warum ich Pascal bevorzuge 8)
Ich mag Pascal...

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++ kann Verzweifelung verursachen

Beitrag von Mathias »

Nein, da kann man keine Zahl als Prüfbedingung für ein if verwenden.

Mit einer Typenumwandlung aber schon.

Code: Alles auswählen

var
  i: integer;
  b: boolean;
begin
  if boolean(123) then begin
    ShowMessage('True');
  end;
 
  i := 127;
  b := boolean(i);
  i := integer(b);
  ShowMessage(IntToStr(i));
end

i hat zum Schluss wieder 127;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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++ kann Verzweifelung verursachen

Beitrag von braunbär »

Mathias hat geschrieben:Mit einer Typenumwandlung aber schon.

Wenn man es darauf anlegt, undurchsichtigen und unportierbaren Code zu schreiben, der IRGEND ETWAS macht, ja.

In der Sprache Pascal ist nicht definiert, was in dem Fall passiert.
Wenn die Implementierung der Sprache auf 0 abfragt, funktioniert es so. Ebensogut kann der vom Compiler generierte Code z.B. nur das Bit 0 abfragen. Dann liefern alle geraden Zahlen false und alle ungeraden true. Ich bin zwar nicht ganz sicher, aber ich glaube mich zu erinnern, dass das bei irgend welchen Turbo Pascal Versionen der Fall war.

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++ kann Verzweifelung verursachen

Beitrag von Timm Thaler »

MmVisual hat geschrieben: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...


Was bei einem 8-bitter auch völlig logisch ist, dass man Rechenoperationen erstmal als 16bit ausführt, egal ob nötig oder nicht.

Ich komme vom AVR-Assembler auf C, und ich greif mir manchmal an den Kopf, was der Compiler da für einen Mist zusammenkompiliert. Für ein a >> 2 mit a als Byte definiert eine 16-bit-Softwaredivision aufzurufen ist noch harmlos.

Wenn es einen praktikablen und vor allem plattformübergreifenden (Win, x86er Linux und ARM-Linux sprich Raspi wäre ideal) Pascal-Compiler für AVRs gibt, würde ich mich liebend gern von C für AVR verabschieden.

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++ kann Verzweifelung verursachen

Beitrag von Mathias »

Wenn es einen praktikablen und vor allem plattformübergreifenden (Win, x86er Linux und ARM-Linux sprich Raspi wäre ideal) Pascal-Compiler für AVRs gibt, würde ich mich liebend gern von C für AVR verabschieden.


Geben täte es dies schon, aber ob es funktioniert habe ich nicht probiert.
http://wiki.freepascal.org/AVR

PS: Mit welcher Umgebung programmierst du sie AVRs ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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 »

Timm Thaler hat geschrieben:Wenn es einen praktikablen und vor allem plattformübergreifenden (Win, x86er Linux und ARM-Linux sprich Raspi wäre ideal) Pascal-Compiler für AVRs gibt, würde ich mich liebend gern von C für AVR verabschieden.

Der Compiler ist soweit. Ich gehe davon aus, dass dein Wunsch sich auf die Sprache bezieht und weniger darauf, ein Programm auf all diesen Plattformen laufen zu lassen.
Zum Einen sind die Units für die verschiedenen Microcontroller noch stark ausbaufähig und bedürfen einer gewissen Vereinheitlichung. Zum Anderen fehlen plattformübergreifende Bibliotheken für die Hardware-Abstraktion für grundlegenste Funktionen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: C++ kann Verzweifelung verursachen

Beitrag von kupferstecher »

Socke hat geschrieben:
Timm Thaler hat geschrieben:Wenn es einen praktikablen und vor allem plattformübergreifenden (Win, x86er Linux und ARM-Linux sprich Raspi wäre ideal) Pascal-Compiler für AVRs gibt, würde ich mich liebend gern von C für AVR verabschieden.

Der Compiler ist soweit. Ich gehe davon aus, dass dein Wunsch sich auf die Sprache bezieht und weniger darauf, ein Programm auf all diesen Plattformen laufen zu lassen.

Ich verstehe Timm Thaler so, dass er nur für AVR kompilieren möchte, und zwar von Win, x86er Linux und ARM-Linux aus. Und ja, der FPC kann das. Mit Lazarus gibts sogar ne Platformübergreifende IDE für alle drei Platformen.

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++ kann Verzweifelung verursachen

Beitrag von Timm Thaler »

Mathias hat geschrieben:PS: Mit welcher Umgebung programmierst du sie AVRs ?


Momentan schreibe und compiliere ich in AVR / Atmel Studio, wobei die 7er Version ein übelstes Monster ist, welches schon zum Starten ewig braucht. Ursprünglich ASM, inziwschen auch C.

kupferstecher hat geschrieben:Ich verstehe Timm Thaler so, dass er nur für AVR kompilieren möchte, und zwar von Win, x86er Linux und ARM-Linux aus. Und ja, der FPC kann das. Mit Lazarus gibts sogar ne Platformübergreifende IDE für alle drei Platformen.


Ähm ja, natürlich kann ich die Programme in Lazarus schreiben, da hatte ich wohl einen Blackout. Muss ich mir mal ansehen, wie man den Compiler einbindet.

Atmel Studio ist halt eine Windows Einbahnstrasse. Tendentiell sehe ich, dass meine Werkzeuge möglichst plattformübergreifend funktionieren, man weiss ja nie, ob man nicht mal komplett auf Linux umsteigen muss. Nur mit dem GCC unter Linux werde ich auch nicht warm.

Programmieren im physischen Sinne tue ich mit dem AVR MKII Programmer, das funktioniert sogar unter Android vom Tablet aus (aber nur mit dickem Kabel, ist das Kabel zu dünn, funktioniert der Programmer nicht richtig).

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++ kann Verzweifelung verursachen

Beitrag von Timm Thaler »

Socke hat geschrieben:Zum Einen sind die Units für die verschiedenen Microcontroller noch stark ausbaufähig und bedürfen einer gewissen Vereinheitlichung. Zum Anderen fehlen plattformübergreifende Bibliotheken für die Hardware-Abstraktion für grundlegenste Funktionen.


Ich hab mir mal Luna angesehen, da war das ähnlich. Einige Sachen gut implementiert, einige Sachen fehlten.

Von Hardware-Abstraktion bin ich wenig angetan. Meine bisherigen Erfahrungen damit sind eher so, dass es die Möglichkeiten des µC extrem einschränkt. Sehr abschreckend ist da zum Beispiel Arduino: Um einen Messwert aus dem ADC zu lesen wird die Messung angestoßen und dann solange in der Schleife gerödelt, bis die Messung beendet ist. Inzwischen kann der µC nichts anderes machen. Oder einen Port setzen: Geht nicht, man kann nur einzelne Pins ansprechen. Von so Spässen wie Software-PWM auf mehreren Kanälen ganz zu schweigen.

Ich setze meine Bits lieber von Hand, auch wenn man dazu etwas tiefer ins Datenblatt schauen muss. Die Sprache dient eher als Rahmen, um so Konstrukte wie Variablen, Berechnungen, Schleifen, If-Bedingungen, Prozeduren geschickt und übersichtlich abzufangen.

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 »

MmVisual hat geschrieben:
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.

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



Das hat mir doch keine Ruhe gelassen... :mrgreen:

so habe ich mein Problem eben nochmal ausprobiert:

Code: Alles auswählen

 
#include <stdint.H>
 
void Test(void)
{ volatile int32_t  a;
  volatile uint32_t b;
 
  a = -300;
  b = +1000;
 
  if (a < b)
  {
    a = 1;
  }
 
}
 


Das funktioniert aber trotzdem nicht, auch wenn ich die Integertypen aus stdint verwende.
Das ist mir aber inzwischen auch egal, bei "C" muss man halt immer mit allem Unmöglichen rechnen....
"C"haos Programmierung würde ich das nennen...

Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

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 »

Und hier noch ein schönes Beispiel:

Code: Alles auswählen

struct
{
        int dat1 : 3;
 signed int dat2 : 3;
} st;
 
int main(void)
{ int a;
 
 st.dat1 = -3;
 st.dat2 = -3;
 
 a = st.dat1;   /* !!!! a ist nun +5 !!!!!!!!! */
 a = st.dat2;   /* a ist nun -3 */
}
 


Irgendwie hat C wohl Probleme mit "Vorzeichen"... :D
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

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++ kann Verzweifelung verursachen

Beitrag von Mathias »

Ich bekomme mit folgendem Code,

Code: Alles auswählen

#include <iostream>
struct
{
        int dat1 : 3;
 signed int dat2 : 3;
} st;
 
 int main(){
   int a;
   st.dat1 = -3;
   st.dat2 = -3;
 
   a = st.dat1;   /* !!!! a ist nun +5 !!!!!!!!! */
   std::cout << a << std::endl;
   a = st.dat2;   /* a ist nun -3 */
   std::cout << a << std::endl;
   return 0;
 }



Kompiliert mit

Code: Alles auswählen

$ c++ ./test.cpp
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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++ kann Verzweifelung verursachen

Beitrag von Mathias »

Von Hardware-Abstraktion bin ich wenig angetan. Meine bisherigen Erfahrungen damit sind eher so, dass es die Möglichkeiten des µC extrem einschränkt. Sehr abschreckend ist da zum Beispiel Arduino: Um einen Messwert aus dem ADC zu lesen wird die Messung angestoßen und dann solange in der Schleife gerödelt, bis die Messung beendet ist. Inzwischen kann der µC nichts anderes machen. Oder einen Port setzen: Geht nicht, man kann nur einzelne Pins ansprechen. Von so Spässen wie Software-PWM auf mehreren Kanälen ganz zu schweigen.

Arduino ist da schon sehr extrem. Hat schon jemand mal die Source von digitalWrite angeguckt, der Overhead ist ja total extrem. :shock:
Und das wichtigste PORT? sehe ich aber noch nicht. Ein kleiner Typ, will man extrem schnelle Ausgabe, sollte man immer direkt über PORT? gehen.

Code: Alles auswählen

void digitalWrite(uint8_t pin, uint8_t val) {
   uint8_t timer = digitalPinToTimer(pin);
   uint8_t bit = digitalPinToBitMask(pin);
   uint8_t port = digitalPinToPort(pin);
   volatile uint8_t *out;
 
   if (port == NOT_A_PIN)
      return;
 
   // If the pin that support PWM output, we need to turn it off
   // before doing a digital write.
   if (timer != NOT_ON_TIMER)
      turnOffPWM(timer);
 
   out = portOutputRegister(port);
 
   uint8_t oldSREG = SREG;
   cli();
 
   if (val == LOW) {
      *out &= ~bit;
   } else {
      *out |= bit;
   }
 
   SREG = oldSREG;
}
Irgendwie, ist ein Arduino extrem auf Anfänger konzipiert.

Noch so am Rande, zum coden eines Arduinos/AVR, verwende ich "Sloeber, the Eclipse IDE for Arduino Developers".
Was ich leider noch nicht rausgefunden habe, wie man ganz vom Arduino Overhead wegkommt, ZB. das setup und loop.
Das einzige was ich dabei entdeckt habe, ist eine main.cpp in .../sloeber/arduinoPlugin/packages/arduino/hardware/avr/1.6.18/cores/arduino/main.cpp
Interessant wäre, wen ich die main.cpp auch selbst machen könnte.
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 »

@Mathias: danke, dass Du es mal ausprobiert hast

signed int Problem bei Bitdefinitionen

Der C-Compiler von IAR Embedded Workbench interpretiert einen "int" bei Bitdefinitionen vorzeichenlos, also wie ein "unsigned int"
Möchte man eine Bitkombination mit Vorzeichen haben, muss man einen "signed int" benutzen.
Ich wuste garnicht bis dato dass es einen "signed int" gibt. Ich dachte "int" hat generell ein Vorzeichen.
Eine Rücksprache mit dem Compiler Hersteller IAR hat die Vorgehensweise bestätigt.

Es ist also Compiler Spezifisch und damit nicht "eindeutig"

Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

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 »

"int" ist ohnehin nicht "eindeutig", sondern Architektur- und damit Compiler-Abhängig.

Dass das die default-Bit-Anzahl betrifft, war mir bewusst. Dass auch das default signed/unsignd Attribut betroffen ist, ist mir neu,aber nicht unlogisch.

-Michael

Antworten