LINUX.ORG.RU

Занимательный PAS2C

 , , ,


1

2

Привет!

Вчера вечером от нефиг делать игрался с сабжем.

Кто скажет почему этот код работает не так как ожидается?

/* Output from p2c 2.00.Oct.15, the Pascal-to-C translator */
/* From input file "Numbers.pas" */


#include <stdlib.h>
#include <stdio.h>

typedef struct item {
  int data;
  struct item *next;
} item;


int main()

{
  struct item *first = NULL;
  struct item *tmp;
  

  

  while (scanf("%d", &tmp->data)!= EOF) {
    
    tmp = (item *)malloc(sizeof(item));

    tmp->next = first;
    first = tmp;			
  }
  tmp = first;
  

  while (tmp != NULL) {
    printf("%d", tmp->data);
    tmp = tmp->next;
  }

  return 0;
}



/* End. */

program Numbers1;
type
itemptr = ^item;
item = record
data: integer;
next: itemptr;
end;
var
first,tmp: itemptr;
n: integer;
begin
first := nil;

while not SeekEof do

begin
read(n);
new(tmp);

tmp^.data := n;

tmp^.next := first;
first := tmp;

end;
tmp := first;

while tmp <> nil do

begin
writeln(tmp^.data);
tmp := tmp^.next 
end
end.

А именно, как вы можете видеть, теряется последний элемент связного списка, а головной элемент записывается дважды.

Такой вот машинный перевод)

Программа взята из книги Столярова, for fun.

★★★★★

Последнее исправление: Twissel (всего исправлений: 2)

Я вижу undefined behaviour:

struct item *tmp;
while (scanf("%d", &tmp->data)!= EOF) {
В паскале оно читается во временную переменную, а здесь неизвестно куда.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

С отдельной переменной

/* Output from p2c 2.00.Oct.15, the Pascal-to-C translator */
/* From input file "Numbers.pas" */


#include <stdlib.h>
#include <stdio.h>

typedef struct item {
  int data;
  struct item *next;
} item;


int main()

{
  struct item *first = NULL;
  struct item *tmp;
  int n;

  

  while (scanf("%d", &n)!= EOF) {
    
    tmp = (item *)malloc(sizeof(item));

    tmp->data = n;

    tmp->next = first;
    first = tmp;			
  }
  tmp = first;
  

  while (tmp != NULL) {
    printf("%d", tmp->data);
    tmp = tmp->next;
  }

  return 0;
}



/* End. */

Все аналогично.

Добавлено:

Под отладчиком смотреть лень, кидайте помидоры)

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от xaizek

Да, это оно. Не пересобирало бинарник :-)

beastie, как все отпишутся, сноси тему.

ЛОР засорять не хочу.

Twissel ★★★★★
() автор топика
Ответ на: комментарий от xaizek

В паскале оно читается во временную переменную

Как раз тут-то без нее легко обойтись:

  while not SeekEoF do begin
    New(tmp);
    Read(tmp^.data);
    tmp^.next:=first;
    first:=tmp;
  end;

bormant ★★★★★
()

Спасибо всем, кто отписался!

Вот, что ЛОР животворящий делает!

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)

Вчера вечером от нефиг делать игрался с сабжем.

А интересно, как этот сабж обрабатывает фичи паскаля, не имеющие прямого отображения в Си - локальные процедуры, конструкцию with, множества? Даёт ошибку или что-то всё же генерирует?

Ну и какой диалект паскаля он вообще обрабатывает - оригинальный виртовский, или что-то хотя бы на уровне начала 90-х, с модулями и прочим?

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Ну и какой диалект паскаля он вообще обрабатывает - оригинальный виртовский, или что-то хотя бы на уровне начала 90-х, с модулями и прочим?

Начала 90-х это какой-то римейк, как я понимаю, утилиты 1993-го года.

Транслирует с мусором, я правил вручную http://rgho.st/77xk97YTb .

Twissel ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Использовал чисто из спортивного интереса, олскул же!

Twissel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.