» »

[C++] vprašanja

[C++] vprašanja

OwcA ::

std::fmod()
Otroška radovednost - gonilo napredka.

Gundolf ::

Predvsem ti prevajalnik to javi zato, ker je deljenje z ostankom (%) nekako nesmiselno v doublih. Smiselno je namrec le ce imas integerje, se pravi cela stevila, ker pri njih ne mores napisati decimalk, zato dobis nek ostanek pri deljenju. V primeru double in float temu pac ni tako, ker racunalnik vedno izracuna tudi decimalke. Ostanek postane nekoliko nesmiseln, ne?

Stvar je taka, ce delas po modulu ponavadi delas z integerji, double uporabljas ko rabis velik razpon stevl a le na tistih 16 ali koliko ze mest natancno.

fx ::

#include <iostream>
#include <time.h>
#include <termios.h>
#include <string>
#include <sys/times.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

#define MODEM_PORT "/dev/ttyS0" //Zaporedna vrata COM 1
#define BAUDRATE B2400
#define TRUE 1
#define FALSE 0
using namespace std;

//Vpisi pdatke na zaporedna vrata
void write_modem(char *psz_buf, int fds)
{
// Poslani niz koncajmo z znakom \n (0x0d)
// Za novo vrstico ter \r (0x0a) za začzacetek vrstice
psz_buf[strlen(psz_buf)] = 0x0d;
psz_buf[strlen(psz_buf)+1] = 0x0a;

if (write(fds, psz_buf, strlen(psz_buf)) < 0)
   fprintf(stderr, " Napaka pisanja ... \n");
}

//Bere podatke z zaporednih vrat
void read_modem(int fds)
{
  char sz_inbuf[200];
  memset(sz_inbuf, 0, 200);

  usleep(1000000); //Pocakaj trenutek
  if (read(fds, sz_inbuf, sizeof(sz_inbuf)) < 0)
    fprintf(stderr, "Napaka pri branju... \n");
  cout << "Sprejeti niz je : " << sz_inbuf;
}

void Send(char *psz_buf, int fds)
{
 printf("Posiljam ukaz >> " , psz_buf);
 write_modem(psz_buf, fds);
 read_modem(fds);
 memset (psz_buf, 0, 200);
}

int main()
{
 char *niz;

 int fd;  // datotecni deskriptor za zaporedna vrata

 FILE *fds;
 struct termios moj_termios;

 //Odpiranje zaporednih vrat
 if ((fd = open(MODEM_PORT, O_RDWR | O_NOCTTY)))
   printf("Odpiranje porta : ", errno, strerror(errno));

 // ***** Konfiguriranje modema *****
 tcgetattr(fd, &moj_termios); // prebere obsotjece paramatre vrat
 moj_termios.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
 moj_termios.c_lflag = 0; // Izklopi odmev in ne ustvarja kontrolnih signalov
 moj_termios.c_iflag = IGNPAR; // Ignorira paritetne napake in napake na okvirjih
 moj_termios.c_oflag = 0; //Direktno poslje brez procesiranja (raw output)
 tcflush(fd, TCIFLUSH);
 tcsetattr(fd, TCSAFLUSH, &moj_termios); // Nastavi paramaetre vrat
 // ***** Konec konfiguracije modema *****
 cout << "Vpisi besedilo " << endl;
 do
 {
   cin >> niz;
   if (niz != "/end") Send(niz ,fd);
 }
 while(niz != "/end");
 close(fd);
return 0;
}


Kaj je narobe z tem programom da mi noče poslati podatke na serijski port. Če pa grem z minicom-om pa zadeva deluje pri isti nastavitvih 2400 8N1.

lp

"UNIC & C++"

fx ::

/*
 * include/linux/serial.h
 *
 * Copyright &#169; 1992 by Theodore Ts'o.
 *
 * Redistribution of this file is permitted under the terms of the GNU
 * Public License (GPL)
 */

#ifndef _LINUX_SERIAL_H
#define _LINUX_SERIAL_H

#ifdef __KERNEL__
#include <asm/page.h>

/*
 * Counters of the input lines (CTS, DSR, RI, CD) interrupts
 */

struct async_icount {
	__u32	cts, dsr, rng, dcd, tx, rx;
	__u32	frame, parity, overrun, brk;
	__u32	buf_overrun;
};

/*
 * The size of the serial xmit buffer is 1 page, or 4096 bytes
 */
#define SERIAL_XMIT_SIZE PAGE_SIZE

#endif

struct serial_struct {
	int	type;
	int	line;
	unsigned int	port;
	int	irq;
	int	flags;
	int	xmit_fifo_size;
	int	custom_divisor;
	int	baud_base;
	unsigned short	close_delay;
	char	io_type;
	char	reserved_char[1];
	int	hub6;
	unsigned short	closing_wait; /* time to wait before closing */
	unsigned short	closing_wait2; /* no longer used... */
	unsigned char	*iomem_base;
	unsigned short	iomem_reg_shift;
	unsigned int	port_high;
	unsigned long	iomap_base;	/* cookie passed into ioremap */
	int	reserved[1];
};

/*
 * For the close wait times, 0 means wait forever for serial port to
 * flush its output.  65535 means don't wait at all.
 */
#define ASYNC_CLOSING_WAIT_INF	0
#define ASYNC_CLOSING_WAIT_NONE	65535

/*
 * These are the supported serial types.
 */
#define PORT_UNKNOWN	0
#define PORT_8250	1
#define PORT_16450	2
#define PORT_16550	3
#define PORT_16550A	4
#define PORT_CIRRUS     5	/* usurped by cyclades.c */
#define PORT_16650	6
#define PORT_16650V2	7
#define PORT_16750	8
#define PORT_STARTECH	9	/* usurped by cyclades.c */
#define PORT_16C950	10	/* Oxford Semiconductor */
#define PORT_16654	11
#define PORT_16850	12
#define PORT_RSA	13	/* RSA-DV II/S card */
#define PORT_MAX	13

#define SERIAL_IO_PORT	0
#define SERIAL_IO_HUB6	1
#define SERIAL_IO_MEM	2

struct serial_uart_config {
	char	*name;
	int	dfl_xmit_fifo_size;
	int	flags;
};

#define UART_CLEAR_FIFO		0x01
#define UART_USE_FIFO		0x02
#define UART_STARTECH		0x04
#define UART_NATSEMI		0x08

/*
 * Definitions for async_struct (and serial_struct) flags field
 */
#define ASYNC_HUP_NOTIFY 0x0001 /* Notify getty on hangups and closes 
				   on the callout port */
#define ASYNC_FOURPORT  0x0002	/* Set OU1, OUT2 per AST Fourport settings */
#define ASYNC_SAK	0x0004	/* Secure Attention Key (Orange book) */
#define ASYNC_SPLIT_TERMIOS 0x0008 /* Separate termios for dialin/callout */

#define ASYNC_SPD_MASK	0x1030
#define ASYNC_SPD_HI	0x0010	/* Use 56000 instead of 38400 bps */

#define ASYNC_SPD_VHI	0x0020  /* Use 115200 instead of 38400 bps */
#define ASYNC_SPD_CUST	0x0030  /* Use user-specified divisor */

#define ASYNC_SKIP_TEST	0x0040 /* Skip UART test during autoconfiguration */
#define ASYNC_AUTO_IRQ  0x0080 /* Do automatic IRQ during autoconfiguration */
#define ASYNC_SESSION_LOCKOUT 0x0100 /* Lock out cua opens based on session */
#define ASYNC_PGRP_LOCKOUT    0x0200 /* Lock out cua opens based on pgrp */
#define ASYNC_CALLOUT_NOHUP   0x0400 /* Don't do hangups for cua device */

#define ASYNC_HARDPPS_CD	0x0800	/* Call hardpps when CD goes high  */

#define ASYNC_SPD_SHI	0x1000	/* Use 230400 instead of 38400 bps */
#define ASYNC_SPD_WARP	0x1010	/* Use 460800 instead of 38400 bps */

#define ASYNC_LOW_LATENCY 0x2000 /* Request low latency behaviour */

#define ASYNC_BUGGY_UART  0x4000 /* This is a buggy UART, skip some safety
				  * checks.  Note: can be dangerous! */

#define ASYNC_AUTOPROBE	 0x8000 /* Port was autoprobed by PCI or PNP code */

#define ASYNC_FLAGS	0x7FFF	/* Possible legal async flags */
#define ASYNC_USR_MASK	0x3430	/* Legal flags that non-privileged
				 * users can set or reset */

/* Internal flags used only by kernel/chr_drv/serial.c */
#define ASYNC_INITIALIZED	0x80000000 /* Serial port was initialized */
#define ASYNC_CALLOUT_ACTIVE	0x40000000 /* Call out device is active */
#define ASYNC_NORMAL_ACTIVE	0x20000000 /* Normal device is active */
#define ASYNC_BOOT_AUTOCONF	0x10000000 /* Autoconfigure port on bootup */
#define ASYNC_CLOSING		0x08000000 /* Serial port is closing */
#define ASYNC_CTS_FLOW		0x04000000 /* Do CTS flow control */
#define ASYNC_CHECK_CD		0x02000000 /* i.e., CLOCAL */
#define ASYNC_SHARE_IRQ		0x01000000 /* for multifunction cards
					     --- no longer used */
#define ASYNC_CONS_FLOW		0x00800000 /* flow control for console  */

#define ASYNC_BOOT_ONLYMCA	0x00400000 /* Probe only if MCA bus */
#define ASYNC_INTERNAL_FLAGS	0xFFC00000 /* Internal flags */

/*
 * Multiport serial configuration structure --- external structure
 */
struct serial_multiport_struct {
	int		irq;
	int		port1;
	unsigned char	mask1, match1;
	int		port2;
	unsigned char	mask2, match2;
	int		port3;
	unsigned char	mask3, match3;
	int		port4;
	unsigned char	mask4, match4;
	int		port_monitor;
	int	reserved[32];
};

/*
 * Serial input interrupt line counters -- external structure
 * Four lines can interrupt: CTS, DSR, RI, DCD
 */
struct serial_icounter_struct {
	int cts, dsr, rng, dcd;
	int rx, tx;
	int frame, overrun, parity, brk;
	int buf_overrun;
	int reserved[9];
};


#ifdef __KERNEL__
/* Export to allow PCMCIA to use this - Dave Hinds */
extern int register_serial(struct serial_struct *req);
extern void unregister_serial(int line);

/* Allow architectures to override entries in serial8250_ports[] at run time: */
struct uart_port;	/* forward declaration */
extern int early_serial_setup(struct uart_port *port);

#endif /* __KERNEL__ */
#endif /* _LINUX_SERIAL_H */


To je koda, ki sem jo nasel v linux/serial.h in me zanima če je to datoteka, katera omogoča pošiljanje podatkov na seijski port - če se ne motim, če se motim me popravte.

lp

"UNIX & C++"

BigWhale ::

To je samo header.

Backup22 ::

>:D
//

fx ::

Torej ga moram vključiti in ga pravilno uporabiti ?
Kako pa to naredim ? Enako kot bi uporabo na primer iostream ?


lp

"UNIX & C++"

fx ::

Kako pa so delovale com miške v linuxu ?
Ta link koliko sem ga razumel omogoča povezavo z seriskim portom in pošiljanjem - če se motim me popravite.

lp

UNIX & C++

Gandalfar ::

mislm da sem v tem howtoju neki zasledil: Coffee Making

drugace pa tudi: Linux I/O port programming mini-HOWTO

fx ::

To bi naj bilo to samo to je bolj razlaga.

lp

"UNIX & C++"

fx ::

#include <stdio.h>   /* Tipi, makri in funkcije za standarno delo z vhodnimi in izhodnimi napravami */
#include <string>    /* Funkcije za delo z nizi in spominom */
#include <errno.h>   /* Obvladanje standardnih napak */
#include <iostream>  /* Bazni razred I/O tokov*/
#include <unistd.h>  /* Finkcije za delo z UNIX standardi */
#include <fcntl.h>   /* */
#include <termios.h> /* */

int main()
{
  int fd;
  char* niz;
  struct termios options;

  if ((fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY )))
  std::cout << "Port : " << errno << " " << strerror(errno) << std::endl;

  fcntl(fd, F_SETFL, 0);

  tcgetattr(fd, &options);
    cfsetispeed(&options, B2400);
    cfsetospeed(&options, B2400);

    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;

    options.c_lflag |= (ICANON | ECHO | ECHOE);

    options.c_iflag |= (IXON | IXOFF | IXANY);

    options.c_oflag &= ~OPOST;

    options.c_cc[VMIN] = 0;
    options.c_cc[VTIME] = 10;

  tcsetattr(fd, TCSANOW, &options);

  do
  {
    std::cin >> niz;
    write(fd, niz, 16);
  }
  while(niz != "361");

  close (fd);
  return 0;
}

To je koda, ki sem jo sestavil po tem linku napredek je očiten, ker vidim da mi uC nekaj sprejema samo nevem kaj , ker mi nič ne prikaže na LCD prikazovlanik. Samo me zdaj zanima, kako bi videl, kaj mi program pošlje na serijski port.

lp

"UNIX & C++"

OwcA ::

Verjetno so tudi bolj prefinjeni pristopi, ampak če imaš dostop do osciloskopa je zelo zanimivo opazovati, kaj se dogaja.

Pravzaprav lahko v ta namen uporabiš kar zvočno kartico.
Otroška radovednost - gonilo napredka.

fx ::

Poznam samo nič ne pomaga če delam v linuxu.

lp

"UNIX & C++"

CCfly ::

"My goodness, we forgot generics!" -- Danny Kalev

Bojevnik ::

V pascalu je bil ukaz goto, ki se uporabljalskupaj z label.

label 1,2,3;
begin
..programska koda
prgramska koda...
1:
...programska koda
prgramska koda...
2:
...programska koda
prgramska koda...
3:
...programska koda
programska koda...
goto 1;     (program nadaljuje izvajanje na točki 1:)
goto 2;     (program nadaljuje izvajanje na točki 2:)
goto 3;     (program nadaljuje izvajanje na točki 3:)
end.

Zanima me ali obstaja podobna funkcija v C++.

fx ::

void stevilo1()
{}

void stevilo2()
{}

void stevilo3()
{}

int main()
{
  stevilo1();
  stevilo2();
  stevilo3();
  return 0;
}


lp

"UNIX & C++"

Gundolf ::

V c++ obstaja podpora za goto, vendar se njegova raba strogo odsvetuje (isto v pascalu), zato ker povzroča špageti kodo. Gotoja ne rabiš, razen če delaš neke hude optimizacije, pa še tam zelo redko. Torej raje razmisli kako bi rešil problem z if / while / for / switch.

fx ::

Stavek goto omogoča skok na poljubno vrstico v programu oziroma na splošen stavek z oznako. Takšno krmiljenje programa ni v skladu s strukturiranim programiranjem, zato se stavka goto izogibljamo.

sintaksa stavka goto je preprosta : goto oznaka.

lp

"UNIX & C++"

CCfly ::

"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration." - Dijkstra
"My goodness, we forgot generics!" -- Danny Kalev

fx ::

A ima C++ kaj od tega, večina sem našel samo zaokrožitev in za FIX ukaz nisem našel nič primernega.

lp

"UNIX & C++"

Gundolf ::

Ne poznam QBasica, zato ne vem kaj pomenijo te ukazi. Sem pra 100% da najdeš rešitev za vse tudi v C++.

fx ::

int main()
{
  double dolzina, sirina;

  std::string MyLokator;

    std::cout << " Vnesi lokator: ";
    getline(std::cin, MyLokator);

    dolzina = (MyLokator[0] - 65)*20 - 180 + (MyLokator[2] - 0x30)*2 + (MyLokator[4] - 65)/12;
    sirina =  (MyLokator[1] - 65)*10 - 90 + (MyLokator[3] - 0x30) + (MyLokator[5] - 65)/24;

    std::cout << " Geo. dolzina : " << dolzina << std::endl
              << " Geo. sirina  : " << sirina << std::endl;
return 0;
}


Zakaj mi program gre obe vrednosti pretvori v celo število. Če uporabim za MyLokator[x] - y uporabim posamezno spremenljivko potem mi vrne decimalni zapis drugače izpiše celo število. V čem je problem ali naj uporabin 6 sprmenljivk ali moram kaj popraviti?
Vnesite JN76KM in vam mora program vrniti (za pravilni izračuna - preverjeno):
Geo. dolzina : 14.8333
Geo. sirina : 46.5

lp

"UNIX & C++"

OwcA ::

(MyLokator[4] - 65) eksplicitno pretvori v double in potem deli, drugače prevajalnik celoštevilsko deli in šele nato pretvori.
Otroška radovednost - gonilo napredka.

fx ::

   d0 = MyLokator[0] - 65;
    d2 = MyLokator[2] - 0x30;
    d4 = MyLokator[4] - 65;
    s1 = MyLokator[1] - 65;
    s3 = MyLokator[3] - 0x30;
    s5 = MyLokator[5] - 65;


Torej tako mora biti ?

lp

"UNIX & C++"

OwcA ::

Ne, čemu? Saj lahko (po potrebi) pretvarjaš začasne vrednosti (vmesne rezultate). Menim, da bi zadostvovalo, če
dolzina = (MyLokator[0] - 65)*20 - 180 + (MyLokator[2] - 0x30)*2 + (MyLokator[4] - 65)/12;

prepišeš v
dolzina = (MyLokator[0] - 65)*20 - 180 + (MyLokator[2] - 0x30)*2 + static_cast<double>((MyLokator[4] - 65))/12;
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

Gundolf ::

(MyLokator[4] - 65)/12.0;

Pozor pri 12.0, to pomeni da delis z double in ne z int ter zato dobis rezultat kot double in ne int:)

fx ::

Gundolf tvoja rešitev je boljša, čeprav obe delata. Thx obema.

Če imam v linuxu nameščen emeulator za MS-DOS potem, lahko v moji kodi uporabim
#include <dos.h>
ali ne ?

lp

"UNIX & C++"

Gundolf ::

Poskusi pa boš videl. Samo ne vidim razloga da bi uporabljal to knjižnico.

fx ::

Saj jaz tudi ne, samo ker delam 3 mesece(2 uri na dan) na tem, da bi oddal/sprejel vsaj en int na serijski port, pa ne gre, tako da sem skoraj obupal. A minico lepo vse sprejeme in odda. Zato sem to vprašal.

lp

"UNIX & C+"

Gundolf ::

A ne najdeš nobenega tutoriala na to temo (narejenega za linux)?

CCfly ::

"My goodness, we forgot generics!" -- Danny Kalev

Gandalfar ::

v najslabsem primeru si poglej izvorno kodo minicoma

fx ::

V ata google sem vpisal minicom source code in nisem našel nič, ker izvorno kodo minicoma sem že iskal.

lp

"UNIX & C++"

CCfly ::

Pa saj ne more biti tako grozno. Priklopi dva računalnika s serijskim null modem kablom in na enem prižgi minicom. Potem se lahko na drugem igraš s svojim programčkom, pa boš točno videl kakšen je rezultat.

http://alioth.debian.org/projects/minicom
"My goodness, we forgot generics!" -- Danny Kalev

fx ::

Zakaj mi linux - win nočeta med sabo komunicirat. Null modem kabel je ok, ker win - win dela.

lp

"UNIX & C++"

BigWhale ::

Malo bolj podrobno... :P

fx ::

Praviš "Malo bolj podrobno... :P", kaj naj ti povem, kako imam nastalvjeno :

HT : 9600 8N1 (Flow control /none)
minicom 9600 8N1 (Flow control /none)

Nimam pa drugega pc na katerih bi imel Linux, da bi preveril Linux - Linux.

lp

"UNIX & C++"

BigWhale ::

Aja, taka komunikacija... :P

Verjetno nimas pravic na /dev/ttyS* vratih.. preveri.

fx ::

Imam.

lp

"UNIX & C++"

BigWhale ::

Ce je kabel dober, potem bi ze echo "lalala" > /dev/ttyS? moral izpisati na win masini.

Ce se ne, potem je nekaj narobe nastavljeno.

fx ::

Nekaj imam narobe pa nemorem najti. Vse živo sem probal, od nastavitve hitrosti na manjše (samo to ne bi smelo biti za problema) do nadzoran in nič. Še vse vedno pošilja v prazno, če sploh kaj pošilja?

lp

"UNIX & C++"

CCfly ::

Poskusi s temle: http://realterm.sourceforge.net/
Dokler ti komunikacija po serijskem kablu ne steče sploh ne poskušaj popravljati kode. Če tipkaš v minicom moraš videti besedilo v realtermu / hyper terminalu in obratno.
"My goodness, we forgot generics!" -- Danny Kalev

Zgodovina sprememb…

  • spremenilo: CCfly ()

fx ::

A so posebni ukazi v C++ in Linuxu za pošiljanje podatkov preko etherneta ali uporabim kake datoteke kot so za serijska vrata ?

lp

"UNIX & C++"

CCfly ::

Preberi so kaj o socketih. Na voljo imaš sistemske knjiižnice in malenkost višje-nivojske, če hočeš da ti program deluje na več platformah.
"My goodness, we forgot generics!" -- Danny Kalev

fx ::

A obstaja matematicna funkcija, ki stevilo zaokrozi dol ali gor.
Gledal sem funkcijo
double modf(double x, double* intptr);

Samo funkcija razbije realno stevilo x v celi del in ostanek, od katerih ima vsak isti predznak kot x. Ostanek vrne kot rezultat funkcije, celi del pa vpise v lokacijo, na katero kaze kazalec intptr. Zanimam me samo kako je s tem kazalcem, kaj moram narediti?

lp

"UNIX & C++"

OwcA ::

Prišteješ 0,5 in uporabiš ceil().
Otroška radovednost - gonilo napredka.

Gundolf ::

Zaokroženje navzdol: double floor(double) in float floorf(float)
Zaokroženje navzdol: double ceil(double) in float ceilf(float)

fx ::

In kaka je razlika med double ceil(double) in double floor(double)?

lp

"UNIX & C++"

snow ::

ceil zaokroži navzgor, floor pa navzdol.

ceil(3.01) = 4

floor(3.99) = 3
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Gundolf ::

ceil je zaokroževanje navzgor, floor pa navzdol - tako kot si spraševal.

edit: nisem opazil da je že bilo odgovorjeno.

Zgodovina sprememb…

  • spremenil: Gundolf ()


Vredno ogleda ...

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

Program za C++ jezik

Oddelek: Programska oprema
232862 (1897) popaj113
»

Kako bi naredil en ultra simple programček?

Oddelek: Programiranje
492331 (1612) AtaStrumf
»

C++ & XP

Oddelek: Programiranje
241680 (1287) Exilian
»

C++ in pavza

Oddelek: Programiranje
161225 (986) napsy
»

c++ datoteke

Oddelek: Programiranje
464057 (3546) Vesoljc

Več podobnih tem