С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176

Как передать указатель в функцию?

09.02.2020, 18:24. Показов 2529. Ответов 28

Студворк — интернет-сервис помощи студентам
Здравствуйте. Делал свою лабораторную по программированию. Вот её суть:

Нужно написать процедуру, которая, получив в качестве параметра указатель на один из элементов двусвязного списка действительных чисел и два числа, добавляет первое число в начало списка, а второе в его конец.
Реализовал я это без передачи указателя и тупо вставил одно число в начало (функция addf()), другое в конец списка(функция add()). Преподавателю это не понравилось, она сказала, что надо вывести эти указатели (то есть, их адреса в памяти). Затем, ввести это шестнадцатеричное число, найти по нему этот элемент и двигаться влево (к началу) и вправо (к концу), и таким образом вставлять.

Но, дело в том, что это оказалось не так то просто (знающие люди наверное поймут). Пожалуйста, подскажите, как подрихтовать код в этом случае.

Мой код под спойлером

Кликните здесь для просмотра всего текста
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
 
using namespace std;
 
struct List {
    float num;
    List *next;
    List *prev;
};
List *Head = NULL, *Tail = NULL;
 
void fill_list(){
    List *tmp;
    for (int i = 0; i < 11; i++){
        tmp = new List;
        tmp->num = i;
        tmp->next = NULL;
        if (Head != NULL){
            tmp->prev = Tail;
            Tail->next = tmp;
            Tail = tmp;
        }
        else {
            tmp->prev = NULL;
            Head = Tail = tmp;
        }
    }
}
 
void show(){
    List *tmp = new List;
    tmp = Head;
    while (tmp != NULL){
        cout << tmp->num << " ";
        tmp = tmp->next;
    }
    cout << "\n";
}
 
void addf(float x){
    List *tmp = new List;
    tmp->next = NULL;
    tmp->prev = NULL;
    tmp->num = x;
    if (Head != NULL){
        tmp->next = Head;
        tmp->prev = tmp;
        Head = tmp;
    }
    else {
        Head = Tail = tmp;
    }
}
 
void add(float x){
    List *tmp = new List;
    tmp->next = NULL;
    tmp->num = x;
    if (Head != NULL){
        tmp->prev = Tail;
        Tail->next = tmp;
        Tail = tmp;
    }
    else {
        tmp->prev = NULL;
        Head = Tail = tmp;
    }
}
 
void func(float a, float b){
    addf(a);
    add(b);
}
 
int main()
{
    float a,b;
    fill_list();
    int sw;
    while (1)
    {
        cout << "1 - show(), 2 - func(a,b), 3 - exit" << endl;
        cin >> sw;
        switch (sw) {
            case 1:
                show();
            break;
            case 2:
                cout << "Input a, b " << endl;
                cin >> a;
                cin >> b;
                func(a,b);
            break;
            case 3:
                return 0;
        }
    }
 
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.02.2020, 18:24
Ответы с готовыми решениями:

Как правильно передать аргументы в шаблон функцию принимающую вектор класса?
Пытаюсь сделать функцию которая будет принимать вектор для класса Vehicle, выводить этот вектор и записывать его в файл. Проблема в том что...

как передать функции в качестве аргумента указатель на функцию описанной в другом классе?
Есть два класса A и B в классе A есть две функции funcA_1 и funcA_2 в классе B - funcB в funcA_1 создается экземпляр класса B и...

В функцию передать указатель на струкруру
Всем привет:! Мне нужно создать собственную функцию и передать туда указатель на созданную мной структуру. Структура есть, она описана...

28
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.02.2020, 20:16
Цитата Сообщение от ive_karp Посмотреть сообщение
Нужно написать процедуру,
В С++ нет процедур. Миссия не выполнима. ФаталлЕрррр ...

Добавлено через 2 минуты
C++
1
2
3
4
5
struct List {
    float num;
    List *next;
    List *prev;
};
Node не List. То что у Вас больше смахивает на Си, а не С++.

Добавлено через 4 минуты
Цитата Сообщение от ive_karp Посмотреть сообщение
получив в качестве параметра указатель на один из элементов двусвязного списка действительных чисел и два числа, добавляет первое число в начало списка, а второе в его конец.
Исходя из твоего кода у тебя уже есть Head и Tail так что непонятно зачем функции указатель на один из элементов.
Т.е. знание Head и Tail достаточно для вставки.
Так что реализация
Цитата Сообщение от ive_karp Посмотреть сообщение
найти по нему этот элемент и двигаться влево (к началу) и вправо (к концу), и таким образом вставлять.
выглядит как-то тупо.

Добавлено через 2 минуты
Цитата Сообщение от ive_karp Посмотреть сообщение
Но, дело в том, что это оказалось не так то просто (знающие люди наверное поймут). Пожалуйста, подскажите, как подрихтовать код в этом случае.
А в чем сложность бежать циклом сначала в одном направление пока next !=NULL потом в другом пока prev!=NULL что бы определить "голову" и "хвост"?
0
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176
09.02.2020, 20:21  [ТС]
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
В С++ нет процедур.
*Нужно написать функцию, возвращающую void

Цитата Сообщение от Avazart Посмотреть сообщение
Node не List. То что у Вас больше смахивает на Си, а не С++.
А есть по сути разница, как назвать переменную? Можно хоть горшком назвать, главное только в печь не ставить Назвал List потому, что список. С ООП мы дела не имеем, поэтому работаем со структурами
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.02.2020, 20:25
Цитата Сообщение от ive_karp Посмотреть сообщение
*Нужно написать функцию, возвращающую void
Я понимаю, но согласитесь это хороший повод довести преподшу до истерики )))
0
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176
09.02.2020, 20:26  [ТС]
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Исходя из твоего кода у тебя уже есть Head и Tail так что непонятно зачем функции указатель на один из элементов.
Т.е. знание Head и Tail достаточно для вставки.
Так что реализация
Цитата Сообщение от Avazart Посмотреть сообщение
выглядит как-то тупо.
Вообще не спорю) Но, это не я так решил, а мне сказали так сделать
Поэтому, мне теперь нужно разобраться, как сделать так, как сказали, и чтоб это работало
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.02.2020, 20:27
Цитата Сообщение от ive_karp Посмотреть сообщение
А есть по сути разница, как назвать переменную? Можно хоть горшком назвать, главное только в печь не ставить Назвал List потому, что список. С ООП мы дела не имеем, поэтому работаем со структурами
Ну всегда есть смысл как называть переменную ибо код должен "читаться"(людьми) а нет только "писаться".
ООП это "часть" языка С++ так что это еще один повод ...
Кроме того классы это одно, а ООП немного другое.

Такие вещи пишутся на обычно на классах а иногда еще чаще всего еще и шаблоными классами.
0
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176
09.02.2020, 20:28  [ТС]
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Я понимаю, но согласитесь это хороший повод довести преподшу до истерики )))
Согласен полностью, но, я лучше не буду доводить до истерики
Не знаю, чем чревато)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.02.2020, 20:29
Цитата Сообщение от ive_karp Посмотреть сообщение
а мне сказали так сделать
Пусть объяснят почему ... и не сдаваться пока не аргументировать ...

Цитата Сообщение от ive_karp Посмотреть сообщение
Согласен полностью, но, я лучше не буду доводить до истерики
Не знаю, чем чревато)
Я тоже это понимаю, но стоит учитывать что гонять тебя по таким глупостям можно тоже долго.
0
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176
09.02.2020, 20:37  [ТС]
Avazart, а всё таки, как-нибудь возможно ввести это шестнадцатеричное число в переменную типа "указатель на структуру" и потом уже манипулировать с этим ?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.02.2020, 20:38
C++
1
2
3
4
5
6
7
8
9
void show(){
    List *tmp = new List;
    tmp = Head;
    while (tmp != NULL){
        cout << tmp->num << " ";
        tmp = tmp->next;
    }
    cout << "\n";
}
А что это у тебя в show создается новый Node ? Зачем?

Добавлено через 54 секунды
Цитата Сообщение от ive_karp Посмотреть сообщение
Avazart, а всё таки, как-нибудь возможно ввести это шестнадцатеричное число в переменную типа "указатель на структуру" и потом уже манипулировать с этим ?
C++
1
std::cout << std::hex << poiterToNode;
Это так можно вывести.
1
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176
09.02.2020, 20:40  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А что это у тебя в show создается новый Node ? Зачем?
Я не задавался этим вопросом XD XD
Но, оно работает, и это главное ! XD
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.02.2020, 20:41
https://en.cppreference.com/w/cpp/io/manip/hex

Добавлено через 26 секунд
Цитата Сообщение от ive_karp Посмотреть сообщение
Я не задавался этим вопросом XD XD
Но, оно работает, и это главное ! XD
Оно там не нужно и ведет к утечкам памяти.
1
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,958
Записей в блоге: 3
10.02.2020, 10:13
Цитата Сообщение от Avazart Посмотреть сообщение
В С++ нет процедур
если функция ничего не возвращает почему это она должна называться функцией?

C++
1
void foo(); /// <<<---это не функция!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
если какие там гики называют такое функцией(остальные как попки повторяют),
то тогда хуже для этих гиков:
с их моском не всё в порядке
и нельзя им полностью верить!

это выглядит так: они сперли из математики термин и теперь используют его в извращенческом смысле.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2020, 13:12
Цитата Сообщение от XLAT Посмотреть сообщение
если функция ничего не возвращает почему это она должна называться функцией?
Она возвращает. Возвращает - void (ничего)

Цитата Сообщение от XLAT Посмотреть сообщение
если какие там гики называют такое функцией(остальные как попки повторяют),
Это ф-ция. Странно мыслить в С++ терминами почти умершего паскаля.
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,958
Записей в блоге: 3
10.02.2020, 13:24
Цитата Сообщение от Avazart Посмотреть сообщение
терминами почти умершего паскаля
что такое паскаль?
даже если ваш паскаль такой важный, то он - ПАСКАЛЬ всё равно берёт(оккупирует) слишком много на себя.
и это не допустимо!

вот от вики из терминов для подпрограмм:
Code
1
2
3
4
5
6
7
8
9
    Функция — это подпрограмма специального вида, которая, 
кроме получения параметров, выполнения действий и передачи 
результатов работы через параметры имеет ещё одну особенность— она всегда должна возвращать результат. 
Вызов функции является, с точки зрения языка программирования, 
выражением, он может использоваться в других выражениях или в качестве правой части присваивания.
 
    Процедура — это независимая именованная часть программы, 
которую после однократного описания можно многократно вызвать по имени 
из последующих частей программы для выполнения определенных действий.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2020, 13:29
А что говорит стандарт С++ ?
К чему по Вашему относить ф-цию с параметрами передающимися по ссылке? А с возвратом и по ссылке?
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,958
Записей в блоге: 3
10.02.2020, 13:46
Цитата Сообщение от Avazart Посмотреть сообщение
К чему по Вашему относить ф-цию с параметрами передающимися по ссылке? А с возвратом и по ссылке?
это не по нашему желанию,
а по тому, как этот термин определяется, ну, например из того что я привёл выше:

без вариантов это процедура.

можно трактовать так,
часть вычисления функции было вынесено в процедуру.

В классах же куда по вашему исчезли функции,
почему их так "застенчиво" заменили на методы?
(в плане терминологии)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2020, 13:48
Википедия не первоисточник.
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,958
Записей в блоге: 3
10.02.2020, 14:07
Цитата Сообщение от Avazart Посмотреть сообщение
Википедия не первоисточник.
инфу там авторы черпают из облаков?

Добавлено через 5 минут
мда. по ссылке ещё можно спорить о фанк или дур,
но для void foo(); очевидно, что это процедура.

Цитата Сообщение от ive_karp Посмотреть сообщение
Нужно написать процедуру
так что по заданию, надо написать процедуру,
т.е. подпрограмму, которая ничего не возвращает.
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
10.02.2020, 16:25
В стандарте нет никаких упоминаний про "процедуры", зато есть "функция". На страничке Страуструпа есть понятие "процедура" которое ссылается на "функция". Из чего следует, что никаких процедур в с++ нет.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.02.2020, 16:25
Помогаю со студенческими работами здесь

Если в класс нужно передать указатель на указатель на массив строк неизвестной длинны?
Как проинициализировать массив строк wchar_t * (произвольного размера) , если его нужно передать в конструктор класса ? wchar_t *A1 =...

Как передать функцию в поток
Имеется стандартный пример пример создания потока в C++Builder Unit2: ...

Как передать в функцию параметр цвета
Помогите пожалуйста перевести начало функции из дельфи на си procedure sector(clr:TColor;angle1,angle2:real;msg:string); Я записываю...

Как в поток передать разные функцию ?
Есть поток и две функции как передать их в метод Execute //unit1.cpp #include &quot;Unit2.h&quot; void m1() { ...

Как передать в функцию двумерный массив ?
Блин заморочился уже.. Надо передать двумерные массивы в функцию, обработать их там и вернуть .. помогите.. float Mnozh (float...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru