C++ / Zugriffsverletzung beim Lesen an Position xxxxxxx/



  • Hallo,
    Ich versuche momentan mit C++ einen HamingCode coder und decoder zu programmieren.
    Beim kompilieren bekomme ich immer die im Titel genannte Fehlermeldung.
    Zugriffsverletzung beim Lesen an Position xxxxxxx.

    Hier die Main Datei:

    #include "stdafx.h"
    #include "HCode.h"
    #include <iostream>
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	HCode hcode(1,0,0,0,1,0,1);
    
    	hcode.decode();
    
    	int i = 0;
    
    	for (i = 0; i < 7; i++)
    	{
    		std::cout << hcode.get(i) << std::endl;
    	}
    
    	return 0;
    }
    

    Die Header-Datei der HammingCode-Klasse:

    #pragma once
    class HCode
    {
    private:
    
    	int code[7];
    
    public:
    
    	HCode();
    
    	HCode(int,int,int,int);
    
    	HCode(int, int, int, int, int, int, int);
    
    	void encode();
    
    	void decode();
    
    	void set(int, int, int, int);
    
    	void set(int, int, int, int, int, int, int);
    
    	int get(int);
    
    	~HCode();
    };
    

    Die zugehörige CPP Klasse:

    #include "HCode.h"
    
    HCode::HCode()
    {
    }
    
    HCode::HCode(int zero, int one, int two, int four)
    {
    
    	code[0] = zero;
    	code[1] = one;
    	code[2] = two;
    	code[4] = four;
    
    }
    
    HCode::HCode(int zero, int one, int two, int three, int four, int five, int six)
    {
    
    	code[0] = zero;
    	code[1] = one;
    	code[2] = two;
    	code[3] = three;
    	code[4] = four;
    	code[5] = five;
    	code[6] = six;
    
    }
    
    void HCode::set(int zero, int one, int two, int three, int four, int five, int six)
    {
    
    	code[0] = zero;
    	code[1] = one;
    	code[2] = two;
    	code[3] = three;
    	code[4] = four;
    	code[5] = five;
    	code[6] = six;
    
    }
    
    void HCode::set(int zero, int one, int two, int four)
    {
    
    	code[0] = zero;
    	code[1] = one;
    	code[2] = two;
    	code[4] = four;
    
    }
    
    void HCode::encode()
    {
    	code[3] = code[0] + code[1] + code[2];
    	if (code[3] % 2 == 1)
    	{
    		code[3] = 1;
    	}
    	else
    	{
    		code[3] = 0;
    	}
    
    	code[5] = code[0] + code[1] + code[4];
    	if (code[5] % 2 == 1)
    	{
    		code[5] = 1;
    	}
    	else
    	{
    		code[5] = 0;
    	}
    
    	code[6] = code[0] + code[2] + code[4];
    	if (code[6] % 2 == 1)
    	{
    		code[6] = 1;
    	}
    	else
    	{
    		code[6] = 0;
    	}
    
    }
    
    void HCode::decode()
    {
    	int counter,oneCou=0;
    	int temp[7];
    	for (counter = 1; counter <= 7; counter++)
    	{
    		if (code[counter-1] == 1)
    		{
    			temp[oneCou] = counter;
    			oneCou++;
    		}
    	}
    	int powerCou[3];
    	for (counter = 0; counter < sizeof(temp); counter++)
    	{
    		if (temp[counter] < 8)
    		{
    			if (powerCou[0] == 4)
    			{
    				powerCou[0] = powerCou[0] - 4;
    			}
    			else
    			{
    				powerCou[0] = powerCou[0] + 4;
    			}
    			temp[counter] = temp[counter]-4;
    		}
    		if (temp[counter] < 4)
    		{
    			if (powerCou[1] == 2)
    			{
    				powerCou[1] = powerCou[1] - 2;
    			}
    			else
    			{
    				powerCou[1] = powerCou[1] + 2;
    			}
    			temp[counter] = temp[counter] - 2;
    		}
    		if (temp[counter] < 2)
    		{
    			if (powerCou[2] == 1)
    			{
    				powerCou[2] = powerCou[2] - 1;
    			}
    			else
    			{
    				powerCou[2] = powerCou[2] + 1;
    			}
    			temp[counter] = temp[counter] - 1;
    		}
    	}
    
    	int failure = powerCou[0] + powerCou[1] + powerCou[2];
    
    	switch (code[failure])
    	{
    		case 1:
    			code[failure] = 0;
    			break;
    		case 0:
    			code[failure] = 1;
    			break;
    	}
    }
    
    int HCode::get(int pos)
    {
    	return HCode::code[pos];
    }
    
    HCode::~HCode()
    {
    }
    

    Ich habe zudem noch bestimmte Fehlermeldungen dass Systemdateien nicht gefunden werden, wie z.B. C:\Windows\System32\kernel32.dll.

    Mit freundlichen Grüßen
    Kle4th



  • Schmeiß den Debugger an.
    Verwende std::array mit at, das prüft den Index.



  • int temp[7];
    
    sizeof(temp)
    

    sizeof liefert nicht die Arraylänge in Elementen. ⚠ Entsprechend läuft dein Index zu weit.



  • Habe nun das Programm debuggt, der Fehler tritt in dieser switch Anweisung auf:

    switch (code[failure])
    	{
    		case 1:
    			code[failure] = 0;
    			break;
    		case 0:
    			code[failure] = 1;
    			break;
    	}
    


  • @sizable

    Habs gerade gesehen,danke 😉



  • Hab nun den Fehler gelöst, mit
    (sizeof(temp) / sizeof(int)) anstatt nur (sizeof(temp)



  • Muss mich leider nochmal melden , die Fehlermeldung tritt trotzdem wieder an der selben Stelle auf.



  • Besser wäre std::array, das prüft dir im Debugmodus den index und hat eine bequeme size()-methode.



  • Kle4th schrieb:

    Muss mich leider nochmal melden , die Fehlermeldung tritt trotzdem wieder an der selben Stelle auf.

    Und welchen Wert hat dann failure? Ist es dann ein gültiger Indexwert?


Log in to reply