Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / А можно ли ф функцию файл передать: / 14 сообщений из 14, страница 1 из 1
21.07.2003, 16:56
    #32213820
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
То есть:
f1: file of integer;
f2: file of string;
Хотелось бы чтение из файла в массив, оформить в виде одной функции, типа такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
AssignFile(f,'file.dat');
 Reset(f);
 n:= 0 ;
 While not EOF(f) do
 begin
   SetLength(str,n+ 1 );
   Read(f,str[n]);
   inc(n);
 end;
CloseFile(fl);

То есть в функцию передаётся переменная описаная как типизированный файл, имя файла и динамический массив, куда считывать. А то надо считать с 10 файлов, и не дело писать друг за другом одно и тоже, меняя тоько параметры...
...
Рейтинг: 0 / 0
21.07.2003, 16:59
    #32213829
MW
MW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
А глобальные переменные отменили?
...
Рейтинг: 0 / 0
21.07.2003, 17:05
    #32213835
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
Да, но я не могу сначалf обявить, что f:file of integer, а потом f:file of string
...
Рейтинг: 0 / 0
21.07.2003, 17:07
    #32213840
MW
MW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
А как ты заранее узнаешь тип файла?
Ведь считывание все равно будет вестись по-разному?!?!
...
Рейтинг: 0 / 0
21.07.2003, 17:29
    #32213882
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
Считывание типизированных любых файлов можно считать в массив, как описано выше.
Проблема только заглючается в том чтобы в AssignFile задать тип привязываемого файла...
...
Рейтинг: 0 / 0
22.07.2003, 14:19
    #32214576
Дмитрий Мыльников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
Блин, ты где такие задачки находишь? :) Взял бы книжку по паскалю что ли почитал. :)
Типизированный файл на то и типизированный, чтобы при его объявлении указать его тип. И других способов дать знать компилятору тип файла в паскале не существует в принципе. Функция AssignFile связывает типизированный файл с конкретным файлом на диске.

Короче, тебе нужно типизированный файл объявлять внутри твоей функции, а передавать туда только имя файла и динамический массив, куда будут данные считываться. А как они будут считываться внутри функции описываешь.

В общем, у тебя в итоге получится столько функций, сколько типов файлов используется в программе. И по другому, насколько я понимаю, с типизированными файлами никак не сделать. Либо использовать нетипизированные файлы.
...
Рейтинг: 0 / 0
22.07.2003, 14:37
    #32214601
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
вот именно использовать нетипизированные файлы ,
и работать через
BlockRead ,BlockWrite ...
...
Рейтинг: 0 / 0
22.07.2003, 16:19
    #32214768
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
А нельзя сделать AssignFile за функцией, а потом передать как нить функции его дескриптор, ну или что нить такое, адресс переменной которой присваивал и т.д, а в фукции берём адрес этой переменной и читаем не так read(f, var), а вот так read(pointer^,var); Пробовал так делать не получается.. :-)))
...
Рейтинг: 0 / 0
22.07.2003, 16:33
    #32214791
Дмитрий Мыльников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
Дорогой AndreyBond, у меня стойкое ощущение, что ты у нас пытаешься выяснить конечный этап реализации задачи, в то время как сам алгоритм её решения продуман как-то криво.
Давай сначала: ЧТО НУЖНО СДЕЛАТЬ? Считать из файлов информацию во внутрениие структуры данных? Сколько файлов, какие, что потом со структурам делается? Мы изначально знаем их именя и количетсво или это величины переменные? И вообще откуда взялись файлы с "типизированной струткурой"? Это данные самой программы или другой?

Что же касается файловых переменных, то они через указатель не передаются, поскольку и так уже являются указателями на структуру описния файла. Причём, если я правильно помню, то файловые переменные являются особым типом, который не разименовывается. Кстати, в паскале обычно принято в таких случаях использовать ключевое слово var перед названием параметра в объявлении процедуры или функции. То есть, если написать

procedure MyProc(var i:integer);

то при изменении значения i внутри процедуры после выхода из неё мы будем иметь это изменившееся значение, а если var не писать (стандартное объявление), то внутри поцедуры значение может меняться как угодно, но после выхода из процедуры значение переменной не изменится. В первом случае компилятор паскаля автоматически перейдёт на использование указателя, а во втором случае создаётся копия на стеке.
...
Рейтинг: 0 / 0
22.07.2003, 18:04
    #32214899
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
Вот отрывки из кода:
Код: plaintext
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.
type
  rClient = record
    ID:Integer;
    Name:string[ 50 ];
  end;
  rTran = record
    ID:Byte;
    Account:string[ 20 ];
    Capt:string[ 120 ];
  end;
  rMark = record
    LAT:string[ 3 ];
    Name:string[ 10 ];
  end;

  tClients = array of rClient;
  tTrans = array of rTran;
  tMarks = array of rMark;

var
  Client: tClients;
  Trans: tTrans;
  Marks: tMarks;
  fClient: file of rClient;
  fTrans: file of rTran;
  fMark: file of rMark;

При создании формы нужно прочитать из файлов в переменные, делаю так:
Код: plaintext
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.
procedure rbThread.Execute;
var
  n:integer;
begin
  AssignFile(fMark,'Marks.dat');
  Reset(fMark);
  n:= 0 ;
  While not EOF(fMark) do
  begin
    SetLength(Marks,n+ 1 );
    Read(fMark,Marks[n]);
    inc(n);
  end;
  CloseFile(fMark);
  AssignFile(fClient,'Clients.dat');
  Reset(fClient);
  n:= 0 ;
  While not EOF(fClient) do
  begin
    SetLength(Client,n+ 1 );
    Read(fClient,Client[n]);
    inc(n);
  end;
  CloseFile(fClient);
  AssignFile(fTrans,'Trans.dat');
  Reset(fTrans);
  n:= 0 ;
  While not EOF(fTrans) do
  begin
    SetLength(Trans,n+ 1 );
    Read(fTrans,Trans[n]);
    inc(n);
  end;
  CloseFile(fTrans);
end;

А теперь заметьте, что три раза код повторяется, вот еслиб была возможность в процедуру передать указатель на файл, то было бы просто отлично.
...
Рейтинг: 0 / 0
22.07.2003, 18:58
    #32214940
Дмитрий Мыльников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
Ну, повторяется. Работать работает? :) Или хочется, чтобы было ещё лучше? :)

А если серьёзно, то можно написать и через функцию, но только без типизированных файлов. И вручную определять размер записи и количество байт, которые необходимо прочитать/записать. И не забывай, что у тебя не только файл типизированный, но ещё и массивы с элементами разного типа (то есть с разной длинной элемента). В результате ещё не факт, что выёдет сильно короче, но писанины будет явно больше, да и глюков там можно насажать таких, что не сразу и найдешь. Придётся ведь передавать рамзер элемента массива/файла и корректно изменять рамзеры массива и определять количество записей в файле. В приведённом тобой примере это всё делает сам компилятор, причём в большинстве случаев ещё на этапе компиляции. Но на то он и "язык высокого уровня".

Короче, из-за трёх файлов я бы не стал время тратить. Опять же, я уже давно record в чистом виде не использую, в основном объекты. При этом у меня все объекты умеют себя сохранять в поток и загружать из потока. Там тоже писанины, конечно, побольше, чем с типизированными файлами и массивами, зато потом появляется масса удобств. Да и это зависит от количества типов/классов. Когда их становится больше десятка, то выгоднее написать общие функции и процедуры, а иначе проще и быстрее написать несколько раз одно и тоже (благо функции copy/paste в Delphi работают очень хорошо :) ).
...
Рейтинг: 0 / 0
23.07.2003, 09:43
    #32215134
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
В том то и беда, что таких файлов не 3, а около 20, да и в типе запись очень много параметров, это я вырезки привёл..
А не подскажешь где можно почиать про классы, как их правильно строить и т.д. и т.п. на русском языке..
...
Рейтинг: 0 / 0
23.07.2003, 09:56
    #32215151
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
в книжке ....
...
Рейтинг: 0 / 0
23.07.2003, 10:50
    #32215245
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А можно ли ф функцию файл передать:
А в инете нигде чтоль нет на русском, с хорошим писанием...
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / А можно ли ф функцию файл передать: / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]