Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [C] array e puntatori

  1. #1

    [C] array e puntatori

    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.
    Ci ho sbattuto un bel po la testa, ma non riesco a trovare l'intoppo.
    Qualcuno sarebbe coì gentile da volermi aiutare?
    Grazie anticipatamente per l'aiuto!
    codice:
    #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;
    }

  2. #2
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Butta la funzione che hai scritto, sbagliata per diversi motivi e scrivi semplicemente


    codice:
        float fl = (float *)arr;
        printf("%12.6f", fl);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Butta la funzione che hai scritto, sbagliata per diversi motivi e scrivi semplicemente


    codice:
        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):
    codice:
    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:
    codice:
    float fl;
    unsigned char *arr=(unsigned char *)&fl;
    arr[0] = 0x6c;
    arr[1] = 0xb2;
    arr[2] = 0x29;
    arr[3] = 0x42;
    printf("%12.6f", fl);
    Ultima modifica di MItaly; 03-04-2015 a 08:38
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Oops... In effetti dovrebbe essere


    codice:
        float fl = *( (float *)arr );
        printf("%12.6f", fl);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Grazzie mille a tutti per le risposte.
    Ho provato quella di MItaly e funziona bene.

    P.S.
    è la prima volta che scrivo in questo forum, come si dichiara risolto?
    Ultima modifica di berico3; 03-04-2015 a 19:17

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da berico3 Visualizza il messaggio
    Grazzie
    Basta una z ...

    A parte questo prova a capire quello che scrivi ... vedi tutte le soluzioni e studiale...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.