acces violation fehlermeldung



  • 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.



  • aber das ergebniss stimmt ja wene ich im debug mode durchgeh kommt ZWBus richtig nzurück!!
    ausserdem wird bei iEnter die länge des gelieferten string überl ptrl zurückgegeben!!
    aber was könnt den helfen?? weil LV nur ein zeichen ist!!

    mfg hans



  • Du hast das ganze etwas umständlich formuliert. Diese ganzen Hilfspointer (ptrl, ptrbus) brauchst du nicht. Wenn du sie weglässt, siehst du gleich das erste Problem

    IeEnter (PID, ID , ptrbus, ptrl)
    

    Diese Funktion schreibt ja höchstwahrscheinlich etwas in ptrbus. ptrbus ist aber gleich ZWBus.c_str(). Das ist ein konstantes char* Array des internen Speichers eines AnsiStrings. Da darfst du nichts reinschreiben. Erzeuge dir ein temporäres char* dafür.
    Was ist LV? Ein try/catch um das StrToFloat wäre auch sinnvoll (falls keine Zahl da drin ist).
    Versuchs mal damit

    unsigned short l=1;
    AnsiString ZWBus = "LV";
    ZWBus += LV;
    ZWBus += ";V=";
    l  = ZWBus.Length();
    int ok = IeOutput (PID, ID , ZWBus.c_str(), &l); //senden eines strings über den bus
    if (ok==0)
    {
           l=16;
           char* ptrbus = new char[l+1];
           ok=IeEnter (PID, ID , ptrbus, &l); //empfangen eines strings über den bus
           ptrbus[l] = '\0';
           if (ok==0)
           {
              AnsiString t2=ptrbus;
              ok=t2.Length();
              t2.Delete((l),ok);
              ok = t2.AnsiPos("=");
              t2.Delete(1,ok);
           }
           delete[] ptrbus;
    } else return 0.0; 
    try
    {
    	double f = StrToFloat(t2);
    	return f;
    }
    catch(...)
    {
       return 0.0;
    }
    


  • hey vielen vielen dank!! funktioniert prima musste nur den AnsiSTring t2 noch anders deklaririeren sonst hat er ihn beim übergeben nicht mehr erkannt 😉 !!

    aber der code ist sehr viel besserr als meiner!!

    also vielen dank!!

    mfg hans



  • Stimmt, das mit dem t2 hatte ich übersehen. 😞


Anmelden zum Antworten