微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > *** ERROR L114: SEGMENT DOES NOT FIT 的问题

*** ERROR L114: SEGMENT DOES NOT FIT 的问题

时间:10-02 整理:3721RD 点击:
写了四则表达式计算器的核心代码,在VS上测试通过,
但是写到Keil上报错,提示*** ERROR L114: SEGMENT DOES NOT FIT
求问这个怎么解...


计算器核心代码在这里


  1. int split_expr(char *expr, int *num, char *ops);
  2. int calc(int *num, char *ops,int count);

  3. int power(int a);

  4. void move_left_int(int *arr, int s,int e);
  5. void move_left_chr(char *arr, int s,int e);


  6. void main()
  7. {
  8.         char expr[] = "11+22-33*55/11-2";//这里是任意加减乘除表达式
  9.         int count;
  10.         int num[20];
  11.         char ops[20];
  12.         count = split_expr(expr, num, ops);
  13.         calc(num,ops,count);
  14. }

  15. int split_expr(char *expr, int *num, char *ops)//将字符串expr分解成数字num[]和运算符ops[]两个数组
  16. {
  17.         int i, j,count_num = 0, numbit[20];
  18.         while (*expr != '\0')//直到遍历到字符串结尾
  19.         {
  20.                 if (*expr > 47 && *expr < 58)//ASCII中48~57是0~9整数
  21.                 {
  22.                         count_num++;
  23.                         i = 0;
  24.                         while (*expr > 47 && *expr < 58)
  25.                         {
  26.                                 numbit[i++] = (*expr++)-48;//用于将ASCII值转换成整数,将每一位数字暂存(i的值会比有效下标大1
  27.                         }
  28.                         *num = 0;
  29.                         for (j = 0; j < i;j++)
  30.                                 *num += numbit[j] * power(i-1-j);//数字写入num数组,并且移到下一位
  31.                         num++;
  32.                 }
  33.                 else
  34.                         *ops++ = *expr++;//如果不是数字,直接将所含字符存进op里,并且将地址+1;
  35.         }
  36.         return count_num;//返回数字的个数,用于计算时遍历
  37. }

  38. int calc(int *num, char *ops,int count)
  39. /*卧槽这里我好想加图片注释...
  40. 具体思路是遍历两遍,第一遍一旦遍历到 乘 除 就对对应的两个数字进行运算,
  41. 结果存储在较前那个数字的位置,然后将这两个数字后的所有数字向左移动一格,
  42. 运算符也作相应的处理.第二遍处理加减*/
  43. {
  44.         int i, amount = count - 1;
  45.                 for (i = 0; i <= amount; i++)//第一遍遍历
  46.                 {
  47.                         if (ops[i] == '*')
  48.                         {
  49.                                 num[i] = num[i] * num[i + 1];
  50.                                 move_left_int(num, i + 2, amount + 1);
  51.                                 move_left_chr(ops, i + 1, amount);
  52.                                 amount--;
  53.                                 i--;//回退1:否则可能漏掉运算符
  54.                         }
  55.                         else if (ops[i] == '/')
  56.                         {
  57.                                 num[i] = num[i] / num[i + 1];
  58.                                 move_left_int(num, i + 2, amount + 1);
  59.                                 move_left_chr(ops, i + 1, amount);
  60.                                 amount--;
  61.                                 i--;
  62.                         }

  63.                 }

  64.                 for (i = 0; i <= amount; i++)//第二遍遍历
  65.                 {
  66.                         if (ops[i] == '+')
  67.                         {
  68.                                 num[i] = num[i] + num[i + 1];
  69.                                 move_left_int(num, i + 2, amount + 1);
  70.                                 move_left_chr(ops, i + 1, amount);
  71.                                 amount--;
  72.                                 i--;
  73.                         }
  74.                         if (ops[i] == '-')
  75.                         {
  76.                                 num[i] = num[i] - num[i + 1];
  77.                                 move_left_int(num, i + 2, amount + 1);
  78.                                 move_left_chr(ops, i + 1, amount);
  79.                                 amount--;
  80.                                 i--;
  81.                         }

  82.                 }
  83.         
  84.         return num[0];
  85. }

  86. void move_left_int(int * arr, int s, int e)//这个函数将整型数组arr中从s到e的元素向左移动一格.
  87. {
  88.         int i;
  89.         for (i = s; i <= e; i++)
  90.                 arr[i - 1] = arr[i];

  91. }

  92. void move_left_chr(char * arr, int s,int e)//这个函数将字符数组arr中从s到e的元素向左移动一格.
  93. {
  94.         int i;
  95.         for (i = s; i <= e; i++)
  96.                 arr[i - 1] = arr[i];

  97. }

  98. int power(int a)//以10为底的幂函数
  99. {
  100.         int i, res = 1;
  101.         for (i = 0; i < a; i++)
  102.                 res *= 10;
  103.         return res;
  104. }

复制代码


VS上确实是能正常运行的...

你要移植到51?M3?M4?还是ARM?目标设备空间不够?或者是你没有破解代码大小有限制?

抱歉,看提示,编译是通过了的,链接时出的错,那应该是你的项目属性配置出错了

移植到90C51RD+ 后来把数组大小改小一点就成功了,但是这样数组就可能越界了 求解属性怎么改

问题已经解决,将不需要的变量和数组删去之后烧写成功,计算器已经可以运行。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top