Forum » Programiranje » win api (c++)
win api (c++)
snow ::
Do sedaj sem se le igračkal z tistim console aplikacijami, sedaj pa bi rad naredil windows okence na katerem bi laufale zadeve. izpis pa kakšen input. nič kaj grafike za enkrat. samo tekst.
mi bo povedal kdo par ukazov, knjižic, whatever. pojma nimam o tem.
ms library nebi.
mogoče je kje kak tutorial alpa kaj, sam ne najdem nič.
al bi bilo pametno kako knjigo dobit?
ali bi bilo pametneje dobit borland c++ builder oz. visual c++ studio?
mi bo povedal kdo par ukazov, knjižic, whatever. pojma nimam o tem.
ms library nebi.
mogoče je kje kak tutorial alpa kaj, sam ne najdem nič.
al bi bilo pametno kako knjigo dobit?
ali bi bilo pametneje dobit borland c++ builder oz. visual c++ studio?
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins
snow ::
Hvala.
Ma sem probal po googlu nekaj iskat pa ni nikoli našlo kaj tako pametnega.
Ma sem probal po googlu nekaj iskat pa ni nikoli našlo kaj tako pametnega.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins
noraguta ::
hmm najbolsa free in cross platform framework je brzda
http://www.wxwindows.org/
precej podobna mfc-jem.Dokumentacija je solidna,tece pa takorekoc na vseh platformah.Se najslabsi je port mac OSX,ampak to te najbrz ne bo motilo. Se nekaj o portanju mfc based aplikacij na wx
http://www-106.ibm.com/developerworks/linux/library/l-mfc/ .
se ena knjigica na splosno o c++ in mfc
http://eongames.com/eckel/TICPP-2nd-ed-Vol-two.zip
btw. notri je razlozen tudi bitset.ena od tehnik za manipuliranje z poljubno dolgimi nizi bitov.
http://www.wxwindows.org/
precej podobna mfc-jem.Dokumentacija je solidna,tece pa takorekoc na vseh platformah.Se najslabsi je port mac OSX,ampak to te najbrz ne bo motilo. Se nekaj o portanju mfc based aplikacij na wx
http://www-106.ibm.com/developerworks/linux/library/l-mfc/ .
se ena knjigica na splosno o c++ in mfc
http://eongames.com/eckel/TICPP-2nd-ed-Vol-two.zip
btw. notri je razlozen tudi bitset.ena od tehnik za manipuliranje z poljubno dolgimi nizi bitov.
YuLcE ::
Moj nasvet: Visual C++ če se misliš ukvarjat z vsemi možnimi, če želiš pisati bolj enostavne programe pa definito Builderja.
MFC ni težek za naštudirat in je zelo močen... če imaš voljo in čas, poskusi najprej s tem, če pa to ne bo šlo, pa pograbi po builderju...
Literatura, ki se meni zdi najboljsa za Visual:
M$ Foundation Classes - J. Prosise : Programming Windows with MFC Second Edition (zeloooooo dobra)
( Win32 API - C. Petzold : Programming Windows 5th edit. )
drugače pa www.codeguru.net, maš vse o C-ju...
LP
MFC ni težek za naštudirat in je zelo močen... če imaš voljo in čas, poskusi najprej s tem, če pa to ne bo šlo, pa pograbi po builderju...
Literatura, ki se meni zdi najboljsa za Visual:
M$ Foundation Classes - J. Prosise : Programming Windows with MFC Second Edition (zeloooooo dobra)
( Win32 API - C. Petzold : Programming Windows 5th edit. )
drugače pa www.codeguru.net, maš vse o C-ju...
LP
windhunter ::
men je VB 6.0 cist simpaticen. se da tut brez okenc delat
poglej si na http://ucilnica.fgg.uni-lj.si/sola/RacI... (vaje zimski in poletni semester, al pa predavanja)
al pa www.visualbasicforum.com - ti pa na vsako vprasanje odgovorijo v cca 2 urah
sej da marskej narest, pa ni kompliceran
poglej si na http://ucilnica.fgg.uni-lj.si/sola/RacI... (vaje zimski in poletni semester, al pa predavanja)
al pa www.visualbasicforum.com - ti pa na vsako vprasanje odgovorijo v cca 2 urah
sej da marskej narest, pa ni kompliceran
fx ::
Imam dva programa, ločena. Kako naredim da bosta oba skupaj. Samo en problem je en program je za consolo, drugi pa je z OpenGL in v takem vrstnem redu, kot sem ju nanizal.
Nekaj takega.
lp
Nekaj takega.
lp
Gundolf ::
fx, kako pa ti narediš OpenGL okno? Ker če uporabljaš recimo Glut ali pa SDL boš zraven dobil tudi konzolo. Če pa delaš v z Win API se boš moral pa malo bolj potruditi.
Gundolf ::
Glut je platformno neodvisno orodje za odpiranje GL okna, drugo pa spet platformno neodvisno orodje za multimedijo, ki zna med drugim narediti GL okno.
Ti si verjetno naredil aplikacijo kot Win32 projekt, windows application, drugo pa kot conzole application. Ali pač v tem stilu, odvisno od kompajlerja s katerim delaš. Rešitev je da najdeš kej se nastavitve ene in druge aplikacije razlikujeta, da ti prva ne poda konzole in to popraviš. Vem da ima recimo VS ene dva parametra s katerima lahko kontroliraš ali se bo pokazala konzola ali ne.
Aja poanta zgornjih dvehorodij je pa v tem, da ju narediš kot conzole application in ti znata vseeno odpreti tudi pravo windows okno.
Ti si verjetno naredil aplikacijo kot Win32 projekt, windows application, drugo pa kot conzole application. Ali pač v tem stilu, odvisno od kompajlerja s katerim delaš. Rešitev je da najdeš kej se nastavitve ene in druge aplikacije razlikujeta, da ti prva ne poda konzole in to popraviš. Vem da ima recimo VS ene dva parametra s katerima lahko kontroliraš ali se bo pokazala konzola ali ne.
Aja poanta zgornjih dvehorodij je pa v tem, da ju narediš kot conzole application in ti znata vseeno odpreti tudi pravo windows okno.
fx ::
#include <windows.h> #include <gl/glut.h> #include <gl/gl.h> #include <iomanip> #include <time.h> #include <cstdlib> #include <iostream> #include <fstream> #include <string> using namespace std; typedef enum {E, GRAF} displayLists; const int VelPol = 24; float TempPolje[VelPol]; GLboolean doubleBuffer = GL_TRUE, iconic = GL_FALSE, keepAspect = GL_FALSE; GLfloat skinColor[] = {0.1, 1.0, 0.1, 1.0}; BOOL bQuit = FALSE; struct Podatki { float data; }; bool BeriDoc() { Podatki Data; int i = 0; std::string path; char datum[9]; _strdate(datum); datum[2] = '_'; datum[5] = '_'; for(int i = 0 ; i < 24 ; i++) TempPolje[i] = 0; path = std::string("data/") + datum + ".dat"; std::fstream doc(path.c_str(), std::ios::in | std::ios::binary); if (!doc.good()) { path = std::string("Ni datoteke ") + datum + ".dat"; if(MessageBox(NULL, path.c_str() ,"Warning", MB_OK | MB_ICONWARNING) == IDOK) { if(MessageBox(NULL, "Želite končati program?", "Vprašanje", MB_YESNO | MB_ICONQUESTION) == IDYES) { exit(0); } else { return 1; } } } else { while(!doc.eof()) { doc.read((char*)&Data, sizeof(Data)); TempPolje[i] = Data.data; i++; if (i > 24) return 1; } } } void VnesiPodatke() { Podatki temp; std::string path; char datum[9]; _strdate(datum); datum[2] = '_'; datum[5] = '_'; path = std::string("data/") + datum + ".dat"; std::fstream doc(path.c_str(), std::ios::out | std::ios::binary | std::ios::app); std::cout << path << " << " ; while (std::cin >> temp.data) { doc.write((char*)&temp, sizeof(temp)); std::cout << path << " << " ; } std::cout << std::endl; doc.close(); } void MakeGraf() { glNewList(GRAF, GL_COMPILE); glMaterialfv(GL_FRONT, GL_DIFFUSE, skinColor); glPushMatrix(); glBegin (GL_LINES); //X os glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (-1.0f, 0.0f); glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (1.0f, 0.0f); //Y os glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.0f, -1.0f); glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.0f, 1.0f); for(int i = 0; i < 10; i++) { glColor3f (1.0f, 0.0f, 0.0f); glVertex2f ((i * 0.041f) ,(TempPolje[i] * 0.006f)); //A glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (((i + 1 )* 0.041f),(TempPolje[i+1] * 0.006f)); //B } glEnd (); glPopMatrix(); } int main(int argc, char *argv[]) { VnesiPodatke(); glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE); glutInitWindowSize(800, 300); glutCreateWindow("Graf t(°C)"); while(!bQuit) { MakeGraf(); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); gluPerspective(60.0, 1.0, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); gluLookAt(0.0, 0.0, 50.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.); glPushMatrix(); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1); glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glEnable(GL_LIGHTING); glutMainLoop(); } system("PAUSE"); return 0; }
Zgoraj je program, ki sem ga sestavil skupaj iz dveh. Samo je problem, program se prevede brez napak samo ko bi moral prikazati podatke pa okno utripne pa se zapren vse skupaj. V idi se da neko napako javi samo je ne morem prebrati. Prosim za pomoč.
Za lažje razumevanje programa:
- z funkcijo DodajPodatek() vnesemo podatke v datoteko (pozneje bodo podatki prihajali preko com porta).
- z funkcijo BeriDoc() preberemo datoteko in podatke vnese v polje
- z funkcijo MakeGraf() preberemo podatke iz polja in jih prikažemo na grafu.
lp
noraguta ::
cl , link.exe
#pragma comment(linker,"/SUBSYSTEM:CONSOLE")
mingw -mconsole pr gcc za ld pa si poglej dokumentacjo.
potrem pa je potrebno shendlat še pogovor s konzolo , tole je dobro le za izpis.
v distvu se spremeni samo binany header programa. je pa stvar generična takorekoč za vse prevedene zadeve na windowsih. isti šit najdeš tudi pri managed aplikacijah.
se pa da popravit subsystem tudi z editbin programčkom ali pa kakšnim pe editorjem.
#pragma comment(linker,"/SUBSYSTEM:CONSOLE")
mingw -mconsole pr gcc za ld pa si poglej dokumentacjo.
potrem pa je potrebno shendlat še pogovor s konzolo , tole je dobro le za izpis.
v distvu se spremeni samo binany header programa. je pa stvar generična takorekoč za vse prevedene zadeve na windowsih. isti šit najdeš tudi pri managed aplikacijah.
se pa da popravit subsystem tudi z editbin programčkom ali pa kakšnim pe editorjem.
Pust' ot pobyedy k pobyedye vyedyot!
Gundolf ::
Uh, ti si si pa naredil projekt.
Prvič, tisto kar imaš znotraj while zanke in je od OpenGLa je initializacija in zato ne spada v zanko. Drugič najprej kličeš MakeGraf šele potem imaš initializacijo, rešitev prvega problema bo tudi rešitev tega. Kar se Gluta tiče nisem ziher ampak po moje mu moraš definirat nekaj funkcij - poglej kak čimbolj enostaven tutorial. Vsaj preden kličeš glutMainLoop().
Pa še to, tako kot si naredil boš moral najprej vpisati podatke, potem pa se bo vse izpisalo. Da se tudi narediti, da lahko vnašaš podatke medtem ko ti GL oklo že laufa, ampak kot sem že rekel, mislim da imaš že zdaj projekt daleč nad tvojim znanjem. Vseeno upam da ti uspe. Če še do sedaj nisi obupal tudi ni hudir da ti ne bi uspelo :)
Prvič, tisto kar imaš znotraj while zanke in je od OpenGLa je initializacija in zato ne spada v zanko. Drugič najprej kličeš MakeGraf šele potem imaš initializacijo, rešitev prvega problema bo tudi rešitev tega. Kar se Gluta tiče nisem ziher ampak po moje mu moraš definirat nekaj funkcij - poglej kak čimbolj enostaven tutorial. Vsaj preden kličeš glutMainLoop().
Pa še to, tako kot si naredil boš moral najprej vpisati podatke, potem pa se bo vse izpisalo. Da se tudi narediti, da lahko vnašaš podatke medtem ko ti GL oklo že laufa, ampak kot sem že rekel, mislim da imaš že zdaj projekt daleč nad tvojim znanjem. Vseeno upam da ti uspe. Če še do sedaj nisi obupal tudi ni hudir da ti ne bi uspelo :)
fx ::
Rešo:
Tako zdaj vse deluje. Kot mora.
#include <gl/glut.h> #include <gl/gl.h> #include <iomanip> #include <time.h> #include <cstdlib> #include <iostream> #include <fstream> #include <string> typedef enum {E, GRAF} displayLists; const int VelPol = 24; float TempPolje[VelPol]; float newModel = 1; BOOL bQuit = FALSE; std::string path; GLfloat skinColor[] = {0.1, 1.0, 0.1, 1.0}; struct Podatki { float data; }; void Datoteka() { char datum[9]; _strdate(datum); datum[2] = '_'; datum[5] = '_'; path = std::string("data/") + datum + ".dat"; } bool BeriDoc() { Podatki Data; int i = 0; for(int i = 0 ; i < 24 ; i++) TempPolje[i] = 0; std::fstream doc(path.c_str(), std::ios::in | std::ios::binary); while(!doc.eof()) { doc.read((char*)&Data, sizeof(Data)); TempPolje[i] = Data.data; i++; if (i > 24) return 1; } } void VnesiPodatke() { int i = 0; Podatki temp; std::fstream doc(path.c_str(), std::ios::out | std::ios::binary /*| std::ios::app*/); std::cout << path << " << " ; while (std::cin >> temp.data) { doc.write((char*)&temp, sizeof(temp)); std::cout << path << " << " ; } doc.close(); } void redraw(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glCallList(GRAF); glutSwapBuffers(); } void MakeGraf() { glNewList(GRAF, GL_COMPILE); glMaterialfv(GL_FRONT, GL_DIFFUSE, skinColor); glPushMatrix (); glBegin(GL_LINES); //X os /*for(int x = 0; x < 10; x++) { float y; y = x * 0.1f;*/ glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (-1.0f, 0.0f); glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (1.0f, 0.0f); // } //Y os /*for(int y = 0; y < 10; y++) { float x; x = y * 0.1f;*/ glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.0f, -1.0f); glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.0f, 1.0f); //} for(int i = 0; i < 10; i++) { glColor3f (1.0f, 0.0f, 0.0f); glVertex2f ((i * 0.1f) ,(TempPolje[i] * 0.1f)); //A glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (((i + 1 )* 0.1f),(TempPolje[i+1] * 0.1f)); //B } glEnd (); glPopMatrix (); glEndList(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE); glutInitWindowPosition(224,0); glutInitWindowSize(800, 600); glutCreateWindow("Graf t(°C)"); glutDisplayFunc(redraw); Datoteka(); std::cout << "+-------------------+" << std::endl << "| by Mihael PAJZLAR |" << std::endl << "+-------------------+" << std::endl; VnesiPodatke(); BeriDoc(); MakeGraf(); glEnable(GL_DEPTH_TEST); glutMainLoop(); return 0; }
Tako zdaj vse deluje. Kot mora.
Zgodovina sprememb…
- spremenil: fx ()
Nerdor ::
Malo sem ti popravil:
Pod kaj si tole zadevo skompajlal!? Jest sem odprl nov projekt v VS.Net 2003 in prevedel kot "fx_ogl_thing.cpp". Pa mi javi precej čuden error.
"c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\stdlib.h(256): error C2381: 'exit' : redefinition; __declspec(noreturn) differs"
Hm, kaj naj bi bilo narobe, da mi noče VS.Net prevesti kot C++ projekt!?
PS: a kdo proba tole pod linuxom prevest, sem malo len, se mi ne da dualbootat v L.
#include <gl/glut.h> #include <gl/gl.h> #include <iomanip> #include <ctime> // spremenil iz time.h #include <cstdlib> // dodal bool bQuit = false; // z malo, ker C++ ne mara BOOL in FALSE bool BeriDoc() { Podatki Data; // iz sprem. i v x, ker ne pusti VS pod C++ več // sprem. z enakim imenom (motijo ga, več i-jev) for(int x = 0 ; x < 24 ; x++) TempPolje[x] = 0; std::fstream doc(path.c_str(), std::ios::in | std::ios::binary); int i = 0; while(!doc.eof()) { doc.read((char*)&Data, sizeof(Data)); TempPolje[i] = Data.data; i++; if (i > 24) return 1; } }
Pod kaj si tole zadevo skompajlal!? Jest sem odprl nov projekt v VS.Net 2003 in prevedel kot "fx_ogl_thing.cpp". Pa mi javi precej čuden error.
"c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\stdlib.h(256): error C2381: 'exit' : redefinition; __declspec(noreturn) differs"
Hm, kaj naj bi bilo narobe, da mi noče VS.Net prevesti kot C++ projekt!?
PS: a kdo proba tole pod linuxom prevest, sem malo len, se mi ne da dualbootat v L.
... for lifetime!
Zgodovina sprememb…
- spremenil: Nerdor ()
fx ::
Vso zdave s skompajlal pod Dev-C++.
Kaj si popravo, ker jaz nisem nič našel, prekopiraj samo tisto vrstico kode.
Aja če boš prihodnjič kopiral kodo potem napiši še [ st.koda c ] vmes priepiš kodo [ / st.koda c ].
Kaj si popravo, ker jaz nisem nič našel, prekopiraj samo tisto vrstico kode.
Aja če boš prihodnjič kopiral kodo potem napiši še [ st.koda c ] vmes priepiš kodo [ / st.koda c ].
fx ::
Kako moram narediti, da se mi bo graf izrisaval tako dolgo dokler ne pritisnem tipke ESC (ali katero drugo), med tem bral podatke iz datoteke. Probal sem s tem in gre:
lp
#include <conio.h> #include <iostream> int main() { int ch = getch(); while(ch != '\x1b') { ch = getch(); std::cout << ch << std::endl; } return 0; }
lp
Nerdor ::
Probaj takole
Fukcija pa je definirana s prototipom:
Vsak znak ima spredaj VK_ in je pisan z veliko, npr: VK_SHIFT, VK_ENTER in itd.
while (GetAsyncKeyState(VK_ESCAPE) && 0x80) { ..ostala koda }
Fukcija pa je definirana s prototipom:
SHORT GetAsyncKeyState(int nVK);
Vsak znak ima spredaj VK_ in je pisan z veliko, npr: VK_SHIFT, VK_ENTER in itd.
... for lifetime!
Zgodovina sprememb…
- spremenil: Nerdor ()
fx ::
Program se prevede samo, se vse hitro konča. Moral sem narediti to:
Imam pa še en problem, kako to spravim v funkcijo.
lp
while (!GetAsyncKeyState(VK_ESCAPE) && 0x80) //tako program obstane v zanki in ob pritisku na ESC se nič ne zgodi while (GetAsyncKeyState(VK_ESCAPE) && 0x80) //tako program ne ostane v zanki
Imam pa še en problem, kako to spravim v funkcijo.
SHORT GetAsyncKeyState(int nVK);
lp
Nerdor ::
Ah, pusti tisti SHORT AsyncKeyState.... To je samo prototip, da vidiš, kako izgleda funkcija in nič drugega.. To je že vpisano nekje v standardnih *.h ali namespaceih, tak da tebi to ni treba definirati.
Sem ti našel na tej spletni strani http://www.digitalmars.com/rtl/conio.html nekaj standardnih funkcij. Mislim, da je naš kandidat funkcija _kbhit()
Po moje probaj takole:
Sem ti našel na tej spletni strani http://www.digitalmars.com/rtl/conio.html nekaj standardnih funkcij. Mislim, da je naš kandidat funkcija _kbhit()
Po moje probaj takole:
#include<conio.h> while (!_kbhit() && _getch != '\x1b') {.. ostalo }
... for lifetime!
Zgodovina sprememb…
- spremenil: Nerdor ()
fx ::
To sem tudi rešil. Tu je koda:
Do sedaj sem bil navajen takega programiranja, da sem moral uporabiti zanko v int main() funkciji, sedaj je ne potrebujem a se mi program vseeno izvaja. Torej lahko sklepam da se probram prevde nastavi parametre potem pa čaka na dogodek? Če se motim me popravite.
lp
void processNormalKeys(unsigned char key, int x, int y) { if (key == 27) //Koda za ESC exit(0); } //ta del napišete v funkcijo int main(); glutKeyboardFunc(processNormalKeys);
Do sedaj sem bil navajen takega programiranja, da sem moral uporabiti zanko v int main() funkciji, sedaj je ne potrebujem a se mi program vseeno izvaja. Torej lahko sklepam da se probram prevde nastavi parametre potem pa čaka na dogodek? Če se motim me popravite.
lp
fx ::
Aha. Kako potem naj naredimi, da mi bo program vesčas bral iz datoteke in risal graf?
Probal sem postaviti while znako v funkciji MakeGraf() in se nič zgodilo?
lp
Probal sem postaviti while znako v funkciji MakeGraf() in se nič zgodilo?
lp
Gundolf ::
nekako takole narediš funkcijo, ki se izvaja v glavni zanki
med initializacijo kličeš tole:
in rezultat bo skoraj podoben spodnjemu, le da bo zraven lahko glut opravljal svoje delo, se pravi risal, preverjal tipkovnico ...
In zdaj se ti bo v konzoli pojavljale traparije dokler ti bo program tekel. Tule si lahko prebereš še druge stvari, ki ti jih lahko storiš.
Ups napakica.
void noviMain() { std::cout << "pisi traparije\n"; }
med initializacijo kličeš tole:
glutIdleFunc(noviMain);
in rezultat bo skoraj podoben spodnjemu, le da bo zraven lahko glut opravljal svoje delo, se pravi risal, preverjal tipkovnico ...
while(true) { std::cout << "pisi traparije\n"; }
In zdaj se ti bo v konzoli pojavljale traparije dokler ti bo program tekel. Tule si lahko prebereš še druge stvari, ki ti jih lahko storiš.
Ups napakica.
Zgodovina sprememb…
- spremenil: Gundolf ()
fx ::
Včerja sem našel program (glej link ), ki mi pošilja/bere podatke na/iz serijskih vrat. Samo je problem, ko želim program vključiti v moj program mi noče brati iz serijskega porta in shranjevati in brati v/iz datoteko.
Lahko prilepom kodo, kako smo to rešil.
lp
Lahko prilepom kodo, kako smo to rešil.
lp
Zgodovina sprememb…
- spremenil: fx ()
fx ::
#include <windows.h> #include <gl/glut.h> #include <gl/gl.h> #include <iomanip> #include <ctime> #include <cstdlib> #include <iostream> #include <fstream> #include <string> #define BUFLEN 20 typedef enum {E, GRAF} displayLists; const int VelPol = 200; float Polje[VelPol]; char Datum[9]; float Read[BUFLEN+1]; float Data; std::string NameDoc; GLfloat skinColor[] = {0.1, 1.0, 0.1, 1.0}; void Doc() { _strdate(Datum); Datum[2] = '_'; Datum[5] = '_'; NameDoc = std::string("data/") + Datum + ".dat"; } bool ReadDoc() { int i = 0; std::fstream doc(NameDoc.c_str(), std::ios::in | std::ios::binary); while(!doc.eof()) { doc.read((char*)&Data, sizeof(Data)); Polje[i] = Data; i++; std::cout << "Data >> " << Data << std::endl; } doc.close(); } void MakeGraf(void) { glNewList(GRAF, GL_COMPILE); glMaterialfv(GL_FRONT, GL_DIFFUSE, skinColor); glPushMatrix (); glBegin(GL_LINES); //X os for(int x = 0; x < 40; x++) { float y; y = x * 5.0f; //1.0f = 5°, 5.0f = 25° glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (-0.5f, y); glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (40.0f, y); } //Y os for(int y = 0; y < 40; y++) { float x; x = y * 5.0f; //1.0f = 5°, 5.0f = 25° glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (x, -0.5f); glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (x, 40.0f); } for(int i = 0; i < 200; i++) { glColor3f (1.0f, 0.0f, 0.0f); glVertex2f ((i * 0.2f) ,(Polje[i] * 0.2f)); //A glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (((i + 1 )* 0.2f),(Polje[i+1] * 0.2f)); //B } glEnd (); glPopMatrix (); glEndList(); } void ReadComPort() { Doc(); DWORD byteswritten; DWORD bytesread; HANDLE comport; comport = CreateFile("COM1:",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); ReadFile(comport,&Read,BUFLEN,&bytesread,NULL); std::cout << "Com1_1 >> " << Read << ", " << Read[bytesread]<< ", " << bytesread << std::endl; Read[bytesread] = '\0'; std::fstream doc(NameDoc.c_str(), std::ios::out | std::ios::binary | std::ios::app); std::cout << "Com1_2 >> " << Read << ", " << Read[bytesread]<< ", " << bytesread << std::endl; system("PAUSE"); if(!Read) { doc.write((char*)&Read, sizeof(Read)); doc.close(); ReadDoc(); } MakeGraf(); } void redraw(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glCallList(GRAF); glutSwapBuffers(); } void ProcessNormalKeys(unsigned char key, int x, int y) { if(key == 27) exit(0); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE); glutInitWindowPosition(380,0); //Pozicije okna glutInitWindowSize(640, 480); //Velikost okna glutCreateWindow("Graf t(°C)"); //Ime okna glutDisplayFunc(redraw); //izris grafa glutKeyboardFunc(ProcessNormalKeys); //Preverjenj tipk na tipkovnici glutIdleFunc(ReadComPort); //Program leti v zanki std::cout << "+--------------------------+" << std::endl << "| by Mihael & Anton PAJZLAR|" << std::endl << "+--------------------------+" << std::endl; glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); gluPerspective(44.0, 1.0, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); gluLookAt(19.5, 19.5, 50.0, 19.5, 19.5, 0.0, 0.0, 24.0, 0.0); glPushMatrix(); glutMainLoop(); return 0; } /* Rezultat poslanih dveh številk 1 in 12.05 seveda sem vmes moral program ponovno zagnati. //Poslano 1 Com1_1 >> 0x446350 0 1 Com1_2 >> 0x446350 0 1 Com1_1 >> 0x446350 6.86636e-044 0 Com1_2 >> 0x446350 0 0 //Polsano 12.05 Com1_1 >> 0x446350, 0, 5 Com1_2 >> 0x446350, 0, 5 Com1_1 >> 0x446350, 6.33722e-010, 0 Com1_2 >> 0x446350, 0, 0 */
Problem tiči v funkciji ReadComPort().
lp
fx ::
Moral sem uporabiti funkcijo:
double atof(const char* string);lp
Zgodovina sprememb…
- spremenil: fx ()
Nerdor ::
fx: program je super napisan. Zanima me, a se to prek serijskega porta in serijskega kabla "pogovarjata" dva računalnika? Samo predvidevam iz kode.
Drugače si na dobri poti, da postaneš pravi developer (več kot samo programer).
Drugače si na dobri poti, da postaneš pravi developer (več kot samo programer).
... for lifetime!
fx ::
Nerdor se, ker sem tako preverjal ali prav deluje zadeva, saj nazadnje je programu vseeno kdo mu je poslal. Na začetku sem uporabljal Hyper Terminal, ker nisem vedel nastaviti kako pošlješ 1234 v eni obliki (HT pošlje 1,2,3,4) sem napisal svoj program, ki ti pošlje kako dolgo besedo želiš.
lp
lp
fx ::
#include <windows.h> #include <gl/glut.h> #include <gl/gl.h> #include <stdlib.h> #include <iomanip> #include <ctime> #include <cstdlib> #include <iostream> #include <fstream> #include <string> #define BUFLEN 7 typedef enum {E, GRAF} displayLists; const int VelPol = 200; double Polje[VelPol]; double Data; char Datum[9]; char Read[BUFLEN+1]; std::string NameDoc; GLfloat SkinColor[] = {0.1, 1.0, 0.1, 1.0}; DWORD BytesRead; HANDLE ComPort; void Date() { _strdate(Datum); Datum[2] = '_'; Datum[5] = '_'; NameDoc = std::string("data/") + Datum + ".dat"; } void ReadDoc() { int i = 0; std::fstream doc(NameDoc.c_str(), std::ios::in | std::ios::binary); while(!doc.eof()) { doc.read((char*)&Data, sizeof(Data)); Polje[i] = Data; i++; } doc.close(); } void MakeGraph() { glNewList(GRAF, GL_COMPILE); glMaterialfv(GL_FRONT, GL_DIFFUSE, SkinColor); glPushMatrix (); glBegin(GL_LINES); for(int x = 0; x < 40; x++) { double y; y = x * 5.0f; glColor3f(0.0f, 1.0f, 0.0f); glVertex2d(-0.5, y); glColor3f(0.0f, 1.0f, 0.0f); glVertex2d(40.0, y); } for(int y = 0; y < 40; y++) { double x; x = y * 5.0f; glColor3f(0.0f, 1.0f, 0.0f); glVertex2d(x, -0.5); glColor3f(0.0f, 1.0f, 0.0f); glVertex2d(x, 40.0); } for(int i = 0; i < 200; i++) { glColor3f (1.0f, 0.0f, 0.0f); glVertex2d((i * 0.2) ,(Polje[i] * 0.2)); glColor3f (1.0f, 0.0f, 0.0f); glVertex2d(((i + 1 )* 0.2),(Polje[i+1] * 0.2)); } glEnd(); glPopMatrix(); glEndList(); } void ReadComPort() { ComPort = CreateFile("COM1:",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); Date(); ReadFile(ComPort,&Read,BUFLEN,&BytesRead,NULL); Read[BytesRead] = '\0'; Data = atof(Read); std::cout << "COM1 >> " << Data << std::endl; std::fstream doc(NameDoc.c_str(), std::ios::out | std::ios::app |std::ios::binary); doc.write((char*)&Data, sizeof(Data)); doc.close(); ReadDoc(); MakeGraph(); } void Redraw(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glCallList(GRAF); glutSwapBuffers(); } void ProcessNormalKeys(unsigned char KeyPress, int x, int y) { if(KeyPress == 27) { exit(0); CloseHandle(ComPort); } } int main(int argc, char *argv[]) { std::cout << "+-------------------+" << std::endl << "| by Mihael PAJZLAR |" << std::endl << "+-------------------+" << std::endl; glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE); glutInitWindowPosition(380,0); glutInitWindowSize(640, 480); glutCreateWindow("Graf t(°C)"); glutDisplayFunc(Redraw); glutKeyboardFunc(ProcessNormalKeys); //glutIdleFunc(MakeGraph); ReadComPort(); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); gluPerspective(44.0, 1.0, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); gluLookAt(19.5, 19.5, 50.0, 19.5, 19.5, 0.0, 0.0, 24.0, 0.0); glPushMatrix(); glutMainLoop(); return EXIT_SUCCESS; }
Program lepo deluje, kot mora, samo ima eno napako, samo 1x lahko prebere iz seriskih vrat, ker če dam funkcijo ReadComPort v glutIdleFunc(), potem leti v zanki in mi win javi napako programa se ustavi. Kako naj to rešim, da mi bo program čakal ponovno pri ReadFile(ComPort,&Read,BUFLEN,&BytesRead,NULL) dokler ne pride novi podatek.
lp
fx ::
Res nihče ne ve kako to naj rešim? Želim da mi bo program vedno prebrani podatke izrisal na graf.
lp
lp
fx ::
#include <windows.h> #include <gl/glut.h> #include <gl/gl.h> #include <stdlib.h> #include <iomanip> #include <ctime> #include <cstdlib> #include <iostream> #include <fstream> #include <string> #define BUFLEN 7 typedef enum {E, GRAF} displayLists; const int VelPol = 200; double Polje[VelPol]; double Data; char Datum[9]; char Read[BUFLEN+1]; std::string NameDoc; GLfloat SkinColor[] = {0.1, 1.0, 0.1, 1.0}; DWORD BytesRead; HANDLE ComPort; void Date() { _strdate(Datum); Datum[2] = '_'; Datum[5] = '_'; NameDoc = std::string("data/") + Datum + ".dat"; } void ReadDoc() { int i = 0; std::fstream doc(NameDoc.c_str(), std::ios::in | std::ios::binary); while(!doc.eof()) { doc.read((char*)&Data, sizeof(Data)); Polje[i] = Data; i++; } doc.close(); } void ReadComPort() { Date(); ComPort = CreateFile("COM1:",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); ReadFile(ComPort,&Read,BUFLEN,&BytesRead,NULL); Read[BytesRead] = '\0'; Data = atof(Read); std::fstream doc(NameDoc.c_str(), std::ios::out | std::ios::app |std::ios::binary); doc.write((char*)&Data, sizeof(Data)); doc.close(); ReadDoc(); CloseHandle(ComPort); } void MakeGraph() { glNewList(GRAF, GL_COMPILE); glMaterialfv(GL_FRONT, GL_DIFFUSE, SkinColor); glPushMatrix (); glBegin(GL_LINES); for(int x = 0; x < 21; x++) { double y; y = x * 2.0f; glColor3f(0.0f, 1.0f, 0.0f); glVertex2d(-0.5, y); glColor3f(0.0f, 1.0f, 0.0f); glVertex2d(40.0, y); } for(int y = 0; y < 21; y++) { double x; x = y * 2.0f; glColor3f(0.0f, 1.0f, 0.0f); glVertex2d(x, -0.5); glColor3f(0.0f, 1.0f, 0.0f); glVertex2d(x, 40.0); } for(int i = 0; i < 200; i++) { glColor3f (1.0f, 1.0f, 0.0f); glVertex2d((i * 0.2) ,(Polje[i] * 0.2)); glColor3f (1.0f, 1.0f, 0.0f); glVertex2d(((i + 1 )* 0.2),(Polje[i+1] * 0.2)); } glEnd(); glPopMatrix(); glEndList(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glCallList(GRAF); glutSwapBuffers(); ReadComPort(); } void Redraw(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glCallList(GRAF); glutSwapBuffers(); } void ProcessNormalKeys(unsigned char KeyPress, int x, int y) { if(KeyPress == 27) { exit(0); CloseHandle(ComPort); } } int main(int argc, char *argv[]) { std::cout << "+-------------------+" << std::endl << "| by Mihael PAJZLAR |" << std::endl << "+-------------------+" << std::endl; glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE); glutInitWindowPosition(380,0); glutInitWindowSize(640, 480); glutCreateWindow("Graf t(°C)"); glutDisplayFunc(Redraw); glutKeyboardFunc(ProcessNormalKeys); glutIdleFunc(MakeGraph); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); gluPerspective(44.0, 1.0, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); gluLookAt(19.5, 19.5, 50.0, 19.5, 19.5, 0.0, 0.0, 24.0, 0.0); glPushMatrix(); glutMainLoop(); return EXIT_SUCCESS; }
Sedaj program deluje kot mora, bere podatke iz serijskih vrat in jih shranjuje v datoteko nato jih prebere iz datoteke in jih vpiše v Polje[200] in prikaže na grafu. Ves program deluje v zanki doker ne pritisnete tipke ESC.
Vsem najlepša hvala, ki so mi posredno ali neposreno pomagali pri nastanku tega programa.
lp
Zgodovina sprememb…
- spremenil: fx ()
fx ::
Rad bi naredo 3D relief kako naredim, da se mi bodo ostri koti zaoblili? Predvidevam, da bom moral uporabiti kako matematično funkcijo, mogoče kako sin oz. cos funkcijo? Če se motim me popravite.
lp
lp
Zgodovina sprememb…
- spremenil: fx ()
fogl ::
Nerdor se, ker sem tako preverjal ali prav deluje zadeva, saj nazadnje je programu vseeno kdo mu je poslal. Na začetku sem uporabljal Hyper Terminal, ker nisem vedel nastaviti kako pošlješ 1234 v eni obliki (HT pošlje 1,2,3,4) sem napisal svoj program, ki ti pošlje kako dolgo besedo želiš.
Dobi so docklight ( http://www.docklight.de/ ) Ta omogoča tako pošiljanje (1234). Možno je tudi nastavit, da ko sprejme določen tekst sam avtomatsko odgovori.
lp, klemen
Vesoljc ::
@fx
več varjant imaš:
- height map (bitna slika, črna je globina, bela je vrh), lahko jo pač narišeš
- ali pa kak random generator terena (patchi, krivulje, itd...)
go google ;)
več varjant imaš:
- height map (bitna slika, črna je globina, bela je vrh), lahko jo pač narišeš
- ali pa kak random generator terena (patchi, krivulje, itd...)
go google ;)
Abnormal behavior of abnormal brain makes me normal...
fx ::
Želim narediti 3D stožec naslednje oblike:
lp
_/ /Sedaj to moram nekako spraviti v krog, samo kako?
lp
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C++] charset-aOddelek: Programiranje | 909 (766) | SasoS |
» | Mucim se z nalogo C++Oddelek: Programiranje | 1186 (1023) | MareMareCare |
» | Visual Studio C++ MessageBox izpis večih spremenljivkOddelek: Programiranje | 1730 (1471) | spinner |
» | int to string v c++Oddelek: Programiranje | 2344 (2072) | OwcA |
» | [c++] zapis doubla/longa v datotekoOddelek: Programiranje | 914 (838) | 64202 |