Avatar billede soreno Praktikant
26. april 2003 - 20:52 Der er 7 kommentarer og
2 løsninger

dynamisk allokering af multidimensionel array

Jeg vil gerne lave et array af fat som hver har plads til "bytes_per_sector". Følgende kode virker ikke:

char fat[][] = new char[bootsector.FATs][bytes_per_sector];
delete [][] fat;

Compiler fejl er:
main.cpp:58: declaration of `fat' as multidimensional array
main.cpp:58: must have bounds for all dimensions except the first
main.cpp:58: assignment (not initialization) in declaration


Hvordan allokerer man dynamisk ram til et multidimensional array (og hvordan sletter man det igen) ?
Avatar billede olennert Nybegynder
26. april 2003 - 21:08 #1
char* fat = new char[bootsector.FATs * bytes_per_sector];
for (int i = 0; i < bootsector.FATs; ++i) {
  for (int j = 0; j < bytes_per_sector; ++j) {
    // Goer noget med fat + i * bootsector.FATs + j
  }
}
delete[] fat;

NB! Jeg har ikke testet!
Avatar billede olennert Nybegynder
26. april 2003 - 21:12 #2
Nu kan jeg se det er en .cpp-fil, så har du overvejet en STL-struktur? Bare så du slipper for hukommelsesstyring selv? Du kunne lave et pair<int, int> af i og j, og så en map<pair<int, int>, char>?
Avatar billede soreno Praktikant
26. april 2003 - 21:14 #3
Vil det sige at man kun kan oprette en-dimensionelle arrays dynamisk ?

Det er bare et personligt test projekt uden dybere mening..
Version 2, hvis den bliver til noget, kunne så blive med stl datastrukturer.

:-)
Avatar billede olennert Nybegynder
26. april 2003 - 22:16 #4
Ja, som oversætteren siger til dig, så skal alle dimensioner (undtagen den første) være kendt på oversættelsestidspunktet. Både min Kernighan & Ritchie samt min Bjarne-bog er på arbejdet, så jeg kan ikke lige slå op og se hvordan du allokerer plads til den første dimension dynamisk.

Men det burde altså være muligt at lave noget i stil med

char fat[][bytes_per_sector] = // Og så er det jeg ikke har mine bøger

forudsat bytes_per_sector er konstant.
Avatar billede arne_v Ekspert
26. april 2003 - 22:29 #5
Følgende illusterer lidt af mulighederne:

#include <iostream>

using namespace std;

void init1(int *a,int n,int m)
{
  for(int i=0; i<n; i++) for(int j=0; j<m; j++) a[i*m+j]=1;
  return;
}

void show1(int *a,int n,int m)
{
  for(int i=0; i<n; i++) {
      for(int j=0; j<m; j++) cout << " " << a[i*m+j];
      cout << endl;
  }
  return;
}

void init2(int **b,int n,int m)
{
  for(int i=0; i<n; i++) for(int j=0; j<m; j++) b[i][j]=2;
  return;
}

void show2(int **b,int n,int m)
{
  for(int i=0; i<n; i++) {
      for(int j=0; j<m; j++) cout << " " << b[i][j];
      cout << endl;
  }
  return;
}

typedef int twodim[][3]; // <-------- fixed second dimension

void init3(twodim c,int n,int m)
{
  for(int i=0; i<n; i++) for(int j=0; j<m; j++) c[i][j]=3;
  return;
}

void show3(twodim c,int n,int m)
{
  for(int i=0; i<n; i++) {
      for(int j=0; j<m; j++) cout << " " << c[i][j];
      cout << endl;
  }
  return;
}


int main()
{
  int n = 2;
  int m = 3;
  int *a = new int[n*m];
  init1(a,n,m);
  show1(a,n,m);
  int **b = new (int *)[n];
  for(int i=0; i<n; i++) b[i]=new int[m];
  init2(b,n,m);
  show2(b,n,m);
  twodim *c = new twodim[2];
  init3(*c,n,m);
  show3(*c,n,m);
}
Avatar billede arne_v Ekspert
26. april 2003 - 22:32 #6
#3 er ikke særligt praktisk anvendeligt.

Så altså enten #1 (endimensionelt array med beregning af index - ligesom
olennart foreslog) eller #2 (array af arrays - som altså ikke er det
samme som et todimensionelt array, men som i nogen tilfælde kan bruges).
Avatar billede soreno Praktikant
28. april 2003 - 10:14 #7
Arne:
Løsning 2 er fin til dette formål.
Læg et svar.
Avatar billede arne_v Ekspert
28. april 2003 - 10:17 #8
svar
Avatar billede arne_v Ekspert
28. april 2003 - 10:18 #9
Jeg prøvede iøvrigt om jeg kunne compile #3 med andet end GCC - uden held
så muligvis er den ikke standard compliant.
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