array<int> mit Funktion verändern



  • Dann kommt

    error C2664: 'setone': Konvertierung des Parameters 1 von 'cli::array<Type> ^' in 'cli::array<Type> ^&' nicht möglich
            with
            [
                Type=int
            ]
    

    Die Funktion erwartet doch auch eine Adresse 😕



  • Was mache ich falsch, das ich keine Fehlermeldung bekomme?

    #include "stdafx.h"
    #include <iostream>
    
    using namespace System;
    using namespace std;
    
    void setone(array<int>^ &ia)
    	{ 
    		for(int i=0; i<10; i++)
    		{  
    			ia[i] = 1; 
    		} 
    	} 
    
    int main(array<System::String ^> ^args)
    {
    	array<int>^ iarray = gcnew array<int>(10); 
    	setone(iarray); 
    
        return 0;
    }
    


  • Interesannt fände ich die Frage welche Auswirkungen das & hat. Steht das & ja für eine unmanaged Referenz. WÄre hier nicht eventuell ein % besser ?

    Use a tracking reference to bind to an object that could possibly be on the garbage-collected heap. Use a tracking reference to a handle when binding to an object of a CLR type on the garbage-collected heap.

    It is not possible to have a native C++ reference to an object on the garbage-collected heap.



  • Danke erstmal für die Antworten.

    @Doug_HH: Das ganze ist bei mir eine Forms-Anwendung und die Funktion sowie die Variable in einer Klasse deklariert, aber das sollte doch eigentlich keinen Unterschied machen (?). Die Funktion rufe ich dann in einer Button_Click Methode auf.

    @Knuddlbaer: Das % hört sich gut an. Wenn ich alle '&' durch '%' ersetze gibt es erst mal keine Fehlermeldung, erst der Linker meldet

    error C3071: Der %-Operator kann nur auf eine Instanz einer Verweisklasse oder auf einen Werttyp angewendet werden.
    

    Der Vollständigkeit halber hier der Code der einzelnen Dateien:

    //SetOneClass.h
    
    ref class SetOneClass
    {
    public:
    	SetOneClass(void);
    
    	static void setone(array<int>^ %); 
    	static array<int> ^iarray = gcnew array<int>(10);
    };
    
    //SetOneClass.cpp
    
    #include "StdAfx.h"
    #include "SetOneClass.h"
    
    SetOneClass::SetOneClass(void)
    {
    }
    
    void SetOneClass::setone(array<int>^ %ia){
    	for(int i=0; i<10; i++){
    		ia[i] = 1;
    	}
    }
    
    //forms1.h
    //[...]
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    	SetOneClass::setone(%SetOneClass::iarray);
    

    So ergibt das in der Zeile des Funktionsaufrufes den Fehler

    error C3071: Der %-Operator kann nur auf eine Instanz einer Verweisklasse oder auf einen Werttyp angewendet werden.
    

    Ersetze ich die '%' durch '&' kommt in der Zeile des Funktionsaufrufes der Fehler

    error C2664: 'SetOneClass::setone': Konvertierung des Parameters 1 von 'cli::interior_ptr<Type>' in 'cli::array<Type> ^&' nicht möglich
            with
            [
                Type=cli::array<int> ^
            ]
            and
            [
                Type=int
            ]
    

    Und wenn ich beim Funktionsaufruf das '&' weglasse kommt in der Zeile des Funktionsaufrufes

    error C2664: 'SetOneClass::setone': Konvertierung des Parameters 1 von 'cli::array<Type> ^' in 'cli::array<Type> ^&' nicht möglich
    


  • ....

    Mal abgesehen davon das es ein Compilerfehler ist (C -> Compiler) :

    SetOneClass::setone(%SetOneClass::iarray);
    

    hat der Compiler vollkommen recht.



  • Ok, schön für den Compiler 🙄
    Kannst du mir auch die Lösung des Problems sagen?



  • Ähm. Übersehe ich hier etwas oder wäre das ganze nicht so viel einfacher:

    void setone(array<int>^ ia){
        for(int i=0; i<10; i++){
            ia[i] = 1;
        }
    }
    
    //...
    
    array<int> ^iarray = gcnew array<int>(10);
    setone(iarray);
    


  • Wow, so einfach ist es manchmal 🙂
    Einfach alle '&' und '%' weglassen.
    Vielen Dank an alle!



  • @LordJaxom

    Nö, das klappt so schon. Wenn Du halt ^% angibst, geht sowas nicht mehr:

    setone(nullptr);

    Dazu lies sich noch finden:

    http://mac.defx.de/category/code/cppcli/



  • Knuddlbaer schrieb:

    Nö, das klappt so schon.

    Das ist mir klar. Ich kann ja in plain C++ auch Referenzen auf Zeiger oder Zeiger auf Zeiger übergeben, muss es aber (meistens) nicht 😉

    Damit die Übergabe von non-lvalues zu unterbinden ist allerdings ein netter Trick. Wie macht man aber dem Benutzer deutlich, dass die Referenz nicht verbogen wird? Es ist immerhin ein "ref" Parameter, der garnicht "ref" sein müsste. Const gibt es in dem Zusammenhang ja nicht. Denn auf der anderen Seite würde ich persönlich in C# auch nicht auf die Idee kommen, ref zu benutzen, damit kein null übergeben werden kann.

    (Komme gerade beruflich verstärkt in Kontakt mit den CLI-Erweiterungen, deshalb meine momentan gesteigerte Neugier im C++/CLI-Bereich 😉 )



  • Da kenne ich leider keinen Trick, erst recht kein Sprachmittel. Ich hab manchmal das Gefühl das es wie in den guten alten WinAPI Zeiten ist, da gabs auch kein const 🙂

    Btw: Schön das Du mit C++/CLI in verbindung kommst - ich hab viel aus dem C++ Standard vergessen. Vergleiche und diskussionen darum werden da viel Knowhow zurück holen :))))


Anmelden zum Antworten