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

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


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

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

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


« Ответ #100 : Апрель 30, 2008, 08:13:55 »

При переопределении какой-то операции я передаю одну из них параметром, а вторая переходит с указателем this. При переопределении мне надо создать новую матрицу и ее заполнить по условию задания. Я ее создаю, и выходит, что указатель на самую первую матрицу затирается и на его место появляется указатель на новую только что созданную матрицу?
[Йожжж], указатель this - это неявный указатель на тот объект, метод которого вызывается, и затереться он не может. Если ты в этом методе создаешь еще одну матрицу (т.е. ЛОКАЛЬНЫЙ объект этого же класса), то к ней ты обращаешься по имени объекта, а указатель this по прежнему указывает на первоначальный объект, с методом которого ты работаешь, а обратиться к самому объекту ты можешь с пмощью разименованного указателя - *this.

А можно ли обойтись без создания новой матрицы и просто заменить элементы одной из данныйх нам матриц по правилу?
Напиши конкретную операцию, которую собираешься переопределять, потому что в общем все операции под одну гребенку брать нельзя.
« Последнее редактирование: Сентябрь 14, 2008, 03:18:01 от artem90 » Записан
[Йожжж]
Cтудент
*

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

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



« Ответ #101 : Апрель 30, 2008, 09:33:48 »

Здесь писать, так здесь Улыбка

Код: (cpp)
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, каждый элемент которого - ср. арифмет. строк матрицы М.

Код: (cpp)
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 Offline

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


WWW
« Ответ #102 : Май 02, 2008, 03:32:03 »

Код: (cpp)
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.htm
Цитировать
Class 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 Offline

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



« Ответ #103 : Май 03, 2008, 11:17:04 »

Вопрос непосредственно к EvilMax. У меня в выче №3 есь переопределение операции "~", но это унарная операция. По условию задания с помощью нее у меня из столбцов двух матриц выбираются минимальные элементы, и они становятся элементами нового вектора. Можно ли изменить сам значок операции? Например, вместо "~" использовать "-", " * " и др?

Этот вопрос нужно задавать в учебном отделе. Пользуйтесь ЛС!
Романыч
« Последнее редактирование: Май 03, 2008, 12:41:11 от Романыч » Записан

EvilMax
Администратор
Завкаф
*****

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

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


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


« Ответ #104 : Май 03, 2008, 06:24:22 »

Можно ли изменить сам значок операции?
Нет. Так как это будет уже другая операция ))) Если нужны два операнда, обратитесь к составителю задания и попросите заменить операцию на другую в своём варианте.

Знак операции, число операндов, приоритет изменить нельзя. Ассоциативность тоже (хотя накосячить при реализации можно).
Записан

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

Карма: +40/-5
Offline 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 символа ?

Код: (cpp)
#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();
  }

Рез-тат:
Код: (cpp)
length =  9  byte = 11
Записан
EvilMax
Администратор
Завкаф
*****

Карма: +59/-0
Offline 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 Offline

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


« Ответ #107 : Май 06, 2008, 08:38:10 »

EvilMax, спс ! Теперь все стало понятно и вполне логично Улыбка
Записан
zer_owlet
Необычные пользователи
Проректор
*

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

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



« Ответ #108 : Май 08, 2008, 12:20:16 »

да, старые грабли в винде с этим \r\n... я у себя тоже долго искал баг с разбивкой файла на строки... пока не подсмотрел в hex-редакторе что у файла текстового (набирался в винде) назделитель \r\n
Записан



Если бы те, кто злословит обо мне, знали, что я о них думаю, они бы ещё не то говорили.

Так хочется быть добрым и порядочным, особенно, когда понимаешь, что патронов на всех никогда не хватит..

Памятка женщинам: если ты хочешь, чтоб мужчина встал на колени - разденься и встань на четвереньки.
Der_Forscher
Первак
*

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

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


ИУС - 07а


« Ответ #109 : Май 08, 2008, 06:11:20 »

Код: (c)
#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 Offline

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


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


« Ответ #110 : Май 09, 2008, 01:33:01 »

А в опциях компилятора модель памяти large? Потому что в случае tiny все данные находятся в одном сегменте 64К и farmalloc по-идее не имеет смысла.
Записан

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

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

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


ИУС - 07а


« Ответ #111 : Май 09, 2008, 08:37:06 »

EvilMax спасибо, как-то сразу не додумался )))
Записан

Стреляй во всех, господь разберется
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline 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
Администратор
Проректор
*****

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

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


just for fun


WWW
« Ответ #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 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 Offline

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


« Ответ #115 : Сентябрь 14, 2008, 11:34:14 »

Alder, EvilMax, спасибо, что отозвались. Чувствую, что и скроллбар, и перетаскивание окна мышью стали под большим вопросом Грустный
Записан
Alder
Администратор
Проректор
*****

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

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


just for fun


WWW
« Ответ #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 Offline

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


« Ответ #117 : Сентябрь 14, 2008, 11:58:12 »

Alder, спс Улыбка Щас буду разбираться. Сейчас еще просмотрю 2-ой том Аммерала. Он посвящен машинной графике, и большинство ф-ий реализованы на нижнем уровне.
Записан
Alder
Администратор
Проректор
*****

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

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


just for fun


WWW
« Ответ #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 Offline

Пол: Женский
Награды:
III место в фотоконкурсе \
Сообщений: 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
Записан
Страниц: 1 ... 4 5 [6] 7 8 ... 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.513 секунд. Запросов: 34.