liu583685

  • 2020-07-01
  • 回复了主题帖: ARM嵌入式学习资源分享——《ARM嵌入式体系结构与接口技术》.pdf

    学习学习哈

  • 2020-06-27
  • 回复了主题帖: c语言使用二叉树解析多项式并求值

    liu583685 发表于 2020-6-27 21:08 就是在VS2019上调试的,应该是有一些宏定义需要在工程里设置。
    链接:https://pan.baidu.com/s/1maAioGy6thx-qGSZL8hIwg  提取码:wq71 这个是我的源工程,你可以看看。 代码里还有内存泄露,我在arm平台上修复了,这里的代码没有改。要注意一下。

  • 回复了主题帖: c语言使用二叉树解析多项式并求值

    redstone8415 发表于 2020-6-27 16:57 VS2019 编译不过!有几处有问题!
    就是在VS2019上调试的,应该是有一些宏定义需要在工程里设置。

  • 2020-06-24
  • 发表了主题帖: ARM裸机编程如何连接C标准库

    main.c   #include <stdio.h> #include "uart.h" #define GPBCON *(volatile unsigned int*)(0x56000010) #define GPDAT *(volatile unsigned int*)(0x56000014) int delay(unsigned int count) { while(count--); } int main(void) { int c; char buf[100]; double A = 1.1f; uart0_init(); puts("Hello, world!\n\r"); while(1) { printf("%d,%s,0x%02x,0x%08X\r\n", -123,"hello world",0x12,c+=1); puts(buf); puts("\r\nHello world\r\n"); delay(50000); } return 0; } 其中uart.c #include "s3c2440_soc.h" /* 115200,8n1 */ void uart0_init() { /* 设置引脚用于串口 */ /* GPH2,3用于TxD0, RxD0 */ GPHCON &= ~((3<<4) | (3<<6)); GPHCON |= ((2<<4) | (2<<6)); GPHUP &= ~((1<<2) | (1<<3)); /* 使能内部上拉 */ /* 设置波特率 */ /* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1 * UART clock = 50M * UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26 */ UCON0 = 0x00000005; /* PCLK,中断/查询模式 */ UBRDIV0 = 26; /* 设置数据格式 */ ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */ /* */ } int putchar(int c) { /* UTRSTAT0 */ /* UTXH0 */ while (!(UTRSTAT0 & (1<<2))); UTXH0 = (unsigned char)c; } int getchar(void) { while (!(UTRSTAT0 & (1<<0))); return URXH0; } int puts(const char *s) { while (*s) { putchar(*s); s++; } } 这是Makefile LIBPATH=-lgcc -L/mango/workSoft/arm-linux-gcc-4.4.3/lib/gcc/arm-none-linux-gnueabi/4.4.3 ALL: arm-linux-gcc -c -o start.o start.S arm-linux-gcc -std=c99 -c -o main.o main.c arm-linux-gcc -std=c99 -c -o uart.o uart.c arm-linux-ld -Ttext 0 start.o main.o uart.o -o output.elf -lc ${LIBPATH} arm-linux-objcopy -O binary -S output.elf output.bin arm-linux-objdump -D output.elf > output.dis mkdir bulid mv *.o *.elf *.bin *.dis bulid clean: rm -r bulid .PHONY: clean 如上代码,编译是正常编译的。 但是代码一直在重启,去掉printf的调用,只使用puts则是正常的。 难道裸机编程不能调用标准c库吗?还是我的姿势不对? 肯定是我的姿势不对,各位大佬帮我看看这是什么问题。  

  • 2020-06-12
  • 回复了主题帖: c语言使用二叉树解析多项式并求值

    //计算二叉树,并释放结点 double cal_tree(Tnode_t* root) { double value; switch (root->method) { case VLAUE: value = root->value; fx_free(root); break; case ADD_M: value = cal_tree(root->Lchild) + cal_tree(root->Rchild); fx_free(root->Lchild); fx_free(root->Rchild); break; case SUB_M: value = cal_tree(root->Lchild) - cal_tree(root->Rchild); fx_free(root->Lchild); fx_free(root->Rchild); break; case MUL_M: value = cal_tree(root->Lchild) * cal_tree(root->Rchild); fx_free(root->Lchild); fx_free(root->Rchild); break; case DIR_M: value = cal_tree(root->Lchild) / cal_tree(root->Rchild); fx_free(root->Lchild); fx_free(root->Rchild); break; case SIN_M: value = sin(cal_tree(root->Lchild)); fx_free(root); break; case COS_M: value = cos(cal_tree(root->Lchild)); fx_free(root); break; case TAN_M: value = tan(cal_tree(root->Lchild)); fx_free(root); break; default: return 0; } return value; } 修复一个Bug, 内存泄漏

  • 2020-06-11
  • 发表了主题帖: c语言使用二叉树解析多项式并求值

     主要实现解析多项式数据计算,如果有需求做基于单片机的简单计算器,那么是足够了。 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> typedef enum meth { ADD_M = 0, //加法 SUB_M, //减法 MUL_M, //乘法 DIR_M, //除法 SIN_M, //正弦 COS_M, //余弦 TAN_M, //正切 VLAUE = 100 //数字 } TMeth_t; typedef struct node { double value; //节点值 TMeth_t method; //节点方法 struct node* Lchild; struct node* Rchild; } Tnode_t; const char method_D[][20] = { "+","-","*","/" }; const char method_S[][20] = { "sin(", "cos(", "tan("}; //(2*1)+(2*1)*1 double cal_tree(Tnode_t* root) { switch (root->method) { case VLAUE: return root->value; case ADD_M: return cal_tree(root->Lchild) + cal_tree(root->Rchild); case SUB_M: return cal_tree(root->Lchild) - cal_tree(root->Rchild); case MUL_M: return cal_tree(root->Lchild) * cal_tree(root->Rchild); case DIR_M: return cal_tree(root->Lchild) / cal_tree(root->Rchild); case SIN_M: return sin(cal_tree(root->Lchild)); case COS_M: return cos(cal_tree(root->Lchild)); case TAN_M: return tan(cal_tree(root->Lchild)); default: return 0; break; } } //判断字符串为纯数字 int checkNum(char* str, int len) { for (int i = 0; i < len; i++) { if (str == '.'){ continue; } if (str < '0' || str > '9'){ return 0; } } return 1; } //处理带括号的算法 char serchBraMethod(char* str, int len, TMeth_t* Method, char* Method_str) { unsigned int i = 0, j = 0; for (i = 0; i < sizeof(method_S) / 20; i++) { for (j = 0; j < strlen(method_S); j++) { if (str[j] != method_S[j]) { break; } } if (j == strlen(method_S)) { *Method = (TMeth_t)(i + 4); memcpy(Method_str, method_S, strlen(method_S)); return 1; } } return 0; } //寻找根节点方法 char* serchRootMethod(char* str, int len, TMeth_t* Method, char* Method_str) { char* Method_H[sizeof(method_D) / 20] = { 0 }; char flag = 0; for (int i = 0; i < sizeof(method_D) / 20; i++) { for (int j = 0; j < len; j++) { if (str[j] == '(') { flag++; } if (str[j] == ')') { flag--; } //括号之外的方法 if (flag == 0 && str[j] == method_D[0]) { Method_H = &str[j]; *Method = (TMeth_t)i; memcpy(Method_str, method_D, strlen(method_D)); return Method_H; } } } return str; } //构建二叉书 Tnode_t* buildTree(char* str, int len) { if (str == NULL || len == 0) return NULL; Tnode_t* root = (Tnode_t*)malloc(sizeof(Tnode_t)); char* s_ptr = NULL, * e_ptr = NULL, MethStr[20] = { 0 }; char* str_cp = (char*)malloc(len + 1); if (str_cp == NULL) return NULL; memset(str_cp, 0, len + 1); memcpy(str_cp, str, len); printf("str_cp: %s\n", str_cp); if (checkNum(str_cp, len) || (len >= 2 && str_cp[0] == '-' && str_cp[1] != '\0' && checkNum(str_cp+1, len - 1))) { root->method = VLAUE; root->value = atof(str_cp); root->Lchild = NULL; root->Rchild = NULL; return root; } else { //寻找根方法 s_ptr = serchRootMethod(str_cp, len, &root->method, MethStr); //递归方法 if (str_cp != s_ptr) { printf("MethStr:【%s】\n", MethStr); root->Lchild = buildTree(str_cp, s_ptr - str_cp); root->Rchild = buildTree(s_ptr + strlen(MethStr), strlen(s_ptr) - strlen(MethStr)); if (root->Lchild == NULL || root->Rchild == NULL) { if (root->Lchild != NULL) { free(root->Lchild); } if (root->Rchild != NULL) { free(root->Rchild); } free(root); return NULL; } } //去括号 else { if (1 == serchBraMethod(str_cp, len, &root->method, MethStr)) { printf("MethStr:【%s】\n", MethStr); root->Lchild = buildTree(str_cp + strlen(MethStr), len - 1 - strlen(MethStr)); if (root->Lchild == NULL){ free(root); return NULL; } } else { free(root); root = NULL; if (len - 2 >= 0) { return buildTree(str_cp + 1, len - 2); } } } } free(str_cp); return root; } //替换x变量 char* replace_x(double x, char* fxrule, int rulelen) { if (fxrule == NULL || rulelen == 0){ return NULL; } char* location_X = strstr(fxrule,"x"); if (location_X == NULL) return NULL; char replace[20] = { 0 }; snprintf(replace, sizeof(replace), "%f", x); char* newRule = (char*)malloc(rulelen + strlen(replace)+20); memset(newRule, 0, sizeof(rulelen + strlen(replace))); memcpy(newRule, fxrule, location_X - fxrule); memcpy(newRule + (location_X - fxrule), replace, strlen(replace)); memcpy(newRule + (location_X - fxrule) + strlen(replace), location_X + 1, strlen(replace)); return newRule; } //根据变量与对应法则求值 int equation(double *fx, double X, char* fxrule, int rulelen) { char* newR = fxrule, *saveR = NULL; if (fx == NULL || fxrule == 0){ return -1; } do { saveR = newR; newR = replace_x(X, saveR, strlen(saveR)); if (newR == NULL) { newR = saveR; break; } if (newR != NULL && saveR != fxrule) { free(saveR); } } while (newR != NULL && strstr(newR,"x")); printf("fxrule:%s\n", fxrule); printf("newRule: %s\n", newR); Tnode_t* tree = buildTree(newR, strlen(newR)); if (newR != fxrule) { free(newR); } if (tree != NULL) { *fx = cal_tree(tree); return 0; } return -3; } int main() { double A, B = 1.2; char a[200], b[200]; while (1) { printf("请输入:\nF(x) = "); scanf("%s", a); printf("请输入X变量值:\n x = "); scanf("%s", b); B = atof(b); if (0 == equation(&A, B, a, strlen(a))) { printf("F(%s) = %f\n", b, A); } else { printf("输入有误!\n"); } } }  

最近访客

< 1/1 >

统计信息

已有10人来访过

  • 芯币:103
  • 好友:--
  • 主题:8
  • 回复:36
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言