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

Передача массива в подпрограмму - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
igooha
1 / 1 / 0
Регистрация: 29.11.2011
Сообщений: 24
15.09.2012, 13:16     Передача массива в подпрограмму #1
задаю массив глобально
r[N]

вот так вызываю подпрограмму
pg(0,-1,0, r);

сама подрограмма
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void pg(int v,int l, int t, int r[])
{
    int j;  
    Nnew1[v] = 1;
    r[t] = v;
    r[4]=4;
    t++;
    l++;
    for(j = 0; j < Z; j++ )
    
        if(tree[v][j]!=0 && !Nnew1[j])
        
            pg(j,l,t, r);
        
        if(max < l) 
        {
            max = l;
            for(m=0; m <= l; m++)
            
                rez[m] = r[m];
        }
            if(l == Z-1) return;
    
};
в массив даже число 4 записать не могу. подскажите в чем проблема, пожалуста
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
15.09.2012, 13:27     Передача массива в подпрограмму #2

Не по теме:

Это кристально понятный код, использующий самоочевидно названные переменные.


Там в массиве есть хоть эти пять элементов? (На всякий случай, r[4] — это пятый элемент, да.)
igooha
1 / 1 / 0
Регистрация: 29.11.2011
Сообщений: 24
15.09.2012, 13:30  [ТС]     Передача массива в подпрограмму #3
Цитата Сообщение от ~OhMyGodSoLong~;3451828
Там в массиве есть хоть эти пять элементов? (На всякий случай, r[4
— это пятый элемент, да.)
есть, массив задан большой, только если во время компиляции взгянуть на этот массив, в нем ничего нет, даже этих пустых N элементов.
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
15.09.2012, 13:31     Передача массива в подпрограмму #4
Цитата Сообщение от igooha Посмотреть сообщение
задаю массив глобально
r[N]
чему равно N?
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
15.09.2012, 13:35     Передача массива в подпрограмму #5
Тут правильным будет передавать в функцию еще и размер массива, либо вообще не передавать ни того, ни другого.
К тому же много неизвестных переменных, ты бы хоть сказал в чем смысл этого кода.
Цитата Сообщение от igooha Посмотреть сообщение
в массив даже число 4 записать не могу
Можешь. Вот так оно запишется: r[0] = 4;
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
15.09.2012, 13:36     Передача массива в подпрограмму #6
Если массив задан глобально, его не нужно передавать в качестве параметров функции, так как функция знает о его существовании.

Передать массив можно указателем
C++
1
2
3
4
5
void func(int* p); // объявление функции
 
int r[N]; // массив
int* pArray = r; // указатель на массив
func(pArray); // вызов функции
По стандарту вроде при передаче в функцию нужно явно указывать размер одномерного массива в квадратных скобках. При передаче указателя это не требуется, размер можно передать отдельной переменной-параметром функции.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.09.2012, 13:37     Передача массива в подпрограмму #7
igooha, вот вам простой пример передачи массива в функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
const int LEN = 5;
int arr[LEN] = {5,4,3,2,1};
void show(int* ar, int size)  //size это размер мвссива
{
    for (int i = 0; i<size; i++)
        cout<<ar[i]<<" ";
    cout<<endl;
}
int main()
{
    show(arr, sizeof arr/sizeof (int));
    system("pause");
    return 0;
}
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
15.09.2012, 13:40     Передача массива в подпрограмму #8
asidorchenko, массив может быть не один, и в одну и ту же функцию могут передаваться разные глобальные/локальные массивы. К сожалению, этот момент автор от нас скрыл...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2012, 13:51     Передача массива в подпрограмму
Еще ссылки по теме:

Разработать подпрограмму, которая формирует масссив из тех элементов массива Х, которые удовлетворяют условию C++
C++ Разработать подпрограмму, находящую элемент массива Х, для которого значение функции f является наименьшим
Передача двумерного массива в подпрограмму (функцию) C++

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

Или воспользуйтесь поиском по форуму:
igooha
1 / 1 / 0
Регистрация: 29.11.2011
Сообщений: 24
15.09.2012, 13:51  [ТС]     Передача массива в подпрограмму #9
N=15
записывается только в r[0] и r[1]

вот весь код. эта прога по нахождению максимального пути в графе

Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <conio.h>
 
const int N = 15;
int down = -1, up = 0, numb = 0, rez[N-1], max=0, m=0, t=0, Z;
int A[N-1][N-1], Nnew[N-1], Nnew1[N-1], turn[N-1], tree[N-1][N-1], r[N-1];
//A[][] -граф, Nnew[]- массив признаков, tree[N-1][N-1] - список ребер образующих каркас;
//numb - число ребер в каркасе
 
void pg(int v,int l, int t, int r[])
{
    int j;  
    Nnew1[v] = 1;
    r[t] = v;
    r[4]=4;
    t++;
    l++;
    for(j = 0; j < Z; j++ )
    
        if(tree[v][j]!=0 && !Nnew1[j])
        
            pg(j,l,t, r);
        
        if(max < l) 
        {
            max = l;
            for(m=0; m <= l; m++)
            
                rez[m] = r[m];
        }
            if(l == Z-1) return;
    
};
 
// v- номер вершины из которой выходит ребро, q - номер вершины, начиная с которой следует искать очередное ребро каркаса
void solve(int v, int q)
{
    int j;  
    if (down >= up ) return;
    j=q;
    //просмотр ребер, выходящих из вершины с номеров v
    while(j <= Z-1 && numb < Z-1)
    {
        //Есть ребро, и вершины с номером j еще нет в каркасе. Включаем ребро в каркас
        if( A[v][j]!=0 && !Nnew[j])
        {
            Nnew[j]=1;
            numb++;
            tree[v][j] = 1;
            tree[j][v] = 1;
            //Включаем вершину с номером j в очередь
            turn[up] = j;
            up++;
            j++;
            //продолжаем построение каркаса
            solve(v, j);
            //Исключаем ребро из каркаса
            up--;
            Nnew[j] = 0;
            numb--;
            tree[v][j] = 0;
        }
        j++;
    }
    if(numb == Z-1) 
    {
        for(int i=0; i < Z ;i++)
        {
            Nnew1[i] = 0;
        }
        
        pg(0,-1,0, r);
        return;
    }
    //Все ребра, выходящие из вершины с номером v, просмотрены. Переходим к след. вершине из очереди до тех пор, пока не будет построен каркас.
    if(j == Z)
    {
        down++;
        solve(turn[down], 0);
        down--;
    }
};
 
void main()
{
    FILE *f;
    f = fopen( "input1.txt", "r" );
    if( (f == NULL )) printf("Error");
    else
    {
        fscanf_s( f, "%d", &Z );
        for(int i=0; i<Z; i++) 
        {
            for(int j=0; j<Z; j++) 
            {
                fscanf_s( f, "%d", &A[i][j] );
            }
        }
    };
 
    for(int i=0; i<Z ; i++)
    {
        Nnew[i]=0;
    }
 
    Nnew[0] = 1;
 
    for(int i=0; i < Z; i++)
        for(int j=0; j<Z; j++)
        {
            tree[i][j] = 0;
        }
    
    solve(0,1);
    for(int i=0; i<Z; i++)
        if(rez[i]!=0)
        {
            printf("%d" , rez[i]);
            printf(" ");
        }
    _getch();
}


просто сделать массив глобальным было решено, чтобы исправить эту же ошибку
Yandex
Объявления
15.09.2012, 13:51     Передача массива в подпрограмму
Ответ Создать тему
Опции темы

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