explode

dział ogólny

Re: explode

Nowy postprzez Cyfrowy Baron » wtorek, 22 lipca 2008, 09:48

Oczywiście, że tak, ale język Java jest językiem skryptowym, a skrypty napisane w tym języku wymagają do uruchomienia Hosta skryptów, czyli programu, więc porównywanie języka skryptowego do języka tworzenia aplikacji ma się nijak.
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. :geek: :ugeek:
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: explode

Nowy postprzez Koziol » wtorek, 22 lipca 2008, 11:36

Ale więcej nauczysz się przerabiając kod ten z pliku explode.c niż kożystając z gotowca. Myśle że się z e mną zgodzisz, wkońcu trzeba przejżeć kod zrozumieć o co w nim chodzi rozwija się w tedy, jak to nazywał mój wykładowca "programistyczny punkt widzenia". A co do szybkości pisania kodu. Znasz się na tym i to bardzo więc Tobie zajmie to mniej czasu mi pewnie wymyślenie i przepisanie na kod zajęło by coś około godziny jak nie więcej.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: explode

Nowy postprzez wargo » sobota, 16 sierpnia 2008, 19:03

No tak, masz rację ale skąd mozna pobrac kody źródłowe php?
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: explode

Nowy postprzez Koziol » poniedziaÅ‚ek, 18 sierpnia 2008, 00:02

http://www.php.net/downloads.php
a nastepnie
Complete Source Code - na dole strony jest
a nastepnie klikasz link PHP 4.4.9 (tar.bz2) albo PHP 4.4.9 (tar.gz) zalezy co wolisz :)
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: explode

Nowy postprzez Darek_C++ » sobota, 23 sierpnia 2008, 13:32

Funkcją zbliżoną do explode z PHP jest funkcja ExtractStrings
Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   String str = "a, b, c, d, e";
   TStringList *Lista = new TStringList;
   ExtractStrings(TSysCharSet()<<', ',TSysCharSet()<<' ',str.c_str(),Lista);

   for(int ii = 0; ii < Lista->Count; ii++)
   {
      String dane = Lista->Strings[ii];
      Memo1->Lines->Add(dane);
   }

   delete Lista;Lista = NULL;
aż dziwne, że nie padła taka odpowiedź ;)
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
PodziÄ™kowaÅ‚ : 66
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    NieznanyNieznana

Poprzednia strona

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości