Zdravím, mám pole int pole[3][3], jak udělám abych mohl zapsat zapsat celou řádku najednou v programu? Něco jako pole[3]=[1,1,1];
Fórum › C / C++
Zápis řádky do 2D pole
Zaprvé - proč nepoužít 2D/3D pole? Za další - lze to jen staticky - při initializaci a to pomocí závorek {}...
Totiž toto není 2D pole! To je pole zubaté... Každopádně více dimenzí v C/C++ tuším není - ovšem myslím, že v C++ to nakonec bylo přidáno - přiznávám, nemám přehled. Ale toto není 2D!
#2 Matěj Andrle
Právě že přes pointry to nějak udělat jde. Stejně jako existuje zápis pole[3][2] = 9, tak musí existovat zápis pro celou řádku. A to samé jde i pro trojrozměrné pole. Kdysi jsme to na škole braly, ale je to už dávno a v poznámkach jsem to nenašel
Znovu - více rozměrů dostaneš jedině v jednom []! [,] = 2D, [][] = zubaté pole... A dále - nikdy nikde jsem neviděl dynamické přidání několika proměnných jako jeden řádek v jediném argumentu - krom metody, co to přidala v cyklu... Což je zbytečnost - to je problém, udělat více řádků? (stejně bys pro přehlednost musel wrapovat) Při initializaci si s tím kompilátor poradí - tam můžeš udělat i mnohonásobné naplnění: {{...}, {...},...}, ale pochybuji, že by šlo zapsat dynamicky celý řádek... (myslím něcojako array += {řádek}) Jak jsem psal, určitě by šlo udělat metodu, co to udělá z parametru arrray (insertRow(T*)), či přetížit operátor (zase přidat cyklus), jenže proč cyklit, když se cyklu vyhnout dá?
#5 me.name
Není. Více dimenzí je více dimenzí. Toto je jen zubaté pole! Jak jsem již psal - tuším, že do C++ to bylo přidáno, ale [][] jsou 2 pole, ne jedno! Z logiky - ve 2D musí být všechna pole stejně velká - u [][] můžete každé pole alokovat jinak... A přistupujete přes 2 úrovně - ne jednu...
#6 Matěj Andrle
Je to pole polí
pole
pole1 H H H
pole2 H H H
pole3 H H H H = honota
2D 2 dimenzie 3x3 sirka viska x , y
Podla logiky je aj keby pole bolo 5x3 tiež ma 2 rozmery (aspoň tak ma to učila kniha o žiadnom zubatom nebola mienka)
btw ako teda vypadá 2D pole ?
Více dimenzí přeci stále spravuje jedno jediné pole. Kdežto[][] jsou pole v poli... (Je rozdíl, když má každý prvek více indexů, než když pomocí indexu dostanu celé pole!) Ve 2D nemůžeš doplnit jen jeden index - int[] a dostat tak řádek! Když dám do [][] první index, dostanu pole. Když dám do 2D jeden index, dostanu leda error...
#9 me.name
Už jsem psal - [index1, index2, index3, ...] Pole polí je pole polí. Více dimenzí jen přidává indexy k nalezení prvku... Nevýhodou více dimenzí je, že bez všech indexů nedostaneš prvek, výhodou je snazší alokace atp. (protože vše právě musí být stejné)
#1 Pavelv
Podobny efekt sa da docielit s template funkciami, bohuzial nejde pretazit operator= v globalnom scope.
#include <iostream>
#include <initializer_list>
#include <cassert>
#include <algorithm>
#include <iterator>
template <class T, size_t N>
auto set(T (&array)[N], std::initializer_list<T>&& x)->decltype(array)&{
std::copy_n(
std::begin(x),
std::min(sizeof(array), x.size()),
std::begin(array)
);
return array;
}
template <class T, size_t N, size_t M>
void print(T (&array)[N][M]){
for(auto &x : array){
std::cout << "{";
for(int i : x)std::cout << i << ", ";
std::cout << "}\n";
}
std::cout << "\n";
}
int main(){
int array[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8 ,9}
};
print(array);
set(array[1], {1, 1, 1});
print(array);
return 0;
}
#7 me.name
technicky vzato pole[3][3] je vzdy jen jednorozmerne pole, kde prekladac prepocitava pozici z tech dvou indexu na jeden :
int pole1[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int * pole = pole1[0];
int i;
for (i = 0; i<9; ++i) printf("0x%p %d\n", pole+i, pole[i]);
>>>
0x0x7fff05f8b6d0 1
0x0x7fff05f8b6d4 2
0x0x7fff05f8b6d8 3
0x0x7fff05f8b6dc 4
0x0x7fff05f8b6e0 5
0x0x7fff05f8b6e4 6
0x0x7fff05f8b6e8 7
0x0x7fff05f8b6ec 8
0x0x7fff05f8b6f0 9
a samozrejme:
for (i = 0; i<3; ++i) printf("%d 0x%p\n", i, pole1+i);
>>>
0 0x0x7fffc25786a0
1 0x0x7fffc25786ac
2 0x0x7fffc25786b8
je to velkej rozdil oproti int **ptr ... kde prvni rozmer je pole ukazatelu na int (ktery se musi alokovat) a jednotlive radky se musi alokovat taky (nicmene nemusi byt stejne velke a musis mit nejakou moznost, jak poznat konec)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Zápis do pole — založil dzouk
Délka pole, zápis čísel — založil Korn
PHP array zápis do pole — založil Slim
Nacitani ze souboru a zapis do pole — založil tOreee
Pole s viacerymi hodnotami -zapis, vypis — založil Rudolf
Moderátoři diskuze