acces violation fehlermeldung



  • 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