acces violation fehlermeldung



  • Hallo zusammen, ich hab folgendes Problem.

    ich bekomme beim zuweisen einer double variable in ein double feld mit drei "merkmalen" (daten [10][100][200]) die fehlermeldung:

    acces violation at 0x4001330d write of addres 0x00307f70

    der zugewiesene wert ist der rückgabe wert einer funktion einer klasse!!

    ich versteh die fehlermeldung leider nicht wirklich!!

    und das programm läuft auch schon eine weile und ich optimiere im moment nur! vorher gab es da kein probleme und jetzt kommt dieser fehler!! warum jetzt verstehe ich auch nicht!!

    vielleicht kann mir ja jemand wenigstens den fehler erklären damit ich überlegen kann woran es liegen könnte!
    meine recherchen waren bisher sehr erfolglos!! 😞

    vielen dank!!
    mfg hans



  • Die Fehlermeldung deutet darauf hin, dass Du vesuchst, über die Arraygrenzen hinweg zu schreiben. Auf jeden Fall versucht das Programm in einen Speicherbereich zu schreiben, der ihn nicht gehört.



  • Guck dir mal an, wie groß das Feld "daten" ist und welche Indize du angegeben hast - der Fehler deutet darauf hin, daß du jenseits der Arraygrenzen geschrieben hast.



  • das feld hat die größe [10][100][200] ich adressiere allerdings [0][0][0]!!
    davon habe ich insgesamt drei stück!!
    weiterhin ist auch merkwürdig das ich nach einem neustart des computers datenfeld1 [0][0][0] einen wert zuweisen kann und dann beim datenfeld2 [0][0][0] die fehlermeldung kommt!
    wenn ich dann das programm neustarte kann ich auch datenfeld1 [0][0][0] nichts mehr zuweisen!!
    das programm läuft wie gesagt schon eine weile! kann es sein das ich den speicherbereich voll gemacht habe!

    allerdings sind das keine dynamischen felder, deshalb dürfte doch nach ende des programms bzw. neustart des computers nichts zurückbleiben??

    ich versteh es einfach nicht und bin für jede hilfe dankbar!!

    mfg hans



  • Hm, dann würde ich eigentlich eine andere Fehlermeldung erwarten, beim Erzeugen des Arrays sollte dann bereits die Meldung kommen, dass nicht genügend Arbeitsspeicher zur Verfügung steht. Verbiegst Du irgendwo die Startadresse des Arrays?



  • bin mir zwar nicht sicher was mit verbiegen gemeint ist!! aber ich habe bewusst darauf verzichtet auf die speicheradresse der datenfelder zu manipulieren! da ich mich mit speicherbereichen auf dem rechner zu wenig auskenne!! ich nutze lediglich die zugriffe über die adressierung mit den "merkmalen" ([0][0][0], [0][0][1]. usw!)

    also vielleicht hilft ja auch die information das ich die double variable aus einem AnsiString generiere aber ich hab mir im debug modus den string angeschaut und der ist oK!!!

    mfg hans



  • Ein bisschen Quellcode wäre sicher hilfreich.
    Möglicherweise liegt das Problem in der Funktion, die den Rückgabewert erzeugt.
    Funktioniert "Array[0][0][0]=1;" ?
    Es kann auch sein, dass irgendwo ein Zeiger bzw. ein anderes Array aus dem Ruder läuft und den Zeiger "Array" selbst überschreibt. Nachfolgende Zugriffe auf das Array gehen dann tragisch aus.



  • Kommt vorher vielleicht eine EStackOverflow-Fehlermeldung?



  • also dem array eine festen wert zuweisen geht!

    mit quellcode ist nicht so einfach weil das programm doch sehr groß ist!!

    also die funktion ließt von einem bus einen string formatiert in solange bis es nur noch ein floatwert in der form "-1.00E-01" ist und der wert wird dann mit StrToFloat zurückgegeben! das datenfeld ist wie gesagt für double variablen initiallisiert!!

    die fehler meldung kommtg aber immer dann wenn der wert zurückgegeben wird!!

    keine ahnung was ein:

    Joe_M. schrieb:

    Kommt vorher vielleicht eine EStackOverflow-Fehlermeldung?

    aber ausser dieser acces violation kommt nix!!

    also die fehlermeldung sagt jetzt aus das irgendjemand auf den falschen speicher schreiben will???

    vielleicht kann mir das jemand noch etwas genauer erklären dann kann ich ausschliessen/suchen das/wo der fehler vorher entsteht?

    vieln dank!
    mfg hans



  • Bevor man auf Speicher zugreifen kann, muss man ihn erst reservieren, das passiert in der Regel mit dem Operator new. new liefert dann eine freie Speicheraddresse zurück. Wenn man jetzt versucht, auf eine Speicheraddresse zuzugreifen, die schon wieder mit delete freigegeben wurde (oder nie reserviert war), dann erhälst du eine access violation.
    Also, wenn du dem Array einen konstanten Wert zuweisen kannst, würde ich mir mal deine Funktion kritischer anschauen, versuche mal, ob double Test=func() gut geht.

    Edit: Außerdem gibt dir die Speicheraddresse, die bei einer EAccessViolation angezeigt wird, genaue Auskunft, wo der Fehler aufgetreten ist. Über das Fenster CPU kannst du zu der verantwortlichen Assembleranweisung springen. Selbst wenn dir die Mnemonics nicht viel sagen, stehen normalerweise Quellcodezeilen dabei.



  • vielleicht´liegt der fehler ja im zuweisen des AnsiStrings, zumindest hab ich daran heute gearbeitet!
    also ich rufe die Busfunktion auf die mir als rückabe wert den zeiger ("ptrBus") auf einen string liefert!
    den weiße ich dann folgendermaßen meinem AnsSting "x" zu:

    x=ptrBus;

    also der inhalt von x nach dem zuweisen stimmt und der compiler motzt auch nicht!!

    aber ich bin echt verzweifelt!!

    vielen dank
    mfg hans



  • Das dürfte überhaupt nicht möglich sein, du kannst einem AnsiString nicht einen Zeiger auf einen AnsiString zuweisen. Das müsste dann eher so aussehen:
    x=*ptrBus;



  • Nanyuki schrieb:

    ...versuche mal, ob double Test=func() gut geht.

    ich kenn die funktion leider nicht und weiß auch nicht was genau ich damit probieren kann!!

    Nanyuki schrieb:

    Edit: Außerdem gibt dir die Speicheraddresse, die bei einer EAccessViolation angezeigt wird, genaue Auskunft, wo der Fehler aufgetreten ist. Über das Fenster CPU kannst du zu der verantwortlichen Assembleranweisung springen. Selbst wenn dir die Mnemonics nicht viel sagen, stehen normalerweise Quellcodezeilen dabei.

    ja der speicher bereich ist da aber damit fang ich nix an! leider hab ich auch keine quellcodezeilen gefunden!!wo sollen die den stehen??

    vielen dank mfg hans!



  • der zeiger wird wie folgt deklariert:

    char *ptrBus;

    vielleicht hab ich mich falsch ausgedrückt! sorry!!



  • Ich meinte, dass du mal probieren solltest den Rückgabewert deiner Funktion statt einem Element des Arrays einer anderen double-Variablen zuzuweisen. Wahrscheinlich liegt das Problem aber eher in der Funktion selbst.

    Um die richtige Codestelle zu erhalten, machst du folgendes:
    Du schreibst die erste Addresse der Access Violation auf, also sowas wie 4xxxxx.
    Die konvertierst du dann ins dezimale Zahlensystem, z.B. mit dem Windows-eigenen Rechner. Im CPU-Fenster musst du dann nur noch einen Rechtsklick machen, "Gehe zu Addresse" auswählen und dann bist du da. Das Projekt sollte auf jeden Fall im Voll-Debug-Modus sein, damit du C++ - Codezeilen siehst.



  • hansB.two schrieb:

    der zeiger wird wie folgt deklariert:

    char *ptrBus;

    vielleicht hab ich mich falsch ausgedrückt! sorry!!

    Bin nicht sicher, ob das geht, vermutlich schon.
    Sicherheitshalber würde ich es so schreiben:
    x=String(ptrBus);



  • also ich kann mir bei gehe zu adresse auch nur den push befehl anschauen den er sowieso schon markiert hat!!
    aber der nützt mir nichts!!!

    das zuweisen an eine testvariable klappt!!
    aber wieso nicht an das array?? das sit total unverständlich für mich!!!

    mfg hans



  • Wie gesagt, das bedeutet wohl, dass irgendeine andere Anweisung dein Array kaputtgeschossen hat, höchstwahrscheinlich durch das Schreiben über die Grenze eines anderen Arrays.
    Ohne Quellcode ist es leider auch kaum möglich, dir direkt mit deinem Problem zu helfen.



  • ok hier ist der quelltext der funktion, ich bin mir mittlerweile sehr sicher das hier der acces ensteht auch wenn er erts beim rückgeben auftritt!

    [cpp]

    int ok;
    char *ptrbus;
    unsigned short l=1;
    unsigned short *ptrl;
    ptrl=&l;
    AnsiString ZWBus, t1, t2;
    t1 = LV;   // interne variable zuweisen
    
    ZWBus = "LV"+t1+";V=";
    l  = ZWBus.Length();
    ptrl=&l;
    ptrbus = ZWBus.c_str();
    ok = IeOutput (PID, ID , ptrbus, ptrl); //senden eines strings über den bus
    
    if (ok==0)
           {
           l=16;
           ptrl=&l;
           ok=IeEnter (PID, ID , ptrbus, ptrl); //empfangen eines strings über den bus
           if (ok==0)
              {
              t2=ptrbus; 
              ok=t2.Length();
              t2.Delete((l),ok);
              ok = t2.AnsiPos("=");
              t2.Delete(1,ok);
     }
           }
    return (StrToFloat(t2));
    

    [cpp]

    ich hoffe es nutz was??!

    vielen dank mfg hans



  • Eine Sache ist mir aufgefallen... ptrbus wird ja mit dieser Codezeile initialisiert:

    ptrbus = ZWBus.c_str();
    

    Damit hat der C-String eine maximale Länge von ("LV"+t1+";V=").
    Ist der Buffer vielleicht einfach zu klein, um die Daten von IeEnter (maximal 16 bytes) aufzunehmen?
    Ich weiß ja nicht, was LV für ein String ist, aber wenn er kürzer als 10 Zeichen ist, dann liegt es daran.


Anmelden zum Antworten