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

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


Информационный Канал Subscribe.Ru


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

Выпуск № 151
от 19.12.2002, 12:10

Администратор:
Имя: Nick.Box
URL: Информационный ресурс
ICQ: 365124
[censored], [censored]
О рассылке:
Задано вопросов: 450
Отправлено ответов: 987
Активность: 219.3 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Avl2k
Статус: Доверительный
Общий рейтинг: 128.16
[Подробней >>]
Jadd
Статус: Профессиональный
Общий рейтинг: 144.24
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 108.22
[Подробней >>]
 
PL
Статус: Доверительный
Общий рейтинг: 116.4
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 442. Sdrastvuyte. Y zadaval voporos kak peregruzit operator new[]. Spasibo expertam "JADD" i &q... (ответов: 2)
Вопрос № 443. Доброе время суток, уважаемые эксперты. Читаю Страуструпа "Язык программирования С++. 3-е издан... (ответов: 4)

Вопросов: 2, ответов: 6


 Вопрос № 442

Sdrastvuyte.
Y zadaval voporos kak peregruzit operator new[].
Spasibo expertam "JADD" i "AV1k". No u mne nado eto v BC31
a tam ne rabotaet takaya zapis.
Compilator pishet
"Not an allowed type"
i
"Operator must be declared as function"
esli nelsa peregrusit v etom compilatore, esli net ne budu vas dostavat.
Spasibo.


Приложение:


Вопрос отправлен: 15.12.2002, 11:31
Отправитель: Sasha (felistovichs@rambler.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Avl2k

Приветствую Вас, Sasha!
Похоже компилятор в BC++ 3.1 еще не поддерживает перегрузку этого оператора, но с этим ничего не поделаешь :( Могу посоветовать завести свой allocator и выделять/удалять память с помощью неких его функций (если конечно выделение памяти полностью контролируется Вашим кодом) или перейти на другой компилятор, например VC++ (версии >= 5.0) :)
C уважением, Avl2k.

Ответ отправлен: 15.12.2002, 14:10
Отправитель: Avl2k


Отвечает Jadd

Добрый день, Sasha!
В примере я уже вижу ошибки. Если они и в тексте, то все понятно. Пример, который я прислал раньше, я пробовал на BC 4.5 при подготовке к сертификации и все работало. Я не помню всех нюансов BC 3.1. Уж извини.

Ответ отправлен: 16.12.2002, 05:08
Отправитель: Jadd


 Вопрос № 443

Доброе время суток, уважаемые эксперты.
Читаю Страуструпа "Язык программирования С++. 3-е издание" наткнулся на следующий код
(привожу выдержку из книги стр.79):
*******************************************************
template void copy(In from, In too_far, Out to)
{
while (from != too_far) {
*to = *from // копируем элемент, на который указывает итератор
++to; // следующий выходной элемент
++from; // следующий входной элемент
}
}
Приведенный пример копирует любой контейнер, для которого мы можем определить
итераторы с подходящим синтаксисом и семантикой.
char vcl [200], // массив из 200 символов
char vc2 [500], // массив из 500 символов
void f()
{
copy{&vcl[0],&vcl[200],&vc2[0])
}
************************************************
Может надо было так:
template void copy(In* from, In* too_far, Out* to)
{
...
}
помогите разобраться.
Заранее благодарен, carbonoid.
>C=C<



Вопрос отправлен: 16.12.2002, 11:58
Отправитель: carbonoid

[Следующий вопрос >>] [Список вопросов]

Отвечает Avl2k

Приветствую Вас, carbonoid!
У Страуструпа все правильно написано. Практически вся STL написана в терминах итераторов, т.е. классов, позволяющих итерироваться по контейнерам. Итераторы разделены на категории (например, направленные вперед, двунаправленные или произвольного доступа), и относительно них приняты некоторые соглашения (т.е. что делает *, ++, -- и т.д.).
Для большинства контейнеров итераторы не просто указатели, а прямо-таки целые вспомогательные классы, а операторы ++ и -- могут выполнять некую _нетривиальную_ работу (а не только прибавление sizeof некоторого типа, как для указателей).
В случае же с char*
template void copy(In from, In too_far, Out to) раскрывается в void copy(char* from, char* too_far, char* to) и все сводится к работе с указателями, сравните с
vector c1;
list c2;
c1.push_back( 1 );
c1.push_back( 2 );
c1.push_back( 3 );
copy( c1.begin(), c1.end(), back_inserter( c2 ) ); // копирует с1 в c2
copy( c1.begin(), c1.end(), ostream_iterator( cout, " " ) ); // выводит c1 в cout
C уважением, Avl2k.

Ответ отправлен: 16.12.2002, 15:30
Отправитель: Avl2k


Отвечает vitya

Добрый день, carbonoid!
Все верно.
Заметь, что проиходит во время копирования массива - после того, как код откомпилируется у тебя будет
char * in;
char * to;
char * too_far;
while (in != too_far)
{
*to = *in;
++in;
}
*from = vcl[0];
*too_far = vcl[200] - то есть следующий элемент за концом массива.
ну а to указывает на начало следующего массива.
то есть получается то что надо.
Если же написать код, как ты - то будет
char ** from; и т.д., что не верно.

Ответ отправлен: 17.12.2002, 15:25
Отправитель: vitya


Отвечает PL

Добрый день, carbonoid!
Конечно нужно передовать указатели, а не объекты.
При передачи объектов на
*to = *from;
Тебе выдаст ошибку о неправильном направлении использования оператора *
А если to и from указатели, то эта строка действительно копирует объект лежащий по адрессу на который указывает from и помещает адресс копии в указатель to.

Ответ отправлен: 16.12.2002, 15:19
Отправитель: PL


Отвечает Jadd

Добрый день, carbonoid!
Хехе. Примеры из книг на то и примеры из книг, чтобы не работать. Я часто сталкивался с такими траблами, когда были допущены ошибки либо автором, либо издательством. Подумаешь лишний амперсанд выкинули. Ты смотри на выходные результаты в книге и сам пробуй, вместо того, чтобы сюда писать. Так ты сам станешь Гуру гораздо быстрее.

Ответ отправлен: 17.12.2002, 03:19
Отправитель: Jadd



Форма отправки вопроса

Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


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


Получить ответов:


 Выбор рассылки

Программисту
Assembler (39)
C / C++ (30)
Perl (5)
Delphi (21)
Pascal (24)
Basic / VBA (10)
Java / JavaScript (6)
PHP (4)
MySQL / MSSQL (5)
Пользователю
Windows 95/98/Me (32)
Windows NT/2000/XP (25)
"Железо" (33)
Поиск информации (14)
Администратору
Windows NT/2000/XP (9)
Linux / Unix (14)
Юристу
Гражданское право (8)
Семейное право (3)
Трудовое право (5)
КоАП (2)

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




Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное