![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 3 Dołączył: 20.11.2004 Ostrzeżenie: (0%) ![]() ![]() |
Pytanie odtyczy kodu źródłowego php.
Czy moze mi ktoś napisać jakie funkcje są wykorzystywane w czasie wykonywania skryptu mniej wiecej takiego:
wydaje mi się że w celu wykonania takeigo kodu jest wykorzystywany taki plik jaki dałem w opisie czyli ext/standard/math.c, ale tam są funkcje na funkcje trygonometryczne i podobne. Czy ktoś mi pomoże? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
coś Ci się chyba Zigi pomieszało.
Po pierwsze do wykonania tego skryptu oprócz inicjalizajnych i cleanupowych funkcji samego php wykorzystuje się tylko jakiś php-owy (albo nawet i nie, może ten z glibc) odpowiednik printf[3]. Po drugie nie ma czegoś takiego jak prosty kalkulator... a już na pewno nie prosty kalkulator obsługujący nawiasy. To już musi być jakiś analizator składni. Jeżeli chcesz prosty kalkulator to kiedyś takowy napisałem, ale on wykonuje wszytko po koleji i ma tylko 4 działania (ale za to obsługa big numbers... z openssl, ale to już mankamenty techniczne). Uruchamiasz: `./bncalc 1 + 2 + 3` itp Kod /* Adam <adam-wieckowski@tlen.pl> Więckowski @ 30.10.2004 Compile: gcc -std=gnu99 -lsll -lc -pedantic -o bncalc bncalc.c */ #include <stdio.h> #include <error.h> #include <errno.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <openssl/bn.h> #include <openssl/err.h> int main(int ac, char *av[]) { BIGNUM *a, *b, *r; char buf[512]; BN_CTX *ctx=BN_CTX_new(); a=BN_new();b=BN_new();r=BN_new(); if(!BN_dec2bn(&r,av[1])) goto error; for(int i=2;i<=ac;i+=2) { if((ac-i)<2) { char *buf=BN_bn2dec(r); printf("%s\n", buf); /*OPENSSL_*/free(buf); BN_free(a);BN_free(b);BN_free(r); return 0; } if(!BN_dec2bn(&b,av[i+1])) goto error; if(BN_copy(a,r)==NULL) goto error; switch(*av[i]) { case '+': case 'a': if(!BN_add(r,a,b)) goto error; break; case '-': case 's': if(!BN_sub(r,a,b)) goto error; break; case '*': case 'm': case '.': if(!BN_mul(r,a,b,ctx)) goto error; break; case '/': case ':': case 'd': if(!BN_div(r,NULL,a,b,ctx)) goto error; break; } } error: fprintf(stderr,"%s\n",ERR_error_string(ERR_get_error(),buf)); exit(-1); } A jeżeli chcesz bardziej elastyczny kalkulator to już musisz rozbić działanie na części, ułożyć zgodnie z kolejnością wykonywania działań. Zainteresuj się może takimi rzeczami jak http://mathomatic.orgserve.de/math/. To JEST prosty kalkulator (15.000 linii kodu). A jeżeli chcesz zobaczyć jak robi to php, to zauważ, że on CAŁY jest jednym wielkim analizatorem składni. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 16.10.2025 - 12:08 |