2009-03-19 4 views
1

ich in ein bisschen einer Geige bin, dass ich nicht weiß, warum mein Code den folgenden Fehler bringt beim Kompilieren:Fehler in einen Zeiger aus einer Funktion zurückkehrt, die auf ein Array verweist

1>..\SA.cpp(81) : error C2664: 'CFE' : cannot convert parameter 1 from 'int' to 'int []' 
1>  Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast 

im wesentlichen ich versuche:

Schritt 1: Konvertieren von einem Vektor in ein Array mit:

int* VecToArray(vector<int> Vec) 
{ 
    int ary[Vec.size()]; 

    for(int i = 0; i < Vec.size(); i++) 
     ary[i] = Vec[i]; 

    return ary; 
} 

Schritt 2: Aufruf an einer Funktion, in denen das Array ein paremeter ist, und es gibt einen Zeiger von einem neu ge nerated Array:

int* CFE(int density[]) 
{ 
    ...do stuff to generate 'double Energy[]'.... 

    return Energy; 
} 

Schritt 3: in einer dritten Funktion diesen Zeiger Mit der Summe von Energie calcualte []:

double ObjFunction (double *E_Array) 
{ 
    double SumEnergy = 0; 

    int n = 10; // Is irrelivant 

    for (int i = 0; i < n; i++) 
    { 
     SumEnergy += E_Array[i]; 
    } 

    return SumEnergy; 
} 

Um einfachere Codierung mache ich die Funktionen wie so verwendet haben, wo VectorName eine ganze Zahl Vektor:

double TotalEnergy = ObjFunction (CFE (VecToArray (VectorName))); 

ich offensichtlich falsch irgendwo die Parametertypen immer bin, obwohl ich einfach nicht, warum mich zu sehen. Könnte jemand mit einem erfahrenen Auge helfen, es zu entdecken?

+0

Welche Zeile wäre Zeile 81 von Ihrem Programm? –

+0

Was ist die Beziehung zwischen den Schritten 1, 2 und 3. Ich sehe keine? –

+0

Das wäre die TotalEnergy-Linie. Es gelang mir, das Problem zu beheben, erwies sich jedoch als ein fehlendes * in der VecToArray-Funktion im Klassenheader. Obwohl der Zeiger auf eine lokale Variable ist ein sehr guter Punkt, was mich mit einem viel größeren Problem. Wird dafür aber eine neue Frage eröffnen. – Raugnar

Antwort

4

Woher kommt Energy? Wenn es ein double[] ist, dann können Sie es nicht einfach auf int* werfen.

std::vector<int> garantiert zusammenhängend sein, wenn Sie also ein std::vector<int> VectorName zu einer const int* Verwendung &VectorName[0] konvertieren möchten.Wenn Ihre CFE-Funktion dagegen das Array ändert, ist es wahrscheinlich besser, es lokal zu erstellen.

3

Nicht sicher über den Compiler-Fehler, aber Sie werden große Probleme haben, wenn Sie ein lokales Array von einer Funktion zurückgeben.

+0

Sollte CFE auch ein int oder ein double zurückgeben? –

2

Schritt 1 hat mehrere Probleme:

  • Sie versuchen, ein Array mit variabler Größe zu erstellen. Sie können dies nicht in C89 oder C++ tun (ich denke, C99 fügt das hinzu).
  • Sie geben einen Zeiger auf eine lokale Variable zurück, die den Gültigkeitsbereich überschritten hat.
2

Sie sollten dieses Problem beheben:

int ary[Vec.size()]; 

An:

int *ary = new int(Vec.size()); 

Compiler nicht weiß, Vec.size() zum Zeitpunkt der Kompilierung, so kann es nicht ein Array erstellen.

Stellen Sie sicher, dass Sie den Speicher später freigeben.

Das ist das Problem zu beheben. Aber ich denke, Ihre Vorgehensweise ist auch nicht gut. Vector hat fast die gleiche Leistung wie ein normales Array, ist aber viel sicherer und einfacher zu benutzen. Warum benutzt du nicht einfach Vektoren?

Auch wenn Sie sich für die Verwendung von Arrays entscheiden, ist die Wertübergabe nicht sehr effizient. Zumal Sie die Ausgabe sofort auf eine andere Funktion umleiten. Ich würde lieber Referenzen für diese Art von Problem verwenden.

+0

Hängt vom Compiler ab. Es ist gültig C++ 0x und ich glaube, GCC unterstützt es bereits. – Ferruccio

+1

Es ist nicht gültig C++ 0x. Es ist gültig C99. –

+0

Nemanja hat Recht. Es gibt etwas, das ähnlich aussieht, wenn Sie eine constexpr-Funktion haben, können Sie damit ein Array erstellen - aber vector :: size ist keine constexpr-Funktion. –

1

Sie können kein Array mit einer dynamisch bewerteten Größe erstellen. Sie können ein lokal definiertes Array nicht zurückgeben. Sie können jedoch & myVector [0] als Array betrachten.

Verwandte Themen