Näytä kirjoitukset

Tässä osiossa voit tarkastella kaikkia tämän jäsenen viestejä. Huomaa, että näet viestit vain niiltä alueilta, joihin sinulla on pääsy.


Viestit - teele

Sivuja: 1 ... 23 24 [25] 26 27 ... 41
481
 tässä on vielä koe-ohjelma, jota yritän kääntää, voihan siinäkin olla virhe, mutta se on suoraan netin oppaasta ja menee läpi täällä   https://regex101.com/

Koodia: [Valitse]

 #include <iostream>
 #include <regex>
 #include <string>
 
 using namespace std;
 
 int main()
 {
  string input;
  regex integer("(\\+|-)?[[:digit:]]+");
  //As long as the input is correct ask for another number
  while(true)
  {
  cout<<"Give me an integer!"<<endl;
  cin>>input;
  if(!cin) break;
  //Exit when the user inputs q
  if(input=="q")
  break;
  if(regex_match(input,integer))
  cout<<"integer"<<endl;
  else
  {
  cout<<"Invalid input"<<endl;
  }
}
 }


koneessa olevat kääntäjät ovat
Koodia: [Valitse]
which gcc-
gcc-4.8         gcc-ar-4.8      gcc-nm-4.8      gcc-ranlib-4.8
gcc-4.9         gcc-ar-4.9      gcc-nm-4.9      gcc-ranlib-4.9
gcc-ar          gcc-nm          gcc-ranlib


komento
Koodia: [Valitse]
gcc-4.9 regex01.cpp -o regex01 -Wall -pedantic -std=c++11

tulostaa ruutukaupalla virheilmoituksia, mutta g++ -komento kääntää mukisematta, ja vasta käännetty ohjelma kaatuu.



482

näyttää olevan asentunut täältä
Koodia: [Valitse]
apt-cache policy gcc-4.9
gcc-4.9-base:
  Asennettu: 4.9.3-0ubuntu4
  Ehdokas:   4.9.3-0ubuntu4
  Versiotaulukko:
 *** 4.9.3-0ubuntu4 0
        500 http://fi.archive.ubuntu.com/ubuntu/ trusty-updates/main amd64 Packages
        100 /var/lib/dpkg/status
     4.9-20140406-0ubuntu1 0
        500 http://fi.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages
le1@l1:~/bi/rex$


ja sitten on vielä tämä, pitäisikö vielä nyt lisätä niitä pakettivarastoja

Koodia: [Valitse]
sudo apt-get install g++-4.9
Luetaan pakettiluetteloita... Valmis
Muodostetaan riippuvuussuhteiden puu       
Luetaan tilatiedot... Valmis       
E: Pakettia g++-4.9 ei löydy
E: Couldn't find any package by regex 'g++-4.9'




483

gcc-4.9 näyttää kyllä asentuvan, mutta se ei kuitenkaan suostu kääntämään. Alla näkyy, että jotain hakemistorakenteissa on pielessä.


Koodia: [Valitse]
sudo apt-get install gcc-4.9

Koodia: [Valitse]

gcc-4.9 regex01.cpp -o regex01 -Wall -pedantic -std=c++11
gcc-4.9: error trying to exec 'cc1plus': execvp: Tiedostoa tai hakemistoa ei ole

484
Olen onnistunut kääntämään joitain esimerkkiohjelmia Ubuntu 14.04:ssä komennolla

Koodia: [Valitse]
g++ koe.cpp -o koe -Wall -pedantic -std=c++11
mutta netissä sanotaan, että esimerkiksi regex tarvitsee uudemman kääntäjäversion.

Mikä olisi turvallinen tapa saada käyttöön esimerkiksi versio 4.9 tai 5.1 gcc:stä. Ratkeaisiko kysymys päivittämällä koko Ubuntu versioon 16.04 eli onko siinä mukana uudempi kääntäjäversio.




485

Joskus olisi mukava tehdä dynaaminen käyrä ja saada se näkymään ruudulla.

Olisiko opengl mahdollinen.

Alla oleva ohjelma toimii liukuvärjäyksen osalta, mutta kolmioita en saa onnistumaan.

Koodia: [Valitse]
#include<stdio.h>
#include<stdlib.h>
#include<X11/X.h>
#include<X11/Xlib.h>
#include<GL/gl.h>
#include<GL/glx.h>
#include<GL/glu.h>


//#include <GL/glew.h>  // oma lisäys, tätä ei ole



Display                 *dpy;
Window                  root;
GLint                   att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None };
XVisualInfo             *vi;
Colormap                cmap;
XSetWindowAttributes    swa;
Window                  win;
GLXContext              glc;
XWindowAttributes       gwa;
XEvent                  xev;

void DrawAQuad() {
 glClearColor(1.0, 1.0, 1.0, 1.0);
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glOrtho(-1., 1., -1., 1., 1., 20.);

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 gluLookAt(0., 0., 10., 0., 0., 0., 0., 1., 0.);

 glBegin(GL_QUADS);
  glColor3f(1., 0., 0.); glVertex3f(-.75, -.75, 0.);
  glColor3f(0., 1., 0.); glVertex3f( .75, -.75, 0.);
  glColor3f(0., 0., 1.); glVertex3f( .75,  .75, 0.);
  glColor3f(1., 1., 0.); glVertex3f(-.75,  .75, 0.);
 glEnd();
}
 
// oma lisäys ***************************
void drawTriangle()
{
    glClearColor(0.4, 0.4, 0.4, 0.4);
    glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(1.0, 1.0, 1.0);
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);

        glBegin(GL_TRIANGLES);
                glVertex3f(-0.7, 0.7, 0);
                glVertex3f(0.7, 0.7, 0);
                glVertex3f(0, -1, 0);
        glEnd();

    glFlush();
}



int main(int argc, char *argv[]) {

 dpy = XOpenDisplay(NULL);
 
 if(dpy == NULL) {
  printf("\n\tcannot connect to X server\n\n");
        exit(0);
 }
       
 root = DefaultRootWindow(dpy);

 vi = glXChooseVisual(dpy, 0, att);

 if(vi == NULL) {
printf("\n\tno appropriate visual found\n\n");
        exit(0);
 }
 else {
printf("\n\tvisual %p selected\n", (void *)vi->visualid); /* %p creates hexadecimal output like in glxinfo */
 }


 cmap = XCreateColormap(dpy, root, vi->visual, AllocNone);

 swa.colormap = cmap;
 swa.event_mask = ExposureMask | KeyPressMask;
 
 win = XCreateWindow(dpy, root, 0, 0, 600, 600, 0, vi->depth, InputOutput, vi->visual, CWColormap | CWEventMask, &swa);

 XMapWindow(dpy, win);
 XStoreName(dpy, win, "VERY SIMPLE APPLICATION");
 
 glc = glXCreateContext(dpy, vi, NULL, GL_TRUE);
 glXMakeCurrent(dpy, win, glc);
 
 glEnable(GL_DEPTH_TEST);
 
 while(1) {
  XNextEvent(dpy, &xev);
       
        if(xev.type == Expose) {
        XGetWindowAttributes(dpy, win, &gwa);
                glViewport(0, 0, gwa.width, gwa.height);
        DrawAQuad();
                    // drawTriangle();  // ei toimi
                glXSwapBuffers(dpy, win);
        }
               
else if(xev.type == KeyPress) {
        glXMakeCurrent(dpy, None, NULL);
  glXDestroyContext(dpy, glc);
  XDestroyWindow(dpy, win);
  XCloseDisplay(dpy);
  exit(0);
        }
    } /* this closes while(1) { */
} /* this is the } which closes int main(int argc, char *argv[]) { */


Käännöskomento oli   
Koodia: [Valitse]
gcc -o quad quad.c -lX11 -lGL -lGLU

486
Tässä on sitten vielä varmistukseksi toimiva ohjelma, käännöskomento on viimeisellä rivillä


Koodia: [Valitse]

#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

#include <stdio.h>  // getchar, unget, EOF
#include <iostream>



int oma_getch()
{
        //char buf = 0;
        int buf = 0;
        struct termios old = {0};
        if (tcgetattr(0, &old) < 0)
                perror("tcsetattr()");
        old.c_lflag &= ~ICANON;
        old.c_lflag &= ~ECHO;
        old.c_cc[VMIN] = 1;
        old.c_cc[VTIME] = 0;
        if (tcsetattr(0, TCSANOW, &old) < 0)
                perror("tcsetattr ICANON");
        if (read(0, &buf, 1) < 0)
                perror ("read()");
        old.c_lflag |= ICANON;
        old.c_lflag |= ECHO;
        if (tcsetattr(0, TCSADRAIN, &old) < 0)
                perror ("tcsetattr ~ICANON");
        return (buf);
}



int main()
{
  int i = 0;
  while(1)
  {
    oma_getch();
    i++;
    std::cout << "luettiin merkki " << i << "  " << std::endl;
  }

}


// g++ koe.cpp -o koe -Wall -pedantic -L/usr/local/lib -lserial  -std=c++11 


lähde:
http://stackoverflow.com/questions/421860/capture-characters-from-standard-input-without-waiting-for-enter-to-be-pressed

487
Vaikuttaa sittenkin siltä, että yllä olevan koodin tapaan pitää menetellä, ja sitten voi tehdä itse oman conio.h -jäljitelmän kuten alla

Koodia: [Valitse]
    /*
    AUTHOR: zobayer
    INSTRUCTION:
    just make this file a header like "conio.h"
    and use the getch() and getche() functions.
    */
    #include <termios.h>
    #include <unistd.h>
    #include <stdio.h>
     
    /* reads from keypress, doesn't echo */
    int getch(void) {
        struct termios oldattr, newattr;
        int ch;
        tcgetattr( STDIN_FILENO, &oldattr );
        newattr = oldattr;
        newattr.c_lflag &= ~( ICANON | ECHO );
        tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
        ch = getchar();
        tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
        return ch;
    }
     
    /* reads from keypress, and echoes */
    int getche(void) {
        struct termios oldattr, newattr;
        int ch;
        tcgetattr( STDIN_FILENO, &oldattr );
        newattr = oldattr;
        newattr.c_lflag &= ~( ICANON );
        tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
        ch = getchar();
        tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
        return ch;
    }


lähde: http://zobayer.blogspot.fi/2010/12/getch-getche-in-gccg.html

Luulisin, että näillä ratkeaa ja merkkaan tämän rohkeasti ratkaistuksi, vaikka en vielä ole ehtinyt kokeilla  ;)

488
Miten pitäisi tehdä ohjelma, joka toimii muuten itsenäisesti, mutta havaitsee, jos jotain näppäintä on painettu. Ohjelmassa ei haluttaisi pysähtyä odottamaan, tuleeko merkki vai ei kovin pitkäksi aikaa. Tavalliset syötekomennot jäävät sitä paitsi odottamaan enteriä.

Löysin verkosta seuraavan ohjelman, mutta onkohan se vähän liian monimutkainen näin yksinkertaiselta näyttävään kysymykseen. Ainakin siinä tehdään kaksinkertainen työ, kun luettu merkki kirjoitetaan takaisin lukupuskuriin, ja tämän lisäksi asetellaan edestakaisin termios-rakenteen parametreja.

Koodia: [Valitse]
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
int kbhit(void)
{
  struct termios oldt, newt;
  int ch;
  int oldf;

  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);

  ch = getchar();

  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  fcntl(STDIN_FILENO, F_SETFL, oldf);

  if(ch != EOF)
  {
    ungetc(ch, stdin);
    return 1;
  }

  return 0;
}

lähde: http://stackoverflow.com/questions/22166074/is-there-a-way-to-detect-if-a-key-has-been-pressed



489
Löysin alla olevan python-tiedoston netistä. Sen voi ajaa pääte-pythonissa kieliopintarkistusta varten, ja fc-pythonissa se piirtää myös kuvan.

Niksi näyttää olevan execfile -komento, jonka avulla tiedosto voidaan hakea mistä tahansa hakemistosta, kunhan vain polku on oikein.

Koodia: [Valitse]
# freecad_script_template.py
# a simple script example to use FreeCAD as module or with the FreeCAD GUI
# created by charlyoleg on 2013/05/02
# license: CC BY SA 3.0
### esimerkiksi:  execfile("/home/juha/kokeilukansio/freecad_script_template.py")
### freecadin pythonissa tekee jopa kuvan, muuten tekee stl-tiedoston
### ubuntu 14.04 vakio-freecad:ssa pohjoimaiset kirjaimet ei toimi :(


FREECADPATH='/usr/lib/freecad/lib' # adapt this path to your system

import sys
# choose your favorite test to check if you are running with FreeCAD GUI or traditional Python
freecad_gui = True
#if not(FREECADPATH in sys.path): # test based on PYTHONPATH
if not("FreeCAD" in dir()):       # test based on loaded module
  freecad_gui = False
print("dbg102: freecad_gui:", freecad_gui)

if not(freecad_gui):
  print("dbg101: add FREECADPATH to sys.path")
  sys.path.append(FREECADPATH)
  import FreeCAD

print("FreeCAD.Version:", FreeCAD.Version())
#FreeCAD.Console.PrintMessage("Hello from PrintMessage!\n") # avoid using this method because it is not printed in the FreeCAD GUI

import Part
from FreeCAD import Base

print("dbg111: start building the 3D part")

P1 = Base.Vector(0,0,0)
D1 = Base.Vector(0,0,1)
#myshape = Part.makeBox(2,3,2,P1)
mycyl1 = Part.makeCylinder(2,1,P1)
mycyl2 = Part.makeCylinder(1,4,P1)
myshape = mycyl1.fuse(mycyl2)


# view and export your 3D part
output_stl_file="test_template.stl"
Part.show(myshape) # works only with FreeCAD GUI, ignore otherwise
myshape.exportStl(output_stl_file)
print("output stl file: %s"%(output_stl_file))

print("dbg999: end of script")


Kiitos myös fc-päivittämistä koskevasta neuvosta. Päivittäminen saattaakin olla luulemaani helpompaa  :)


MUOK.

Tässä on vielä toinen execfile-kokeilu netistä, ja kuvakin on aika hieno

Koodia: [Valitse]
import Part, FreeCAD, math
from FreeCAD import Base
 
##     esimerkiksi:
##     execfile("/home/juha/kokeilukansio/bottle.py")
###   b = makeBottle(50.0, 70.0, 30.0)
###   Part.show(b)
#####       http://www.freecadweb.org/wiki/index.php?title=Topological_data_scripting#Make_a_prism


   
def makeBottle(myWidth=50.0, myHeight=70.0, myThickness=30.0):
   aPnt1=Base.Vector(-myWidth/2.,0,0)
   aPnt2=Base.Vector(-myWidth/2.,-myThickness/4.,0)
   aPnt3=Base.Vector(0,-myThickness/2.,0)
   aPnt4=Base.Vector(myWidth/2.,-myThickness/4.,0)
   aPnt5=Base.Vector(myWidth/2.,0,0)
       
   aArcOfCircle = Part.Arc(aPnt2,aPnt3,aPnt4)
   aSegment1=Part.Line(aPnt1,aPnt2)
   aSegment2=Part.Line(aPnt4,aPnt5)
   aEdge1=aSegment1.toShape()
   aEdge2=aArcOfCircle.toShape()
   aEdge3=aSegment2.toShape()
   aWire=Part.Wire([aEdge1,aEdge2,aEdge3])
       
   aTrsf=Base.Matrix()
   aTrsf.rotateZ(math.pi) # rotate around the z-axis
       
   aMirroredWire=aWire.transformGeometry(aTrsf)
   myWireProfile=Part.Wire([aWire,aMirroredWire])
   myFaceProfile=Part.Face(myWireProfile)
   aPrismVec=Base.Vector(0,0,myHeight)
   myBody=myFaceProfile.extrude(aPrismVec)
   myBody=myBody.makeFillet(myThickness/12.0,myBody.Edges)
   neckLocation=Base.Vector(0,0,myHeight)
   neckNormal=Base.Vector(0,0,1)
   myNeckRadius = myThickness / 4.
   myNeckHeight = myHeight / 10
   myNeck = Part.makeCylinder(myNeckRadius,myNeckHeight,neckLocation,neckNormal)
   myBody = myBody.fuse(myNeck)
       
   faceToRemove = 0
   zMax = -1.0
       
   for xp in myBody.Faces:
       try:
           surf = xp.Surface
           if type(surf) == Part.Plane:
               z = surf.Position.z
               if z > zMax:
                   zMax = z
                   faceToRemove = xp
       except:
           continue
       
   myBody = myBody.makeThickness([faceToRemove],-myThickness/50 , 1.e-3)
       
   return myBody



490

eli miten se menisi, linkkausjuttuja ja .so -tiedostajoa en ole koskaan oikein ymmärtänyt

Käyttääköhän freecad jotain sisäisä pythonia. Huomasin, että se ei hyväksy käskyä

print 'ååååååååååååååå'

vaan valittaa koodauksesta. Pääte-pythoni tulostaa tekstin mukisematta.

491
 Sattuisikohan kukaan tietämään, miten saisi kätevästi freecadin python-makrot itse luomaansa hakemistoon.

Tai voisiko freecadia käyttää Ubuntun vakio-pythonin kautta.

Käytössä on Ubuntu 14.04 perusversio, ja voi olla, että uuden 16.04 version mukana tulee myös  uudemopi freecad, jossa asia on ratkaistu.

Tämä ei ehkä ole ihan oikea paikka freecad-kysymyksille, mutta tuli nyt vähän kokeiltua freecadia verkossa olevien ohjeiden avulla, ja joskus voisi opetella lisääkin, jos näistä perusasioista vain selviää  :)


492

Virheilmoituksia tulee noin pari ruudullista. Tässä alla on mielestäni tärkeimpiä.

Koodia: [Valitse]
rex03koe.cpp:24:26:   required from here
/usr/include/c++/4.8/tuple:1090:70: error: no matching function for call to ‘dp::dp()’
         second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
                                                                      ^
/usr/include/c++/4.8/tuple:1090:70: note: candidates are:
rex03koe.cpp:15:2: note: dp::dp(double, double)
  dp::dp(const double a, const double b) : d1(a), d2(b) // dp-luokan muodostin
  ^
rex03koe.cpp:15:2: note:   candidate expects 2 arguments, 0 provided
rex03koe.cpp:6:7: note: constexpr dp::dp(const dp&)
 class dp  // materialmap käyttää arvoina
       ^
rex03koe.cpp:6:7: note:   candidate expects 1 argument, 0 provided
rex03koe.cpp:6:7: note: constexpr dp::dp(dp&&)
rex03koe.cpp:6:7: note:   candidate expects 1 argument, 0 provided

Oletusmuodostin olisi mielestäni ensin esitelty luokassa ja sitten määritelty vähän alempana.

Koodia: [Valitse]
#include <iostream>
#include <string>
#include <map>


class dp  // materialmap käyttää arvoina
{
  public:
    dp (const double a, const double b); // <--- oletusmuodostin

  double d1;
  double d2;
};

 dp::dp(const double a, const double b) : d1(a), d2(b) // dp-luokan muodostin
{ ; }  //  <--- oletusmuodostin määritelty

std::map<std::string, dp> materialmap;  // map

int main()
{
  dp d(5, 6);
  std::cout << d.d1 + d.d2 << std::endl;
  //materialmap["tunniste1"] = d; //  <--- TÄMÄ EI KÄÄNNY  ???????
  materialmap.insert(std::make_pair("tunniste1", d));
}

// g++ rex03koe.cpp -o rex03koe -Wall -pedantic -std=c++11


Käännöskomento on tässä viimeisellä rivillä.

Luokalle dp on siis mielestäni oletusmuodostin ja std::map ei kai sitä enää tarvinnekaam, se tullee valmiina luokan mukana?


493

En millään keksi, miksi alla oleva map[avain] = arvo -tyylinen lisäys ei käänny alla olevassa ohjelmassa. Voisiko se johtua jotenkin siitä, että map:in arvoina on luokkia? Insert kuitenkin toimii hyvin.

Koodia: [Valitse]
#include <iostream>
#include <string>
#include <map>


class dp  // materialmap käyttää arvoina
{
  public:
    dp (const double a, const double b);

  double d1;
  double d2;
};

 dp::dp(const double a, const double b) : d1(a), d2(b) // dp-luokan muodostin
{ ; }

std::map<std::string, dp> materialmap;  // map, johon halutaan lisätä arvoja

int main()
{
  dp d(5, 6);  // lisättävän luokan olio
  std::cout << d.d1 + d.d2 << std::endl;  // olio toimii hyvin
  //materialmap["tunniste1"] = d; //  <--- TÄMÄ EI KÄÄNNY  ???????
  materialmap.insert(std::make_pair("tunniste1", d));
}

// g++ koe.cpp -o koe -Wall -pedantic -std=c++11

494

Tämän hetken kokeiluiden mukaan sueraava koodi vaikuttaa toimivan. Luettava rivi on vain merkattava tarpeeksi pitkäksi.

Yksi ongelmahan on, että sarjaporttiin päätteeltä lähtevä ja sarjaportista päätteelle tuleva teksti ovat kummatkin samassa (pääte)ikkunassa. Sarjaportista pienellä viiveellä tuleva vastausteksti voi sotkea uutta kirjoitettavaa tekstiä.

Olisikohan apua, jos tuleva teksti lähetettäisiin vaikka std::err -vuohon, ja miten sen saisi näkymään omassa ikkunassaan.

Koodia: [Valitse]

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

#include <sys/poll.h>

#include <ctype.h>  // vain isspacea varten

int main(int argc,char** argv)
{
        struct termios tio;  // käytettävät asetukset
        struct termios old_stdio;  // vanhat sarjatiedsotoasetukset
        int tty_fd;  // sarjatiedoston tiedostonumero

        struct pollfd fds[1];  // polling -rakenteet
        int pollrc; // luettujen merkkien määrä pollista

        unsigned char cbuf[80];
        cbuf[0]='d'; // luettava merkki, ei ainkaan \n alussa

        if(argc < 2) // tarvitaan sarjavuon nimi käynnistyksessä
          { printf("Usage %s ",argv[0]);
            printf(" /dev/ttyUSB0 (for example) \n" );
            exit(11);
          }

        memset(&tio,0,sizeof(tio)); // nollataan sarjavuon asetukset
        tio.c_iflag=0;
        tio.c_oflag=0;
        tio.c_cflag=CS8|CREAD|CLOCAL;     // 8n1, see termios.h for more information
        tio.c_lflag=0;
        tio.c_cc[VMIN]=1;  // 1 merkki riittää käsittelyn aloittamiseen
        tio.c_cc[VTIME]= 1; // 5 sarjatiedoston merkkiä voidaan odottaa

        tty_fd=open(argv[1], O_RDWR | O_NONBLOCK); // avataan rw ja noblcking -asetuksin   
        cfsetospeed(&tio,B9600);     // 9600 baudia sarjatiedostn kirjoitusnopeudeksi
        cfsetispeed(&tio,B9600);     // 9600 baudia sarjatiedostn lukunopeudeksi

        tcsetattr(tty_fd,TCSANOW,&tio);

        fds[0].fd = tty_fd;      // tarkkailtavan tiedoston tunnistenumero
        fds[0].events = POLLIN ; // valitaan tuleva tieto tarkkailtavaksi

       while( 1 )
        {

          unsigned char ch;
          int k = 0;
          while( (ch = getchar()) != '\n' )
            {
              cbuf[k++] = ch;
            }   // vain merkit käsitellään, \n ei mene mukaan

          write(tty_fd, cbuf, k); // /tiedostonumero, char-osoite, merkkilkm)
          tcdrain( tty_fd ); //tämä ei auta, pitkä rivi loppuu kesken
          sleep(1);  // tämän avulla pitkä rivi tulostuu, miksi ???????????

          pollrc = poll(fds, 1, 1000); // onko vastaus tulossa 1000 ms aikana
          if(pollrc < 0) // poll -virhe, aikaylitys ehkä, tai muu virhe
            {
              perror("poll");
            }
          else

          if( pollrc > 0)  // ainakin poll onnistui ilman virhettä
            {
              if(fds[0].revents & POLLIN ) // merkkejä on tulossa
                {
                  ssize_t rc = read(tty_fd, cbuf, 79 ); // luettiin rc kpl merkkejä
                  if(rc > 0) 
                    {
                            /////printf("%zu %s\n", rc, " chars read from stream" );
                            write(0, "\n", 1);
                      write(0, cbuf, rc); // k ???, merkki saatu sarjavuosta, sen voi käsitellä ohjelmassa
                           write(0, "\n", 1);
                      fds[0].revents = 0; // nollataan paluu(virhe)ilmoitukset
                    }
                 }
              } // if( pollrc > 0) loppuu

        } // while loppuu

        close(tty_fd); // suljetaan sarjavuo
        tcsetattr(STDOUT_FILENO,TCSANOW,&old_stdio); // palautetaan pääteasetukset
        printf("\n %s \n", "program ended ");
        return EXIT_SUCCESS;
}



495

Yritin kääntää seuraavan koeohjelman Ubuntu 14.04 g++ -ohjelmaksi

Koodia: [Valitse]
//Sample Program
#include <regex>
#include <iostream>
using namespace std;

int main() {
    regex  reg("[0-9]+");
    if (regex_match("123000", reg)) {
        cout << "It's a match!" <<endl;
    }
 return 0;
}

komennolla

Koodia: [Valitse]
g++ rex01.cpp -o rex01 -Wall -pedantic -std=c++11

mutta tuloksena oli ilmoitus

Koodia: [Valitse]

terminate called after throwing an instance of 'std::regex_error'
  what():  regex_error
Keskeytetty (luotiin core-tiedosto)

Googlesta löytyi, että pitäisi olla gcc-4.9 tai gcc-5. Mikä olisi hyvä tapa saada regex toimimaan niin, että tekisin mahdollisimman vähän muutoksia lts-ominaisuuden säilyttämiseksi Ubuntu 14.04 -versiossa.

gcc-<tab><tab> antaa

Koodia: [Valitse]
gcc-4.8         gcc-ar-4.8      gcc-nm-4.8      gcc-ranlib-4.8
gcc-ar          gcc-nm          gcc-ranlib



497
Jotkut pdf-sivut tulevat näkyviin niin suurina, että ne täyttävät koko näytön, eikä ikkunan pienentäminen ole mahdollista hiirellä vetämällä. Hiiri ei pysty tunnistamaan ikkunan reunaa, koska ikkuna täyttää näytön koko leveydeltä, vaikka kokoruutunäyttö ei ole edes valittuna.

Millä keinolla saisi ikkunan leveyttä (tai korkeutta) pienennettyä niin, että se olisi hiirellä käsiteltävissä.

498
Koska kokeilussani sarjalaite tulostaa kirjaimet takaisin isoina kirjaimina ja tämä tulos on se, jota olen voinut tarkkailla, on mahdollista, että ongelma liittyykin siihen, että laite tulostaa ensin nopeasti 32 merkkiä ja sitten jostain syystä viivyttelee. Se tulostaa aina kaikki, mitä olen syöttänyt sitten sekunnin tauon jälkeen, esimerkiksi 75 merkkiä tulevat oikein hienosti ( eikä 75 ole edes 2*32. )

Ohjeiden mukaan read(fd, buf, n) palauttaa luettujen merkkien määrän, jos yritetään lukea n merkkiä varastoon buf vuosta fd.

Mutta olisiko mitään keinoa nähdä, montako merkkiä on odottamassa valmiina linuxin lukupuskurissa jo ennen kuin käyttää read -käskyä. Silloin voisin tarkistaa, mikä on tilanne lukemista odottavien merkkien osalta juuri ennen, kuin 1 sekunnin taukoaika on kulunut.

Tilanne on siis se, että 32 merkkiä tulevat näkyville melkein heti, samoin esim. kaikki 75 merkkiä heti sekunnin odotusajan jälkeen. tcdrain ei näytä vaikuttavan asiaan, vain sleep(1) vaikuttaa.

Luvut 1 sekunti ja 32 merkkiä viittaavat vähän siihen, että nyt ei ole kyse yhteyden siirtonopeuden määräämästä odottelusta. Erityisesti kun nopeuden nostaminen 9600 merkistä 38400 merkkiin ei muuta vaadittavaa odotteluaikaa tai saatavien merkkien lukumäärää.

499
sain sen suorittimen rohmuamisen loppumaan pollauksella, ja nyt toiminta on vähän järkevämpää.

Muutin ohjelmaa myös niin, että se lukee päätteeltä rivin ja vasta sitten kirjoittaa sen sarjalaitteelle, joka muokkaa sitä omalla tavallaan ja lähettää muokatun tekstin taikaisin päätteelle.

Nyt ongelmana on se, että vain alle 32 merkin mittaiset rivit tulevat käsitellyiksi. Pitemmän rivin loppuosat jäävät johonkin puskuriin ja tulevat sieltä merkki kerrallaan.

Olisikohan mahdollista, että kääntäjä optimoi koodia niin, että se aloittaa laitteelta lukemisen jo ennen kuin laite on saanut luettua kaikki merkit. Kirjoitaminen ja lukeminen ovat kyllä peräkkäin samssa ohjelmassa, enkä ole laittanut yhtään säiettä ohjelmaan. Ehkä pitäisi laittaa kirjoitussäie ja sitten odottaa, että se on valmis, ja vasta sitten aloittaa lukeminen.

Sekunnin torkkuaika kirjoittamisen ja lukemisen välillä näyttää auttavan niin, että pitemmätkin rivit näkyvät oikein laitteen muutosten jälkeen pääteellä. Mutta tauon pitää olla juri 1 sekunti, 0,95 sekuntia ei käy.

500
Tällä kertaa yritin lukea vuota c++ :n sijaan raaka-c:llä, eikä virheitä ole ilmaantunut ainakaan niin, että niistä olisi tullut valituksia tai toiminta olisi häiriintynyt.

Nyt kuitenkin ongelmana on se, että vuon (streamin) seuraaminen vie  suoritintehoja niin, että läppärin tuuletin pyörii isoilla kierroksilla, vaikka muuten ei juuri koskaan.

Vuon tarkkailu tehdään alla olevassa silmukassa, joka luultavasti on syyllinen suoritintehojen rohmuamiseen.

Koodia: [Valitse]
while (c!='q')
        {
                // if new data is available on the console, send it to the serial port
                if (read(STDIN_FILENO,&c,1)>0)  write(tty_fd,&c,1);
                // if new data is available on the serial port, print it out
                if (read(tty_fd,&c,1)>0)        write(STDOUT_FILENO,&c,1);
                sleep(0.5);   // <----   lisäsin tämän, mutta vaikutus aika olematon
        }


Alkuperäisessä koodissa ei ollut nukuntaa, lisäsin sen, mutta vaikutus on aika olematon. Ehkä tuuletin käy vähän pienemmillä kierroksilla.

Pitäisikö sleepin sijasta seuranta laittaa omaan säikeeseen tms.

Sivuja: 1 ... 23 24 [25] 26 27 ... 41