/ / ++ में मैजिक स्क्वायर - सी ++, एरे, फॉल्ट, मैजिक-स्क्वायर

सी ++ में जादू स्क्वायर - सी ++, सरणी, गलती, जादू-वर्ग

फिर भी एक और जादू वर्ग समस्या। मैं C ++ में एक अजीब मैजिक स्क्वायर प्रोग्राम बना रहा हूं, और किसी कारणवश यह प्रोग्राम एक सेगमेंटेशन त्रुटि और छोड़ने के लिए रहता है।

#include <iostream>

using std::cin;
using std::cout;

#include <cstring>

using std::memset;

int *generateOddSquare(int n) {
if (n % 2 != 0 && n >= 3) {
int row = 0, col = n / 2, square = n * n;
int **matrix = new int *[n], *dest = new int[square];

memset(matrix, 0, sizeof(matrix[0][0]) * square);

for (int i = 1; i <= square; i++) {
matrix[row][col] = i;

if (i % n == 0)
row++;
else {
if (row == 0)
row = n - 1;
else
row--;

if (col == (n - 1))
col = 0;
else
col++;
}
}

for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dest[(i * n) + j] = matrix[i][j];
}
}

return dest;
} else
return NULL;
}

int main() {
int *arr = generateOddSquare(3);

for (int i = 0; i < 9; i++) {
cout << arr[i] << "n";
}
}

इसमें ग़लत क्या है? क्या मैं अपने संकेत को सही घोषित कर रहा हूं?

उत्तर:

जवाब के लिए 2 № 1

आप बिंदुओं की एक सरणी बनाते हैं:

int **matrix = new int *[n]

लेकिन डॉन "टी किसी भी बात करने के लिए उन्हें इनिशियलाइज़ करता है; इसलिए सेग्मेंटेशन फॉल्ट जब आप उन्हें डीरेंशन करने की कोशिश करते हैं। यदि आपको वास्तव में पॉइंटर्स को जॉग करना चाहिए, तो प्रत्येक बिंदु पर इंगित करने के लिए एक सरणी आवंटित करें:

for (int i = 0; i < n; ++i) {
matrix[i] = new int[n];
}

और यदि आप स्मृति लीक की परवाह करते हैं, तो इन सभी आवंटन को हटाना न भूलें।

जब तक यह मर्दाना में एक अभ्यास नहीं है, जीवन को आसान बनाने के लिए मानक पुस्तकालय का उपयोग करें:

std::vector<std::vector<int>> matrix(n, std::vector<int>(n));

और वापस std::vector<int> बजाय int* कॉल करने वाले को जुगाली करने और पॉइंटर को हटाने की परेशानी से बचाने के लिए।


उत्तर № 2 के लिए 1

आप केवल आंशिक रूप से तात्कालिक मैट्रिक्स हैं। आपके पास int **matrix = new int *[n] जो आपको अपनी पंक्तियाँ देगा लेकिन आप स्तंभों को परिभाषित कर रहे हैं। पूरी तरह से प्रारंभिक करने के लिए आपको उपयोग करने की आवश्यकता है

int **matrix = new int *[n];
for (int i = 0; i < col_dimension; i++)
matrix[i] = new int[col_dimension];

उत्तर № 3 के लिए 1

आप अशक्त संकेत दे रहे हैं। आपके पास 2-डी सरणी है:

int **matrix = new int *[n];

कि आप स्पष्ट (गलत तरीके से - आकार होना चाहिए) n * sizeof(*matrix)):

memset(matrix, 0, sizeof(matrix[0][0]) * square);

और फिर तुरंत में लिखें:

for (int i = 1; i <= square; i++) {
matrix[row][col] = i;
....
}

परंतु matrix[0] है NULL। आपको पहले सभी बिंदुओं को आवंटित करने की आवश्यकता है!

for (int i = 0; i < n; ++i) {
matrix[i] = new int[whatever];
}