Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774

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

25.08.2015, 11:29. Показов 2939. Ответов 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
2405 / 1937 / 763
Регистрация: 27.07.2012
Сообщений: 5,576
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
2405 / 1937 / 763
Регистрация: 27.07.2012
Сообщений: 5,576
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
2405 / 1937 / 763
Регистрация: 27.07.2012
Сообщений: 5,576
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
2405 / 1937 / 763
Регистрация: 27.07.2012
Сообщений: 5,576
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
Ответ Создать тему
Новые блоги и статьи
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
После бана на Пикабу не работает авторизация аккаунта с Яндекса.
Hrethgir 09.07.2026
В частности https:/ / auto. ru/ logbook/ zapret-na-vozhdenie-posle-65-let_1cf28789-07b4-4c75-a2f7-4cd4edf9deeb тут хотел оставить комментарий такой Зрите в корень - монополизация на разработку программ. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru