Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

Правильно ли я превел с С на Pascal?   Найти похожие ветки 

 
DVM ©   (2005-10-26 10:19) [0]

Правильно ли я превел с С на Pascal? С С знаком мало, поэтому прошу знатоков С поглядеть.

// ------------ С ------------------

inline static char *memstr( register const char *s, const char *n, size_t limit )
{
 if ( limit <= 0 || !s || !n )
  return( 0 );

 if ( !*n )
  return( (char *)s );

 register int i,j,k;
 size_t n_len = strlen( n );

 for ( i = 0; i < limit; i++, s++ )
 {
  if ( *s != *n )
   continue;
  j = 1;
  k = 1;
  while ( true )
  {
   if ( k >= n_len )
    return( (char *)s );
   if ( s[j++] != n[k++] )
    break;
  }
 }
 return( 0 );
}

// ----------- Pascal ---------------------

function memstr(s, n: PChar; limit: integer): PChar;
var
 i,j,k,n_len: integer;
begin
 if (limit <= 0) or (s=nil) or (n=nil) then
   begin
     result := nil;
     exit;
   end;
 if (n^="") then
   begin
     result := s;
     exit;
   end;
 n_len := lstrlen(n);
 for i := 0 to limit-1 do
   begin
     if ( s^ <> n^ ) then continue;
     j := 1;
     k := 1;
     while ( true ) do
begin
  if ( k >= n_len ) then
           begin
             result := s;
             exit;
           end;
         inc(j); inc(k);
         if ( s[j] <> n[k] ) then break;
end;
     inc(s);
   end;
 result := nil;
end;


 
Axis_of_Evil ©   (2005-10-26 10:32) [1]

>   if ( !*n )            // if (n[0] == "0")
>   if (n^="") then

if (n^ = #0) then
кажется.
в остальном похоже, что верно


 
DVM ©   (2005-10-26 10:40) [2]


> if (n^ = #0) then
> кажется.

Я уже думал об этом, наверное все же действительно к #0 приравнивать надо.


 
DVM ©   (2005-10-26 10:50) [3]

Вот меня еще слово const смущает в С-шном варианте. На Pascal так просто не переделать, иначе потом я не смогу сделать, скажем inc(s).
С другой стороны s не надо трогать, т.е. нельзя дать функции возможность передвинуть указатель, который передан ей в параметрах. В С-шном варианте const что означает?


 
Игорь Шевченко ©   (2005-10-26 11:31) [4]


> В С-шном варианте const что означает?


то, что нельзя менять данные, на которые указывает указатель.


 
DVM ©   (2005-10-26 11:41) [5]


> то, что нельзя менять данные, на которые указывает указатель.

Именно данные нельзя менять? А сам указатель я могу изменить, например прибавить к нему 1?


 
Игорь Шевченко ©   (2005-10-26 11:50) [6]

DVM ©   (26.10.05 11:41) [5]

Конечно


 
DVM ©   (2005-10-26 15:02) [7]

Все же неправильно я перевел, так надо:


function memstr(s, n: PChar; limit: integer): PChar;
var
 i,j,k,n_len: integer;
begin
 if (limit <= 0) or (s=nil) or (n=nil) then
   begin
     result := nil;
     exit;
   end;
 if (n^=#0) then
   begin
     result := s;
     exit;
   end;
 n_len := lstrlen(n);
 for i := 0 to limit-1 do
   begin
     if ( s^ <> n^ ) then
       begin
         inc(s);
         continue;
       end;
     j := 1;
     k := 1;
     while ( true ) do
begin
  if ( k >= n_len ) then
           begin
             result := s;
             exit;
           end;
         inc(j); inc(k);
         if ( s[j-1] <> n[k-1] ) then exit;
end;
     inc(s);
   end;
 result := nil;
end;


 
Игорь Шевченко ©   (2005-10-26 15:40) [8]

DVM ©   (26.10.05 15:02) [7]

Я очень извиняюсь, ты функцию Pos для памяти изобретаешь ? Так их есть, этих фукнций по тырнету


 
DVM ©   (2005-10-26 16:07) [9]


> Я очень извиняюсь, ты функцию Pos для памяти изобретаешь
> ?

Уже изобрел. :) Да нужно осуществлять поиск и т.д. не обращая внимания на символы с нулевым кодом. И не только pos, еще:

function mempbrk(s, accept: PChar; limit: integer): PChar;
function memstr(s, n: PChar; limit: integer): PChar;
function memspn(s, accept: PChar; limit: integer): integer;
function memcspn(s, reject: PChar; limit: integer): integer;

В принципе написал вроде. Работают.

> Так их есть, этих фукнций по тырнету

А адрес, может, точный помните, где искать.

Вообще то, мне гораздо больше помог бы модуль для работы с регулярными выражениями, но тот, единственный, что я нашел, работает только со строками типа string, а мне нужно для произвольных буферов (содержащих возможно и нулевые символы). Может есть такой?


 
Игорь Шевченко ©   (2005-10-26 16:25) [10]

DVM ©   (26.10.05 16:07) [9]


> А адрес, может, точный помните, где искать.


Например, в http://delphibase.spb.ru

Я в свое время делал такое через CompareMem


> Да нужно осуществлять поиск и т.д. не обращая внимания на
> символы с нулевым кодом.


В таком случае выражение lstrlen в твоем переводе вычислит длину до первого нулевого символа, а это вроде противоречит условию.


 
DVM ©   (2005-10-26 16:33) [11]


> В таком случае выражение lstrlen в твоем переводе вычислит
> длину до первого нулевого символа, а это вроде противоречит
> условию.

Нет не противоречит именно в моем случае. Мне всегда надо искать нормальную строку (с завершающим нулевым символом) в буфере с неизвестным содержимым (содержащим и нулевые символы и прочее).
Этот буфер - это набор символов, составляющих видеосигнал в формате MotionJPEG в котором JPEG-и разделены текстовыми разделителями. Все это дело получается с веб-сервера.


 
Игорь Шевченко ©   (2005-10-26 16:38) [12]

DVM ©   (26.10.05 16:33) [11]

while длина_буфера_больше_образца do begin
  if CompareMem(буфер, образец, длина_образца) then
    break; //нашли
 Inc(буфер);
end;



Страницы: 1 вся ветка

Текущий архив: 2005.11.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.053 c
2-1130643453
gdaujk
2005-10-30 06:37
2005.11.20
TListView с функциональностью TValueListEditor.


14-1130596651
raiks
2005-10-29 18:37
2005.11.20
Статическое связывание *.exe, написанного на С++, и DLL, написанн


2-1130585016
Erl
2005-10-29 15:23
2005.11.20
MDI


5-1110285566
GuAV
2005-03-08 15:39
2005.11.20
procedure TCustomImageList.DefineProperties(Filer: TFiler);


4-1126712775
Delphir
2005-09-14 19:46
2005.11.20
Explorer Toolbar