Realokace 2D pole (zvetšení již existující matice) v C++ – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Realokace 2D pole (zvetšení již existující matice) v C++ – C / C++ – Fórum – Programujte.comRealokace 2D pole (zvetšení již existující matice) v C++ – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
ondrej39+1
Věrný člen
4. 10. 2014   #1
-
0
-

Ahoj,

jsem tu zase. Dodělávám úkol do školy, kde máme provést realokaci matice.

V hlavním programu si vytvořím novou Matici m1, kterou naplním náhodnými daty (z kódu je patrné, že rozměry matice m1 jsou 3 řádky a 4 sloupce):

	Matice m1(3, 4);
	for (int i = 0; i < 3; i++)
	{
		row = m1[i];
		for (int j = 0; j < 4; j++)
			row[j] = (i + 1) * (j + 4);
	}

Tuto matici poté v hlavním programu měníme (resp. měníme její velikost) pomocí příkazu:

m1.realoc(5, 6);

kde 5 a 6 jsou nové počty řádků a sloupců změněné matice.

Zde je náhled aktuální podoby f-ce realoc pro třídu matice:

void Matice::realoc(int m_new, int n_new)
{

	if ((m_new <= m) && (n_new <= n)) {
		this->m = m_new;
		this->n = n_new;
		p = (int**)realloc(p, (m * n) * sizeof(int));
	}
	else
	{		
			Matice mat(m_new, n_new);

			for (int i = 0; i < m_new; i++)
			{
				for (int j = 0; j < n_new; j++)
				{
					mat[i][j] = 0;
					for (int i = 0; i < m; i++){
						for (int j = 0; j < n; j++){
							mat[i][j] = p[i][j];
						}						
					}
				} 
			}
	}	
}

Pokud při realokaci zadám rozměry menší, nebo rovné matici původní (tedy v našem případě <=3 a <=4, normálně proběhne operace:

p = (int**)realloc(p, (m * n) * sizeof(int));

problém nastává tehdy, když nastavím rozměry větší (např. 5, 6, jako v tom příspěvku). Zjistil jsem, že cykly mám asi poskládané dobře, protože po vypsání mat[i][j] se mi objeví toto:

Připojen obrázek.

což souhlasí (původní matice je 3x4, nová je 5x6, poslední dva řádky a sloupce jsou tedy naplněné nulami), ale problém je ten, že když použiji fci tiskMatice(&m1);, tak se mi vypíše matice původní (tedy nezměněná.

Potřeboval bych vědět, jak f-ci realoc změnit tak, abych z ní tu novou zvětšenou matici dostal a ona se vypsala napsáním tiskMatice(&m1).

Děkuji za odpovědi.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
KIIV
~ Moderátor
+43
God of flame
4. 10. 2014   #2
-
0
-

nebude to tim, ze se hrabes v nove vytvoreny matici, a tu puvodni vlastne nemenis? (a ty data samozrejme ztratis)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondrej39+1
Věrný člen
5. 10. 2014   #3
-
0
-

#2 KIIV
Ahoj,

toho jsem si vědom. Matice mat je pouze pomocná. Když se podíváš na tu první podmínku, tam probíhá realokace pomocí realloc a následně se výsledek vloží do proměnné p.

Svým selským rozumem jsem tedy došel k názoru, že potřebuji dostat do proměnné p tu pomocnou matici mat.

Ukazatelům moc nerozumím, potřeboval bych (předpokládám) smazat aktuální obsah matice p, smazat i matici p a následně vytvořit novou matici p o rozměrech pomocné matice mat a tuto matici naplnit hodnotami z matice pomocné.

Ideálně KIIVe, pokud bys věděl jak na to a poslal mi přímo kód, jak se to dělá, budu ti velmi vděčný, protože sám na ten kód určitě nepřijdu :D.

EDIT: Jinak jak je v tom screenu v prvním příspěvku výpis té matice upravené, tu jsem samozřejmě nevyvolal f-cí tiskMatice(&mat) v hlavním programu, ale tak, že jsem přímo do f-ce realoc natvrdo doplnil cout << mat[i][j];

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
KIIV
~ Moderátor
+43
God of flame
5. 10. 2014   #4
-
0
-

Kdyz na to tak koukam, tak mas mozna problem i s tim vicerozmernym polem ukazatelu.. to zmensis ale pak uz nezmensujes ty jednotlivy radky (hlavne o ty zruseny pointery uplne prijdes).. + nealokujes jen pocet radku ale na celkovy pocet prvku... a tak dale.. 

Taky pokud pouzivas na to pole pointeru new a pak pouzijes realloc, tak to bude nejspis delat neplechu..

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondrej39+1
Věrný člen
5. 10. 2014   #5
-
0
-

KIIVe, tak jsem se nakonec rozhodl celý problém vyřešit jinak a kód úplně předělat. Každopádně díky za odpověď.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
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, 116 hostů

Podobná vlákna

Realokace 2D pole v C — založil Melouch

Zvetseni pole stuktur — založil mihajlovic11

Metoda na zvetseni pole — založil Pavel

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ý