我是编程新手,我在指针和类型转换方面不强,所以我需要一些帮助.
我正在使用IAR Workbench和STM32L475.我试图将结构中的4个字节转换为浮点数,然后从Eeprom加载它们.
我知道Big/Little Endian可能存在挑战,并且代码可以移植到其他微软,但请不要因为这对我来说不重要,因为这对我来说并不重要.
我做错了什么,谢谢你的帮助?
请保持简单并解释"为傻瓜".
我收到了pe513错误.
我的代码:
struct Test {
uint8_t Byte1;
uint8_t Byte2;
uint8_t Byte3;
uint8_t Byte4;
} TestStruct;
float x = 0.0;
uint8_t *TestStruct_ptr;
int main(void)
{
/* USER CODE BEGIN 1 */
TestStruct.Byte1 = 0x41; //float value = 23.10
TestStruct.Byte2 = 0xB8;
TestStruct.Byte3 = 0xCC;
TestStruct.Byte4 = 0xCD;
TestStruct_ptr = (float*)&TestStruct;
x = (float*) TestStruct_ptr;
// some code
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我正在从Eeprom加载一个数组,并且必须将四个uint8字节的数组"收集"到一个浮点数,它们在保存到Eeprom之前是结构的一部分.我明天上班的时候会更新确切的错误信息.
我最终使用"联盟",因为这似乎是最好的解决方案.
我的示例代码现在看起来像这样:
union Eeprom {
struct {
uint8_t Byte1;
uint8_t Byte2;
uint8_t Byte3; …Run Code Online (Sandbox Code Playgroud) struct data
{
char name;
int conn[3];
};
typedef struct data unit;
typedef unit *link;
int main()
{
int i;
link p[100];
for(i=0;i<=100;i++)
{
p[i]=(link)malloc(sizeof(unit));
p[i]->name='h';
p[i]->conn[]=(int*){"1","1","1"}; **// assignment error**
}
for(i=0;i<=100;i++)
{
printf("%c\t%d\t%d\t%d\n",p[i]->name,p[i]->conn[0],p[i]->conn[1],p[i]->conn[2]);
}
getch();
}
Run Code Online (Sandbox Code Playgroud)
由于结构不支持初始化,所以有没有办法在不使用mem分配函数的情况下在一行代码中分配在结构内声明的这种类型的数组,为了简单起见?请坚持代码.
我正在研究一个项目,它有两个按钮,每个按钮通过H桥将电机转向一个方向(时钟/反时钟),但是当我点击两个按钮时,我试图让电机停止按按钮.一切都工作正常,但我不能得到两个按钮部分...
这是我的尝试:
#include "motor.h"
#include <avr/io.h>
#include <util/delay.h>
int flag=0;
int main(void)
{
DDRD &= ~(1<<PD2);
DDRD &= ~(1<<PD3);
DDRB |= (1<<PB0);
DDRB |= (1<<PB1);
PORTB &= ~(1<<PB0);
PORTB &= ~(1<<PB1);
while(1)
{
if (PIND & (1<<PD2))
{
flag = 1;
}
else if (PIND & (1<<PD3))
{
flag = 2;
}
else if (PIND & (1<<PD3 ) && (1<<PD2))
{
flag = 3;
}
switch (flag)
{
case 1:
DC_MOTOR_PORT |= (1<<DC_MOTOR_PIN1);
DC_MOTOR_PORT &= ~(1<<DC_MOTOR_PIN2);
break;
case 2:
DC_MOTOR_PORT …Run Code Online (Sandbox Code Playgroud) char * names[10];
int i = 0;
char theRow[20];
while (fgets(theRow, 80 , fp) != NULL) {
names[i] = theRow;
i++;
}
Run Code Online (Sandbox Code Playgroud)
我试图保存的数组的输出完全相同,具体取决于最后一个元素.
对于前 文件具有(hi,I,2,3,karl)
阵列然后变成(karl,karl,karl,karl,karl)
我错过了什么或者它能做什么?
我有一个字符串,{F0A9B8BDE38182}
我需要将其转换为十六进制字节
0xF0 0xA9 0xB8 0xBD 0xE3 0x81 0x82
Run Code Online (Sandbox Code Playgroud)
我可以用下面的代码得到答案
for (i = 0; i < (str_len /2); i++)
{
sscanf(hexstring + 2*i, "%02x", &bytearray[i]);
printf("bytearray %d: %02x\n", i, bytearray[i]);
}
Run Code Online (Sandbox Code Playgroud)
但我不需要使用 sscanf
我已经在这个术语上摸索了一段时间了(man,数学,编程,makefile等)。我是否正确地理解了这个术语?评估是对某些表达式的结果的计算,例如:
a + b-表达式
为了评估它(通过数字得到一些结果),我们给变量值像这样
a = 1,b = 1
由此判断,我们得到的结果为“ 2”(这意味着我们使用输入值将表达式评估为“ 2”
a = 1,b = 1)
在这里,在 GitHub 存储库中给出了 png.h 库源代码(https://github.com/LuaDist/libpng/blob/master/png.h)。但也有,他们直接使用数据类型png_byte。我正在寻找这种数据类型的声明。
我需要一个函数的帮助,我认为这并不难,有人可以将其转换为C,以便从中获取逻辑吗?
0x004011cf mov al, byte [esi]
| : 0x004011d1 and eax, 0xff
| : 0x004011d6 mul ebx
| : 0x004011d8 inc esi
| : 0x004011d9 add edi, eax
| : 0x004011db inc ebx
| : 0x004011dc dec ecx
| `=< 0x004011dd jne 0x4011cf
Run Code Online (Sandbox Code Playgroud)