Ukazatel na structuru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ukazatel na structuru – C / C++ – Fórum – Programujte.comUkazatel na structuru – C / C++ – Fórum – Programujte.com

 

Mirek Braho0
Stálý člen
15. 5. 2007   #1
-
0
-

čusík lidi, jsem tu zas po dlouhé době. Proč mi nefunguje přiřazení hodnoty řetězce do pole ve struktuře? Tedy kód:



struct ryba {
char druh[10];
int vaha;
double delka; };

int main()
......
ryba * kapr = new ryba;
(*kapr).druh="Kaprik";

cout <<(*kapr).druh;
Přiřazení zbývajících hodnot, což jsou int a double funguje (proto to sem nepíšu) stejným způsobem.

Ale zajímavý, že tohle funguje:

cin >>(*kapr).druh;


Diky za vysvetleni.

Kompilator pise tuto chybu:

incompatible types in assignment of `const char[7]' to `char[10]'

Nahlásit jako SPAM
IP: ...–
DavesMan
~ Anonymní uživatel
26 příspěvků
15. 5. 2007   #2
-
0
-

kdybys v té struktuře měl místo char druh[10] jen ukazatel char *druh, tak by to šlo. Takhle musíš použít něco typu strcpy.
Jinak, slyšel už jsi o operátoru -> .... místo hrůzy: (*kapr).druh se ve slušné společnosti píše:

kapr->druh = "něco";

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
15. 5. 2007   #3
-
0
-

:) Jo znam oba. Ale neznam co se píše ve "slušné společnosti" :) Dík za osvětlení a vysvětlení.

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
16. 5. 2007   #4
-
0
-

Lidičky ještě něco ke strukturám. Mam jednoduchou strukturu, ale nejde mi pomocí cin.getline() zadat nazev. Tady je kod:

using namespace std;


struct moje {
char * nazev;
float prumer;
float vaha;
};

int main()
{
moje test;

cout <<"Zadejte nazev vyrobce: ";
cin.getline(test.nazev, 1000);
cout <<"Zadejte prumer pizzy: ";
cin >>test.prumer;
cout <<"Zadejte vahu pizzy: ";
cin >>test.vaha;

cout <<test.nazev<<endl;
cout <<test.prumer<<endl;
cout <<test.vaha;

cout<<endl;
system("PAUSE");
return 0;
}


Kompilator nehlasi zadnou chybu a normalne to nabehne, ale jakmile zadam nazev a zmacknu enter tak to problikne a zavre se okno :/ Proc takhle nejde zadavat ten nazev? Kdyz ho dam rucne, tj. test.nazev="Bla bla bla"; tak to funguje.

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
16. 5. 2007   #5
-
0
-

Len tak v rychlosti. nazev je len pointer. Musis mat aj alokovane miesto..



using namespace std;

#define LINE_SIZE 1000

struct moje {
char nazev[LINE_SIZE];
float prumer;
float vaha;
};

int main()
{
moje test;

cout <<"Zadejte nazev vyrobce: ";
cin.getline(test.nazev, LINE_SIZE);
cout <<"Zadejte prumer pizzy: ";
cin >>test.prumer;
cout <<"Zadejte vahu pizzy: ";
cin >>test.vaha;

cout <<test.nazev<<endl;
cout <<test.prumer<<endl;
cout <<test.vaha;

cout<<endl;
system("PAUSE");
return 0;
}


Nahlásit jako SPAM
IP: ...–
shutdown -h now
Mirek Braho0
Stálý člen
16. 5. 2007   #6
-
0
-

No já právě myslel že udělám ten pointer, a pak tou hodnotou test.nazev="bla bla" na tu adresu hodim data, asi to chápu špatně.

Ale když funguje test.nazev="ahoj"

tak proc nefugnuje cin.getline(test.nazev, 100) ?? Vždyt je to to samý, akorát se to nezadává napevno, ale ty data to tam načte z klávesnice ne? Vim že pro pointer musí bejt alokovaný místo. Ale jak to, že to test.nazev="ahoj" potom funguje?

Jde mi jen o to (jako obvykle) abych nemusel zadávat pevnou délku (to LINE_SIZE). Je to prostě vlastnost kterou upřímně nesnáším, nikdy proste nemůžu vědět jak dlouhej ten vstup bude, tak jak mam vědět jestli tam dát [50], [100] nebo [500] nebo [1000] ?? Bud to bude zbytečně velký a zabírá to místo, a nebo to bude krátký a název tam nebude celej. Vždy se tomuto zadávání snažím vyhýbat právě pomocí ukazatelů :/

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
17. 5. 2007   #7
-
0
-

No bohuzial u C/C++ si budes musiet zvyknut definovat dopredu velkost. Totizto problemom je to ako getline() funkcia pracuje. Ta sama o sebe nevytvara, nealokuje mieto pre nacitany riadok. Inac by nepotrebovala ziaden parameter a return by bol pointer.Bohuzial funkcia getline() potrebuje uz alokovane miesto kam data nacita. Preto jej parametre su ukazovatel na toto miesto a velkost.

Dalsia vec test.nazev="ahoj" je nieco ine. Totizto test.nazev je hodnota pointra. Priradenim len povies kam ten pointer ukazuje. Takto napisane "ahoj" prekladac zoberie, a alokuje uz miesto na zasobniku. Problem je vsak rozsah platnosti. Ten konci v momente kedy je funkcia ukoncena. Preto getline() to nemoze vo svojom vnutry urobit takto jednoducho. Zober si priklad:




struct moje {
char* nazev;
float prumer;
float vaha;
};

void moja_fcia(moje* m)
{
cout << m->nazev << endl;
m->nazev="ahoj 2";
}

int main()
{
moje m;
m.nazev = "ahoj 1";

//tato funkcia by podla teba mala zmenit text z ahoj 1 na ahoj 2.
moja_fcia(&m);
cout << m.nazev << endl; //lenze to je chyba, pretoze platnost "ahoj 2" vyprsi po ukonceni moja_fcia() a tympadom je to ukazovatel na neplatne miesto
}


To je vlastne dovod preco to nieje to iste. Snad som to napisal pochopitelne. Verim ze este Jura doplni a vysvetli lebsie ;)

Nahlásit jako SPAM
IP: ...–
shutdown -h now
Mirek Braho0
Stálý člen
29. 5. 2007   #8
-
0
-

Tak diky moc za vysvetleni, ale porovnal jsem to s prikladem kterej delam ted a zas mi tam neco nejde, ty struktury jsou desny. Zepta se to na pocet aut a ty pak zadavam. Jenze kdyz zadam 1 auto, tak to po zadani nazvu spadne. Kdyz zadam 2 auta, tak to vezme obe hodnoty a pri zadani jmena druheho auta to zas spadne. Myslim ze je to chyba toho cin >> jak nechava ten enter ve fronte. Ale zkousel sem to odmazat tim cin.get() a stejne to nepomohlo, tak kde je chyba? :( ... Kod:

#include <iostream>


using namespace std;

struct automobil {
char * nazev;
int rok;
};
int a;

int main()
{
cout <<"Kolik vozu do katalogu chcete pridat? ";
cin >>a;
cin.get();

automobil * vuz = new automobil[a];

for (int b=0; b<a; b++)
{

cout <<"\nCar #"<<b+1<<":"<<endl;
cout <<"Please enter the make: "; cin.getline(vuz.nazev,80);
cout <<"\nPlease enter the year made: "; cin >> vuz.rok; cin.get();
}

cout <<"Here is your colection:\n";
for (int c=0; c<a; c++)
{
cout <<vuz[c].rok<<"\t"<<vuz[c].nazev<<endl;

}

cout<<endl;
system("PAUSE");
return 0;
}


A taky by me zajimala jedna vec. Kdyz tu structuru vlastne tvorim pomoci ukazatele a pomoci new (je snad jedno ze je to pole structur ne?) tak proc pak nefunguje volani clenu stylem vuz[c]->nazev kdyz by to mel bejt ukazatel ne? Na zacatku je preci uvedeno automobil * vuz = new automobil. Díky za vysvětlení.

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
31. 5. 2007   #9
-
0
-

Už to mám vyřešený :) Podobnej problém jako zde výše uvedený.

Nahlásit jako SPAM
IP: ...–
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, 67 hostů

Podobná vlákna

Ukazatel this — založil LPG1995

Ukazatel — založil porod

Ze by ukazatel ... — založil Marecek

Ukazatel na port — založil Nykodym

Ukazatel rozdil — založil petr

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ý