Hallo, guten Tag.
Ich habe hier ein Programm , um im Grafikmodus des VDC Text auszugeben.
Welches in dieser Case auch funktioniert:
---------------------------------------------
case 'C':
strcpy( text, "HI-TECH-C\0");
hitext(30,10,0);
strcpy( text, "ES GEHT...\0");
hitext(35,15,0);
break;
---------------------------------------------
Nun wollte ich einen Integerwert in einem String umwandeln mit einer Funktion, ab Zeile 309 :
----------------------------------------------
void ausgabe()
{
wert=12345;
sprintf( stri, "%d", wert );
}
-----------------------------------------------
So wie ich diese Funktion reinsetze in mein Programm, kommt beim Linken eine Fehlermeldung, siehe Bild.
- #include <stdio.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <conio.h>
- #include <sys.h>
- #include <hitech.h>
- #include <vdc.h>
- ushort zeit;
- uchar c;
- uchar charset1[128][8];
- uchar charset2[128][8];
- uchar attributbyte[2000];
- char ende=1;
- char text[80];
- char stri[32];
- int wert;
- void vdcmemwr(int adr, uchar wert)
- {
- vdcregwr(vdcUpdAddrHi,(uchar) (adr >> 8));
- vdcregwr(vdcUpdAddrLo,(uchar) adr);
- vdcregwr(vdcCPUData,wert);
- }
- uchar vdcmemrd(int adr)
- {
- uchar zahl;
- vdcregwr(vdcUpdAddrHi,(uchar) (adr >> 8));
- vdcregwr(vdcUpdAddrLo,(uchar) adr);
- zahl = vdcregrd(vdcCPUData);
- return zahl;
- }
- void vdcadrwr(int adr)
- {
- vdcregwr(vdcUpdAddrHi,(uchar) (adr >> 8));
- vdcregwr(vdcUpdAddrLo,(uchar) adr);
- }
- void backcolor(uchar wert)
- {
- uchar bgr;
- bgr = (vdcregrd(vdcFgBgColor) & 240) | wert;
- vdcregwr (vdcFgBgColor,bgr);
- }
- void hirescolor(uchar wert)
- {
- uchar hir;
- hir = (vdcregrd(vdcFgBgColor) & 15) | (wert << 4);
- vdcregwr (vdcFgBgColor,hir);
- }
- void clrtext(ushort viadr)
- {
- ushort i;
- vdcregwr(vdcVtSmScroll, 32);
- vdcadrwr(viadr);
- vdcregwr(vdcCPUData,0);
- for(i= 0; i <=8; i += 1)
- {
- vdcregwr(vdcWordCnt,0);
- }
- }
- void clrhires(ushort viadr)
- {
- ushort i;
- vdcregwr(vdcVtSmScroll, 32);
- vdcadrwr(viadr);
- vdcregwr(vdcCPUData,0);
- for(i= 0; i <=63; i += 1)
- {
- vdcregwr(vdcWordCnt,0);
- }
- }
- void hires()
- {
- vdcregwr(vdcHzSmScroll,135);
- }
- void textmode()
- {
- vdcregwr(vdcHzSmScroll,71);
- }
- void zeichenr(ushort zeadr, ushort zeadr1)
- {
- ushort adr;
- uchar ch,by;
- for(ch= 32; ch <= 127; ch += 1)
- {
- adr= zeadr1 + (ch << 4);
- vdcadrwr(adr);
- for(by= 0; by <= 7; by += 1)
- {
- charset1[ch][by] = vdcregrd(vdcCPUData);
- }
- adr = zeadr + (ch << 4);
- vdcadrwr(adr);
- for(by= 0; by <= 7; by += 1)
- {
- charset2[ch][by] = vdcregrd(vdcCPUData);
- }
- }
- }
- void zeichenw(ushort zeadr, ushort zeadr1)
- {
- ushort adr;
- uchar ch,by;
- for(ch= 32; ch <= 127; ch += 1)
- {
- adr= zeadr1 + (ch << 4);
- vdcadrwr(adr);
- for(by= 0; by <= 7; by += 1)
- {
- vdcregwr(vdcCPUData, charset1[ch][by]);
- }
- adr = zeadr + (ch << 4);
- vdcadrwr(adr);
- for(by= 0; by <= 7; by += 1)
- {
- vdcregwr(vdcCPUData, charset2[ch][by]);
- }
- }
- }
- void videoadr(ushort adr)
- {
- vdcregwr(vdcDspStAddrHi,(uchar) (adr >> 8));
- vdcregwr(vdcDspStAddrLo,(uchar) adr);
- outp(0x0a2e,(uchar) (adr >> 8));
- }
- void attributadr(ushort adr)
- {
- vdcregwr(vdcAttrStAddrHi,(uchar) (adr >> 8));
- vdcregwr(vdcAttrStAddrLo,(uchar) adr);
- outp(0x0a2f,(uchar) (adr >> 8));
- }
- void attributw(ushort atadr)
- {
- ushort z;
- vdcadrwr(atadr);
- for(z= 0; z <= 1999; z += 1)
- {
- vdcregwr(vdcCPUData, attributbyte[z]);
- }
- }
- void attributr(ushort atadr)
- {
- ushort z;
- vdcadrwr(atadr);
- for(z= 0; z <= 1999; z += 1)
- {
- attributbyte[z] = vdcregrd(vdcCPUData);
- }
- }
- void vdcram64()
- {
- vdcregwr(vdcChSetStAddr,63);
- }
- void setpixvdc(int X, int Y, ushort viadr)
- {
- uchar SaveByte;
- ushort PixByte;
- static uchar BitTable[8] = {128,64,32,16,8,4,2,1};
- PixByte =(Y << 6)+(Y << 4)+(X >> 3)+viadr;
- SaveByte = vdcmemrd(PixByte);
- vdcmemwr(PixByte,SaveByte | BitTable[X & 0x07]);
- }
- void linevdc(int X1, int Y1, int X2, int Y2, ushort viadr)
- {
- int XInc, YInc, DX, DY, X, Y, C, R;
- DX = X2-X1;
- if(DX < 0)
- {
- XInc = -1;
- DX = -DX;
- }
- else
- XInc = 1;
- DY = Y2-Y1;
- if(DY < 0)
- {
- YInc = -1;
- DY = -DY;
- }
- else
- if(DY > 0)
- YInc = 1;
- else
- YInc = 0;
- X = X1;
- Y = Y1;
- setpixvdc(X,Y,viadr);
- if (DX > DY)
- {
- R = DX >> 1;
- for(C = 1; C <= DX; C++)
- {
- X += XInc;
- R += DY;
- if(R >= DX)
- {
- Y += YInc;
- R -= DX;
- }
- setpixvdc(X,Y,viadr);
- }
- }
- else
- {
- R = DY >> 1;
- for(C = 1; C <= DY; C++)
- {
- Y += YInc;
- R += DX;
- if(R >= DY)
- {
- X += XInc;
- R -= DY;
- }
- setpixvdc(X,Y,viadr);
- }
- }
- }
- void ellipsevdc(int XC, int YC, int A, int B, ushort viadr)
- {
- int X, Y;
- long AA, AA2, BB, BB2, D, DX, DY;
- X = 0;
- Y = B;
- AA = (long) A*A;
- AA2 = AA << 1;
- BB = (long) B*B;
- BB2 = BB << 1;
- D = BB-AA*B+AA >> 2;
- DX = 0;
- DY = AA2*B;
- setpixvdc(XC,YC-Y,viadr);
- setpixvdc(XC,YC+Y,viadr);
- while (DX < DY)
- {
- if (D > 0)
- {
- Y--;
- DY -= AA2;
- D -= DY;
- }
- X++;
- DX += BB2;
- D += (BB+DX);
- setpixvdc(XC+X,YC+Y,viadr);
- setpixvdc(XC-X,YC+Y,viadr);
- setpixvdc(XC+X,YC-Y,viadr);
- setpixvdc(XC-X,YC-Y,viadr);
- }
- D += (3*(AA-BB)/2-(DX+DY))/2;
- while (Y > 0)
- {
- if (D < 0)
- {
- X++;
- DX += BB2;
- D += (BB+DX);
- }
- Y--;
- DY -= AA2;
- D += (AA-DY);
- setpixvdc(XC+X,YC+Y,viadr);
- setpixvdc(XC-X,YC+Y,viadr);
- setpixvdc(XC+X,YC-Y,viadr);
- setpixvdc(XC-X,YC-Y,viadr);
- }
- }
- void ausgabe()
- {
- wert=12345;
- sprintf( stri, "%d", wert );
- }
- void hitext(uchar x, uchar y,ushort viadr)
- {
- uchar z,zz,chr;
- int startxy,adrhi;
- startxy=(y*80*8)+x+viadr;
- adrhi=startxy;
- for(z= 0; z <= 80; z += 1)
- {
- chr= text[z];
- if (chr == 0)
- {
- break;
- }
- adrhi=startxy+z;
- for(zz= 0; zz <= 7; zz += 1)
- {
- vdcmemwr(adrhi,charset1[chr][zz]);
- adrhi=adrhi+80;
- }
- }
- }
- void main(void)
- {
- vdcram64();
- while(ende)
- {
- if(kbhit())
- {
- c = toupper(getch());
- switch(c)
- {
- case 'A':
- videoadr(0x0000);
- attributadr(0x0800);
- zeichenr(0x2000,0x3000);
- attributr(0x0800);
- hirescolor(vdcWhite);
- backcolor(vdcBlack );
- hires();
- clrhires(0);
- break;
- case 'B':
- linevdc(0,0,619,199,0x0000);
- linevdc(619,0,0,199,0x0000);
- ellipsevdc(320,100,200,98,0x0000);
- break;
- case 'C':
- strcpy( text, "HI-TECH-C\0");
- hitext(30,10,0);
- strcpy( text, "ES GEHT...\0");
- hitext(35,15,0);
- break;
- case 'T':
- videoadr(0x0000);
- attributadr(0x0800);
- clrhires(0);
- zeichenw(0x2000,0x3000);
- attributw(0x0800);
- textmode();
- break;
- case 'Q':
- videoadr(0x0000);
- attributadr(0x0800);
- clrhires(0);
- zeichenw(0x2000,0x3000);
- attributw(0x0800);
- textmode();
- ende=0;
- break;
- }
- }
- for (zeit=1 ; zeit<10 ; zeit++) ;
- }
- }
Aber wunder, diese Programm funktioniert , die Werte werden gedruckt :
- #include <stdio.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <conio.h>
- #include <sys.h>
- #include <hitech.h>
- #include <vdc.h>
- char stri[32];
- char strs[32];
- int i=-12345;
- ushort s=56789;
- void main(void)
- {
- sprintf( stri, "%d", i );
- printf( "Ergebnis: %s\n", stri );
- sprintf( strs, "%d", s );
- printf( "Ergebnis: %s\n", strs );
- }
Liegt es am Compilerschalter bei dem Programm oben , den man noch setzen muss????
Danke.
Gruss