Olorin
Mодератор
Профессор
Карма: +25/-4
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
Пол: Награды:
Сообщений: 141
|
|
« Ответ #121 : Октябрь 05, 2008, 02:57:39 » |
|
Ну, как всегда, все было совсем не так! На самом деле нужно было привести дабл к лонг инт... И так все сразу бы заработало! Сколько времени уходит на невнимательность Спасибо тебе, добрый Олорин
|
|
|
Записан
|
|
|
|
likedrug
Первак
Карма: +1/-0
Offline
Сообщений: 32
|
|
« Ответ #122 : Октябрь 06, 2008, 11:54:08 » |
|
диапазон значений типа int -32767..32767, т.е. 500166 > допустимого. Можешь юзать long int, а можешь unsigned int т.е. беззнаковый и соответственно в 2 раза больше целочисленных значений (диапазон от 0 до 65535).
|
|
|
Записан
|
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #123 : Октябрь 07, 2008, 06:16:31 » |
|
Не-не-не. 500 тыс. в unsigned не влезет. Так что на 16-битной платформе только long.
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
likedrug
Первак
Карма: +1/-0
Offline
Сообщений: 32
|
|
« Ответ #124 : Октябрь 08, 2008, 05:35:09 » |
|
:-D во я тип, чото подсознательно посчитал 50000 )))))))
Вот только флудить не нужно. artem90
|
|
« Последнее редактирование: Октябрь 08, 2008, 07:01:37 от artem90 »
|
Записан
|
|
|
|
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
Карма: +1/-0
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
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #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
Пол:
Сообщений: 61
|
|
« Ответ #127 : Октябрь 14, 2008, 07:37:18 » |
|
LazarusLong, огромное спасибо ))))))))))
|
|
|
Записан
|
|
|
|
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
Карма: +1/-0
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
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #129 : Октябрь 18, 2008, 05:18:51 » |
|
А что за компилятор? ( Отправлено в: 2008-10-18, 17:14:41) Мне не совсем понятно как этот код вообще работает. Вот ты пишешь: vec = i;
А я что-то не вижу перегруженного оператора присваивания для целых чисел.
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
Карма: +1/-0
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
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #131 : Октябрь 18, 2008, 07:01:01 » |
|
Странно. У меня собралась программа нормально. Borland C++ 3.1
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
LazarusLong
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #132 : Октябрь 18, 2008, 07:29:29 » |
|
Странно. У меня собралась программа нормально. Borland C++ 3.1 А у меня в Билдере вообще не собралась .
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #133 : Октябрь 18, 2008, 07:54:34 » |
|
Так, после исправления в студии других ошибок в коде (посмотри на объявление операции индексирования, на реализацию присваивания, на то, как ты работаешь с данными внутри переопределённых операций) проблема стала ясной. Ты не указал, что дружественные переопределённые операции являются шаблонными. Надо перед friend дописать template <class U> (кстати, как я показывал на лекции). Но вот незадача, 3-й борланд у меня не дружит с дружественными шаблонными функциями. Поэтому вывод векторов в файл и на экран придётся тебе делать без друзей. Ещё один баг борланда. Он не захотел че-то у меня перегружать операцию вывода на экран, пока я ему не указал вместо ostream& в явном виде ostream_withassign&
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
Карма: +1/-0
Offline
Пол:
Сообщений: 61
|
|
« Ответ #134 : Октябрь 18, 2008, 10:37:13 » |
|
хм все это очень странно. у меня почему-то операция вывода на экран перегружалась корректно. Ладно сделаю эти операции без друзей. НО вот другой вопроси: а что нетак с объявлением операции индексирования и присваивания? По-моему все нормально? Если это не так, то укажите, пожалуйста, на ошибки или некорректности, в я вном виде
|
|
|
Записан
|
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
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
Пол:
Сообщений: 61
|
|
« Ответ #136 : Октябрь 18, 2008, 11:54:51 » |
|
Упс Это за ошибку не считается - это ачепятка
|
|
|
Записан
|
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
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
Пол: Награды:
Сообщений: 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
|
|
« Ответ #139 : Ноябрь 13, 2008, 01:24:31 » |
|
Olorin, размер картинки какой?
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
|