Gå til innhold

Navigering av 2D array


Anbefalte innlegg

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:

 

a

b

c

d

e

f

g

h

i

 

test():

a

b

c

d

e

f

g

h

i

Lenke til kommentar
Videoannonse
Annonse

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
g++ --version

g++ (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 av daysleper
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...