• Указатели в языке Си?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему программа завершилась? Вмешалась ОС? Но если так, то почему?

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

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

    Значение указателя ты поменять можешь, но это не то, что было написано в коде. В коде было написано поменять значение на которое указатель указывает. Поменять указатель было бы a = (int *)10;

    могу ли я указателю дать ссылку на конкретную ячейку в памяти?

    Можешь, но под ОС с виртуальной памятью это в большинстве случаев не имеет смысла. API в таких ОС обычно устроены так, что ты просишь выделить область памяти с заданными характеристиками, а ОС выполняет выделение и возвращает тебе адрес выделенного участка.

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

    В памяти всё хранится как последовательность байтов. Любую последовательность байтов можно проинтерпретировать как указатель. Но чтобы компилятор С понял что ты имеешь в виду, ему надо явно сказать, что ты хочешь проинтерпретировать целое число как адрес: int *a = (int *)0x0061FF18;
    Ответ написан
    Комментировать
  • Почему char - 1 байт, а символьный литерал ('A') - 4?

    @Mercury13
    Программист на «си с крестами» и не только
    А теперь скажу правильный ответ.
    В Си символьный литерал имеет тип int и потому его sizeof 4 байта.
    В Си++ у него тип char и 1 байт. Потому те, кто создавал CPP-файл, проблемы не видели. Очевидно, связано с перегрузкой функций: как-то не хочется, чтобы в foo('A') вызывалась версия для int.
    #include <stdio.h>
    
    int main()
    {
        int sz = sizeof('A');  // латинское
        printf("sz = %d\n", sz);
        return 0;
    }

    Си: 4
    Си++: 1

    При написании char test='A' на стеке будет 1 байт (+выравнивание). Здесь Си, грубо говоря, проводит преобразование типа — прямо при компиляции. Если написать char test=L'Й', сообщит, что преобразование при компиляции ushort→char обрежет результат с 1049 до 25.
    Ответ написан
    Комментировать
  • Почему char - 1 байт, а символьный литерал ('A') - 4?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Я понял, что то, что мы называем символами, на самом деле является числовым кодом

    Все в компьютере хранится в виде бит, сгруппированных по байтам.
    Символ - абстракция для упрощения программирования, и есть различные таблицы кодировки для того, чтобы преобразовывать байты в символы при выводе на экран.
    Количество байт, нужных на символ зависит собственно от кодировки.
    В старых кодировках один байт означал один символ, в современных UTF, количество байт может быть разное (до 6 байт на символ в виде иероглифа).

    а потому символьным литералам выделяется столько же памяти, сколько и типу int (4 байта).

    Юзай typeid чтобы уточнить тип данных

    Но я не совсем понял, как в однобайтный char вмещается четырехбайтный символ?

    никак, это не char.
    в С по дефолту char это однобайтный символ в ascII

    И когда я объявляю char test = 'A'; то сколько в компьютере выделилось памяти: 1 байт или 4?

    Ты же сам указываешь тип при объявлении. Надо было привести код целиком.

    (Если попробовать sizeof(test), то выйдет, что все таки 1. Но ведь 'A' - это 4 байта?)
    'A' это значение, а не тип. Может быть это int?
    Ответ написан
    Комментировать
  • Вложенные Reply Keyboards в Telebot?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Ну, с одной кнопкой вы справились.

    if message.text == 'Супы ':

    А по аналогии другие добавить?
    if message.text == 'Борщ':
      # ...
    elif message.text == 'Солянка':
      # ...
    Ответ написан
    3 комментария
  • Почему компилятор ругается?

    @TheCalligrapher
    Потому что написанное вами выражение не соответствует грамматике языка С вообще, т.е. является синтаксической ошибкой. Никакой из вариантов парсинга этого выражения не вписывается в грамматические правила языка. То есть ваше выражение с точки зрения языка С - это бессмысленный набор лексем.

    Чтобы сделать это выражение синтаксически корректным, вы можете добавить в него скобки:

    • ch == 'h' ? (high = guess) : (low = guess)
    • (ch == 'h' ? high = guess : low) = guess
    • еще как-то


    Популярный и часто приводимый ответ о том, что это выражение в С якобы интерпретируется как (ch == 'h' ? high = guess : low) = guess является грубо неверным. Еще раз: этот набор лексем не имеет вообще никакой интерпретации в грамматике языка С. Его невозможно пропарсить в принципе.

    Сообщение, которые вы получили от компилятора ("error: lvalue required as left operand of assignment") говорит о том, что данный компилятор где-то "срезает углы" для экономной/унифицированной реализации грамматик сразу двух языков - С и С++. Грамматики этих языков очень похожи в общем, но сильно отличаются в деталях. Побочным эффектом такой унифицированной реализации является то, что компиляторы иногда выдают сбивающие с толку диагностические сообщения. Сообщения об ошибках не стандартизованы, т.е. формально придраться тут не к чему, но фактически полученное вами сообщение об ошибке вас нагло обманывает. Никакого "lvalue required" тут нет, а есть просто синтаксически некорректный набор лексем.
    Ответ написан
    5 комментариев
  • Почему компилятор ругается?

    xorknown
    @xorknown
    Будут проблемы - решайте
    По стандарту Си он вычисляется как logical-OR-expression ? expression : conditional-expression - это означает, что второй операнд может быть любым выражением(даже применять оператор ,), а третий операнд подчиняется логике приоритета и должен быть выше или равен по сравнению с тернарным оператором. В данном случае это вычисляется как ((ch == 'h') ? (high = guess) : low) = guess. Оператор ?: возвращает временное значение, и компилятор говорит об этом.
    Ответ написан
    2 комментария
  • Магия int при делении на float?

    wisgest
    @wisgest
    Не ИТ-специалист
    а затем в printf вывести через символ преобразования для целых чисел, то есть %d

    Это не символ преобразования, ничего не преобразуется: вы сами сообщаете (обманываете) printf о типе переданных данных.
    Преобразование выполняется как-то так
    printf("%d", (int)(b*a));
    Ответ написан
    2 комментария
  • Магия int при делении на float?

    SagePtr
    @SagePtr
    Еда - это святое
    Цифры странные берутся, когда в ячейке памяти хранится один тип, а printf ожидает увидеть другой, потому неправильно представляет его. Округлять или ещё как-нибудь преобразовывать типы за вас printf не будет, что ему скажут, то он и выведет.
    Ответ написан
    Комментировать
  • Telebot: Условные операторы в ReplyKeyboardMarkup?

    WolfInChains
    @WolfInChains
    @bot.message_handler(content_types=['text'])
    def lalala(message):
        if message.chat.type == 'private':
            if message.text == 'album':
    
                markup = types.InlineKeyboardMarkup(row_width=2)
                item1 = types.InlineKeyboardButton("variant1", callback_data='v1')
                item2 = types.InlineKeyboardButton("variant2", callback_data='v2')
    
                markup.add(item1, item2)
    
                bot.send_message(message.chat.id, 'Что имеено интересует', reply_markup=markup)
    
            elif message.text == 'profile':
    
                markup = types.InlineKeyboardMarkup(row_width=2)
                item3 = types.InlineKeyboardButton("variant1", callback_data='v3')
                item4 = types.InlineKeyboardButton("variant2", callback_data='v4')
    
                markup.add(item3, item4)
    
                bot.send_message(message.chat.id, 'Что именно интересует', reply_markup=markup)
    
            elif message.text == 'insta':
    
                markup = types.InlineKeyboardMarkup(row_width=2)
                item5 = types.InlineKeyboardButton("variant1", callback_data='v5')
                item6 = types.InlineKeyboardButton("variant2", callback_data='v6')
    
                markup.add(item5, item6)
    
                bot.send_message(message.chat.id, 'Что именно интересует', reply_markup=markup)
    
            elif message.text == 'facebook':
    
                markup = types.InlineKeyboardMarkup(row_width=2)
                item7 = types.InlineKeyboardButton("variant1", callback_data='v7')
                item8 = types.InlineKeyboardButton("variant2", callback_data='v8')
    
                markup.add(item7, item8)
    
                bot.send_message(message.chat.id, 'Что именно интересует', reply_markup=markup)
    
            elif message.text == 'youtube':
    
                markup = types.InlineKeyboardMarkup(row_width=2)
                item9 = types.InlineKeyboardButton("variant1", callback_data='v9')
                item10 = types.InlineKeyboardButton("variant2", callback_data='v10')
    
                markup.add(item9, item10)
    
                bot.send_message(message.chat.id, 'Что именно интересует', reply_markup=markup)
    
            else:
                bot.send_message(message.chat.id, 'Я не знаю такой команды')
    
    @bot.callback_query_handler(func=lambda call: True)
    def callback_inline(call):
        try:
            if call.message:
                if call.data == 'v1':
                #что должен сделать бот
                elif call.data == 'v2':
                #что должен сделать бот
                #и так далее
        except Exception as e:
         print(repr(e))
    Ответ написан
    Комментировать
  • Telebot: Условные операторы в ReplyKeyboardMarkup?

    @OdAs
    Начинающий пайтон програмист
    Здравствуй , Во первых я бы посоветовал немного изменить код и написать следующим образом:
    table = types.ReplyKeyboardMarkup()

    button_album = types.KeyboardButton('album')
    button_profile = types.KeyboardButton('profile')
    button_instagram = types.KeyboardButton('insta')
    button_facebook = types.KeyboardButton('facebook')
    button_youtube = types.KeyboardButton('youtube')

    table.add(button_album, button_profile, button_instagram, button_facebook, button_youtube)

    здесь надо вставить текст к которому собственно будет привязана клавиатура и сделать еще один хендлер который будет начинать работу бота :

    @bot.message_handler(command=["start"])
    def start(message):
    bot.send_message(message.chat.id, " какойто текст ", reply_markup = table)

    Дальше надо добавить хендлер.Так как при нажатии кнопки бот пишет сообщение, тебе надо просто написать обработчик по типу такого:

    @bot.message_handler(content_types=["text"])
    def lalala(message):
    if message.chat.type == "private": # обозначает что сообщение написано именно в этот чат
    if message.text == "текст который будет написан после нажатия кнопки(текст кнопки) или тот который пользователь написал боту":
    #и тут то что будет делать бот

    Еще помни что одному сообщению можно прикрепить только одну клавиатуру и в клавиатуру нельзя добавлять другую клавиатуру не смотря на ее тип
    Ответ написан
    6 комментариев
  • Assembler - как первый язык для изучения?

    @Pantene742
    Учить можно как снизу вверх так и снизу вверх. Или всегда оставаться в своем Layere. Если ты хочешь пойти к C#/JS/Ruby/Python/Swift от ASM это не плохо ))
    Ответ написан
    Комментировать
  • Для чего нужны множества в Python?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Навскидку:
    - для быстрого удаления дубликатов, поскольку множества могут содержать только уникальные элементы
    - для выполнения математических операций объединения, пересечения, разности множеств

    5e503f571b5b1835632879.png

    5e5040755bcb8877629316.png
    Ответ написан
    1 комментарий
  • Для чего нужны множества в Python?

    @kunjut19
    как и сказал Владимир. Нужно хранить уникальные данные и не важно в каком порядке? Используйте множества - с ними быстрее работать. Такими данными могут быть хэши или перечисление всех слов, встречаемых в тексте.
    Ответ написан
    Комментировать
  • Для чего нужны множества в Python?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Множества - это не "рандомный список". Почитайте. Нужны они для быстрых операций с их членами - пересечением, объединением, разностью. У Скиены, если мне не изменяет память, был пример оценки скорости поиска пересечения. Для множеств из миллиона элементов это заняло 0,02 микросекунды, для соразмерных списков 15 минут.
    Ответ написан
    Комментировать
  • Можно ли писать вирусы на python?

    AlexDarkStalker
    @AlexDarkStalker
    Хочу научится программировать на Python
    Я увлекся пайтоном может с 2 месяца назад. Я написал на нем себе для компьютера ассистента с распознаванием речи(очень глупого, но все же он облегчает мне жизнь), написал парсер погоды(и встроил в ассистента), хотел поиграться с нейронными сетями, но понял что 2 месяца - это довольно короткий срок, и решил лучше подучить как пайтон, так и всякую теорию, которая может пригодиться программисту. Думал про написание вирусов, но даже не приступил, потому что вспомнил, что питон не компилируется, и получается вирус должен всегда носить с собой интерпритатор, который много весит(для вируса). Я думаю пайтон больше подходит для частного пользования, всяких научных исследований и других полезных штуках, чем для написания вирусов. Для вирусописания лучше использовать языки из семейства Си, т.к. в мире много компов с операционной системой Windows.
    Если что неправильно написал, не бейте сильно, я еще маленький программист.
    Ответ написан
    2 комментария
  • Можно ли писать вирусы на python?

    @MadridianFox
    Web-программист, многостаночник
    Вирус - только на компилируемых в нативный машинный код языках. В основном на ассемблере и си. Дело в том что вирус это код, который умеет записать себя в почти программу, которую найдет на диске. И записать код в exe файл это совсем не то же самое что дописать скрипт на php или python.
    Ответ написан
  • Можно ли писать вирусы на python?

    sim3x
    @sim3x
    Из скриптового чаще всего пишут на перле, bat, vb
    Пишут на питоне мало, потому что нужно тянуть в инсталяторе интерпритатор питона, а он не сильно маленький
    Ответ написан
    Комментировать