C++ Vom Dynamischen Array wird nur der erste Wert ausgegeben, ich seh den fehler nicht.

Mollfred

Cadet 3rd Year
Registriert
Mai 2013
Beiträge
43
Hallo!
Als erstes möchte ich sagen das ich neu hier im Forum bin und eben erstmal die anderen Beiträge durchsucht habe, um zu schauen ob ähnliche Probleme schon gelöst wurden. Aber ich konnte nicht wirklich was finden. Ich lern c++ zur Zeit privat und such mir aus dem Internet Aufgaben, die ich versuche zu lösen. Bei der jetzigen Aufgabe geht es darum ein Dynamischen Array zu erzeugen bei dem der Benutzer angeben kann wie viele Zahlen das Array enthalten soll und dann die Zahlen eingen kann. Danach werden die Zahlen im Array sortiert und wieder Ausgegeben. Mein Problem ist jetzt das ich denke das alles soweit funktioniert, also ich werde n mal gefragt bitte Zahl eingeben. Aber bei der Ausgabe erscheint immer nur der erste Wert. Wäre super wenn mir jemand von euch nen Tipp geben könnte....
hier mein Code:
Code:
#include <iostream>
#include "arrayOperations.h"

using namespace std;

//Aufruf der Funktion arrayOperations
void arrayOperations() 
{// Testarrays

	int oft = 0;
    int *array1= new int [oft];
   
    cout << "Wie viele Zahlen sollen Sortiert werden?";
    cin >> oft;

   // array1 = new int [oft];
    for(int i=0;i<oft;++i)
    {
        cout << "bitte Zahl " << i+1 << "." <<" in Array eingeben!\n";
        cin>>array1[i];
        if (array1[i] == 0) break;
    }  
	int array2[] = {3, 10, 9, 4, 1, 7, 8, 33, 2, 9};

	// die Array größe wird errechnet
	int arraysize1 = sizeof(array1) / sizeof(array1[0]);
	int arraysize2 = sizeof(array2) / sizeof(array2[0]);

	cout << "Test Array:" << array1<< endl;
	printArray(array1, arraysize1);
	printArray(array2, arraysize2);

	sort(&array1[0], arraysize1);
	sort(array2, arraysize2);

	if (is_sorted(array1, arraysize1)) 
	{
		printArray(array1, arraysize1);
	}
	else 
        {      //Falls Array nicht sortiert wird
		cout << "Erstes Array unsortiert!" << endl;
		 printArray (array1, arraysize1);
	}

	if (is_sorted(array2, arraysize2)) 
	{
		printArray(array2, arraysize2);
	}
	else 
	{	
		//Falls Array nicht sortiert wird
		cout << "Zweites Array ist unsortiert!" << endl;
		printArray (array2, arraysize2);
	}

	
}

Das ist noch eine älter Aufgabe die ich soweit gelöst habe und jetzt modifizieren wollte es geht erstmal nur um den Anfang und das array1
mit freundlichen Grüßen
Mollfred
Ergänzung ()

hier mein Output....das zweite Array ist ja vorgegeben aber beim array1 gibt er halt nur die erste zahl die ich ihm zuweise aus....
dynamischesarray.JPG
 
Zuletzt bearbeitet:
Du scheinst ja noch Anfänger zu sein. Da solltest du wirklich das pointer-Gefrickel und heap-allokationen erstmal beiseite lassen. Schau dir mal das vector-template an: vector

Da haste dann auch nicht das Problem, dass du den speicher wieder freigeben musst, was du z.b. garnicht tust.


Dein Problem liegt allerdings gleich in Zeile 11-14. Nochmal drüber nachdenken was du hier tust.

Übrigens: Überprüf mal was sizeof(array1) ergibt und überleg warum das so sein könnte :)
 
Zuletzt bearbeitet:
hmm der fehler in Zeile 11-14 ist wohl die Reihenfolge wie ich das geschrieben habe oder?

meinst du so würde es gehen?
Code:
int oft = 0;
	cout << "Wie viele Zahlen sollen Sortiert werden?";
    cin >> oft;
    int *array1= new int [oft];
ok das mit dem sizeof teste ich gleich mal vielen dank erstmal
Ergänzung ()

ich hab gerden mal
Code:
int arraysize1 = sizeof(array1) / sizeof(array1[0]);
	int arraysize2 = sizeof(array2) / sizeof(array2[0]);
	cout << "Sizeof Ausgabe";
	cout << sizeof(array1);
probiert und da gibt er aus Sizeof Ausgabe4......also hatte am Anfang eingeben das ich 4 Zahlen sortieren möchte
 
Dann gib mal ein, dass du 10 Zahlen eingeben möchtest. Du wirst sehen, dass dir sizeof(array1) immernoch 4 ausgibt.
Das Problem hier ist, dass er dir die Grösse einer Speicheradresse (32bit) ausgibt (also des pointers), nicht aber die tatsächliche Grösse des allokierten Speichers.
 
Ich hab folgendes geändert
Code:
int arraysize1 = sizeof(array1)+ 1;

Ich hatte ja vorher int arraysize1 = sizeof(array1) / sizeof(array[0] gerechnet was ja egal was ich eingebe immer 1 ergibt.....

ok habs mit mehreren Zahlen getestet und das geht natürlich nur mit 5.....

oha du hast recht ich muss weiter drüber nach denken....das ist ja wirklich nur die größe der Speicheradresse de Pointers... Aber wie ich die Wirkliche Größe des Arrays ausgeben kann raff ich nicht...
 
Zuletzt bearbeitet:
Mollfred schrieb:
oha du hast recht ich muss weiter drüber nach denken....das ist ja wirklich nur die größe der Speicheradresse de Pointers... Aber wie ich die Wirkliche Größe des Arrays ausgeben kann raff ich nicht...

Dass das mit array2 funktioniert liegt daran, dass array2 eben ein array ist. array1 ist allerdings nur ein pointer to int. Das sind zwei verschiedene Paar Schuhe. Als Beginner nicht unbedingt leicht zu verstehen, vorallem da z.b. arrays bei Übergabe an Funktionen zerfallen (Stichwort: array decay).

Wie du nun an die Grösse kommst? Du hast doch zu Anfang eingelesen, wieviele Zeichen du eingeben möchtest und entsprechend Platz reserviert. Den Wert hast du in der Variablen "oft" gespeichert - das ist doch genau der Wert, den du möchtest.

Übrigens solltest du noch ein delete[] array1 einfügen.
 
inter2k3 schrieb:
Wie du nun an die Grösse kommst? Du hast doch zu Anfang eingelesen, wieviele Zeichen du eingeben möchtest und entsprechend Platz reserviert. Den Wert hast du in der Variablen "oft" gespeichert - das ist doch genau der Wert, den du möchtest.

Übrigens solltest du noch ein delete[] array1 einfügen.

oh man das mit oft hatte ich vorhin getestet aber irgendeinen blöden Fehler gemacht ( Der blöde Fehler war das ich so dumm war und sizeof(oft) genommen hab und da das ja ein integer ist ist er eben auch 4 auf einem 32 bit system.....ich hab jetzt folgendes gemacht
Code:
int arraysize1 = oft;

ich schäm mich gerade bisschen :-D vielen dank für deine Hilfe....hab das jetzt mit mehreren Zahlen getesten und es funktioniert
 
Kein Problem - aller Anfang ist schwer. Viel Spass und Erfolg weiterhin.
 
achso und das delete hab ich auch eingebaut um den Speicher wieder frei zu geben....
 
Zurück
Oben