Gdyby pójść Twoim tropem, można by wyjść z założenia że HTML jest takim samym językiem programowania jak C++, Visual Basic itp., a tymczasem wszystkie języki skryptowe wymagają do uruchomienia programów, których nie da się stworzyć w żadnym języku skryptowym.
Dlatego też proponowanego przez ciebie kodu zawarty w pliku explode.c nie da się przenieść na c++ czy nawet c, gdyż mimo iż jest napisany z wykorzystaniem języka c# to zawiera deklaracje zmiennych i funkcji, które są zrozumiałe tylko dla przeglądarki, a kompilator zupełnie by tego kodu nie rozpoznał. Wspomniany plik jest skryptem, a nie plikiem źródłowym, różnica polega na tym, że do interpretacji skryptów niezbędny jest jakiś host skryptów, który nie kompiluje takiego skryptu do postaci pliku wykonywalnego, lecz tylko go analizuje i wykonuje zawarte w nim polecenia w oparciu o schemat jaki został mu zaprogramowany.
Przykład z pliku:
- Kod: Zaznacz cały
PHPAPI void php_explode(zval *delim, zval *str, zval *return_value, int limit)
{
char *p1, *p2, *endp;
endp = Z_STRVAL_P(str) + Z_STRLEN_P(str);
p1 = Z_STRVAL_P(str);
p2 = php_memnstr(Z_STRVAL_P(str), Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp);
if (p2 == NULL) {
add_next_index_stringl(return_value, p1, Z_STRLEN_P(str), 1);
} else {
do {
add_next_index_stringl(return_value, p1, p2 - p1, 1);
p1 = p2 + Z_STRLEN_P(delim);
} while ((p2 = php_memnstr(p1, Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp)) != NULL &&
(limit == -1 || --limit > 1));
if (p1 <= endp)
add_next_index_stringl(return_value, p1, endp-p1, 1);
}
}
o ile char, void, if, else są rozpoznawalne o tyle można się tylko domyślać, że Z_STRVAL_P(str) jest funkcją pobierającą argument typu zval, ale nigdzie w bibliotekach c#, c++ nie znajdziesz deklaracji i definicji takiej funkcji i takiego typu danych, czyli chcąc przerobić ten kod na potrzeby programu musiałbyś najpierw dowiedzieć się jak działa funkcja Z_STRVAL_P i stworzyć taką samą funkcję w C++, nazwa jest tutaj nieistotna, istotny jest mechanizm, trzeba by się również dowiedzieć co to za typ zval (zval *delim, zval *str, zval *return_value) i zdefiniować podobny.
Reasumując, chcąc przenieść ten kod do programu trzeba by go przepisać zgodnie z językiem C++, tworząc własne towarzyszące mu funkcje, czyli więcej roboty niż stworzenie własnej funkcji.
Stworzenie funkcji explode zajęło mi 15 minut łącznie z testowaniem, realizuje ona dokładnie takie samo zadanie jak ta funkcja php_explode, czyli rozbija łańcuch znaków, na pojedyncze wyrazy w oparciu o separator i zwraca liczbę tych rekordów.
Porównanie tych dwóch funkcji:
- Kod: Zaznacz cały
PHPAPI void php_explode(zval *delim, zval *str, zval *return_value, int limit)
AnsiString explode(String tekst, String sep, int index, int &rec)
Jak widać moja funkcja również pobiera 4 argumenty String sep = zval *delim, String tekst = zval *str, int &rec = zval *return, int index = int limit, AnsiString explode = PHAPI void php_explode
stworzyłem ten kod zanim zobaczyłem plik explode.c, a podobieństwo funkcji jest duże, różne są jednak mechanizmy działania obydwu funkcji, gdyż jedna jest stworzona dla języka skryptowego, a druga dla języka programowania.





