Array mit unbestimmter Größe erstellen



  • Hallo zusammen,

    habe ein kleines Problem was Array angeht bzw. ein kleiner Denkfehler.
    Die Aufgabe ist Zahlenreihen einzulesen die verschieden groß sein können. Eine vorgegebe Größe ist verboten. Leider weiß ich jetzt nicht wie ich das mit einem Array relisieren soll. Hab mein Array einfach mal den Wert 500 gegeben. Aber gelöst ist das Problem damit nicht. Aus java weiß ich das man da einfach so machen kann

    int zahlen = new int [anzahl]
    

    Wie geht das jetzt in C?

    #include <stdio.h>
    
    void main()
    { 
           int anzahl;
    
    	 printf("Bitte geben Sie die Anzahl der Ziffern an, die Sie eingeben moechten: ");
    	 scanf("%i", &anzahl);
    
    	 int Zahlen[500];		
    	 int r;
    	 int summe = 0;
    
    	 for(r = 0; r < anzahl; r++)				
    		{
    			 printf("Bitte geben Sie die Ziffernreihenfolge ein: ");
    			 scanf("%i", &zahlen[r]);
    
    			 if ((r % 2) == 0)
    			 	summe = summe + zahlen[r];
    			 else
    			      summe = summe - zahlen[r];			 	 
    		 }
    }
    

    Danke,
    Gruß Apley



  • malloc()



  • int* pArray = (int) malloc(Anzahl*sizeof(int));



  • malloc() casten und dann auch noch falsch 😞

    <info>
    In C99 gibt es auch ein Konstrukt namens VLA, mit dem man in diesem Fall durchaus dynamisch ein Array erstellen könnte:

    int Zahlen[anzahl];
    

    z.B. der gcc setzt das sogar um
    </info>



  • @Stelfer
    Thou shalt not cast the return value of malloc. Zumal dein Cast falsch ist, "richtig" müsstest du nach int* casten.

    Korrekt wäre:

    int* pArray = malloc(anzahl * sizeof(*pArray));
    


  • GPC schrieb:

    Korrekt wäre:

    int* pArray = malloc(anzahl * sizeof(*pArray));
    

    einfacher und leichter verständlich wäre:

    int* pArray = malloc(anzahl * sizeof(int));
    

    😉



  • #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
    	int *ptr;
    	double *omg;
    	int i, numbers;
    
    	printf("Wieviel Zahlen wollen sie einlesen?\n");
    	scanf("%d",&numbers);
    
    	ptr = (int*) malloc((sizeof(int))*numbers);
    	if(ptr == NULL) { /* Falls nicht genug Speicherplatz vorhanden */
    		fprintf(stderr, "Fehler: Zuwenig Speicherplatz");
    		return EXIT_FAILURE;
    	}
    	for(i = 0; i < numbers; i++)
    		scanf("%d",&ptr[i]);
    
    	for(i = 0; i < numbers; i++)
    		printf("%d\n",ptr[i]);
    
    	return EXIT_SUCCESS;
    }
    

    Bitte verbessern, falls etwas nicht stimmt.



  • das "double *omg;" gehört natürlich raus, hatte das nur zu testzwecken trinnen und vergessen wieder zu entfernen. 😞



  • onoz schrieb:

    Bitte verbessern

    du hast 'malloc' gecastet 😡



  • ten schrieb:

    GPC schrieb:

    Korrekt wäre:

    int* pArray = malloc(anzahl * sizeof(*pArray));
    

    einfacher und leichter verständlich wäre:

    int* pArray = malloc(anzahl * sizeof(int));
    

    😉

    Finde ich nicht. Dann muss man jedesmal alle mallocs ändern, wenn sich der Datentyp für pArray* ändert.



  • ten schrieb:

    onoz schrieb:

    Bitte verbessern

    du hast 'malloc' gecastet 😡

    Wie meinst du es?

    ptr = malloc((sizeof(*ptr))*numbers);

    so? Wo liegt dort der große Vorteil, im Gegensatz zum casten wie ich es gemacht habe?
    "Nur"d as man den Datentyp leichter ändern kann?



  • Mein lieber scholly, mit so vielen Antworten habe ich jetzt nicht gerechnet. 🙂 Vielen Dank an alle.

    Ich muss mich erst mal durch den ganzen malloc und sizeof - Befehl durcharbeiten. Bis jetzt kannte ich diese Befehle gar nicht. Bin ja schließlich noch ein kleiner Anfänger.

    Soweit so gut. Muss jetzt mal sehen wie ich das weiter in meiner ganzen Aufgabe weiterverwende, denn mein Bsp. war nur ein Teil davon. Wenn gut geht dann werde hier davon berichten falls nicht dann werde ich noch weiter Fragen.

    Apley



  • Apley schrieb:

    Ich muss mich erst mal durch den ganzen malloc und sizeof - Befehl durcharbeiten. Bis jetzt kannte ich diese Befehle gar nicht.

    😡
    sizeof ist ein Schlüsselwort
    malloc eine Funktion

    WTF ist ein Befehl? (in C...)

    greetz, Swordfish



  • onoz schrieb:

    ten schrieb:

    onoz schrieb:

    Bitte verbessern

    du hast 'malloc' gecastet 😡

    Wie meinst du es?

    onoz schrieb:

    ptr = *(int)**malloc((sizeof(int))*numbers);

    das (fett markierte) ist überflüssig und manchmal sogar eine fehlerquelle.

    Swordfish schrieb:

    WTF ist ein Befehl? (in C...)

    z.b. 'goto'



  • ten schrieb:

    Swordfish schrieb:

    WTF ist ein Befehl? (in C...)

    z.b. 'goto'

    Ok, 1:0 für Dich. Ich sag immer Anweisung dazu.

    greetz, Swordfish



  • Hallo zusammen,

    also ich hab den Code getestet und erweitert und er läuft einwandfrei.

    Deweiteren habe ich aber wieder ein Problem. Ich wollte es mir am Anfang leicht machen und zuerst alles in int einlesen und dann in char umwandeln. Denn es wird eigentlich das einlesen von Strings verlangt.

    Leider bekomme ich das aber nicht so richitg hin. Meine Eingabe hört hier eigenlicht gar nicht mehr auf. Weiß auch nicht so recht woran es liegt.

    int *pointer; 
        int i;
    	char numbers; 
    
        printf("Bitte geben Sie die Ziffern an: \n"); 
        scanf("%s", &numbers); 
        printf("Bitte geben Sie die Ziffernreihenfolge ein: \n ");
    
        pointer = (int*) malloc((sizeof(char))*numbers);
    .....
        scanf("%d", &pointer[i]);
    


  • Apley schrieb:

    pointer = (int)* malloc((sizeof(char))*numbers);

    😮 🙄 😡 😡 😡



  • Diagnose: Beratungsresistent(tm)

    greetz, Swordfish



  • char numbers; 
    scanf("%s", &numbers);
    

    Kann auch nix geben. Kein Speicher für nen String und man ließt Strings nicht mit & aus.



  • Beratungsresistent ist weit her geholt, eher denn Wald vor lauter Bäumen nicht sehen zu können ist was anderes. 🙂 Als ich es gemerkt hatte war es schon zu spät. Schande über mein Haupt.

    Jedoch wenn ich das gecastete int weglasse, dann funktioniert die malloc funktion bei mir nicht.

    Und um ehrlich zu sein, weiß ich jetzt nicht so recht wie ich da weiter vorgehen soll. Hätte mal lieber direkt mit den char eingabe anfangen sollen.

    Später soll die ganze aktuelle Void-main-Funktion in in eine einfach Funktion umgewandelt werden, so das ich dann aus meinem Main programm darauf zugreifen kann bzw. Werte da übergebe und daraus eine Print-ausgabe erfolgen soll.

    Es hat nicht zufällig jemand lust mal einen blick über meine ganzen Programm einen Blick zu werfen oder? 🙂

    Gruß
    Apley


Anmelden zum Antworten