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

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

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

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

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

Передача двумерного массива в функцию через указатели - 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++
Подскажите пожалуйста как передать статический двумерный массив в функцию через указатели. Я начал писать программу с функции ввода, но...

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

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

Добавлено через 3 минуты
Странно но студия 12 года считает правильно, а 13 нет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2014, 00:38     Передача массива в функцию (указатели)
Еще ссылки по теме:

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

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

Передача массива в функцию - C++
есть массив в методе какого то класса void _mServer::Listen() { .... ULONG s_c; s_c = (ULONG) this; s_c = (ULONG)...

Передача массива в функцию - C++
Ребят, подскажите как передать массив в функцию по значению (или альтернативный вариант)? Чтобы изменялась его копия находящаяся в стеке....


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

Или воспользуйтесь поиском по форуму:
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
Yandex
Объявления
23.05.2014, 00:38     Передача массива в функцию (указатели)
Ответ Создать тему
Опции темы

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