hallo zusammen,
ich versuche seit einige studen eine intger Array in unsigned char zu
konvertieren, und aber könnte ich nicht sein. der kompiler meldet keine
fehler aber die char arry bleibt immer leer und das programmm stüzt
ab
hier ist abschitt von Code:
1
intn=10;
2
int*werte1;
3
intbitrange=8;// wird von tastatur eingelesen entweder 8 oder 16 bit sein
So wird der Compiler auf jeden Fall Fehler ausgeben, semikolon fehlt und
du greifst auf werte[i] zu, hast aber nur werte1 und werte2. Und in der
Zeile nochn : am Ende...
salima schrieb:> hallo zusammen,>> ich versuche seit einige studen eine intger Array in unsigned char zu> konvertieren,
Geht prinzipiell nicht immer, weil int einen groesseren Wertebereich als
char hat (OK, OK, haben kann).
> und aber könnte ich nicht sein. der kompiler meldet keine> fehler aber die char arry bleibt immer leer und das programmm stüzt> ab
;-)
> hier ist abschitt von Code:> [c]
Falls das Programmiersprache C bedeuten soll - Irrtum, Du benutzt C++.
> int n=10;> int *werte1;> int bitrange=8; // wird von tastatur eingelesen entweder 8 oder 16 bit> sein> werte1=(int*)malloc(n*sizeof(int));
"werte1" ist mindestens 10 Bytes lang (C-Bytes!), wahrscheinlich aber 20
oder 40.
> for(int i=0;i<n;i++){> werte1[i]=pow(2,bitrang)-1;> }
Hier hast Du mit grosser Wahrscheinlichkeit "werte1[i]" mit Werten
befüllt die nicht in einen unsigned char passen werden, auf vielen
Architekturen passt (2^9)-1 nicht mehr rein.
> unsigned char *werte2;> werte2=(unsigned char*)malloc( (n*bitrange/8)*sizeof(unsigned char) );
sizeof(unsigned char) ist per Definition 1, kannst Du weglassen.
"werte2" ist 10 Bytes lang (C-Bytes!) für bitrange == 8, 20 für bitrange
== 16.
> memcpy(werte2,werte1,n*sizeof(int))
Hier versuchst Du mit grosser Wahrscheinlichkeit 20 oder 40 Bytes in
10/20 Bytes zu kopieren.
Unwahrscheinlich dass das immer tut was es soll. ;-)
> for(int i=0;i<(n*bitrange/8) ;i++){> cout<<werte[i]<<std::endl:
^^^^^^^^^^^^^^^^^^^^^^^^^^
C++, nicht C! Am Ende sollte ein ';' statt ':' sein, Du zeigst uns nicht
den realen Code.
> }
Jasch schrieb:> salima schrieb:
[snip]
Verdammt, ich sollte vielleicht auch eine Lösung verraten.
for (int i=0; i < n; i++) {
werte2[i] = werte1[i];
}
"n" größer 9 geht aber wie gesagt meist nicht weil (2^8)-1 der größte
mögliche Wert für einen unsigned char auf den verbreitetsten Plattformen
ist. Es sei denn es wäre OK wenn werte2[9] den Wert 0 bekäme.
hey,
leider komme ich nicht weiter. ich habe es geander dass die beiden
Vektoren zumindest die gleiche länge haben aber in die werte werden
einfach in werte zugewisen. array werte2 ist immer noch leer.
1
intn=10;
2
int*werte1;
3
intbitrange=8;// wird von tastatur eingelesen entweder 8 oder 16 bit sein
salima schrieb:> int *werte1;> werte1=(int*)malloc(n*sizeof(int));> unsigned char *werte2;> werte2=(unsigned char*)malloc( (n*bitrange/8)*sizeof(unsigned char) );> memcpy(werte2,werte1,n*sizeof(int))
1) Wenn du C benutzt, kein cast (int*)malloc notwendig! (sogar böse
Verdeckung möglich)
Da du std::cout benutzt, programmierst du anscheinend C++.
Warum nicht gleich
int * werte = new int[n];
delete [] werte;
2) du überbügelst den Speicher, der am Pointer werte2 hängt, mit dem
Speicherinhalt, der am Pointer wert1 hängt.
Schau dir genau wie gross die beiden Speicherbereiche sind!
sizeof(int)>=sizeof(char)
in den allermeisten Fällen gilt >
salima schrieb:> hey,>> leider komme ich nicht weiter. ich habe es geander dass die beiden> Vektoren zumindest die gleiche länge haben aber in die werte werden> einfach in werte zugewisen. array werte2 ist immer noch leer.
Kann nicht sein, einige Werte müssten != 0 sein. Wahrscheinlich
werte2[4], werte2[8], ... laut meiner Glaskugel.
> [c]> int n=10;> int *werte1;> int bitrange=8; // wird von tastatur eingelesen entweder 8 oder 16 bit> sein> werte1=(int*)malloc(n*sizeof(int));>> for(int i=0;i<n;i++){> werte1[i]=pow(2,bitrang)-1;> }>> unsigned char *werte2;> werte2=(unsigned char*)malloc( (n*bitrange/8)*sizeof(int) );>> memcpy(werte2,werte1,n*sizeof(int))
Du kannst memcpy() nicht benutzen um ein Array von Typ A in ein Array
von Typ B zu kopieren, das wird nie funktionieren (ausser Du weisst ganz
genau was Du da eigentlich tust... ;-).
Mach es mit einer for-Schleife.