• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

tablica 2 wymiarowa zamiana kolumn

VPS Starter Arubacloud
0 głosów
318 wizyt
pytanie zadane 1 grudnia 2018 w C i C++ przez jankowa1ski Gaduła (3,560 p.)

Czesc, mam tablice 2 wymiarowa powiedzmy 

int tab[20][10];

no i ustalmy ze pierwsza wsp to kolmny czyli mamy 20 kolumn.

i chcialbym w funkcji  zamienic ze spobą kolumny o numerach a i  b

Jak to zrobic?  Na pewno nie chciałbym zamieniac kazdej wartosci po kolei. To byłoby słabe.

Tablica 2 wymiarowa to chyba taki podwojny wskaznik wiec myslalem ze taki kod zadziała:

int * pomocnicz;
pomocnicz = tab[a];
tab[a]=tab[b];
tab[b]=pomocnicz;

ale nie. Jak można to poprawnie zrobic? i czemu nie tak? w sensie zamiana kolumn to tak jakby  tylko zamienie te wskazniki. Czy nie tak to  działa?

1 odpowiedź

+1 głos
odpowiedź 1 grudnia 2018 przez RafalS VIP (122,820 p.)
edycja 1 grudnia 2018 przez RafalS
 
Najlepsza

Bardzo dobre pytanie. Tablica to nie dokładnie to samo co wskaźnik i to jest jeden z przypadków gdzie można się na tym przejechać.

int t[3][2] = { {1,2},{3,4},{5,6} };
int *ptr = &t[0][0];
cout<<"t[1] = " << t[1] << endl; //wypisze adres
cout << "ptr[3] = " << ptr[3] << endl; //wypisze 3
//petla wypisze 1 2 3 4 5 6
for (size_t i = 0; i < 3*2; i++) {
	cout << ptr[i] << " ";
}
//int **tptr = t; // nie kompiluje sie
int(*tptr)[2] = t; // a to juz tak

Tablica gwarantuje ciągłośc pamięci więc tab[2][3] to w pamięci tak jakby tab[6] tylko, że kompilator pilnuje zebyś dostał odpowiedni element gdy napiszesz tab[1][0]. Wiecej info tutaj:

https://stackoverflow.com/questions/2565039/how-are-multi-dimensional-arrays-formatted-in-memory

A co do samego problemu to tak. Musisz przepisywać cale kolumny. No chyba, że zaalokujesz to ręcznie jak tablice wskaźnikow na tablice:

	constexpr int n = 3, m = 2;
	int **t2d = new int*[n];
	for (size_t i = 0; i < n; i++){
		t2d[i] = new int[m];
	}
	t2d[0] = t2d[2]; // mozna podmieniac kolumny

Jako ciekawostka z języka C:

int(*tab)[2] = malloc(sizeof(int)*2*3);

w ten sposób mamy tablice [3][2] zaalokowaną na stercie.

I jeszcze bardzo fajna stronka do ogarniecia skomplikowanych konsturkcji ze wskaznikami w stylu int (*t)[3]:

https://cdecl.org

komentarz 1 grudnia 2018 przez jankowa1ski Gaduła (3,560 p.)
Dzieki
komentarz 1 grudnia 2018 przez monika90 Pasjonat (22,940 p.)

Tablica to nie dokładnie to samo co wskaźnik

Tablica to w ogóle coś innego niż wskaźnik.

cout<<"t[3] = " << t[3] << endl; //wypisze adres

UB

cout << "ptr[3] = " << ptr[3] << endl; //wypisze 3

 tu też

//petla wypisze 1 2 3 4 5 6

for (size_t i = 0; i < 3*2; i++) {

    cout << ptr[i] << " ";

}

i tu też

komentarz 1 grudnia 2018 przez RafalS VIP (122,820 p.)
edycja 1 grudnia 2018 przez RafalS
No UB, UB, ale przynajmniej UB z tego gatunku, że standard języka nie określa tego zachowania, aczkolwiek większość popularnych kompilatorów implementuje ten standard tak, że to działa :P

Nie oznacza to oczywiście, że kiedykolwiek użyłbym takich szemranych zabaw na gołej pamięci w kodzie innym niż czysto przykładowy.

Z czystej ciekawosci. Czy standard gwarantuje, że int t[2][2] to będą 4 inty ułożone jeden po drugim w pamięci, bo wszystko na to wskazuje, ale są to domysły na podstawie  podstawie zabawy z kompilatorem i komentarzy na stackoverflow a nie paragraf w standardzie jezyka? I co googlować, żeby ten paragraf znaleźć?
komentarz 1 grudnia 2018 przez monika90 Pasjonat (22,940 p.)

Standard gwarantuje że sizeof(T[n]) == n*sizeof(T) z tego by wynikało że muszą być jeden po drugim: http://eel.is/c++draft/expr.sizeof#2

A tu http://eel.is/c++draft/dcl.array#1 jest że:

An object of array type contains a contiguously allocated non-empty set of N subobjects of type T.

Podobne pytania

0 głosów
3 odpowiedzi 647 wizyt
pytanie zadane 17 listopada 2018 w C i C++ przez KuS018 Nowicjusz (180 p.)
0 głosów
1 odpowiedź 2,792 wizyt
pytanie zadane 15 października 2017 w C i C++ przez StudzeKisiel Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 169 wizyt
pytanie zadane 17 października 2015 w C i C++ przez 0xf Dyskutant (8,180 p.)

92,963 zapytań

141,928 odpowiedzi

321,161 komentarzy

62,297 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...