1. Внимание!
    Объявились мошенники, которые представляются администрацией форума и обманывают покупателей. У них есть своя группа ВКонтакте, копирующая нашу, и несколько аккаунтов, маскирующихся под аккаунты администраторов и гарантов форума.
    При проведении любых сделок с администраторами, гарантами и пользователями BlastHack настойчиво требуйте у них написать вам личное сообщение на форуме и ни в коем случае не продолжайте сделку при отказе выполнять это требование или если сообщение не было получено.

Вопрос [Вопрос] Работа с define и её странности (Проблема решена)

Тема в разделе "PAWN", создана пользователем Zoxan_Twist, 22 янв 2016.

Статус темы:
Закрыта.
  1. Zoxan_Twist

    Zoxan_Twist Известный пользователь

    Регистрация:
    14.03.14
    Сообщения:
    127
    Лайки:
    23
    Репутация:
    7
    Доброго времени суток.
    Есть цель:
    Вывести число с созданного ранее define.
    Пример:
    Код (Text):
    Выделить всё двойным кликом
    #define value 200
    #define Trans_val(%1)    "%1"

    public OnGameModeInit()
    {
        print("Значение: "Trans_val(value)" выведено успешно");
        return1;
    }
    В итоге мы получаем: "Значение: %1 выведено успешно"
    Я понимаю что "%1" компилятор воспринимает как строку и не замечает что %1 это какое-то значение из ранее созданного define. Долго думал как это можно обойти. Но так в голову ничего толкового не пришло. Прошу помощи у тех кто хоть что либо в этом смыслит.
    Заранее спасибо.
    P.s. Если кто-то подумает "А не проще ли выделить память и сделать форматирование?". Отвечу "Не проще ибо этот способ хоть и будет и легкий но не для меня".
     
    #1
  2. Dark_Knight

    Dark_Knight РКН Тян
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.193
    Лайки:
    594
    Репутация:
    188
    Ем... У тебя там единица.
     
    #2
  3. Zoxan_Twist

    Zoxan_Twist Известный пользователь

    Регистрация:
    14.03.14
    Сообщения:
    127
    Лайки:
    23
    Репутация:
    7
    В итоге после компиляции я должен получить это:
    Код (Text):
    Выделить всё двойным кликом
    print("Значение: ""200"" выведено успешно");
    Что выведет в консоли: Значение: 200 выведено успешно
    А не вот это:
    Код (Text):
    Выделить всё двойным кликом
    print("Значение: ""%1"" выведено успешно");
    хоть поставлю %0 или %1. Разницы никакой. Это на коде никак не скажется.
    Пытался поставить скобки в отдельном define но смысла с этого не было никакого
     
    #3
  4. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.126
    Лайки:
    729
    Репутация:
    442
    Зачем так издеваться над бедным препроцессором? Ещё и в Pawn.
    Непонятно за что ты так его. Используй printf для форматирования.
     
    #4
  5. Zoxan_Twist

    Zoxan_Twist Известный пользователь

    Регистрация:
    14.03.14
    Сообщения:
    127
    Лайки:
    23
    Репутация:
    7
    С выводом в консоль проблем нет, согласен. Но как только доходит дело до SendClientMessage там то без форматирования никак. Оно меня не устраивает что и подтолкнуло на такой выход. Все бы было хорошо если бы не ( " " ) - эти скобки. Как говорил ранее они воспринимают %1 как строку, а не define как нужно.
     
    #5
  6. FYP

    FYP админ какой-то

    Регистрация:
    09.03.13
    Сообщения:
    864
    Лайки:
    1.717
    Репутация:
    687
    #define Trans_val(%1) #%1
     
    #6
    Zoxan_Twist нравится это.
  7. Zoxan_Twist

    Zoxan_Twist Известный пользователь

    Регистрация:
    14.03.14
    Сообщения:
    127
    Лайки:
    23
    Репутация:
    7
    Спасибо огромное за ответ, но к этому времени я уже сам это понял :D

    Значит объясню тем кто не понял:
    #define Trans_val(%1) #%1

    #define - Создание макроса.
    Trans_val - название макроса.
    %1 - входящее значение
    #%1 - самое главное
    # - присваивает значению %1 "скобки"
    %1 - само значение которое входит в макрос (если так можно выразиться).

    Пример:

    До компиляции:
    Код (Text):
    Выделить всё двойным кликом
    #define Trans_val(%1)   #%1
    #define val   200

    main() {
    print("Значение c define: " Trans_val(val) " записано без форматирования");
    }
    После компиляции:
    Код (Text):
    Выделить всё двойным кликом
    print("Значение в define: " Trans_val(val) " записано без форматирования");
    будет заменено на:
    Код (Text):
    Выделить всё двойным кликом
    print("Значение в define: 200 записано без форматирования");
    А сам:
    Код (Text):
    Выделить всё двойным кликом
    #define val   200
    будет удален
     
    #7
    Последнее редактирование: 22 янв 2016
Статус темы:
Закрыта.