Переменная цикла for должна описываться в том же блоке, что и цикл for (Как исправить?)
program SLAU;
uses crt;
type
aa=array[1..4,1..4] of real;
bb=array[1..4] of real;
xx=array[1..4] of real;
var a:aa;b:bb;x:xx;q,s,eps:real;slaum:text;
var x1:array[1..4] of real;x0:array[1..4] of real;
i,j,k,m,n:integer;
procedure gaussa(a:aa;b:bb;var x:xx;n:integer);
Begin
eps:=0.0001;
for i:=1 to n-1 do
for k:=i+1 to n do
Begin
q:=a[k,i]/a[i,i];
for j:=1 to n do
a[k,j]:=a[k,j]-q*a[i,j];
b[k]:=b[k]-b[i]*q;
end;
Writeln;
x[n]:=b[n]/a[n,n];
for i:=n-1 downto 1 do
Begin
s:=0;
for j:=i+1 to n do
s:=s+a[i,j]*x[j];
x[i]:=(b[i]-s)/a[i,i];
end;
End;
(Ошибка 13 строка)
Другие языки программирования и технологии
Как решить эту проблему ?
Мы не видим вашего полного кода, поэтому оценить всей красоты вашего решения не можем, НО Компилятор явно вас предупреждает, что не стоит стелить грабли туда, куда вы собираетесь падать.
В данном случае он вам говорит, что в блоке кода (в процедуре) вы используете переменные в цикле объявленные снаружи этого блока кода, а следовательно они могут меняться снаружи этого кода, что будет прямо влиять на блок, а не должно. Но что веселее - циклы из процедуры после вызова ее гарантировано изменят значения глобальных переменных, которые много для чего могут использоваться.
В идеале должно быть так, что блок оперирует с данными явно переданными в него как параметры и возвращает обозначенный перечень данных не трогая кроме этого ничего снаружи, у вас же полный фарш граблей:
1. i,j,k - объявлены снаружи блока, а должны внутри, в процедуре.
есть переменные
2. n, a,b,x объявленные снаружи, как глобальные переменные, но при этом их полные тезки передаются в нее как параметры - грязь и потенциальный источник ошибок.
3. eps объявлена снаружи, в процедуре задано значение, но ни разу внутри процедуры не используется - потенциальный источник ошибок, если используется где-то снаружи, и бесполезный бред, если не используется нигде.
4. x, x0 и x1 имеют тот же тип по сути что и b но объявлены почему то все раздельно, при попытке передать в процедуру глобальный x или x0 или x1 получите несоответствие типов.
Как решить - отделите глобальные переменные от тех что используются в подпрограммах дав им разные имена, да этого можно не делать в некоторых случаях, но это даст вам гораздо больше понимания что на что влияет и когда используется. Т. е. я бы, например, написал так: https://onlinegdb.com/HJd8Twud_
При этом я не проверял логику самого метода.
В данном случае он вам говорит, что в блоке кода (в процедуре) вы используете переменные в цикле объявленные снаружи этого блока кода, а следовательно они могут меняться снаружи этого кода, что будет прямо влиять на блок, а не должно. Но что веселее - циклы из процедуры после вызова ее гарантировано изменят значения глобальных переменных, которые много для чего могут использоваться.
В идеале должно быть так, что блок оперирует с данными явно переданными в него как параметры и возвращает обозначенный перечень данных не трогая кроме этого ничего снаружи, у вас же полный фарш граблей:
1. i,j,k - объявлены снаружи блока, а должны внутри, в процедуре.
есть переменные
2. n, a,b,x объявленные снаружи, как глобальные переменные, но при этом их полные тезки передаются в нее как параметры - грязь и потенциальный источник ошибок.
3. eps объявлена снаружи, в процедуре задано значение, но ни разу внутри процедуры не используется - потенциальный источник ошибок, если используется где-то снаружи, и бесполезный бред, если не используется нигде.
4. x, x0 и x1 имеют тот же тип по сути что и b но объявлены почему то все раздельно, при попытке передать в процедуру глобальный x или x0 или x1 получите несоответствие типов.
Как решить - отделите глобальные переменные от тех что используются в подпрограммах дав им разные имена, да этого можно не делать в некоторых случаях, но это даст вам гораздо больше понимания что на что влияет и когда используется. Т. е. я бы, например, написал так: https://onlinegdb.com/HJd8Twud_
При этом я не проверял логику самого метода.
Александр Реш
блин ваше редактировал, но не до конца: вот тут поправил https://onlinegdb.com/H1cP7ddu_, но опечатки могут быть, логику поймите главное.
у n значения нет
for var i:=1 to n-1 do
ты точку с запятой забыл
Похожие вопросы
- Помогите пожалуйста решить проблему при рендере в Sony Vegas Pro 10!!!
- Решить проблему выбором движка для сайта.
- Помогите мне пожалуйста, решить проблему большую, по...
- Проблема с антивирусом,подскажите как решить её?
- Помогите решить проблему..
- Помогите решить проблему с паскалем, запутался...
- подскажите! До переустановки ОС были локальные диски C И D ?а щас стало С и E! В чём проблема как решить???
- Слишком мало места на диске С. А удалять то нечего там. 40 мб из 20 гг осталос. Как проблему решить?
- Есть проблема. Пытаясь решить простую задачу, я ударяюсь в высшие материи, и дело доходит до метапрограммирования.
- Добрый день, решил заняться программированием, но появилась проблема!!!