Portál AbcLinuxu, 24. dubna 2024 00:29
retazec[i]
retazec+i
'?
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); ... } ... }
MY_STRUCT *p; ...
p=p+sizeof(MY_STRUCT);
ale
p=p+1;
O tom je pointrová matematika.
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 *)
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é )
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í.
[]
funguje jako operator +
pro ukazatele a cele cislo. Plati toto:
int arr[10]; *(arr + 10) == arr[10];O tomhle je ta pointerova aritmetika.
arr[10] == arr[11] == … == Segmentation fault, core dumped
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ů.
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.
++retezec
?
K čemu jsou tyhle školní úlohy? že by se z toho někdo naučil programovat, o tom dost pochybuju…
#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?
char * buf = "Good niht white pride!" while(* buf != 0) { printf("znak na adrese %d je %c\n",buf,*buf); ++buf; }
void posun(int cislo){
(*(&cislo - 1)) = (*(&cislo - 1)) + 0x10;
}
len neveim ako to mam spravit pre ten retazec.
&
na parametr předávaný hodnotou nemá námitek.
Prečo? Prameter odovzdávaný hodnotou sa uloží na stack.
Možná. A nebo také ne…
man va_start
void func(int& bla) { bla = 20; //vrátil jsem hodnotu }
void func(int *bla) { *bla = 20; } /* pouziti: */ int n; func(&n);
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".
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á
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)))
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… :-)
#define A ( (int)(*(&retazec-3)) ) #define B ( (int)(*(&retazec-4)) )
*str++
. Vis vubec neco u ukazatelich?
strlen: push ecx xor ecx,ecx xor eax,eax dec ecx cld repne scansb neg ecx mov eax,ecx pop ecx retDo
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.
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í.
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í.
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.
Tiskni Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.