Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2012, 13:11   #1
Konstantin1706
Пользователь
 
Регистрация: 02.03.2009
Сообщений: 32
По умолчанию Чтение и запись позиции pascalabc.net

Добрый день. Подскажите пожалуйста. У меня есть массив(заполнение которого осуществляется через файл), кнопка и 2 поля типа IntegerField. Я затрудняюсь с тем, что не могу по указанному пользователем номеру элемента, в поле IntegerField, изменить его значение.
Konstantin1706 вне форума Ответить с цитированием
Старый 21.09.2012, 13:49   #2
Konstantin1706
Пользователь
 
Регистрация: 02.03.2009
Сообщений: 32
По умолчанию

Код:
procedure chtenie_pos;
begin
  reset(f);
  Seek(f,ch.Value);
  Write(f,ch.Value);
end;
Выводит ошибку "Нет перегруженной подпрограммы с такими типами параметров". Ругается на seek.
Konstantin1706 вне форума Ответить с цитированием
Старый 21.09.2012, 13:56   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

недостаточно данных, чтобы помочь Вам.

изменить надо где - в файле?
нужные ваши исходники. давайте сюда ваш код описания файла и чтения из него...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.09.2012, 14:08   #4
Konstantin1706
Пользователь
 
Регистрация: 02.03.2009
Сообщений: 32
По умолчанию

Код:
uses FormsABC;
const
     n = 10;

type
    mas=array[1..n] of real;
var
  b,b1,b2,b3,b4:button;
  l:listbox;
  m:Field;
  ch,z,ch1,z1:IntegerField;  
  a:mas;
  f:text;
  
  
procedure zap_mas;
var
  i:integer;
  x:real;
begin
  
  reset(f);
  i:=1;
  while not eof(f) do
    begin
      read(f,x);
      a[i]:=x;
      Inc(i);
    end;
    close(f);
end;

function zap_lb(a:mas):real;
begin
  Result:=0;
  l.Items.Clear();
  for var i:=1 to n do
    begin
       l.Items.Add(a[i]);
       if a[i]<Result then
          Result:=a[i];
    end;
end;

procedure min;
begin
   m.Text:='Минимальное число -> ' + FloatToStr(zap_lb(a));
end;

/////////////
procedure chtenie_pos;
begin
  reset(f);
  Seek(f,ch.Value); 
  Write(f,ch.Value);
end;
///////////

procedure exit;
begin
  MainForm.Close;
end;
  
procedure main;
begin
  //MainForm.SetSize(282,260);
  b1:=new Button('Запольнить массив');
  b2:=new Button('Загрузить');
  l:=new ListBox();
  m:=new Field('Min', 154);
  assign(f,'b.dat');
  b1.Click+=zap_mas;
  b2.Click+=min;
  LineBreak;
  b3:=new Button('Запись позиции');
  z:=new IntegerField('№ элемента', 30);
  z1:=new IntegerField('Значение', 30);
  LineBreak;
  b4:=new Button('Чтение позиции');
  b4.Click+=chtenie_pos;
  ch:=new IntegerField('',30);
  EmptySpace(33);
  ch1:=new IntegerField('',30);

  b:=new Button('Выход');
  b.Click+=Exit;
  
end;
BEGIN
  main;
END.
Дан типизированный файл, содержащий 10 дробных значений. Мне необходимо вывести значение по указанной позиции. И указывая позицию изменить значение и перезаписать в файл.
Konstantin1706 вне форума Ответить с цитированием
Старый 21.09.2012, 14:10   #5
Konstantin1706
Пользователь
 
Регистрация: 02.03.2009
Сообщений: 32
По умолчанию

Код:
10.1 
-2.11 
3.12
-2.1 
2.3 
1.1
3.2 
-2.1 
-0.2
4.02
содержимое файла b.dat
Konstantin1706 вне форума Ответить с цитированием
Старый 21.09.2012, 14:58   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

извините, но я Вас огорчу - у Вас не получается потому что Вы изначально неверно сделали.
Цитата:
Дан типизированный файл,
у Вас же:
Цитата:
Код:
var
...
  f:text;
Это описание файловой переменной текстового файла!

у вас должно быть что-то вроде:
Код:
var
   f : double; {или f: real; если вам так больше нравится}
разумеется, читать значение из текстового файла b.dat (который у Вас имеется в данный момент) у вас не получится!

и именно по этому не работает процедура Seek - она работает исключительно для типизированных файлов.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.09.2012, 15:57   #7
Konstantin1706
Пользователь
 
Регистрация: 02.03.2009
Сообщений: 32
По умолчанию

поменял на тип Real. После чего выводит ошибку "Ошибка времени выполнения: Чтение после конца потока невозможно." Ругается на read(f,x).
Код:
begin
...  
while not eof(f) do
    begin
      read(f,x);
      a[i]:=x;
      Inc(i);
    end;
    close(f);
end;
Konstantin1706 вне форума Ответить с цитированием
Старый 21.09.2012, 16:09   #8
Konstantin1706
Пользователь
 
Регистрация: 02.03.2009
Сообщений: 32
По умолчанию

я исправил. Serge_Bliznykov, спасибо +1. Запускается вроде без ошибок, но при выводе массива в ListBox не сходится с файлом b.dat (Выводится на подобие 9.99236026632778Е-92). А каким образом мне вывести в IntegerField значение искомого элемента?
Konstantin1706 вне форума Ответить с цитированием
Старый 21.09.2012, 16:23   #9
Konstantin1706
Пользователь
 
Регистрация: 02.03.2009
Сообщений: 32
По умолчанию

и все же после вывода массива в ListBox ругается на read(f,x).
Konstantin1706 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PascalABC.NET v1ktor Паскаль, Turbo Pascal, PascalABC.NET 0 21.06.2011 13:58
Звуки в PascalABC.net fuckall666 Паскаль, Turbo Pascal, PascalABC.NET 6 22.05.2011 14:37
PascalABC.net gogomon93 Помощь студентам 5 17.04.2011 18:48
PascalABC.net *stRong* Помощь студентам 2 10.06.2010 17:50
Графика PascalABC.NET Ученик. Помощь студентам 6 04.02.2010 15:24