jenya7 0 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба Есть структура с указателями на переменные 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). Можно как то поизвращаться на этот счет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VTSei 0 8 мая, 2019 Опубликовано 8 мая, 2019 (изменено) · Жалоба const uint8_t SOME_CONST = 100; expression.l_var = &SOME_CONST; Изменено 8 мая, 2019 пользователем VTSei Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 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; это раздувает структуру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VTSei 0 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба необязательно это в структуру добавлять Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 мая, 2019 Опубликовано 8 мая, 2019 (изменено) · Жалоба 1 hour ago, VTSei said: необязательно это в структуру добавлять мне потом все это дело нужно во флеш сохранить. и у меня будет массив структур. Изменено 8 мая, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VTSei 0 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 4 minutes ago, jenya7 said: мне потом все это дело нужно во флеш сохранить. значение для инициализации в любом случае нужно где-то хранить, как ни извращайся Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 1 hour ago, VTSei said: значение для инициализации в любом случае нужно где-то хранить, как ни извращайся *((int*)(expression.l_var)) = 100; даже не ругается. вопрос как это сохранить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 23 минуты назад, jenya7 сказал: *((int*)(expression.l_var)) = 100; даже не ругается. вопрос как это сохранить. Вот только делает не то, что вы хотели. Ваш код портит ту ячейку памяти, на которую указывал expression.l_var. То, что вы хотели, выглядит вот так: { static int Value = 100; expression.l_var = &Value; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 мая, 2019 Опубликовано 8 мая, 2019 (изменено) · Жалоба 2 hours ago, Сергей Борщ said: Вот только делает не то, что вы хотели. Ваш код портит ту ячейку памяти, на которую указывал expression.l_var. То, что вы хотели, выглядит вот так: { static int Value = 100; expression.l_var = &Value; } я понял. как ни крути придется выделить область констант. интересно а если я пишу в коде if ( (var - 100) > 50 ) где сохраняются константные значения 100 и 50 после компиляции? есть специальная область во флеш памяти? Изменено 8 мая, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arhiv6 18 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 2 часа назад, jenya7 сказал: интересно а если я пишу в коде if ( (var - 100) > 50 ) где сохраняются константные значения 100 и 50 после компиляции? есть специальная область во флеш памяти? Прочитайте про секции памяти (.text, .data, .bss, .noinit, .rodata и т.п.). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 1 hour ago, arhiv6 said: Прочитайте про секции памяти (.text, .data, .bss, .noinit, .rodata и т.п.). меня как раз интересует и т.п. интересно как конвейер формирует машинные команды к исполнению. в опкоде команды ведь не зашиты указатели на переменные и константы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 3 часа назад, jenya7 сказал: интересно а если я пишу в коде if ( (var - 100) > 50 ) где сохраняются константные значения 100 и 50 после компиляции? есть специальная область во флеш памяти? В таких (простых) случаях компилятор использует инструкции, работающие с immediate value, или же располагает константы в теле кода, где-то "неподалеку" от текущего адреса выполнения (регистр PC) с near-доступом относительно PC. Таким образом, расходования области констант не происходит, к тому же это намного быстрее, чем "лазить" в другой сегмент памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 7 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 13 минут назад, jenya7 сказал: меня как раз интересует и т.п. интересно как конвейер формирует машинные команды к исполнению. в опкоде команды ведь не зашиты указатели на переменные и константы. за семь лет так и не научиться смотреть ассемблерный код ? Да и участники каждый раз тычут вас носом в ассемблер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 1 hour ago, gerber said: В таких (простых) случаях компилятор использует инструкции, работающие с immediate value, или же располагает константы в теле кода, где-то "неподалеку" от текущего адреса выполнения (регистр PC) с near-доступом относительно PC. Таким образом, расходования области констант не происходит, к тому же это намного быстрее, чем "лазить" в другой сегмент памяти. понял. спасибо. 1 hour ago, megajohn said: за семь лет так и не научиться смотреть ассемблерный код ? Да и участники каждый раз тычут вас носом в ассемблер. mov r0, #10 - отсюда не ясно где лежит 10 после линкера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 24 минуты назад, jenya7 сказал: mov r0, #10 - отсюда не ясно где лежит 10 после линкера. В опкоде инструкции же, это и есть immediate value. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться