[c++] ukazovatele

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

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

Odeslat příspěvekod m.rangerx 8. 12. 2006 15:03

mam jednoduchy kod, vytvori pole mocou *int
problem je ze ak chcem v tomto programe vytvorit dalsiu premennu typu *int (povezdme nake int* array2; ) tak uz pri prvom pokuse o zapisanie do array, mi to vyhodi segmentation fault.... da sa to nako obist ? teda je mi jasne ze int* vytvori len adresu teda, to pole potencialne moze byt velke ake chce, ale ked tam chcem dalsie tak sa lahko pobiju a hodi to sg fault...

neni to ziadna uloha ani nic len chcem vediet ze ci sa to da nako urobit...

Kód: Vybrat vše
#include<iostream>
using namespace std;

int main(){
int* array;
unsigned int count;

cout<<"pocet:"<<endl;
cin >> count;

for (unsigned int i=0;i<count;i++){
  cin>>array[i];
}

cout<<endl<<endl<<endl<<"vysledok 1 :"<<endl;
for (unsigned int i=0;i<count;i++){
  cout<<array[i]<<endl;
}

return 0;
}


//christian: přidán [code] tag
m.rangerx
Kolemjdoucí

Odeslat příspěvekod Karel Kalecký 8. 12. 2006 17:11

Takhle alokuješ paměť pouze pro ukazatel na jeden prvek.
Napiš to takhle:
Kód: Vybrat vše
...
unsigned int count;
cin >> count;
int* array = new int [count];
...

Tím alokuješ count-prvkové pole. Nesmíš ho ale potom zapomenout dealokovat, jinak dojde k úniku paměti - delete [] array;
Přistupovat k prvkům pak můžeš pomocí indexu - array [i], případně *(array + i), to záleží i na kompilátoru.
Pravda má jednu velkou výhodu: člověk si nemusí pamatovat, co řekl.
Karel Kalecký
Kolemjdoucí
Uživatelský avatar

Odeslat příspěvekod clayman 8. 12. 2006 17:22

Abych to upresnil, tak timhle

Kód: Vybrat vše
int *array;


nenaalokuje vubec nic, jen na stacku vytvori odkaz "kamsi"...
clayman
Junior

Odeslat příspěvekod m.rangerx 9. 12. 2006 01:27

ok diky, som si az teraz uvdeomil ze som sa pytal vlasnte na uplnu somarinu... na to co chcem treba pouzit kontajner... ale aj tak dik za radu
m.rangerx
Kolemjdoucí

Odeslat příspěvekod Lord Elrond4. 9. 12. 2006 02:04

Sorry za OT, ale aký je rozdiel medzi array a vector? Dík
Manželka posílá programátora nakoupit. Kup deset rohlíků a když budou mít vejce, kup jich 30. Programátor přijde do obchodu a povídá: "Máte vejce ?" "Ano, máme" odpoví prodavačka. "30 rohlíků, prosím."
Lord Elrond4.
Junior
Uživatelský avatar

Odeslat příspěvekod m.rangerx 9. 12. 2006 10:18

polu sa neda menit velkost, vectoru ano. Teda vector je dynamicke pole.
m.rangerx
Kolemjdoucí

Odeslat příspěvekod Lord Elrond4. 9. 12. 2006 11:54

Dík, doteraz som žil v predstave, že c++ má pole, ktoré sa volá vector. :oops:
Manželka posílá programátora nakoupit. Kup deset rohlíků a když budou mít vejce, kup jich 30. Programátor přijde do obchodu a povídá: "Máte vejce ?" "Ano, máme" odpoví prodavačka. "30 rohlíků, prosím."
Lord Elrond4.
Junior
Uživatelský avatar

Odeslat příspěvekod clayman 9. 12. 2006 12:02

m.rangerx píše:polu sa neda menit velkost, vectoru ano. Teda vector je dynamicke pole.


Da. Existuje funkce realloc(), ktera prealokuje pamet, na kterou ukazuje pointer.

Nicmene je fakt, ze v praxi je lepsi pouzit kontejnery, ktere to delaji za programatora.
clayman
Junior

Odeslat příspěvekod Let_Me_Be 10. 12. 2006 20:56

Pole je interni struktura jazyka. vector je trida definovana v STL.

U trid z STL je potreba si davat pozor na to jakou pouzivame. Maji ruznou slozitost jednotlivych operaci. Napriklad list ma slozitost nahodneho pristupu O(n) ale mazani libovolneho prvku zvlada v O(1).
Let_Me_Be
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod Nargon 10. 12. 2006 21:03

Let_Me_Be píše:Napriklad list ma slozitost nahodneho pristupu O(n) ale mazani libovolneho prvku zvlada v O(1).

Tak tohle se mi zda jako kravina.
Slozitost nahodneho pristupu O(n) beru to je celkem v pohode.
Ale smazani libovolneho prvku aby bylo O(1) je nejaka blbost. Vzdyt preci nejprve musim ten prvek najit (tedy nahodny pristup) a az pak muzu mazat. Takze jak to muze mit slozitost nizsi?
Nargon
Moderátor

Odeslat příspěvekod Let_Me_Be 10. 12. 2006 21:33

No protoze list umi mazat jenom pres iteratory. Mrkni jak je to implementovane. Hned ti to bude jasne.

Nahodny pristup O(n) je dost velikej problem. Pokud proste potrebujes casto cist prvky na nejake konkretni pozici.
Let_Me_Be
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod Nargon 10. 12. 2006 21:51

Je mi jasny ze to cteni je proste problem. A je to dost narocny. Tedy hlavne nalezeni toho konkretniho prvku. Ale s tim me prave zarazila ta slozitost O(1) pro mazani, kde to tak vypada, se prvek nehleda, ale pomoci nejakeho vypoctu se urci jeho pozice. A tak si rikam, kdyz to jde pri mazani, proc to nejde i pri tom cteni? nebo to mazani neni stejne narocny, protoze ten prvek se stejne musi nejak najit.
Proste je nesmysl, aby precteni prvku z toho seznamu bylo vypocetne jinak narocne nez smazani prvku.

Jak rikas, ze je mazani pres iterator, tak je to jen klamani uzivatele s tou slozitosti.
Kdyz napriklad chci prvek na 5ty pozici, tak ten list si spusti nejakej interni iteratorovej cyklus a najde to ten prvek a ten to pak vrati. A pak je slozitost O(n).
Jenze kdyz mazani umoznuje jen smazani prvku s urcitym iteratorem, tak si ten for musim udelat sam, prvek vlastnorucne najit a pak pres ten nalezenej iterator smazat. Takze ve vysledku je tu narocnost uplne stejna O(n).
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod logout 10. 12. 2006 22:28

Ahoj,
...nemusi být. Např. pokud mažeš vždy první či poslední prvek. To má složitost O(1). A např. u stacku či fronty jsou operace s prvním/posledím prvkem jediná prováděná operace. Pro tydle účely je list ideální. Pokud potřebuješ vyhledávat (a nepotřebuješ sekvenčně procházet), je dobrý hash_set, pokud potřebuješ vyhledávat a procházet, pak set. Vector se hodí, pokud chceš hlavně procházet a málo přidávat, popř. pokud potřebuješ náhodný přístup.

Matyáš

PS: Oproti jiným jazykům se to tváří složitě. Ve skutečnosti ale v jiných jazycích je to řešeno úplně stejně (např. pole v php je tuším kombinace hash_map a list)...
logout
Junior

Odeslat příspěvekod Let_Me_Be 11. 12. 2006 00:56

Rikam podivej se na implementaci. V listu se maze pres iteratory a list je spojovany seznam. Tudiz je naprosto jasne ze mazani bude O(1).
Let_Me_Be
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod Lord Elrond4. 11. 12. 2006 20:26

List je niečo ako LinkedList v jave? Dík
Manželka posílá programátora nakoupit. Kup deset rohlíků a když budou mít vejce, kup jich 30. Programátor přijde do obchodu a povídá: "Máte vejce ?" "Ano, máme" odpoví prodavačka. "30 rohlíků, prosím."
Lord Elrond4.
Junior
Uživatelský avatar


Kdo je online

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