Skocz do zawartości
ikhorni

C++ tablic dwuwymiarowe

Rekomendowane odpowiedzi

#include <iostream>

using namespace std;

int main() {

int x = 0;
int y = 0;
cout << "Podaj liczbe wierszy: "; cin >> x;
cout << "Podaj liczbe kolumn: "; cin >> y;

int* suma = new int[y];

int** tab = new int* [x];
for (int i = 0; i < x; i++)
	tab[i] = new int[y];

// use the array

//deallocate the array


for (int i = 0; i < x; i++) {
	for (int j = 0; j < y; j++) { // wprowadzenie liczb do tablic
		cin >> tab[i][j];
	}
}

for (int i = 0; i < x; i++) {
	for (int j = 0; j < y; j++) {
		cout << tab[i][j] << " ";
	}
	cout << endl;
}


for (int rows = 0; rows < x; rows++) {
	for (int columns = 0; columns < y; columns++) {
		suma[columns] += tab[rows][columns];
	}
}
cout << "-----------" << endl;
for (int i = 0; i < y; i++) {
	cout << suma[i] << " ";
}

for (int i = 0; i < x; i++) {
	delete[] tab[i];
	delete[] tab;
}
return 0;

}

 

w visual studio wychodzą mi dziwne wyniki, w online compilerze wszystko jest okej, w visualu pokazuje mi błąd w linijce "suma[columns] += tab[rows][columns];" - Ostrzeżenie C6001: używanie niezainicjowanej pamięci *suma, jak to moge zmienic?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Alokujesz tablicę suma, ale nie zerujesz/inicjalizujesz wartości w niej. Póki tego nie zrobisz, wartości znajdujące się tam są nieokreślone.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

a jest jakis szybki sposob na zerowanie takowej tablicy?

czy moge to zrobic jako for?

 

 

 

for( int i = 0 ; i < x ; i++ )

for( int j = 0 ; j < y; j++ )

tab[j] = 0;

 

czy w tym wypadku wystarczy wyzerować tylko wartości y?

 

for( int j = 0 ; j < y; j++ )

tab[j] = 0;

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ty wiesz lepiej czy zrobiłeś tablicę jednowymiarową, czy dwuwymiarową.

 

Zgaduję że robisz program na jakieś zajęcia - wtedy wszelkie zalecenia na temat tego czego tak naprawdę powinno się użyć nie znajdują zastosowania.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To raczej nie jest odpowiedź na pytanie, jeżeli zastosowałem tablice dwuwymiarową, ale używam tylko tej zmiennej int* suma = new int[y];

do wyznaczenia sumy z kolumn, to czy muszę wyzerować całą tablicę dwuwymiarową, czy tylko y przypisany to zmienne int* suma. Jeżeli tak, czy jest jakiś prosty sposób na zrobienie tego.

 

suma jest jednowymiarowa wiec zeruje tylko ją

 

ale juz sobie poradzilem:P dzieki

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No tylko sumę potrzebujesz zerować - do tab najpierw piszesz wartości, a dopiero potem je czytasz. Także z jej użyciem wszystko jest ok.

 

Prosty sposób to nie używać ręcznej alokacji w ogóle. Patrz - std::vector.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

to nie jest tablica wielo-wymiarowa! tylko tablica wskaźników do typu int!

tab to wskaźnik do wskaźnika typu int

 

 

zamiast pętli można rozdzielić

suma[columns] += tab[rows][columns];

na

int temp = 0;

temp += tab[rows][columns];

suma[columns] = temp;

 

a już na pewno wyświetlać sumę w tej samej pętli co ją obliczasz wtedy tablica pod wskaźnikiem suma będzie nie potrzebna

 

jeszcze ten delete[] tab w pętli jest do chrzanu

 

zęby wyeliminować ręczne zarządzanie pamięcią (delete) używa się smart pointerów z C++11

albo std::auto_ptr z C++98 ale to hard core i przez wiele lat mi to od odradzano oraz w C++17 zostało usunięte ze standardu

zapomniałem dopisać jeszcze cos takiego

int* suma = new int[y]{0};

w c++ 14

Edytowane przez Namonaki

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...