2012-04-10 6 views
2

Programmierung in C (mit -std = C89), und in Fehler beim Versuch, ein Zeichenfolgenarray in eine Funktion zu übergeben.C Programm: Neuling versucht, 2D-String-Array in eine Funktion zu übergeben

In main(), ich habe das Array wie folgt deklariert:

#define ROWS 501 
#define COLS 101 
void my_function(char **); 
... 
char my_array[ROWS][COLS]; 
... 
my_function(my_array); 

In my_function ich das Array als deklariert haben:

void my_function(char **my_array) 
{ 
... 
} 

Ich erhalte diese Fehlermeldung:

warning: passing argument 1 of 'my_function' from incompatible pointer type, note: expected 'char **' but argument is of type 'char (*)[101]

+1

Link (http://www.eskimo.com/~scs/cclass/int/sx9a.html) sollte dir helfen. – Kunal

+0

wow, das ist eine gute Verbindung. Danke @Kunal! – ggkmath

Antwort

3

Ein zweidimensionaler Eine Reihe von Zeichen ist immer noch ein Zeichen-Array und würde einen Prototyp von char *my_array haben. Ändern Sie die Funktionsdefinition einfach so:

Beachten Sie, dass dies das Array abflachen wird. Es gibt verschiedene Techniken, um die zweidimensionale-ness des Arrays zu halten, ist eine einfache Möglichkeit, diesen Alternativen Prototyp verwenden:

void my_function(char my_array[][COLS]) 

Welches ist Ihre Array Dimensionen erhalten wird, wenn übergeben.

char **my_array bedeutet etwas völlig anderes (Zeiger auf ein Array, zum Beispiel).

+0

Danke, Wenn ich den Prototyp in main() zu 'void my_function (char *);' ändern und die Funktionsdefinition in 'void my_function (char * my_array)' ändern, bekomme ich diesen Fehler: 'warning: passing argument 30 of 'fn_call_master_v1p0' vom inkompatiblen Zeigertyp ../Project_Files/myheader.h:59: note: erwartet 'char *' aber Argument ist vom Typ 'char (*) [101]' ' – ggkmath

+0

Sehen Sie sich meinen überarbeiteten Post an. –

+0

Danke, wenn ich den Prototyp in main() zu 'void my_function (char * my_array [] [COLS]);' ändere und die Funktionsdefinition in 'void my_function (char * my_array [] [COLS])' I ändere hole diese Warnung: 'warning: übergeben Argument 1 von 'my_function' aus inkompatiblen Zeigertyp, hinweis: erwartet 'char * (*) [101]' aber Argument ist vom Typ 'char (*) [101]' ' – ggkmath

2

Sie können eine char[] Variable als char* übergeben, aber Sie können eine char[][] nicht als char** übergeben. Wenn Sie das Argument char** my_array verwenden, sagen Sie, dass *my_array den Typ 'pointer-to-char' hat. In Wirklichkeit hat es den Typ "Array-Of-Char". Sie würden ein Argument vom Typ char** verwenden, wenn Sie ein Array verwenden, das wie char* x[]; deklariert ist und jedes Element ein Zeiger auf einen dynamisch zugewiesenen Puffer ist.

Wenn Sie mit mehrdimensionalen Arrays arbeiten, müssen Sie daran denken, dass Sie nur die "innerste" Dimension des Arrays durch * ersetzen können. Wenn Sie versuchen, mehr als eine Dimension wegzuspalten, weiß der Compiler nicht, wie die Array-Arithmetik ausgeführt werden soll. Wenn Sie eine Funktion benötigen, die ein mehrdimensionales Array mit beliebigen Größen in allen Dimensionen verwendet, übergeben Sie das Array als void*, übergeben Sie die Array-Dimensionen als zusätzliche Argumente, und führen Sie dann die gesamte Array-Arithmetik manuell aus.

+0

Danke für die Kommentare @bta – ggkmath

1

Sie können mit multidimensionalen Arrays eine Funktion Signatur haben, d.h .:

my_fun(char my_array[][COLS]); 

Sie könnten einige daraus herauskommen:

A Tutorial on Pointers and Arrays in C, siehe D. h Kapitel 7.


Bearbeiten: Ich vermute, Sie versuchen, etwas zu tun, was Sie nicht brauchen.

#include <stdio.h> 

#define ROWS 501 
#define COLS 101 

char my_arr[ROWS][COLS]; 

void foo(char arr[][COLS]) 
{ 
    arr[44][23] = 'a'; 
    printf("foo_1: %p\n", (void*) arr); 
    printf("foo_2: %p\n", (void*) &arr); 
    printf("foo_3: %p\n", (void*) arr[44]); 
    printf("foo_4: %p\n", (void*) &arr[44]); 
} 

int main(void) 
{ 
    foo(my_arr); 
    printf("my_arr[%03d][%03d] is %c\n", 44, 23, my_arr[44][23]); 
    /* my_arr[44][23] is now 'a', (also here) */ 

    printf("main_1: %p\n", (void*) my_arr); 
    printf("main_2: %p\n", (void*) &my_arr); 
    printf("main_3: %p\n", (void*) my_arr[44]); 
    printf("main_4: %p\n", (void*) &my_arr[44]); 

    return 0; 
} 

Beispiel Ausgang:

foo_1: 0x804a040 <---+ 
foo_2: 0xbece91f0  | 
foo_3: 0x804b19c <--------+ 
foo_4: 0x804b19c <--------+ 
my_arr[044][023] is a | | 
main_1: 0x804a040 <----+ | 
main_2: 0x804a040 <----+ | 
main_3: 0x804b19c <---------+ 
main_4: 0x804b19c <---------+ 
+0

großes Beispiel, danke @ user120115 – ggkmath

Verwandte Themen