PDA

Visualizza la versione completa : [C] Esercizio: struct e puntatore


nike99
15-02-2011, 00:09
Ciao a tutti sono nuovo del forum e ahim ho qualche problemino con la programmazione in C.
Sto preparando un esame universitario e sto facendo un po' di esercizi.
Mi sono imbattuto in questo tipologia di esercizio che non riesco proprio a risolvere.




Definire un tipo di dato ES, struct con due campi di nome A di tipo int e B di tipo vettore di 100 int. Scrivere una funzione con un parametro x di tipo di tipo ES ed un parametro y di tipo puntatore ad un intero. La funzione deve restituire attraverso y il numero di volte che il valore del campo A di x contenuto nel campo B di x.

Non la prima volta che incontro un problema quando devo verificare se un valore contenuto nei valori di un vettore;in pi se ci si mette anche il puntatore non so pi dov sbattare la testa. :dh:

Quello che ho fatto qu sotto,non dovrebbero esserci errori di sintassi,il programma gira ma non fa quello che dovrebbe.


Spero che possiate darmi una mano
Grazie 1000!!!!!


#include<stdio.h>
#include<stdlib.h>
#define d 5
typedef struct{int A;int B[d];}ES;

int C (ES x,int*y){
int i,trovato;

*y=0;
trovato=0;
for(i=0;i<d;i++)

if(x.A==x.B[i]){

trovato=1;

*y++; }

return *y;
}

int main()
{
ES N; int i,k;
N.A=5;

for(i=0;i<d;i++)

scanf("%d",&N.B[i]);

printf("\n%d",C(N,&k));
printf("\n");
system("pause");
return 0; }

jobv
15-02-2011, 07:13
Ciao,

il problema forse nella precedenza degli operatori: prona (*y)++ al posto di *y++

lolide
15-02-2011, 09:15
Un'altra cosa: la consegna dice "restituire attraverso y"...
Non serve ritornare l'intero, perch modifichi direttamente il puntatore.
Fai restituire void alla funzione.

PS: quella costante b scrivila maiuscola come da standard (B) :)

nike99
15-02-2011, 11:25
Allora se metto (*y)++,mi da errore di sintassi.

Se metto void,poi,non ho pi nessun return nella funzione,giusto? In questo modo,per,non mi fa stampare il valore nel main.


PS: quella costante b scrivila maiuscola come da standard (B)

Immagino,che ti riferisci alla d,che indica la dimensione del vettore.

YuYevon
15-02-2011, 11:36
Originariamente inviato da nike99
Allora se metto (*y)++,mi da errore di sintassi.


Sicuro? Che compilatore usi? Quell'espressione non dovrebbe darti problemi di sintassi.


Originariamente inviato da nike99
In questo modo,per,non mi fa stampare il valore nel main.


Semplicemente non stampare il valore di ritorno della funzione ma il valore di k dopo la chiamata a funzione



C(N, &k)
printf("\n%d", k);



Originariamente inviato da nike99
Immagino,che ti riferisci alla d,che indica la dimensione del vettore.


Immagino si riferisse proprio a quella e rilancio il suggerimento: le costanti simboliche per convenzione vanno scritte con tutti i caratteri maiuscoli per distinguerle dalle semplici variabili.

nike99
15-02-2011, 12:01
Uso devc++.Ho riprovato mi da errore prima della parentesi ")".

Modificando in void e non mettendo il return, mi stampa sempre in ogni caso il valore 0.
Secondo voi giusto il procedimento della funzione o, c'qualche passaggio errato?




#include<stdio.h>
#include<stdlib.h>
#define D 5
typedef struct{int A;int B[D];}ES;

void C (ES x,int*y){
int i,trovato;
*y=0;
trovato=0;
for(i=0;i<D;i++)
if(x.A==x.B[i]){
trovato=1;
*y++;
}
}
int main()
{ ES N;
int i,k;
N.A=5;
for(i=0;i<D;i++)
scanf("%d",&N.B[i]);
C(N,&k);
printf("\n%d",k);
printf("\n");
system("pause");
return 0; }

jobv
15-02-2011, 12:04
Con *y=*y+1 :confused:

nike99
15-02-2011, 12:14
Con *y=*y+1

Grandissimo!!! Adesso funziona correttamente.
Tuttavia non ho capito perch con *y++ non andava,le due scritture non dovrebbero essere equivalenti.

Grazie 1000 a tutti!!!

jobv
15-02-2011, 12:27
Non vorrei dire cavolate ma una questione di precedenza degli operatori: *y++ incrementa l'indirizzo a cui punta y e poi ne ricava il valore...

la cosa strana che con le () doveva funzionare :messner:

nike99
15-02-2011, 12:30
S, dovrebbe essere come dici te, nel frattempo ho provato con ++*y; e funziona anche cos.Solo che normalmente non mi sarebbe mai venuto in mente... :(

Loading