Problema con utilizzo dell'operatore freccia

di il
4 risposte

Problema con utilizzo dell'operatore freccia

Salve ragazzi,come da titolo ho un problema con l'utilizzo di questo operatore.

Sto provando a svolgere un semplice esercizio che mi calcola il minimo tra i valori di una coda.
La coda è così definita

struct node{
	item value;
	struct node *next;
};

struct c_queue{
	struct node *head,*tail;
	int numel;
};

In queue.c e

typedef struct c_queue *queue;
in queue.h

Allora ho provato ad accedere ad una funzione min, che qui non riporto,facendo q->head->value e mi dava errore di segmentazione.
Ho provato poi a fare q->numel, e mi stampa correttamente il numero di elementi.

Se provo però questa istruzione nel main non funziona,cioè non mi sembra una cosa logica.


Il main è questo



#include <stdio.h>
#include <stdlib.h>

#include "item.h"
#include "queue.h"


int main()
{

queue my_queue;
int i,v;
item x;


//creo una nuova coda e inserisco i valori tramite il ciclo for
my_queue = newQueue();

for(i=0; i<5; i++)
	{
		printf("\nInserisci valore:  ");
		scanf("%d",&x);
	
		enqueue(x,my_queue);		
	}

print_queue(my_queue);
v = my_queue->numel;

printf("\n%d\n\n",v);


printf("\nIl minimo e' %d\n\n",min(my_queue));

return 0;

}


v = my_queue->numel; è l'errore che non viene risolto nemmeno mettendo parentesi o altro.

Grazie per l'aiuto

4 Risposte

  • Re: Problema con utilizzo dell'operatore freccia

    Non c'è tutto il codice che serve per provare ...
  • Re: Problema con utilizzo dell'operatore freccia

    FUNZIONE MAIN
    
    
    //FILE MAIN.C
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "item.h"
    #include "queue.h"
    
    
    int main()
    {
    
    queue my_queue;
    int i,v;
    item x;
    
    
    //creo una nuova coda e inserisco i valori tramite il ciclo for
    my_queue = newQueue();
    
    for(i=0; i<5; i++)
    	{
    		printf("\nInserisci valore:  ");
    		scanf("%d",&x);
    	
    		enqueue(x,my_queue);		
    	}
    print_queue(my_queue);
    v = my_queue->numel;
    
    printf("\n%d\n\n",v);
    
    
    printf("\nIl minimo e' %d\n\n",min(my_queue));
    
    return 0;
    
    }
    
    FILE QUEUE.C
    
    
    
    //FILE QUEUE.C
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "item.h"
    #include "queue.h"
    
    struct node{
    	item value;
    	struct node *next;
    };
    
    struct c_queue{
    	struct node *head,*tail;
    	int numel;
    };
    
    
    //------------------------------------------------
    queue newQueue(void)
    {
    	struct c_queue *q;
    	
    	q = malloc(sizeof(struct c_queue));
    	
    	if(q == NULL)
    		return NULL;
    
    	q->numel = 0;
    	q->head = NULL;
    	q->tail = NULL;
    	
    	return q;
    }
    
    //--------------------------------------------------
    int emptyQueue(queue q)
    {
    	if(q == NULL)
    		return -1;
    	return q->numel == 0;
     
    }
    
    //--------------------------------------------------
    
    int enqueue(item val,queue q)
    {
    
    	if(q == NULL)
    		return -1;
    
    	struct node *nuovo;
    	
    	nuovo = malloc(sizeof(struct node));
    
    	if(nuovo == NULL)
    		return 0;
    
    	nuovo->value = val;
    	nuovo->next = NULL;
    
    	if(q->head == NULL)
    		q->head = nuovo;
    	else
    		q->tail->next = nuovo;
    
    	q->tail = nuovo;
    	(q->numel)++;
    	
    	return 1;
    
    }
    
    
    //-----------------------------------------------------
    
    
    item dequeue(queue q)
    {
    	if(q == NULL || q->numel == 0)
    		return NULLITEM;	
    
    	item result;
    	struct node *temp;
    	temp = q->head;
    	result = temp->value;
    	q->head = q->head->next;
    	free(temp);
    	(q->numel)--;
    
    	return result;
    }
    
    
    //------------------------------------------------------
    
    
    void print_queue(queue q)
    {
    	
    	if(q == NULL)
    		return;
    	
    	while(q->head != NULL)
    		{
    			printf("%d  ",q->head->value);
    			q->head = q->head->next;	
    		}
    	
    
    
    }
    
    //-----------------------------------------------------
    
    item min(queue q)
    {
    
    	if(q == NULL)
    		return NULLITEM;
    	printf("\n\n%d\n\n",q->numel);
    	
    		
    	item min = q->head->value;
    	
    	q->head = (q->head)->next;
    	printf("\n\n%d\n\n",(q->head)->value); //serve soltanto per prova
    	
    		
    	while(q->head!= NULL)
    		{
    			if(min > q->head->value)
    				min = q->head->value;	
    		
    		}	
    
    	
    return min;
    
    }
    
    
    
    
    //-----------------------------------------------------
    
    
    
    
    //FILE QUEUE.H
    
    typedef struct c_queue *queue;
    
    //PROTOTIPI
    
    queue newQueue(void);
    int emptyQueue(queue q);
    item dequeue(queue q);
    int enqueue(item val,queue q);
    
    //Operatori aggiuntivi
    
    void print_queue(queue q);
    item min(queue q);
    
    

    ITEM.H
    
    typedef int item;
    
    #define NULLITEM 0
    
    
    int eq(item x,item y);
    void input_item(item *x);
    void output_item(item x);
    

    ITEM.C
    
    
    
    //FILE ITEM.C
    
    #include <stdio.h>
    
    #include "item.h"
    
    int eq(item x,item y)
    {
    		return x == y;
    }
    
    void input_item(item *x)
    {
    	scanf("%d",x);
    }
    
    void output_item(item x)
    {
    	printf("%d",x);
    }
    
  • Re: Problema con utilizzo dell'operatore freccia

    Nessuno che mi può aiutare?
  • Re: Problema con utilizzo dell'operatore freccia

    Ho provato il codice, e sinceramente non so nemmeno come a te ti si possa compilare. Non so se il forum ha per sbaglio tolto dalla tua risposta delle parti di codice che usavano le angolari (< >), ogni tanto accade su alcuni siti, perché dal tuo codice manca un casting opportuno quando vai a passare valori di determinate variabili ad altre.

    Nel tuo codice un uso che non da problemi, ma che in altri potrebbe portare ad errori non segnalati dal compilatore, è il non castare esplicitamente il puntatore void* ritornato dalle funzioni malloc al tipo di puntatore che deve essere assegnato nella variabile voluta (e.g. nel metodo "newQueue" manca un cast esplicito al tipo c_queue* quando ritorno un void* da malloc, che sarebbe meglio scrivere). Se al momento stai scrivendo codice in C, ti dovrai limitare a fare il casting tramite parentesi, quindi scritto correttamente: q = (c_queue*) malloc(sizeof(struct c_queue));

    Altri due piccoli consigli prima di passare all'errore menzionato da te: mi ha confuso molto (e sicuramente confonderà te in futuro nel caso andassi a rileggere il codice dopo molto tempo) il fatto che hai definito un puntatore a "c_queue" con il nome "queue", usandolo per esempio come valore di ritorno della funzione newQueue. Ovviamente non hai fatto nulla di sbagliato/erroneo a livello di codice, però se devi ritornare un puntatore a qualcosa, bè, meglio far vedere quella stellina nel tuo codice, è più chiaro e non costringi te e altri programmatori a vedere ogni volta la definizione delle struct che usano.
    Poi un problema che forse ancora non hai avuto modo di entrarci in contatto e che nel tuo codice non risulta in problemi( ma che un giorno sicuramente ti affliggerà se non correggi subito): nei tuoi file header (.h) non usi niente per prevenire la duplicazione del codice del file.
    Per vedere come risolvere il problema ecco qui un link: http://stackoverflow.com/questions/1653958/why-are-ifndef-and-define-used-in-c-header-files (se il tuo compilatore te lo permette, sarebbe ancora meglio usare all'inizio del file header #pragma once, che fa le stesse cose ma in automatico).

    Infine, la soluzione dell'operatore freccia: basta semplicemente che sposti le definizioni di c_queue e node dal file .c al file .h . Dovresti sempre mettere le definizioni delle struct all'interno del file .h se poi quelle struct verranno usate all'esterno del file stesso.

    Spero di esserti stato utile.

    (P.s. consiglio per tuoi futuri thread, per far sì che le persone non chiudano subito la tua domanda: oltre a come già detto da un altro utente dovresti mettere tutto il codice necessario che possa riguardare il problema, e dovresti scrivere anche che problemi ti da. Il tuo primo problema lo hai descritto, hai detto che c'era una segmentation fault, ma nel secondo (quello menzionato alla fine) non hai detto che errore ti dava: pensa a noi poveri lettori che ci troviamo di fronte a una domanda simile a "hey meccanico, quella parte della macchina non va, me la puoi aggiustare?". Sii il più completo e esaustivo possibile)
Devi accedere o registrarti per scrivere nel forum
4 risposte