Другие языки программирования и технологии
Процедуры в 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, все данные будут передаваться туда, куда им нужно, не засоряя код и память. Но это уже немного функциональный подход...
Короче. Во-первых, рекомендую тебе использовать массивы, это будет удобнее и проще, чем описание десятка отдельных переменных. С массивами просто работать, хотя, возможно, ты их ещё не изучал...
Во-вторых, при передаче в процедуру каких-либо аргументов есть как минимум два режима передачи:
— только ввод данных в процедуру;
— ввод данных и вывод данных.
Ещё по идее должен быть "только вывод", но я не помню, есть ли такое в 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, все данные будут передаваться туда, куда им нужно, не засоряя код и память. Но это уже немного функциональный подход...
Алмат Дамигуль Кульмановы
Спасибо, я уже до этого нашёл ответ, но ваш более развёрнутый и понятный. Насчёт массивов: по алгоритмии и программированию мы не изучали многомерные матрицы, когда как в математике их уже используем и совершаем различные действия с ними. Что до применения, то препод разрешил использовать самописные программы для не очень важных работ, таких как проверочные, самостоятельные и т. д., так сказать и по профессии по-практиковаться и математикой позаниматься.
На самом деле со слов всё трудно понять. Переменные глобальные или локальные? Тип переменных соответствует друг другу? (integer -> integer, real -> real, и т. д.)
Алмат Дамигуль Кульмановы
По сути, как я понял, процедура берёт глобальные переменные, но возвращать их как глобальные не хочет и они остаются внутри процедуры.
Похожие вопросы
- PascalABC.NET Графика и анимация простейший уровень, не хочет выполняться процедура, (помогите новичку)
- Как создать компьютерного червя на PascalABC.NET и на других языках программирования или опишите структуру червя.
- C++ Проверка правильности ввода данных.
- PascalABC.NET Графика, движение объекта после нажатия клавиши
- чем отличается Delphi 7 от PascalABC.net ???
- Хочу задать вопрос по множествам PascalABC.NET
- pascalabc.net все функцеи Напишите пожалуйста все функции Пример sqrt(x )
- Задача на PascalABC.NET. Помогите с решением, очень прошу!
- Нужна очень задача решеная по паскалю! PascalABC.NET
- Где ошибка в программе PascalABC.net