Войти
ПрограммированиеФорумОбщее

Проблемы с строками (5 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#60
0:45, 12 июня 2012

Zefick
> Чисто в образовательный целях посмотри как это сделано в том же C#. Не уверен,
> что в VB они присутствуют, но там тоже никаких проблем без кривых приведений
> нет.
Так там тип аргумента строго указывается, а вот в Си передаваемый тип параметра может быть абсолютно любым !
Даже здесь старый добрый Си на голову выше всяких новомодных C# !
Да и кривые приведения бывают только у криворуких программистов =)

#61
9:43, 12 июня 2012

Anika
> Так там тип аргумента строго
  Особенно когда он Object. Ну до того строго, я прям не могу.

> а вот в Си передаваемый тип параметра может быть абсолютно любым
  И у тебя даже нет способа без дополнительной информации узнать тип аргумента. Поэтому кроме как в printf списки аргументов больше нигде не используются.

> Даже здесь старый добрый Си на голову выше всяких новомодных C# !
  После того, как я показал, в чём фейл, можешь забыть про эту фразу :)

#62
18:58, 12 июня 2012
wstring Name;
  DWORD size = sizeof(Name);
  GetUserName((LPWSTR)&Name,&size);
  MessageBox(0,(LPWSTR)&Name,L"dsd",MB_OK);

Вот так все работает.Токо в режиме дебаг пишет нарушение прав доступа а так все норм.

#63
19:14, 12 июня 2012

mothik

Ну вот. Страница 106. "Локальные переменные". Ты говорил что читал. Тогда ответь попробуй сам - что не так в твоём коде?

Там на следующей странице приведен код ,где создается локальная переменная ей привсваевается значение параметра перемноженного и возврашаестя локальная переменнаяя и все работает.

#64
19:59, 12 июня 2012

Smothik
> Вот так все работает.
Код неверный. Надо примерно так:

void GetUserName( wstring & snm ){
   snm = L"the name";
}

int main(){
  wstring name;
  GetUserName( name );
  MessageBoxW(0, name.c_str(), L"dsd", MB_OK );
}

Вы определенно не понимаете касты в с++ и то, как объекты размещаются в памяти.

> возврашаестя локальная переменнаяя и все работает.
Опять непонимание. Есть разница между возвратом ссылки на локальные данные функции и возвратом копии.

Читать  надо внимательно, а не пролистывать. Не хотите  - пишите на шарпе.

#65
22:09, 12 июня 2012

Как я понимаю копия это принимаемые значения а что такое ссылка я не знаю.
А что там знать каждая переменная этоячейка в памяти с определеннм размером.

#66
22:43, 12 июня 2012
Есть разница между возвратом ссылки на локальные данные функции и возвратом копии.

Я разве возвращаю ссылу на объект?Если да то где?

#67
0:39, 13 июня 2012

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.

#68
7:18, 13 июня 2012

  Короче, вот код на Java:

    String name =  JOptionPane.showInputDialog("Введите имя");
    JOptionPane.showMessageDialog(null, name, "dsd", JOptionPane.INFORMATION_MESSAGE);

Делает что треубется - спрашивает у пользователя ввод и показывает сообщение с кастомным заголовком и текстом. Никаких лишних типов и приведений, никаких заморочек с памятью, никаких крестокостылей. Поддерживается юникод, а значит кроссъязыковость, из коробки.

#69
18:53, 13 июня 2012

Zefick
> Никаких лишних типов и приведений, никаких заморочек с памятью, никаких
> крестокостылей.
...и никакой работы мозгом, никакого понимания процесса, "но ведь оно же работает".
Нельзя считать язык проблемным, если новичок совершает глупые ошибки — это нормально.
А вот если язык ограждает программиста всеми правдами и неправдами от его собственной глупости — это неправильно, это должно быть в самом человеке, а не в инструменте, которым он пользуется.

#70
19:48, 13 июня 2012

AngelOfDeath
> ...и никакой работы мозгом, никакого понимания процесса, "но ведь оно же работает".
  Ну если так трудно включить мозг и понять как оно работает, то я просто не знаю, что Вам дальше делать :) Могу только посочувствовать.

> А вот если язык ограждает программиста всеми правдами и неправдами от его
> собственной глупости — это неправильно, это должно быть в самом человеке, а не
> в инструменте, которым он пользуется.
  Перила на лестницах точно придумали какие-то идиоты. Неправильно ограждать человека от его собственной неуклюжести когда он спускается по скользким ступенькам. Раз такой умный, пиши на ассемблере, но других на свои грибы зачем подсаживать?

#71
19:51, 13 июня 2012

AngelOfDeath
> А вот если язык ограждает программиста всеми правдами и неправдами от его
> собственной глупости — это неправильно,
это называется ЯВУ.
Это мешать человеку выразить его корректную идею неправильно.

> это должно быть в самом человеке, а не в инструменте, которым он пользуется.
так после рантайм/компайл-тайм ошибок оно и будет, тогда новичок поймет, что это не работает и не будет так писать.
Если пускать все на самотек - новичок будет допускать ошибки и узнает о них нескоро. Разве это лучше? К тому же, даже те, кто знает об некоторых ошибках, все равно их допускают.
Инструмент должен помогать достигать цели, они для этого и создаются.
Что до отупения программистов - да, более удобный инструмент позволяет программисту не знать о некоторых ошибках.

#72
21:19, 13 июня 2012

Автору, судя по всему, религия не позволяет использовать кошерные std::string/wstring + .c_str(), он пишет на С (хотя сам считает иначе), а вы наезжаете на плюсы, несправедливо...
И вообще - то, что в языке есть какая-то возможность - это вовсе не значит что надо бездумно её использовать, тем более что она не рекомендована к использованию всеми более-менее разумными людьми.
С++ - это как очень острый нож, можно покалечиться, а можно создавать шедевры, всё зависит от кривизны рук/опыта программиста.
Methos
> Что до отупения программистов - да, более удобный инструмент позволяет
> программисту не знать о некоторых ошибках.
это как с тупым ножом - порезаться сложно, а писать красивее ещё сложнее
Правка: автору: С-style cast - не есть хорошо, не надо его совать везде и всюду

#73
21:31, 13 июня 2012

AngelOfDeath
> С++ - это как очень острый нож, можно покалечиться, а можно создавать шедевры,
> всё зависит от кривизны рук/опыта программиста.
  Почти то же самое можно сказать про любой язык:
Visual Basic - можно лепить кулучики в песочнице, а можно создавать шедевры.
Delphy - можно накидывать на форму компонетны, а можно создавать шедевры.
Java - можно создавать шедевры, а можно и не создавать :)
  Так что любители челленджей найдут себе занятие везде. Другое дело, что некоторые просто упарываются самим языком и никаких шедевнов создать не могут и не хотят и зачем-то подсаживают на инструмент, где это по всем оценкам сделать сложнее.

#74
10:19, 14 июня 2012

Плюсы несомненно сложнее чем Java/C#/Delphi/etc., но и возможности/целевая аудитория/области применения у него другие. Если человеку нужен именно С++, то пусть изучает, не надо ему мешать, если не можете помочь.
И вообще, уважаемый Zefick хватит холиваров, не нравится — не ешь, а другим не мешай.
Кстати ответов по теме уже дано достаточно, так что её пора закрывать, пока во флейм не переместили.

Страницы: 1 2 3 4 5 6 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.