ERLEDIGT
JA
JA
ANTWORTEN
21
21
ZUGRIFFE
1532
1532
EMPFEHLEN
-
Ich hoffe, ich kann mein Problem treffend erklären:
Habe ein Programm geschrieben, das mit einer txt-Datei arbeitet, und mit Visual C++ kompiliert, gelinkt, ausgeführt. Es läuft korrekt bis zum Ende durch, die Bildschirmausgabe ist einwandfrei und direkt vor dem return in main kriege ich noch ne Ausgabe auf den Bildschirm. Dann kriege ich (nur manchmal, bei einigen Dateien nicht-warum bloß?) die Fehlermeldung, dass meine .exe-Datei beendet werden muss: Unhandled Exception...Access Violation. Der Debugger zeigt mir dann das Problem in einer Datei namens fflush.c, die irgendwo in meinem Visual-Verzeichnis liegt. Dort kann anscheinend auf ein Array namens __piob an der Stelle i nicht zugegriffen werden...
Habe das Gefühl, mein Problem hat nicht direkt was mit meinem Programmcode zu tun. Irgendjemand schonmal so was gesehen oder eine Idee, was das sein könnte?
Vielen Dank schonmal!
-
23.02.05 14:17 #2
- Registriert seit
- Apr 2002
- Ort
- Delmenhorst (Niedersachsen)
- Beiträge
- 3.567
moin
Zeig mal deinen Code.
mfg
umbrasaxum
-
Hallo,
Zitat von umbrasaxum
das sind so an die 1000 Zeilen... Willst Du das wirklich haben
-
23.02.05 15:54 #4colt4ever Tutorials.de Gastzugang
Dann zips sie zuerst, dann hängst du Sie zum Downloaden an
-
Ok, hab ihn angehängt. Kurz was zum Programm: Es geht um das Lösen von Ungleichungssystemen mit zwei Variablen pro Ungleichung. Die Variablen sind beschränkt und die Lösung muss ganzzahlig sein. Mein Programm soll folgendes tun: Parameter des Ungleichungssystems aus der Datei auslesen und in verschiedene Arrays schreiben, die Variablen und Ungleichungen in eine SAT-Theorie umgewandeln (macht nix, wenn man nicht weiß, was das ist), Lösbarkeit der SAT-Theorie überprüfen und ggfs. Lösung bezogen auf die ursprünglichen Variablen berechnen.
Habe inzwischen den Hinweis bekommen, daß es wahrscheinlich irgendein Speicherproblem ist. Habe einige externe Variablen- vielleicht zu viele/zu große?
Ach ja, mit "testbsp.txt" läuft das Programm, mit "test10.txt" tritt die Fehlermeldung auf.
Bitte nicht über meinen uneleganten Programmierstil wundern...
-
23.02.05 19:53 #6colt4ever Tutorials.de Gastzugang
Nur ganz schnell ein paar Erkenntnisse von mir. Keine Ahnung ob das was hilft, aber probier mal:
Code :1
int n, m, *l, *u, **ungl, anzahlbinvar, size, **sat, **inzidenzliste, *anzahlklaus, *zaehler;
Code :1 2 3 4 5 6 7 8 9 10
int n; int m; int size; int *l = NULL; int *u = NULL; int **ungl = NULL; int **sat = NULL; int **inzidenzliste = NULL; int *anzahlklaus = NULL; int *zaehler = NULL;
Also alle Variablen mit * auf NULL zu initialisieren (weiss nicht ganz ob das new egal ist).
-
23.02.05 20:00 #7
- Registriert seit
- Apr 2002
- Ort
- Delmenhorst (Niedersachsen)
- Beiträge
- 3.567
moin
Was natürlich gleich auffällt ist das "test10.txt" um einiges größer als "testbsp.txt" ist.
Also mal gucken ob sich irgendwelche Variablen im Speicher in die quere kommen.
mfg
umbrasaxum
-
@colt4ever: Habe ich probiert. Hat leider nix geändert
Trotzdem danke!
Geändert von nacho25 (23.02.05 um 20:37 Uhr)
-
Ja, sowas denke ich mir auch. Allerdings hatten alle Variablen, die ich mir im Laufe des Programms zum Testen mal habe ausgeben lassen, auch den Wert den sie haben sollten. Und mich verwirrt nach wie vor, daß die access violation was mit dieser fflush-Datei zu tun hat...
Zitat von umbrasaxum
-
23.02.05 21:02 #10
- Registriert seit
- Apr 2002
- Ort
- Delmenhorst (Niedersachsen)
- Beiträge
- 3.567
moin
Bei mir stoppt er an folgender Stelle:
Code :1 2 3 4 5
//Klauseln mit x als gestrichen markieren for(i=0; i < anzahlklaus[-x-1+anzahlbinvar]; i++) { mark[inzidenzliste[-x-1+anzahlbinvar][i]]= 1; }
In Datei: basicshn2.cpp
Zeile: 557
Als es stoppte hatte inzidenzliste[-x-1+anzahlbinvar][i] den Wert -33686019
mfg
umbrasaxumGeändert von Tobias K. (23.02.05 um 21:05 Uhr)
-
Guter Hinweis, danke! Mir zwar völlig unverständlich, aber die beiden Arrays zaehler und anzahlklaus haben nicht den gleichen Inhalt- obwohl sie gleich besetzt werden, bins extra Zeile für Zeile durchgegangen Habe einfach den Inhalt von anzahlklaus nach dessen Besetzung per for-Schleife nach zaehler kopiert, um dieses Problem zu lösen. Nichtsdestotrotz kriege ich immer noch die gleiche Fehlermeldung am Schluss...
-
24.02.05 18:30 #12colt4ever Tutorials.de Gastzugang
Habe möglichen Fehler gefunden:
Und zwar in der Funktion Trans2Sat():
Code :1 2 3 4 5 6 7 8 9 10 11 12
for (i = 0; i < m; i++) { //Initialisierungen int x = ungl[i][0]; int y = ungl[i][1]; int zx = u[x]-l[x]+1; int zy = u[y]-l[y]+1; a = ungl[i][2]; b = ungl[i][3]; c = ungl[i][4]; int *alphax = new int[zx]; int *alphay = new int[zy];
Gib die Deklarierungen vor der for-Schleife, sonst wird immer deklarierst du die Variablen bei jedem Schliefendurchlauf!
-
Danke für den Hinweis, habs geändert (blöder Fehler). Aber leider besteht das Problem nach wie vor! Habe inzwischen rausgefunden, das sich bei ca. 50 Indizes die Arrays "zaehler" und "anzahlklaus" um 1 unterscheiden. Die betroffenen Variablen weisen keinen besonderen Zusammenhang auf. Habe mit Setzen von bestimmten Breakpoints mit dem Debugger 5 der Indizes beobachtet (bin alle Schleifen Schritt für Schritt durchgegangen...), dann war seltsamerweise bei diesen Indizes alles ok, aber dafür bei anderen nicht! Das soll mal jemand verstehen!
-
24.02.05 21:39 #14
- Registriert seit
- Apr 2002
- Ort
- Delmenhorst (Niedersachsen)
- Beiträge
- 3.567
moin
Ja daran liegt aber nciht der Fehler!
Der Fehler ist wie ich schon gesagt hab dort:
Code :1 2 3 4 5 6
//Klauseln mit x als gestrichen markieren for(i=0; i < anzahlklaus[-x-1+anzahlbinvar]; i++) { mark[inzidenzliste[-x-1+anzahlbinvar][i]]= 1; }
Zur besseren Fehler eingrenzung habe ich das Stück in folgendes geändert:
Code :1 2 3 4 5
for(i=0; i < anzahlklaus[-x-1+anzahlbinvar]; i++) { yxc = inzidenzliste[-x-1+anzahlbinvar][i]; mark[yxc]= 1; }
Der Teil steht in PropUnit() und tritt auch wenn PropUnit das 5. mal aufgerufen wird!
yxc = inzidenzliste[-x-1+anzahlbinvar][i];
Funktioniert noch, ABER yxc hat danach den Wert -33686019 und wenn dann
mark[yxc]= 1; aufgerufen wird, wird versucht auf die -33686019. Stelle eine 1 zu setzen, was selbstverständlich zu nem Fehler führt.
mfg
umbrasaxum
-
@umbrasaxum: Verstehe ich das richtig, das bei Dir das Programm gar nicht bis zum Ende läuft und die Lösung ausgibt? Das wäre schonmal anders als bei mir!
Ich glaube herausgefunden zu haben, dass der Fehler in der Inzidenzliste daher kommt, dass das Array "zaehler" falsch besetzt ist. Danach richtet sich nämlcih die Größe der Inzidenzliste:
Code :1 2 3 4 5 6 7 8 9
inzidenzliste = new int*[2*anzahlbinvar]; for(i=0; i<2*anzahlbinvar; i++) { inzidenzliste[i] = new int[zaehler[i]]; for (j=0; j<zaehler[i]; j++) { inzidenzliste[i][j] = 0; } }
Später (s.u.) wird dann mit "anzahlklaus" auf Indizes zugegriffen, die "inzidenzliste " nicht hat (zaehler kann ich nicht mehr benutzen, weil runtergezählt; "anzahlklaus" hat an den entsprechenden Stellen einen höheren Wert (+1) als "zaehler"):
Code :1 2 3 4 5
//Klauseln mit x als gestrichen markieren for(i=0; i < anzahlklaus[-x-1+anzahlbinvar]; i++) { mark[inzidenzliste[-x-1+anzahlbinvar][i]]= 1; }
Ähnliche Themen
-
access violation
Von alice in wunderlan im Forum Cinema 4DAntworten: 3Letzter Beitrag: 26.02.10, 12:51 -
Unmanaged DLL Access Violation?
Von engelmarkus im Forum .NET CaféAntworten: 4Letzter Beitrag: 15.05.09, 22:58 -
EXCEPTION ACCESS VIOLATION in C DLL
Von roxX0r im Forum JavaAntworten: 0Letzter Beitrag: 02.06.08, 14:24 -
Access Violation!?
Von shader09 im Forum C/C++Antworten: 3Letzter Beitrag: 03.03.08, 15:39 -
access vîolation
Von derGugi im Forum Delphi, Kylix, PascalAntworten: 2Letzter Beitrag: 15.04.03, 16:10





Zitieren
Login






