Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Будучи аргументомфункции, массив a[2] не копируется при вызове этой функции / 3 сообщений из 3, страница 1 из 1
07.02.2013, 16:25
    #38142039
Qeeet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Будучи аргументомфункции, массив a[2] не копируется при вызове этой функции
Здравствуйте,
Не укладывется в голове, после завершения рекурсий (т.е.контроль передаеться на if(ii==1){return 0;})
наступает цикл for где уже j=1. В итоге мы имеем измененный массив bool а[]={1,0}.
Если кратко, то следующий код выводит на экран:
a[]= 00
a[]= 10
a[]= 10
a[]= 10
a[]= 11
a[]= 11
0.

Я ожидал такой результат:
a[]= 00
a[]= 10
a[]= 10
a[]= 00
a[]= 01
0.

Тут я попробовал обьяснить что шаг за шагом происходити в машине:
1. Defining a[2]{0,0}; ii=0; aj=0
2. Calling function func(a,ii,aj) |func({0,0},0,0)|
3. func({0,0},0,0) defining w=0; static aa=0
4. func({0,0},0,0) if(0) returns aa=1
5. func({0,0},0,0) for j=0
6. func({0,0},0,0) for Outputing "00", because a[2]={0,0}, look (1).
7. func({0,0},0,0) for if(!0) | because a[0]=0| returns w+=func(a,ii+1,j) |func({0,0},0+1,0)| and calls func({0,0},1,0)
8. func({0,0},0,0) for if func({0,0},1,0) defining w=0
9. func({0,0},0,0) for if func({1,0},1,0) if(1) returns a[0]=1, because of static aa=1, см 4.
10. func({0,0},0,0) for if func({1,0},1,0) for j=0
11. func({0,0},0,0) for if func({1,0},1,0) for Outputing "10", because of a[2]={1,0}, look row #9
12. func({0,0},0,0) for if func({1,0},1,0) for if(!1) |because a[0]=1|
13. func({0,0},0,0) for if func({1,0},1,0) for j=1
14. func({0,0},0,0) for if func({1,0},1,0) for Outputing "10"
15. func({0,0},0,0) for if func({1,0},1,0) for if(!0) |because a[1]=0|
16. func({0,0},0,0) for if func({1,0},1,0) for if if(1==1) |because ii=1, func({0,0},ii,0)|
17. func({0,0},0,0) for if func({1,0},1,0) for if if return 0
18. func({0,0},0,0) for if w=0 |because func({1,0},1,0) gives 0|
19. func({0,0},0,0) for j=1

И с этого момента мне не понятно почему так происходит:
20. func({0,0},0,0) for Outputing "10"
Почему так происходит, если в функцию передають аргументы, которые должны копироваться, включая a[2]={0,0}. Но какраз только массив а[2] не копируется
Я ожидал этого:
20. func({0,0},0,0) for Outputing "00"

Код: plaintext
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.
#include <iostream>
 
using namespace std;
 
int func(bool a[],int ii,int aj)
{
    int w=0;
    static bool aa=0;
    if(aa){a[aj]=1;}else{aa=1;}
        for(int j=0;j<2;j++)
        { 
            cout<<"a[]= "<<a[0]<<a[1]<<endl;
            if(!a[j])
            {
                if(ii==1){return 0;}
                else{w+=func(a,ii+1,j);}
            }
        }
    return w;
}
 
int func()
{   
    bool a[2];
    for(int i=0;i<2;i++)a[i]=0;
    int ii=0,aj=0;
    return func(a,ii,aj);
}
 
void main()
{
    cout<<func();
    getchar();getchar();
}



Но если я определю массив a[2] как вектор, то все работает на ура.
Код: plaintext
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.
#include <iostream>
#include <vector>
 
using namespace std;
 
int func(vector<bool> a,int ii,int aj)
{
    int w=0;
    static bool aa=0;
    if(aa){a[aj]=1;}else{aa=1;}
        for(int j=0;j<2;j++)
        { 
            cout<<"a[]= "<<a[0]<<a[1]<<endl;
            if(!a[j])
            {
                if(ii==1){return 0;}
                else{w+=func(a,ii+1,j);}
            }
        }
    return w;
}
 
int func()
{   
    vector<bool> a(2);
    for(int i=0;i<2;i++)a[i]=0;
    int ii=0,aj=0;
    return func(a,ii,aj);
}
 
void main()
{
    cout<<func();
    getchar();getchar();
}
...
Рейтинг: 0 / 0
07.02.2013, 17:03
    #38142147
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Будучи аргументомфункции, массив a[2] не копируется при вызове этой функции
Открой для себя разницу между объектом и указателем (каковым и является массив).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.02.2013, 17:36
    #38142216
Qeeet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Будучи аргументомфункции, массив a[2] не копируется при вызове этой функции
Спасибо большое,
я все уже понял.
Вы не представляете сколько я намучался с этим :)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Будучи аргументомфункции, массив a[2] не копируется при вызове этой функции / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]