Errore con la pila

di il
9 risposte

Errore con la pila

#include <stdio.h>
#include <stdlib.h>
#define DIM 4
typedef struct stackT{
int stack_array[DIM];
int head;
};


void init(struct stackT *pila);
int push(struct stackT *pila, int elem);
int pop(struct stackT *pila, int *elem);
int sizee(struct stackT *pila);
int is_emptyy(struct stackT *pila);

int main()
{

    typedef struct stackT p;
    char s;
    int a;
    int b;
    init(&p);
    printf("continui [s\n]");
    scanf(&s);
    do{
        printf("inserisci a");
        scanf(&a);
        printf("%d, sizee(&p)");
        if(push(&p, a)==1)
        {
         printf("la pila è piena");
         s='n';
        }
    }while(s=='s');
    int is_emptyy(&p);

    printf("cancellare? [s\n]");
       scanf(&s);
    do{
        printf("inserisci a");
        scanf(&a);
        if(pop(&p, &b)==1)
        {
         printf("la pila è vuota");
         s='n';
        }
        printf("%d, b");
    }while(s=='s');
    int is_emptyy(&p);




    return 0;
}

void init(struct stackT *pila){
pila->head=0;
return;
}

int push(struct stackT *pila, int elem){
if(pila->head==DIM)
    return 1;
pila->stack_array[pila->head]=elem;
pila->head++;
return 0;
}

int pop(struct stackT *pila, int *elem){
if(pila->head==0)
    return 1;
elem=pila->stack_array[pila->head];
pila->head--;
return 0;
}

int sizee(struct stackT *pila){
return pila->head;
}

int is_emptyy(struct stackT *pila){
if(pila->head==0)
    return 1;
return 0;
}



||=== Build: Debug in struttura pila (compiler: GNU GCC Compiler) ===|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|7|warning: useless storage class specifier in empty declaration|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c||In function 'main':|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|23|error: expected expression before 'p'|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|28|warning: passing argument 1 of 'scanf' from incompatible pointer type|
C:\Program Files (x86)\CodeBlocks\MinGW\include\stdio.h|347|note: expected 'const char *' but argument is of type 'int *'|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|29|warning: format '%d' expects a matching 'int' argument [-Wformat=]|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|30|error: expected expression before 'p'|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|30|error: too few arguments to function 'push'|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|11|note: declared here|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|36|error: expected declaration specifiers or '...' before '&' token|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|42|warning: passing argument 1 of 'scanf' from incompatible pointer type|
C:\Program Files (x86)\CodeBlocks\MinGW\include\stdio.h|347|note: expected 'const char *' but argument is of type 'int *'|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|43|error: expected expression before 'p'|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|43|error: too few arguments to function 'pop'|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|12|note: declared here|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|48|warning: format '%d' expects a matching 'int' argument [-Wformat=]|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|50|error: expected expression before 'p'|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|22|warning: unused variable 'b' [-Wunused-variable]|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c||In function 'pop':|
C:\Users\Simone\Desktop\codeblocks es\struttura pila\main.c|74|warning: assignment makes pointer from integer without a cast|
||=== Build failed: 7 error(s), 7 warning(s) (0 minute(s), 0 second(s)) ===|

riuscite ad aiutarmi per favore?

9 Risposte

  • Re: Errore con la pila

    Inizia a togliere typedef dove scrivi "typedef struct stackT".
    Riguardati la scanf che come primo argomento vuole un puntatore a char (la stringa di formattazione)
    Nella printf le virglette sono messe nel posto sbagliato.
    In main le righe che contengono
    
        int is_emptyy(&p);
    
    sono sbagliate e non si capisce cosa tu voglia fare,
    una sintassi giusta sarebbe
    
        int i = is_emptyy(&p);
    
    nella pop forse volevi scrivere
    
    *elem=pila->stack_array[pila->head];
    
    prova a sistemare la sintassi, poi vediamo la logica
  • Re: Errore con la pila

    #include <stdio.h>
    #include <stdlib.h>
    #define DIM 4
    struct stackT{
    int stack_array[DIM];
    int head;
    };
    
    
    void init(struct stackT *pila);
    int push(struct stackT *pila, int elem);
    int pop(struct stackT *pila, int *elem);
    int sizee(struct stackT *pila);
    int is_emptyy(struct stackT *pila);
    
    int main()
    {
        struct stackT p;
        char f,s;
        int a;
        int b;
        init(&p);
        printf("continui [s\n]");
        scanf("%c", &s);
        do{
            printf("inserisci a\n");
            scanf("%d", &a);
            if(push(&p, a)==1)
            {
             printf("la pila è piena\n");
             s='n';
            }
            else
            {
                printf("size %d\n", sizee(&p));
            }
        }while(s=='s');
    
        printf("1=vuoto, 0=piento\n %d\n", is_emptyy(&p));
    
        printf("cancellare? [s\n]");
           scanf("%c", &f);
    
        do{
            if(pop(&p, &b)==1)
            {
             printf("la pila è vuota");
             s='n';
            }
            printf("%d", b);
        }while(f=='s');
    
    printf("1=vuoto, 0=piento\n %d\n", is_emptyy(&p));
    
    
    
    
        return 0;
    }
    
    void init(struct stackT *pila){
    pila->head=0;
    return;
    }
    
    int push(struct stackT *pila, int elem){
    if(pila->head==DIM)
        return 1;
    pila->stack_array[pila->head]=elem;
    pila->head++;
    return 0;
    }
    
    int pop(struct stackT *pila, int *elem){
    if(pila->head==0)
        return 1;
    *elem=pila->stack_array[pila->head];
    pila->head--;
    return 0;
    }
    
    int sizee(struct stackT *pila){
    return pila->head;
    }
    
    int is_emptyy(struct stackT *pila){
    if(pila->head==0)
        return 1;
    return 0;
    }
    
    ora funziona la prima parte ma quando arriva printf("cancellare? [s\n]") non mi fa inserire il valore di f e salta direttamente al ripetizione che trovando s != da 's' non si avvia
  • Re: Errore con la pila

    L'infimo %c della scanf ne ha colpito un'altro . Cambia il codice così
    
    scanf(" %c", &s);
    
    Lo spazio prima di %c permette di "flushare" (eliminare) tutti gli white space precedenti. Nel tuo caso resta in stdin il carattere \n (invio/enter) della scanf precedente.

    Sul caro buon vecchio manuale trovi
    c

    Matches a sequence of characters whose length is specified by the maximum field width (default 1); the next pointer must be a pointer to char, and there must be enough room for all the characters (no terminating null byte is added). The usual skip of leading white space is suppressed. To skip white space first, use an explicit space in the format.
  • Re: Errore con la pila

    LPs ha scritto:


    [...] Matches a sequence of characters whose length is specified by the maximum field width (default 1); the next pointer must be a pointer to char, and there must be enough room for all the characters (no terminating null byte is added). The usual skip of leading white space is suppressed. To skip white space first, use an explicit space in the format.
    Questa poi... mai avrei immaginato, dato che molto raramente mi capita di dover leggere un carattere...
  • Re: Errore con la pila

    Ho aggiunto lo spazio ma ora mi va in loop sulla seconda parte, nella funzione pop non diminuisce p->head
  • Re: Errore con la pila

    Alan_Reloaded ha scritto:


    LPs ha scritto:


    [...] Matches a sequence of characters whose length is specified by the maximum field width (default 1); the next pointer must be a pointer to char, and there must be enough room for all the characters (no terminating null byte is added). The usual skip of leading white space is suppressed. To skip white space first, use an explicit space in the format.
    Questa poi... mai avrei immaginato, dato che molto raramente mi capita di dover leggere un carattere...

    Si, effettivamente è un po' "tricky" ma se ci pensi %c è fatto apposta: "spoola" un carattere alla volta senza fare distinzione fra white spaces o altro, quindi serviva qualcosa per "flushare" lo stream di input fino ad un carattere accettabile. In questa maniera sei libero di gestirlo come vuoi.
  • Re: Errore con la pila

    simoorusso ha scritto:


    Ho aggiunto lo spazio ma ora mi va in loop sulla seconda parte, nella funzione pop non diminuisce p->head
    Il problema è che hai confuso le variabili: per terminare il ciclo controlli f ma imposti s a 'n' per falo uscire quando la pila è vuota. Quindi basta correggere così
    
    	do
    	{
    		if (pop(&p, &b) == 1)
    		{
    			printf("la pila è vuota\n");
    			f = 'n';
    		}
    		printf("%d\n", b);
    	}
    	while (f == 's');
    
    Un'altra piccola annotazione: \n viene interpretato dall printf com "a capo" infatti l'output delle tue saranno
    
    continui [s
    ]s
    
    Le soluzioni sono due:
    
    printf("continui [s\\n]");
    
    oppure usare il backslash
    
    printf("continui [s/n]");
    
  • Re: Errore con la pila

    LPs ha scritto:


    Il problema è che hai confuso le variabili: per terminare il ciclo controlli f ma imposti s a 'n' per fatlo uscire quando la pila è vuota. Quindi basta correggere così
    
    	do
    	{
    		if (pop(&p, &b) == 1)
    		{
    			printf("la pila è vuota\n");
    			f = 'n';
    		}
    		printf("%d\n", b);
    	}
    	while (f == 's');
    
    va comunque in loop non decrementa p->head
  • Re: Errore con la pila

    simoorusso ha scritto:


    LPs ha scritto:


    Il problema è che hai confuso le variabili: per terminare il ciclo controlli f ma imposti s a 'n' per fatlo uscire quando la pila è vuota. Quindi basta correggere così
    
    	do
    	{
    		if (pop(&p, &b) == 1)
    		{
    			printf("la pila è vuota\n");
    			f = 'n';
    		}
    		printf("%d\n", b);
    	}
    	while (f == 's');
    
    va comunque in loop non decrementa p->head
    Sinceramente non so cosa intendi.
    Come puoi vedere QUI il codice decrementa tranquillamente head....
Devi accedere o registrarti per scrivere nel forum
9 risposte