Casten mit Carsten

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: C:Ausdrücke

Beitrag von Dirty Oerti » Mi Jul 23, 2008 10:18 pm

Ich verstehe immer noch nicht, was so schädlich am Casten ist.
Was ist denn das Risiko?
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C:Ausdrücke

Beitrag von Xin » Mi Jul 23, 2008 10:30 pm

Dirty Oerti hat geschrieben:Ich verstehe immer noch nicht, was so schädlich am Casten ist.
Was ist denn das Risiko?

Code: Alles auswählen

struct Flugzeug
{
  long AnzahlTragflaechen;
};

struct Auto
{
  long AnzahlRaeder;
}

void info( struct Flugzeug * flugzeug )
{
  printf( "Das Flugzeug hat %d Tragflaechen\n", flugzeug->AnzahlTragflaechen );
}
void flieg( struct Flugzeug * flugzeug );

int main(void)
{
  struct Auto auto;
  auto.AnzahlRaeder = 4;

  info( (struct Flugzeug *) &auto );
  flieg( (struct Flugzeug *) &auto ); 
}
Wieviele Tragflächen hat das Auto und glaubst Du es wird fliegen?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: C:Ausdrücke

Beitrag von Dirty Oerti » Mi Jul 23, 2008 10:45 pm

Wieviele Tragflächen hat das Auto und glaubst Du es wird fliegen?
Nunja...aber wenn der Programmierer sein Auto dermaßen vergewaltigt ist er eigntl selber Schuld.
Du bist also im Grunde genommen gegen Casten, weil man damit als Programmierer "Mist bauen" kann?
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: C:Ausdrücke

Beitrag von Kerli » Mi Jul 23, 2008 10:47 pm

Xin hat geschrieben:
Dirty Oerti hat geschrieben:Ich verstehe immer noch nicht, was so schädlich am Casten ist.
Was ist denn das Risiko?

Code: Alles auswählen

struct Flugzeug
{
  long AnzahlTragflaechen;
};

struct Auto
{
  long AnzahlRaeder;
}

void info( struct Flugzeug * flugzeug )
{
  printf( "Das Flugzeug hat %d Tragflaechen\n", flugzeug->AnzahlTragflaechen );
}
void flieg( struct Flugzeug * flugzeug );

int main(void)
{
  struct Auto auto;
  auto.AnzahlRaeder = 4;

  info( (struct Flugzeug *) &auto );
  flieg( (struct Flugzeug *) &auto ); 
}
Wieviele Tragflächen hat das Auto und glaubst Du es wird fliegen?
Man sollte casts natürlich sinnvoll einsetzen. Wenn man sich damit allerdings nicht gut auskennt, können sie leicht zu einer Fehlerquelle werden.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C:Ausdrücke

Beitrag von Xin » Do Jul 24, 2008 12:07 am

Dirty Oerti hat geschrieben:Nunja...aber wenn der Programmierer sein Auto dermaßen vergewaltigt ist er eigntl selber Schuld.
Du bist also im Grunde genommen gegen Casten, weil man damit als Programmierer "Mist bauen" kann?
Kerli hat geschrieben:Man sollte casts natürlich sinnvoll einsetzen. Wenn man sich damit allerdings nicht gut auskennt, können sie leicht zu einer Fehlerquelle werden.
Ihr habt beide Recht. Man sollte Casts sinnvoll einsetzen und wer sein Programm dermaßen vergewaltigt, ist eigentlich selbst schuld. Ich programmiere seit 1986. Ich habe gelernt, wie man es richtig macht, aber ich habe auch gelernt, dass Menschen Fehler machen. Anfänger machen Fehler, weil das schon gehen wird, bessere Programmierer machen Fehler, weil sie unaufmerksam waren. Sehr gute Programmierer wissen, dass sie gelegentlich unaufmerksam sind und dann Fehler machen. Die Konsequenz ist, Fehlerursachen zu vermeiden. Casts müssen genauso verpöhnt sein, wie gotos. In C++ gibt es noch einen Grund für Gotos, und das ist aus mehreren Schleifen zu springen. Java benötigt Goto nicht mehr. Und genauso sollte alles versucht werden, um Casts überflüssig zu machen.

Wer keinen Mist bauen kann, muss qualitativere Programme schreiben und der Verzicht auf Casts bedeutet nicht zwangsläufig ein Verzicht auf Fähigkeiten der Programmiersprache.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Metamorph
Beiträge: 123
Registriert: Sa Jul 05, 2008 12:27 pm

Re: C:Ausdrücke

Beitrag von Metamorph » Do Jul 24, 2008 9:25 pm

Ich habe mal irgendwo gelesen, dass es bei floats zu heftigen Rundungsfehlern kommen kann. Deswegen sollte man solange Ganzzahltypen nutzen, bis man auf eine Rechnung kommt, wo die Möglichkeit besteht, dass aus dem ganzzahligen Wert eine Kommazahlen wird. Das Ergebnis der Rechnung sollte dann über einen Cast ausgegeben werden.
Ich kann es nicht bestätigen und ich kenne auch keine Alternativen.
Dass es bei floats zu Rundungsfehlern kommt, habe ich aber schon mehrmals gelesen.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C:Ausdrücke

Beitrag von Xin » Do Jul 24, 2008 9:52 pm

Metamorph hat geschrieben:Ich habe mal irgendwo gelesen, dass es bei floats zu heftigen Rundungsfehlern kommen kann.
Ich kann es nicht bestätigen und ich kenne auch keine Alternativen.
Endlosschleife oder keine Endlosschleife?

Code: Alles auswählen

#include "stdio.h"

float i = 0.0;
float j = -1.0;

int main( void )
{
  while( i != j )
  {
    j = i;
    i = i + 1.0;
  }

  printf( "i (%f) ist gleich j (%f)\n", i, j );
  j = j + 1.0;
  printf( "i (%f) ist gleich j (%f)\n", i, j );

  return 0;
}
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: C:Ausdrücke

Beitrag von Kerli » Do Jul 24, 2008 9:59 pm

Code: Alles auswählen

i (16777216.000000) ist gleich j (16777216.000000)
i (16777216.000000) ist gleich j (16777216.000000)
:D

Also ich würde so etwas nie als Schleifenbedingung nehmen. Wenn schon mit Gleitkommazahlen dann nicht mit 'gleich' oder 'ungleich', weil es eben immer durch die begrenzte Genauigkeit zu Rundungsfehler kommen wird.

( Und ich würde auch nicht 'i = i + 1.0;' schreiben sondern 'i += 1.0;' :P )
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten