Fehler im Programmcode



  • Hallo Leute, ich weiß nicht ob ich in diesem Forum jetzt richtig bin aber ich schreibe erstmal mein Anliegen.
    Es geht um eine Aufgabe für die Prüfungsvorbereitung. Ich soll eine Funktion schreiben, welche eine Angegebene Zahl in ein vorhandenes Array an eine Stelle einfügt und die nachfolgenden Zahlen um einen Platz nach hinten schiebt.
    Ich habe auch eine solche Funktion geschrieben, jedoch haut das mit der Rückgabe nicht hin. Der Rückgabewert soll die Anzahl der Elemente des Arrays nach dem Einfügen sein. Jedoch gibt er mir in meinem Test immer 4 zurück, obwohl es 6 sein müssten. Ich schicke den Programmcode rein und hoffe auf Hilfe.

    Vielen Dank und LG

    #include <iostream>
    using namespace std;

    int insert(int feld[], int anz, int wert, int position) {
    feld[anz] = feld[anz + 1];
    for (int i = anz-1;i >= position-1;i--) {
    feld[i+1] = feld[i];
    }
    feld[position - 1] = wert;
    return(sizeof(feld));
    }
    int main() {
    int feld[] = { 7,4,8,2,0 };
    cout << insert(feld, 5, 9, 2)<<endl;
    }



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wenn du einer Funktion ein Array übergibst, zerfällt das Array immer in einen Zeiger auf das erste Element des Arrays (array to pointer decay). Und sizeof von einem Zeiger ist bei dir 4 Bytes.

    Schlechte Lösung: Du übergibst das Array per Referenz. Dann zerfällt es nicht in einen Zeiger.

    Gute Lösung: Du verabschiedest dich von dem Quatsch, den dir dein Lehrer erzählt, und fängst mit C++ an. Schau dir die C++ Container an, z.B. std::array und std::vector, std::list... (ist halt immer nur blöd, dass der Lehrer bei den Klausuren schlechtes C++ sehen will...)


  • Mod

    sizeof bezieht sich exakt auf das, was sein Argument ist. Hier, bei siezof(feld), ist feld ein int*. Ein int* ist bei dir anscheinend von der Größe 4. Es ist prinzipiell nicht möglich, die Größe eines dahinter stehendes Arrays über einen bloßen Zeiger auf dessen Anfang herauszufinden. Das musst du dir selber ausrechnen aus der übergebenen Anzahl der vorherigen Werte und der Anzahl der neuen Werte.

    Das nützt dir aber am Ende alles herzlich wenig, denn der Gesamtansatz ist völlig falsch. Arrays in C und C++ sind statische Datenstrukturen mit fester Größe. Die vergrößern sich nicht. Das heißt, du hast hier fröhlich auf ungültige Indizes hinter dem Ende des Arrays zugegriffen, was unglücklicherweise für dich (weil du es dadurch nicht bemerkt hast), zufällig doch funktioniert hat (ist aber trotzdem falsch und wird erfahrungsgemäß genau dann schiefgehen, wenn du es deinem Lehrer zeigst).

    Vermutlich ist die Aufgabe komplett anders gemeint, aber ich kann dir nicht sagen wie, da ich die Aufgabenstellung nicht kenne.

    Arrays in C++ gehen sowieso ganz anders. Für statische Arrays nimmt man std::array, das kennt auch selber seine Größe und du hättest keine sizeof-Probleme (aber natürlich könnte man trotzdem nichts hinzufügen, weil halt statisch). Für dynamische Arrays nimmst man std::vector. Das kennt natürlich auch seine Größe und kann auch selber Werte an der richtigen Stelle einfügen. Dein gesamter Code vereinfacht sich somit zu:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
    	std::vector<int> feld = { 7,4,8,2,0 }; 
    	feld.insert(feld.begin() + 2, 9);
    	cout << feld.size() << '\n';
    }
    

    https://ideone.com/G94MWo



  • Wie willst du in ein Array der Größe 5 ein sechstes Element einfügen?



  • manni66 schrieb:

    Wie willst du in ein Array der Größe 5 ein sechstes Element einfügen?

    Im Stuidum hat ein Array pauschal einfach mal 100 Elemente, auch wenn man nur 10 braucht, war bei meinem Dozenten auch so 😃



  • Erstmal Dankeschön für die schnellen Antworten. Dachte das Problem ist einfacher zu beheben, falsch gedacht. Das Problem ist, ich bin im 1. Semester und so viele Arten Arrays zu benutzen kennen wir nicht. Eher nur das Array an sich und dass man Werte drin speichern kann, deshalb läuft die Aufgabe glaub ich nicht auf Themen die über dem Stoff sind hinaus. Hab auch gemerkt dass meine Beschreibung sehr unpräzise war. Ich versuche gleich mal die genaue Aufgabe hochzuladen, vielleicht hättet ihr eine Idee wie man das Problem mit einfachen Mitteln lösen kann. Danke für die Hilfe.



  • Die Aufgabe lautet genau: Schreiben Sie bitte eine C++‐Funktion mit dem Namen insert, die einen Wert in einem  Array an einer  gegebenen Stelle einfügt und alle anderen Werte um eine  Position nach  rechts verschiebt.  Die Funktion hat 4 Eingabeparameter: das Array,
    die Anzahl der Elemente, die bisher im Array gespeichert sind,das hinzuzufügende Element, die Position, an die das neue Element eingefügt werden soll. 
     Bevor Sie die  Funktion  programmieren, sehen Sie sich bitte das  nachfolgend  angegebene 
    Beispiel dazu an.  Ausgangspunkt ist das oben links in der  Abbildung  gegebene  Feld.  Die  Funktion soll das unten links stehende Feld erzeugen.       feld

    feld  
    7  4  8  2 0  1  7 
    7  4  8  9 2  0  1  7     (nach dem insert) 
          Ergänzen Sie bitte diese C++‐Funktion.  
    Bisherige Anzahl   der Elemente im Feld 
    insert( feld,   7,   9,   3 ) 
    Wert, der   eingefügt  wird 
    Position,   an der der   Wert   eingefügt  wird 
    Rückgabewert der Funktion soll die Anzahl der Elemente im Feld (nach dem Ausführen des  insert) sein.

    Ich wäre über Tipps mit Erstsemestermethoden sehr dankbar. Liebe grüße



  • OK, wenn man das machen soll mit diesem Verständnis von Array: int array[LENGTH];
    dann geht das nur, wenn das Array hinten freien Platz hat, denn wachsen kann es nicht. Das Drumherum muss also irgendwie so aussehen:

    int main() {
    	//	Array definieren: Laenge 100, 5 Plaetze besetzt
    	int feld[100] = { 7,4,8,2,0 };
    
    	//	Funktion insert aufrufen, um die 9 an Stelle 2 einzufuegen
    	int neue_anzahl = insert(feld, 5, 9, 2);
    
    	//	alle besetzten Plaetze ausgeben
    	for (int i = 0; i < neue_anzahl; i++)
    		cout << feld[i];
    
    	return 0;
    }
    

    Ist das so etwa korrekt?

    Die Funktion insert muss blind drauf vertrauen, dass im Array Platz sein wird für eine weitere Zahl. Das ist kein besonders schöner Stil, aber wenn das für diese Aufgabe so sein soll, dann meinetwegen.



  • Das klingt auf jeden Fall plausibel, und auch danke für die Hinweise allgemein zum Array.
    Damit funktioniert es ja auf jeden Fall

    Nochmal Danke für die Hilfe und einen schönen Abend euch allen.


Anmelden zum Antworten