Kezdőlap › Fórumok › Programozás › C programozás 2
- This topic has 75 hozzászólás, 10 résztvevő, and was last updated 19 years, 11 months telt el by
kisbetu.
-
SzerzőBejegyzés
-
2005-05-22-17:51 #2017237
Hali,
Multkor elég sok segítséget kaptam, remélem most is fogok.
Eclipset használok a programozáshoz, és egy két furcsa hibaüzenetet produkál, ezekre szeretnék rákérdezni.Code:int bmp_check(const char *bmp_file,const char *language,struct bitmapfileheader *bmfh,struct bitmapinfoheader *bmih)
{
…
if ((bmp_fd = open(&bmp_file, O_RDONLY)) < 1) { #ifdef DEBUG perror("bmp_check(): open bmp_file "); #endif help(4, &language); } ... }az open miatt nyavajog ezt irja: passing arg 1 of `open’ from incompatible pointer type.
A másik:
Code:if ((ret = read(bmp_fd, bmfh->bfSize, 4)) < 1) { #ifdef DEBUG perror("bmp_check(): read bmfh->bfSize „);
#endif
return 1; // unable to read
}itt a read miatt szól, ezt irja: passing arg 2 of `read’ makes pointer from integer without a cast.
azt szeretnám elérni hogy a bmfh struktúra bfSize eleme (tehát a pointer által mutatott terület) értéke legyen az olvasott 4 bájt.elöre is köszi a segítséget.
[align=right][snapback]135132[/snapback][/align]Hello!
open: eszkoz neve pl:O_RDONLY
int open(const char *pathname, int flags);read: itt meg nem tudom mi ez?: bmfh->bfSize
kellene latnom hogy mi az.Udv.gtk!
2005-05-22-18:26 #2017238const char *bmp_file
ez egy sztring címét (pointert/mutatót) várja (amit gondolom meg is kap tõled)
&bmp_file pedig már a sztringre mutató pointer címét adja meg, ami nem azonos a bmp_file kezdõpontjával sõt, akár teljesen máshol, is lehet a memóriában (szerencséd, hogy figyelmeztet :))
helyesen: open(bmp_file….ha a bmfh dinamikusan foglalt, vagy a bfSize egy mutató akkor használatos a -> jel
(Ha ezt valami írható paraméterként adod át, akkor ajánlatos is, hogy mutató legyen.)
nos tehát a „bmfh->bfSize” maga egy mutató, nem pedig egy integer, amit akartál csinálni – gondolom ugyanazt követted el, amit az elõbb…(Látom, hogy tele vagy ilyen struct dolgokkal. Hacsak nem valami nem obj. orientált cuccot használsz fel, mint pl.: a gtk, akkor ajánlom az objektum orientált nyelvet – feleennyit fogsz az ilyenekkel szívni és átláthatóbb is lesz.)
2005-05-26-16:34 #2017239(Látom, hogy tele vagy ilyen struct dolgokkal. Hacsak nem valami nem obj. orientált cuccot használsz fel, mint pl.: a gtk, akkor ajánlom az objektum orientált nyelvet – feleennyit fogsz az ilyenekkel szívni és átláthatóbb is lesz.)
Köszi a tippet már gondolkodom rajta de elöbb C tudásomat is szeretném elmélyíteni.
Egy szteganográfiás(BMP rejti a dolgokat) progit próbálok írni de a mutatókkon mindig elrontom.ha a bmfh dinamikusan foglalt, vagy a bfSize egy mutató akkor használatos a -> jel
(Ha ezt valami írható paraméterként adod át, akkor ajánlatos is, hogy mutató legyen.)
nos tehát a „bmfh->bfSize” maga egy mutató, nem pedig egy integer, amit akartál csinálni – gondolom ugyanazt követted el, amit az elõbb…Ezt pontosan nem értem. A bmfh egy struktúra ami a main ba lett deklarálva és az egyéb fügvények töltik föl az elemeit a struktúrának és egyéb fügvények használják.
main.c
Code:int main()
{
char *bmp_file;
char *file_file;
char *language;
struct bitmapfileheader bmfh;
struct bitmapinfoheader bmih;
int ret;
…
ret = bmp_check(bmp_file, file_file, language, &bmfh, &bmih);
}bmfh és bmih struktúra
Code:struct bitmapfileheader {char bfType[2]; //must always be set to ‘BM’ to declare that this is a .bmp-file.
long int bfSize; //specifies the size of the file in bytes.
int bfReserved1; // must always be set to zero.
int bfReserved2; //must always be set to zero.
long int bfOffBits; //specifies the offset from the beginning of the file to the bitmap data.
};struct bitmapinfoheader {
long int biSize; //specifies the size of the BITMAPINFOHEADER structure, in bytes.
long int biWidth; //specifies the width of the image, in pixels.
long int biHeight; //specifies the height of the image, in pixels.
int biPlanes; //specifies the number of planes of the target device, must be set to zero.
int biBitCount; //specifies the number of bits per pixel.
long int biCompression; //Specifies the type of compression, usually set to zero (no compression).
long int biSizeImage; //specifies the size of the image data, in bytes. If there is no compression, it is valid to set this member to zero.
long int biXPelsPerMeter; //specifies the the horizontal pixels per meter on the designated targer device, usually set to zero.
long int biYPelsPerMeter; //specifies the the vertical pixels per meter on the designated targer device, usually set to zero.
long int biClrUsed; //specifies the number of colors used in the bitmap, if set to zero the number of colors is calculated using the biBitCount member.
long int biClrImportant; //specifies the number of color that are ‘important’ for the bitmap, if set to zero, all colors are important.
};Most akkor jó a kódom vagy változtassak valamit?
Ha kérhetnélek szájbarágósan mert egyenlõre lama vagyok.2005-05-26-17:34 #2017240Itt típusbeli fogalmi (esetleg szintaktikai) hiányosságaid vannak…
int integer; – integer típusú változó deklarálása
int *integer_p; – integer típusra mutató címinteger_p = &integer; – a pointer megkapja az integer címét
Tehát pl. a read prototípusa így néz ki:
ssize_t read(int fd, void *buf, size_t count);Az elsõ paraméter egy file descriptor (ami egy sima integer – akármennyitõl + akármennyiig)
A második egy típus nélküli mutató, mert ilyen is van. Ami azt jelenti, hogy bármilyen típusú „elemnek” a címét be lehet ide írni.
A harmadik a darabszám.struct bitmapfileheader {
…
long int bfSize;
…
}Tehát a következõt teheted:
statikus helyfoglalás:
bitmapfileheader bmp;
ekkor
read(…, &bmp.bfSize, …)dinamikus:
bitmapfileheader *bmp;
ekkor
read(…, &bmp->bfSize, …)másik megoldás:
struct bitmapfileheader {
…
long int *bfSize;
…
}ekkor
statikus helyfoglalás:
bitmapfileheader bmp;
ekkor
read(…, bmp.bfSize, …)és dinamikusan értelem szerûen.
Persze a mutató deklarációjával csak a mutatónak foglalódik le a hely, tehát a változó helyének a lefoglalásáról mindig gondoskodni kell!!!
2005-06-11-08:36 #2017241Mutató problémáim megoldódtak köszi, viszont egy gyors kérdésem volna.
Hogy lehet elõírni hogy az int mindenképpen 4 bájt a short int mindenképpen 2 bájt legyen?
A legjobb az volna ha a kódban lehetne, de ha csak gcc paraméterekkel lehet az sem baj.A mostani rendszeremen nem jelent gondot a dolog mert ez az alap beállítás de nem ártana bebiztosítani magam hátha másik gépen nem ez a default.
kösz
2005-06-11-11:31 #2017242Még egy dolog. Most egy szteganografiás programot írok ehez szeretnék segítséget kérni. Egy BMP kép pixeleibe szeretném belekódolni az üzenete. Ha valaki tud erre jó algoritmust, akkor kérem ne titkolja le.
elõre is kösz.
2005-06-12-07:55 #2017243„Hogy lehet elõírni hogy az int mindenképpen 4 bájt a short int mindenképpen 2 bájt legyen?”
Mindig azt kell választani, ami a legtöbb infót/ugyanannyit tartalmaz, bár nem hiszem, hogy az egyiket mondjuk gcc-vel, a másikat bc-vel fordítod.
Egyébként alkalmazható még a „(típus)var”, vagy az „val & var” (ha nincs olyan típus, ami kell). Mindkettõnek az a lényege, hogy levágódna a felsõ bitek (vagy hozzáadódnak adott esetben). Bár a második esetben nemcsak 0-ák lehetnek a hozzáadott bitek; bár minden bizonnyal lassabb is, de biztosra ezzel mehetsz, ha nem ismered milyen fordító, hogyan fordítja.„Még egy dolog. Most egy szteganografiás programot írok ehez szeretnék segítséget kérni. Egy BMP kép pixeleibe szeretném belekódolni az üzenete. Ha valaki tud erre jó algoritmust, akkor kérem ne titkolja le.”
http://en.wikipedia.org/wiki/Steganography
Kiindulási alapnak…2005-06-12-09:04 #2017244Mindig azt kell választani, ami a legtöbb infót/ugyanannyit tartalmaz, bár nem hiszem, hogy az egyiket mondjuk gcc-vel, a másikat bc-vel fordítod.
Egyébként alkalmazható még a „(típus)var”, vagy az „val & var” (ha nincs olyan típus, ami kell). Mindkettõnek az a lényege, hogy levágódna a felsõ bitek (vagy hozzáadódnak adott esetben). Bár a második esetben nemcsak 0-ák lehetnek a hozzáadott bitek; bár minden bizonnyal lassabb is, de biztosra ezzel mehetsz, ha nem ismered milyen fordító, hogyan fordítja.Bocs de azt nem értem. A másik gép lehet pl egy windowsos gép vagy a SPARC is, ezért kéne a kikötés.
Bocs, de véletlenül a szerkesztést, nyomtam a quote helyett 🙂
2005-06-12-09:17 #2017245Na szóval, amit írni akartam:
„Bocs de azt nem értem. A másik gép lehet pl egy windowsos gép vagy a SPARC is, ezért kéne a kikötés.”
– Az, hogy egy bizonyos változó típus mekkora helyet kap az a fordító specialitása, nem a oprendszeré. Pl. egy asm/gépikódú byte, mindig 8 bit, egy szó mindig 16 bit stb. lesz.
– A fenti dolgok pedig arra vonatkoztak, hogy hogyan tudsz pl. egy 16 bites memória területbõl 8 biteset csinálni, ha esetleg a másik 8 bit megléte gondolt okozna…2005-06-12-09:41 #2017246– Az, hogy egy bizonyos változó típus mekkora helyet kap az a fordító specialitása, nem a oprendszeré. Pl. egy asm/gépikódú byte, mindig 8 bit, egy szó mindig 16 bit stb. lesz.
– A fenti dolgok pedig arra vonatkoztak, hogy hogyan tudsz pl. egy 16 bites memória területbõl 8 biteset csinálni, ha esetleg a másik 8 bit megléte gondolt okozna…Kösz így már érthetõvé vált. Azért kell mert a BMP fileknek van header része amibõl kiderül hogy alkalmas e steganographias célra vagy sem. Meg van adva hogy melyik mezõ hány bájt és ha más típusú változóba (pl 2 bájtos értéket egy 4 bájtos változóba ) olvasok be akkor néhány érték nem megfelelõ lesz.
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz