- log69 blogja
- A hozzászóláshoz be kell jelentkezni
- 995 megtekintés
Hozzászólások
idézet (turul16):
Felatalod a sajat string osztalyod. (reinvent the wheel) Aminek kezelese elter a sokak altal megszokttol es ketseges, hogy tenyleg van anyi haszna.
Masreszt a tipusod egy fontos lehetosege nincs kihasznalva, megpediglen, hogy kepes lenne nem karakternkent masoldni/oszefuzodni egy while ciklusban, eloszor azt hittem, ezert talaltad fel.Ha uj tipust talalunk fel akkor, valahogy definialni szoktuk. Mondjuk hivjuk str2 -nek. illik a tipus nevevel kezdeni a methodusokat es egy _ -utan irni a nevet.
strcpy2 helyett str2_cpystr2 lehetne egy struct (long,long,char) , vagy char* ra alias.
lasd meg.: http://en.wikipedia.org/wiki/OffsetofEleg magas a null toleranacioad nem biztos, hogy ez jo. see also: assert
Lehet félre értem amit írsz, de pont hogy nem tér el a kezelése a "megszokottól" (tehát működnek a string típusomra a standard függvények), és a másolódás / összefűzést is megoldottam, éppen azzal, hogy nem hoztam létre neki saját struktúrát, hanem egy trükköt találtam ki, miszerint a string karakterek előtt van két long, amely a memóra blokk nagyságát és az azon belüli string hosszát mutatja. De a pointer a string-re mutat. Tehát a string felszabadítása működik csak másképp.
- A hozzászóláshoz be kell jelentkezni
A kezelese azert szokatlan, mert igy szabaditod fel: free((unsigned long*)(ptr) - 2);
Gyakoribb az, hogy inkabb egy makrot biztositasz ami char* -a "konvertalja" az str2 -det, ott ahol char* -kent kell, es sima free -vel szabadithato marad.
Ill az is szokatlan, gyakran varsz ** paramtert.
pl.: unsigned long strlen2(char **s1)
char *res;
..
if (strlen2(&res))
A helyett mondjuk hogy:
str2 res;
..
str2_len(res);
str2 lehetne char* , vagy egy struct -ra mutato tipus.
Attol meg, hogy a blokk/structura merete valtozo az eleje fix, ezert struktura hasznalhato.
see also: struct linux_dirent (getdents(2))
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni
igazad van, pont emiatt a típusom miatt várok többször pointerre mutató címet, mintsem magát a pointert adnám át. de ez persze azért van, mert a string pointerem előtti memóriához is hozzá akarok férni. nyilván ha a pointert adnám át, akkor az a stack-en átadódna, és az eredeti pointer előtti memóriát már nem látnám. ez szerintem nem igazán rossz megoldás. a C biztosítja ezt, én élek vele.
makrózni inkább nem makróznék ha nem muszáj.
ha struktúrát használnék egy új típusra, ott akkor persze elég lenne átadnom csak a struktúrára mutató pointert -és nem annak a címét. de ugye ez az előbb leírtjaim miatt van.
ezt az egész megoldásomat nem látom problémának. illetve típus konverziót sem kell így csinálnom.
kieg.: egy dolog talán nem szép, hogy egy adott string-emről nem dönthető el "ránézésre", hogy az standard char tömb, vagy a saját, bővített tömböm. viszont a kód szempontjából nem is fontos, mert ahol ilyet használok, ott úgy is kezelem. itt már tényleg az az eldöntendő szerintem, hogy most mennyire a kód olvashatóságra, vagy éppen a működés milyenségére adjunk. az én megoldásom jól olvasható nekem.
- A hozzászóláshoz be kell jelentkezni
A makro gyulolok meg mindig hasznalhatnak fuggvenyket, vagy inline fuggvenyeket ,akkar headerben implementalva is.
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni
egyetértek, de az overhead is nő.
- A hozzászóláshoz be kell jelentkezni
a mostani megoldas viszont eleg khm, kenytelen vagyok tururral egyeterteni :(
- A hozzászóláshoz be kell jelentkezni
de milyen szempontból? mint írtam, így nem kell konvertálnom a típusom a standard függvényekhez. kód olvashatóság szempontjából sem több a kód, mintha standard string-et használnék.
az strcat2, strcpy2, free2 függvényeimet leszámítva nem rosszabb vagy zavaróbb használni szerintem, és az említett függvények meg pár sor, nem érzem zavarónak.
ettől függetlenül értem és elfogadom, hogy tisztább lehet rendes típusokkal megoldani, mint pointer-ekkel trükközni szerintetek. de a megoldás szempontjából, meg akár sebesség szempontjából is így gondoljátok?
- A hozzászóláshoz be kell jelentkezni
A gond csak az, hogy ez egy dirty hack. Működni működik, te átlátod, de olyan hibák elkövetésére ad lehetőséget, amik mondjuk egy struktúrával már nem fordulhatnának elő.
--
Don't be an Ubuntard!
- A hozzászóláshoz be kell jelentkezni
még egy dolog; az egész tomld csak tömény string manipuláció. ez figyelembe vettem és fontosnak tartottam, mikor megterveztem. igaz hogy általában véve nem optimalizálók kódon belül - pl. a while ciklusaimnak sajátos formáját használom, de ez meg azért van, hogy a kód olvashatóságát, megérthetőségét növeljem számomra, mivel nem bevétel forrás.
az, hogy a string-em sima pointer-ét bármikor át tudom adni standard függvényeknek, mindenképpen számít. igaz, a sebesség már nagyobb kérdés, valószínű ezzel kapcsolatban ezer dolgot találhatnánk a kódomban, amely fejleszthető jelenleg is.
- A hozzászóláshoz be kell jelentkezni
Gyakran csinalsz olyat, hogy null checket hajtasz vegre olyan helyeken ahol NULL felbukanasa programozasi hibat jelenthet.
A reakciod erre egy sima hamis ertekkel valo vissza teresa fugvenyben. Valami hangosabb kene. Vagy pont ellenkezoleg, csak debug modban ellenorizni.
Csenedben kezeles/rejtegetes rendszerint nem a jo modszer.
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni
assert
- A hozzászóláshoz be kell jelentkezni
ok.
- A hozzászóláshoz be kell jelentkezni
volt mar :)
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni
ez jó, köszi. ilyen pl. sok esetben az, mikor kód sor spórolás miatt hívok egy free2()-t, attól függetlenül, hogy létrejött-e a string változóm, vagy null maradt az értéke (free2() csak akkor szabadítja fel, ha nem null).
ezen elgondolkozok.
- A hozzászóláshoz be kell jelentkezni