Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
算法在Java中工作,但在C中不工作_Java_C_Algorithm_Arduino_Implementation - Fatal编程技术网

算法在Java中工作,但在C中不工作

算法在Java中工作,但在C中不工作,java,c,algorithm,arduino,implementation,Java,C,Algorithm,Arduino,Implementation,我有一个用Java实现的算法,但我用C实现的算法不起作用。 该算法获取一个数字并将其转换为2字节二进制。 然后,它将两个字节分别转换为数字,然后返回给用户 Java实现: public class Test { public static void main(String[] args) { int bytes[] = new int[16]; int vals[] = getVals(2000, bytes); System.out.println(vals[0]);

我有一个用Java实现的算法,但我用C实现的算法不起作用。 该算法获取一个数字并将其转换为2字节二进制。 然后,它将两个字节分别转换为数字,然后返回给用户

Java实现:

public class Test
{
public static void main(String[] args)
{
    int bytes[] = new int[16];
    int vals[] = getVals(2000, bytes);

    System.out.println(vals[0]);
    System.out.println(vals[1]);
}

public static int[] getVals(int val, int bytes[]) {

      for(int i = 0; i < 16; i++) {

        if(val - Math.pow(2, 15-i) >= 0) {

          val -= Math.pow(2, 15-i);
          bytes[i] = 1; 


        }else bytes[i] = 0;

      }

      int val1 = 0;
      for(int i = 0; i < 8; i++) {
        System.out.print(bytes[i]);
        System.out.print(": ");
        System.out.println(Math.pow(2, 7-i) * bytes[i]);
        val1 += Math.pow(2, 7-i) * bytes[i];

      }

      int val2 = 0;
      for(int i = 8; i < 16; i++) {
        System.out.print(bytes[i]);
        System.out.print(": ");
        System.out.println(Math.pow(2, 7-(i-8)) * bytes[i]);
        val2 += Math.pow(2, 7-(i-8)) * bytes[i];

      }
      int []vals = {val1, val2};

      return vals;
    }
}
公共类测试
{
公共静态void main(字符串[]args)
{
int字节[]=新的int[16];
int vals[]=getVals(2000字节);
System.out.println(vals[0]);
System.out.println(vals[1]);
}
公共静态int[]getVals(int-val,int-bytes[])){
对于(int i=0;i<16;i++){
如果(val-数学功率(2,15-i)>=0){
val-=数学功率(2,15-i);
字节[i]=1;
}else字节[i]=0;
}
int val1=0;
对于(int i=0;i<8;i++){
系统输出打印(字节[i]);
系统输出打印(“:”);
System.out.println(Math.pow(2,7-i)*字节[i]);
val1+=Math.pow(2,7-i)*字节[i];
}
int val2=0;
对于(int i=8;i<16;i++){
系统输出打印(字节[i]);
系统输出打印(“:”);
System.out.println(Math.pow(2,7-(i-8))*字节[i]);
val2+=Math.pow(2,7-(i-8))*字节[i];
}
int[]vals={val1,val2};
返回VAL;
}
}
Java代码的输出: val1:7 val2:208 哪些是正确的输出(我自己计算并检查)

Arduino的C实现(不起作用):

#包括
国际VAL[2];
整数字节[16];
无效设置(){
Serial.begin(9600);
getVals(2000年);
对于(inti=0;i<16;i++)串行打印(字节[i]);
Serial.println(“”);
Serial.println(vals[0]);
Serial.println(VAL[1]);
}
void循环(){
//将主代码放在此处,以便重复运行:
}
无效getVals(int val){
对于(int i=0;i<16;i++){
如果(val-pow(2,15-i)>=0){
val-=pow(2,15-i);
字节[i]=1;
}else字节[i]=0;
}
int val1=0;
对于(int i=0;i<8;i++){
串行打印(字节[i]);
连续打印(“:”);
Serial.println(pow(2,7-i)*字节[i]);
val1+=pow(2,7-i)*字节[i];
}
int val2=0;
对于(int i=8;i<16;i++){
串行打印(字节[i]);
连续打印(“:”);
Serial.println(pow(2,7-(i-8))*字节[i]);
val2+=pow(2,7-(i-8))*字节[i];
}
序列号println(val1);
Serial.println(val2);
VAL[0]=val1;
VAL[1]=val2;
}
C代码的输出: val1:6 val2:206

->C代码的完整输出: 0:0.00
0:0.00
0:0.00
0:0.00
0:0.00
1:4.00
1:2.00
1:1.00
1:128.00
1:64.00
0:0.00
1:16.00
0:0.00
0:0.00
0:0.00
0:0.00
6
206
0000011111010000
6
206

有人能指出C实现的错误吗? 遗憾的是,我不能在Java中使用algo,因为我需要它在arduino上运行

谢谢你提前帮忙


PS:这是我的第一个arduino项目,所以这可能只是一个愚蠢的小错误,我找不到

我会在这里给出答案,有一种更简单的方法可以做到这一点,在C语言中工作可能更容易

public class ConvertToBytes {
   public static void main( String[] args ) {
      final int i = 2000;
      System.out.println( "Low byte:" + (i & 0xFF) );
      System.out.println( "High byte:" + (i>>8 & 0xFF) );
   }
}
输出:

run:
Low byte:208
High byte:7
BUILD SUCCESSFUL (total time: 2 seconds)
你的C代码是正确的(在我的电脑上,它给出了你期望的结果)。此外,您的输出似乎还可以:将2个字节分开,然后自己检查

0: 0.00
0: 0.00
0: 0.00
0: 0.00
0: 0.00
1: 4.00
1: 2.00
1: 1.00

1: 128.00
1: 64.00
0: 0.00
1: 16.00
0: 0.00
0: 0.00
0: 0.00
0: 0.00
重新运行并重新检查arduino的结果。如果错误仍然存在,则可能取决于平台


我能想到的一件事是int变量可能是16位的,所以求和/减去2^15可能会有问题。我不认为这是你的情况,但使用无符号int类型或long类型。

据我所知,你的算法有点疯狂。你知道程序中的数字已经转换成字节了,对吗?你为什么这样做?@markspace我不知道我的算法是否讲清楚了:我有一个二进制数字,它有两个字节大。我必须将每个字节单独存储在芯片上。在芯片上存储东西的函数接收一个应该存储的数字(1字节大小)。我的想法是将输入的数字转换成二进制(2个字节),然后将每个字节转换成一个我可以存储在芯片上的数字。你说的是哪个芯片(说真的,这很重要)?你意识到如果你只是把一个int存储到内存中,字节就会自动存储,对吗?arduino nano的EEPROM内存。问题是我一次只能存储一个字节,但我的数字大于一个字节(2字节)1
int
s是四个字节,因此请注意不要遇到溢出问题。2.通常情况下,您将所有这些内容写入某种缓冲区,然后将缓冲区存储在eeprom中。一些EEPROM有“页面”,必须同时重新编程。感谢您的实施。。我将尝试为Arduino实现它,这也是在Java中实现它的正确方法。他的Java实现非常糟糕。根本没有理由使用pow,他只是不理解的二进制表示numbers@sunnyboy4205二进制数是如何存储在内存中的,什么是按位运算,以及如何使用它们。答案是“几堂课的内容”所以你必须找到一本书或者我猜是什么。好的,谢谢,我要去看看。但是C代码为什么不能工作的问题仍然没有解决。
0: 0.00
0: 0.00
0: 0.00
0: 0.00
0: 0.00
1: 4.00
1: 2.00
1: 1.00

1: 128.00
1: 64.00
0: 0.00
1: 16.00
0: 0.00
0: 0.00
0: 0.00
0: 0.00