visindo
29-08-2010, 14:39
Salve ragazzi, a breve dovrò affrontare un'esame di C!
Mi stavo esercitando su alcuni vecchi esercizi del prof e mi sono imbattuto su uno assai particolare, dove ho diversi casi di passaggio di funzioni come parametri, con casi articolati.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
union ww{
int a;
char b;
char *(*p) (int c);
};
char a[5]= {'a','b','c','d','e'};
char *f(int x){
int i;
if(x<0 || x>=5 || !a[x]) return 0;
for (i=0; i<5; i++) a[x]+=x;
return a;
}
char *g(int x){
int i;
char *p;
p=a;
if(x<0 || x>=5) return 0;
for (i=0; i<5; i++) p[x]+=x;
p+=2;
*p+=2;
return a;
}
int main (void){
union ww w;
char *q;
q=f(1);
q=(&f)(1);
w.p = &f;
q=w.p(1);
q=(*w.p)(1);
q = *w.p(1); // errore: "invalid conversion from 'char' to 'char*'
w.p = g;
q= (*g)(1);
q=(&w.p)(1); // `*(char*(**)(int))(&w)' cannot be used as a function
q=(**w.p)(1);
*q = w.b;
system("pause");
return 0;
}
Dunque ho analizzato i singoli casi compilando (e riscontrando 2 errori), però non ho capito bene il comportamento del compilatore per ognuno di essi. C'è qualche buona anima che riuscirebbe a spiegarmelo, caso per caso?:(
Mi stavo esercitando su alcuni vecchi esercizi del prof e mi sono imbattuto su uno assai particolare, dove ho diversi casi di passaggio di funzioni come parametri, con casi articolati.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
union ww{
int a;
char b;
char *(*p) (int c);
};
char a[5]= {'a','b','c','d','e'};
char *f(int x){
int i;
if(x<0 || x>=5 || !a[x]) return 0;
for (i=0; i<5; i++) a[x]+=x;
return a;
}
char *g(int x){
int i;
char *p;
p=a;
if(x<0 || x>=5) return 0;
for (i=0; i<5; i++) p[x]+=x;
p+=2;
*p+=2;
return a;
}
int main (void){
union ww w;
char *q;
q=f(1);
q=(&f)(1);
w.p = &f;
q=w.p(1);
q=(*w.p)(1);
q = *w.p(1); // errore: "invalid conversion from 'char' to 'char*'
w.p = g;
q= (*g)(1);
q=(&w.p)(1); // `*(char*(**)(int))(&w)' cannot be used as a function
q=(**w.p)(1);
*q = w.b;
system("pause");
return 0;
}
Dunque ho analizzato i singoli casi compilando (e riscontrando 2 errori), però non ho capito bene il comportamento del compilatore per ognuno di essi. C'è qualche buona anima che riuscirebbe a spiegarmelo, caso per caso?:(