2016-07-06 3 views

Antwort

0

Sie müssen explizit jeden Wert konvertieren:

unsigned short * doubleToUShort(double * Prob_double, size_t N) { 
    unsigned short * Prob = malloc(sizeof(unsigned short) * N); 
    size_t i = 0; 

    for (i = 0; i < N; i++) { 
    Prob[i] = Prob_double[i]; 
    } 

    return Prob; 
} 

Das wird rund gegen Null. Wenn Sie stattdessen auf den nächsten runden möchten können Sie #include <math.h> verwenden und diese Schleife ändern

for (i = 0; i < N; i++) { 
    Prob[i] = round(Prob_double[i]); 
} 
1

Das größte Problem stellen Sie für die doppelten Werte, die USHRT_MAX überschreiten. Zweitens müssen Sie die Rundung ansprechen. Ein einfacher Ansatz, der sowohl Adressen und setzt bei .5 Runden in etwa wie folgt, wo die Funktion aussehen könnte array_dbl2short die Anzahl der Doppel Werte zurück erfolgreich zu unsigned short konvertiert:

size_t array_dbl2short (unsigned short *usa, double *da, size_t n) 
{ 
    if (!usa || !da || !n) return 0; 
    register size_t i, ncnvt = 0; 

    for (i = 0; i < n; i++) { 
     if (da[i] < 0 || (unsigned long long)(da[i] + 0.5) > USHRT_MAX) 
      fprintf (stderr, "error: %lf outside range for conversion.\n", 
        da[i]); 
     else 
      usa[ncnvt++] = (unsigned short)(da[i] + 0.5); 
    } 

    return ncnvt; 
} 

Ein kurzes Beispiel für seine Verwendung wäre:

#include <stdio.h> 
#include <limits.h> 

size_t array_dbl2short (unsigned short *usa, double *da, size_t n); 

int main (void) { 

    double arr[] = { 1.49, 1.5, 65535.49, 65535.5, -1.9, 25671.8 }; 
    size_t i, n, nelem = sizeof arr/sizeof *arr; 
    unsigned short usarr[nelem]; 

    if ((n = array_dbl2short (usarr, arr, nelem))) { 
     printf ("\n unsigned short array:\n\n"); 
     for (i = 0; i < n; i++) 
      printf (" usarr[%zu] : %hu\n", i, usarr[i]); 
    } 

    return 0; 
} 

size_t array_dbl2short (unsigned short *usa, double *da, size_t n) 
{ 
    if (!usa || !da || !n) return 0; 
    register size_t i, ncnvt = 0; 

    for (i = 0; i < n; i++) { 
     if (da[i] < 0 || (unsigned long long)(da[i] + 0.5) > USHRT_MAX) 
      fprintf (stderr, "error: %lf outside range for conversion.\n", 
        da[i]); 
     else 
      usa[ncnvt++] = (unsigned short)(da[i] + 0.5); 
    } 

    return ncnvt; 
} 

(Anmerkung: die Realteil der double Werte müssen als unsigned long long für t ausgedrückt fähig sein wird, er Umwandlung Validierungen richtig zu arbeiten)

Beispiel Verwendung/Output

$ ./bin/dbl2ushort 
error: 65535.500000 outside range for conversion. 
error: -1.900000 outside range for conversion. 

unsigned short array: 

    usarr[0] : 1 
    usarr[1] : 2 
    usarr[2] : 65535 
    usarr[3] : 25672 

Diese Lösung nicht alle möglichen Runden und Konvertierungsprobleme nicht ansprechen. Sie können die Funktion auch in math.h (z. B. modf, round usw.) verwenden, um den Realteil und die Rundung vorzuformen. Lassen Sie mich wissen, wenn Sie weitere Fragen haben.