Avatar billede jakobverner Nybegynder
15. december 2005 - 13:30 Der er 7 kommentarer og
1 løsning

AND en ASKKI-værdi ind på hver plads i array

Jeg skal lave en funktion der generere én random karakter 100.000 gange.

Hver karakter angives som en ASKII-værdi i hex, og så skal den enkelte bit fra ASKII-værdien lægges ind bitvis i et array[8] som enten nul eller et, således at alle 8 bit fra ASKII-værdi til sidst lægger i char-arrayet[8] som enten et eller nul.

Koden ser fin ud, men af en eller anden grund bliver jeg ved med at havne i else-delen af min if-else statement. Kan du finde fejlen ved koden?

void gen_char()
{     
        int i,j;
        char x = 0x20;  //x er ASKII-værdien
        char y = 0x00;
        char mask = 0x01;//
        for(i=0; i<100000; i++)
    {
          x = x++;
          for(j=0; j<8; j++)
          {     
                y = (x && mask);
                if (y == 0x00)//hvis y nul, ikke fundet bit
                {
                        cha[j] = 0x00;
                }
                    else
                {
                        cha[j] = 0x01;
                }
                mask = mask*2; //bit i mask flyttes én plads                y = 0x00;
              }             
              mask = 0x01;
          if (x == 0x7e) { x=0x20; }
          y2(cha,G,result);
    }
}
Avatar billede brilleaben Nybegynder
15. december 2005 - 14:36 #1
Din linje:

y=(x && mask);

... skal være:

y=(x & mask);

I sidstnævnter AND'er du x med mask for at hente den pågældende bit.
Avatar billede jakobverner Nybegynder
15. december 2005 - 18:07 #2
Jeg har faktisk prøvet med y=(x & mask) men da det heller ikke virkede, så gik jeg over til &&, da jeg var lidt i tvivl om syntaksen. Så ja du har ret brilleaben, det skal være y=(x & mask).

Imidlertid var det ikke det der fik programmet til at fejle. Fejlen var x = x++. Da x er erklæret som en char kan åbenbart ikke lave x++ syntaks, man skal skrive x=x+1 for at det kommer til at fungerer rigtigt. Det opdagede jeg efter jeg havde uploadet spørgsmålet, men tak for hjælpen skal du have.


og det virker heller ikke med kun én &.
Imidlertid har jeg selv fun
Avatar billede jakobverner Nybegynder
15. december 2005 - 18:08 #3
De to sidste linjer i foregående indlæg er noget pladder der slap med... hvis nogen skulle være i tvivl :)
Avatar billede brilleaben Nybegynder
15. december 2005 - 21:26 #4
Du burde kunne slippe afsted med x=x++ - selvom det måske er overflødig.    Istedet for x=x+1 kan du blot gøre x++.
Avatar billede nlf Nybegynder
15. december 2005 - 23:01 #5
Det er faktisk forkert.
++var er pre-increment
var++ er post-increment

Mit gæt er, at der oprettes en midlertidig variabel til x på stack'en, idet du jo ikke kan tildele noget med den selv. Og da var++ er post-increment, så vil variablen på stack'en (som jo slettes igen uden for det nuværende scope) først blive hævet med 1 , efter dens værdi er blevet tildelt x.

Kort sagt står der: (hvor x1 er den nye variabel på stack'en)
x1 = x;
x = x1;
x1++;

Så hvis den kommando skal virke, som du vil have den til, er der nødt til at stå:
x = x++;
Avatar billede nlf Nybegynder
15. december 2005 - 23:02 #6
Ups, nu skrev jeg den selv forkert :P

Jeg mente selvfølgelig:
x = ++x;
Avatar billede nlf Nybegynder
15. december 2005 - 23:02 #7
(Men det er jo det samme som at skrive ++x; eller x++; så hvorfor tildele x den egen værdi???)
Avatar billede bertelbrander Novice
16. december 2005 - 01:10 #8
x = x++ giver "undefined behaviour" uanset typen af x. Det gør det fordi man modificerer det samme object to gange unden et "sequence point".

At det er "undefined behaviour" betyder at én kompiler kan give et resultat og en anden et andet resultat.
Af de fire c++ kompilere jeg har pt. skriver de to 12 og de to andre 13 når de kompilerer nedenstående:

#include <iostream>

int main()
{
  int x = 12;
  x = x++;
  std::cout << x << std::endl;
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester