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

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

Восстановить пароль Регистрация
 
Tolias28
202 / 117 / 2
Регистрация: 18.08.2010
Сообщений: 1,006
22.11.2010, 00:23     Почему после выполнения команды cprintf значения строк затираются? #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 С какого чуда и с какого перепуга и по каким законам природы такое случается?

Это только один глюк... А если продолжить рассказ:
Код
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++ значения перемнных после выполнения фрагмента кода
Дано символ C - исходная ориентация локатора и целые числа N1 и N2 - две посланные команды. Вывести ориентацию после выполнения этих команд C++
C++ Подскажите пожалуйста, почему у меня после после выполнения цикла получается какой-то неперерывный поток данных
Дана программа из 7 строк. Почему y,z не увеличивают свои значения на 1? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.11.2010, 03:42     Почему после выполнения команды cprintf значения строк затираются? #2
слишком длинный цикл, это из-за того, что содержимое, которое должно быть в отдельных функциях, находится в одной функции
Tolias28
202 / 117 / 2
Регистрация: 18.08.2010
Сообщений: 1,006
22.11.2010, 04:20  [ТС]     Почему после выполнения команды cprintf значения строк затираются? #3
То есть, вы утверждаете, что если я разложу код по нескольким функциям и потом буду по очереди эти функции в цикле вызывать, то так проблем не будет и значения не будут затираться? Но у меня же несколько дней назад этот цикл без проблем работал, несмотря на его "длинность"... Перестал работать по непонятным причинам он недавно. Полагаю, что это глюки билдера. Но как их исправить О_о
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.11.2010, 04:33     Почему после выполнения команды cprintf значения строк затираются? #4
не, если делаешь по маленьким функциям, то код понятен даже без отладчика
а сейчас он непонятен даже в отладчике

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

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

есть main(), в ней запуск трёх функций, в каждой функции запуск ещё трёх функций и так далее
а так ты даже не можешь объяснить, что это за программа, и при её росте, ты уже реально не сможешь объяснить её физически, потому что на каком-то этапе перестанешь её понимать
ты думаешь у тебя большая программа, на самом деле она просто запутанная
Yandex
Объявления
22.11.2010, 23:59     Почему после выполнения команды cprintf значения строк затираются?
Ответ Создать тему
Опции темы

Текущее время: 03:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru