- C
+ Responder ao Tópico
-
C
eu tenho esse script em C
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>
typedef char byte;
/*
Port addresses (´dmesg | grep parport0´
0x3bc = lp0 0x378 = lp1 0x278 = lp2
**/
#define BASEPORT 0x378
#define DATA BASEPORT+0
#define STATUS BASEPORT+1
#define CONTROL BASEPORT+2
/*
Function headers
**/
byte isbitset (byte val, byte bit);
byte setbit (byte val, byte bit);
/*
And... here it is... The main part...
**/
int main (int argc, char *argv[])
{
byte signal=setbit(0, 0);
byte data=0, status=0, control=0;
if (argc == 1)
{
printf("PPSW - Parallel Port Switcher\n"<IMG SRC="images/forum/icons/icon_wink.gif">;
printf("by Herbert G. Fischer 2001\n"<IMG SRC="images/forum/icons/icon_wink.gif">;
printf("GPL license (http://www.gnu.org/licenses/gpl.html)\n\n"<IMG SRC="images/forum/icons/icon_wink.gif">;
printf("ppsw [cmd] &\n"<IMG SRC="images/forum/icons/icon_wink.gif">;
printf("[cmd] - full path to application to run\n\n"<IMG SRC="images/forum/icons/icon_wink.gif">;
exit(1);
}
// get permissions to use I/O ports
if (ioperm(BASEPORT, 3, 1))
{
perror("ioperm"<IMG SRC="images/forum/icons/icon_wink.gif">;
exit(1);
}
while (1)
{
// send a bit to port
outb(data, DATA);
// get response from input
status = inb(STATUS);
if (isbitset(status, 4))
{
// run the specified program
if (!system(argv[1]))
exit(1);
else
exit(0);
}
// wait 50ms to loop again
usleep(50000);
}
// free I/O permissions
if (ioperm(BASEPORT, 3, 0))
{
perror("ioperm"<IMG SRC="images/forum/icons/icon_wink.gif">;
exit(1);
}
return 0;
}
// is the ´bit´ set on ´val´?
byte isbitset (byte val, byte bit)
{
byte bitpos[] = { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 };
return (val & bitpos[bit]);
}
mas qdo vou compilar
gcc -02 ppsw.c -o ppsw
ele da esse erro:/tmp/ccf0Egmj.o: In function `main´:
/tmp/ccf0Egmj.o(.text+0x14): undefined reference to `setbit´
collect2: ld returned 1 exit status
-
C
<TABLE BORDER=0 ALIGN=CENTER WIDTH=85%><TR><TD><font size=-1>Quote:</font><HR></TD></TR><TR><TD><FONT SIZE=-1><BLOCKQUOTE>
On 2002-12-04 15:19, 1c3_m4n wrote:
eu tenho esse script em C
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>
typedef char byte;
/*
Port addresses (´dmesg | grep parport0´
0x3bc = lp0 0x378 = lp1 0x278 = lp2
**/
#define BASEPORT 0x378
#define DATA BASEPORT+0
#define STATUS BASEPORT+1
#define CONTROL BASEPORT+2
/*
Function headers
**/
byte isbitset (byte val, byte bit);
byte setbit (byte val, byte bit);
/*
And... here it is... The main part...
**/
int main (int argc, char *argv[])
{
byte signal=setbit(0, 0);
byte data=0, status=0, control=0;
if (argc == 1)
{
printf("PPSW - Parallel Port Switcher\n"-);
printf("by Herbert G. Fischer 2001\n"-);
printf("GPL license (http://www.gnu.org/licenses/gpl.html)\n\n"-);
printf("ppsw [cmd] &\n"-);
printf("[cmd] - full path to application to run\n\n"-);
exit(1);
}
// get permissions to use I/O ports
if (ioperm(BASEPORT, 3, 1))
{
perror("ioperm"-);
exit(1);
}
while (1)
{
// send a bit to port
outb(data, DATA);
// get response from input
status = inb(STATUS);
if (isbitset(status, 4))
{
// run the specified program
if (!system(argv[1]))
exit(1);
else
exit(0);
}
// wait 50ms to loop again
usleep(50000);
}
// free I/O permissions
if (ioperm(BASEPORT, 3, 0))
{
perror("ioperm"-);
exit(1);
}
return 0;
}
// is the ´bit´ set on ´val´?
byte isbitset (byte val, byte bit)
{
byte bitpos[] = { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 };
return (val & bitpos[bit]);
}
mas qdo vou compilar
gcc -02 ppsw.c -o ppsw
ele da esse erro:/tmp/ccf0Egmj.o: In function `main´:
/tmp/ccf0Egmj.o(.text+0x14): undefined reference to `setbit´
collect2: ld returned 1 exit status
O Código correto para efetuar esta tarfa está logo abaixo o que aconteceu é que a variavel foi declarada e não foi executada no final do programa. Também estava faltando executar uma ação com ; (ponto e vírgula. Executado com a ajuda de Jairo (fera em programação em C) e testado do por Marcelo Falcão.
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>
typedef char byte;
/*
* Port addresses (´dmesg | grep parport0´
* 0x3bc = lp0 0x378 = lp1 0x278 = lp2
* **/
#define BASEPORT 0x378
#define DATA BASEPORT+0
#define STATUS BASEPORT+1
#define CONTROL BASEPORT+2
/*
* Function headers
* **/
byte isbitset (byte val, byte bit);
byte setbit (byte val, byte bit);
/*
* And... here it is... The main part...
* **/
int main (int argc, char* argv[])
{
byte signal=setbit(0,0);
byte data=0, status=0, control=0;
if (argc == 1)
{
printf("PPSW - Parallel Port Switcher\n");
printf("by Herbert G. Fischer 2001\n");
printf("GPL license (http://www.gnu.org/licenses/gpl.html)\n\n");
printf("ppsw [cmd] &\n");
printf("[cmd] - full path to application to run\n\n");
exit(1);
}
// get permissions to use I/O ports
if (ioperm(BASEPORT, 3, 1))
{
perror("ioperm");
exit(1);
}
while (1)
{
// send a bit to port
outb(data, DATA);
// get response from input
status = inb(STATUS);
if (isbitset(status, 4))
{
// run the specified program
if (!system(argv[1]))
exit(1);
else
exit(0);
}
// wait 50ms to loop again
usleep(50000);
}
// free I/O permissions
if (ioperm(BASEPORT, 3, 0))
{
perror("ioperm");
exit(1);
}
return 0;
}
//is the ´bit´ set on ´val´?
byte isbitset (byte val, byte bit)
{
byte bitpos[] = { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 };
return (val & bitpos[bit]);
}
byte setbit (byte val, byte bit)
{
byte bitpos[] = { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 };
return (val & bitpos[bit]);
}
</BLOCKQUOTE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE>