Portál AbcLinuxu, 24. dubna 2024 00:29


Dotaz: adresy v Cecku

28.11.2006 14:22 pierre
adresy v Cecku
Přečteno: 181×
Odpovědět | Admin
Ahoj. Neviete mi niekto poradit, ako by som retazec o 100 znakov mohol citat ale s pripocitanim adresy? Nechcem to riesit takto : retazec[i]
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

28.11.2006 14:27 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: adresy v Cecku
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nějak vám nerozumím. Myslíte 'retazec+i'?
28.11.2006 14:41 akbar
Rozbalit Rozbalit vše Re: adresy v Cecku
myslim to tak ze k adrese retazca pripocitam hexadecimalnu hodnotu, aby som sa dostal v stacku na druhy znak v retazci a potom na treti atd...
28.11.2006 14:48 petr
Rozbalit Rozbalit vše Re: adresy v Cecku
char *c;
char *new_ptr;

{
    ...

    for (int i = 0; i < n; i++) {
        ...
        // sizeof(char) není nutný, protože
        // překladač správně zjistí,
        // že používáme char
        new_ptr = c + (sizeof(char) * i);
        ...
    }

    ...
}
28.11.2006 14:50 petr
Rozbalit Rozbalit vše Re: adresy v Cecku
jen doufám, že jsem to nepodělal, protože v C již neprogramuji (tedy – když nemusím – a donutit se nenechám)
28.11.2006 15:25 finn | skóre: 43 | blog: finnlandia | 49° 44´/13° 22´
Rozbalit Rozbalit vše Re: adresy v Cecku
No, sizeof(char) je _vždy_ rovno jedné.
Užívej dne – možná je tvůj poslední.
28.11.2006 16:14 rastos | skóre: 62 | blog: rastos
Rozbalit Rozbalit vše Re: adresy v Cecku
>> jen doufám, že jsem to nepodělal

Podělal.

>No, sizeof(char) je _vždy_ rovno jedné.

To je síce pravda. Ale keď mám pole štruktúr, kde tá štruktúra má 40 bajtov. Tak sa po tom poli neposúvam
MY_STRUCT *p; ...
p=p+sizeof(MY_STRUCT);
ale
p=p+1;
O tom je pointrová matematika.
29.11.2006 11:52 petr
Rozbalit Rozbalit vše Re: adresy v Cecku
To je síce pravda. Ale keď mám pole štruktúr...
Snad pole pinterů na struktury, ne?

Pak je to p = p + sizeof(MY_STRUCT *)
29.11.2006 12:02 pasmen | skóre: 45 | blog: glob | Praha
Rozbalit Rozbalit vše Re: adresy v Cecku
Tak to uz vubec ne. Pointerova matematika hovori jasne: kdyz prictes k pointeru jednicku, zmeni se jeho adresa presne o velikost typu, na ktery ukazuje.
29.11.2006 13:38 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: adresy v Cecku
nie presne :-) Existuje niečo také ako "zarovnanie"
zmení sa tak, že bude ukazovať na nasledujúci prvok

inak povedané, ptr[index] je ekvivalentné s *(ptr + index), *(index + ptr) i index[ptr] ... odovzdať zadanie s tým posledným zápisom by tiež mohlo byť zábavné :-))

Josef Kufner avatar 29.11.2006 17:12 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: adresy v Cecku
... a proto není možné počítat s pointerem na void. Na to jsem si taky jednou naběh :-D
Hello world ! Segmentation fault (core dumped)
29.11.2006 17:30 pasmen | skóre: 45 | blog: glob | Praha
Rozbalit Rozbalit vše Re: adresy v Cecku
lol
30.11.2006 00:33 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: adresy v Cecku
No tak jednoduše: přetypovat na int, udělat výpočet, přetypovat zpátky a pak se zamyslet, proč to do...... dělám tak blbě ...
Quando omni flunkus moritati
Josef Kufner avatar 30.11.2006 08:36 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: adresy v Cecku
Mno, ono je lepší to přetypovat na typ na který ten pointer doopravdy ukazuje a s žádnýma podivnýma výpočtama se neobtěžovat ;-)
Hello world ! Segmentation fault (core dumped)
clayman avatar 29.11.2006 12:11 clayman | skóre: 13 | Praha 6
Rozbalit Rozbalit vše Re: adresy v Cecku
sizeof(MY_STRUCT*) ti vrati velikost adresy, ne ty struktury, co je na ni ulozena.
29.11.2006 17:28 petr
Rozbalit Rozbalit vše Re: adresy v Cecku
Ale o to mi přeci jde, protože je to pole pointerů na strukturu nikoli pole struktur, kde leží jedna struktura tak jak je za druhou. Takže, když se (v prvním případě) posunu o sizeof(MY_STRUCT *), tak se dostanu na pointer následující struktury, což je to, co chci... Nebo mi něco uniklo?

Omlouvám se, ale v C jsem psal naposledy před pěti lety a tohle je to, co mi v hlavě zbylo...

Děkuji za pochopení.
29.11.2006 17:36 pasmen | skóre: 45 | blog: glob | Praha
Rozbalit Rozbalit vše Re: adresy v Cecku
Ty nemas pole pointeru na struktury, ty mas pole struktur. Nekde si o tom znova precti. Ve zkratce: identifikator pole je v podstate ukazatel na prvni prvek toho pole, muze se tedy vyskytovat vsude tam, kde ukazatel (vyjma leve strany prirazeni). Dale operator indexovani pole [] funguje jako operator + pro ukazatele a cele cislo. Plati toto:
int arr[10];

*(arr + 10) == arr[10];
O tomhle je ta pointerova aritmetika.
29.11.2006 21:21 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: adresy v Cecku
V takovémhle případě dokonce ve slušném OS platí arr[10] == arr[11] == … == Segmentation fault, core dumped :-)
Ještě na tom nejsem tak špatně, abych četl Viewegha.
Josef Kufner avatar 29.11.2006 23:33 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: adresy v Cecku
S tím bych si dovolil nesouhlasit. Segmentation fault (bohužel) bude až pointer odleze z adresového prostoru toho procesu, takže arr[10] nejspíš trefí nějaká data, která si tam odložil malloc, sousední proměnnou nebo něco podobného. Každopádně to na zmíněnou rovnost *(arr + 10) == arr[10] nemá vliv ;-)
Hello world ! Segmentation fault (core dumped)
30.11.2006 12:04 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: adresy v Cecku
Já bych doopravdy čekal, že segmentation fault nastane při pokusu o přístup do paměti, která není tomu procesu přidělená. Vím, že alokátor glibc si nechává přidělovat nějaké souvislé větší bloky, ale když jsem to vyzkoušel, nevěřil jsem svým očím -- nejenže arr[10] je v pohodě, dokonce i arr[2557] je v pohodě (žádné jiné proměnné nebyly). Segmentation fault až u arr[2558]. To číslo asi nemá žádný velký význam, ale jsou snad ty bloky velikosti 10 kB? Technice se dneska prostě nedá věřit :-) (Nekamenujte mne, prosím, za pravděpodobnou neznalost elementárních skutečností, nejsem céčkař – naštěstí :-) ).
Ještě na tom nejsem tak špatně, abych četl Viewegha.
30.11.2006 12:24 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: adresy v Cecku
Velikost 10 KB mi nepřipadá nijak nesmyslně velká, alokace paměťového bloku od jádra je relativně náročná operace. Navíc si musíte uvědomit, že jednotlivé alokované bloky na sebe mohou navazovat, takže se můžete trefit i do sousedního.
30.11.2006 11:13 podlesh | skóre: 38 | Freiburg im Breisgau
Rozbalit Rozbalit vše Re: adresy v Cecku
V takovémhle případě dokonce ve slušném OS platí arr[10] == arr[11] == … == Segmentation fault, core dumped :-)
S OS to bohužel moc nesouvisí, protože malloc při normálním provozu nealokuje paměť od OS. Paměť se alokuje po větších blocích a tam si pak dělá libc vlastní správu.

Alokování paměti přímo od OS společně s "ochrannými bloky" pro coredump zajišťuje například electricfence (či nekterý z přehršle pokročilejších nástroju). MSVC má také takovou feature. Samozřejmě mezi základní pravidla psaní v C patří (vedle např. "netolerovat warningy"), že při vývoji se vždy linkuje s efence. V provozu se samozřejmě nic takového pouhžít nedá, to zpomalení je o několik řádů.
28.11.2006 14:53 akbar
Rozbalit Rozbalit vše Re: adresy v Cecku
Vidim ze ma nikto nepochopil, tak ze, zadanie je asi taketo v cykle (je jedno akom) mam pouzivat iba jednu premenu, ktoru mozem nazvat ako chcem. A k hodnotam retazca sa musi pristupovat pomocou adries. Tak ze ziadne "+i" si nemozem dovolit.
28.11.2006 15:01 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: adresy v Cecku
  for (p = ...; *p; p++) {
    ...
  }

P.S.: Pokud vás nikdo nepochopil, zkuste se zamyslet nad tím, zda není problém ve vašich formulacích.

28.11.2006 15:01 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: adresy v Cecku
No a co ++retezec?

K čemu jsou tyhle školní úlohy? že by se z toho někdo naučil programovat, o tom dost pochybuju…
28.11.2006 15:03 pasmen | skóre: 45 | blog: glob | Praha
Rozbalit Rozbalit vše Re: adresy v Cecku

#include <stdio.h>

int main()
{
        char *str = "Nejaky retezec", *tmp = str;

        while (*tmp)
                printf("%c", *tmp++);

        exit(0);
}

Tohle ti vypise cely retezec. Nebo je i tohle neco jineho nez jsi chtel?

Jakub Hájek avatar 28.11.2006 15:06 Jakub Hájek | skóre: 14 | blog: zamek | Praha
Rozbalit Rozbalit vše Re: adresy v Cecku
Myslis neco takoveho?
char * buf = "Good niht white pride!"

while(* buf != 0)
{
  printf("znak na adrese %d je %c\n",buf,*buf);
  ++buf;
}

Teprve tehdy, až nebudeme mít co ztratit, budeme opravdu svobodní.
28.11.2006 15:31 akbar
Rozbalit Rozbalit vše Re: adresy v Cecku
myslim nieco taketo void posun(int cislo){ (*(&cislo - 1)) = (*(&cislo - 1)) + 0x10; } len neveim ako to mam spravit pre ten retazec.
28.11.2006 15:37 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: adresy v Cecku
Zkuste se soustředit a konečně srozumitelně napsat, co vlastně chcete. Nevím jak ostatní, ale mne už to hádání nebaví.
28.11.2006 15:40 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: adresy v Cecku
A tohle vás někde učí, nebo jste tuhle prasárnu vymyslel sám?
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
28.11.2006 15:45 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: adresy v Cecku
Nejvíc mne ovšem děsí, že gcc proti tomu zběsilému nápadu aplikovat operátor & na parametr předávaný hodnotou nemá námitek.
28.11.2006 15:47 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: adresy v Cecku
Tak to jsme přinejmenším dva :-)
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
28.11.2006 16:09 rastos | skóre: 62 | blog: rastos
Rozbalit Rozbalit vše Re: adresy v Cecku
Prečo? Prameter odovzdávaný hodnotou sa uloží na stack. To pamäťové miesto na stacku má svoju adresu. A to je to čo vráti &. Či už s tou adresou robíš rozumné veci, alebo nie, je druhá vec.
28.11.2006 16:21 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: adresy v Cecku
Prečo? Prameter odovzdávaný hodnotou sa uloží na stack.

Možná. A nebo také ne…

28.11.2006 23:00 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: adresy v Cecku
Pokud beru adresu, tak se prekladac musi postarat o to, ze to na ni najdu. V tomhle bych problm nevidel.
Josef Kufner avatar 28.11.2006 23:26 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: adresy v Cecku
Pokud ovšem předá parametr v registru procesoru, tak žádnou adresu opravdu nemá.
Hello world ! Segmentation fault (core dumped)
Vašek Lorenc avatar 28.11.2006 23:59 Vašek Lorenc | skóre: 27
Rozbalit Rozbalit vše Re: adresy v Cecku
Překladač si obvykle udržuje přehled o tom, co se s danou proměnnou dělá, toho bych se nebál.. Jinak by nemohl dělat některé optimalizace.
...včetně majestátného loosa
29.11.2006 03:53 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: adresy v Cecku
to ale dokáže len v prípade, ak k tej premennej pristupujete. Ak len predpokladáte, že prekladač niečo nejak urobí, vzniká problém (ako v tomto prípade).
29.11.2006 00:01 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: adresy v Cecku
Z cehoz vyplyva, ze pokud se na adresu ptam, tak tu hodnotu do registru ukladat nemuze. Respektive musi to zaonacit tak, aby ukazatel ukazoval tam, kam ukazovat ma.
28.11.2006 23:15 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: adresy v Cecku
Docela by me zajimalo, co podle vas tato funkce dela a pokud jste ji zkusil nekde pouzit, jak jste dopadl.
28.11.2006 15:47 akbar
Rozbalit Rozbalit vše Re: adresy v Cecku
Odpovědět | | Sbalit | Link | Blokovat | Admin
tk ze chcu po mne asi toto : Program musí obsahovať samostatnú knižnicu s funkciou, ktorá vykoná úlohu a) z prvého zadania, pričom táto funkcia nebude pristupovať k argumentom a lokálnym premenným pomocou ich mien - až na jednu, ktorú si môžete zvoliť - ale len prostredníctvom ich adries na zásobníku (stacku). Potrebné údaje o ich umiestnení zistíte pomocou debuggovacieho nástroja 'gdb'. Funkcia musí vracať dĺžku spracovaného reťazca, pričom nesmie byť použitý príkaz 'return'. Na načítavanie reťazca, prípadne ďalších potrebných údajov môžete použiť štandardné knižničné funkcie.
28.11.2006 15:53 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: adresy v Cecku
Co je to za nesmysl? Specifikace jazyka C o žádném zásobníku nemluví, dokonce, jak jsem právě zjistil, se v ní výraz stack vůbec nevyskytuje. To je pouze interní záležitost konkrétních implementací jazyka, takovými věcmi byste se v programu vůbec neměl zabývat.
28.11.2006 15:59 sulo
Rozbalit Rozbalit vše Re: adresy v Cecku
ja by som ti odporucil pouzit iny jazyk alebo radsej nechat to naprogramovat niekomu inemu.
*** glibc detected *** free(): invalid next size (fast): 0x0804b6b0 *** 652 Aborted (core dumped)
28.11.2006 15:59 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: adresy v Cecku
Myslím, že chápu, o co vám jde, jenže nehodlám podobné techniky podporovat. Psaní nepřenositelných programů považuji za vymýceníhodný nešvar obecně a ohledně psaní programů, jejichž funkčnost by mohlo ovlivnit už pouhé zapnutí optimalizace, za to by měly být tělesné tresty.
28.11.2006 16:30 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: adresy v Cecku
To bolo o písaní. A čo by malo byť pre zadávateľov? :-)
riešenie (a vcelku prenositeľné) aj pre blbé školské zadanie, nájde pýtajúci sa v man va_start
28.11.2006 16:44 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: adresy v Cecku
Totéž, jen tresty přísnější. Protože psát prasárny je sice hrozné, ale učit prasárny je daleko horší.
28.11.2006 16:56 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: adresy v Cecku
lol ... a to som si až teraz všimol to zadanie "nesmie byť použitý return". Chudák chlapec, takého blba chytiť v škole, pokazený celý život :-))
Jardík avatar 28.11.2006 17:10 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: adresy v Cecku
Uznávám, zadání dementní. Ale hodnotu přece bez return vrátit můžu, asi takto:
void func(int& bla)
{
  bla = 20; //vrátil jsem hodnotu
}
Věřím v jednoho Boha.
28.11.2006 17:17 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: adresy v Cecku
V C++. V C by se to muselo řešit přes pointer.
Jardík avatar 28.11.2006 18:08 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: adresy v Cecku
Aha. Já myslel, že i C umí reference. Tak tedy pointerem.
Věřím v jednoho Boha.
28.11.2006 18:33 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: adresy v Cecku
Ne, to je výmysl C++, zmiňuje se o tom i Stroustrup ve svém slavném rozhovoru (je to skoro na konci). :-)
28.11.2006 17:18 pasmen | skóre: 45 | blog: glob | Praha
Rozbalit Rozbalit vše Re: adresy v Cecku
On to chtel v C, ktere reference neumi...
Josef Kufner avatar 28.11.2006 17:45 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: adresy v Cecku
void func(int *bla)
{
  *bla = 20;
}
 
/* pouziti: */
int n;
func(&n);
Hello world ! Segmentation fault (core dumped)
29.11.2006 13:53 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: adresy v Cecku
To je napřesdržku, nedej bože abych nějakého jeho študáka potkal jako kolegu. To není strestné?
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
29.11.2006 16:55 podlesh | skóre: 38 | Freiburg im Breisgau
Rozbalit Rozbalit vše Re: adresy v Cecku
To je napřesdržku, nedej bože abych nějakého jeho študáka potkal jako kolegu. To není strestné?
Pokud se jedná o střední školu (a nižší ročník než čtvrťák), tak by se to dalo kvalifikovat jako "ohrožování mravní výchovy mládeže".
28.11.2006 16:01 Zdenek
Rozbalit Rozbalit vše Re: adresy v Cecku
Proc se clovek cpe nekam na co evidentne nema? Nick menite jak se vam zachce a ani otazku neumite preformulovat, tak aby to vypadalo, ze chcete pomoct a ne vyresit zadany ukol. Fuj.
28.11.2006 16:19 rastos | skóre: 62 | blog: rastos
Rozbalit Rozbalit vše Re: adresy v Cecku
Uverejni meno toho magora čo takéto veci chce, nech má poriadnu hambu. Keď chce učiť pointre a C, tak nech vymyslí zmysluplné zadanie. A keď chce učiť, ako sa odovzdávajú parametre cez stack (a ako sa vracia návratová hodnota v registri), tak nech to nazve pravým menom: assembler.
28.11.2006 17:00 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: adresy v Cecku
ak je toto celé zadanie, si v pohode, nič nespomína o globálnych premenných ani o makrách :-)

va_list list;
char * ptr;

void fun (int * retval, ...) {
  va_start (list, retval);

  ptr = va_arg (list, char *);
  for (*retval = 0; *ptr; (*retval)++, ptr++)
    ;
}
PS: kompilovať ani inak kontrolovať sa mi to nechcelo, idea je snáď jasná :-)
Jardík avatar 28.11.2006 17:15 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: adresy v Cecku
  1. Chybí ti tam va_end :)
  2. Co když nezadá další parametr?
Věřím v jednoho Boha.
28.11.2006 17:35 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: adresy v Cecku
ad 1, ad 2 ... to už je na pýtajúcom sa, ja som len naznačil cestu :-D
28.11.2006 16:01 akbar
Rozbalit Rozbalit vše Re: adresy v Cecku
Odpovědět | | Sbalit | Link | Blokovat | Admin
to nejde, dnes to musim mat este som nasiel taketo nieco, ale sa s toho neviem vymotat
for((*(&retazec-3))=0;(int)(*(&retazec-3))<(int)(*(&retazec-4));(*(&retazec-3))++)

        {

        (((char*)(*(&retazec)))[(int)(*(&retazec-3))])=(((char*)(*(&retazec)))[(int)(*(&retazec-3))])^0x39;

        fprintf(stdout,"%c",(((char*)(*(&retazec)))[(int)(*(&retazec-3))]));

        }

         asm(""::"eax" (*(&retazec-4)))
28.11.2006 16:03 Zdenek
Rozbalit Rozbalit vše Re: adresy v Cecku
Aaaaa. To je konstrukce, jdete velmi spravnym smerem ;-)
28.11.2006 16:06 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: adresy v Cecku

Víte, k čemu slouží domácí úkoly? K tomu, abyste si na nich ověřil, zda látce rozumíte, a pokud ne, abyste to napravil. Tím, že si úkol necháte napsat od někoho jiného, ztrácí úkol svůj smysl.

Jinak je ten váš kód moc hezký, začíná mi to (opticky) trochu připomínat LISP… :-)

28.11.2006 16:27 petr
Rozbalit Rozbalit vše Re: adresy v Cecku
Dopr...e a tohle je co??? Omlouvám se, že jsem sprostý, ale připomíná mi to spíš Havlovu básničku nebo obfusknutej JavaScript s optimalizací na co největší velikost, ale program v jazyce C opravdu ne!

Víte, když se tak na to dívám, tak přesně takovou prasárnu jsem opravoval v Midnight Commanderu. Můžete mi vysvětlit, jakou má přidanou hodnotu fprintf(stdout, "%c", ...)??? Proč nepoužijete putc()??? Umíte si vůbec představit, jakej overhead mají *printf() funkce? V tom MC to bylo v místě, kde se generoval příkaz pro subshell a bylo tam přesně to samý... Tam to navíc převádělo do oktalový soustavy... Pár bitovejch posunů místo printf() a najednou byl midnight použitelnej!

Takhle bych vyučoval programování na konzervatoři, protože bych měl jistotu, že žádný ze studentů se tím nikdy bavit nebude.
28.11.2006 17:05 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: adresy v Cecku
btw, existuje niečo ak define
#define A ( (int)(*(&retazec-3)) )
#define B ( (int)(*(&retazec-4)) )
28.11.2006 16:12 akbar
Rozbalit Rozbalit vše Re: adresy v Cecku
Odpovědět | | Sbalit | Link | Blokovat | Admin
ja nechcem aby mi ju niekto pisal, otazka bola polozena na zaciatku. chcem len trocha pomoct, lebo na nete nic nieje.
28.11.2006 16:17 retkarach
Rozbalit Rozbalit vše Re: adresy v Cecku
myslim, ze asi najviac ti pomoze nejaka pekna a obsiahla ucebnica jazyka C ;)
maybe you can DO IT !!!
28.11.2006 16:18 pasmen | skóre: 45 | blog: glob | Praha
Rozbalit Rozbalit vše Re: adresy v Cecku
Na puvodni otazku ti odpovedelo X lidi: pouzit konstrukci typu *str++. Vis vubec neco u ukazatelich?
28.11.2006 16:19 sulo
Rozbalit Rozbalit vše Re: adresy v Cecku
Pocuj a to robis nejaku sutaz. Alebo preco prave takymto sposobom to potrebujes riesit? Su aj krajsie konstrukcie.
*** glibc detected *** free(): invalid next size (fast): 0x0804b6b0 *** 652 Aborted (core dumped)
Jardík avatar 28.11.2006 17:25 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: adresy v Cecku
Odpovědět | | Sbalit | Link | Blokovat | Admin
Se s tím ne*er:
strlen:
  push ecx
  xor ecx,ecx
  xor eax,eax
  dec ecx
  cld
  repne scansb
  neg ecx
  mov eax,ecx
  pop ecx
  ret
Do ES:EDI hoď adresu řetězce, výsledek dostaneš v ecx. V céčku to zabal do asm{}(nebo jak se tam vkládá kód assembleru) + navíc tam bude řádek, kde ukládáš tu adresu do es:edi, ale jelikož jsem v C nikdy s vkládaným assemblerem nedělal (podle mně je to čuňárna), tak nevím jak.
Věřím v jednoho Boha.
Jardík avatar 28.11.2006 17:34 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: adresy v Cecku
Jinak zadanou úlohu nelze jinak než va_listem řešit, protože i když napíšeš:
void neco(const char *retezec, unsigned long long int& vysledek)
{
  vysledek = 0;
  while(*retezec++) ++vysledek;
}
Tak to zadání nesplňuje - retezec je totiz nazev promenne typu char* (ukazatel na první znak v poli x znaků). Pokud bys použil *(&retezec), zase jsi přistoupil k proměnné pomocí jména. Ukazatel na proměnnou totiž bez jména proměnné nezjistíš. Když předáš funkci rovnou ukazatel, přistoupíš k ukazatelu jménem. Úloha je neřešitelná. A navíc, kde je napsáno, že v C na všech platformách jsou předávány argumenty funkcím na stacku? Většinou tomu tak je, ale nemusí.
Věřím v jednoho Boha.
29.11.2006 09:32 podlesh | skóre: 38 | Freiburg im Breisgau
Rozbalit Rozbalit vše Re: adresy v Cecku
A navíc, kde je napsáno, že v C na všech platformách jsou předávány argumenty funkcím na stacku? Většinou tomu tak je, ale nemusí.
Některé platformy ani zásobník nemají.
29.11.2006 15:34 akbar
Rozbalit Rozbalit vše Re: adresy v Cecku
Odpovědět | | Sbalit | Link | Blokovat | Admin
Uz som to spravil, ma to byt takto

int uloha_a(char *str){
int pocet = 0, i = -1;                                                         /*pocet -> (&i - 1), str -> (&str + 4)*/

    while (((char *) * (&i + 4))[i++] != NULL){                                /*prehladavanie retazca po znaku, s podmienkou skoncenia*/
        if (((char *) * (&i + 4))[i] >= '0' && ((char *) * (&i + 4))[i] <= '9')/*porovnavanie znaku z cislicou*/
            (*(&i - 1))++;                                                     /*ak je znak cislica, pocet sa inkrementuje o 1*/
        }
    }
    asm("" :: "eax" ((*(&i - 1)) - 1));                                        /*vratenie poctu cislic v retazci, cez 32 bit zasobnik eax */
}
Pomocou gdb som si zistil o kolko sa nachdza adresa dvoch dalsich premennych, a zapisal to.
29.11.2006 15:36 pasmen | skóre: 45 | blog: glob | Praha
Rozbalit Rozbalit vše Re: adresy v Cecku
1. K cemu je takovahle !@#$%^ ?
2. Na ktery !@#$%^ skole se tohle uci?
29.11.2006 15:42 hm
Rozbalit Rozbalit vše Re: adresy v Cecku
Fakt geniální... jen pytlík na zvracení jste zapomněl přiložit...
29.11.2006 16:11 RD
Rozbalit Rozbalit vše Re: adresy v Cecku
náhodou chválím, tohle je přesně podle desatera úspěšného programátora, pokud takhle napíšete strategicky důležitou aplikaci, budete mít jistotu trvalého zaměstnání ;o)

http://sorry.vse.cz/~xkecm01/readtext.php?txt=hippokrates.htm&kat=dF92ZWRhLmluYw==
29.11.2006 16:42 Mti. | skóre: 31 | blog: Mti
Rozbalit Rozbalit vše Re: adresy v Cecku
Nepochvalim. C neumim. (jen pouzivam). Ale eax urcite neni zasobnik ale "pouhy" registr. :-( (co ja bych za to dal mit v ATmega32 neco tak velikeho jako EAX :-) , nejlepe na matematiku...)
Vidim harddisk mrzuty, jehoz hlava plotny se dotyka...
30.11.2006 09:37 secido | skóre: 27
Rozbalit Rozbalit vše Re: adresy v Cecku
Je to humus, tu sú krajšie veci
30.11.2006 13:37 wintermute
Rozbalit Rozbalit vše Re: adresy v Cecku
Zadanie malo nadpis "Ako zhovadit pocitanie cislic v retazci v jazyku C tak aby funkcia nebola prenositelna na inu platformu ako x86"? Lebo mam dojem, ze takmer na nicom inom Vam to uz fungovat nebude. Ani na x86_64 (AMD64) v 64bitovom rezime. Priam ucebnicovy priklad toho ako sa programovat nema. Za nieco take by malo byt povolene strielat bez toho aby to bolo klasifikovane ako vrazda.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.