View Full Version : [C]Come passare la struct ad una funzione
Salve ragazzi ho un problema con l'uso dello struct in quanto sono alle prime armi.
siccome vorrei creare per esercizio un programmino di gestione della libreria,ho pensato di implementare tutto nello struct e poi di usare le funzioni
per trattare i dati.
un frammento di codice è questo precisanto che libreria[] è un array di struct che contiene libri
typedef struct libri {
char n_libro[MAX];
char n_autore[MAX];
int prezzo;
} Biblio;
void ins_dati (int i,int riemp,Biblio libreria[]);
in pratica il mio problema attuale sta nel passare i dati alla funzione al momento della chiamata...come posso fare?
grazie in anticipo per le risposte...
wingman87
08-01-2010, 16:38
Forse non ho capito bene il problema. Se nella funzione chiamante hai un array, chiamiamolo arr, puoi passarlo alla funzione che hai scritto semplicemente passando arr (senza [], & e amenità varie)
in pratica quando ho un array di int o char ecc.. vado tranquillo inserendo nell'intestazione della funzione void esemp (int vett[]){
...}
e nel main scrivo
esemp (vett);
il problema si presenta quando utilizzo il typedef e dichiaro nel main un array di struct
int main () {
Biblio libreria[MAX];
...
quindi quando vado a dire alla funzione che deve prendere un array di struct, mi da errore poiché scrivo void esempio (int riemp, biblio libreria []){
//corpo della funzione
}
ovviamente il programma mi dice che non riconosce biblio ("syntax error") in quanto non è un tipo predefinito ma un alias.
Quindi come posso far capire al programma che deve prendere l'array di struct :confused:
ho scritto velocemente :doh: , nel programma sta scritto bene :rolleyes:
wingman87
08-01-2010, 22:52
Probabilmente o hai sbagliato a scrivere qualcosa oppure hai sbagliato l'ordine delle dichiarazioni (magari hai messo la definizione della struttura dopo l'intestazione della funzione).
Ti posto un esempio che compila:
#include<stdio.h>
#define MAX 100
typedef struct libri {
char n_libro[MAX];
char n_autore[MAX];
int prezzo;
} Biblio;
void ins_dati (int i,int riemp,Biblio libreria[]);
int main(char **argv, int argc){
Biblio vett[100];
ins_dati(1,1,vett);
return 0;
}
void ins_dati (int i,int riemp,Biblio libreria[]){
}
Probabilmente o hai sbagliato a scrivere qualcosa oppure hai sbagliato l'ordine delle dichiarazioni (magari hai messo la definizione della struttura dopo l'intestazione della funzione).
Ti posto un esempio che compila:
#include<stdio.h>
#define MAX 100
typedef struct libri {
char n_libro[MAX];
char n_autore[MAX];
int prezzo;
} Biblio;
void ins_dati (int i,int riemp,Biblio libreria[]);
int main(char **argv, int argc){
Biblio vett[100];
ins_dati(1,1,vett);
return 0;
}
void ins_dati (int i,int riemp,Biblio libreria[]){
}
allora forse ho capito l'errore: tu hai messo int main(char **argv, int argc)
che è l'unica cosa che non c'è nel mio programma.
(p.s. le funzioni si trovano nelle posizioni sono giuste)
Cosa significano quelle scritte? e quando si mettono?
grazie mille per la risposta :)
SerMagnus
09-01-2010, 18:51
perdonatemi è vero che sono un po' arruginito con il c, ma se l'intento è quello di popolare un array di struct (Biblioteca) per fa si che la variabile a fine funzione contenga i valori elaborati da ins_dati non è necessario passarla per riferimento?
SerMagnus
09-01-2010, 19:00
avrò letto troppo di fretta :D
wingman87
09-01-2010, 19:12
allora forse ho capito l'errore: tu hai messo int main(char **argv, int argc)
che è l'unica cosa che non c'è nel mio programma.
(p.s. le funzioni si trovano nelle posizioni sono giuste)
Cosa significano quelle scritte? e quando si mettono?
grazie mille per la risposta :)
Strano, come ha detto Antonio23 quel codice non c'entra nulla. Se puoi posta il codice completo così vediamo direttamente dov'è l'errore.
Allora, adesso vi posto l'intero progetto.
header:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 200
typedef struct libri {
char n_libro[MAX];
char n_autore[MAX];
int prezzo;
} Biblio;
void ins_dati (int i,int riemp,Biblio libreria[]);
void lett_dati (int i,int riemp,Biblio libreria[]);
main:
#include "header.h"
int main () {
Biblio libreria[MAX]; //genero la tabella facendo un'array di strutture
int i,riemp;
//intestazione
printf("Programma gestione Libri della biblioteca\n\n");
ins_dati (i,riemp,libreria);
lett_dati ( i, riemp, libreria);
system("pause");
return 0;
}
funzioni:
//inserimento dati
void ins_dati (int i, int riemp, Biblio libreria []){
printf("\nIndicare il numero di dati da aggiungere: ");
scanf("%d",&riemp);
for(i=0;i<riemp;i++){
printf("\nIn pos %d inserire il titolo del libro: ",i+1);
scanf("%s", &libreria[i].n_libro);
printf("\nIn pos %d inserire il nome dell'autore: ",i+1);
scanf("%s", &libreria[i].n_autore);
printf("\nIn pos %d inserire il prezzo del libro: ",i+1);
scanf("%d", &libreria[i].prezzo);
}
}
//lettura a video dei dati
void lett_dati (int i,int riemp, Biblio libreria []){
for(i=0;i<riemp;i++){
printf("\nIn pos %d, il titolo del libro e': %s ",i+1,libreria[i].n_libro);
printf("\nIn pos %d, il nome dell'autore e': %s",i+1,libreria[i].n_autore);
printf("\nIn pos %d, il prezzo del libro e': %d\n",i+1,libreria[i].prezzo);
}
}
Nel programma che hai postato ci sono diversi errori di concetto. Conviene che prima capisci bene la differenza tra il passare variabili per valore e per riferimento. Se tu definisci una funzione in questa maniera:
void ins_dati (int i,int riemp,Biblio libreria[]);
stai passando i e riemp per valore. Questo significa che all'interno della funzione ins_dati le variabili i e riemp sono solo delle copie di quelle che sono nel main, il cui valore non viene affatto modificato ad ins_dati. Quindi, in particolare, la variabile riemp non è valorizzata quando chiami la funzione lett_dati.
wingman87
10-01-2010, 01:04
Oltre agli errori concettuali segnalati da Torav aggiungo che il file in cui hai inserito le funzioni non conosce la struttura Biblio perché non hai incluso l'header. Per questo ottieni un errore in compilazione
Oltre agli errori concettuali segnalati da Torav aggiungo che il file in cui hai inserito le funzioni non conosce la struttura Biblio perché non hai incluso l'header. Per questo ottieni un errore in compilazione
ah ecco :D
grazie mille ad entrambi! :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.