Problem [problemem jest błędny temat]

0

Oto kod dwoch prostych funkcji pod DOS'a, ktore sluza do wpisu stringa o okreslonej dlugosci (potrzebne byly do wiekszego programu, ktory pisze zeby sie wprawic w C++):

void Komunikat(char *Komunikat)
 {
 register int i;
 int x,y;
 char bufor[640];
 size_t rozmiar, lewy;
 x=wherex(); y=wherey();
 rozmiar = strlen(Komunikat);
 if (rozmiar>76) strncpy(Komunikat, Komunikat, 76);
 gettext(1, 11, 80, 14, &bufor[0]);
 lewy=(80-(rozmiar+4))/2;
 gotoxy(lewy,11); printf("Ú");  for(i=1;i<=rozmiar+2;i++) printf ("Ä");  printf("ż");
 gotoxy(lewy, 12); printf("ł %s ł", Komunikat);
 gotoxy(lewy, 13); printf("ł");
 if ((rozmiar%2)!=0) printf(" ");
 for(i=1;i<(rozmiar-2)/2;i++) printf(" ");
 textattr(0x70); cprintf("  OK  ");for(i=1;i<(rozmiar-2)/2;i++) printf(" "); printf("ł");
 textattr(0x07);
 gotoxy(lewy, 14); printf("Ŕ"); for(i=1;i<=(rozmiar+2);i++) printf("Ä"); printf("Ů");
 gotoxy(80,25);
 do {} while (getch()!=13);
 puttext(1, 11, 80, 14, &bufor[0]);
 gotoxy(x,y);
 }

int Wpis(char *wyraz, int rozmiar, int x, int y)
 {
 char roz[2]="";
 int flaga=0;
 int i=-1;
 int bufor;
 itoa(rozmiar, roz, 10);
 char *Kom="Limit znakow dla tego rodzaju danych wynosi ";
 _fstrcat(Kom, roz);
 for(;;)
  {
  if (i<rozmiar) i++;
  gotoxy(x+i, y);
  bufor = getch();
  if (bufor==8)
   {
   if (i==0) {i--; continue;}
   else
    {
    gotoxy(x+i-1, y);
    printf(" ");
    wyraz[i-1]='\0';
    i-=2;
    continue;
    }
   }
  else
   {
   if (bufor==27) {flaga=1; break;}
   if (bufor==13) break;
   if (bufor==0) {getch(); i--; continue;}
   if (i==rozmiar) Komunikat(Kom);
   else
    {
    wyraz[i]= (char) bufor;
    printf("%c", bufor);
    }
   }
  }
 if (flaga==1) strcpy(wyraz, "");
 return flaga; //0-OK, 1-ESC
 }

Sprobujcie skompilowac (pod DOS, model Large) program ktory wykorzystuje Wpis kilka razy pod rzad i zobaczcie co wyprawia. Wiem tylko tyle ze to ma cos wspolnego z zastosowaniem funcj itoa i strcat. Wiecie ja tam dopiero sie ucze C wiec jesli jest tu jakis oczywisty blad to sie nie smiejcie, ale dla mnie to jest niepojete:) A moze u was bedzie dzialalo OK:)? [glowa]

0
void Komunikat(char *Komunikat)
{
register int i;
int x,y;
char bufor[640];
size_t rozmiar, lewy;
x=wherex(); y=wherey();
rozmiar = strlen(Komunikat);
if (rozmiar>76) strncpy(Komunikat, Komunikat, 76);
// a nie lepiej  Komunikat[77] = '\ 0'; dopiero teraz naprawde okrojony zostal Komunikat  bo strncpy nie wstawia \ 0
// i teraz bez problemow bedziesz mogl wypisac Komuniakt na ekran bo kompilator znajdzie '\ 0' !!
gettext(1, 11, 80, 14, &bufor[0]);
// bez udziwnien !! - gettext(1, 11, 80, 14, bufor); to to samo
lewy=(80-(rozmiar+4))/2;
gotoxy(lewy,11); printf("Ú");  for(i=1;i<=rozmiar+2;i++) printf ("Ä");  printf("ż");
gotoxy(lewy, 12); printf("ł %s ł", Komunikat);
gotoxy(lewy, 13); printf("ł");
if ((rozmiar%2)!=0) printf(" ");
for(i=1;i<(rozmiar-2)/2;i++) printf(" ");
textattr(70); cprintf("  OK  ");for(i=1;i<(rozmiar-2)/2;i++) printf(" "); printf("ł");
textattr(07);
gotoxy(lewy, 14); printf("Ŕ"); for(i=1;i<=(rozmiar+2);i++) printf("Ä"); printf("Ů");
gotoxy(80,25);
do {} while (getch()!=13);
puttext(1, 11, 80, 14, &bufor[0]);
// bez udziwnien !! - puttext(1, 11, 80, 14, bufor); to to samo
gotoxy(x,y);
}

int Wpis(char *wyraz, int rozmiar, int x, int y)
{
// ten parametr wyraz to musi byc zaalokowana pamiec  char cos[256]; lub np mallociem
// bo musi byc miejsce zeby wstawic pon=bierane znaki !!!!
char roz[10]="";
// roz ma pomiescic inta i jeszcze '\ 0' wiec musi byc odpowiednio dlugi !!
int flaga=0;
int i=-1;
int bufor;
itoa(rozmiar, roz, 10);
char *Kom="Limit znakow dla tego rodzaju danych wynosi ";
_fstrcat(Kom, roz);
// i tutaj podstawowy blad bo Kom to jest statyczny string w pamieci wiec do niego nie mozesz
// nic dodac !!!! Tutaj od razu powinno sie sypnac !!
// sprobuj tak :
//  char Kom[64]="Limit znakow dla tego rodzaju danych wynosi ";
//  strcat(Kom, roz);
// 

// w ponizsza petle nie wnikalem przyjmuje ze jest OK bo powazne bugi wystapily powyzej ;)
for(;;){
  }
if (flaga==1) strcpy(wyraz, "");
return flaga; //0-OK, 1-ESC
}

Tych funkcji nie odpalalem tylko przejrzalem ich implementacje - to co znalazlem powinno
wyeliminowac wszystkie przeklamania !!

PS. chyba mamy kolejnego buga na tym forum !! [diabel]

0

Dzieki. Ja nad tym 2 dni siedzialem na wszystkie sposoby probowalem i bym nie doszedl gdzie byl blad:) Sorry za ta zamieche z wyswietleniem kodu ale pierwszy raz zamieszczalem tu wiadomosc. Pozdr [cya]

0

ja bym jeszcze zamienil

void Komunikat(char *Komunikat)
{
register int i;
int x,y;
char bufor[640];

na

void Komunikat(char *Komunikat)
{
register int i;
int x,y;
static char bufor[640];

zawsze bedzie to szybciej dzialac

0

Tak szybciej i do tego o 640 bajtow wiekszy progs [diabel]

1 użytkowników online, w tym zalogowanych: 0, gości: 1