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

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


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

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

Выпуск № 660
от 07.02.2007, 02:05

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


Вопрос № 73608: Здравствуйте. Можно ли использовать dll написанную на делфи в моем проекте на с++, если да, то приведите пример. Заранее спаибо....
Вопрос № 73650: Компилирую в Visual C++ 6.0 Простую программу: перегружаю вывод в поток для моего класса (код в приложении). Получаю две странные ошибки: error C2248: 'n' : cannot access private member declared in class 'A' error C2593: 'operator <<' i...
Вопрос № 73655: Добрый день. Помогите с рекурсией. Я могу проследить алгоритм до вывода первой цифры, то есть 4, потом захожу в тупик. Помогите пожалуйста....
Вопрос № 73676: Скажите пожалуйста как пользоваться функцией cin.getline(char *mass,int n,' ') почему-то при её использовании если дальше имеется еще хоть один cin то при выполнении программа переходитименно к следующему cin не давая считать строку с клавиатуры...
Вопрос № 73677: Скажите каким образом можно научить программу запускать internet explorer и на web страницах открывать ссылки, вводить данные в поля, нажимать на кнопки. Или если это все можно проделывать и без открытия iexplorer'a то как именно?...
Вопрос № 73681: Здравствуйте ув.эксперты! Скажите как правильно описывается структура?Я встречал два вида описания (см. приложение) Чем они отличаются?...
Вопрос № 73688: Здравствыйте, уважаемые эксперты! Все задачки по контрольной сделала, а на одной застряла намертво, что только не пробовала, не идет и все! Помогите найти ошибку, пожалуйста! Заранее спасибо! "НАЙТИ № столбца с мах кол-вом положительных эл-т...
Вопрос № 73710: Доброе время суток. Не будете ли Вы так любезны растолковать зачем нужно переопределять оператор и когда это использовать. Я читаю эту рассылку и частенько комуто надо переопределять оператор. Я всегда без них обходился....

Вопрос № 73.608
Здравствуйте.
Можно ли использовать dll написанную на делфи в моем проекте на с++, если да, то приведите пример. Заранее спаибо.
Отправлен: 01.02.2007, 10:38
Вопрос задал: IKS (статус: 4-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: dentist
Здравствуйте, IKS!
конечно можно.
практически во всех языках програмирования существует по несколько методов объявления экспортируемой функции. И практически во всех (в том числе и делфи с паскалем) имеется возможность объявлять по "Си стандарту".
точно не помню давно это было, но вроде что-то типа этого:

function abc(a : integer) : integer; cdecl;
насчёт ';' после integer сильно сомневаюсь, ибо не помню =)
лутше всего обратиться к документации по используемому вами компилятору.
---------
"Software is like sex, it's better then it's free" (c) Linus Torvalds
Ответ отправил: dentist (статус: 8-ой класс)
Ответ отправлен: 01.02.2007, 11:13

Отвечает: ramok
Здравствуйте, IKS!

вот тут вот http://ru.wikipedia.org/wiki/DLL
как пример dll возьмите из раздела 2.1 Экспорт из DLL -> 2.1.1 Delphi пример dll
а как пример подключения dll в C++ из раздела 2.2 Импорт из DLL -> ]2.2.2 C и C++
Ответ отправил: ramok (статус: Студент)
Ответ отправлен: 01.02.2007, 21:39
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Действительно то, что хотел.


Вопрос № 73.650
Компилирую в Visual C++ 6.0 Простую программу: перегружаю вывод в поток для моего класса (код в приложении). Получаю две странные ошибки:
error C2248: 'n' : cannot access private member declared in class 'A'
error C2593: 'operator <<' is ambiguous

Если заменить строку #include<iostream> на #include<iostream.h> и убрать using namespace std;, то все компилируется и работает.

Мне кажется, виноват Visual C++ 6.0.

Подскажите пожалуйста, в чем может быть причина?

Приложение:

Отправлен: 01.02.2007, 16:26
Вопрос задал: Ersh (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Lemeshev Konstantin
Здравствуйте, Ersh!
Видимо дело все-таки в компиляторе, проверил ваш код (без каких либо изменений) на 3-х других компилятора (Visual Studio 2005, C++Builder 6, Dev-C++) все работает без единого предупреждения и уж тем более ошибки (за исключением того, что функция main должна возвращать значение типа int).
На шестой студии проверить не удалось :-( На сколько я знаю оператор using namespace достаточно новый, т.е. в стандарт его включили не так давно, по этому (как мне кажеться) студия 6 и реагирует на него неадекватно.
Ответ отправил: Lemeshev Konstantin (статус: 4-ый класс)
Ответ отправлен: 02.02.2007, 06:21
Оценка за ответ: 5
Комментарий оценки:
"Проверка" кода разными компиляторами - хороший способ проверить правильность и совместимость кода.


Вопрос № 73.655
Добрый день.
Помогите с рекурсией. Я могу проследить алгоритм до вывода первой цифры, то есть 4, потом захожу в тупик. Помогите пожалуйста.

Приложение:

Отправлен: 01.02.2007, 17:25
Вопрос задал: Platon (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Mefisto
Здравствуйте, Platon!
Смотри, сначала твоей ф-и посылается 456789, она делит его на 10 и посылает сама себе 45678 и так далее, когда она послала себе 4 то условие
if ((i = n / 10) != 0)
printd(i);
не будет выполняться и ф-я напечатает 4, потом предыдушщий вызов напечатает 5 и так далее до 9....может что не доходчиво объяснил, уж извини
Ответ отправил: Mefisto (статус: 1-ый класс)
Ответ отправлен: 01.02.2007, 17:31

Отвечает: ramok
Здравствуйте, Platon!

сложно разобраться потому что тут рекурсия работает и на спуске и на подъеме.
сначала вызывается такая цепочка

print(465789) -> print(46578) -> print(4657) -> print(465) -> print(46)-> print(4)

в последнем print(4) проверка
if ((i = n / 10) != 0)

не проходит и выводится очередной print не вызывается. и начинается раскручиваться цепочка
вызовов в обратном порядке. это называется рекурсия работает на подъеме.

печатается остаток
putchar(n % 10 + '0'); // выводится 4
потом возвращается в вызов print(46) где печатается остаток '6' и так далее

print(4) -> print(46) -> print(465) -> print(4657) -> print(46578)-> print(465789)

конечно если нарисовать это все в виде вертикального столбика то было бы наглядней..

Ответ отправил: ramok (статус: Студент)
Ответ отправлен: 01.02.2007, 18:12

Отвечает: kool
Здравствуйте, Platon!
Ставь брекпоинт на строке
printd(i); и отслеживай изменения в
отладчике!
Удачи!
Ответ отправил: kool (статус: 6-ой класс)
Ответ отправлен: 01.02.2007, 19:58


Вопрос № 73.676
Скажите пожалуйста как пользоваться функцией cin.getline(char *mass,int n,' ')
почему-то при её использовании если дальше имеется еще хоть один cin то при выполнении программа переходитименно к следующему cin не давая считать строку с клавиатуры при э том ни каких ошибок не обнаружино
Отправлен: 01.02.2007, 20:16
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Lemeshev Konstantin
Здравствуйте, Tatarin!
К сожалению не совсем понял что вы имеете в виду, но решил проверить следующий код (см. приложение) оба работают вполне корректно, т.е. все что было набрано до нажатия клавиши Enter попадает в переменную n, а число набранное после в переменную k.
Если я что-то не так понял, то извиняюсь.
P.S. Код проверен в 2-х компиляторах.

Приложение:

Ответ отправил: Lemeshev Konstantin (статус: 4-ый класс)
Ответ отправлен: 02.02.2007, 06:33


Вопрос № 73.677
Скажите каким образом можно научить программу запускать internet explorer и на web страницах открывать ссылки, вводить данные в поля, нажимать на кнопки. Или если это все можно проделывать и без открытия iexplorer'a то как именно?
Отправлен: 01.02.2007, 20:19
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Bob Johnson
Здравствуйте, Tatarin!
а какая конечная цель? автоматизировать обработку какой-то w'eb формы? тогда лучше написать свою программу, которая будет подсоединяться к сайту и передавать нужные данные. Функции: InternetOpen, InternetConnect, HttpOpenRequest, InternetReadFile и т.п.
а чтобы работать с IE, можно воспользоваться эмуляцией нажатий кнопок и движений мышки. функции: mouse_event, keybd_event. запуск браузера - через ShellExecute (в качестве имени файле передай ему w'eb страницу).
Ответ отправил: Bob Johnson (статус: Академик)
Россия, Калуга
WWW: Программирование
----
Ответ отправлен: 02.02.2007, 00:12


Вопрос № 73.681
Здравствуйте ув.эксперты! Скажите как правильно описывается структура?Я встречал два вида описания
(см. приложение) Чем они отличаются?

Приложение:

Отправлен: 01.02.2007, 20:49
Вопрос задал: Hunter20 (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: ramok
Здравствуйте, Hunter20!

В С++ не отличаются ничем. А для С если использовать первый вариант, то при объявлении переменных нужно использовать ключевое слово struct

struct object o1;

а если использовать второй вариант, то struct можно опустить и будет выглядеть как в C++

object o1;
Ответ отправил: ramok (статус: Студент)
Ответ отправлен: 01.02.2007, 20:54
Оценка за ответ: 5
Комментарий оценки:
Спасибо

Отвечает: Базанов Иван Александрович
Здравствуйте, Hunter20!
Варианты практически идентичны для с++. Правильны оба.
---------
Программист ошибается дважды: первый раз при рождении, второй при выборе профессии
Ответ отправил: Базанов Иван Александрович (статус: 3-ий класс)
Ответ отправлен: 01.02.2007, 21:00
Оценка за ответ: 5
Комментарий оценки:
спасибо

Отвечает: Thread
Здравствуйте, Hunter20!
Первый вариант - это Си совместимый вариант, а второй, это нововведение С++. Но по сути дела они ни чем не отличаются. Если вы используете компилятор С++, то можно использовать оба варианта (смотря какой вам нравиться больше), если же Си - то только первый.
Ответ отправил: Thread (статус: 3-ий класс)
Ответ отправлен: 01.02.2007, 21:50
Оценка за ответ: 5
Комментарий оценки:
спасибо

Отвечает: Olegzp
Здравствуйте, Hunter20!
В первом случае вы создаете структуры для ссылок на которую используется синтаксис
struct object
{
int fx, fy;
int x, y;
float spin;
}MyObject;
далее
MyObject.x = ...;

Во втором случае вы определяете новый тип данных(object) c которым можно работать как с любым типом данных

typedef struct
{
int fx, fy;
int x, y;
float spin;
} object;

Для примера :

object MyObject; // Создаем переменную типа object
object *MyObject1; // Создаем указатель на переменную object

MyObject.x = ...; // заносим данные в переменную х структуры MyObject
MyObject1 = &MyObject; // присваиваем MyObject1 указатель на MyObject
Myobject->x = ...; // Изменяем переменную х в структуре MyObject
Ответ отправил: Olegzp (статус: 1-ый класс)
Ответ отправлен: 02.02.2007, 13:10


Вопрос № 73.688
Здравствыйте, уважаемые эксперты! Все задачки по контрольной сделала, а на одной застряла намертво, что только не пробовала, не идет и все! Помогите найти ошибку, пожалуйста! Заранее спасибо!
"НАЙТИ № столбца с мах кол-вом положительных эл-тов"

Приложение:

Отправлен: 01.02.2007, 21:06
Вопрос задал: Olka (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: ramok
Здравствуйте, Olka!

вместо
for(j=0;j<5;j++)
kol=0;
{

попробуйте
for(j=0;j<5;j++)
{
kol=0;
Ответ отправил: ramok (статус: Студент)
Ответ отправлен: 01.02.2007, 21:13

Отвечает: Lemeshev Konstantin
Здравствуйте, Olka!
Исправленый вариант в приложениии.
Замечани: Нельзя объявлять функции внутри других функций.

Приложение:

Ответ отправил: Lemeshev Konstantin (статус: 4-ый класс)
Ответ отправлен: 02.02.2007, 06:50

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

Вы пропустили закрывающую фигурную скобку в функции main():

void main ()
{

float a[3][5], v[3][5];
int nomera, nomerv;

inputmas(a,'a');
inputmas(v,'v');
nomera=schet (a);
nomerv=schet (v);
outrez(a,'a',nomera);
outrez(v,'v',nomerv);

} //!---пропущенная скобка

Обнуление счетчика kol нужно внести внутрь цикла (функция schet):

for(j=0;j<5;j++)
{
kol=0;
вместо
for(j=0;j<5;j++)
kol=0;
{
С точки зрения синтаксиса ваш вариант также верен, но приведет к другому результату: переменной kol 5 раз присвоится значение 0, а дальнейший код будет выполнятся уже вне цикла.
Ответ отправил: Ross (статус: 4-ый класс)
Ответ отправлен: 04.02.2007, 19:41
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо за ответ, да еще и с объяснением,
в чем я не права (закрывающая скобка у меня была, потерялась при копировании, а вот с другой это я,конечно, здорово промахнулась) Еще раз спасибо, Olka


Вопрос № 73.710
Доброе время суток. Не будете ли Вы так любезны растолковать зачем нужно переопределять оператор и когда это использовать. Я читаю эту рассылку и частенько комуто надо переопределять оператор. Я всегда без них обходился.
Отправлен: 02.02.2007, 01:19
Вопрос задал: Maxim V.G. (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Mitya86
Здравствуйте, Maxim V.G.!

перегрузка оператора часто используется, например, при написании классов, когда какое-либо действие над объектом класса идеально подходит под значение данного оператора. Возьмем классический пример класса комплексных чисел. Конечно можно для суммирования значений двух объектов этого класса(суть двух комплексных чисел) написать метод complex summ(complex a, complex b), но ведь гораздо удобнее проще и нагляднее перегрузить оператор + для класса complex и пользоваться на здоровье.
Ответ отправил: Mitya86 (статус: 2-ой класс)
Ответ отправлен: 02.02.2007, 01:28
Оценка за ответ: 5
Комментарий оценки:
удобнее проще и нагляднее - это смотря для кого. Для меня проще понятнее и нагляднее будет написать метод complex summ(complex a, complex b) который будет складывать. Я понял что operator[] это если нет времени на написание. Однако по примеру Microsofta (чето навоял, а потом дыры латать) писать программы не люблю. Если и что-то пишу то на 30 раз проверю как работает. Вобщем всем по 4

Отвечает: kool
Здравствуйте, Maxim V.G.!
Это для удобства.
Чтобы не писать дополнительный текст да и сам
текст становится понятнее.
Удачи!
Ответ отправил: kool (статус: 6-ой класс)
Ответ отправлен: 02.02.2007, 07:45
Оценка за ответ: 4
Комментарий оценки:
Если текст написал сам то он всегда будет понятен (я по крайней мере всегда свой текст понимаю), а для других никогда не пишу. Но в случае когда другие захотят мой текст почитать то понимание зависит от желание разобраться в тексте. Всегда можно пошагово пройтись и понять что к чему!

Отвечает: Jadd
Здравствуйте, Maxim V.G.!
Например для того, чтобы обеспечить выполнение операторов в тех классах, для которых нету операций подобного типа. Допустим, у Вас есть некий класс CClass. Вы хотите сделать так, чтобы при записи myCClassVar1 + myCClassVar2 происходило именно сложение. В этом случае оператор + переопределяется и в теле функции происходит сложение тех членов класса, которые Вам нужны. Надеюсь, доступно изложил.

Успехов.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Профессионал)
Адрес: Санкт-Петербург
WWW: http://www.sport-diary.ru
----
Ответ отправлен: 02.02.2007, 08:11
Оценка за ответ: 3
Комментарий оценки:
Это всё можно описать в методе класа а параметрами передать указатель на myCClassVar1 и myCClassVar2

Отвечает: Ross
Здравствуйте, Maxim V.G.!

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

Приложение:

Ответ отправил: Ross (статус: 4-ый класс)
Ответ отправлен: 04.02.2007, 20:46
Оценка за ответ: 5
Комментарий оценки:
Как и обещал всё отлично спасибо за ответ 5+.

Отвечает: Thread
Здравствуйте, Maxim V.G.!
Переопределение опреаторов очень актуально в ООП. Есть сущности для которых использование некоторых операторов вполне естественно. Например для класса "вектор" вполне логично переопределить оператор сложения. Т.е. пусть a, b, c - экземпляры некоторого класса "вектор", и для него переопределены операторы +, =, тогда мы можем написать a = b + c. Конечно мы вполне можем обойтись без переопределения операторов. Тогда аналогичная запись могла бы выглядеть примерно так: a.SetValue(b.Plus(c)); Это будет делать то же самое, но согласитесь, что первый вариант намного более читабелен и естественен. Я в свое время учился перегружать операторы на написании класса "строка". Попробуйте и Вы написать его, если понадобиться, напишите мне адресс своей электронной почты и я вышлю вам свой вариант класса. (я там реализовал перегрузку +=, +, =, !=, ==, >=, <=, >, <)

Ответ отправил: Thread (статус: 3-ий класс)
Ответ отправлен: 05.02.2007, 16:00
Оценка за ответ: 5
Комментарий оценки:
Предположим что программа содержит 100 классов которые отвечают за выполнение разных задач (потоки, сеть, арифметические вычисления, интерфейс, базы данных, работа с файлами и пр. задачи).Рассмотрим алгоритм выполнения программы: инициализация программы->потоки->сетевые решения->база данных->интерфейс (визуализация, печать, сохранение результата в файл). При логичном подходе к ООП как минимум 70% классов будут содержать методы getvalue(...), setvalue(...), addvalue и т. п (каждая часть программы имеет начальные данные которые можно менять. Пишем это всё и используем перегрузку операторов, а на процессе отладки начнуться серьёзные пробелммы. Возникает очень серьёзная нагрузка на мозги (держать в голове где перегружен оператор +, +=, а где это просто арифметическое выражение и тут на помощ прийдут экземпляры типа имя_класса.п люс(параметры). Тогда не нужно держать в голове все классы и помнить где, что означает оператор "+". Мне кажется что чужой код неприятно читать как бы он не был написанный. Но если человек более или менее умеет писать программы то разобраться в коде можно как бы он не был написанный. Мораль: голова это не мусорный ящик что бы хранить всё что не лень и в больших проектах лучше нагляднее будет использовать foo.name_function(int_value).
P.$. Я задал самый обсждаемый вопрос в рассылке за последние пол года :). Уважаемые коллеги эксперты кто ещё не успел ответить на этот вопрос у вас есть ещё время!!!


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

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

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

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

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


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


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

В избранное