Avatar billede jps2mt Nybegynder
21. august 2001 - 02:38 Der er 40 kommentarer og
1 løsning

Problemer med Inp, outp og delay

Hejsa...

Jeg er ret \"grøn\" hvad angår C++, og er i øjeblikket ved at se om jeg kan få flg. til at virke...

Det laves i Microsoft Visual C++ og koden ser ud som flg.:

// LCD1.cpp : Defines the entry point for the console application.
//

#include \"stdafx.h\"
#include \"iostream.h\"
#include \"dos.h\"
#include \"string.h\"

#define BYTE unsigned char



class LCDParallelDriver
{
  public:
    LCDParallelDriver();
    void Init();

    void Clrscr();
    void HideCursor();
    void HomeCursor();
    void Write(char *string);

  private:
    void SendCmd(BYTE cmd);

    int __PORTADDRESS, __DATA, __STATUS, __CONTROL;
};

/* Constructor for LCD driver */
LCDParallelDriver::LCDParallelDriver()
{
    __PORTADDRESS = 0x378;
    __DATA = __PORTADDRESS + 0;
    __STATUS = __PORTADDRESS + 1;
    __CONTROL = __PORTADDRESS + 2;
}

/* Sends a single command to the LCD */
inline void LCDParallelDriver::SendCmd(BYTE cmd)
{
    outp(__CONTROL, inp(__CONTROL) | 0x08);

    outp(__DATA, cmd);
    outp(__CONTROL,inp(__CONTROL) | 0x01);
    delay(2);
    outp(__CONTROL,inp(__CONTROL) & 0xFE);
    delay(2);

    outp(__CONTROL, inp(__CONTROL) & 0xF7);

}

/* Initializes the LCD */
void LCDParallelDriver::Init()
{
  char init[10];

  init[0] = 0x0F; /* Init Display */
  init[1] = 0x01; /* Clear Display */
  init[2] = 0x38; /* 2 line Display */


  outp(__CONTROL, inp(__CONTROL) & 0xDF);

  for (int i=0; i<=2; i++)
      SendCmd(init[i]);

}

/* Clears the screen of the LCD */
void LCDParallelDriver::Clrscr()
{
    SendCmd(1);
}

/* Returns the cursor to the start of LCD display */
void LCDParallelDriver::HomeCursor()
{
    SendCmd(2);
}

/* Hides the cursor */
void LCDParallelDriver::HideCursor()
{
    SendCmd(12);
}

/* Writes a string of characters to the LCD */
void LCDParallelDriver::Write(char *string)
{
  int count;
  int len;

  len = strlen(string);

  for (count = 0; count < len; count++)
  {
    outp(__DATA, string[count]);
    outp(__CONTROL,inp(__CONTROL) | 0x01);
    delay(2);
    outp(__CONTROL,inp(__CONTROL) & 0xFE);
    delay(2);
  }
}

/* void main() */
int main(int argc, char* argv[])
{
    LCDParallelDriver LCD;

    LCD.Init();
    LCD.HideCursor();
    LCD.Write(\"Test\");

    return 0;
}

MEN...Når jeg så vil sige Build LCD.exe, kommer den med denne sætning:

C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\LCD1\\LCD1.cpp(42) : error C2065: \'outp\' : undeclared identifier
C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\LCD1\\LCD1.cpp(42) : error C2065: \'inp\' : undeclared identifier
C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\LCD1\\LCD1.cpp(46) : error C2065: \'delay\' : undeclared identifier
Error executing cl.exe.

LCD1.exe - 3 error(s), 0 warning(s)


Hvad kan det skyldes, og hvordan kan jeg løse mit problem??


Mvh. Morten
Avatar billede morten2 Nybegynder
21. august 2001 - 03:21 #1
prøv at inkludere

#include <conio.h>
Avatar billede wisen Nybegynder
21. august 2001 - 08:13 #2
Du skal ihvertfald inkludere <conio>, som morten2 skriver; men derudover hedder funktionerne _inp og _outp ...

/Wisen
Avatar billede wisen Nybegynder
21. august 2001 - 08:15 #3
... der er ikke noget der hedder delay, men prøv med \"sleep\" ...
Avatar billede wisen Nybegynder
21. august 2001 - 08:16 #4
Hvilket operativsystem skal det køre på ?
Avatar billede jps2mt Nybegynder
21. august 2001 - 10:53 #5
wisen >> Det skal køre på Win 2000 og Win XP
Avatar billede jps2mt Nybegynder
21. august 2001 - 10:56 #6
wisen >> Efter jeg har inkluderet conio.h, så holdt den op med fejlene om inp og outp, men den brokker sig stadig over delay, og den laver samme fejl, hvis jeg ændre delay til sleep...
Avatar billede wisen Nybegynder
21. august 2001 - 10:59 #7
Åhh, det skal være \"Sleep\", altså med stort S.

Avatar billede jps2mt Nybegynder
21. august 2001 - 11:02 #8
Duer stadig ikke...
Avatar billede wisen Nybegynder
21. august 2001 - 11:12 #9
Det var da meget....
Avatar billede wisen Nybegynder
21. august 2001 - 11:13 #10
prøv at inkludere <windows>...
Avatar billede jps2mt Nybegynder
21. august 2001 - 12:01 #11
Hmmm...Det så ud til at løse lidt op på det...Nu siger den bare:

Compiling...
LCD1.cpp
Linking...
LCD1.obj : error LNK2001: unresolved external symbol _outp
LCD1.obj : error LNK2001: unresolved external symbol _inp
Debug/LCD1.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

LCD1.exe - 3 error(s), 0 warning(s)
Avatar billede wisen Nybegynder
21. august 2001 - 12:17 #12
Det lyder som om at du mangler at linke noget....

Hvad står der under Project->Settings->Link->Object/Library modules ?
Avatar billede jps2mt Nybegynder
21. august 2001 - 12:24 #13
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
Avatar billede wisen Nybegynder
21. august 2001 - 12:40 #14
Hmm, prøv at tilføje \"msvcrt.lib\"...
Avatar billede jps2mt Nybegynder
21. august 2001 - 13:26 #15
--------------------Configuration: LCD1 - Win32 Debug--------------------
Linking...
LINK : warning LNK4098: defaultlib \"LIBCD\" conflicts with use of other libs; use /NODEFAULTLIB:library
LCD1.obj : error LNK2001: unresolved external symbol _outp
LCD1.obj : error LNK2001: unresolved external symbol _inp
Debug/LCD1.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

LCD1.exe - 3 error(s), 1 warning(s)
Avatar billede jps2mt Nybegynder
21. august 2001 - 13:28 #16
Og jeg har prøvet med /NODEFAULTLIB og så giver den bare samme fejl, som inden jeg tilføjede msvcrt.lib

Mvh. Morten
Avatar billede wisen Nybegynder
21. august 2001 - 13:35 #17
Hmm damn; det kan være jeg husker forkert, øjeblik...
Avatar billede wisen Nybegynder
21. august 2001 - 13:46 #18
Avatar billede wisen Nybegynder
21. august 2001 - 13:55 #19
Prøv med een af disse :

Libraries

LIBC.LIB  Single thread static library, retail version
LIBCMT.LIB Multithread static library, retail version
Avatar billede jps2mt Nybegynder
22. august 2001 - 00:46 #20
Dit sidste indlæg forstod jeg ikke, hvor skal jeg skrive det??
Avatar billede morten2 Nybegynder
22. august 2001 - 01:23 #21
Istedet for delay() (Borland funktion tror jeg nok) eller Sleep() kunne du bruge buissy waiting.
Da det kun er 2 millsek du venter gør det nok ikke noget.

void delay(long wait)
{
  long end = time(NULL) + wait;
  long now = time(NULL);
  while(end > now)
  {
    now = time(NULL);
  }
}

husk at inkludere time.h
Avatar billede jps2mt Nybegynder
22. august 2001 - 01:34 #22
Problemet med Delay/Sleep er løst...
Avatar billede morten2 Nybegynder
22. august 2001 - 01:34 #23
Hvordan?
Avatar billede wisen Nybegynder
22. august 2001 - 08:01 #24
Prøv at inkludere een af disse i stedet for msvcrt.lib : libc.lib eller libcmt.lib

Den første er en single thread version, det er den du først skal prøve...
Avatar billede jps2mt Nybegynder
22. august 2001 - 11:04 #25
Både med libc.lib og libcmt.lib kommer denne meddelelse:

--------------------Configuration: LCD1 - Win32 Debug--------------------
Linking...
LINK : warning LNK4098: defaultlib \"LIBCD\" conflicts with use of other libs; use /NODEFAULTLIB:library
LCD1.obj : error LNK2001: unresolved external symbol _outp
LCD1.obj : error LNK2001: unresolved external symbol _inp
Debug/LCD1.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

LCD1.exe - 3 error(s), 1 warning(s)
Avatar billede jps2mt Nybegynder
22. august 2001 - 11:06 #26
morten2 >> Som der står længere oppe, bruger du Sleep(); istedetfor delay, og Sleep funktionen virker med conio.h
Avatar billede wisen Nybegynder
22. august 2001 - 12:15 #27
Det var sgu da mystisk; Så har jeg ikke lige flere gode idéer :(
Avatar billede wisen Nybegynder
22. august 2001 - 12:27 #28
Aha !

Du skal tilføje følgende til dine linker options :

/NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib

... Bare copy/paste det ind sidst i det nederste vindue....

Avatar billede jps2mt Nybegynder
22. august 2001 - 12:29 #29
Hmmm...Så havnede vi på denne her igen...

--------------------Configuration: LCD1 - Win32 Debug--------------------
Linking...
LCD1.obj : error LNK2001: unresolved external symbol _outp
LCD1.obj : error LNK2001: unresolved external symbol _inp
Debug/LCD1.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

LCD1.exe - 3 error(s), 0 warning(s)
Avatar billede morten2 Nybegynder
22. august 2001 - 12:30 #30
Jeg mente bare at Sleep() måske ikke var den beste løsning siden du får alle disse linker fejl.
Istedet for at bøvle med det kunne du selv skrive en bussy waiting delay.
Avatar billede wisen Nybegynder
22. august 2001 - 12:30 #31
Jeg har lige prøvet at builde det på min egen maskine, du skal være opmærksom på, at det ikke kan køre på Win2000 jvf. http://support.microsoft.com/support/kb/articles/Q112/2/98.asp
Avatar billede wisen Nybegynder
22. august 2001 - 12:30 #32
morten2 >> det er jo ikke Sleep() den ikke kan linke...
Avatar billede jps2mt Nybegynder
22. august 2001 - 12:33 #33
Jeg har et program der hedder allowio.exe, som jeg bare skal køre med dette program som parameter, så virker det, men jeg kan blot ikke builde det program...
Avatar billede morten2 Nybegynder
22. august 2001 - 12:34 #34
Nej det er korrekt. Men link problemet opstår fordi man mikser gamle dos funktioner (outp og inp) med windows funktioner (Sleep).
Avatar billede wisen Nybegynder
22. august 2001 - 12:38 #35
Øhh nå; det virker ellers på min Win2000 maskine med Sleep() ?!?
Avatar billede morten2 Nybegynder
22. august 2001 - 12:43 #36
Ok hvis det er tilfældet trækker jeg min kommentar tilbage.

Jeg prøvede på min w2k og kunne heller ikke få det til at virke. Men jeg brugte nok de forkerte libs så.
Avatar billede dejbjerg Nybegynder
29. august 2001 - 04:10 #37
I MSDN kan man læse:

Attempting to reference functions or data that don\'t have external linkage causes LNK2001. In C++, inline functions and const data have internal linkage unless explicitly specified as extern.

Da du jo netop inliner i
inline void LCDParallelDriver::SendCmd(BYTE cmd)
{...}
kunne man foranlediges til at tro, at det var det, der var årsagen.

Måske virker det med extern \"C\" foran.
Avatar billede soepro Nybegynder
30. august 2001 - 08:16 #38
inp og outp funktionerne er ganske rigtigt \"gamle\" DOS funktioner, dvs. funktioner som kun er tilladte hvis programmet kører som et DOS program/under DOS boks. Grunden til at inp og outp ikke længere er tilladte ligger i selv Windows - det er jo (i alt fald et forsøg på at lave) et flerbruger system, og man kan derfor ikke være sikker på at have f.eks. LPT-porten for sig selv. (Word kunne f.eks. være ved at udskrive via porten.)

Jeg har løst problemet i mit program (bruger LPT-porten til at styre noget elektronik) ved at bruge ASM - i den situation sættes Windows begræsningerne nemlig i noget omfang ud af spil:

int inport(int portAddr)
{
  int portData = 0x00;
  asm
  {
    mov  dx,portAddr
    in  al,dx
    mov  portData,al
  };
  return portData;
}

og

void outport(int portAddr, int portData)
{
  // Port data adjusted immediately when changed.
  asm
  {
    mov  dx, portAddr
    mov  al, portData
    out  dx, al
  };
  return;
}
Avatar billede soepro Nybegynder
30. august 2001 - 08:17 #39
Idet du så med følgende to macroer re-directer dine inp og outp kald til d.o.:

#define inp(x) inport(x)
#define outp(x, y) outport(x, y)
Avatar billede jps2mt Nybegynder
31. august 2001 - 02:15 #40
Dropper at lave det i C++...
Fatter ikke en rigende disse af det, holder mig til at lave det i Visual Basic, meget muligt at man kan mere i C++, men det er også MEGET mere indviklet...

Ellers tak for et godt forsøg, men det virker altså ikke...

Mvh. Morten
Avatar billede soepro Nybegynder
31. august 2001 - 10:45 #41
Hej Morten.

At man opgiver at bruge de indsendte svar, er ens egen sag - men man plejer at give lidt point til dem der har givet bruge tid på at forsøge at hjælpe dig alligevel. Jeg tror at \'jps2mt\' komme til at vente lidt længere på svar næste gang !
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester