我有一个函数指针数组,我用它来调用适当的cblas_xgemm
(例如,cblas_dgemm
或cblas_sgemm
等,来自 ATLAS/CBLAS)。
cblas_dgemm
当我告诉它通过函数指针使用时,这很好用;dgemm 使用适当的参数调用并返回正确的结果。
但是,当我cblas_sgemm
通过函数指针调用时,我得到以下输出:
ldc must be >= MAX(N,1): ldc=0 N=2Parameter 14 to routine cblas_sgemm was incorrect
我写了一个简短的测试程序来演示这个问题。cblas_sgemm
没有函数指针的调用工作正常。
请特别注意以下 gcc 警告(另请参阅上面链接的要点,它具有完整的 gcc 输出):
test_cblas_sgemm.c:20:3: warning: initialization from incompatible pointer type [enabled by default]
如果我在函数指针数组定义中注释掉该cblas_sgemm
行,我不会收到这样的警告,即使对于该cblas_dgemm
行也是如此。但这没有任何意义,因为这两个函数都应该具有相同的返回类型!
以下是来自的适当行cblas.h
:
void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
const int K, const float alpha, const float *A,
const int lda, const float *B, const int ldb,
const float beta, float *C, const int ldc);
void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
const int K, const double alpha, const double *A,
const int lda, const double *B, const int ldb,
const double beta, double *C, const int ldc);
那么给了什么?它是否以某种方式xgemm
从一个标头获取功能之一,而从另一个标头获取另一个功能?还是我在处理一些奇怪的函数指针问题?