daysleper Skrevet 11. november 2003 Del Skrevet 11. november 2003 Navigering av 2D array Har fått spm. fra en som lurer på åssen han bruker 2D array i C. Har prøvd å komme med et svar i form av koden vist under. Er dette 100% riktig...? ..riktig bruk av malloc() og free() ..? Jeg har rotet for lenge med C++ -så jeg er usikker. #include <iostream> using namespace std; void test(char*** a) { cerr << "test():" << endl; cerr << (*a)[0][0] << endl; cerr << (*a)[1][0] << endl; cerr << (*a)[2][0] << endl; cerr << (*a)[0][1] << endl; cerr << (*a)[1][1] << endl; cerr << (*a)[2][1] << endl; cerr << (*a)[0][2] << endl; cerr << (*a)[1][2] << endl; cerr << (*a)[2][2] << endl; } int main() { char** a = (char**)malloc(3); // allocate for the first dimension a[0] = (char*)malloc(3); // allocate for each of the dimension for each of the first dimensions "points" a[1] = (char*)malloc(3); // allocate for each of the dimension for each of the first dimensions "points" a[2] = (char*)malloc(3); // allocate for each of the dimension for each of the first dimensions "points" a[0][0] = 'a'; a[1][0] = 'b'; a[2][0] = 'c'; a[0][1] = 'd'; a[1][1] = 'e'; a[2][1] = 'f'; a[0][2] = 'g'; a[1][2] = 'h'; a[2][2] = 'i'; cerr << a[0][0] << endl; cerr << a[1][0] << endl; cerr << a[2][0] << endl; cerr << a[0][1] << endl; cerr << a[1][1] << endl; cerr << a[2][1] << endl; cerr << a[0][2] << endl; cerr << a[1][2] << endl; cerr << a[2][2] << endl; cerr << endl; test(&a); // deallocate memory in reverse order free(a[0]); free(a[1]); free(a[2]); free(a); return(0); } Kjøring: ab c d e f g h i test(): a b c d e f g h i Lenke til kommentar
A_N_K Skrevet 11. november 2003 Del Skrevet 11. november 2003 Når du allokerer et array av char-pointere (char **), burde du vel gjøre malloc(nPtrs*sizeof (char *))? En pointer opptar gjerne mer plass enn en char vøtt. Ellers er vel arrays av variabel lengde del av C99-standarden? Lenke til kommentar
daysleper Skrevet 11. november 2003 Forfatter Del Skrevet 11. november 2003 Det med variable arrays var nytt for meg - *googla litt* og kom opp med dette: http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html *må testes ut* Lenke til kommentar
daysleper Skrevet 11. november 2003 Forfatter Del Skrevet 11. november 2003 Stilig sak -- men sliter med å bruke dette som arumenter til funksjoner: #include <iostream> using namespace std; // void test(int x, int y, char a[x][y]) // <-- noen grunn til at dette ikke skulle fungere? ("x not declared in this scope ..etc.") void test(char a[3][3]) { cerr << "test():" << endl; cerr << a[0][0] << endl; cerr << a[1][0] << endl; cerr << a[2][0] << endl; cerr << a[0][1] << endl; cerr << a[1][1] << endl; cerr << a[2][1] << endl; cerr << a[0][2] << endl; cerr << a[1][2] << endl; cerr << a[2][2] << endl; } int main() { char a[3][3]; a[0][0] = 'a'; a[1][0] = 'b'; a[2][0] = 'c'; a[0][1] = 'd'; a[1][1] = 'e'; a[2][1] = 'f'; a[0][2] = 'g'; a[1][2] = 'h'; a[2][2] = 'i'; cerr << a[0][0] << endl; cerr << a[1][0] << endl; cerr << a[2][0] << endl; cerr << a[0][1] << endl; cerr << a[1][1] << endl; cerr << a[2][1] << endl; cerr << a[0][2] << endl; cerr << a[1][2] << endl; cerr << a[2][2] << endl; cerr << endl; //test(3, 3, a); // <-- fungerer altså ikke test(a); return(0); } Lenke til kommentar
A_N_K Skrevet 11. november 2003 Del Skrevet 11. november 2003 Hvilken kompilator? Jeg hadde ingen problemer med å kalle en funksjon med VLA, og lengdeargumenter (int tester(int len1, int len2, char data[len1][len2]) ). Lenke til kommentar
daysleper Skrevet 11. november 2003 Forfatter Del Skrevet 11. november 2003 (endret) g++ --versiong++ (GCC) 3.3.2 20031022 (Gentoo Linux 3.3.2-r2, propolice) Konverterte nå koden til "ren" C og compilerte med gcc i stedet for g++ (måtte rename filen fra .cpp til .c også btw.) og da fungerte det. Snedig, for det står skrevet at VLA fungerer under g++ også (under en extension visstok). Roter nå rundt i dokumentasjonen for g++ og ser om jeg finner noe som aktiverer en slik extension - hvis det skal være nødvendig å måtte gjøre det altså .. Endret 14. november 2003 av daysleper Lenke til kommentar
A_N_K Skrevet 11. november 2003 Del Skrevet 11. november 2003 Kan tenke meg at det må aktiveres spesielt med g++ ja, siden C99-standarden er inkompatibel med C++ (dessverre). Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå