Newsgroup: it.comp.lang.c
Titolo: PROBLEMONE CON LA CODA

Ciao a tutti, spero possiate illuminarmi perchè io sto veramente
impazzendo. Allora vi posto il codice e vi spiego il problema:
#include <string.h>
main()
{
  queue q;
  char s[100]="\0",c,TOKEN[]="' '",*p;
  int i=0;
  initcoda(&q);
  while(strcmp("quit",s))
    {
      i=0;
      while(i<100)              /*inizializzo il vettore*/
	{
	  s[i]='\0';
	  i++;
	}
      gets(s);      /*prendo la stringa da tastiera fino a \n */
      p=strtok(s,TOKEN);       /* p punta all'inizio della stringa */
      if(strcmp(p,"enqueue")==0)
	{
	  p=strtok(NULL,TOKEN); /*in questo caso p punta alla parola dopo il
comando */
	  inscoda(p,&q); /* <-- QUI STA IL PROBLEMA !!!!!! */
	}
      if(strcmp("dequeue",s) == 0)    /*elimino il primo elemento della
cosa */
	{
	  if(!empty(&q))
	    {
	      delcoda(&q);
	    }
	}
      if(strcmp("print",s) == 0)      /*stampo il primo elemento della
coda */
	{
	  if(!empty(&q))
	    printf("%s\n",front(&q));
	}
}
Ora, premettendo che tutte le funzioni che implemento sono
supermegaiper collaudate , il probema è questo : una volta inserita da
tastiera la stringa "enqueue ciao", la parola ciao viene correttamente
inserita nella coda (l'ho visto con ddd), ora viene il bello : quando
il vettore riviene inizializzato per pulirlo e per andarci ad inserire
un nuovo comando , automaticamente anche il valore che sta dentro la
coda scompare, vendendo sostituito dal nuovo valore che vado ad
inserire. La mia domanda è: dove sbaglio ?
Perchè la stringa non viene memorizzata nella coda e ogni volta che la
stringa viene rinizializzata mi viene cancellata ? La funzione
insercoda funziona perfettamente (è stata copiata dal libro !). VI
PREGO AIUTATEMI !

insercoda funziona perfettamente (č stata copiata dal libro !).
Il fatto che la funzione sia stata copiata dal libro non č condizione
sufficiente a garantire che funzioni...

	}
in:
if (strncmp (s,"enqueue",7) == 0)
   {
   p = strchr (s,' ');
   if (p != NULL)
      inscoda (p+1,&q);
   }

Ok, vi incollo i file dell' implementazione delle funzioni:
#include "libcoda.h"
/*definizione delle funzioni*/
void initcoda (queue *q)
{
  q->cnt=0;
  q->front=NULL;
  q->rear=NULL;
}
data delcoda (queue *q)
{
  data d;
  elem *p;
  if(!empty(q))
    {
      d=q->front->d;
      p=q->front;
      q->front= q->front->next;
      q->cnt--;
      free(p);
      return d;
    }
}
void inscoda(data d, queue *q)
{
  elem *p;
  p=malloc(sizeof(elem));
  assert(p!=NULL);
  p->d=d;
  p->next=NULL;
  if(!empty(q))
    {
      q->rear->next=p;
      q->rear=p;
    }
  else
    q->front = q->rear =p;
  q->cnt++;
}
data front(const queue *q)
{
  if(!empty(q))
    return (q->front->d);
}
boolean empty(const queue *q)
{
  return ((boolean)(q->cnt==EMPTY));
}
void printcoda(queue *q)
{
  elem* pelem;
  if(!empty(q))
   {
     pelem = q->front;
     while(pelem!= NULL)
       {
	 printf("%d ",pelem->d);
	 pelem = pelem->next;
       }
   }
}
Il file .h naturalmente contiene solo i prototipi delle funzioni,
quidni credo sia di scarso interesse, ad ogni modo ve lo incollo di
seguito. Spero che possiate aiutarmi....
#ifndef libcoda_h
#define libcoda_h
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#define EMPTY 0
typedef char*  data;  /*definisco il tipo data--->da cambiare in caso
di necessita'*/
typedef enum {false,true} boolean;
struct elem
{
  data d;
  struct elem *next;
};
typedef struct elem elem;
struct queue
{
  int cnt;        /*contatore*/
  elem  *front;  /*puntatore alla testa*/
  elem  *rear;   /*puntatore alla coda*/
};
typedef struct queue queue;
/*prototipi delle funzioni*/
void initcoda(queue *q);
void inscoda(data d, queue *q);
data delcoda(queue *q);
data front(const queue *q);  /*estrae il dato contenuto in testa*/
boolean empty(const queue *q);
void printcoda(queue *q);
#endif



Nessuno che può aiutarmi ?

  p->d=d;
dove viene memorizzato il puntatore alla stringa e NON la
stringa. La gestione della coda funzionava fino a che data era un
int o un double, ma l'errore e' stato quello di usare un char*.
Adatta TUTTO questo .h in modo che venga memorizzata la stringa e
non il puntatore che arriva dal tuo main, che cambia in
continuazione. A esempio:
p->d = malloc (strlen (d)+1);
strcpy (p->d,d);
con l'adeguata free in delcoda(), etc...

Ok, ora provo a fare le modifiche ! Grazie mille! Una domanda: in
fdelcoda, devo aggiungere la stringa free(p->d) ?

in fdelcoda, devo aggiungere la stringa free(p->d) ?
Si'.