КИТА unofficial
Ноябрь 22, 2024, 10:34:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: 1 ... 5 6 [7] 8 9 ... 12   Вниз
  Печать  
Автор Тема: Вопросы в С/С++  (Прочитано 162039 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Olorin
Mодератор
Профессор
*****

Карма: +25/-4
Offline Offline

Пол: Мужской
Награды:
За долгое терпение.
Сообщений: 902


Кто к нам с чем зачем, тот от того и того


« Ответ #120 : Октябрь 05, 2008, 02:52:08 »

Если сделать так:
Код:
#include<iostream.h>

void main(){
  long double  c=500166.0;
  long ce = (long)c;

      cout<<"c="<<c<<endl<<"ce="<<ce;
      cin.ignore();
}

то всё работает))
Записан

Количество опыта пропорционально количеству выведенной из строя техники.
Anna
Бакалавр
**

Карма: +10/-0
Offline Offline

Пол: Женский
Награды:
III место в фотоконкурсе \
Сообщений: 141



« Ответ #121 : Октябрь 05, 2008, 02:57:39 »

Ну, как всегда, все было совсем не так! На самом деле нужно было привести  дабл к лонг инт... И так все сразу бы заработало! Сколько времени уходит на невнимательность Грустный
Спасибо тебе,  добрый Олорин Улыбка
Записан
likedrug
Первак
*

Карма: +1/-0
Offline Offline

Сообщений: 32



« Ответ #122 : Октябрь 06, 2008, 11:54:08 »

диапазон значений типа int  -32767..32767, т.е. 500166 > допустимого.
Можешь юзать long int, а можешь unsigned int т.е. беззнаковый и соответственно в 2 раза больше целочисленных значений (диапазон от 0 до 65535).
Записан
EvilMax
Администратор
Завкаф
*****

Карма: +59/-0
Offline Offline

Пол: Мужской
Сообщений: 1072


Злой и страшный :)


« Ответ #123 : Октябрь 07, 2008, 06:16:31 »

Не-не-не. 500 тыс. в unsigned не влезет. Так что на 16-битной платформе только long.
Записан

Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач...
---
Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
likedrug
Первак
*

Карма: +1/-0
Offline Offline

Сообщений: 32



« Ответ #124 : Октябрь 08, 2008, 05:35:09 »

:-D во я тип, чото подсознательно посчитал 50000 )))))))

Вот только флудить не нужно. artem90
« Последнее редактирование: Октябрь 08, 2008, 07:01:37 от artem90 » Записан
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
*

Карма: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 61



« Ответ #125 : Октябрь 14, 2008, 06:20:11 »

А у меня вот такой вопрос, господа. Делаю я лабораторную работу по дискретной математике и пытаюсь реализовать операции над множествами. В своей программе я написал эдакий класс и перегружаю для него операции и вот у маленькая проблемка. По моему заданию мое единичное универсальное множество - это число 0..255. Допустим у меня есть Множества A = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } И мне нужнно получить множество НЕ А, т.е. дополнение до единичного множества. Если учесть, что мое единичное множество это числа от 0 до 255, множество НЕ А это числа в данном диапазоне не включая цифры 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 .
Так вот я перегружаю оператор ~ и пишу для него тело.

Код:
class Union
{
private : unsigned int * data;
unsigned int size;

public  :
Union();
Union(Union &obj);
Union(unsigned int NewSize,unsigned int *NewData);
       ~Union();

void SetSize(unsigned int NewSize) { size = NewSize; }
void SetElement(unsigned int el,unsigned int index)
{
data[index] = el;
}
unsigned int GetSize() { return size; }
unsigned int GetElement(unsigned int index)
{
return data[index];
}
       unsigned int* GetData() { return data; }

       unsigned int& operator[](unsigned int index);
       friend ostream& operator<<(ostream&,Union& obj);

       Union  operator*(Union &A);   // crossing
       Union  operator+(Union &A);   // combaine
       Union  operator/(Union &A);   // minus
       Union  operator%(Union &A);   // simmitrical minus
       Union  operator~();        // not
       Union& operator=(const Union &obj);
};

Union Union::operator~()
{
unsigned int  i,j,k,flag;
unsigned int  NewSize = 256 - this->GetSize();
unsigned int* vector  = new unsigned int[NewSize];



for(j=0;j<=255;j++)
{

flag = 0;

for(i=0;i<this->GetSize();i++)
{
if (j==(*this)[i]) { flag = 1; }
else { continue; }
}
  if (flag==0)
  {
     vector[j] = j;
             cout<<vector[j]<<" "; // сейчас печатаетя правильный вектор
  }
}


cout<<endl<<endl;

for(i=0;i<246;i++)
{
cout<<vector[i]<<" "; // а сейчас нет, хотя массив не менялся
}

delete[] vector;
return (*this);
};

Union& Union::operator=(const Union &obj)
{
this->size = obj.size;
this->data = new unsigned int[this->size];
memcpy(this->data,obj.data,this->size*sizeof(unsigned int));
return *this;
};

unsigned int& Union::operator[](unsigned int index)
{
return data[index];
};

Union::Union()
{
data = NULL;
        size = 0;
};

Union::Union(unsigned int NewSize,unsigned int *NewData)
{
size = NewSize;
data = new unsigned int[size];
memcpy(data,NewData,size*sizeof(unsigned int));
};

Union::Union(Union &obj)
{
this->size = obj.size;
this->data = new unsigned int[this->size];
        memcpy(this->data,obj.data,size);
};

Union::~Union()
{
        delete[] data;
size = 0;

}

ostream& operator<<(ostream &s,Union& obj)
{
         int i;
         for(i=0;i<obj.size;i++)
         {
s<<obj.data[i]<<" ";
         }
                return s;
};
Я пытался отследить ошибку и стал печатать свой вектор в теле (временно конечно), но вот беда алгоритм, вроде, правильный. Первый раз я получаю корректную запись вектора, а в следующем блоке НЕТ.
Возникает вопрос почему?  Непонимающий
« Последнее редактирование: Октябрь 14, 2008, 06:26:17 от Alder » Записан
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6134


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #126 : Октябрь 14, 2008, 07:20:56 »

Вкратце... во втором случае у тебя выводится как раз содержимое твоего массива. Ты, дело в том, что формируешь разреженный массив. Если такого элемента нет в исходном множестве, ты его вносишь в новый вектор (причем под номером соответствующим его значению, а если нет - то просто пропускаешь и оставляешь его значение не проинициализированным

В итоге: у тебя после выделения памяти массив vector указывает, к примеру на всякую билеберду

787984 46463 354534 32132 5646 ....

Так вот - так как 0, 1, 2, 3 и т.п. являются членами твоего исходного множества то элементы с этими номерами твоим преобразованием затронуты НЕ БУДУТ. И там останется вся та же билебирда.

Преобразованный код будет выглядеть так

Код:
Union Union::operator~()
{
unsigned int  i,j,k,flag;
unsigned int  NewSize = 256 - this->GetSize();
unsigned int* vector  = new unsigned int[NewSize];

        int t = 0;

  for(j=0;j<=255;j++)
{

flag = 0;

for(i = 0; i < this->GetSize(); i++)
{
if (j == (*this)[i])
                                flag = 1;
else
                                continue;
}
  if (flag==0)
  {
     vector[t] = j;
             cout<<vector[t]<<" ";
             t++;
  }
}


cout<<endl<<endl;

for(i=0;i<246;i++)
{
cout<<vector[i]<<" ";
}

delete[] vector;
return (*this);
};

Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
*

Карма: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 61



« Ответ #127 : Октябрь 14, 2008, 07:37:18 »

LazarusLong, огромное спасибо ))))))))))  Улыбка
Записан
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
*

Карма: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 61



« Ответ #128 : Октябрь 18, 2008, 05:03:18 »

Здравствуйте, уважаемые господа. Хочу услышать от вас совет. Я пишу некий шаблонный класс вектор, который может хранить любые типы данных. В нем я переопределяю опрации ввода\вывода на экран и в файл. Но вот в чем беда: когда я создаю объекты моего класса, инстанцированные типом char* все работает вроде корректно, но если инстанцирую типо int вот, что выдает:

Error ..\..\COURSE~1\TEMPLATE.CPP 73: Ambiguity between 'operator <<(fstream &,_TVector<int> &)' and 'ostream::operator <<(char)'
Error ..\..\COURSE~1\TEMPLATE.CPP 62: Ambiguity between 'operator >>(fstream &,_TVector<int> &)' and 'istream::operator >>unsigned char &)'

Вопрос почему ?
Код:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<iostream.h>
#include<stdlib.h>
#include<fstream.h>
#include<string.h>

template<class T>
class _TVector
{


      private :
            T* data;
            unsigned int size;
      public :
         
            _TVector(void);

            _TVector(const _TVector<T> &v);

            _TVector(unsigned int new_size);

            ~_TVector(void);

void operator=(_TVector<T> &vec);

unsigned int GetSize() const { return size; }

void SetSizet(unsigned int new_size) { size = new_size; };

T& _TVector<T> :: operator[] (unsigned int index);

friend ostream& operator<<(ostream& buffer, _TVector<T>& d);

friend fstream& operator<<(fstream& buffer, _TVector<T>& d);

friend void operator>>(fstream& buffer, _TVector<T>& d);


};


template<class T>
void _TVector<class T>::operator=(_TVector<T> &vec)
{
   this->size = vec.size;
   memcpy(this->data,vec.data,this->size*sizeof(T));
};

template<class T>
_TVector<T> :: _TVector(void) { data = NULL; size = 0; };


template<class T>
void operator>>(fstream& buffer, _TVector<T>& d)
{
   int i;
   for(i=0;i<d.size;i++)
   {
    buffer>>d;
   }

};

template<class T>
fstream& operator<<(fstream& buffer, _TVector<T>& d)
{
   int i;
   for(i=0;i<d.size;i++)
   {
    buffer<<d<<" ";
   }
   return buffer;
};


template<class T>
ostream& operator<<(ostream& buffer,_TVector<T>& obj)
{
   int i;
   for(i=0;i<obj.size;i++)
   { buffer<<obj.data<<" "; }
   return buffer;
};

template<class T>
_TVector<T>::_TVector(const _TVector<T> &vec)
{
   this->size  = vec.size;
   this->data  = new T[size];
   memcpy(this->data,vec.data,vec.size*sizeof(T));
};

template<class T>
_TVector<T>::_TVector(unsigned int new_size)
{
   this->size = new_size;
   this->data = new T[size];
};

template<class T>
_TVector<T>::~_TVector() { delete [] data;};

template<class T>
T& _TVector<T>::operator[] (unsigned int index)
{
    return data[index];
};


int main()
{
clrscr();
_TVector<int> vec(4);
int i;
for(i=0;i<4;i++)
{
 vec = i;
 cout<<vec<<endl;
}

fstream vector("C:\\vector.txt",ios::in | ios::out);
fstream file("C:\\vector.txt",ios::in | ios::out);
vector<<vec;

file>>vec;

cout<<vec;

cin.ignore();
return 0;
}
 
Записан
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6134


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #129 : Октябрь 18, 2008, 05:18:51 »

А что за компилятор?
(Отправлено в: 2008-10-18, 17:14:41)
 Мне не совсем понятно как этот код вообще работает. Вот ты пишешь:
Цитировать
vec = i;
А я что-то не вижу перегруженного оператора присваивания для целых чисел.
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
*

Карма: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 61



« Ответ #130 : Октябрь 18, 2008, 05:27:24 »

Ой ошибочка вышла  Грустный

Компилятор Borland C++ 3.1

вот так надо:

Код:
int main()
{
clrscr();
_TVector<int> vec(4);
int i;
for(i=0;i<4;i++)
{
 vec[i] = i;
 cout<<vec[i]<<endl;
}

fstream vector("C:\\vector.txt",ios::in | ios::out);
fstream file("C:\\vector.txt",ios::in | ios::out);
vector<<vec;

file>>vec;

cout<<vec;

cin.ignore();
return 0;
}
Записан
EvilMax
Администратор
Завкаф
*****

Карма: +59/-0
Offline Offline

Пол: Мужской
Сообщений: 1072


Злой и страшный :)


« Ответ #131 : Октябрь 18, 2008, 07:01:01 »

Странно. У меня собралась программа нормально. Borland C++ 3.1
Записан

Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач...
---
Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6134


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #132 : Октябрь 18, 2008, 07:29:29 »

Странно. У меня собралась программа нормально. Borland C++ 3.1
А у меня в Билдере вообще не собралась Непонимающий.
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
EvilMax
Администратор
Завкаф
*****

Карма: +59/-0
Offline Offline

Пол: Мужской
Сообщений: 1072


Злой и страшный :)


« Ответ #133 : Октябрь 18, 2008, 07:54:34 »

Так, после исправления в студии других ошибок в коде (посмотри на объявление операции индексирования, на реализацию присваивания, на то, как ты работаешь с данными внутри переопределённых операций) проблема стала ясной.
Ты не указал, что дружественные переопределённые операции являются шаблонными. Надо перед friend дописать template <class U> (кстати, как я показывал на лекции). Но вот незадача, 3-й борланд у меня не дружит с дружественными шаблонными функциями. Грустный Поэтому вывод векторов в файл и на экран придётся тебе делать без друзей.
Ещё один баг борланда. Он не захотел че-то у меня перегружать операцию вывода на экран, пока я ему не указал вместо ostream&  в явном виде ostream_withassign&
Записан

Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач...
---
Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
*

Карма: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 61



« Ответ #134 : Октябрь 18, 2008, 10:37:13 »

хм все это очень странно.

у меня почему-то операция вывода на экран перегружалась корректно. Ладно сделаю эти операции без друзей. НО вот другой вопроси: а что нетак с объявлением операции индексирования и присваивания? По-моему все нормально? Если это не так, то укажите, пожалуйста, на ошибки или некорректности, в я вном виде  Улыбка
Записан
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« Ответ #135 : Октябрь 18, 2008, 11:30:55 »

а что нетак с объявлением операции индексирования и присваивания?

В присваивании память под data не выделена, добавь строчку data = new T[size];

Цитировать
template<class T>
void _TVector<class T>::operator=(_TVector<T> &vec)
{
   this->size = vec.size;
   data = new T[size];
   memcpy(this->data,vec.data,this->size*sizeof(T));
};

Записан
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
*

Карма: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 61



« Ответ #136 : Октябрь 18, 2008, 11:54:51 »

Упс  Непонимающий Это за ошибку не считается - это ачепятка  Смеющийся
Записан
EvilMax
Администратор
Завкаф
*****

Карма: +59/-0
Offline Offline

Пол: Мужской
Сообщений: 1072


Злой и страшный :)


« Ответ #137 : Октябрь 19, 2008, 10:09:36 »

1) T& _TVector<T> :: operator[] (unsigned int index); - объявлена внутри класса, писать _TVector<T> :: не нужно

2) Вместо template<class T> void _TVector<class T>::operator
лучше template<class T>void _TVector<T>::operator

3) Внутри перегруженных операций вектор вводился/выводился не поэлементно. А целиком. Этакая рекурсия с перегрузкой.

Записан

Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач...
---
Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
Olorin
Mодератор
Профессор
*****

Карма: +25/-4
Offline Offline

Пол: Мужской
Награды:
За долгое терпение.
Сообщений: 902


Кто к нам с чем зачем, тот от того и того


« Ответ #138 : Ноябрь 13, 2008, 12:56:44 »

Случай значит такой:

Код:
void far *img;
unsigned size=imagesize(left,top,left+width,top+height);
img=farmalloc(size);
if (img == 0)
{
   closegraph();
   printf("Error: not enough heap space in save_screen().\n");
   getch();
   exit(1);
}
getimage(left,top,left+width,top+height,img);

Никак не хочет выделять память, чтоб впихнуть туда картинку. Что я делаю не так?
Записан

Количество опыта пропорционально количеству выведенной из строя техники.
Alder
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #139 : Ноябрь 13, 2008, 01:24:31 »

Olorin, размер картинки какой?
Записан

"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
Страниц: 1 ... 5 6 [7] 8 9 ... 12   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.126 секунд. Запросов: 36.