Как передать массив в функцию паскаль
Перейти к содержимому

Как передать массив в функцию паскаль

  • автор:

Передача массивов в подпрограммы, открытые массивы

Для того, чтобы передать массив в качестве параметра подпрограммы, необходимо объявлять массивы тем способом, который мы советовали в соответствующей главе. Например так: Type TArray= array [1..10] of Integer; Procedure Dummy(arr:TArr); Begin … End ; Var a:TArray; Begin … Dummy(a); .. End . Однако, такой способ передачи массив не является универсальным. Он сильно зависит от размера передаваемого массива (размер ведь указан в типе). Зачастую, многие подпрограммы должны быть написаны таким образом, чтобы они могли обрабатывать массивы произвольной длины. Например, если мы хотим написать программу, подсчитывающую среднее арифметическое элементов массива, то нас может не устроить частная реализация только для массивов длиной 10, например. В связи с этим в Pascal введены так называемые открытые массивы – это такое описание параметра в заголовке подпрограммы, в котором не указывается размер массива. Но тогда потребуется определять максимальные и минимальные индексы массива, чтобы универсальным образом их обрабатывать. В этом нам помогут две функции: 1. Low – возвращает минимальный индекс массива; 2. High – возвращает максимальный индекс массива.

86
Программирование на языке Pascal

Рассмотрим пример: Function Avg(Arr: Array of Integer): Real; Var i:Integer; Sum:Real; Begin Sum:=0; For i:=Low(Arr) To High(Arr) do Sum:=Sum+Arr[i]; Avg:=Sum/(High(Arr)-Low(Arr)+1); End ; Var A: Array [1..10] of Integer; B: Array [0..19] of Integer; I:Integer; Begin Randomize; For i:=1 to 10 do A[i]:=random(50); For i:=0 to 19 do B[i]:=random(100); WriteLn(‘Среднее первого массива=’, Avg(A)); WriteLn(‘Среднее второго массива=’, Avg(B)); End . В данном примере в функции, вычисляющей среднее арифметическое элементов массива, используются функции Low и High для перебора всех индексов передаваемого в качестве параметра массива. Как мы видим и начальные и конечные индексы у массивов A и B, которые затем предаются в функцию, различаются, но, тем не менее, функция корректно считает среднее арифметическое их элементов. Подсчет количества элементов массива ведется по формуле Low-High+1 . Где Low – это нижний индекс массива, а High – верхний.

Передача динамического массива в функцию

Возможно ли передать в функцию два двумерных динамических массива в FreePascal? По Форумам ползал- ничего толкового не нашел.

var m,n,k:integer; mass1: array of array of real; mass2: array of array of real; begin setlength(mass1,m,n); setlength(mass2,n,k); //Вот этот блок нужно как-то запихать в подпрограмму (задача стоит такая) for i:=0 to m-1 do for j:=0 to k-1 do begin summ:=0; for l:=0 to n-1 do summ:=summ+mass1[i,l]*mass2[l,j]; mass3[i,j]:=summ; end; //конец блока readln(); end. 

Отслеживать
задан 10 янв 2014 в 11:43
5 2 2 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

type TArrayOfArrayOfReal = array of array of Real; procedure DoSomething(var A, B: TArrayOfArrayOfReal); var I, J, L: Integer; begin for I := 0 to High(A) do for J := 0 to High(B[0]) do . end; 

Отслеживать
ответ дан 10 янв 2014 в 11:58
1,767 8 8 серебряных знаков 10 10 бронзовых знаков
Спасибо, попробую!
10 янв 2014 в 12:00

  • массивы
  • pascal
  • freepascal
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

lang-pascal

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8466

Как передать массив в функцию паскаль

Добрый день. Возникает ошибка при передаче массива в модуль (нельзя преобразовать тип array[1..10] of integer к array of integer)

Задача: Разработать модуль, содержащий подпрограмму суммирования элементов массива.

Решал задачи для самопроверки, ничего не получалось. В итоге взял переписал пример из учебника. Та же ошибка.

Учебник: Иванова Г.С. Основы программирования: Учебник для вузов. — 2-е изд., перераб. и доп. — М.: Изд-во МГТУ им. Н.Э. Баумана, 2002. ~ 416 с

Основная программа
___________________________________ __
PROGRAM EX;

VAR A:ARRAY[1..10] OF INTEGER;
I,N:INTEGER;

READLN(N);
FOR I:=1 TO N DO READ(A[I]);
READLN;
WRITELN(‘СУММА= ‘,SUM(A,N));

Модуль
___________________________________ __
UNIT R1;

FUNCTION SUM (B:ARRAY OF INTEGER;N:INTEGER):INTEGER;

FUNCTION SUM(B:ARRAY OF INTEGER;N:INTEGER):INTEGER;
VAR S,I:INTEGER;

S:=0;
FOR I:=1 TO N-1 DO S:=S+B[I];
SUM:=S;

Константин_В
Посмотреть профиль
Найти ещё сообщения от Константин_В

Регистрация: 09.01.2008
Сообщений: 26,229

первое. Очень не рекомендую использовать этот мутант Pascal ABC (как и его родственника — Pascal ABC.NET)
используйте FreePascal (или delphi)

второе.
когда Вы пишете

FUNCTION SUM(B:ARRAY OF INTEGER;N:INTEGER):INTEGER;

это в паскале называется передача т.н. открытого массива (open array)
если не знаешь, что это и как это работает, то лучше этим не пользоваться.

Лучше поступить так:
описать свой тип данных и передавать в процедуры/функции именно его
например,

type MyArrayType = ARRAY[1..10] OF INTEGER; . var A : MyArrayType; . function SUM(X:MyArrayType;N:integer):integer; . 
Serge_Bliznykov
Посмотреть профиль
Найти ещё сообщения от Serge_Bliznykov

Регистрация: 23.10.2010
Сообщений: 2,309
Позволю себе слегка подправить:

function SUM(var X:MyArrayType;N:integer):integer;

Вместо var можно и const.
Поскольку параметры передаются через стек, то для массивов лучше использовать указанные модификаторы.
Такие модификаторы позволяют передать в функцию ссылку на массив.
Во втором случае элементы массива могут быть использованы только в правой части операторов (элементы массива можно прочитать, но нельзя изменить).

Заблокирован
Регистрация: 17.06.2016
Сообщений: 62

А кто вам сказал, что в университетских книгах написано «как надо». Кто вам сказал, что эта программа вообще правильно написана? Программа жестко задает размер массива например 10, затем пользователь, который не знает какое ограничение у массива, задает какое-то число , например 15 и пытается записать в несуществующие ячейки свои числа! Где логика. Это простой пример как в университетах дурят студентов, вместо того, чтоб давать им знания.

Регистрация: 04.02.2009
Сообщений: 17,351

Кто вам сказал, что эта программа вообще правильно написана?

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

Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Регистрация: 29.06.2016
Сообщений: 4

Благодарю за проявленный интерес к теме и за ответы.

Serge_Bliznykov
Я не студент, но хочу получить 2-ое высшее. Решил самостоятельно изучать основы программирования, взял за основу список литературы, предложенный на сайте ИТМО. Там в качестве основ рассматривается именно Pascal (не delphi или VBasic).

Предложенный Вами вариант, и еще ряд других комбинаций, пробовал на PascalABC, так ничего и не заработало. О нем узнал так сказать первым и поэтому установил и начал работать. До этого был лишь один глюк, точно не смогу его описать, но он отказывался нормально выдавать результат. Установил FreePascal, работать неудобно, НО! все варианты, включая исходный на нем исправно работают!

ur_naz
Иных вариантов кроме как изучать по учебникам просто не существует. Образование сейчас дорогое, поэтому что бы получить его эффективно, желательно уже быть образованным, как бы странно это не звучало.

Константин_В
Посмотреть профиль
Найти ещё сообщения от Константин_В

Заблокирован
Регистрация: 17.06.2016
Сообщений: 62

Иных вариантов кроме как изучать по учебникам просто не существует.

Учись на форумах, читай чужие коды, пиши свои и показывай их другим, получай пинки и затычины, сравнивай варианты, ищи причины и через пару лет придет понимание
В твоем случае ты в одном месте выделяешь выделяешь память для 10 целых чисел, а в другом нет. Следовательно это задача компилятора выделять память автоматически или не выделять. FreePascal выделил тебе нужную память и программа вроде сработала, а АВС не выделил и программа не скомпилировалась . у АВС другая философия и код на нем выглядит иначе, чем на турбопаскале и ли его преемнике фрипаскале. Насколько я знаю там связные списки доступны из коробки и многие другие вкусности .Net-платформы

Регистрация: 09.01.2008
Сообщений: 26,229
Сообщение от ur_naz

.у АВС другая философия и код на нем выглядит иначе, чем на турбопаскале и ли его преемнике фрипаскале. Насколько я знаю там связные списки доступны из коробки и многие другие вкусности .Net-платформы

Вы только не путайте Pascal ABC и Pascal ABC.NET — это АБСОЛЮТНО разные вещи!

Предложенный Вами вариант, и еще ряд других комбинаций, пробовал на PascalABC, так ничего и не заработало.

Если хотите, разберёмся и заставим заработать.
Только сообщите подробности, какой именно у Вас Pascal ABC, какой код пытались компилировать и какие ошибки выдались.
Хотя, с другой стороны, может быть, оно Вам и не надо?!

Установил FreePascal, работать неудобно

Поставьте IDE (например, Lazarus) — должно быть удобно!

Успехов в учёбе!

Serge_Bliznykov
Посмотреть профиль
Найти ещё сообщения от Serge_Bliznykov

Паскаль. Функция с массивом.

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

_________
unit arrays;
interface
function twon(arrays:array of integer):integer;
implementation

function twon;
var
a,i,c:integer;
begin
c:=0;
for i:=1 to n do
begin
a:=arrays[i.];
c:=c+(a*a);
end;
if odd(c)=TRUE then writeln (‘‘’);
else writeln (‘);
begin
end .
_________

В цикле идет суммирование элементов массива, но цикл должен идти от i-того элемента и до n-ого , то есть конечного. Вот я и не пойму, как мне связать эту n с концом массива . Ведь когда я буду использовать массив для решения задачи, его конец будет задан константой . Я сначала пробовал просто добавить в скобках строки » function twon(arrays:array of integer):integer;» n: integer , чтобы тупо самому вводить вместо n сколько у меня элементов в массиве, но компилятор выбивает ошибку =\

  • 1 frag / 2 deaths
  • Постоялец

#1
15:58, 30 окт 2010

Надеюсь, это не Турбопас?
Тогда вместо n пиши Length(arrays)

Зачем бульшит? Пиши просто if odd(c)

#2
16:00, 30 окт 2010

я ставил Pascal School Pack , тут Турбо Паскаль но вроде бы доделаный. Я если честно не знаю какие там изменения, главное на вин 7 работает . Про Length я не подумал, думал такое только с строками можно. Большое спасибо, попробую

это как ?) «Если четность (c) . » если четность (с) что ?) оно же должно значение присваивать конкретное, его я и проверяю

и length не получается, пишет нужно строковое выражение (

  • 1 frag / 2 deaths
  • Постоялец

#3
16:07, 30 окт 2010

Бульшит (boolean shit) — в буквальном переводе «логическое говно», означает неверное понимание логических переменных, порождающее лишнюю писанину.
Типичный пример (в языке, где есть тернарный оператор): (a? true: false) вместо просто a.

Не надо писать if a = true, достаточно if a.
Не надо писать if a = false, достаточно if not a.
odd(c) уже возвращает булевское значение.
Сравнивая его с true мы опять получаем новое булевское значение, равное старому, то есть лишнее действие.
Это всё равно, что вместо i писать i+0 или i*1. Уродливо смотрится, короче.

Jeyme
> «Если четность (c) . «

Если c — чётное, то.

Jeyme
> и length не получается, пишет нужно строковое выражение (

Выкинь древний досовский хлам (я про версию Паскаля, что у тебя).
Ищи FPC или Delphi.

#4
16:11, 30 окт 2010

Ясно, спасибо за пояснение) FPC это Free Pascal ? хорошо, скачаю, спасибо. Только мне потом работу сдавать в университете, а там стоит Турбо Паскаль 🙂

  • 1 frag / 2 deaths
  • Постоялец

#5
16:13, 30 окт 2010

Jeyme
> Только мне потом работу сдавать в университете, а там стоит Турбо Паскаль 🙂

Блиииин.
Хреново.
Тогда передавай в функцию n явно:

function twon(n: integer; arrays:array of integer):integer;

#6
16:16, 30 окт 2010

Большое спасибо за помощь)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *