Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение da-nie »

Я бы ему посоветовал шутливое мнемоническое правило для запоминание инкрементов.

Как понимается конструкция С++ по правилам этого языка?
Надо С увеличить на единицу и вернуть СТАРОЕ (т.е. не увеличенное) значение.


То есть, от улучшения язык лучше не стал. :)

:)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »


из прочитанного по ссылке (простите за каламбур), я понял только вот это:

Код: Выделить всё

4
Да, уж. С++ становится все сложнее и сложнее, понять чужую программу становится все проблематичней (вангую, лет через пять в ответственных конторах писать на нем просто запретят). –
avp
 30 окт 2016 в 10:39
@avp На мой взгляд это крайне гнеудачное решение Комитета по стандартизации C++. –
Vlad from Moscow
 30 окт 2016 в 10:41
2
На самом деле, проблема глубже (и это, так сказать, "родовая травма"). Проблема в том, что С++ это как минимум 2 языка (один для программирования на высоком уровне, а второй (включая шаблоны и т.п.) предназначен для создания первого, используя по сути его же синтаксические основы). Результаты этой шизофрении мы и видим. –
avp
 30 окт 2016 в 10:50
с чем, в принципе, согласен :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение da-nie »

В С++ 14 сделали одну штуку:

int a;
return(a);
Скобки делают возвращаемый тип int& вместо int; В обычной работе это не важно. Но при использовании автоматического вывода возвращаемого типа (decltype (auto) ) это может порождать проблемы.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
vek
Вымогатель припоя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Re: Вопросы по С/С++ (СИ)

Сообщение vek »

//Добрый день. Спс за отзывчивость. У меня появился вопрос практический, объясню на примере. Пишу игру,применяя функции:


void tellRulesGame(); //рассказать правила игры текстом. Возвращать значение не требуется.
int action(char); //Играем? нажмите y/n. Вернуть какое-то значение, в зависимости от выбора пользователя.
int rollingTheDice(int);//кидаем кость,получаем случайное значение,и возвращаем его
void showDices(int); //показываем выпавшые кости игрока и компьютера. Просто выводим данные в консоль,возвращать ничего не надо.


int main()
{
void tellRulesGame()
//тут должен быть код игры
}

//рассказываем правила игры,текстом //!!!!!Вопрос про ВОИД!!!!!/////
void tellRulesGame()
{
cout << "text" << endl;
}


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

/*
Это первые наброски кода для консольной игры в кости. По логике программы Перед началом игры я хочу озвучить правила.
Для этого применяю функцию void tellRulesGame() - она, по задумке, просто выводит в своем теле текст правил в консоль. Ничего она возвращать не должна,от нее этого не требуется.
Так-же попробовал изменить на int tellRulesGame() - не увидел разницы в результате исполнения,кроме мелких,вполне посильных заморочек: т.к. определяю функции и int,и void, то можно запутаться и получить ругань от компилятора - надо прописывать return или не надо.
Вопрос:что дает void ? Ведь вполне работает int
Быть может бывают какие-то ситуации в которых это критично со стороны логики? Или может это позволяет оперативку сэкономить? Или еще чего?
Последний раз редактировалось vek Сб мар 26, 2022 18:22:28, всего редактировалось 1 раз.
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение da-nie »

В первую очередь, правильное указание возвращаемого типа даёт контроль того, что возвращается то, что нужно.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
vek
Вымогатель припоя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Re: Вопросы по С/С++ (СИ)

Сообщение vek »

В первую очередь, правильное указание возвращаемого типа даёт контроль того, что возвращается то, что нужно.

Ваш посыл понял так: Это риск ошибки. Если-уж разобрался где должен быть void,а где int,то желательно делай как надо.Будь любезен держи ситуацию за яйца. Тем более тут всего 10-15 строк кода. Если это игнорировать, то в более длинном коде возможны гораздо более серьезные проблемы. Масштаб которых я осознать еще не готов.
Верно понял?
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

с чем, в принципе, согласен :)))
Объясните, почему люди не знающие язык так упорно пытаются его оценить? Грош цена таким оценкам.

Добавлено after 4 minutes 38 seconds:
Верно понял?
Не верно. Функция может что-то возвращать и тогда это что-то имеет конкретный тип. А может ничего не возвращать, тогда это void. В С++ есть и третий вариант - автоматически выводить возвращаемый тип, тогда это auto.
tonyk
Это не хвост, это антенна
Сообщения: 1305
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: Вопросы по С/С++ (СИ)

Сообщение tonyk »

[uquote="ARV",url="/forum/viewtopic.php?p=4204155#p4204155"]с чем, в принципе, согласен :)))
Объясните, почему люди не знающие язык так упорно пытаются его оценить? Грош цена таким оценкам.[/uquote]
Это особенность неграмотных mudozvonов. Знаний- ноль, а произвести впечатление серьёзного парня очень хочется, вот как барбосы и поливают всё и и всех своими испражнениями, ибо другие способы самовыражения им не доступны. Они что-то читать начинают, только тужась хоть что-то выдать из себя на обоснованный ответ. Для них главное- по3.14здеть. Поэтому, VladislavS, не втягивайся в пустой трёп. Те, кто понял тебя и ему нужна будет твоя помощь, напишут тебе в личку и там всё обсудят. Я тут на форуме встретил несколько толковых людей, с которыми давно общаемся по телефону и в месенджерах, чтобы всякие чудозвоны не мешали своей брехнёй.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

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

Мой уютный бложик... заходите!
OKF
Это не хвост, это антенна
Сообщения: 1380
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение OKF »

Ну а чем ещё брать? Только глоткой.(
Аватара пользователя
vek
Вымогатель припоя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Re: Вопросы по С/С++ (СИ)

Сообщение vek »

Добавлено after 4 minutes 38 seconds:
Добавлено after 4 minutes 38 seconds:[/color][/size]
[uquote="vek",url="/forum/viewtopic.php?p=4204285#p4204285"]Верно понял?
Не верно. Функция может что-то возвращать и тогда это что-то имеет конкретный тип. А может ничего не возвращать, тогда это void. В С++ есть и третий вариант - автоматически выводить возвращаемый тип, тогда это auto.[/uquote]

Например:

void foo()
{
cout << "cat" ;

}

____и_____________

int foo()
{
cout << "cat" ;
}


__ они ведь абсолютно идентичны.

Я еще больше запутался. Попытаюсь разложить вопрос на мелкие составные части. Поправьте пожалуйста,если не правильно. Вот мое упрощение до обыденной жизни:
1) Есть функции void и int
2) от void нечего ждать овета, она никогда его не даст.Нечего от нее просить чего-то. void - это жмот, он никогда ничего не отдаст, return ему противно. void - это немой работяга, который может что-то сделать,например положить кафель. Но ответить он нам ничего не может (например сколько м2 кафеля он положил)
3) от int мы можем попросить ответа, int впринципе не жмот,он с радостью отдаст ответ через return если мы попросим. К тому-же int может точно так-же укладывать кафель,ничем не хуже чем void. (при этом он без проблем ответит сколько м2 кафеля положил).


Мои мысли: Если int функция может делать то-же самое, что и void, но при этом мы можем спросить у нее возвращаемое значение... То не проще-ли уволить всех void, и применять всегда только int ?
Подозреваю подвох, что цена у них разная.

Вопрос: чем чревата идея дискриминации void. а применять только int функции? какую цену придется заплатить за это?






Добавлено after 18 minutes 52 seconds:
****************************************************************************************************************
Очень извиняюсь,за оффтоп,но есть вопрос не касающийся непосредственно С.
Вопрос про консоль виндовса и ping.
Я не очень понимаю что происходит, когда я вызываю в консоли программу ping. Почему так получается:

если я делаю в cmd так:
ping google.com // то он обращается к адресу 64.233.165.100 и показывает какой-то там пинг // вставляю этот адрес (64.233.165.100) в строку браузера "опера" и попадаю на страницу GOOGLE

если я делаю в cmd так:
ping yandex.com // то он обращается к адресу 77.88.55.77 и показывает какой-то там пинг // вставляю этот адрес (77.88.55.77) в строку браузера "опера" и вижу: "Страница недоступна HTTP ERROR 406"

Что нужно почитать/в какую сторону гуглить дабы разобраться в этом/что вообще происходит?
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

То не проще-ли уволить всех void, и применять всегда только int ?
А может вам не стоит заниматься программированием? Ну видно же, что это не ваше.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

vek писал(а):Если int функция может делать то-же самое, что и void, но при этом мы можем спросить у нее возвращаемое значение... То не проще-ли уволить всех void, и применять всегда только int ?
почитайте эту тему где-то ближе к первой трети... пару лет назад я тут пытался вести дискуссию о void, но никто не согласен, что это костыль.

а было именно так, как вы и предположили: изначально в языке Си все функции по умолчанию были типа int (они и сейчас такими будут, если вы тип забудете указать, только варнинг вылетит), а типа void вообще не было. но потом программисты осознали, что бывают ситуации, когда сделать что-то надо многократно, но возвращать ничего не надо... в паскале для этого есть procedure, а в си только функции... вот программисты и придумали тип "ничто" - void... дескать, и вашим и нашим - вроде как и функция с возвращаемым типом, но при этом ничего не возвращает...

если бы я в коде сделал что-то подобное, VladislavS назвал бы это костылем и обозвал меня неумехой-программистом, криворуким быдлокодером. и был бы абсолютно прав! но только не в случае Кренигана и Ричи - если гуру сказали, что есть тип данных, которых нет, тип, который можно назначить, но нельзя никак использовать - то слово гуру не подлежит критике, его надо признать, и устыдиться в скудоумии... что он явно вам и предложил:
VladislavS писал(а):Ну видно же, что это не ваше
настоящий программист никогда не сомневается в догмах, сказанных гуру.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

Кто хочет задачу со звёздочкой? :)

Необходимо максимально быстро преобразовать 23-х разрядное число в 24-х рязрядное перед выводом в порт путём вставки "1" (или "0", не важно) между 11-м и 12-м битами. Т.е. было:
0 - бит22 - бит21 - ... - бит1 - бит0;
стало:
бит22 - бит 21 - ... - бит11 - "1" - бит10 - ... - бит1 - бит0.

Архитектура AMSC-96 (16 бит).
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
veso74
Поставщик валерьянки для Кота
Сообщения: 1902
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение veso74 »

Если правильно понял задачу (а Вы не пошутили с постановке задачи и для звездочки :) ), то:

Код: Выделить всё

  bool f = 1;
  uint32_t a = 0b10111101010101011001010;
  uint32_t b = ((a << 1) & 0xFFF000) | (f << 11) | (a & 0x3FF);
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

настоящий программист никогда не сомневается в догмах, сказанных гуру.
Настоящий программист знает стандарт языка на котором пишет программы, а не занимается словоблудием.
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Re: Вопросы по С/С++ (СИ)

Сообщение Psych »

veso74, По моему это решение в лоб) задачка же со звездочкой :))

f=0x400; // f=0;
b=(a<<1)-(a & 0x3FF)+f;
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Возможно, "звёздочка" тут именно в связи с тем что быстро надо сделать преобразование. Архитектура 16-битная, и сдвиг 23-битного (а по сути, 32-битного) числа будет "дороже" чем 16-битного.

Изображение

Если архитектура, например, позволяет адресовать 16-бит с 8-битным смещением, можно попробовать поэкспериментировать в направлении "вообще не трогаем младшие 8 бит", а все сдвиги и маски делаем только с оставшейся 16-битной частью. Может получиться быстрее. А может, и нет, и компилятор соптимизирует всё сам по вышепредложенным вариантам.

P.S. Кстати, варианты выше дают разный ответ, при этом, оба неправильные )

Спойлер

Код: Выделить всё

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

uint32_t f1(uint32_t a, bool f)
{
    uint32_t b = ((a << 1) & 0xFFF000) | (f << 11) | (a & 0x3FF);

    return b;
}

uint32_t f2(uint32_t a, bool i)
{
    uint32_t f = i ? 0x400 : 0;
    uint32_t b = (a << 1) - (a & 0x3FF) + f;

    return b;
}

int main()
{
    printf("---1---\n");
    {
        uint32_t a = 0x000000; // вход
        uint32_t r = 0x001000; // ожидаемый результат (12 бит в 1)

        printf("0x%06X 0x%06X\n", a, f1(a, 1));
        printf("0x%06X 0x%06X\n", a, f2(a, 1));

        printf("0x%06X 0x%06X\n", a, r);
    }
    printf("---0---\n");
    {
        uint32_t a = 0x7FFFFF; // вход
        uint32_t r = 0xFFEFFF; // ожидаемый результат (12 бит в 0)

        printf("0x%06X 0x%06X\n", a, f1(a, 0));
        printf("0x%06X 0x%06X\n", a, f2(a, 0));

        printf("0x%06X 0x%06X\n", a, r);
    }
    return 0;
}

Код: Выделить всё

---1---
0x000000 0x000800
0x000000 0x000400
0x000000 0x001000
---0---
0x7FFFFF 0xFFF3FF
0x7FFFFF 0xFFFBFF
0x7FFFFF 0xFFEFFF

P.P.S. Хотя, первый вариант всё же правильный (но только при вставке 1), если учесть что автор под 11 и 12 битом на самом деле почему-то имеет в виду понимает 10 и 11.
Последний раз редактировалось WiseLord Пт апр 01, 2022 09:34:40, всего редактировалось 3 раза.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

Psych, контроллер 16-битный, сложение и вычитание, скорее всего, будут дорогими.

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

Код: Выделить всё

uint32_t foo(uint32_t a, bool f)

  return ((a&0x7FF800)<<1) | (f?(1L<<11):0) | (a&0x7FF);
}
Затем, посмотрел бы, что там компилятор наделал. Возможно, можно что-то выжать работая со старшими и младшими 16-бит отдельно, но за неимением компилятора под эту архитектуру могу только догадываться.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Пока в победителях VladislavS :)

Спойлер

Код: Выделить всё

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

uint32_t f1(uint32_t a, bool f)
{
    uint32_t b = ((a << 1) & 0xFFF000) | (f << 11) | (a & 0x3FF);

    return b;
}

uint32_t f2(uint32_t a, bool i)
{
    uint32_t f = i ? 0x400 : 0;
    uint32_t b = (a << 1) - (a & 0x3FF) + f;

    return b;
}

uint32_t foo(uint32_t a, bool f)
{
    return ((a & 0xFFF800) << 1) | (f ? (1L << 11) : 0) | (a & 0x7FF);
}

int main()
{
    printf("---1---\n");
    {
        uint32_t a = 0x000000; // вход
        uint32_t r = 0x000800; // ожидаемый результат (11 бит в 1)

        printf("Test f1  0x%06X:  %s\n", a, f1(a, 1) == r ? "OK" : "FAIL");
        printf("Test f2  0x%06X:  %s\n", a, f2(a, 1) == r ? "OK" : "FAIL");
        printf("Test foo 0x%06X:  %s\n", a, foo(a, 1) == r ? "OK" : "FAIL");
    }
    printf("---0---\n");
    {
        uint32_t a = 0x7FFFFF; // вход
        uint32_t r = 0xFFF7FF; // ожидаемый результат (11 бит в 0)

        printf("Test f1  0x%06X:  %s\n", a, f1(a, 0) == r ? "OK" : "FAIL");
        printf("Test f2  0x%06X:  %s\n", a, f2(a, 0) == r ? "OK" : "FAIL");
        printf("Test foo 0x%06X:  %s\n", a, foo(a, 0) == r ? "OK" : "FAIL");
    }
    return 0;
}

Код: Выделить всё

---1---
Test f1  0x000000:  OK
Test f2  0x000000:  FAIL
Test foo 0x000000:  OK
---0---
Test f1  0x7FFFFF:  FAIL
Test f2  0x7FFFFF:  FAIL
Test foo 0x7FFFFF:  OK
Ответить

Вернуться в «Разные вопросы по МК»