Passaggio Struct a funzione!

di il
4 risposte

Passaggio Struct a funzione!

Ciao a tutti, sto provando a passare una struct ad una funzione ch fa inserire le varie variabili della struct e poi mi ritorna e con un'altra funzione stampo la struct.
Solo che ho il problema dei puntatori. C'è qualcuno che avrebbe le grazie di spiegarmi come devo fare?
Il concetto di passaggio per indirizzo e passaggio per valore ce l'ho, però non riesco ad applicarlo
Grazie a tutti!!!!!

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

	typedef struct list_book
{   
	char name [50];
	char title [50];
	int year;
	int lent; /*Prestito*/
}number;

void fillStruct(struct list_book *book)
{
    printf("Inserire nome autore: \n");
	scanf("%s", book->name);
	printf("Inserire titolo del libro: \n");
	scanf("%s", book->title);
	printf("Inserire anno pubblicazione: \n");
	scanf("%i", book->year);
	
}

void print(struct list_book *book)
{
	printf("%s, %s, %i, %i", book->name, book->title, book->year, book->lent);
}

int main()
{	
	number book;
	
	int choose = -1;
	printf("scegli: ");
	scanf ("%i", choose);
	if (choose == 1)
	{
		fillStruct(&book);
		print(&book);
	}
	return 0;
}

4 Risposte

  • Re: Passaggio Struct a funzione!

    I puntatori li hai usato bene,hai solo sbagliato nell'utilizzo della scanf:
    
    scanf("%i", book->year);
    ...
    scanf ("%i", choose);
    
    devi scrivere:
    
    scanf("%d", &book->year);
    ...
    scanf ("%d", &choose);
    
    Per semplificare la scrittura del codice spesso la definizione per le struct avviene cosi:
    
    typedef struct _list_book
    {
       char name [50];
       char title [50];
       int year;
       int lent;
     }list_book;
    
    e quindi nel codice diventerà:
    
    void fillStruct(list_book *book)
    ...
    ...
    void print(list_book *book)
    ...
    ...
    list_book book;
    
  • Re: Passaggio Struct a funzione!

    Ok ho visto e funziona, solo non ho capito l'ultima parte che intendi con
    void fillStruct(list_book *book)
    ...
    ...
    void print(list_book *book)
    ...
    ...
    list_book book;
    Questo list book book alla fine che centra

    Comunque riposto il codice ben scritto senza if
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    	typedef struct list_book
    {   
    	char name [50];
    	char title [50];
    	int year;
    	int price;
    	int lent; /*Prestito*/
    
    }number;
    
    void fillStruct(struct list_book *book)
    {
        printf("Inserire nome autore: \n");
    	scanf("%s", book->name);
    	printf("Inserire titolo (int): \n");
    	scanf("%s", book->title);
    	printf("Inserire anno: \n");
    	scanf("%i", &book->year);
    	printf("Inserire prezzo: \n");
    	scanf("%i", &book->price);
    	printf("Inserire prestito: \n");
    	scanf("%i", &book->lent);
    }
    
    void print(struct list_book *book)
    {
    	printf("%s, %s, %i, %i, %i", book->name, book->title, book->year, book->price, book->lent);
    }
    
    int main()
    {	
    	number book;
    	fillStruct(&book);
    	print(&book);
    	return 0;
    }
    E potresti spiegarmi perchè devo usare un puntatore negli int? e non nelle char?
  • Re: Passaggio Struct a funzione!

    In realtà il typedef l'avevi già fatto, e la tua struct list_book puoi chiamarla number. Quel "list_book book" è la dichiarazione di variabile, come hai fatto tu: "number book"


    Sent from my iPhone using Tapatalk - now Free
  • Re: Passaggio Struct a funzione!

    Ti spiego al volo il metodo "typedef":_
    typedef [tipo] [nuovotipo]
    quindi se io dichiaro
    typedef int intero
    vorrà dire che intero è come int.
    Dunque se io scrivo
    typedef struct mystruct {.....} miastruttura
    significa che miastruttura è struct mystruct.

    Questo semplifica anche molto la programmazione e velocizza la scrittura.
    Volendo puoi non modificare il nome come ho fatto io e modificare con number al posto di struct list_book.Solo semplicità di lettura e scrittura o buona programmazione.

    Veramente usi il puntatore nella char, o meglio tu non hai char ma un vettore di char,che soddisfa le prerogative di un puntatore e quindi lo puoi passare senza usare il riferimento,che altrimenti avresti dovuto scrivere:
    scanf("%s",&book->title[0]);
    invece scrivi
    scanf("%s",book->title);
    proprio perchè il c vede un vettore come se fosse un puntatore a dati contigui.
    se avevi invece un semplice carattere char allora avresti dovuto passarlo tramite indirizzo:
    
    char charval;
    scanf("%c",&charval);
    
Devi accedere o registrarti per scrivere nel forum
4 risposte