Newsgroup: it.comp.lang.c
Titolo: Dove canno??????

scusate sto lavorando ad un programmino ed ho il seguente codice in sintesi:
//main.c
unsigned char *chr;
short paperino[1000];
int main(){
    //bla bla
    chr = funz1(&paperino[0]);
}
//funz1.c
unsigned char *funz1(short *x){
    unsigned char pippo[12];
    //bla bla
    return &pippo[0];
}
Questo codice compilato con un compilatore "di nicchia" (CCS) mi ritorna un
errore alla riga in cui chiamo la funzione funz1 assegnandone il valore di
ritorno a chr; l'errore è il seguente :
error: a value of type "int" cannot be assigned to an entity of type
"unsigned char *"
Ora c'è qualcuno che mi possa spiegare dove cavolo l'ha beccato un int in
tutto sto codice?
__________________________
Se la so, rispondo sempre (quasi)

Preciso che se a funz1 faccio ritornare direttamente puntg[0] e non il suo 
indirizzo e poi scrivo
*chr = funz1(&paperino[0]);
Non crea alcun problema... MA  non è quello che mi serve.. io non voglio 
ricopiare il valore perchè mi interessano tutti e 12 i valori di pippo, 
pertanto voglio SOLO che chr punti l'inizio del vettore pippo 

 tutto sto codice?
L'errore è nel tipo di ritorno: return &pippo[0]
evidentemente il tuo compilatore di "nicchia", considera il puntatore
ad un array di unsigned char, come un puntatore di tipo int!!!

>     return &pippo[0];
Prova in questo modo: return ((unsigned char *) pippo);
P.S. pippo e &pippo[0] sono equivalenti

 
Puoi risolvere aggiungendo la dichiarazione unsigned char* funz1(short*) 
prima di chiamare la funzione (aggiungila fuori da tutte le funzioni). 
Un'altra cosa: se puoi evita le variabili globali.
Non conosco quel compilatore pero' credo che succeda qualcosa di simile: 
funz1 viene chiamata, ma in quella translation unit non e' definita e 
nemmeno dichiarata, quindi CCS stabilisce che la funzione ritorni un 
int. Poi pero' vede la funzione con quel nome in un'altra translation 
unit, che restituisce un tipo diverso e quindi te lo segnala. Penso che 
  trattare le funzioni non dichiarate o senza tipo di ritorno come se 
ritornassero int sia il residuo di qualche vecchio standard, perche' non 
mi sembra che con quello corrente sia legale.. comunque di standard non 
so niente e lascio che te lo spieghi qualcuno che lo sa.
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

 ad un array di unsigned char, come un puntatore di tipo int!!!
Si ma sta cosa non mi pare molto normale .. voglio dire... se io inizializzo 
un puntatore
a un dato di tipo unsigned char, poi inizializzo un unsigned char ed assegno 
l'indirizzo di quest'ultimo al puntatore non vedo come possano i dati 
discordare... mi sembra una cosa MOSTRUOSA!!!!
Riguardo al pippo e &pippo[0] lo sapevo ma per non sintetizzare ho preferito 
metterci una bella & davanti allo scopo di rendermi conto ad occhio del 
fatto che è un indirizzo..
Adesso provo col suggerimento del casting... ma mi sembra veramente una cosa 
incredibile.. 

>
mi sa che sei un figo ed hai ragione.. mi sono totalmente scordato di 
dichararla all'inizio... mi sento un pò pirla... sono tornato da poco dalle 
ferie in fondo e il c l'avevo già seppellito sotto il ricordo delle gustose 
abbondanti piogge che mi son beccato sto anno!!!!


Ho risolto con il consiglio di DevarajA; ma grazie anche a te AlterX
Un'ultima cosa:
se ho main.c che sfrutta funz1.c che sfrutta funz2.c č meglio (/ corretto / 
preferibile / l'unica strada) dichiarare funz2 all'inizio di funz1 oppure 
nel main?

 
Non mi e' molto chiara la domanda....
Comunque ti do una risposta che va bene per tutto :-) Dichiara tutte le 
funzioni, le costanti, le strutture, ecc.. che usi in pippo.h e poi 
includi quel file in main.c, in funz1.c e in funz2.c


 
static significa che la variabile non viene distrutta all'uscita della 
funzione e quindi e' utilizzabile (anche in scrittura) anche 
dall'esterno della funzione. Quindi se dichiari l'array come static puoi 
tranquillamente ritornare il suo indirizzo e leggerlo con calma dalla 
funzione chiamante.
