08. maj 2004 - 15:06Der er
20 kommentarer og 1 løsning
Dynamisk lagerallokering - 2dim array
Hejsa.
Jeg er stadig lidt ny i faget, så bær over med mig :)
I tidligere kode før følgende er brugeren blevet kørt igennem en række spørgsmål med mere. Dette har resulteret i udfyldelse af følgende struct: struct playerinfo { char name_str[4]; int m; int n; int p; };
Som er blevet type defineret som: typedef struct playerinfo playerinfo;
I den funktion jeg står i nu har jeg brug for at allokere lager til et 2 dimensionelt array. Her er jeg meget usikker på hvoledes disse fungere, men jeg er kommet frem til foelgende: storage = malloc((player.p+1)*(player.n+2)*sizeof(int));
storage er sat som int = *storage; Det virker umiddelbart ok med henblik på det jeg skal bruge det til, men her kommer spørgsmålene:
1) Hvordan navigerer jeg bedst rundt i dette array? Ex. ved at pointe mig frem *(storage + 0 + 0) for at vælge øverste højre hjørne hvis man ser array'et som en tabel?
2) Hvordan nulstiller jeg mest effektivt hele array'et? Havde engang hørt om en smart lille funktion til dette, kan ikke huske den...
3) Hvordan laver jeg et output som følgende? Hvis p = 5 og n = 3. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Altså p til højre og n nedaf.
Jeg siger mange gange tak på forhånd i så fald folk kan hjælpe mig. Syntes ligesom jeg pludselig rendte ind i en mur af ting jeg ikke forstod og kendte til. Hvis folk har links til hvor jeg kan læse om ovenstående er disse og meget velkomne.
3) yes, også i den stil jeg endte... kunne bare ikke få det til at fungere korrekt pga. den åbenbart, som du pointerede, så det som 2D men jeg arbejdede med det som 1D. Men den del fungerer nu, tak.
2) memset, hmmm, jeg har forsøgt at bruge den efter jeg satte variabler i tabellen til et par værdier, men det er som om den kun nulstiller 0,0. Hvis jeg f.eks. har sat et 2*2 array og sat 0,1 til 4 og 0,0 til 1. Og derefter kører memset, så sletter den kun 0,0...
1) Hmmm, okay... men det er jo egentlig et 2D array jeg har brug for når jeg skal bruge en tabel som f.eks.
Jeg testede lige dit memset igen, og når jeg kører denne just efter at sætte nogle få værdier, så nulstiller den fint alt og outputter et 0-skema. Så den er god nu.
Men, nu er der noget sært i gære.
Hvis jeg efter et memset til 0 sætter følgende i et 5*4 array:
print_new_game(); player = ask_name(player); player = ask_m(player); player = ask_n(player); player.n = player.n + 2; // ekstra col til rigtig numre og placeringer player = ask_p(player); player.p = player.p + 1; // ekstra row til facit
Sært at når jeg sætter et tal (f.eks. 7) i 3. række kolonne 1, så bliver den også sat i 2. række kolonne 5. Hmmmm, det er så tæt på det bare funker :D:D:D
Nu virker det jo... du er bare supermand... tusind takker...
Et sidste hurtige spørgsmål som du kan give et "svar" på, er det rigtig forstået at når jeg allokerer på denne måde så kan jeg kalde funktioner med hele storage som f.eks. func(*storage) og derved arbejde med en ny funktion hvor den direkte kan behandle storage of senere return *storage?
Og selvom jeg har int *storage; storage = (int *)malloc(...); func(storage);
inde i en anden funktion fungerer det stadig i andre... det er nødvendigt for mig først at allokere array i en funktion da jeg skal have brugeren til at besvare på dimensioner først...
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.