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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Настя М
0 / 0 / 0
Регистрация: 03.12.2013
Сообщений: 16
#1

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

22.05.2014, 15:40. Просмотров 431. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2014, 15:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача массива в функцию (указатели) (C++):

Передача двумерного массива в функцию через указатели - C++
поставлена такая задача - Реализовать функцию перемножения двумерных матриц bool Multi-plyMatrices(int** matrixA, int aRows, int aCols,...

Указатели и массивы. Передача массива в функцию по указателю - C++
Как передать массив в функцию,которая должна заполнить этот массив ? Вот,что я составил, но компилятор ругается: #include &quot;stdafx.h&quot; ...

Передача в функцию через указатели - C++
Компилятор говорит, что что-то не так с передачей max и min. Что? #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;string.h&gt; ...

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

Передача массива и указатели - C++
Приветствую всех. Говорил с другом о передаче в функцию, в и сказал, что если например есть такой код, int f(int *a) я сказал, что это...

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

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

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

Добавлено через 3 минуты
Странно но студия 12 года считает правильно, а 13 нет.
0
Vandris
63 / 63 / 13
Регистрация: 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
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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