Помощь - Поиск - Пользователи - Календарь
Полная версия: Подключение модуля к программе
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Relrin
Пишу программку на FreePascal. Написал модуль, который решает СЛАУ методом Гаусса. Скомпилировалсь без проблем, однако возникла при после подключения модуля и попытки запустить основную программу вылезла ошибка:
Цитата
Error: Incompatible type for arg no. 5: Got "pr1.Vector", expected "SLAE.Vector"


Основной код программы:

Program pr1;

Uses Crt, Dos, SLAE;

Const
nn=4;

Type
Matrix = array[1..nn,1..nn] of real; {матрица}
Vector = array[1..nn] of real; {столбец-вектор}

Var
a : matrix; {исходная матрица}
b,x : vector; {свободные члены, решения СЛАУ}
Eps : double; {точность вычислений}

{Использование матрицы-константы}
Procedure UseConstMatrix(var a:matrix);
Begin
a[1,1]:=7.5; a[1,2]:=1.8; a[1,3]:=-2.1; a[1,4]:=-7.7; b[1]:=1.1;
a[2,1]:=-10; a[2,2]:=1.3; a[2,3]:=-20; a[2,4]:=-1.4; b[2]:=1.5;
a[3,1]:=2.8; a[3,2]:=-1.7; a[3,3]:=3.9; a[3,4]:=4.8; b[3]:=1.2;
a[4,1]:=10; a[4,2]:=31.4; a[4,3]:=-2.1; a[4,4]:=-10; b[4]:=1.1;
End;

{Вывод исходной матрицы на экран}
Procedure PrintMatrix(n: integer; var a: matrix; var b: vector);
Var
i,j,r: integer;
Begin
clrscr;
writeln(' Исходная матрица: ');
writeln;
r:=WhereY;
gotoXY(2,r);
for i:=1 to n do
begin
gotoXY(i*6+5,r);
write(i);
gotoXY(1,r+i+1);
write(i:2);
end;
gotoXY((n+1)*6+6,r);
write('b');
for i:=1 to n do
begin
for j:=1 to n do
begin
gotoXY(j*6+1,r+i+1);
write(a[i,j]:7:2);
end;
gotoXY((n+1)*6+2,r+i+1);
write(b[i]:7:2);
end;
End;

{Вывод результатов}
Procedure PrintSolutions(n: integer; var x: vector);
Var
i,j,r: integer;
Begin
writeln(' Решение матрицы: ');
for i:=1 to n do
begin
writeln(' x',i,'= ', x[i]: 4 : 6);
end;
End;

{Введение точности вычислений с клавиатуры}
Procedure EnterAcc;
Begin
writeln;
writeln;
writeln(' Введите точность: ');
repeat
write(' >');
read(Eps);
until (Eps>0) and (Eps<1);
writeln;
End;

{Основная программа}
Begin
clrscr;
{Вывод исходной матрицы на экран}
UseConstMatrix(a);
PrintMatrix(nn,a,b);
readkey;
{Решение СЛАУ методом Гаусса}
EnterAcc;
Gauss(nn,a,b,Eps,x);
{Вывод результата}
PrintSolutions(nn,x);
readkey;
End.


Прикрепляю также сделанный модуль...
Lapp
Цитата(Relrin @ 16.03.2011 21:55) *

Написал модуль, который решает СЛАУ методом Гаусса. Скомпилировалсь без проблем, однако возникла при после подключения модуля и попытки запустить основную программу вылезла ошибка:
Основной код программы:

Program pr1;

Uses Crt, Dos, SLAE;

Const
nn=4;

Type
Matrix = array[1..nn,1..nn] of real; {матрица}
Vector = array[1..nn] of real; {столбец-вектор}

Var
a : matrix; {исходная матрица}
b,x : vector; {свободные члены, решения СЛАУ}
Eps : double; {точность вычислений}

{Использование матрицы-константы}
Procedure UseConstMatrix(var a:matrix);
Begin
a[1,1]:=7.5; a[1,2]:=1.8; a[1,3]:=-2.1; a[1,4]:=-7.7; b[1]:=1.1;
a[2,1]:=-10; a[2,2]:=1.3; a[2,3]:=-20; a[2,4]:=-1.4; b[2]:=1.5;
a[3,1]:=2.8; a[3,2]:=-1.7; a[3,3]:=3.9; a[3,4]:=4.8; b[3]:=1.2;
a[4,1]:=10; a[4,2]:=31.4; a[4,3]:=-2.1; a[4,4]:=-10; b[4]:=1.1;
End;

{Вывод исходной матрицы на экран}
Procedure PrintMatrix(n: integer; var a: matrix; var b: vector);
Var
i,j,r: integer;
Begin
clrscr;
writeln(' Исходная матрица: ');
writeln;
r:=WhereY;
gotoXY(2,r);
for i:=1 to n do
begin
gotoXY(i*6+5,r);
write(i);
gotoXY(1,r+i+1);
write(i:2);
end;
gotoXY((n+1)*6+6,r);
write('b');
for i:=1 to n do
begin
for j:=1 to n do
begin
gotoXY(j*6+1,r+i+1);
write(a[i,j]:7:2);
end;
gotoXY((n+1)*6+2,r+i+1);
write(b[i]:7:2);
end;
End;

{Вывод результатов}
Procedure PrintSolutions(n: integer; var x: vector);
Var
i,j,r: integer;
Begin
writeln(' Решение матрицы: ');
for i:=1 to n do
begin
writeln(' x',i,'= ', x[i]: 4 : 6);
end;
End;

{Введение точности вычислений с клавиатуры}
Procedure EnterAcc;
Begin
writeln;
writeln;
writeln(' Введите точность: ');
repeat
write(' >');
read(Eps);
until (Eps>0) and (Eps<1);
writeln;
End;

{Основная программа}
Begin
clrscr;
{Вывод исходной матрицы на экран}
UseConstMatrix(a);
PrintMatrix(nn,a,b);
readkey;/
{Решение СЛАУ методом Гаусса}
EnterAcc;
Gauss(nn,a,b,Eps,x);
{Вывод результата}
PrintSolutions(nn,x);
readkey;
End.


Прикрепляю также сделанный модуль...

Ты переопределяешь константу nn и типы vector и matrix. Убери эти определения в главной программе, и компиляция пройдет. Нельзя передавать массив (особенно двумерный) другой размерности. Ты заводи массив полного размера и работай с его частью. Если же хочешь переменную размерность - нужен открытый массив.
Relrin
Цитата(Lapp @ 16.03.2011 23:11) *

Ты переопределяешь константу nn и типы vector и matrix. Убери эти определения в главной программе, и компиляция пройдет. Нельзя передавать массив (особенно двумерный) другой размерности. Ты заводи массив полного размера и работай с его частью. Если же хочешь переменную размерность - нужен открытый массив.

Ок, спасибо, скомплировалось, однако результаты работы, т.е. решения СЛАУ теперь получились везде нулевые...
Под "открытым массивом" подразумевается динамический массив, да?
Lapp
Цитата(Relrin @ 16.03.2011 22:19) *
Под "открытым массивом" подразумевается динамический массив, да?
Нет, это разные вещи.
Открытый массив - это способ передачи параметров в процедуру/функцию. Поищи по форуму типа на "+открыт* +массив*" (без кавычек).
Lapp
Цитата(Relrin @ 16.03.2011 22:19) *
результаты работы, т.е. решения СЛАУ теперь получились везде нулевые...

Естественно, нулевые. У тебя же результат передается через x, а он не описан, как var.
Сделай его var'ом и передавай в процедуры настоящий размер системы (то есть 4).
У меня все отработало:
 Исходная матрица:

1 2 3 4 b

1 7.5 1.8 -2.1 -7.70 1.10
2 -10.0 1.3 -20.0 -1.40 1.50
3 2.8 -1.7 3.9 4.80 1.20
4 10.0 31.4 -2.1 -10.00 1.10

Введите точность:
>0.01

Решение матрицы:
x1= 0.343710
x2= -0.008641
x3= -0.265784
x4= 0.262392


Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.