Globale Variable



  • 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


Anmelden zum Antworten