2013-09-16 54 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:錯誤:下標值既不是數組也不是指針 你知道我如何訪問向量中的每個元素? –