Darth Vader 0 9 мая, 2019 Опубликовано 9 мая, 2019 (изменено) · Жалоба 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. На что похоже? Изменено 9 мая, 2019 пользователем Darth Vader Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 129 9 мая, 2019 Опубликовано 9 мая, 2019 · Жалоба Да не нужен автору тут указатель. Просто он услышал про новое для себя понятие и теперь пытается его впихнуть куда-нибудь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 10 мая, 2019 Опубликовано 10 мая, 2019 (изменено) · Жалоба 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; без выделения константы. но так не работает. указатель по любому надо инициализировать. Изменено 10 мая, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 129 10 мая, 2019 Опубликовано 10 мая, 2019 · Жалоба 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); без выделения константы. Не получится. У вас указатель. Он должен на что-то указывать. Вот что вы уперлись в это "без выделения константы"? чем вам константа мешает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 10 мая, 2019 Опубликовано 10 мая, 2019 · Жалоба 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 10 мая, 2019 Опубликовано 10 мая, 2019 · Жалоба 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: Не получится. У вас указатель. Он должен на что-то указывать. Вот что вы уперлись в это "без выделения константы"? чем вам константа мешает? хотел съэкономить. сто выражений - сто констант. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 10 мая, 2019 Опубликовано 10 мая, 2019 · Жалоба 3 minutes ago, jenya7 said: хотел съэкономить. сто выражений - сто констант А вам точно нужны сто РАЗНЫХ констант? Если все ваши сто указателей должны указывать на одно и то же значение (целое число 100), то выделите память и инициализируйте ОДНУ константу. А всем вашим ста указателям присвойте её адрес. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 10 мая, 2019 Опубликовано 10 мая, 2019 · Жалоба 1 hour ago, Darth Vader said: А вам точно нужны сто РАЗНЫХ констант? Если все ваши сто указателей должны указывать на одно и то же значение (целое число 100), то выделите память и инициализируйте ОДНУ константу. А всем вашим ста указателям присвойте её адрес. ну конечно это не будет 100 разных значений. будет, скажем 10-20. я еще на стадии раздумий, ищу лучший способ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 129 10 мая, 2019 Опубликовано 10 мая, 2019 · Жалоба 16 минут назад, jenya7 сказал: хотел съэкономить. сто выражений - сто констант. Даже если это 100 разных констант - это всего 400 байтов. У вас нет лишних 400 байтов флеша в вашем контроллере? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 10 мая, 2019 Опубликовано 10 мая, 2019 · Жалоба 1 hour ago, Сергей Борщ said: Даже если это 100 разных констант - это всего 400 байтов. У вас нет лишних 400 байтов флеша в вашем контроллере? вопрос насколько вырастит масив выражений. я еще не знаю. вот прикидываю варианты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 10 мая, 2019 Опубликовано 10 мая, 2019 · Жалоба Главное, что теперь вы понимаете, что 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; это совсем не одно и тоже. И что именно делает каждое из них. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба Вангую продолжение темы - "как сохранить структуру с указателями в FLASH'е" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 16 hours ago, xvr said: Вангую продолжение темы - "как сохранить структуру с указателями в FLASH'е" Да. Я таки собираюсь сохранить структуру с указателями в FLASH. а что тут не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 129 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 4 часа назад, jenya7 сказал: а что тут не так? На что будет указывать считанный указатель после обновления прошивки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 1 hour ago, Сергей Борщ said: На что будет указывать считанный указатель после обновления прошивки? я создам переменную по определенному адресу #define RAM_START 0x20000000 #define STAK_SIZE 0x2000 uint32_t my_var @RAM_START+STAK_SIZE+20; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться