Arraygröße aus Dateiangabe initialisieren



  • NDEBUG schrieb:

    Wenn du mehrere struct objekt als array haben möchtest dann brauchste

    p = (struct objekt*)malloc ( sizeof (struct objekt) * anzahl);
    

    Dann zeigt p auf den reservierten Speicherplatz für anzahl hinterinaderliegender struct objekt e.

    ja, aber mach den schrecklichen cast weg. in letzter zeit sieht man sowas wieder viel zu oft hier. void* kann man anderen pointern auch ohne cast zuweisen.
    🙂



  • ~fricky schrieb:

    NDEBUG schrieb:

    Wenn du mehrere struct objekt als array haben möchtest dann brauchste

    p = (struct objekt*)malloc ( sizeof (struct objekt) * anzahl);
    

    Dann zeigt p auf den reservierten Speicherplatz für anzahl hinterinaderliegender struct objekt e.

    ja, aber mach den schrecklichen cast weg. in letzter zeit sieht man sowas wieder viel zu oft hier. void* kann man anderen pointern auch ohne cast zuweisen.
    🙂

    Und den struct durch einen typedef ersetzen, bitte, das macht auch hübscher. 😉



  • pointercrash() schrieb:

    ~fricky schrieb:

    NDEBUG schrieb:

    Wenn du mehrere struct objekt als array haben möchtest dann brauchste

    p = (struct objekt*)malloc ( sizeof (struct objekt) * anzahl);
    

    Dann zeigt p auf den reservierten Speicherplatz für anzahl hinterinaderliegender struct objekt e.

    ja, aber mach den schrecklichen cast weg. in letzter zeit sieht man sowas wieder viel zu oft hier. void* kann man anderen pointern auch ohne cast zuweisen.
    🙂

    Und den struct durch einen typedef ersetzen, bitte, das macht auch hübscher. 😉

    mal bitte für NewBees, wie muss das aussehen?

    EDIT: Bahnhof "Der Zug fährt ein zwischen Gleis typedef um cast uhr"... what???



  • Ronny2 schrieb:

    Wie spreche ich denn dann die einzelnen Objekte an? Also so, das ich über die Objektstruktur darauf zugreifen kann.

    p[i] = ...

    mit 0 <= i < anzahl

    zweidimensional kann man das nicht ansprechen oder?
    das ich mit p[x][y] das ganze aufrufen kann...



  • TTP schrieb:

    mal bitte für NewBees, wie muss das aussehen?

    EDIT: Bahnhof "Der Zug fährt ein zwischen Gleis typedef um cast uhr"... what???

    Ungefähr so:

    typedef struct _objekt_
    {
      int nummer[5];
      char name[10];
    } objekt; 
    
    int foo(void)
    {
    	int anzahl = 5;
    	objekt *objekte;
    
    	objekte = malloc(anzahl * sizeof(objekt));
    	if (objekte)
    	{
    		objekte[2].nummer[5] = 7;
    		strcpy(objekte[2].name, "Meier");
    		return 0;
    	}
    	return -1;
    }
    

    Ich weiß nicht, ob's wirklich stimmt, aber sollte tun, wenn ich keinen groben Schnitzer drinhab'



  • pointercrash() schrieb:

    int foo(void)
    {
    int anzahl = 5;
    objekt *objekte;

    objekte = malloc(anzahl * sizeof(objekt));
    if (objekte)
    {
    objekte[2].nummer[5] = 7; // <-- 6tes element ?!
    strcpy(objekte[2].name, "Meier");
    return 0;
    }
    return -1;
    }[/cpp]

    nur ein kleiner 😃



  • ~fricky schrieb:

    ja, aber mach den schrecklichen cast weg. in letzter zeit sieht man sowas wieder viel zu oft hier. void* kann man anderen pointern auch ohne cast zuweisen.
    🙂

    In VS zB muss man das aber casten, sonst compiliert da nix. Möglicher weise kann man das irgendwo abstellen, aber standardmäßig meckert der Compiler dabei. 😃



  • Ronny2 schrieb:

    In VS zB muss man das aber casten, sonst compiliert da nix. Möglicher weise kann man das irgendwo abstellen, aber standardmäßig meckert der Compiler dabei. 😃

    Ich transportier grad was in den VS 2003, aber was da mit extern C durchläuft, braucht keinen Cast.

    @helferlein
    Grob genug, um Besserung zu geloben. 🙄



  • Ronny2 schrieb:

    ~fricky schrieb:

    ja, aber mach den schrecklichen cast weg. in letzter zeit sieht man sowas wieder viel zu oft hier. void* kann man anderen pointern auch ohne cast zuweisen.
    🙂

    In VS zB muss man das aber casten, sonst compiliert da nix. Möglicher weise kann man das irgendwo abstellen, aber standardmäßig meckert der Compiler dabei.

    du musst die dateien nur in .c umbenennen, dann sollte es klappen. den rückgabewert von malloc zu casten ist zwar selbst noch kein fehler, aber kann schwer auffindbare fehler begünstigen. daher besser nicht casten. überflüssig ist es sowieso.
    🙂



  • ähm zu meiner frage mit der zweidimensionalität: Das geht nicht??



  • pointercrash() schrieb:

    TTP schrieb:

    mal bitte für NewBees, wie muss das aussehen?

    EDIT: Bahnhof "Der Zug fährt ein zwischen Gleis typedef um cast uhr"... what???

    Ungefähr so:[cpp]typedef struct _objekt_
    {
    int nummer[5];
    char name[10];
    } objekt;

    int foo(void)
    {
    int anzahl = 5;
    objekt *objekte;

    objekte = malloc(anzahl * sizeof(objekt));
    if (objekte)
    {
    objekte[2].nummer[5] = 7;
    strcpy(objekte[2].name, "Meier");
    return 0;
    }
    return -1;
    }[/cpp]
    Ich weiß nicht, ob's wirklich stimmt, aber sollte tun, wenn ich keinen groben Schnitzer drinhab'

    Also das bringt bei mir den
    *Error 1 error C2440: '=' : cannot convert from 'void *' to 'objekt ' d:\eigene dateien\visual basic\c-projekt\schrott\schrott\schrott.cpp 21 schrott

    Nachtrag:

    Bei folgendem Code

    struct objekt
    { 
      int nummer[5]; 
      char name[10]; 
    }; 
    
    int main()
    {
        int anzahl = 5; 
        objekt *objekte; 
    
    	struct objekt *p; 
        p = (struct objekt*)malloc ( sizeof (struct objekt) * 8 ); 
        if (objekte) 
        { 
            objekte[2].nummer[5] = 7; 
            strcpy(objekte[2].name, "Meier"); 
            return 0; 
        } 
    	free(objekte);
    	system("PAUSE");
    	return 0;
    }
    

    Bekomm ich den Fehler:
    Run-Time Check Failure #3 - The variable 'objekte' is being used without being initialized.



  • Für ein 2-dimensionales Array, das dynamisch erzeugt werden soll, allokierst du den Speicher in zwei Schritten.
    1. Schritt: Allokiere zunächst die Zeilen
    2. Schritt: Allokiere die Spalten

    Der Free läuft dann genau andersrum:
    1. Schritt: Free die Spalten
    2. Schritt: Free die Zeilen

    #if defined(_MSC_VER)
    #define CAST(type)      (type)
    #else
    #define CAST(type)      ""
    #endif
    
    int main(void)
    {
        int **mul_table;
        int height = 20, width = 10, i, j;
    
        // alloc
        mul_table = CAST(int **)malloc(sizeof(int *) * height);
        for(i = 0; i < height; i++) {
            mul_table[i] = CAST(int *)malloc(sizeof(int) * width);
            // *(mul_table + i) = (int *)malloc(sizeof(int) * width);
        }
    
        // fill
        for(i = 0; i < height; i++) {
            for(j = 0; j < width; j++) {
                mul_table[i][j] = (i+1) * (j+1);
                //*(*(mul_table + i) + j) = (i+1) * (j+1);
            }
        }
    
        // show
        for(i = 0; i < height; i++) {
            for(j = 0; j < width; j++) {
                printf("%3d ", mul_table[i][j]);
                //printf("%3d ", *(*(mul_table + i) + j));
            }
            printf("\n");
        }
    
        // free
        for(i = 0; i < height; i++) {
            free(mul_table[i]);
            //free(*(mul_table + i));
        }
        free(mul_table);
        system("pause");
    }
    

    Wenn das bei dir zu Fehlern führt lösch, das CAST Makro.





  • NDEBUG schrieb:

    Wenn das bei dir zu Fehlern führt lösch, das CAST Makro.

    quote gesichert und eingereicht für den preis "Kreative! Interpunktion 2009".



  • Danke! Was kann ichn da gewinnen?!



  • Tim schrieb:

    Bitte lesen.
    http://www.c-plusplus.net/forum/viewtopic.php?t=206606

    hab ich doch, stand doch im 3. post oder so -.-

    @NDEBUG:
    WOW das sieht gut aus, ich bin gerad über eine andere Version im www gestolpert, die auch funktioniert:

    int main()
    {
      int *Map;
      int mWidth=10;
      int mHeight=10;
      int x,y;
      Map = (int*)malloc(sizeof(int) * (mWidth * mHeight + 2));
    
      for(x = 0; x < mWidth; x++){
        for(y = 0; y < mHeight; y++){
          *(Map+x+y)= 5;
          printf("%d\t",Map[x+y]);
        }
        printf("\n");
      }
    
    	system("PAUSE");
    	return 0;
    }
    

    Die sieht mir kürzer aus.... ich guck mir aber erstmal deine Variante an



  • NDEBUG schrieb:

    Für ein 2-dimensionales Array, das dynamisch erzeugt werden soll, allokierst du den Speicher in zwei Schritten.
    1. Schritt: Allokiere zunächst die Zeilen
    2. Schritt: Allokiere die Spalten

    warum so umständlich? malloc (zeilen*spalten*sizeof(arrayelement)) reicht doch auch.
    🙂



  • Bei der von dir gefundenen Variante ist das ein Pseudo-2d-Array. Er rechnet sich die Positionen selber aus, wo die jeweiligen Werte stehen sollen. D.h. er wird einen Fehler erhalten, wenn er z.B. map[x][y] probiert.

    EDIT:

    ~fricky schrieb:

    NDEBUG schrieb:

    Für ein 2-dimensionales Array, das dynamisch erzeugt werden soll, allokierst du den Speicher in zwei Schritten.
    1. Schritt: Allokiere zunächst die Zeilen
    2. Schritt: Allokiere die Spalten

    warum so umständlich? malloc (zeilen*spalten*sizeof(arrayelement)) reicht doch auch.
    🙂

    Zeigst du mir ein Listing wo ich auf diese Weise mit der althergebrachten array[x][y] Notation auf das Array zugreifen kann? Das dürfte dann auch bei deiner Variante zu einem Fehler führen.



  • NDEBUG schrieb:

    Für ein 2-dimensionales Array, das dynamisch erzeugt werden soll, allokierst du den Speicher in zwei Schritten.
    1. Schritt: Allokiere zunächst die Zeilen
    2. Schritt: Allokiere die Spalten

    Der Free läuft dann genau andersrum:
    1. Schritt: Free die Spalten
    2. Schritt: Free die Zeilen

    Ist doch viel zu umständlich und auch gar nicht nötig, Du kannst problemlos mein_2D_array = malloc(sizeof(int) * zeilen * spalten) anfordern, reallocen usw. Deine Spalten/Zeileneinteilung interessiert den Compiler nicht die Bohne, der multipliziert nur die Indices aus, um die Elementadresse zu finden, die Du ansprechen magst. 😉



  • NDEBUG schrieb:

    Zeigst du mir ein Listing wo ich auf diese Weise mit der althergebrachten array[x][y] Notation auf das Array zugreifen kann? Das dürfte dann auch bei deiner Variante zu einem Fehler führen.

    Ah, fricky war schneller, aber das kannst Du selber auch, probier's einfach mal aus!

    Ich war übrigens selber mal platt, daß das wirklich so geht ...


Anmelden zum Antworten