Перейти к содержанию
    

Передача константного значения в указатель.

Есть структура с указателями на переменные

typedef struct
{
    void *l_var; 
    void *r_var;   
}IN_EXPR;

IN_EXPR expression;

Я ее инициализирую

void * SCRIPT_ParseInVar(char * var)
{
    uint32_t mot_num;
    
    if(strncmp(var,"pos",3)==0)
    {
        if (strlen(var) < 4)
            return 0;
        mot_num = atoi(&var[4]);
        if (mot_num > MAX_IDX)
            return 0;
        else
           return &motor_rt_params[mot_num].position;
    }
    
    return 0;
}

if (expression.l_var == NULL)
    expression.l_var = SCRIPT_ParseInVar(token);

А если я хочу значение указателя инициализировать константой? То есть мне не важно на какой адрес будет указывать l_var главное чтоб значение было скажем 100 (*l_var = 100).

Можно как то поизвращаться на этот счет?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

const uint8_t SOME_CONST = 100;

expression.l_var = &SOME_CONST;

Изменено пользователем VTSei

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, VTSei said:

const uint8_t SOME_CONST = 100;

expression.l_var = &SOME_CONST;

 

тогда мне нужно добавить

typedef struct
{
    void *l_var; 
    void *r_var;  

    int32_t const_val;
}IN_EXPR;

это раздувает структуру.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, VTSei said:

необязательно это в структуру добавлять

мне потом все это дело нужно во флеш сохранить. и у меня будет массив структур.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, jenya7 said:

мне потом все это дело нужно во флеш сохранить.

значение для инициализации в любом случае нужно где-то хранить, как ни извращайся

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, VTSei said:

значение для инициализации в любом случае нужно где-то хранить, как ни извращайся

*((int*)(expression.l_var)) = 100;

даже не ругается. вопрос как это сохранить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 минуты назад, jenya7 сказал:

*((int*)(expression.l_var)) = 100;

даже не ругается. вопрос как это сохранить.

Вот только делает не то, что вы хотели. Ваш код портит ту ячейку памяти, на которую указывал expression.l_var.

То, что вы хотели, выглядит вот так:

{
	static int Value = 100;
	expression.l_var = &Value; 
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Сергей Борщ said:

Вот только делает не то, что вы хотели. Ваш код портит ту ячейку памяти, на которую указывал expression.l_var.

То, что вы хотели, выглядит вот так:


{
	static int Value = 100;
	expression.l_var = &Value; 
}

 

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

 

интересно а если я пишу в коде if ( (var - 100) > 50 ) где сохраняются константные значения 100 и 50 после компиляции? есть специальная область во флеш памяти?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, jenya7 сказал:

интересно а если я пишу в коде if ( (var - 100) > 50 ) где сохраняются константные значения 100 и 50 после компиляции? есть специальная область во флеш памяти? 

Прочитайте про секции памяти (.text, .data, .bss, .noinit, .rodata и т.п.).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, arhiv6 said:

Прочитайте про секции памяти (.text, .data, .bss, .noinit, .rodata и т.п.).

меня как раз интересует и т.п. интересно как конвейер формирует машинные команды к исполнению. в опкоде команды ведь не зашиты указатели на переменные и константы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, jenya7 сказал:

интересно а если я пишу в коде if ( (var - 100) > 50 ) где сохраняются константные значения 100 и 50 после компиляции? есть специальная область во флеш памяти?

В таких (простых)  случаях компилятор использует инструкции, работающие с immediate value, или же располагает константы в теле кода, где-то "неподалеку" от текущего адреса выполнения (регистр PC) с near-доступом относительно PC. Таким образом, расходования области констант не происходит, к тому же это намного быстрее, чем "лазить" в другой сегмент памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, jenya7 сказал:

меня как раз интересует и т.п. интересно как конвейер формирует машинные команды к исполнению. в опкоде команды ведь не зашиты указатели на переменные и константы.

за семь лет так и не научиться смотреть ассемблерный код ? Да и участники каждый раз тычут вас носом в ассемблер.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, gerber said:

В таких (простых)  случаях компилятор использует инструкции, работающие с immediate value, или же располагает константы в теле кода, где-то "неподалеку" от текущего адреса выполнения (регистр PC) с near-доступом относительно PC. Таким образом, расходования области констант не происходит, к тому же это намного быстрее, чем "лазить" в другой сегмент памяти.

понял. спасибо.

1 hour ago, megajohn said:

за семь лет так и не научиться смотреть ассемблерный код ? Да и участники каждый раз тычут вас носом в ассемблер.

 

mov r0, #10 - отсюда не ясно где лежит 10 после линкера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 минуты назад, jenya7 сказал:

mov r0, #10 - отсюда не ясно где лежит 10 после линкера.

В опкоде инструкции же, это и есть immediate value.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...