View Full Version : [C] richiamo di struttura in una funzione
Peppe 93
13-04-2013, 10:59
allora io ho uno struct che ho precedentemente riempito in una funzione esterna al main e lo voglio richiamare in un'altra funzione esterna per effettuare operazioni
struct nome{
char nome[50];
char cognome[50];
int eta;
}t_nome;
vorrei sapere come devo richiamare lo struct riempito nella funzione secondaria
The_ouroboros
13-04-2013, 11:10
passaggio per parametro
Peppe 93
13-04-2013, 11:27
sintatticamente come dovrebbe essere??
funzione (struct nome t_nome)
main(){
...
funzione(struct nome t_nome)
...
}
così?
o devo richiamare la funzione con cui l'ho riempito?
lorenzo001
13-04-2013, 12:50
funzione (struct nome *t_nome)
e
funzione(&t_nome)
Peppe 93
13-04-2013, 13:13
funzione (struct nome *t_nome)
e
funzione(&t_nome)
anche se lo struct l'ho riempito con un'altra funzione?
The_ouroboros
13-04-2013, 13:16
per valore, riferimento o puntatore... ma "per parametro"?
volevo dire come parametro della funzione :doh:
Peppe 93
13-04-2013, 13:24
allora ho riempito lo struct con una funzione esterna al main, sempre con una funzione esterna al main voglio lavorare con quei dati, per esempio stamparli, il problema è che mi stampa caratteri spaciali, questo (a mio parere) perchè non chiamo correttamente lo struct nella funzione, dovendolo allocare come dovrei fare?? e per poi richiamarlo (contenente i dati)?
Peppe 93
13-04-2013, 15:42
quindi se il mio struct si chiama invitato dovrebbe essere così:
struct invitato{
...
};
main(){
struct invitato t_inv[n];
....
funzione(&t_inv);
}
funzione(struct invitato *t_inv){
....
}
sbaglio??
se non sbaglio con la dichiarazione "struct invitato t_inv[n]" dichiaro un puntatore allo struct no??
Peppe 93
13-04-2013, 16:06
il mio codice è strutturato in modo che l'utente decide il numero di invitati e la funzione che riempie lo struct lo fa con cicli, nella seconda funzione invece deve solo stampare i nomi e chiedere un coefficiente...come mi consigli di comportarmi?
nonostante le modifiche il programma continua a stampare caratteri speciali..
p.s. le funzioni lavorano perfettamente perchè prima il codice era tutto dentro il main ma per semplicità ho preferito dividerle e spostarle
Peppe 93
13-04-2013, 17:58
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
struct invitato
{
char cognome[25];
char nome[25];
int eta;
char sesso;
char tipo_invitato[10];
};
int i, m, n, j,k;
int dati_inv(struct invitato *t_inv){
printf("inserisci numero invitati\n");
scanf("%i", &n);
printf("inserisci dati invitato\n");
char null;
for (i=0; i<n; i++){
printf("inserisci cognome invitato n.%i\t\t\t\t\tp\n ",i+1);
scanf("%s", &t_inv[i].cognome);
printf("inserisci nome invitato n.%i\t\t\t\t\te\n ",i+1);
scanf("%s", &t_inv[i].nome);
printf("inserisci eta' invitato n.%i\t\t\t\t\tp\n ",i+1);
scanf("%i", &t_inv[i].eta);
scanf("%c", &null);
printf("inserisci sesso invitato n.%i (m/f)\t\t\t\tp\n",i+1);
scanf("%c", &t_inv[i].sesso);
printf("inserisci tipo di invito (amico/parente) invitato n.%i\t\te\n",i+1);
scanf("%s", &t_inv[i].tipo_invitato);
}
printf("questo e' l'elenco degli invitati\n");
printf("Numero|Cognome|Nome|Eta'|Sesso|Tipo Invitato\n");
for (i=0; i<n; i++){
printf("n.%i |%s|%s|%i|%c|%s\n",i+1, t_inv[i].cognome, t_inv[i].nome, t_inv[i].eta, t_inv[i].sesso, t_inv[i].tipo_invitato);
}
}
int simpatia( struct invitato *t_inv){
printf(" bene adesso passiamo alla simpatia, inserire per ogni persona un valore\n"
" (anche decimale) compreso tra -1 e +1, in cui -1 rappresenta antipatia,\n"
" 0 se non si conosce il soggetto e +1 se si prova simpatia per il soggetto.\n");
float simpatia[n][n];
for (i=0; i<n; i++){
for (j=0; j<n; j++){
if (*t_inv[i].cognome==*t_inv[j].cognome)
{
simpatia[i][j]=5;
}
printf("invitato %c %c esprimi simpatia per %c %c\n", *t_inv[i].cognome, *t_inv[i].nome, *t_inv[j].cognome, *t_inv[j].nome);
scanf("%f", &simpatia[i][j]);
}
}
for (i=0; i<n; i++){
for (j=0; j<n; j++){
if (simpatia[i][j]<=1 && simpatia[i][j]>=-1)
printf ("il coefficiente di %s %s verso %s %s e' %.2f\n",t_inv[i].cognome, t_inv[i].nome, t_inv[j].cognome, t_inv[j].nome, simpatia[i][j]);
}
}
}
int main(){
int primo;
int primo2;
struct invitato t_inv[n];
dati_inv(&(t_inv[i]));
printf("desideri inserire i dati sulla simpatia?\n0->si;\n1->no\n");
scanf("%i", &primo2);
if (primo2==0)
simpatia(&(t_inv[i]));
else
printf("programma terminato\n");
system("PAUSE");
return 0;
}
questo è il codice
Peppe 93
13-04-2013, 18:06
veramente era identato ma l'ho dovuta togliere perchè andava troppo oltre nei tag del codice
Peppe 93
13-04-2013, 18:33
mi sembra strano... :mbe:
in orizzontale intendo si doveva scorrere troppo per leggere il codice...comunque quando erano dentro il main funzionavano perfettamente
un'altra cosa. tu leggi n dentro una funzione. ora non mi ricordo il C99 cosa garantisce, ma credo che il valore di n, se nel main dichiari un array di n struct invitato, debba essere noto al momento della chiamata (ma non sono sicuro al 100% di questo).
ovviamente si, infatti se all'inizio della funzione non chiedo all'utente di inserire n il tutto non parte, ma essendo n variabile globale ho fatto in modo che fosse chiesto al momento dell'inserimento dei dati dell'invitato
Peppe 93
13-04-2013, 23:00
non sono molto confidente sul comportamento del programma fino a quando non vedo il main. inoltre hai rimosso quelle & dalle scanf non necessarie?
il main c'è o_O
Peppe 93
13-04-2013, 23:38
n la chiede come prima domanda allìesecuzione della funzione dati_invitati...
i è usata solo nei cicli for e parte ogni volta da 0...
come li dovrei sistemare??
starfred
14-04-2013, 12:28
No ma scusa un attimo, questa parte quì
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
if (*t_inv[i].cognome==*t_inv[j].cognome)
{
simpatia[i][j]=5;
}
printf("invitato %c %c esprimi simpatia per %c %c\n", *t_inv[i].cognome, *t_inv[i].nome, *t_inv[j].cognome, *t_inv[j].nome);
scanf("%f", &simpatia[i][j]);
}
}
Cos'è che dovrebbe fare? In particolar modo quell' if li mi spaventa molto... :D
Peppe 93
14-04-2013, 12:47
quell'if faceva parte del programma quando era in c++, mi sono dimenticato di toglierlo:stordita: , naturalmente quegli "*" non ricordo perchè sono lì ma nn c'entrano nulla
tra le altre cose nel C non è consentito fare il confronto tra stringhe, si deve usare il strcmp...se io voglio fare un confronto tra 2 array di interi o float, come devo fare??
(in particolare devo confrontare i 2 array appena un elemento è uguale ad uno dell'altro array effettuare un ordine)
Teardrop92
14-04-2013, 16:03
Per confrontare 2 vettori una cosa del genere dovrebbe andar bene :)
#include <stdio.h>
#define A 4
int main()
{
int a[A];
int b[A];
int i,count;
printf("Inserisci il primo vettore:\n");
for(i=0;i<A;i++)
{
printf("Inserisci l'elemento %d: ",(i+1));
scanf("%d",&a[i]);
}
printf("Inserisci il secondo vettore:\n");
for(i=0;i<A;i++)
{
printf("Inserisci l'elemento %d: ",(i+1));
scanf("%d",&b[i]);
}
count=0;
for(i=0;i<A;i++)
if(a[i]==b[i])
count++;
if(count==(A))
printf("I 2 vettori inseriti sono uguali\n");
else
printf("I 2 vettori inseriti sono diversi\n");
return 0;
}
Peppe 93
14-04-2013, 16:51
Per confrontare 2 vettori una cosa del genere dovrebbe andar bene :)
#include <stdio.h>
#define A 4
int main()
{
int a[A];
int b[A];
int i,count;
printf("Inserisci il primo vettore:\n");
for(i=0;i<A;i++)
{
printf("Inserisci l'elemento %d: ",(i+1));
scanf("%d",&a[i]);
}
printf("Inserisci il secondo vettore:\n");
for(i=0;i<A;i++)
{
printf("Inserisci l'elemento %d: ",(i+1));
scanf("%d",&b[i]);
}
count=0;
for(i=0;i<A;i++)
if(a[i]==b[i])
count++;
if(count==(A))
printf("I 2 vettori inseriti sono uguali\n");
else
printf("I 2 vettori inseriti sono diversi\n");
return 0;
}
sono riuscito a farlo da solo questo punto grazie :D
il problema adesso è che devo riprodurre questa if che in c++ funziona perfettamente in C
if(t_inv[i].cognome==t_inv[j].cognome)
so che la funzione strcmp si può usare quando gli array sono di tipo char* quindi come li posso confrontare??
Peppe 93
14-04-2013, 19:30
ho fatto già quello che mi avevi consigliatoXD ho spostato la richiesta di n dentro il main e tolto le variabili globali passando quelle necessarie nelle funzioni dal main..
p.s. nella funzione dei dati degli invitati c'è un errore per cui quando vado a scrivere i dati dell'invitato va in crash al 2 ciclo dopo aver chiesto il nome...però è strano perchè funzionava perfettamente fino a stamattina
Teardrop92
14-04-2013, 19:56
Fammi capire...
Tu vuoi confrontare l'i-esima e la j-esima stringa( o array di caratteri insomma)?
Peppe 93
14-04-2013, 19:58
Fammi capire...
Tu vuoi confrontare l'i-esima e la j-esima stringa( o array di caratteri insomma)?
ci sono n struct...io devo confrontare tra loro, o con un array esterno, il campo cognome ad esempio e vedere se sono uguali
Teardrop92
14-04-2013, 20:08
Ed una roba tipo tipo:
if( strcmp(t_inv[i].cognome,t_inv[j].cognome)== 0 )
come mai non funge?
Peppe 93
14-04-2013, 20:22
Ed una roba tipo tipo:
if( strcmp(t_inv[i].cognome,t_inv[j].cognome)== 0 )
come mai non funge?
non lo so stamattina non funzionava adesso si...ma non ho provato a eseguirlo in quanto si blocca nell'acquisizione dei dati nel ciclo for
Teardrop92
14-04-2013, 20:26
Se metti tutto il codice con un esempio di cosa dovrebbe fare a questo punto si può provare a dare uno sguardo ( dopo cena :D )
Peppe 93
14-04-2013, 20:32
vai nella prima pagina e c'è il codice...la parte dell'errore è la funzione dati_inv...(dopo cena:D )
Teardrop92
14-04-2013, 21:47
Sino alla funzione simpatia sembra andare tutto bene però sembra che ci sia qualcosa che non funge li...
Puoi spiegare qui con un esempio cosa deve fare? :)
Peppe 93
14-04-2013, 21:59
Sino alla funzione simpatia sembra andare tutto bene però sembra che ci sia qualcosa che non funge li...
Puoi spiegare qui con un esempio cosa deve fare? :)
semplicemente deve prendere i dati per ogni invitato e stamparli (funzione dati_inv)...poi deve fare le combinazioni dei nomi e chiedere un numero compreso tra -1 e 1 per simpatia o antipatia e stampare i coefficienti con annessi nomi e cognomi...
da quel codice è cambiato solo che ho spostato le variabili globali e la scansione del numero di invitati dentro al main, come consigliatomi
ma quando va a prendere i dati mi si blocca al secondo ciclo dopo aver chiesto il nome del 2 invitato
Peppe 93
15-04-2013, 21:39
oggi ho rivisto il programma e le funzioni lavorano bene solo non so perchè se metto 2 invitati i cicli si bloccano e va tutto in crash se metto 3 o più funziona tuttoXD
Peppe 93
15-04-2013, 22:18
molto sbagliatoXD
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.