Zápis řádky do 2D pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zápis řádky do 2D pole – C / C++ – Fórum – Programujte.comZápis řádky do 2D pole – C / C++ – Fórum – Programujte.com

 

Pavelv0
Stálý člen
11. 8. 2014   #1
-
0
-

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];

Nahlásit jako SPAM
IP: 212.79.110.–
Matěj Andrle+1
Grafoman
11. 8. 2014   #2
-
0
-

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!

Nahlásit jako SPAM
IP: 78.136.164.–
Pavelv0
Stálý člen
11. 8. 2014   #3
-
0
-

#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

Nahlásit jako SPAM
IP: 212.79.110.–
Matěj Andrle+1
Grafoman
11. 8. 2014   #4
-
0
-

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á?

Nahlásit jako SPAM
IP: 78.136.164.–
me.name0
Návštěvník
12. 8. 2014   #5
-
0
-

#4 Matěj Andrle
Nepletie sa ti náhodou C++ a C# ?
int pole[3][3]; je klasické 2D pole !

Nahlásit jako SPAM
IP: 213.151.236.–
Matěj Andrle+1
Grafoman
12. 8. 2014   #6
-
0
-

#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...

Nahlásit jako SPAM
IP: 78.136.185.–
me.name0
Návštěvník
12. 8. 2014   #7
-
0
-

#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 ?

Nahlásit jako SPAM
IP: 213.151.236.–
Matěj Andrle+1
Grafoman
12. 8. 2014   #8
-
0
-

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...

Nahlásit jako SPAM
IP: 78.136.185.–
me.name0
Návštěvník
12. 8. 2014   #9
-
0
-

A ako to 2D pole vypadá? myslím syntax.

Nahlásit jako SPAM
IP: 213.151.236.–
Matěj Andrle+1
Grafoman
12. 8. 2014   #10
-
0
-

#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é)

Nahlásit jako SPAM
IP: 78.136.185.–
vitamin+8
Grafoman
12. 8. 2014   #11
-
0
-

#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;
}
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Matěj Andrle+1
Grafoman
12. 8. 2014   #12
-
0
-

#11 vitamin
Vážně nebude jednodušší metoda "addRow"... :D

Nahlásit jako SPAM
IP: 78.136.185.–
KIIV
~ Moderátor
+43
God of flame
12. 8. 2014   #13
-
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)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 33 hostů

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

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý