PDA

Visualizza la versione completa : [C] array e puntatori


berico3
02-04-2015, 23:34
Ciao a tutti,
Sto tentando di fare un semplice programmino in C, dove dato un certo numero di unsigned char, con 4 di loro si crei una variabil float per poi stamparla a video.
Insomma ho 4 byte in un array e li vogli leggere come una variabile float (mi servir per leggere un dato in una porta).
Il problema che devo aver incasinato un po i puntatori, perch il risultato cambia ogni volta che lancio il programma. :D
Ci ho sbattuto un bel po la testa, ma non riesco a trovare l'intoppo.:dh:
Qualcuno sarebbe co gentile da volermi aiutare?
Grazie anticipatamente per l'aiuto!

#include <stdio.h>
#include <stdlib.h>

#define _SPACE printf("\n");
typedef unsigned char BYTE;

float *retiflo(char *pun){
unsigned char four[4];
float *ff;

four[0] = pun[4];
four[1] = pun[3];
four[2] = pun[2];
four[3] = pun[1];

ff = (float *)&four;
return ff;
}

int main()
{
BYTE arr[8] = {0x00, 0x06, 0xd0, 0x9c, 0x1e, 0x3e, 0x10, 0x00};
float *fl;
int i;
char *pc;


for(i = 0; i < 7; i++){
printf("%04x ",arr[i]);

}
pc = &arr;
_SPACE

fl = retiflo(pc);
printf("%12.6f", fl);

_SPACE
return 0;
}

Samuele_70
03-04-2015, 00:59
http://stackoverflow.com/questions/3991478/building-a-32bit-float-out-of-its-4-composite-bytes-c
http://www.dreamincode.net/forums/topic/240989-4-bytes-to-float/

oregon
03-04-2015, 08:00
Butta la funzione che hai scritto, sbagliata per diversi motivi e scrivi semplicemente





float fl = (float *)arr;
printf("%12.6f", fl);

MItaly
03-04-2015, 08:33
Butta la funzione che hai scritto, sbagliata per diversi motivi e scrivi semplicemente





float fl = (float *)arr;
printf("%12.6f", fl);


Manca un asterisco... ;)

Comunque, anche cos non tecnicamente valido: non ci sono problemi di strict aliasing perch i char * possono fare aliasing di qualunque cosa, ma arr potrebbe non essere allineato giusto per essere usato come float. O usi la memcpy (o equivalente):


float fl;
assert(sizeof(fl)==arr);
memcpy(&fl, arr, sizeof(fl));
printf("%12.6f", fl);

oppure lavori al contrario: prendi un float e lo pasticci accendendovi tramite un char *, cosa che non d problemi, visto che ci pensa il compilatore ad allineare fl correttamente:


float fl;
unsigned char *arr=(unsigned char *)&fl;
arr[0] = 0x6c;
arr[1] = 0xb2;
arr[2] = 0x29;
arr[3] = 0x42;
printf("%12.6f", fl);

oregon
03-04-2015, 10:18
Oops... In effetti dovrebbe essere





float fl = *( (float *)arr );
printf("%12.6f", fl);

berico3
03-04-2015, 19:13
Grazzie mille a tutti per le risposte.
Ho provato quella di MItaly (http://forum.html.it/forum/member.php?userid=111172) e funziona bene.:p

P.S.
la prima volta che scrivo in questo forum, come si dichiara risolto?

oregon
03-04-2015, 22:15
Grazzie Basta una z ...

A parte questo prova a capire quello che scrivi ... vedi tutte le soluzioni e studiale...

Loading