2015-02-04 1 views
1

Я пытаюсь написать комментарий стриппера в паскале. Я запускаю свой код и передаю ему исходный код кода C, и он удаляет комментарии из файла и выводит результат на терминал.Pascal - Написание странных символов

Я довольно новичок в паскале. Я получаю очень странный результат, и я не могу понять, почему. Код проверяет комментарии по строкам и печатает символы по одному. Считыватель комментариев печатает то, что кажется случайным символом, когда оно достигает начала новой строки. Я использую функцию Pascals Write (Str [i]) для печати символов и WriteLn() после достижения конца строки.

Я понятия не имею, зачем им получать странный выход. Я запускаю Linux Mint и могу скомпилировать и запустить свой код, но я получаю этот странный вывод. Я также попытался запустить свой код на Mac и получил ошибку во время выполнения:

Program Path: ./Assignment1 
File Name: lol.c 
Runtime error 2 at $00011532 
$00011532 
$0002F7F6 
$000113FD 
$00011328 
$00000002 

Вот мой код

program Assignment1; 

uses 
    Sysutils; 

var UserFile : TextFile; 
    TString  : String; 
    OLine  : String; 
    i   : integer; 
    isComment : boolean; 
    skip   : boolean; 

begin 

    {$I+} 
    WriteLn('Program Path: ', ParamStr(0)); 
    WriteLn('File Name: ', ParamStr(1)); 

    Assign(UserFile, ParamStr(1) + '.c'); 
    Reset(UserFile); 

    isComment := false; 
    skip := true; 

    Repeat 

     Readln(UserFile, TString); 

     for i:= 0 to ((Length(TString) - 1)) do 
     begin 
      if(skip) then 
       begin 
        skip := false; 
        continue; 
       end; 


      if(isComment = false) Then 
      begin 

       if(TString[i] = '/') Then 
       begin 
        if(TString[i+1] = '/') Then 
        begin 
         break; 
        end 

        else if(TString[i+1] = '*') Then 
        begin 
         isComment := true; 
         skip := true; 
         continue; 
        end; 
       end; 

       Write(TString[i]); 
       if(i = Length(TString) - 1) Then 
        begin 
        Write(TString[i + 1]); 
        end; 

      end 

      else 
      begin 
       if(TString[i] = '*') Then 
       begin 
        if(TString[i + 1] = '/') Then 
        begin 
         isComment := false; 
         skip := true; 
         continue; 
        end; 
       end; 
      end; 

     end; 

     WriteLn(); 

    Until Eof(UserFile); 

end. 

Я получаю случайных символов, которые варьируются от стандартных символов клавиатуры для Юникода блоков, таких как найденные here.

Есть ли у кого-нибудь предложения?

+1

В Паскале строки обычно основаны на 1. –

+0

'' if (TString [i + 1] '': может привести к ошибке диапазона. Вы должны скорее скопировать идентификатор и проверить его значение. –

ответ

2

Как 500 - Внутренняя ошибка сервера говорит, что строки Pascal основаны на 1. Ваши ссылки на нулевой слот возвращают мусор. Если это 256-байтовые строки, вы получаете код длины, я не помню макет памяти строк, основанных на указателях, чтобы узнать, что вы получаете в этом случае. Из-за этого вы также теряете последний символ каждой строки.

За что я вижу определенную ошибку: Посмотрите на то, что происходит с конца строки в/

Я тоже не понимаю:

  if(i = Length(TString) - 1) Then 
       begin 
       Write(TString[i + 1]); 
       end; 

Мне кажется, что это писать дополнительный характер, но Я не уверен.

+0

1-я причина была причиной моих проблем. Код, заканчивающийся на '/' может вызвать проблемы. Для простоты я предполагаю, что все C-коды должным образом отформатированы. Я считаю, что C-код не может заканчиваться «/» и компилировать. Кроме того, поскольку я иногда индексирую TString с использованием i + 1, я могу запускать только 'i = 0 to Length (TString) - 1'. Это означает, что' TString [Length (TString)] 'должно быть напечатано, когда' i = Length (TString) - 1'. Спасибо за вашу помощь, очень благодарен. –

+0

@MattyChuck Это не так, как работает программирование. Вы не можете просто игнорировать символы, потому что иногда ссылаясь на их взрывы, вы должны исправить свою логику. –

+0

Я думаю, что вы недопонимаете, я не игнорирую никаких символов. Если мой второй последний символ не в комментарии или в начале комментария, мой последний персонаж в строке наверняка тоже не может быть. В любом случае, мой стриппер комментариев работает безупречно в этот момент. но спасибо за беспокойство. –

 Смежные вопросы

  • Нет связанных вопросов^_^