int ** und int (*)[] synonym verwenden
-
Hallo,
als C-Wiedereinsteiger beschäftigt mich das Problem, wie ich eine Funktion schreiben kann, die ((x+i)+j) verwendet, wobei i,j counter sind und x entweder mit int **x oder mit int (*x)[] deklariert wurde, aber int auch unsigned, long, short sein darf. Nachfolgend ein Beispiel. In der Funktion "shownum" möchte ich eigentlich nicht vorgeben, ob die variablen "a" oder "b" int ** bzw. int (*)[] sein sollen, da ich beide mit den gleichen Operationen anspreche. Ziel ist, nur ein Argument zu übergeben. Die Dimension von *b soll auch variabel und nicht auf 3 festgelegt sein. Und zuletzt sollen mit **a, **b alle Integer-Varianten übergeben werden dürfen, ohne dass ich mich bei der Funktionsdeklaration festlegen möchte.
Geht das überhaupt? Kann mir jemand einen Tip geben?
Danke! Thomas
#include <stdio.h> #include <stdlib.h> void shownum(int **a, int (*b)[3]) { int i,j; for(i=0; i<2; i++) { for(j=0; j<3; j++) { printf("%i ", (int) *(*(a+i)+j) ); printf("%i ", (int) *(*(b+i)+j) ); } } } int main() { int *x[2], u[2][3], i, j; for(i=0; i<2; i++) { x[i] = (int *) calloc(3, sizeof(int)); for(j=0; j<3; j++) { u[i][j] = (i+1)*10+j+1; x[i][j] = (i+1)*100 + (j+1)*10; } } shownum(x, u); free(x[0]); free(x[1]); return 0; }
-
((a+i)+j) kann man auch einfacher schreiben: a[i][j]
desweiteren sind zwar int** und int [] in Argumentlisten(!) der gleiche Typ und lassen sich wie oben benutzen, aber int ()[] ist "Zeiger auf Array von int", also was ganz anderes.
Hoffe das hilft erstmal.
-
Edit: hier stand Quark
-
Bashar schrieb:
((a+i)+j) kann man auch einfacher schreiben: a[i][j]
desweiteren sind zwar int** und int [] in Argumentlisten(!) der gleiche Typ und lassen sich wie oben benutzen, aber int ()[] ist "Zeiger auf Array von int", also was ganz anderes.
Hoffe das hilft erstmal.
Das sehe ich ja auch so. Bei den Argumenten der Funktion möchte ich aber, wenn das möglich ist, nicht zwischen zeiger auf zeiger auf integer und zeiger auf array von integern unterscheiden, weil der semantische Zugriff der gleiche ist. Vielleicht funktioniert es mit "union" oder "void-zeigern", nur wie?
Cheers, Thomas