Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
5 / 5 / 1
Регистрация: 17.05.2010
Сообщений: 108
1

Не могу найти ошибку(очистить форму необходимо)

10.05.2012, 17:26. Показов 939. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите!! Скачал курсовую, программу на delphi, не могу ее подправить. Замучался уже! Сдавать надо(
Программа транслятор с паскаля на бейсик. Смысл в том, что при нажатии кнопку "ТРАНСЛИРОВАТЬ" он считывает с файла код паскаля и его транслирует. Но при повторном нажатии, он к предыдущему тексту вставляет новый. Memo.Clear делал, но суть не в этом. В какой то переменной или в буфере остаются предыдущие значения, я их всех обнулял либо ничего не происходит либо с ошибкой вылетаем. Бьюсь уже несколько дней, не знаю что делать...
Unit1.pas
Delphi
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Grids, Buttons;
 
type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Memo1: TMemo;
    Memo2: TMemo;
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    Button2: TButton;
    StringGrid1: TStringGrid;
    Label1: TLabel;
    Label3: TLabel;
    StringGrid2: TStringGrid;
    StringGrid3: TStringGrid;
    Label4: TLabel;
    Memo3: TMemo;
    Label5: TLabel;
    Memo4: TMemo;
    Label6: TLabel;
    Label2: TLabel;
    BitBtn1: TBitBtn;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TWords=array [1..50] of string;
  TPred=array[1..8] of string;
  Tmain_program = record
      vars : integer; //число переменных
      start_vars : integer; // номер первой переменной в таблице переменных
      text : array[1..1000] of TWords;
      st_num : integer;
    end;
  Tprocedurs = record
       text : array [1..100] of Tmain_program;// для каждой продрограммы текст заносится в отдельную ячейку массива text
                                              // возможно до 100 подпрограмм
       num : integer;
     end;
const
  operators : TPred = ('program', 'const','label','type','var','begin','end','end.');
var
  Form1: TForm1;
  infile : text;
  path : string;
  Nstrok : integer; // номер строки в BASIC
  programname : string; // имя программы
  n_var : integer; // количество переменных
  n_const : integer; // количество констант
  n_proc : integer; //  количество процедур
  main_program : tmain_program; // место для построчной записиосновной программы
  procedurs : Tprocedurs; // массив с текстами процедур
  body : boolean; // тело программы
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  st : string;
begin
  if OpenDialog1.Execute then         //открываем файл и отображаем его на форме
    begin
      Memo1.Clear ;
      path := OpenDialog1.FileName;  // определяем путь к файлу с входным текстом
      AssignFile(infile,path);
      reset(infile);
      while not EOF(infile) do
        begin
          readln(infile,st);  // чтение файла,  его отображение на форме
          Memo1.Lines.Add(st);
        end;
      closefile(infile);  
    end;
end;
 
procedure Def_words(str1:string;var mas:Twords;var cnt:word);
{выделение слов из строчки программы. Предплагается, что все слова разделены пробелами}
var x:word;
    st : string;
    jj : integer;
 
begin
  for jj := 1 to 50 do mas[jj] := '';  // очищаем выходной массив слов
  str1:=str1+' ';
  repeat      // выделение слов по пробелам
    x:=pos(' ',str1);
    st := copy(str1,1,x-1);
    if (st <> '') and (st <> ' ' ) then
    begin
      mas[cnt+1]:= st;
      inc(cnt);
    end;
    delete(str1,1,x);
  until str1='';
end;
 
 
procedure TForm1.Button2Click(Sender: TObject);    //кнопка трансляции
var
  st : string;
  razd : integer; // номер активного раздела
                  // 1 var
                  // 2 const
                  // 3 begin
                  // 4 end
                  // 5 procedure / function
 
function zamena (s : string) : string; // при необходимости производится замена отдельных слов
var
  i : integer;
  ch : char;
begin
  result := s;
  if s = ':=' then result := '='; // замена знака присваивания
  for i := 1 to n_var do // замена переменных с указанием их типа
    if s = StringGrid1.Cells[1,i] then result :=  StringGrid1.Cells[3,i];
  for i := 1 to n_const do  // замена констант на их значения
    if s = StringGrid2.Cells[1,i] then result :=  StringGrid2.Cells[2,i];
  if length(s) >=2 then  // замена " " на ' ' при описании переменных типа string
    begin
      ch := char(39);
      if (s[1] = ch) and (s[length(s)] = ch)   then
        begin
          s[1] := '"';
          s[length(s)] := '"';
          result := s;
        end;
    end;
end;
 
function Find_oper(arr :TWords) : word;  // выделяет ключевые слова из строки программы
var
  tmparr : TWords;
  i,j,k,l,num : integer;
  start_num : integer;
  all_complete : boolean;
  tmpst : string;
  sttype : string;
  tmpst1 : string;
  ch : char;
begin
  if arr[1] = 'program' then       // дирктива program не обрабатывается
    begin
      programname := arr[2];
    //  delete(programname,length(programname),1);
    end;
 
  if arr[1] = 'var' then  // начало раздела переменных
    begin
      razd := 1;
      for i := 2 to 50 do arr[i-1] := arr[i];
    end;
 
  if arr[1] = 'type' then razd := 0; // начало раздела описания типов (не обрабатывается)
 
  if arr[1] = 'const' then      // константы
    begin
      razd := 2;
      for i := 2 to 50 do arr[i-1] := arr[i];
    end;
  if arr[1] = 'begin' then razd := 3; // начало операторных скобок
  if arr[1] = 'end' then razd := 4; // конец операторных скобок
  if (arr[1] = 'procedure') or (arr[1] = 'function') then  // объявление процедур и функций
    begin
      razd := 5;
    end;
  case razd of     // согласно текущему разделу выполняются действия
    1: begin       // переменные
         i := 1;
         start_num := n_var;  // номер первой переменной текущего типа
         while arr[i] <> '' do
           begin
             while arr[i] <> ':' do
               begin
                 if arr[i] <> ',' then
                   begin
                     StringGrid1.Cells[1,n_var+1]:= arr[i]; // в таблицу переменных заносятся имена переменных
                     inc(n_var);
                   end;
                 inc(i);
               end;
             inc(i);
             for j := 1 to n_var do  StringGrid1.Cells[0,j] := IntToStr(j); // нумеруются строки таблицы переменных
             StringGrid1.RowCount := n_var+1;  // при необходимости добавляются строки в таблицу переменных
             for j := (start_num+1) to n_var do StringGrid1.cells[2,j] := arr[i]; // заносятся типы переменных
             inc(i);
           end;
       end;
 
    2: begin  // константы
         if arr[1] <> '' then
           begin
             inc(n_const);  // увеличивается количество констант
             StringGrid2.RowCount := n_const+1;  // увеличивается число строк таблицы констант
             StringGrid2.Cells[1,n_const]:= arr[1];  // записывается имя константы
             StringGrid2.Cells[2,n_const]:= arr[3]; // записывается значение константы
             StringGrid2.Cells[0,n_const] := IntToStr(n_const); // нумеруются строки таблицы констант
           end;
       end;
 
    3: begin  // операторные скобки (begin  end)
         all_complete := true; // флаг того , что все подпрограммы описаны
         if n_proc <> 0 then    // если количество подпрограмм <> 0 nj
           for i := 1 to n_proc do
             if StringGrid3.Cells[2,i] = ''  then all_complete := false;
 
         if ((n_proc = 0) or all_complete) and body then   //записываем текст основной программы
           begin
             inc(main_program.st_num );
             for i := 1 to 50 do
               main_program.text[main_program.st_num][i] := arr[i]; // переписываем в контейнер оснвной программы строку
           end;
 
         if (n_proc <> 0) and (not all_complete) then   // записываем текст подпрограмм
           begin
             if not body then inc(procedurs.num); // если не основная программа, то увеличивается количество подпрограмм
             if body then                         // и начинается запись в контейнер новой подпрограммы
               begin
                     i := procedurs.num ; // номер процедуры
                     inc(procedurs.text[i].st_num);   // увеличивается количество строк в подпрограмме
                     j := procedurs.text[i].st_num ;
                     procedurs.text[i].text[j] := arr;   // присвоение строки в контейнер подпрограммы
               end;
           end;
         body := true;
       end;
 
    4: begin // конец операторных скобок
         body := false;
         if arr[2] = '.' then // конец программы
           begin
             for i := 1 to 1000 do // вывод  текста основной программы
               begin
                 tmpst := '';
                 for j := 1 to 50 do
                   tmpst := tmpst + main_program.text[i][j];
                 if tmpst <> '' then
                   Memo3.Lines.Add(tmpst);
               end;
             for i := 1 to procedurs.num do   // вывд текста подпрограмм
               begin
                  Memo4.Lines.add('Подпрограмма №' + IntToStr(i));
                  tmpst := '';
                  for j := 1 to 1000 do
                    begin
                      tmpst := '';
                      for k:= 1 to 50 do
                        tmpst := tmpst + procedurs.text[i].text[j][k];
                      if tmpst <> '' then
                        Memo4.Lines.Add(tmpst);
                    end;
               end
           end;
         if arr[2] <> '.' then // если не конец программы, а конец описания подпрограммы
           begin
             i := n_proc;
             while stringgrid3.Cells[2,i] <> ''  do // определяем строку в таблице подпрограмм, для которой не установлена связь с текстами подпрограмм
               dec(i);
             if i <> 0 then
               stringgrid3.Cells[2,i] := IntToStr(procedurs.num ); // заполняем
           end;
       end;
 
    5: begin //процедуры  и функции
         inc(n_proc);
         StringGrid3.RowCount := n_proc + 1;
         StringGrid3.Cells[1,n_proc] := arr[2];
         StringGrid3.Cells[0,n_proc] := IntToStr(n_proc);
         if arr[1] = 'procedure' then
           StringGrid3.Cells[3,n_proc] := 'proc'
         else
           StringGrid3.Cells[3,n_proc] := 'func';
         if arr[3] = '(' then     // выделяем переменные параметров вызова подпрограмм
           begin
             for i := 1 to 50 do tmparr[i] := '';  // очищаем строку
             i := 4;
             j := 1;
             while arr[i] <> ')' do
               begin
                 tmparr[j] := arr[i];
                 inc(i);
                 inc(j);
               end;
             i := 1;
             k := 1;
             tmpst1 := '';
             while tmparr[i] <> '' do
               begin
                 while (tmparr[i] <> ';'){and (Pos(';',tmparr[i]) = i)} and (tmparr[i] <> '' ) do  // определяем тип
                   begin
                     inc(i);
//                     tmpst1 := tmparr[i];
//                     ch := tmpst1[length(tmpst1)];
                   end;
                 sttype := tmparr[i-1];
                 for j := k to (i - 3) do
                   begin
                     if tmparr[j] <> ',' then
                       begin
                         inc(n_var);                        // добавляем переменные подпрограмм в таблицу переменных
                         StringGrid1.RowCount := n_var+1;
                         StringGrid1.Cells[1,n_var] := arr[2]+'_'+tmparr[j];
                         StringGrid1.Cells[2,n_var] := sttype;
                         StringGrid1.Cells[4,n_var] := arr[2];
                         StringGrid1.Cells[0,n_var] := IntToStr(n_var);
                       end;
                   end;
                 inc(i);  
                 k := i;
               end;
           end;
       end;
  end;
end;
 
procedure Analis(st: string);  //процедура анализа строки
var
  arr : TWords;
  cnt1,cnt_out : word;
  i : integer;
  st1 : string;
begin
  cnt1:=0;
  if st <> '' then
    if st[length(st)] = ';'  then delete(st,length(st),1);
  st1 := '';
  for i := 1 to length(st) do
    begin  // добавляем пробелы где надо и где ненадо
      st1 := st1 + st[i];
      if (st[i]='(')or(st[i]=')')or(st[i]='+')or(st[i]='-')or(st[i]='*')or(st[i]='/')
        or(st[i]=';')or(st[i]='=')or(st[i]=',')then st1 := st1 + ' ';
      if (st[i+1]='(')or(st[i+1]=')')or(st[i+1]='+')or(st[i+1]='-')or(st[i+1]='*')or(st[i+1]='/')
        or(st[i+1]=':'){or(st[i]='=')}or(st[i+1]=',')then st1 := st1 + ' ';
    end;
  st := st1;
  Def_words(st,arr,cnt1);   // разбиваем входную строку на слова по пробелам
  cnt_out := Find_oper(arr);    // поиск ключевых слов
 
end;
 
 
 
procedure transl;  // процедура трансляции, формирует текст на BASIC
var
  i,j,k,l,m, num,proc_v, proc_num : integer;
  tmpst,st1,st2, st3, proc_name, func_st : string;
  proc, proc_ok, func  : boolean;
  arr1, arr2 : TWords;
begin
  Nstrok := 10;    // номер строки
  proc := false; proc_ok := false; func := false;
  for i := 1 to main_program.st_num do      // записываем основную программу
    begin
      tmpst := IntToStr(Nstrok) + ' ';
      if NStrok < 100 then tmpst := tmpst + ' '; // для выравнивания
      proc := false;
      for j := 1 to 50 do
        if main_program.text[i][j] <> '' then
        begin
          st2 := zamena(main_program.text[i][j]);
          for l := 1 to n_proc do
            if st2 = StringGrid3.Cells[1,l] then    //проверяем является ли слово вызовом подпрограммы
              begin
                if StringGrid3.Cells[3,l] = 'func' then // определяем является ли подпрограмма функцией
                  begin
                    func := true;
                    func_st := tmpst + st2;
                    while func_st[1] <> ' ' do delete(func_st,1,1); // убираем то, что было до вызова функцц
                    while func_st[1] = ' ' do delete(func_st,1,1);
                    tmpst := IntToStr(Nstrok) + ' ';
                    if NStrok < 100 then tmpst := tmpst + ' ';
                  end;
                proc_num := l;
                proc_name := st2;
                proc_v := 0;
                proc_ok := true;
                for m := 1 to 50 do // очищаем временные массивы
                  begin
                    arr1[m] := '';
                    arr2[m] := '';
                  end;
                for m := 1 to n_var do  // проверяем есть ли у вызываемой процедуры параметры
                  if StringGrid1.Cells[4,m] = st2 then proc_ok := false;
                proc := true;
 
              end;
 
          if proc and (not proc_ok) then  // если в строке есть вызов подпрограмм, но ещё не заполнены все переменные параметров вызова
            begin
              if st2 <> ')' then
                begin
                   if (st2 <> '(') and  (st2 <> ',') and (st2 <> proc_name) then
                     begin
                       inc(proc_v);
                       arr1[proc_v] := st2;
                       m := 1;
                       while StringGrid1.Cells[4,m] <> proc_name do
                         inc(m);
                       arr2[proc_v] := StringGrid1.Cells[3,m - 1 + proc_v];
                     end
                end
              else         // если заполнили все параметры
                begin
                  proc_ok := true;
                  proc := false;
                end;
            end;
          if proc_ok then  // если был вызов подпрограммы
            begin
              m := 1;
              while arr1[m] <> '' do     // заносим значения в переменные вызова подпрограммы
                begin
                  st2 := arr2[m] + '=' + arr1[m];
                  tmpst := tmpst + st2;
                  Memo2.Lines.Add(tmpst);
                  NStrok := NStrok + 10;
                  tmpst := IntToStr(Nstrok) + ' ';
                   if NStrok < 100 then tmpst := tmpst + ' ';
                  inc(m);
                end;
              st2 := 'GOSUB ' + StringGrid3.Cells[4,proc_num];  // вызываем подпрограмму, адрес берётся из таблицы процедур
            proc_ok := false;
            end;
          if proc = false then // если нет вызова подпрограмм, то к номеру строки добавляется строка кода
            tmpst := tmpst + st2;
        end;
          if proc = false then
            begin
              Memo2.Lines.Add(tmpst); // выводим строку подпрограммы
            end;
        proc := false;
        Nstrok := Nstrok + 10;  // увеличиваем число строк
        if func then         // если был вызов функции, то после GOSUB, то после этого добавляется строка, в которую заносится значение функции
          begin
            tmpst := IntToStr(Nstrok) + ' ';
            if NStrok < 100 then tmpst := tmpst + ' ';
            tmpst := tmpst + func_st;
            Memo2.Lines.Add(tmpst);
            Nstrok := Nstrok + 10;
            func := false;
          end;
    end;
  tmpst := IntToStr(Nstrok) + ' ';
  if NStrok < 100 then tmpst := tmpst + ' ';
  tmpst := tmpst + 'END';  // добавляем в конце основной программы
  Memo2.Lines.Add(tmpst);
  Nstrok := Nstrok + 10;
  for i := 1 to n_proc do   // записываем текст подпрограмм
    begin
      num := 1;
      while i <> StrToInt(StringGrid3.Cells[2,num]) do inc(num); // определяем и записываем номер строки по которому записана подпрограмма
      StringGrid3.Cells[4,num] := IntToStr(Nstrok);
      for j := 1 to 1000 do
        begin
          st1 := '';
          for k := 1 to 50 do
            begin
              st2 := zamena(procedurs.text[i].text[j][k]);
              st3 := StringGrid3.Cells[1,num] + '_' + st2;
              for l := 1 to n_var do
                if StringGrid1.Cells[1,l] = st3 then st2 := StringGrid1.Cells[3,l];
              st1 := st1 + st2;  // замена отдельных операторов
            end;
          if st1 <> '' then
            begin
              tmpst := IntToStr(Nstrok) + ' ';
              if NStrok < 100 then tmpst := tmpst + ' ';
              tmpst := tmpst +  st1;
              Memo2.Lines.Add(tmpst);
              Nstrok := Nstrok + 10;
            end;
        end;
      tmpst := IntToStr (Nstrok) + ' ';
      if NStrok < 100 then tmpst := tmpst + ' ';
      tmpst := tmpst +  'RETURN';
      Memo2.Lines.Add(tmpst);
      Nstrok := Nstrok + 10;
    end;
end;
 
 
 
procedure tab1;   // обработка таблицы перемнных, в зависимости от типа к переменной добавляется постфикс
var
  i : integer;
  st : string;
begin
  for i := 1 to n_var do
    begin
      st := StringGrid1.Cells[2,i];
      if st = 'real' then StringGrid1.Cells[3,i] := StringGrid1.Cells[1,i] + '#';
      if st = 'integer' then StringGrid1.Cells[3,i] := StringGrid1.Cells[1,i] + '%';
      if st = 'string' then StringGrid1.Cells[3,i] := StringGrid1.Cells[1,i] + '$';
    end;
end;
 
begin
  Memo2.Clear;  // очищаем окно транслированного текста
  if path <> '' then
    begin
      reset(infile);
      Nstrok := 0;
      while not EOF(infile) do
        begin
          readln(infile,st);
          Analis(st);   // разбиение прогрпммы на подпрограммы
        end;
      tab1; // обработка таблицы переменных
      transl; // трансляция
      Memo2.Lines.Add('__________________________________________');
      Memo2.Lines.Add('        Подстановка адресов подпрограмм');
      Memo2.Lines.Add('__________________________________________');
      transl; // повторная трансляция, в ней уже подставляются адреса вызова подпрограмм
    end
end;
 
procedure TForm1.FormShow(Sender: TObject);
begin
  body := false;  // инициализируем переменные
  n_var := 0;
  n_const := 0;
  n_proc := 0;
  procedurs.num := 0;
  StringGrid1.Cells[1,0] := 'имя';      // записываем шапку таблиц
  StringGrid1.Cells[2,0] := 'тип';
  StringGrid1.Cells[3,0] := 'замена';
  StringGrid1.Cells[4,0] := 'подпрограмма';
  StringGrid2.Cells[1,0] := 'имя';
  StringGrid2.Cells[2,0] := 'значение';
  StringGrid3.Cells[1,0] := 'имя';
  StringGrid3.Cells[2,0] := '№ подпрограммы';
  StringGrid3.Cells[3,0] := 'тип';
  StringGrid3.Cells[4,0] := 'адрес';
  main_program.st_num := 0;
end;
 
end.
Unit1.dfm
Delphi
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
object Form1: TForm1
  Left = 213
  Top = 69
  Width = 953
  Height = 682
  Caption = #1058#1088#1072#1085#1089#1083#1103#1090#1086#1088'  Pascal -> BASIC'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnShow = FormShow
  PixelsPerInch = 96
  TextHeight = 13
  object Label2: TLabel
    Left = 96
    Top = 8
    Width = 32
    Height = 13
    Caption = 'Label2'
  end
  object PageControl1: TPageControl
    Left = 0
    Top = 0
    Width = 945
    Height = 601
    ActivePage = TabSheet2
    Align = alTop
    TabOrder = 0
    object TabSheet1: TTabSheet
      Caption = #1058#1077#1082#1089#1090' '#1087#1088#1086#1075#1088#1072#1084#1084#1099
      object Memo1: TMemo
        Left = 0
        Top = 0
        Width = 449
        Height = 569
        Lines.Strings = (
          #1048#1089#1093#1086#1076#1085#1099#1081' '#1090#1077#1082#1089#1090)
        ScrollBars = ssBoth
        TabOrder = 0
      end
      object Memo2: TMemo
        Left = 448
        Top = 0
        Width = 489
        Height = 569
        Lines.Strings = (
          #1058#1088#1072#1085#1089#1083#1080#1088#1086#1074#1072#1085#1085#1099#1081' '#1090#1077#1082#1089#1090)
        ScrollBars = ssBoth
        TabOrder = 1
      end
    end
    object TabSheet2: TTabSheet
      Caption = #1057#1086#1089#1090#1072#1074#1085#1099#1077' '#1101#1083#1077#1084#1077#1085#1090#1099
      ImageIndex = 1
      object Label1: TLabel
        Left = 24
        Top = 16
        Width = 66
        Height = 13
        Caption = #1055#1077#1088#1077#1084#1077#1085#1085#1099#1077
      end
      object Label3: TLabel
        Left = 352
        Top = 16
        Width = 55
        Height = 13
        Caption = #1050#1086#1085#1089#1090#1072#1085#1090#1099
      end
      object Label4: TLabel
        Left = 528
        Top = 16
        Width = 57
        Height = 13
        Caption = #1055#1088#1086#1094#1077#1076#1091#1088#1099
      end
      object Label5: TLabel
        Left = 24
        Top = 304
        Width = 110
        Height = 13
        Caption = #1054#1089#1085#1086#1074#1085#1072#1103' '#1087#1088#1086#1075#1088#1072#1084#1084#1072
      end
      object Label6: TLabel
        Left = 376
        Top = 304
        Width = 79
        Height = 13
        Caption = #1055#1086#1076#1087#1088#1086#1075#1088#1072#1084#1084#1099
      end
      object StringGrid1: TStringGrid
        Left = 8
        Top = 32
        Width = 329
        Height = 249
        RowCount = 2
        TabOrder = 0
      end
      object StringGrid2: TStringGrid
        Left = 344
        Top = 32
        Width = 209
        Height = 249
        ColCount = 3
        RowCount = 2
        TabOrder = 1
      end
      object StringGrid3: TStringGrid
        Left = 560
        Top = 32
        Width = 345
        Height = 249
        RowCount = 2
        TabOrder = 2
      end
      object Memo3: TMemo
        Left = 8
        Top = 320
        Width = 329
        Height = 241
        ScrollBars = ssBoth
        TabOrder = 3
      end
      object Memo4: TMemo
        Left = 360
        Top = 320
        Width = 297
        Height = 241
        ScrollBars = ssBoth
        TabOrder = 4
      end
    end
  end
  object Button1: TButton
    Left = 8
    Top = 605
    Width = 137
    Height = 33
    Caption = #1047#1072#1075#1088#1091#1079#1080#1090#1100
    TabOrder = 1
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 168
    Top = 605
    Width = 137
    Height = 33
    Caption = #1058#1088#1072#1085#1089#1083#1080#1088#1086#1074#1072#1090#1100
    TabOrder = 2
    OnClick = Button2Click
  end
  object BitBtn1: TBitBtn
    Left = 328
    Top = 605
    Width = 137
    Height = 33
    Caption = '&'#1042#1099#1093#1086#1076
    TabOrder = 3
    Kind = bkClose
  end
  object OpenDialog1: TOpenDialog
    Left = 48
    Top = 48
  end
end
Project1.dpr
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
program Project1;
 
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
 
{$R *.res}
 
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Вот здесь основная часть, и где то в процедуре transl есть переменная которая каким то образом не очищается. Пытался счетчик n_proc сбросить, вылетает, вообщем не знаю в чем дело...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
begin
  Memo2.Clear;  // очищаем окно транслированного текста
  if path <> '' then
    begin
      reset(infile);
      Nstrok := 0;
      while not EOF(infile) do
        begin
          readln(infile,st);
          Analis(st);   // разбиение прогрпммы на подпрограммы
        end;
      tab1; // обработка таблицы переменных
      transl; // трансляция
      Memo2.Lines.Add('__________________________________________');
      Memo2.Lines.Add('        Подстановка адресов подпрограмм');
      Memo2.Lines.Add('__________________________________________');
      transl; // повторная трансляция, в ней уже подставляются адреса вызова подпрограмм
    end
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2012, 17:26
Ответы с готовыми решениями:

C++. Списки. Необходимо удалить элементы структуры. Не могу найти ошибку
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; void EnterF(int...

Добавление данных в таблицу через форму - не могу найти ошибку
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

помогите пожалуйста с графиком! не могу найти ошибку!!необходимо чтоб кривая проходила по точкам!
unit Unit4; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

Двумерный массив. Поиск нулей.Не могу найти ошибку ошибку в коде
Вот,например массив 5 5 0 1 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 считываются два...

7
4 / 2 / 3
Регистрация: 09.05.2012
Сообщений: 11
10.05.2012, 20:14 2
Без самого проекта так легко тут не разобраться. Попробуйте почистить
Delphi
1
2
 main_program.text
  procedurs.text
Скорее всего нужно будет подставить тут
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.Button1Click(Sender: TObject);
var
  st : string;
i:integer;//добавили переменную
begin
//добавляем две строчки очистки
for i:=1 to 1000 do main_program.text[i]:='';
for i:=1 to 100 do procedures.text[i]:='';
..//и далее код какой был
Будет легче, если вы весь проект архивом выложите - можно будет запустить программу и просто посмотреть что перед щелчком в переменных остается.

Не по теме:

Стиль написания - явно студент за два дня до сдачи делать начал :)
Напомнило это:

Delphi
1
2
              m[m[k][i].y[j]][m[k][i].x[j]].n := n;
              m[m[k][i].y[j]][m[k][i].x[j]].name := IntToStr(n)+'-'+inttostr(m[k][i].n);

0
5 / 5 / 1
Регистрация: 17.05.2010
Сообщений: 108
11.05.2012, 07:22  [ТС] 3
я обычно на c++ пишу, dephi в некотрых моментах не ясен.
Пытался сделать как вы не получается.
Delphi
1
2
3
procedurs.text[i] = ' '; //Ошибка Incompatible types 'T main_program' and 'String'
если сделать так
procedurs.text[i].text[j] = ' '; //Ошибка 'TWords' 'String'
Сделал отдельную переменную типа TWOrds и приравнивал ее, но все равно ничего не изменилось..
Вот проект
Вложения
Тип файла: rar Транслятор.rar (230.0 Кб, 8 просмотров)
0
0 / 0 / 0
Регистрация: 06.05.2012
Сообщений: 20
11.05.2012, 11:32 4
Delphi
1
  Memo1.Clear;  // очищаем окно транслированного текста
у Вас было:
Delphi
1
  Memo2.Clear;  // очищаем окно транслированного текста
Если я конечно правильно понял задачу. Теперь при нажатии кнопки Транслировать очищается левое поле.
0
5 / 5 / 1
Регистрация: 17.05.2010
Сообщений: 108
11.05.2012, 11:52  [ТС] 5
Нет. Зачем левое очищать то, в нем текст транслируемый находиться. Вопрос в том что при нажатии второй раз на кнопку трансляции(не меняя ничего), новый транслируемый код прибавляется к старому и выводиться теперь уже 2хТекст. Вопрос в этом, я эту переменную не могу найти, где по идее храниться старый текст.
0
4 / 2 / 3
Регистрация: 09.05.2012
Сообщений: 11
11.05.2012, 13:47 6
Провозился минут 20, не понимаю логику работы программы.
Все к чему пришел: по нажатию на кнопку "Транслировать" сразу после memo2.clear вставляем следующий код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  Memo3.Clear;
  Memo4.Clear;
 Form1.StringGrid1.RowCount:=1;
 form1.StringGrid1.rows[0].Clear;
 Form1.StringGrid2.RowCount:=1;
 form1.StringGrid2.rows[0].Clear;
 Form1.StringGrid3.RowCount:=1;
 form1.StringGrid3.rows[0].Clear;
 
  n_var := 0;
  n_const := 0;
  n_proc := 0;
  procedurs.num := 0;
  main_program.st_num := 0;
Это попытка обнулить переменные к начальным значениям.
Строки больше не удваиваются, но выдаваемый результат программой на 1ой и второй итерации разный! На последующих итерациях программа выдает результат как при второй итерации.
Возможно просто не обнулил где то еще переменную, возможно косяк программы.
1
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
11.05.2012, 21:39 7
Вот - Работает. Ну ты и закрутил. Полностью не разбирался, но походил по ней и выяснил, что в переменной procedurs самый последний по уровню массив сдвигается на вторую позицию и остаётся.
В общем я смотрел там, где выдаются подпрограммы после записи End.
Кроме того, там ещё были какие-то ошибки, которые я поисправлял, но уже не помню какие.
Вложения
Тип файла: rar Транслятор.rar (232.6 Кб, 9 просмотров)
2
5 / 5 / 1
Регистрация: 17.05.2010
Сообщений: 108
12.05.2012, 17:58  [ТС] 8
Спасибо большущее! Гляну что исправили, теперь хоть на программу стало похоже) Я исправил только, что бы работать напрямую с мемо, а то каждый раз исправлять файл и заново грузить его, не очень уж удобно. Еще раз спасибо!
0
12.05.2012, 17:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2012, 17:58
Помогаю со студенческими работами здесь

Не могу найти ошибку. Нажимаю на клавишу, выдает ошибку
uses ABCObjects,GraphABC; const Image_0 = '0_765e9_6a3e424a_S.png'; var...

Необходимо найти ошибку
Не работает подпрограмма subroutine raash(44 строка, вызов подпрограммы в 41 строке), если...

Необходимо найти ошибку !
Пишет, что ошибка во время исполнения, всю голову изломал, помогите пожалуйста! using...

Необходимо найти ошибку
Помогите, пожалуйста, найти ошибку, из-за нее застряла и не могу продвинуться ни на шаг. Одна...


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

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