Другие языки программирования и технологии

Процедуры в PascalABC.NET. Ввод данных

У меня есть процедура в Паскале. Она организовывает ввод данных и сама процедура заключена в мною созданной библиотеке. При применении процедуры в другой программе, процедура выдаёт нули, вместо введённых данных. Пошагово компилируя, я понял, что введённые данные остаются внутри самой процедуры и не попадают в программу, но как исправить проблему я так и не понял.
Надо было сразу код в текст вопроса прикреплять, а не скриншотом в комментариях к ответу... Имей в виду га будущее — если хочешь ответа по существу, а не гаданий на кофейной гуще.

Короче. Во-первых, рекомендую тебе использовать массивы, это будет удобнее и проще, чем описание десятка отдельных переменных. С массивами просто работать, хотя, возможно, ты их ещё не изучал...

Во-вторых, при передаче в процедуру каких-либо аргументов есть как минимум два режима передачи:
— только ввод данных в процедуру;
— ввод данных и вывод данных.
Ещё по идее должен быть "только вывод", но я не помню, есть ли такое в Pascal (в Ada, например, есть и такое).

Так вот ты передаёшь свои переменные в режиме "только ввод":
procedure Proc(A, B, C: Integer);
По сути, здесь процедура получает некие значения A, B и C, но она не сможет ничего вернуть "наружу", т. к. по сути ты ей даёшь копии переменных, а не оригиналы.

Второй режим описывается так:
procedure Proc(var A, B, C: Integer);
Здесь ты заявляешь компилятору, что хочешь предоставить этой процедуре прямой доступ к неким трём переменным. Такая процедура сможет изменять значения A, B и C, которые ты ей передашь.

Но вообще тут имеет смысл использовать функцию, поскольку именно они предназначены для вывода каких-то данных, плюс это безопаснее. Как-то так:

type
// сначала описываем наш массив:
TMatrix = array [1..3, 1..3] of Integer;
// затем идёт функция считывания массива:
function ReadMatrix: TMatrix;
var M: TMatrix; // временный буфер
x, y: Byte; // счётчики для циклов
// (по одному байту здесь хватит)
begin
WriteLn; // просто перевод строки
WriteLn('Введите матрицу 3 на 3:');
WriteLn; //хотя не знаю, зачем тебе это
for x := 1 to 3 do // перебираем строчки
begin
for y := 1 to 3 do // перебираем столбцы
Read(M[x, y]); // это будет вызвано 9 раз
WriteLn; // а это - только 3 раза
end;
// Теперь главное!
// Возвращаем массив наружу:
ReadMatrix := M; // аналог return M; из Си
end;

Как это использовать:
var InputM: TMatrix; // массив, куда читаем
ResultM: ...// какой-то массив результов
begin
InputM := ReadMatrix; // прочитали матрицу
ResultM := Calculate (InputM); // посчитали
... // и т. д.

Или даже проще можно:
Результат := Калькулятор (Считыватель);
В данном случае не нужно даже объявлять отдельный массив InputM, все данные будут передаваться туда, куда им нужно, не засоряя код и память. Но это уже немного функциональный подход...
ЖД
Женя Дзиневский
2 341
Лучший ответ
Алмат Дамигуль Кульмановы Спасибо, я уже до этого нашёл ответ, но ваш более развёрнутый и понятный. Насчёт массивов: по алгоритмии и программированию мы не изучали многомерные матрицы, когда как в математике их уже используем и совершаем различные действия с ними. Что до применения, то препод разрешил использовать самописные программы для не очень важных работ, таких как проверочные, самостоятельные и т. д., так сказать и по профессии по-практиковаться и математикой позаниматься.
На самом деле со слов всё трудно понять. Переменные глобальные или локальные? Тип переменных соответствует друг другу? (integer -> integer, real -> real, и т. д.)
Гоглев Иван
Гоглев Иван
1 026
Алмат Дамигуль Кульмановы На первом скрине видна процедура, а на втором программа и её вывод
Алмат Дамигуль Кульмановы По сути, как я понял, процедура берёт глобальные переменные, но возвращать их как глобальные не хочет и они остаются внутри процедуры.