Если вы собираетесь использовать void
, вам также нужно будет пройти шаг массива, иначе интервал между элементами не известен. Если вы используете 8, 16 или 32-битные числа с плавающей точкой (или целые числа), вам нужно выразить это, иначе компилятор не знает, каково расстояние между элементами, и не знает, как далеко в памяти должно быть приращение указателя. , Даже если вы пройдете шаг за шагом, компилятор не поймет, что вы имеете в виду, когда умножаете два void
.
Если бы я делал это в C, я бы, вероятно, выписал типизированную версию или эмулировал шаблоны C ++, например:
#define DEFN_DOT_PRODUCT(TYPE, suffix) TYPE dotProduct##suffix(TYPE *A, TYPE *B, int N, int i, int j) { \
TYPE result = 0; \
while(i < N - 1) { \
while(j < N - 1) { \
result += A[N * i + j] * B[N * i + j]; \
j++; \
} \
i++; \
} \
return result; \
}
DEFN_DOT_PRODUCT(int, i);
DEFN_DOT_PRODUCT(float, f);
DEFN_DOT_PRODUCT(double, d);
#undef DEFN_DOT_PRODUCT
/* use */
dotProducti(/* whatever */)