Arraygröße aus Dateiangabe initialisieren



  • Hallo, ich bin C Neuling.

    Ich brauche einen Array, auf den ich global zugreifen kann, der aber eine dynamische größe haben muss. Also bei Programmstart soll die größe aus einer Datei gelesen werden und der Array daran angepasst werden.

    Wenn ich das ganze mit fixen größenangabe mache, funktioniert das ja. Aber nicht wennn ich als größenangabe eine variable nehme, auch nicht wenn ich die gleich deklariere und ihr einen Wert zuweise. Wieso?



  • TTP schrieb:

    Hallo, ich bin C Neuling.

    Ich brauche einen Array, auf den ich global zugreifen kann, der aber eine dynamische größe haben muss. Also bei Programmstart soll die größe aus einer Datei gelesen werden und der Array daran angepasst werden.

    Wenn ich das ganze mit fixen größenangabe mache, funktioniert das ja. Aber nicht wennn ich als größenangabe eine variable nehme, auch nicht wenn ich die gleich deklariere und ihr einen Wert zuweise. Wieso?

    Weil das Arrays nicht können, Du mußt den Speicher dynamisch verwalten. Stichworte malloc/realloc/free. Sh. FAQ, auch hier. Wenn Du alles richtig machst, kannst Du dann auch zugreifen wie auf ein Array.

    EDIT: Guckst Du hier http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c_014_000.htm#Xxx999328



  • Du musst den Speicher für das Array selbst allokieren.

    Befehl: malloc

    http://msdn.microsoft.com/en-us/library/6ewkz86d(VS.80).aspx



  • danke für die schnelle antwort, ich hab eben so n thread gesehen, ich werd ihn mir mal durchlesen 🙂



  • danke euch beiden, ich denk das hilft mir weiter, wenn ich fragen habe, meld ich mich nochmal 🙂



  • Okay, auf dem Level bin ich wohl doch noch nicht ganz....
    hab mir eure Links + http://www.c-plusplus.net/forum/viewtopic-var-t-is-206606.html angeguckt.

    mal angenommen ich hab ein struct:

    struct objekt
    {
      int nummer[5];
      char name[10];
    };
    

    wie malloc ich denn dafür speicherplatz? ich weiß doch gar nicht wieviele ich davon speichern möchte

    mache ich da

    struct objekt *objektarr;
    ptr = malloc ( sizeof(objektarr) ); 
    free (objektarr);
    

    nee bestimmt nicht... 😕

    Edit:
    Kann mir mal jemand vielleicht n Beispiel geben?



  • struct objekt *p;
    
    	p = (struct objekt*)malloc ( sizeof (struct objekt) );
    	if (p != NULL)
    	{
    		p->nummer[0] = 1;
    		p->nummer[1] = 7;
    		// usw
    	}
    	else
    	{
    		// malloc error
    	}
    	free (p);
    


  • Ronny2 schrieb:

    p->nummer[0] = 1;
    		p->nummer[1] = 7;
    

    der Teil speichert vom 1. Objekt einmal die Nummer
    und danach vom 2. Objekt oder versteh ich das falsch?

    Woher weiß ich wieviele Objekte ich speichern kann?

    EDIT: Geht das ganze auch wie bei einem Array zweidimensional?



  • Du hast es doch definiert.

    struct objekt
    {
      int nummer[5];
      char name[10];
    };
    

    Ein Int-Array mit 5 Elementen. Also kannst du alle 5 Elemente belegen:
    p->nummer[0]
    ...
    p->nummer[4]

    mfg



  • Nana

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

    Reserviert dir den Speicherplatz für genau EIN struct objekt und läßt p drauf zeigen.

    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.



  • achso, ich dachte das allokiert gleich mehrere objekte.

    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.

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

    Also ich brauch das ganze um eine zweidimensionale Lagerfläche abzubilden, deren größe in einer config-datei steht. Wie würdet ihr das am besten umsetzten? Ich weiß gerad nicht so recht weiter. Ob ich nun speicher allokiere oder n array setzte, der einfach groß genug ist, aber dafür zweidimensional ist, ist doch dann nicht so von bedeutung oder?



  • 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



  • 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. 🙄


Anmelden zum Antworten