Konvertierung von integer Array nach unsigned char Array



  • 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:

    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(unsigned char) );
    
    memcpy(werte2,werte1,n*sizeof(int))
    
    for(int i=0;i<(n*bitrange/8) ;i++){
      cout<<werte[i]<<std::endl:
    
    }
    
    free(werte1);
    free(werte2);
    

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



  • Das Array werte2 ist ist kleiner als werte1. D.h. memcpy greift mit der gegebenen Laengenangabe ausserhalb von werte2 zu und verursacht eine Speicherzugriffsverletzung. Darueber hinaus taucht in der for-Schleife noch eine Variable werte auf, die sich von werte1 und werte2 unterscheidet. Lass dir doch mal n*sizeof(int) und n*bitrange/8)*sizeof(unsigned char) ausgeben.



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

    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(unsigned char) );
    
    memcpy(werte2,werte1,n*sizeof(int))
    
    for(int i=0;i<(n*bitrange/8) ;i++){
      cout<<werte2[i]<<std::endl;
    
    }
    
    free(werte1);
    free(werte2);
    

  • Mod

    Die erste Hälfte von knivils Antwort gilt immer noch. Und Tipp bei Fehlern niemals den Code einfach ab, sondern immer Copy & Paste. Du siehst selber, warum.



  • leider komme ich nicht weiter. ich habe es so geandert, dass die beiden Vektoren zumindest die gleiche länge haben aber die werte1 werden einfach in werte2 copiert,denn array werte2 ist immer noch leer.
    [/cpp]
    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))

    for(int i=0;i<(n*bitrange/8) ;i++){
    cout<<werte2[i]<<std::endl;

    }
    free(werte1);
    free(werte2);
    [cpp]



  • #include <iostream>
    using namespace std;
    
    int main()
    {
    	int array_int[5]={100,100,100,100,100};
    	//unsigned char *array_uchar=reinterpret_cast<unsigned char *>(array_int); in C++
    	unsigned char *array_uchar=(unsigned char *)array_int;
    	for(unsigned char i=0; i<5*sizeof(int); ++i) printf("%i\t", array_uchar[i]);
    	for(;;);
    }
    

    Dürfte funktionieren, 3 Bytes sind 0, im letzten steht 100.



  • Damit die Felder gleich groß sind:

    int *werte1; 
    werte1=(int*)malloc(n*sizeof(int));  // der cast vor malloc ist nur bei C++ nötig
    
    unsigned char *werte2;
    werte2=(unsigned char*)malloc(n*sizeof(int));  // der cast vor malloc ist nur bei C++ nötig
    

    salima schrieb:

    ich versuche seit einige studen eine intger Array in unsigned char zu konvertieren

    Warum willst du das überhaupt machen?
    Vielleicht ist das alles gar nicht nötig.


  • Mod

    salima schrieb:

    leider komme ich nicht weiter. ich habe es so geandert, dass die beiden Vektoren zumindest die gleiche länge haben aber die werte1 werden einfach in werte2 copiert,denn array werte2 ist immer noch leer.
    [/cpp]
    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))

    for(int i=0;i<(n*bitrange/8) ;i++){
    cout<<werte2[i]<<std::endl;

    }
    free(werte1);
    free(werte2);
    [cpp]

    1. Das ist schon wieder nicht der Code den du benutzt, sondern irgendetwas was du abgetippt hast. 😡 Hör auf, uns anzulügen!
    2. Der Code funktioniert, wenn man ihn berichtigt. Du verstehst bloß das Ergebnis nicht. Wenn du Zahlen als Zeichen ausgibst, dann sind diese eben größtenteils unsichtbar.
    3. C oder C++? Das ist keine gültiges C und kein richtiges C++.


Anmelden zum Antworten