Dvojrozměrné dynamické pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dvojrozměrné dynamické pole – C / C++ – Fórum – Programujte.comDvojrozměrné dynamické pole – C / C++ – Fórum – Programujte.com

 

Radim920
Newbie
17. 3. 2009   #1
-
0
-

Mám takovej primitivní problém a nikde jsem nenašel řešení. Potřebuju přistupovat k dvojrozměrnému dynamickému poli, ale nemůžu přijít jak na to.

Ukázka:

int **Priklad = (int **) new int [10][10];

Priklad[2][0] = 10; //zde se program zhroutí
Předem děkuji za odpovědi.

Nahlásit jako SPAM
IP: 88.146.188.–
Quiark0
Věrný člen
17. 3. 2009   #2
-
0
-

Vytvořil sis seznam řádků, ale ještě musíš vytvořit každej řádek . přidej si něco takového:



for (int i = 0 až do 10 třeba) {
Priklad[i] = new int[10];
}


a pak to taky nezapomeň podobným způsobem smazat.

Nahlásit jako SPAM
IP: 89.102.6.–
KIIV
~ Moderátor
+43
God of flame
17. 3. 2009   #3
-
0
-

musis nejdriv naalokovat jeden rozmer a pak pro kazdy "radek" jeste ten druhej rozmer

neco jako priklad = (int **) new int[10]; // tim si nejsem ale uplne jist :D znam spis malloc
a pak pro kazdej radek ...
priklad[0] = new int [10]; ...

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Quiark0
Věrný člen
17. 3. 2009   #4
-
0
-

Ten new bude asi takhle:



int **pole = new int*[10];


tedy je to deset prvků typu int*, tedy 10x jedno pole. Všimněte si taky, že by tam nemělo být to přetypování, to se dělá jen u mallocu.

Nahlásit jako SPAM
IP: 89.102.6.–
Radim920
Newbie
18. 3. 2009   #5
-
0
-

nevíte jak mám napsat tu dealokaci? spackal jsem to takhle, ale nějak to nefunguje.

Hlásí se chybovka:
Runtime Error!
This application has requested the Runtime to terminate it in an unusual way. ...

  TPolicko **Mriz = new TPolicko*[PocetPoliX];

for (int i=0; i<PocetPoliX; i++) {
Mriz[i] = new TPolicko[PocetPoliY];
}

...

for (int i=0; i<PocetPoliX; i++) {
delete [] Mriz[i];
}
delete [] Mriz;

Nahlásit jako SPAM
IP: 88.146.188.–
Wizard0
Stálý člen
18. 3. 2009   #6
-
0
-

To Radim92 : Hlasi to preto lebo nastala vynimka a ty ju neosetrujes. Skus ju osetrit a vypisat vypis:



try {
// tvoj kod tu!
}
catch (std::exception e) {
stdd:cout << e.what() << std::endl; // vypis vynimky
}

Nahlásit jako SPAM
IP: 85.216.182.–
Radim920
Newbie
26. 3. 2009   #7
-
0
-

V běžným konzolovým programu (Dev-C++) tohle funguje bez problémů, ale v SDL aplikaci, která je taky psána v Dev-C++ se program zničeho nic zhroutí. Při použití operátoru new to dokonce vyvolá chybovou hlášku, kterou jsem popsal v předchozím příspěvku, ačkoliv jsem veškyrý kód obsluhující pole zakomentoval. Program se zhroutí někde při prvním použití fce malloc(). Při použití funkce malloc() se program jen tak ukončí, bez jakéhokoliv podání informace o chybě.

  unsigned int qitem=10;

TPolicko **Mriz;
if ((*Mriz = (TPolicko *) malloc(sizeof(TPolicko) * (qitem))) == NULL) {
fprintf(stderr, "Nedostatek pameti!\n");
}
for (int i=0; i<qitem; i++) {
Mriz[0] = (TPolicko *) malloc(sizeof(TPolicko) * (qitem));
}

Nahlásit jako SPAM
IP: 88.146.188.–
Quiark0
Věrný člen
26. 3. 2009   #8
-
0
-

No tyhle problémy s pamětí jsou obvykle dost podivné - někdy to jde a někdy nejde. Dvakrát/třikrát si zkontroluj všechnu práci s pointery, jestli nezapisuješ někam, kam nemáš. Pokud máš linux, můžeš na to zkusit valgrind, to je docela schopný program na opravování těhle chyb.

Nahlásit jako SPAM
IP: 89.102.6.–
KIIV
~ Moderátor
+43
God of flame
26. 3. 2009   #9
-
0
-

To Quiark : jojo valgrindem se da najit opravdu perfektne jakykoliv neuvolneni pameti a pripadne zasahy mimo .. jako v bejvaly praci kdyz sem musel zjistit proc pada jedna aplikace tak sem taky musel nakonec pouzit valgrind... jinak se to nedalo

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Radim920
Newbie
2. 4. 2009   #10
-
0
-

tak už jsem to vyřešil. díky všem

Nahlásit jako SPAM
IP: 88.146.188.–
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, 41 hostů

Podobná vlákna

Dvojrozmerné pole — založil matcho13579

Dvojrozmerné pole — založil nord

Dvojrozmerne pole — založil programator453

Pole dvojrozmerne — založil CSTA

Dvojrozmerne pole/ matica — založil flack

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ý