array<int> mit Funktion verändern
-
Hallo,
ich will in Visual C++ 2005 Express ein int-array mit einer Funktion verändern.
Mit dem Typ array<int> komme ich aber noch nicht ganz klar. Mein Code sieht so aus:void setone(array<int>^ &ia){ for(int i=0; i<10; i++){ ia[i] = 1; } } //... array<int> ^iarray = gcnew array<int>(10); setone(&iarray);
Die letzte Zeile verursacht dann den Fehler
(10) : error C2664: 'setone': Konvertierung des Parameters 1 von 'cli::interior_ptr<Type>' in 'cli::array<Type> ^&' nicht möglich
Nach etwas googlen habe ich es mit folgendem Code versucht:
void setone(array<int>^ &ia){ for(int i=0; i<10; i++){ ia[i] = 1; } } //... array<int> ^iarray = gcnew array<int>(10); pin_ptr<cli::array<int>^*> iarray_ptr = &iarray; setone(iarray_ptr);
was dann zu folgender Fehlermeldung führte:
(11) : error C2440: 'Initialisierung': 'cli::interior_ptr<Type>' kann nicht in 'cli::pin_ptr<Type>' konvertiert werden with [ Type=cli::array<int> ^ ] Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat. (12) : error C2664: 'setone': Konvertierung des Parameters 1 von 'cli::pin_ptr<Type>' in 'cli::array<Type> ^&' nicht möglich with [ Type=cli::array<int> ^* ] and [ Type=int ]
Wie macht man's richtig?
cadaei
-
Hilft Dir das so weiter?
array<int>^ iarray = gcnew array<int>(10); setone(iarray);
-
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!
-
Nö, das klappt so schon. Wenn Du halt ^% angibst, geht sowas nicht mehr:
setone(nullptr);
Dazu lies sich noch finden:
-
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 :))))