2013-09-16 57 views
0

我试图遵循一个简单的示例的AltiVec初始化是这样的:AltiVec技术编译错误

1 // Example1.c 
2 #include <stdio.h> 
    #include <altivec.h> 
3 
4 int main() 
5 { 
6 __vector unsigned char v1; 
7 
8 // Assign 16 8-bit elements to vector v1 
9 v1 = (__vector unsigned char)(
10 '0', '1', '2', '3', 
11 '4', '5', '6', '7', 
12 '8', '9', 'A', 'B', 
13 'C', 'D', 'E', 'F'); 
14 
15 // Print out the contents of v1 char by char 
16 // &v1 is casted to (unsigned char *) 
17 for(int i = 0; i < 16; i++) 
18 printf("%c", ((unsigned char *)(&v1))[i]);; 
19 
20 
21 return 0; 
22 } 

然而,当我编译我得到一个错误说法错误:不能在不同大小的矢量值之间的转换。

有人会知道这是为什么吗?我的gcc版本是4.4.6。

我现在用Paul的解决方案开始工作。

HOwever,当我尝试打印它时,它给了我错误,正如我在Paul的评论下评论的那样。

有人会知道为什么这样吗?

回答

0

您需要设置矢量值作为初始化的一部分:

__vector unsigned char v1 = (__vector unsigned char)('0', '1', '2', ...); 
用gcc

但是你应该用比较正常的语法与花括号,而不是旧的Motorola语法:

__vector unsigned char v1 = { '0', '1', '2', ... }; 

为了打印矢量,gcc的某些版本允许摩托罗拉扩展到printf for AltiVec矢量,例如

printf("%vc\n", v1); 

如果不工作,那么你可能需要推出自己的打印程序,例如利用工会:

void vec_print_u8(__vector unsigned char v) 
{ 
    union { 
     __vector unsigned char v; 
     unsigned char a[16]; 
    } u; 
    int i; 

    u.v = v; 
    for (i = 0; i < 16; ++i) 
    { 
     printf("%2c", u.a[i]); 
    } 
    printf("\n"); 
} 
+0

嗨, 于第一线,我仍然无法初始化。但是,当我尝试使用printf(“%d \ n”,(unsigned char)v1 [i])打印它时,第二个工作正常。 我得到一个错误,说rabind.c:91:错误:下标值既不是数组也不是指针 你知道我如何访问向量中的每个元素? –