发 帖  
原厂入驻New
[问答]

Altera开发板NiosII系统,请问以下代码应该怎么修改?

666 单片机 FPGA soc Altera NIOS
分享
altera DE2开发板,NiosII系统,软件代码如下:
实现的功能是二进制计算器,由很多个拨码开关组成每一位的操作。

  1. #include <stdio.h>
  2. #define switches (volatile char *) 0x5040
  3. #define LEDs (char *) 0x5050
  4. #define ge (char *) 0x5030
  5. #define shi (char *) 0x5020
  6. #define bai (char *) 0x5010
  7. #define qian (char *) 0x5000

  8. unsigned char digital[10] = {                                // 数码管显示数据表
  9.                 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
  10. };

  11. int main()
  12. {
  13.         void keyin(char *Switches[9], char *LEDs[12], char oprand[6]);
  14.         int binToDec(char oprand[6]);
  15.         void decToBin(int dec,char *leds[12]);
  16.         int compute(int x, int y);
  17.         void seg(int a);
  18.        
  19.         int x,y,z;
  20.         char oprand[6];
  21.         keyin(switches, leds,oprand);
  22.         x = binToDec(oprand);
  23.         keyin(switches, leds,oprand);
  24.         y = binToDec(oprand);
  25.         z = compute(x,y);
  26.         decToBin(z, leds);
  27.         seg(z);

  28.   return 0;
  29. }

  30. int compute(int x, int y)
  31. {
  32.         int z;
  33.         volatile char *p=switches;
  34.         if (*(p+7)==0 && *(p+6)==0)
  35.                 z=x+y;
  36.         else if (*(p+7)==0 && *(p+6)==1)
  37.                 z=x-y;
  38.         else if (*(p+7)==1 && *(p+6)==0)
  39.                 z=x*y;
  40.         else
  41.                 z=x/y;
  42.        
  43.         return z;
  44. }

  45. void seg(int a)
  46. {
  47.         int qian1, bai1, shi1, ge1;
  48.         qian1 = a/1000;
  49.         bai1 =  a%1000/100;
  50.         shi1 = a%1000%100/10;
  51.         ge1 = a%1000%100%10;
  52.        
  53.         *qian = digital[qian1];
  54.         *bai = digital[bai1];
  55.         *shi = digital[shi1];
  56.         *ge = digital[ge1];
  57.        
  58. }

  59. void keyin(char *Switches[9], char *LEDs[12], char oprand[6])
  60. {
  61.         *leds = *Switches;
  62.         int i;
  63.         int k;
  64.         if(*Switches[8]==1)
  65.                 for(i=0;i<6;i++)
  66.                         oprand[i]=*Switches[i];
  67.         else
  68.                 for(k=0;k<6;k++)
  69.                         oprand[i]=0;
  70. }

  71. int binToDec(char oprand[6])
  72. {
  73.         int dec;
  74.         dec=(oprand[5])*32+(oprand[4])*16+(oprand[3])*8+(oprand[2])*4+(oprand[1])*2+(oprand[0]);
  75.         return dec;
  76. }

  77. void decToBin(int dec,char *leds[12])
  78. {
  79.         int i;
  80.         for(i=0;i<12;i++){
  81.                 *leds[i]=dec%2;
  82.                 dec=dec/2;
  83.         }
  84. }
复制代码
然后一直报错:
QQ图片20201122201227.png
expected ';',','or')' before numeric constant
请问各位大佬是哪里出了问题?救救孩子!谢谢!

0
2020-11-22 20:17:23   评论 分享淘帖 邀请回答
1个回答
帮你改了一版,现在可以编译了。功能对不对你得自己调试。

你这不是FPGA的问题,是C语言不会写,不会看编译器的提示信息。不过你的编译器提示信息好像没有直接命令行gcc提示得完整。另外你贴代码把头上的注释省去了,这样编译器的提示信息中的行号就和代码的行号对不上了。

建议你找个代码比对工具,把改之前和改之后的代码好好对比一下。比如WinMerge,Beyond Compare.

C语言的函数调用申明中不必指明数组的大小,C语言执行的时候也没有数组越界检查。方括号不能随便加。
char* Switches表示指向char类型的指针,char* Switches2[]表示一组指针。
如果你真的需要一组指针,你必须为这一组指针的每一个元素赋值。

  1. #include <stdio.h>
  2. #define switches (volatile char *) 0x5040
  3. #define LEDs (char *) 0x5050
  4. #define ge (char *) 0x5030
  5. #define shi (char *) 0x5020
  6. #define bai (char *) 0x5010
  7. #define qian (char *) 0x5000

  8. unsigned char digital[10] = { // 数码管显示数据表
  9.         0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
  10. };
  11.        
  12. void keyin(volatile char* Switches, char* leds, char oprand[6]);
  13. int binToDec(char oprand[6]);
  14. void decToBin(int dec, char *leds);
  15. int compute(int x, int y);
  16. void seg(int a);

  17. int main(){
  18.         int x,y,z;
  19.         char oprand[6];
  20.         keyin(switches, LEDs, oprand);
  21.         x = binToDec(oprand);
  22.         keyin(switches, LEDs, oprand);
  23.         y = binToDec(oprand);
  24.         z = compute(x,y);
  25.         decToBin(z, LEDs);
  26.         seg(z);

  27.         return 0;
  28. }

  29. int compute(int x, int y){
  30.         int z;
  31.         volatile char *p=switches;
  32.         if (*(p+7)==0 && *(p+6)==0)
  33.                         z=x+y;
  34.         else if (*(p+7)==0 && *(p+6)==1)
  35.                         z=x-y;
  36.         else if (*(p+7)==1 && *(p+6)==0)
  37.                         z=x*y;
  38.         else
  39.                         z=x/y;
  40.    
  41.         return z;
  42. }

  43. void seg(int a){
  44.         int qian1, bai1, shi1, ge1;
  45.         qian1 = a/1000;
  46.         bai1 =  a%1000/100;
  47.         shi1 = a%1000%100/10;
  48.         ge1 = a%1000%100%10;
  49.    
  50.         *qian = digital[qian1];
  51.         *bai = digital[bai1];
  52.         *shi = digital[shi1];
  53.         *ge = digital[ge1];
  54. }

  55. void keyin(volatile char* Switches, char* leds, char oprand[6]){
  56.         *leds = *Switches;
  57.         int i;
  58.         int k;
  59.         if(Switches[8]==1)
  60.                 for(i=0;i<6;i++)
  61.                         oprand[i]=Switches[i];
  62.         else
  63.                 for(k=0;k<6;k++)
  64.                         oprand[i]=0;
  65. }

  66. int binToDec(char oprand[6]){
  67.         int dec;
  68.         dec=(oprand[5])*32+(oprand[4])*16+(oprand[3])*8+(oprand[2])*4+(oprand[1])*2+(oprand[0]);
  69.         return dec;
  70. }

  71. void decToBin(int dec,char *leds){
  72.         int i;
  73.         for(i=0;i<12;i++){
  74.                 leds[i]=dec%2;
  75.                 dec=dec/2;
  76.         }
  77. }
复制代码
2020-11-22 21:59:21 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表