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

Передача параметров в функцию - C++

Восстановить пароль Регистрация
 
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
12.05.2012, 15:54     Передача параметров в функцию #1
Толи я чего-то туплю, толи всё же в мейн ошибка.
Итак: есть функция, которая должна сообщать о результатах поиска изменением переменных что передаются ей в качестве параметра и есть мейн, который подставляет сервер и к которому доступа у меня нет. Итак мейн:
C++
1
2
3
4
5
6
7
8
9
int   * res, resLen;
CScreen  S0;
S0 . Optimize();
S0 . Test ( 0, 0, resLen, res );
 // resLen = 0, res = [ ]
delete [] res;
S0 . Test ( 21, 21, resLen, res );
 // resLen = 3, res = [ 1 2 3 ]
delete [] res;
Как я должен в классе CScreen в функции Test принимать параметры чтобы я мог изменять resLen и res?
Допустим наплевательское отношение на то что res указатель на не инициализированную память, а мы её потом передаём в функцию мы пропустим (хотя VS2010 мне таких упущений делать не разрешает и тут же выбрасывает ошибку, но minigw даёт добро, а сдавать это всё minigw).

Я написал Test вот так:
C++
1
2
3
4
5
6
    void Test(int x, int y, int& resLen, int* res)
    {
        int size=10;
        resLen= 0;
        res= new int[size];
        Elem* temp(head);
Но почему-то изменения res действуют только для моей функции, а в main отчётливо видно что адрес res не изменяется, но как тогда я должен принимать этот параметр чтобы менять его адрес?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2012, 15:54     Передача параметров в функцию
Посмотрите здесь:

C++ Передача параметров в функцию
C++ Передача параметров в функцию
Передача параметров в функцию WndProc C++
C++ передача параметров в функцию
C++ Передача параметров в функцию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
12.05.2012, 16:01     Передача параметров в функцию #2
Не получается правильно передать параметры в функцию

Добавлено через 59 секунд
Ну, а поскольку тут C++, то для передачи указателя можно использовать не только указатель на указатель, но и ссылку на указатель.

Добавлено через 1 минуту
C++
1
void Test(int x, int y, int& resLen, int* &res)
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
12.05.2012, 16:04  [ТС]     Передача параметров в функцию #3
grizlik78, напомню

Цитата Сообщение от Gepar Посмотреть сообщение
есть мейн, который подставляет сервер и к которому доступа у меня нет.
Как я буду вызывать
C++
1
void Test(int x, int y, int& resLen, int** res)
через
C++
1
2
3
    int   * res, resLen;
    CScreen  S0;
    S0 . Test ( 0, 0, resLen, res );
?
Мне ведь тогда нужно предавать ссылку на указатель
C++
1
S0 . Test ( 0, 0, resLen, &res );
а этого в мейне никто блин не делает
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
12.05.2012, 16:07     Передача параметров в функцию #4
&res при вызове это не ссылка, а указатель.
Как описать функцию со ссылкой на указатель я выше показал. Код изменять не потребуется. Ни main, ни функции.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
12.05.2012, 16:10  [ТС]     Передача параметров в функцию #5
Цитата Сообщение от grizlik78 Посмотреть сообщение
Как описать функцию со ссылкой на указатель я выше показал. Код изменять не потребуется. Ни main, ни функции.
Я за ту минуту пока вы дописывали успел сообщение написать. Спасибо, до этого не приходилось принимать ссылку на указатель как-то.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
12.05.2012, 16:12     Передача параметров в функцию #6
Цитата Сообщение от Gepar Посмотреть сообщение
C++
1
2
int   * res, resLen;
S0 . Test ( 0, 0, resLen, res );
C++
1
    void Test(int x, int y, int& resLen, int* res)
так ведь resLen в определении функции передаётся по ссылке,а в мэйн функции передётся указатель на int
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
12.05.2012, 16:14  [ТС]     Передача параметров в функцию #7
Рано обрадовался: по таинственным причинам указатель меняется только 1 раз при первом вызове, а дальше не меняется. Почему такое может быть?

main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
    int   * res, resLen;
    CScreen  S0;
    S0 . Add ( CRectangle ( 1, 10, 20, 30, 40 ) );
    S0 . Add ( CRectangle ( 2, 20, 10, 40, 30 ) );
    S0 . Add ( CTriangle ( 3, CCoord ( 10, 20 ), CCoord ( 20, 10 ), CCoord ( 30, 30 ) ) );
    S0 . Optimize();
    S0 . Test ( 0, 0, resLen, res );
     // resLen = 0, res = [ ]
    delete [] res;
    S0 . Test ( 21, 21, resLen, res );
     // resLen = 3, res = [ 1 2 3 ]
    delete [] res;
    S0 . Test ( 16, 17, resLen, res );
     // resLen = 1, res = [ 3 ]
    delete [] res;
    S0 . Test ( 30, 22, resLen, res );
     // resLen = 2, res = [ 1 2 ]
    delete [] res;
    S0 . Test ( 35, 25, resLen, res );
     // resLen = 1, res = [ 2 ]
    delete [] res;
Моя функция
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
    //должна вернуть сколько(resLen) фигур пересекают точку x,y и их id(массив res)
    void Test(int x, int y, int& resLen, int* &res)
    {
        int size=10;
        resLen= 0;
        res= new int[size];
        Elem* temp(head);
        while(temp)
        {
            if(temp->obj->bx1 <= x && temp->obj->bx2 >= x)
             if(temp->obj->by1 >= y && temp->obj->by2 <= y)
              if(temp->obj->belong(x,y))
              {
                  res[resLen++]=temp->obj->ID;
                  if(resLen==size)
                  {
                      size*=2;
                      res=(int*) realloc(res,sizeof(int)*size);
                  }
              }
            temp=temp->next;
        }
 
    }
Как видно выделение памяти я провожу каждый раз, а дебагер говорит что адрес res поменялся лишь при первом вызове Test. Почему так?

При этом даже в самой функции вот прохожу я эту строку в дебагере пошагово
C++
1
res= new int[size];
и адрес первый раз меняется, а все остальные - нет. Как это понимать?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
12.05.2012, 16:20     Передача параметров в функцию #8
alexey31415, указателем там явлеятся только res, а resLen обычное целое, не указатель.

Добавлено через 2 минуты
Цитата Сообщение от Gepar Посмотреть сообщение
Как видно выделение памяти я провожу каждый раз, а дебагер говорит что адрес res поменялся лишь при первом вызове Test. Почему так?
Ну, раз выделенная память удаляется, то по новой она запросто в том же месте может выделиться, и указатель не изменится.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2012, 16:26     Передача параметров в функцию
Еще ссылки по теме:

Передача параметров в функцию C++
C++ Передача параметров в функцию
Передача параметров в функцию C++

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

Или воспользуйтесь поиском по форуму:
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
12.05.2012, 16:26     Передача параметров в функцию #9
извиняюсь,проморгал

Добавлено через 4 минуты
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну, раз выделенная память удаляется, то по новой она запросто в том же месте может выделиться, и указатель не изменится.
согласен,сам указатель не меняется,поэтому каждый раз новый массив будет начинаться в одном и том же месте
Yandex
Объявления
12.05.2012, 16:26     Передача параметров в функцию
Ответ Создать тему
Опции темы

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