Zeiger Problem mit Typumwandlung nach Void bei Member Funktion.



  • Hallo,

    ich habe eine Studienaufgabe, wo ich nicht recht weiter komme.

    int intlist::additem(int i) {
    ilist=realloc(ilist,count+1);
    *(ilist+count-1)=i;
    count++;
    }
    

    (Anmerkung: ilist ist wie folgt deklariert: int *ilist)

    Der Compiler liefert folgende Fehlermeldung:
    invalid conversion from `void*' to `int*'

    Fragen:
    a) Worauf könnte sich der Fehler beziehen?

    b) Wie heißt die richtige Programmzeile?

    c) Was macht die Funktion?

    **
    Als möglich Antworten habe ich bisher:**

    a)
    -> C++ erlaubt keine implizite Typ-Umwandlung von Void* nach int*.
    Man kann in C++ einen Void Zeiger keinem anderen Zeiger zuweisen. (Die ListBox "ilist" ist ja eine Void, aber mir ist nicht bewusst, dass in dem Code auch irgendwo ein Void Zeiger zugewiesen wurde.

    b) Ich vermute int *ilist ist falsch und muss irgendwas mit ^ilist werden. Ausprobieren brachte nur Misserfolge.
    Das ^ist doch ein Handle das zum Aufruf von Membervariablen genutzt wird, da das Objekt dann vom MFC verwaltet wird?

    c) Den Speicherbereich, der in der Variable ilist gespeichert ist auf den Wert count+1 vergrößern.

    ____
    Ich würde mich freuen, wenn ihr mir bei der Lösung helfen könntet. Ich bin mit meinem Latein am Ende. Schon einmal ein herzliches Dankeschön an alle Helfenden.



  • Suseplus schrieb:

    a)
    -> C++ erlaubt keine implizite Typ-Umwandlung von Void* nach int*.
    Man kann in C++ einen Void Zeiger keinem anderen Zeiger zuweisen.

    Korrekt.

    Suseplus schrieb:

    (Die ListBox "ilist" ist ja eine Void, aber mir ist nicht bewusst, dass in dem Code auch irgendwo ein Void Zeiger zugewiesen wurde.

    Ich hab' keine Ahnung was du damit meinst. Klingt für mich nach völligem Topfen. ListBox? Ist ja eine Void? WTF?

    Suseplus schrieb:

    b) Ich vermute int *ilist ist falsch und muss irgendwas mit ^ilist werden. Ausprobieren brachte nur Misserfolge.
    Das ^ist doch ein Handle das zum Aufruf von Membervariablen genutzt wird, da das Objekt dann vom MFC verwaltet wird?

    Mit ^ bist du komplett am Holzweg.
    int *ilist passt schon. Das Problem ist woanders zu hause und auch woanders zu fixen.

    Suseplus schrieb:

    c) Den Speicherbereich, der in der Variable ilist gespeichert ist auf den Wert count+1 vergrößern.

    So wie du es formulierst ist auch das gänzlich falsch. In der Variable ilist ist kein Speicherbereich gespeichert. Sondern ein Zeiger auf einen Speicherbereich. Vergrössert wird dabei auch nicht nötigerweise etwas -- realloc kann auch einen neuen Speicherbereich anlegen, die Daten rüberkopieren und den alten dann freigeben.



  • [quote="hustbaer"]

    Suseplus schrieb:

    a)

    Suseplus schrieb:

    (Die ListBox "ilist" ist ja eine Void, aber mir ist nicht bewusst, dass in dem Code auch irgendwo ein Void Zeiger zugewiesen wurde.

    Ich hab' keine Ahnung was du damit meinst. Klingt für mich nach völligem Topfen. ListBox? Ist ja eine Void? WTF?

    Na wenn man eine Listbox erstellt hat man doch folgenden Code wo vorne eben Void steht und ich ging davon aus, dass dieser das Problem mit der Void Zuweisung darstellt.

    private: System::Void listBox1_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e)
    

    hustbaer schrieb:

    Mit ^ bist du komplett am Holzweg.
    int *ilist passt schon. Das Problem ist woanders zu hause und auch woanders zu fixen.

    Habe bei realloc gesehen, das dieser ein void ist, das wird wohl das Problem sein, hoffe ich. könnte ich dann:

    ilist=(int) realloc((ilist,count+1);
    

    schreiben?
    Ansonsten wird der ilist ja immer ein void zugewiesen.

    hustbaer schrieb:

    So wie du es formulierst ist auch das gänzlich falsch. In der Variable ilist ist kein Speicherbereich gespeichert. Sondern ein Zeiger auf einen Speicherbereich. Vergrössert wird dabei auch nicht nötigerweise etwas -- realloc kann auch einen neuen Speicherbereich anlegen, die Daten rüberkopieren und den alten dann freigeben.

    Und ist dies hier der Fall? Soweit ich es sehe, wird nur der Speicherplatz angepasst, um einen Speicherblock, korrekt?



  • Suseplus schrieb:

    Na wenn man eine Listbox erstellt hat man doch folgenden Code wo vorne eben Void steht und ich ging davon aus, dass dieser das Problem mit der Void Zuweisung darstellt.

    private: System::Void listBox1_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e)
    

    Tut mir leid, aber das ist so krass falsch/unsinnig/daneben dass ich nicht weiss was ich darauf noch sinnvoll antworten könnte.
    Ausser: lern bitte C++. Z.B. indem du dir ein Buch zu dem Thema reinziehst. Vorschläge für gute Bücher findest du z.B. hier: https://www.c-plusplus.net/forum/251551



  • Ich habe mehrere Bücher, Videokurse, etc., solche speziellen Probleme lassen sich aber nicht mal eben mit einem Buch lesen klären, wenn man kein Fortgeschrittener ist.

    Die richtige Antwort würde mir mehr helfen, um die Aufgabe zu verstehen. Ich weiß doch nur nicht, wo der Compiler Fehler her kommt.

    Update:
    Ich habe nun noch folgende mögliche Erklärung gefunden, womit ich mit meiner Vermutung schon nahe lag, wenns denn stimmt.

    int intlist::additem(int i) { 
    ilist=(int *) realloc(ilist,count+1); 
    *(ilist+count-1)=i; 
    count++; 
    }
    

    Ich muss wahrscheinlich (int 😉 vor realloc schreiben. Ich hatte es bisher mit int versucht.

    Weil ilist ist ja ein Zeiger und ich kann einem Zeiger ja kein Value zuweisen, sondern nur einen anderen Zeiger.



  • Suseplus schrieb:

    Ich habe mehrere Bücher, Videokurse, etc.,

    Nur haben reicht nicht, du musst das Zeug auch lesen/angucken.

    Suseplus schrieb:

    solche speziellen Probleme lassen sich aber nicht mal eben mit einem Buch lesen klären, wenn man kein Fortgeschrittener ist.

    Dir fehlen grundlegendste Grundlagen, mit Fortgeschritten hat das nichts zu tun.
    Dass du es aber mit deinem Kenntnisstand nicht schaffen wirst die Lösung auf irgend eine Frage in einem Buch nachzuschlagen ist klar.
    Deswegen musst du ein geeignetes Buch lesen. Cover to cover.

    ps: Deine erratene Lösung ist korrekt. Hilft dir aber nichts beim nächsten Problem/der nächsten Aufgabe wenn du die Grundlagen nicht kannst.



  • Deine Vermutung mit (int 😉 ist wie schon gesagt korrekt und damit die Lösung von Aufgabe b)

    Zur Aufgabe a) hast Du im ersten Post korrekt angemerkt, dass ilist als "int* ilist" deklariert ist, beziehst Dich aber im Folgenden plötzlich auf eine ListBox, die ja Void ist und zeigst uns anschließend eine Funktion listBox1_SelectedIndexChanged in C++/CLI (was eine andere Sprache als C++ ist und darüber hinaus nichts, aber auch überhaupt nichts mit MFC zu tun hat und wo das Wort "ilist" nichtmal vorkommt). Hier bitte nochmal den Kopf aufräumen, sortieren und danach erneut drüber nachdenken 😉

    Zur Aufgabe c) war Deine Antwort, dass der Speicherbereich um ein Element vergrößert wird. Begrifflich hat hustbaer hierzu angemerkt, dass es nicht "der Speicherbereich, der in ilist gespeichert ist", sondern "der Speicherbereich, auf den ilist zeigt" ist. Technisch hat hustbaer weiterhin angemerkt, dass realloc in den meisten Fällen nicht den ursprünglichen Bereich vergrößert, sondern einen neuen Bereich anfordert. Deshalb wäre als endgültige Formulierung vielleicht "ilist zeigt anschließend auf einen Speicherbereich, der um ein Element größer ist als der, auf den es zuvor gezeigt hat, wobei die ursprünglichen Daten erhalten bleiben" am besten.

    Allerdings ist das nur die Hälfte der Antwort zu c). In der Funktion passiert noch etwas.



  • Die Listbox hatte ich ins Spiel gebracht, weil ich vermutete das die ilist Funktion ein neues Element zu einer Listbox anfügt. Da bin ich wohl vom Wege abgekommen, meine Unterlagen liessen aber zunächst darauf schliessen. Andererseits muss man sich bei MFC ja nicht um den Speicher kümmern. Steht zumindest im Skript.

    c) Insgesamt fügt die Funktion ein neues Element i an die Liste. i scheint wohl eine globale Variable zu sein und dessen Wert woanders herzukommen.

    Dann die Speicherneuzuweisung.

    *(ilist+count-1)=i;
    Hier würde ich sagen, das das Value vom vorletzten ilist Element mit dem Value von i gefüllt wird.

    count++;
    Zähler um ein Element hochzählen



  • i scheint wohl eine globale Variable zu sein und dessen Wert woanders herzukommen.

    Was? i ist der Parameter der Funktion. Sonst kann man nichts darüber sagen.

    Hier würde ich sagen, das das Value vom vorletzten ilist Element mit dem Value von i gefüllt wird.

    Nein, das letzte. Da der erste Index in einem array 0 ist, ist der letzt mögliche Index (array_Größe - 1) (in deinem Fall count)



  • coder777 schrieb:

    i scheint wohl eine globale Variable zu sein und dessen Wert woanders herzukommen.

    Was? i ist der Parameter der Funktion. Sonst kann man nichts darüber sagen.

    Hier würde ich sagen, das das Value vom vorletzten ilist Element mit dem Value von i gefüllt wird.

    Nein, das letzte. Da der erste Index in einem array 0 ist, ist der letzt mögliche Index (array_Größe - 1) (in deinem Fall count)

    Doch vorletzte, habe übersehen, dass count später erhöht wird.


Anmelden zum Antworten