Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018

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

22.11.2010, 00:23. Показов 1302. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте. Помогите пожалуйста, что это может быть, что вот уже больше дня играюсь с билдером и он непонятно что творит. Например, написана функция для ввода текста в многострочном поле определенной длины:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
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;
    }
}
Эта функция в пятницу у меня еще благополучно работала и благополучно вводила текст. Но со вчерашнего вечера непонятно по каким законам и с какого чуда тупо перетала работать. Вот к примеру вот в этом месте:
Code
1
2
3
4
5
6
            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 С какого чуда и с какого перепуга и по каким законам природы такое случается?

Это только один глюк... А если продолжить рассказ:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 !?:megashok:

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

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

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void MyFunction()
{
тут куча кода...
куча кода...
Window(1,2,79,24,1,0,'n'); //эта команда выполняется и после нее ничего нет.
//А значит управление должно перейти в главную функцию. Но... смотрите в int main
}
 
int main()
{
куча функций и команд...
куча функций и команд...
куча функций и команд...
MyFunction();
команда после функции //эта команда не выполняется!!...
}

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

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

Что это может такое быть?:'( Помогите пожалуйста, очень прошу. У меня уже просто идеи кончились и я смотрю в монитор квадратными глазами и не знаю что делать. Другое дело, если бы знать причину глюков, а так ведь они эти глюки появляются там, где такое вообще невозможно практически, и программа работает по каким-то аномальным законам
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2010, 00:23
Ответы с готовыми решениями:

Как и почему меняется содержимое регистров после выполнения очередной команды
Как и почему меняется содержимое регистров после выполнения очередной команды?

Получение значения ключевого поля после выполнения команды TableAdapter.Insert()
Использую типизированный датасет в котором заданы DataTable и TableAdapter к ним. Не могу понять как получить значение ключевого поля...

После выполнения определённой команды не выполняются последующие команды
Объясните, пожалуйста, почему может останавливаться выполнение второй и далее комманд? cd C:\Users\alex_iv\Desktop\test_node\ node...

5
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.11.2010, 03:42
слишком длинный цикл, это из-за того, что содержимое, которое должно быть в отдельных функциях, находится в одной функции
0
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
22.11.2010, 04:20  [ТС]
То есть, вы утверждаете, что если я разложу код по нескольким функциям и потом буду по очереди эти функции в цикле вызывать, то так проблем не будет и значения не будут затираться? Но у меня же несколько дней назад этот цикл без проблем работал, несмотря на его "длинность"... Перестал работать по непонятным причинам он недавно. Полагаю, что это глюки билдера. Но как их исправить О_о
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.11.2010, 04:33
не, если делаешь по маленьким функциям, то код понятен даже без отладчика
а сейчас он непонятен даже в отладчике

Добавлено через 46 секунд
Цитата Сообщение от Tolias28
Но у меня же несколько дней назад этот цикл без проблем работал
прошлого не вернуть

Добавлено через 1 минуту
C
1
2
3
4
5
int main()
{
куча функций и команд...
куча функций и команд...
куча функций и команд...
вот такого быть не должно, все эти кучи должны быть скрыты в других функциях
1
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
22.11.2010, 18:28  [ТС]
вот такого быть не должно, все эти кучи должны быть скрыты в других функциях
Но если эти "кучи" в программе используются только один раз и не вызываются больше нигде во время работы программы, тогда какой смысл их в функции пихать? Я бы так сделал, но это лишний геморой с передачей переменных в функцию и возврат из нее. А так все переменные никуда не передаются, а выполняются непосредственно в программе. Я как начинаю передавать разные переменные в функции и возвращать их оттуда, то у меня проблем только больше появляется..
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.11.2010, 23:59
Цитата Сообщение от Tolias28
Но если эти "кучи" в программе используются только один раз и не вызываются больше нигде во время работы программы, тогда какой смысл их в функции пихать?
смысл в том, чтобы программа стала ясной, чтобы не сидеть где-то в середине и не вспоминать, а что там было в начале

есть main(), в ней запуск трёх функций, в каждой функции запуск ещё трёх функций и так далее
а так ты даже не можешь объяснить, что это за программа, и при её росте, ты уже реально не сможешь объяснить её физически, потому что на каком-то этапе перестанешь её понимать
ты думаешь у тебя большая программа, на самом деле она просто запутанная
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.11.2010, 23:59
Помогаю со студенческими работами здесь

Выполнения команды после завершения предыдущей
Добрый день, Требуется выполнить команду rmdir после завершения удаления программы. Переменная %comspec% с ключом /c сообщает,что надо...

Перезапуск скрипта, после выполнения команды
Здравствуйте, я начинающий кодер, столкнулся с проблемой. Есть один прекрасный модуль uuid, он генерирует случайное значение. Я запихнул...

Не обновляется daragrid после выполнения SQL команды
выполняю команду удаления по нажатию кнопки но датагрид не обновляется после выполнения команды все остается как будто я ничего не удалял....

Требуется произвести дебаг после выполнения команды
5) Сохраните следующий код в файле Debug_Test.m: function =Debug_Test(x) xmu=mean(x); xstd=std(x); =hist(x); if nargout==0 ...

Вывести направление робота после выполнения полученной команды
Робот может перемещаться в четырех направлениях (&quot;С&quot;-север,&quot;З&quot;-запад,&quot;Ю&quot;-юг, &quot;В&quot;-восток) и принимать три цифровые команды: 0-продолжать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru