Zefick
> Чисто в образовательный целях посмотри как это сделано в том же C#. Не уверен,
> что в VB они присутствуют, но там тоже никаких проблем без кривых приведений
> нет.
Так там тип аргумента строго указывается, а вот в Си передаваемый тип параметра может быть абсолютно любым !
Даже здесь старый добрый Си на голову выше всяких новомодных C# !
Да и кривые приведения бывают только у криворуких программистов =)
Anika
> Так там тип аргумента строго
Особенно когда он Object. Ну до того строго, я прям не могу.
> а вот в Си передаваемый тип параметра может быть абсолютно любым
И у тебя даже нет способа без дополнительной информации узнать тип аргумента. Поэтому кроме как в printf списки аргументов больше нигде не используются.
> Даже здесь старый добрый Си на голову выше всяких новомодных C# !
После того, как я показал, в чём фейл, можешь забыть про эту фразу :)
wstring Name; DWORD size = sizeof(Name); GetUserName( ( LPWSTR)&Name,&size); MessageBox( 0,( LPWSTR)&Name,L"dsd",MB_OK);
Вот так все работает.Токо в режиме дебаг пишет нарушение прав доступа а так все норм.
mothik
Ну вот. Страница 106. "Локальные переменные". Ты говорил что читал. Тогда ответь попробуй сам - что не так в твоём коде?
Там на следующей странице приведен код ,где создается локальная переменная ей привсваевается значение параметра перемноженного и возврашаестя локальная переменнаяя и все работает.
Smothik
> Вот так все работает.
Код неверный. Надо примерно так:
void GetUserName( wstring & snm ){ snm = L"the name"; } int main(){ wstring name; GetUserName( name ); MessageBoxW(0, name.c_str(), L"dsd", MB_OK ); }
Вы определенно не понимаете касты в с++ и то, как объекты размещаются в памяти.
> возврашаестя локальная переменнаяя и все работает.
Опять непонимание. Есть разница между возвратом ссылки на локальные данные функции и возвратом копии.
Читать надо внимательно, а не пролистывать. Не хотите - пишите на шарпе.
Как я понимаю копия это принимаемые значения а что такое ссылка я не знаю.
А что там знать каждая переменная этоячейка в памяти с определеннм размером.
Есть разница между возвратом ссылки на локальные данные функции и возвратом копии.
Я разве возвращаю ссылу на объект?Если да то где?
Smothik
Тут:
http://www.gamedev.ru/code/forum/?id=162301&page=2#m24
По коду №2:
wstring Name; DWORD size = sizeof(Name); // 1 GetUserName( ( LPWSTR)&Name,&size); // 2 MessageBox( 0,( LPWSTR)&Name,L"dsd",MB_OK);
Неистовая чушь. wstring обычно - это тупо 3 указателя на символы в куче.
На самом деле, в строке (1) вы получите 12, потом в строке (2) запишете имя пользователя поверх этих трех указателей и дальше в стек ( вместо того, чтобы писать username в символы, которые лежат в куче ).
А "работает", то есть выводит сообщение оно только потому, что username уместился в стеке.
Код неверен, т.к. вы портите внутренности wstring, вследствие чего происходит утечка памяти.
Во вторых, код потенциально портит данные на стеке, из-за чего программа может рухнуть в самый неожиданный момент.
Хватит программировать подбором. Надо четко понимать, что происходит в коде, который вы написали ( и который скопировали тоже ). C/С++ жестоко карает тех, кто программирует подбором по принципу "работает же".
Изучите сначала теорию: размещение объектов в стеке (автоматическая память в терминологии с++), использование std::string / std::wstring.
Нет необходимости постоянно конвертить из char* в wchar_t*. Сразу храните в wstring.
Короче, вот код на Java:
String name = JOptionPane.showInputDialog("Введите имя"); JOptionPane.showMessageDialog(null, name, "dsd", JOptionPane.INFORMATION_MESSAGE);
Делает что треубется - спрашивает у пользователя ввод и показывает сообщение с кастомным заголовком и текстом. Никаких лишних типов и приведений, никаких заморочек с памятью, никаких крестокостылей. Поддерживается юникод, а значит кроссъязыковость, из коробки.
Zefick
> Никаких лишних типов и приведений, никаких заморочек с памятью, никаких
> крестокостылей.
...и никакой работы мозгом, никакого понимания процесса, "но ведь оно же работает".
Нельзя считать язык проблемным, если новичок совершает глупые ошибки — это нормально.
А вот если язык ограждает программиста всеми правдами и неправдами от его собственной глупости — это неправильно, это должно быть в самом человеке, а не в инструменте, которым он пользуется.
AngelOfDeath
> ...и никакой работы мозгом, никакого понимания процесса, "но ведь оно же работает".
Ну если так трудно включить мозг и понять как оно работает, то я просто не знаю, что Вам дальше делать :) Могу только посочувствовать.
> А вот если язык ограждает программиста всеми правдами и неправдами от его
> собственной глупости — это неправильно, это должно быть в самом человеке, а не
> в инструменте, которым он пользуется.
Перила на лестницах точно придумали какие-то идиоты. Неправильно ограждать человека от его собственной неуклюжести когда он спускается по скользким ступенькам. Раз такой умный, пиши на ассемблере, но других на свои грибы зачем подсаживать?
AngelOfDeath
> А вот если язык ограждает программиста всеми правдами и неправдами от его
> собственной глупости — это неправильно,
это называется ЯВУ.
Это мешать человеку выразить его корректную идею неправильно.
> это должно быть в самом человеке, а не в инструменте, которым он пользуется.
так после рантайм/компайл-тайм ошибок оно и будет, тогда новичок поймет, что это не работает и не будет так писать.
Если пускать все на самотек - новичок будет допускать ошибки и узнает о них нескоро. Разве это лучше? К тому же, даже те, кто знает об некоторых ошибках, все равно их допускают.
Инструмент должен помогать достигать цели, они для этого и создаются.
Что до отупения программистов - да, более удобный инструмент позволяет программисту не знать о некоторых ошибках.
Автору, судя по всему, религия не позволяет использовать кошерные std::string/wstring + .c_str(), он пишет на С (хотя сам считает иначе), а вы наезжаете на плюсы, несправедливо...
И вообще - то, что в языке есть какая-то возможность - это вовсе не значит что надо бездумно её использовать, тем более что она не рекомендована к использованию всеми более-менее разумными людьми.
С++ - это как очень острый нож, можно покалечиться, а можно создавать шедевры, всё зависит от кривизны рук/опыта программиста.
Methos
> Что до отупения программистов - да, более удобный инструмент позволяет
> программисту не знать о некоторых ошибках.
это как с тупым ножом - порезаться сложно, а писать красивее ещё сложнее
Правка: автору: С-style cast - не есть хорошо, не надо его совать везде и всюду
AngelOfDeath
> С++ - это как очень острый нож, можно покалечиться, а можно создавать шедевры,
> всё зависит от кривизны рук/опыта программиста.
Почти то же самое можно сказать про любой язык:
Visual Basic - можно лепить кулучики в песочнице, а можно создавать шедевры.
Delphy - можно накидывать на форму компонетны, а можно создавать шедевры.
Java - можно создавать шедевры, а можно и не создавать :)
Так что любители челленджей найдут себе занятие везде. Другое дело, что некоторые просто упарываются самим языком и никаких шедевнов создать не могут и не хотят и зачем-то подсаживают на инструмент, где это по всем оценкам сделать сложнее.
Плюсы несомненно сложнее чем Java/C#/Delphi/etc., но и возможности/целевая аудитория/области применения у него другие. Если человеку нужен именно С++, то пусть изучает, не надо ему мешать, если не можете помочь.
И вообще, уважаемый Zefick хватит холиваров, не нравится — не ешь, а другим не мешай.
Кстати ответов по теме уже дано достаточно, так что её пора закрывать, пока во флейм не переместили.
Тема в архиве.