[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
[an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]![]() |
![]() |
![]() |
|||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
![]() |
![]() |
![]() |
Hej! Jeg er i gang med et program i C, men det opfører sig underligt. Der er problemer med at modtage værdien der returneres fra en funktion, og jeg har voldsomt på fornemmelsen at der er en hukommelses-kollision mellem forskellige programdele et sted. Hvis nogen her på listen har lyst til at hjælpe med debugging (og evt. optimering) vil det være dejligt :-) (Jeg har selv kun et par ugers erfaring med C...) Programmet kan hentes på http://www.fys.ku.dk/~nvj/lvnint.tar.gz [1] En kopi af denne mail ligger i helpme.txt Strukturen er: main.c løber i løkke over rk.c rk.c løber igen i løkke over rkstep.c rkstepc.c kalder drhodt.c flere gange. Div. hjælpefiler: add18arr.c scalmult18arr.c parstruct.h main.c er en dummy der skal ændres noget, når jeg har fået skidtet til at virke. Problemet er, at når den kalder rk.c, er returværdien tilsyneladende ganske uforudsigelig: sslug@sslug lvn]$ gcc main.c -o go rk.c rkstep.c drhodt.c add18arr.c scalmult18arr.c -g -lm -I . && ./go 0.000000 3.119897e-10 0.000000 -1.668159e+09 0.100000 2.968137e-10 0.100000 1.220695e+09 0.200000 2.583010e-10 0.200000 1.553029e+09 0.300000 2.049906e-10 0.300000 -1.929401e+09 0.400000 1.447555e-10 0.400000 1.743589e+09 (flere linier fjernet) Her skulle kolonnerne 1 og 2 gerne være det samme som 3 og 4. Værdierne i kolonne 2 er de fysisk korrekte resultater, så et eller andet virker da... (De relevante printf's er i main.c: 46 og rk.c: 49 Hvis jeg f.eks. erstatter rk.c: 50 med "return 1.23456;" modtager main.c værdien 22 hver gang. Helt galt går det hvis jeg kompilerer det med optimering: sslug@sslug lvn]$ gcc -O3 main.c -o go rk.c rkstep.c drhodt.c add18arr.c scalmult18arr.c -g -lm -I . && ./go 0.000000 3.115094e-10 0.000000 2.200000e+01 0.100000 2.973507e-10 0.100000 2.200000e+01 - Her hænger programmet. Andre tests viser at løkken over rkstep modtager forkerte parametre på en eller anden måde, og derfor er uendelig. Igen må der være hukommelseskollision et sted. Jeg har af hastighedshensyn adskillige globale variable. (Og også fordi det er praktisk at rkstep kan ændre t og h direkte) Det drejer sig om: double t; double h; double tdelay_g; struct par_t params_g; Har jeg dummet mig med deklareringen e.l.? Hvor? Anvendt compiler: sslug@sslug lvn]$ gcc -v Reading specs from /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.2/specs Configured with: ../configure --prefix=/usr --libdir=/usr/lib --with-slibdir=/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --enable-long-long --enable-__cxa_atexit --enable-languages=c,c++,ada,f77,objc,java --host=i586-mandrake-linux-gnu --with-system-zlib Thread model: posix gcc version 3.2 (Mandrake Linux 9.0 3.2-1mdk) Det ville være dejligt hvis nogen kunne finde fejlen, for jeg kan ikke. Hvis der derudover er tips til optimering er de velkomne (hastighed er kritisk) I øvrigt en tak til Donald Axel for hans c-bog, ifald han læser dette. mvh Niels [1] Programmet (under GPL) laver en numerisk integration for at løse et fysik-problem. (Den anvendte algoritme er beskrevet i "Numerical recipes in C" der kan hentes fra http://www.numerical-recipes.com/nronline_switcher.html) Det vil sandsynligvis blive brugt af under 20 mennesker på verdensplan... "Mats kommer att leda utbildningar inom främst Windows NT och Windows 2000, ett kompetensområde som han arbetat inom i över tjugo år" http://www.cornerstone.se/foretaget/personal/show_teacher.asp?teacher_id=36
![]() |
![]() |
![]() |
||||||||||||
|
||||||||||||||
![]() | ||||||||||||||
|
||||||||||||||
![]() |
![]() |
![]() |