Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите перевести код программы с ANSI C на Pascal / 15 сообщений из 15, страница 1 из 1
28.01.2010, 11:40
    #36435640
Fine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
Добрый день товарищи. Помогите перевести код программы с ANSI C на Pascal.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
/* Table of CRCs of all 8-bit messages. */
unsigned long crc_table[ 256 ];

/* Flag: has the table been computed? Initially false. */
int crc_table_computed =  0 ;

/* Make the table for a fast CRC. */
void make_crc_table(void)
{
  unsigned long c;
  int n, k;

  for (n =  0 ; n <  256 ; n++) {
    c = (unsigned long) n;
    for (k =  0 ; k <  8 ; k++) {
      if (c &  1 ) {
        c = 0xedb88320L ^ (c >>  1 );
      } else {
        c = c >>  1 ;
      }
    }
    crc_table[n] = c;
  }
  crc_table_computed =  1 ;
}

/*
   Update a running crc with the bytes buf[0..len-1] and return
 the updated crc. The crc should be initialized to zero. Pre- and
 post-conditioning (one’s complement) is performed within this
 function so it shouldn’t be done by the caller. Usage example:

   unsigned long crc = 0L;

   while (read_buffer(buffer, length) != EOF) {
     crc = update_crc(crc, buffer, length);
   }
   if (crc != original_crc) error();
*/
unsigned long update_crc(unsigned long crc,
                unsigned char *buf, int len)
{
  unsigned long c = crc ^ 0xffffffffL;
  int n;

  if (!crc_table_computed)
    make_crc_table();
  for (n =  0 ; n < len; n++) {
    c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >>  8 );
  }
  return c ^ 0xffffffffL;
}

/* Return the CRC of the bytes buf[0..len-1]. */
unsigned long crc(unsigned char *buf, int len)
{
  return update_crc(0L, buf, len);
}

Заранее спасибо.
...
Рейтинг: 0 / 0
28.01.2010, 13:18
    #36436066
Vowk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
Вот пока пробный вариант на Delphi (у мну паскаля нет), еще надо сравнить с результатами на С, возможны ошибки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
var
  crc_table_computed : Boolean;
  crc_table : array[ 1 .. 256 ] of LongWord;
procedure TForm1.Button1Click(Sender: TObject);
{ Return the CRC of the bytes buf[ 0 ..len- 1 ]. }
type
    tbuf = array of byte;
procedure make_crc_table();
var n,k : Integer;
    c : LongWord;
begin
   for n:= 1  to  256  do begin
      c := n;
      for k:= 1  to  8  do
         if odd(c) then  c := $EDB88320 xor (c shr  1 )
         else c:= c shr  1 ;
      crc_table[n] := c;
      end;
   crc_table_computed := True;
end;
function update_crc(crc: integer; buf:tbuf; len:integer): LongWord;
var
   n: Integer;
   c: LongWord;
begin
   c := crc xor $FFFFFFFF;
   if not crc_table_computed then  make_crc_table;
   for n:= 1  to len do c := crc_table[((c xor buf[n]) and $FF)+ 1 ] xor (c shr  8 );
   update_crc := c xor $FFFFFFFF;
end;

function crc_main(buf: tbuf; len: integer): integer;
begin
  crc_main := update_crc( 0 ,buf,len);
end;

var
   ar : tbuf;
   i : Integer;
   ret, ret1 : LongWord;
begin
   setlength(ar, 10 );
   for i:= 1  to  10  do ar[i]:=i;
   ret := crc_main(ar, 10 );
   ret1 := crc_main(ar, 10 );
   showmessage(IntToStr(ret)+ ' , ' + IntToStr(ret1));

end;
end.
...
Рейтинг: 0 / 0
28.01.2010, 13:45
    #36436164
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
Vowk
Код: plaintext
function update_crc(crc: integer; buf:tbuf; len:integer): LongWord;

Таки medword нужен.
...
Рейтинг: 0 / 0
28.01.2010, 13:53
    #36436189
Fine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
Спасибо за ответ.
Сейчас попробую.
...
Рейтинг: 0 / 0
28.01.2010, 13:54
    #36436193
Vowk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
Проверка в CBuildere дала другой результат. Ошибка заключалась в том, что в С индекс массива начинается с нуля, а в Delphi я выбрал с 1 (как это обычно делается). Но в данном случае индекс участвует в вычислениях, поэтому и в Delphi надо массив table_crc делать от 0 до 255,как и в С.
После исправления результаты в Delphi и CBuildere совпали.
Также с учетом выше сделанных замечаний привожу текст программы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
var
  crc_table_computed : Boolean;
  crc_table : array[ 0 .. 255 ] of LongWord;
procedure TForm1.Button1Click(Sender: TObject);
{ Return the CRC of the bytes buf[ 0 ..len- 1 ]. }
type
    tbuf = array of byte;
procedure make_crc_table();
var n,k : Integer;
    c : LongWord;
begin
   for n:= 0  to  255  do begin
      c := n;
      for k:= 1  to  8  do
         if odd(c) then  c := $EDB88320 xor (c shr  1 )
         else c:= c shr  1 ;
      crc_table[n] := c;
      end;
   crc_table_computed := True;
end;
function update_crc(crc: LongWord; buf:tbuf; len:integer): LongWord;
var
   n: Integer;
   c: LongWord;
begin
   c := crc xor $FFFFFFFF;
   if not crc_table_computed then  make_crc_table;
   for n:= 1  to len do c := crc_table[((c xor buf[n]) and $FF)] xor (c shr  8 );
   update_crc := c xor $FFFFFFFF;
end;

function crc_main(buf: tbuf; len: integer): integer;
begin
  crc_main := update_crc( 0 ,buf,len);
end;

var
   ar : tbuf;
   i : Integer;
   ret : LongWord;
begin
   setlength(ar, 10 );
   for i:= 1  to  10  do ar[i]:=i;
   ret := crc_main(ar, 10 );
   showmessage(IntToStr(ret));

end;
end.
...
Рейтинг: 0 / 0
28.01.2010, 14:17
    #36436257
Fine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
Спасибо Vowk за ответ.

А как Вы думаете результат данной программы на компиляторе ANSI C и CBuildere будут одинаковы ?
На Delphi я проверял, какой то результат получаю. А конкретно на ANSI C не знаю как проверить...

p.s. C для меня темный лес :(
...
Рейтинг: 0 / 0
28.01.2010, 14:21
    #36436273
Fine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
Еще один вопрос:
Результат должен быть 8-значное число, а у нас 9-значнное.
...
Рейтинг: 0 / 0
28.01.2010, 14:23
    #36436280
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
FineЕще один вопрос:
Результат должен быть 8-значное число, а у нас 9-значнное.
десятичное или шестандцатеричное ?
...
Рейтинг: 0 / 0
28.01.2010, 14:26
    #36436290
Fine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
AklinFineЕще один вопрос:
Результат должен быть 8-значное число, а у нас 9-значнное.
десятичное или шестандцатеричное ?
В шестандцатеричном виде.
...
Рейтинг: 0 / 0
28.01.2010, 14:28
    #36436295
Fine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
Если наш резуьлтат в 10-чном системе то в 16-ричном будет 8-значней.
...
Рейтинг: 0 / 0
28.01.2010, 14:31
    #36436303
Vowk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
Требование 8-значного ответа подразумевает представление результата в 16-ричной форме.
Для этого последнюю строку программы следует изменить например так:
Код: plaintext
1.
   showmessage(IntToStr(ret) + ' , ' + IntToHex(ret, 8 ));
...
Рейтинг: 0 / 0
28.01.2010, 14:43
    #36436339
Vowk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
Fine
А как Вы думаете результат данной программы на компиляторе ANSI C и CBuildere будут одинаковы ?

С очень большой вероятностью да.

А конкретно на ANSI C не знаю как проверить...

Можно взять MSC из MS Visual Studio.
Код: plaintext
1.
p.s.  C для меня темный лес :(
Осваивать С лучше по моему мнению на CBuilder-e, поскольку он ближе всего к Delphi по построению IDE и содержит много готовых вещей, что позволит сосредоточиться именно на изучении языка. Да и данный пример может быть отправной точкой.
Тут главное не перепутать назначение фигурных скобок. А то я как-то решил Паскаль изучать, составил простую программку типа "Hello, World" из учебника по С, запускаю - а она ничего не выводит на экран. Безуспешно провозившись полчаса, обратился за помощью к коллеге, который на Паскале хорошо составлял программы. Он пробовал и пыхтел еще час, покрывался пятнами от стыда, потом вдруг вкочил и с негодованием мне говорит, что я закомментарил программу и хочу, чтобы она еще и работала :)
...
Рейтинг: 0 / 0
28.01.2010, 14:58
    #36436392
Fine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
С кем не бывает :) ?
Вот например кода я видел в вашем ответе строку :
Код: plaintext
1.
2.
3.
4.
..........
procedure TForm1.Button1Click(Sender: TObject);
{ Return the CRC of the bytes buf[ 0 ..len- 1 ]. }
..........
Начал голову сламать, не понял что даст нам строка { Return the CRC of the bytes buf[0..len-1]. }
Хотел спросить, потом думал может это элементарное понятие и я не знаю... Может людям смешно станет после таково вопроса...
Скопировав код в интерфейс Delphi вспомнил что это коментария.

Еще раз спасибо.
Удачи...
...
Рейтинг: 0 / 0
01.02.2010, 17:58
    #36442849
Fine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
Vowk
Код: plaintext
1.
2.
3.
4.
5.
   setlength(ar, 10 );
   for i:= 1  to  10  do ar[i]:=i;
   ret := crc_main(ar, 10 );
   showmessage(IntToStr(ret));


Здесь в качестве исходных данных используется массив аr. Как передать программу в качестве исходных данных строки ?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
10.04.2012, 22:34
    #37747669
Чернышов Вадим Константинович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите перевести код программы с ANSI C на Pascal
Вот тут есть готовое решение http://www.efg2.com/Lab/Mathematics/CRC.htm
проверил, получил что надо!!!
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите перевести код программы с ANSI C на Pascal / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]