Avatar billede pede1987 Nybegynder
26. februar 2012 - 14:51 Der er 11 kommentarer og
1 løsning

Output resultater i en fil

Hej,

Jeg laver et simuleringsprogram, hvor jeg ønsker at printe nogle matricer ud for hvert tidskridt.

Hvordan laver man bedst en print funktion, som printer matricerne for de forskellige tidsskridt i en fil?

Tænker at det helst skal fungere på denne måde:

for(i=0; i<max_tidsskridt; i++)
{
...
masse udregninger
...

printToFile(filename.txt, matrix1, row, col);
printToFile(filename.txt, matrix2, row, col);
printToFile(filename.txt, matrix3, row, col);
}

hvor så filename.txt skal se sådan ud:
Tidsskridt 0:
matrix 1
matrix 2
matrix 3

Tidsskridt 1:
matrix 1
matrix 2
matrix 3

etc....


Jeg håber det er forståligt og at nogle kan hjælpe mig - vil være en stor hjælp..

På forhånd tak
Mvh
./tym
Avatar billede arne_v Ekspert
26. februar 2012 - 15:44 #1
Du skal aabne filen for append (mode "a" i fopen).

Og saa en dobbelt for loekke til at udskrive med (fprintf).
Avatar billede pede1987 Nybegynder
26. februar 2012 - 15:51 #2
arne_v: Jo den er jeg med på.
Men problemet ved f.eks. denne løsning:

void printToFile(char *str[], double *a, int n, int m)
{
    int i, j;
    FILE *infile;
    if (infile = fopen(*str, "w"))
    {
        for(j=0; j<n; j++)
        {
            for(i=0; i<m; i++)
            {
                fprintf(infile, "%.8f ", 10+a[i+j*m]);
            }
            fprintf(infile, "\n");
        }
    } else {
        printf("Error opening");   
    }
    fclose(infile);
}

er at resultatet er en fil med den sidste matrix.. Funktionen både åbner og lukker filen og få skrevet "filen over" igen og igen...

Så hvordan bør jeg lave funktionen, sådan at dette ikke sker og at jeg har en fil som indeholder alle matricerne for de forskellige tidsskridt?
Avatar billede arne_v Ekspert
26. februar 2012 - 15:59 #3
som jeg skrev "a" !

if (infile = fopen(*str, "a"))
    {
Avatar billede pede1987 Nybegynder
29. februar 2012 - 18:15 #4
Det ser ud til at virke, super. Lægger du ik et svar, så tråden kan lukkes..

Lige én ting; er der nogen performance forskel på at have nogle linjer kode i en for-løkke eller at ligge linjerne ind i en funktion som så kørers inde i for-løkken?

Det nævnes, at funktionen skal have mange parameter ind (~10)...
Avatar billede arne_v Ekspert
29. februar 2012 - 18:23 #5
svar
Avatar billede arne_v Ekspert
29. februar 2012 - 18:24 #6
Et funktionskald koster vel en 5-10 nano sekunder.

Saa hvis du laver en million funktions kald, saa koster det 0.005-0.010 sekund.

Jeg tror ikke at det er vigtigt !  :-)
Avatar billede pede1987 Nybegynder
29. februar 2012 - 18:55 #7
Så der er forskel?
Jeg kommer til at lave mange milioner, da det ikke er unormalt at for-løkken (funktion kaldes) 2 milioner gange, og dette gøres så måske ~200 gange.

Denne kode skal senere implementeres på GPU (massiv parallel), og her er jeg også lidt i tvivl hvordan CUDA reagere ved så mange funktions kald.
Avatar billede arne_v Ekspert
29. februar 2012 - 19:23 #8
200 x 2 millioner = 400 millioner
400 millioner x 10 ns = 4 sekunder

er det et problem?
Avatar billede arne_v Ekspert
29. februar 2012 - 19:25 #9
Hvis ja, saa proev og se om ikke du kan faa compileren til at inline funktionen og undgaa kald.

Saet optimize level til max.

Og hvis C++ fremfor C kan du putte inline keyword paa en metode for at fortaelle compileren at den skal indline.

Jeg aner intet om CUDA.
Avatar billede pede1987 Nybegynder
29. februar 2012 - 21:38 #10
Tak for dine svar.
Ja, tænkte jeg burde lave en ny tråd, da det var et nyt spørgsmål.

Ja, der er ikke noget "inline" i C vel. Det er lidt irriterende :-)
Avatar billede arne_v Ekspert
29. februar 2012 - 23:10 #11
Nej, men:
- derfor kan den godt inline alligevel
- C kode kan normalt compiles med en C++ compiler
Avatar billede arne_v Ekspert
29. februar 2012 - 23:12 #12
Hvis du bruger GCC saa check:

http://gcc.gnu.org/onlinedocs/gcc/Inline.html
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester