मेरे पास 0 से 255 के मान के रूप में एक छवि को संग्रहीत करने के लिए अहस्ताक्षरित वर्णों की निम्नलिखित 2d सरणी है:
unsigned char img[MAX_DIM][MAX_DIM];
और मेरे पास एक ऐसा फ़ंक्शन है जो पैरामीटर के रूप में 2d int सरणी लेता है:
void transpose(int m[][MAX_DIM], int h, int w);
मैं उस फ़ंक्शन में चार सरणी कैसे पास कर सकता हूं? मैंने ऐसा कुछ करने की कोशिश की लेकिन यह काम नहीं करता है:
transpose((int (*)[MAX_DIM])img, h, w);
2 जवाब
आप एक टाइप-जेनेरिक इंटरफ़ेस बना सकते हैं और दो अलग-अलग ट्रांसपोज़ फ़ंक्शंस लागू कर सकते हैं, एक 8 बिट डेटा के लिए और एक 32 बिट डेटा के लिए। उदाहरण:
#include <stdint.h>
#include <stdio.h>
void transpose_32 (size_t h, size_t w, uint32_t m[h][w]){ puts(__func__); }
void transpose_8 (size_t h, size_t w, uint8_t m[h][w]){ puts(__func__); }
#define transpose(m,h,w) _Generic(**(m), uint8_t: transpose_8, uint32_t: transpose_32)(h,w,m)
int main(void)
{
const size_t MAX_DIM = 10;
uint8_t img1[MAX_DIM][MAX_DIM];
uint32_t img2[MAX_DIM][MAX_DIM];
transpose(img1, MAX_DIM, MAX_DIM);
transpose(img2, MAX_DIM, MAX_DIM);
return 0;
}
मैं कुछ चीजें बताना चाहता हूं जो आपकी मदद कर सकती हैं।
सबसे पहले, यदि आप किसी सरणी को फ़ंक्शन पैरामीटर के रूप में पास करना चाहते हैं, तो ब्रैकेट में आकार निर्दिष्ट न करें क्योंकि इसकी कोई आवश्यकता नहीं है। दरअसल, इसे गलत समझें।
दूसरा, जब आप कुछ टाइप करना चाहते हैं int जैसा कि मुझे लगता है कि आप कोड की अपनी तीसरी पंक्ति पर कोशिश कर रहे हैं, अभिव्यक्ति है: (int)charArray[] ; और नहीं int charArray(*) [SIZE]
तीसरा और सबसे महत्वपूर्ण, आप कुछ ऐसा टाइपकास्ट नहीं कर सकते जो गैर-अंकगणित (चार) है जो कि (int) है। लेकिन आप क्या कर सकते हैं atoi फ़ंक्शन का उपयोग करें जो एक तर्क को int में परिवर्तित करता है।
int atoi(const char *str);
साथ ही, अगली बार जब आप किसी फ़ंक्शन में सरणी पास करना चाहते हैं, तो आपको इसे संदर्भित करना पसंद करना चाहिए और सरणी के पते को पैरामीटर के रूप में पास करना चाहिए, न कि सामग्री के साथ सरणी, क्योंकि पूरी सरणी को परिवर्तित करने का कोई तरीका नहीं है ट्रांसपोज़ फ़ंक्शन से, भले ही आप इसे अपने इच्छित तरीके से संसाधित करने का प्रबंधन करें।
मुझे आशा है कि मैंने थोड़ी भी मदद की है, लेकिन अगर आपकी समस्या का समाधान नहीं होता है, तो अपनी समस्या का विवरण पोस्ट करने का प्रयास करें ताकि हम आपकी मदद करने में और सक्षम हो सकें।
char
का उपयोग अंकगणितीय डेटा को ठीक से संग्रहीत करने के लिए किया जा सकता है, यह सिर्फ एक 8 बिट पूर्णांक है। इसके बावजूद atoi
का उपयोग न करें, भद्दे त्रुटि प्रबंधन के कारण इसे टाला जाना चाहिए, इसके बजाय strtoul
का उपयोग करें।
संबंधित सवाल
नए सवाल
arrays
एक सरणी एक आदेशित रैखिक डेटा संरचना है जिसमें तत्वों (मूल्यों, चर, या संदर्भों) का एक संग्रह होता है, प्रत्येक को एक या अधिक अनुक्रमित द्वारा पहचाना जाता है। जब सरणियों के विशिष्ट प्रकारों के बारे में पूछा जाता है, तो इसके बजाय इन संबंधित टैगों का उपयोग करें: [वेक्टर], [सरणी सूची], [मैट्रिक्स]। इस टैग का उपयोग करते समय, एक सवाल जो प्रोग्रामिंग भाषा के लिए विशिष्ट होता है, उस प्रश्न को उस प्रोग्रामिंग भाषा के साथ टैग करें जिसका उपयोग किया जा रहा है।
int[][]
सरणी को स्वीकार करने वाले फ़ंक्शन के लिए एकunsigned char [][]
सरणी पास नहीं कर सकते। तय करें कि आप किस प्रकार का उपयोग करना चाहते हैं, फिर उस प्रकार का लगातार उपयोग करें।(int)my_char
उस एक सिंगल वेरिएबल पर लागू होता है, जो इस मामले में परिवर्तित हो जाता है। यदि आप 2D सरणी के लिए ऐसा ही करते हैं, तो आपको 2D चार सरणी के माध्यम से लूप करना होगा और प्रत्येक व्यक्तिगत आइटम को 2D int में डालना होगा। यह काम करता है लेकिन बहुत धीमा है। आपको सबसे पहलेunsigned char
का उपयोग क्यों करना चाहिए?transpose
कोunsigned char
का उपयोग करने के लिए बदलना चाहिए?