Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Настя М
0 / 0 / 3
Регистрация: 03.12.2013
Сообщений: 16
#1

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

22.05.2014, 15:40. Просмотров 466. Ответов 5
Метки нет (Все метки)

Возникла проблема. Написала программу решение систем линейных уравнений методом Гаусса. В студии 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;
}

http://www.cyberforum.ru/cpp-beginners/thread1827979.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2014, 15:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Передача массива в функцию (указатели) (C++):

Указатели и массивы. Передача массива в функцию по указателю
Как передать массив в функцию,которая должна заполнить этот массив ? Вот,что я...

Передача в функцию через указатели
Компилятор говорит, что что-то не так с передачей max и min. Что? #include...

Передача в функцию - ссылки, указатели, константы
Вот программа: #include &lt;iostream&gt; void fun(int &amp;rhs) { rhs++; } ...

Передача массива и указатели
Приветствую всех. Говорил с другом о передаче в функцию, в и сказал, что если...

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

5
Vandris
63 / 63 / 28
Регистрация: 19.01.2011
Сообщений: 94
22.05.2014, 21:35 #2
У Вас функции, что pr_hod_a, что pr_hod_b, обе изменяют свои аргументы. mas1a получится из считанных данных, а вот mas1b уже нет. Создайте в обеих функциях результирующие массивы/матрицы и их возвращайте.
1
Настя М
0 / 0 / 3
Регистрация: 03.12.2013
Сообщений: 16
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 минуту
Так? Если да то всё равно не то получается.
0
Vandris
63 / 63 / 28
Регистрация: 19.01.2011
Сообщений: 94
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 / 3
Регистрация: 03.12.2013
Сообщений: 16
22.05.2014, 23:47  [ТС] #5
Пробовала. Тоже самое. Не правильно.

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

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

P.S. в функции prov используется битовое "и", а не логическое и я подозреваю что return 1 должен стоять вне циклов в самом конце функции. Ну и элемент b[0] не задается, т.к. j от i+1
1
23.05.2014, 00:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2014, 00:38
Привет! Вот еще темы с решениями:

Передача массива в функцию используя указатель на функцию
У меня имеется готовая программа без передачи функции в функцию указателем, мне...

Передача двухмерного массива из функцию в функцию
Допустим у меня есть функция, в которой &quot;генерируется&quot; массив. Но нужно его...

Указатели: написать функцию, проверяющую, является ли массив В подмножеством массива А
Задача такая: Написать программу, которая содержит функцию, принимающую в...

Передача массива структур в функцию не указывая размера массива
Я читаю с командной строки файл в котором содержится массив структур. Есть...


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

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

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