Ahoj,
problém už jsem vyřešil. Nicméně jak jste asi poznali, jsem v Cčku začátečník. I PHP jsem se učil takovýmto způsobem (přečetl si tutorialy a pak pokus/omyl) a dneska si troufám říci, že v PHPčku udělám témeř cokoli a i můj kód vypadá k světu (co by člověk po 7 letech nechtěl, že :) )... U C jsem ve fázi,kdy zkouším, mám za sebou jenom základní tutoriály a v blízkosti bohužel nikoho, kdy by C uměl a mohl mi pomáhat. Proto se ptám.
Vím, že MaxPocetMist jsem mohl udělat jako const int. Ale v čem je mezi int a const int rozdíl, když pominu, že const před typem z něj udělá akorát konstantu, tudíš jeho hodnotu v kódu už nemůžu měnit. Technicky to to int nezmění ne? nebo ano? v čem?
Co se týče malloc. Měl (resp mám) za to, že když vytvořím ukazatel na char ...resp char* Promena; vytvoří to proměnou o který systém ví, že bude nějakým způsobem pracovat s daty, které jsou uloženy jako char, ale že hodnota týhle proměný bude adresa v 16-kové soustavě. Potom, když si nechám vypsat třeba cout << *Promena;, tak tou hvezdickou řikám, abysi systém vzal hodnotu týhle proměný, použil jí jako adresu a na to daný místo se koukl a vytáhl data z toho místa a zpracoval jako (v mém případě) char. ... funkcí malloc jsem si nechal alokovat místo pro proměnou char dlouhou x počet znaků. funkce mi vrátila adresu, resp počáteční bod, a ten jsem nahrál do proměné Dotaz. Poté jsem na to místo v paměti přes proměnou dotaz uložil data "dotaz". Co jsem tedy udělal špatně?
Určitě uvítám vaše postřehy a připomínky :)
S pozdravem,
Michal
Příspěvky odeslané z IP adresy 94.112.250.–
Spis myslim, ze mu jde o to, aby mel dva oddelene EXacE a ty si za chodu mohli posilat informace. Na urovni program > program, bez zapojeni site.
ok,děkuju ti za vysvětlení. Hned se na to kouknu :)
Ten kód pro zpracování BMP hlaviček mám samozřejmě dán stranou. Podle toho co jsem pochopil, tak tahal z hlaviček stejně "jen" šířku a výšku obrázku (jestli se pletu, opravte me). Což je sice důležité, ale v případě, že mi kód nefunguje,výšku a šířku u testovací textury znám, nechtěl jsem si zbytečně udělat chybu právě ještě třeba v hlavičkách.
Výhoda PHP byla v tom, že když jsem něčemu nerozuměl, nechal jsem si obsah proměnné prostě vypsat pomocí ECHO();. a nastudoval problém kousek po kousku. U C to alespoň s mými znalostmi neumím a tak pro mě objevování některých chyb je docela složité. Kdyby se mi tenhle problém stal v PHP, zřejmě bych si nechal vypsat veškerý obsah proměnné z funkce fread() a kouknul se, kde se co děje špatně, či na co jsem zapoměl, že mi kód takhle "vynechá pár pixelů", bohužel se mi to stalo v C a chvílemi nechápu, co vůbec u počítače dělám a že bych se měl radši vzdálit.
Včera večer jsem si definici dohledal a našel, že řádkem #define GL_BGR 0x80E0 je přiřazena hodnota 0x80E0. Tudíš jsem na dané místo ve funkci glTexImage2d() dosadil přímo tuto hodnotu. A ejhle, všechno šlape jak má. Ale jak to, že to předtím nefungovalo, když je to v hlavičkové souboru dle mě korektně definováno?
Stále mi bohužel přetrvává problém se ztrátou cca 20px v posledním řádku souboru, viz příspěvek nahoře :-/.
Dobrý večer,
tak jsem zas tu. Po celém dni, kdy jsem se opět zkoušel prokousat OpenGL a načítáním BMP textur jsem došel až do bodu. Kdy texturu načtu z externího BMP souboru, ale:
1)místo aby se pak zobrazila jako standardní RGB. Se zobrazují barvy červená a modrá prohozené, resp.: podle modelu BRG.
2) v levém dolním rohu textury chybí cca 20 pixelů v jedom řádku (textura má být zcela jistě v techto místech pouze červená). Zkoušel jsem alokovat více místa, bez reakce, myslím si tedy, že nedostatkem místa v proměnné chyba nevzniká.
Přikládám tedy celý projekt. Včetkě BMP, zdrojových kódu,atd.
Jedná se o tuto část kódu:
int width_t, height_t;
width_t=256;
height_t=256;
FILE *fin;
char *prom;
fin=fopen("zk.bmp", "r");
prom=(char*)malloc(width_t*height_t*3);
cout << fread(prom, width_t*height_t*3,sizeof(unsigned char), fin) << endl;
cout << pes << endl;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // zpusob ulozeni bytu v texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // opakovani textury
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // volba filtru
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, // nahrani rastrovych dat do textury
height_t, height_t,
0, GL_RGB, GL_UNSIGNED_BYTE, prom);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);// vylepseni zobrazovani
glEnable(GL_TEXTURE_2D);
K prvnímu problému: Četl jsem, že by se problém RGB a BGR dal vyřešit přepsáním:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
height_t, height_t,
0, GL_BGR, GL_UNSIGNED_BYTE, prom);
POložky GL_RGB na GL_BRG. Dokonce i v dokumentaci k této funkci je tato možnost i tyto hodnoty přípustné. Když je to ovšem udělám, kompilátor vyhodí chybu [quote] 75 C:\Users\Lokutus7323\Documents\Projekty v C++\OpenGL\main.cpp `GL_BGR' was not declared in this scope[/quote]
Děkuji
V cem je tedy problem, ze program nedela to co ma?? To je ten tutorial spatne napsany?
Dobrý den,
na internetu čistě ze zvědavosti studuji seriály od OpenGL v C++. Narazil jsem na kus kódu zabývajícím se texturami. Víceméně funguje jak má, akorát se nenačítají BMP obrázky v následujícíc části kódu:
int BMPTextura(int texture, const char *filename)
{
FILE *fin;
int width, height, bpp=0;
int size;
unsigned char *bitmap;
unsigned char bmpHeader[54]={0x42, 0x4d, // magicke cislo souboru BMP
0x00, 0x00, 0x00, 0x00, // velikost souboru
0x00, 0x00, 0x00, 0x00, // rezervovano, vzdy nastaveno na nula
0x36, 0x04, 0x00, 0x00, // data offset=54
0x28, 0x00, 0x00, 0x00, // velikost hlavicky=40
0x00, 0x00, 0x00, 0x00, // sirka obrazku v pixelech=?
0x00, 0x00, 0x00, 0x00, // vyska obrazku v pixelech=?
0x01, 0x00, // pocet bitovych rovin=1
0x08, 0x00, // pocet bitu na pixel=24
0x00, 0x00, 0x00, 0x00, // metoda komprimace=nic
0x00, 0x00, 0x00, 0x00, // velikost bitmapy
0x00, 0x00, 0x00, 0x00, // pocet pixelu na metr v horizontalnim smeru
0x00, 0x00, 0x00, 0x00, // pocet pixelu na metr ve vertikalnim smeru
0x00, 0x00, 0x00, 0x00, // pocet pouzitych barev
0x00, 0x00, 0x00, 0x00, // pocet dulezitych barev
};
if (!filename)return -1;
fin=fopen(filename,"r");
if (!fin) return -1; // otevreni souboru se nezdarilo
if (fread(bmpHeader, 54, 1, fin)!=1) return -1; // nacist hlavicku BMP souboru
memcpy(&width, bmpHeader+18, 4); // sirka obrazku v pixelech
memcpy(&height, bmpHeader+22, 4); // vyska obrazku v pixelech
memcpy(&bpp, bmpHeader+28, 2); // pocet bitu na pixel
if (bpp!=24) return -1;
size=width*height*3;
bitmap=(unsigned char *)malloc(size*sizeof(unsigned char));
if (fread(bitmap, size, sizeof(unsigned char), fin)!=1)return -1; //nacteni rastrovych dat
fclose(fin);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height,// nacteni textury do GPU
0, GL_RGB, GL_UNSIGNED_BYTE, bitmap);
free(bitmap);
return 0;
}
Chyba vzniká na řádku
if (fread(bitmap, size, sizeof(unsigned char), fin)!=1)return -1; //nacteni rastrovych dat
kde funkce fread nevyhodí 1 jak by měla, ale 0. A já stále nemuhu přijít na ti proč a tak Vás prosím o radu. Určitě to bude něco banálního, ale já si s tím bohužel nevím rady.
Děkuji předem Všem, kdo poradí nebo napíšou svůj postřeh.
příklad na 5 minut a já si nad ním lámu hlavu 2 hodiny....díky moc chlape
u b) myslíš "vs" jako x (krát) ?
prosím o pomoc příkladem :
Pokud se naučíte ke zkoušce z 50 otázek pouze 25,jakou máte pravděpodobnost, že z vytažených otázek budete znát
a)všechny 3
b)alespoň 2
c nejvýše 1
předem díky
Děkuji za vyčerpávající odpověď :) , až nyní jsem svědkem toho, že mohu využít svoje znalosti z předmětu "Číslicová technika" kde jsme podobne operace probírali. Jelikož jsme z c++ začal nedávno,ještě furt mi to myslí v PHP, kde by podobná věc byla řešena místo "&" znaménky "==", proto mě to udivilo... ještě jednou tedy děkuji za vysvětlení
Dobrý den,
pročítám zde i jinde seriály o Win32 API. V jednom ukázkovém případu jsem našel zápis
if (wParam & MK_CONTROL){
/*určitá podmínka*/
}
mě by zajímalo co znamená to znaménko "&" ..vím,že kdyby byli dvě,tak by to to bylo jako AND (resp.: "a zároveň") .. jde mi o pochopení,co verze s tímto jedním znamínkem "&" znamená a kdy jí použít,event proč?..
Děkuji
Dobrý den,
před nedávnem jsem začal s C++ a WIN32 API ... avšak mám jeden zásadní problém. celý den hledám na internetu a už začínám mít na slovo "handle" alergii, ale svůj problém jsem furt nevyřešil... mám program, jedno okno, které má klasickou nabídku (soubor,atd) a ve svém těle má namalovanou při spuštění čáru. Já chci jenom aby,když otevřu nabídku soubor, kliknu na položku "nový" tak aby čára která je v těle okna aktuálně vymazala a namalovala jiná ... repsektive jde mi o to,jak okno donutit aby na nějakou určitou akci změnil jeho obsah.
#include <windows.h>
#define IDM_NEW 40001
LRESULT CALLBACK ProceduraOkna(HWND hWnd, UINT uZprava, WPARAM wParam, LPARAM lParam);
int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hInstancePredchozi,LPSTR lpCmdLine, int iCmdShow){
HWND hWnd;
TCHAR JmenoOkna[] = TEXT("Win32 API Zkouška");
MSG msg;
WNDCLASSEX wc;
wc.cbSize=sizeof(wc);
wc.style= CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=ProceduraOkna;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor=(HCURSOR)LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW);
wc.lpszMenuName="MAINMENU";
wc.lpszClassName=JmenoOkna;
wc.hIconSm=NULL;
RegisterClassEx(&wc);
hWnd = CreateWindowEx(
0,
JmenoOkna,
JmenoOkna,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
};
return msg.wParam;
}
LRESULT CALLBACK ProceduraOkna(HWND hWnd, UINT uZprava, WPARAM wParam, LPARAM lParam){
PAINTSTRUCT ps;
HDC hDC;
HMENU hMenu;
switch (uZprava){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
hDC=BeginPaint(hWnd,&ps);
MoveToEx(hDC,10,10,NULL);
LineTo(hDC,100,100);
EndPaint(hWnd, &ps);
return 0;
case WM_COMMAND:
switch (LOWORD(wParam)){
case IDM_NEW:
SendMessage(hWnd,WM_PAINT,NULL,NULL);
hDC=BeginPaint(hWnd,&ps);
MoveToEx(hDC,10,10,NULL);
LineTo(hDC,150,150);
EndPaint(hWnd, &ps);
return 0;
};
};
return DefWindowProc(hWnd, uZprava, wParam, lParam);
};
Budu rád za všechny Vaše odpovědi.Děkuji
PS: v kódu je i něco to jak jsem se pokoušel problém vyřešit