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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Tolias, 22 ноя 2010.

  1. Tolias

    Tolias Гость

    Здраствуйте. Помогите пожалуйста, что это может быть, что вот уже больше дня играюсь с билдером и он непонятно что творит. Например, написана функция для ввода текста в многострочном поле определенной длины:
    Код (Text):
    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;
    }
    }
    Эта функция в пятницу у меня еще благополучно работала и благополучно вводила текст. Но со вчерашнего вечера непонятно по каким законам и с какого чуда тупо перетала работать. Вот к примеру вот в этом месте:
    Код (Text):
                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

    Это только один глюк... А если продолжить рассказ:
    Код (Text):
    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:

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

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

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

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

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

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

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

Поделиться этой страницей