Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нарушение прав доступа при записи 
:(
    Опции темы
nullpoint
Дата 4.6.2013, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



Есть программа для решения интегрального уравнения Фредгольма второго рода методом Галеркина. При запуске вылетает Необработанное исключение по адресу 0x00DF38DD в hsh.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0xE112A85C. В чем проблема никак не могу найти.

Код

#define _USE_MATH_DEFINES
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<iostream>
#include"complex.cpp"
 
using namespace std;
 
const int n=4, N=10;
const double lambda = 0.01;
float a=0.0, b=1.0;
float X[N+1], Y[N+1], Z[N+1];
int i,j,k;
 
 
double F(float x1, float x2, float x3)
{
    return(1+lambda*(1.0+x1*x1+x2*x2+x3*x3));
}
 
complex K(float x1, float x2, float x3, float y1, float y2, float y3)
{
    //return(x1*x1+x2*x2+x3*x3+y1*y1+y2*y2+y3*y3);
    double q,w,e,r;
    q=x1-y1;
    w=x2-y2;
    e=x3-y3;
    r=x3+y3;//(y1,y2,-y3)
    double kv1=q*q+w*w+e*e;
    double kv2=q*q+w*w+r*r;
    double mod1=sqrt(kv1);
    double mod2=sqrt(kv2);
    return exp(_i * mod1)/(4 * M_PI * mod1) - exp(_i * mod2)/(4 * M_PI * mod2);
 
}
 
float fi (float x, float y, float z, int i, int j, int k)
{
    if ((y>=Y[j-1]) && (y<=Y[j+1]) && (z>=Z[k-1]) && (z<=Z[k+1]))
    {
        if ((x>=X[i-1])&& (x<=X[i])) return ((x-X[i-1])*N);
        else if ((x>X[i])&& (x<=X[i+1])) return ((X[i+1]-x)*N);
        else return 0;
    }
    else return 0;
}
 
double intf(int p, int i1, int j1, int k1)
{
    float hx, hy, hz;
    double summ=0.0;
 
    hx=(X[i1+1]-X[i1])/n;
    hy=(Y[j1+1]-Y[j1-1])/n;
    hz=(Z[k1+1]-Z[k1-1])/n;
 
    if(p==1)
    {
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                for(k=0;k<n;k++)
                {
                    summ+=F(((X[i1-1]+i*hx) + (X[i1-1]+(i+1)*hx))/2, ((Y[j1]+j*hy) + (Y[j1]+(j+1)*hy))/2, ((Z[k1]+k*hz) + (Z[k1]+(k+1)*hz))/2) * (((X[i1-1]+i*hx) + (X[i1-1]+(i+1)*hx))/2 - X[i1-1]) * hx*hy*hz;
                }
            }
        }
        return (summ);
    }
    else
    {
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                for(k=0;k<n;k++)
                {
                    summ+=F(((X[i1]+i*hx) + (X[i1]+(i+1)*hx))/2, ((Y[j1]+j*hy) + (Y[j1]+(j+1)*hy))/2, ((Z[k1]+k*hz) + (Z[k1]+(k+1)*hz))/2) * (X[i1+1] - ((X[i1]+i*hx) + (X[i1]+(i+1)*hx))/2) * hx*hy*hz;
                }
            }
        }
        return (summ);
    }
}
double intfi(int i1, int j1, int k1, int i2, int j2, int k2)
{
    float hx, hy, hz;
    double summ=0.0;
 
    hx=(X[i1+1]-X[i1])/n;
    hy=(Y[j1+1]-Y[j1-1])/n;
    hz=(Z[k1+1]-Z[k1-1])/n;
 
    for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                for(k=0;k<n;k++)
                {
                    summ+= fi(((X[i1]+i*hx) + (X[i1]+(i+1)*hx))/2, ((Y[j1]+j*hy) + (Y[j1]+(j+1)*hy))/2, ((Z[k1]+k*hz) + (Z[k1]+(k+1)*hz))/2, i1, j1, k1)*fi(((X[i1]+i*hx) + (X[i1]+(i+1)*hx))/2, ((Y[j1]+j*hy) + (Y[j1]+(j+1)*hy))/2, ((Z[k1]+k*hz) + (Z[k1]+(k+1)*hz))/2, i2, j2, k2)*hx*hy*hz;
                }
            }
    }
    return (summ);
}
 
complex intk(int i1, int j1, int k1, int i2, int j2, int k2)
{
    int ii, jj, kk;
    float hx1, hy1, hz1, hx2, hy2, hz2;
    complex summ;
 
    
    hx1=(X[i1+1]-X[i1])/n;
    hy1=(Y[j1+1]-Y[j1-1])/n;
    hz1=(Z[k1+1]-Z[k1-1])/n;
 
    hx2=(X[i2+1]-X[i2])/n;
    hy2=(Y[j2+1]-Y[j2-1])/n;
    hz2=(Z[k2+1]-Z[k2-1])/n;
 
    for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                for(k=0;k<n;k++)
                {
                    for(ii=0;ii<n;ii++)
                    {
                        for(jj=0;jj<n;jj++)
                        {
                            for(kk=0;kk<n;kk++)
                            {
                                summ+=K(((X[i1]+i*hx1) + (X[i1]+(i+1)*hx1))/2, ((Y[j1]+j*hy1) + (Y[j1]+(j+1)*hy1))/2, ((Z[k1]+k*hz1) + (Z[k1]+(k+1)*hz1))/2, ((X[i2]+ii*hx2) + (X[i2]+(ii+1)*hx2))/2, ((Y[j2]+jj*hy2) + (Y[j2]+(jj+1)*hy2))/2, ((Z[k2]+kk*hz2) + (Z[k2]+(kk+1)*hz2))/2)*fi(((X[i1]+i*hx1) + (X[i1]+(i+1)*hx1))/2, ((Y[j1]+j*hy1) + (Y[j1]+(j+1)*hy1))/2, ((Z[k1]+k*hz1) + (Z[k1]+(k+1)*hz1))/2, i1, j1, k1)*fi(((X[i2]+ii*hx2) + (X[i2]+(ii+1)*hx2))/2, ((Y[j2]+jj*hy2) + (Y[j2]+(jj+1)*hy2))/2, ((Z[k2]+kk*hz2) + (Z[k2]+(kk+1)*hz2))/2,i2,j2,k2)*hx1*hy1*hz1*hx2*hy2*hz2;
                            }
                        }
                    }
                }
            }
    }
    return (summ);
}
 
void main()
{
    float h;
    int i1, j1, k1, i2, j2, k2, I, J, NN=0;
 
 
    complex A[10][10], f[10];
    h=(b-a)/N;  
    for(i1=0;i1<N+1;i1++)
    {
        X[i1] = 0.0;
        Y[i1] = 0.0;
        Z[i1] = 0.0;
        X[i1] = a + i1*h;
        Y[i1] = a + i1*h;
        Z[i1] = a + i1*h;
    }
    I=0;
    for (i1=1; i1<N; i1++)
     {
        for (j1=1; j1<N; j1+=2)
        {
            for (k1=1; k1<N; k1+=2)
            {
                J=0;
for (i2=1; i2<N; i2++)
                 {
        for (j2=1; j2<N; j2+=2)
                     {
            for (k2=1; k2<N; k2+=2)
                          {
                            if((i1<=(N/2)) || (j1<=(N/2)))
                            if((i2<=(N/2)) || (j2<=(N/2)))
                              {
                                  A[I][J]=intfi(i1,j1,k1,i2,j2,k2) + lambda*intk(i1,j1,k1,i2,j2,k2);
                                cout<< A[I][J] <<" ";
                                  J++;
                              }
                          }
                     }
                 }
                if((i1<=(N/2)) || (j1<=(N/2)))
                 {
                     f[I]=N*(intf(1,i1-1,j1,k1)+intf(2,i1,j1,k1));
                    cout<< f[I] <<endl;
                     I++;
                     NN++;
                 }
            }
        }
     }
    cout<<" "<<endl;
    
    cout<<" "<<endl;
 
//МетодГаусса
 
    double eps=0.000001;
    double max;
    int max_i;
    complex lead, a_div_lead;
 
for(k=0; k<NN; k++)
   {
max=0;
max_i=-1;
 
for(i=k; i<NN; i++)
      {
        if(abs(A[i][k])>max)
         {
        max=abs(A[i][k]);
        max_i=i;
         }
      }
 
 
if(max_i==-1 || abs(A[max_i][k])<eps)
      {
        cout<<"\n\n"<<"Error: det=0"<<"\n\n";
 
        break;
      }
 
 
 
lead=A[k][k];
 
for(j=k; j<NN; j++)
        A[k][j]/=lead;
f[k]/=lead;
 
for(i=0; i<NN; i++)
      {
a_div_lead=A[i][k]/A[k][k];
 
if(i!=k)
        {
for(j=k; j<NN; j++)
            A[i][j]-=A[k][j]*a_div_lead;
f[i]-=f[k]*a_div_lead;
        }
      }
  }
 
cout<<"\n\n";
 
for (i=0; i<NN; i++)
  {
    cout<<"a["<< i+1 <<"] = "<< f[i] <<"\n";
  }
 
           _getch();
 
}


Это сообщение отредактировал(а) nullpoint - 4.6.2013, 18:32
PM MAIL   Вверх
feodorv
Дата 4.6.2013, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(nullpoint @  4.6.2013,  19:31 Найти цитируемый пост)
В чем проблема никак не могу найти.

Определите строчку кода, которая даёт такую ошибку.


Что бросилось в глаза.
Цитата(nullpoint @  4.6.2013,  19:31 Найти цитируемый пост)
                J=0;
for (i2=1; i2<N; i2++)
                 {
        for (j2=1; j2<N; j2+=2)
                     {
            for (k2=1; k2<N; k2+=2)
                          {
                            if((i1<=(N/2)) || (j1<=(N/2)))
                            if((i2<=(N/2)) || (j2<=(N/2)))
                              {
                                  A[ I ][J]=intfi(i1,j1,k1,i2,j2,k2) + lambda*intk(i1,j1,k1,i2,j2,k2);
                                cout<< A[ I ][J] <<" ";
                                  J++;
                              }
                          }
                     }
                 }

Насколько большим (по сравнению с заявленными 10 элементами) может стать J, никто не знает. Аналогично с I:
Цитата(nullpoint @  4.6.2013,  19:31 Найти цитируемый пост)
                if((i1<=(N/2)) || (j1<=(N/2)))
                 {
                     f[ I ]=N*(intf(1,i1-1,j1,k1)+intf(2,i1,j1,k1));
                    cout<< f[ I ] <<endl;
                     I++;
                     NN++;
                 }

Получаете выход за пределы массива, что вполне может дать нарушение прав доступа при записи.

Это сообщение отредактировал(а) feodorv - 4.6.2013, 18:53


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
nullpoint
Дата 4.6.2013, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



feodorv, именно на этой строчке и появляется исключение. Как можно исправить? Что то я никак не соображу...
PM MAIL   Вверх
feodorv
Дата 4.6.2013, 20:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(nullpoint @  4.6.2013,  20:06 Найти цитируемый пост)
Как можно исправить? Что то я никак не соображу... 

Честно говоря, я не понимаю логику программы, почему именно так вычисляются значения элементов массивов A и f, и зачем они вообще нужны. Не шарю я в интегральных уравнениях Фредгольма второго рода методом Галеркина smile Ничем не могу помочь...


Заметил ещё недоразумение:
Цитата(nullpoint @  4.6.2013,  19:31 Найти цитируемый пост)
                     f[ I ]=N*(intf(1,i1-1,j1,k1)+intf(2,i1,j1,k1));

Когда i1 становится единицей, то в intf() отправляется 0, а в самой intf() есть такое выражение:
Цитата(nullpoint @  4.6.2013,  19:31 Найти цитируемый пост)
X[i1-1]

то есть получается X[-1], что тоже означает выход за пределы массива...



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
kolesnle
Дата 5.6.2013, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 22.3.2013

Репутация: нет
Всего: нет



Цитата(feodorv @  4.6.2013,  20:30 Найти цитируемый пост)
Не шарю я в интегральных уравнениях Фредгольма второго рода методом Галеркина 

 smile  Я тоже не шарю... В этих ваших ядрах Фредгольма... Краевых задачах... Голова кругом идет
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0780 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.