Forum: PC-Programmierung umwandlung von intger Arry zu unsigned char Arry


von salima (Gast)


Lesenswert?

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
int n=10;
2
int *werte1;
3
int bitrange=8;   // wird von tastatur eingelesen entweder 8 oder 16 bit sein
4
werte1=(int*)malloc(n*sizeof(int));
5
6
for(int i=0;i<n;i++){
7
 werte1[i]=pow(2,bitrang)-1;
8
}
9
10
unsigned char *werte2;
11
werte2=(unsigned char*)malloc( (n*bitrange/8)*sizeof(unsigned char) );
12
13
memcpy(werte2,werte1,n*sizeof(int))
14
15
for(int i=0;i<(n*bitrange/8) ;i++){
16
  cout<<werte[i]<<std::endl:
17
18
}
19
20
free(werte1);
21
free(werte2);

ich hoffe dass, jemand mir weiterhelfen kann.
danke schönmal im voraus.
Gruß
Salima

von spleen (Gast)


Lesenswert?

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...

von salima (Gast)


Lesenswert?

sorry
ich habe es  nich von einem code  genommen sonern habe  es  schnell 
eingetippt,aber wie gesagt das problem besteht immer noch

1
int n=10;
2
int *werte1;
3
int bitrange=8;   // wird von tastatur eingelesen entweder 8 oder 16 bit sein
4
werte1=(int*)malloc(n*sizeof(int));
5
6
for(int i=0;i<n;i++){
7
 werte1[i]=pow(2,bitrang)-1;
8
}
9
10
unsigned char *werte2;
11
werte2=(unsigned char*)malloc( (n*bitrange/8)*sizeof(unsigned char) );
12
13
memcpy(werte2,werte1,n*sizeof(int))
14
15
for(int i=0;i<(n*bitrange/8) ;i++){
16
  cout<<werte2[i]<<std::endl;
17
18
}
19
20
free(werte1);
21
free(werte2);

von Jasch (Gast)


Lesenswert?

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.

> }

von Jasch (Gast)


Lesenswert?

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.

von salima (Gast)


Lesenswert?

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
int n=10;
2
int *werte1;
3
int bitrange=8;   // wird von tastatur eingelesen entweder 8 oder 16 bit sein
4
werte1=(int*)malloc(n*sizeof(int));
5
6
for(int i=0;i<n;i++){
7
 werte1[i]=pow(2,bitrang)-1;
8
}
9
10
unsigned char *werte2;
11
werte2=(unsigned char*)malloc( (n*bitrange/8)*sizeof(int) );
12
13
memcpy(werte2,werte1,n*sizeof(int))
14
15
for(int i=0;i<(n*bitrange/8) ;i++){
16
  cout<<werte2[i]<<std::endl;
17
18
}

free(werte1);
free(werte2);

von Daniel (Gast)


Lesenswert?

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 >

von Jasch (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.