Globale Variable
-
Hallo Leute,
habe folgendes Problem:
Ich möchte ein 2-dimensionales Integer Array als globale Variable haben.
Jedoch soll die Größe der 2 Dimensionen erst in der main-Funktion eingelesen werden.Habe dann ein 2 Dimsionales Array
a[0][0]
vor die main-Funktion gepackt und danach in der main-Funktion 2 Werte m und n eingelesen und darauf diese der Array-Größe zugeordnet, also
a[m][n]
.
Der Compiler zeigt keinen Fehler an, jedoch wenn ich auf die Array-Elemete zugreife und diesen Zahlen zuaddiere kommt ein völlig falsches Ergebnis raus voran kann das liegen???
Hier nochmals ein kompleter Beispiel-Code
#include <stdio.h> #include <stdlib.h> int a[0][0]; int main(){ int m; int n; printf("\nBitte Hoehe eingeben: "); scanf("%i",&m); printf("\nBitte Breite eingeben: "); scanf("%i",&n); printf("%i,%i",m,n); a[m][n]; int i; int j; for (i=0; i<m; i++){ for (j=0; j<n; j++){ a [i][j] = 10; } } for (i=0;i<m;i++){ for(j=0;j<n;j++){ a[i][j] = a[i][j] + 1; } } printf("\n"); for (i=0; i<m; i++){ for (j=0; j<n; j++){ printf("a[%i][%i] = %i\n", i,j,a[i][j]); } } return 0; }
Kommentiert man jetzt das
a[0][0];
vor der main-Funktion aus und deklariet das Array erst in der main-Funktion selbst läuft alles wunderbar, jedoch so wie ich es gemacht habe nicht....
Weiss jemand Rat??
Gruß
Moke
-
a[m][n];
falsch. da fehlt ein typbezeichner. so wie es ist, ist es nur ein ausdruck/statement. du willst eine variablendefinition.
-
Was meinst du mit Typenbezeichner?
Kannst du bitte ein Beispiel dazu angeben.
-
omg, jetzt seh ich erst, was du da machst!
du kannst die laenge eines arrays nicht aendern. du kannst nur ein neues array erstellen.
wenn du mit malloc() und free() arbeiten wuerdest, waere das natuerlich anders. tust du aber nicht.a[m][n];
bewirkt GARNICHTS. es ist das gleiche wie
12345;
-
Du musst den Speicher dynamisch anfordern. zB so:
#include <stdio.h> #include <stdlib.h> int main(){ int m; int n; printf( "\nBitte Hoehe eingeben: " ); scanf( "%i", &m ); printf( "\nBitte Breite eingeben: " ); scanf( "%i", &n ); printf( "Hoehe: %03i, Breite: %03i", m, n ); int **a = ( int** ) malloc( m * sizeof( int* ) ); for( int i = 0; i < n; ++i ) { a[ i ] = ( int* ) malloc( sizeof( int ) ); } for( int i = 0; i < m; i++ ) { for ( int j = 0; j < n; j++ ) { a[ i ][ j ] = 10; } } for( int i = 0; i < m; i++ ) { for( int j = 0; j < n; j++ ) { a[ i ][ j ] += 1; } } for( int i = 0; i < m; i++ ) { for( int j = 0; j < n; j++ ) { printf( "a[ %i ][ %i ] = %i\n", i, j, a[ i ][ j ] ); } } }
Greetz, Swordfish
-
Dank euch erstmal.
Denoch habe ich dann das Problem, dass das Array nicht global ist, was ich aber bräuchte, da ich es in einigen Funktionen benutzen will.
Geht das einfach nicht so wie ich es mir vorstelle? oder könnte man das doch irgendwie hinbekommen??
Gruß
Moke
-
GAST2101 schrieb:
Denoch habe ich dann das Problem, dass das Array nicht global ist, was ich aber bräuchte, da ich es in einigen Funktionen benutzen will.
Mach einfach den Pointer "int **a" global, d.h. außerhalb von main() definieren (und ggf. die Dimensionen m und n).
Wenn Du dann das Array nicht mehr brauchst, solltest Du es mit free() wieder freigeben (entsprechend den malloc()-Aufrufen).
-
Du nimmst die Deklaratio des *int *a aus Swordfish's Lösung einfach aus
der main-Funktion heraus und fertig.
-
[quote="jox"]
GAST2101 schrieb:
(und ggf. die Dimensionen m und n)
Ohh natürlich, das hatte ich vergessen (zu lange Java)
Die Dimensionen müssen natürlich global sein damit du später
überhaupt vernünftig auf das Array zugreifen kannst.
-
Alles klar werde es mal versuchen vielen dank an alle.
Gruß
Moke
-
Der Code von Swordfish:
#include <stdio.h> #include <stdlib.h> int main(){ int m; int n; printf( "\nBitte Hoehe eingeben: " ); // wenn m = 10 scanf( "%i", &m ); // und printf( "\nBitte Breite eingeben: " ); scanf( "%i", &n ); // n = 5 printf( "Hoehe: %03i, Breite: %03i", m, n ); int **a = ( int** ) malloc( m * sizeof( int* ) ); // = 10 int* reseviert for( int i = 0; i < n; ++i ) { a[ i ] = ( int* ) malloc( sizeof( int ) ); // = 5 int reserviert } // Array-Grösse ist aber 10 * 5 = 50 int for( int i = 0; i < m; i++ ) { for ( int j = 0; j < n; j++ ) { a[ i ][ j ] = 10; // Zugriffsverletzung ! } } for( int i = 0; i < m; i++ ) { for( int j = 0; j < n; j++ ) { a[ i ][ j ] += 1; } } for( int i = 0; i < m; i++ ) { for( int j = 0; j < n; j++ ) { printf( "a[ %i ][ %i ] = %i\n", i, j, a[ i ][ j ] ); } } }
Speicher für ein 2D-Array in 'ner Schleife allokieren, ist schlecht.
#include <stdio.h> #include <stdlib.h> // global int* mn; int m; int n; int main() { printf( "\nBitte Hoehe eingeben: " ); scanf( "%i", &m ); printf( "\nBitte Breite eingeben: " ); scanf( "%i", &n ); printf( "Hoehe: %03i, Breite: %03i\n\n", m, n ); mn = ( int* ) malloc( m * n * sizeof(int) ); for ( int i = 0; i < m; i++ ) { for ( int j = 0; j < n; j++ ) { mn[i*n+j] = j; // mn[i*n+j] Diese Schreibweise für int-2D-Arrays ist hier angezeigt, } // weil die 2.Dimension beim Compilieren nicht bekannt war. } for ( int i = 0; i < m; i++ ) { for ( int j = 0; j < n; j++ ) { printf( "mn[%i][%i] = %i\n", i, j, mn[i*n+j]); } } free((void*)mn); }
-
Oh, hab' wohl m und n durcheinander gebracht.
Greetz, Swordfish