Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Qraizer
Дата сообщения: 21.02.2007 17:36
Labutin
veronica b
А какая разница, cin или scanf? Читаем в строку и парсим.

Добавлено:
RedLord
Однозначно ambiguous call. В обоих случаях имеет место преобразования одинакового уровня предпочтения - пользовательское.
Автор: veronica b
Дата сообщения: 21.02.2007 17:48
Qraizer

Цитата:
А какая разница, cin или scanf? Читаем в строку и парсим.

Человек хочет cin/
RedLord
Мое мнение, что Qraizer прав, а разработчики Intel C++ 8.1 ошиблись!


Автор: RedLord
Дата сообщения: 21.02.2007 18:41
Qraizer
veronica b

Тогда почему


struct Dummy
{
};
struct B
{
    operator short()
    {
        return 1;
    }    
    operator Dummy()
    {
        return Dummy();
    }    
};


void test(int) // (1)
{
    
}

void test(Dummy) // (2)
{
    
}

int main()
{
    B x;
    test(x);
    return 0;
}

Разрешение перегрузки

для test(1)
1. определяемое пользователем преобразование B -> short
2. продвижение short->int

для test(2)
1. определяемое пользователем преобразование B -> Dummy



MS VC++ 6.0 SP6 - ok, test(2)
MC VC++ 2003 (7.1) - ok, test(2)
MC VC++ 2005 (8.0) - ok, test(2)

Мы имеем на этапе 1 преобразования одинакового уровня предпочтения - пользовательское,
но цепочка для случая (2) короче. А это тоже учитывается. Если же заменить
operator short() на operator int() - то действительно неопределенность,
т.к. для случая (1) уходит продвижение.
Автор: IUnknown777
Дата сообщения: 21.02.2007 18:48
Здравствуйте!
У меня возникла такая проблема.
Мне нужно архивировать файлы из командной строки.
Я пользуюсь rar.exe из папки winrar,
но он не понимает длинные имена файлов.(Documents and Settings)
Что можно сделать?
Автор: Labutin
Дата сообщения: 21.02.2007 18:53
veronica b

Цитата:
Хорошо, я вечером посмотрю в книгах и завтра по утряне дам вам ответ, устраивает?

Конечно.
Автор: SaDFromSpb
Дата сообщения: 21.02.2007 20:53
<удалено>

Добавлено:
RedLord

Цитата:
MS VC++ 6.0 SP6 - ok, test(2)
MC VC++ 2003 (7.1) - ok, test(2)
MC VC++ 2005 (8.0) - ok, test(2)

Однобокие компиллеры во втором случае =)... А Comeau и остальные ?
Автор: blackdevil
Дата сообщения: 21.02.2007 21:43
Ребята, у меня очень важный вопрос к Вам!!! На лекциях я через каждые пол слова от преподавателя слышу стек да стек, а кроме того что это какая-то область памяти я ничего про него не знаю! Где можно почитать материалы о "физических принципах" работы компьютера? Хотелось бы узнать в общих чертах что и как работает, но главное - КАК УСТРОЕНА ПАМЯТЬ!? Еще хотелось бы узнать побольше про бинарную систему счисления. Если знаете литературу попроще (можно и для чайников) подскажите пожалуйста!!! Отдельное спасибо тем кто устроит краткий ликбез прямо тут )
Автор: RedLord
Дата сообщения: 21.02.2007 22:12
SaDFromSpb


Цитата:
А Comeau и остальные ?


Intel C++ 8.1 - ok, call test(2)
Comeau online test - fail, ambiguous call

Похоже мелкомягкие компилеры действительно однобоки.

Но Intel в обоих случаях пропускает, Comeau - нет.
вопрос кто из них прав (вернее "правильнее" интерпретирует стандарт)
Автор: javaner
Дата сообщения: 21.02.2007 23:08
вопрос по С++, нужно узнатъ GUID TCP/IP service провайдера на компе, для запуска игры DirectX(Lobby application). я сам С# программер и на С++ нужно решит одну задачу. в С# есть удобная функция ToString() приемяняемая ко всем объектам. Есть на С++ что нить такое, ну чтоб выдать на экран? Спасибо заранее.
Автор: veronica b
Дата сообщения: 22.02.2007 08:04
Labutin, вотя вам обещал

Цитата:

#include <iostream.h>

int main()
{
    int num;

    while(1)
    {
        cout << "Enter integer number: ";
        cin >> num;

        if(cin.good())
        {
            cin.ignore(10,'\n');
            break;
        }

        cin.clear();
        cout << "Invalid entered number\n";
        cin.ignore(10,'\n');
    }

    cout << "Entered valid number: " << num << endl;

    return 0;
}


Используя функцию cin.ignore(10,'\n') мы пропускаем максиум 10 символов, до симола '\n'. Остольное, я думаю, вам будет понятно.

blackdevil

Цитата:
Отдельное спасибо тем кто устроит краткий ликбез прямо тут )

Ну, вы должны понять, что это невозможно. Вот вам ссылка, сдесь вы найдете свои ответы.
http://forum.ru-board.com/topic.cgi?forum=93&topic=0563&start=0#lt
Автор: Sarge1978
Дата сообщения: 22.02.2007 10:14
NNS
Читаем МСДН:
virtual BOOL OnCommand
(
WPARAM wParam,
LPARAM lParam
);
В LOWORD(wParam) находится id элемента, акселератора или пункта меню.
В HIWORD(wParam) находится код действия (для меню 1, иначе 0).
В lParam находится hwnd элемента (для меню или аксел-ра 0).
В самой функции получаешь LPARAM и WPARAM.

По большому счету можно и OnCommandRange использовать. Но это не есть гут. Все равно придется резервировать IDшники и их обрабатывать. В цикле создаешь Create-ом чекбоксы из диапазона ID и в функции обрабатываешь свичом эти ID... Для этого нужно знать их примерное количество.
Автор: Labutin
Дата сообщения: 22.02.2007 10:33
veronica b
Огромное спасибо. Практически то, что нужно. Только вот если ввести, например, "1aa" (сначала цифры, потом символы), то ввод воспримется нормально. Хотелось бы и такие вещи отсекать.
Автор: Sarge1978
Дата сообщения: 22.02.2007 11:54
Можно ли менять вид окна Properties (MFC)? Например, кнопка Help у меня должна находиться не справа, а слева?

Придумал. Унаследовавшись от CPropertySheet:

[more]

BOOL CMyPropertySheet::OnInitDialog()
{
BOOL bResult = __super::OnInitDialog();

CRect rButton;
GetDlgItem(IDCANCEL)->GetWindowRect(&rButton); // положение уже существующей стандартной кнопки Cancel
ScreenToClient(&rButton);

rButton.SetRect(10, rButton.top, 10 + rButton.Height(), rButton.bottom);

m_btnHelp.Create(L"", WS_CHILD|WS_VISIBLE, rButton, this, ID_HELP);
m_btnHelp.SetIcon(CSize(16, 16), IDI_WINHELP);

return bResult;
}

[/more]
Автор: Qraizer
Дата сообщения: 22.02.2007 12:28
RedLord
На счёт второго примера. Не уверен, нужно заглянуть в стандарт, но ИМХО тут Comeau неправ. Второе пользовательское кастование даёт сразу нужный тип, а первое - нет, поэтому дальнейшее продвижение просто не рассматривается, и в результате остаётся всего один кандидат. Отличие от первого случая здесь в том, что оба пользовательских кастования объявлены в одной области видимости - классе B, поэтому перегрузки просто нет - кастование в short не рассматривается, ибо кастование в Dummy есть точное соответствие. В первом примере пользовательские кастования принадлежали разным областям видимости - одна в классе A, другая в B, поэтому рассматривалась именно перегрузка. Но ещё раз говорю, нужно свериться со стандартом.
Сам подумай, а если у меня в классе перегружаются и operator short(), и operator int(), они разве обязательно будут конфликтовать? А ведь второй из первого всегда можно получить продвижением.
Автор: RedLord
Дата сообщения: 22.02.2007 15:31
Qraizer



Цитата:

в классе перегружаются и operator short(), и operator int(), они разве обязательно будут конфликтовать? А ведь второй из первого всегда можно получить продвижением.


operator short(), и operator int() не будут конфликтовать. они будут вызывать неоднозначность перегрузки в некоторых случаях

struct B
{
    operator short()
    {
        return 1;
    }    
    operator int()
    {
        return 0;
    }    
};

void test(int) // (1)
{
}

void test(short) // (2)
{
    
}
int main()
{
    B x;
    test(x); // неоднозначность вызова
    return 0;
}

Автор: RedLord
Дата сообщения: 23.02.2007 00:43
Qraizer
Спасибо. Вопрос снят.
Comaeu в данном случае прав.
Автор: Qraizer
Дата сообщения: 23.02.2007 15:27
Стукни пунктом стандарта, плз. А то так руки и не дошли самому посмотреть...

Добавлено:

Цитата:
...они будут вызывать неоднозначность перегрузки в некоторых случаях...
Как раз это я и имел в виду. То, что ты тут написал - это неопределённость в чистейшем первородном виде. Даже я б не смог выбрать, не то что компилятор. В предыдущем примере было не так. Но... Если убрать одну из test(), вопроса от том, какой operator XXX() юзать, у компилятора не возникнет. Потому что будет точное соответствие. И следовательно перегрузки просто нет, ибо изначально всего один кандидат.
Поэтому я настаиваю на ошибочности поведения Comeau, пока стандарт меня не разубедит.
Автор: RedLord
Дата сообщения: 23.02.2007 16:40
Qraizer
я списался со Стивом Адамчиком("Mr. Overloading") из EDG

вот его ответ по первому примеру:

The correct answer is "ambiguous call". Given two conversions that
involve different
user-defined conversion functions/constructors, there is no reason to
prefer one over the other.

и длина цепочки не учитывается. она начала бы играть роль например в таком случае
B->A->int
B->A
а у меня было пользовательское преобразование
B -> short
B-> A
и выходит - неопределенность. и не имеет значения,что цепочки разной длины (на этом я и провалился). в стандарте это пункт §13.2.2.2/3


Добавлено:
и для второго примера имеем два пользовательских преобразования с различными типами.
B -> short
B -> Dummy
и выходит, что этого достаточно, для неопределенности. и не важно точное соотвествие или нет

Добавлено:

здесь hххp://tinyurl.com/502f лежит объяснение сильного хода Александреску, основанного на перегрузке. думаю, это тоже интересно будет почитать
Автор: SaDFromSpb
Дата сообщения: 23.02.2007 17:18
RedLord
Меня заинтересовал EDG. Только я не совсем точно понял, чем они занимаются.
Создают какой-то офигенно крутой препроцессор для исходников, который могут использовать создатели компиляторов?
Автор: RedLord
Дата сообщения: 23.02.2007 17:25
SaDFromSpb

hxxp://www.edg.com/
не совсем препроцессор. скорее инструмент, переваривающий исходный код и предоставляющий его в виде некоторых внутренних структур, из которых компилятор и генерит бинарный код.

Автор: SaDFromSpb
Дата сообщения: 24.02.2007 02:01
RedLord

Цитата:
hxxp://www.edg.com/

Ну я как раз там и пытался прочитать =)


Цитата:
скорее инструмент, переваривающий исходный код и предоставляющий его в виде некоторых внутренних структур, из которых компилятор и генерит бинарный код.

И эти "внутренние структуры" получаются полностью соответсвующими стандарту. При том, что исходный код ему не соответствовал. Так что ли?
Автор: Qraizer
Дата сообщения: 26.02.2007 12:57
RedLord
Убедил. Адамчик не стандарт, но ему я доверяю. Вот если б он пункт стандарта указал... Но это я уже придираюсь
Однако... Раз уж ты с ним на короткой ноге, попроси его объяснить, почему Intel C++ и Comeau используют их родимый фронтэнд, а результаты у них разные. И заодно, почему первый до сих пор не держит экспорт под виндами. Они там Интелу лицензии режут, что ли?
Интересная ссыска, кстати. А теперь "внимание, вопрос" © Ворошилов: чем кардинально отличается этот случай от твоего второго примера?
SaDFromSpb
Это называется не препроцессор, а fron-end compiler. В отличие от "самостоятельного" комплекта, в который как минимум входят компилятор и компоновщик, они предоставляют только компилятор, результатами компиляции которого являются исходники на стандартном C. Они уже дальше могут любым C компилятором/компоновщиком доводиться до объектных/исполняемых модулей. Весьма востребованная ниша, особенно для поставщиков средств разработки для встроенных систем. Вон, даже Intel ею пользуется, т.к. постоянно следить за развитием C++ им не улыбается, а однажды написав C-компилятор и время от времени дописывая к нему back-end оптимизатор для новых процессоров, они с помощью этого front-end-а всегда на переднем крае соответствия стандарту C++.
Автор: RedLord
Дата сообщения: 26.02.2007 13:58
Qraizer

Цитата:
Раз уж ты с ним на короткой ноге

отнюдь. писал ему впервые и абсолютно не расчитывал получить ответ.


Цитата:
Вон, даже Intel ею пользуется, т.к. постоянно следить за развитием C++ им не улыбается

ага, учитывая, что как минимум трое из четырех разработчиков EDG "подрабатывают"над разработкой стандарта (как у Хазанова: "я и участник конкурса и председатель жюри")


Цитата:
почему Intel C++ и Comeau используют их родимый фронтэн

попробую отписать в саппорт Intel - посмотрим что скажут (если вообще чего-то скажут)


Цитата:
чем кардинально отличается этот случай от твоего второго примера?


наличием const. при рассмотрении мемберов ( я об этом-то и забыл) участвует первым неявным аргументом ссылка на тип класса

operator A() const - формально operator A(const С&)
operator B() - формально operator B(С&)

поскольку вызов не константный:
C c;
f(c);

выберется operator B(), т.к. для второго оператора нужно неявный аргумент свести к const
А дальше как раз и учитывается длина цепочки


Добавлено:
Qraizer

дополню:

operator short() - формально operator short(B&)
operator Dummy() - формально operator Dummy(B&)

неоднозначность по неявному аргументу, а возвращаемые типы в перегрузке не участвуют и дело до анализа цепочек не доходит.
Автор: Qraizer
Дата сообщения: 27.02.2007 10:06
Это-то понятно. Я всего лишь высказал предположение, что комплятору в подобной ситуации хватит найти "прямой" маршрут, и если он единственный, другие не рассматривать, потому и нет перегрузки. Потому и не был убеждён, что все не правы, кроме Comeau. Был не прав.

P.S. Однако в стандарт заглянуть не помешает-таки.
Автор: RedLord
Дата сообщения: 27.02.2007 10:49
Qraizer

Цитата:
в подобной ситуации хватит найти "прямой" маршрут

мои мысли были примерно такими же. но стандарт думает по другому. в очередной раз -
Автор: Aquest
Дата сообщения: 27.02.2007 13:05
При копировании кода программы из Borland С++ Builder 6 в Microsoft Visual C++ 6.0
при компиляции выдается ошибка:

fatal error C1083: Cannot open include file: 'vcl.h': No such file or directory
Error executing cl.exe.

В Borland С++ Builder 6 данная программа работала.
Как сделать ее работоспособной в Microsoft Visual C++ 6.0 ?
Автор: RedLord
Дата сообщения: 27.02.2007 13:18
Aquest
где-то есть #include "vcl.h" или <vcl.h>. поробуй закомментить
когда уберешь include, функционал который объявлен/определен в vcl.h
умрет
Автор: CrackMe
Дата сообщения: 27.02.2007 20:17
Извините, может уже задавалось такое, но 60 страниц читать не в силах
Вопрос:
Имееться простейшая консольная программа(пример из книжки):

Код:

#include<stdafx.h>
#include<iostream.h>
int main()
{
cout << "Hello there\n";
cout << "Here is 5:" << 5 << "\n";
cout << "The manipulator endl write a new line to the screen.";
cout <<
endl;
cout << "Here is a very big number:\t"<< 70000 << endl;
cout << "Here is the sum 8 and 5:\t"<< 8+5 << endl;
cout << "Here is a fraction \t\t"<< (float) 5/8 << endl;
cout << "And very very big number\t";
cout << "(double)\n 7000*7000" <<
endl;
cout <<"Dont forget to replace James Liberty with your name\n";
cout <<"%Your Name% is a c++ programmer\n";
return 0;
}
Автор: Zyava
Дата сообщения: 27.02.2007 20:41
[q]или так..


Код:
#include<iostream>
using namespace std;
Автор: CrackMe
Дата сообщения: 27.02.2007 21:02
Да я много проблему гуглил, пока ничего не помогло...а может у меня iostream.h битый?

Добавлено:
или может влияет то что я не поставил галочку Empty project (не пустой) т.к. непонимаю что надо нажать что-бы появилось окно где вводить код..

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.