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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2012, 16:50   #1
Chugun
Пользователь
 
Регистрация: 04.02.2009
Сообщений: 30
По умолчанию непонятный символ

Уважаемые форумчане, помогите пожалуйста разобраться откуда берётся непонятное подчёркнутое нечто (по логиге вещей его там быть не должно).
подскажите где обшибся

код (на всякий случай прикреплю весь архив с проектом)
main
Код:
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <strstream>
#include <math.h>
#include <stdio.h>
#include <string>
#include "stdafx.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	long chislo=-12345;
	bcch a(chislo);
	(~a).print();
	return 0;
}
stdafx.h
Код:
#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <strstream>
#include <math.h>
#include <string>
#include <stdio.h>


using namespace std;
const int n=255;

class bcch
{
public: 
	int lc;
	char inf[n];

	bcch(){
		lc=1; 
		for (int i=1;i<n;i++) 
			{
				inf[i]='0';
			} 
		}
	
	bcch(const bcch &cb){
		lc=cb.lc; 
		for (int i=1;i<=lc;i++)
			{
				inf[i]=cb.inf[i];
			}
		}

	bcch(long vrc){
		if ((vrc==0) || (vrc==-0))
			{
				lc=0;
				for (int i=1;i<n;i++)
					{
						inf[i]='0';
					}
			}
		else
			{
				if (vrc>=0) {inf[0]='0';} else {inf[0]='1';}
				lc=0;
				char vr[n],d[n];
				vrc=abs(vrc);
				while (vrc>=2)
					{
						sprintf(d,"%d",vrc%2);
						vr[lc]= d[0];
						lc++;
						vrc= vrc / 2;
					}
				sprintf(d,"%d",vrc);
				vr[lc]= d[0];
				lc++;
				//вывод временного массива (рекурсивного)
				for(int i=0;i<lc;i++){cout<<vr[i];}
				cout<<endl;
				vrc=lc-1;
				for(int i=1;i<=lc;i++)
					{
						inf[i]=vr[vrc];
						vrc--;
					}
				//вывод получившегося информационного поля
				for(int i=0;i<=lc;i++){cout<<inf[i];}
				cout<<endl;

			}
	
	
	
		}

	bcch(string vrs)
		{
			int strl=vrs.size();
			char d[n];
			long chislo;
			if (strl!=0)
			{
				int j=0;
				for(int i=0;i<strl;i++)
				{
					if ((vrs[i]=='-') && (j==0)) 
					{
						d[0]='-'; 
						j++;
					} 
					if ((vrs[i]>='0') && (vrs[i]<='9'))
					{
						cout<<"0-9"<<endl;
						d[j]=vrs[i];
						j++;
					}
				}
				//cout<<d<<endl;
				chislo=atoi(d);
				//cout<<chislo<<endl;
				bcch cb(chislo);
				lc=cb.lc; 
				for (int i=1;i<=lc;i++)
				{
					inf[i]=cb.inf[i];
				}
			}

		}

	bcch bcch::operator ~()
	{
		cout<<"operator ~"<<endl;
		bcch newb;
		//вывод знака
		cout<<newb.inf[0]<<" "<<inf[0]<<endl;
		if (lc!=0)
		{
			newb.lc=lc;
			newb.inf[0]='1';
			cout<<newb.inf[0]<<" "<<inf[0]<<endl;
			if (inf[0]=='1')
			{
				for (int i=1;i<=lc;i++)
				{
					if (inf[i]=='0') 
					{
						newb.inf[i]='1';
					}
					else
					{
						newb.inf[i]='0';
					}
				}
				//показать обратный код
				cout<<"obratniy kod"<<endl;
				newb.print();
			}
		}
		cout<<"operator ~ end"<<endl;
		return newb;
	}

	void print ()
	{
		cout<<lc<<" ";
		for (int i=0;i<=lc;i++)
		{
			cout<<inf[i];
		}
		cout<<endl;
	}

};
Chugun вне форума Ответить с цитированием
Старый 17.10.2012, 17:08   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Код:
bcch newb;
//вывод знака
cout<<newb.inf[0]<<" "<<inf[0]<<endl;
то есть вы объявляете переменную и сразу же (без инициализации) выводите на экран какие-то её поля? 0_о
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 17.10.2012, 18:17   #3
Chugun
Пользователь
 
Регистрация: 04.02.2009
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Код:
bcch newb;
//вывод знака
cout<<newb.inf[0]<<" "<<inf[0]<<endl;
то есть вы объявляете переменную и сразу же (без инициализации) выводите на экран какие-то её поля? 0_о
да
это класс и он это допускает.
при создании переменной активизируется пустой инициализирующий конструктор bcch ()
в котором ошибка кстати, но даже если её исправить - ситуация не меняется.
конструктор должен иметь следующий вид:
Код:
bcch(){
		lc=0; 
		for (int i=0;i<n;i++) 
			{
				inf[i]='0';
			} 
		}
тем самым в итоге, после объявления переменной, она принимает значение '0' во всех битах занятой памяти.
это "обнуление переменной" перед непосредственным использованием во избежании нарваться на мусор.
да, отнимает машинное время, но зачастую спасает от непонятных "косяков".
к сожалению в 1 посте описан "косяк", который данная операция не исправляет...

HELP

Последний раз редактировалось Chugun; 17.10.2012 в 18:21.
Chugun вне форума Ответить с цитированием
Старый 19.10.2012, 12:14   #4
Chugun
Пользователь
 
Регистрация: 04.02.2009
Сообщений: 30
По умолчанию

проблема найдена: копирующий конструктор
Код:
	bcch(const bcch &cb){
		lc=cb.lc; 
		for (int i=0;i<=lc;i++)
			{
				inf[i]=cb.inf[i];
			}
		}
Chugun вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Assembler!!! Заменить на символ ‘!’ каждый 3тий символ в строке. Leon9313 Помощь студентам 0 24.04.2012 13:02
Непонятный код artem611 Помощь студентам 2 11.04.2012 00:43
Непонятный счетчик Русtam PHP 10 20.10.2011 22:16
C# непонятный код raok Помощь студентам 4 21.05.2011 14:15
непонятный компилятор Waleriy Общие вопросы по Java, Java SE, Kotlin 2 11.12.2008 14:16