Avatar billede montago Praktikant
21. september 2004 - 00:42 Der er 18 kommentarer og
1 løsning

Finde størrelse af array

hejsa... jeg har helt svedt ud, hvordan man finder et arrays størrelse...

void arr_size(int *Matrix1)
{
  yada yada funktion som skal vise hvad dimmensionerne er
}

main()
{
  int Matrix1[3][5] = {{1,2,3,4,5},{3,4,5,6,7},{5,6,7,7,8}};
  int Matrix2[4][3] = {{1,2,3},{3,3,5},{5,6,3},{7,5,2}};
  arr_sizer(Matrix1);
}
Avatar billede bertelbrander Novice
21. september 2004 - 00:53 #1
Man kan godt finde størrelsen (dvs. antallet af elementer i) på et array:

int Ar[123];
int ArSize = sizeof(Ar)/sizeof(Ar[0]);

Men man kan ikke finde størrelsen ud fra en pointer.

Så i dit tilfælde vil arr_size funktionen ikke kunne vide hvor mange elementer der er i Matrix1.
Avatar billede bertelbrander Novice
21. september 2004 - 00:57 #2
Iøvrigt er Matrix1 og Matrix2 i main() et 2d array, og dem kan man ikke umiddelbart overføre til en funktion.
Avatar billede arne_v Ekspert
21. september 2004 - 10:41 #3
Man kan umiddelbart overføre et 2D array til en funktion.

Man kan ikke umiddelbart overføre et 2D array til en funktion som forventer et 1D array.

Og man kan ikke umiddelbart overføre et 2D array hvor begge dimensioner er
variable til en funktion.
Avatar billede segmose Nybegynder
21. september 2004 - 10:45 #4
Hvis man vil kan man lave diverse tricks, lave Matrix om til 1-D arrays og pointers og tilføje 2 pladser med X,Y størrelsen forrest, tælle pointeren 2 pladser op og beregne indexet derfra, dette er den gamle C måde for de lidt videre kommende.

I C++ kan man lave nogle templates så det virker meget bedre uden udenoms snask.
(utestet/pseudo kode)
template<int dim1, int dim2>
class Matrix {
public:
  int M[dim1][dim2];
  void arr_size() {
    yada yada funktion som skal vise hvad dimmensionerne er printf dim1 dim2
  }
};

int main() {
  Matrix<3,5> Matrix1; // udfyldes

  Matrix1.arr_sizer();
}

For at bruge matrixen skal man så bruge
Matrix1.M[2,1] = xxx;
husk at ref overføre classen.
Avatar billede montago Praktikant
21. september 2004 - 18:23 #5
okay,... jeg tror faktisk jeg har fundet en nemmere løsning selv...

endten at sætte den sidste værdi af hver linie til \0

fx. arr[3][3] = {{1,2,\0} , {2,3,\0} , {5,6,\0}}
hvilket giver et array på (2,3) hvor antallet af \0 vel burde kunne tælles...

ellers finde der denne løsning som måske er lidt nemmere :

char arr1[] = "1,2,3,4,5,6";
char arr2[] = "5,6,7,8,6,4";
char *arr[2] = {*arr1,*arr2};

så hut jeg visker... skulle dette være en nemmere måde, hvorved man kan tælle ',' +1 for at få længden... og bruge sizeof til at få højden...

at man så skal lægge 48 til værdierne, som tilmed heller ikke kan være mere end 0-9 er så en anden snak ;-)
Avatar billede montago Praktikant
21. september 2004 - 18:25 #6
trejde løsning må være at bruge Structs....
Avatar billede bertelbrander Novice
21. september 2004 - 20:05 #7
Eller en vector:

#include <vector>
#include <iostream>

typedef std::vector<std::vector<int> >My2dArrayType;

void SomeFunc(My2dArrayType &Whatever)
{
  std::cout << "First dim: " << Whatever.size() << std::endl;
  std::cout << "Second dim: " << Whatever[0].size() << std::endl;

  std::cout << "First elem: " << Whatever[0][0] << std::endl;
}

int main()
{
  My2dArrayType MyVector;
  MyVector.push_back(std::vector<int>(100));
  MyVector.push_back(std::vector<int>(100));
  MyVector[0][0] = 1234;
  SomeFunc(MyVector);
}
Avatar billede bertelbrander Novice
21. september 2004 - 20:16 #8
Man kan også bruge:

My2dArrayType MyVector(100, std::vector<int>(14));

Så får man det et 2d array på [100][14]
Avatar billede montago Praktikant
21. september 2004 - 20:29 #9
jeg beklager meget... men JEG synes ikke at dine sidste to posts ligner Ansi C...

VS C++ klager over at EH.H er C++...
Avatar billede montago Praktikant
21. september 2004 - 20:40 #10
men da jeg er en odder til C... så det kan udemærket være rigtigt...

:)
Avatar billede bertelbrander Novice
21. september 2004 - 20:40 #11
De to sidste er C++
Hvis det skal være ANSI C ville jeg nok lave en struct.
Avatar billede arne_v Ekspert
21. september 2004 - 21:07 #12
Den klassiske C løsning vil være et 1D array som simulerer et 2D array og
så udregner man et index udfra de to index.

De tillader nemlig også at begge dimensioner er variable.
Avatar billede bertelbrander Novice
22. september 2004 - 00:31 #13
Et eksempel på sidste metode, hvor man laver et par hjælpe macro'er:

#include <iostream>

#define I(arr_, a_, b_, size_b_) arr_[a_*size_b_ + b_]

void SomeFunc(int *array, int SizeB)
{
#define A(i_, j_) I(array, i_, j_, SizeB)
  std::cout << A(4, 4) << std::endl;
  A(2, 5) = 231;
#undef A
}

int main()
{
  int Matrix[100*10];
  I(Matrix, 4, 4, 10) = 123;
  SomeFunc(Matrix, 10);
  std::cout << I(Matrix, 2, 5, 10) << std::endl;

}
Avatar billede arne_v Ekspert
22. september 2004 - 07:01 #14
En anden variant:

#include <stdio.h>

#define IX(r,c) (r*ncol+c)

void f(int *a, int nrow, int ncol)
{
  printf("%d\n",a[IX(4,4)]);
  a[IX(2,5)] = 321;
}

int main()
{
  int nrow = 100;
  int ncol = 10;
  int mx[ncol*nrow];
  mx[IX(4,4)] = 123;
  f(mx, nrow, ncol);
  printf("%d\n",mx[IX(2,5)]);
  return 0;
}
Avatar billede arne_v Ekspert
22. september 2004 - 07:25 #15
Men C++ er kønnere end C til det her.

Fortran har dog den elegante løsning:

      SUBROUTINE F(A,N,M)
      INTEGER A(N,M),N,M
      ...
      END

som i C ville hedde:

void f(int a[n][m],int n,int m)
{
  ...
}
Avatar billede arne_v Ekspert
03. oktober 2004 - 15:24 #16
montago ?
Avatar billede montago Praktikant
04. oktober 2004 - 18:25 #17
tja... har lidt droppet mit project... men er glad for alle inputs, da jeg senere kan bruge dem...

så hvis dem som gerne vil have point, lige sender et svar, så deler jeg dem ud...
Avatar billede arne_v Ekspert
05. oktober 2004 - 00:14 #18
kommer her
Avatar billede arne_v Ekspert
17. oktober 2004 - 18:26 #19
så mangler du bare at acceptere svaret
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