Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
#1

Помогите найти ошибку в коде при работе с указателями

25.08.2015, 11:29. Просмотров 770. Ответов 40
Метки нет (Все метки)

Блин, я когда нибудь пойму эти указатели!!???? Подскажите где ошибся?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
using namespace std;
 
int foo(int&num);
int* fib(int&);
int main(){
    int num;    
    foo(num);
    cout<<fib(num)<<endl;
    return 0;
}
int foo(int&num){
    
    cin>>num;
}
int* fib(int& n){
    int*ptr;
    ptr=&n;
if(*ptr==0||*ptr==1)
return ptr;
else
return fib(*ptr-1)+fib(*ptr-2);
}
 Комментарий модератора 
Называйте темы так, чтобы было понятно о чем в них пойдет речь.

Последнее предупреждение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2015, 11:29
Ответы с готовыми решениями:

Помогите найти ошибку при работе с вектором
// простой словарь список упорядоченных слов #include &quot;std_lib_facilities.h&quot;...

Исправить ошибку компиляции C2371 при работе с указателями
Привет :) Проходу тему &quot;Указатели&quot;, написал программу. Компилятор ругается,...

Найти и исправить ошибку в коде (работа с указателями)
Здравствуйте! Есть такой вопрос по этому коду: void fun(char *buff) { ...

Помогите найти ошибку в коде
// ConsoleApplication5.cpp: определяет точку входа для консольного приложения....

Помогите найти ошибку в коде
#include &lt;vcl.h&gt; #pragma hdrstop #include &lt;iostream.h&gt; #include &lt;conio&gt;...

40
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
25.08.2015, 11:33 #2
Цитата Сообщение от anti-k Посмотреть сообщение
fib(*ptr-1)+fib(*ptr-2)
Ну и что должна означать эта сумма указателей?
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
25.08.2015, 11:38  [ТС] #3
John Prick, ну да, тупо((( Но *ptr это же значение?? Простите за столь тупые вопросы
0
Ваниль
5 / 5 / 1
Регистрация: 09.05.2013
Сообщений: 44
25.08.2015, 11:47 #4
John Prick, ptr сам по себе указатель, там же происходит разыменование.

Цитата Сообщение от anti-k Посмотреть сообщение
Подскажите где ошибся?
Кажется, тут:
Цитата Сообщение от anti-k Посмотреть сообщение
C++
1
ptr=&n;
Ты в функцию и так передаёшь адрес. А теперь берёшь адрес от адреса.
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
25.08.2015, 11:54  [ТС] #5
Ваниль, Логику понял, но ошибка не ушла((

Добавлено через 3 минуты
Ваниль, Вот так работает, но смысла в этом мало((( + остается вопрос касаемо передачи по ссылке((
0
Kuzia domovenok
2263 / 2032 / 459
Регистрация: 25.03.2012
Сообщений: 7,197
Записей в блоге: 1
25.08.2015, 11:55 #6
anti-k, по-моему, наоборот ты ничего не понял. Зачем в этой программе ссылки, если вопрос про указатели?
Зачем в этой программе вообще указатели, если она считает числа Фибоначи? Ты просто так программу написал что ли? Чтобы показать что можешь писать программы про указатели?
0
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
25.08.2015, 11:56  [ТС] #7
Ваниль, Работает в плане компилится. Результат плохой и понятно желателен возврат указателя.
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
25.08.2015, 11:58 #8
Цитата Сообщение от Ваниль Посмотреть сообщение
Ты в функцию и так передаёшь адрес. А теперь берёшь адрес от адреса.
Сейчас наподсказываешь. В функцию передаётся ссылка. Это не адрес, это псевдоним того объекта, который передаётся; фактически, тот же самый объект. Так что, если нужен его адрес, то нужно писать именно ptr = &n.

Цитата Сообщение от Ваниль Посмотреть сообщение
ptr сам по себе указатель, там же происходит разыменование
Там - это где? Функция возвращает указатель. Вызывается рекурсивно, возвращая какую-то сумму указателей. Я вот и спрашиваю, чего хочет ТС от своей программы получить?

Добавлено через 47 секунд
Цитата Сообщение от anti-k Посмотреть сообщение
желателен возврат указателя
Объясни, зачем он желателен?
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
25.08.2015, 11:59  [ТС] #9
Kuzia domovenok, Я полностью с вами согласен. На счет того что мало понимаю. Я нуб, не поспоришь. А вот на счет указателей, я сейчас их изучаю, по этому втыкаю их где только можно, что бы привыкнуть. И хотел проверить будет ли забиваться стек столь же быстро как и при использовании обычной переменной. По этому искал на выходе адрес.
0
Croessmah
++Ͻ
14543 / 8302 / 1560
Регистрация: 27.09.2012
Сообщений: 20,369
Записей в блоге: 3
Завершенные тесты: 1
25.08.2015, 12:00 #10
Цитата Сообщение от anti-k Посмотреть сообщение
Работает в плане компилится.
Вангую, что компилятор от мелкософта. Я прав?
0
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
25.08.2015, 12:00  [ТС] #11
John Prick,
C++
1
 Я полностью с вами согласен. На счет того что мало понимаю. Я нуб, не поспоришь. А вот на счет указателей, я сейчас их изучаю, по этому втыкаю их где только можно, что бы привыкнуть. И хотел проверить будет ли забиваться стек столь же быстро как и при использовании обычной переменной. По этому искал на выходе адрес.
Добавлено через 27 секунд
Croessmah, Как всегда и совершенно правы.
0
Croessmah
++Ͻ
14543 / 8302 / 1560
Регистрация: 27.09.2012
Сообщений: 20,369
Записей в блоге: 3
Завершенные тесты: 1
25.08.2015, 12:01 #12
Цитата Сообщение от anti-k Посмотреть сообщение
А вот на счет указателей, я сейчас их изучаю, по этому втыкаю их где только можно, что бы привыкнуть.
Не надо втыкать их там, где они мешают.
1
Ваниль
5 / 5 / 1
Регистрация: 09.05.2013
Сообщений: 44
25.08.2015, 12:01 #13
Попробовал у себя и допёр.

& - не тип данных, а функция получения адреса.
Поэтому в объявлении функции писать int& бессмысленно. Builder, например, всё равно считает, что передаётся int.

И таки Джон был прав.
C++
1
return fib(*ptr-1)+fib(*ptr-2);
Хоть ptr b разыменован, тут fib возвращает два указателя, которые ты пытаешься сложить.
0
Croessmah
++Ͻ
14543 / 8302 / 1560
Регистрация: 27.09.2012
Сообщений: 20,369
Записей в блоге: 3
Завершенные тесты: 1
25.08.2015, 12:02 #14
Цитата Сообщение от Ваниль Посмотреть сообщение
& - не тип данных, а функция получения адреса.
Поэтому в объявлении функции писать int& бессмысленно.
ссылка, не?
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
25.08.2015, 12:02 #15
Цитата Сообщение от anti-k Посмотреть сообщение
втыкаю их где только можно
Но конкретно в этой программе ты их зачем воткнул? Какого результата ты ждёшь от своей программы?
0
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
25.08.2015, 12:03  [ТС] #16
Ваниль, Почему, в таком случае, они(указатели не разименовуються, *ptr в моем скудном понимании это переменная, а не указатель?((
0
Ваниль
5 / 5 / 1
Регистрация: 09.05.2013
Сообщений: 44
25.08.2015, 12:05 #17
Croessmah, ну так-то ссылка, если в вызове писать. Но объявлена функция как
C++
1
int* fib(int&);
Это всё равно будет считаться эквивалентным *int? Что-то я тоже поназапутывался уже )-%
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
25.08.2015, 12:06  [ТС] #18
John Prick, Логика(вряд ли она есть конечно) заполнить стек, который формируется при рекурсии указателями в надежде его сэкономить ((
0
Croessmah
++Ͻ
14543 / 8302 / 1560
Регистрация: 27.09.2012
Сообщений: 20,369
Записей в блоге: 3
Завершенные тесты: 1
25.08.2015, 12:08 #19
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Ваниль, может труд этой котярры не пройдет даром Ссылки-спасители и коварные клоны.(триллер)
2
Ваниль
5 / 5 / 1
Регистрация: 09.05.2013
Сообщений: 44
25.08.2015, 12:09 #20
Цитата Сообщение от anti-k Посмотреть сообщение
Ваниль, Почему, в таком случае, они(указатели не разименовуються, *ptr в моем скудном понимании это переменная, а не указатель?((
int* ptr - тип данных "указатель на int", хранит адрес участка памяти, где лежит значение.
*ptr - значение, лежащее по адресу ptr.

функция fib возвращает тип int*

У тебя
C++
1
return fib(*ptr-1)+fib(*ptr-2);
Можно заменить на
C++
1
2
3
int* res1 = fib(*ptr-1);
int* res2 = fib(*ptr-2);
return res1+res2;
То есть ты складываешь два адреса, по которым находятся значения, но не сами значения.
0
25.08.2015, 12:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2015, 12:09

Помогите найти ошибку в коде
Всем привет.Пишу вот такой простенький код в Visual Studio #include...

Помогите найти ошибку в коде
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;time.h&gt; using namespace std;...

Помогите найти ошибку в коде
Проблема вот в чём, есть программа, довольно большая по кол-ву строк и поэтому...


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

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

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