Войти

Показать полную графическую версию : Pascal. Запись из массива в файлы.


lenaustkz84
23-01-2012, 13:05
Здравствуйте!

Решаю следующую задачу: Даны символьные файлы F и G. Определить, совпадают ли компоненты
файла F с компонентами файла G. Если нет, то получить номер первого не совпадающего компонента.

В общем, до написания проверки основного условия задачи я еще не дошла.
На данном этапе реализовала заполнение массива случайными символами.

Теперь хочу чтобы этот массив записался в файлы F и G.
Но подключить правильно процедуру у меня не получается.

Интересно то, что если записывать код по заполнению массива без процедуры,
сразу в теле основной программы, то тогда массив символов успешно записывается
в оба файла.

Значит я что-то не правильно процедуру подключаю.
Подскажите, пожалуйста, что нужно поменять.

Думаю, что к реализации основной идеи задачи я смогу приступить только после того, как
получиться записать символьный массив в файлы :) А иначе не с чем работать :)

Преподаватель сказала, что нужно, чтобы присутствовала хотя бы одна процедура или функция.
А лучше всего, что бы было и то и другое.
Думаю, что это было бы и удобно, использовать процедуру :)

Вот код программы, который я написала на данном этапе.

program f_2a;
{Даны символьные файлы F и G. Определить, совпадают ли компоненты
файла F с компонентами файла G. Если нет, то получить номер первого
не совпадающего компонента.}

uses crt;

const m=10;

simvolij : array [0..38] of char = ('a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z','0','1','2','3',
'4','5','6','7','8','9','+','-','*');
type file1 = file of char;
file2 = file of char;

var f1 : file1;
f2 : file2;

procedure input_massiv;

var i : byte;
SimMas : array [1..m] of char;

begin

randomize;
for i:=1 to m do
begin
SimMas[i]:=simvolij[random(38)];
end;
end;

BEGIN
clrscr;

assign(f1,'F.txt');
rewrite(f1);

write(f1,input_massiv);

assign(f2,'G.txt');
rewrite(f2);

write(f2,input_massiv);

close(f1);
close(f2);

END.

lenaustkz84
23-01-2012, 13:31
Только не подумайте, что я прошу написать за меня код. Просто прошу подсказать.
А то вдруг найдутся те, кто подумает, что я халяву ищу :)

ferget
23-01-2012, 17:21
процедуры ничего не возвращают

в прошлой теме про матрицы был пример процедуры, посмотрите

RostVY
23-01-2012, 17:27
хочу чтобы этот массив записался в файлы F и G. »


procedure HochuMassivVFajl(mas:array of char; filename:string);
var f: file of char;
i:integer;
begin
assign(f,filename);
rewrite(f);
for i:=1 to length(mas) do
write(f,mas[i]);
close(f);
end;


массив описать в программе, а не в процедуре.

типа

SimMas : array [1..m] of char;

procedure input_massiv(mas);
var i : byte;
begin
randomize;
for i:=1 to length(mas) do
begin
mas[i]:=simvolij[random(38)];
end;
end;


потом вызвать процедуру


input_massiv(SimMas);
HochuMassivVFajl(SimMas, 'F.txt');


потом забить, выйти замуж, нарожать детей и учиться, как варить борщ, вместо Pascal'я.

Busla
26-01-2012, 09:42
RostVY, лучше не привыкать передавать массивы в качестве параметра функции/процедуры

lenaustkz84, по хорошему массивы в данном случае - излишнее усложнение - можно сразу писать в файл генерируемые символы

ferget
26-01-2012, 11:02
лучше не привыкать передавать массивы в качестве параметра функции/процедуры »

почему?

RostVY
26-01-2012, 12:01
лучше не привыкать передавать массивы в качестве параметра функции/процедуры »
и действительно, совет как-то слабо аргументирован

lxa85
26-01-2012, 13:11
лучше не привыкать передавать массивы в качестве параметра функции/процедуры »
Потому что происходит его полное дублирование в динамическую память (соотв. накладные расходы на выделение памяти, пересылку и т.д.), выделяемую под процедуру/функцию.
Надо относиться аккуратно, т.к. пока массив маленький и вызовов мало, то все в порядке - скорости чтения/записи позволяют. А если возникнет множественный вызов (в цикле) или рекурсивный вызов, то возникнет слишком большая избыточная нагрузка на память. И в какой-то момент ее просто не хватит.

Поэтому аккуратно! Если необходимо работать с копией массива - то пересылаем весь (скорее многопоточные приложения). Если мы его все равно вернем в качестве результата, то работаем с указателем на массив.

RostVY
26-01-2012, 13:52
Потому что происходит его полное дублирование в динамическую память »
да ну. а я всегда думал, что просто передается указатель на массив и работа ведется с ним.
здесь вот, например, http://www.freepascal.org/docs-html/ref/refsu59.html написано "In the latter cases the procedure receives a pointer to the actual array. In the former case, it receives a copy of the array."
Так что, как минимум, это зависит от версии компилятора или от его настроек и копируется массив в более старых версиях.

Кстати, вы какую версию имели в виду?

lxa85
26-01-2012, 15:29
Кстати, вы какую версию имели в виду? »
Я имел в виду теорию вообще, как таковую, без оптимизаций и пр.
Так что, как минимум, это зависит от версии компилятора или от его настроек и копируется массив в более старых версиях. »
Это зависит от того, насколько грамотно я пишу код и от того, насколько я буду требовать точного его выполнения.
Поэтому если я передаю массив, то я передаю массив. Если указатель, то указатель.
ПК - это бестолковый калькулятор. У него нет никаких других функций и назначений, кроме выполнения команд пользователя.
Да, сейчас инженеры ведущих компиляторов прикладывают массу сил, чтобы оптимизировать убогий код. Поэтому может быть, после оптимизации, будет передаваться указатель вместо массива. Но строго говоря - это не так.

RostVY
26-01-2012, 16:07
буду передавать масивы :) мне так удобно. а как передавать пусть компилятор заморачивается. если нормальный -- передаст как надо. По моей теории, строки, массивы и объекты передаются указателями, а не копируются.

PhilB
26-01-2012, 18:32
Вообще-то, в паскале для того, чтоб передать массив по ссылке, необходимо использовать либо var (если массив будет изменяться) или const (если не будет).
Компилятор не будет передавать ссылку, если вы это не указали явно. Оптимизация подразумевает генерацию более эффективного кода без нарушения его семантики. А способ передачи потому и бывает разный, что разные способы передачи имеют разную семантику.




© OSzone.net 2001-2012