Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
pun4er
6 / 6 / 1
Регистрация: 06.10.2010
Сообщений: 122
#1

Что то с памятью... - C (СИ)

15.04.2011, 18:03. Просмотров 314. Ответов 1
Метки нет (Все метки)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
#define sqr(x) ((x)*(x))
//Newton's method
const double dx=0.0001;
double *df,**d2f;
double f(double * x)
{
 return 2*sqr(x[0])+4*sqr(x[1])+8*sqr(x[2])+2*x[0]*x[1]-x[0]*x[2]+2*x[1]*x[2]+6*x[0]-7*x[2];
}
//Matrix's procedure
void invert(int n,int &q);
//Gradient's procedure
void For_Math_d2f(int n, double &grad, double * x);
//--------------------------------------------------------------
int main()
{
 int i,j,n,q;
 double *x,eps,grad,s;
 clrscr();
 printf("n=");
 scanf("%d",&n);
 printf("eps=");
 scanf("%lf",&eps);
 puts("Vvedite nachalnie znacheniya peremennih");
 d2f=(double**)malloc(sizeof(double)*n);
 for (i=0;i<n;i++)
 {
  d2f[i]=(double*)malloc(sizeof(double)*n);
 }
 x=(double*)malloc(n*sizeof(double));
 df=(double*)malloc(n*sizeof(double));
 for (i=0;i<n;i++)
 {
  printf("x[%d]=",i+1);
  scanf("%lf",&x[i]);
 }
 do{
  For_Math_d2f(n,grad,x);
  invert(n,q);
  if(q)
  {
   puts("Opredelitel=0");
   fflush(stdin);
   getchar();
   return 0;
  }
  for (i=0;i<n;i++)
  {
   s=0;
   for (j=0;j<n;j++)
   s+=d2f[i][j]*df[j];
   x[i]-=s;
  }
 }while(grad>=eps);
 puts("\nResultati optimizacii:\n");
 for (i=0;i<n;i++)
 printf("x[%d]=%5.10lf\n",i+1,x[i]);
 printf("Znachenie funkcii celi=%5.10lf",f(x));
 for (i=0;i<n;i++)
  free(d2f[i]);
 free(d2f);
 free(x);
 free(df);
  fflush(stdin);
  getchar();
  return 0;
 }
 //--------------------------------------------------------
 void invert(int n, int &q)
 {
  double **a,t;
  int i,j,k,m;
  m=2*n;
  a=(double**)malloc(sizeof(double*)*n);
  for (i=0;i<n;i++)
   a[i]=(double*)malloc(sizeof(double)*m);
   q=0;
   for (i=0;i<n;i++)
    for (j=0;j<m;j++)
     if (j<n) a[i][j]=d2f[i][j];
    else
     if (j==n+i) a[i][j]=1;
    else a[i][j]=0;
    for (i=0;i<n;i++)
    {
     k=i;
    M1:
       if(!a[k][i])
       {
    q=1;
    if (k < n-1) k++;
    else return;
    goto M1;
       }
       if (q)
    for (j=0;j<m;j++)
    {
     t=a[k][j];
     a[k][j]=a[i][j];
     a[i][j]=t;
    }
     for (j=m-1;j>=i;j--) a[i][j]/=a[i][i];
     for (k=0;k<n;k++)
      if (k!=i)
       for (j=m-1;j>=0;j--)
        a[k][j]-=a[i][j]*a[k][i];
       }
    q=0;
     for (i=0;i<n;i++)
      for (j=0;i<n;j++)
      d2f[i][j]=a[i][j+n];
     for (i=0;i<n;i++)
      free(a[i]);
     free(a);
  }
//----------------------------------------------------------
void For_Math_d2f(int n,double &grad, double * x)
{
 double s,f0;
 int i,j;
 //Raschet 1 proizvodnih
 f0=f(x); //s=0;
  for (i=0;i<n;i++)
 {
  x[i]+=dx;
  df[i]=(f(x)-f0)/dx;
  s=sqr(df[i]);
  x[i]-=dx;
 }
  grad=sqrt(s);
//Raschet 2 proizvodnih
 for (i=0;i<n;i++)
 {
  s= -2*f(x);
  x[i]+=dx;
  s+=f(x);
  x[i]-=2*dx;
  s+=f(x);
  x[i]+=dx;
  d2f[i][i]=s/sqr(dx);
 }
//Raschet smeshannih proizvodnih
 for (i=0;i<n;i++)
  for (j=i+1;j<n;j++)
 {
  s=f(x); //1
  x[i]-=dx; x[j]-=dx;
  s+=f(x); //4
  x[j]+=dx;
  s-=f(x); //2
  x[i]+=dx;
  x[j]-=dx;
  s-=f(x); //3
  x[j]+=dx;
  d2f[i][j]=s/sqr(dx);
  d2f[j][i]=d2f[i][j];
 }
}
Программа должна минимизировать целевую функцию методом Ньютона. Компилятор ошибок не находит. Но привыполнении программы вылетает ошибка Floating point error: Domain.
Abnormal program termination. Почитал в Интернетах, все говорят, что такая ошибка вылетает в основном при проблеммах с памятью. Чувствую косяк в динамическом массиве, но сам ошибку найти не могу( Помогите, кто чем сможет)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2011, 18:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что то с памятью... (C (СИ)):

Что с динамической памятью? - C (СИ)
Прерывается работа программы, еще не научилась нормально выделять ДП. Есть структура и для ее элементов нужно выделить ДП. Выводит...

Работа с динамической памятью - C (СИ)
Нужно наименьший элемент каждой строки, начиная со второй заменить наибольшим элементом предшествующей строки. Ошибка в том, что программа...

Работа с динамической памятью - C (СИ)
Создаю указатели char *s,*p; s = (char *)malloc(sizeof(char)); потом p = (char *)realloc(s, 100) Что такое p и что такое...

Работа со структурой и динамической памятью - C (СИ)
Как создать структуру типа typedef с двумерным массивом внутри, что бы потом можно было через маллок создать создать динамический ...

Работа с памятью - нужна литература - C (СИ)
Я несколько месяцев назад начал знакомство с Си (до этого знал Паскаль, Бэйсик). Прочитал пару книжек про основы, сделал маленькие...

Работа с памятью, выделенной malloc - C (СИ)
Доброго времени суток! Есть следующая проблема: Выделяем кусок памяти из кучи: void *alloc(size_t size_of_elem, size_t...

1
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
15.04.2011, 19:42 #2
Ну на всякий случай знай, если памяти не хватает, можно (как вариант) увеличить файл подкачки системы.
Как ИМЕННО сделать, ищется в инете на раз.

Быть может, это не твой случай, я не разбирался, код большой. Но у меня по крайней мере раз такое было, когда я запрашивал ОЧЕНЬ БОЛЬШОЙ объём памяти ось отказывалась его выделять, а когда я увеличил фай подкачки, то всё стало ОК.

Это как вариант.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2011, 19:42
Привет! Вот еще темы с ответами:

Работа с памятью, массивы строк - C (СИ)
Здравствуйте, столкнулась с такой проблемой: есть файл, из него считали текст в некий буффер buf, затем создали массив строк Massiv, чтобы...

Передача аргументов в функцию. Работа с памятью. - C (СИ)
int f(int a) {...} int g(float *a) {...} int h(float *&amp;a) {...} int main() { float *p; int a=5; int res; .... ...

Утечки при работе с динамической памятью - C (СИ)
Здравствуйте, отправляю задачу на сервер, пишут:&quot;Утечки памяти&quot;. Для входных данных: 3 Вот код: #include &lt;stdio.h&gt; #include...

Некорректная работа с памятью (calloc и free) - C (СИ)
Суть задачи: Пользователь вводит с клавиатуры строку с разделителями в виде пробела. Надо выделить слова в предложении. Далее у...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.