Problém s dvojrozmerným poľom – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s dvojrozmerným poľom – C / C++ – Fórum – Programujte.comProblém s dvojrozmerným poľom – C / C++ – Fórum – Programujte.com

 

gaben0
Stálý člen
25. 3. 2009   #1
-
0
-

Potreboval by som vytvoriť dvojrozmerné pole, pričom veľkosť jedného rozmeru by bola zadaná užívateľom...čiže vyzerá to takto:



int n;
cout << "Zadajte N = ";
cin >> n;

double pole[n][3];

Kompilátor mi však píše, že očakáva konštantnú hodnotu...ako to vyriešiť?

Nahlásit jako SPAM
IP: 85.237.26.–
C, C++
KIIV
~ Moderátor
+43
God of flame
25. 3. 2009   #2
-
0
-

dynamicka alokace

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Laďas
~ Anonymní uživatel
12 příspěvků
25. 3. 2009   #3
-
0
-

Tady je fce která vrátí ukazatel na dvojrozměrné pole, které alokuje a vyplní ho hodnotou
zadanou jako parametr. Rozměry toho pole jsou zadány také jako parametr. Snad to pomůže...



long ** alokujPoleLong(const long pocetRadku, const long pocetSloupcu,const long hodnota=0)
{

long ** pole = new long*[pocetRadku];
for (long i = 0; i < pocetRadku; i++)
{
pole[i] = new long[pocetSloupcu];
for (long j = 0; j < pocetSloupcu; j++)
{
pole[i][j] = hodnota;
}
}
return pole;
}

Nahlásit jako SPAM
IP: 88.100.12.–
gaben0
Stálý člen
27. 3. 2009   #4
-
0
-

Áno, dikes pomohlo to. Ešte pár otázok...
Čo znamenajú tie dve hviezdy za sebou(**)?
Ako vkladať hodnoty do poľa? Tak isto ako do statického poľa? (pole[x][2] = hodnota;) A keďže sa pri alokácií používa "new" netreba na konci programu uvoľniť zabranú pamäť príkazom delete *pole;?

Nahlásit jako SPAM
IP: 85.237.31.–
C, C++
Quiark0
Věrný člen
27. 3. 2009   #5
-
0
-
Nahlásit jako SPAM
IP: 89.102.6.–
gaben0
Stálý člen
3. 4. 2009   #6
-
0
-

Stále neviem pochopiť ako vložiť hodnoty do toho poľa...napríklad...mám vytvorené takéto dvojrozmerné dynamické pole:



int **pole = new int*[n];
for(int i = 0; i < n; i++)
pole[i] = new int[3];


Do tohto poľa potrebujem vložiť hodnoty nasledovným spôsobom, no nefunguje to...


for (int i = 0; i < n; i++)
{
cin >> b;
cin >> c;
pole[i-1][1] = 1;
pole[i-1][2] = b;
pole[i-1][3] = c;
}


A ešte k delete...môže to byť takto?


for(int i = 0; i < a; i++)
delete [] pole[i];
delete *pole;

Nahlásit jako SPAM
IP: 85.237.3.–
C, C++
Grungy0
Super člen
4. 4. 2009   #7
-
0
-

Jasné že to nefunguje kedže pre prvú hodnotu v cykle i=0 to bude vyzerat pole[-1][1]=1 ale prvy prvok pola je pole[0][0] takže kompilátor z toho bude mierne zmätený, takže to skús nejak ošetriť.

Nahlásit jako SPAM
IP: 158.193.98.–
Prvý náznak hlúposti, je pocit geniality.
KIIV
~ Moderátor
+43
God of flame
4. 4. 2009   #8
-
0
-

To Grungy : kompilator by to mohl podle me v klidu skousnout.. akorat to bude segfaultovat :D

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

skousne to, protoze adresove vyrazy podporuji i odcitani... a ani to segfaultit nemusi, zalezi co je na adrese pred zacatkem pole.
napriklad tohle:
int x[2];
int y[2];
x[-1]=1;
nastavi hodnotu y[1] na 1... (jsou-li x a y alokovany po sobe na stacku, kompilator poradi jejich alokace myslim neprohazuje (snad jen kdyz by byly jinych typu, aby usetril misto zarovnavanim))

Nahlásit jako SPAM
IP: 213.226.226.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
KIIV
~ Moderátor
+43
God of flame
4. 4. 2009   #10
-
0
-

To tmi : jj.. v lepsim pripade segfault... v horsim neocekavane chovani :)

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
gaben0
Stálý člen
4. 4. 2009   #11
-
0
-

Fajn, vyzerá to tak, že vkladanie do poľa by už bolo vyriešené...problémy mi ešte robí uvoľňovanie pamäte pomocou delete...mám to takto:

for(int i = 0; i < a; i++)

delete [] pole[i];
delete *pole;

ale počas behu programu mi vyskočí okno s textom:
Debug Assertion Failed!

Line 52
Expression _BLOCK_TYPE_IS_VALID(pHead -> nBlockUse)


//Line 52 je v mojom programe tento riadok:
delete [] pole[i];

Nahlásit jako SPAM
IP: 85.237.30.–
C, C++
KIIV
~ Moderátor
+43
God of flame
4. 4. 2009   #12
-
0
-

prinejhorsim muzes testnout delete [] (pole + 1) ale muze byt chyba jinde


+ nejsem si jist ale nemelo by byt posledni spis delete *pole; -> delete [] pole; ?

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

Tohle je špatně:

delete *pole


to by uvolnilo paměť, na kterou ukazuje pointer, který je na místě, na které ukazuje pole ( * je holt dereference, neboli "jdi po šipce"). Správně je

delete[] pole

Nahlásit jako SPAM
IP: 193.86.140.–
gaben0
Stálý člen
4. 4. 2009   #14
-
0
-

Už mi to celé funguje :) Diky moc za rady všetkým :)

Nahlásit jako SPAM
IP: 85.237.30.–
C, C++
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, 22 hostů

Podobná vlákna

Problém z polom štruktúr — založil me.name

Funkcia s polom — založil lukas.balaz

Problém — založil Dfire

Problém v C — založil Robin

Problém — založil pali6

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ý