Frage

Ich bin ein bisschen von einer Geige, dass ich weiß nicht, warum mein Code die folgenden Fehler bringt beim Kompilieren:

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 bis 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: die Aufforderung an einer Funktion in der die Anordnung ein paremeter ist, und es gibt einen Zeiger von einem neu erzeugten 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 natürlich bin immer die Parametertypen falsch irgendwo, aber ich kann einfach nicht, warum mich zu sehen. Könnte jemand mit einem erfahrenen Auge unterstützen Spek es / sie?

War es hilfreich?

Lösung

Wo kommt Energy kommen aus? Wenn es ein double[] ist, dann können Sie nicht nur werfen es zu einem int*.

std::vector<int> garantiert zusammenhängend sein, wenn Sie also eine std::vector<int> VectorName zu einer const int* Verwendung &VectorName[0] konvertieren möchten. Wenn auf der anderen Seite Ihre KSE-Funktion das Array modifiziert übergeben wird, ist es wahrscheinlich besser dran, es vor Ort geschaffen werden.

Andere Tipps

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

Schritt 1 hat mehrere Probleme:

  • Sie versuchen, ein Array mit variabler Größe zu erstellen. Sie können dies nicht in C89 oder C ++ (ich glaube, C99 dies fügt).
  • Sie einen Zeiger auf eine lokale Variable zurückkehrt, die außerhalb des Bereichs gegangen ist.

Sie sollten dieses Problem zu beheben:

int ary[Vec.size()];

An:

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

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

Achten Sie darauf, den Speicher frei später.

Das ist das Problem zu beheben. Aber ich denke, Ihr Ansatz auch nicht gut ist. Vector ist fast die gleiche Leistung wie regelmäßige Anordnung hat, ist aber viel sicherer und einfacher zu bedienen. Warum gehst du nicht einfach verwenden Vektoren?

Auch wenn Sie sich entscheiden, Arrays zu verwenden, so dass sie von Wert vorbei ist nicht sehr effizient. Vor allem, da leiten Sie die Ausgabe sofort an eine andere Funktion. Ich würde lieber Referenzen für diese Art von Problem verwenden.

Sie können nicht ein Array mit einer dynamisch ausgewertet Größe erstellen. Sie können keine lokal definierten Array zurück.

Sie können jedoch betrachten & myVector [0] als Array zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top