» »

[c++] segmentation fault?????

[c++] segmentation fault?????

Ziga86 ::

LP
zanima me ali se komu kaj posveti zakaj mi ta progrm ne dela zelim da bi mi izpisal bite na printer port. sem se zlo na zacetku programiranja.

#include < stdio.h >
#include < stdlib.h >
#include < unistd.h >
#include < asm/io.h >
#include < iostream.h >

#define base 0x378 /* printer port base address */

int main()
{
int b;
cout < < "vpisite cifro 0 ... 255 ";
cin >> b;

outb( b ,0x378);
return 1;
}

ko ga skompjalam mi napise na koncu segmentation fault???? a moram se kej vkljuciti podati dovoljenja ali kaj podobnega?

kot dodatno informacijo uporabljam debian-linux compiler pa nevem tocno ker je dubu sem ga preko apt-get
  • spremenilo: snow ()

MasterMind ::

You use ioperm(2) or alternatively iopl(2) to tell the kernel to allow the user space application to access the I/O ports in question. Failure to do this will cause the application to receive a segmentation fault.

http://linux.die.net/man/2/outb

Pomagalo bi tudi, če bi malo man pogledal ;).
Gentoo, KDE uporabnik.

Ziga86 ::

ok hvala za nasvet in link, ravnokar sem to probaval in mi vrne segmentation fault.
najprej sem probal z ioperm(2) napisal sem jo tik nad outb(...) mi je vrglo eror potem sem probal iopl(2) in zadeva je delala, vendar ko sem probal pognati program je prišel samo do vpisite stevilko, potem pa je zopet vrglo segmentation fault.
potem sem probal dodati root pravice program sem kot su dodal chmod +xs (imeprog.)

in waam spet segmentation fault, pol sem se malo googlu nasu tale link
http://www.bigwebmaster.com/General/How...

kjer pise da moras dodat se kater port, stevilo portov in boolovo vrednos 0,1 no nrdim to, sped dam su pravice in spet noce.

aha pa na zacetku sem se
#include < unistd.h >
#include < sys/io.h >
tako da prog zdej zgleda takole:

#include < stdio.h >
#include < stdlib.h >
#include < unistd.h >
#include < asm/io.h >
#include < iostream.h >
#include < unistd.h >
#include < sys/io.h >

#define base 0x378 /* printer port base address */


int main()
{


int b;
cout < < "vpisite cifro 0 ... 255 ";
cin >> b;

ioperm(0x378, 1, 1);
outb( b ,0x378);
return 1;
}
man c++, c++ --h, c++ help mi pa nic ne odpre
Se kaksna ideja kaj bi mogu se popravit?

Zgodovina sprememb…

  • spremenilo: Ziga86 ()

Jean-Paul ::

Poskusi tako.
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>

#define BASEPORT 0x378 /* printer port base address */

int main()
{
  int b;
  printf("vpisite cifro 0 ... 255: ");
  scanf("%d", &b);

  /* get access to the ports */
  if (ioperm(BASEPORT, 1, 1))
  {
    perror("ioperm");
    exit(1);
  }

  outb(b, BASEPORT);

  /* we don't need the ports anymore */
  if (ioperm(BASEPORT, 1, 0))
  {
    perror("ioperm");
    exit(1);
  }

  return 0;
}
Če ti ioperm javi "Operation not permitted", poskusi kot "super user".

Ziga86 ::

ok tole sem pognal kot super user, vendar imam par vprašanj.
debian:/home/ziga# ./p2
vpisite cifro 0 ... 255: 3
ioperm: Operation not permitted
debian:/home/ziga#

ponavadi kadar kej skompajlam mi zmeraj javi da uporabljam zastarele faile (.h) al kako se jim ze rece. ko sem tale programcek kompajlu pa mi ni napisalo nic samo nrdilo, ceprav so tu tudi .h potem sem pa zdevo pognal kot su vendar se zmeri napise operation not premited.

zanima pa me se kaj so to
printf() scanf() perror() in zakaj jih je treba tukaj uporabljati namesto recimo cin

in zakaj sta kle uporabljena tudi 2 if stavka?


("%d", &b) tole pa vem da so nekaksni kazalci:)

Jean-Paul ::

Da uporabljaš zastarele file, ti javi zaradi tega, ker includaš iostream.h, ki je zastarel. Namesto tega je bolje (oz. edino pravilno), da includaš iostream.
Drugače pa je tvoj program neka mešanica med C++-om in C-jem, kar ni najlepše. Zato sem jaz vse tvoje C++-ovske cin-e in cout-e nadomestil s C-jevskimi printf-i in scanf-i, drugače pa je vse enako. If stavek pa je uporabljen zato, da preveriš, če je klicana funkcija uspela ali ne.

P.S. Če prevedeš zgornji (moj) program tako:
gcc -Wall ime_programa.c -o ime_programa
in ga poženeš kot su, mora delati.

P.P.S. Svetujem ti, da si nabaviš kakšno osnovno knjigo o C-ju (npr. The C Programming Language, ki je prevedena tudi v slovenščino), čimveč uporabljaš man strani in seveda Google.

Ziga86 ::

hvala.

morda je potem res pri meni problem z uporabo kakšne čudne mešanice prevajalnikov, neki literature sem si sposodu v knižnici c++ za velike in male.
in se mi zdi da sem nekje prebral da je c++ nadgradnja c-ja z nekimi dotaki. ali morda veš kateri c++ prevajalnik naj si potegnem iz neta da bo imel tudi man, ker na mojih debianh ni nobenga manuala za c++ ali gcc, sej sm že reku to sm dol vleki use z apt-get, ker sm še dosti svež v uporabi linux os kot programiranju.

a je potem za programiranje printer porta bolše uporabljati c?

Zgodovina sprememb…

  • spremenilo: Ziga86 ()

MasterMind ::

Ziga86... za dostop do printer port boš mogu vedno (če mislš uporablat standardni C/C++) dostopat s C-jevskimi funkcijami. (razen seveda, če uporabiš kak lib). Drugače pa, če se prav spomnim, se da na LPT port pisati tut tako, da direktno pišeš na device (/dev/lpt0, mislm da je).

Kar se pa tiče compilerjov. GCC je skupek compilerjev za več programskih jezikov (med njimi sta C (gcc) in C++ (g++)) in je popolnoma dovolj dober.
Gentoo, KDE uporabnik.

Zgodovina sprememb…

BigWhale ::

Bog nam pomagaj, če si študent računalništva.... Če si mesar, pa party on!

BigWhale ::

naredi sudo su - vpisi svoje geslo in pozeni.

Poglej se, ce imas lp modul nalozen...

# lsmod | grep print
# lsmod | grep lp

Tole slednje ni nujno, lahko pa bi bil problem v tem...

BigWhale ::

Hm, pa se mi zdi, oz vsaj tko zgleda, kot da imas debian.

Logiraj se kot root, pa to pozeni.

Ziga86 ::

ok MasterMind hvala za odgovor torej ce jst tole prav zastopim je bolje da se ucim funkcije v c-ju ker me zanima isklucno programiranje printer porta.
meni dela kompajler če ga poženem kot c++ ime_datoteke.cpp -o ime_datoteke.

BigWhale mislim da tisto neumesno nebom komentiral (sem študent strojništva z popolnoma 0 izkušnjami programiranja, me pa zadeva zanima zato tudi sprašujem)

Imam debiane, pogledu sem če imam naložen lp modul izpiše pa tole:
debian:~# insmod | grep print
Usage: insmod filename [args]

Zgodovina sprememb…

  • spremenilo: Ziga86 ()

Brane2 ::

Whale:

pa rabi lp modul ? Bi IMHO znalo biti, da ravno z lpjem naloženim stvar ne bo delala.

Modul je tam zato, da da uporabniku device, kateremu lahko dostopa.

Tip pa tu dostopa portu direktno in devicea ne rabi.

Še več, modul lahko dostop k portom rezervira zase in uporabnik tako ne dobi dovoljenja za dostop do njih...
On the journey of life, I chose the psycho path.

BigWhale ::

Ziga,
lsmod in ne insmod. Copy paste tistega kar sem jaz napisal naredi.
----

Brane,

Ja, lahko je problem v tem, da je modul nalozen oziroma, da ni nalozen. Smiselno bi bilo, da bi se dalo do tega dostopati brez lp modula.

---

Ziga, ce je modul nalozen in ti stvar ne dela, ga removaj.

# modprobe -r lp

Verjetno bos moral se kak parport_pc modul removat. Hm. Naredi lsmod in nam poslji output. :)

'FireSTORM' ::

meni dela kompajler če ga poženem kot c++ ime_datoteke.cpp -o ime_datoteke.

Torej maš nameščen GCC. Za C pa zaženi:
gcc ime_datoteke.c -o ime_datoteke
Those penguins.... They sure aint normal....

Ziga86 ::

http://www.lubica.net/bigwhale/blog/

ma ocitno bolje da ne sprasujem vec ker to moti nekatere briljantne ume na slo-tech in jim je to kokr ena velika sala....

BigWhale ::

Heh, pa si dejansko naredil tisto, kar sem ti predlagal? Ali raje ne bos probal, ker je itak vse samo ena sala? :)

'FireSTORM' ::

zanima pa me se kaj so to
printf() scanf() perror() in zakaj jih je treba tukaj uporabljati namesto recimo cin


cin/cout sintaksa se uporablja pri C++, printf in scanf sta pa "glavna" v C jeziku. (Če je to narobe povedano linčajte mojo profesorico programiranja v drugem letniku in ne mene)
Those penguins.... They sure aint normal....

BigWhale ::

Bistvena razlika je ta, da cin/cout delata s streami.

Brane2 ::

Bistvena razlika je ta, da je cin/cout veliko "lepši", da dela s streami, ki so v bistvu različni nadrazredi osnovnega templatea AFAIK.

printf je grd.
On the journey of life, I chose the psycho path.

BigWhale ::

Men je printf lepsi... ;> Pa se enga 'bloata' kot je c++ ne rabis prevajati... ;)

Vesoljc ::

ma meni je tudi printf lep, le prevec napak ti dovoli... ampak se da narest tudi workaround okoli safe typinga
Abnormal behavior of abnormal brain makes me normal...


Vredno ogleda ...

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

[C++] parallel porti na PC

Oddelek: Programiranje
91517 (1280) snow
»

C: connect() funkcija, kako nastaviti timeout

Oddelek: Programiranje
231619 (1400) fefko-the-bulldog
»

c++ datoteke

Oddelek: Programiranje
463829 (3318) Vesoljc
»

srand in program v Cju???

Oddelek: Programiranje
131518 (1388) nuclear
»

Časovna zahtevnost programa

Oddelek: Programiranje
61506 (1385) CaqKa

Več podobnih tem