Zkoušel jsem napsat rovnou char*prefix[24]; ale to mi vytvořilo něco úplně jiného než char*. Je to funkce na parsování tak jsem se rozhodl vyhnout se dynamickému přiřazování paměti
ale výsledek je stejný. Nejdříve se do s1 nastaví jeden znak, při dalším zavolání se ale opět přepíše. Já chci posunout ten ukazatel o n znaků a zkopírovat tam to na co ukazuje s2
ale zbytečně si to komplikuješ... Musíš si pak totiž někde udělat zálohu toho původního ukazatele. Při volání té funkce pak bude první argument ve tvaru &prefix.
Podle mě si to všechno moc komplikuješ. Kdyby jsi napsal (jak doporučil KIIV) jaký jsou vstupy a jaký očekávaný výstupy, tak to tady nemusíme řešit a napíšu ti rovnou správnou funkci...
Problém byl v tom že to nebylo vidět a vracelo to nesprávnou adresu, takže aby to bylo vidět po editaci je třeba dát s1-n. Tvůj kód je kratší ale zase není tak přehledný a vyžaduje char ** jako vstup já mám vstup char*
#8KIIV
Já chtěl původně udělat to co v c++ lze udělat pomocí mystr += someChar , čili jen přičíst jeden znak. A to v Céčku nejde. Funkci na to jsem si napsal. Neefektivní to možná je, ale je to v situaci, kdy parsuji jeden krátký argument něco ve stylu: -r prefix_{x:číslo}_{y:číslo}.jpg původně jsem to psal v C++ a tam se dal přičíst ten znak, takže celé to cykluju po jednotlivých znacích v jedné velké smyčce. Jasně, šlo by to udělat i jinak jako po jednotlivých částech, ale funkce už je napsaná a tady ohledně toho přefixu pravděpodobně jde jen o tři znaky které chci takto načíst do prefixu, takže žádná tragédie.
Jediným problémem této funkce je to, že přepíše ten původní cílový string. Teď nevím jestli je to špatně nebo ne, protože musím ještě zkontrolovat jak tu funkci používám dál a jestli mi na konci celé funkce na parsování regexu vyleze co jsem chtěl.
Edit:
Jo tak problém to je. Vlastně původní záměr není splněn. Protože když chci získat to slovo uvnitř závorky tak toto nefunguje. Tam je odlišná pozice n. Jak říkám původně jsem chtěl udělat funkci na mystr += someChar, takže to budu muset přepsat nebo nějak obejít.
Když mám ten prefix hotový mám další kód:
for (n++; arg[n] != '}' || n>=length-1; n++)
str1cpy(first,arg,n); // first += arg[n];
#17PiranhaGreg
No jo, když ono je to komplikovanější. V té mé funkci jsou podmínky, že třeba x nebo y nemusí být zadané a místo toho tam bude jen pomlčka. Já bych raději rozjel nejdříve tu funkci od KIIV.
Copy/paste z mých poznámek:
-r _{...}_{...}_ is translated as -r _{x:..}_{y:...}_
Výrazně se to zjednodušilo. Až na tu deklaraci char * na začátku. zatím to funguje, zítra ještě ověřím jestli to bude fungovat když odstraním prefix (nepovinný)
Oh sh*t to díky za upozornění! Zavedl jsem si funkci strTok, která nepoužívá statické proměnné takže to mám vyřešeno. Pozn. k parsování argumentů ale více vláken používat nebudu.
Dotaz:
Jak tam řešíš typ char*? Vidím tam jen typ enum. Já už začal uvažovat o tom, že ty zásobníky co jsem zavedl jsou zbytečné a že by mi stačil jen jeden.
Enum je tam jen pro "citelnejsi" index do toho pole retezcu o delce 50.
Precijen arr[0] je trosku min citelne nez arr[FIRST]. Kdyz uz se usetrily zbytecny promenny.
No a kdyz predas te funkci arr[FIRST], tak je to primo zamenitelne s char *.
A ano, ten buffer by stacil klidne jeden - zalezi na tom, co s tim dal delas. Nebo jen pole pointeru a ty oddelovace prepisovat '\0' (jen v pripade, ze uz ten puvodni retezec nepotrebujes jeste v celku)
Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Dík za pomoc. A ještě jsem si uvědomil že vlastně budu muset parsovat názvy souborů až budu procházet adresář a to bude multivláknově. Takže se vyhnu tomu strtok. Tam by se dal použít ten scanf.
Prokouklo to, ale já už nesleduju jak ta tvá funkce funguje. U té mé byl problém že pointer musel být ve větším rozsahu. Naříklad prefix pravděpodobně bude mít jen 3 znaky, koncovka regext asi jen max. 6 znaků např. *.jpeg, mid je jenom spojka, tak asi jeden znak, takže nevím jestli je nutné nastavovat všem stejnou délku, ale ono je to tak vlastně jednodušší.
mozna arg nemas jako const char * ale jen jako char * ... pak se pri prirazeni zmeni z const na neconst a tim padem je "odstraneni kvalifikatoru const a neni to const"
Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Víš co u té tvé funkce nechápu? Proč na konci vracíš in+1 a ne *in+1 nebo *in?
/* Tam kde je *var se pracuje se stringem jak kdyby na
původní úrovni mimo funkci */
char * strcpyTillCharIn(char *out, const char *in, char ch)
{
/* Posouvá ukazatele tak dlouho dokud *in se
nerovná char nebo konec řetězce */
while (*in != '\0' && *in != ch) *out++ = *in++;
*out = '\0'; // ukončovací znak se zapíše jen do výstupního stringu
/* na konci stringu, pokud nejde o konec řetězce,
musí posunout ukazatel tak, aby ve výsledku nebylo
hledané písmeno */
return *in!='\0' ? in+1 : in;
}
abys nedelal pokazdy strlen a nepocital delku... vracim pointer na za znak, ktery se zpracoval naposledy, nebo na '\0' (tam je zadouci nepripocitavat 1, protoze by tam uz dalsi nula byt taky nemusela)
Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jo, dobrý tu funkci už mám komplet hotovou a už to chápu. Teď zas dělám něco jiného. Zkouším načíst binární soubor, načetl jsem hlavičku o délce 50 znaků do bufferu. Znaky v něm jsou zapsány zleva doprava (takže big endian). Mám v PC dvě funkce na převod:
Ale nevím jestli je to to co potřebuju. Když chci převést první čtyři znaky na uint32_t co mám udělat? Musím nejdříve ty 4 znaky nakopírovat do nějakého stringu a ten pak převést pomocí val=atoi(str)? A pak
UINT32_SWAP_LE_BE_CONSTANT(val)?
sama převede na správné číslo. Takže teď nevím, jestli ten zdroj je little endian nebo big endian, když je zapsaný zleva doprava? To číslo co jsem dostal je 428999169 a po převodu na HEX je 19 92 02 01 čteno zprava to odpovídá tomu co je v souboru čtené zleva. Tak nevím jestli mám výsledek v little endian nebo v big endian?
#41KIIV
Definice tam je, ale deklarace ne. Já měl za to že když je tam #define tak že to deklarovat nemusím. Ale nevím jaká je výhoda define, dal jsem to normálně bez define ale asi to nepotřebuju. Viz edit2: Když v souboru je číslo HEX čtené zleva doprava a funkce mi vrátí číslo HEX čtené zprava doleva, je ten výsledek v little endian nebo big endian? Zdroj byl myslím BE ale moje PC x86 pracuje v LE tedy zprava doleva, že?
A vypis hexa hodnot na obrazovku ti to vypise v prirozeny forme - tj. tak jak se zobrazuji cisla v pozicnich soustavach.
Jinak procesory x86 prezentuji cisla vzdy v little endianu. Ale jsou dalsi, co pouzivaji big endian. Pak dalsi, co si muzou vybrat.
Kazdopadne nejnizssi adresa bajtu v pameti ma v little endianu nejmensi vyznam. Bajt se zmeni o 1 a cislo se zmeni taky o 1. U big endianu zmenis byte na nejnizssi adrese, a to cislo se zmeni o 2^8 nebo 2^24
Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
#50KIIV
Protože coords nejsou souřadnice v úhlech ve správném slova smyslu.
coords[0] je integer (asi unsigned) ze kterého se vypočítávají bounding coordinates (tak jsem pochopil tu funkci). čili LONLAT_t lze použít až pro ukládání výsledných souřadnic ve stupních. Původní kód to ukládal do pole a já to předělal na struct. Chápu tu funkci tak, že extrahuje nebo vypočítává 4 čísla float z jednoho integeru. Moc do nedává smysl, ale je to tak.
Asi to chce odstranit ampersand, jenže pak nedostanu výsledek. To bych musel udělat talší funkci read4bytes která bude pracovat se dvěma pointerama...