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?