Bład w kodzie [C++]

Witam.

Jest nowicjuszem w programowaniu w języku C++ i w ogóle w szeroko pojętym programowaniu. Sam w domu uczę się tego, bo ze szkoły niewiele wyniosę. :stuck_out_tongue:

Oto treść zadania:

Napisz program realizujący następujące operacje:

a) wypisanie liczb rzeczywistych wygenerowanych losowo z zakresu [-8,55;26] do tablicy o wymiarach m_x_n (gdzie m i n to liczby naturalne większe od 0, wprowadzone z klawiatury);

b) wypisanie elementów tablicy z podziałem na wiersze;

c) obliczenie sumy tych elementów tablicy, których numer wiersza jest liczbą nieparzystą;

d) zmniejszenie o 2 tych elementów tablicy, których wartość jest ujemna;

e) sprawdzenie, czy wszystkie elementy tablicy są mniejsze od 10.

A oto co udało mi się napisać:

#include 

#include 

#include 


using namespace std;


const int MAX=256;


double losuj(double p, double q)

{

	return p+(double)rand()/RAND_MAX*(q-p);

}


void wypisz(double T[][MAX], int m, int n)

{

	cout << "\nwczytana tablica:" << endl;

	for (int i=0;i
	{

		for (int j=0;j
			cout << T[i][j] << "\t";

		cout << endl;

	}

	cout << endl;

}

double suma(double T[][MAX], int m, int n)

{

	double suma=0;

	for (int i=1;i
		for (int j=0;j
			suma+=T[i][j];

	return suma;

}


void zmniejszenie(double T[][MAX], int m, int n)

{

	for (int i=0;i
		for (int j=0;j
			if (T[i][j]<0)

				T[i][j]-=2;

}


bool sprawdzenie(double T[][MAX], int m, int n)

{

	for (int i=0;i
		for (int j=0;j
			if (T[i][j]>=10) return false;

	return true;

}


int main() {

	int m, n;

	srand(time(NULL));

	cout << "Podaj liczbe wierszy tablicy: ";

	cin >> m;

	cout << "Podaj liczbe kolumn tablicy: ";

	cin >> n;

	double T[m][n];

	for (int i=0;i
		for (int j=0;j
			T[i][j]=losuj(-8.55,26);

	wypisz(T,m,n);

	cout << "Suma elementow, ktorych numer wiersza jest liczba nieparzysta: " << suma(T,m,n) << endl;

	zmniejszenie(T,m,n);

	cout << "Po zmniejszeniu: " << endl;

	wypisz(T,m,n);

	if (sprawdzenie(T,m,n)==1)

		cout << "Wszystkie elementy sa mniejsze od 10" << endl;

	else

		cout << "Nie wszystkie elementy sa mniejsze od 10" << endl;

	system("pause");

	return 0;

}

Błąd jest gdzieś przy pierwszym wywołaniu funkcji wypisz. Używam Dev-C++ 5.3.0.3 jako środowiska. Z góry dziękuję za wyszukanie błędu. :wink:

Pobierasz tablicę mn a oczekujesz tablicy yx256 :stuck_out_tongue:

Masz przekazać wskaźnikiem, albo użyć zmiennych globalnych. Pomijając sam fakt że deklaracja tablicy wg zmiennych nie powinna przejść.

Dlaczego nie powinna? Max jest const. Inna rzecz, że gcc(wiec pewnie i minGW) puści to i bez const.

Tu jest stała, ale mnie chodziło o:

int m, n;

   srand(time(NULL));

   cout << "Podaj liczbe wierszy tablicy: ";

   cin >> m;

   cout << "Podaj liczbe kolumn tablicy: ";

   cin >> n;

   double T[m][n];

Dodane 01.01.2013 (Wt) 16:37

By nie wprowadzać błąd odpaliłem projekt w visualu.

Pierwszy error: rozmiar tablicy musi być stały.

Po poprawieniu, nie można konwertować z double [x][y] na double[][256]

Po poprawieniu działa.

Już wiem na czym polegał mój błąd. Dziękuję za pomoc. Pozdrawiam. :wink:

double T[m][n];

Deklaracja dynamiczna powinna wyglądać mniej więcej tak:

double **T;

T = new double*[n];

for(int i=0; i




Potem jeszcze oczywiście zwolnić pamięć. A ja polecam vectory, na nich kod wyglądałby tak:

[code]#include #include #include #include using namespace std; const int MAX=256; double losuj(double p, double q) { return p+(double)rand()/RAND_MAX*(q-p); } void wypisz(const vector > &T) { cout << “\nwczytana tablica:” << endl; for (int i=0; i { for (int j=0; j cout << endl; } cout << endl; } double suma(const vector > &T) { double suma=0; for (int i=1; i return suma; } void zmniejszenie(vector > &T) { for (int i=0; i for (int j=0; j } bool sprawdzenie(const vector > &T) { for (int i=0; i for (int j=0; j< T[0].size(); j++) if (T[i][j]>=10) return false; return true; } int main() { ios::sync_with_stdio(0); int m, n; srand(time(0)); cout << "Podaj liczbe wierszy tablicy: "; cin >> m; cout << "Podaj liczbe kolumn tablicy: "; cin >> n; vector > T(m, vector(n)); for (int i=0;i wypisz(T); cout << "Suma elementow, ktorych numer wiersza jest liczba nieparzysta: " << suma(T) << endl; zmniejszenie(T); cout << "Po zmniejszeniu: " << endl; wypisz(T); if (sprawdzenie(T)==1) cout << “Wszystkie elementy sa mniejsze od 10” << endl; else cout << “Nie wszystkie elementy sa mniejsze od 10” << endl; cin.sync(); cin.get(); return 0; }

gcc to puści (a wspomniany kod pisany jest pod ten kompilator). Co więcej - taka deklaracja jest dla niego poprawna. Zwolni też po niej pamięć. Pewnie w tak oczywistych przypadkach potrafi korzystać z new i delete za plecami użytkownika ;).

Link: gynvael.coldwind//vx.log: C i lokalne tablice o “zmiennej” wielkości