Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2010, 00:11   #1
Tolias
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 41
Печаль Почему после выполнения команды cprintf значения строк затираются?

Здраствуйте. Помогите пожалуйста, что это может быть, что вот уже больше дня играюсь с билдером и он непонятно что творит. Например, написана функция для ввода текста в многострочном поле определенной длины:
Код:
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)// && key!=75 && key!=77)
		{
			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;
			}
			//gotoxy(x+charCount-1,y);
			//cprintf(" ");
			//gotoxy(wherex()-1,wherey());
            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]='\0';
}
Эта функция в пятницу у меня еще благополучно работала и благополучно вводила текст. Но со вчерашнего вечера непонятно по каким законам и с какого чуда тупо перетала работать. Вот к примеру вот в этом месте:
Код:
			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:
Tolias вне форума Ответить с цитированием
Старый 22.11.2010, 00:11   #2
Tolias
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 41
По умолчанию

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

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

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

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

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

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

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

Последний раз редактировалось Tolias; 22.11.2010 в 00:14.
Tolias вне форума Ответить с цитированием
Старый 22.11.2010, 00:12   #3
Tolias
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 41
По умолчанию

Помогите пожалуйста, очень прошу(((((
А то я уже не знаю что думать и уже дошел до того, что на оперативку стал грешить%) . Ведь в ней же хранятся все переменные исполняемой программы. А раз эти пеерменные непонятно по каким законам удаляются или меняются, значит может проблема в ОЗУ?..
Но вот скачал memtest, проверил оперативку. Memtest говорит "Pass Complete, no errors, Press Esc to exit". Значит оператива в поряде.. Также уже переустанавливал систему в надежде, что может это просто глюки билдера и после его на чистую ось ситуация исправится. Но не тут то было(( Все осталось по старому. Значения переменных затираются там, где о них вообще не упоминается%)
например:
PHP код:
cprintf("%i  ",z); 
до этой команды значение str еще было, а после выполнения этой команды str равно нулю. Ну как такое вообще может быть, если cprintf никакого отношения к строке str не имеет и тем более нигде оно там не упоминается?
Как вообще вот в такой обстановке возможно программу писать...((((

Последний раз редактировалось Tolias; 22.11.2010 в 00:18.
Tolias вне форума Ответить с цитированием
Старый 22.11.2010, 00:21   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Попробуй замени при выводе
cprintf("%i ",z);
на
cprintf("%d ",z);

И что это за cprintf; почему нельзя простой printf?
psycho-coder вне форума Ответить с цитированием
Старый 22.11.2010, 00:43   #5
Tolias
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 41
По умолчанию

Цитата:
Сообщение от psycho-coder Посмотреть сообщение
Попробуй замени при выводе
cprintf("%i ",z);
на
cprintf("%d ",z);
Попробовал. Ситуация та же самая. В том то и прикол, что cprintf вообще не должен вообще никак трогать переменную str, но при выполнении этой команды почему-то затирается значение str(((
Цитата:
Сообщение от psycho-coder Посмотреть сообщение
И что это за cprintf; почему нельзя простой printf?
Эта команда идентична printf, но лишь с той разницей, что в консольном окне можно выводить текст с заданным цветом фона и текста. В моей программе это как раз нужно

P.S. printf тоже затирает данные других переменных, уже пробовал Это какой-то глюк. Потому что так быть не должно. И я не знаю как его решить
Tolias вне форума Ответить с цитированием
Старый 22.11.2010, 01:57   #6
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
Но как только доходим до if(strlen(str)), так программа игнорирует то, что внутри оператора условия и идет на else. С какого перепуга условие if не выполняется, если strlen(str)==1
конструкция if сделана таким образом что в ней учитывается результат true или false. Т.е. strlen(str) будет false т.к. strlen вернет 1 (тут идет неявное преобразование к булевскому типу), а все что отличное от нуля будет false.

И на какое else она перескакивает?

Мне просто сейчас очень лень, с головой лезть в отладку.
psycho-coder вне форума Ответить с цитированием
Старый 22.11.2010, 18:23   #7
Tolias
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 41
По умолчанию

Цитата:
Сообщение от psycho-coder Посмотреть сообщение
strlen(str) будет false т.к. strlen вернет 1 (тут идет неявное преобразование к булевскому типу), а все что отличное от нуля будет false.
Как так? Ведь, насколько я знаю, if всегда выполнялся при ненулевом значении. Если же написать if(0), то условие не выполняется. А вы говорите обратное.. Я что-то вообще запутался... Как же так? Почему тогда в одних случаях if поступает по одному, а второй раз по другому.. Объясните мне пожалуйста, будьте добры. Проясните мою бедную голову
Tolias вне форума Ответить с цитированием
Старый 22.11.2010, 18:24   #8
Tolias
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 41
По умолчанию

Как же тогда знать, когда оператор if единицу считает true, а когда false?
Tolias вне форума Ответить с цитированием
Старый 22.11.2010, 20:19   #9
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
Сообщение от Tolias Посмотреть сообщение
Как же тогда знать, когда оператор if единицу считает true, а когда false?
Да, я ошибся. Все, что отлично от нуля - истинно.

В if проверка ведется на истину. т.е. выражение в if должно вернуть одно из двух значений true или false.

Код:
bool get = false;
if (get) get = !get; // Это условие не выполнится т.к. get = false;
if (!get) get = !get; // А это выполнится, т.к. !get = true

if (2+2 == 4) get = true; // выполнится т.к. общее выражение 2+2==4 будет истинным.
if (2+2) get = !true; // выполнится т.к. тут идет неявное приведение типов.
// Т.е. фактически код будет таким
if ((bool)(2+2)) get = false; // И т.к. 2+2=4, а 4 отлична от нуля, то общее выражение будет истинным. Потому что в Си, все, что отлично от нуля = истина.
Вот жеж, блин. Я тут всякой фигни понаписал, и хоть бы кто, поправил

Последний раз редактировалось psycho-coder; 22.11.2010 в 20:25.
psycho-coder вне форума Ответить с цитированием
Старый 23.11.2010, 01:32   #10
Tolias
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 41
По умолчанию

Короче говоря, условие всегда выполняется, если сукупность операторов или какая-то функция или какое-то выражение, что находится в скобках if'а будет равно числу, отличному от нуля. Верно? А так как много функций умеют возвращать в случае ошибки выполнения нуль, то их можно пихать сразу в скобки if'а, и тем самым проверять, правильно ли сработала функция, написанная в скобках.
Tolias вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему значения линии тренда некорректны после половины периода helen-list Microsoft Office Excel 2 08.06.2010 11:56
Обновление таблицы после выполнения селекта Tatochka Microsoft Office Access 5 15.01.2010 10:40
Почему после выполнения do-while, вложенного в if, инструкции дальше не выполняются? Chewing_dog Помощь студентам 3 09.06.2009 06:44
Button после выполнения ProgressBar }{oт@бь)ч Общие вопросы Delphi 7 25.01.2009 12:33
Команды обработки строк! Proskurin Помощь студентам 11 06.05.2008 16:11