2016-06-17 23 views
1

Okay, so ist hier mein Problem:Wie kann ich eine Struktur mit den Werten einer identischen Struktur innerhalb einer Funktion füllen?

1) Ich habe sagen eine Struktur definiert wie folgt aus:

/* Declare structures */ 
model_t candidate_mod, current_mod, empty_mod; 

3):

struct minos_model 
{ 
    int ifanis, ifdeck, npts, icb, cmb, noc; 
    double tref; 
    double r[MODEL_NPTS_MAX], rho[MODEL_NPTS_MAX], vpv[MODEL_NPTS_MAX],  vsv[MODEL_NPTS_MAX], 
    qk[MODEL_NPTS_MAX], qmu[MODEL_NPTS_MAX], vph[MODEL_NPTS_MAX],  vsh[MODEL_NPTS_MAX], eta[MODEL_NPTS_MAX]; 
    char model_name[MODEL_LINE_LEN]; 
}; 
typedef struct minos_model model_t; 

2) ich einige Strukturen dieser Form erklärt haben, Ich übergebe sie dann in eine Funktion, die als etwas wie folgt deklariert ist:

4) Ich rufe dann die Funktion so auf:

perturb_model(&candidate_mod, &current_mod, &empty_mod); 
// arguments passed as pointers 

Also das obige ist eine vereinfachte Version von dem, was ich getan habe. Ich versuche (on line markiert DIESE LINE in Schritt 3), um candidate_mod zu einer anderen Struktur (current_mod) zu setzen, würde ich eine Schleife verwenden, aber eins, das scheint unelegant, zwei, manchmal die Struktur, ich setze es gleich (current_mod) enthält weniger Werte (als candidate_mod) und als solches bin ich besorgt, dass die überschüssigen Werte von der ursprünglichen Struktur (candidate_mod) verbleiben würden.

Ich sollte auch erwähnen, da es vielleicht relevant ist, dass die Funktion in einer separaten c-Datei im Makefile verlinkt ist, also vielleicht gibt es eine Schwierigkeit mit globalen teilen .. aber ich denke, übergeben Sie den Zeiger als Argument sollte löse das?

Auch scheint es aus meiner Forschung, dass vielleicht die Verwendung von extern helfen könnte, obwohl ich nicht herausfinden kann, wie nach vielen Versuchen.

Wenn jemand den besten Weg erklären könnte, wäre ich sehr dankbar !! Ich weiß, wie es in meinem Hauptcode trivial ist, aber die Strukturen müssen so innerhalb der Funktion zugewiesen werden.

Prost.

+0

Ignorieren der massiven Details und Blick auf den Titel der Frage. Setzen Sie sie einfach mit 'structB = structA' gleich, solange Sie nicht nur Zeiger gleichsetzen, in diesem Fall sollte es '* structB = * structA' sein. –

Antwort

3

Drücken Sie einfach den Wert der src in dest, keine Zeiger zuweisen ... Aber Ihr echtes Bedürfnis ist nicht so klar.

*candidate_mod = *current_mod; 
+0

Also, wenn ich ein * vor was ein Zeiger (Adresse von eine Variable oder Struktur), wird es zurückgeben, um nur die Variable oder Struktur im Gegensatz zu seiner Adresse zu sein? – Alex

+0

Bedeutet das auch, dass es den Wert der Struktur in meinem Haupt ändern wird? Die Sache ist, dass ich den Wert der Struktur nicht nur lokal, sondern global ändern möchte. Wird das bei deinem Vorschlag der Fall sein? Tut mir leid, ich versuche es selbst zu lehren und komme manchmal auch zu einem Cropper. – Alex

+1

Ja '* p 'bedeutet den Wert des Objekts, auf das' p 'zeigt. Wenn Sie die Adresse des in main erstellten Objekts übergeben, ändert die Funktion den Wert des Objekts an dieser Adresse. –

1

Sie übergeben eine Adresse der Struktur. Wenn Sie candidate_mod = current_mod; sagen, vergeben Sie die Adresse current_mod zu candidate_mod, die nicht korrekt ist. Sie müssen diese Struktur mit Hilfe dieses Codes dereferenzieren

*candidate_mod = *current_mod; 
+0

Okay, großartig, wenn ich also ein * vor einen Zeiger (Adresse einer Variablen oder Struktur) setze, wird es zurückgestellt, um nur die Variable oder Struktur im Gegensatz zu seiner Adresse zu sein? – Alex

+0

Bedeutet das auch, dass es den Wert der Struktur in meinem Haupt ändern wird? Die Sache ist, dass ich den Wert der Struktur nicht nur lokal, sondern global ändern möchte. Wird das bei deinem Vorschlag der Fall sein? Tut mir leid, ich versuche es selbst zu lehren und komme manchmal auch zu einem Cropper. – Alex

+0

* bedeutet, dass Sie in eine Adresse kommen, auf die Sie verweisen, und diesen Wert verwenden. Der Name des Zeigers ist nur die Adresse des Elements, auf das Sie zeigen, und wenn Sie * vor den Namen des Zeigers setzen, verwenden Sie das, was sich tatsächlich an dem Ort befindet, auf den Sie zeigen. Und ja, wenn Sie wie ein Zeigerargument die Adresse übergeben, können Sie den Wert im Hauptwert ändern, aber wenn Sie ihn nicht als Zeiger übergeben, werden Sie keinen Wert in einen Hauptwert ändern –