tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
21
ZUGRIFFE
1532
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    nacho25 nacho25 ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    12
    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!
     

  2. #2
    Registriert seit
    Apr 2002
    Ort
    Delmenhorst (Niedersachsen)
    Beiträge
    3.567
    moin


    Zeig mal deinen Code.


    mfg
    umbrasaxum
     

  3. #3
    nacho25 nacho25 ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    12
    Zitat Zitat von umbrasaxum
    moin


    Zeig mal deinen Code.


    mfg
    umbrasaxum
    Hallo,

    das sind so an die 1000 Zeilen... Willst Du das wirklich haben
     

  4. #4
    colt4ever Tutorials.de Gastzugang
    Dann zips sie zuerst, dann hängst du Sie zum Downloaden an
     

  5. #5
    nacho25 nacho25 ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    12
    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...
    Angehängte Dateien Angehängte Dateien
     

  6. #6
    colt4ever 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).
     

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

  8. #8
    nacho25 nacho25 ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    12
    @colt4ever: Habe ich probiert. Hat leider nix geändert Trotzdem danke!
    Geändert von nacho25 (23.02.05 um 20:37 Uhr)
     

  9. #9
    nacho25 nacho25 ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    12
    Zitat Zitat von umbrasaxum
    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
    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...
     

  10. #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
    umbrasaxum
    Geändert von Tobias K. (23.02.05 um 21:05 Uhr)
     

  11. #11
    nacho25 nacho25 ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    12
    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...
     

  12. #12
    colt4ever 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!
     

  13. #13
    nacho25 nacho25 ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    12
    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!
     

  14. #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
     

  15. #15
    nacho25 nacho25 ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    12
    @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

  1. access violation
    Von alice in wunderlan im Forum Cinema 4D
    Antworten: 3
    Letzter Beitrag: 26.02.10, 12:51
  2. Unmanaged DLL Access Violation?
    Von engelmarkus im Forum .NET Café
    Antworten: 4
    Letzter Beitrag: 15.05.09, 22:58
  3. EXCEPTION ACCESS VIOLATION in C DLL
    Von roxX0r im Forum Java
    Antworten: 0
    Letzter Beitrag: 02.06.08, 14:24
  4. Access Violation!?
    Von shader09 im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 03.03.08, 15:39
  5. access vîolation
    Von derGugi im Forum Delphi, Kylix, Pascal
    Antworten: 2
    Letzter Beitrag: 15.04.03, 16:10