Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Tolias28
205 / 120 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
#1

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

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

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

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

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

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

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

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

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

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

Что это может такое быть?:'( Помогите пожалуйста, очень прошу. У меня уже просто идеи кончились и я смотрю в монитор квадратными глазами и не знаю что делать. Другое дело, если бы знать причину глюков, а так ведь они эти глюки появляются там, где такое вообще невозможно практически, и программа работает по каким-то аномальным законам
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2010, 00:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему после выполнения команды cprintf значения строк затираются? (C++):

Вывести направление робота после выполнения полученной команды. - C++
Case. Робот может перемещаться в четырех направлениях («С» — север, «З» — запад, «Ю» — юг, «В» — восток) и принимать три цифровые...

Вывести направление робота после выполнения полученной команды - C++
Здравствуйте! Условие задачи: Робот может перемещаться в четырех направлениях («С» — север, «З» — запад, «Ю» — юг, «В» — восток) и...

Затираются значения при возврате из функции initializer_list - C++
Дарова. Объясните, почему при возврате объекта инитиализер_лист из функции значения этого листа трутся #include &lt;iostream&gt; using...

Дано символ C - исходная ориентация локатора и целые числа N1 и N2 - две посланные команды. Вывести ориентацию после выполнения этих команд - C++
Здравствуйтевот само условие в C++ сколкьо думал,сам то я начинающий но к правильному решению прийти немогу,прошу помощи. Локатор...

Почему функция может не завершаться после выполнения return? - C++
В одном из моих проектов есть рекурсивная функция поиска элемента в дереве по ключу: node* ownTree::findNode(node* tempRoot, char* value)...

значения перемнных после выполнения фрагмента кода - C++
Доброго времени суток! Не можете подсказать как понять одну строчку в задании: Определить значения переменных после выполнения...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.11.2010, 03:42 #2
слишком длинный цикл, это из-за того, что содержимое, которое должно быть в отдельных функциях, находится в одной функции
Tolias28
205 / 120 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
22.11.2010, 04:20  [ТС] #3
То есть, вы утверждаете, что если я разложу код по нескольким функциям и потом буду по очереди эти функции в цикле вызывать, то так проблем не будет и значения не будут затираться? Но у меня же несколько дней назад этот цикл без проблем работал, несмотря на его "длинность"... Перестал работать по непонятным причинам он недавно. Полагаю, что это глюки билдера. Но как их исправить О_о
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.11.2010, 04:33 #4
не, если делаешь по маленьким функциям, то код понятен даже без отладчика
а сейчас он непонятен даже в отладчике

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

Добавлено через 1 минуту
C
1
2
3
4
5
int main()
{
куча функций и команд...
куча функций и команд...
куча функций и команд...
вот такого быть не должно, все эти кучи должны быть скрыты в других функциях
Tolias28
205 / 120 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
22.11.2010, 18:28  [ТС] #5
вот такого быть не должно, все эти кучи должны быть скрыты в других функциях
Но если эти "кучи" в программе используются только один раз и не вызываются больше нигде во время работы программы, тогда какой смысл их в функции пихать? Я бы так сделал, но это лишний геморой с передачей переменных в функцию и возврат из нее. А так все переменные никуда не передаются, а выполняются непосредственно в программе. Я как начинаю передавать разные переменные в функции и возвращать их оттуда, то у меня проблем только больше появляется..
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.11.2010, 23:59 #6
Цитата Сообщение от Tolias28
Но если эти "кучи" в программе используются только один раз и не вызываются больше нигде во время работы программы, тогда какой смысл их в функции пихать?
смысл в том, чтобы программа стала ясной, чтобы не сидеть где-то в середине и не вспоминать, а что там было в начале

есть main(), в ней запуск трёх функций, в каждой функции запуск ещё трёх функций и так далее
а так ты даже не можешь объяснить, что это за программа, и при её росте, ты уже реально не сможешь объяснить её физически, потому что на каком-то этапе перестанешь её понимать
ты думаешь у тебя большая программа, на самом деле она просто запутанная
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2010, 23:59
Привет! Вот еще темы с ответами:

Динамический массив структур. Почему данные доступны после выполнения операции delete [] - C++
Всем привет! Выполнил вот такое задание. После того как вывелись данные трех структур, очищаю выделенную область памяти оператором delete...

Вычислить значения переменных после выполнения указанного кода - C++
Вычислить значения переменных после выполнения фрагмента программы N=9 Объяснить работу программы.Изменится ли массива после...

Какие значения будут выведены на экран после выполнения программы: - C++
int Function5(int first, int second) { first=second*second; return first*2; } void main() { int i=5; int j=2;

Какие значения будут у ячеек массива после выполнения следующего кода? - C++
Немного запутался поэтому хочу задать вопрос у специалистов. Какие значения будут у ячеек массива после выполнения следующего кода? ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.11.2010, 23:59
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru