Jag ska lägga ut ett tal på Lpt porten eller någon annan port. Till att börja med bör du göra om alla <xxx.h> till <xxx>, och använda namespaces istället. Det finns flera gamla trådar om detta. I borland c++ får jag följande fel <b>>Skulle det kunna vara att jag kör XP som fukar till det?</b> Ändrar jag alla <xxx.h> till <xxx> så inkluderar borland ändå <xxx.h> Ja, det är Borland som inte följer standarden - vänj dig vid det, kompilatorer håller jämt på och krånglar...Lpt port vilket kommando?
har försökt med dessa kommandon:
outportb(port,tal);
outport(port,tal);
outp(port,tal);
min kompilator känner inte igen dessa kommandon trots att alla finns i hjälpen.
Vad är fel?
använder borland c++ 5.02 och builder 6 och msvisuell c++ 6.0
min kod ser ut så här för tillfället:
//Ska kunna styra pinnarna på LPT porten via tangentbordet
//börjar prog med en häftig meny
#include <iostream.h>
#include <dos.h>
#include <stdio.h>
#include <conio.h>
void meny(int);
int kommando(int);
void manuell();
int main()
{
int tal=1;
char tangent=28;
meny(tal);
while(tangent!=27)
{
tangent=getch();
if (tangent==0)
{
tangent=getch();
if (tangent==80)
tal++;
if (tangent==72)
tal--;
if (tal==5)
tal=1;
if (tal==0)
tal=4;
meny(tal);
}
if (tangent==13)
if(kommando(tal)==1)
return 0;
}
return 0;
}
//-------------------------------------------------------------------------
int kommando(int tal)
{
switch(tal)
{
case 1:
manuell();
break;
case 2:
window(1,1,80,25);
textbackground(3);
clrscr();
cout << "Har inte kommit än\n";
cout << "Tryck valfri tangent tilbaka för att komma tillbaka";
getch();
break;
case 3:
window(1,1,80,25);
textbackground(3);
clrscr();
cout << "Har inte kommit än\n";
cout << "Tryck valfri tangent tilbaka för att komma tillbaka";
getch();
break;
case 4:
return 1;
}
meny(tal);
return 0;
}
void meny(int tal)
{
textbackground(3);
clrscr();
const int a=27,b=8;
textbackground(4);
window(20,5,50,15);//vänster,top,höger,botten fönser dimmensioner 80*25
clrscr();
if(tal==1)
textbackground(5);
else
textbackground(6);
window(a,b,70,b+1); cprintf("Manuell körning");
if(tal==2)
textbackground(5);
else
textbackground(6);
window(a,b+1,70,b+2); cprintf( "Automatisk körning");
if(tal==3)
textbackground(5);
else
textbackground(6);
window(a,b+2,70,b+3); cprintf( "Inställningar");
if(tal==4)
textbackground(5);
else
textbackground(6);
window(a,b+3,70,b+4);cprintf( "Avsluta(Esc)");
}
//-------------------------------------------------------------------------------
//allt ovan är meny programet nedan kommer det som komunicerar med lpt porten
void manuell()
{
int tal=0;
char tangent=28;
bool pinne[7];
unsigned port = 378;//tror detta är LPT porten
for(int i=0;i<=6;i++)
pinne[i]=false;
window(1,1,80,25);
textbackground(3);
clrscr();
cout <<"(Esc) gör att du återvänder" << endl;
while(tangent!=27)
{
tangent=getch();
clrscr();
if (tangent<56 && tangent>47)
{
if (pinne[tangent-48]== true)
pinne[tangent-48]= false;
else
pinne[tangent-48]= true;
}
cout << "pinne2=" << pinne[0] << endl;
cout << "pinne3=" << pinne[1] << endl;
cout << "pinne4=" << pinne[2] << endl;
cout << "pinne5=" << pinne[3] << endl;
cout << "pinne6=" << pinne[4] << endl;
cout << "pinne7=" << pinne[5] << endl;
cout << "pinne8=" << pinne[6] << endl;
cout << "pinne9=" << pinne[7] << endl;
}
if(pinne[0]==true)
tal=tal +1;
if(pinne[1]==true)
tal=tal +2;
if(pinne[2]==true)
tal=tal +4;
if(pinne[3]==true)
tal=tal +8;
if(pinne[4]==true)
tal=tal +16;
if(pinne[5]==true)
tal=tal +32;
if(pinne[6]==true)
tal=tal +64;
if(pinne[7]==true)
tal=tal +128;
outportb(port,tal);
cout << "Talet = " << tal;
getch();
}Sv: Lpt port vilket kommando?
Sen skulle jag föreslå att du skippar alla "setcolor", osv. Allt som har med hur menyn fungerar tenderar att gå åt helvete så fort du byter kompilator. Kolla den tråden nedan för att se varför.
Menyns uppbyggnad är i mitt tycke onödigt krånglig och kan mycket lätt krångla. Skulle skrivit den mer i stil med (jag vet att det är lite "fulare", men det funkar mycket bättre i längden):
int meny();
int main()
{
//...
bool bCont=true;
while(bCont){
switch(meny){
case(1): //gör första grejen
case // ...
//...
case default:
bcont=false; break;
}
}
}
int meny()
{
int svar;
//skriv ut meny med ett antal alternativ, 1-X
std::cin << svar;
//här kanske du eventuellt måste göra en koll
}
Så slipper du bekymmer med det i onödan. Det SKULLE kunna vara lösningen, men det verkar inte vara fallet nu.
Du skriver inte vad du får för felmeddelanden, vilket gör det omöjligt att veta vad som är fel. Du får se till att du importerar rätt headers, och du måste använda rätt namespace.Sv: Lpt port vilket kommando?
Unit1.cpp(154,10):call to undefined function 'outp'
i hjälp filen till borland står det:
Syntax
#include <conio.h>
unsigned outpw(unsigned portid, unsigned value);
Description
Outputs a word to a hardware port.
outpw is a macro that writes the 16-bit word given by value to the output port specified by portid. It writes the low byte of value to portid, and the high byte of the word to portid +1, using a single 16-bit OUT instruction.
If outpw is called when conio.h has been included, it will be treated as a macro that expands to inline code. If you don't include conio.h, or if you do include conio.h and #undef the macro outpw, you'll get the outpw function.
Return Value
outpw returns value.
-----------------------------------
Skulle det kunna vara att jag kör XP som fukar till det?
Ändrar jag alla <xxx.h> till <xxx> så inkluderar borland ändå <xxx.h>
använder jag: using namespace std; får jag följande fel "Namespace name expected"
Har du någon bra compilers att rekomendera tror att allt hänger på den?Sv: Lpt port vilket kommando?
Nej, det ger andra problem. Det felet säger är att det inte finns någon sådan funktion, vilket skulle innebära att du inte har includat rätt...
<b>>Ändrar jag alla <xxx.> till <xxx> så inkluderar borland ändå <xxx.h> </b>
Vad du menar med detta hajar jag inte. Du ska använda <xxx>-varianten tillsammans med using namespace (eller hellre typ "std::cout <<" eller "using std::cout")
<b>>Syntax
>#include <conio.h>
>unsigned outpw(unsigned portid, unsigned value);</b>
Där är en del av förklaringen: om du använder conio kan du vara säker på att det krånglar. Var ganska säker på att det inte fanns såna portoperationer i standard C++.
En bra kompilator är MinGW, som du får tillsammans med DevCpp, det är helt gratis.
Skulle rekommendera att du letar efter ett fristående bibliotek för att få tillgång till portarna. Om du kör windows borde det t.ex. finnas något i WinAPI.Sv: Lpt port vilket kommando?
använder jag: using namespace std; får jag följande fel "Namespace name expected"
det jag menade med det va att denna kod
#include <iostream>
#include <dos>
#include <stdio>
#include <conio>
using namespace std;
ger dett felet
"Namespace name expected"
däremot om jag tar bort "using namespace std;" funkar det fint
Vilket kommando skulle du rekomendera för att lägga ut ett tal på lpt porten?
Vart hittar man info om vilka WinAPi:n som finns?
Denna kod är hämtad ur hjälpen till borland c++ varför får jag felet att
calling to undefiend funktion 'outp'?
Har varit inne i conio.h och kollat och jag hittar ju kommandot outp
#include <stdio.h>
#include <conio.h>
int main(void)
{
unsigned port = 0;
int value;
value = outp(port, 'C');
printf("Value %c sent to port number %d\n", value, port);
return 0;
}Sv: Lpt port vilket kommando?
Det skall krävas att man använder "using namespace", men det tycker visst inte Borland...
MSDN kan nog vara en bra startpunkt; www.msdn.com
Det bästa du kan göra om du fortsätter med borland är att börja med att testa den koden du fått från hjälpen rakt av. Om den fungerar bygger du långsamt ut den och testar nya grejer. Så fort det blir fel ser du då vad problemen är. Bättre att bygga en meny runt portkommunikation än tvärtom i det här fallet.