Dynamiczna tablica c++ kontra ddr ecc

0

Witajcie koledzy!
Piszę w c++ program na konkurs. Wszystko działa ale gdy używam tablicy dynamicznie alokowanej(wskaźnikowej) to po odczytaniu jednego elementu tablicy ona sama się czyści, debuguję kod i nie znajduję żadnego błędu, czy problemem może być to, że ma mam w ramie zabezpieczenie ecc?

0

Gdzieś mażesz po pamięci.

0

nie rozumiem, możesz jaśniej

0

Błąd w innym miejscu.

0

Np. używasz wskaźnika który przypadkiem wskazuje na ta tablice lub wyskakujesz poza tablice i tez akurat w miejsce tej tablicy.

0

O ile nie masz jakiegoś kodu do pokazania do po prostu użyj debuggera. Nie tylko tego z IDE, kaczki też (czyli przemyśl co się dzieje).

ECC nie ma tutaj nic do rzeczy.

0

Rozśmieszyłeś mnie z tą kaczuszką :)
Zprubuję to zdebugować jeszcze raz, ale niewydaje mi się aby był jakiś bład, niestety nie mogę dać kodu bo to zadanie z konkursu.

0

Moja rada, zacznij od podstawowych rzeczy:
- kod ma się kompilować bez warningów (opcja -Wall) (to wyłapuje dużo prostych błędów)
- stwórz rożne dane wejściowe (pamiętając o warunkach brzegowych), dla których znasz wynik i debuguj kod dla tych danych
- szukaj różnych głupich literówek, np "=" zamiast "==", albo odwrotnie; "<=" zamiast "<" itd
- okraś kod asercjami (pomaga wykrywać błędy we wczesnym stadium)

Potem możesz spróbować np valgrind-a (pod Linuxem) lub innych narzędzi.

0

Ponieważ to jest kod na konkurs - czyli nie jest długi to radzę napisać jeszcze raz od początku. Ba jeżeli jest długi - tym bardziej :D

0

Mozesz tez postawic data breakpointa na danych, ktore sa wymazywane. Wtedy program zatrzyma sie na instrukcji, ktora to powoduje. Sprawdz czy twoje IDE supportuje data breakpointy.

0
0x200x20 napisał(a):

Mozesz tez postawic data breakpointa na danych, ktore sa wymazywane. Wtedy program zatrzyma sie na instrukcji, ktora to powoduje. Sprawdz czy twoje IDE supportuje data breakpointy.

Visual Studio ma chyba taką funkcję ale nie wiem jak ją zastosowąć, możesz mi podpowiedzieć?

0

Uruchamiasz program w trybie debug. Dajesz zwyklego breakpointa w miejscu gdzie juz tablica nie powinna byc nadpisywana. Dajesz F5, zeby program przeszedl do tego breakpointa. Nastepnie w menu Debug wybierasz New Breakpoint -> New Data Break Point. Otwiera sie menu z opcjami podajesz adres, ktory jest nadpisywany i rozmiar. Klikasz OK. Dajesz F5. Program zatrzyma sie na instrukcji zaraz za ta, ktora spowodowala nadpisanie.
Mozesz sobie przecwiczyc na takim programie:

#include "stdafx.h"
#include <cstring>
int _tmain(int argc, _TCHAR* argv[])
{
	char *arr = new char[20];
	memset(arr, 0, 20);

	for(int i = 0; i <= 20; ++i)
	{
		arr[i] = 1;
	}
	return 0;
}

Tutaj jest nadpisywany o jeden bajt za duzo. Zeby sprawdzic gdzie dajesz breakpointa na for. Puszczasz program. Potem tworzysz nowego data break pointa z addresem arr+20 i liczba bajtow 1. Puszczasz program.

0

Okej, ale błąd leżał w jednej lini kodu, sam zerowałem zmienną i :) 5godzin nad tym siedziałem i dopiero dzisiaj zadziłało

1 użytkowników online, w tym zalogowanych: 0, gości: 1