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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2016, 17:21   #1
Константин_В
Новичок
Джуниор
 
Регистрация: 29.06.2016
Сообщений: 4
По умолчанию Pascal ABC.NET Передача массива в модуль

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

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

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

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


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

USES R1;

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

BEGIN

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

END.


Модуль
___________________________________ __
UNIT R1;

INTERFACE

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

IMPLEMENTATION

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

BEGIN

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

END;

END.
Константин_В вне форума Ответить с цитированием
Старый 29.06.2016, 17:37   #2
Serge_Bliznykov
Старожил
 
Регистрация: 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 вне форума Ответить с цитированием
Старый 29.06.2016, 21:56   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

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

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 30.06.2016, 08:52   #4
ur_naz
Заблокирован
 
Регистрация: 17.06.2016
Сообщений: 62
По умолчанию

А кто вам сказал, что в университетских книгах написано "как надо"??? Кто вам сказал, что эта программа вообще правильно написана? Программа жестко задает размер массива например 10, затем пользователь, который не знает какое ограничение у массива, задает какое-то число , например 15 и пытается записать в несуществующие ячейки свои числа! Где логика??? Это простой пример как в университетах дурят студентов, вместо того, чтоб давать им знания...
ur_naz вне форума Ответить с цитированием
Старый 30.06.2016, 10:14   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Кто вам сказал, что эта программа вообще правильно написана?
Я даже знаю как там материал собирается . Дается задача более менее адекватному старшекурснику за зачет, он и бацает всякий хлам . А вот описательная часть это сложней уже. Тут уже аспирантов напрягать любят. Потом уже вычитку делают и за свой пропихивают. Также и статьи в разные журналы набивают профессора.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 30.06.2016, 12:01   #6
Константин_В
Новичок
Джуниор
 
Регистрация: 29.06.2016
Сообщений: 4
По умолчанию

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

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

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

ur_naz
Иных вариантов кроме как изучать по учебникам просто не существует. Образование сейчас дорогое, поэтому что бы получить его эффективно, желательно уже быть образованным, как бы странно это не звучало.
Константин_В вне форума Ответить с цитированием
Старый 30.06.2016, 13:41   #7
ur_naz
Заблокирован
 
Регистрация: 17.06.2016
Сообщений: 62
По умолчанию

Цитата:
Иных вариантов кроме как изучать по учебникам просто не существует.
Учись на форумах, читай чужие коды, пиши свои и показывай их другим, получай пинки и затычины, сравнивай варианты, ищи причины и через пару лет придет понимание
В твоем случае ты в одном месте выделяешь выделяешь память для 10 целых чисел, а в другом нет. Следовательно это задача компилятора выделять память автоматически или не выделять. FreePascal выделил тебе нужную память и программа вроде сработала, а АВС не выделил и программа не скомпилировалась ...у АВС другая философия и код на нем выглядит иначе, чем на турбопаскале и ли его преемнике фрипаскале. Насколько я знаю там связные списки доступны из коробки и многие другие вкусности .Net-платформы
ur_naz вне форума Ответить с цитированием
Старый 30.06.2016, 14:44   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от ur_naz
.у АВС другая философия и код на нем выглядит иначе, чем на турбопаскале и ли его преемнике фрипаскале. Насколько я знаю там связные списки доступны из коробки и многие другие вкусности .Net-платформы
Вы только не путайте Pascal ABC и Pascal ABC.NET - это АБСОЛЮТНО разные вещи!

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

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

Успехов в учёбе!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.06.2016, 15:39   #9
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Вместо var можно и const.
Поскольку параметры передаются через стек, то для массивов лучше использовать указанные модификаторы.
Если касается Delphi, то по умолчанию и const и var передают ссылки. Это очень важно при передачи в функции в многопоточном приложении.
Хотя нет, не важно... при многопоточном приложении так делать неправильно ))
eoln вне форума Ответить с цитированием
Старый 30.06.2016, 16:14   #10
Константин_В
Новичок
Джуниор
 
Регистрация: 29.06.2016
Сообщений: 4
По умолчанию

Прошу прощения, но я также думал, что PascalABC и PascalABC.NET одно и тоже. Работаю с PascalABC.NET.

Изначально пользовался справкой с офф.сайта, но как то без успехов. На сторонних сайтах нашел полезную информацию. В общем разобрался.

При работе с модулями в PascalABC.NET объявление типа переменной производится только в самом модуле. В основной программе просто объявляется переменная.
Вариант для массива с определенными размерами:

МОДУЛЬ:
Код:
UNIT R1;

INTERFACE
    TYPE MyArray = ARRAY[1..10] OF INTEGER;
    FUNCTION SUM (B:MyArray; N:INTEGER):INTEGER;
    
IMPLEMENTATION
    FUNCTION SUM(B:MyArray; N:INTEGER):INTEGER;
    VAR S,I:INTEGER;
    
    BEGIN
        S:=0;
        FOR I:=1 TO N DO S:=S+B[I];
        SUM:=S;
    END;
END.
ОСНОВНАЯ ПРОГРАММА:
Код:
PROGRAM EX;

USES R1;

VAR A:MyArray;
    I,N:INTEGER;

BEGIN
    WRITE('ВВЕДИТЕ РАЗМЕРНОСТЬ МАССИВА (<=10) :');
    READLN(N);
    
    FOR I:=1 TO N DO READ(A[I]);
    WRITELN('СУММА= ',SUM(A,N));
END.
Для открытого массива в PascalABC.NET требуется установить размерность массива, а также учитывать, что открытые массивы заполняются, начиная с 0 индекса:

МОДУЛЬ:
Код:
UNIT R1;

INTERFACE
    TYPE MyArray = ARRAY OF INTEGER;
    FUNCTION SUM (B:MyArray; N:INTEGER):INTEGER;
    
IMPLEMENTATION
    FUNCTION SUM(B:MyArray; N:INTEGER):INTEGER;
    VAR S,I:INTEGER;
    
    BEGIN
        S:=0;
        FOR I:=0 TO N-1 DO S:=S+B[I];{УЧИТЫВАЕМ, ЧТО ЗАПОЛНЕНИЕ НАЧИНАЕТСЯ С 0 ИНДЕКСА}
        SUM:=S;
    END;
END.
ОСНОВНАЯ ПРОГРАММА:
Код:
PROGRAM EX;

USES R1;

VAR A:MyArray;
    I,N:INTEGER;

BEGIN
    WRITE('ВВЕДИТЕ РАЗМЕРНОСТЬ МАССИВА :');
    READLN(N);
    
    SETLENGTH(A,N);{УСТАНАВЛИВАЕМ КОЛИЧЕСТВО ЭЛЕМЕНТОВ МАССИВА}
    
    FOR I:=0 TO N-1 DO READ(A[I]);{УЧИТЫВАЕМ, ЧТО ЗАПОЛНЕНИЕ НАЧИНАЕТСЯ С 0 ИНДЕКСА}
    WRITELN('СУММА= ',SUM(A,N));
END.
Константин_В вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal abc.net, нужно составить модуль Pon4is Помощь студентам 0 17.12.2015 23:08
Pascal ABC.NET gogomon93 Помощь студентам 4 01.12.2013 17:56
действительное число с плавающей точкой, его модуль и квадрат (pascal ABC) программирование Помощь студентам 1 01.05.2013 22:15
Pascal ABC.NET BuTaJI Помощь студентам 1 26.04.2011 20:10
Pascal ABC .NET no4_sniper Паскаль, Turbo Pascal, PascalABC.NET 0 17.10.2009 00:21