Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Ezemchenko
0 / 0 / 0
Регистрация: 08.03.2019
Сообщений: 3
1

Проблемы во время работы с памятью

08.03.2019, 17:37. Просмотров 1604. Ответов 5

Здравствуйте! У меня возникла проблема при нахождении определителя матрицы путём разложения матрицы по строкам.
Проблема заключается в том, что во время работы с новым массивом, объявленным в функции, значения теряются(или я их неверно записываю(см. код)). Прошу указать на мою ошибку. Заранее спасибо!!!
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
#include <stdio.h>
#include <malloc.h>
// Структура
struct Matrix
{
    float *data;
};
// Функция по поиску детерминанта(определителя)n*n
float determ(float *b, int n)
{
    int l = 0, h = 0, f=0;
    float s = 0;
    Matrix z;
    if(n>0)
        f = n - 1;
    z.data = (float*)malloc((f)*(f) * sizeof(float));// объявление доп. матрицы меньшего размера
    if (n == 2)
    {
        s = s + (*((b + 0 * n) + 0)) * (*((b + 1 * n) + 1)) - (*((b + 1 * n) + 0)) * (*((b + 0 * n) + 1));
    }
    else
    {
        for (int k = 0; k < n; k++)
        {
            for (int i = 0; i < f; i++)
            {
                for (int j = 0; j < f; j++)
                {
                    if ((i != 0) && (j != k))
                    {
                        *((z.data + i * f) + j) = *((b + i * f) + j);
                    }
                }
            }
            s = s + *((b + 0 * n) + k) * determ(z.data, f)*pow(-1, (1 + k) % 2);
            l = 0;
        }
    }
    return s;
}
int main()
{
    char ch = '1';
    int g, h;
    scanf_s("%d%d", &g, &h);
    Matrix a;
    a.data = (float*)malloc(g*h * sizeof(float));// объявление основного массива
    printf("Enter elements of first array:\n");
    for (int i = 0; i < g; i++)// заполнение массива через консоль
    {
        for (int j = 0; j < h; j++)
        {
            scanf_s("%f", ((a.data + i * g) + j));
        }
    }
    printf("\n");
    ch = getchar();
    printf("\n");
    if (g == h)// проверка на то, что матрица квадратная
    {
        float det = determ(a.data, g);// вызов функции для определения матрицы
        printf("det= %f \n", det);
    }
    else
        printf("We don't have quard matrix=>We can't find determinant");
    return 0;
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2019, 17:37
Ответы с готовыми решениями:

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

В чем преимущества операций new и delete по сравнению с функциями для работы с динамической памятью
Здравствуйте, совсем не знаю язык Си, подскажите отличая между С++. В чем преимущества операций...

проблемы с памятью....
с алгоритмом вроде все нормально но вот происходит такая вещи при определенном действии выдается...

Проблемы с памятью
здравствуйте.я так подозреваю что начались проблемы с памятью.во первых встроенный тест памяти на...

Проблемы с памятью
Программа создает династическую двумерную матрицу. Не могу найти где происходит утечка памяти. Если...

5
Andrey B
74 / 51 / 29
Регистрация: 06.02.2015
Сообщений: 135
Завершенные тесты: 1
08.03.2019, 21:04 2
Не было достаточно времени, чтобы разобрать ваш код
Кидаю пример (взят отсюда Определитель матрицы, разложением по произвольной строке и немного исправлен и протестирован по мере сил) в надежде, что он наведет вас на мысли что не так с вашим кодом.

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
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
 
int notInEx(float *lot, double v, int l){
    for (int i = 0; i < l; i++){
        if (v == lot[i]) {
            return 0;
        }
    }
    return 1;
}
 
float determinant(float **meas, int size, float *lot, int l){
    float r = 0;
    float s = 1;
    for (int j = 0; j < size; j++) {
        if (notInEx(lot, j, l)){
            if (l == size - 1){
                return meas[l][j];
            }
            else {
                lot[l] = j;
                r = r + s * meas[l][j] * determinant(meas, size, lot, l + 1);
                s = -s;
            }
        }
    }
    return r;
}
 
void main() {
    setlocale(LC_ALL, "rus");
    float **meas = 0, *lot = 0;
    int size;
 
    printf("Введите размер матрицы: ");
    scanf("%d", &size);
 
    lot = (float*)malloc(size*sizeof(float));
    meas = (float**)malloc(size * sizeof(float*));
 
    for (int j = 0; j < size; j++){
        meas[j] = (float*)malloc(size * sizeof(float));
    }
 
    printf("Введите матрицу:\n");
    for (int j = 0; j < size; j++){
        for (int i = 0; i < size; i++) {
            scanf("%f", &meas[j][i]);
        }
    }
 
    printf("Матрица:\n");
    for (int j = 0; j < size; j++){
        for (int i = 0; i < size; i++){
            printf("%f ", meas[j][i]);
        }
 
        printf("\n");
    }
 
    printf("A det: %f\n", determinant(meas, size, lot, 0));
    for (int i = 0; i < size; i++) {
        free(meas[i]);
    }
 
    free(meas);
    free(lot);
    getchar();
    getchar();
}
Уверен, что у Вас получится. Удачи
0
Ezemchenko
0 / 0 / 0
Регистрация: 08.03.2019
Сообщений: 3
10.03.2019, 10:30  [ТС] 3
К сожалению ваш код не помог мне разобраться в моей проблеме...Проблема всё ещё актуальна...
0
Andrey B
74 / 51 / 29
Регистрация: 06.02.2015
Сообщений: 135
Завершенные тесты: 1
10.03.2019, 12:00 4
Лучший ответ Сообщение было отмечено Ezemchenko как решение

Решение

1. Код ближе к тому, что у вас было изначально
2. Проверьте свой изначальный алгоритм, возможно ошибка в нем.
3. Для основного массива и массива доп памяти лучше выделять разные массивы
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
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
 
typedef struct Matrix{
    float *data;
    float *tmp;
} matrix;
 
float determinant(matrix *matr,int n,int l){
    float r = 0;
    float s = 1;
    int f = 0;
    int flag = 1;
    
    for (int i = 0; i < n; i++){
        flag = 1;
        for (int j = 0; j < l; j++){
            if (i == matr->tmp[j]){
                flag = 0;
                break;
            }
        }
        
        if (flag == 1){
            if (l == n - 1){
                return *(matr->data+l*n + i);
            }
            else {
                matr->tmp[l] = i;
                r = r + s * (*(matr->data+l*n + i)) * determinant(matr, n, l + 1);
                s = -s;
            }
        }
    }
 
    return r;
}
 
int main() {
    setlocale(LC_ALL, "rus");
    int g=0,h=0;
    matrix a = { .data = 0, .tmp=0};
 
    printf("Введите размер матрицы: ");
    scanf("%d %d", &g, &h);
 
    a.data = (float*)malloc(g*h*sizeof(float));
    
    printf("Введите матрицу:\n");
    for (int i = 0; i < g; i++){
        for (int j = 0; j < h; j++){
            scanf("%f", &a.data[i*g + j]);
        }
    }
 
    printf("Матрица:\n");
    for (int i = 0; i < g; i++){
        for (int j = 0; j < h; j++){
            printf("%f ",a.data[i*g+j]);
        }
        printf("\n");
    }
 
    if (g == h){
        a.tmp = (float*)malloc(g * sizeof(float));
        printf("Определитель : %f\n", determinant(&a,g,0));
    }
    else {
        printf("Матрица не квадратная\n");
    }
    
    free(a.tmp);
    free(a.data);
    getchar();
    getchar();
    return 0;
}
1
Ezemchenko
0 / 0 / 0
Регистрация: 08.03.2019
Сообщений: 3
10.03.2019, 18:34  [ТС] 5
Спасибо, за помощь... Но возникли новые затруднения, я не понимаю что делает оператор "->" ...
0
Andrey B
74 / 51 / 29
Регистрация: 06.02.2015
Сообщений: 135
Завершенные тесты: 1
10.03.2019, 18:45 6
Для доступа к членам структуры с помощью указателя на структуру следует использовать оператор "стрелка".
1
10.03.2019, 18:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2019, 18:45

Проблемы с памятью
Не могу понять что с оперативной памятью . Зарезервирована на 70% она и как итог используется...

Проблемы с памятью
Подскажите, кто может. При использовании в данном коде Base до 1000 всё работает хорошо. При...

Проблемы с оперативной памятью
Здравствуйте.Купил в начале января вторую планку оперативной памяти(AMD R5,DDR3,4GB,1600 MHz)для...


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

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

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