Prob = *((unsigned short*)(Prob));
Prob = (unsigned short)(Prob);
Das hat nicht für mich funktioniert. Wie konvertiert man es richtig?Konvertieren Sie ein Double-Array in unsigned short?
Prob = *((unsigned short*)(Prob));
Prob = (unsigned short)(Prob);
Das hat nicht für mich funktioniert. Wie konvertiert man es richtig?Konvertieren Sie ein Double-Array in unsigned short?
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]);
}
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.
Ist das C-Code? – dorukayhan
@dorukayhan Ja, das ist c – Bobotic
Bitte nächstes Mal versuchen, Sie Fragen mit dem Namen der Sprache, die Sie fragen, zu markieren. Sie werden mehr Hilfe bekommen. – WaelAlshabani