Trojrozmerne pole - problem s velkostou – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Trojrozmerne pole - problem s velkostou – C / C++ – Fórum – Programujte.comTrojrozmerne pole - problem s velkostou – C / C++ – Fórum – Programujte.com

 

Smurffy0
Newbie
17. 11. 2007   #1
-
0
-

Mam jeden mensi problem. Mam program a v nom trojrozmerne pole o velkosti 10*9*9, lezne spustim program a hned sa mi napise has stoped working.. Ale ked velkost zmenim na 7*6*6 tak vsetko ide v poriadku, ale ked zvysim velkost o 1 na 8*7*7, tak zas vznika rovnaky problem.

Teraz som z toho magor. Lebo neviem ci sa neda alkovat pamat pre taketo pole, alebo maximalne moze byt len 7*7*7 pole. Budem rad za kazde objasnenie/ vysvetlenie.

Nahlásit jako SPAM
IP: 85.216.157.–
Jura
~ Anonymní uživatel
637 příspěvků
17. 11. 2007   #2
-
0
-

Pokud je to pole alokováno staticky, tak se alokuje na stacku - a ten má omezenou velikost, na Oknech tuším 1MB. Ale nenapsal k tomu nic vic, takže možná to co píšu, se tě vůbec netýka.

Nahlásit jako SPAM
IP: 85.207.192.–
Smurffy0
Newbie
17. 11. 2007   #3
-
0
-

jj alokoval som staticky. Skusim to prepisat na dynamicky. Len myslim si, ze 1MB to mat nebude. To je 900 hodnot, a jedna sa o int pole, cize MB by to nebola mat. Ale mozno na tom nieco bude, kedze padne hned na zaciatku.

Nahlásit jako SPAM
IP: 85.216.157.–
Smurffy0
Newbie
17. 11. 2007   #4
-
0
-

vazne to nejde aj cez staticke? Dynamicke trojrozmerne sa zle robi, zvladnem mozno tak dvojrozmerne, ale trojrozmerne je pre mna moc (som newbie). Neviem ani ci ho dobre alokujem a uz vobec neviem ci ho dobre definujem a spravne volam vo funkciach.

moze byt taketo alokovanie?

int ***alokuj(int riadky, int hlbka, int stlpce) 

{
int ***p, i, j;
p = (int ***) malloc(riadky * sizeof(int **));
for(i=0; i<riadky; i++){
p[i] = (int **) malloc(stlpce * sizeof(int *));
for (j=0; j<hlbka; j++){
p[i][j] = (int *) malloc(hlbka * sizeof(int));
}
}
return p;
}



a takto ho mam definovat v main?

int ***pole;



a takto volat vo funkcii?

nacitaj (pole[N+1][N][N], fr);

Nahlásit jako SPAM
IP: 85.216.157.–
Jura
~ Anonymní uživatel
637 příspěvků
17. 11. 2007   #5
-
0
-

No, je to docela podivné, alokuješ něco kolem 1 kB. Zkus si projít nastavení překladače, jestli tam není možnost navolit velikost zásobníku. A jsi si zcela jistý, že to padá kvůli tomu poli?

Nahlásit jako SPAM
IP: 85.207.192.–
Smurffy0
Newbie
17. 11. 2007   #6
-
0
-

no tak teraz som zistil, ze chyba nebude, v poli, ale skor v jednej z funkcii, ale vazne neviem co moze byt tym problemom



#include <stdio.h>
#include <stdlib.h>
#define N 9


void vypis (int pole[N+1][N][N])
{
int i,j,n;
for (n=1; n<=N; n++){
for(j=1; j<=N+1; j++){
for (i=1; i<=N; i++){
printf ("%d ", pole[j-1][i-1][n-1]);
}
putchar ('\n');
}
putchar('\n');
}
}


int riadok (int pole[N+1][N][N])
{
int i,j,k,n;
for (n=1; n<=N; n++){
for (i=1; i<=N; i++){
for (j=1; j<=N; j++){
for (k=1; k<=N; k++){
if ((pole[j][i-1][n-1])==(pole[0][k-1][n-1])){
(pole[j][i-1][n-1]=0);
}
}
}
}
}
return pole [N+1][N][N];
}


int stlpec (int pole[N+1][N][N])
{
int i,j,k,n;
for (n=1; n<=N; n++){
for (i=1; i<=N; i++){
for (j=1; j<=N; j++){
for (k=1; k<=N; k++){
if ((pole[j][i-1][n-1])==(pole[0][i-1][k-1])){
(pole[j][i-1][n-1]=0);
}
}
}
}
}
return pole [N+1][N][N];
}



int moznosti(int pole[N+1][N][N])
{
int i,j,n;
for (n=1; n<=N; n++){
for (i=1; i<=N; i++){
for (j=1; j<=(N); j++){
if (pole[0][i-1][n-1]==0){
pole[j][i-1][n-1]=j;
}
else{
pole[j][i-1][n-1]=0;
}
}
}
}
return pole[N+1][N][N];
}


int main()
{
FILE *fr;
fr = fopen("CISLA.TXT", "r");
int pole[N+1][N][N];

int i,n;

for (n=1; n<=N; n++){
for (i=1; i<=N; i++){
fscanf(fr,"%d", &pole[0][i-1][n-1]);
}
}


pole[N+1][N][N] = moznosti (pole);
pole[N+1][N][N] = riadok (pole);
pole[N+1][N][N] = stlpec (pole);
vypis(pole);
fclose(fr);
//free ((void*) *pole);
return 0;
}

Nahlásit jako SPAM
IP: 85.216.157.–
Payne
~ Anonymní uživatel
37 příspěvků
17. 11. 2007   #7
-
0
-

int ***alokuj(int riadky, int hlbka, int stlpce) 


{

int ***p, i, j;

p = (int ***) malloc(riadky * sizeof(int **));

for(i=0; i<riadky; i++){

p[i] = (int **) malloc(stlpce * sizeof(int *));

for (j=0; j<stlpce; j++){

p[i][j] = (int *) malloc(hlbka * sizeof(int));

}

}

return p;

}
ma to byt takto, a bude to pole p[riadky][stlpce][hlbka], cize nie ako si to zrejme myslel...

Nahlásit jako SPAM
IP: 217.119.114.–
Smurffy0
Newbie
17. 11. 2007   #8
-
0
-

dik, len stale je tu ten hlavny problem. :/

btw. problem by mal byt vo funkciach. neviem ci ich zle volam alebo su vseobecne zle napisane...

Nahlásit jako SPAM
IP: 85.216.157.–
_k_
Duch
17. 11. 2007   #9
-
0
-

Nemalo by tam byt



typ funkcia (int ***pole) {...}

?

Nahlásit jako SPAM
IP: 195.91.54.–
nickJartin0
Návštěvník
17. 11. 2007   #10
-
0
-

To Smurffy : zkousel jsem ten zdrojovy kod a fungoval mi bez problemu... teda nezkoumal jsem, co presne ma ten program delat, ale po kompilaci probehl az do konce. Testoval jsem to ve VS 2005 na testovacich datech cisla od 1 do 81 vzestupne.
Co pouzivas za kompilator? Jaka mas vstupni data?
Jinak muzes zkusit pouzit jen jednorozmerne pole a index si prepocitavat (pokud se Ti nelibi tri rozmery).
Pokud si skutecne myslis, ze je chyba v nejake funkci tak postupne vypinej kusy kodu pomoci komentaru, dokud nenaleznes misto, ktere dela problem.

Nahlásit jako SPAM
IP: 80.188.253.–
Smurffy0
Newbie
18. 11. 2007   #11
-
0
-

dik vsetkym za help. Tak som sa s tym sral a nakoniec ma troska trklo co napisal _k_ a zmenil som volanie funkcie a na

***pole = moznosti (pole);
a ide to. Kazdopadne nechapem, preco mi to aj pri predoslej definicii strajkovalo

NIckJartin: tiez pouzivam MS VS 2005 express, ale vyhadadzovalo mi to pri n>6 daky bug(nevystvetlitelny problem s volanim funkcie :) ) Kazdopadne teraz ide ok

hehe a teraz som zistil, ze sa mi tymto sposobom dosere prve cislo :O

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

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ý