Closed tschoonj closed 6 years ago
Moet dit dan een functie zijn die de weight extract voor 1 bepaalde energie, of die voor alle gesimuleerde energien gewoon de weights geeft?
M.a.w. returned het een array(pointer) of returned het een double
?
Ik denk dat we best de zaken een beetje herschikken. Momenteel worden de gevraagde energies meegegeven aan polycap_photon_new
:
polycap_photon* polycap_photon_new(polycap_description *description, polycap_rng *rng, polycap_vector3 start_coords, polycap_vector3 start_direction, polycap_vector3 start_electric_vector, size_t n_energies, double *energies, polycap_error **error)
Dit is eigenlijk niet nodig aangezien ze niet echt gebruikt worden voor iets te initializeren, er wordt enkel een kopie van gemaakt.
Misschien is het beter die mee te geven aan polycap_photon_launch
, en dan onmiddellijk de weights daar uit te halen. Bijvoorbeeld:
int polycap_photon_launch(polycap_photon *photon, size_t n_energies, double *energies, double **weights, polycap_error **error)
Op deze manier is er zelfs geen behoefte aan polycap_photon_get_weights
.
Wat gebeurt er trouwens als de user twee keer polycap_photon_launch
op hetzelfde polycap_photon
oproept? Als dat niet mag gebeuren, moet er in dit geval een gepaste error gegenereerd worden.
Wat gebeurt er trouwens als de user twee keer polycap_photon_launch op hetzelfde polycap_photon oproept? Als dat niet mag gebeuren, moet er in dit geval een gepaste error gegenereerd worden.
Wat bedoel je hier precies mee? In principe kan het geen kwaad om polycap_photon_launch twee maal te launchen op exact zelfde polycap_photon. Daar de beginresultaten gelijk zijn, zullen ook eindresultaten overeen komen. Of bedoelde je in termen van memory allocation?
Het hangt vooral af van de polycap_photon
member variables: moeten er hiervan terug geinitializeerd worden in het geval polycap_photon_launch
een tweede keer wordt uitgevoerd?
Ik zie dat er in polycap_photon_new
toch een paar zaken worden geinitializeerd: blijven deze constant tijdens polycap_photon_launch
?
Hm.
Dus in polycap_photon_launch
zelf worden de photon->energies
en photon->weights
arrays geinitialiseerd (i.e. memory aan toewijzen mbv malloc).
Binnenin polycap_photon_launch
wordt ook polycap_photon_scatf
opgeroepen, die op zijn beurt photon->scatf
en photon->amu
initialiseren.
Probleem is dus dat ik niet goed weet hoeveel kwaad dat eigenlijk kan: indien memory reeds werd gealloceerd aan een pointer, in hoeverre 'verlies' je die memory wanneer je het nog iets doet? Zeer simpel gezegd: hoeveel memory verlies ik wanneer mijn programma zou zeggen:
double *weights;
weights=malloc(sizeof(double));
weights=malloc(sizeof(double));
Bijkomstig probleem is dat als bovenstaande niet mag, dat eigenlijk polycap_photon_scatf
en de andere allocs dienen te gebeuren tijdens polycap_photon_new
, waardoor we in polycap_photon_new
ook n_energies
nodig hebben, waardoor we dus evengoed alle aanpassingen van de getweight branch hadden kunnen negeren... Of zie ik het dan fout?
yep dan heb je inderdaad een memory leak ter grootte van sizeof(double)
.
Moeten die photon->energies
en photon->weights
echt blijven bestaan tot op het einde van polycap_photon_launch
? Volgens mij kan je die free
'en zodra photon->weights
is gememcpy
'ed naar *weights
Ik vermoed dat dit ook geldt voor photon->scatf
en photon->amu
.
Zie wel dat na free
'en je de pointer op NULL
zet zodat polycap_photon_free
kan checken of dat geheugen nog moet gefree
'ed worden.
oke, brainfart.
Blijkbaar zit deze polycap_photon_free
reeds in de code verwerkt op de gepaste momenten :)
Hmm nee toch? Als je momenteel twee keer polycap_photon_launch
op hetzelfde foton uitvoert krijg je toch memory leaks voor photon->weights
etc?
ja, oke, double brainfart... Kzit weer in mijn code te kijken, waar het momenteel geen probleem geeft omdat polycap_photon_launch
nooit twee keer uitgevoerd wordt voor zelfde photon.
Op zich moet photon->weights
en photon->energies
mss niet meer bestaan op einde van launch, maar wel de exit_coords
(en andere coordinaten for that matter). Dus kan niet gewoon polycap_photon_free(photon);
casten. Zal beetje specifieker te werk moeten gaan :)
Maar oke, kga mijn hoofd nog eens bij elkaar sprokkelen en die change nog doorvoeren :)
Ja zeker niet polycap_photon_free
doen!
gewone free
's op die arrays die weg mogen is meer dan voldoende. Wel erna op NULL
zetten.
This function would allow us to retrieve the weights for the energies after simulating. Necessary for XMI-MSIM.