float in CArray
-
Hallo Ihr,
ich habe ein kleines Problem mit einem Datentyp. Vermutlich geht das auch gar nicht was ich machen will. Mein Programm liest Messwerte von einer Messkarte ein. Da erst zur Laufzeit bekannt wird wieviele Messwerte anfallen dachte ich, mir eine Variable vom Typ CArray zu deklarieren und die Werte darin zu speichern. Mit int und double funktioniert das auch sehr gut leider aber nicht mit float. Hat vielleicht jemand eine Idee wie man das realisieren kann? Im Nachhinein brauche ich die einzelnen Werte noch für eine Berechnung von Mittelwert und Standardabweichung sowie zur grafischen Darstellung. Wollte eigentlich auch ohne aufwendige Zeigeroperationen auskommen.
Hier noch etwas Code:
void CMultiMess::OnInput1() { int MaxSize CArray <int,int> Messwerte //funktioniert nur mit <int,int>, <double,int> usw. while (!Abbruch) { //Aufruf der Abfrage von der Karte Messwerte.Add (Messergebnis); //Messergebnis soll aber vom Typ float sein } MaxSize=Messwerte.GetSize(); }
-
und warum nimmst du dann nicht double? Wenn es doch mit double geht
-
Was funktioniert denn nicht?
Das hier klappt bei mir wunderbar:CArray <float, float> test; test.Add(3.5); TRACE("%3.1f", test.GetAt(0));
-
estartu_de schrieb:
Was funktioniert denn nicht?
Das hier klappt bei mir wunderbar:CArray <float, float> test; test.Add(3.5); TRACE("%3.1f", test.GetAt(0));
Hi estartu_de,
ich hatte die Vorgabe <float, int> gemacht. Ich war der Meinung in der MSDN gelesen zu haben, dass der 2. Parameter für den Index steht und der meines Wissens nach keine Fliesskommazahl ist. Das ging schon mal gar nicht (mein Fehler). <float,float> geht zwar, der Compiler meckert aber folgendes an: Verkürzung von 'const double' in 'float'. Ich denke das wird nur für double definiert sein. Wollte allerdings double umgehen da ich erstens den Wertebereich nicht brauche und zweitens es bei 2x5000 Messwerten auch eventuell etwas enger im Speicher wird (da ja double mit 8 bit verwaltet wird).
Aber trotzdem erst mal danke. Werde wahrscheinlich damit leben müssen.
-
AndyDD schrieb:
Compiler meckert aber folgendes an: Verkürzung von 'const double' in 'float'.
float f =3.14; // Warnung Verkürzung von 'const double' in 'float' float f =3.14f; // ok
Kurt
-
ZuK schrieb:
AndyDD schrieb:
Compiler meckert aber folgendes an: Verkürzung von 'const double' in 'float'.
float f =3.14; // Warnung Verkürzung von 'const double' in 'float' float f =3.14f; // ok
Kurt
Hallo Kurt,
im Grunde hast Du damit Recht. Die Zuweisung eines direkten Wertes funktioniert ja auch so. Allerdings bekomme ich die Messwerte aus einer Messkarte geliefert. Dort hat man nur eine Referenz auf eine float-Variable innerhalb einer Klasse, die durch den Treiber der Karte (Einbindung über mitgelieferte dll) bereitgestellt wird. Damit gehts zumindest aus meiner Sicht nicht so einfach. Ich habe ebenfalls noch mal nachgerechnet. Es fallen schlimmstenfalls 2x9000 Messwerte an und da ist es nicht unerheblich ob man float oder double nimmt.
-
Hallo.
Irgendwie reden wir aneienaner vorbei.
Also ich verstehe dich so: Der Treiber liefert dir eine Referenz auf float und du willst in deinen CArray floats abspeichern. Richtig ?
Also wir wissen schon das CArray<float,float> funktioniert.
Wo ist jetzt das Problem ?
Mit meinem obigen Beispiel wollte ich nur demonstrieren dass die Warnung Verkürzung von 'const double' in 'float' nichts mit der Verwendung von CArray<float,float> zu tun hat.
Ich nehme an dass du irgendwo zum testen code wieCArray <float, float> test; test.Add(3.5);
verwendet hast. Dieser code bewirkt die obige Warnung und du schliesst daraus dass CArray <float, float> nur mit double funktioniert. Dem ist aber nicht so.
Falls ich mich irren sollte poste doch einmal die Zeile code wo die Warnung auftritt.
Kurt
-
ZuK schrieb:
Hallo.
Irgendwie reden wir aneienaner vorbei.
Also ich verstehe dich so: Der Treiber liefert dir eine Referenz auf float und du willst in deinen CArray floats abspeichern. Richtig ?
Also wir wissen schon das CArray<float,float> funktioniert.
Wo ist jetzt das Problem ?
Mit meinem obigen Beispiel wollte ich nur demonstrieren dass die Warnung Verkürzung von 'const double' in 'float' nichts mit der Verwendung von CArray<float,float> zu tun hat.
Ich nehme an dass du irgendwo zum testen code wieCArray <float, float> test; test.Add(3.5);
verwendet hast. Dieser code bewirkt die obige Warnung und du schliesst daraus dass CArray <float, float> nur mit double funktioniert. Dem ist aber nicht so.
Falls ich mich irren sollte poste doch einmal die Zeile code wo die Warnung auftritt.
KurtHi Kurt,
ja ich habe genau diese Zuweisung. Allerdings steht statt der 3.5 eine Variable fVoltage vom Typ float, die vorher mit einem Wert aus der Karte belegt wird. Ich habe ja nicht gesagt das es nicht geht, ich wollte nur wissen wie man die Warnungen wegbekommt. Möglicherweise kann man die ja auch unbeachtet lassen. Allerdings weiß ich genau das eben nicht, da ich noch nicht so lange programmiere und noch nicht die Erfahrung habe wie andere hier. Hat es nun Nachteile wenn man das unbeachtet lässt?
-
AndyDD schrieb:
ja ich habe genau diese Zuweisung. Allerdings steht statt der 3.5 eine Variable fVoltage vom Typ float, die vorher mit einem Wert aus der Karte belegt wird.
Wenn du dort eine Variable vom Typ float hast dann darf es auch keine Warnung geben. Poste mal etwas code.
Kurt
-
Ok, hier ein wenig Code. Hoffe das genügt.
... float fVoltage; //Read one data ptAIVoltageIn.chan = usChan; // input channel ptAIVoltageIn.gain = 0; // gain code: refer to menual for voltage range ptAIVoltageIn.TrigMode = 0; // 0: internal trigger, 1: external trigger ptAIVoltageIn.voltage = &fVoltage; // Voltage retrieved ... CArray <float,float> Testarray; Testarray.Add (fVoltage); ...
Dann kommt folgende Fehlermeldung:
warning C4305: '=' : Verkuerzung von 'const double' in 'float'
Auch mit Variable klappt es nicht. Eine direkte Zuweisung einer als float gekennzeichneten Zahl wie oben dargestellt funktioniert.
-
Und die Warnung kommt in dieser Zeile ?
Testarray.Add (fVoltage);
Dann muss VC etwas verwirrt sein.
Kurt
-
Gegen Verwirrung hilft oft "Alles neu erstellen".
Ob es hier hilft weiß ich nicht, aber einen Test ist es wert.
-
Ja die Warnmeldung kommt in der Zeile
Testarray.Add (fVoltage);
Habe auch schon alles neu erstellt. Dazu hab ich mir eine kleine dialogbasierte Anwendung erstellt und die wesentlichen Teile nochmals implementiert.
Habe auch das SP 6 installiert. Bin langsam am verzweifeln
-
Naja wie es aussieht machst du scheinbar alles richtig. Der Variablentyp ist richtig. Der CArray-typ ist richtig dann kanns wahrscheinlich auch nicht schaden wenn du mit
Testarray.Add ((float)fVoltage);
den compiler zum schweigen bringst.
Kurt
-
AndyDD schrieb:
Habe auch schon alles neu erstellt. Dazu hab ich mir eine kleine dialogbasierte Anwendung erstellt und die wesentlichen Teile nochmals implementiert.
Das ist nicht das "Alles neu erstellen", was ich meinte.
Das was ich meinte, findest du im Menü "Erstellen".Aber wenn schon ein neues Projekt nicht hilft...
-
wenn du dir absolut sicher bist, das da nur float Werte kommen, dann würde ich es auch einfach nochmal in float casten.
Aber nochmal zur Sicherheit
...
float fVoltage;
fVoltage = 1.67f;//Read one data
//do nothing ptAIVoltageIn.chan = usChan; // input channel
//do nothing ptAIVoltageIn.gain = 0; // gain code: refer to //do nothing menual for voltage range
//do nothing ptAIVoltageIn.TrigMode = 0; // 0: internal
//do nothing trigger, 1: external trigger
//do nothing ptAIVoltageIn.voltage = &fVoltage; // Voltage retrieved
...CArray <float,float> Testarray;
Testarray.Add (fVoltage);
...erzeugt keine Warnung, oder? Ich schätze eher der Compiler meint irgendwo
ne andere Konvertierung und vertut sich nur in der Zeile
-
Ja es kommen nur float-Werte im Bereich zwischen 0.00 und 5.00. Der Compiler irrt sich sicher nicht in der Zeile, denn wenn man eine Zahl z.B. 3.18f added, dann meckert er nicht. Auch die Version
Testarray.Add ((float)fVoltage);
erzeugt trotzdem die Fehlermeldung. Bin total ratlos....