Сообщество - Лига программистов C/C++

Лига программистов C/C++

65 постов 4 798 подписчиков

Популярные теги в сообществе:

Начинающий проффесионал

Заинтересовался программированием, оч хочется создавать полезные штуки! Лига программистов помогите, да посоветуйте чего нибудь!

77

Как начать понимать указатели

Тема указателей для многих является той точкой, на которой многие новички спотыкаются. Секрет такого ступора объясняется довольно просто, из мира языка С++ Вы погружаетесь в мир архитектуры компьютера и выполнения программ. Поскольку Вы его не знаете и почему-то авторы книг/курсов/статей не хотят Вас с ним знакомить, этот процесс может проходить довольно болезненно. В данном статье мы попытаемся устранить этот недостаток.

Любая программа перед тем как начать исполняться полностью загружает свой код в ОЗУ или проще говоря оперативную память. Оперативная память в урощенной схеме представляет из себя таблицу адресов и значений.


Есть такой термин как разрядность и применяется он для ОС, шины, адресного пространства. Он означает, сколько одновременно бит может обработать устройство. Вот один из примеров оперативной памяти с адресной разрядностью в 8 бит(2^8 = 256 адресов) и разрядностью шины 16 бит.

Как начать понимать указатели Указатель, Память, Программирование, C++, Длиннопост

Давайте посмотрим на примере простой программы, как это может работать в упрощенной схеме.

Как начать понимать указатели Указатель, Память, Программирование, C++, Длиннопост

После того, как компилятор пройдется по вашему коду, он заменит все ваши имена переменных на адреса и заполнит как-то так оперативную память

Как начать понимать указатели Указатель, Память, Программирование, C++, Длиннопост

Соответсвенно адрес у переменной не меняется и если мы присвоим ей новое значение, то оно изменится только в столбце "значение по адресу".

Вот мы и подошли к самому главному - указатель, это совершенно обычная переменная которая хранит АДРЕС. У нас есть переменные, которые хранят числа, которые хранят буквы, которые хранят строки. А теперь просто появились переменные, которые хранят адрес.


Что бы ОБЪЯВИТЬ указатель, достаточно указать перед именем переменной звездочку. Это даст понять, что в этой переменной вы будете хранить адрес определенного типа. На самом деле хранение в памяти значений намного сложнее, поэтому компилятору надо знать тип хранимого адреса, что бы правильно его получить из памяти.


Для работы с указателем используются две новые операции.

& - взятие адреса у какой-либо переменной

* - получение значение по адресу в указателе

Как начать понимать указатели Указатель, Память, Программирование, C++, Длиннопост

Если Вы будете держать в голове эту простую схему с оперативной памятью, то указатели будут даваться Вам намного легче.


Удачи в обучении.

Показать полностью 3
16

Язык программирования C иностранным языком не признали. Окончание.

Для жаждущих продолжения =)

В продолжении http://pikabu.ru/story/programmistyi_na_c__samyiy_bolshoy_ra...

и http://pikabu.ru/story/yazyik_programmirovaniya_c_inostranny...


В конечном итоге сегодня суд постановил:

"Оставить решение суда без изменения, жалобу без удовлетворения".

Антимонопольная служба с апелляцией обломалась, суд остался на стороне организации и ЯП "С++" иностранным языком не признал, а многие надеялись ;)

Язык программирования C иностранным языком не признали. Окончание. C++, Программирование, Суд
3

Заметка Неуча "Об постфиксной и префиксная формах инкрементов в C++"

Инкремент (i++) эта такая фиговина, которая:

увеличивает вашу переменную без регистрации и смс ©Jereli

И это круто, но не без детских грабель, а точнее следует отличать постфиксную (i++) и префиксную (++i) формы.


PS: К слову, декремент (i--), он как инкремент, только наоборот – не дает, а отбирает. Так, что и грабли у них, если не одинаковые, то бьют по одному и тому же месту.


Для наглядности рассмотрим все на примере двух задач.

Задача 1.

Даны переменная X(=5), переменная Y (=0). Выполнить для Y присвоение инкремента X.

Сценарий 1: i++ (Постфиксная форма)

Заметка Неуча "Об постфиксной и префиксная формах инкрементов в C++" C++, Обучение, Заметки, Для чайников, Длиннопост

Как видно из скриншота, сначала произошло присвоение для Y, а уже потом увеличение X.

Вывод: i++ сначала передает свое значение, а уже потом изменяет его.

Сценарий 2: ++i (Префиксная форма)

Заметка Неуча "Об постфиксной и префиксная формах инкрементов в C++" C++, Обучение, Заметки, Для чайников, Длиннопост

Как видно из скриншота, сначала произошло увеличение X, а уже потом присвоение для Y.

Вывод: ++i сначала изменяет свое значение, а уже потом передает.

Идем дальше!

Задача 2.

Даны переменная X(=5), переменная Y (=5), а также переменная результата Z(=0). Выполнить для Z сумму инкрементов X и Y.

Сценарий 1: i++ (Постфиксная форма)

Заметка Неуча "Об постфиксной и префиксная формах инкрементов в C++" C++, Обучение, Заметки, Для чайников, Длиннопост

Z = 10, при слагаемых X=Y=6. ИМХО, это не правильно, так что переходим ко второму сценарию.

Сценарий 2: ++i (Префиксная форма)

Заметка Неуча "Об постфиксной и префиксная формах инкрементов в C++" C++, Обучение, Заметки, Для чайников, Длиннопост

А тут, как и ожидалось, Z=12.

На примере таких нехитрых (по заверениям далеких от реальных условий) задач мы увидели очевидное отличие в работе постфиксной и префиксной формах инкремента.

Как говорится: "пусть за меня говорят цифры".


Отдельно стоит уточнить и такой важный технический момент - при постфиксной форме инкремента создается вспомогательный объект-копия i, потом увеличивается значение i, и уже после всего этого безобразия далее передается копия.

Что это значит? А черт его знает, я ж Неуч!

Но напрягая серое вещество, могу подчеркнуть два момента:

1. Под копию выделяется дополнительная память, т.е. ее будет нужно больше, чем при префиксной форме.

2. При вычислении будет сделано больше операций, а следовательно потребуется больше тактов процессора.

PS2: А еще есть операция присвоения «A += 2», она аналогична записи «A = A + 2», т.е. мы сами выбираем на сколько увеличить переменную (в примере на 2). В этом случае присвоение происходит по второму сценарию.

С уважением, Ваш Неуч.

Показать полностью 3
8

Заметка Неуча "О циклах в C++"

Циклы, это такая крайне полезная фиговина, дающая возможность упорно двигаться к результату.

PS: Применительно не только к C++.

Заметка Неуча "О циклах в C++" C++, Заметки, Обучение, Для чайников

Цикл FOR - когда вы наверняка сколько раз надо "сделать дело", чтобы "гулять смело".

Что делает: объявляет старт счетчика (в примере и сам "счетчик"), условие его остановки, и шаг с которым он тикает, а уже после выполняет "ВАШИ БЕЗУМНЫЕ КОМАНДЫ".


Его можно использовать, например, для чтения или наполнения массива типа char. Ну или просто заставить эту тупую железяку сосчитать до 1000.

Заметка Неуча "О циклах в C++" C++, Заметки, Обучение, Для чайников

Цикл WHILE - когда вы сначала ставите цель, а потом упорно к ней стремитесь.

Что делает: объявляет условие для остановки и начинает выполнять "ВАШИ БЕЗУМНЫЕ КОМАНДЫ" до тех пор пока это условие не будет достигнут.


Тут надо очень ясно понимать, что пока условие не достигнуто - цикл не окончится. В примере, все упирается в счетчик, и он увеличивается на 1 в конце каждого прогона цикла.

Заметка Неуча "О циклах в C++" C++, Заметки, Обучение, Для чайников

Цикл DO...WHILE - когда вы сначала делаете, потом думаете, и опять делаете, пока не выясняется, что хватит.

Что делает: сначала выполняет "ВАШИ БЕЗУМНЫЕ КОМАНДЫ", потом сверяет их с ожидаемым результатом, и если не сходится, то вновь выполняет "ВАШИ БЕЗУМНЫЕ КОМАНДЫ".


Ключевое отличие, что в отличии от обычного while, тут ваши команды в любом случае выполняться хотя бы раз.

С уважением, Ваш Неуч.

Показать полностью 1
620

Язык программирования C иностранным языком не признали.

В продолжении вялотекущего судебного разбирательства  http://pikabu.ru/story/programmistyi_na_c__samyiy_bolshoy_ra...

Думаю некоторым будет интересно, что же там происходит:)

Язык программирования C иностранным языком не признали. C++, Программирование, Суд

По итогу 02.06.2016 суд решил признать незаконным решение ФАС.


Из приведенных заключений экспертов следует, что изображение, размещенное обществом на рекламном баннере, не является надписью или текстом на иностранном языке, а представляет собой фрагмент кода компьютерной программы, выполненной на языке программирования С++


С полным текстом решения можно ознакомится тут http://kad.arbitr.ru/PdfDocument/0235635f-01ce-4589-aaff-fe8...


Но антимонопольная служба так просто не сдается и подала апелляцию.  Следующее заседание назначено на 03.08.2016.

Показать полностью
76

Реализация кортежа на C++11

Кортеж — это упорядоченный набор фиксированной длины. В отличие от массива, кортеж может содержать элементы разных типов.

В языке Python кортеж является стандартным типом данных и позволяет делать вот так:

Реализация кортежа на C++11 Программирование, Языки программирования, C++, Длиннопост

Но Python использует динамическую типизацию, а в C++ типизация статическая. Как же создать подобную структуру и не сломать систему типов? Используем C++11 и одну и главных особенностей этого стандарта — шаблоны с переменным числом аргументов (variadic templates).

Обычные шаблоны используются в C++ повсеместно, большинству они знакомы. Шаблоны с переменным числом аргументов позволяют передавать произвольное число параметров в шаблон. Вот небольшой пример, демонстрирующий эту возможность языка:

Реализация кортежа на C++11 Программирование, Языки программирования, C++, Длиннопост

Теперь, собственно, реализация кортежа. Для этого мы воспользуемся рекурсивным наследованием структур. Так выглядит объявление структуры:

Реализация кортежа на C++11 Программирование, Языки программирования, C++, Длиннопост

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

Реализация кортежа на C++11 Программирование, Языки программирования, C++, Длиннопост

Теперь мы можем написать функцию доступа к элементу по его индексу:

Реализация кортежа на C++11 Программирование, Языки программирования, C++, Длиннопост

Конечно, сам кортеж и доступ — это хорошо, но мы же хотим его создавать! Для этого сперва реализуем заполнение кортежа.

Реализация кортежа на C++11 Программирование, Языки программирования, C++, Длиннопост

Теперь легко реализовать и функцию создания кортежа. Почему не конструктор? В нем не работает автоматическое выведение типов, а мы же не хотим писать огромный список параметров ;)

Реализация кортежа на C++11 Программирование, Языки программирования, C++, Длиннопост

Ну и напоследок демонстрация того, что у нас получилось. Распаковку и групповое присваивание пока не демонстрирую, и так достаточно кода :P

Реализация кортежа на C++11 Программирование, Языки программирования, C++, Длиннопост

P.S. Не судите строго — это мой первый пост. Возможно тема покажется сложной, я не привожу здесь подробное объяснение. Пишите в комментарии что не понятно, постараюсь ответить.

Показать полностью 7
233

Советы падаванам C++ ( Часть 2 )

///////////////////////////////////////////////////

// Начальный курс создания компьютерных игр на C/C++

[0][1][2][2.5][3][4][5][5.5][6][6.2][7][7.2][8][9][9.2][10]

///////////////////////////////////////////////////

// Советы падаванам C++

[1]



Всем привет! :]


После первого поста количество подписчиков резко увеличилось в два раза, поэтому я решил не тянуть со вторым постом. :]

Сегодня в рубрике "Советы падаванам C++" у нас будут советы-привычки - те вещи, к которым нужно привыкнуть как можно раньше и использовать каждый день :]

Советы падаванам C++ ( Часть 2 ) Программирование, Курсы программирования, Обучение, C++, Длиннопост
Советы падаванам C++ ( Часть 2 ) Программирование, Курсы программирования, Обучение, C++, Длиннопост
Советы падаванам C++ ( Часть 2 ) Программирование, Курсы программирования, Обучение, C++, Длиннопост
Советы падаванам C++ ( Часть 2 ) Программирование, Курсы программирования, Обучение, C++, Длиннопост

Жду ваши отзывы в комментариях :]


И вот вам в тему пару весёлых картинок напоследок:

Советы падаванам C++ ( Часть 2 ) Программирование, Курсы программирования, Обучение, C++, Длиннопост
Советы падаванам C++ ( Часть 2 ) Программирование, Курсы программирования, Обучение, C++, Длиннопост
Показать полностью 6
Отличная работа, все прочитано!