Nochmal ein Problem mit Zeigern

Von: , Frage gestellt am Mo, 21. Mai 2007

Hallo nochmal. Dieses Programm zeigt beim Versuch es zu compilieren eine Fehlermeldung, in der eine EAValueException erwähnt wird. Mir ist aufgefallen, dass ich nur bei einer Schrittweite von < 0.8 diese Exception bekomme. Zudem werden mir nur 8 y-Werte zu den 8 x-Werten angezeigt.
Vielleicht könnt ihr mir sagen, warum es hier zu einer Zugriffsverletzung bei einer Adresse kommt. Vielen Dank im Voraus!

//---------------------------------------------------------------------------
#include <iostream.h>
#include <condefs.h>
#include <conio.h>

void funktionswerte(float *table_x,float *table_y,float ug,float og, float step)
{
* table_x = ug; // x - Wert in die Tabelle packen
* table_y = pow(ug,2);
cout << "x= "<<(*table_x)<<" y= "<<(*table_y)<<endl;
table_x=table_x+1; // setze Pointer auf nächstes Feld (x)
table_y=table_y+1; // setze Pointer auf nächstes Feld (y)
ug = ug + step; // neue Untergrenze


while (ug <= og) // solange bis die Obergrenze erreicht ist
{
* table_x = ug;
* table_y = pow(ug,2);
cout << "x= "<<(*table_x)<<" y= "<<(*table_y)<<endl;
table_x=table_x+1; // setze Pointer auf nächstes Feld (x)
table_y=table_y+1; // setze Pointer auf nächstes Feld (y)
ug = ug + step;
}


}


int main()
{
const int maximum=10000;
float untergrenze=-3;
float obergrenze=3;
float schrittweite=0.6;
static float wertetabelle_x[maximum];
static float wertetabelle_y[maximum];

// adressübergabe an die funktion
funktionswerte(& wertetabelle_x[maximum],& wertetabelle_y[maximum], untergrenze, obergrenze, schrittweite);

getch();
return 0;
}
//---------------------------------------------------------------------------

4 Antworten zu dieser Frage

  1. Antwort von nach 19 Minuten 0 hilfreich
    Re: Nochmal ein Problem mit Zeigern

    Hallo, Hallo nochmal. Dieses Programm zeigt beim Versuch es zu
    compilieren eine Fehlermeldung, in der eine EAValueException
    erwähnt wird.
    Das ist immer noch keine komplette Fehlermeldung. Copy&Paste doch die ganze Meldung hier rein.
    Und bitte benutze <pre>-Tags um den Code herum, ich bitte dich das nicht zum Spass, sondern weil sonst der Code sehr schwer zu lesen ist.

    Grüße,
    Moritz

    • Antwort von nach 3 Stunden 0 hilfreich
      Re^2: Nochmal ein Problem mit Zeigern

      Hallo nochmal,

      es wird mir ein VBCritical-Fenster angezeigt und die Fehlermeldung lautet folgendermaßen:

      Im Projekt Fonktionswerte_einlesen.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 7C911010. Lesen von Adresse 404F5C3E'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

  2. Antwort von nach 5 Stunden 0 hilfreich
    Re: Nochmal ein Problem mit Zeigern

    Hallo Dieses Programm zeigt beim Versuch es zu
    compilieren eine Fehlermeldung, in der eine EAValueException
    erwähnt wird. Mir ist aufgefallen, dass ich nur bei einer
    Schrittweite von < 0.8 diese Exception bekomme. Zudem
    werden mir nur 8 y-Werte zu den 8 x-Werten angezeigt.
    Vielleicht könnt ihr mir sagen, warum es hier zu einer
    Zugriffsverletzung bei einer Adresse kommt. Vielen Dank im
    Voraus!
    Du übergibst eine Adresse *nach* Deinem
    bereitgestellten Speicherbereich, dort
    versucht die Funktion dann hinzuschreiben.

    ich hab das Programm mal nach C++ übersetzt,
    vielleicht kannst Du was damit anfangen.

    #include <iostream>
    #include <cmath>
    using namespace std;
    struct GRENZE { float ug, og, step; };
    void funktionswerte(float *table_x, float *table_y, GRENZE g, size_t uebrig)
    {
    while( g.ug <= g.og ) { // solange bis die Obergrenze erreicht ist
    *table_x = g.ug;     // x - Wert in die Tabelle packen
    *table_y = g.ug * g.ug;
    cout << "x= " << *table_x << " y= " << *table_y << " | " << uebrig << endl;
    if( !--uebrig ) {
    cout << "BUMMER: Feldelemente zu Ende" << endl;
    return;
    }
    ++table_x;            // setze Pointer auf nächstes Feld (x)
    ++table_y;            // setze Pointer auf nächstes Feld (y)
    g.ug += g.step;
    }
    }
    int main()
    {
    enum { MAXIMUM = 10000 };
    GRENZE grenze = { -3.0f, 3.0f, 0.6f };
    float * wt_x = new float [MAXIMUM];
    float * wt_y = new float [MAXIMUM];
    funktionswerte( wt_x, wt_y, grenze, MAXIMUM ); // Adressübergabe an die Funktion
    delete [] wt_x;
    delete [] wt_y;
    cin.get();
    return 0;
    }
    Grüße & gute Nacht

    CMБ

    • Antwort von nach 13 Stunden 0 hilfreich
      Re^2: Nochmal ein Problem mit Zeigern

      Vielen Dank für die Antwort. Ich kann den Quellcode interpretieren, aber was hat sich da geändert? Welche Adresse meinst du? Ich schreibe also hinter den eigentlichen Speicherbereich!?
      Bye

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!