Вопрос № 33438: Здраствуйте уважаемые эксперты! У меня к вам вопрос. Попробую описать как можно подробнее.
У меня есть два класса. Во втором классе я использую объекты первого, причем не просто объекты, а массив объектов первого класса. Как мне его объявит и как...Вопрос № 33478: 1. Подскажите как из под ДОСа можно "увидеть" всю память установленную на компьютере (все 128 метров)?
2. Можно ли библиотеки написанные на с, подключать к программам на Паскале?
.Вопрос № 33480: Помогите пожалуйста! Мне надо разработать Web приложение. Тоесть надо создать приложение сервер. Надо чтобы з другого компютера можно было набрать www. адрес первого и загрузилась веб страница, которая бы могла управлять сервером. Ето вроде простого ...Вопрос № 33486: Я вообще предпочитаю Object Pascal(Delphi), но приходится учить сразу 2 языка. В C++ столкнулся с такой проблемой:
а именно с оператором switch(expression)
{case constant1 : ... ;
case constant2 : ... ;
...
}
Почему после ca...Вопрос № 33499: Здравствуйте уважаемые эксперты. Нужно повернуть битмапу средствами API. В сети наткнулся на ф-ию SetWorldTransform(). А есть какие-нибудь другие варианты? Может кто сталкивался?
С уважением, Дмитрий....Вопрос № 33501: Здравствуйте, Эксперты!
Вопрос такой:
В Linux программа
int main() {
printf("Hello World
");
return 0;
}
компилируется без проблем, а в Turbo C и Borland C (помоему и в Borland C++ Builder) нужн...
Вопрос № 33.438
Здраствуйте уважаемые эксперты! У меня к вам вопрос. Попробую описать как можно подробнее.
У меня есть два класса. Во втором классе я использую объекты первого, причем не просто объекты, а массив объектов первого класса. Как мне его объявит и как инициализировать?
Если я просто объявляю массив, а в конструкторе его инициализирую (или в каком-либо методе), то у меня появляется ошибка что-то типа: нет конструктора по-умолчанию (ошибка относится к конструктору второго класса, а не первого).
Если я инициализирую массив в самом классе сразу после объявления, то компилятор говорит мол: здесь нельзя использовать "{" и "}".
Кто-то говорил, что в таких случаях нужно использовать не объекты, а указатели. Если это правда, то скажите как, или покажите мелкий пример. Вобщем помогите!!!
Орудие труда - C++ (компилятор MSVC++ v7.1).
Надеюсь на вашу помощь :(
Так как мои классы большие я поясню все выше сказанное в приложении.
Приложение:
Отправлен: 17.01.2006, 14:26
Вопрос задал: Scart (статус: Посетитель)
Всего ответов: 6 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: BOIL
Здравствуйте, Scart!
Одно из решений использовать классы шаблоны
#include <vector>
std::vector<MyClassA> vMyArray;
for(int i = 0; i < MAX_NUM; i++)
{
MyClassA m(_par_list_);
vMyArray.push_back(m);
}
далее vMyArray[j].MyMethod()
P.S. Для избежания ошибок добавьте в MyClassA свой конструктор копий и оператор присваивания
Удачи!..
Ответ отправил: BOIL (статус: 6-ой класс)
Отправлен: 17.01.2006, 14:40
Отвечает: X-MAN
Здравствуйте, Scart!
>>Если я просто объявляю массив, а в конструкторе его инициализирую (или в каком-либо методе), то у меня появляется ошибка что-то типа: нет конструктора по-умолчанию (ошибка относится к конструктору второго класса, а не первого).
Естественно!!! Конструктор второго класса пытается вызвать конструктор без параметров для первого класса, а его нет...
Возможные варианты:
1. Сделать для класса 1 конструктор без параметров, а переменные инициализировать потом, или
2 Сделать как в приложении. В объявлении класса 2 есть указатель на первый класс, потом мы выделяем блок памяти нужного размера, и, затем инициализируем все элементы массива конструктором первого класса. Всё ОК!!!
Приложение:
Ответ отправил: X-MAN (статус: 2-ой класс)
Отправлен: 17.01.2006, 19:29
Отвечает: RedDevil
Тебе компилятор ясно говорит:нет конструктора по-умолчанию.
Как ты собираешся инициализовать массив объектов MyClassA ObjectA[10], если у MyClassA нету конструктура по умолчанию ?
Вот сделай вот так и все будет работать.
class MyClassA
{
private:
int a, b, c;
public:
MyMethod();
MyClassA(int A = 0, int B = 0, int C = 0) : a(A), b(B), c(C){};
~MyClassA(){};
};
Ответ отправил: RedDevil (статус: 3-ий класс)
Отправлен: 17.01.2006, 22:13
Отвечает: yatagan
Здравствуйте, Scart!
так у тебя ж действительно не определен конструктор по умолчанию класса MyClassA. второй класс пытается создать 10 обьектов первого, а не может так как нет конструктора... добавь пустой: MyClassA(){};
--------- Україна понад усе!
Ответ отправил: yatagan (статус: 3-ий класс)
Отправлен: 17.01.2006, 22:15
Отвечает: Zitz
Здравствуйте, Scart!
Просто добавьте конструктор по умолчанию, см. приложение.
Объявить вот так массив с инициализацией нелься, т.е. когда обявляете в классах начальное значение всегда присваевается по дефолтному конструктеру.
Начальные значения присвоить можно в конструкторе класса B, притом чтобы с этим не париться хорошо бы иметь метод в классе А, что-то типа:
void SetABC (int A, int B, int C) { a=A; b=B; c=C; };
Для этого собственно конструкторы и нужны...
Что касается всяких там указателей, то по ним можно создавать объекты динамически... Вам лучше по этому поводу почитать литературку, чтобы понять как там все происходит.
А вот если класс Б просто управляет уже созданым объектом класса А, то его можно передать по указателю, например
В коде есть гдето:
...
MyClassA obA(1,1,1);
...
Нужно чтобы класс Б управлял им, ну допустим в процессе работы класса Б меняется второй член А (int b), так в теле класса Б нужно чтобы было
MyClassA *obA;
А в конструкторе MyClassB (MyClassA *A) { obA = A };
И дальше по коду когда создаете класс Б пишите:
...
MyClassB obB(&obA);
...
Ну а в методах класса Б, обращение уже идет естественно через разименование:
obA->SetABC (2,2,2);
Я так делаю когда надо окнами управлять, чтобы не искать нужное окно в кишках, по указателю его передаю.
Приложение:
--------- Успех неизбежен
Ответ отправил: Zitz (статус: 5-ый класс)
Отправлен: 18.01.2006, 12:30
Отвечает: Raptor1
Здравствуйте, Scart!
Можно сделать двумя способами:
1. Добавить конструктор без параметров
MyClassA() : a(0), b(0), c(0){};
и функцию инициализации переменных класса
void SetValue(int A, int B, int C)
{
a=A;
b=B;
c=C;
}
2. Использовать указатели:
// В конструкторе B
MyClassA** ppObjectA;
ppObjectA=new *MyClassA[10];
for(DWORD i=0;i<10;i++)
ppObjectA[i]=new MyClassA(i,i+1,i+2);
// в деструкторе B
for(DWORD i=0;i<10;i++)
delete ppObjectA[i];
delete [] ppObjectA;
Ответ отправил: Raptor1 (статус: Студент)
Отправлен: 21.01.2006, 09:31
Вопрос № 33.478
1. Подскажите как из под ДОСа можно "увидеть" всю память установленную на компьютере (все 128 метров)?
2. Можно ли библиотеки написанные на с, подключать к программам на Паскале?
Отправлен: 17.01.2006, 21:53
Вопрос задал: Andrew (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: X-MAN
Здравствуйте, Andrew!
Если я не ошибаюсь, то дос может использовать только 64К памяти из-за 16-битной адресации. Если только перевести процессор в защищённый режим...
Ответ отправил: X-MAN (статус: 2-ой класс)
Отправлен: 18.01.2006, 02:12
Вопрос № 33.480
Помогите пожалуйста! Мне надо разработать Web приложение. Тоесть надо создать приложение сервер. Надо чтобы з другого компютера можно было набрать www. адрес первого и загрузилась веб страница, которая бы могла управлять сервером. Ето вроде простого интернет сервера, но я РНР незнаю. А пишу я немножко на С++ Builder.
Так вот у меня прозьба. Подскажите пожалуйста команды, компоненты, с помощю которых можно создать веб приложение. А также может у вас есть документация какаято? Или исходники програм?
Огромное вам спасибо за помощь
Отправлен: 17.01.2006, 21:56
Вопрос задал: Etenity (статус: 6-ой класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Bob Johnson
Здравствуйте, Etenity!
На моей странице есть небольшой http сервер с исходниками на vc ++.
http://bobjohnson.nm.ru
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 19.01.2006, 01:43
Вопрос № 33.486
Я вообще предпочитаю Object Pascal(Delphi), но приходится учить сразу 2 языка. В C++ столкнулся с такой проблемой:
а именно с оператором switch(expression)
{case constant1 : ... ;
case constant2 : ... ;
...
}
Почему после case тока константы?
Допустим, ввожу символ, и нужно определить и вывести -isalpha, -isdigit, -isascii,... если соответствующие функции isalpha(char) (<ctype.h>)принимают значение true. Но эти ф-ии нельзя поставить вместо константы!
Может есть другой "элегантный" способ решить эту задачу?
Или тупо прописывать перед каждой функцией оператор if...
Отвечает: X-MAN
Здравствуйте, Терентьев Михаил владимирович!
А представьте себе такой вариант:
int a = 3, b=3;//и expression тоже три
switch(expression){
case a:.......................
case b:........................
default.......................
}
что делать? а или b?
Так что придётся ипользовать if..........else if
Ответ отправил: X-MAN (статус: 2-ой класс)
Отправлен: 18.01.2006, 02:18 Оценка за ответ: 3 Комментарий оценки: Не думаю, что это как-нибудь помешало бы. В моем случае должны выполняться все действия, если соотвествующие функции равны true. Если а=true (символ - алфавитная буква), то выводим на экран -isalpha, дальше - b=true( символ, допустим, имеет нижний регистр), выводим -islowcase, c=false - ничего не делаем и т.д.
В Паскале есть оператор case: case (expression) of expression1:
... expression2: ... expression3: ... end; но в отличие от си после певого выполненного действия выходит из оператора. Короче, и в Паскале, и в Си есть свои недостатки...(услышали бы меня сейчас разработчики вышеупомянутого=))
Отвечает: estiGi
Здравствуйте, Терентьев Михаил владимирович!
Константы нужны потому, что компилятор преобразует оператор switch в дерево двоичного поиска, соответсвенно, ему нужно еще до компиляции знать значения для сравнений.
Поэтому придется "тупо" прописывать if...else if. Все равно быстрее ты не сделаешь, тебе ведь нужно поочередно проверять все возвраты функций.
Ответ отправил: estiGi (статус: 10-ый класс)
Отправлен: 18.01.2006, 13:56 Оценка за ответ: 5
Отвечает: Zitz
Здравствуйте, Терентьев Михаил владимирович!
Не знаю насколько у меня "элегантно", но в таких случаях делаю процедуру в которой вызываю:
if (isalpha(char)
{
...
return;
}
if (isdigit(char)
{
...
return;
}
...
Благо синтаксис С позволятет выйти из любой точки функции...
Это уж если надо чтобы совсем на свитч похоже было... хотя чтобы особо незагружаться можно просто по if проверять, да и читаться лучше будет...
Ну а совсем "элегантно" будет свои функции, да макросы понаписать :-))
Зачем себе проблемы создавать "элегантными" решениями, если "тупо" написаное проше для реализации и легче для понимания?
--------- Успех неизбежен
Ответ отправил: Zitz (статус: 5-ый класс)
Отправлен: 18.01.2006, 16:23
Отвечает: Raptor1
Здравствуйте, Терентьев Михаил владимирович!
Смысл конструкции switch в ускорении работы по сравнению с if поэтому для каждого значения case он генерирует смещение по которому находится код обработчика, а реально условие кроме компилятора больше никем не используется, поэтому это значение не может меняться во время выполнения и должно быть константой. Кроме того, значения case должны быть все разные, а ты хочешь вставить туда функциии, возвращающие одно множество значений. Как при этом компилятор выберет верный обработчик?
Ответ отправил: Raptor1 (статус: Студент)
Отправлен: 21.01.2006, 09:30
Вопрос № 33.499
Здравствуйте уважаемые эксперты. Нужно повернуть битмапу средствами API. В сети наткнулся на ф-ию SetWorldTransform(). А есть какие-нибудь другие варианты? Может кто сталкивался?
С уважением, Дмитрий.
Отправлен: 18.01.2006, 01:31
Вопрос задал: koshi (статус: 3-ий класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: X-MAN
Здравствуйте, koshi!
Есть вариантс использованием GDI+
Но только результат преобразования будет в формате JPEG и будет сохранён на диск. Потом с помощью GDI+ вы сможете его загрузить и нарисовать.
Пример в приложении
Приложение:
Ответ отправил: X-MAN (статус: 2-ой класс)
Отправлен: 18.01.2006, 02:31 Оценка за ответ: 5 Комментарий оценки: Спасибо, интересненько)
Вопрос № 33.501
Здравствуйте, Эксперты!
Вопрос такой:
В Linux программа
int main() {
printf("Hello World
");
return 0;
}
компилируется без проблем, а в Turbo C и Borland C (помоему и в Borland C++ Builder) нужно подключать <stdio.h>.
Как это происходит? Почему в Linux можно не подключать stdio.h, string.h, stdlib.h (iostream, fstream, например, подкулючать приходится)? Как определить, что автоматически подключается и можно ли это как-нибудь настроить?
Другой вопрос: программа Hello World, скомпилированная в Windows с помощью MinGW GCC занимает ~600 KB, в Linux - 6 KB!!! В Borland C такая программа занимает ~30 KB. Как скомпилировать МАЛЕНЬКОЕ Hello World в MinGW?
И третий вопрос (скорее про Python): Как в системе сборки SCons скомпилировать несколько c/cpp файлов в один *.o, лежащий в другом каталоге? При сборке во время анализа скрипта выдаётся ошибка, о том, что используется одна цель для множества источников. В make такую штуку можно проделать легко:
g++ -o ../qwe/asd.0 asd.cpp qwe.cpp zxc.cpp
Отправлен: 18.01.2006, 02:52
Вопрос задал: Tundravarg (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Zitz
Здравствуйте, Tundravarg!
>>В Linux программа компилируется без проблем, а в
>>Turbo C и Borland C (помоему и в Borland C++ Builder) нужно подключать <stdio.h>
Очивидно в компиляторе Linux она подрубается по дефолту, ну или встроено, а так по идее эти сишные функции прописаны в stdio, а именно функция printf, можете сами посмотреть.
Ответить на данный вопрос вам поможет документация Linux, там и прописано что подрубеатся, что нет и какие особенности, в любом случае если подрубите эти хендлеры еще раз ничего не измениться, но будет надежней если решите перенести на Винду.
>> программа Hello World, скомпилированная в Windows с помощью MinGW GCC занимает ~600 KB
Вот тут можно наверное смеяться!!! :-)) Скорее всего Вам нужен другой компилятор! Или в настройках компиляции пошарить, может это отладочной информации столько прилипло... А если нет, если каждый раз необходимо производить дополнительные действия, внедрять алгоритмы, по уменьшению исходника, то тут уже стоит задуматься: "а нужен ли мне такой компилятор?".
Я вообще то на ВС6 пишу, так даже в больших программах трудно добиться таких весов! Приходится туда даже вставлять чего по увесистей - библиотечу или картинок, чтобы по солидние выглядела! А то прога много умеет и метра то не весит...
По третьему вопросу ничего не знаю, никогда так не делал... Да и нужды не было...
--------- Успех неизбежен
Ответ отправил: Zitz (статус: 5-ый класс)
Отправлен: 18.01.2006, 13:02