» »

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 8-O 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

Vesoljc ::

Abnormal behavior of abnormal brain makes me normal...

snow ::

Hvala.

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.

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

YuLcE ::

aja, se to... mislim, da se dasta obe knjigi dobiti v elektronski obliki...

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

kyon ::

Yulce, Kje pa bi se dalo to dobiti na netu?

Hvala.

LP

Zgodovina sprememb…

  • spremenil: kyon ()

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

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.

fx ::

Do sedaj sem delal kot Win API. Kako se dela z Glut ali SDL in kaj je to?

lp

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.

fx ::

Potem je vseeno katerega uporabim ali moram oba?

lp

Gundolf ::

Glut ali SDL ali navaden Win API ali kaj tretjega ali kaj četrtega.

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.
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 :)

fx ::

Rešo:
#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:
#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 ].

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:
#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
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:
 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:
#include<conio.h>


while (!_kbhit() && _getch != '\x1b')
{.. ostalo }
... for lifetime!

Zgodovina sprememb…

  • spremenil: Nerdor ()

fx ::

Tvoj primer deluje pod consolo aplikacijo, jaz pa bi rabo za OpenGL aplikacijo.

lp

fx ::

To sem tudi rešil. Tu je koda:
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

Gundolf ::

Še vedno imaš zanko, le da je skrita v glut funkciji (glutMainLoop();)

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

Gundolf ::

nekako takole narediš funkcijo, ki se izvaja v glavni zanki
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 ::

Zdaj deluje, kot mora.

Hvala vam za pomoč.

lp

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

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 ::

Že vem kaj je narobe.

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).:)
... 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

fx ::

Nerdor hvala za pohvalo.

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

fx ::

Zakaj mi program samo prikaže prvi podatke ki ga vnesem ostale pa mi samo piše v datoteko?

lp

fx ::

Sem rešil.

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

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 ;)
Abnormal behavior of abnormal brain makes me normal...

fx ::

Želim narediti 3D stožec naslednje oblike:
 _/
/
Sedaj to moram nekako spraviti v krog, samo kako?

lp

Gundolf ::

Zavrtiš ga okoli osi mar ne? Malo premetavanja vektorjev pač. Pogooglaj.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] charset-a

Oddelek: Programiranje
7816 (673) SasoS
»

Mucim se z nalogo C++

Oddelek: Programiranje
61120 (957) MareMareCare
»

Visual Studio C++ MessageBox izpis večih spremenljivk

Oddelek: Programiranje
181645 (1386) spinner
»

int to string v c++

Oddelek: Programiranje
272244 (1972) OwcA
»

[c++] zapis doubla/longa v datoteko

Oddelek: Programiranje
9858 (782) 64202

Več podobnih tem