acces violation fehlermeldung
-
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 damitunsigned 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.
