मेरे पास 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);
1
Stepii 14 जिंदा 2021, 16:42
आप एक int[][] सरणी को स्वीकार करने वाले फ़ंक्शन के लिए एक unsigned char [][] सरणी पास नहीं कर सकते। तय करें कि आप किस प्रकार का उपयोग करना चाहते हैं, फिर उस प्रकार का लगातार उपयोग करें।
 – 
Lundin
14 जिंदा 2021, 16:45
मैं इसे अभी क्यों नहीं डाल सकता?
 – 
Stepii
14 जिंदा 2021, 16:46
क्योंकि प्रकार कहीं भी संगत नहीं हैं, उनके अलग-अलग आकार हैं।
 – 
Lundin
14 जिंदा 2021, 16:46
1
क्योंकि एक कास्ट (int)my_char उस एक सिंगल वेरिएबल पर लागू होता है, जो इस मामले में परिवर्तित हो जाता है। यदि आप 2D सरणी के लिए ऐसा ही करते हैं, तो आपको 2D चार सरणी के माध्यम से लूप करना होगा और प्रत्येक व्यक्तिगत आइटम को 2D int में डालना होगा। यह काम करता है लेकिन बहुत धीमा है। आपको सबसे पहले unsigned char का उपयोग क्यों करना चाहिए?
 – 
Lundin
14 जिंदा 2021, 16:52
1
इसलिए, क्या मुझे transpose को unsigned char का उपयोग करने के लिए बदलना चाहिए?
 – 
Stepii
14 जिंदा 2021, 16:55

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;
}
1
Lundin 14 जिंदा 2021, 17:28

मैं कुछ चीजें बताना चाहता हूं जो आपकी मदद कर सकती हैं।

सबसे पहले, यदि आप किसी सरणी को फ़ंक्शन पैरामीटर के रूप में पास करना चाहते हैं, तो ब्रैकेट में आकार निर्दिष्ट न करें क्योंकि इसकी कोई आवश्यकता नहीं है। दरअसल, इसे गलत समझें।

दूसरा, जब आप कुछ टाइप करना चाहते हैं int जैसा कि मुझे लगता है कि आप कोड की अपनी तीसरी पंक्ति पर कोशिश कर रहे हैं, अभिव्यक्ति है: (int)charArray[] ; और नहीं int charArray(*) [SIZE]

तीसरा और सबसे महत्वपूर्ण, आप कुछ ऐसा टाइपकास्ट नहीं कर सकते जो गैर-अंकगणित (चार) है जो कि (int) है। लेकिन आप क्या कर सकते हैं atoi फ़ंक्शन का उपयोग करें जो एक तर्क को int में परिवर्तित करता है।

int atoi(const char *str);

साथ ही, अगली बार जब आप किसी फ़ंक्शन में सरणी पास करना चाहते हैं, तो आपको इसे संदर्भित करना पसंद करना चाहिए और सरणी के पते को पैरामीटर के रूप में पास करना चाहिए, न कि सामग्री के साथ सरणी, क्योंकि पूरी सरणी को परिवर्तित करने का कोई तरीका नहीं है ट्रांसपोज़ फ़ंक्शन से, भले ही आप इसे अपने इच्छित तरीके से संसाधित करने का प्रबंधन करें।

मुझे आशा है कि मैंने थोड़ी भी मदद की है, लेकिन अगर आपकी समस्या का समाधान नहीं होता है, तो अपनी समस्या का विवरण पोस्ट करने का प्रयास करें ताकि हम आपकी मदद करने में और सक्षम हो सकें।

0
qiu 14 जिंदा 2021, 17:21
char का उपयोग अंकगणितीय डेटा को ठीक से संग्रहीत करने के लिए किया जा सकता है, यह सिर्फ एक 8 बिट पूर्णांक है। इसके बावजूद atoi का उपयोग न करें, भद्दे त्रुटि प्रबंधन के कारण इसे टाला जाना चाहिए, इसके बजाय strtoul का उपयोग करें।
 – 
Lundin
14 जिंदा 2021, 17:26
"आपको इसे संदर्भित करना पसंद करना चाहिए और सरणी के पते को पैरामीटर के रूप में पास करना चाहिए, न कि सामग्री के साथ सरणी" कोड ऐसा करता है। आप सी में मूल्य से सरणी पास नहीं कर सकते हैं।
 – 
Lundin
14 जिंदा 2021, 17:26
मैं आपसे असहमत होने के बावजूद, काफी महत्वपूर्ण कारणों से, मैं पहले पूर्ण कथन की समीक्षा किए बिना भ्रमित व्यक्ति को उत्तर नहीं देना पसंद करूंगा, क्योंकि प्रश्न अपने आप में थोड़ा अस्पष्ट है।
 – 
qiu
14 जिंदा 2021, 17:33
"आप C" में मान के आधार पर सरणियों को पास नहीं कर सकते। ठीक है, हाँ, लेकिन Stepii उन्हें संदर्भ द्वारा सही ढंग से पास नहीं कर रहा है।
 – 
qiu
14 जिंदा 2021, 17:35
Anda sekarang seharusnya tidak lagi menerima kesalahan.
 – 
Lundin
14 जिंदा 2021, 17:50