Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 984
от 02.02.2008, 13:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 479, Экспертов: 57
В номере:Вопросов: 6, Ответов: 8

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 120391: Здравствуйте! Столкнулся с такой проблемой. Мне нужен класс, который содердит динамический массив экземпляров другого класса. Я написал это дело, но почему-то не работает. Т.е. понятно почему - с памятью криво работаю или что-то где-то неправильн...
Вопрос № 120431: Здраствуйте. Помогите пожалуста, мне нужно дописать програму на С++, которая создает клас сегмент, но у меня почемуто возникает такая ошыбка:'sqrt' : ambiguous call to overloaded function. Вот код прогаммы: Point.h #ifndef _POINT_H_...
Вопрос № 120443: Здравствуйте. Есть все та же программа (пишется в MS Visual Studio, приведена в приложении). На нее нужно добавить командную строку (что-то вроде edit'а в Delphi), которая будет располагаться в нижней части окна. Как это сделать используя только WinA...
Вопрос № 120463: Очень срочно нужна помощь! С++ 1) Написать функцию, которая в заданной строке считает количество букв, цифр и других знаков. Все три значения вернуть из функции. 2) В заданной строке отсортировать символы по алфавиту (написать функцию)<br...
Вопрос № 120480: Здравствуйте! Помогите, может кто делал что то подобное? 1) Составить программу реализующую трухмерное преобразование с фигурой: Фигура - Октаэдр Преобразование - Изменение масштаба по осям X, Y, Z и общее масштабирование по трём...
Вопрос № 120516: Здравствуйте! Помогите решить задачу. Условие: Дана строка и подстрока,найти сколько раз повторяется строка в подстроке и вывести на экран количество повторов. Заранее большое спасибо!...

Вопрос № 120.391
Здравствуйте!
Столкнулся с такой проблемой. Мне нужен класс, который содердит динамический массив экземпляров другого класса. Я написал это дело, но почему-то не работает. Т.е. понятно почему - с памятью криво работаю или что-то где-то неправильно написал.

Для проверки написал 2 левых класса, чисто для тестироания того, что мне надо - добавления экземпляра класса в динамический массив.

В приложении 2 класса:
Класс В, который соержит динамический массив чисел. Это просто так, для примера. У меня реальный класс то же самое содержит. Для него реализованы конструкторы, деструкторы, копирующий конструктор, вроде все нормально.
Класс А. Это класс, который должен содержать в себе массив классов В. Добавляются они в него методом add. Я передаю объект по значению (для того и написал конструктор копирования в классе В)

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

Интересный прикол. Если класс А заставить работать не с экземпляром класса В, а просо с числами, например double, то все проходит, все нормально. Значит я, наверное, что-то в классе В намудрил.

Замечание. std::vector, CArray и т.п. не используется, потому что мне нужна максимальная независимость от библиотек. В идеале, должно зависеть только от функций ввода-вывода и математической. Потому что возможно надо будет переносить под юникс. Я там не особенно шарю, так что чем меньше зависимостей, тем лучше.

Заранее большое спасибо за помощь!

Приложение:

Отправлен: 27.01.2008, 14:03
Вопрос задал: Константин Сергеевич Мирин (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Алексей Демаков
Здравствуйте, Константин Сергеевич Мирин!

При вызове из main() конструктора класса B с параметром: B b1(3) происходит вызов B::Initialize
и B::free(). Беда в том, что поле n в конструкторе с параметром не инициализируется. Поэтому происходит попытка освобождения памяти d.

Вторая проблема: B::B( B& b ) в последней строке освобождает память, которая получена от GetData(). А это внутренний буфер другого объекта. В результате состояние другого объекта портится.

Третья проблема: в методе A::add(B num) есть строка
temp[this->n] = num;
которая копирует объект. Но оператора присваивания у класса B нет. Поэтому внутренний буфер при копировании не дублируется, а разделяется между объектами.

Честно говоря, смысла в создании двух массивов в этом методе мало. Проще создать первый массив, а потом просто присвоить указатель на него полю d.

Стандартная библиотека С++ - она и в Африке работает :) Правильнее ей пользоваться, чем изобретать велосипед.
Ответ отправил: Алексей Демаков (статус: Студент)
Ответ отправлен: 27.01.2008, 23:05
Оценка за ответ: 5
Комментарий оценки:
Спасибо большое! Думаю, ошибка была как раз из-за отсутствия перегрузки оператора присваивания. Остальное, наверное, вылезло бы позже.


Вопрос № 120.431
Здраствуйте. Помогите пожалуста, мне нужно дописать програму на С++,
которая создает клас сегмент, но у меня почемуто возникает такая
ошыбка:'sqrt' : ambiguous call to overloaded function. Вот код прогаммы:
Point.h
#ifndef _POINT_H_
#define _POINT_H_

#include <iostream>
using namespace std;

//*******************************************
// Every point posesses its unique ID.
// In debug mode both constructor and destructor
// report the ID and the coordinates
// of a point created or resp. deleted

// Developed by Sendel ~:)
// Version 1.0
//*******************************************

class Point
{
private:
static int freeID;
int pointID;
double _x;
double _y;
public:
Point(double x=0, double y=0);
Point(const Point &);
~Point();
Point& operator=(const Point &);
double& x();
double& y();
const double& x() const;
const double& y()const;
const int getID() const;
static int amount() ;
};

ostream& operator<<(ostream&, const Point&);

const Point operator+ (const Point & , const Point & );
Point& operator+=(Point &, const Point&);
bool operator==(const Point & , const Point &);
bool operator!=(const Point & , const Point &);

#endif

Segment.h
#include "Point.h"

// Developed by Sendel(Presi4 Olexandr) ~:)
// Version 1.0

class Segment
{
private:
static int _freeID;
const int _myId;
Point _a,_b;
public:
Segment(const double x1=0, const double y1=0,
const double x2=1, const double y2=0);
Segment(const Point &, const Point &);
Segment(const Segment&);
~Segment();
Segment& operator=(const Segment&);
const Point& start() const;
const Point& end() const;
double length () const;
double distance (const Point&) const;
const int getID() const;
};

ostream& operator<<(ostream &, const Segment &);

main.cpp
#include <iostream>
using namespace std;
#include "Segment.h"
#include "Point.h"

int main()
{
Point q(7,1), w(3,4),r(w);
Segment a,b(-1,0,0,1),c(b),d(q,w);

Segment s(c.start(),d.end());
cout<<s<<endl;
a=b=d;
cout<<a<<" "<<b<<" "<<d<<endl;
cout<<b.length()<<" length of "<<b<<endl;
cout<<b.distance(w)<<" distance from "<<b<<" to "<<w<<endl;

cout<<q<<endl;
cout<<w<<endl;
cout<<"*************** ";
system("PAUSE");

cout<<q+w<<endl;
cout<<"*************** ";
system("PAUSE");

q+=w;
cout<<q<<endl;
cout<<w<<endl;
cout<<"*************** ";
system("PAUSE");

if(q==w) cout<<"they are equal ";
else cout<<"they are not equal ";
cout<<"*************** ";
system("PAUSE");

cout<<q.getID()<<endl;
cout<<Point::amount()<<endl;
cout<<"*************** ";
system("PAUSE");
return 0;
}

point.cpp
#include "Point.h"

int Point::freeID = 1;
Point::Point(double x, double y)
{
_x=x;
_y=y;
pointID=freeID;
freeID++;
return;
}

Point::Point(const Point & p)
{
_x=p._x;
_y=p._y;
pointID=freeID;
freeID++;
}

Point::~Point()
{
}

Point& Point::operator=(const Point& p)
{
_x=p._x;
_y=p._y;
return *this;
}
double& Point::x()
{
return _x;
}

double& Point::y()
{
return _y;
}

const double& Point::x() const
{
return _x;
}

const double& Point::y() const
{
return _y;
}

const int Point::getID() const
{
return pointID;
}

int Point::amount()
{
return freeID-1;
}

ostream& operator<<(ostream& out, const Point& p)
{
out<<p.getID()<<'('<<p.x()<<','<<p.y()<<')'<<';'<<endl;
return out;
}

const Point operator+ (const Point & p1, const Point & p2)
{
Point temp;
temp.x()=p1.x()+p2.x();
temp.y()=p1.y()+p2.y();
return temp;
}

Point& operator+=(Point& p1, const Point& p2)
{
p1.x()=p1.x()+p2.x();
p1.y()=p1.y()+p2.y();
return p1;
}

bool operator==(const Point& p1 , const Point& p2)
{
if ((p1.x() == p2.x()) && (p1.y() == p2.y()))
{
return 1;
}
else
{
return 0;
}
}

bool operator!=(const Point& p1, const Point& p2)
{
if ((p1.x() == p2.x()) && (p1.y() == p2.y()))
{
return 0;
}
else
{
return 1;
}
}

segment.cpp

#include<stdlib.h>
#include<math.h>

#include "Segment.h"

int Segment::_freeID = 1;

Segment::Segment(const double x1, const double y1,const double x2, const
double y2):
_myId(_freeID++)
{
_a.x()=x1;
_a.y()=y1;
_b.x()=x2;
_b.y()=y2;
cout<<*this<<" created by 4 parameters constructor"<<endl;
}

Segment::Segment(const Point &start, const Point &end):
_myId(_freeID++)
{
_a=start;
_b=end;
cout<<*this<<" created by 2 parameters constructor"<<endl;
}

Segment::Segment(const Segment &s):
_myId(_freeID++)
{
_a=s._a;
_b=s._b;
cout<<*this<<" created by copy parameters constructor"<<endl;
}

Segment::~Segment()
{
cout<<*this<<" deleted by destructor"<<endl;
}

Segment& Segment::operator=(const Segment& s)
{
_a=s._a;
_b=s._b;
return *this;
}

const Point& Segment::start() const
{
return _a;
}

const Point& Segment::end() const
{
return _b;
}

double Segment::length () const
{
return sqrt( ( _b.x() - _a.x())*( _b.x() - _a.x()) + ( _b.y() -
_a.y() )*( _b.y() - _a.y() ) );
}

double Segment::distance (const Point& p) const
{
int t1(_b.y() - _a.y()), t2(_a.x() - _b.x()), t3(_a.y()*_b.x() -
_a.x()*_b.y());
double dist=((t1*p.x()+t2*p.y()+t3)/(sqrt(t1*t1+t2*t2)));
return dist;
}

const int Segment::getID() const
{
return _myId;
}

ostream& operator<<(ostream & os, const Segment & s)
{
return os<<s.getID()<<" ("<<s.start().x()<<','<<s.start().y()<<')'<<" -
"<<'('<<s.end().x()<<','<<s.end().y()<<')'<<';';
}
Отправлен: 27.01.2008, 20:50
Вопрос задал: Lordthief (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Алексей Демаков
Здравствуйте, Lordthief!

В стандартной библиотеке С++ определены три функции sqrt:

double sqrt(double x);
float sqrt(float x); [C++ only]
long double sqrt(long double x); [C++ only]

Компилятор не может решить, какая из них вызывается. Вставьте в вызов явное преобразование типа аргумента. sqrt( (double)(...) )
Ответ отправил: Алексей Демаков (статус: Студент)
Ответ отправлен: 27.01.2008, 23:15


Вопрос № 120.443
Здравствуйте. Есть все та же программа (пишется в MS Visual Studio, приведена в приложении). На нее нужно добавить командную строку (что-то вроде edit'а в Delphi), которая будет располагаться в нижней части окна. Как это сделать используя только WinAPI? И еще: где в MSDN'е что нужно читать по созданию различных элементов окон - строк ввода, меток (надписей)?

Приложение:

Отправлен: 27.01.2008, 22:33
Вопрос задал: Blackie (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Verena
Здравствуйте, Blackie!
Создать edit, как и любой другой элемент управления, можно с помощью функции CreateWindowEx. Например, вот так:

CreateWindowEx (WS_EX_CLIENTEDGE, "edit", "", WS_CHILD | WS_VISIBLE | ES_LEFT | ES_AUTOHSCROLL, 10, 20, 500, 23, hWnd, (HMENU)10000, hInstance, NULL);

Второй параметр обязательно должен быть равен "edit", четыре числовых параметра после стиля обозначают координаты и размеры edit-а (координаты этого окна x=10, y=20, длина=500, ширина=23), hWnd обозначает родительское окно (главное окно программы в общем случае), далее идёт число-идентификатор окна (должно быть уникальным). Предпоследний параметр игнорируется в системах, начиная с NT. Подробней про функцию и все её параметры можно почитать в MSDN-е, а примеры использования с описанием можно посмотреть тут. В приложении выдержка из MSDN с описанием функции.
Удачи!

Приложение:

---------
Эта история - не для истории, понимаешь?

Ответ отправила: Verena (статус: Студент)
Ответ отправлен: 28.01.2008, 00:13
Оценка за ответ: 5

Отвечает: Сандров Алекс
Здравствуйте, Blackie!

Вот точно так же, как создана кнопка, только класс окна "EDIT"

сразу после кнопки:
HWND hEdit = CreateWindowEx(0, "EDIT", "сразу есть текст", WS_CHILD|WS_VISIBLE|WS_BORDER, 350, 350, 300, 50, hWnd, 3, hInstance, 0);

только координаты надо высчитать. Можно от главного окна взять рект:
RECT rt;
GetWindowRect(hWnd, &rt);

и потом:
SetWindowPos(hEdit, NULL, 10, rt.bottom - 20, rt.right, 20, SWP_NOZORDER);
Ответ отправил: Сандров Алекс (статус: 2-ой класс)
Ответ отправлен: 28.01.2008, 06:27
Оценка за ответ: 4
Комментарий оценки:
Компилятор ругался на HWND hEdit.
Эта функция не заработала пока я не поменял в аргументах 3 на NULL, а сам edit вообще не был виден пока не поменял rt.bottom - 20 на константу.


Вопрос № 120.463
Очень срочно нужна помощь!
С++
1) Написать функцию, которая в заданной строке считает количество букв, цифр и других знаков. Все три значения вернуть из функции.
2) В заданной строке отсортировать символы по алфавиту (написать функцию)
3) В строке, заданной пользователем, посчитать количество слов (написать функцию)
Отправлен: 28.01.2008, 01:53
Вопрос задал: Allexandr (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Verena
Здравствуйте, Allexandr!
Смотрите решение Ваших задач в приложении, среда разработки - VS 2005.

Приложение:

---------
Эта история - не для истории, понимаешь?

Ответ отправила: Verena (статус: Студент)
Ответ отправлен: 28.01.2008, 02:42
Оценка за ответ: 5


Вопрос № 120.480
Здравствуйте!
Помогите, может кто делал что то подобное?

1) Составить программу реализующую трухмерное преобразование с фигурой:
Фигура - Октаэдр
Преобразование - Изменение масштаба по осям X, Y, Z и общее масштабирование по трём осям.
Фигура должна отображаться в контурнов виде без удаления невидимых линий и уметь вращаться округ произвольной оси. Управление осущест в с помощью. 9 цифровых клавиш
2) Написать программу для изображения многогранника вращающегося вокруг оси OY . ось вращения не должна совпадать с собственной вертикальной осью фигуры.
Фигура - Гексаэдр
Проекция - Диметрия
Отправлен: 28.01.2008, 07:17
Вопрос задал: Psa1024 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ross
Здравствуйте, Psa1024!

Ответ на первую половину вопроса. Создай win32 проект в Visual Studio и вместо кода, сгенерированного мастером вставь код в приложении. Если надо могу подумать и над второй задачей, только уточни мне, что такое диметрическая проекция и с чем ее есть (в минифорум)

Приложение:

---------
Доступно только то, что видимо (c) Б. Керниган

Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 01.02.2008, 05:24


Вопрос № 120.516
Здравствуйте! Помогите решить задачу. Условие: Дана строка и подстрока,найти сколько раз повторяется строка в подстроке и вывести на экран количество повторов. Заранее большое спасибо!
Отправлен: 28.01.2008, 12:41
Вопрос задала: Ковалевская Е.А. (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Сандров Алекс
Здравствуйте, Ковалевская Е.А.!

Ограничение на длинну строк - 255 символов.
Есть проверка на пустоту (выход сразу)

Приложение:

Ответ отправил: Сандров Алекс (статус: 2-ой класс)
Ответ отправлен: 28.01.2008, 12:57
Оценка за ответ: 5
Комментарий оценки:
Спасибо

Отвечает: Терсков Сергей
Здравствуйте, Ковалевская Е.А.!
Вариант решения с помощью STL-ных строк в приложении

Приложение:

Ответ отправил: Терсков Сергей (статус: Практикант)
Ответ отправлен: 29.01.2008, 08:58
Оценка за ответ: 5


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.70 от 17.01.2008
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное