IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Подключение модуля к программе, Или проблема с модулем
Relrin
сообщение 16.03.2011 21:55
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 64
Пол: Мужской

Репутация: -  0  +


Пишу программку на 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.


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

Сообщение отредактировано: Relrin - 16.03.2011 22:10


Прикрепленные файлы
Прикрепленный файл  SLAE.pas ( 2.46 килобайт ) Кол-во скачиваний: 267
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 16.03.2011 22:11
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(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. Убери эти определения в главной программе, и компиляция пройдет. Нельзя передавать массив (особенно двумерный) другой размерности. Ты заводи массив полного размера и работай с его частью. Если же хочешь переменную размерность - нужен открытый массив.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Relrin
сообщение 16.03.2011 22:19
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 64
Пол: Мужской

Репутация: -  0  +


Цитата(Lapp @ 16.03.2011 23:11) *

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

Ок, спасибо, скомплировалось, однако результаты работы, т.е. решения СЛАУ теперь получились везде нулевые...
Под "открытым массивом" подразумевается динамический массив, да?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 16.03.2011 22:29
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 16.03.2011 23:00
Сообщение #5


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(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




--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 28.03.2024 22:59
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"