Почему после выполнения команды Cprintf значения строк затираются?

  • Автор темы Tolias
  • Дата начала
T

Tolias

#1
Здраствуйте. Помогите пожалуйста, что это может быть, что вот уже больше дня играюсь с билдером и он непонятно что творит. Например, написана функция для ввода текста в многострочном поле определенной длины:
Код:
int InputSMS(char *str, int lim, float pric)
{
char cyrilic[]="АБВГґДЕЄЖЗИЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯабвгдеєжзиїйклмнопрстуфхцчшщьюя";
int charCount=0,x,y,i,k,n,z;
//for(i=0;i<=lim;i++) str[i]='\0';
x=wherex(); y=wherey();
lim--;
//str[0]=0;str[lim]=0;
int key=0,tmp=0,tmp2=0,del=70;
gotoxy(59,6);
textbackground(7);
cprintf("0");
gotoxy(59,7);
cprintf("1 ");
gotoxy(59,8);
cprintf("%1.2f ",pric);
textbackground(3);
gotoxy(x,y);
for(i=0;key!=13;i++)
{
key=getch();
if(key>=32 || key<=-3)
{
if(charCount>lim)
{
i--;continue;
}
tmp=str[i];
for(int j=i;j<lim-1;j++)
{
tmp2=str[j+1];
str[j+1]=tmp;
tmp=tmp2;
}
str[i]=key;
charCount++;
gotoxy(59,6);
textbackground(7);
z=strlen(str);
cprintf("%i ",z);
if(z){
if(strpbrk(str,cyrilic)==NULL) del=160;
else del=70;
gotoxy(59,7);
cprintf("%i ",z/del+1);
gotoxy(59,8);
cprintf("%1.2f",(z/del+1)*pric);
}
textbackground(3);
if(strlen(str)>36){
k=(z-1)/36;
gotoxy(x,y+k);
for(n=k*36;n<=z-1;n++)
cprintf("%c",str[n]);
gotoxy(x+i+1-k*36,y+k);
}else{
gotoxy(x,y);
cprintf("%s",str);
gotoxy(x+i+1,y);
}

continue;
}

if(key==8)
{
if(wherex()==x)
{
i--;continue;
}
k=(strlen(str)-1)/36;
gotoxy(x+charCount-1-k*36,y+k);
cprintf(" ");		
gotoxy(wherex()-1-k*36,wherey()+k);
tmp=str[charCount-1];
for(int j=charCount-1;j!=i-1;j--)
{
tmp2=str[j-1];
str[j-1]=tmp;
tmp=tmp2;
}
charCount--;
str[charCount]=0;
gotoxy(59,6);
textbackground(7);
cprintf("%i ",strlen(str));
if(strlen(str)){
if(strpbrk(str,cyrilic)==NULL) del=160;
else del=70;
gotoxy(59,7);
cprintf("%i ",strlen(str)/del+1);
gotoxy(59,8);
cprintf("	 ");
gotoxy(59,8);
cprintf("%1.2f",(strlen(str)/del+1)*pric);
}
i-=2;
textbackground(3);
if(strlen(str)>36){
k=(strlen(str)-1)/36;
gotoxy(x,y+k);
for(n=k*36;n<=strlen(str)-1;n++)
cprintf("%c",str[n]);
gotoxy(x+i+1-k*36,y+k);
}else{
gotoxy(x,y);
cprintf("%s",str);
gotoxy(x+i+1,y);
}
continue;
}

if (key==13)
{
if(!i)
{
key=0;
i--;
continue;
}
str[charCount]=0;
break;
}

if(key==27) return 27;

if(key==0xE0)
{
i--;
continue;				
}
if(key==0){
key=getch();
if(key==75)
{
if(wherex()==x)
{
if(wherey()==y){
i--;
continue;
}else{
gotoxy(wherex()+35,wherey()-1);
i-=2;
continue;
}
}
gotoxy(wherex()-1,wherey());
i-=2;
continue;
}

if(key==77)
{
if(wherex()==lim+5 || charCount==i)
{
i--;
continue;
}
gotoxy(wherex()+1,wherey());
continue;
}
}
i--;continue;
}
}
Эта функция в пятницу у меня еще благополучно работала и благополучно вводила текст. Но со вчерашнего вечера непонятно по каким законам и с какого чуда тупо перетала работать. Вот к примеру вот в этом месте:
Код:
			str[i]=key;
charCount++;
gotoxy(59,6);
textbackground(7);
z=strlen(str);
cprintf("%i ",z);
при i=0 str[0] благополучно получает значение key. Но как только выполняется команда cprintf("%i ",z) - так значение str[0] стает равным 0 =-O С какого чуда и с какого перепуга и по каким законам природы такое случается? =-O

Это только один глюк... А если продолжить рассказ:
Код:
z=strlen(str);
cprintf("%i ",z);
if(strlen(str)){
if(strpbrk(str,cyrilic)==NULL) del=160;
else del=70;
gotoxy(59,7);
cprintf("%i ",z/del+1);
gotoxy(59,8);
cprintf("%1.2f",(z/del+1)*pric);
}
textbackground(3);
if(strlen(str)>36){
k=(z-1)/36;
gotoxy(x,y+k);
for(n=k*36;n<=z-1;n++)
cprintf("%c",str[n]);
gotoxy(x+i+1-k*36,y+k);
}else{
gotoxy(x,y);
cprintf("%s",str);
gotoxy(x+i+1,y);
}
После выполнения z=strlen(str) значение z=1. Значит strlen(str) тоже равно 1. Но как только доходим до if(strlen(str)), так программа игнорирует то, что внутри оператора условия и идет на else. С какого перепуга условие if не выполняется, если strlen(str)==1 !?=-O:megashok:

И таких глюков в программе еще пару десятков.

Например, есть такой случай:

Код:
void MyFunction()
{
тут куча кода...
куча кода...
Window(1,2,79,24,1,0,'n'); //эта команда выполняется и после нее ничего нет.
//А значит управление должно перейти в главную функцию. Но... смотрите в int main
}

int main()
{
куча функций и команд...
куча функций и команд...
куча функций и команд...
MyFunction();
команда после функции //эта команда не выполняется!!...
}

Я долго ломал голову, от чего же это так, пока в пошаговом исполнении программы я случайно не поставил брекпойнт на закрывающую скобку функции MyFunction(). И как оказалось, после выполнения последней команды в функции управление переходит на нее. Я нажимаю Play(для продолжения работы программы после остановки на брекпойнте), после чего программа снова отсаовилась на скобке. Я снова нажимаю Play - она снова на скобке. Я взял и поставил брекпойнты тупо на всех строчках кода, и как оказалось, после выполнения вот этой функции программа переходит на скобку } и выполняется на ней бесконечно=-O

Я тупо в ауте. И это я не все глюки перезвал. Уже больше года имею дело с средами программирования и самим программированием, но такие чудеса, которые не вкладываются ни в какие законы физики, математики или программирования я вижу впервые :megashok:

Что это может такое быть?:'( Помогите пожалуйста, очень прошу. У меня уже просто идеи кончились и я смотрю в монитор квадратными глазами и не знаю что делать. Другое дело, если бы знать причину глюков, а так ведь они эти глюки появляются там, где такое вообще невозможно практически, и программа работает по каким-то аномальным законам=-O