Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Вниз

Правильно ли я превел с С на 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.039 c
2-1131044175
злобная танька
2005-11-03 21:56
2005.11.20
array


14-1130343340
Gydvin
2005-10-26 20:15
2005.11.20
Совместимость Wi-Fi and Bluetooth


9-1120581169
Green_Templar
2005-07-05 20:32
2005.11.20
пересечение отрезка и прямоугольника


1-1130596156
FunkyByte
2005-10-29 18:29
2005.11.20
Проблема при вставке текста из буффера обмена в Memo


3-1128085302
ZedeS
2005-09-30 17:01
2005.11.20
Быстая работа с большой базой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский