【问题标题】:Accessing an array using pointer is not working during porting to ARM在移植到 ARM 期间使用指针访问数组不起作用
【发布时间】:2017-09-13 09:50:25
【问题描述】:

我是 ARM 平台的新手。

下面的代码被用在一个函数中,用于找出一些复数样本的共轭乘法并将其滑动到一些样本。

此代码在 linux 12.04 版本的本机编译器中正常工作。在 ARM 中运行相同的代码时,它不会执行该功能。它只是从正在运行的代码中退出。

#include<stdio.h>

int main()
{
    float aa[12]={1,1,1,1,1,1,1,1,1,1,1,1};
    float *x=aa,*y=x+6,real=0,imag=0;

    fn_ComplexMultiply_addthem(x,y,6,&real,&imag);

    printf("real value = %f\n",real);
    printf("real value = %f\n",imag);
}

void fn_ComplexMultiply_addthem(float *x, float *y, float len, float *re, float *im)
{
    int j;

    for( j=0; j<len; j+=2)
    {
        *re += (x[j]*(y[j]));
        *re -= (x[j+1]*(-y[j+1]));
        *im += (x[j]*(-y[j+1]));
        *im += (x[j+1]*(y[j]));
    }
}

我无法理解它的原因。每个指针都指向某个值,然后它应该给我任何可能正确的结果。相反,它只是从模拟中退出。

它会不会与其他一些东西(如堆栈或其他内存)有问题? 请帮我调试一下。

【问题讨论】:

  • 请尝试创建Minimal, Complete, and Verifiable Example 向我们展示。还请包括完整的 Valgrind 输出。并告诉我们哪些行被抱怨(在 MCVE 中使用 cmets)。
  • 当您使用调试器逐步完成时,哪一行失败了?
  • 对了,如果你把y的初始化改成y = aa + 6,会发生什么?
  • 能否请您包括您得到的实际错误?完整的,完整的,没有修改,复制粘贴。当然还要提供一个实际构建的Minimal, Complete, and Verifiable Example(除非这是你的问题)?
  • 如果不能调试,那么至少可以打印出指针吗?就像例如printf("x = %p, y = %p, y - x = %d\n", (void *) x, (void *) y, (int) (y - x));?输出看起来有效吗?指针之间的差异是24字节(6 * 4(float的大小))吗?

标签: compiler-errors compiler-optimization


【解决方案1】:

程序无效,因为在声明之前使用了fn_ComplexMultiply_addthem,并且隐式声明与实际定义不匹配。

此外,float len 没有任何意义。我们不使用浮点数进行计数。

len改成int,在main前面加上函数声明:

void fn_ComplexMultiply_addthem(float *x, float *y, int len, float *re, float *im);

始终启用编译器警告并将其视为错误(-Wall -Werror 用于 gcc 和 clang)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 2013-06-29
    • 2015-01-17
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 2023-04-06
    • 2021-12-04
    相关资源
    最近更新 更多