Speicherschutzverletzung!



  • Hallo, ich möchte ein Programm schreiben, das über eine Struktur Werte einlesen kann, die in einem lokal vereinbarten Feld abgelegt werden.

    Ich habe bereits einen Zeiger auf die Struktur gelegt, um später eine Liste anlegen zu können.

    Zunächst möchte ich aber einfach nur drei werte für eine Kiste einlesen, anhand dieser Werte das Volumen ausrechnen und die Eingabe wiedergeben.

    Allerdings bekomme ich immer wieder eine speicherschutzverletzung und kann anhand der Fehlermeldung nicht erkennen warum ich diese bekomme. Außerdem bekomme ich eine Warnung vom Compiler angezeigt.

    KANN MIR BITTE JEMAND HELFEN?

    ------------------------------WARNUNG-------------------------------------
    cpp(26) : warning C4700: Die nicht initialisierte lokale Variable "aKiste" wurde verwendet.
    --------------------------------------------------------------------------

    Hier das Listing mit der entsprechenden Fehlermeldung:

    -------------------------LISTING---------------------------
    #include "stdafx.h"

    using namespace System;

    struct kiste {

    Single hoehe;
    Single breite;
    Single laenge;
    Single volumen;
    Int32 kistennummer;
    kiste *next;

    };

    kiste einlesen(Int32 kistennummer) {

    kiste *aKiste;

    Console::Write("\n\nKiste: {0}", kistennummer);
    aKiste->kistennummer=kistennummer;//cpp(26)[u]

    Console::Write("Geben Sie die Höhe ein: ");
    aKiste->hoehe=Convert::ToSingle(Console::ReadLine());

    Console::Write("Geben Sie die Breite ein: ");
    aKiste->breite=Convert::ToSingle(Console::ReadLine());

    Console::Write("Geben Sie die Länge ein: ");
    aKiste->laenge=Convert::ToSingle(Console::ReadLine());

    aKiste->volumen=aKiste->hoehe*aKiste->breite*aKiste->laenge;
    Console::Write("\nVolumen: {0}", aKiste->volumen);

    return(*aKiste);

    }

    int main(array<System::String ^> ^args)
    {
    kiste lagerraum[100];

    for(Int32 schleife=0; schleife<2; schleife++)
    lagerraum[schleife]=einlesen(schleife+1);

    return 0;
    }
    --------------------------------------------------------------------------



  • Benutze bitte [cpp]-Tags (erste weisse Schaltfläche unter dem Textfeld).

    Die Warnung sagt ja genau, wo das Problem liegt...? Naja, du musst aKiste eben einen gültigen Wert zuweisen. Am besten legst du aber eine automatische Variable und keinen Zeiger an (dann musst du später aber über operator. statt operator-> zugreifen):

    kiste aKiste;
    


  • Danke für die schnelle Antwort!

    Ich habe leider keine Ahnung wovon du sprichst.

    Den Begriff cpp kenne ich nur im Zusammenhang mit Programmverwaltung, indem man Programmelemente wie Funktionen als cpp speichert.

    Falls du das meinen solltest, frage ich mich trotzdem, was das am eigentlichen Problem ändern sollte.



  • ciq schrieb:

    Danke für die schnelle Antwort!

    Ich habe leider keine Ahnung wovon du sprichst.

    Den Begriff cpp kenne ich nur im Zusammenhang mit Programmverwaltung, indem man Programmelemente wie Funktionen als cpp speichert.

    Falls du das meinen solltest, frage ich mich trotzdem, was das am eigentlichen Problem ändern sollte.

    Er meint du sollst hier im Forum die cpp-funktion für Code-Highlighting nutzen!
    Da ist unter dem TextEdit, in das du deine Antwort schreibst, ein dicker Button glaich links oben, da steht drauf "C/C++". So kann man deinen Code ordentlich lesen...

    Und die Lösung zu deinem Problem hat Nexus doch auch schon gepostet.



  • Für den Quelltext sind wohl eher die C++/CLI Tags angebracht.



  • ciq schrieb:

    Hallo, ich möchte [...] Ich habe bereits [...] Allerdings bekomme ich immer wieder eine speicherschutzverletzung und kann anhand der Fehlermeldung nicht erkennen warum ich diese bekomme. Außerdem bekomme ich eine Warnung vom Compiler angezeigt. [...]

    ------------------------------WARNUNG-------------------------------------
    cpp(26) : warning C4700: Die nicht initialisierte lokale Variable "aKiste" wurde verwendet.
    --------------------------------------------------------------------------

    Was verstehst Du an dieser Fehlermeldung nicht?

    ciq schrieb:

    Hier das Listing mit der entsprechenden Fehlermeldung:

    #include "stdafx.h"
    
    using namespace System;
    
    struct kiste {
    	
    	Single hoehe;
    	Single breite;
    	Single laenge;
    	Single volumen;
    	Int32 kistennummer;
    	kiste *next;
    
    };
    
    kiste einlesen(Int32 kistennummer) {
    
    	kiste *aKiste;
    
    	Console::Write("\n\nKiste: {0}", kistennummer);
    	aKiste->kistennummer=kistennummer;   // <--- Warnung
    
    	Console::Write("Geben Sie die Höhe ein: ");
    	aKiste->hoehe=Convert::ToSingle(Console::ReadLine());
    
    	Console::Write("Geben Sie die Breite ein: ");
    	aKiste->breite=Convert::ToSingle(Console::ReadLine());
    
    	Console::Write("Geben Sie die Länge ein: ");
    	aKiste->laenge=Convert::ToSingle(Console::ReadLine());
    
    	aKiste->volumen=aKiste->hoehe*aKiste->breite*aKiste->laenge;
    	Console::Write("\nVolumen: {0}", aKiste->volumen);
    
    	return(*aKiste);
    
    }
    
    int main(array<System::String ^> ^args)
    {
    	kiste lagerraum[100];
    
    	for(Int32 schleife=0; schleife<2; schleife++)
    	lagerraum[schleife]=einlesen(schleife+1);
    
    	return 0;
    }
    

    Falsches Forum. Willst Du C++ oder C++/CLI programmieren? Entscheide Dich. Wähle dann das richtige Forum. Bei stdafx.h, Single, I32, System::String^ wird mir ja übel. 🙄

    Was ist passiert? aKiste ist ein nicht-initialisierter Zeiger, welcher dann dereferenziert wird und damit undefiniertes Verhalten hervorruft. Peng! Was ist daran nicht zu verstehen?

    Schnapp Dir ein C++ Buch und lies das Kapitel über Zeiger durch. Als Einstieg kannst Du auch "Pointer fun with Binky" gucken. Das, was Du als "Speicherschutzverletzung" erlebt hast, ist das, was Binky zerlegt und den tollen ÄÄÄÄÄÄ!-Sound macht.

    Gruß,
    SP



  • Was ist ein Single ?

    Und warum wird dir bei System::String^ Schlecht ?



  • Tim06TR schrieb:

    Was ist ein Single ?

    Und warum wird dir bei System::String^ Schlecht ?

    Ihm wird schelcht, weil System::String^ , wie vieles andere auch, was Du verwendest, kein gültiges C++ ist. Und damit hat das im C++-Forum nichts zu suchen.


Anmelden zum Antworten