Der Martin: setInterval mit function "pointer" und parameter

Beitrag lesen

Moin,

das muss man normalerweise nur sehr selten, weil man ja selten absichtlich inkompatible Datentypen zwangsverheiratet.
Mir passiert das oft. Wenn man z.B. XML-Daten verarbeitet, so sind die ja erst einmal Strings, auch wenn es eigentlich Zahlen oder Kalenderdaten sein sollen. Wenn man dann noch mathematisch damit rechnen muss, wird's ätzemd mit der Typgenauigkeit.

genau das ist ein Fall, wo ich die Unterscheidung z.B. zwischen Strings und numerischen Typen für absolut richtig halte.

Wenn man z.B. berechnen soll, in welchem Quartal ein Monat liegt, kann man in JavaScript einfach notieren:
var quartal = Math.ceil(myDate.getMonth / 3).

Ja und? In C doch auch (angenommen, month sei 0..11):

int quartal = month/3 +1; // +1 nur, wenn man quartal nicht ab 0 zählen möchte

Läuft month dagegen von 1..12, ändert sich nur wenig:

int quartal = (month-1)/3 +1;

In C# etwa wäre myDate.Month vom Typ int, und durch 3 teilen geht damit nicht wirklich.

Wieso nicht? Was macht C# da so essentiell anders? Ist die Integer-Division in C# nicht definiert?

Also muss man es erst zu decimal oder float casten, dann dividieren, die nächst höhere Ganzzahl berechnen (noch immer decimal) und schleißlich wieder zu int casten:

int quartal = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(myDate.Month) / 3));

Das ist umständlich - und ich glaube nicht, dass das notwendig ist.

Daher ist es eine feine Sache, wenn der Compiler einen solchen Versuch mit einer Fehlermeldung quittiert.
Nö, daher ist es richtig nervig, wenn der Compiler jede Kleinigkeit mit einer Fehlermeldung quittiert, und im Fall von im Fall von int dividiert durch int gibt er nicht mal eine aus.

Warum sollte er auch? Das ist doch eine ganz normale Operation.

Das Ergebnis ist wieder int, was man selten haben will.

Doch, sicher - genau das will ich in geschätzten 99% aller Fälle haben. In den seltenen Fällen, wo ich als Ergebnis einer Operation, bei der die Operanden int sind, ausnahmsweise mal float bekommen möchte, muss ich halt einen der Operanden vorher nach float casten.

Ciao,
 Martin

--
Er war ein Mann wie ein Baum. Sie nannten ihn Bonsai.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(