Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
SnakeHead
0 / 0 / 0
Регистрация: 03.11.2015
Сообщений: 14
1

Как мне избежать взятия адреса у аргумента функции?

03.11.2015, 21:55. Просмотров 906. Ответов 12
Метки нет (Все метки)

Здравствуйте, написал код, который на одном компиляторе работает как надо, а на другом выдает кривые ответы, порылся в интернете и понял, что тут есть спорный момент во взятии адреса у аргумента функции. Возможно ли как-то исправить код, чтобы этой проблемы не было?
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
#include <iostream>
 
using namespace std;
 
int loman(int l1,int l2,int &x)
{
    if(l1==0 && l2==0) return 0;
    for(int i=1;i<=l1;i++)
    {
        x+=loman(l1-i,l2,x)+1;
    }
    for(int h=1; h<=l2;h++)
    {
        x+=loman(l1,l2-h,x)+1;
    }
    return 0;
}
int main()
{
    int n,i,j,x=1;
    cin>>n>>i>>j;
    int l1=j-i-1;
    int l2=n-2-l1;
    loman(l1,l2,x);
    cout<<x;
    return 0;
}
ps Если что не так сформулировал или оформил, прошу прощения
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2015, 21:55
Ответы с готовыми решениями:

Оператор взятия адреса
Доброй ночи, оператор взятия адресса не перечислен среди Special member functions, но он...

Оператор взятия адреса
struct A{}; в таком классе неявно объявлен 1 или 2 оператора взятия адреса(для константного и не...

Как работает операция взятия адреса "&"?
В каждой переменной есть адрес,так вот,когда операция взятия адреса берёт адрес,она его копирует?И...

Оператор взятия адреса (&)
while (true) { int *temp = new int(13); std::cout &lt;&lt; temp &lt;&lt; &quot; &quot;; std::cout &lt;&lt; &amp;temp...

Указатели, Оператор взятия адреса
Вообщем, ребят, недавно разбирался с указателями в С++ и столкнулся с проблемой понимания следующих...

12
Kastaneda
Jesus loves me
Эксперт С++
4943 / 3020 / 346
Регистрация: 12.12.2009
Сообщений: 7,622
Записей в блоге: 2
Завершенные тесты: 1
03.11.2015, 22:32 2
Цитата Сообщение от SnakeHead Посмотреть сообщение
Если что не так сформулировал
что-то не так.
Лучше расскажи как проблема себя проявляет.
0
Barrent
246 / 122 / 54
Регистрация: 04.05.2013
Сообщений: 346
Завершенные тесты: 2
03.11.2015, 22:36 3
Давай задачу целиком
0
SnakeHead
0 / 0 / 0
Регистрация: 03.11.2015
Сообщений: 14
03.11.2015, 22:45  [ТС] 4
Цитата Сообщение от Kastaneda Посмотреть сообщение
что-то не так.
Лучше расскажи как проблема себя проявляет.
X считается не корректно, т.к. нельзя брать ссылку аргумента функции(как я понял из сторонних источников).

Добавлено через 1 минуту
Цитата Сообщение от Barrent Посмотреть сообщение
Давай задачу целиком
"На окружности отметили N точек и пронумеровали их последовательно числами от 1 до N. Требуется найти количество различных простых ломаных с вершинами в некоторых из отмеченных точек и с концами в точках с номерами i и j."
Как я уже писал, на одном компиляторе (моем) ответ выдает верный, а на другом (проверяющего мои задачи) нет.

Добавлено через 3 минуты
Я тут сейчас подумал, что это условие выхода вообще можно убрать, т.к. если l1 и l2 ==0 то мы просто не войдем в циклы и вернем 0
0
hoggy
Заблокирован
Эксперт С++
03.11.2015, 22:50 5
Цитата Сообщение от SnakeHead Посмотреть сообщение
X считается не корректно, т.к. нельзя брать ссылку аргумента функции(как я понял из сторонних источников).
хренова поняли.

ваш Х считается некорректно,
потому что ваш рекурсивный алгоритм - в топку.
0
SnakeHead
0 / 0 / 0
Регистрация: 03.11.2015
Сообщений: 14
03.11.2015, 23:02  [ТС] 6
Может быть скажете что в нем не так конкретно? Буду благодарен...

Добавлено через 7 минут
Кажется я понял, такой код более корректен да? Возможно теперь ошибки не будет, надо проверить, всем спасибо.
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
#include <iostream>
 
using namespace std;
 
int loman(int l1,int l2,int &x)
{
    for(int i=1;i<=l1;i++)
    {
        x++;
        loman(l1-i,l2,x);
    }
    for(int h=1; h<=l2;h++)
    {
        x++;
        loman(l1,l2-h,x);
    }
    return 0;
}
int main()
{
    int n,i,j,x=1;
    cin>>n>>i>>j;
    int l1=j-i-1;
    int l2=n-2-l1;
    loman(l1,l2,x);
    cout<<x;
    return 0;
}
0
Barrent
246 / 122 / 54
Регистрация: 04.05.2013
Сообщений: 346
Завершенные тесты: 2
04.11.2015, 00:08 7
Цитата Сообщение от SnakeHead Посмотреть сообщение
Возможно теперь ошибки не будет, надо проверить, всем спасибо.
1) Нарисуйте квадрат
2) Пронумеруйте вершины
3) Выделите 2 любые
4) Выпишите все возможные ломаные
5) Убедитесь, что функция считает ерунду.
0
Dreamer_0x01
258 / 85 / 30
Регистрация: 29.10.2015
Сообщений: 192
04.11.2015, 01:06 8
Лучший ответ Сообщение было отмечено SnakeHead как решение

Решение

т.к. нельзя брать ссылку аргумента функции(как я понял из сторонних источников).
Это как это? Почему?

Но проблема скорее всего в этом месте:
C++
1
x+=loman(l1-i,l2,x)+1;
У вас x после обработки в функции loman уже сам по себе имеет другое значение. Еще до момента операции +=. То есть складываете вы уже не прежнее значение х c результатом работы функции - а х, полученный в результате работы функции, с самим результатом. Но вот вопрос, что компилятор поставит вперед о время оптимизации - изменение значения х, или операцию сложения..Отсюда и разное поведение.

А вторая странность - у вас функция loman всегда возвращает 0, при любых условиях. И использовать результат ее работы в операции сложения - бессмысленно.
1
SnakeHead
0 / 0 / 0
Регистрация: 03.11.2015
Сообщений: 14
04.11.2015, 01:41  [ТС] 9
Цитата Сообщение от Barrent Посмотреть сообщение
1) Нарисуйте квадрат
2) Пронумеруйте вершины
3) Выделите 2 любые
4) Выпишите все возможные ломаные
5) Убедитесь, что функция считает ерунду.
Спасибо за советы конечно, но 1) этот алгоритм работает, это проверено 2) в задаче не квадрат а круг, может поэтому вам кажется мой код неверным

Добавлено через 1 минуту
Цитата Сообщение от Dreamer_0x01 Посмотреть сообщение
Это как это? Почему?

Но проблема скорее всего в этом месте:
C++
1
x+=loman(l1-i,l2,x)+1;
У вас x после обработки в функции loman уже сам по себе имеет другое значение. Еще до момента операции +=. То есть складываете вы уже не прежнее значение х c результатом работы функции - а х, полученный в результате работы функции, с самим результатом. Но вот вопрос, что компилятор поставит вперед о время оптимизации - изменение значения х, или операцию сложения..Отсюда и разное поведение.

А вторая странность - у вас функция loman всегда возвращает 0, при любых условиях. И использовать результат ее работы в операции сложения - бессмысленно.
Спасибо, я до этого уже сам дошел)
0
Barrent
246 / 122 / 54
Регистрация: 04.05.2013
Сообщений: 346
Завершенные тесты: 2
04.11.2015, 12:09 10
Цитата Сообщение от SnakeHead Посмотреть сообщение
Спасибо за советы конечно, но 1) этот алгоритм работает, это проверено 2) в задаче не квадрат а круг, может поэтому вам кажется мой код неверным
Т.е. вас не смущает, что если задать 4 точки (2 из них конечные и 2 начальные), то ответом будет 5 (из каждой начальной можно провести 2.5 разных ломаных)? Видимо я просто не понял задачу.
0
SnakeHead
0 / 0 / 0
Регистрация: 03.11.2015
Сообщений: 14
06.11.2015, 17:58  [ТС] 11
Цитата Сообщение от Barrent Посмотреть сообщение
Т.е. вас не смущает, что если задать 4 точки (2 из них конечные и 2 начальные), то ответом будет 5 (из каждой начальной можно провести 2.5 разных ломаных)? Видимо я просто не понял задачу.
Пусть на окружности отмечены точки 1, 2, 3, 4. Начальная - 1, конечная - 3. Тогда провести можно ломаные: 13, 123, 1243, 143, 1423. Ответ 5.

Добавлено через 2 минуты
Цитата Сообщение от Barrent Посмотреть сообщение
Т.е. вас не смущает, что если задать 4 точки (2 из них конечные и 2 начальные), то ответом будет 5 (из каждой начальной можно провести 2.5 разных ломаных)? Видимо я просто не понял задачу.
Из отмеченных точек конечной и начальной должно быть по одной.
0
Barrent
246 / 122 / 54
Регистрация: 04.05.2013
Сообщений: 346
Завершенные тесты: 2
06.11.2015, 18:43 12
Цитата Сообщение от SnakeHead Посмотреть сообщение
Из отмеченных точек конечной и начальной должно быть по одной.
Как-то не очень коррелирует с заданием
На окружности отметили N точек и пронумеровали их последовательно числами от 1 до N. Требуется найти количество различных простых ломаных с вершинами в некоторых из отмеченных точек и с концами в точках с номерами i и j.
0
SnakeHead
0 / 0 / 0
Регистрация: 03.11.2015
Сообщений: 14
11.11.2015, 21:49  [ТС] 13
Цитата Сообщение от Barrent Посмотреть сообщение
Как-то не очень коррелирует с заданием
Почему? "...с концами i и j" i - номер одного коца, j - другого, любой из них можно рассматривать как начальный, а другой как конечный.

Добавлено через 55 секунд
их как бы всего два
0
11.11.2015, 21:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2015, 21:49

Синонимы операций взятия адреса массива (arr и &arr)
возможно коряво написал заголовок, да и сам вопрос банальный. после создании лок. массива его адрес...

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

Как избежать уничтожения потока после выполнения им своей функции?
создаю несколько потоков for (int i = 0; i &lt; n; i++) BeeThreads = CreateThread(NULL, 0,...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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