Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Pascal. Запись из массива в файлы. (http://forum.oszone.net/showthread.php?t=226014)

lenaustkz84 23-01-2012 13:05 1842587

Pascal. Запись из массива в файлы.
 
Здравствуйте!

Решаю следующую задачу: Даны символьные файлы 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 1842609

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

ferget 23-01-2012 17:21 1842761

процедуры ничего не возвращают

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

RostVY 23-01-2012 17:27 1842765

Цитата:

Цитата lenaustkz84
хочу чтобы этот массив записался в файлы 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 1844712

RostVY, лучше не привыкать передавать массивы в качестве параметра функции/процедуры

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

ferget 26-01-2012 11:02 1844750

Цитата:

Цитата Busla
лучше не привыкать передавать массивы в качестве параметра функции/процедуры »

почему?

RostVY 26-01-2012 12:01 1844774

Цитата:

Цитата Busla
лучше не привыкать передавать массивы в качестве параметра функции/процедуры »

и действительно, совет как-то слабо аргументирован

lxa85 26-01-2012 13:11 1844829

Цитата:

Цитата Busla
лучше не привыкать передавать массивы в качестве параметра функции/процедуры »

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

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

RostVY 26-01-2012 13:52 1844851

Цитата:

Цитата lxa85
Потому что происходит его полное дублирование в динамическую память »

да ну. а я всегда думал, что просто передается указатель на массив и работа ведется с ним.
здесь вот, например, 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 1844924

Цитата:

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

Я имел в виду теорию вообще, как таковую, без оптимизаций и пр.
Цитата:

Цитата RostVY
Так что, как минимум, это зависит от версии компилятора или от его настроек и копируется массив в более старых версиях. »

Это зависит от того, насколько грамотно я пишу код и от того, насколько я буду требовать точного его выполнения.
Поэтому если я передаю массив, то я передаю массив. Если указатель, то указатель.
ПК - это бестолковый калькулятор. У него нет никаких других функций и назначений, кроме выполнения команд пользователя.
Да, сейчас инженеры ведущих компиляторов прикладывают массу сил, чтобы оптимизировать убогий код. Поэтому может быть, после оптимизации, будет передаваться указатель вместо массива. Но строго говоря - это не так.

RostVY 26-01-2012 16:07 1844953

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

PhilB 26-01-2012 18:32 1845063

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


Время: 23:10.

Время: 23:10.
© OSzone.net 2001-