pole struktur v C++

HackForum

pole struktur v C++#
Opet zdravim spise programatory,mam maly problem ,zkousel jsem si jeden vyukovy priklad a nejak jsem shorel na ukazateli na pole struktur...zde je zdrojak:
ps: narazky typu,ze je to prasarna si usetrete, spis uvitam pripadny rady,jak radkovat atd...

#include <iostream>
#include <cstring>
using namespace std;
char* funkce(void);
struct vozidla
{
char* nazev;
int rok;
};
int main(void)
{
int a;
cout << "Zadejte pocet automobilu" << endl;
cin >> a;
cin.get();
vozidla* auta = new vozidla [a];
int i;
for(i=0;i<a;i++)
{
cout << "Zadejte nazev " << i+1 << ". vozidla" << endl;
char* alokace;
alokace=funkce();
strcpy((auta+i)->nazev,alokace);
delete [] alokace;
}
cout << auta->nazev;
cin.get();
cin.get();
return 0;

}
char* funkce(void)
{
char temp[100];
cin.getline(temp,99);
char* alokace = new char[(strlen(temp)+1)];
strcpy(alokace,temp);
return alokace;
}

Komentar k chybe: chyba se nachazi na radku strcpy((auta+i)->nazev,alokace); kompilator ji samozrejme nevypise,jelikoz neni syntakticka.Pokud pouziju jen strcpy(auta->nazev,alokace); tak vypis funguje , jenze kazdy pruchod cyklem mi ten retezec premaze,proto jsem zkousel posunout pole (auta+i) ovsem to nefunguje...Pri pokusu o vypis z mista (auta+i) program selze...:( Nevite nekdo,jak na to?Pokud mozno se zachovanim stavajicich clenu.Jen me zajima jak udelat abych v ukazateli auta na pole struktur vozidla mohl hybat cleny...u normalniho pole neco jako auta[1].

Za odpoved diky

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 14:33
re: pole struktur v C++#
strcpy((auta->nazev)+i*sizeof(vozidla),a
lokace);

takto to nejde?

----------
Get enlightened!
(odpovědět)
mr.Crow | E-mail | Website2.12.2007 15:22
re: pole struktur v C++#
yop ;) chytrej klucina ;) akorat nvm, proc je to tak slozity... mozna proto,že chci posunout o 1 celou strukturu i s tim členem...
mr.Crow: dovedl bys vysvětlit,proč když auta jsou pole struktur nejde (auta+1) ? vždyť by se to mělo posunout o 1 prvek pole, tedy jednu strukturu nebo ne?
V tom,co jde je bráno (auta->nazev) jako pole...jakto?

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 15:31
re: pole struktur v C++#
Premyslim nahlas: Pole se o jeden prvek posune tak,že se posune o počet bytů posouvaného typu...My nevíme,jak velká je struktura vozidla...narozdíl třeba od int , tak se zeptáme pomocí fce sizeof(vozidla) vynásobíme to počtem prvků, o kolik chceme posunout...
Ale jaktože je (auta->nazev) pole? Pokud bych to bral ,jakože ukazuju na adresu prvku nazev v 1.struktuře a pomoci +i*sizeof(vozidla) se posunu na dalsi prvek nazev ,tedy v druhe strukture, tak bych to chapal...
otazka ovsem je stale,jaktoze (auta->nazev) je pole?

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 15:37
re: pole struktur v C++#
alf0nz: to cos napsal mi kompilator zhodnotil,jako :
32 C:\Dev-Cpp\z.cpp `nazev' has not been declared
27 C:\Dev-Cpp\z.cpp incompatible types in assignment of `VOZIDLO*' to `VOZIDLO*[100]'
38 C:\Dev-Cpp\z.cpp request for member of non-aggregate type before '<<' token
43 C:\Dev-Cpp\z.cpp [Warning] deleting array `VOZIDLO*zoznam[100]'

ale to je jedno zadruhe se zas mně nelíbí,že plýtváš pamětí:
char nazev[256];
char buffer[256];
VOZIDLO *zoznam[VELKOST_ZOZNAMU];
...

chlape já používám dynamický pole ....


----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 16:00
re: pole struktur v C++#
auta->nazev je ukazatel na pole, z toho auta je ukazatel na strukturu, nazev je její proměnná - pointer na začátek řetězce. Proto je auta->nazev pointer na začátek řetězce. Jenže proč nefunguje (auta+i)->nazev, to nechápu. Když do toho cyklu přidám před strcpy...

cout << (auta+i)->nazev;

vypíše mi to stejnou adresu jako

cout << (auta->nazev)+i*sizeof(vozidla);...takže kde je chyba nevím... :-)

-----------

další problém - na Linuxu, když ten kod kompiluju g++ mi to vyhodí "Neoprávněný přístup do paměti (SIGSEGV)" při zadávání jména auta i při tom druhém způsobu ((auta->nazev)+i*sizeof(vozidla))... hm... něco děláme blbě :-)

----------
Get enlightened!
(odpovědět)
mr.Crow | E-mail | Website2.12.2007 18:30
re: pole struktur v C++#
chtelo by to pridat mazani svych vlastnich prispevku pro blby jako ja , co se nedokazou trefit do prispevku...

mr.Crow: to je divny pac tu alokaci mam delanou podle knizky mistrovstvi v C++ ... By chtelo se zeptat nekde,kde tomu C++ fakt rozumej...By nam tam treba poradili...Jdu se nekde zeptat...


----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 18:50
re: pole struktur v C++#
sry Darth ale takto sprasit program toe dost krute.
Nastuduj si viac zakladov C lebo nevies co robis

auta->nazev)+i*sizeof(vozidla);
skusim ti to vysvetlit.

auta ukazuje na miesto v pamati kde sa nachazda pole struktur vozidla:

ptr -> [struktura][struktura][struktura]
cize aby si ukazoval na zaciatok dalsej struktury
musis k ptr pripocitat velkost strkutury v pamati.

cize povecme ptr ukazuje na pamat 0 co pouzijeme ako ukazatel pre indexovanie pola struktur.
povecme ze struktura ma velkost 20

0 20 40
[struktura][struktura][struktura]

snad si to pochopil

ten program som ti napisal aby si sa trosku inspiroval...

#include <iostream>

#define VELKOST_ZOZNAMU 100
using namespace std;

struct VOZIDLO
{
char nazev[256];
int rok;
};

int main(void)
{
char buffer[256];
int pocet_aut = 0;
int i;

cout << "Zadajte pocet automobilov: ";
cin >> pocet_aut;
cin.get();

VOZIDLO *zoznam[VELKOST_ZOZNAMU];

// naplnime zoznam aut
for(i=0;i<pocet_aut;i++)
{
zoznam = new VOZIDLO;

cout <<"Zadajte nazov " << i+1 << ". vozidla: ";
cin.getline(buffer,255);

strcpy(zoznam->nazev,buffer);
}

// vypiseme zoznam aut
for(i=0;i<pocet_aut;i++)
{
cout << zoznam->nazev << "\n";
}

for(i=0;i<pocet_aut;i++)
{
delete zoznam;
}

return 0;
}

(odpovědět)
alf0nz | 91.127.119.*2.12.2007 15:45
re: pole struktur v C++#
oprava:
0---------20---------40---------60----...
[struktura][struktura][struktura][stru...
(odpovědět)
alf0nz | 91.127.119.*2.12.2007 15:47
re: pole struktur v C++#
alf0nz: to cos napsal mi kompilator zhodnotil,jako :
32 C:\Dev-Cpp\z.cpp `nazev' has not been declared
27 C:\Dev-Cpp\z.cpp incompatible types in assignment of `VOZIDLO*' to `VOZIDLO*[100]'
38 C:\Dev-Cpp\z.cpp request for member of non-aggregate type before '<<' token
43 C:\Dev-Cpp\z.cpp [Warning] deleting array `VOZIDLO*zoznam[100]'

ale to je jedno zadruhe se zas mně nelíbí,že plýtváš pamětí:
char nazev[256];
char buffer[256];
VOZIDLO *zoznam[VELKOST_ZOZNAMU];
...

chlape já používám dynamický pole ....

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 16:00
re: pole struktur v C++#
btw to,jak si mi to vysvetlil to sem vedel taky... podle toho jak si to napsal ,bych mohl presne napsat (auta+1) ;) , abych se dostal na adresu dalsiho prvku ;) aspon tak to plati pro normalni typy ;) pro struktury ovsem ne...

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 16:05
re: pole struktur v C++#
Ja sem premyslel asi takto : kdyz jde u normalniho pole struktur toto priklad[100].clen a vypise to clena ve 100. strukture .. proc by to neslo jako (auta+100)->clen ovsem to nejde :(

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 16:08
re: pole struktur v C++#
podle mě, když zapisuješ do

(auta+i)->nazev

zapíšeš data do místa, kde je uložen pointer na řetězec. Jakože tím zapíšeš do (nazev) a ne do (*nazev). Ale jistý si tím nejsem :-)

----------
Get enlightened!
(odpovědět)
mr.Crow | E-mail | Website2.12.2007 16:13
re: pole struktur v C++#
vlastně to je hloupost, to co plácám, strcpy stejně očekává pointer na řetězec.... erm... to se mi nepovedlo.... já o tom ještě popřemejšlím :-)

----------
Get enlightened!
(odpovědět)
mr.Crow | E-mail | Website2.12.2007 16:30
re: pole struktur v C++#
mr.Crow : ja taky zapisuju adresu ;) ja nechci zapsat hodnotu ;) retezec je interpretovany adresou ;)

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 16:40
re: pole struktur v C++#
to je divny pac tu alokaci mam delanou podle knizky mistrovstvi v C++ ... By chtelo se zeptat nekde,kde tomu C++ fakt rozumej...By nam tam treba poradili...Jdu se nekde zeptat...

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 18:47
re: pole struktur v C++#
reseni problemu : [link]

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 20:35
re: pole struktur v C++#
podla nazoru mnoha odbornikov je gcc zly kompilator
vo VS6 mi zdrojak funguje bez problemov.

No mozno ja plytvam pamatou ale ty len na to aby si nacital zo vstupneho prudu meno a ulozil ho do pola
predvazdas velmi zaujimave cvyky s alokaciou.






(odpovědět)
alf0nz | 91.127.119.*2.12.2007 21:05
re: pole struktur v C++#
mno ja sem jeste zacatecnik , me opravili poradne na builderu , takze uz vim li, jak na to ...
Ale jeste teda k tvymu zdrojaku...
Ty vypisujes jmena aut , ale nepochopil sem , kde je nacitas:

// naplnime zoznam aut
for(i=0;i<pocet_aut;i++)
{
zoznam = new VOZIDLO;

cout <<"Zadajte nazov " << i+1 << ". vozidla: ";
cin.getline(buffer,255);

strcpy(zoznam->nazev,buffer);
}

vzdyt ty prepisujes porad to same misto...

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 22:09
re: pole struktur v C++#
funkcni kod :

#include <iostream>
#include <cstring>

using namespace std;

char* funkce(void);

struct vozidla
{
char* nazev;
int rok;
};

int main(void)
{
int a;
cout << "Zadejte pocet automobilu" << endl;
cin >> a;
cin.get();

vozidla* auta = new vozidla [a]; // alokuju pamet jen pro struktury nikoli pro cleny

int i;
for(i=0;i<a;i++)
{
cout << "Zadejte nazev " << i+1 << ". vozidla" << endl;
auta.nazev=funkce(); // auta -ukazatel na pole struktur
// prenasim adresu retezce z fce do prvku name
//a zaroven ve fci alokuju pro name pamet
// pokud bych pouzil fci strcpy musel bych alokovat
// pamet i pro cleny struktury tedy prvky name
}

for (i=0;i<a;i++) cout << auta.nazev << endl; // vypisujeme nazvy

for (i=0;i<a;i++) delete [] auta.nazev; // uklizime po sobe
delete [] auta;

cin.get();
cin.get();
return 0;

}

char* funkce(void)
{
char temp[100];
cin.getline(temp,99);
char* alokace = new char[(strlen(temp)+1)];
strcpy(alokace,temp);
return alokace;
}

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 22:12
re: pole struktur v C++#
auta.nazev

vsude zmizelo to , co sem koukal doufam, ze to je vse

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 22:14
re: pole struktur v C++#
aaaha tak zapisu hranaty zavorky a mezi nima maly tiskaci i ?:D to zmizelo i v tom druhym prispevku..

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 22:16
re: pole struktur v C++#

#include <iostream>
#include <cstring>

using namespace std;

char* funkce(void);

struct vozidla
{
char* nazev;
int rok;
};

int main(void)
{
int a;
cout << "Zadejte pocet automobilu" << endl;
cin >> a;
cin.get();

vozidla* auta = new vozidla [a]; // alokuju pamet jen pro struktury
//nikoli pro cleny
int i;

for(i=0;i<a;i++)
{
cout << "Zadejte nazev " << i+1 << ". vozidla" << endl;
auta.nazev=funkce(); // auta -ukazatel na pole struktur
// prenasim adresu retezce z fce do prvku name
//a zaroven ve fci alokuju pro name pamet
// pokud bych pouzil fci strcpy musel bych alokovat
// pamet i pro cleny struktury tedy prvky name
}

for (i=0;i<a;i++) cout << auta.nazev << endl; // vypisujeme nazvy

for (i=0;i<a;i++) delete [] auta.nazev; // uklizime po sobe
delete [] auta;
cin.get();
cin.get();
return 0;

}

char* funkce(void)
{
char temp[100];
cin.getline(temp,99);
char* alokace = new char[(strlen(temp)+1)];
strcpy(alokace,temp);
return alokace;
}


----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 22:22
re: pole struktur v C++#
hej tak sakra ja nechci pouzit BBCode...omlouvam se za spam...
tak jinak :


#include <iostream>
#include <cstring>

using namespace std;

char* funkce(void);

struct vozidla
{
char* nazev;
int rok;
};

int main(void)
{
int a;
cout << "Zadejte pocet automobilu" << endl;
cin >> a;
cin.get();

vozidla* auta = new vozidla [a]; // alokuju pamet jen pro
//struktury nikoli pro cleny
int i;

for(i=0;i<a;i++)
{
cout << "Zadejte nazev " << i+1 << ". vozidla" << endl;
auta&#091;i&#093;.nazev=funkce(); // auta -ukazatel na pole struktur
// prenasim adresu retezce z fce do prvku name
//a zaroven ve fci alokuju pro name pamet
// pokud bych pouzil fci strcpy musel bych alokovat
// pamet i pro cleny struktury tedy prvky name
}

for (i=0;i<a;i++) cout << auta&#091;i&#093;.nazev << endl; // vypisujeme nazvy

for (i=0;i<a;i++) delete [] auta&#091;i&#093;.nazev; // uklizime po sobe
delete [] auta;
cin.get();
cin.get();
return 0;

}

char* funkce(void)
{
char temp[100];
cin.getline(temp,99);
char* alokace = new char[(strlen(temp)+1)];
strcpy(alokace,temp);
return alokace;
}


----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 22:29
re: pole struktur v C++#
tohle taky nejde , takze se ptam , jak tam dostat dve hranaty zavorky a mezi nima i ?

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 22:29
re: pole struktur v C++#
toto formatovanie dojebava zdrojaky tuna mas funkcny zdrojak.

[link]
(odpovědět)
alf0nz | 91.127.119.*2.12.2007 22:41
re: pole struktur v C++#
ok tady mas muj : [link]

v jednom for jsou dve moznosti vykonani,jedna je zakomentovana...nas problem s (neco+i)->neco byl v tom,ze jsme meli naalokovane jen struktury,ale cleny v nich ne..

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail2.12.2007 23:04
re: pole struktur v C++#
Rozhodni sa, ci chces C alebo C++. Mixovat ich dokopy je sice mozne, ale nedoporucujem. Ked chces v C++" tak pouzivaj std::vector namiesto pola a class namiesto struct.
(odpovědět)
myself | 78.128.195.*3.12.2007 11:38
re: pole struktur v C++#
indexovani pole je v poradku, cely problem je jen v tom, ze auta->nazev nemas alokovany. takze kopirujes ten retezec do nikam.
misto tveho:
strcpy((auta+i)->nazev,alokace);
delete [] alokace;
staci toto:
(auta+1)->nazev = alokace;
tzn pouzij alokaci pro nazev a nemaz ji.

(odpovědět)
kve | 213.211.51.*3.12.2007 14:34
re: pole struktur v C++#
to (auta+1) je preklep, samozrejme jsem myslel (auta+i). a samozrejme muzes pouzivat i auta.
(odpovědět)
kve | 213.211.51.*3.12.2007 14:35
re: pole struktur v C++#
no a ted to pro zmenu pomrsil system. samozrejme muzes pouzivat i "auta [ i ]"
(odpovědět)
kve | 213.211.51.*3.12.2007 14:37
re: pole struktur v C++#
myself: pokud vim tak alokace pomoci new je C++ ;) v Cecku to bylo malloc ;) ke tridam jsem se jeste nedostal... a o knihovne vector si jeste musim precist ;)

kve: v poho uz sme ten problem vyresili :)

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail3.12.2007 15:51
re: pole struktur v C++#
no proste si prasa...o std::vector si precitaj cim skor tym lepsie, a vlastne o celom STL...to je na C++ asi najlepsie
(odpovědět)
myself | 78.128.195.*3.12.2007 19:07
re: pole struktur v C++#
myself: jj ja sem prase a ty si letadlo ;)

az budes nekdo vyznamnej , co to bude kodit jako guru , tak mi rikej prase ;) Do ty doby bud letadlo ;)

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail3.12.2007 19:19
re: pole struktur v C++#
whatever...
(odpovědět)
myself | 213.151.236.*8.12.2007 18:39
re: pole struktur v C++#
pokud nechcete, aby se BBCode tag interpretoval, tak pred nej dejte zpetny lomitko, tedy napr. \[i] se pak v prispevku zobrazi normalne jako [i] namisto kurzivy.
(odpovědět)
Emkei | E-mail | Website | PGP8.12.2007 15:20
re: pole struktur v C++#
Darth> ten clovek se ti snazil poradit, navic dobre poradit. Pokud rikas ze to pises v C++ a pouzivas klasicke pole misto vectoru, neznas STL a podobne, tak toho o C++ opravdu moc nevis. Z teto pozice bych ti neodporucoval se hadat s nekym kdo toho vi na prvni pohled daleko vic.
A k tomu tvymu kodu - ano, je to prasacky napsane ;) Myself ma pravdu. To ovsem neznamena ze z tebe jednou nebude dobry programator. Kazdy jednou nejak zacinal ;)

----------
public static void main(String args[]){
 throw new UnsupportedOperationException("Not implemented!");
}


(odpovědět)
pr0ph3t9.12.2007 0:56
re: pole struktur v C++#
pr0ph3t: nesnasim kdyz mi rika nekdo prase ;) ja sem clovek ne zvire ;) jinak jsem to vzal :)

STL neznam navic jsem to psal, ze si o tom teprve budu cist :) jsem teprve v pulce knizky...

Btw: ukaz to neprasacky :) kazdej rika, jak je vzdycky vsechno prasacky napsany , ale jeste sem nevidel kod napsanej neprasacky, tak nvm co je normalni kod, jelikoz kazdej vzdycky vsechno zhodnoti jako prasacky napsany ;))

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail10.12.2007 9:50
re: pole struktur v C++#
aby som ti demonstroval nadherne riesenie pomocou sablon [link]
(odpovědět)
alf0nz | 78.98.8.*10.12.2007 14:00
re: pole struktur v C++#
#include <iostream>
#include <string>
#include <vector>

using namespace std;

struct vozidla
{
string nazev;
int rok;
};

int main (int argc, char*argv[])
{
vozidla add_auto;
vector <vozidla> auta;
int a,j;
cout << "Zadejte pocet automobilu" << endl;
cin >> a;
cin.get();
for (j=0;j<a;j++) {
cout << "Zadejte nazev " << j+1 << ". vozidla" << endl;
cin >> add_auto.nazev;
auta.push_back(add_auto);
};
// nyni vypis vsech zadanych aut
for (j=0;j<auta.size();j++) {
cout << auta[j].nazev << endl;
};
return 0;
};


se mi libi vic :) z builderu ;)

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail10.12.2007 15:01
re: pole struktur v C++#
Ikdyz ty mas lepsi fci main ... tezko rict co by bylo rychlejsi... ty fcemi volas skokovy instrukce... ale nvm ,co je min ,,prasacky"

----------
Niemand ist so gut,wie er denkt ;)
(odpovědět)
Darth | E-mail10.12.2007 15:02

Zpět
 
 
 

 
BBCode