Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774

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

25.08.2015, 11:29. Показов 3003. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.08.2015, 11:29
Ответы с готовыми решениями:

Помогите найти ошибку при работе с вектором
// простой словарь список упорядоченных слов #include &quot;std_lib_facilities.h&quot; int main() { vector&lt;string&gt; words; ...

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

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

40
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
25.08.2015, 12:09  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Croessmah Посмотреть сообщение
Не надо втыкать их там, где они мешают.
Таки да. Но все же интересно понимание их работы. Почему они здесь не работают, мне не понятно. И не понятно почему &n не ссылка((
0
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,578
25.08.2015, 12:13
Цитата Сообщение от anti-k Посмотреть сообщение
Логика(вряд ли она есть конечно) заполнить стек, который формируется при рекурсии указателями
Ну вот ты, не разобравшись с указателями, уже пытаешься что-то делать со стеком. Нет никакой разницы, чем будет заполняться стек, указателями или нет. Указатель - такая же переменная, по сути, как и всякие другие, просто у неё особое назанчение. В памяти она также занимает какой-то объем (4 байта на 32-битных архитектурах, как правило).

Более того, стек у тебя заполняется не указателями, а ссылками int&. Они, конечно, могут быть реализованы компилятором с помощью тех же указателей, но может быть и вовсе не так.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.08.2015, 12:13
Цитата Сообщение от Ваниль Посмотреть сообщение
Можно заменить на
нельзя
0
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,578
25.08.2015, 12:14
Цитата Сообщение от anti-k Посмотреть сообщение
Почему они здесь не работают
Так ты с ними и не работаешь. Возвращаешь их из функции, ничего с ними не делая.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.08.2015, 12:16
Цитата Сообщение от anti-k Посмотреть сообщение
Но все же интересно понимание их работы.
тогда поставьте себе здачу, где нужны указатели. Например, реализуйте связный список, дерево или что-то подобное. Поработайте с динамической памятью и т.д.
0
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,578
25.08.2015, 12:16
Цитата Сообщение от anti-k Посмотреть сообщение
И не понятно почему &n не ссылка
int& n - ссылка. Работать с ней надо так же, как если бы оно было просто int n. Поэтому &n - это адрес n.
0
 Аватар для Ваниль
5 / 5 / 1
Регистрация: 09.05.2013
Сообщений: 44
25.08.2015, 12:16
Цитата Сообщение от Croessmah Посмотреть сообщение
1) fib(*ptr-1) - функция принимает int* , а *ptr-1 - это int
2) return res1+res2; - складываем два адреса?
1) И снова я проглазел (-% но так было у ТС в коде. anti-k, исправляй!
2) Да. Так у ТСа написано, и я пытался объяснить, что это неверно, развернув его запись в 3 команды.
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
25.08.2015, 12:16  [ТС]
John Prick, Ну да. Но только мне казалось что указатель указывет на адрес памяти и тип, а вот *ptr это уже переменная???
0
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,578
25.08.2015, 12:21
Цитата Сообщение от anti-k Посмотреть сообщение
Но только мне казалось что указатель указывет на адрес памяти и тип, а вот *ptr это уже переменная?
Во-первых, непонятно это "но". Если оно относилось к моему сообщению, то там нет ни слова про указатель.
Цитата Сообщение от anti-k Посмотреть сообщение
указатель указывет на адрес памяти и тип
Указатель - это переменная, которая равна адресу. Тип, с которым объявлен указатель, помогает компилятору понять, что за объект лежит по этому адресу.

Добавлено через 37 секунд
Цитата Сообщение от anti-k Посмотреть сообщение
*ptr это уже переменная?
А это обращение к переменной, которая лежит по адресу, который содержится в указателе ptr.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.08.2015, 12:35
Разбирайтесь (вроде особо не накосячил):
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
 * main.cpp
 *
 *  Created on: 14.08.2015
 *      Author: croessmah
 */
#include<iostream>
#include <cstring>
using namespace std;
 
 
bool is_equal_range ( const char * first , const char * second , size_t size )
{
    while ( *first && *second && size )
    {
        if ( *first != *second )
            return false ;
        ++first ;
        ++second ;
        --size ;
    }
    return !(*second) && !size ;
}
 
 
const char * find_char ( const char * str , char ch )
{
    while ( *str )
    {
        if ( *str == ch )
            return str ;
        ++str ;
    }
    //return 0 ;
    return nullptr ;
}
 
 
const char * find_str ( const char * source , const char * find )
{
    size_t findStringSize = strlen(find) ;
    const char * pNow = find_char ( source , *find ) ;
    while ( pNow )
    {
        if ( is_equal_range ( pNow , find , findStringSize ) )
            return pNow ;
        pNow = find_char ( pNow+1 , *find ) ;
    }
    //return 0 ;
    return nullptr ;
}
 
 
int main(){
    const char * str = "my string" ;
    const char * findStr = "tr" ;
    const char * rez = find_str ( str , findStr ) ;
    if ( rez )
    {
        std::cout << "index: "<< (rez-str) << std::endl ;
    }
    else
    {
        std::cout << "not found" << std::endl ;
    }
}
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
25.08.2015, 12:53  [ТС]
Croessmah, Мощно! Ругается на nullptr. А вы поможете мне немного разобраться, я бы создал отдельную тему. Был бы вам крайне признателен...
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.08.2015, 13:30
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include<iostream>
#include <cstring>
using namespace std;
 
 
//Функция сравнивает указанное кол-во символов двух строк.
bool is_equal_range ( const char * first , const char * second , size_t size )
{
    //Проверяем не достигнут ли конец первой или второй строки:
    //*first && *second - эквивалент: (*first != '\0') && (*second != '\0')
    //также проверяем не все ли еще символы проверели:
    //size - когда size станет равным 0 - дальше проверять не нужно, все необходимые символы проверены
    while ( *first && *second && size )
    {
        //Если соответствующие символы строк не равны, то возвращаем false.
        if ( *first != *second )
            return false ;
        ++first ; //"Идем" вперед по строке first (ставим указатель first на следующий символ строки)
        ++second ;//"Идем" вперед по строке second (ставим указатель second на следующий символ строки)
        --size ; //Вычитаем единичку из кол-ва сравниваемых символов.
    }
    //Если вышли из цикла не проверив всех символов
    //Значит в какой-то из строк символов оказалось меньше, поэтому
    //в таком случае возвращаем false.
    //Если же все символы прошли проверку, то возвращаем true
    return !size ; // size == 0
}
 
 
 
//Функция ищет символ в строке
const char * find_char ( const char * str , char ch )
{
    while ( *str )//Проходим по строке, пока не достигнем символа '\0'
    {
        if ( *str == ch ) //Если символ, на который в данный момент "указывает" указатель равен ch, то
            return str ; //возвращаем указатель на этот символ
        ++str ;//"Идем" вперед по строке str (ставим указатель str на следующий символ строки)
    }
    return nullptr ;//если ругается на nullptr, то меняем nullptr на 0 или же компилируем с использованием c++11
}
 
 
 
//Функция поиска подстроки
const char * find_str ( const char * source , const char * find )
{
    size_t findStringSize = strlen(find) ;//Определяем длину искомой строки
    //Ищем в исходной строке(source) первый символ искомой строки(find)
    //указатель на этот символ пихаем в pNow (функция find_char вернет указатель со сзначением 0, если символ не найден)
    const char * pNow = find_char ( source , *find ) ; 
    //В условии цикла проверяем pNow на ноль
    //Если pNow равен нулю, значит первый символ искомой строки не найден, а значит и всей искомой строки нет в источнике
    while ( pNow )
    {
        //В pNow у нас лежит указатель на символ строки(source), равный первому символу исходной строки(find)
        //Проверяем, равна ли последовательность символов в исходной строке, последовательности символов в искомой строке
        //В качестве кол-ва проверяемых символов передаем размер искомой строки (findStringSize)
        if ( is_equal_range ( pNow , find , findStringSize ) )//Если элементы последовательностей равны, значит подстрока найдена
            return pNow ; //Возвращаем указатель на найденый ранее символ.
        //Ищем первый символ искомой строки(find), исходной строке (source).
        //Теперь, в качестве начала поиска передаем указатель на символ, следующий за уже найденным ранее (pNow+1)
        //указатель на этот символ пихаем в pNow (функция find_char вернет указатель со сзначением 0, если символ не найден)
        pNow = find_char ( pNow+1 , *find ) ; 
    }
    //Если дошли до сих пор, значит подстрока не найдена, вернем указатель, содержащий 0.
    return nullptr ;//если ругается на nullptr, то меняем nullptr на 0 или же компилируем с использованием c++11
}
 
 
int main(){
    const char * str = "my string" ;
    const char * findStr = "tr" ;
    const char * rez = find_str ( str , findStr ) ; //Ищем подстроку(findStr) в строке(str)
    if ( rez ) //Если подстрока найдена, то
    {
        //Выводим разницу в элементах между адресом первого символа строки str 
        //и адресом символа, с которого начинается найденная подстрока в строке (str)
        std::cout << "index: "<< (rez-str) << std::endl ;
    }
    else
    {
        std::cout << "not found" << std::endl ;
    }
}
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
25.08.2015, 13:52  [ТС]
Croessmah, Вы будете смеяться но сейчас я это(ваш код) буду учить наизусть. Мой рецепт-"понимание приходит следом." Есть еще пара неясностей, я сейчас выложу. А самая первая, выходит функция может вызывать функцию не только в мэйне, по сути в мэйн, вы вызываете только ф-цию что выдает результат, остальные "сотрудничают " вне мэйна?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.08.2015, 14:14
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Цитата Сообщение от anti-k Посмотреть сообщение
А самая первая, выходит функция может вызывать функцию не только в мэйне
Само собой мало того, на самом деле, функцию можно вызвать даже до main'а:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
int foo() ;
 
int x = foo() ;
 
 
int main()
{
    std::cout << "main" << std::endl ;
    foo() ;
}
 
 
int foo ( )
{
    std::cout << "foo" << std::endl ;
    return 0 ;
}
http://rextester.com/ITUL16212


функция также может вызывать сама себя (рекурсия), как и у Вас в первом сообщении.


Также, например, есть указатели на функции:
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
29
30
31
32
33
34
35
36
37
//Title of this code
//g++  4.9.2
 
#include <iostream>
 
 
int mult ( int x , int y )
{
    return x * y ; 
}
 
 
 
int sum ( int x , int y )
{
    return x + y ;
}
 
 
 
//call_fn принимает три параметра: 
// x1 и x2 - это значения типа int
//p_func - указатель на функцию, которая возвращает значение типа int и принимает два параметра типа int
int call_fn ( int x1 , int x2 , int(*p_func)(int,int) )
{
    return p_func ( x1 , x2 ) ; //Вызываем функцию, используя указатель, передаем ей два параметра
}
 
 
int main()
{
    int x1 = 0 ;
    int x2 = 0 ;
    std::cin >> x1 >> x2 ;
    std::cout << call_fn ( x1 , x2 , sum ) << std::endl ;
    std::cout << call_fn ( x1 , x2 , mult ) << std::endl ;
}
http://rextester.com/NBVP53641
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
25.08.2015, 14:27  [ТС]
Croessmah, Я ваш должник и почитатель. Сейчас буду разбираться
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.08.2015, 14:43
Цитата Сообщение от anti-k Посмотреть сообщение
Я ваш должник и почитатель
высекать из скалы истукан на вершине Эвереста не нужно
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
25.08.2015, 14:57
Цитата Сообщение от anti-k Посмотреть сообщение
Блин, я когда нибудь пойму эти указатели!!????
Когда сначала на ассемблере попишешь код, а потом на чистом Си. Я сам так прошел этот путь и теперь не понимаю, как можно не понимать указатели.
Твоих Фибоначчей на указателях можно навелосипедить кучей способов, но сначала надо четко уяснить, что принимает функция, что возвращает, и какие глобальные или статические переменные-растяжки она использует в своей работе.
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
25.08.2015, 15:23
anti-k, чтобы понять указатели, надо уяснить себе, как организована память с точки зрения программиста.
Эта статья: Размещение объектов в оперативной памяти. Понятие указателя понятна?
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
25.08.2015, 15:54  [ТС]
Croessmah,Croessmah,
А вы не могли бы посмотреть в чем здесь дело? Проверить соответствует ли массив другому массиву?
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include<iostream>
#include<windows.h>
#include<ctime>
using namespace std;
void input(int**,int,int);
void del(int**,int size);
int match(int**,int**,int ,int ,int ,int );
int main(){
    const int n=12,m=14,l=3,k=2;
    int**arr;
    arr=new int*[n];
    for(int i=0;i<n;i++)
    arr[i]=new int[m];
    input(arr,n,m);
    
    int**arr1;
    arr1=new int*[l];
    for(int i=0;i<l;i++)
    arr1[i]=new int[k];
    input(arr1,l,k);
    
    //cout<<match(arr,arr1,n,m,l,k);
    
    del(arr,n);
    del(arr1,l);
    
    return 0;
}
void input(int**arr,int n,int m){
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            arr[i][j]=rand()%10;
            cout<<" "<<arr[i][j];       
        }
        cout<<endl;
    }
    cout<<endl;
}
 
int match(int** arr1,int** arr2,int n,int m,int l,int k){
            int ll=0,kk=0,counter=0,counter1=0;
        for(int i=0;i<n;i++){
        
            for(int j=0;j<m;j++){
                if(kk>=m)
                kk=0;
                
                for(int i1=0;i1<l;i1++){
                    for(int j1=0;j1<k;j1++){
                    
                        if(arr2[i1][j1]==arr1[i1+ll][j1+kk]){
                        counter++;      
                        }                       
                    }                   
                }
                if(counter==l*k){
                //cout<<"ok"<<endl;
                counter1++;
                }
                counter=0;
                    kk++;
            }
            ll++;
        }
        return counter1;
}
 
void del(int**arr,int r_size){
    for(int i=0;i<r_size;i++){
        delete[]arr[i];     
    }
    delete[]arr;
}
Добавлено через 9 минут
Croessmah, Ошибка именно в проверке, заполнение и delete вроде нормально.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.08.2015, 16:04
Цитата Сообщение от anti-k Посмотреть сообщение
Ошибка именно в проверке
и в чем она выражается?
Что вообще такое
Цитата Сообщение от anti-k Посмотреть сообщение
Проверить соответствует ли массив другому массиву?
???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.08.2015, 16:04

Помогите найти ошибку в коде
Всем привет.Пишу вот такой простенький код в Visual Studio #include &lt;iostream&gt; Int main() { ...

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

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

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

Помогите найти ошибку в коде
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;time.h&gt; using namespace std; void mas(int ar, int count) { for (int i = 0;...


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

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

Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru