0 / 0 / 1
Регистрация: 05.09.2014
Сообщений: 94
1

Почему в функцию передается другая переменная?

16.04.2015, 23:03. Показов 1167. Ответов 18
Метки нет (Все метки)

Есть программа по односвязным спискам, которые надо объединить в двухсвязные
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <stdio.h> 
#include  <stdlib.h>
 
class Hlink {    
 protected:     
 Hlink* next; 
 public:    
 Hlink();
 Hlink* incr();         
 Hlink* after(Hlink*);
 int getnext() {return (int)next;};
};  
 
Hlink::Hlink() 
{ 
    next=NULL; 
}
 
Hlink* Hlink::incr() 
{ 
    return(next); 
}
 
Hlink* Hlink::after(Hlink* p) 
{
    p->next = next;
    next = p;
    return(this);
} 
 
class Llink {    
 protected:     
 Llink* prev;
 public:    
 Llink();     
 Llink* decr();          
 Llink* before(Llink*);
 int getprev() {return (int)prev;};
}; 
 
Llink::Llink() 
    { 
    prev=NULL; 
    }
 
Llink* Llink::decr() 
    { 
    return(prev); 
    }
 
 
Llink* Llink::before(Llink* p) 
    {
    printf("p: (%d;%d)\n", (int)p, p->getprev());
    printf("this: (%d;%d)\n", (int)this, getprev()); 
    p->prev = prev;
    prev=p;
    return(this);
    } 
 
class SymLink : public Hlink, public Llink
{ 
    private:
    int s;
                                 
    public:
    SymLink(int c) : Hlink(), Llink(), s(c) {}; 
    SymLink* incr() {return((SymLink*) Hlink::incr());};
    SymLink* decr() {return((SymLink*) Llink::decr());}; 
    int printH();
    int printL();
    int gets() {return s;};
}; 
 
int SymLink::printH() 
{
    SymLink* p = this;
    SymLink* q;
    int n= 0;
    while(p != NULL)
    {            
        printf("%d(%d)\t",p->s,(int)p->next);
        q = p->incr();             
        p = q;
        n++;
    }
    return(n-1); 
}
 
int SymLink::printL() 
{
    SymLink* p = this;
    SymLink* q; 
    int n = 0;
    while(p != NULL)
    {            
        printf("%d(%d)\t",p->s,(int)p->prev);   
        q = p->decr();              
        p = q; 
        n++;
    }
    return(n-1); 
}
 
int main() 
{ 
    int ch;
    int i=0;
    int c;
    SymLink* head;
    SymLink* tail;
    SymLink* p;
    SymLink* q;
    SymLink* qq; 
head = q = new SymLink(c=0);   
tail = qq = new SymLink(c=0);
 
printf("q: %d(%d;%d;%d)\n", q->gets(), (int)q, q->getnext(), q->getprev()); 
printf("Head: %d(%d;%d;%d)\n",head->gets(), (int)head, head->getnext(), head->getprev());
printf("tail: %d(%d;%d;%d)\n",tail->gets(), (int)tail, tail->getnext(), tail->getprev()); 
 
ch=1;
while (i !=5)
{
p = new  SymLink(ch+(rand()%100));
    printf("p: %d(%d;%d;%d)\n",p->gets(), (int)p, p->getnext(), p->getprev());
qq->before(p);
q->after(p);
    printf("q: %d(%d;%d;%d)\n",q->gets(), (int)q, q->getnext(), q->getprev());
 
    printf("qq: %d(%d;%d;%d)\n",qq->gets(), (int)qq, qq->getnext(), qq->getprev());
q=p;
qq=p;
i++;
}
 
head->printH();
printf("\n");
tail->printL();
 
return(0);
}
, нашел и переделываю под себя. Проблема вот в чем:

Если посмотреть результат
q: 0(147137592;0;0) // просто печать q, виден адрес переменной и то что предыдущее и следующие поля не заполнены
Head: 0(147137592;0;0) // q=head, все нормально
tail: 0(147137640;0;0) // есть еще конец списка, его адрес
p: 84(147137688;0;0) // считали новый элемент, выделили для него память
p: (147137692;0) // вызывается функция qq->before(p); то есть в качестве p должен передаться элемент p с адресом 147137688, а если посмотреть, то получается, что адрес переменной вызова =q=head...

Уже часа 3 бьюсь не могу понять в чем дело, может кто-нибудь найдет ошибку?

Добавлено через 4 часа 30 минут
Сделал список односвязным - все работает верно, начинаю делать двусвязным - та же ерунда получается, передает не то значение и все тут...
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2015, 23:03
Ответы с готовыми решениями:

Почему не передается переменная?
Не могу разобраться почему так? В обычном html вункция работает &lt;input name=&quot;image&quot;...

Не передается переменная в функцию
Привет! Задача: сделать отправку почты по SMTP, абсолютно все работает, кроме того, чтобы...

Почему не передается массив в качестве параметра в функцию?
Всем привет и с Новым годом !!! =) Пишу приложение на Zend. Есть класс: class...

Как передается значение в функцию и почему после перемещения знач. остается?
Для меня это очень странный вопрос, т.к. не сказал бы что я уже профи в С++(да куда там... :D), но...

18
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
16.04.2015, 23:44 2
Цитата Сообщение от студ Посмотреть сообщение
а если посмотреть
Где смотришь?
0
0 / 0 / 1
Регистрация: 05.09.2014
Сообщений: 94
17.04.2015, 00:29  [ТС] 3
Запускаю в онлайне или gcc, результат не меняется...

Добавлено через 24 минуты
А может кто-нибудь попробовать запустить у себя, тот же результат будет?
0
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.04.2015, 01:13 4
Сделай before() виртуальной, и добавь её определение в SymLink.
0
0 / 0 / 1
Регистрация: 05.09.2014
Сообщений: 94
17.04.2015, 01:22  [ТС] 5
Цитата Сообщение от lss Посмотреть сообщение
Сделай before() виртуальной, и добавь её определение в SymLink.
А что это даст? Почему именно before касается и не касается after?
0
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.04.2015, 01:30 6
Цитата Сообщение от студ Посмотреть сообщение
А что это даст?
Адрес будет правильно передаваться.
Цитата Сообщение от студ Посмотреть сообщение
Почему именно before касается и не касается after?
Потому, что ты на before() жалуешься.
0
0 / 0 / 1
Регистрация: 05.09.2014
Сообщений: 94
17.04.2015, 01:52  [ТС] 7
Цитата Сообщение от lss Посмотреть сообщение
Потому, что ты на before() жалуешься.
так проблема то как раз в том и заключается, что две абсолютно одинаковые функции по отдельности работают правильно, а вместе - before дает неверный результат. При этом менял последовательность, неверный результат уже с первых значений даже если заносить в него в первую очередь, а потом в другой список...
0
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.04.2015, 02:07 8
Лучший ответ Сообщение было отмечено студ как решение

Решение

Цитата Сообщение от студ Посмотреть сообщение
что две абсолютно одинаковые функции
Какие две? before() и after()? Они принадлежат разным базовым классам. Объекты базовых классов находятся в объекте производного класса (SymLink) и имеют там свои адреса. Причём, адрес объекта Hlink будет совпадать с адресом объекта SymLink (он там первым идёт), а адрес объекта Llink будте больше на размер объекта Hlink (он за ним идёт). Когда ты передаёшь указатель на SymLink в функцию before(), он приводится к уазателю на Llink, и начинает уазывать на объект Llink объекта SymLink, поэтому он меняется (становится больше). Если тот же указатель передать в after(), то он приводится к укзателю на Hlink, и начинает указывать на объект Hlink объекта SymLink, а так как эти адреса совпадают (почему, читай выше), то адрес не меняестя. Чтобы этой всей байды не было, нужно делать эти функции виртуальными.
1
0 / 0 / 1
Регистрация: 05.09.2014
Сообщений: 94
17.04.2015, 02:14  [ТС] 9
Цитата Сообщение от lss Посмотреть сообщение
Чтобы этой всей байды не было, нужно делать эти функции виртуальными.
Спасибо за подробный ответ. Но боюсь препод не оценит виртуальные функции так как мы их не проходили еще. А без них можно как-то обойтись?
0
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.04.2015, 02:27 10
Цитата Сообщение от студ Посмотреть сообщение
А без них можно как-то обойтись?
Можно. Убери наследование, тогда и виртуальность не нужна.

Добавлено через 7 минут
Или не делай (или не используй) функций, где делается описанное приведение указателей.
0
0 / 0 / 1
Регистрация: 05.09.2014
Сообщений: 94
17.04.2015, 03:23  [ТС] 11
Цитата Сообщение от lss Посмотреть сообщение
где делается описанное приведение указателей.
Так без них не построить очередь... видимо плохой пример я нашел...
0
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.04.2015, 04:39 12
Задача какая? Построение двусвязного списка? Или что?

Добавлено через 24 минуты
Цитата Сообщение от студ Посмотреть сообщение
Так без них не построить очередь...
Набери, в поиске по форуму: двусвязный список.
0
0 / 0 / 1
Регистрация: 05.09.2014
Сообщений: 94
17.04.2015, 05:10  [ТС] 13
Цитата Сообщение от lss Посмотреть сообщение
Чтобы этой всей байды не было, нужно делать эти функции виртуальными.
попробовал сделать эти функции виртуальными, в итоге если делать виртуальной только before - перестает правильно работать after(дает адреса на 8 байт больше), если обе - тоже...

Добавлено через 1 минуту
Цитата Сообщение от lss Посмотреть сообщение
Чтобы этой всей байды не было, нужно делать эти функции виртуальными.
попробовал сделать эти функции виртуальными, в итоге если делать виртуальной только before - перестает правильно работать after(дает адреса на 8 байт больше), если обе - тоже...

Добавлено через 3 минуты
Цитата Сообщение от lss Посмотреть сообщение
Набери, в поиске по форуму: двусвязный список.
не просто двухсвязный список, а с множественным наследованием на основе односвязных списков... Простодвухсвязных я уже накопал, не подходят...
0
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.04.2015, 05:31 14
Цитата Сообщение от студ Посмотреть сообщение
попробовал сделать эти функции виртуальными, в итоге если делать виртуальной только before - перестает правильно работать after(дает адреса на 8 байт больше), если обе - тоже...
Что ты там сделал - один ты знаешь. Код показывай. Это сделал?
Цитата Сообщение от lss Посмотреть сообщение
Сделай before() виртуальной, и добавь её определение в SymLink.
0
0 / 0 / 1
Регистрация: 05.09.2014
Сообщений: 94
17.04.2015, 05:42  [ТС] 15
Цитата Сообщение от lss Посмотреть сообщение
Сделай before() виртуальной, и добавь её определение в SymLink.
виртуальной сделал добавив слово virtual перед функцией. А как добавить её определение в SymLink?

Добавлено через 1 минуту
lss , пожалуйста, покажи или пример или где исправлять. Не могу понять, честно.
0
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.04.2015, 06:15 16
Код на эту тему:
Цитата Сообщение от lss Посмотреть сообщение
Или не делай (или не используй) функций, где делается описанное приведение указателей.
Попробуй:
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <stdio.h> 
#include  <stdlib.h>
 
class Hlink {    
 protected:     
 Hlink* next; 
 public:    
 Hlink();
 Hlink* incr();         
 Hlink* after(Hlink*);
 int getnext() {return (int)next;};
};  
 
Hlink::Hlink() 
{ 
    next=NULL; 
}
 
Hlink* Hlink::incr() 
{ 
    return(next); 
}
 
Hlink* Hlink::after(Hlink* p) 
{
    p->next = next;
    next = p;
    return(this);
} 
 
class Llink {    
 protected:     
 Llink* prev;
 public:    
 Llink();     
 Llink* decr();          
 Llink* before(Llink*);
 int getprev() {return (int)prev;};
}; 
 
Llink::Llink() 
    { 
    prev=NULL; 
    }
 
Llink* Llink::decr() 
    { 
    return(prev); 
    }
 
 
Llink* Llink::before(Llink* p) 
    {
    printf("p: (%d;%d)\n", p, p->getprev());
    printf("this: (%d;%d)\n", this, getprev()); 
    p->prev = prev;
    prev=p;
    return(this);
    } 
 
class SymLink : public Hlink, public Llink
{ 
    private:
    int s;
                                 
    public:
    SymLink(int c) : Hlink(), Llink(), s(c) {}; 
    SymLink* incr() {return((SymLink*) Hlink::incr());};
    SymLink* decr() {return((SymLink*) Llink::decr());}; 
    int printH();
    int printL();
    int gets() {return s;};
 
    SymLink* before(SymLink* p) 
    {
        printf("p: (%d;%d)\n", p, p->getprev());
        printf("this: (%d;%d)\n", this, getprev()); 
        p->prev = prev;
        prev=p;
        return(this);
    } 
 
    SymLink* after(SymLink* p) 
    {
        p->next = next;
        next = p;
        return(this);
    } 
}; 
 
int SymLink::printH() 
{
    SymLink* p = this;
    SymLink* q;
    int n= 0;
    while(p != NULL)
    {            
        printf("%d(%d)\t",p->s,(int)p->next);
        q = p->incr();             
        p = q;
        n++;
    }
    return(n-1); 
}
 
int SymLink::printL() 
{
    SymLink* p = this;
    SymLink* q; 
    int n = 0;
    while(p != NULL)
    {            
        printf("%d(%d)\t",p->s,(int)p->prev);   
        q = p->decr();              
        p = q; 
        n++;
    }
    return(n-1); 
}
 
int main() 
{ 
    int ch;
    int i=0;
    int c;
    SymLink* head;
    SymLink* tail;
    SymLink* p;
    SymLink* q;
    SymLink* qq; 
head = q = new SymLink(c=0);   
tail = qq = new SymLink(c=0);
 
printf("q: %d(%d;%d;%d)\n", q->gets(), (int)q, q->getnext(), q->getprev()); 
printf("Head: %d(%d;%d;%d)\n",head->gets(), (int)head, head->getnext(), head->getprev());
printf("tail: %d(%d;%d;%d)\n",tail->gets(), (int)tail, tail->getnext(), tail->getprev()); 
 
ch=1;
while (i !=5)
{
p = new  SymLink(ch+(rand()%100));
    printf("p: %d(%d;%d;%d)\n",p->gets(), p, p->getnext(), p->getprev());
qq->before(p);
q->after(p);
    printf("q: %d(%d;%d;%d)\n",q->gets(), q, q->getnext(), q->getprev());
 
    printf("qq: %d(%d;%d;%d)\n",qq->gets(), qq, qq->getnext(), qq->getprev());
q=p;
qq=p;
i++;
}
 
head->printH();
printf("\n");
tail->printL();
 
return(0);
}
0
0 / 0 / 1
Регистрация: 05.09.2014
Сообщений: 94
17.04.2015, 08:28  [ТС] 17
Цитата Сообщение от lss Посмотреть сообщение
Попробуй:
Тот же результат. А почему ты не сделал функцию виртуальной?

Добавлено через 37 минут
проблема тут, но не могу понять почему
SymLink* before(SymLink* p)
{
printf("p: (%d;%d)\n", (int)p, (int)p->getprev());
printf("this: (%d;%d)\n", (int)this, (int)getprev()); // данные переданы верно p: (165667992;0), this: (165667944;0)
p->prev = prev;
printf("p: (%d;%d)\n", (int)p, (int)p->getprev());
printf("this: (%d;%d)\n", (int)this, (int)getprev()); //здесь тоже все верно p: (165667992;0), this: (165667944;0)
prev=p;
printf("p: (%d;%d)\n", (int)p, (int)p->getprev());
printf("this: (%d;%d)\n\n", (int)this, (int)getprev()); // А вот тут уже ошибка p: (165667992;0),
//this: (165667944;165667996)
return(this);
}

вместо 165667996 должно быть 165667992... Но ПОЧЕМУ??? Ведь еще строчной выше (int p)=165667992.
Разница между адресами всегда 4...
p: (165667992;0)
this: (165667944;0)
p: (165667992;0)
this: (165667944;0)
p: (165667992;0)
this: (165667944;165667996)
0
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.04.2015, 13:43 18
Цитата Сообщение от студ Посмотреть сообщение
Но ПОЧЕМУ???
Вот здесь опять происходит неявное преобразование типов:
Цитата Сообщение от студ Посмотреть сообщение
prev=p;
prev имеет тип Llink*, а p - SymLink*, и, при приведении типов, проиходит то, что я уже описывал. Нследование тут всё путает.
0
0 / 0 / 1
Регистрация: 05.09.2014
Сообщений: 94
18.04.2015, 21:26  [ТС] 19
Был у препода вчера, сказал класс надо наследовать абстрактным, но пока не пробовал...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2015, 21:26
Помогаю со студенческими работами здесь

Почему не вставляется переменная в функцию?
Если в функцию вместо $parametr_widther вставить число то все работает, $parametr_widther принимает...

Не передается переменная...
Всем доброго времени суток! Столкнулся с проблемой передачи переменной элемента &lt;input...

Не передаётся переменная
Здравствуйте. Программа должна брать значение из поля формы и выводить его. Но она...

Не передается переменная
Помогите пожалуйста. Привожу 2 куска своих кодов. Передаю переменные с html в php через post,...

Не передается первая переменная
Адрес http://site.ru/cat/a123/b54/c855/ RewriteEngine On RewriteBase /cat/ RewriteRule...

Переменная не передаётся в $_GET
Здравствуйте, уважаемые. Столкнулся со странной проблемой. Вот простой довольно-таки код: ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru