[C] Načtení 2D pole

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod BEZY 18. 11. 2009 22:02

Zdravim, obracím se na forum, protože si už nevím rady
Potřebuji ze vstupu načíst 2D pole - v podstatě potřebuji načíst n řádků o předem neznámé délce, přičemž nesmím použít datový typ string

takže co mám - deklarace 2D dynamického pole a jeho vytvoření mallocem je mi jasná
načítání řádků do char[] je mi jasné, pokud mám danou délku (například danou na vstupu)

jenže jak načíst 2D pole, když mi uživatel na vstupu předem neřekne, jak veliké bude?

Napadlo mě si alokovat 1D pole char staticky - dejme tomu 255 znaků - poté pomocí fgets do něj načíst a dát limit 255. Obsah 1D pole přiřadit 2D poli na daný index. Jenže mě trápí 2 věci -
1) co když délka řádku bude delší než 255?
2) dopředu neznám ani počet řádků - jak si mám dopředu alokovat prostor pro 2D pole? Nebo lze pole nějak postupně rozšiřovat?

Jsem zvyklý programovat v Pascalu/Delphi, proto mi některé koncepty v C přijdou trochu hůř uchopitelné... každopádně díky za nakopnutí
BEZY
Junior
Uživatelský avatar

Odeslat příspěvekod Falhar 18. 11. 2009 22:33

A jaký je formát vstupních dat?
S tím 1D polem jsi to nejspíš trefil. Pokud neznáte formát dat dopředu, tak je asi nejlepší si to uložit do nějaké dočastné nejlépe dynamické struktury a pak z ní vytvořit tu hlavní strukturu, teda to 2D pole. Co se te dočastné struktury tyče, tak tam by šel použít seznam a nebo na to jít bruteforce a použít malloc / memcpy na zvětšení / skopírování toho 1D pole (nejsem si jistý, jestli to funguje pro 2D pole).
Falhar
Junior

Odeslat příspěvekod BEZY 18. 11. 2009 23:12

vstupní data potřebuji načíst jako znaky, tudíš sem chtěl dát něco jako
char radek[255];
přes fgets načíst do radek
a připojit data nějak do 2D pole
jak se dá pomocí mallocu a memcpy zvětšit pole?
BEZY
Junior
Uživatelský avatar

Odeslat příspěvekod Big Muscle 19. 11. 2009 12:56

pokud je to čisté C a používáš pouze malloc nebo calloc (nikoli operátor new[]), tak na zvětšení pole můžeš použít funkci realloc.

A tady máš už naprogramovaný to, co zřejmě potřebuješ: http://www.cplusplus.com/reference/clib ... b/realloc/
Big Muscle
Mírně pokročilý


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků