rzutowanie // stos

0

Mam taki kod:

#define STOS_MAX 10 // stos 10-elementowy

void *stos[STOS_MAX];
int szczyt=0;

int push(void *tmp) 
{
        if(szczyt < STOS_MAX) 
        {
                stos[szczyt] = tmp;
                szczyt++;
                return 1;
        }
        else //przepelnienie tablicy
        {
                //przepelnienie tablicy
                return 0;
        }   
}

void *pop() 
{
        if(szczyt) 
        {
        szczyt--;
        return stos[szczyt];
        }
       // else return 0;

}
void S_print()
{
         while(szczyt)
         printf("%d ", stos[--szczyt]);
}
int S_size()
{
        return szczyt;
}
void S_clear()
{
    szczyt=0;
}
int main();

chciałbym za pomocą funkcji pop pobierac do tablicy [na stos] wartość dowolnego typu. Pytanie brzmi czy dobrze sie za to zabieram i jak przekazac kompilatorowi ze robie takie rzutowanie umyslnie ?

0

*za pomocą funkcji push :)

0

W sumie to można tak jak robisz. Twój kod to raczej C, ale w C++ widziałem rozwiązanie typu klasa Variant (chyba tak się nazywała w VCL w C++ Builderze, sorki dużo czasu minęło odkąd używalem VCL), która potrafi przechowywać wartości różnych typów i wtedy twój stos przechowuje obiekty typu Variant, a w tychże obiektach przechowujesz dane typu int, double, string czy co tam się da do niego wrzucić.

Inny problem to to jak sobie poradzisz z tym, jak już uzyjesz pop() i dostaniej jakis wskaźnik typu void - będziesz miał serię castować na wszystkie typy jakie wrzuciłes do stosu, żeby spróbować znaleźć ten właściwy? Jeśli to C++, to możesz też trzymać na stosie (czy innym dowolnym kontenerze) wskaźniki do klasy bazowej jeśli masz zamiar wrzucać do niego obiekty klas pochodnych.

Uwaga do obecnego kodu: ponieważ "stos" i "szczyt" to zmienne globalne", to twoja funkcja S_print() zeruje ci rozmiar twojego stosu, czyli
push(somePtr)
S_print()
push(somePtr2)

spowoduje, że będziesz miał rozmiar stosu równy 1 zamiast 2.

Cytuję: "Pytanie brzmi czy dobrze sie za to zabieram i jak przekazac kompilatorowi ze robie takie rzutowanie umyslnie ?"

A co teraz mówi ci kompilator jak próbujesz rzutowac na void* - w jakim kontekście: jak wrzucasz cos na stos czy jak coś z niego zdejmujesz?

0

kod musi dzialac w c,
naprawilem funkcje do wypisywania, wyglada tak :

void S_print()
{
              int licznik=szczyt;
         while(licznik)
         printf("%d ", stos[--licznik]);
         printf("\n");
}

Chciałem się pozbyć warningow które kompilator(dev) wyświetla podczas wywołania funkcji "push" . Reszta wygląda ze działa ;)

0

a możesz podać co to za warningi, w którym miejscu dokladnie. Nie wszyscy mają Dev (a większość nawet nie dotknęłaby tego narzędzia :)), więc jak mamy wiedzieć, co to za warningi i skąd.

0

63 C:\Users\ABC\Desktop\stack\main.c [Warning] passing arg 1 of `push' makes pointer from integer without a cast

0

Domyślam się, że robisz coś takiego
push(12);
lub int x = 12;
push(x);

użyj push((void)x); lub push((void)12);

Ale powiedzmy sobie szczerze: taki kod jest ogólnie do kitu. Mam nadzieję, że nie będziesz próbował takich rzeczy z double/float czy C-stringami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0