Image

Imagepink_master wrote in Imageru_cpp

Записывается сам адрес, а не значение по нему

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
(Слева адрес tos, правей p)

Image

Компилятор 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--;
    }

};