İpuçları vermek için Bathsheba'ya teşekkürler, sonunda kendime güvenmediğim fonksiyon göstergelerini içeren çözümler buldum. Asıl sorun, ek parametrelere ihtiyaç duyabilecek belirli fonksiyonların oluşturulmasıdır.
Not: Bu nedenle, joop sayesinde, bir makro çözümü ile atlanabilecek ek bir işlev çağrısına ihtiyacımız var. Örneğin, böyle bir ziyaretçi belirli bir değere sahip tüm matris öğelerini sıfırlar. Başka bir ziyaretçi, elemanları bir dizi parametre ile değiştirebilir veya tek bir parametreye bile gerek duymayabilir. Bu yüzden temel olarak, vizör fonksiyon tipinin esnek bir tanımıyla ilgili soruyla karşılaşıyorum.
BTW: C++ 'da bu, std::bind
veya templates
ile çözülebilir.
İç içe Fonksiyonlar
İç içe işlevler bir GCC, ve örneğin Clang ile mevcut değil.
typedef double** Matrix;
typedef void (*MatrixElementVisitor) (double* element);
void visitMatrixElements(Matrix m, size_t rows, size_t cols, MatrixElementVisitor fn) {
for(size_t i = 0; i < rows; ++i) {
for(size_t j = 0; j < cols; ++j){
fn(&m[i][j]);
}
}
}
void filM(Matrix m, size_t rows, size_t cols, double val) {
void fill(double *element) {
*element = val;
}
visitMatrixElements(m, rows, cols, fill);
}
Değişkin fonksiyonları:
typedef double** Matrix;
typedef void (*MatrixElementVisitor) (double* element, va_list args);
void visitMatrixElements(Matrix m, size_t rows, size_t cols, MatrixElementVisitor fn, ...) {
va_list args,copy;
va_start(args, fn);
for(size_t i = 0; i < rows; ++i) {
for(size_t j = 0; j < cols; ++j){
va_copy(copy, args);
fn(&m[i][j], copy);
va_end(copy);
}
}
va_end(args);
}
void fill(double *element, va_list args) {
*element = va_arg(args, double);
}
void filM(Matrix m, size_t rows, size_t cols, double val) {
visitMatrixElements(m, rows, cols, fill, val);
}
geçersiz işaretçi: Yine burada kod örneği
typedef double** Matrix;
typedef void (*MatrixElementVisitor) (double* element, void *args);
void visitMatrixElements(Matrix m, size_t rows, size_t cols, MatrixElementVisitor fn, void *args) {
if(m) {
for(size_t i = 0; i < rows; ++i) {
if(m[i]) {
for(size_t j = 0; j < cols; ++j){
fn(&m[i][j], args);
}
}
}
}
}
void fill(double* element, void *args) {
if(!args) {
return;
}
*element = *((double*)args);
}
void filM(Matrix m, size_t rows, size_t cols, double val) {
visitMatrixElements(m, rows, cols, fill, &val);
}
Belki başka yolları da var var, ben statik işlevini kullanarak düşünmek değişken fonksiyonlarını da içeren ziyaretçi fonksiyonunun başlatılması için değişkenler.
Geri bildiriminiz için teşekkür ederiz.
Bu döngüler oluşturacak bir makro oluşturabilirsiniz. – Crozin
Evet, bu durumda işlev veya makroyu kullanabilirsiniz. –
Bir makro büyük olasılıkla (okuyucuya açık olmayan) dağınık ya da gizli olan 'i' ve 'j' vars (okuyucuya açık olmayan) olarak adlandırılan hayalet yaratacaktır. iç içe olamazdı. – DaveRandom