Jump to content

    

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

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

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).

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

 

Share this post


Link to post
Share on other sites

const uint8_t SOME_CONST = 100;

expression.l_var = &SOME_CONST;

Edited by VTSei

Share this post


Link to post
Share on other sites
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;

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 hour ago, VTSei said:

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

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

Edited by jenya7

Share this post


Link to post
Share on other sites
4 minutes ago, jenya7 said:

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

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

Share this post


Link to post
Share on other sites
1 hour ago, VTSei said:

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

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

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

Share this post


Link to post
Share on other sites
23 минуты назад, jenya7 сказал:

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

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

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

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

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

 

Share this post


Link to post
Share on other sites
2 hours ago, Сергей Борщ said:

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

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


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

 

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

 

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

Edited by jenya7

Share this post


Link to post
Share on other sites
2 часа назад, jenya7 сказал:

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

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

Share this post


Link to post
Share on other sites
1 hour ago, arhiv6 said:

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

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

Share this post


Link to post
Share on other sites
3 часа назад, jenya7 сказал:

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

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

Share this post


Link to post
Share on other sites
13 минут назад, jenya7 сказал:

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

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

 

Share this post


Link to post
Share on other sites
1 hour ago, gerber said:

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

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

1 hour ago, megajohn said:

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

 

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

Share this post


Link to post
Share on other sites
24 минуты назад, jenya7 сказал:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now