Problem überhaupt lösbar ?



  • private: System::Void MeasureVoltage (String^ error_out, int deflection, float definition, unsigned int channel) 
    {
    
    	float DataValue=0;
        DaqBoard = gcnew MccDaq::MccBoard(0);
        ULState = gcnew MccDaq::ErrorInfo(0);
    
    	if(DaqBoard != nullptr)
    				{	
    
    					/* VIn measuaring */
    					ULState=DaqBoard->VIn(channel, MccDaq::Range::Bip10Volts , DataValue , MccDaq::VInOptions::Default);
    				    /*A/D range code*/
    
    					if (ULState->Value == MccDaq::ErrorInfo::ErrorCode::NoErrors)
    					{
    
    						if((definition/100*(100-deflection)) <= DataValue <= (DataValue/100*(100+definition)))
    						{
    						print("VS_CH_IN - OK - Voltage");
    						File::AppendAllText(DIRECTION,"VS_CH_IN - OK - Voltage: "+ DataValue.ToString()+ "V" + Environment::NewLine + Environment::NewLine);
    						}
    						else
    						{
    						print("VS_CH_IN - NOK - Wrong Voltage");
    						print(error_out);
    						File::AppendAllText(DIRECTION,"VS_CH_IN - NOK - Wrong Voltage: " + DataValue.ToString()+ "V" + Environment::NewLine + error_out + Environment::NewLine + Environment::NewLine);
    						}
    					/**/
    					}
    					else
    					{
    					print(ULState->Message);
    					File::AppendAllText(DIRECTION,ULState->Message + Environment::NewLine + Environment::NewLine);
    					}
    		      }
    
       }
    

    Ich habe diese Funktion geschrieben, das Problem liegt in dieser Zeile:

    ULState=DaqBoard->VIn(channel, MccDaq::Range::Bip10Volts , DataValue , MccDaq::VInOptions::Default);
    

    Und zwar beim dritten Parameter, die MccDaq ist eine DLL und eig. für C# weshalb der aufruf in den examples so aussieht:

    ULStat = DaqBoard.VIn( Chan, RangeSelected, out DataValue, Options );
    

    Man berücksichtige das out vor dem DataValue welches in C# als eine Art Referenz fungiert. (keine Erfahrung in C#)

    Das will aber einfach nicht funktionieren, wenn ich eine Referenz übergebe also
    &Datavalue gibt der Compiler mir ein Fehler aus. Lege ich davor eine an:
    float Datavalue1=0;
    float& Datavalue=Datavalue;

    kommt immernoch der Feheler und zwar der folgende: (Runtime)

    Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in MccDaq.dll aufgetreten.

    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Vielleicht hat ja jemand ne Idee 🙂
    Gruß



  • ComNet1 schrieb:

    Ich habe diese Funktion geschrieben, das Problem liegt in dieser Zeile:

    ULState=DaqBoard->VIn(channel, MccDaq::Range::Bip10Volts , DataValue , MccDaq::VInOptions::Default);
    

    Die Zeile sieht eigentlich gut aus. Der Parameter müsste vom Typ float% sein (➡ http://msdn.microsoft.com/en-us/library/8903062a.aspx ) Was für eine Fehlermeldung bekommst du denn damit?

    Das will aber einfach nicht funktionieren, wenn ich eine Referenz übergebe also
    &Datavalue gibt der Compiler mir ein Fehler aus.

    Mit &Datavalue erzeugt man keine Referenz.

    Mal was zu dem Code.

    private: System::Void MeasureVoltage (String^ error_out, int deflection, float definition, unsigned int channel) // (1)
    {
      float DataValue=0;
      DaqBoard = gcnew MccDaq::MccBoard(0);
      ULState = gcnew MccDaq::ErrorInfo(0);
    
      if(DaqBoard != nullptr) // (2)
      {	
    /* ... */
          if((definition/100*(100-deflection)) <= DataValue <= (DataValue/100*(100+definition))) // (3)
    

    (1) Warum nicht void? Du schreibst doch auch int und nicht System::Int32
    (2) Wozu? gcnew kann keine Nullreferenz zurückgeben.
    (3) Was soll das sein? Die mathematische Schreibweise A ≤ B ≤ C kann man nicht 1:1 übertragen (A <= B <= C würde zuerst A <= B auswerten, das ergibt true oder false, also 1 oder 0, und diese Zahl würde dann mit C verglichen werden). Das schreibt man so: (A <= B && B <= C)

    Achja, das ganze ist natürlich kein C++, sondern C++/CLI. Mach dich aufs Verschieben deines Beitrages gefasst.



  • Vielen Dank für die Antwort!!!
    Ehrlich gesagt war ich nur für den Funktionsaufruf zuständig.

    Stimmt, wie genau müsste jetzt die richtige Tracking Reference aussehen ?
    😕

    float% Datavalue=0;
    wohl kaum ?

    Gruß



  • ComNet1 schrieb:

    Stimmt, wie genau müsste jetzt die richtige Tracking Reference aussehen ?
    😕

    float% Datavalue=0;
    wohl kaum ?

    Die Referenz gibts doch schon, das ist der Funktionsparameter. Du musst überhaupt nichts weiter tun:

    float DataValue;
    ULState=DaqBoard->VIn(channel, MccDaq::Range::Bip10Volts , DataValue , MccDaq::VInOptions::Default);
    

    Und wie gesagt, falls das nicht funktioniert, bitte mehr Details. "Geht nicht" reicht nicht. Die Fehlermeldung und die Deklaration der Funktion bräuchte man.



  • float DataValue1=0;
    	float% DataValue=DataValue1;
    
        DaqBoard = gcnew MccDaq::MccBoard(0);
        ULState = gcnew MccDaq::ErrorInfo(0);
    
    	if(DaqBoard != nullptr)
    				{	
    
    					/* VIn measuaring */
    					ULState=DaqBoard->VIn(channel, MccDaq::Range::Bip10Volts , DataValue , MccDaq::VInOptions::Default);
    

    Neuer Versuch, und leider immernoch Runtime error 😞



  • Vielen Dank für die Hilfe erstmal!

    Also der Fehler kommt wie folgt (beim Debuggen) wenn das Prog. versucht die Fkt aufzurufen:

    Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in MccDaq.dll aufgetreten.

    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Mit der Fkt mein ich jetzt diese Zeile hier:

    ULState=DaqBoard->VIn(channel, MccDaq::Range::Bip10Volts , DataValue , MccDaq::VInOptions::Default);
    

    Der Fehler ist irgendwo in diesem Aufruf, das einzige was ich noch habe ist ein Aufruf von der Fkt in C# aus dem Example:

    MccDaq.ErrorInfo ULStat;
    			float DataValue;
    			int Chan;
    		    MccDaq.VInOptions Options;
    
    			tmrConvert.Stop();
    
    			//  Collect the data by calling VIn memeber function of MccBoard object
    			//   Parameters:
    			//     Chan       :the input channel number
    			//     Range      :the Range for the board.
    			//     DataValue  :the name for the value collected
    
    			Chan = int.Parse(txtNumChan.Text); //  set input channel
    		    Options = VInOptions.Default;
    
    			ULStat = DaqBoard.VIn( Chan, RangeSelected, out DataValue, Options );
    

    ftp://ftp.measurementcomputing.com/Customer/JBR/ULHelp/Function_Reference/Analog_IO_Functions_for_NET/VIn.htm

    Vielleicht hilft es ja.
    Mhh bin ziemlich ratlos.

    Gruß, vielen Dank!

    Ps. ach so der Aufruf war also soweit in Ordnung mit dem:

    float DataValue=0
    

    ---------

    (2) Wozu? gcnew kann keine Nullreferenz zurückgeben.

    Weil der Aufruf insgesamt so lauten muss laut Dll:

    private MccDaq.MccBoard DaqBoard;
    DaqBoard= new MccDaq.MccBoard(0);
    

    Meiner ist:

    MccDaq::MccBoard^ DaqBoard;
    //....
    DaqBoard = gcnew MccDaq::MccBoard(0);
    


  • ComNet schrieb:

    Also der Fehler kommt wie folgt (beim Debuggen) wenn das Prog. versucht die Fkt aufzurufen:

    Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in MccDaq.dll aufgetreten.

    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Das liegt dann aber zumindest nicht an dem out-Parameter. Die anderen Parameter können es auch nicht sein, das sind alles Werttypen.

    Ps. ach so der Aufruf war also soweit in Ordnung mit dem:

    float DataValue=0
    

    Ja.

    ---------

    (2) Wozu? gcnew kann keine Nullreferenz zurückgeben.

    Weil der Aufruf insgesamt so lauten muss laut Dll:

    private MccDaq.MccBoard DaqBoard;
    DaqBoard= new MccDaq.MccBoard(0);
    

    Meiner ist:

    MccDaq::MccBoard^ DaqBoard;
    //....
    DaqBoard = gcnew MccDaq::MccBoard(0);
    

    Das ist jetzt irgendwie keine Antwort. Ob die Variable lokal oder eine Membervariable ist hat damit nichts zu tun. Du musst nicht auf nullptr testen, wenn die Referenz an der Stelle nicht null sein kann, weil direkt davor eine Zuweisung mit einem gcnew-Ausdruck stattfindet.


Anmelden zum Antworten