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

double в параметрах функции передается как 0

Столкнулся с тем, что параметры функции типа double передаются внутрь как 0. Если типы сменить на float - передается нормально. Keil 517

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


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

Указанных данных вполне достаточно ... для составления гороскопов:good2:

А вот для решения указанной проблемы нужно хотя бы это:

1) версия компилятора (не путать с версией среды!)

2) ключи/опции компилятора,

3) код,

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


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

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

Столкнулся с тем, что параметры функции типа double передаются внутрь как 0. Если типы сменить на float - передается нормально. Keil 517

Была cхожая проблема, но оказалось сам дурак: в функции параметры double, а в вызове и использовании было extern float. Keil при компиляции не ругался...

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


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

2 hours ago, firstvald said:

Столкнулся с тем, что параметры функции типа double передаются внутрь как 0. Если типы сменить на float - передается нормально. Keil 517

Воспользуйтесь окном дизассемблера. Посмотрите в каких регистрах (должно быть в r0-r3) передаются ваши double, и что получается, когда начинает выполнятся код функции.

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


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

30 minutes ago, firstvald said:

Компилятор 506

А остальное? :mda:

13 hours ago, Forger said:

2) ключи/опции компилятора,

3) код,

 

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


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

56 минут назад, Forger сказал:

А остальное? :mda:

Партизаны так просто не сдаются. Гестапо надо приложить усилия!  :biggrin:

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


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

19 minutes ago, jcxz said:

Партизаны так просто не сдаются. Гестапо надо приложить усилия!  :biggrin:

Партизану по ходу нужна не помощь в решении проблемы, а просто потрещать о том, о сём )))

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


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

14 часов назад, V_G сказал:

в функции параметры double, а в вызове и использовании было extern float. Keil при компиляции не ругался...

И не должен был. Он поверил вам на слово и сделал ровно то, что вы ему сказали (сгенерировал в местах вызова функции вызов функции с параметром типа float). Соответствие применения (вызова) и реализации он проверить не может из-за раздельной компиляции файлов.

Чтобы исключить такие ситуации к файлу реализации инклудят его же хедер. А в использующем файле вместо extern ... также инклудят хедер. Тогда компилятор может проверить соответствие объявления определения и использования функции.

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


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

--c99 -c --cpu Cortex-M4.fp -g -O1 --apcs=interwork --split_sections -I../Inc -I../Drivers/STM32L4xx_HAL_Driver/Inc -I../Drivers/STM32L4xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32L4xx/Include -I../Drivers/CMSIS/Include -I..\Drivers\STM32L4xx_HAL_Driver\Inc\ --C99 --feedback=aaa.txt 
-I "C:\Keil_v5\ARM\workspace\FLOW\V69 15 10 2020\TST_PRG\MDK-ARM\RTE" 
-I C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.5.1\CMSIS\Core\Include 
-I C:\Keil_v5\ARM\PACK\Keil\STM32L4xx_DFP\2.4.0\Drivers\CMSIS\Device\ST\STM32L4xx\Include 
-I C:\Keil_v5\ARM\PACK\Keil\STM32L4xx_DFP\2.4.0 
-D__UVISION_VERSION="517" -D_RTE_ -DSTM32L476xx -DUSE_HAL_DRIVER -DSTM32L476xx -o "TST_PRG\*.o" --omf_browse "TST_PRG\*.crf" --depend "TST_PRG\*.d" 
 

 

 

struct to_stand_t {
	               double tau;//T/Têð
	             
	               double pi;//P/Pêð
	           
	               double omega_stand;
                  };


        struct to_stand_t to_stand;

double omega_stand(double param_tau,double param_pi);



to_stand.omega_stand=omega_stand((to_stand.tau),(to_stand.pi));

 

 

 

 

 

 

2.jpg

1.jpg

и проверю подозрение на дату лицензии

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


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

и, я бы сказал вот какую штуку.

простейший тест - беру параметр и возвращаю его тут же из функции.

когда параметры функции делел флоатами - я их видел правильно и вьювером (при наведении курсором на параметр) и в регистрах процессора.

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

 

double omega_stand(double param_tau,double param_pi)
{
 

	return(param_tau);	
	

	
	
}//double omega_stand(double param_tau,double param_pi)

 

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


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

10 часов назад, firstvald сказал:

возвращенное функцией значение - правильное.  

Да это классика - так оно обычно и получается. потмоу что флотовые параметры в регистрах ФПУ передаются. и  у них бывает какойто свой ABI. а дебагеры насколько я понимаю, такой трюк пока не умеют ловить, только на стеке параметры показывают.

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

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


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

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

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

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

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

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

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

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

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

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