Форум программистов, компьютерный форум CyberForum.ru

Передача массива в функцию (указатели) - C++

Восстановить пароль Регистрация
 
Настя М
0 / 0 / 0
Регистрация: 03.12.2013
Сообщений: 14
22.05.2014, 15:40     Передача массива в функцию (указатели) #1
Возникла проблема. Написала программу решение систем линейных уравнений методом Гаусса. В студии 12 года работает правильно, а в 13 нет; искажается массив при передаче из функции pr_hod_a(int n, float**a, float*b) в функции obr_hod(int n, float**a, float*b) и prov(int n, float**a). Эту проблему как - нибудь можно решить?
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
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stdio.h>
 
using namespace std;
 
float**vvod_matrisi(int n);
float*vvod_svobodnozo_chlena(int n);
int kol_vo_n();
float**pr_hod_a(int n, float**a, float*b);
float*pr_hod_b(int n, float**a, float*b);
int prov(int n, float**a);
float*obr_hod(int n, float**a, float*b);
void pechat(int n, float*x);
 
void main()
{
    int p = kol_vo_n();
    float**mas1 = vvod_matrisi(p);
    float*mas2 = vvod_svobodnozo_chlena(p);
    float**mas1a = pr_hod_a(p, mas1, mas2);
    float*mas1b = pr_hod_b(p, mas1, mas2);
    int t = prov(p, mas1a);
    if (t == 1)
    {
        float*mas3 = obr_hod(p, mas1a, mas1b);
        pechat(p, mas3);
    }
}
float**vvod_matrisi(int n)
{
    float**Mas;
    Mas = new float*[n];
    for (int i = 0; i < n; i++)
        Mas[i] = new float[n];
    ifstream MyFile("C:\\My_file1.txt");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            MyFile >> Mas[i][j];
    }
    return Mas;
}
 
float*vvod_svobodnozo_chlena(int n)
{
    float* Mas = new float[n];
    int i = 0;
    ifstream MyFile("C:\\My_file2.txt");
    while (!MyFile.eof())
    {
        MyFile >> Mas[i];
        i++;
    }
    return Mas;
}
 
int kol_vo_n()
{
    float mussor[20];
    int i = 0;
    ifstream MyFile("C:\\My_file2.txt");
    while (!MyFile.eof())
    {
        MyFile >> mussor[i];
        i++;
    }
    i--;
    return i;
}
float**pr_hod_a(int n, float**a, float*b)
{
    float*g = new float[n];
    for (int i = 0; i < n; i++)
        g[i] = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            a[j][i] = -a[j][i] * pow(a[i][i], -1);
            for (int k = i + 1; k < n; k++)
                a[j][k] = a[j][k] + a[j][i] * a[i][k];
            b[j] = b[j] + a[j][i] * b[i];
        }
    }
    return a;
}
 
float*pr_hod_b(int n, float**a, float*b)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            a[j][i] = -a[j][i] * pow(a[i][i], -1);
            for (int k = i + 1; k < n; k++)
                a[j][k] = a[j][k] + a[j][i] * a[i][k];
            b[j] = b[j] + a[j][i] * b[i];
        }
    }
    return b;
}
 
int prov(int n, float**a)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        if ((i == j) & (a[i][j] == 0))
        {
            cout << "sistema ne razreshima" << endl;
            return 0;
        }
        else return 1;
    }
}
float*obr_hod(int n, float**a, float*b)
{
    float* x = new float[n];
    float h;
    x[n - 1] = b[n - 1] * pow(a[n - 1][n - 1], -1);
    for (int i = n - 2; i >= 0; i--)
    {
        h = b[i];
        for (int j = i + 1; j < n; j++)
        {
            h = h - x[j] * a[i][j];
            x[i] = h*pow(a[i][i], -1);
        }
    }
    return x;
}
void pechat(int n, float*x)
{
    for (int i = 0; i < n; i++)
        cout << 'X' << i + 1 << " = " << x[i] << endl;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vandris
 Аватар для Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 90
22.05.2014, 21:35     Передача массива в функцию (указатели) #2
У Вас функции, что pr_hod_a, что pr_hod_b, обе изменяют свои аргументы. mas1a получится из считанных данных, а вот mas1b уже нет. Создайте в обеих функциях результирующие массивы/матрицы и их возвращайте.
Настя М
0 / 0 / 0
Регистрация: 03.12.2013
Сообщений: 14
22.05.2014, 23:10  [ТС]     Передача массива в функцию (указатели) #3
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
float**pr_hod_a(int n, float**a, float*b)
{
    float**Mas;
    Mas = new float*[n];
    for (int i = 0; i < n; i++)
        Mas[i] = new float[n];
 
    for (int i = 0; i < n; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            a[j][i] = -a[j][i] * pow(a[i][i], -1);
            for (int k = i + 1; k < n; k++)
                a[j][k] = a[j][k] + a[j][i] * a[i][k];
            b[j] = b[j] + a[j][i] * b[i];
        }
    }
    Mas = a;
    
    return Mas;
}
 
float*pr_hod_b(int n, float**a, float*b)
{
    float* Mas = new float[n];
    for (int i = 0; i < n; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            a[j][i] = -a[j][i] * pow(a[i][i], -1);
            for (int k = i + 1; k < n; k++)
                a[j][k] = a[j][k] + a[j][i] * a[i][k];
            b[j] = b[j] + a[j][i] * b[i];
        }
    }
    Mas = b;
    return Mas;
}
Добавлено через 1 минуту
Так? Если да то всё равно не то получается.
Vandris
 Аватар для Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 90
22.05.2014, 23:25     Передача массива в функцию (указатели) #4
Вы все равно в циклах меняете матрицы a и b Попробуйте как-то так
Кликните здесь для просмотра всего текста
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
float** pr_hod_a(int n, float** a, float* b)
{
    float** Mas;
    Mas = new float* [n];
    for (int i = 0; i < n; i++)
        Mas[i] = new float[n];
 
    for (int i = 0; i < n; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            Mas[j][i] = -a[j][i] * pow(a[i][i], -1);
 
            for (int k = i + 1; k < n; k++)
                Mas[j][k] = a[j][k] + a[j][i] * a[i][k];
        }
    }
 
    return Mas;
}
 
float* pr_hod_b(int n, float** a, float* b)
{
    float* Mas = new float [n];
 
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++)
            Mas[j] = b[j] + a[j][i] * b[i];
 
    return Mas;
}
Настя М
0 / 0 / 0
Регистрация: 03.12.2013
Сообщений: 14
22.05.2014, 23:47  [ТС]     Передача массива в функцию (указатели) #5
Пробовала. Тоже самое. Не правильно.

Добавлено через 3 минуты
А из за чего это происходит?

Добавлено через 3 минуты
Странно но студия 12 года считает правильно, а 13 нет.
Vandris
 Аватар для Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 90
23.05.2014, 00:38     Передача массива в функцию (указатели) #6
Ну... не имея возможности "пощупать" Вашу программу (все таки, у меня на диске C нет файлов My_File1.txt и My_File2.txt) очень сложно искать ошибку просто анализируя код Поэтому, я предполагаю что у Вас вся математика написано верно и проблемы с самим языком.

P.S. в функции prov используется битовое "и", а не логическое и я подозреваю что return 1 должен стоять вне циклов в самом конце функции. Ну и элемент b[0] не задается, т.к. j от i+1
Yandex
Объявления
23.05.2014, 00:38     Передача массива в функцию (указатели)
Ответ Создать тему
Опции темы

Текущее время: 02:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru