Записывается сам адрес, а не значение по нему
UPD: проблема решена
Я в тупике=( Делал простенький стек с указателями.
Вот функция push:
Условие вверху - то что стек полон. Но оно не срабатывает, так как код в MSVC++2003 работает совсем не так, как я ожидал=(
tos = Top of Stack
p = указатель, который по этому стеку бегает
void push(int in)
{
// ОШИБКА - предохранитель не срабатывает
if (p == (tos + SIZE) )
{
printf("%p\t%p\n", tos, p); // trace
printf("Stek polon\n");
}
else
{
printf("%p\t%p\n", tos, p); // trace tos & p
++p;
printf("%p\t%p\t%d\n", tos, p, in);
*p = in;
printf("%p\t%p\n", tos, p);
}
}
Она вроде и работает нормально, но когда заносится последнее число в стек, то в адресе текущего положения стека(p) оказывается само число(in).
Например если ввести число "4". То вместо того что бы записать по адресу p это число, адресс p сам станет равен 00000004

Я в тупике=( Делал простенький стек с указателями.
Вот функция push:
Условие вверху - то что стек полон. Но оно не срабатывает, так как код в MSVC++2003 работает совсем не так, как я ожидал=(
tos = Top of Stack
p = указатель, который по этому стеку бегает
void push(int in)
{
// ОШИБКА - предохранитель не срабатывает
if (p == (tos + SIZE) )
{
printf("%p\t%p\n", tos, p); // trace
printf("Stek polon\n");
}
else
{
printf("%p\t%p\n", tos, p); // trace tos & p
++p;
printf("%p\t%p\t%d\n", tos, p, in);
*p = in;
printf("%p\t%p\n", tos, p);
}
}
Она вроде и работает нормально, но когда заносится последнее число в стек, то в адресе текущего положения стека(p) оказывается само число(in).
Например если ввести число "4". То вместо того что бы записать по адресу p это число, адресс p сам станет равен 00000004
(Слева адрес tos, правей p)
Компилятор MSVC++ 2003. Но когда откомпилировал в MSVC5, все работает как надо. Hе могу понять отчего. Не может же быть в MSVC++2003 такой грубой ошибки? - конечно нет.
Я в тупике=(
/*
Сравнение указателей. Сравнивают, когда они
ссылаются на один и тот же обьект
*/
#include <iostream>
using namespace std;
#define SIZE 3
int *tos, *p;
int stack[SIZE];
void push(int in);
int pop();
int main()
{
// printf("Das Programm werft die Zahlen ins Stack ein\n 666 - Ausgang, 0 - entnehmen aus dem Stack\n" );
printf("Programma zanosit chisla v stek\n 666 - Vixod, 0 - vitolknut' iz steka\n" );
int val = 0;
tos = p = stack; // указатель вершины и рабочий указатель терь указывают на вершину
printf("%p\t%p\n", tos, p);
while (true)
{
// printf("Gebe die ganze Zahl: " );
printf("Vvedi 4islo: " );
scanf("%d", &val);
if (val == 666) exit(1);
if (val == 0)
{
int temp = pop();
if (temp) printf("%d\n", temp);
}
else
push(val);
}
return 0;
}
void push(int in)
{
// ОШИБКА - предохранитель не срабатывает
if (p == (tos + SIZE) )
{
printf("%p\t%p\n", tos, p);
// printf("Stack ist leider voll. Entnehmen Sie die Zahlen=)");
printf("Stek polon\n");
}
else
{
printf("%p\t%p\n", tos, p);
++p;
printf("%p\t%p\t%d\n", tos, p, in);
*p = in; // Сначала выполниться ++, а потом * ( мы перешли на следуюший элемент )
printf("%p\t%p\n", tos, p);
}
}
int pop()
{
if (p == tos)
{
printf("%p\t%p\n", tos, p);
// printf("Stek ist leer. Werfst die neue Zahlen ein\n");
printf("Stek Pust\n");
return 0;
}
else
{
printf("%p\t%p\n", tos, p);
return *p--;
}
};
Я в тупике=(
/*
Сравнение указателей. Сравнивают, когда они
ссылаются на один и тот же обьект
*/
#include <iostream>
using namespace std;
#define SIZE 3
int *tos, *p;
int stack[SIZE];
void push(int in);
int pop();
int main()
{
// printf("Das Programm werft die Zahlen ins Stack ein\n 666 - Ausgang, 0 - entnehmen aus dem Stack\n" );
printf("Programma zanosit chisla v stek\n 666 - Vixod, 0 - vitolknut' iz steka\n" );
int val = 0;
tos = p = stack; // указатель вершины и рабочий указатель терь указывают на вершину
printf("%p\t%p\n", tos, p);
while (true)
{
// printf("Gebe die ganze Zahl: " );
printf("Vvedi 4islo: " );
scanf("%d", &val);
if (val == 666) exit(1);
if (val == 0)
{
int temp = pop();
if (temp) printf("%d\n", temp);
}
else
push(val);
}
return 0;
}
void push(int in)
{
// ОШИБКА - предохранитель не срабатывает
if (p == (tos + SIZE) )
{
printf("%p\t%p\n", tos, p);
// printf("Stack ist leider voll. Entnehmen Sie die Zahlen=)");
printf("Stek polon\n");
}
else
{
printf("%p\t%p\n", tos, p);
++p;
printf("%p\t%p\t%d\n", tos, p, in);
*p = in; // Сначала выполниться ++, а потом * ( мы перешли на следуюший элемент )
printf("%p\t%p\n", tos, p);
}
}
int pop()
{
if (p == tos)
{
printf("%p\t%p\n", tos, p);
// printf("Stek ist leer. Werfst die neue Zahlen ein\n");
printf("Stek Pust\n");
return 0;
}
else
{
printf("%p\t%p\n", tos, p);
return *p--;
}
};
