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 wir

    float *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


Anmelden zum Antworten