संकेत देने के लिए बथशेबा को धन्यवाद, अंत में मैं फ़ंक्शन पॉइंटर्स से जुड़े समाधानों के साथ आया, जिन पर मुझे विश्वास नहीं है। मुख्य समस्या उन विशिष्ट कार्यों का निर्माण है जिन्हें अतिरिक्त पैरामीटर की आवश्यकता हो सकती है।
नोट: जूप के लिए धन्यवाद, इसलिए हमें एक अतिरिक्त फ़ंक्शन कॉल की आवश्यकता है, जिसे मैक्रो समाधान से छोड़ा जा सकता है।
उदाहरण के लिए ऐसा आगंतुक किसी दिए गए मान के साथ सभी मैट्रिक्स तत्वों को रीसेट करता है। एक और आगंतुक पैरामीटर के सेट के साथ तत्वों को संशोधित कर सकता है, या एक पैरामीटर की भी आवश्यकता नहीं है। तो मूल रूप से मैं विजिस्टर फ़ंक्शन प्रकार की लचीली परिभाषा पर प्रश्न का सामना करता हूं।
बीटीडब्ल्यू: सी ++ में इसे std::bind
या templates
के साथ हल किया जा सकता है।
नेस्टेड कार्य:
नेस्टेड कार्यों एक जीसीसी विस्तार कर रहे हैं, और जैसे क्लैंग के साथ उपलब्ध नहीं है।
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);
}
variadic कार्य::
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);
}
शून्य सूचक: फिर भी यहाँ कोड उदाहरण है
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);
}
हो सकता है कि अन्य तरीके मौजूद हैं, मैं स्थिर समारोह का उपयोग कर के बारे में सोच विज़िटर फ़ंक्शन के प्रारंभ के लिए चर, इसमें विविध कार्य शामिल हैं।
आपकी प्रतिक्रिया के लिए धन्यवाद।
आप एक मैक्रो बना सकते हैं जो इन लूप उत्पन्न करेगा। – Crozin
हां, आप इन मामलों में फ़ंक्शन या मैक्रो का उपयोग कर सकते हैं। –
एक मैक्रो या तो गन्दा हो सकता है (पाठक को गैर-स्पष्ट) कॉल करने या प्रेत छिपाने के लिए 'i' और' j' vars (पाठक के लिए भी स्पष्ट नहीं), यदि आप छुपे हुए वार्स बनाते हैं, तो वे भी घोंसला नहीं जा सका। – DaveRandom