Access violation writing location



  • Mal ne frage:
    was hat "Access violation writing location" als debug-fehlermeldung zu bedeuten?
    Kann mir jemand helfen?



  • Du greifst auf Speicher zu, der dir nicht gehört.
    Irgendwo machst du deine Zeiger kaputt.



  • Das ist eine Schutzverletzung. Du greifst auf Speicheradressen zu, auf die dein Programm nicht zugreifen darf. Das sind häufig Null-Pointer-Dereferenzierungen, oder Zugriffe auf bereits freigegebenen Speicher.



  • ok, aber wo zmach ich hier die zeiger kaputt?

    Main.cpp:

    #include <iostream>
    #include "Keyings.h"
    using namespace std;
    using namespace keys;
    
    int main (void)
    {
    	char teststring;
    	cout << "press any key to start: \n(if you don't find any use j)\n";
    	cin >> teststring;
    	picturergb* pic1 = new picturergb;
    	picturergb* pic2 = new picturergb;
    	picturergb* pic3 = new picturergb;
    	textkey* txt = new textkey;
    	cout << "\ncreated two imagematrixes\n";
    	cout << sizeof(picturergb) << "\n";
    #ifdef _OPENMP
    	cout << "found OpenMP, dividing into 4 threads\n";
    	for(int i = 0; i<1500;i++)//schleife 1
    	{
    #pragma omp parallel sections
    		{
    
    #pragma omp section
    			{
    				int fader = i;
    				int faderinv = 128-fader;
    				for(int g=0;g<320;g++)
    				{
    					int b = g;
    					for(int h=0;h<240;h++)
    					{
    						int l = h;
    						pic3->red[l][b] = pic1->red[l][b]/128*fader + pic2->red[l][b]/128*faderinv;
    						pic3->blue[l][b] = pic1->blue[l][b]/128*fader + pic2->blue[l][b]/128*faderinv;
    						pic3->green[l][b] = pic1->green[l][b]/128*fader + pic2->green[l][b]/128*faderinv;
    					}
    				}
    				cout << "quarter 1 done\n";
    			}
    #pragma omp section
    			{
    				int fader = i;
    				int faderinv = 128-fader;
    				for(int g=320;g<640;g++)
    				{
    					int b = g;
    					for(int h=0;h<240;h++)
    					{
    						int l = h;
    						pic3->red[l][b] = pic1->red[l][b]/128*fader + pic2->red[l][b]/128*faderinv;
    						pic3->blue[l][b] = pic1->blue[l][b]/128*fader + pic2->blue[l][b]/128*faderinv;
    						pic3->green[l][b] = pic1->green[l][b]/128*fader + pic2->green[l][b]/128*faderinv;
    					}
    				}
    				cout << "quarter 2 done\n";
    			}
    #pragma omp section
    			{
    				int fader = i;
    				int faderinv = 128-fader;
    				for(int g=0;g<320;g++)
    				{
    					int b = g;
    					for(int h=240;h<480;h++)
    					{
    						int l = h;
    						pic3->red[l][b] = pic1->red[l][b]/128*fader + pic2->red[l][b]/128*faderinv;
    						pic3->blue[l][b] = pic1->blue[l][b]/128*fader + pic2->blue[l][b]/128*faderinv;
    						pic3->green[l][b] = pic1->green[l][b]/128*fader + pic2->green[l][b]/128*faderinv;
    					}
    				}
    				cout << "quarter 3 done\n";
    			}
    #pragma omp section
    			{
    				int fader = i;
    				int faderinv = 128-fader;
    				for(int g=320;g<640;g++)
    				{
    					int b = g;
    					for(int h=240;h<480;h++)
    					{
    						int l = h;
    						pic3->red[l][b] = pic1->red[l][b]/128*fader + pic2->red[l][b]/128*faderinv;
    						pic3->blue[l][b] = pic1->blue[l][b]/128*fader + pic2->blue[l][b]/128*faderinv;
    						pic3->green[l][b] = pic1->green[l][b]/128*fader + pic2->green[l][b]/128*faderinv;
    					}
    				}
    				cout << "quarter 4 done\n";
    			}
    		}
    	cout << "picture ready!\n";
    	pic3 = keys::Keying(pic3,txt); //Hier soll dann, nachdem das bild aus zwei bildern zusammengeflickt worden ist, gekeyt werden.
    	}
    #else
    	for(int i=0;i<1500;i++)
    			{
    				int fader = i;
    				int faderinv = 128-fader;
    				for(int g=0;g<640;g++)
    				{
    					int b = g;
    					for(int h=0;h<480;h++)
    					{
    						int l = h;
    						pic3->red[l][b] = pic1->red[l][b]/128*fader + pic2->red[l][b]/128*faderinv;
    						pic3->blue[l][b] = pic1->blue[l][b]/128*fader + pic2->blue[l][b]/128*faderinv;
    						pic3->green[l][b] = pic1->green[l][b]/128*fader + pic2->green[l][b]/128*faderinv;
    					}
    				}
    				cout << "picture ready\n";
    			}
    #endif
    	cout << "DONE\n";
    	delete pic1;
    	delete pic2;
    	delete pic3;
    	delete txt;
    	cout << "pic 1 und pic 2 geloescht\n";
    	cin >> teststring;
    	return 0;
    }
    

    Keyings.h

    #include "Picture.h"
    namespace keys
    {
    	struct textkey
    {
    	int key[640][480];
    	unsigned int text_color_rgb[3];
    };
    picturergb* Keying(picturergb* pic = new picturergb,textkey* text = new textkey)
    {
    	//picturergb* pic = new picturergb;
    	for(int g=0;g<640;g++)
    	{
    		int b = g;
    		for(int h=0;h<480;h++)
    		{
    			int l = h;
    			if(text->key[l][b] == 1) // position 2
    			{
    				pic ->blue[l][b] = text->text_color_rgb[3];
    				pic ->red[l][b] = text->text_color_rgb[1];
    				pic ->green[l][b] = text->text_color_rgb[2];
    			}
    			else
    			{
    
    			}
    		}
    	}
    	delete text;
    	return pic;
    	delete pic;
    }
    };
    

    Picture.h:

    struct picturergb
    {
    	unsigned int red[640][480];
    	unsigned int green[640][480];
    	unsigned int blue[640][480];
    };
    

    ach ja, ich weiß, stil und organisation sind nicht so gut, wäre aber trotzdem nett wenn mir jeemand helfen könnte.



  • Was verwendest Du für einen Debugger?
    Ein vernünftiger Debugger zeugt an wo eine Access Violation passiert.

    Simon



  • ich hab vs2010 proffesional, die exeption passier beim zweiten schleifendurchlauf der schleife bei 1, an der position2 in Keyings.h
    hier die komplette fehlermeldung: Unhandled exception at 0x012b1593 in speedtest_001.exe: 0xC0000005: Access violation reading location 0x00d80040.



  • Sollen wir jetzt für dich debuggen? Der Debugger ist doch nicht so schwer zu bedienen, wo liegt das Problem? Im Zweifelsfall halt mal durchsteppen, dann sieht man meistens schnell wo es hakt.

    ach ja, ich weiß, stil und organisation sind nicht so gut

    Ja, aber OpenMP macht ja die dümmsten Fehler wieder wett 🙂



  • jonnybx schrieb:

    ach ja, ich weiß, stil und organisation sind nicht so gut

    Abläufe, die sich sehr ähnlich sehen (und wahrscheinlich mit Copy&Paste dupliziert worden sind), schreien ja geradezu danach, in eine Funktion ausgelagert zu werden. Damit könntest du schon einiges übersichtlicher und damit auch wartbarer und weniger fehleranfällig gestalten.



  • Ich will ja nichts bemängeln aber:

    int key[640][480];
    
    //picturergb* pic = new picturergb;
    for(int g=0;g<640;g++)
    {
        int b = g;
        for(int h=0;h<480;h++)
        {
            int l = h;
            if(text->key[l][b] == 1) // position 2
    
    // >> 1. text->key[h][g] weil h = l und g = b
    // >> 2. text->key[479][639] weil h geht bis 479 und g geht bis 639
    
    // >> int key[640][480]; << das ist deine Definition
    

    Fällt dir was auf? 😃



  • jo, kleiner leichtsinnsfehler am rande xD
    ach ja, ich hab das problem gelöst


Anmelden zum Antworten