SekoryOno to v tej chybě je popsané. Stack overflow znamená, že přetekl zásobník. Zásobník je běžně u procesu nastavený na 1MB. Takže není divu, že to přeteče.
Ono totiž takhle velké "objekty" nelze dávat do zásobníku. Je nutné to alokovat. Nevím, jestli trváš na C++ nebo jen na C. V případě C++ je to jednoduché
#include <vector>
int main(int argc, char *argv[])
{
typedef std::vector<int> RadkaPole;
typedef std::vector<RadkaPole> CelePole;
CelePole pole(1000,RadkaPole(1000,0));
//... a tady se jede dál
}
Zápis nahoře nejprve definuje RadkaPole jako obecný vektor hodnot typu int. Druhý řádek definuje CelePole jako obecný vektor řádek (RadkaPole). Třetí řádek pak vytváří proměnnou pole a to tak, že ji inicializuje na 1000 prvků, z nichž každý prvek (což je RadkaPole) inicializuje jako 1000x hodnota 0.
Pokud bys chtěl jen čistě C, tak tam je to náročnější. Záleží na tom, jak chceš 2D pole implementovat. První varianta je ta, že je to prostě vyhrazený kus paměti, kde se prvky skládají "zleva doprava, zezhora dolu"
Pak musíš alokovat:
int *pole = (int *)malloc(sizeof(int)*1000*1000);
do pole přistupuješ přes přepočet
pole[r * 1000 + c] //kde r je řádek, c je sloupec
Jiná varianta je nadefinovat si prvek ve tvaru jednoho řádku, jako u vektoru
typedef int JedenRadek[1000];
JedenRadek *pole = (JedenRadek *)malloc(sizeof(JedenRadek)*1000);
vlastně jsi založil pole o 1000 prvků, kdy každý prvek má 1000 intů.
Další možnost je vytvoři pole o 1000 ukazatelů na jednorozměrné pole, kde budeš alokovat 1000x pole o 1000 prvků
typedef int *JedenRadek;
typedef JedenRadek *CelePole;
CelePole pole = (CelePole)malloc(sizeof(JedenRadek)*1000);
for (int i = 0; i < 1000; i++)
pole[i] = (JedenRadek)malloc(sizeof(int) * 1000);
Nevýhodou řešení v C je nutnost každou alokaci po skončení práce dealokovat (každý malloc musí mít svůj free). V C++ tohle odpadá. |