Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Zwelenewskiy
119 / 119 / 105
Регистрация: 09.01.2017
Сообщений: 1,189
Завершенные тесты: 1
#1

Ошибка преобразования типов

16.10.2017, 19:54. Просмотров 208. Ответов 7
Метки нет (Все метки)

Доброго времени суток. Процедура читает массив из типизированного файла:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure Read_Ar(f: file of integer; var x: ar);//type ar = array[1..10] of integer;
begin
  assign(f, 'arr.dat');
  reset(f); 
  
  var a := 0;
  for var i := 1 to 10 do
  begin
    read(f, a);
    x[i] := a;
  end;
  
  close(f);
end;
При ее вызове возникает ошибка: нельзя преобразовать тип file of integer к file of integer. В чем может быть проблема?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2017, 19:54
Ответы с готовыми решениями:

Ошибка преобразования типов
помогите пожалуйста program prim; var a1:real; y:integer; a:=0.167;...

Процедура преобразования типов...
Помогите пожалуйста: С клавиатуры вводится текст,состоящий из букв,знаков и...

Процедуры преобразования типов в строке
Помогите решить задачу плиз: Подсчитать сумму цифр в натуральном n ,введённом...

Процедуры преобразования типов при обработке строки
Помогите плиз решить заддачу : С клавиатуры вводится набор символов,в котором...

Ошибка 26: - несоответствие типов
program lab3; var M:integer; S, z, f:real; begin M:=0; f:=1; S:=0; while...

7
Puporev
Модератор
54349 / 41942 / 28977
Регистрация: 18.05.2008
Сообщений: 98,786
16.10.2017, 20:13 #2
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type tfile=file of integer;
     ar = array[1..10] of integer;
procedure Read_Ar(var f: tfile; var x: ar);
begin
  assign(f, 'arr.dat');
  reset(f); 
  
  var a := 0;
  for var i := 1 to 10 do
  begin
    read(f, a);
    x[i] := a;
  end;
  
  close(f);
end;
И внимательнее выбирай раздел, не первый день на форуме.
1
Zwelenewskiy
119 / 119 / 105
Регистрация: 09.01.2017
Сообщений: 1,189
Завершенные тесты: 1
16.10.2017, 22:07  [ТС] #3
Давно спросить хотел: почему в перечислении параметров процедуры/функции нельзя, в данном случае, просто написать var f: file of integer, а нужно аж отдельный тип создавать?

Добавлено через 33 минуты
Хм... Ошибка та же: нельзя преобразовать тип file of integer к tfile...
0
Puporev
Модератор
54349 / 41942 / 28977
Регистрация: 18.05.2008
Сообщений: 98,786
17.10.2017, 09:09 #4
Не знаю, у меня нет никаких ошибок хоть так пишу
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
type  ar = array[1..10] of integer;
procedure Read_Ar(var f:file of integer; var x: ar);
begin
  assign(f, 'arr.dat');
  rewrite(f);
  for var i:=1 to 10 do
   begin
    var a:=random(20);
    write(f,a);
   end; 
  reset(f); 
  
  var a := 0;
  for var i := 1 to 10 do
  begin
    read(f, a);
    x[i] := a;
    write(x[i]:3);
  end;
 close(f)
end;
var a:ar;
    f:file of integer;
begin
Read_Ar(f,a)
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
type tfile=file of integer;
     ar = array[1..10] of integer;
procedure Read_Ar(var f:tfile; var x: ar);
begin
  assign(f, 'arr.dat');
  rewrite(f);
  for var i:=1 to 10 do
   begin
    var a:=random(20);
    write(f,a);
   end; 
  reset(f); 
  
  var a := 0;
  for var i := 1 to 10 do
  begin
    read(f, a);
    x[i] := a;
    write(x[i]:3);
  end;
 close(f)
end;
var a:ar;
    f:tfile;
begin
Read_Ar(f,a)
end.
Добавлено через 10 минут
Приложите сюда архив с файлами .pas и .dat
0
Zwelenewskiy
119 / 119 / 105
Регистрация: 09.01.2017
Сообщений: 1,189
Завершенные тесты: 1
18.10.2017, 19:22  [ТС] #5
Прошу прощения за то,что долго не отвечал. Ошибка в 45 строке главной программы (сама процедура начинается со 147 строки в приложенном модуле)

Добавлено через 1 минуту
Модуль процедур
Кликните здесь для просмотра всего текста
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
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
unit Lib_for_P1;
 
interface
 
type
  tfile = file of integer;
  ar = array[1..10] of integer;
 
procedure RandomAr(a, b: integer; var x: ar);
function Is_Integer(x: integer): boolean;
procedure HandAr(var x: ar);
function Empty_Arr(x: ar): boolean;
function Count_Even(x: ar): byte;
procedure Write_Count_Even(x: ar; f: tfile);
procedure Write_Pos(var x: ar; var f: tfile; i: byte; b: integer);
procedure Print_f(f: tfile);
procedure Read_Pos(x: ar; y: byte; f: tfile);
function Empty_File(f: tfile): boolean;
procedure Read_Ar(f: tfile; var x: ar);
implementation
 
procedure RandomAr(a, b: integer; var x: ar);
begin
  for var i := 1 to 10 do 
    x[i] := random(a, b);
  
  writeln('Массив успешно заполнен случайными числами от ', a, ' до ', b);
end;
 
function Is_Integer(x: integer): boolean;
begin
  try
    x := readlninteger('Введите целое число! ');     
    result := true;
  except
    result := false;
  end;  
end;
 
procedure HandAr(var x: ar);
begin
  var Is_I: boolean;
  for var i := 1 to 10 do
  begin
    try
      x[i] := readlninteger('Введите ' + i + '-й элемент массива: ');
    except
      repeat
        Is_I := Is_Integer(x[i]);   
      until Is_I;
    end;    
  end;    
end;
 
function Empty_Arr(x: ar): boolean;
begin
  for var i := 1 to 10 do  
    result := x[i] = 0;
end;
 
function Count_Even(x: ar): byte;
begin
  for var i := 1 to 10 do
    if x[i] mod 2 = 0
      then result += 1;
  
  writeln('Количество четных элементов массива: ', result);
end;
 
procedure Write_Count_Even(x: ar; f: tfile);
begin
  assign(f, 'arr.dat');
  rewrite(f);    
  
  for var i := 1 to 10 do
    if x[i] mod 2 = 0
      then write(f, x[i]);   
  
  write(f, Count_Even(x));
  close(f);
end;
 
procedure Write_Pos(var x: ar; var f: tfile; i: byte; b: integer);
begin
  x[i] := b;
  
  Write_Count_Even(x, f);
  
end;
 
procedure Print_f(f: tfile);
begin
  assign(f, 'arr.dat');
  reset(f);
  
  var a := 0;
  
  writeln('Содержание файла: ');
  write('Массив: ');
  for var i := 1 to 11 do
  begin
    read(f, a);
    write(a, ' ');
    
    if i = 11
    then begin
      writeln;
      write('Кол-во четных элементов: ', a);
    end;
  end;
  
  close(f);
  
end;
 
procedure Read_Pos(x: ar; y: byte; f: tfile);
begin
  assign(f, 'arr.dat');
  reset(f);
  
  var a := 0; 
  var j := 0;
  for var i := 1 to 10 do
  begin
    read(f, a);
    j += 1;
    if j = y
    then begin
      writeln('Элемент на ', y, '-й позиции: ', a);
    end;
  end;
  
  close(f);  
end;
 
function Empty_File(f: tfile): boolean;
begin
  
  assign(f, 'arr.dat');
  reset(f);
  
  result := filesize(f) = 0;
  
  close(f);  
end;
 
procedure Read_Ar(f: tfile; var x: ar);
begin
  assign(f, 'arr.dat');
  reset(f); 
  
  var a := 0;
  for var i := 1 to 10 do
  begin
    read(f, a);
    x[i] := a;
  end;
  
  close(f);
end;
 
begin
 
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
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
uses Lib_for_P1;
 
label
1, 2;
 
var
  a: ar;
  f: file of integer;
 
begin
  var st := '';
  
  if not fileexists('arr.dat')
  then begin
    write('Файл для сохранения результатов не существует. Создать его(Да - Нет)? ');
    repeat
      st := readlnstring;
      
      if (st <> 'Да') and (st <> 'Нет')
        then writeln('Введите "Да" или "Нет"');
    until (st = 'Да') or (st = 'Нет');
    
    case st of
      'Да':
        begin
          assign(f, 'arr.dat'); 
          rewrite(f);
          close(f);
          writeln;
          writeln('Файл создан');
          writeln;
          writeln;
        end;; 
      'Нет':
        begin
          writeln;
          writeln('Программа завершила свою работу ');
          exit
        end;;
    end;
    
  end;
  
  if not Empty_File(f)
  then read_ar(f, a);
  
  
  2: writeln(' ---------------------- Меню программы ----------------------');
  writeln('|1 - заполнить массив случайными числами                     |');
  writeln('|2 - ввести элементы массива с клавиатуры                    |');
  writeln('|3 - найти количество четных элементов массива               |');
  writeln('|4 - записать четные элементы массива и их количество в файл |');
  writeln('|5 - запись в позицию                                        |');
  writeln('|6 - чтение позиции                                          |');
  writeln('|7 - печать файла                                            |');
  writeln('|                                                            |');
  writeln('|8 - выход                                                   |');
  writeln('|------------------------------------------------------------|');
  
  writeln;
  var ans: char;
  repeat
    ans := readlnchar('Выберите нужное действие: ');  
    
    if not (ans in ['1'..'8'])
    then begin
      writeln('Выберите только цифру от 1 до 8');
      writeln;
    end;
  until ans in ['1'..'8']; 
  
  var fr: integer;  
  var t: integer;  
  var Is_I: boolean;   
  case ans of
    '1':
      begin
        
        1: try
          fr := readlninteger('Введите левый предел случайных чисел: ');
        except
          repeat
            Is_I := Is_Integer(fr);
          until Is_I;       
        end;   
        
        writeln;
        try
          t := readlninteger('Введите правый предел случайных чисел: ');
        except
          repeat
            Is_I := Is_Integer(t);
          until Is_I;       
        end;
        
        if fr > t
        then begin
          writeln('Левый  предел случайных чисел должен быть меньше правого предела! ');   
          writeln;
          goto 1
        end;
        
        writeln;
        RandomAr(fr, t, a);
        goto 2;
      end;;
    '2':
      begin
        writeln;
        HandAr(a);
        writeln
      end;
    '3':
      begin
        writeln;
        
        if Empty_Arr(a)
        then begin
          writeln('Массив пуст');
          goto 2;
          writeln
        end
        else begin
          Count_Even(a);
          writeln;
          goto 2
        end
      end; ;
    '4':
      begin
        writeln;
        if Empty_Arr(a)
        then begin
          writeln('Массив пуст');
          writeln;
          goto 2
        end
        else begin
          Write_Count_Even(a, f);
          writeln;
          goto 2;         
        end;
      end; ;
    '5':
      begin
        writeln;      
        
          repeat
            try
              fr := readlninteger('Введите позицию в массиве: ');
            except
              repeat
                Is_I := Is_Integer(fr);
              until Is_I;       
            end;
            if not (fr in [1..10])
              then writeln('Указанной позиции в массиве нет');
          until fr in [1..10];     
          
          writeln;
          
          try
            t := readlninteger('Введите число,на которое нужно заменить ' + fr + '-й элемент массива: ');
          except
            repeat
              Is_I := Is_Integer(t);
            until Is_I;       
          end; 
          
          Write_Pos(a, f, fr, t);
          writeln;
          goto 2;                   
        end;
    '6':
      begin
        writeln;       
       
        repeat
          try
            fr := readlninteger('Введите позицию в массиве: ');
          except
            repeat
              Is_I := Is_Integer(fr);
            until Is_I;       
          end;
          if not (fr in [1..10])
            then writeln('Указанной позиции в массиве нет');
        until fr in [1..10];         
        
        Read_Pos(a, fr, f);
        writeln;
        goto 2
      end;;
    '7':
      begin
        print_f(f);
        writeln;
        goto 2;        
      end;;
    '8':
      begin
        writeln;
        writeln('Программа завершила свою работу ');
        exit
      end;;
  end; 
  
end.
0
Puporev
Модератор
54349 / 41942 / 28977
Регистрация: 18.05.2008
Сообщений: 98,786
18.10.2017, 19:30 #6
Если объявил тип в модуле, то не нужно еще раз писать в программе, в строке 8 нужно
Pascal
1
 f: tfile;
1
Zwelenewskiy
119 / 119 / 105
Регистрация: 09.01.2017
Сообщений: 1,189
Завершенные тесты: 1
18.10.2017, 19:38  [ТС] #7
Еще одна проблема: при использовании процедур Print_f и Read_Pos в строке read(f, a) (строки одинаковы в обоих процедурах) возникает ошибка: чтение за концом потока невозможно...
0
Puporev
Модератор
54349 / 41942 / 28977
Регистрация: 18.05.2008
Сообщений: 98,786
18.10.2017, 19:43 #8
В типизированном файле индексы как в динамическом массиве от 0 до filesize(f)-1.
1
18.10.2017, 19:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2017, 19:43

Ошибка - несоответствие типов
При написании программы, необходимо, чтобы переменная (i) участвовала в...

Ошибка - несоответствие типов
const k=0.65; d=2; var s,a,d,f,e,p,t:real; begin writeln('vvedi t');...

*ошибка 26 не соответствие типов*
uses crt; var f1,f2:text; i,str1,str2:char; j:byte; mi,ms1,ms2:string;...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru