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
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
Offline
Zdravím,
a jakým způsobem pole vytváříš? V C++ můžeme mít následující možnosti:
#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;
}Offline
↑ 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
Offline
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:
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?
Offline
↑ 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'
Offline
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:
#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í).
Offline
↑ RePRO:
aha, už vím, ta první alokace, tam budou pointery na tu druhou alokaci, kde už budou skutečné hodnoty, nebo se pletu?
Offline