Stránka 1 z 1

Dynamické 2D pole

Napsal: 28 lis 2012 00:28
od deffdread
Zdravím,

na střední právě probíráme základy programování a na příští týden máme nepovinný bonusový test, který bych měl rád za dobrou známku, nicméně se trápím s jedním tématem a tím jsou dynamická pole. Moc jim nerozumím a rád bych si na procvičení udělal malý program, kde si do dynamického 2D pole napíšu řádek textu (každý písmeno mi to pošle do jiného sloupce pole), poté odentruju a píšu druhý řádek, atd. s tím, že to 2D pole bude ve tvaru čtverce (kolik sloupců bude v prvním řádku, tolik musí být celkový počet řádků.)

Samozřejmě, jestli se to nikomu vypisovat nechce, nepotřebuji to nutně celé od vás udělat, stačilo by i nakopnout, jak to řešit. Mockrát děkuju.

Re: Dynamické 2D pole

Napsal: 28 lis 2012 08:52
od faraon
V jakém jazyce?

Re: Dynamické 2D pole

Napsal: 28 lis 2012 09:32
od Uziv00
Když se jedná o dynamické pole, pak nechápu počet sloupců podle prvního řádku - co když v druhém bude více písmen než v prvním?
Jinak první vstup - dostanu text, ten rozkouskuju třeba pomocí Do While. V cyklu nechám inkrementovat proměnnou dejme tomu i. Tím dostanu počet písmen v prvním textu a počet sloupců (tedy i řádků). Tím dostanu i počet chybějících dotazů (i-1), takže na vyžádání dalších textů použiji For - Next i-1 krát. Na doplnění do pole už pak nebudeš používat Do While, ale For - Next (i) s tím, že když bude text kratší, tak se doplní prázdný znak a když delší tak se přebývající znaky nedoplní. Snad ti to pomůže.

Re: Dynamické 2D pole

Napsal: 28 lis 2012 12:52
od deffdread
faraon píše:V jakém jazyce?

Jej já úplně zapomněl, klasické céčko.

ITCrowd, děkuju za odpověď. Když v druhém řádku bude více písmen, tak to vyplivne chybu. V podstatě je tam to dynamické pole jen kvůli tomu prvnímu řádku. To rozkouskování mě zprvu nenapadlo, jak se vrátím ze školy, tak si nad tím zkusím sednout.

Re: Dynamické 2D pole

Napsal: 29 lis 2012 11:20
od faraon
ITCrowd ten postup popsal docela pěkně, tak bych jen přidal pár technických termínů, jak bych to řešil já:

Konstanta: (tisíc řádků by snad pro domácí úkol mohlo stačit)

Kód: Vybrat vše

#define MAXDELKA 1000


Deklarace proměnných: (neboli ukazatel na řetězec, a ukazatel na ukazatele na řetězce)

Kód: Vybrat vše

char *vstup,**pole;


Alokace prvního řetězce: (to je pro ten první řádek)

Kód: Vybrat vše

vstup=(char*)malloc(MAXDELKA*sizeof(char)+1)


Alokace pole řetězců: (tohle budou jednotlivé řádky)

Kód: Vybrat vše

pole=(char**)malloc(delka*sizeof(char*))


Připojení bufferu jako prvního řádku: (přece nebudeme alokovat další paměť a kopírovat ho)

Kód: Vybrat vše

pole[0]=vstup;


Alokace paměti pro ostatní řetězce: (s kontrolou chyby)

Kód: Vybrat vše

for (i=1;i<delka;++i)
    if ((pole[i]=(char*)malloc(delka*sizeof(char)+1)))
       pole[i][0]='\0';
    else
       {
       fprintf(stderr,"Nelze alokovat řádek!\n");
       return 1;
       }


A pak už si s tou tabulkou můžeš dělat co chceš:

Kód: Vybrat vše

pole[i][j]=getchar();
...
printf("%s\n",pole[i]);


Nezapomeň ani u předchozích malloc() ohlídat návratovou hodnotu, protože kdyby se nepodařilo paměť alokovat, budeš zapisovat na adresu NULL, a ten program okamžitě spadne na Segmentation fault!

Slušnost je po použití nepotřebnou paměť zase vracet, takže free(), ale to také jde jen pokud v tom ukazateli není NULL...

Re: Dynamické 2D pole

Napsal: 29 lis 2012 11:24
od CZechBoY
jo a bacha na vkládání nuly na konec řetězce, u osmisměrky mi to teď dělalo solidní bordel :D

Re: Dynamické 2D pole

Napsal: 29 lis 2012 11:35
od faraon
Tahle je na začátku, ale s ukončením jsem pro jistotu počítal, kvůli tomu printf, proto to +1 8)

Re: Dynamické 2D pole

Napsal: 29 lis 2012 11:41
od CZechBoY
já jsem měl u tý osmisměrky právě problém s funkcí na přepis CH.. všechno jelo, najednou bylo CH na konci a já měl problém s ukončením toho řetězce :D

nahrazení CH => 2 písmena nahradím 1, vzniká díra 1 bytu za písmenem