Показано с 1 по 16 из 16

Тема: Макропрограммирование в С :-(

  1. #1
    Завсегдатай
    Автор темы
    Аватар для Инквизитор
    Регистрация
    18.06.2004
    Адрес
    Сколково
    Сообщений
    2,005

    По умолчанию Макропрограммирование в С :-(

    Столкнулся с такой задачей - нужно реализовать в С макрос в котором будет объявляться переменная для хранения промежуточных данных. Причем переменная не должна умирать после завершения кода макроса, чтобы в последующем цикле макрос мог взять из нее данные. Мало того, этот макрос будет встречаться в коде сотни раз и в каждом месте он должен создавать свою переменную. Т.е. когда макрос встречается в коде первый раз, он должен создавать переменную VAR0001 , второй раз VAR0002 и т.д. Если переменная уже создана, т.е. макрос в этом месте выполняется повторно, то ее описание должно игнорироваться. В VisualDSP это реализуется автоматически, но как реализовать этот кошмар в С ???

  2. #2
    Завсегдатай Аватар для yan
    Регистрация
    21.12.2004
    Адрес
    Чебоксары
    Возраст
    46
    Сообщений
    1,267

    По умолчанию Re: Макропрограммирование в С :-(

    Какие критерии того, что макрос вызван в первый раз, или не в первый?
    Чья реализация C?

    можно попробовать что-то типа
    #define f() int i;{i=....}

  3. #3
    Завсегдатай
    Автор темы
    Аватар для Инквизитор
    Регистрация
    18.06.2004
    Адрес
    Сколково
    Сообщений
    2,005

    По умолчанию Re: Макропрограммирование в С :-(

    Какие критерии того, что макрос вызван в первый раз, или не в первый?
    Чья реализация C?
    Если переменная УЖЕ объявлена для макроса находящегося в этом месте кода, то она повторно не создается. IAR5.11 для ARM

    можно попробовать что-то типа
    #define f() int i;{i=....}
    Ну тогда i только один раз будет объявлена. А нужно, чтобы в следующем макросе объявилась уже i0002 и т.д.
    Кроме того, повторная вставка такого макроса приведет к повторному объявлению переменной

  4. #4
    Завсегдатай Аватар для yan
    Регистрация
    21.12.2004
    Адрес
    Чебоксары
    Возраст
    46
    Сообщений
    1,267

    По умолчанию Re: Макропрограммирование в С :-(

    #define f() {static int i=0; i=...;}
    переменная i будет создана один раз, видима только внутри макроса, и при следующих переходах на этот участок кода пересоздаваться не будет.

    Цитата Сообщение от Dark Abbat Посмотреть сообщение
    IAR5.11 для ARM
    IAR особо не пользовал, только примерчики поначалу смотрел. GCC полностью устраивает.
    Почему выбран IAR? Уже куплен, или используется какой-то хитрый адаптер jtag?

  5. #5
    Завсегдатай
    Автор темы
    Аватар для Инквизитор
    Регистрация
    18.06.2004
    Адрес
    Сколково
    Сообщений
    2,005

    По умолчанию Re: Макропрограммирование в С :-(

    static не работает, уже пробовал, компилятор ругается. IAR по причине того, что жытаг к нему привязан.

  6. #6
    Завсегдатай Аватар для yan
    Регистрация
    21.12.2004
    Адрес
    Чебоксары
    Возраст
    46
    Сообщений
    1,267

    По умолчанию Re: Макропрограммирование в С :-(

    Цитата Сообщение от Dark Abbat Посмотреть сообщение
    static не работает, уже пробовал, компилятор ругается.
    Очень странно. Что пишет конкретно?

    Цитата Сообщение от Dark Abbat Посмотреть сообщение
    жытаг к нему привязан
    Каким образом привязан?
    Даже родной ИАРовский джитаг нормально работает через сеггеровский gdb-сервер.

  7. #7
    Старый знакомый Аватар для Quasar
    Регистрация
    16.03.2005
    Адрес
    Russia, Moscow.
    Сообщений
    620

    По умолчанию Re: Макропрограммирование в С :-(

    static должен работать.
    Спонсор данного сообщения - Газпром.

  8. #8
    Завсегдатай
    Автор темы
    Аватар для Инквизитор
    Регистрация
    18.06.2004
    Адрес
    Сколково
    Сообщений
    2,005

    По умолчанию Re: Макропрограммирование в С :-(

    Error[Pe028]: expression must have a constant value

  9. #9
    Старый знакомый Аватар для Quasar
    Регистрация
    16.03.2005
    Адрес
    Russia, Moscow.
    Сообщений
    620

    По умолчанию Re: Макропрограммирование в С :-(

    Dark Abbat

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

  10. #10
    Завсегдатай
    Автор темы
    Аватар для Инквизитор
    Регистрация
    18.06.2004
    Адрес
    Сколково
    Сообщений
    2,005

    По умолчанию Re: Макропрограммирование в С :-(

    А вот, щас заработало. Теперь нужно сделать чтобы в каждом месте, где вызывается макрос генериловалась СВОЯ переменная, а сам макрос должен быть один. Т.е.

    #define swap(x,y){ static int tmp=0; tmp=(x);(x)=(y);(y)=tmp;};

    // тело программы
    swap(in1, in2); //внутри должна сгенерироваться и в дальнейшем использоваться при повторных вызовах переменная tmp0001
    swap(in3, in4); //внутри должна сгенерироваться и в дальнейшем использоваться при повторных вызовах переменная tmp0002
    swap(in5, in6); //внутри должна сгенерироваться и в дальнейшем использоваться при повторных вызовах переменная tmp0003

  11. #11
    Завсегдатай Аватар для yan
    Регистрация
    21.12.2004
    Адрес
    Чебоксары
    Возраст
    46
    Сообщений
    1,267

    По умолчанию Re: Макропрограммирование в С :-(

    Цитата Сообщение от Dark Abbat Посмотреть сообщение
    должна сгенерироваться и в дальнейшем использоваться при повторных вызовах переменная tmp0001
    А просто tmp не устраивает? Какая разница, как называется эта внутреняя переменная?

  12. #12
    Завсегдатай
    Автор темы
    Аватар для Инквизитор
    Регистрация
    18.06.2004
    Адрес
    Сколково
    Сообщений
    2,005

    По умолчанию Re: Макропрограммирование в С :-(

    А tmp в swap(in1, in2); и в swap(in3, in4); будет одна и та же или нет? swap - это как пример, в реальности там сложнее алгоритмы. Мне нужно, чтобы в tmp swap(in1, in2); хранилось одно значение, в tmp swap(in3, in4); - другое, и чтобы значение этой самой tmp не умирало после завершения макроса

  13. #13
    Завсегдатай Аватар для yan
    Регистрация
    21.12.2004
    Адрес
    Чебоксары
    Возраст
    46
    Сообщений
    1,267

    По умолчанию Re: Макропрограммирование в С :-(

    Код
    #define макро {static tmp;...}
    макро;
    ....
    макро;

    преобразуется препроцессором в:

    {static tmp;...}
    ....
    {static tmp;...}

    этот код и уйдёт в компилятор.
    На каждое появление в коде конструкции {static tmp;...} будет выделена отдельная переменная tmp, которая будет создана и проинициализирована только один раз, и будет существовать и хранить значения до окончания работы программы. Каждая переменная tmp будет видима только внтури своих скобок {}

  14. #14
    Завсегдатай
    Автор темы
    Аватар для Инквизитор
    Регистрация
    18.06.2004
    Адрес
    Сколково
    Сообщений
    2,005

    По умолчанию Re: Макропрограммирование в С :-(

    Спасибо!!!

  15. #15
    Не хочу! Аватар для Alex
    Регистрация
    20.03.2003
    Адрес
    Worldwide
    Возраст
    61
    Сообщений
    36,132

    По умолчанию Re: Макропрограммирование в С :-(

    А написать функцию с внутренней статической перменной, и инлайн ее ?
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Ну что, можете меняться обратно."(с)типа анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

  16. #16
    Завсегдатай Аватар для yan
    Регистрация
    21.12.2004
    Адрес
    Чебоксары
    Возраст
    46
    Сообщений
    1,267

    По умолчанию Re: Макропрограммирование в С :-(

    Цитата Сообщение от Alex Посмотреть сообщение
    инлайн ее
    Тогда будет всего одна статическая переменная. А Dark Abbatу нужно несколько.

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •