Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
50 / 50 / 12
Регистрация: 22.05.2011
Сообщений: 326

Не знаю как правильно передать указатель

17.01.2013, 23:41. Показов 1254. Ответов 9

Студворк — интернет-сервис помощи студентам
В общем для начала приложу код ( не пугайтесь , что придется много читать , из этого кода изучить нужно лишь 2 функции и данные структуры ) :
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>
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
 
#define FOR0(i,n) for( i = 0 ; i < n ; i++ )
#define FOR1(i,n) for( i = 1 ; i <= n ; i++ )
#define sys_p system( "pause" )
#define End return 0
#define pb push_back 
#define mp make_pair
 
typedef long long ll ;
 
ifstream Cin( "input.txt" );
ofstream Cout( "output.txt" );
 
struct Treap
{
       ll x ; 
       ll y ;
       
       Treap *Left ;
       Treap *Right ;
       
       Treap () { } ;
       Treap ( ll x, ll y ) : x(x), y(y) { } ;
       Treap ( ll x, ll y, Treap *l, Treap *r ) : x(x), y(y), Left(l), Right(r) { }
};
 
typedef Treap * PTreap  ;
 
void Merge( PTreap & ans, PTreap l, PTreap r )
{
      
      if( l == NULL )
        ans = r ;
      if( r == NULL )
        ans = r ;
      
      if( l->y >= r->y )
      {
          Merge( l->Right, l->Right, r ) ;
          ans = l ;
      }
      else
      {
          Merge( r->Left, l, r->Left ) ;
          ans = r ; 
      }
}
 
void Split( PTreap & l, PTreap & r, ll x, PTreap g ) 
{
     if( !g )
       l = r = NULL ;
     else if( x < g->x )
     {
         Split( l, g->Left, x, g->Left ) ;
         r = g ;
     }
     else
     {
         Split( g->Right, r, x, g->Right ) ;
         l = g ;
     }
}
 
void insert( PTreap & g, ll x )
{
     PTreap l, r ;
     Split( l, r, x, g ) ;
     PTreap New = new Treap( x, rand(), NULL, NULL ) ;
     Merge( l, l, New ) ;
     Merge( g, l, r ) ;
}
 
main()
{ 
      ll n, i ;
      Treap a ;
      cin >> n ;
      vector < ll > r(n) ;
      FOR0( i, n )
      {
        cin >> r[i] ;
        insert( a, r[i] ) ;
      }
        
}
Я создал структуру Treap - дерево. Создал тип данных - указатель на эту структуру - PTreap = * Treap . У меня есть функция void insert( PTreap & g, ll x ) , которая принимает указатель на мое дерево и число, которое я хочу засунуть в дерево, оно его туда засовывает и обновляет переданый ему указатель. Я гарантирую, что работа всех функций, относящихся к дереву, правильна, и ошибок нету.
В главной процедуре main я должен создать дерево, считать некоторые данные и засунуть их в это дерево.
Я не очень разбираюсь в указателях и совершенно запутался, как нужно передать это дерево функции insert , чтобы не было ошибок. Текущий код не компилируется, не знаю как правильно передать указатель на дерево, причем с возможностью его менять...
Очень нуждаюсь в помощи, спасибо !
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.01.2013, 23:41
Ответы с готовыми решениями:

Как правильно передать указатель на структуру, и правильно ее использовать
Я планирую сделать сортировку, но компилятор начал ругаться &quot;Нет существует подходящей функции преобразования &quot;Student&quot; в...

Как правильно передать массив через указатель?
#pragma once #include &lt;vector&gt; class TOMathModel { public: TOMathModel(void); ~TOMathModel(void);

Как правильно передать указатель this в сторонний класс?
Вот файлы: // Field.cpp #include &quot;Field.hpp&quot; Field::Field(void) { attacked = 0; is_free = true;

9
1 / 1 / 0
Регистрация: 12.01.2013
Сообщений: 39
17.01.2013, 23:51
Хоть лог ошибок приложил бы...
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
18.01.2013, 00:02

Не по теме:

Кто писал этот код?:swoon:


C++
1
PTreap a ;
1
50 / 50 / 12
Регистрация: 22.05.2011
Сообщений: 326
18.01.2013, 01:19  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение

Не по теме:

Кто писал этот код?:swoon:


C++
1
PTreap a ;

Не по теме:

Писал я, а что не так ?



Спасибо, теперь ошибка в другом ! Дело в том, что программа вылетает с ошибкой как только программа доходит до момента:
C++
1
2
Ptreap x ;
if( !x ) ;
Взято отсюда:
C++
1
2
3
void Split( PTreap & l, PTreap & r, ll x, PTreap g ) 
{
     if( !g )
Именно, когда проверяется условие возникает ошибка ! Возможно у моей структуры не правильно определен 0, или что-то в этом роде..?
0
18.01.2013, 01:22

Не по теме:

Разбираться в данном коде почему происходит ошибка что-то не хочется из-за того, что данный код не читабелен совершенно. Только время убивать почем зря, имхо.

И зачем Вам свое дерево с таким набором заголовков?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>

1
50 / 50 / 12
Регистрация: 22.05.2011
Сообщений: 326
18.01.2013, 01:26  [ТС]

Не по теме:

А причем тут заголовки ? Ведь можно колесико вниз и они пропадут.. Это моя заготовка для решения олимпиадных задач по программированию. Этот код часть задачи. И почему нечитабелен код, обьясните пожалуйста!



Надеюсь, читаемость повысится:
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
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
using namespace std;
 
struct Treap
{
       long long x ; 
       long long y ;
       
       Treap *Left ;
       Treap *Right ;
       
       Treap () { } ;
       Treap ( long long x, long long y ) : x(x), y(y) { } ;
       Treap ( long long x, long long y, Treap *l, Treap *r ) : x(x), y(y), Left(l), Right(r) { }
};
 
typedef Treap * PTreap  ;
 
void Merge( PTreap & ans, PTreap l, PTreap r )
{
      
      if( l == NULL )
        ans = r ;
      if( r == NULL )
        ans = r ;
      
      if( l->y >= r->y )
      {
          Merge( l->Right, l->Right, r ) ;
          ans = l ;
      }
      else
      {
          Merge( r->Left, l, r->Left ) ;
          ans = r ; 
      }
}
 
void Split( PTreap & l, PTreap & r, long long x, PTreap g ) 
{
     if( !g )
       l = r = NULL ;
     else if( x < g->x )
     {
         Split( l, g->Left, x, g->Left ) ;
         r = g ;
     }
     else
     {
         Split( g->Right, r, x, g->Right ) ;
         l = g ;
     }
}
 
void insert( PTreap & g, long long x )
{
     PTreap l, r ;
     Split( l, r, x, g ) ;
     PTreap New = new Treap( x, rand(), NULL, NULL ) ;
     Merge( l, l, New ) ;
     Merge( g, l, r ) ;
}
 
main()
{ 
      long long x ;
      PTreap a = new Treap ;
      
      cin >> x ;
      
      insert( a, x ) ;
}
0
18.01.2013, 01:34

Не по теме:

Цитата Сообщение от AncinetHero Посмотреть сообщение
И почему нечитабелен код, обьясните пожалуйста!
Этот код можете прочитать только Вы. Стороннему человеку понадобиться время, чтобы в нем разобраться...разобраться в том, что тут написано, не говоря уже о заложенной логике.
Забросьте этот код на пол года и потом попробуйте прочитать:)
Цитата Сообщение от AncinetHero Посмотреть сообщение
Причем тут заголовки ?
Смысл их подключать, если Вы их не используете?
Давайте писать свой вектор, при этом подключив <vector>
Цитата Сообщение от AncinetHero Посмотреть сообщение
Это моя заготовка для решения олимпиадных задач по программированию
Если только по теме "Учусь сокращать и шифровать код"

0
50 / 50 / 12
Регистрация: 22.05.2011
Сообщений: 326
18.01.2013, 01:37  [ТС]
Я вроде бы все ненужное удалил, функции называются удобно - по функции, которую они выполняют. Больше читаемость повысить невозможно !
0
 Аватар для FreeMinder
36 / 36 / 4
Регистрация: 29.08.2012
Сообщений: 59
18.01.2013, 01:55
Цитата Сообщение от AncinetHero Посмотреть сообщение
PTreap a = new Treap ;
У вас конструктор по умолчанию не инициализирует переменные. Объект создался, в x и y мусор, указатели left и right невалидны. В функциях разбираться желания нет, но проблема скорее всего в обращении к невалидным указателям, проверяйте их перед использованием.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
18.01.2013, 02:04
В последнем приведенном коде ошибка возникает при вызове Split в функции insert
C++
1
Split( l, r, x, g ) ;
Происходит она по тому, что объект Treap создавался как
C++
1
PTreap a = new Treap;
Конструктор по умолчанию пуст и поля объекта содержат мусор.
Соответственно, в функции split условие
C++
1
if( !g )
не выполняется, и при выполнении одной из веток, например
C++
1
Split( l, g->Left, x, g->Left )
Left содержит мусор, который передается в функцию. Естевственно, условие снова не выполняется и при
C++
1
else if( x < g->x )
происходит ошибка, потому как
x<мусор->x

Не по теме:

Цитата Сообщение от AncinetHero Посмотреть сообщение
Больше читаемость повысить невозможно !
ну это сугубо Ваше мнение

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.01.2013, 02:04
Помогаю со студенческими работами здесь

Как правильно передать в функцию указатель на двумерный массив?
Сабж #include &lt;windows.h&gt; #include &lt;stdio.h&gt; using namespace std; //ОТ безысходности сделал матрицу глобальной int A = {2,...

Не могу понять, как правильно передать указатель на объект в файл
Есть вектор v, который надо отсортировать. Есть класс MergeSort, который это должен делать, он содержит в качестве параметра указатель на...

Как правильно удалять выделенную память под указатель на указатель?
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...

Не знаю как объявить указатель!
Нужно ввести указатель ptr, чтобы он изначально указывал на голову двусвязного списка. Не знаю как это сделать, постоянно ошибками сыплет. ...

Как передать параметр типа "указатель на указатель" в функцию?
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; #include &lt;iomanip&gt; using std::setiosflags; ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru