powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите перевести код программы с ANSI C на Pascal
15 сообщений из 15, страница 1 из 1
Помогите перевести код программы с ANSI C на Pascal
    #36435640
Fine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день товарищи. Помогите перевести код программы с 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
Помогите перевести код программы с ANSI C на Pascal
    #36436066
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пока пробный вариант на 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
Помогите перевести код программы с ANSI C на Pascal
    #36436164
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vowk
Код: plaintext
function update_crc(crc: integer; buf:tbuf; len:integer): LongWord;

Таки medword нужен.
...
Рейтинг: 0 / 0
Помогите перевести код программы с ANSI C на Pascal
    #36436189
Fine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответ.
Сейчас попробую.
...
Рейтинг: 0 / 0
Помогите перевести код программы с ANSI C на Pascal
    #36436193
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверка в 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
Помогите перевести код программы с ANSI C на Pascal
    #36436257
Fine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Vowk за ответ.

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

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

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

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

Можно взять MSC из MS Visual Studio.
Код: plaintext
1.
p.s.  C для меня темный лес :(
Осваивать С лучше по моему мнению на CBuilder-e, поскольку он ближе всего к Delphi по построению IDE и содержит много готовых вещей, что позволит сосредоточиться именно на изучении языка. Да и данный пример может быть отправной точкой.
Тут главное не перепутать назначение фигурных скобок. А то я как-то решил Паскаль изучать, составил простую программку типа "Hello, World" из учебника по С, запускаю - а она ничего не выводит на экран. Безуспешно провозившись полчаса, обратился за помощью к коллеге, который на Паскале хорошо составлял программы. Он пробовал и пыхтел еще час, покрывался пятнами от стыда, потом вдруг вкочил и с негодованием мне говорит, что я закомментарил программу и хочу, чтобы она еще и работала :)
...
Рейтинг: 0 / 0
Помогите перевести код программы с ANSI C на Pascal
    #36436392
Fine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С кем не бывает :) ?
Вот например кода я видел в вашем ответе строку :
Код: 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
Помогите перевести код программы с ANSI C на Pascal
    #36442849
Fine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Период между сообщениями больше года.
Помогите перевести код программы с ANSI C на Pascal
    #37747669
Чернышов Вадим Константинович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут есть готовое решение http://www.efg2.com/Lab/Mathematics/CRC.htm
проверил, получил что надо!!!
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите перевести код программы с ANSI C на Pascal
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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