Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 11. 03. 2012 10:00

ReVolt
Příspěvky: 99
Škola: UPOL
Pozice: Student
Reputace:   
Web
 

Znakové vícerozměrné pole

Ahoj, jak mém správně vytvořit vícerozměrné pole znaků, něco jako čtvercová matice, mělo by to být přes pointery, char **pole, pořád mi to háže nějaké chyby když chci pole naplnit

Díky


http://www.turistickyraj.cz - napsal jsem a spravuji

Offline

 

#2 11. 03. 2012 15:06 — Editoval RePRO (11. 03. 2012 16:31)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Znakové vícerozměrné pole

Zdravím,
a jakým způsobem pole vytváříš? V C++ můžeme mít následující možnosti:

Code:

#include <cstdlib>
#include <iostream>

using namespace std;

const int SIZE = 25;
const int RADKY = 5;
const int SLOUPCE = 5;

int main(int argc, char *argv[])
{
    // 1.
    char *array[SIZE];
    char **p1 = array;
       
    // 2.
    char **p2 = new char*[RADKY];
    
    for (int i = 0; i < RADKY; i++) {
            p2[i] = new char[SLOUPCE];
    }
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#3 11. 03. 2012 15:18

ReVolt
Příspěvky: 99
Škola: UPOL
Pozice: Student
Reputace:   
Web
 

Re: Znakové vícerozměrné pole

↑ RePRO:
musím to mít v céčku, vícerozměrná pole jsme brali jen tak okrajově
myslel jsem že to udělám takto: char **pole a pak tam rovnou naházím hodnoty, ale nějak si s tím nevím rady


http://www.turistickyraj.cz - napsal jsem a spravuji

Offline

 

#4 11. 03. 2012 16:30 — Editoval RePRO (11. 03. 2012 16:33)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Znakové vícerozměrné pole

Zkus to provést prvním způsobem.

U druhého způsobu je operátor new, běžně používaný v C++, v C ho známe jako funkci malloc, která musí být přetypována.

V Tvém případě to bude vypadat takto:

Code:

char **pole = (char **)malloc(velikostPole*sizeof(char *));

Přetypování tedy znamená (char **). Potom přeci budeme mít: (char **) = (char **).

Pokud použijeme toto, co jsme tedy udělali (čeho jsme dosáhli)? A na co nesmíme zapomenout?


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#5 11. 03. 2012 17:12 — Editoval ReVolt (11. 03. 2012 17:42)

ReVolt
Příspěvky: 99
Škola: UPOL
Pozice: Student
Reputace:   
Web
 

Re: Znakové vícerozměrné pole

↑ RePRO:
dobře, takže sem si alokoval paměť do které budu ukládat, ale na konci programu to budu muset uvolnit

díky moc

EDIT: ještě mám jeden problém, přístup k prvkům pole je takový: pole[1][1] -> druhý prvek druhého řádku, nebo je to jinak? a podobným způsobem záznam upravím, třeba: pole[1][1] = 'a'


http://www.turistickyraj.cz - napsal jsem a spravuji

Offline

 

#6 11. 03. 2012 22:09 — Editoval RePRO (11. 03. 2012 22:11)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Znakové vícerozměrné pole

Trošku si to sjednotíme draku. ;-)
Takže, pole[1][1] je opravdu druhý prvek druhého řádku. Akorát pracuješ s ukazateli. Zkus se nad tím trošku zamyslet, jak to je. Jelikož máme pole ukazatelů na ukazatel, tak se musí všechno dělat jakoby podvojně. Na takové věci mám slabší vysvětlovací schopnosti.

V Céčku máme pro alokaci funkci malloc, v C++ operátor new.
V Céčku máme pro uvolnění paměti funkci free, v C++ funkci delete.

No a tady máš jednoduchou kuchařku:

Code:

#include <cstdlib>
#include <iostream>

using namespace std;

const int SIZE = 25;
const int RADKY = 5;
const int SLOUPCE = 5;

int main(int argc, char *argv[])
{
    int i, j;
    // Pole ukazatelů na ukazatel
    char **pole = (char **)malloc(SIZE * sizeof(char *));
    
    // Důležitá inicializace
    for (i = 0; i < RADKY; i++) {
        pole[i] = (char *)malloc(SLOUPCE * sizeof(char));
    }
    
    // Naplnění pole
    for (i = 0; i < RADKY; i++) {
        for (j = 0; j < SLOUPCE; j++) {
            pole[i][j] = 'a';
        }
        printf("\n");
    }
    
    // Změna prvku
    pole[1][1] = 'p';
    
    // Vypíšeme pole
    for (i = 0; i < RADKY; i++) {
        for (j = 0; j < SLOUPCE; j++) {
            printf("pole[%d][%d] = %2c\n", i, j, pole[i][j]);
        }
        printf("\n");
    }
      
    // Uvolníme paměť
    for (i = 0; i < SLOUPCE; i++) {
        free(pole[i]);
    }
    
    // Uvolníme paměť
    free(pole);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Malloc musíme definovat dvakrát, proč?
To samé platí pro free (uvolnění).


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#7 12. 03. 2012 08:55

ReVolt
Příspěvky: 99
Škola: UPOL
Pozice: Student
Reputace:   
Web
 

Re: Znakové vícerozměrné pole

↑ RePRO:
aha, už vím, ta první alokace, tam budou pointery na tu druhou alokaci, kde už budou skutečné hodnoty, nebo se pletu?


http://www.turistickyraj.cz - napsal jsem a spravuji

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson