C liste sequenziali, mancata compilazione [RISOLTO]

di il
3 risposte

C liste sequenziali, mancata compilazione [RISOLTO]


#include <stdio.h>
#include <stdlib.h>
typedef enum{true=1,false=0} bool; // creo il tipo booleano


struct list{      // ho dichiarato la struttura della lista sequenziale
	float *buffer;
	int size;
	int head;
	int tail;
};

void init(struct list*, int);
bool ins_testa(struct list *,float);
void visit (struct list*);

int main(void) {

	int size; // con questo decido il numero degli elementi dell'array circolare, buffer
	float valore;
	struct list *ptr;
    ptr=NULL;
    bool found;
    found=false;
	printf("Inserisci manualmente size dell'array\n\n");
	scanf("%d",&size);

    printf("adesso inseriamo un po' di dati\n");
	scanf("%f",&valore);
    init(ptr,size);

    ins_testa(ptr,valore);   // ho un problema, mi esce in automatico....

    if(found==true)
    	printf("valore inserito con successo\n\n");
    else
    	printf("non è stato possibile inserire altri valori");

    visit(ptr);

	return EXIT_SUCCESS;
}

void init(struct list* ptr, int size){

    ptr->buffer=(float *)malloc(size*sizeof(float));
	ptr->size=size;
	ptr->head=0;
	ptr->tail=0;
}

bool ins_testa(struct list *ptr,float value){
	bool found;
	if(((ptr->tail+1)%ptr->size)!=ptr->head)
	          {
		       ptr->head=(ptr->head+ptr->size-1)%ptr->size;
		       ptr->buffer[ptr->head]=value;
		       found=true;
	        }
	else
		found=false;
	return found;
}

void visit (struct list*ptr){
	int position;
	for(position=ptr->head;position!=ptr->tail;position=(position+1)%ptr->size)
		printf("%f",ptr->buffer[position]);

}
Buongiorno stavo implementando il codice per una lista sequenziale, buffer circolare.

Prima di implementare completamente il codice, stavo facendo delle prove, purtroppo quando arriva alla parte dove richiamo la funzione di inizializzazione , ide (sia code block, che eclipse) mi da generico errore e non mi permette di continuare.

A mio avviso il problema dipende proprio da qua:

......................
 init(ptr,size);
 .............
 
ho fatto varie prove ed il codice si blocca proprio qua.... ho inoltre provato ad inizializzare senza richiamare la funzione, quindi :
ptr->buffer=(float *)malloc(size*sizeof(float));
	ptr->size=size;
	ptr->head=0;
	ptr->tail=0;
ma mi continua ad uscire dall'ide, quindi non mi fa completare .
Credo che quindi dipenda dall'inizializzazione sbagliata, in verità a livello teorico l'inizializzazione dovrebbe essere corretta.

Forse mi perdo qualcosa.....

3 Risposte

  • Re: C liste sequenziali, mancata compilazione [RISOLTO]

    Nel tuo esercizio non mi è chiara una cosa su tante: a che ti serve "buffer"? La lista sequenziale è "list" o "buffer"? Perché usi "list", se poi non lo usi come lista?
    Poi: la "struct lista *ptr" è a NULL, se non fai una allocazione di memoria anche per questa parte, la
    ptr->buffer=(float *)malloc(size*sizeof(float));
    darà un errore.
    Ci sono poi altre cose, ma secondo me si tratta di capire cosa stai cercando di fare, perché più che una lista sequenziale, la tua "cosa" è un vettore di float... nel quale l'inserimento in testa, ad esempio dovrebbe comportare lo scorrimento degli elementi (che non mi sembrano nemmeno collegati tra loro).
  • Re: C liste sequenziali, mancata compilazione [RISOLTO]

    Ciao.
    nella funzione init, hai provato a passare la referenza a ptr invece di passare direttamente il puntatore?
  • Re: C liste sequenziali, mancata compilazione [RISOLTO]

    Molto bene grazie mille.


    Ho risolto in questa maniera:
    
    ptr=NULL;
        ptr=(struct list *)malloc(sizeof(struct list));
        
    in effetti ptr è un puntatore a struct list che viene inizializzato a NULL.
    Passando questo puntatore alla funzione init e provando ad impostare un membro della struct puntata per farla puntare alla memoria allocata da malloc.
    Dato che ptr è appunto NULL il programma giustamente si arresta sul malloc.

    Inoltre questo è a tutti gli effetti una lista sequenziale.

    Differente dalla lista collegata, che può essere implementata in due modi , o tramite puntatori o tramite array con indici, da teoria!

    La lista sequenziale si comporta come un buffer, array circolare, dove inserimento o cancellazione in testa o coda che sia, comporta uno slittamento in avanti o indietro a seconda di ciò che stò eseguendo. Ad esempio inserimento in testa, comporterà un traslamento indietro del mio puntatore alla testa, e viceversa.
Devi accedere o registrarti per scrivere nel forum
3 risposte