С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

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

12.05.2012, 15:54. Показов 1716. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Толи я чего-то туплю, толи всё же в мейн ошибка.
Итак: есть функция, которая должна сообщать о результатах поиска изменением переменных что передаются ей в качестве параметра и есть мейн, который подставляет сервер и к которому доступа у меня нет. Итак мейн:
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 не изменяется, но как тогда я должен принимать этот параметр чтобы менять его адрес?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.05.2012, 15:54
Ответы с готовыми решениями:

Передача параметров в функцию
Как понять , что передаётся в функцию при такой записи : void Fun(str* &r) при этом есть такие данные: struct str {int b; ...

Передача параметров в функцию
Доброго времени суток. В ф-и есть несколько параметров-констант(const char*). Как передать в нее параметры, введенные с...

Передача параметров в функцию
Люди помогите, пожалуйста. Есть такая простая задачка: В одномерном массиве, состоящем из n элементов вычислить произведение...

8
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
12.05.2012, 16:01
Не получается правильно передать параметры в функцию

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

Добавлено через 1 минуту
C++
1
void Test(int x, int y, int& resLen, int* &res)
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
12.05.2012, 16:04  [ТС]
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 );
а этого в мейне никто блин не делает
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
12.05.2012, 16:07
&res при вызове это не ссылка, а указатель.
Как описать функцию со ссылкой на указатель я выше показал. Код изменять не потребуется. Ни main, ни функции.
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
12.05.2012, 16:10  [ТС]
Цитата Сообщение от grizlik78 Посмотреть сообщение
Как описать функцию со ссылкой на указатель я выше показал. Код изменять не потребуется. Ни main, ни функции.
Я за ту минуту пока вы дописывали успел сообщение написать. Спасибо, до этого не приходилось принимать ссылку на указатель как-то.
0
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
12.05.2012, 16:12
Цитата Сообщение от 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
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
12.05.2012, 16:14  [ТС]
Рано обрадовался: по таинственным причинам указатель меняется только 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];
и адрес первый раз меняется, а все остальные - нет. Как это понимать?
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
12.05.2012, 16:20
alexey31415, указателем там явлеятся только res, а resLen обычное целое, не указатель.

Добавлено через 2 минуты
Цитата Сообщение от Gepar Посмотреть сообщение
Как видно выделение памяти я провожу каждый раз, а дебагер говорит что адрес res поменялся лишь при первом вызове Test. Почему так?
Ну, раз выделенная память удаляется, то по новой она запросто в том же месте может выделиться, и указатель не изменится.
0
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
12.05.2012, 16:26
извиняюсь,проморгал

Добавлено через 4 минуты
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну, раз выделенная память удаляется, то по новой она запросто в том же месте может выделиться, и указатель не изменится.
согласен,сам указатель не меняется,поэтому каждый раз новый массив будет начинаться в одном и том же месте
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.05.2012, 16:26
Помогаю со студенческими работами здесь

Передача параметров в функцию
Можно ли сделать так, чтобы при совпадении переменных в функцие и основной программе, значения изменялись и в основной программе? И еще,...

передача параметров в функцию
Здарвствуйте! Неделю изучаю С++, и в книге по которой изучаю сказано: &quot;Передавать параметры по значению только при необходимости и...

Передача параметров в функцию
Помогите решить ещё одну проблему) Пароль в хэшированном виде хранится в HashData. И пока выводится на экран после хэширования. Как мне его...

Передача параметров в функцию
Добрый вечер Не получается передать в функцию массив выдает ошибку #include &lt;cstdio&gt; struct morse_code { const char*...

Передача параметров в функцию
Помогите пожалуйста сделать лабораторную по ЯП. // Лабораторная работа 2 // тема &quot;Передача параметров в функцию&quot; // ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru