Jump to content

    

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

1 hour ago, jenya7 said:

если привести не к войдовому типу то работает

В этой строке:

1 hour ago, jenya7 said:

expression.l_var = (*int) 100;

звезда точно ПЕРЕД именем типа должна быть, а не ПОСЛЕ?

Что вы сделали? Привели целое 100 к типу указателя на void, получив тем самым адрес 100, и присвоили этот адрес вашей переменной - указателю. В операции сравнения вы сделали обратное: привели значение указателя (адреса 100) к целому числу 100. Конечно, всё сравнилось.

Вам же надо было сначала привести указатель на void к указателю на int, после чего разыменовать его. И уже это сравнивать со 100. Вот правильное логическое выражение для оператора if:

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

Проверьте, истинно ли оно.

Проверьте, чему равно значение левой его части.

Откройте окно просмотра содержимого памяти. Посмотрите, что лежит по адресу 100 (0х64). Точнее в четырёх байтах по адресам 0х64-0х67. На что похоже?

Edited by Darth Vader

Share this post


Link to post
Share on other sites

Да не нужен автору тут указатель. Просто он услышал про новое для себя понятие и теперь пытается его впихнуть куда-нибудь. 

Share this post


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

Да не нужен автору тут указатель. Просто он услышал про новое для себя понятие и теперь пытается его впихнуть куда-нибудь. 

нужно вот что

если в скрипте написано

POS0 – POS1

то

expression.l_var = &motor_rt_params[0].position

expression.r_var = &motor_rt_params[1].position


а если

POS0 – 100

то

expression.l_var = &motor_rt_params[0].position

expression.r_var =  (int *)100;  без выделения константы.

 

но так не работает. указатель по любому надо инициализировать.

 

 

 

Edited by jenya7

Share this post


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

нужно вот что

Все равно непонятно, зачем тут именно указатель? У вас motor_rt_params[0].position меняется после того, как вы сделали expression.l_var  = &motor_rt_params[0].position и до того, как использовали expression.l_var?

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

expression.r_var =  (int *100);  без выделения константы.

Не получится. У вас указатель. Он должен на что-то указывать. Вот что вы уперлись в это "без выделения константы"? чем вам константа мешает?

Share this post


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

expression.r_var =  (int *100);  без выделения константы.

Проговорите действия этой строки словами, чтобы стал понятен смысл: приводим целое число 100 к типу указателя на целое. Получаем адрес 100. Присваиваем этот адрес указателю expression.r_var. Теперь точно известен адрес в памяти, на который указывает указатель - это адрес 100. Однако, то, что находится по этому адресу неизвестно, т.к. объект по этому адресу не был выделен и инициализирован. Это мусор. В итоге ваш указатель указывает на мусор.

Теперь сравните это с тем, чего вы хотели в своём первом посте, в самом конце. Это совсем не то. Вы хотели обратного: на точное значение адреса вам было плевать, главное, чтобы он указывал на целое число со значением 100. В такой постановке задачи без выделения памяти и инициализации её значением (100) обойтись нельзя впринципе.

Ваш указатель после инициализации должен указывать на объект в памяти. Объект в данном случае - это целое число 100. Чтобы это сделать, память под объект надо выделить и инициализировать значением 100. После этого взять адрес этого объекта и присвоить его вашему указателю. Только после этого можно гарантировать истинность логического выражения:

(*((int*)(expression.r_var)) == 100)

Share this post


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

Проговорите действия этой строки словами, чтобы стал понятен смысл: приводим целое число 100 к типу указателя на целое. Получаем адрес 100. Присваиваем этот адрес указателю expression.r_var. Теперь точно известен адрес в памяти, на который указывает указатель - это адрес 100. Однако, то, что находится по этому адресу неизвестно, т.к. объект по этому адресу не был выделен и инициализирован. Это мусор. В итоге ваш указатель указывает на мусор.

Теперь сравните это с тем, чего вы хотели в своём первом посте, в самом конце. Это совсем не то. Вы хотели обратного: на точное значение адреса вам было плевать, главное, чтобы он указывал на целое число со значением 100. В такой постановке задачи без выделения памяти и инициализации её значением (100) обойтись нельзя впринципе.

Ваш указатель после инициализации должен указывать на объект в памяти. Объект в данном случае - это целое число 100. Чтобы это сделать, память под объект надо выделить и инициализировать значением 100. После этого взять адрес этого объекта и присвоить его вашему указателю. Только после этого можно гарантировать истинность логического выражения:

(*((int*)(expression.r_var)) == 100)

да. уже прогнал. финт не работает. :)

 

1 hour ago, Сергей Борщ said:

Не получится. У вас указатель. Он должен на что-то указывать. Вот что вы уперлись в это "без выделения константы"? чем вам константа мешает?

хотел съэкономить. сто выражений - сто констант.

Share this post


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

хотел съэкономить. сто выражений - сто констант

А вам точно нужны сто РАЗНЫХ констант? Если все ваши сто указателей должны указывать на одно и то же значение (целое число 100), то выделите память и инициализируйте ОДНУ константу. А всем вашим ста указателям присвойте её адрес.

Share this post


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

А вам точно нужны сто РАЗНЫХ констант? Если все ваши сто указателей должны указывать на одно и то же значение (целое число 100), то выделите память и инициализируйте ОДНУ константу. А всем вашим ста указателям присвойте её адрес.

ну конечно это не будет 100 разных значений. будет, скажем 10-20. я еще на стадии раздумий, ищу лучший способ.

Share this post


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

хотел съэкономить. сто выражений - сто констант.

Даже если это 100 разных констант - это всего 400 байтов. У вас нет лишних 400 байтов флеша в вашем контроллере?

Share this post


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

Даже если это 100 разных констант - это всего 400 байтов. У вас нет лишних 400 байтов флеша в вашем контроллере?

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

Share this post


Link to post
Share on other sites

Главное, что теперь вы понимаете, что

Quote

 

#define MY_CONST_VAL 100

static const int Value = MY_CONST_VAL;

expression.l_var = &Value;

 

и
 

Quote

 

#define MY_CONST_VAL 100 

expression.l_var = (int*)MY_CONST_VAL;

 

это совсем не одно и тоже.

И что именно делает каждое из них.

Share this post


Link to post
Share on other sites

Вангую продолжение темы - "как сохранить структуру с указателями в FLASH'е"

:suicide2:

Share this post


Link to post
Share on other sites
16 hours ago, xvr said:

Вангую продолжение темы - "как сохранить структуру с указателями в FLASH'е"

:suicide2:

Да. Я таки собираюсь сохранить структуру с указателями в FLASH. а что тут не так?

Share this post


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

а что тут не так?

На что будет указывать считанный указатель после обновления прошивки?

Share this post


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

На что будет указывать считанный указатель после обновления прошивки?

я создам переменную по определенному адресу

#define RAM_START 0x20000000
#define STAK_SIZE 0x2000

uint32_t my_var @RAM_START+STAK_SIZE+20;

 

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