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); }
Annonceindlæg fra DE-CIX
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.
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.
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.
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.
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 ;-)
21. september 2004 - 18:25
#6
trejde løsning må være at bruge Structs....
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); }
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]
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++...
21. september 2004 - 20:40
#10
men da jeg er en odder til C... så det kan udemærket være rigtigt... :)
21. september 2004 - 20:40
#11
De to sidste er C++ Hvis det skal være ANSI C ville jeg nok lave en struct.
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.
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; }
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; }
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) { ... }
03. oktober 2004 - 15:24
#16
montago ?
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...
05. oktober 2004 - 00:14
#18
kommer her
17. oktober 2004 - 18:26
#19
så mangler du bare at acceptere svaret
Kurser inden for grundlæggende programmering