Важная информация
Показано с 1 по 3 из 3

Тема: При подсчёте значений ошибка log:SING error

  1. #1 При подсчёте значений ошибка log:SING error 
    Новичок
    Регистрация
    13.10.2019
    Сообщений
    1
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Добрый вечер. Столкнулся с такой проблемой, что после ввода значений программа выдаёт ошибку log:SING error раз 10 подряд, а после выводит полученные результаты на экран. В таблице часто встречаются нули, хотя я не уверен, что они должны получаться в ходе работы программы. Сама программа работает корректно, поскольку я подставлял в неё другую функцию без логарифма и всё правильно считалось. Так что дело явно в логарифме. Знаю, что эта ошибка вылезает, когда логарифм пытается считать значение от 0. Прописал условия, чтобы этого не происходило, однако, не помогло. Возможно какого-то условия не хватает, или в программе что-то не так. Прощу помочь решить эту проблему. Ниже код и скрин поля для ввода значений. Выводные значения: интеграл, количество итераций и таблица.

    C++ Code:
    1.  
    2. //---------------------------------------
    3.  
    4. ------------------------------------
    5.  
    6. #include <vcl.h>
    7. #pragma hdrstop
    8. #include <math.h>
    9. #include <cmath>
    10. #include "Unit1.h"
    11. //---------------------------------------
    12.  
    13. ------------------------------------
    14. #pragma package(smart_init)
    15. #pragma resource "*.dfm"
    16. TForm1 *Form1;
    17. //---------------------------------------
    18.  
    19. ------------------------------------
    20. double F(double);
    21. void Sim
    22.  
    23. (double,double,double,int,int&,double&,in
    24.  
    25. t&);
    26. void Tab
    27.  
    28. (double,double,double,int,int,double&,dou
    29.  
    30. ble*,double*,double**,double**);
    31. void RezOut
    32.  
    33. (int,int,double&,int&,double*,double*,dou
    34.  
    35. ble**,double**);
    36. //---------------------------------------
    37.  
    38. ------------------------------------
    39. __fastcall TForm1::TForm1(TComponent*
    40.  
    41. Owner)
    42.         : TForm(Owner)
    43. {
    44. }
    45. //---------------------------------------
    46.  
    47. ------------------------------------
    48.  
    49. void __fastcall TForm1::Button1Click
    50.  
    51. (TObject *Sender)
    52. {
    53. double C,D,Eps,Xn,Xk,Dx,B;
    54. int Km,Er,M,LS;
    55. Xn=StrToFloat(Form1->Edit1->Text);
    56. Xk=StrToFloat(Form1->Edit2->Text);
    57. Dx=StrToFloat(Form1->Edit3->Text);
    58. C=StrToFloat(Form1->Edit4->Text);
    59. D=StrToFloat(Form1->Edit5->Text);
    60. Eps=StrToFloat(Form1->Edit6->Text);
    61. Km=StrToFloat(Form1->Edit7->Text);
    62. M=StrToFloat(Form1->Edit8->Text);
    63. int N=(int)((Xk-Xn)/Dx)+1;
    64. double *Mx=new double[N];
    65. double *Ma=new double[M];
    66. double **Mf=new double*[M];
    67. for(int i=0;i<M;i++)
    68. Mf[i]=new double[N];
    69. double **Err=new double*[M];
    70. for(int i=0;i<M;i++)
    71. Err[i]=new double[N];
    72. if((Eps>0)&&(Eps<1))
    73. {
    74. Sim(C,D,Eps,Km,LS,B,Er);
    75. if(Er==1)
    76.   {
    77.   ShowMessage("Интеграл не найдет за
    78.  
    79. "+IntToStr(Km)+" итераций");
    80.   }
    81.   else
    82.   {
    83.   Tab(Xn,Xk,Dx,N,M,B,Mx,Ma,Mf,Err);
    84.   RezOut(N,M,B,LS,Mx,Ma,Mf,Err);
    85.   }
    86. }
    87. else
    88.   {
    89.   ShowMessage("Погрешность должна быть
    90.  
    91. больше 0 и меньше 1");
    92.   }
    93. delete[]Mx;
    94. delete[]Ma;
    95. for(int i=0;i<M;i++)
    96.   delete[]Mf[i];
    97.   delete[]Mf;
    98. for(int i=0;i<M;i++)
    99.   delete[]Err[i];
    100.   delete[]Err;
    101. }
    102. //---------------------------------------
    103.  
    104. ------------------------------------
    105.  
    106. void __fastcall TForm1::Button2Click
    107.  
    108. (TObject *Sender)
    109. {
    110. Form1->Edit1->Clear();
    111. Form1->Edit2->Clear();
    112. Form1->Edit3->Clear();
    113. Form1->Edit4->Clear();
    114. Form1->Edit5->Clear();
    115. Form1->Edit6->Clear();
    116. Form1->Edit7->Clear();
    117. Form1->Edit8->Clear();
    118. Form1->Edit9->Clear();
    119. Form1->Edit10->Clear();
    120. for(int i=0;i<=Form1->StringGrid1-
    121.  
    122. >RowCount;i++)
    123. {
    124. Form1->StringGrid1->Rows[i]->Clear();
    125. }
    126. }
    127. //---------------------------------------
    128.  
    129. ------------------------------------
    130.  
    131. void __fastcall TForm1::Button3Click
    132.  
    133. (TObject *Sender)
    134. {
    135. Close();
    136. }
    137. //---------------------------------------
    138.  
    139. ------------------------------------
    140. double F(double X)
    141. {
    142. double F=exp(X)*cos(X*X);
    143. return F;
    144. }
    145. //---------------------------------------
    146.  
    147. ------------------------------------
    148. void Sim(double C,double D,double Eps,int
    149.  
    150. Km,int &LS,double &B,int &Er)
    151. {
    152. double Int,Y1,Yn,S4,S2,H,Del,Loc,X;
    153. int I,J,K2;
    154. Er=1;
    155. LS=0;
    156. Int=0;
    157. Y1=F(C);
    158. Yn=F(D);
    159. K2=2;
    160. J=1;
    161. while(J<=Km)
    162. {
    163. H=(D-C)/K2;
    164. B=0;
    165. S2=0;
    166. S4=0;
    167. I=1;
    168. X=C+H;
    169. do {
    170.    if((I%2)!=0)
    171.     {
    172.     S4=S4+F(X);
    173.     }
    174.     else
    175.     {
    176.     S2=S2+F(X);
    177.     Loc=4*S4+2*S2;
    178.     }
    179.     I=I+1;
    180.     X=X+H;
    181.     }
    182. while(I<K2);
    183. B=H*(Y1+Yn+Loc)/3;
    184. Del=fabs(Int-B);
    185. if(Del<Eps)
    186.    {
    187.    Er=0;
    188.    LS=J;
    189.    J=Km;
    190.    }
    191. else
    192.    {
    193.    Int=B;
    194.    K2=K2*2;
    195.    }
    196.   J=J+1;
    197.   }
    198. }
    199. //---------------------------------------
    200.  
    201. ------------------------------------
    202. void Tab(double Xn,double Xk,double
    203.  
    204. Dx,int N,int M,double
    205.  
    206. &B,double*Mx,double*Ma,double**Mf,double*
    207.  
    208. *Err)
    209. {
    210. for(int i=0;i<M;i++)
    211.    {
    212.    for(int j=0;j<N;j++)
    213.    {
    214.     Mx[j]=Xn+Dx*j;
    215.     if ((log(Ma[i]*Mx[j])!=0) && (Ma[i]
    216.  
    217. *Mx[j]!=0) && (Ma[i]*Mx[j]!=1) && (Ma
    218.  
    219. [i]!=0) && (Ma[i]!=1) && (Mx[j]!=0) &&
    220.  
    221. (Mx[j]!=1))
    222.     {
    223.     Mf[i][j]=(Mx[j]*(cos(M_PI*Mx[j])-
    224.  
    225. 3*B*sin(2*Mx[j])))/log(Ma[i]*Mx[j]);
    226.     Err[i][j]=0;
    227.     }
    228.     else Err[i][j]=1;
    229.    }
    230. }
    231. }
    232. //---------------------------------------
    233.  
    234. ------------------------------------
    235. void RezOut(int N,int M,double &B,int
    236.  
    237. &LS,double *Mx,double *Ma,double
    238.  
    239. **Mf,double**Err)
    240. {
    241. Form1->Edit9->Text=FloatToStr(B);
    242. Form1->Edit10->Text=IntToStr(LS);
    243. Form1->StringGrid1->RowCount=N+1;
    244. Form1->StringGrid1->ColCount=M+1;
    245. Form1->StringGrid1->Cells[0][0]="X/A";
    246. for(int i=0;i<M;i++)
    247.    {
    248.    Form1->StringGrid1->Cells[i+1][0]="A
    249.  
    250. ["+IntToStr(i)+"]="+FloatToStr(Ma[i]);
    251.    for(int j=0;j<N;j++)
    252.    {
    253.    Form1->StringGrid1->Cells[0][j+1]="X
    254.  
    255. ["+IntToStr(j)+"]="+FloatToStr(Mx[j]);
    256.    if(Err[i][j]==1)
    257.     Form1->StringGrid1->Cells[i+1][j+1]
    258.  
    259. ="Err";
    260.     else
    261.    Form1->StringGrid1->Cells[i+1][j+1]
    262.  
    263. =FloatToStr(Mf[i][j]);
    264.    }
    265. }
    266. }
    267. //---------------------------------------
    268.  
    269. ------------------------------------
    Изображения
    • Тип файла: png 1.PNG (18.3 Кб, Просмотров: 3)
    Ответить с цитированием  
     

  2. #2  
    Профи
    Регистрация
    09.11.2013
    Сообщений
    308
    Сказал(а) спасибо
    17
    Поблагодарили 89 раз(а) в 63 сообщениях
    проверь что ты создаешь. куда заполняешь и что удаляешь в программе
    Ответить с цитированием  
     

  3. #3  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,238
    Сказал(а) спасибо
    305
    Поблагодарили 192 раз(а) в 156 сообщениях
    Записей в блоге
    5
    Да, что означает это ошибка вы уже разобрались. Далее вам остается прологгировать значения, которые обрабатывает эта функция. Если есть возможность вернуть статус ошибки - то задача упрощается. Всякий раз, когда флаг ошибки установлен, выводите аргумент для функции в любой лог, вместе с любой информацией, которая может вам помочь разобраться, откуда там берется 0, или на какой аргумент конкретно она ругается.
    Библиотечные функции Си и плюсов в целом хорошо отлажены и задокументированы, так что проблемы и странные ошибки при их использовании скорее всего вызваны недопониманием их работы.
    Код сравнительно длинный и в деталях отлаживать в голове я его не стану, а билдера у меня нет для проверки, но догадка в духе пальцем в небо: где-то вы выходите за пределы массива\матрицы и попадаете в невалидную память, инициализированную нулем. Это может быть классическая ошибка выхода за пределы массива уровня char z[10]; for (int i = 1; i < 10; i++) и потом log(z[i]) или в таком духе.
    Дружба-магия-радость!
    Ответить с цитированием  
     

  4. Пользователь сказал cпасибо:

    >Quiet Snow< (16.10.2019)

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 5
    Последнее сообщение: 09.03.2019, 13:27
  2. Ответов: 1
    Последнее сообщение: 17.12.2018, 16:39
  3. Error ffmpeg
    от 128942 в разделе Операционные системы
    Ответов: 0
    Последнее сообщение: 07.12.2018, 20:18
  4. Сделать вывод значений в виде графа
    от НикаНика в разделе Delphi
    Ответов: 0
    Последнее сообщение: 04.12.2018, 12:22
  5. Ответов: 9
    Последнее сообщение: 19.11.2011, 23:40
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •