Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Сб мар 26, 2022 09:04:38

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

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


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

:)

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

Сб мар 26, 2022 13:33:04


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

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

Сб мар 26, 2022 14:18:15

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

int a;
return(a);
Скобки делают возвращаемый тип int& вместо int; В обычной работе это не важно. Но при использовании автоматического вывода возвращаемого типа (decltype (auto) ) это может порождать проблемы.

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

Сб мар 26, 2022 17:34:45

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


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 раз.

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

Сб мар 26, 2022 17:45:56

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

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

Сб мар 26, 2022 18:18:43

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

Ваш посыл понял так: Это риск ошибки. Если-уж разобрался где должен быть void,а где int,то желательно делай как надо.Будь любезен держи ситуацию за яйца. Тем более тут всего 10-15 строк кода. Если это игнорировать, то в более длинном коде возможны гораздо более серьезные проблемы. Масштаб которых я осознать еще не готов.
Верно понял?

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

Сб мар 26, 2022 22:47:36

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

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

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

Вс мар 27, 2022 08:18:46

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

Это особенность неграмотных mudozvonов. Знаний- ноль, а произвести впечатление серьёзного парня очень хочется, вот как барбосы и поливают всё и и всех своими испражнениями, ибо другие способы самовыражения им не доступны. Они что-то читать начинают, только тужась хоть что-то выдать из себя на обоснованный ответ. Для них главное- по3.14здеть. Поэтому, VladislavS, не втягивайся в пустой трёп. Те, кто понял тебя и ему нужна будет твоя помощь, напишут тебе в личку и там всё обсудят. Я тут на форуме встретил несколько толковых людей, с которыми давно общаемся по телефону и в месенджерах, чтобы всякие чудозвоны не мешали своей брехнёй.

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

Вс мар 27, 2022 09:59:04

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

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

Вс мар 27, 2022 10:18:21

Ну а чем ещё брать? Только глоткой.(

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

Ср мар 30, 2022 17:38:35

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


Например:

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"

Что нужно почитать/в какую сторону гуглить дабы разобраться в этом/что вообще происходит?

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

Ср мар 30, 2022 18:24:48

То не проще-ли уволить всех void, и применять всегда только int ?
А может вам не стоит заниматься программированием? Ну видно же, что это не ваше.

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

Чт мар 31, 2022 09:30:04

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

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

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

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

Чт мар 31, 2022 19:34:11

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

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

Архитектура AMSC-96 (16 бит).

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

Чт мар 31, 2022 20:09:14

Если правильно понял задачу (а Вы не пошутили с постановке задачи и для звездочки :) ), то:
Код:
  bool f = 1;
  uint32_t a = 0b10111101010101011001010;
  uint32_t b = ((a << 1) & 0xFFF000) | (f << 11) | (a & 0x3FF);

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

Чт мар 31, 2022 20:29:57

настоящий программист никогда не сомневается в догмах, сказанных гуру.
Настоящий программист знает стандарт языка на котором пишет программы, а не занимается словоблудием.

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

Пт апр 01, 2022 07:38:25

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

f=0x400; // f=0;
b=(a<<1)-(a & 0x3FF)+f;

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

Пт апр 01, 2022 09:00:43

Возможно, "звёздочка" тут именно в связи с тем что быстро надо сделать преобразование. Архитектура 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 раз(а).

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

Пт апр 01, 2022 09:12:34

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

Я бы написал тупо в лоб и доверил оптимизировать компилятору.
Код:
uint32_t foo(uint32_t a, bool f)

  return ((a&0x7FF800)<<1) | (f?(1L<<11):0) | (a&0x7FF);
}
Затем, посмотрел бы, что там компилятор наделал. Возможно, можно что-то выжать работая со старшими и младшими 16-бит отдельно, но за неимением компилятора под эту архитектуру могу только догадываться.

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

Пт апр 01, 2022 09:41:46

Пока в победителях 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
Ответить