Zeiger auf float Array an Funktion



  • Hallo Klaus,

    meinst du das so:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     int   iIndex;
     float fSize[2];
    
     iIndex = 0;
     Funktion( iIndex, fSize );
    
     Label1->Caption = FloatToStr(fSize[0]);
     Label2->Caption = FloatToStr(fSize[1]);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Funktion(int iIndex, float fSize[])
    {
     switch( iIndex )
      {
       case 0: fSize[0] = 21.0;
               fSize[1] = 29.7;
               break;
       case 1: fSize[0] = 29.7;
               fSize[1] = 42.0;
               break;
      // ...
      }
    }
    // Header ---------------------------------------------------------------------
    private:    // Anwender-Deklarationen
            void Funktion( int, float** );
    

    Das geht auch nicht, oder hab ich dich da falsch verstanden ?



  • WoWe schrieb:

    Das geht auch nicht, oder hab ich dich da falsch verstanden ?

    Hi,
    was bedeutet geht nicht?
    Gibt es Fehlermeldungen?

    MfG

    Alexander Sulfrian



  • Hallo Alexander,

    ja ich habe folgende Fehlermeldungen:

    [C++ Fehler] Unit1.cpp(24): E2034 Konvertierung von 'float *' nach 'float * *' nicht möglich
    [C++ Fehler] Unit1.cpp(24): E2340 Keine Übereinstimmung des Typs beim Parameter 2 ('float * *' erwartet, 'float *' erhalten)
    [C++ Fehler] Unit1.cpp(32): E2316 '_fastcall TForm1::Funktion(int,float *)' ist kein Element von 'TForm1'
    

    Ich bekomme das nicht auf die Reihe. Hast du noch einen Tip für mich ?



  • warum so kompliziert? 😉

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     int   iIndex;
     float fSize[2];
    
     iIndex = 0;
     Funktion( iIndex, fSize );
    
     Label1->Caption = FloatToStr(fSize[0]);
     Label2->Caption = FloatToStr(fSize[1]);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Funktion(int iIndex, float *fSize)
    {
     switch( iIndex )
      {
       case 0: fSize[0] = 21.0;
               fSize[1] = 29.7;
               break;
       case 1: fSize[0] = 29.7;
               fSize[1] = 42.0;
               break;
      // ...
      }
    }
    // Header ---------------------------------------------------------------------
    private:    // Anwender-Deklarationen
            void __fastcall Funktion( int, float* );
    


  • Hallo Alexander,

    ja ich habe folgende Fehlermeldungen:

    [C++ Fehler] Unit1.cpp(24): E2034 Konvertierung von 'float *' nach 'float * *' nicht möglich
    [C++ Fehler] Unit1.cpp(24): E2340 Keine Übereinstimmung des Typs beim Parameter 2 ('float * *' erwartet, 'float *' erhalten)
    [C++ Fehler] Unit1.cpp(32): E2316 '_fastcall TForm1::Funktion(int,float *)' ist kein Element von 'TForm1'
    

    Ich bekomme das nicht auf die Reihe. Hast du noch einen Tip für mich ?



  • @Killing me softly: Was ist daran so kompliziert ?



  • void __fastcall TForm1::Funktion(int iIndex, float fSize[])
    oder
    void __fastcall TForm1::Funktion(int iIndex, float *fSize)

    Beides funktioniert. Deine Fehlermeldung kommt daher, weil du vergessen hast die Übergabeparameter auch im Header zu ändern.



  • WoWe schrieb:

    [C++ Fehler] Unit1.cpp(24): E2034 Konvertierung von 'float *' nach 'float * *' nicht möglich
    [C++ Fehler] Unit1.cpp(24): E2340 Keine Übereinstimmung des Typs beim Parameter 2 ('float * *' erwartet, 'float *' erhalten)
    [C++ Fehler] Unit1.cpp(32): E2316 '_fastcall TForm1::Funktion(int,float *)' ist kein Element von 'TForm1'

    Hi,
    also so wie ich das sehen, basieren alle Fehlermeldungen auf der ersten Fehlermeldung. In dieser steht das er einen gegebenen Zeiger auf ein float nicht in einen erwartetet Zeiger auf einen Zeiger auf ein float umwandeln kann. Nun suchen wir mal wo ein float * * steht?!
    Wir überlegen uns ob im Header tatsäschlich ein float * * stehen soll...
    Eigentlich sollte im Header und in der Cpp die Parameter übereinstimmen. Du solltes also im Header aus dem float * * ein float * machen...
    Der zweite Fehler sagt nun aus, das der Parameter im Funktionsaufruf nicht mit der definierten Funktion übereinstimmt (resultiert daraus, dass die Typen nicht automatisch konvertierbar sind)
    Und der letzte Fehler sagt nochmal aus, dass der Compiler keine Funktion mit den gegebenen Parametern im Header gefunden hat. (eigentlich das gleiche wie die 2. Fehlermeldung)!

    Du siehst also, dass man die 3 Fehlermeldungen durch das Entfernen von einem * ganz leicht beseitigen kann. Man muss nur strukturiert denken! 😉

    MfG

    Alexander Sulfrian



  • Na jetzt komm doch mal einer auf den Punkt. Was muss ich denn im Header ändern das es funktioniert ?

    PS Aus dem ** im Header hab ich schon * gemacht, aber trotzdem funktioniert es nicht !!!



  • Eine funktionierende Variante (incl. Teil des Headers) hab' ich ja bereits gepostet. Und wenn du behauptest, dein Header sieht genauso aus, dann kontrollier mal, ob da nicht das __fastcall fehlt.

    Sollte es danach immer noch nicht funktionieren, dann zeig mal, was z.Z. bei dir steht (.cpp und .h).



  • Hallo,

    also i.M. sieht es so aus (funktioniert nicht):

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     int   iIndex;
     float fSize[2];
    
     iIndex = 0;
     Funktion( iIndex, fSize );
    
     Label1->Caption = FloatToStr(fSize[0]);
     Label2->Caption = FloatToStr(fSize[1]);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Funktion(int iIndex, float fSize[])
    {
     switch( iIndex )
      {
       case 0: fSize[0] = 21.0;
               fSize[1] = 29.7;
               break;
       case 1: fSize[0] = 29.7;
               fSize[1] = 42.0;
               break;
      // ...
      }
    }
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *Button1;
            TLabel *Label1;
            TLabel *Label2;
            void __fastcall Button1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
            void Funktion( int, float* );
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Fehlermeldung:

    [C++ Fehler] Unit1.cpp(32): E2356 Redeklaration von 'TForm1::Funktion(int,float *)' mit anderem Typ
    [C++ Fehler] Unit1.h(19): E2344 'TForm1::Funktion(int,float *)' bereits deklariert
    


  • Killing me softly schrieb:

    [...]Und wenn du behauptest, dein Header sieht genauso aus, dann kontrollier mal, ob da nicht das __fastcall fehlt.[...]

    Hi,
    mach doch mal das was da steht....

    MfG

    Alexander Sulfrian

    PS: Ich Copy&Paste einfach immer die erste Zeile der Funktion aus der cpp in die h und setze dann ein ; dahinter! Hat bisher immer funktioniert....



  • Killing me softly schrieb:

    ...Und wenn du behauptest, dein Header sieht genauso aus, dann kontrollier mal, ob da nicht das __fastcall fehlt.

    private:    // Anwender-Deklarationen
            void __fastcall Funktion( int, float [] );
    


  • Hey Leute,

    vielen vielen Dank! Das mit dem "__fastcall" hab ich einfach übersehen ( Asche auf mein Haupt ), ist so, sorry !!!

    Trotzdem danke das ihr mich auf die richtige Spur gebracht habt.


Anmelden zum Antworten