Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/2: Рейтинг темы: голосов - 2, средняя оценка - 4.50
dasalam
10 / 10 / 0
Регистрация: 14.12.2008
Сообщений: 59
1

Непонятная ошибка сегментации

30.10.2010, 19:39. Просмотров 445. Ответов 4
Метки нет (Все метки)

Собственно код
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
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
 
#define MAX_ITERR   100
#define N   3
#define EPS 0.01
 
double SCALAR(double *x, double *y)
{
    int i;
    double res=0.0;
    
    for(i=0; i<=N-1; i++)
        res = res + x[i]*y[i];
        
    return res;
}
 
void matrvec(double **A, double *U, double *AU)
{
    int i, j;
    double res;
    
    for(i=0; i<=N-1; i++) {
        res = 0.0;
        for(j=0; j<=N-1; j++) {
            res = res + A[i][j]*U[j];
            AU[i] = res;
        }
    }
}
 
void discrepancy(double **A, double *U, double *F, double *r)
{
    int i;
    double AUk[N];
    
    matrvec(A, U, AUk);
    for(i=0; i<=N-1; i++) {
        r[i] = AUk[i] - F[i];
    }
}
 
int fvread(double *F, int descriptor)
{
    int nread;
    int i;
    
    for(i=0; i<=N-1; i++) {
        nread=read(descriptor, &F[i], sizeof(double));
        if(nread == -1)
            return -1;
    }
    
    return 0;
}
 
int Amread(double **A, int descriptor)
{
    int nread;
    int i, j=0;
    
    for(i=0; i<=N-1; i++)
        for(j=0; j<=N-1; j++) {
            nread=read(descriptor, &A[i][j], sizeof(double));
            if(nread == -1)
                return -1;
        }
    
    return 0;
}
 
int main()
{
    double *F = (double *)malloc(N * sizeof(double));
    double t[MAX_ITERR];
    double Ark[MAX_ITERR], AUk[MAX_ITERR];
    int i=0, j;
    double err[N];
    double **A, **r, **U;
    
    A = (double **)malloc(N * sizeof(double *));
    if(A == NULL) return -1;
        for(i = 0; i < N; i++) {
            A[i] = (double *)malloc(N * sizeof(double));
            if (A[i] == NULL) return -1;
        }
            
    r = (double **)malloc(N * sizeof(double *));
    if(r == NULL) return -1;
        for(i = 0; i < N; i++) {
            r[i] = (double *)malloc(N * sizeof(double));
            if (r[i] == NULL) return -1;
        }
    
    U = (double **)malloc(N * sizeof(double *));
    if(U == NULL) return -1;
        for(i = 0; i < N; i++) {
            U[i] = (double *)malloc(N * sizeof(double));
            if (U[i] == NULL) return -1;
        }
    
    int d = open("data.bin", O_RDONLY);
    printf("d=%d\n", d);
    
    if(fvread(F, d) == -1) return -1;
    for(i=0; i<=N-1; i++)
        printf("F[%d] = %.2f; ", i, F[i]);
    
    if(Amread(A, d) == -1) return -1;
    for(i=0; i<=N-1; i++) {
        printf("\n");
        printf("i = %d\n", i);;
        for(j=0; j<=N-1; j++)
            printf("A[%d][%d] = %.2f; ", i, j, A[i][j]);
    }
 
    for(i=0; i<=N-1; i++)
        U[0][i] = 1;
        
    matrvec(A, U[0], AUk);
    
    do {
        printf("U[%d] = (", i);
        for(j=0; j<=N-1; j++)
            printf("%.4f, ", U[i][j]);
        printf(")^T\n");
        
        discrepancy(A, U[i], F, r[i]);
        matrvec(A, r[i], Ark);
        t[i] = SCALAR(r[i], r[i]) / SCALAR(Ark, r[i]);
        matrvec(A, U[i], AUk);
        for(j=0; j<=N-1; j++)
            U[i+1][j] = U[i][j] - t[i]*(AUk[j]-F[j]);
        for(j=0; j<=N-1; j++)
            err[j] = U[i+1][j]-U[i][j];
        i++;
        printf("||U_i+1-U_i|| = %f\n", SCALAR(err, err));
    } while((i!=MAX_ITERR-2) || sqrt(SCALAR(err, err))>EPS);
    
    return 0;
}
Вывод программы:
Bash
1
2
3
4
5
6
7
8
d=3
F[0] = 1.00; F[1] = 1.00; F[2] = 0.00;
 
i = 0
A[0][0] = 1.00; A[0][1] = 0.00; A[0][2] = 0.00; 
i = 1
A[1][0] = 0.00; A[1][1] = 1.00; A[1][2] = 0.00; 
i = 2
Был бы очень благодарен за скорую помощь.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2010, 19:39
Ответы с готовыми решениями:

Ошибка сегментации
всем здраствуйте. double power(double n, int p) //определение функции 22 { 23 if (n...

Ошибка сегментации
Задача: В двух файлах дано 2 массива. Вывести эти 2 массива в третий файл в отсортированном виде....

Ошибка сегментации
собственно прикрепляю проект (code::blocks). при запуске вылетает ошибка. почему - хз.

Ошибка сегментации
# include &lt;sys/types.h&gt; # include &lt;sys/times.h&gt; # include &lt;sys/socket.h&gt; # include &lt;stdio.h&gt; #...

Ошибка сегментации
Написал программу, которая по схеме Горнера преобразует многочлен до квадратного уравнения. По...

4
dxdy
97 / 97 / 14
Регистрация: 14.06.2010
Сообщений: 284
30.10.2010, 19:51 2
а условие задачи какое?
0
dasalam
10 / 10 / 0
Регистрация: 14.12.2008
Сообщений: 59
30.10.2010, 20:03  [ТС] 3
dxdy, по методу градиентного спуска найти минимум функционала. Но думаю, что это не сильно поможет. Кстати, если объявить массивы r и U просто как double r[N][N], U[N][N]; то все отлично работает. Интересно больше не решение задачи, а почему так происходит
0
accept
4835 / 3257 / 464
Регистрация: 10.12.2008
Сообщений: 10,569
31.10.2010, 06:15 4
C
1
2
3
4
5
6
    do {
        printf("U[%d] = (", i);
        fflush(stdout);
        for(j=0; j<=N-1; j++)
            printf("%.4f, ", U[i][j]); /* i за пределами */
        printf(")^T\n");
0
dasalam
10 / 10 / 0
Регистрация: 14.12.2008
Сообщений: 59
31.10.2010, 11:31  [ТС] 5
Цитата Сообщение от accept Посмотреть сообщение
C
1
2
3
4
5
6
    do {
        printf("U[%d] = (", i);
        fflush(stdout);
        for(j=0; j<=N-1; j++)
            printf("%.4f, ", U[i][j]); /* i за пределами */
        printf(")^T\n");
Действительно, большое спасибо.
0
31.10.2010, 11:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2010, 11:31

Ошибка сегментации gcc
Здравствуйте, уважаемы форумчане) Пытаюсь реализовать шифр Плейфера. Компилируется нормально,...

Указатели на структуру - ошибка сегментации
всем привет! разбираюсь с указателями на структуру и realloc ставит в тупик.. то есть код работает,...

Ошибка сегментации в массиве констант
Есть часть кода. Условия задачи:найти строку с самым большим произведением и отсортировать строку...


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

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

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