[C++] Zerowanie tablicy wielowymiarowej.

0

Witam.
Mam mały problem z wyzerowaniem tablicy trzy-wymiarowej. Program się kompiluje poprawnie, ale w momencie gdy chce go uruchomić to wyskakuje błąd, poniżej mój kod:


#include "stdafx.h"
#include <iostream>
using namespace std;

void zerownik(double tab[10][5][30]);
int _tmain(int argc, _TCHAR* argv[])
{
	double tablica[10][5][30];

	zerownik(tablica);

	cout << tablica << endl;
	return 0;
}
void zerownik(double tab[10][5][30])
{
	for(int i = 0; i < 10 ;i++)
	{
		for(int n = 0; n < 5; n++)
		{
			for(int m = 0; m < 30; m++)
			{
				tab[i][n][m] = 0;
			}
		}
	}
}

Debugger również wypluwa błąd, 7 linia, "access violation", gdyby ktoś mógłby mi powiedzieć, dlaczego tak się dzieje, to byłbym bardzo wdzięczny.

Pozdrawiam

1

Na pewno tak ma być?

for(int n = 0; i < 5; n++)
</cpp>
1

zamiast n masz w warunku drugiej pętli i

0

Prawie umarłem ze śmiechu. Literówka, a tyle problemów może sprawić ^^
Dzięki serdeczne za pomoc.

Pozdrawiam

Edit: Dobra, niby teraz wszystko powinno być, wyzerowane, ale gdy wywołuje

cout << tablica << endl; 

to za każdym razem otrzymuje inny wynik, różny od zera. Dlaczego?

1

Bo tablica to tak naprawde wskaźnik na pierwszy element tej tablicy w pamięci. W ten sposób

cout << tablica << endl;

wyświetlasz jedynie adres tego elementu w pamięci, a on za każdym uruchomieniem programu jest inny.

0

@prajmus, Macron
A no tak, oczywiście. Że też wcześniej o tym nie pomyślałem. Wybaczcie moją niewiedzę, dopiero zaczynam swoją przygodę z programowaniem.

Pozdrawiam

0

tablice możesz zerować podczas inicjalizacji:

int main()
{
    int tab[5][10][20] = { 0 };

    for( int i = 0; i < 5; ++i )
        for( int j = 0; j < 10; ++j )
            for( int k = 0; k < 20; ++k )
                std::cout << tab[i][j][k] << " ";
    return 0;
}
0

A to przypadkiem nie jest tak, że gdy inicjalizujesz tablice, to nawet gdy podasz wartości tylko kilku obiektów spośród tych składających się na tablicę (ba, nawet jednego, ale koniecznie podczas inicjalizacji) , to reszta zostania zainicjalizowana zerami, bez względu na to, gdzie jest adresowana? No chyba, że źle interpretuje to, co w "Symfonii C++" jest napisane.

EDIT: A jednak jest tak jak mówię ja, a przeze mnie "Symfonia C++" ^^, bez względu na to czy tablica będzie zainicjalizowana lokalnie czy globalnie, jeśli chociaż jednemu elementowi nadamy jakąś wartość podczas tej inicjalizacji, reszta będzie zapełniona zerami. Dowód:

#include "stdafx.h"
#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
	int tablica[30] = {1,2,3};
	int *wsk = tablica;

	for(int i = 0; i < 30; i++)
	{
		cout << *wsk++ << "\t";
	}
	return 0;
}
0

@newbier masz rację wystarczyłoby napisać:

int tab[5][10][20] = {};

i miałbyś same 0.

0

oczywiście macie rację, a tablice globalne są automatycznie zerowane.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.