Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 9. červenec 2012, 14:26:38 Předmět: kopirovani dynamicke array |
|
|
Ahoj, nasel by se nekdo kdo by mi pomohl to nejak prepsat at mi to jede?
kód: |
struct ABC{
char *jmeno;
};
void string_copy(char *source, char *destination)
{
unsigned int i=0;
while(source[i]!=0) //nulovy znak
{
destination[i]=source[i];
i++;
}
destination[i]=0; // pridani nuloveho znaku na konec
}
void funkce_s_array(ABC **arr)
{
char *buffer;
nacist_neco_do_bufferu();
while(1)
{
string_copy(buffer,arr[i]->jmeno);
}
}
int main()
{
ABC *arr;
funkce_s_array(&arr); // zde mam referenci at mi to array vyplivne upravenou
// tady potrebuju mit nactene veci v "arr" a dal s nimi manipulovat
return 0;
}
|
Naposledy upravil Aroidzap dne 9. červenec 2012, 20:10:16, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
Weny Sky

Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 9. červenec 2012, 14:50:26 Předmět: |
|
|
kód: |
void funkce_s_array(ABC **arr)
{
char *buffer;
nacist_neco_do_bufferu();
*arr = new ABC[x];
for(int i=0;i<x;i++) //x muze byt ruzne, jeho hodnota se nacita az za behu
{
const size_t len = strlen(buffer);
(*arr)[i].jmeno = new char[len+1];
memcpy((*arr)[i].jmeno, buffer, len+1);
}
}
|
+- ... ale radeji si precti neco o ukazatelich |
|
Návrat nahoru |
|
 |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 9. červenec 2012, 14:56:48 Předmět: |
|
|
ukazatele mi delaji porad problemy snazim se to pochopit jak to jde... asi jsem na to jeste moc malej
jinak tohle je sice dobre, ale mam to usporadane trochu jinak (snazil jsem se to tu zestrucnit).. takze nebudu proste vedet kolikrat se ten for loop zopakuje mam tam while, kterej se za urcitych podminek breakne
napada me akorat tomu dat vzdycky nejakou rezervu a kdyztak to proste resizovat ale prijde mi to takove "neohrabane" |
|
Návrat nahoru |
|
 |
Weny Sky

Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 9. červenec 2012, 19:56:39 Předmět: |
|
|
Zkus jednou nebo dvema jednoduchyma vetama popsat co vlastne chces udelat.
zadne detaily, slozitosti, ... |
|
Návrat nahoru |
|
 |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 9. červenec 2012, 20:11:14 Předmět: |
|
|
nevim jak to zjednodusene popsat... upravil jsem puvodni post.. zitra to zkusim jeste nejak vysvetlit... mam v tom zmatek, navic jak mi to haze errory z kterych moc nechapu |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 10. červenec 2012, 08:35:34 Předmět: |
|
|
Dufam, ze si si vedomy, ze jazyk C ma na manipulaciu s C "stringami" hotove, standardizovane, kniznicne funkcie? _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 10. červenec 2012, 09:08:26 Předmět: |
|
|
nakonec jsem to vyresil pres vektor, a ano, o stringu vim, ale tohle je cast kodu kde mi jde o rychlost zpracovani
Naposledy upravil Aroidzap dne 10. červenec 2012, 09:28:09, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 10. červenec 2012, 09:09:52 Předmět: |
|
|
Aroidzap napsal: |
nakonec jsem to vyresil pres vektor |
muzes poslat kod, kde kopirujes ten 'char*' pres vector? - a hlavne teda duvod proc to delas by me zajimal
kdyz jsou funkce strcpy, strcat (a milion dalsich strXXX funkci na praci s char*) |
|
Návrat nahoru |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 10. červenec 2012, 10:13:00 Předmět: |
|
|
Pošli ten kód, první verze je naprostá nehoráznost, kdy je ABC neinicializovaný ukazatel na objekt s neinicializovaným ukazatelem jmeno (o dalším se radši ani nebudu zmiňovat). Jestli ta nová verze vypadá obdobně, budeš mít velké problémy, když ti občas program začne házet segmentační chyby (tzn. přistupuješ k adrese ukazatele, která není platná a nemáš k ní přístup).
Pokud nepochopíš práci s ukazateli, nikdy se nemůžeš stát programátorem v C/C++. Ukazatele jsou v nich dost klíčové. Osobně jsem taky ukazatele nechápal, dokud jsem se je nenaučil z Teach yourself C++ in 21 days (český překlad je Naučte se C++ za 21 dní, jak jinak). Samozřejmě ukazatelích nestačí jenom povrchový tutoriál, ale musíš opravdu "srdcem" vědět, jak se kdy zachovají a jak to funguje.
Jinak obcházení kopírování C stringů přes C++ vektor je opravdu nešťastné řešení. Akceptovatelná řešení jsou:
1. str(n)cpy - vyžaduje pochopení C ukazatelů a polí, ale je to asi nejrychlejší alternativa a je pure C
2. vlastní kopírovací funkce podobná str(n)cpy - vyžaduje velmi velké porozumění C ukazatelům a polím, nejpracnější varianta, ve které po čase můžeš objevit chyby (a to dost zásadní, i blbý přístup za hranice pole ti může zkazit paměť (anglický termín "memory corruption" je asi trefnější) a pak to hledáš týden, protože nevíš, co to způsobilo), zase to může být pure C
3. použít std::string, tam potřebuješ rozumět C++ Standard Library, ale to zase není tak hrozné. Pokud píšeš C++, tak je to nejlepší volba. _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
 |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 10. červenec 2012, 10:47:18 Předmět: |
|
|
to kopirovani stringu nemam pres vektor, ve vektoru mam tu strukturu ABC.
mam dalsi dotaz... jak mam pouzit delete na
kód: |
std::vector<ABC> abc_array[1000]; |
predpokladam ze
kód: |
for (int i=0;i<1000;i++)
{
delete[] abc_array[i];
} |
je blbost
jinak dekuju za vsecky rady 
Naposledy upravil Aroidzap dne 10. červenec 2012, 11:07:08, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
mar
Založen: 16. 06. 2012 Příspěvky: 610
|
Zaslal: 10. červenec 2012, 11:02:59 Předmět: |
|
|
To, cos napsal ty, je pole, které obsahuje 1000 vektorů (=dyn. polí).
Myslím, žes chtěl tohle:
kód: |
std::vector<ABC> array(1000);
|
delete[] je v tomto případě blbost. std::vector se maže sám v destruktoru. |
|
Návrat nahoru |
|
 |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 10. červenec 2012, 11:08:12 Předmět: |
|
|
ne, je to spravne chtel jsem 2d array ktera je napul array na pul vektor  |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 10. červenec 2012, 11:12:14 Předmět: |
|
|
na co delete? - vzdyt tam nikde nemas pointery - takze se to uvolni samo
ale jinak prosimte otevri si knihu o C/C++ a zacni nekde od zacatku - mas zasadni mezery a brzo shoris jako papir |
|
Návrat nahoru |
|
 |
mar
Založen: 16. 06. 2012 Příspěvky: 610
|
Zaslal: 10. červenec 2012, 11:12:45 Předmět: |
|
|
V tom případě se omlouvám. Takže akorát nedeletovat. Je to statické pole a vektor se v tomto případě smaže sám. |
|
Návrat nahoru |
|
 |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 10. červenec 2012, 11:14:51 Předmět: |
|
|
no ale kdyz ho chci smazat (ne na konci programu) a uvolnit tim pamet, tak to udelam jak? |
|
Návrat nahoru |
|
 |
|