Passaggio di un vettore di struttura allocato dinamicamente

di Anonimizzato18325 il
6 risposte
Buongiorno,
ho problema con il passaggio di un vettore di una struttura formata da un intero e da un puntore a char. L'esercizio prevede di non definire
la variabile book come una variabile globale ma di provare a definirla nel main e a passarla come argomento alle varie funzioni.
i primi due punti dell'esercizio sono:
1)funzione newBook(n) =>Crea un nuovo registro che permetta la prenotazione di n posti, da 0 a n-1. Se esiste già un registro di
prenotazione, quest’ultimo deve essere cancellato.
2)funzione book(k;name)=> Se il posto k è libero, prenota il posto k per il cliente identificato da name. Altrimenti, stampa un messaggio di errore
alle funzioni si possono aggiungere se necessario altri parametri.. poi ci sono altre tre punti ma io mi sono fermata al punto due
/*Esercizio fine L05*/

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


typedef struct
    {
      int occupato;
      char *nome;
    } _book;

//prototipi di funzione
_book *new_book(int n);
void book(int n, char *nme, _book **b);


int main(void)
{
  _book *b=NULL;
  char c, nome[35];
  int n=0;
	
	while	((c = getchar())!= 'f' )
	{
		switch (c)
			{
				case 'b':	//  b n  -->  newBook(n)		
				  while ((c=getchar())!='\n')
            {
            	if (isdigit(c))
            	  {
            		  n=c-'0';
            		  b=new_book(n);
            		}
            }
					break;
				case '+': //  + k name  --> book(k, name) 
            	scanf("%d %s", &n, nome);
							book(n,nome, &b);
							printf("prova stampa dal main occupato %d e nome %s\n", b[n].occupato,b[n].nome);
					break;
				case '-': // - k --> cancel(k)
					break;
				case 'm': // m from to ---> move from to
					break;
				case 'p': //p ---> printBook()
					break; 
			}
		}	
	free (b);			 
	return 0;
}
//funzioni
_book *new_book(int n)
{	
  _book *libri;
  //alloca un blocco di memoria in grado di contenere n elementi consecutivi
	libri=(_book *)malloc(n*sizeof(_book)); 
	if (libri==NULL)
			printf("Mermoria non suff. n=%d\n", n);
	else
 		printf("Mermoria suff.\n");
 	return libri;
}
//funzione che assegna una prenotazione
void book(int n, char *nme, _book **b)
{
   int size=35;//assumo che il nome sia grande 35 al massimo
   b[n]->occupato=1; //1=prenotato
   b[n]->nome=malloc(size*sizeof(char));
   strcpy(b[n]->nome,nme);
   //controllo se prende i dati 
   printf("prova stampa occupato %d e nome %s\n", b[n]->occupato,b[n]->nome);
}


6 Risposte

  • Nella funzione in cui allochi lo spazio prevedi una sola zona di memoria in cui le strutture sono memorizzate in sequenza ma poi, nel resto del programma, lavori come se ci fosse un vettore di puntatori (che in realtà non hai mai allocato).
  • Passo l'indirizzo della struttura ma quando vado leggere i dati appena salvati ma non mi stampa nulla...se stampo i dati direttamente nella struttura sembra aver salvato tutto ma poi faccio la stessa stampa nel main e nn ho i dati salvati.
  • Come ti dicevo, commetti un errore. In una funzione utilizzi un puntatore che punta a tutte le strutture utilizzate in sequenza, nell'altra pensi di utilizzare un vettore di puntatori. Devi decidere quale strada seguire in tutto il programma.

    S0...S1...S2...S3

    oppure

    P0 -> S0
    ..
    P1 -> S1
    ..
    P2 -> S2
  • In pratica

    passa solamente b e non &b con l'argomento semplice puntatore e non doppio puntatore

    utilizza il . e non il ->

    b[n].occupato=1; //1=prenotato
  • Grazie della risposta provo subito
  • Funziona grazie mille...ora provo ad andare avanti con le altre funzioni da implementare.
    Se ho problemi scrivo ancora qua così c'è l'esercizio completo e le difficoltà incontrate.
Devi accedere o registrarti per scrivere nel forum
6 risposte