Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2011, 01:29   #1
Symba
Пользователь
 
Регистрация: 02.03.2011
Сообщений: 31
По умолчанию Зависает программа

сначала вылетала ошибка о переполнении вещественного типа переменной (205 ошибка floating point overflow), сменил тип с real на Extended....ошибки не стало...но прога стала жутко виснуть, загружает проц под завязку, как справиться с этим?
Symba вне форума Ответить с цитированием
Старый 22.06.2011, 01:37   #2
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

у вас чтото с кодом покажыте его...
Pein95 вне форума Ответить с цитированием
Старый 22.06.2011, 01:39   #3
Symba
Пользователь
 
Регистрация: 02.03.2011
Сообщений: 31
По умолчанию

Цитата:
Сообщение от Pein95 Посмотреть сообщение
у вас чтото с кодом покажыте его...
Код:
procedure TForm1.btn2Click(Sender: TObject);
var
  A,C,E:array of array of Extended;
  D,B:array  of Extended;
  i,j,n: Integer;
  x: Extended;
begin
  n:=se1.Value;
 SetLength(A, n,n);
 SetLength(C, n,n);
 SetLength(B, n);
 SetLength(D, n);
 for i:=0 to n-1 do
  begin
    for j:=0 to n-1 do
    begin
      A[i,j]:=StrToFloat(strngrd1.Cells[j,i]);
      B[i]:=StrToFloat(strngrd2.Cells[0,j]);
    end;
  end;
  for   i:=0 to n-1 do
  begin
  for   j:=0 to n-1 do
  begin
    strngrd4.Cells[0,j]:=FloatToStrF(((StrToFloat(strngrd2.Cells[0,j])/ StrToFloat(strngrd1.Cells[j,j]))),ffFixed,10,7);
    D[j]:=StrToFloat(strngrd4.Cells[0,j]);
      if i=j then
      strngrd3.Cells[i,j]:='0'
      else
      strngrd3.Cells[i,j]:= FloatToStrF((A[j,i]/ A[j,j]*(-1)),ffFixed,10,7);
      C[j,i]:=StrToFloat(strngrd3.Cells[i,j]);
  end;
  end;


 repeat
   x:=0;
  Inc(i);
  SetLength(E, i+1,n);
for j:=0 to n-1 do
begin
E[ i,j]:=0;
E[ i,j]:=E[ i-1,0]*C[ j,0]+E[ i-1,1]*C[ j,1]+E[ i-1,2]*C[ j,2]+E[ i-1,3]*C[ j,3]+D[ j];
 x:=Abs(E[i,j]-E[i-1,j]);
 mmo1.Text:=mmo1.Text+FloatToStrF(E[i,j],ffFixed,10,7)+'     ';

end;
 mmo1.Text:=mmo1.Text+#13#10;
  pb1.Position:=pb1.Position+i;
 until x<=StrToFloat(edt1.Text);
 pb1.Max:=i;

end;
не нашел подсветку делфи =( в функциях сообщений на форуме

конкретно ошибка вылетала вот на этой строке, до того как сменил типы
Код:
E[ i,j]:=E[ i-1,0]*C[ j,0]+E[ i-1,1]*C[ j,1]+E[ i-1,2]*C[ j,2]+E[ i-1,3]*C[ j,3]+D[ j];

Последний раз редактировалось Symba; 22.06.2011 в 01:42.
Symba вне форума Ответить с цитированием
Старый 22.06.2011, 09:44   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

чему равно i перед входом в цикл repeat ?
чему равны значения массива E[i-1, *] (* произвольный номер) при первом проходе цикла?
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 22.06.2011, 11:01   #5
Symba
Пользователь
 
Регистрация: 02.03.2011
Сообщений: 31
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
чему равно i перед входом в цикл repeat ?
чему равны значения массива E[i-1, *] (* произвольный номер) при первом проходе цикла?
хм....всё равно, даже если я сделаю вот так
Код:
 i:=0;// присвоил i 0
 repeat
  x:=0;
  Inc(i);
  SetLength(E, i+1,n);
for j:=0 to n-1 do
begin
E[ 0,j]:=0;//  присвоил всей первой строке 0
E[ i,j]:=0;
for k:=0 to 3 do
E[ i,j]:=E[ i,j]+E[ i-1,k]*C[ j,k]; //
                                           //переделал цикл для динам массивов
E[ i,j]:=E[ i,j]+D[ j];                //
x:=Abs(E[i,j]-E[i-1,j]);
mmo1.Text:=mmo1.Text+FloatToStrF(E[i,j],ffFixed,10,7)+' ';
end;
 mmo1.Text:=mmo1.Text+#13#10;
  pb1.Position:=pb1.Position+i;
 until x<=StrToFloat(edt1.Text);
виснет.....
ну уточняю)) прога зависает изначально, когда я вбиваю большой массив (5х5 например, для матрицы А) и везде ставлю единички), а в вектор B сумму элементов строки массива А ( то есть 5ки)....а с другими значениями
считает правильно =) ручками считать не пробовал, может при таких условиях и вовсе нет решения....извиняюсь.
конкретно считает правильно вот эти значения
A
10,19 0,61 1,42 -0,17
-0,03 9,26 -0,57 0,23
-2,13 2,24 10,11 -0,97
2,43 2,02 -2,89 9,71
B
12,05
8,89
9,25
11,27
да даже если любые случайные числа от 1 до 9 ставлю в матрицу А , а в B сумму элементов строки А,все ровно программа висит ((

p.s. не судите строго, это не вопрос "жизни и смерти", просто любительский интерес , извините.

Последний раз редактировалось Symba; 22.06.2011 в 11:49.
Symba вне форума Ответить с цитированием
Старый 22.06.2011, 12:20   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

E[ 0,j]:=0;// присвоил всей первой строке 0
на первом проходе только ПЕРВОМУ (j=0)
E[ i,j]:=0;
for k:=0 to 3 do // а здесь используем все ЧЕТЫРЕ (k=0,1,2,3)
E[ i,j]:=E[ i,j]+E[ i-1,k]*C[ j,k]; //
Цитата:
считает правильно =) ручками считать не пробовал, может при таких условиях и вовсе нет решения....извиняюсь.
предлагаете посчитать нам НЕ ЗНАЯ вашего алгоритма?
P.S. читать код вычислений матриц С D нет сил.
Сначала надо просто вычислять эти матрицы на основе исходных данных (матриц A B)
C[j]:=A[j,i] / A[j,j];
а потом просто вывести уже вычисленное
stringGrid[j,i]:=Flattostr(C[j,i]);
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 22.06.2011, 12:38   #7
Symba
Пользователь
 
Регистрация: 02.03.2011
Сообщений: 31
По умолчанию

спасибо, буду разбираться!
Symba вне форума Ответить с цитированием
Старый 22.06.2011, 18:33   #8
Symba
Пользователь
 
Регистрация: 02.03.2011
Сообщений: 31
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
E[ 0,j]:=0;// присвоил всей первой строке 0
на первом проходе только ПЕРВОМУ (j=0)
E[ i,j]:=0;
for k:=0 to 3 do // а здесь используем все ЧЕТЫРЕ (k=0,1,2,3)
E[ i,j]:=E[ i,j]+E[ i-1,k]*C[ j,k]; //
предлагаете посчитать нам НЕ ЗНАЯ вашего алгоритма?
P.S. читать код вычислений матриц С D нет сил.
Сначала надо просто вычислять эти матрицы на основе исходных данных (матриц A B)
C[j]:=A[j,i] / A[j,j];
а потом просто вывести уже вычисленное
stringGrid[j,i]:=Flattostr(C[j,i]);
в общем в целом код обработчика этого события получился вот такой
Код:
procedure TForm1.btn2Click(Sender: TObject);
var
  A,C,E:array of array of Extended;
  D,B:array  of Extended;
  i,j,n,k: Integer;
  x: Extended;
begin
  n:=se1.Value;
 SetLength(A, n,n);
 SetLength(C, n,n);
 SetLength(B, n);
 SetLength(D, n);
 for i:=0 to n-1 do
  begin
    for j:=0 to n-1 do
    begin
      A[i,j]:=StrToFloat(strngrd1.Cells[j,i]);
      B[i]:=StrToFloat(strngrd2.Cells[0,i]);
    end;
  end;
  for   i:=0 to n-1 do
  begin
  for   j:=0 to n-1 do
  begin
    D[j]:=B[j]/A[j,j];
    strngrd4.Cells[0,j]:=FloatToStrF(D[j],ffFixed,10,7);
      if i=j then
      C[j,i]:=0
      else
      C[j,i]:=A[j,i]/A[j,j]*(-1);
      strngrd3.Cells[i,j]:= FloatToStrF(C[j,i],ffFixed,10,7);
  end;
  end;

 i:=0;
 repeat
  x:=0;
  Inc(i);
  SetLength(E, i+1,n);
for j:=0 to n-1 do
begin
for k:=0 to n-1 do
begin
E[ 0,k]:=0;
E[ i,j]:=E[ i,j]+E[ i-1,k]*C[ j,k];
end;
E[ i,j]:=E[ i,j]+D[ j];
x:=Abs(E[i,j]-E[i-1,j]);
mmo1.Text:=mmo1.Text+FloatToStrF(E[i,j],ffFixed,10,7)+' ';
end;
 mmo1.Text:=mmo1.Text+#13#10;
  pb1.Position:=pb1.Position+i;
 until x<=StrToFloat(edt1.Text);
 pb1.Max:=i;

end;
тока прога все равно виснет при больших начальных данных, хотя эти же данные другая прога( сделанная не мной, нашли в инете), считает нормально, но правда там другой метод используется,у меня же метод якоби, так и не понял, в чем причина зависания =(.
evg_m , спасибо за помщь, плюсик от меня в репутацию =)
Symba вне форума Ответить с цитированием
Старый 23.06.2011, 10:08   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
mmo1.Text:=mmo1.Text+FloatToStrF(E[i,j],ffFixed,10,7)+' ';
скажите для чего вам эти данные вы на них смотрите (проверяете вручную)

Цитата:
for k:=0 to n-1 do
begin
E[ 0,k]:=0;
E[ i,j]:=E[ i,j]+E[ i-1,k]*C[ j,k];
end;
Чему равно E[i,j] перед началом данного цикла?
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 23.06.2011, 18:52   #10
Symba
Пользователь
 
Регистрация: 02.03.2011
Сообщений: 31
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
скажите для чего вам эти данные вы на них смотрите (проверяете вручную)
да, я сравниваю с решенной задачей, она в EXCEL решена.
Цитата:
Сообщение от evg_m Посмотреть сообщение
Чему равно E[i,j] перед началом данного цикла?
равно 0 (нулю).
в общем я пошарил по гуглу, по другим форумам, посоветовали воспользоваться отладчиком делфи.
видимо те данные что я вводил, и прога висла, данным методом невозможно решить, ну тем не менее, код подправил малость, вот что получилось
Код:
repeat
  x:=0;
  Inc(i);
  SetLength(E, i+1,n);
for j:=0 to n-1 do
begin
for k:=0 to n-1 do
begin
E[ 0,k]:=0;
E[ i,j]:=E[ i,j]+E[ i-1,k]*C[ j,k];
end;
E[ i,j]:=E[ i,j]+D[ j];
x:=x+Abs(E[i,j]-E[i-1,j]); // сложил все элементы последней строки массива
mmo1.Text:=mmo1.Text+FloatToStrF(E[i,j],ffFixed,10,7)+' ';
end;

 mmo1.Text:=mmo1.Text+#13#10;
 lbl10.Caption:=IntToStr(i);
 until x<=StrToFloat(edt1.Text)*j; // домножил на кол-во столбцов
думаю, это все что можно сделать...или нет? =)

Последний раз редактировалось Symba; 23.06.2011 в 19:11.
Symba вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа зависает Anubys Помощь студентам 0 20.05.2011 23:40
зависает программа - обработчик прерывания mrmrmr Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 01.05.2011 12:50
При второй синхронизации программа зависает bulldog5293 Работа с сетью в Delphi 0 27.11.2010 14:42
Зависает программа DimOn4Ik Общие вопросы Delphi 4 29.05.2010 21:05
Изза потока зависает программа RNT Общие вопросы Delphi 9 10.07.2009 19:15