Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 151
1

Работа с файлом - переменная в коде не меняет своего значения

08.04.2015, 19:32. Показов 1506. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!

Помогите пожалуйста с программой. В данной процедуре, программа открывает файл для чтения(в файле написан код какой-либо программы). Flag=false. Как только в строке появляется слово "begin" программа присваивает flag=true. Но сейчас программа просто проходит мимо. В результате в программе flag всегда равен false. Помогите пожалуйста исправить это.
Pascal
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
Procedure Search(var s1,str:string);
var
   f: text;
   s,g,s2: string;
   x,y,j,k,i: integer;
   flag: boolean;
 
begin
  flag:=false;
  assign(f,str);
  reset(f);
  s1:='';
  while not eof(f) do begin
  readln(f,s);
  while (length(s)>0) and (s[1]=' ') do delete(s,1,1);
  g:='begin ';
  if pos(g,s)=0 then flag:=true;         <------------вот здесь программа работает неправильно
  if flag=true then
  begin
  k:=length(s);
      for i:=1 to k do
      begin
        if  ((s[i]=':') and (s[i+1]='=')) then
       begin
       for j:=length(s1)-length(s2)+1 downto 1 do
    if copy(s1,i,length(s2))=s2 then delete(s1,i,length(s2));
        s1:=s1 + s2 + ' ';
        s2:='';
       end
        else
        begin
        if s[i]=';' then
        s2:=''
        else
        s2:=s2 + s[i];
        end;
  end;
 end;
end;
end;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2015, 19:32
Ответы с готовыми решениями:

TextBox не меняет своего значения
Здравствуйте всем. пишу на asp.net web forms. есть страница, которая используется для...

Переменная S в процедуре не меняет значения
Ввел вот такую простейшую прогочку Var A:integer; S:string; Procedure Chainsaw...

Переменная не меняет значения после обновления ее источныка с которого она и получила значение
Почему так происходит ?: (описал проблему в коментах) &lt;?php if(isset($_GET)) { ...

Работа с типизированным файлом: запись Шестнадцатеричного значения из Edit1 в файл
Здравствуйте ! надеюсь на помощь профи. Суть проблемы такая: задание было написать программу,...

18
CAPITAL OF ROCK!
1281 / 708 / 982
Регистрация: 03.03.2010
Сообщений: 2,286
09.04.2015, 03:46 2
Pascal
1
if pos(g,s)=0 then flag:=true;
если в строке s не найдётся подстроки 'begin ' -> flag := True;
то бишь вы всё наоборот делаете.
вообще, в вашем случае flag и не нужен. вместо
Pascal
1
2
3
g:='begin ';
  if pos(g,s)=0 then flag:=true;         <------------вот здесь программа работает неправильно
  if flag=true then
можно написать
Pascal
1
if (Pos('begin ', s) <> 0) then
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7770 / 4599 / 2824
Регистрация: 22.11.2013
Сообщений: 13,079
Записей в блоге: 1
09.04.2015, 08:25 3
Задание-то какое?

Добавлено через 12 минут
Это к тому, что перечень замечаний к коду больше самого приведенного кода программы... Начиная с того, что даже вы не ставите пробела после "begin", но почему-то надеетесь его там найти; хотите найти оператор присваивания в строке, начинающейся с "begin", но другие строки вас не интересуют; игнорируете регистронезависимость, а паскали не различают заглавные и строчные буквы; и так далее... Возможно у вас именно такое задание, но не видя его, не узнать.
0
CAPITAL OF ROCK!
1281 / 708 / 982
Регистрация: 03.03.2010
Сообщений: 2,286
09.04.2015, 11:07 4
bormant, я хотел было написать много-много текста по поводу листинга, но было лень.
код, к слову, ищет оператор присваивания только в строке, содержащей begin. что нелогично. но к теме вопроса это уже не относится.
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 151
09.04.2015, 16:52  [ТС] 5
Нужно написать программу, определяющую наличие неописанных идентификаторов в коде программы на Pascal.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
09.04.2015, 16:59 6
Цитата Сообщение от Zed11 Посмотреть сообщение
программу, определяющую наличие неописанных идентификаторов
Оно тебе надо, писать это? Не проще было бы откомпилировать код консольным компилятором, и парсить сообщения о результатах компиляции? В разы быстрее будет. Ну, или брать в \fpc-2.6.4.source\fpc-2.6.4\utils исходник ptop.pp, и смотреть, как там делается разбор программы.
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 151
09.04.2015, 17:16  [ТС] 7
К сожалению от этого не сбежать. Дали задание по курсовой, вот и пишу
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7770 / 4599 / 2824
Регистрация: 22.11.2013
Сообщений: 13,079
Записей в блоге: 1
09.04.2015, 17:33 8
Цитата Сообщение от Zed11 Посмотреть сообщение
программу, определяющую наличие неописанных идентификаторов в коде программы на Pascal.
я вас немножко огорчу -- подход к поиску неописанных идентификаторов вы выбрали вряд ли верный. Просто напомню, что в программе бывают комментарии ({ ... }, (* ... *)), строковые литералы ('...'), процедуры и функции со своими собственными разделами описаний переменных, процедуры и функции могут быть вложенными, бывают директивы условной компиляции ({$IFDEF}, {$IFNDEF}, {$IFOPT}, {$ENDIF}), отсекающие часть кода в том или ином варианте. Поэтому просто поиск begin/:= вам сильно не поможет.
1
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 151
09.04.2015, 18:34  [ТС] 9
А что можете посоветовать?

Добавлено через 11 минут
Я даже и не знаю других способов как можно сделать это

Добавлено через 6 минут
Можете помочь сделать, на основе моей программы, программу, которая ищет неописанные переменные в файле в котором хранится вот такой код:

Pascal
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
Program Kurs;
 
var
  f , tr:text;
  s:string;
  ok:boolean;
  i,j,l,g:integer;
 
begin
  write('Enter file name:');readln(s);
  assign(f,s);
  reset(f);
  l:=0;
  ok:=false;
  while not eof(f) do begin
    readln(f,s);s:=s+' ';
    while (length(s)>0) and (s[1]=#32) do delete(s,1,1);
      j:=pos('var ',s);
      if j=1 then ok:=true else
      if (j>1) and (s[j-1] in [';',' ']) then ok:=true;
      k:=pos('begin ',s);
      if k=1 then ok:=false else
      if (k>1) and (s[k-1] in [';',' ']) then ok:=false;
      if k=0 then k:=length(s);
      for i:=j+1 to k do
        if ((j>0) or ((j=0) and (ok))) and (s[i]=',') then inc(l);
        if ((j>0) or ((j=0) and (ok))) and (s[i]=':') then inc(g);
 end;
 
 close(f);
 writeln('Количество запятых: ',l);
 writeln('Количество двоеточий: ',g);
 writeln('Количество переменных: ', l+g);
end.
Вот код моей программы:
Pascal
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
Program Kurs;
var
   str, s1: string;
 
 
Procedure WriVar(var s1,str:string);
var
  f: text;
  s,s2: string;
  ok: boolean;
  i, j, k, l, g: integer;
 
begin
  assign(f,str);
  reset(f);
  s1:='';
  while not eof(f) do begin
    readln(f,s);
    s:=s+' ';
    while (length(s)>0) and (s[1]=' ') do delete(s,1,1);
      j:=pos('var ',s);
      if j=1 then ok:=true
      else
      if (j>1) and (s[j-1] in [';',' ']) then
      ok:=true;
      k:=pos('begin ',s);
      if k=1 then break
      else
      if (k>1) and (s[k-1] in [';',' ']) then
      ok:=false;
      if k=0 then
      k:=length(s);
      for i:=1 to k do
      begin
        if ((j>0) or ((j=0) and (ok))) and ((s[i]=',') or (s[i]=':')) then
       begin
       while (length(s2)>0) and (s2[1]=' ') do delete(s2,1,1);
       while (length(s2)>0) and (s2[length(s2)]=' ') do delete(s2, length(s2), 1);
        s1:=s1 + s2 + ' ';
        s2:='';
       end
        else
        begin
        if s[i]=';' then
        s2:=''
        else
        s2:=s2 + s[i];
        if s2=' var ' then s2:='';
        end;
 end;
 end;
 close(f);
 writeln('Ñòðîêà: ', s1)
 end;
 
Procedure Search(var s1,str:string);
var
   f: text;
   s,s2,s3,g: string;
   x,y,j,k,i,h: integer;
   flag: boolean;
 
 begin
 flag:=false;
  assign(f,str);
  reset(f);
  while not eof(f) do begin
  readln(f,s);
  while (length(s)>0) and (s[1]=' ') do delete(s,1,1);
  if (Pos('begin', s) <> 0) then flag:=true;
  if flag=true then
  begin
  k:=length(s);
      for i:=1 to k do
      begin
           if  ((s[i]=':') and (s[i+1]='=')) then
             begin
             for j:=i-1 downto 1 do
             if s2[j]=' ' or j=1 then
             else
             g:=g+s2[j];
             for h:= 1 to length(g) do s3:= s3 + g[h];
             end
           else
             begin
              if s[i]=';' then
               s2:=''
            else
               s2:=s2 + s[i];
             end;
  end;
 end;
end;
end;
 
 begin
  write('Enter file name:');
  readln(str);
  WriVar(s1,str);
  Search(s1,str);
 readln;
end.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
09.04.2015, 21:26 10
Цитата Сообщение от Zed11 Посмотреть сообщение
Я даже и не знаю других способов
Я выше написал как минимум 2 способа. Оба рабочие (особенно первый). Также можно взять класс TParser, и с его помощью производить разбор программы. Но то, что должен быть именно разбор, а не просто поиск подстрок - очевидно.
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 151
10.04.2015, 17:42  [ТС] 11
Цитата Сообщение от volvo Посмотреть сообщение
Не проще было бы откомпилировать код консольным компилятором, и парсить сообщения о результатах компиляции?
Напишите пожалуйста пример работы по такому способу. Паскаль начал изучать не так уж давно, поэтому понять принцип работы по вашему способу не могу
0
1642 / 1091 / 487
Регистрация: 17.07.2012
Сообщений: 5,345
10.04.2015, 21:37 12
Цитата Сообщение от Zed11 Посмотреть сообщение
Напишите пожалуйста пример работы по такому способу. Паскаль начал изучать не так уж давно, поэтому понять принцип работы по вашему способу не могу
Triple facepalm...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
11.04.2015, 01:09 13
Лучший ответ Сообщение было отмечено Zed11 как решение

Решение

Цитата Сообщение от Zed11 Посмотреть сообщение
пример работы по такому способу
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
uses SysUtils, Process;
 
var
  proc : TProcess;
  path, outfile : string;
begin
  path := 'D:\__Volvo\Programs\pascal\t215.pp';
  outfile := ChangeFileExt(path, '.txt');
 
  proc := TProcess.Create(nil);
  // пути к исходнику и к компилятору подправь
  proc.CommandLine := 'D:\FPC\2.6.4\bin\i386-win32\fpc.exe -b ' + path +
                      ' -Fe' + outfile;
  proc.Options := proc.Options + [poWaitOnExit];
  proc.Execute;
 
  proc.Free;
end.
, после прогона этой программы я получил файл D:\__Volvo\Programs\pascal\t215.txt, содержащий:
Free Pascal Compiler version 2.6.4 [2014/03/06] for i386
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling D:\__Volvo\Programs\pascal\t215.pp
t215.pp(4,6) Error: Identifier not found "a"
t215.pp(21) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted
Сколько тебе понадобится времени, чтобы перебрать все строки, и найти среди их те, где присутствует "Error: Identifier not found"? Заметь, у тебя уже есть сам неописанный идентификатор, и номер строки/столбца исходника, в котором он встретился. А сколько бы понадобилось времени, чтобы разобрать текст программы как положено, и найти это другим путем?
1
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 151
11.04.2015, 12:38  [ТС] 14
Понял, спасибо, буду работать.
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 151
13.04.2015, 17:53  [ТС] 15
Добрый день!

Подскажите пожалуйста, не до конца понял Вашу программу.

Смотрите, в этой строке мы выбираем файл, который будем компилировать
Цитата Сообщение от volvo Посмотреть сообщение
path := 'D:\__Volvo\Programs\pascal\t215.pp';
Далее в этой строке
Цитата Сообщение от volvo Посмотреть сообщение
outfile := ChangeFileExt(path, '.txt');
мы создаем новый файл t215.txt

И вот не совсем понятны вот эти строки:
Цитата Сообщение от volvo Посмотреть сообщение
proc.CommandLine := 'D:\FPC\2.6.4\bin\i386-win32\fpc.exe -b ' + path + ' -Fe' + outfile;
В первой мы запускаем компилятор, единственное не пойму зачем мы используем -b ' + path + ' -Fe' + outfile;
А вот вторая строка не понятна.
Цитата Сообщение от volvo Посмотреть сообщение
proc.Options := proc.Options + [poWaitOnExit]

Объясните пожалуйста, если Вам не сложно

Добавлено через 35 минут
И ещё, часто бывает что пишет Fatal: Can't open file "Test.pas"
Хотя путь указан правильно. Может ли это быть из-за того, что названия некоторых папок на русском?
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 151
13.04.2015, 18:03  [ТС] 16
Точнее теперь выдает вот такую ошибку(на фото).

Код программы:
Pascal
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
Program Kurs;
uses SysUtils, Process;
 
Procedure Compile();
var
  proc : TProcess;
  path, outfile : string;
begin
  write('Введите путь к файлу .pas: ');
  readln(path);
  outfile := ChangeFileExt(path, '.txt');
 
  proc := TProcess.Create(nil);
  proc.CommandLine := 'C:\FPC\2.6.4\bin\i386-win32\fpc.exe -b ' + path +
                      ' -Fe' + outfile;
  proc.Options := proc.Options + [poWaitOnExit];
  proc.Execute;
 
  proc.Free;
  readln;
  end;
 
begin
Compile;
end.
Миниатюры
Работа с файлом - переменная в коде не меняет своего значения  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
13.04.2015, 18:17 17
Цитата Сообщение от Zed11 Посмотреть сообщение
В первой мы запускаем компилятор, единственное не пойму зачем мы используем -b ' + path + ' -Fe' + outfile;
опция -b - для полной пересборки программы, а опция -Fe - для того, чтобы сообщения об ошибках не выводились в консоль, а сохранялись в файл с заданным именем.
Цитата Сообщение от Zed11 Посмотреть сообщение
теперь выдает вот такую ошибку(на фото)
Ну правильно. Тебе же не удалось откомпилировать файл, вот компилятор и вернул ошибку. Все ошибки при этом сохранились в txt-файл. Если в программе нет test.pas нет ошибок - то этого сообщения не будет.
1
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 151
13.04.2015, 19:21  [ТС] 18
А, всё, понял. Забыл про файл. Спасибо!
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7770 / 4599 / 2824
Регистрация: 22.11.2013
Сообщений: 13,079
Записей в блоге: 1
14.04.2015, 07:36 19
volvo,
Опции у FPC регистрозависимые, пересборка -- это -B, а -b -- это генерация "browse info".
0
14.04.2015, 07:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2015, 07:36
Помогаю со студенческими работами здесь

Передача своего своего значения в HIWORD и LWORD параметра WPARAM, реально?
Как вы знаете когда идёт передача сообщения с ним уходят параметры wParam и lParam Так вот мне...

Функция не меняет своего значенияф между вызовами
Не уверен, что это проблема именно Qt. писал функцию для формирования рандомного цвета в hex вида...

Переменная не меняет свое значение
Привет. Почему вот в этом варианте, при вызове функции, у меня не изменяется значение переменной?...

Переменная меняет значение в зависимости от времени
Всем привет, прошу прощения за вопрос из разряда &quot;Хочу но не могу&quot;. Вроде не очень сложная...

Глобальная переменная не меняет значение в Асинхронном методе
Здравствуйте, возникла следующая проблема: У меня есть асинхронный метод где я считываю данные...

Глобальная переменная после вызова функции меняет значение
До flag = 0; odnorod_pril(buffer1); После int odnorod_pril(char *buffer) { flag точно равен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru