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
- 1591 megtekintés
Hozzászólások
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!
- A hozzászóláshoz be kell jelentkezni
Kösz ez működik.
És double-el, hogy kéne ezt megcsinálni? Csak mert arra nemműködik a >> operátor;
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
A pointeres trükk alat mit értesz?
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
A mantissza nem fixpontos szam, a mantissza egesz szam.
- A hozzászóláshoz be kell jelentkezni
Jogos.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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);
}
- A hozzászóláshoz be kell jelentkezni
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;
}
- A hozzászóláshoz be kell jelentkezni
Nekem doublet kell kiírni bájtonként nem intet, az a rész már műkszik.
- A hozzászóláshoz be kell jelentkezni
- 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 :)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Jó, ha nem is segfault, de nem jó a kód. Próbáld ki ~0-ra és 0-ra :)
- A hozzászóláshoz be kell jelentkezni
Jogos az eszrevetel. Kerdes: ha ~0-t tolok el jobbra x bittel, a felso x bit miert nem lesz csupa 0 bit?
- A hozzászóláshoz be kell jelentkezni
Mert elojeles szamoknal a leptetes megorzi az elojelet.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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ó.
- A hozzászóláshoz be kell jelentkezni
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]);
- A hozzászóláshoz be kell jelentkezni
ha v.a = 500, akkor miért ad olyan "érdekes" eredményt?
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
- char b[4];
+ unsigned char b[4];
- A hozzászóláshoz be kell jelentkezni
+1
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.0 | 2.6.25.4-janos
- A hozzászóláshoz be kell jelentkezni
Köszi, ez működik faszán double típussal is.
- A hozzászóláshoz be kell jelentkezni
"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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni