Einzelnen Beitrag anzeigen
Alt 15.09.2003, 12:20   #18
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Schutz vor Überschreiben geht bei der Programmausführung nur durch das Anlegen und Versorgen einer Kopie.

Du postest weder die Struktur(en) selbst (struct .... { } ; ) noch hältst Du Dich sonst irgendwie mit Klarheiten auf.

Schreib doch einfach:

1) main.config -> mainkopie.config bzw. kopieconfig (letzteres vermute ich eher)

2) Funktionsaufruf mit (&kopieconfig)

3) Glücklich, daß main.config erhalten geblieben ist


Variante A:

Du solltest bei so grossen (vermute ich) Strukturen, den ganzen Bereich als Übergabebereich wählen und config und workload fix als Variablenfelder (=Strukturvariablenfelder) einplanen. Nämlich insofern, daß der Bereich (also die Struktur) "main" als & (address of) "main" übergeben wird und config und workload entsprechend ihrer auszulesenden und zu verändernden Bedeutung bekannt sind.

Zu verändernde Strukturen wie workload kopierst Du dann INNERHALB der Funktion in dynamisch angeforderten Speicher.


Variante B: Das beste ist und bleibt aber folgendes:

Schreibe eine Wrapper(=Hüll)funktion, die .workload in local_workload kopiert und local_workload sowie main als Adresszeiger auf ihre Bereiche annimmt.

Also:

Funktion Wrapperfunktion(struct xy_config *pconfig, struct xy_workload *pworkload):

1) struct xy_workload local_workload; // steht am Stack, deswegen besser als dynamischer Speicher, Stichwort Garbage Collection immer wieder notwendig wegen Speicherlücken

2) kopieren *pworkload in local_workload

3) Aufruf: Arbeitsfunktion(pconfig,&local_workload);

4) *pworkload (falls so verwendet ist das main.workload) bleibt erhalten, local_workload ist vielleicht verändert, je nachdem was in der Funktion Arbeitsfunktion passiert.


Dein Aufruf lautet also dann:

Wrapperfunktion(&main.config,&main.workload);

Sollte das beste sein, was nicht nur C, sondern ein Algorithmus überhaupt "hergeben" kann.

In Zukunft rufst Du nurmehr Wrapperfunktion(...) auf anstatt Arbeitsfunktion.

Und zwar deswegen, weil workload erhalten bleiben soll.

Soll config erhalten bleiben und es besteht die Gefahr, daß die Funktion Arbeitsfunktion(...) diesen Parameterblock verändert, muss halt eine Kopie von config gemacht werden und diese lokale Kopie per Adresszeiger an die Funktion übergeben werden.

mfg
Kikakater
kikakater ist offline   Mit Zitat antworten