Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C प्रोग्रामिंग में रनटाइम पर द्वि-आयामी सरणी (2D Array) के साथ काम करना


रनटाइम आरंभिकरण (डायनामिक आवंटन)

कंपाइल टाइम पर आकार निश्चित करने के बजाय, रनटाइम पर उपयोगकर्ता इनपुट से आकार लेकर मेमोरी आवंटित करना।

2D सरणी के लिए डायनामिक आवंटन विधियाँ

विधि 1: पॉइंटर्स की सरणी (जैग्ड सरणी)


int **arr = malloc(rows * sizeof(int*));
for (int i = 0; i < rows; i++)
    arr[i] = malloc(cols * sizeof(int));

विधि 2: सन्निहित ब्लॉक (कैश-फ्रेंडली)


int *arr = malloc(rows * cols * sizeof(int));
// एक्सेस: arr[i * cols + j]

विधि 3: VLA (Variable Length Array) - C99


int rows, cols;
scanf("%d %d", &rows, &cols);
int arr[rows][cols];  // स्टैक पर, सीमित आकार

उदाहरण प्रोग्राम: दो 2D सरणियों का योग और गुणनफल

#include <stdio.h>
#include <stdlib.h>

int main() {
    int rows, cols;
    printf("पंक्तियाँ और स्तंभ दर्ज करें: ");
    scanf("%d %d", &rows, &cols);
    
    // डायनामिक आवंटन (विधि 2: सन्निहित)
    int *A = malloc(rows * cols * sizeof(int));
    int *B = malloc(rows * cols * sizeof(int));
    int *sum = malloc(rows * cols * sizeof(int));
    int *prod = malloc(rows * cols * sizeof(int));
    
    if (!A || !B || !sum || !prod) {
        printf("मेमोरी आवंटन विफल\n");
        return 1;
    }
    
    // मैक्रो/फंक्शन के लिए एक्सेस सहायक
    #define AT(arr, i, j) arr[(i)*cols + (j)]
    
    // इनपुट A
    printf("सरणी A के तत्व:\n");
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < cols; j++) {
            printf("A[%d][%d]: ", i, j);
            scanf("%d", &AT(A, i, j));
        }
    
    // इनपुट B
    printf("सरणी B के तत्व:\n");
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < cols; j++) {
            printf("B[%d][%d]: ", i, j);
            scanf("%d", &AT(B, i, j));
        }
    
    // योग और गुणनफल
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            AT(sum, i, j) = AT(A, i, j) + AT(B, i, j);
            AT(prod, i, j) = AT(A, i, j) * AT(B, i, j);
        }
    }
    
    // आउटपुट
    printf("\nयोग सरणी:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++)
            printf("%d\t", AT(sum, i, j));
        printf("\n");
    }
    
    printf("\nगुणनफल सरणी:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++)
            printf("%d\t", AT(prod, i, j));
        printf("\n");
    }
    
    // मुक्त करें
    free(A); free(B); free(sum); free(prod);
    return 0;
}

आउटपुट उदाहरण

पंक्तियाँ और स्तंभ दर्ज करें: 2 3
सरणी A के तत्व:
A[0][0]: 1  A[0][1]: 2  A[0][2]: 3
A[1][0]: 4  A[1][1]: 5  A[1][2]: 6
सरणी B के तत्व:
B[0][0]: 10  B[0][1]: 20  B[0][2]: 30
B[1][0]: 40  B[1][1]: 50  B[1][2]: 60

योग सरणी:
11	22	33
44	55	66

गुणनफल सरणी:
10	40	90
160	250	360

मूल प्रोग्राम की समस्याएं (सुधार)

मूल कोड में कई बग थे:

  • int sum[i][j] - VLA घोषणा लूप के अंदर गलत स्थान पर
  • scanf प्रॉम्प्ट्स लेकिन कोई इनपुट नहीं (आउटपुट में 0 दिखा)
  • कोई मेमोरी मुक्ति नहीं
  • त्रुटि जांच नहीं

सर्वोत्तम अभ्यास

  • बड़े सरणियों के लिए malloc/free उपयोग करें (स्टैक ओवरफ्लो से बचने)
  • सन्निहित आवंटन (विधि 2) कैश प्रदर्शन के लिए बेहतर
  • हमेशा malloc रिटर्न मान जांचें
  • free() से मेमोरी मुक्त करें
  • एक्सेस के लिए मैक्रो या इंलाइन फंक्शन उपयोग करें
  1. C भाषा में पॉइंटर्स और टू-डायमेंशनल एरे समझें C भाषा में पॉइंटर्स और टू-डायमेंशनल एरे समझें

    पॉइंटर एक वेरिएबल है जो दूसरे वेरिएबल का पता संग्रहीत करता है। पॉइंटर्स की विशेषताएँ मेमोरी स्पेस बचाता है। मेमोरी लोकेशन तक सीधी पहुंच के कारण एक्जीक्यूशन समय तेज होता है। पॉइंटर्स की मदद से मेमोरी कुशलतापूर्वक एक्सेस होती है (डायनामिक आवंटन/डीआवंटन)। डेटा स्ट्रक्चर्स के साथ उपयोग किया जाता है।

  1. C में ऐरे ऑफ पॉइंटर्स और पॉइंटर टू पॉइंटर C में ऐरे ऑफ पॉइंटर्स और पॉइंटर टू पॉइंटर

    ऐरे ऑफ पॉइंटर्स किसी भी डेटा टाइप की तरह, हम पॉइंटर्स का ऐरे घोषित कर सकते हैं। घोषणा datatype *pointername[size]; उदाहरण: int *p[5]; // 5 इंटीजर एड्रेस रखने वाला पॉइंटर ऐरे आरंभीकरण int a[3] = {10, 20, 30}; int *p[3]; for (i = 0; i < 3; i++) p[i] = &a[i]; // या p[i] = a + i; एक्सेस करना for

  1. Bash शेल स्क्रिप्टिंग में ऐरे ऑपरेशन में महारत हासिल करना - भाग 8 Bash शेल स्क्रिप्टिंग में ऐरे ऑपरेशन में महारत हासिल करना - भाग 8

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