Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
如何在C中向向量扩展传递指针_C_Vector_Vectorization - Fatal编程技术网

如何在C中向向量扩展传递指针

如何在C中向向量扩展传递指针,c,vector,vectorization,C,Vector,Vectorization,我正在尝试使用GCC的向量扩展,我尝试的确切代码是: typedef float Vector4 __attribute__ ((vector_size (16))); void defVector(Vector4* v, float x,float y,float z,float w){ v[0] = x; v[1] = y; v[2] = z; v[3] = w; } int main(int argc, char* argv){ Vector4 a

我正在尝试使用GCC的向量扩展,我尝试的确切代码是:

typedef float Vector4 __attribute__ ((vector_size (16)));

void defVector(Vector4* v, float x,float y,float z,float w){
    v[0] = x;
    v[1] = y;
    v[2] = z;
    v[3] = w;
}
int main(int argc, char* argv){
    Vector4 a;
    defVector(&a, 1, 2, 3, 4); 
}
并不断出现错误:

incompatible types when assigning to type ‘Vector4 {aka __vector(4) float}’ from type ‘float’
v[0] = x;
不能取消对它的引用,否则会出现另一个错误。 我不希望每次使用函数堆栈时都将整个内容复制到函数堆栈中,有必要创建指向返回值的指针,如

int someFunc(Vector4 v, Vector4* r){
    ...
    r[0] = return_value;
    return 0;
}
我尝试了我所知道的一切来访问函数中的值。
这里我遗漏了什么?

基于OP的示例,在该示例中,局部函数获取“”指针:

#包括
#包括
typedef float Vector4_uuu属性_uuu((向量大小(16)));
无效定义向量(向量4*v,浮点a,浮点b);
无效定义向量(向量4*v,浮点a,浮点b){
v[0]=*(向量4*)和a;
v[1]=*(向量4*)和b;
a=*(浮动*)和v[0]+1.2;
b=*(浮动*)和v[1]+2.1;
printf(“%f,%f,%u”,a,b\
(uint32_t)sizeof(Vector4)/(uint32_t)sizeof(float));
}
内部主(空){
静态矢量4矢量;
静态浮动x1=3.4;
静态浮动x2=4.3;
deffector(&vectorA,x1,x2);
}

此代码将打印():
4.6,6.4,4
,因此将两个
float
的值分配给
Vector4
类型变量的两个单位(即单位数
sizeof(Vector4)/sizeof(float)

基于OP的示例,其中本地函数获取“”指针:

#包括
#包括
typedef float Vector4_uuu属性_uuu((向量大小(16)));
无效定义向量(向量4*v,浮点a,浮点b);
无效定义向量(向量4*v,浮点a,浮点b){
v[0]=*(向量4*)和a;
v[1]=*(向量4*)和b;
a=*(浮动*)和v[0]+1.2;
b=*(浮动*)和v[1]+2.1;
printf(“%f,%f,%u”,a,b\
(uint32_t)sizeof(Vector4)/(uint32_t)sizeof(float));
}
内部主(空){
静态矢量4矢量;
静态浮动x1=3.4;
静态浮动x2=4.3;
deffector(&vectorA,x1,x2);
}

此代码将打印():
4.6,6.4,4
,因此将两个
float
的值分配给
Vector4
类型变量的两个单位(即单位数
sizeof(Vector4)/sizeof(float)

void deffector(Vector4*v,x,y,z,w)是什么意思?这是真实的代码吗?@Lundin这是一个例子,但接近真实,当您不想在代码中的任何地方编写所有四个下标(v[0]=这个;v[1]=那个…)时,它应该会有所帮助。但是假设那里有一个函数,这是相同的问题。显示实际代码,而不是“接近真实”的东西。如果这是问题,我忘记了问题中的浮点:void deffector(Vector4*v,float x,float y,float z,float w w)请编辑问题并确保它包含导致编译器错误的确切代码。请参阅以获取帮助。
void deffector(Vector4*v,x,y,z,w)是什么意思?这是真实的代码吗?@Lundin这是一个例子,但接近真实,当您不想在代码中的任何地方编写所有四个下标(v[0]=这个;v[1]=那个…)时,它应该会有所帮助。但是假设那里有一个函数,这是相同的问题。显示实际代码,而不是“接近真实”的东西。如果这是问题,我忘记了问题中的浮点:void deffector(Vector4*v,float x,float y,float z,float w w)请编辑问题并确保它包含导致编译器错误的确切代码。请参阅以寻求帮助。
#include <stdio.h>
#include <stdint.h>

typedef float Vector4 __attribute__ ((vector_size (16)));

void defVector(Vector4 *v,float a, float b);

void defVector(Vector4 *v,float a, float b){
    v[0] = *(Vector4*)&a;
    v[1] = *(Vector4*)&b;

    a = *(float*)&v[0] + 1.2;
    b = *(float*)&v[1] + 2.1; 

    printf("%f,%f,%u",a,b,\
           (uint32_t)sizeof(Vector4)/(uint32_t)sizeof(float));
}

int main(void) {
    static Vector4 vectorA;
    static float x1 = 3.4;
    static float x2 = 4.3;

    defVector(&vectorA,x1,x2);
}