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

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


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

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

Выпуск № 496
от 16.08.2006, 19:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 356, Экспертов: 59
В номере:Вопросов: 3, Ответов: 9


Вопрос № 51777: Здравствуйте!!! В чем тут проблема? Ошибку выбивает в Unit1.cpp в этом фрагменте void F3(char Ch) { Form1->label1->Caption = Form1->Label1->Caption + Ch + Form1->Ch1; } Я изучаю С++ совсем недавно, поэтому...
Вопрос № 51857: Добрый день! У меня вопрос относительно ООП. Задача: Создать класс(Model) для хранения, отображения и т.д. модели какой-либо фигуры состоящей из точек(Vertex). Вопрос заключается в следующем: каким образом можно задать динамический м...
Вопрос № 51869: Уважакмые эксперты! Подскажите, где можно найти информацию по написанию firewall'a?...

Вопрос № 51.777
Здравствуйте!!!
В чем тут проблема?
Ошибку выбивает в Unit1.cpp в этом фрагменте
void F3(char Ch)
{
Form1->label1->Caption = Form1->Label1->Caption + Ch + Form1->Ch1;
}
Я изучаю С++ совсем недавно, поэтому пример взят из учебника
Навсякий случай полностью код Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// ãëîáàëüíàÿ ïåðåìåííàÿ Ch3 è ôóíêöèÿ F4 äîñòóïíû â ïðåäåëàõ äàííîãî ìîäóëÿ
// ïåðåìåííàÿ Ch3 äîñòóïíà â äðóãèõ ìîäóëÿõ, åñëè îïðåäåëåíà òàì
// ñî ñïåöèôèêàöèåé extern;
// ôóíêöèÿ F4 äîñòóïíà â äðóãèõ ìîäóëÿõ, åñëè òàì ñîäåðæèöà åå ïðîòîòèï
Char Ch3;

void F4 (char Ch)
{
Form1->Label1->Caption = Form1->Label1->Caption + Ch + Form1->Ch1;
}
//---------------------------------------------------------------------------
void _fastcall TForm1::F1 (char Ch)
{
Label1->Caption = Label1->Caption + Ch + Ch1;
}
//---------------------------------------------------------------------------
void _fastcall TForm1::F2 (char Ch)
{
Label1->Caption = Label1->Caption + Ch + Ch1;
}
//---------------------------------------------------------------------------
void F3(char Ch)
{
Form1->label1->Caption = Form1->Label1->Caption + Ch + Form1->Ch1;
}
//---------------------------------------------------------------------------
void _fastcall TForm1::Button1Clik(TObject *Sender)
{
// ïåðåìåííàÿ Ch4 äîñòóïíà òîëüêî âíóòðè äàííîé ôóíêöèè
char Ch4;
Ch1 = '-';
Ch2 = 'A';
Ch3 = 'B';
Ch4 = 'C';
Label1->Caption = "";
F1(Ch1);
F2(Ch2);
F3(Ch3);
F4(Ch4);
Label->Font->Color = clRed;
}

Приложение:

Отправлен: 10.08.2006, 19:42
Вопрос задал: ataman (статус: 2-ой класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Physicist
Здравствуйте, ataman!

В C++ различаются заглавные и строчные буквы. Поэтому компилятор выдает ошибку на label1, т.к. в классе объявлена только Label1.
Ответ отправил: Physicist (статус: Студент)
Ответ отправлен: 10.08.2006, 19:53
Оценка за ответ: 5
Комментарий оценки:
Спасиба!!!
Я забыл про это

Отвечает: Шальков Павел Владимирович
Здравствуйте, ataman!
Язык С++ - регистрозависимый, поэтому в строке Form1->label1 - ошибка, правильно Form1->Label1. Удачи!
Ответ отправил: Шальков Павел Владимирович (статус: 5-ый класс)
Ответ отправлен: 11.08.2006, 05:32

Отвечает: Виктор Пырлик
Здравствуйте, ataman!
Нельзя работать со строковым массивом и одиночным символом в одной операции.
Надо привести или символ к строке или конкретно указать элемент строкового массива.
Свойство Caption имеет тип AnsiString, а работаете с типом char - одиночный символ (короткое целое). В случае однократного использования, Builder "прощает" у вас же встречается повторы [Form1->Label1->Caption + Ch + Form1->Ch1].
можно например так: Form1->Label1->Caption + String(Ch) +String(Form1->Ch1)
- один из вариантов...
---------
Не результат важен, процесс есть двигатель всего!
Ответ отправил: Виктор Пырлик (статус: 2-ой класс)
Ответ отправлен: 11.08.2006, 06:49


Вопрос № 51.857
Добрый день! У меня вопрос относительно ООП.
Задача:
Создать класс(Model) для хранения, отображения и т.д. модели какой-либо фигуры состоящей из точек(Vertex).

Вопрос заключается в следующем: каким образом можно задать динамический массив для хранения точек? Т.е. можно создать класс и обозначить там заранее массив из 100 вертексов. Но если модель состоит из 5? Тратится память. Если из 120, то ошибка )

Т.е. как можно динамически изменять в классе количество точек?

Класс вертекса

class Vertex
{
public:
float x;
float y;
float z;
}
Класс модели

class Model
{
public:
Vertex Massiv[100];
}

Что нужно изменить?
Заранее спасибо.
Отправлен: 11.08.2006, 14:47
Вопрос задал: PollyRC (статус: 1-ый класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Physicist
Здравствуйте, PollyRC!

Нужно в классе хранить только указатель на данные. В конструкторе класаа память будет выделяться (под нужное число элементов), в деструкторе - освобождаться. Пример см. в Приложении.

Также можно использовать библиотеку STL:
#include
...//Пример объявления массива
vector Massiv;
..//Пример добавления данных
Massiv.push_back( Vertex1 );
Massiv.push_back( Vertex2 );
Massiv.push_back( Vertex3 );
...//Пример доступа к данным
Vertex1 = Massiv[1];

Приложение:

Ответ отправил: Physicist (статус: Студент)
Ответ отправлен: 11.08.2006, 15:05

Отвечает: Шинтяков Дмитрий Васильевич / Ratson
Здравствуйте, PollyRC!

Настоятельно рекомендую вам изучить станартную библиотеку шаблонов stl.

Она содержит готовые решения для массы таких задач, о которых вы даже не задумавались ^_^ Писать на С++ без шаблонов - всё равно, что ездить на велосипеде, отталкиваяь от земли ногами.

В частности, динамически изменяемый массив из Vertex записывается так:

include <vector>
....

std::vector<Vertex> Massiv;

Massiv.resize(100);

Благодаря перегрузке операторов, работать с таким массивом можно как с обычным

std::cout<<Massiv[5].x;
Вообще, при программировании на С++ рекомендуется избегать С-шного стиля работы с массивами, и пользоваться контейнерами STL, которые более более удобны и зачастую надёжны (дуракоустойчивы).

Благодаря тому, что библиотека шаблонная, её классы имеют минимальные накладные расходы.
Ответ отправил: Шинтяков Дмитрий Васильевич / Ratson (статус: 1-ый класс)
Ответ отправлен: 11.08.2006, 15:59

Отвечает: C4tnt
Здравствуйте, PollyRC!

Предложу ещё два варианта:

1. Хранить информацию блоками в списке
+ Быстро добавляет элементы (в том числе и в середину)
+ Легко пройти список
+ Легко удалить элемент
+ Хранится по три вертекса сразу (удобно выводить на экран в OpenGL)
- Навигация по списку возможна только вперёд
- Нельзя выбрать конкретный элемент (точнее можно, но долго)
- Сложно сортировать

2. Хранить информацию на предварительно выделеной странице памяти

+ Не даёт модели попасть на стык страниц памяти
+ У программы всегда будет запас памяти на модели
+ Можно дефрагментировать память
+ Можно максимально компактно использовать память
+ Можно подготовить информацию для DX9 достаточно быстро
+ Навигация как в массиве
+ Легко удалить
- Нужно дефрагментировать память
- Выбирается целая страница памяти, если целых нет, то fatal error...
--- Сложно реализовать

Если что-нибудь заинтересует, вышлю реализацию по почте, т.к. громоздко
---------
Лозунг???
Ответ отправил: C4tnt (статус: 1-ый класс)
Ответ отправлен: 11.08.2006, 21:41

Отвечает: Ross
Здравствуйте, PollyRC!
Для динамического выделения памяти можно использовать несколько способов.
Рассмотрим случай выделения памяти для 100 точек.
1)В объявлении переменных класса вы должны поставить указатель:
class Model
{
public:
Vertex *Massiv;
};

Далее в конструкторе класса используете оператор new или GlobalAlloc:

Massiv = new Vertex[100];
Massiv = (Vertex *)GlobalAlloc(GPTR,sizeof(Vertex)*100);

В деструкторе используете оператор delete или GlobalFree:

delete Massiv;
GlobalFree(Massiv);

2)В начало файла пишете #include <vector>
В объявлении класса:
class Model
{
vector <Vertex> Massiv;
};

В конструкторе:
Massiv.resize(100);

В деструкторе:
Massiv.resize(0);

В таком случае, чтобы определить координату x точки номер 10:
float x = Massiv[10].x;
Ответ отправил: Ross (статус: 1-ый класс)
Ответ отправлен: 12.08.2006, 21:48
Оценка за ответ: 5
Комментарий оценки:
Спасибо, изучаю Std :)


Вопрос № 51.869
Уважакмые эксперты!
Подскажите, где можно найти информацию по написанию firewall'a?
Отправлен: 11.08.2006, 17:17
Вопрос задал: Корсак Александр Юрьевич (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: dianacode
Доброе время суток, Корсак Александр Юрьевич

очень интересная задача ) тут ещё можно подумать насчёт реализации - всё зависиот от того, какую платформу вы будете использовать, для никсов это будет реально и понятно, для вин32 - более трудоёмко

есть вариант на управление и отслеживание цепочек именно на си для никсов(*nix) - проект agt - http://sourceforge.net/projects/agt/

а вообще под никс можно предложить массу решений - всё зависит от разоаботчика и фантазий + используемые инструменты

с уважанием, удачи

---------
There is more than one way to do it
Ответ отправила: dianacode (статус: 3-ий класс)
Ответ отправлен: 11.08.2006, 20:40

Отвечает: Rusfaq mustdie
Здравствуйте, Корсак Александр Юрьевич!
http://www.codeproject.com/internet/#Proxy+%2F+Firewall - здесь есть примеры.

---------
Rusfaq mustdie
Ответ отправил: Rusfaq mustdie (статус: Заблокирован)
Ответ отправлен: 11.08.2006, 21:44


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

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

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

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

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


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


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.35 от 27.07.2006
Яндекс Rambler's Top100

В избранное