Avatar billede bumle90 Nybegynder
06. februar 2004 - 15:44 Der er 14 kommentarer og
2 løsninger

Overførsel af dobbelarray

Hej, jeg vil gerne overføre 2-dimensionelt array til en funktion. I denne funktion skal jeg så finde ud af hhv hvor mange kolonner og hvor mange rækker der er i arrayet. Hvordan gør jeg dette i C/C++ ?
Avatar billede arne_v Ekspert
06. februar 2004 - 16:47 #1
Det kan du ikke.

Du er nødt til at sende dimensionerne med.
Avatar billede arne_v Ekspert
06. februar 2004 - 16:48 #2
C/C++ sender kun adressen på det første element over.
Avatar billede bumle90 Nybegynder
06. februar 2004 - 17:13 #3
hmmm ja oki, deter rigtigt nok...det er jo bare en pointer

Møg også
Avatar billede bumle90 Nybegynder
06. februar 2004 - 17:13 #4
Hvad hvis man aver det som en struct?
Så kunne man vel i realiteten godt...
Avatar billede arne_v Ekspert
06. februar 2004 - 17:18 #5
struct sx
{
  double x[10][10];
}

ja

struct sx
{
  double *x;
}

nej

struct sx
{
  int n,m;
  double *x;
}

ja
Avatar billede bertelbrander Novice
06. februar 2004 - 20:55 #6
Man kan caste arrayet til en pointer, og selv udregne index:

#include <iostream>
#include <cstring>

int func(int *p, int a, int b)
{
  #define IDX(i_, j_) (b*i_ + j_)
  std::cout  << p[IDX(1, 2)] << std::endl;
  return 0;
}

int main(void)
{
  int a1[2][2];
  int a2[11][11];
  int a3[11][2];
  int a4[2][11];

  std::memset(a1, 0, sizeof(a1));
  std::memset(a2, 0, sizeof(a1));
  std::memset(a3, 0, sizeof(a1));
  std::memset(a4, 0, sizeof(a1));

  a1[1][2] = 12;
  a2[1][2] = 12;
  a3[1][2] = 12;
  a4[1][2] = 12;

  func((int *)a1, 2, 2);
  func((int *)a2, 11, 11);
  func((int *)a3, 11, 2);
  func((int *)a4, 2, 11);

  return 0;
}
Avatar billede emmek Nybegynder
07. februar 2004 - 14:27 #7
Giver bare lidt problemer..
"Run-Time Check Failure #2 - Stack around the variable 'a1' was corrupted."

Men derudover er det vel ikke det der søges..

Jeg ville nok vælge og mappe dit array til en struct, med to ints for hhv. kolonner og rækker. Ville også template-basere det, sådan at det virker med andre typer end double..

Alternativt kan du også opbevare dine data i 2D std::list'er i stedet..
En liste til alle rækker, og en liste til hver række.
på den måde kan du iterere dig igennem dine rækker, og endda tillade at rækkerne har forkellige længder..
Avatar billede arne_v Ekspert
07. februar 2004 - 14:31 #8
dimension 2 index 2 er en dårlig coktail
Avatar billede arne_v Ekspert
07. februar 2004 - 14:32 #9
Man kan også lave en pæn klasse i C++ !
Avatar billede bumle90 Nybegynder
07. februar 2004 - 15:20 #10
hmmm ja, umiddelbart ville jeg da tro at en struct var bedste bud :)
Med et dobbelt array. Så med 2 int der repræsenterer længde og bredde...
Så kan man jo sende structen med overalt, og vide hvor stor den er
Avatar billede arne_v Ekspert
07. februar 2004 - 15:58 #11
C/C++ sender (i modsætning til Java og C#) ikke oplysninger om array dimensioner
med over ved et kald.

En dimensionale arrays er imidlertid nemme nok at bruge i C/C++.

Men håndtering af fler dimensionale arrays i C/C++ er ikke særligt god.

Fortran er f.eks. betydeligt bedre. Selvom det heller ikke sender array information
med over.

Fortran tillader nemlig syntaxen:

      SUBROUTINE F(A,M,N)
      INTEGER*4 M,N
      REAL*8 A(M,N)
      ...
      END

som i C/C++ ville være

void f(double a[m][n], int m, int n)
{
  ...
}

men det er altså ikke valid syntax i C/C++.
Avatar billede bertelbrander Novice
07. februar 2004 - 17:15 #12
Pinligt, røder ører...

a1 burde være større, f.ex:

int a1[3][3];

og det samme for a3:

int a3[11][3];

Jeg er ikke sikker på at en struct løser problemet. Man skal stadig i struct'en definere størrelsen på array'et.
Avatar billede arne_v Ekspert
07. februar 2004 - 20:01 #13
struct sx
{
  int n,m;
  double *x;
}

og

int func(int *p, int a, int b)

er faktisk samme løsning.
Avatar billede bumle90 Nybegynder
08. februar 2004 - 13:42 #14
oki....jeg prøver med structen :)
Tak for hjælpen..arne læg et svar :)
Avatar billede arne_v Ekspert
08. februar 2004 - 13:44 #15
ok
Avatar billede arne_v Ekspert
06. marts 2004 - 15:48 #16
Lukke tid ?
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