SAFEARRAY
-
Hallo
Ich hab da mal ne Frage an C++ Gemeinde,das Theme kommt aus der ATL/COM Ecke.
Hab folgendes Problem mit dem Code:STDMETHODIMP CSteffen::Calculate(Collection1 **cDaten, VARIANT *Parameter, SAFEARRAY **Ergebnis, VARIANT_BOOL
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())long StartI;
long EndI;
float *ergebniss = NULL ;
CString Eintrag,Eintrag1,Eintrag2,Eintrag3;// Hier wird der Bereich ausgelesen das funktioniert 1a
SafeArrayGetLBound(*Ergebnis,1,&StartI);// Hier wird der Bereich ausgelesen das funktioniert 1a
SafeArrayGetUBound(*Ergebnis,1,&EndI);// Hie sollt eigentlich der Parameter(Safearray [*Ergebnis]) mit dem
// Wert 56 gefüllt werden
SafeArrayAccessData(*Ergebnis,(void**)&ergebniss);// in dem Schleifenkopf sollte eigentlich mi [StartI und EndI] die
// Obere und unterer Grenze des zu füllenden Array behandelt
// werden, hab es erst einmal bewußt nicht benutzt.for (int i = 1;i<=5;i++)
{
*ergebniss = ergebniss[i]=56;
}
SafeArrayUnaccessData( *Ergebnis );return S_OK;
}
Soviel erst einmal zum Code.Nun die Frage warum ist der Parameter[*Ergebnis] immer noch NULL? Was mus ich unternehmen um die Werte 56( die ja im Array[5][*ergebniss] enthalten sind) in den Parameter [*Ergebnis] zu übergeben.Die Funktion [Calculate]ist vorgegeben.Gruß STL
-
Wie wärs mal mit Codetags ?
STDMETHODIMP CSteffen::Calculate(Collection1 **cDaten, VARIANT *Parameter, SAFEARRAY **Ergebnis, VARIANT_BOOL *) { AFX_MANAGE_STATE(AfxGetStaticModuleState()) long StartI; long EndI; float *ergebniss = NULL ; CString Eintrag,Eintrag1,Eintrag2,Eintrag3; // Hier wird der Bereich ausgelesen das funktioniert 1a SafeArrayGetLBound(*Ergebnis,1,&StartI); // Hier wird der Bereich ausgelesen das funktioniert 1a SafeArrayGetUBound(*Ergebnis,1,&EndI); // Hie sollt eigentlich der Parameter(Safearray [*Ergebnis]) mit dem // Wert 56 gefüllt werden SafeArrayAccessData(*Ergebnis,(void**)&ergebniss); // in dem Schleifenkopf sollte eigentlich mi [StartI und EndI] die // Obere und unterer Grenze des zu füllenden Array behandelt // werden, hab es erst einmal bewußt nicht benutzt. for (int i = 1;i<=5;i++) { /*funktioniert so nicht. du weisst dem wert von ergebnis (welcher offensichtlich jedoch ein array seins soll, die speicheraddresse von diesem array an der Stelle i zu, welchen du vorher auf 56 setzt. */ *ergebniss = ergebniss[i]=56; } SafeArrayUnaccessData( *Ergebnis ); return S_OK; }
hm, vielleicht liegt es an den Parametern der Funktion. statt ** * ?
Das Float array wurde nicht initialisiert, und Parameter so ähnlich zu benennen finde
ich nicht gerade der Übersichtlichkeit zuträglich.devil
[ Dieser Beitrag wurde am 23.11.2002 um 13:33 Uhr von devil81 editiert. ]
[ Dieser Beitrag wurde am 23.11.2002 um 13:37 Uhr von devil81 editiert. ]
-
for (int i = 1;i<=5;i++) { *ergebniss = ergebniss[i]=56;// Das Array ist nicht mit New angelegt worden !! es hat keinen Index. }
Ich denke, bevor man mit COM anfängt, sollte man ein klein wenig Programmieren können!
-
Hallo devil
Du hast ja recht es ist unübersichtlich.
Benennen wirfloat *ergebniss = NULL ;
um in
float *pElements = NULL ;
Zum Thema laut Beschreibung SafeArrayAccessData :
Ein Aufruf von SafeArrayAccessData liefert einen Typenlosen void-Zeigerauf das erste Element des Feldes zurück.Aber wie nun weiter
SafeArrayAccessData(*Ergebnis,(void**)& pElements);
Wie geht es nun weiter? Ich möchte ja nur [ Ergebnis ] Werte zuweisen.
Gruß STL
-
Schau dir mal was zum Thema pointer an.
Das array mag korrekt allokiert werden von der Funktion,
aber dein Zuweis zeigt, das du davon noch keine Ahnung hast.Devil