simple typumwandlung will nich..
-
ich hab zu lange java gemacht.. eindeutig..
naaja.. back in C hab ich jetzt ein Problem: Ich will eine int (32 bit) in 32, 16 oder 8 bit umsetzen und das ergebnis in ein char array schreiben.
es geht mir darum, eine sinuswelle zu generieren. diese soll dann in eben dieses array geschoben werden. die rechnung ist richtig- meine testausgaben klappen..
nur was im array steht ist einfach nur gülle..hier mal der code mit bitte um hilfe/hinweise
/* * generiere eine vollwelle */ char *wavegen(struct sWaveform wave) { char *output; char *pos; unsigned bytes_used = get_bytes_per_sample(wave); unsigned spw = (unsigned) samples_per_wave(wave); unsigned sample = 0; int sample_value; /* * Allokierung des Speichers für die Welle */ output = (char*) malloc(bytes_used * spw); #ifdef __TEST__ printf("allokiere %d samples mit %d bytes\n", spw, bytes_used); #endif /* * Generierung der Welle */ for (sample = 0; sample < spw; sample++) { sample_value = (int) (synth(wave, sample) * (double) wave.amplitude); #ifdef __TEST__ printf(" +-- Rückgabewert %x\n", sample_value); printf(" +-- Rückgabewert %x\n", sample_value >> 16); printf(" +-- Rückgabewert %x\n", sample_value >> 24); #endif /* * ggf. Anheben für asymmetrisches Signal */ switch (wave.data_type) { case U8: case U16: case U32: sample_value += wave.amplitude; break; default: break; } /* * Datensatz befüllen */ pos = &(output[sample * bytes_used]); /* * little endian */ memcpy(pos, &(sample_value), bytes_used); /* * big endian */ // memcpy (pos, &((char *)(&sample_value))[4 - bytes_used], bytes_used); } return output; }
-
das liegt bestimmt an diesen seltsamen zeilen mit dem memcpy und der davor.
mach das befüllen doch im switch (wave.data_type)-zweig.
so etwa:case U8: *output++ = (char)sample_value; ... case U16: *output++ = (char)(sample_value>>8); // big endian *output++ = (char)sample_value; ... case U32: *output++ = (char)(sample_value>>24); // big endian *output++ = (char)(sample_value>>16); *output++ = (char)(sample_value>>8); *output++ = (char)sample_value; ...
-
das problem dabei ist doch aber, dass dann der wert abgeschnitten wird ??
also vom char wird doch nur das niederwertigste byte übertragen?
-
^^na, dann teils doch runter.
-
i did..
leite ich die ausgabe in eine datei um, stehen dort nur zahlenwerte, die eindeutig nicht stimmen können..
ich prüf mal nochmal, dass ich meine rechnung nich vergnaddelt hab..
-
^^einfach mal mit'm debugger durchsteppen und die variableninhalte ansehen usw. dann dürfteste den fehler bei der einfachen funktion schnell finden.
-
habs gefunden.. die schleife war etwas ungünstig gebaut ^^