Zugriffsverletzung - aber wo...



  • hi leute, ich komme irgendwie nicht weiter, das programm stürzt ab..
    der debugger sagt, zugriffsverletzung

    wo ist hier was falsch

    #include <iostream>
    #include <konsole.h>
    
    void fuellen(double*);
    double f(double);
    void erfassen(double*);
    
    int main()
    {   double w[21];
    
        fuellen(w);
        erfassen(w);
        getch();
        return 0;
    }
    
    void fuellen(double* w)
    {
        for(int x=0;x<2.1;x+=0.1)
        {
            *w=f(x);
            *w++;
        }
    }
    double f(double x)
    {
        return x/(1-x*x);
    }
    void erfassen(double* w)
    {
        for(int n=0;n<21;n++)
        {
            cout<<"w["<<n<<"] = "<<*w<<endl;
            *w++;
        }
    }
    

    //EDIT, ok habs 😃 musste double nehmen anstatt int beim fuellen, ist ja logisch 😃



  • Corax schrieb:

    cout<<"w["<<n<<"] = "<<*w<<endl;

    Was bitte so das sein?



  • Normaler weiße solltest du dort immernoch ein Fehler bekommen, weil dein double Array verweißt ja auf nicht definierten speicher, schließlich füllst du das array nirgends.



  • ach jetzt, mach doch mal ein paar leerzeichen rein



  • Firefighter schrieb:

    Normaler weiße solltest du dort immernoch ein Fehler bekommen, weil dein double Array verweißt ja auf nicht definierten speicher, schließlich füllst du das array nirgends.

    a) füllt er in "füllen" und b) ist der Zugriff auf nicht initialisierten Speicher keine Zugriffsverletzung. Es steht nur Schrott im Speicher

    Das Problem liegt in der Funktion "füllen". Arithmetik mit reallen Zahlen ist ungenau und führt zu Rundungsfehlern. Besser, man macht es so:

    void fuellen(double* w)
    {
        for(int n = 0; n < 21; ++n)
        {
            w[n]=f(n / 10.0);
        }
    }
    


  • Ahh stimmt du hast Recht, die Funktionen habe ich direkt mal überlesen 😃



  • angenommen ich möchte in einer extra funktion einen satz bis zum enter druck im array speichern.
    das geht mithilfe von cin.getline(array*,255);

    array* deshalb weils ein array ist und das hauptprogramm die funktion aufruft, und die 255 ist die größe des arrays....

    wie kann ich den arrayzeiger aber um eine zahl erhöhen, also wo packe ich dann *array++ rein...

    oder geht das so garnicht? müsste ich mit kbhit bis zum enter arbeiten?



  • Wenn du etwas einlesen willst, was bis zum Enter-Druck eingelesen wird, dann benutze einfach std::string und getline(cin,deinstring).



  • also ich ahbe hier diese funktion

    void eingabe(char* s)
    {
    getline(cin,*s);
    }

    dann wird aber gemecket
    folgendes zur analyse:

    Keine Übereinstimmung für 'getline<charT,traits,Allocator>(istream,char)' gefunden in Funktion eingabe(char *)
    


  • getline(cin,s);//kein sternchen, getline erwartet ja auch einen zeiger auf char
    


  • kommt aber der gleiche fehler...

    also im hauptprogramm rufe ich die funktion so auf eingabe(zkette);

    in der funktion so wie du es geschrieben hast, allerdings passiert nichts...
    oder brauche ich zusätzliche bibliotheken?



  • Corax schrieb:

    kommt aber der gleiche fehler...

    ups, getline(cin,deinstring) war gedacht, wenn du echt nen string im sinne von std::string nimmst.
    mit char* heißt es cin.getline(s,anzahlBytes)



  • so funktioniert das aber auch nicht

    void eingabe(char* s)
    {
        cin.getline(s,100);
    }
    

    Die Konsole öffnet sich zwar, aber ich kann nichts eingeben, und das Programm stürzt nach ner Weile ab..



  • hast du vorher genug speicher angelegt?

    int main()
    {
       char text[100];//speicher angelegt
       eingabe(text);//sollte gehen
       cout<<"die eingabe war: "<<text<<'\n';
    


  • Wie sieht denn dein umliegender Code aus? Reservierst du genügend Speicher?

    Und wie stürzt das Programm ab?



  • mein code sieht so aus

    int main()
    {
        char zkette[100];
        eingabe(zkette);
        ausgabe(zkette);
        getch();
        return 0;
    }
    
    void eingabe(char* s)
    {
        cin.getline(s,100);
    }
    void ausgabe(char* s)
    {
        while(*s!=0)
        {
            cout<<*s;
            *s++;
        }
    }
    

    also speicher in form von 100 bytes habe ich angelegt,
    eingabe(zkette) ruf die funktion eingabe() auf und übergibt den array an die funktion...
    könnte mir vorstellen, dass irgendwas mit der ausgabe funktion falsch läuft, aber ich kann ja noch nichtmals was eingeben, d.h es kommt ja noch nicht zu der funktion, es muss ja vorher was eingegeben werden, bevor die funktion ausgabe() aufgerufen werden kann...



  • Also bei mir läuft der Code einwandfrei. Eingabe und dann Ausgabe. (MSVC++ 08 Express).



  • hmm also ich habe borland c++, habe die bibliotheken in codeblock eingebunden, schreibe meine codes also mit codeblock

    habs grad mit devc++ ausprobiert, tatsächlich es funktioniert....
    was ich aber nicht verstehe, immerhin ist devc++ ja kostenlos und borland ja nicht soweit ich weiß...die bibliotheken müssten ja ausgereifter sein von borland?



  • Die Qualität hat nichts mit dem Preis zu tun.

    VC08 Express ist auch Kostenlos, aber trotzdem als die VC05 Premium. 😉

    Das hat was mit Aktualität und Qualität zu tun. Ich würde aber eh VC oder GCC raten.. Die sind beide auf dem neusten Stand und ebenfalls kostenlos. (bei VC wenigstens die Express Edition).



  • drakon schrieb:

    Die Qualität hat nichts mit dem Preis zu tun.

    VC08 Express ist auch Kostenlos, aber trotzdem als die VC05 Premium. 😉

    Das hat was mit Aktualität und Qualität zu tun. Ich würde aber eh VC oder GCC raten.. Die sind beide auf dem neusten Stand und ebenfalls kostenlos. (bei VC wenigstens die Express Edition).

    gcc (MinGW für Windows) ist nicht wirklich auf dem neusten Stand. Vor allem nicht die mit Codeblocks ausgelieferte Version. Am aktuellsten ist vermutlich noch diese Version.
    Wie gesagt, das ist bezogen auf Windows.


Log in to reply