C++ Вопрос Упрощение вывода символов

Everage C++ Enjoyer
Пользователь
Статус
Оффлайн
Регистрация
5 Янв 2018
Сообщения
162
Реакции[?]
50
Поинты[?]
3K
Недавно начал изучать с++, прошел тему переменных
Написал небольшой код
Вопрос: можно ли упростить вывод символов char, вместо того чтобы писать Name_one = 'П'; Name_two = 'а' и т.д, можно ли написать это в одну переменную?

C++:
// включение стандартной библиотеки
#include <iostream>
// используемое пространство времен
using namespace std;

// точка входа
void main()
{
    // установка символов латиницы
    setlocale(LC_ALL, "RUS");
    
    // переменная char для вывода символов
    char Name_one, Name_two, Name_three, Name_four, Name_five;
    // переменная int для числовых значений
    int Age, Iq;
    
    // чему = Age и Iq
        Age = 83; Iq = 117;
    // Чему равен выводимый символ
    Name_one = 'П'; Name_two = 'а'; Name_three = 'в'; Name_four = 'е'; Name_five = 'л';
    
    //вывод в консоль переменных и их данных
    cout << "Имя: " << Name_one << Name_two << Name_three << Name_four << Name_five << "\n" << "Возраст: " << Age << "\n" << "Интеллект: " << Iq << "\n" << endl;

    // переменная double для дробных чисел
    double drob = 1.2188;
    // вывод переменной double
    cout << "Решение мат.задачи: " << drob << endl;

    //переменная bool для согласен или несогласен
    bool a = true, b = false, c = true, d = true;
    // вывод резултатов переменной bool
    cout << "\nРезультаты тестирования: \n" << a << "\tA - согласен" << "\n" << b << "\tB - несогласен" << "\n" << c << "\tC - согласен" << "\n" << d << "\tD - согласен\n\n\n\n\n";
    // вывод финального сообщения
    cout << "Благодорим за участие в опросе!\n\n";

    // для создания окна в консоли
    system("pause");

}
Возможен говнокод, я только учусь так что не обращайте внимание
 
Легенда форума
Статус
Оффлайн
Регистрация
16 Сен 2018
Сообщения
4,002
Реакции[?]
1,946
Поинты[?]
7K
Вопрос: можно ли упростить вывод символов char, вместо того чтобы писать Name_one = 'П'; Name_two = 'а' и т.д, можно ли написать это в одну переменную?
C++:
const char* white_power = "White Power!";
std::cout << white_power << endl;
 
money++
Разработчик
Статус
Оффлайн
Регистрация
14 Июн 2018
Сообщения
638
Реакции[?]
339
Поинты[?]
22K
money++
Разработчик
Статус
Оффлайн
Регистрация
14 Июн 2018
Сообщения
638
Реакции[?]
339
Поинты[?]
22K
Почему это? std::string гораздо медленнее
Это абсолютно верное замечание, но в 2021 безопасность кода и время программиста уже куда важнее, чем скорость. Тем более правильное использование std::string (например заранее резервировать необходимое количество памяти перед конкатенированием кучи строк в одну) делает разницу в скорости еще менее заметной.

Да и в настоящих проектах нигде не видел const char* уже много лет. Или std::string, или всякие google::string и прочие похожие реализации (хотя насколько мне известно в том же гугле уже не настаивают на использовании google::string, вроде как STLевская реализация там тоже норм).

И опять таки - ты уже жертвуешь скоростью выбирая С++ вместо С. const char* это c-string, пишешь на плюсах - юзай STL.

Сейчас выгоднее арендовать сервер на 5% мощнее, чем постоянно страдать от undefined behaviour да и тратить лишнее время кодеров и тестеров
 
Участник
Статус
Оффлайн
Регистрация
29 Дек 2019
Сообщения
381
Реакции[?]
168
Поинты[?]
3K
Недавно начал изучать с++, прошел тему переменных
Написал небольшой код
Вопрос: можно ли упростить вывод символов char, вместо того чтобы писать Name_one = 'П'; Name_two = 'а' и т.д, можно ли написать это в одну переменную?

C++:
// включение стандартной библиотеки
#include <iostream>
// используемое пространство времен
using namespace std;

// точка входа
void main()
{
    // установка символов латиницы
    setlocale(LC_ALL, "RUS");
   
    // переменная char для вывода символов
    char Name_one, Name_two, Name_three, Name_four, Name_five;
    // переменная int для числовых значений
    int Age, Iq;
   
    // чему = Age и Iq
        Age = 83; Iq = 117;
    // Чему равен выводимый символ
    Name_one = 'П'; Name_two = 'а'; Name_three = 'в'; Name_four = 'е'; Name_five = 'л';
   
    //вывод в консоль переменных и их данных
    cout << "Имя: " << Name_one << Name_two << Name_three << Name_four << Name_five << "\n" << "Возраст: " << Age << "\n" << "Интеллект: " << Iq << "\n" << endl;

    // переменная double для дробных чисел
    double drob = 1.2188;
    // вывод переменной double
    cout << "Решение мат.задачи: " << drob << endl;

    //переменная bool для согласен или несогласен
    bool a = true, b = false, c = true, d = true;
    // вывод резултатов переменной bool
    cout << "\nРезультаты тестирования: \n" << a << "\tA - согласен" << "\n" << b << "\tB - несогласен" << "\n" << c << "\tC - согласен" << "\n" << d << "\tD - согласен\n\n\n\n\n";
    // вывод финального сообщения
    cout << "Благодорим за участие в опросе!\n\n";

    // для создания окна в консоли
    system("pause");

}
Возможен говнокод, я только учусь так что не обращайте внимание
ну если разбирать в случае с чар данными, юзают массив, например:
char word[] = "Привет";
компиляиор сам определит длину массива, добавит в конце \0
 
IRQL_APC_LEVEL
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2018
Сообщения
211
Реакции[?]
88
Поинты[?]
3K
Это абсолютно верное замечание, но в 2021 безопасность кода и время программиста уже куда важнее, чем скорость. Тем более правильное использование std::string (например заранее резервировать необходимое количество памяти перед конкатенированием кучи строк в одну) делает разницу в скорости еще менее заметной.

Да и в настоящих проектах нигде не видел const char* уже много лет. Или std::string, или всякие google::string и прочие похожие реализации (хотя насколько мне известно в том же гугле уже не настаивают на использовании google::string, вроде как STLевская реализация там тоже норм).

И опять таки - ты уже жертвуешь скоростью выбирая С++ вместо С. const char* это c-string, пишешь на плюсах - юзай STL.

Сейчас выгоднее арендовать сервер на 5% мощнее, чем постоянно страдать от undefined behaviour да и тратить лишнее время кодеров и тестеров
Всегда забавляли такие "кодеры". Ты, по сути, советуешь человеку-новичку пропустить огромный пласт знаний - работа с массивами, базовые знания о том, как устроена память в приложении и тд, ты действительно считаешь, что - это не нужно? И я не понимаю, а в какой сфере ты кодишь, если в чит сфере, то как ты давно мог не видеть LPCSTR aka const char*, возможно, что у тебя приложение использует только utf-16le, если так, то тогда я понимаю почему ты давно не видел LPCSTR (ибо там LPCWSTR), а иначе я не понимаю, как такое могло произойти. С таким же успехом можно говорить - а зачем мне уметь выполнять арифметические вычисления, ведь есть калькулятор.
 
Последнее редактирование:
Продавец
Статус
Оффлайн
Регистрация
28 Окт 2019
Сообщения
1,153
Реакции[?]
302
Поинты[?]
3K
Всегда забавляли такие "кодеры". Ты, по сути, советуешь человеку-новичку пропустить огромный пласт знаний - работа с массивами, базовые знания о том, как устроена память в приложении и тд, ты действительно считаешь, что - это не нужно? И я не понимаю, в какой сфере ты кодишь, если в чит сфере, то как ты давно мог не видеть LPCSTR aka const char*, возможно, что у тебя приложение использует только utf-16le, если так, то тогда я понимаю почему ты давно не видел LPCSTR (ибо там LPCWSTR), а иначе я не понимаю, как такое могло произойти. С таким же успехом можно говорить - а зачем мне уметь выполнять арифметические вычисления, ведь есть калькулятор.
А нахуя видеть это ?
Есть string и wstring и метод c_str()
 
money++
Разработчик
Статус
Оффлайн
Регистрация
14 Июн 2018
Сообщения
638
Реакции[?]
339
Поинты[?]
22K
Всегда забавляли такие "кодеры". Ты, по сути, советуешь человеку-новичку пропустить огромный пласт знаний - работа с массивами, базовые знания о том, как устроена память в приложении и тд, ты действительно считаешь, что - это не нужно? И я не понимаю, в какой сфере ты кодишь, если в чит сфере, то как ты давно мог не видеть LPCSTR aka const char*, возможно, что у тебя приложение использует только utf-16le, если так, то тогда я понимаю почему ты давно не видел LPCSTR, а иначе я не понимаю, как такое могло произойти.
Работа с массивами != работа с динамическими массивами. Уже давно не стоит использовать динамические массивы. std::array для массивов фиксированного размера, std::vector для динамических. Безопасность - есть, скорость - не сильно потерял.

Тем не менее пропускать работу с динамическими массивами действительно не стоит, но в 2021 куда правильнее учить так: абстрактное понятие "массив" -> реализации в виде std::array и std::vector -> понять как они работают изнутри. Ты же не изучаешь ассемблер перед тем как писать на плюсах? Тем не менее изучив плюсы достаточно глубоко и разобравшись с тем как работает АСМ ты будешь писать куда лучше, это факт.

Насчет сферы - человек пишет в С/С++ разделе, а не в разделе "Читы". Значит и советы соответственные. А так да, const char'ы есть много где в WinAPI. Вот только винапи та еще параша (сколько нервов я в него угробил) и явно не вяжется с "я начал изучать С++, только прошел тему про переменные". Я уж не говорю про то, что в чит-сфере char* это в первую очередь массив байтов и это лишь совпадение, что их так хранить удобно. Все винапи функции для работы с памятью все равно работают с указателями на void, а не lpcstrкучабуквкоторыепотомхердруготдругаотличишьспервоговзглядаеслионинерядомстоят.

Тем не менее если ТС учит читы конкретно для разработки читов то из плюсов ему нужно будет только ООП потом. Пускай учит С.
 
IRQL_APC_LEVEL
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2018
Сообщения
211
Реакции[?]
88
Поинты[?]
3K
Работа с массивами != работа с динамическими массивами. Уже давно не стоит использовать динамические массивы. std::array для массивов фиксированного размера, std::vector для динамических. Безопасность - есть, скорость - не сильно потерял.

Тем не менее пропускать работу с динамическими массивами действительно не стоит, но в 2021 куда правильнее учить так: абстрактное понятие "массив" -> реализации в виде std::array и std::vector -> понять как они работают изнутри. Ты же не изучаешь ассемблер перед тем как писать на плюсах? Тем не менее изучив плюсы достаточно глубоко и разобравшись с тем как работает АСМ ты будешь писать куда лучше, это факт.

Насчет сферы - человек пишет в С/С++ разделе, а не в разделе "Читы". Значит и советы соответственные. А так да, const char'ы есть много где в WinAPI. Вот только винапи та еще параша (сколько нервов я в него угробил) и явно не вяжется с "я начал изучать С++, только прошел тему про переменные". Я уж не говорю про то, что в чит-сфере char* это в первую очередь массив байтов и это лишь совпадение, что их так хранить удобно. Все винапи функции для работы с памятью все равно работают с указателями на void, а не lpcstrкучабуквкоторыепотомхердруготдругаотличишьспервоговзглядаеслионинерядомстоят.

Тем не менее если ТС учит читы конкретно для разработки читов то из плюсов ему нужно будет только ООП потом. Пускай учит С.
1) Я тебя не понял, ты сейчас про что? Да, очевидно, что инициализация динамического массива и статического - разная, но принципы работы с ними - унитарны. 2) Бред какой-то, что тогда по твоему vector? Это такой же динамический массив.

2) Я тебе про то, что нужны базовые знания, а ты мне про асм, к чему ты его тут прилепил? Напоминаю, человек ничего не знает, накой ляд ты ему советуешь пропустить базовые знания и перейти к доп библиотекам? Ты математику как учил, сразу к тригонометрии и логарифмам перешел, или начал с простого - сложения, вычитания и тд? 2) И да, если ты научился писать на асм-е, то ты просто понял, как он устроен и работает xD. От этого ты лучше писать код, скорее всего, на сях не станешь, ибо с таким же успехом можно говорить, что выучив плюсы ты станешь лучше писать код на луа или питоне каком-нибудь, и то сравнение не очень уместно, потому что у плюсов с питоном и луа есть хоть какие-то сходства, а у асм-а - ну думаю, что объяснять не стоит.

3) По поводу WinApi - опять же, 1) Зачем ты его прилепил, я о нем и слова не сказал. 2) А если уж начали говорить про него, то я не удивлен, что ты испытывал проблемы с WinApi. Конечно, сложно работать с ним, когда другим советуешь проигнорировать знания о работе с массивами и последующими знаниями, а следовательно, ты сам следовал такой же дорогой. 3) Ты знаешь в чем отличие, в памяти, const char* от char*, мне просто интересно, что ты скажешь. 4) Это не в чит сфере такие законы, так работает везде. В памяти все - это байты, а ты лишь указываешь тип переменной, чтобы можно было понять, что "стоит" за байтами. 5)."Все винапи функции для работы с памятью все равно работают с указателями на void" и "совпадение, что их так хранить удобно" - ну я понял почему у тебя были с винапи проблемы, объяснения больше не требуется.

4) А ну и последнее - о какой безопасности ты говоришь? О переполнении массива? Сложно учитывать его максимальный размер? Или ты про возможные утечки памяти, если работаешь с динамическими массивами? Ну так проблема также решаема - освободи память, когда она станет не нужна (благо проблем с этим не должно быть, ибо есть спец тузлы, например: от интел, которые помогают находить утечки), ну или оберни в класс с деструктором, который вызовется сам. В чем проблема то?

Важная ремарка - я не говорю о том, что надо нахуй слать std/stl, нет конечно, умение работать с этими библиотеками нужно, но перед тем, как переходить к ним, вам нужна база, которая позволит не быть, как человек с верху, и не испытывать проблем при работе с WinApi и тд.
 
Последнее редактирование:
money++
Разработчик
Статус
Оффлайн
Регистрация
14 Июн 2018
Сообщения
638
Реакции[?]
339
Поинты[?]
22K
1) Я тебя не понял, ты сейчас про что? Да, очевидно, что инициализация динамического массива и статического - разная, но принципы работы с ними - унитарны. 2) Бред какой-то, что тогда по твоему vector? Это такой же динамический массив.
По сути массив это не более чем упорядоченный набор элементов. Динамический массив это просто массив с НЕ статическим размером. Абстрактно это абсолютно одинаковые вещи. Если у тебя стоит задача найти например сумму элементов ты итерируешься по массиву и считаешь сумму. Неважно статический он или динамический. Вектор это абстрактно массив. Понимать то, что под ним лежит динамический массив надо. Уметь работать с сырыми динамическими массивами при этом уже не надо. Точно так же как и для того чтобы пользоваться std::sin не надо уметь раскладывать тригонометрические формулы в ряды (а они реализлваны именно так).


2) Я тебе про то, что нужны базовые знания, а ты мне про асм, к чему ты его тут прилепил? Напоминаю, человек ничего не знает, накой ляд ты ему советуешь пропустить базовые знания и перейти к доп библиотекам? Ты математику как учил, сразу к тригонометрии и логарифмам перешел или начал с простого - сложения, вычитания и тд?
Базовая математика не меняется уже веками. Программирование сейчас и 12 лет назад отличается суперсильно. Про базовые знания, как я писал выше, надо понимать что такое массив абстрактно и как он себя ведет. Уже давно нет потребности в умении вручную выделять память для работы с массивом. Я не спорю, что более глубокие знания это хорошо. Но я и писал выше, что сейчас стоит сначала изучать реализации массивов в виде std::vector и std::array, а потом уже добавить к своим знаниям понимание того как вектор создает себя на куче, как он меняет свое capacity и чем capacity отличается от size. Другое дело в том, что сейчас не то чтобы нет потребности в ручном управлении памятью - это плохая практика.
P.S. Да, всякое программирование микроконтроллеров, работа напрямую с памятью и т.д. требует этого. Но для этого есть С, вся идея С++ заключается в уходе от опасных и костыльных методов решения проблем в С к пускай и чуть более медленным, но куда более безопасным, гибким и удобным методом решения проблем на С++. Как говорил Линус Торвальдс С стоит использовать как минимум для того, чтобы с проектом работали только люди которые лезут реально очень глубоко. Вот только он пишет ядро ОС, а не системные приложения... В промышленном коде С++ итак дает слишком много поводов отстрелить себе ногу чтобы лезть глубже и уведичивать шанс угробить все нехваткой знаний (поэтому кстати много где и переходят на условную джаву - чтобы не то что меньше работать с памятью, а не работать вообще). Сырые массивы новичкам нанесут только вред. В 2021 в первую очередь скорость надо увеличивать крастой архитектуры, а уж потом, обладая тучей знаний все еще сомнительным переходом на более низкий уровень. И это знание действительно суперполезно для человека который хочет стать программистом через пару лет.


3) По поводу WinApi - опять же, 1) Зачем ты его прилепил, я о нем и слова не сказал
LPSTR и подобные есть только в винапи. Это был твой "супер"аргумент в пользу актуальности char*.

2) А я не удивлен, что ты испытывал проблемы с WinApi. Конечно, сложно работать с ним, когда другим советуешь проигнорировать знания о работе с массивами, а следовательно, ты сам следовал такой же дорогой.
Я начинал учить плюсы на стандарте 03 года, пока std::string был плохим вариантом. Поверь, я знаю про что говорю. Я писал на большем количестве разных ассемблеров (GAS, MASM, NASM), чем ты представляешь сколько их существует. Для меня int 80h это флешбэк к системным прерываниям, ты, если думаешь что с винапи не может быть реально странных проблем, следовательно даже не знаешь что такое системное прерывание (хуевая пародия на абсолютно дурацкое следствие, надеюсь ты поймешь).

3) Ты знаешь в чем отличие, в памяти, const char* от char*, мне просто интересно, что ты скажешь
const char* и char* это в первую очередь указатели. Первый константный, другой нет (ака по первому указателю память read-only, по второму - свободный доступ). Возможно ты хотел узнать знаю ли я, что написав const char* str = "Hello!" str будет хранится в отдельной рид онли секции оперативной памяти после запуска? Или может ты хотел узнать чем отличается их ПРЕДСТАВЛЕНИЕ в памяти(ничем)? В любом случае стоит формировать вопрос точнее. Да и вообще у меня под профилем есть ссылка на мой гитхаб, где есть вещи для которых нужно понимание куда более сложных вещей, зачем очевидные вопросы?

4) Это не в чит сфере такие законы, так работает везде, в памяти все одно - байты, а ты лишь указываешь тип переменной, чтобы можно было понять, что стоит за байтами
В памяти то все одно, это верно. Но ТСу например хочется хранить строку (т.е. для него char* это в первую очередь cstring, а не массив 8мибитных элементов), а не байты, как в чит сфере.

5)."Все винапи функции для работы с памятью все равно работают с указателями на void" и "совпадение, что их так хранить удобно" - ну я понял почему у тебя были с винапи проблемы, объяснений больше не требуется.
Найди мне
Пожалуйста, авторизуйтесь для просмотра ссылки.
хоть один метод, который принимает указатель на память как производную от char, а не как производную от void. Попробуй писать гуи на винапи и познаешь всю его боль. Слава богу есть Qt, которые использует основную фичу плюсов в виде ООП и работа с ним куда проще и веселее(и я говорю про все еще только писать код руками, никакие Qt Designerы которые позволяют создавать гуи тягая кнопочки я не рассматриваю), чем сишные подходы винапи.

4) А ну и последнее - о какой безопасности ты говоришь? О переполнении массива? Сложно учитывать его максимальный размер? Или ты про возможные утечки памяти, если работаешь с динамическими массивами? Ну так проблема также решаема, освободи память, когда она станет не нужна, ну или оберни все в класс с деструктором, который вызовется сам. В чем проблема то?
Если ты начнешь везде тыкать свои ифы с проверкой на переполнение массива, то у тебя получится ужасный код, да и скорость ту самую сырых массивов ты теряешь. "Освободи память, когда она станет не нужна". Точно блять. "Если нет дома - купи". По твоему зря составители стандартов зря придумывали умные указатели и еще несколько раз потом их меняли? Конечно можно добиться кода без багов на С - куча дебага и проверок. Вот только если раньше это стоило того, то сейчас можно позволить потерять немного в скорости работы, зато сэкономить на нервах в случаях крупных крашей и времени программистов и тестеров. А с сишными массивами есть еще куча приколов когда оно вроде как и тесты проходит, и работает хорошо, но стоит поменять что-то в совсем другом месте или перенести код на другую машину как начнуться краши.

2021 год на дворе, пора переставать юзать сишные штуки в плюсах, когда есть актуальные аналоги.
 
IRQL_APC_LEVEL
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2018
Сообщения
211
Реакции[?]
88
Поинты[?]
3K
По сути массив это не более чем упорядоченный набор элементов. Динамический массив это просто массив с НЕ статическим размером. Абстрактно это абсолютно одинаковые вещи. Если у тебя стоит задача найти например сумму элементов ты итерируешься по массиву и считаешь сумму. Неважно статический он или динамический. Вектор это абстрактно массив. Понимать то, что под ним лежит динамический массив надо. Уметь работать с сырыми динамическими массивами при этом уже не надо. Точно так же как и для того чтобы пользоваться std::sin не надо уметь раскладывать тригонометрические формулы в ряды (а они реализлваны именно так).



Базовая математика не меняется уже веками. Программирование сейчас и 12 лет назад отличается суперсильно. Про базовые знания, как я писал выше, надо понимать что такое массив абстрактно и как он себя ведет. Уже давно нет потребности в умении вручную выделять память для работы с массивом. Я не спорю, что более глубокие знания это хорошо. Но я и писал выше, что сейчас стоит сначала изучать реализации массивов в виде std::vector и std::array, а потом уже добавить к своим знаниям понимание того как вектор создает себя на куче, как он меняет свое capacity и чем capacity отличается от size. Другое дело в том, что сейчас не то чтобы нет потребности в ручном управлении памятью - это плохая практика.
P.S. Да, всякое программирование микроконтроллеров, работа напрямую с памятью и т.д. требует этого. Но для этого есть С, вся идея С++ заключается в уходе от опасных и костыльных методов решения проблем в С к пускай и чуть более медленным, но куда более безопасным, гибким и удобным методом решения проблем на С++. Как говорил Линус Торвальдс С стоит использовать как минимум для того, чтобы с проектом работали только люди которые лезут реально очень глубоко. Вот только он пишет ядро ОС, а не системные приложения... В промышленном коде С++ итак дает слишком много поводов отстрелить себе ногу чтобы лезть глубже и уведичивать шанс угробить все нехваткой знаний (поэтому кстати много где и переходят на условную джаву - чтобы не то что меньше работать с памятью, а не работать вообще). Сырые массивы новичкам нанесут только вред. В 2021 в первую очередь скорость надо увеличивать крастой архитектуры, а уж потом, обладая тучей знаний все еще сомнительным переходом на более низкий уровень. И это знание действительно суперполезно для человека который хочет стать программистом через пару лет.



LPSTR и подобные есть только в винапи. Это был твой "супер"аргумент в пользу актуальности char*.


Я начинал учить плюсы на стандарте 03 года, пока std::string был плохим вариантом. Поверь, я знаю про что говорю. Я писал на большем количестве разных ассемблеров (GAS, MASM, NASM), чем ты представляешь сколько их существует. Для меня int 80h это флешбэк к системным прерываниям, ты, если думаешь что с винапи не может быть реально странных проблем, следовательно даже не знаешь что такое системное прерывание (хуевая пародия на абсолютно дурацкое следствие, надеюсь ты поймешь).


const char* и char* это в первую очередь указатели. Первый константный, другой нет (ака по первому указателю память read-only, по второму - свободный доступ). Возможно ты хотел узнать знаю ли я, что написав const char* str = "Hello!" str будет хранится в отдельной рид онли секции оперативной памяти после запуска? Или может ты хотел узнать чем отличается их ПРЕДСТАВЛЕНИЕ в памяти(ничем)? В любом случае стоит формировать вопрос точнее. Да и вообще у меня под профилем есть ссылка на мой гитхаб, где есть вещи для которых нужно понимание куда более сложных вещей, зачем очевидные вопросы?


В памяти то все одно, это верно. Но ТСу например хочется хранить строку (т.е. для него char* это в первую очередь cstring, а не массив 8мибитных элементов), а не байты, как в чит сфере.


Найди мне
Пожалуйста, авторизуйтесь для просмотра ссылки.
хоть один метод, который принимает указатель на память как производную от char, а не как производную от void. Попробуй писать гуи на винапи и познаешь всю его боль. Слава богу есть Qt, которые использует основную фичу плюсов в виде ООП и работа с ним куда проще и веселее(и я говорю про все еще только писать код руками, никакие Qt Designerы которые позволяют создавать гуи тягая кнопочки я не рассматриваю), чем сишные подходы винапи.


Если ты начнешь везде тыкать свои ифы с проверкой на переполнение массива, то у тебя получится ужасный код, да и скорость ту самую сырых массивов ты теряешь. "Освободи память, когда она станет не нужна". Точно блять. "Если нет дома - купи". По твоему зря составители стандартов зря придумывали умные указатели и еще несколько раз потом их меняли? Конечно можно добиться кода без багов на С - куча дебага и проверок. Вот только если раньше это стоило того, то сейчас можно позволить потерять немного в скорости работы, зато сэкономить на нервах в случаях крупных крашей и времени программистов и тестеров. А с сишными массивами есть еще куча приколов когда оно вроде как и тесты проходит, и работает хорошо, но стоит поменять что-то в совсем другом месте или перенести код на другую машину как начнуться краши.

2021 год на дворе, пора переставать юзать сишные штуки в плюсах, когда есть актуальные аналоги.
О господи, надо прекращать этот холивар. У меня нет желания и времени расписывать тут мемуары, ибо - это может затянутся на долго.
По поводу матана - это просто аллегория была, все познается в сравнении.
По поводу - read-only в const char*, возможно, что с проверками безопасности (если их не вырубить) так и будет, по без них, там нету read-only, ты спокойно может выполнить memset или memcpy, учитывая размеру. конечно.
"LPSTR и подобные есть только в винапи." - это не более чем "typedef _Null_terminated_ CHAR *NPSTR, *LPSTR, *PSTR"
"Найди мне
Пожалуйста, авторизуйтесь для просмотра ссылки.
хоть один метод, который принимает указатель на память как производную от char, а не как производную от void." - смешно.
По поводу - тыкать проверки и тд, все тоже самое, я написал, что можно использовать классы и сделать все по уму, и скорость будет выше. (но эт велосипеды, но речь не об этом).
Qt и его гуи - да можно, да проще, а всегда ли можно - нет. И у qt-а свои библиотеки, давай не будем забывать, что человек только начал учиться, зачем ему забивать голову чем-то лишним? Человек ещё не определился, чем он хочет заниматься (допустим) - идти кодить читы, белый софт, малварь и тд, на таком этапе рано давать такую инфу, смекаешь?
"Сырые массивы новичкам нанесут только вред" - ну тоже смешно.
"если думаешь что с винапи не может быть реально странных проблем" - я последний год, кроме стандартных библиотек - kernel32.dll и ntdll.dll (даже crt, ибо добрая часть функций есть в нтдлл или можно сделать самому) ничего не использую, конечно, если привыкнуть ко всем плюшкам std/stl/boost/etc или использовать андок, то будут проблемы.
Крч, я свое мнение уже сказал - нужно начинать с азов, чтобы не было проблем в дальнейшем. Если у тебя есть желание поспорить, то можно пройти в тг или жаббер, иначе эт в оффтоп все сливается. Ибо мы не помогаем человеку, а бежим с яростным хохотом мерятся членами - а кто лучше шарит, а кто дольше кодит, а кто асм знает и тд. (В свое время, на васм-е (но-ад) или дамаге (но-ад) я был бы рад такому, но не сейчас)
 
Последнее редактирование:
money++
Разработчик
Статус
Оффлайн
Регистрация
14 Июн 2018
Сообщения
638
Реакции[?]
339
Поинты[?]
22K
По поводу - read-only в const char*, возможно, что с проверками безопасности (если их не вырубить) так и будет, по без них, там нету read-only, ты спокойно может выполнить memset или memcpy, учитывая размеру. конечно.
memset и memcpy принимают указатели на память через void*. Для того, чтобы скастить const char* к void* надо подсунуть компилятору -fpermissive. Да, такое возможно. Но очень опасно. Даже компилятор С пытается сказать, что против этого. В 2021 году это выглядит как лечение зубной боли кровопусканием. Ну а что, на какое-то время не так больно потом...

"LPSTR и подобные есть только в винапи." - это не более чем "typedef _Null_terminated_ CHAR *NPSTR, *LPSTR, *PSTR"
И тем не менее нигде больше этих тайпдефов нет, так что ты явно говорил конкретно о них в винапи.

По поводу - тыкать проверки и тд, все тоже самое, я написал, что можно использовать классы и сделать все по уму, и скорость будет выше. (но эт велосипеды, но речь не об этом).
Именно. За тебя уже написали классы в виде std::string, std::array, std::vector и т.д.. И переписывать их это реально велосипед. Так зачем настаивать на использовании const char* новичку? В 2021 давно пора забывать про то, как выделять память на куче и переставать использовать сырые указатели для хранения чего-либо.

Qt и его гуи - да можно, да проще, а всегда ли можно - нет.
Что там нельзя? Конечно фокусы с изменением рид онли памяти и прочая попоебля там невозможна. И слава богу потому что в-каком-мы-там-году это и не надо.

Я свое мнение уже сказал - нужно начинать с азов, чтобы не было проблем в дальнейшем. Если у тебя есть желание поспорить, то можно пройти в тг или жаббер, иначе эт в оффтоп все сливается.
Желания спорить нет. Все равно останемся при своем. Я просто надеюсь что новички выберут себе современный путь, а не изучение методов от которых 20 лет назад все хотели избавиться (и к счастью смогли)
 
IRQL_APC_LEVEL
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2018
Сообщения
211
Реакции[?]
88
Поинты[?]
3K
memset и memcpy принимают указатели на память через void*. Для того, чтобы скастить const char* к void* надо подсунуть компилятору -fpermissive. Да, такое возможно. Но очень опасно. Даже компилятор С пытается сказать, что против этого. В 2021 году это выглядит как лечение зубной боли кровопусканием. Ну а что, на какое-то время не так больно потом...


И тем не менее нигде больше этих тайпдефов нет, так что ты явно говорил конкретно о них в винапи.


Именно. За тебя уже написали классы в виде std::string, std::array, std::vector и т.д.. И переписывать их это реально велосипед. Так зачем настаивать на использовании const char* новичку? В 2021 давно пора забывать про то, как выделять память на куче и переставать использовать сырые указатели для хранения чего-либо.


Что там нельзя? Конечно фокусы с изменением рид онли памяти и прочая попоебля там невозможна. И слава богу потому что в-каком-мы-там-году это и не надо.


Желания спорить нет. Все равно останемся при своем. Я просто надеюсь что новички выберут себе современный путь, а не изучение методов от которых 20 лет назад все хотели избавиться (и к счастью смогли)
Нуууу неееет, опяяять...
memset и memcpy принимают указатели на память через void* - да принимает, но в самой функции преобразует в unsigned char*. Мы явно друг-друга не понимаем и спорим о разных вещах. P.s. достаточно вот так сделать - memset((LPBYTE)someConstCharArray, iChar, iStrLen); Но я уже сказал - если не правильно настроить вс-ку, то она может говна подсунуть и тогда будет плохо.
Все заканчиваем этот спор. Я уже писал - "(В свое время, на васм-е (но-ад) или дамаге (но-ад) я был бы рад такому, но не сейчас)".

=======================

Я считаю, что надо начинать учить с С, а уже потом переходить к ++.
Ты считаешь, что надо сразу начинать с ++, со всеми его плюшками.
-
У моего метода (сказал, как будто его сам придумал xD) есть минусы, например: время, которое требуется для изучения.
У твоего метода тоже есть минусы.
 
Последнее редактирование:
IRQL_APC_LEVEL
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2018
Сообщения
211
Реакции[?]
88
Поинты[?]
3K
memset и memcpy принимают указатели на память через void*. Для того, чтобы скастить const char* к void* надо подсунуть компилятору -fpermissive. Да, такое возможно. Но очень опасно. Даже компилятор С пытается сказать, что против этого. В 2021 году это выглядит как лечение зубной боли кровопусканием. Ну а что, на какое-то время не так больно потом...


И тем не менее нигде больше этих тайпдефов нет, так что ты явно говорил конкретно о них в винапи.


Именно. За тебя уже написали классы в виде std::string, std::array, std::vector и т.д.. И переписывать их это реально велосипед. Так зачем настаивать на использовании const char* новичку? В 2021 давно пора забывать про то, как выделять память на куче и переставать использовать сырые указатели для хранения чего-либо.


Что там нельзя? Конечно фокусы с изменением рид онли памяти и прочая попоебля там невозможна. И слава богу потому что в-каком-мы-там-году это и не надо.


Желания спорить нет. Все равно останемся при своем. Я просто надеюсь что новички выберут себе современный путь, а не изучение методов от которых 20 лет назад все хотели избавиться (и к счастью смогли)
И забыл добавить "И тем не менее нигде больше этих тайпдефов нет, так что ты явно говорил конкретно о них в винапи." - будет честны, можно и самому дефайн или тайпдеф объявить, я прост уже настолько часто их юзаю, что уже разницы не вижу (ее и нет, но да, по дефу, без инклуда Windows.h этого тайпдефа нет, но можно самому добавить, но не суть), крч, моя ошибка - да, признаю, не точно выразился.
 
Everage C++ Enjoyer
Пользователь
Статус
Оффлайн
Регистрация
5 Янв 2018
Сообщения
162
Реакции[?]
50
Поинты[?]
3K
пиздец, сделал простую тему и спросил как юзать больше символов а тут нахуй дебаты :roflanBuldiga:
C++:
const char* white_power = "White Power!";
std::cout << white_power << endl;
кстати что делает параметр "*" после const char? интересно было бы узнать
 
IRQL_APC_LEVEL
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2018
Сообщения
211
Реакции[?]
88
Поинты[?]
3K
пиздец, сделал простую тему и спросил как юзать больше символов а тут нахуй дебаты :roflanBuldiga:

кстати что делает параметр "*" после const char? интересно было бы узнать
Если по простому - то const char = 'A' - эт объявление константного символа (одного), а const char* = "AAAA" - эт объявление константного указателя на массив символов, а char[] = "AAAA" - это объявление не константного массива символов, те ты можешь без опасения менять его элементы, главное за границы массива не выйти.

P.s. Константный - означает не изменяемый, те в процессе работы программы ты не можешь его изменить (можешь, но не стоит)
пиздец, сделал простую тему и спросил как юзать больше символов а тут нахуй дебаты :roflanBuldiga:

кстати что делает параметр "*" после const char? интересно было бы узнать
Советую почитать Рихтера, но не сейчас, а когда уже освоишься в сях, иначе она тебе мозг сломает. В книге есть пару моментов, с которыми я не согласен, например: представление интернел структуры - PEB, но, в целом, книга хорошая.
 
Последнее редактирование:
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
что делает параметр "*" после const char?
char это целочисленый знаковый тип, занимает 1 байт, и описывает значение от -127 до +127, используется так же для хранения символов как в твоем случае.
const это ключевое слово, которое запрещает менять переменную после ее объявление, оно существует исключительно внутри C++, в машинном коде ничего такого нет, нужно чтобы писать код более безопасно и читаемо, const так же используется при объявлении методов функций немного для другой задачи.
* это обозначение безмерного массива, проще говоря если char это 1 байт, то char* это указатель (адрес размером 4/8 байт) на память в которой содержится сколько-то char.
[] это обозначение массива фиксированного размера, например char[4] будет массивом из 4 байт, но есть и более сложные случаи.
Если ты например пишешь const char* text ="TEXT" то компилятор создаст в бинарнике строку TEXT из 4 символов и одного дополнительного нуля, который завершает строку, а в text запишет указатель на эту строку.
Хороший пример почему нужно писать const, "TEXT" будет располагаться в константной памяти, которую нельзя изменять, записывая const char* ты указываешь что нельзя записывать в память по этому указателю (т.е. элементы char неизменяемы), но ничто не мешает тебе изменить саму переменную text, например чтобы она указывала на другую память (скажем = "TEXT2"), а чтобы запретить и это можно вообще написать const char* const text = "TEXT". Таким образом через const ты настраиваешь насколько переменная изменяема, если у тебя есть какая то переменная с константым значением хорошим тоном будет объявить ее с const (в некоторых случаях компилятор тебе не даст сделать тебе обратного).
 
Everage C++ Enjoyer
Пользователь
Статус
Оффлайн
Регистрация
5 Янв 2018
Сообщения
162
Реакции[?]
50
Поинты[?]
3K
Если по простому - то const char = 'A' - эт объявление константного символа (одного), а const char* = "AAAA" - эт объявление константного массива символов, а char[] = "AAAA" - это объявление не константного массива символов, те ты можешь без опасения менять его элементы, главное за границы массива не выйти.

P.s. Константный - означает не изменяемый, те в процессе работы программы ты не можешь его изменить (можешь, но не стоит)


Советую почитать Рихтера, но не сейчас, а когда уже освоишься в сях, иначе она тебе мозг сломает. В книге есть пару моментов, с которыми я не согласен, например: представление интернел структуры - PEB, но, в целом, книга хорошая.
спасибо, почитаю когда более менее буду знать плюсы

char это целочисленый знаковый тип, занимает 1 байт, и описывает значение от -127 до +127, используется так же для хранения символов как в твоем случае.
const это ключевое слово, которое запрещает менять переменную после ее объявление, оно существует исключительно внутри C++, в машинном коде ничего такого нет, нужно чтобы писать код более безопасно и читаемо, const так же используется при объявлении методов функций немного для другой задачи.
* это обозначение безмерного массива, проще говоря если char это 1 байт, то char* это указатель (адрес размером 4/8 байт) на память в которой содержится сколько-то char.
[] это обозначение массива фиксированного размера, например char[4] будет массивом из 4 байт, но есть и более сложные случаи.
Если ты например пишешь const char* text ="TEXT" то компилятор создаст в бинарнике строку TEXT из 4 символов и одного дополнительного нуля, который завершает строку, а в text запишет указатель на эту строку.
Хороший пример почему нужно писать const, "TEXT" будет располагаться в константной памяти, которую нельзя изменять, записывая const char* ты указываешь что нельзя записывать в память по этому указателю (т.е. элементы char неизменяемы), но ничто не мешает тебе изменить саму переменную text, например чтобы она указывала на другую память (скажем = "TEXT2"), а чтобы запретить и это можно вообще написать const char* const text = "TEXT". Таким образом через const ты настраиваешь насколько переменная изменяема, если у тебя есть какая то переменная с константым значением хорошим тоном будет объявить ее с const (в некоторых случаях компилятор тебе не даст сделать тебе обратного).
спасибо :CoolCat:
 
Сверху Снизу