Форум: "Основная";
Текущий архив: 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.094 c