Záhadný problém – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Záhadný problém – C / C++ – Fórum – Programujte.comZáhadný problém – C / C++ – Fórum – Programujte.com

 

Petr
~ Anonymní uživatel
746 příspěvků
9. 5. 2010   #1
-
0
-

Zdravím, mám opravdu velmi záhadný problém s C++. Mám třídu Directory, která obsahuje metody AddDirectory(char *name), která přidá do adresáře nový adresář (de facto podadresář). Dále mám metodu PrintList(), která vypíše všechny adresáře, které aktuální adresář obsahuje. Všechno funguje jak má, pokud kód vypadá takto:

currentPath->AddDirectory("Slozka1");	// currentPath je ukazatel na aktuální adresář

currentPath->AddDirectory("Slozka2");
currentPath->AddDirectory("Slozka3");
currentPath->AddDirectory("Slozka4");

currentPath->PrintList();


Vypíše se toto:
Slozka1 <dir>
Slozka2 <dir>
Slozka3 <dir>
Slozka4 <dir>

Pokud kód napíšu takto:

char *name[30];


while (gets(name) != string("exit"))
currentPath->AddDirectory(name);

currentPath->PrintList();


Vypíší se adresáře, nicméně všechny se jmenují exit. Přitom žádný adresář s názvem exit se nevytváří, když jsem celý program prokrokoval, do konstruktoru adresáře se vždy předá správný název, nicméně při vypisování se záhadně u všech objeví, že name je exit.
Opravdu nemám nejmenší tušení proč se to děje, protože pokud adresáře vytvářím "natvrdo" v kódu, funguje to. Pokud někdo máte jakýkoliv nápad, budu moc rád za odpověď. Já osobně podezřívám funkci gets, ale zkoušel jsem i cin.get. Opravdu jsem z toho zmatený.

Nahlásit jako SPAM
IP: 78.80.225.–
KIIV
~ Moderátor
+43
God of flame
9. 5. 2010   #2
-
0
-

jak "prekvapive", kdyz ten retezec prepises...

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Petr
~ Anonymní uživatel
746 příspěvků
9. 5. 2010   #3
-
0
-

To KIIV : No samozřejmě že ho přepíšu, ale přece když běží while poprvé, tak se do proměnné name uloží nějaký název a následně se vytvoří adresář s tímto názvem. Proč poté ale při výpisu (PrintList) má jméno exit?

Nahlásit jako SPAM
IP: 78.80.225.–
KIIV
~ Moderátor
+43
God of flame
9. 5. 2010   #4
-
0
-

jenze ty zapominas asi na to, ze predavas jen ukazatel.. a uvnitr tridy si ho nikam jinam neulozis

jako kdyby si byl developer, postavil barak rekl objednateli barak je na tydle adrese, a hned na tom samem miste postavil dalsi barak.. (a zboural puvodni) a pak takhle pokracoval dokola .. no a co se stane, kdyz majitele prijdou?
bude tam posledni barak, a hromada majitelu krasneho papirku s adresou, kde maj mit ten svuj

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Petr
~ Anonymní uživatel
746 příspěvků
9. 5. 2010   #5
-
0
-

To KIIV : Ano, chápu, ale ve výše uvedeném kódu jsem "natvrdo" vytvořil 4 adresáře a fungovalo to. Možná jsem natvrdlý, ale pokud víte jak to mám udělat, mohl byste to sem prosím napsat?

Nahlásit jako SPAM
IP: 78.80.225.–
KIIV
~ Moderátor
+43
God of flame
9. 5. 2010   #6
-
0
-

natvrdo znamena "adresar 1" "adresar 2" "adresar 3" "adresar 4"
tim si rekl prekladaci udelej misto pro retezec adresar 1 a vrat na nej ukazatel...
to same pro zbyle 3... kazdej ma svoje misto a kazdej ma svoji vlastni adresu!!!

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Petr
~ Anonymní uživatel
746 příspěvků
9. 5. 2010   #7
-
0
-

To KIIV : Možná už vám začínám rozumět. Mohl byste mi tedy poradit co s tím?

Nahlásit jako SPAM
IP: 78.80.225.–
KIIV
~ Moderátor
+43
God of flame
9. 5. 2010   #8
-
0
-

a samozrejme ze vim jak to udelat... rika se tomu alokace dynamicke pameti, zkopirovani retezce (a urcite ne pomoci operatoru = ), a na konci samozrejme tento kazdy retezec musis taky uvolnit...

nebo pokud nejsi limitovan nejakou pitomo restrikci ve stylu "skolni uloha, kde nesmi byt uzita trida string" tak pouzij string misto char *

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Petr
~ Anonymní uživatel
746 příspěvků
9. 5. 2010   #9
-
0
-

To KIIV : String použít můžu, to je má volba. Dobrá, zkusím použít string, ale už dopředu vím, že to bude "porod".

Nahlásit jako SPAM
IP: 78.80.225.–
KIIV
~ Moderátor
+43
God of flame
9. 5. 2010   #10
-
0
-

nemel by byt porod..

ve tride hodis string name;
vypis v pohode cout << name ;
a prirazeni funguje...

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Petr
~ Anonymní uživatel
746 příspěvků
9. 5. 2010   #11
-
0
-

To KIIV : Všude, kde jsem měl char *name, jsem to přepsal na string name. Kompilace proběhla bez problému, ale neměl jsem ještě napsanou tu smyčku s funkci gets. Ta mi teď právě nejde napsat, respektive zkompilovat.

Nahlásit jako SPAM
IP: 78.80.225.–
Petr
~ Anonymní uživatel
746 příspěvků
9. 5. 2010   #12
-
0
-

To Petr : Tak to vypadá, že se to povedlo. Snad se později nevyskytne nějaká chyba, ale zatím to funguje. Opravdu díky moc za rady, známým, kterých jsem se na to ptal, jsem nabízel flašku a nikdo nevěděl. Přitom to byla docela školácká chyba. Takže ještě jednou díky moc.

Nahlásit jako SPAM
IP: 78.80.225.–
KIIV
~ Moderátor
+43
God of flame
9. 5. 2010   #13
-
0
-

jestli musis nacitat celej radek tak: getline(istream &,std::string &) z knihovny string

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 42 hostů

Podobná vlákna

Záhadný error — založil selkir

Zahadny LIMIT — založil polonium

Problém — založil Jano

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý