Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 20
1

Выделение и очистка памяти

29.05.2017, 01:09. Показов 1171. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Все вроде бы работает правильно, ну покранемере, что смог проверить работает правильно. Но у меня периодически вылетает ошибка об повреждении кучи, либо функция determinant возвращает -nan(ind)(сейчас переменная dt объявлена глобально, поэтому ничего возвращать не надо и ошибки соответственно нет), либо, когда функция доходит до принтф во второй итерации последнего цикла, то программа перескакивает на free(a) и выдает ошибку достигнута точка останова, хотя я ее не ставил. Еще просматривал кучу, и когда програма перескакивает на free(a), то она занимает еще 9кб неизвестно на что.
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
#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#include <malloc.h>
#define N 100
#define EPS 1e-10
 
int n;
float dt;
float sum = 0;
struct minor* Minor;
 
typedef struct characteristic_polynomial {
    struct characteristic_polynomial *next;
    float coefficient;
} characteristic_polynomial;
 
typedef struct minor{
    float *matrix;
    int *stroka;
    int size;
} minor;
 
void swap(float* a, int x, int y, int n)
{
    float z = 0;
    for (int i = 0; i < n; i++)
    {
        z = a[x*n + i];
        a[x*n + i] = a[y*n + i];
        a[y*n + i] = z;
    }
}
 
void determinant()
{
    float* a;
    a = (float*)malloc(sizeof(float)*Minor->size*Minor->size);
    for (int i = 0; i < Minor->size; i++)
        for (int j = 0; j < Minor->size; j++)
            a[i*Minor->size + j] = Minor->matrix[Minor->stroka[i] * n + Minor->stroka[j]];
 
    dt = 1;
    for (int i = 0; i < Minor->size; ++i)
    {
        int k = i;
        for (int j = i + 1; j < Minor->size; ++j)
            if (fabs(a[j*Minor->size + i]) > fabs(a[k*Minor->size + i]))
                k = j;
        if (fabs(a[k*Minor->size + i]) < EPS)
        {
            dt = 0;
            break;
        }
        swap(a, i, k, Minor->size);
        if (i != k)
            dt = -dt;
        dt *= a[i*Minor->size + i];
        for (int j = i + 1; j < Minor->size; ++j)
            a[i*Minor->size + j] /= a[i*Minor->size + i];
        for (int j = 0; j < Minor->size; ++j)
            if ((j != i) && (fabs(a[j*Minor->size + i]) > EPS))
                for (int k = i + 1; k < Minor->size; ++k)
                    a[j*Minor->size + k] -= a[i*Minor->size + k] * a[j*Minor->size + i];
    }
    free(a);
    a = NULL;
}
 
void new_minor(int n, int r, int *arr, int sz) 
{
    for (int i = n; i >= r; i--)
    {
        arr[r - 1] = i;
        if (r > 1)
        {
            new_minor(i - 1, r - 1, arr, sz);
        }
        else
        {
            for (int j = 0; j < sz; j++)
            {
                Minor->stroka[j] = arr[j] - 1;
            }
            Minor->size = sz;
            determinant();
            sum += dt;
        }
    }
}
 
void main(int argc, char *argv[])
{
    FILE *file;
    char buf;
    int i, j, k, m, number1, number2, *matrix;
 
    setlocale(LC_ALL, "Russian");
 
    Minor = (minor*)malloc(sizeof(float) * n * n + sizeof(int) * n + sizeof(int));
    Minor->matrix = (float*)malloc(sizeof(float) * n * n);
    Minor->stroka = (int*)malloc(sizeof(int) * n);
    Minor->size = (int)malloc(sizeof(int));
 
    file = fopen(argv[1], "r+");                    
    fscanf(file, "%c%c%c", &buf, &buf, &buf);
    fscanf(file, "%d", &n);
 
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            fscanf(file, "%d", &number1);
            fscanf(file, "%c", &buf);
            if (buf == '/')
            {
                fscanf(file, "%d", &number2);
                *(Minor->matrix + i * n + j) = (float)number1 / number2;
                continue;
            }
            *(Minor->matrix + i * n + j) = (float)number1;
        }
    }
    fclose(file);
 
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%5.2f ", *(Minor->matrix + i * n + j)); // 5 знакомест под элемент массива
        }
        printf("\n");
    }
 
    matrix = (float*)malloc(sizeof(float)*n);
    for (i = 1; i <= n; i++)
        matrix[i] = i;
 
    for (i = 1; i <= n; i++)
    {
        sum = 0;
        new_minor(n, i, matrix, i);
        printf("S[%d] = %.2f\n", i, sum);
    }
 
    free(Minor->matrix);
    free(Minor->stroka);
    free(Minor->size);
    free(Minor);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2017, 01:09
Ответы с готовыми решениями:

Динамическая память выделение и очистка
Здравствуйте ) помогите разобраться нашёл на сайте простенькую программку, которая сначала выделяет...

Вектор, утечка памяти, функция создания и выделение памяти
Здравствуйте. Есть проблема. функция malloc выделяет память лишь в функции CreateVector(), и при...

Очистка памяти от структуры
Есть структура бинарного дерева: struct Node { char name; struct Node *left; struct Node...

Корректная очистка памяти через Free
Доброго времени суток! Столкнулся со след. ситуацией. есть код: #include &lt;stdio.h&gt;...

2
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
29.05.2017, 11:45 2
Цитата Сообщение от stormkirill Посмотреть сообщение
Minor->size = (int)malloc(sizeof(int));
Зачем?
Цитата Сообщение от stormkirill Посмотреть сообщение
free(Minor->size);
Ну и это туда же.
(подробно не смотрел)
0
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 20
29.05.2017, 11:48  [ТС] 3
Спасибо. Да лишнее. Но это ошибку все равно не решает)))
0
29.05.2017, 11:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2017, 11:48
Помогаю со студенческими работами здесь

Нужна ли очистка памяти в приведенном коде
У меня есть структура следующего вида struct list { char *word; struct list *next; }; Я...

Выделение памяти
Подскажите, как сделать выделение памяти через malloc и calloc вместо new и delete #include...

Выделение памяти
Где тут ошибка не могу найти #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main(void) { int...

Выделение памяти Си
Здравствуйте. Задача следующая: дан текст. Пользователь вводит слово,которое нужно заменить в...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru