Gestione degli stack

Il programma che ho scritto non viene eseguito correttamente, penso che il problema sia nella creazione dello stack ma non riesco a individuarlo.
NB: i vari cout “zio” sono messi lì per farmi un’idea su dove inizi il problema, ignorateli
Stack doubt

Riga 10, non so se è quello il problema non riesco a vedere altro…

anzichè così:

typedef tipoStack* stack;

prova a scrivere così:

typedef struct tipoStack* stack;

Inoltre nel main tu nella riga 54 dichiari quindi un puntatore stack1 che non sa che tipo di valore punta, la struttura stack1 è quindi un puntatore ma la struttura vera e propria quando è inizializzata?

Io sono “nuovo” del c++ quindi non so se permette semplificazioni in piu in queste cose rispetto al C. Fammi sapere se trovi l’errore che anche a me interessa, magari provo a riscrivermelo intanto e faccio dei test.

Ho corretto l’errore sulla typedef, ma come creare correttamente uno stack ancora non lo ho capito

Nel main potresti fare così:

da quello che ho capito il puntatore puoi usarlo per creare la tua struttura, nella riga 54:

stack stack1 = new tipoStack;

così il puntatore adesso punta verso una memoria dedicata alla struttura che hai fatto. Oppure fai

sruct tipoStack stack1;
stack stackptr = &stack1;

e passi alle funzioni stackptr. Cmq la riga 10 non so se fosse sbagliata, online ho trovato questo esempio:

truct Distance
{ int feet; float inch; };

int main() {
Distance *ptr, d;`

ptr = &d;`

ecc…poi ptr è il puntatore che passa alle funzioni

Grazie ai tuoi consigli ho risolto, pubblico il programma corretto se può essere utile:

#include <iostream>
    using namespace std;
    #define dimensione 30
    #define nullptr NULL

    struct tipoStack{
    	int n=0; //numero di dati nello stack
    	int s[dimensione]; //array per memorizzare gli elementi
    };

    typedef struct tipoStack* stack;

    //funzione per controllare se uno stack è vuoto
    int isempty(stack stackricevuto){
    	if(stackricevuto->n==0) return 1;
    	else return 0;
    }

    //funzione per controllare se è pieno
    int isfull(stack stackricevuto){
    	if(stackricevuto->n==dimensione) {return 1;}
    	else {return 0;}
    }

    //funzione per inserire un elemento
    void push(stack stackricevuto, int dato){
    	if(isfull(stackricevuto)==0){
    		stackricevuto->s[stackricevuto->n]=dato;
    		stackricevuto->n++;
    	}
    }

    //funzione per rimuovere un elemento dallo stack
    int pop(stack stackricevuto){
    	int n=stackricevuto->n;
    	if(isempty(stackricevuto)==0){
    		stackricevuto->s[n]=nullptr;
    		stackricevuto->n--;
    		return stackricevuto->s[n];
    	}
    	return -1;
    }

    //funzione per stampare stack
    void print(stack stackricevuto){
    	int i;
    	for(i=0; i<stackricevuto->n; i++){
    		cout << stackricevuto->s[i] << endl;
    	}
    }


    int main() {
    	stack stack1=new tipoStack;
    	push(stack1, 10);
    	push(stack1, 11);
    	push(stack1, 12);
    	push(stack1, 13);
    	push(stack1, 14);
    	pop(stack1);
    	print(stack1);
    		
    	return 0;
    }

Ottimo, ho provato cmq a mettere il typedef senza struct… nel C mi dava errore ma qui nel ++ pare che non sia necessario, andava bene anche come avevi scritto tu il programma ha lo stesso output, significa che inizializza correttamente la struttura.

P.S. sai cosa vuol dire questo messaggio che il tuo programma mi da? esegue lo stesso ma mi da sta warning alle righe 7 e 37

[Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11

@Marcello il tuo compilatore ha notato che stai utilizzando funzioni di C++11 e, per quanto te le compili, ti dice che ciò che usi a linea 7 e 37 non sarebbe teoricamente supportato. Per risolvere:

  • Non usi quelle funzionalità, che per lo più sono zucchero sintattico
  • In DevC++ vai su Opzioni Compilatore e aggiungi -std=c++11 ai parametri di compilazione

Grazie mille, anche se questi problemi spero non mi spuntino all’esame xD