int bájtonként?

 ( szaty | 2008. május 21., szerda - 0:29 )

Hali,

egy olyan programot kénr írnom ami egy int-et bájtonként ír a képernyőre. Sjna nem sikerült megoldanom eddig, van valami ötletetek?

Előre is kösz.

Szati

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

printf("%c%c%c%c", intvar  >> 24, (intvar >> 16) & 0xFF, (intvar >>  8) & 0xFF, intvar & 0xFF);

de itt vannak highcoderek, majd irnak okosabbat.

Elbandi
--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Kösz ez működik.

És double-el, hogy kéne ezt megcsinálni? Csak mert arra nemműködik a >> operátor;

Ha emlékeim nem csalnak, akkor a double két részből áll. Van egy fixpontos szám (mantissza), illetve egy hatványkitevő (szerk: plusz előjel). Melyiket szeretnéd pontosan kiírni?
Ha csak azt szeretnéd a képernyőn látni, ami a memóriaterületen van, akkor pointeres trükkel biztos megoldhtó.

A pointeres trükk alat mit értesz?

Csinálsz egy mutatót a double címére és annak tartalmát a jövőben úgy használod, mint egy int vagy akár használhatod byte-ként is és akkor pointert lépteted egyel arrébb.

A mantissza nem fixpontos szam, a mantissza egesz szam.

Jogos.

Szerintem ciklusba kellene szerveznie a dolgot.

int akarmi = ertek;
while(akarmi!=0) {
 int byte = akarmi>>8;
 printf("%X ",byte);
 akarmi>>=8;
}

Ez szepen 8bitenkent vegigmegy az inten, amelynek a merete szabvany szerint gepfuggo.

Köszi az int része meg van, csak a double még mindig nincsen. Be tudná írni valaki a double-s változat megoldását, mert már sok féle képpen próbáltam de nem megy sajna :S

Ez barmilyen tipusu valtozora mukodni fog:

#include <stdio.h>

int main(void) {
  double kiirando=12345.6789;
  int i;
  unsigned char * ptr;
  ptr=(unsigned char *)&kiirando;
  for (i=0; i<sizeof(kiirando); i++)
    printf("%02X ",*ptr++);
  printf("\n");
  return (0);
}

Ez segfault lehet.

#include <stdio.h>

int main(int argc, char **argv){
        int szam;
        unsigned short int i;
        unsigned char *p;
        printf("Add meg a szamot: ");
        scanf("%d%*[^\n]", &szam);
        p=&szam;
        for(i=0; i<sizeof(int); i++){
                printf("%#.2x\n", (*p));
                p++;
        }
        return 0;
}

Nekem doublet kell kiírni bájtonként nem intet, az a rész már műkszik.

- int szam;
+ double szam;
- for(i=0; i<sizeof(int); i++){
+ for(i=0; i<sizeof(double); i++){

szerk: jah, és a scanfnél is módosítani kell, de az részletkérdés :)

Miért lehet segfault?

A C nyelv definíciójában a char bitszáma nincs definiálva, így hiába unsigned char típusú *p, attól még nem biztos, hogy 8 bites.

Jó, ha nem is segfault, de nem jó a kód. Próbáld ki ~0-ra és 0-ra :)

Jogos az eszrevetel. Kerdes: ha ~0-t tolok el jobbra x bittel, a felso x bit miert nem lesz csupa 0 bit?

Mert elojeles szamoknal a leptetes megorzi az elojelet.

Próbáld ki -1-re.

Sajnálatos módon
(-1) >> 8 = -1

Szóval nem segfault lesz, csak végtelen ciklusba kerül az egész.

Ez egy egyetemi házi példa visual studioval (32 bit) fordítva kell, hogy menjen. Amúgy szerintem nem szokta kipróbálni a gyakvez csak ránéz a forráskódra azt ha jónak tűnik akkor bepipálja hogy kész.

Keress rá a union kulcsszóra. Arra való hogy ugyanazt a memóriaterületet olvasd és írd különböző struktúrák szerint. Pont ezt lehet vele szépen megcsinálni (double-vel is).

Annyit mindenképp hozzá kell tenni, hogy erősen platformfüggő lesz a végeredmény. Mondjuk gondolom iskolapéldáról vagy ilyesmiről van szó.

union int2byte
{
int a;
char b[4];
};

.
.
.
.
.
A progiban:

union int2byte v;

v.a=12345;
printf("%2.2X %2.2X %2.2X %2.2X\n",v.b[0],v.b[1],v.b[2],v.b[3]);

ha v.a = 500, akkor miért ad olyan "érdekes" eredményt?
--
unix -- több, mint kód. filozófia.
Life is feudal

esetleg a szám tárolásának big/little endian-os eltérősége miatt.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.

Slackware Linux 12.0 | 2.6.25.4-janos

- char b[4];
+ unsigned char b[4];

+1
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.

Slackware Linux 12.0 | 2.6.25.4-janos

Köszi, ez működik faszán double típussal is.

"printf("%2.2X %2.2X %2.2X %2.2X\n",v.b[0],v.b[1],v.b[2],v.b[3]);"

C++ esetén cout -al hogyan lehet hasonló módon megformázni a kimenetet?

--
unix -- több, mint kód. filozófia.
Life is feudal

Hat igen, ez a C++ FQA-ban (Frequently questioned answers) is sajat tetelt kapott (bar ahogy nezem a pelda kicsit hibas).

Gyakorlatilag a hex, setw es setfill manipulatorokra lesz szukseged, referencia.

Köszönöm, ezt néztem korábban. Valszleg nem jól kérdeztem. Igazából az érdekelne, hogy mennyire kell, szükséges a boost-ot belekeverni ebbe a dologba?

--
unix -- több, mint kód. filozófia.
Life is feudal

Illetve az is érdekel -és próbálgatom éppen-, hogy a g++ fordítóm miért nem produkál olyan binárist, ami ezt a szerkezetet felhasználva:

union int2byte
{
int a;
char b[4];
};

cout segítségével is produkálna olyan eredményt, mint a printf -el.
--
unix -- több, mint kód. filozófia.
Life is feudal