Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #100 : Апрель 30, 2008, 08:13:55 » |
|
При переопределении какой-то операции я передаю одну из них параметром, а вторая переходит с указателем this. При переопределении мне надо создать новую матрицу и ее заполнить по условию задания. Я ее создаю, и выходит, что указатель на самую первую матрицу затирается и на его место появляется указатель на новую только что созданную матрицу? [Йожжж], указатель this - это неявный указатель на тот объект, метод которого вызывается, и затереться он не может. Если ты в этом методе создаешь еще одну матрицу (т.е. ЛОКАЛЬНЫЙ объект этого же класса), то к ней ты обращаешься по имени объекта, а указатель this по прежнему указывает на первоначальный объект, с методом которого ты работаешь, а обратиться к самому объекту ты можешь с пмощью разименованного указателя - *this. А можно ли обойтись без создания новой матрицы и просто заменить элементы одной из данныйх нам матриц по правилу? Напиши конкретную операцию, которую собираешься переопределять, потому что в общем все операции под одну гребенку брать нельзя.
|
|
« Последнее редактирование: Сентябрь 14, 2008, 03:18:01 от artem90 »
|
Записан
|
|
|
|
[Йожжж]
Cтудент
Карма: +2/-0
Offline
Пол:
Сообщений: 72
|
|
« Ответ #101 : Апрель 30, 2008, 09:33:48 » |
|
Здесь писать, так здесь class matrix { /*......*/ public: matrix operator >> (const matrix&); matrix operator < (const matrix&); }; matrix matrix :: operator >> (const matrix &mat) { float sum; int k, newM; if (this->GetM() <= mat.GetM()) newM = this->GetM(); else newM = mat.GetM(); matrix V2(newM, 1); for (int i = 0; i<mat.GetM(); i++) { sum = 0; for (int j = 0; j<newM; j++) { sum += this->GetElement(i, j); k++; } V2.SetElement(i, 0, mat.GetElement(i, 0) + sum/this->GetN()); } return V2; } Вопщем вначале мы урезаем и находим минимальную длину для вектора из размеров 2-х исходных рбъектов: матрицы и вектора. При чем матрица находится под указателем this, а вектор: &mat. В данном примере каждый элемень вектора V2 - это элемент вектора V(он же mat), увеличенный на среднее арифметическое соответсвующей строки матрицы М(this). Тут проблема одна: среднее арифметическое он находит, а вот элементы вектора V(mat) тут даже не учитываются Т.е. в итоге я получаю вектор V2, каждый элемент которого - ср. арифмет. строк матрицы М. matrix matrix :: operator < (const matrix &mat) { float newM, newN; if(this->GetM() <= mat.GetM()) newM = this->GetM(); else newM = mat.GetM(); if(this->GetN() <= mat.GetN()) newN = this->GetN(); else newN = mat.GetN(); matrix M3(newM, newN); for (int i = 0; i<M3.GetM(); i++) for (int j = 0; j<M3.GetN(); j++) { if (this->GetElement(i, j) < mat.GetElement(i, j)) M3.SetElement(i, j, this->GetElement(i, j)); else if (this->GetElement(i, j) > mat.GetElement(i, j)) M3.SetElement(i, j, this->GetElement(i, j) - mat.GetElement(i, j)); else M3.SetElement(i, j, pow(this->GetElement(i, j), 2)); } return M3; } В этом случае я, сравнивая элементы матриц М1 и М2 (this и mat), заполняю новую матрицу М3. Проблема: все элементы матрицы М3 - элементы матрицы М2.
|
|
« Последнее редактирование: Апрель 30, 2008, 10:27:46 от Романыч »
|
Записан
|
|
|
|
TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« Ответ #102 : Май 02, 2008, 03:32:03 » |
|
class figyra { protected: int x11,y11,rad; public: //.. virtual void setpar1(int,int,int)=0; //.. };
class kryg: public figyra { public: kryg(): figyra() { cout<<"create kryg"; }; ~kryg() { cout<<"destroyed kryg"; }; void setpar1(int,int,int); //.. }; void kryg::setpar1(int x11,int y11,int rad); { this->x11=x11; this->y11=y11; this->rad=rad; } Ошибка Class member 'kryg::setpar1(int,int,int);' declared outside its class http://unix.org.ua/bcpp/r74_6_2.htmClass member элемент declared outside its class Сообщение об ошибке этапа компиляции (элемент класса объявлен вне своего класса)
Функции-элементы класса С++ могут описываться только внутри объявления класса. В отличие от функций, не являющихся элементами класса, они не могут иметь несколько объявлений или описываться в других местах. В наследовании до сих пор толком не разбираюсь ... сначала подумал, что ругается на имена переменных в setpar1(int x11,int y11,int rad);, т к эти имена используются в классе figyra, но заменив их на любые другие результат такой же ... Как решить такую проблему ? (Отправлено в: 02 Мая 2008, 14:57:13)Частично проблема решена там ";" ненужные были вот тут void kryg::setpar1(int x11,int y11,int rad);
|
|
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
[Йожжж]
Cтудент
Карма: +2/-0
Offline
Пол:
Сообщений: 72
|
|
« Ответ #103 : Май 03, 2008, 11:17:04 » |
|
Вопрос непосредственно к EvilMax. У меня в выче №3 есь переопределение операции "~", но это унарная операция. По условию задания с помощью нее у меня из столбцов двух матриц выбираются минимальные элементы, и они становятся элементами нового вектора. Можно ли изменить сам значок операции? Например, вместо "~" использовать "-", " * " и др?
Этот вопрос нужно задавать в учебном отделе. Пользуйтесь ЛС! Романыч
|
|
« Последнее редактирование: Май 03, 2008, 12:41:11 от Романыч »
|
Записан
|
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #104 : Май 03, 2008, 06:24:22 » |
|
Можно ли изменить сам значок операции? Нет. Так как это будет уже другая операция ))) Если нужны два операнда, обратитесь к составителю задания и попросите заменить операцию на другую в своём варианте. Знак операции, число операндов, приоритет изменить нельзя. Ассоциативность тоже (хотя накосячить при реализации можно).
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #105 : Май 06, 2008, 06:36:07 » |
|
Объясните пожалуйста такую вещь: Есть текстовый файл, состоящий из двух строк (рисунок прилагается). Я считываю символы начиная с самого начала и до символа перехода на новую строку '\n'. Кол-во считанных символов подсчитываю счетчиком length. После выхода из цикла я с помощью метода tellg() возвращаю кол-во бит от начала файла. Вывожу length и tellg() на экран, и рез-тат меня неприятно удивляет Я ожидал, что length будет равно 9, так как в строке у меня 9 символов + '\n', и думал что tellg() тоже должен вернуть 9, т.к нумерация битов с 0, то это был бы 10-ый символ, то есть '\n'. Но tellg() почему-то вернул 11, а это значит что файловый указатель указывает на 12-ый символ, а этот символ - пробел !!! Почему файловый укзатель перепрыгнул на 2 символа ? #include <iostream.h> #include <fstream.h> #include <iomanip.h> #include <conio.h>
void main() { int length=0; ifstream fin("C:/1.txt");
clrscr();
while(fin.good() && fin.get()!='\n') { length++; } cout<<"length = "<<setw(2)<<length; cout<<" byte = "<<setw(2)<<fin.tellg(); getch(); } Рез-тат:
|
|
|
Записан
|
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #106 : Май 06, 2008, 07:22:49 » |
|
Потому что символ \n в Dos/Windows представляет собой пару символов CR+LF (т.е. фактически \r\n). А так как он всё-таки считан, то файловый указатель показывает на позицию сразу за ним, т.е. на символ '6', который имеет смещение в файле как раз 11 байт.
Наглядно содержимое файла можно увидеть в прикреплении. Последовательность 0D 0A - это как раз коды CR (\r) и LF(\n). Они результат нажатия клавиши Enter при наборе файла или при выводе в текстовом режиме символа \n при условии ОС Windows или DOS
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #107 : Май 06, 2008, 08:38:10 » |
|
EvilMax, спс ! Теперь все стало понятно и вполне логично
|
|
|
Записан
|
|
|
|
zer_owlet
Необычные пользователи
Проректор
Карма: +103/-16
Offline
Пол:
Сообщений: 2399
|
|
« Ответ #108 : Май 08, 2008, 12:20:16 » |
|
да, старые грабли в винде с этим \r\n... я у себя тоже долго искал баг с разбивкой файла на строки... пока не подсмотрел в hex-редакторе что у файла текстового (набирался в винде) назделитель \r\n
|
|
|
Записан
|
Если бы те, кто злословит обо мне, знали, что я о них думаю, они бы ещё не то говорили. Так хочется быть добрым и порядочным, особенно, когда понимаешь, что патронов на всех никогда не хватит.. Памятка женщинам: если ты хочешь, чтоб мужчина встал на колени - разденься и встань на четвереньки.
|
|
|
Der_Forscher
Первак
Карма: +1/-0
Offline
Пол:
Сообщений: 17
ИУС - 07а
|
|
« Ответ #109 : Май 08, 2008, 06:11:20 » |
|
#include <iostream.h> #include <alloc.h>
int main() { void far *buf;
buf = farmalloc(25); if(buf == NULL) { cout<<"Error"<<endl; return 1; }
farfree(buf);
return 0; }
Можете подсказать почему у меня farmallock() память не выделяет??? ЗЫ: компилятор BC++ v3.1
|
|
|
Записан
|
Стреляй во всех, господь разберется
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #110 : Май 09, 2008, 01:33:01 » |
|
А в опциях компилятора модель памяти large? Потому что в случае tiny все данные находятся в одном сегменте 64К и farmalloc по-идее не имеет смысла.
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Der_Forscher
Первак
Карма: +1/-0
Offline
Пол:
Сообщений: 17
ИУС - 07а
|
|
« Ответ #111 : Май 09, 2008, 08:37:06 » |
|
EvilMax спасибо, как-то сразу не додумался )))
|
|
|
Записан
|
Стреляй во всех, господь разберется
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #112 : Сентябрь 14, 2008, 02:37:23 » |
|
Доброй ночи ! В процессе экспериментирования с ф-ями getimage() и putimage() оказалось, что они отказываются работать, если размер сохраняемой экранной области >= 65535 байт. Использую дальние указатели, модель памяти Huge. long size = imagesize(x1, y1, x2, y2); void far* buf = farmalloc(size); getimage(x1, y1, x2, y2, buf); //... farfree(buf);
При чем, в режиме SVGA 256 1024*768, максимальное разрешение картинки, которая корректно сохраняется - 250*250 пикселей, и imagesize возвращает 250*250 = 62500 байт. При попытке сохранить картинку с разрешением 255*255, Борланд зависает, а выведенный на экран imagesize показывает 65535. В режиме VGAHI 16 640*480 корректно сохраняются картинки с разрешением <= 350 пикселей, 350*350 / 2 = 61250 байт. Не знаю, нужно ли здесь делить на 2. Я сделал это только чтобы получить число приближенное к 65535 ) Вопрос: возможно ли вообще увеличить эту область памяти, чтобы можно было сохранять картинки более выского разрешения ? ЗЫ: Облазил кучу настроек самой среды, и все значения связанные с объемом памяти поставил на максимум, но это не помогло В хелпе написано, что ф-ия imagesize() возвращает (-1), если размер экранной области >= 64K-1, но это звучит как-то абсурдно, неужели можно сохранять только такие маленькие области экрана В инете нашел обсуждение подобной проблемы, но внятного ответа так никто и не дал. Заранее спасибо, за любую полезную информацию.
|
|
« Последнее редактирование: Сентябрь 14, 2008, 02:53:52 от artem90 »
|
Записан
|
|
|
|
Alder
|
|
« Ответ #113 : Сентябрь 14, 2008, 11:07:18 » |
|
Если мне не изменяет память, то это связано с тем, что компилятор 16-битный. Решения вроде бы должны быть. Надо поискать.
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #114 : Сентябрь 14, 2008, 11:22:15 » |
|
Доброй ночи ! В процессе экспериментирования с ф-ями getimage() и putimage() оказалось, что они отказываются работать, если размер сохраняемой экранной области >= 65535 байт. Использую дальние указатели, модель памяти Huge. long size = imagesize(x1, y1, x2, y2); void far* buf = farmalloc(size); getimage(x1, y1, x2, y2, buf); //... farfree(buf);
При чем, в режиме SVGA 256 1024*768, максимальное разрешение картинки, которая корректно сохраняется - 250*250 пикселей, и imagesize возвращает 250*250 = 62500 байт. При попытке сохранить картинку с разрешением 255*255, Борланд зависает, а выведенный на экран imagesize показывает 65535. В режиме VGAHI 16 640*480 корректно сохраняются картинки с разрешением <= 350 пикселей, 350*350 / 2 = 61250 байт. Не знаю, нужно ли здесь делить на 2. Я сделал это только чтобы получить число приближенное к 65535 ) Вопрос: возможно ли вообще увеличить эту область памяти, чтобы можно было сохранять картинки более выского разрешения ? ЗЫ: Облазил кучу настроек самой среды, и все значения связанные с объемом памяти поставил на максимум, но это не помогло В хелпе написано, что ф-ия imagesize() возвращает (-1), если размер экранной области >= 64K-1, но это звучит как-то абсурдно, неужели можно сохранять только такие маленькие области экрана В инете нашел обсуждение подобной проблемы, но внятного ответа так никто и не дал. Заранее спасибо, за любую полезную информацию. 1. В Borland/Turbo C++ из-за 16-битной платформы нельзя работать с блоками памяти более 64К. Если вспомнишь лекции, то осознаешь весь трагизм ситуации Ни malloc, ни calloc, ни операция new не сможет отвести блок более 64К. То же касается и функций, которые работают с памятью. 2. Деление на 2 "чтобы получить приближенное к 64К число" - это весело Хотя, как ни странно, делить правильно. Ибо видеорежим VGAHI поддерживает 16 отображаемых цветов палитры. Следовательно, глубина цвета 4 бита на пиксель, т.е. 0.5 байта. 3. твет на твой вопрос таков. Если хочешь делать это 1й операцией - пиши свой менеджер памяти и свои варианты getimage/putimage. Основная идея - отводить память за несколько операций, храня каждый блок как вектор указателей на отведенные блоки. Ну и работа с кусками изображения - аналогично. Выкусывать и писать в память кусочками. Ну или как предлагает Alder, работать напрямую со страницами видеопамяти. Но, боюсь, так просто, нахрапом, такая задача тебе не отдастся.
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #115 : Сентябрь 14, 2008, 11:34:14 » |
|
Alder, EvilMax, спасибо, что отозвались. Чувствую, что и скроллбар, и перетаскивание окна мышью стали под большим вопросом
|
|
|
Записан
|
|
|
|
Alder
|
|
« Ответ #116 : Сентябрь 14, 2008, 11:49:14 » |
|
artem90, вообщем есть такое счастье как Allegro. Полноценная игровая библиотека. DOS поддерживается. Одна незадача - вроде как только с bcc32 компилером, а это уже минимум Borland C++ 5.1 или Borland C++Builder. Но изучить основы реализации никто не запрещает. В частности тебе прийдется сделать замены getimage и putimage, которые режут картинку на кусочки, сохраняют и также потом восстанавливают. Беглый просмотр исходников Allegro показал, что там подобное реализовано. Так что будет полезно поизучать. Если заставить библиотеку собраться под 16-битным компилером, то я думаю, что можно будет поговорить с Максимом Владимировичем о разрешении на использование ее функций в курсовой. При условии, что вы сделали это самостоятельно
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #117 : Сентябрь 14, 2008, 11:58:12 » |
|
Alder, спс Щас буду разбираться. Сейчас еще просмотрю 2-ой том Аммерала. Он посвящен машинной графике, и большинство ф-ий реализованы на нижнем уровне.
|
|
|
Записан
|
|
|
|
Alder
|
|
« Ответ #118 : Сентябрь 14, 2008, 12:02:08 » |
|
Небольшая поправка на ветер - Allegro под DOS собирается двумя компиляторами DJGPP и Watcom(который теперь OpenWatcom)
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
Anna
Бакалавр
Карма: +10/-0
Offline
Пол: Награды:
Сообщений: 141
|
|
« Ответ #119 : Октябрь 05, 2008, 12:55:20 » |
|
Я в отчаянии. Объясните мне, пожалуйста, что не так с приведением типов: #include<iostream.h>
void main(){ long double c=500166.0; int ce = (int)c;
cout<<"c="<<c<<endl<<"ce="<<ce; cin.ignore(); } Результат: c=500166 ce=-24122
|
|
|
Записан
|
|
|
|
|