عند النظر إلى الكود الذي قدمته، يبدو أن هناك عدة مشاكل في تخصيص الذاكرة باستخدام malloc
في الجزء الذي يقوم بإنشاء مصفوفة الجوار. دعوني أشرح لك الأخطاء وأقدم لك بعض التوجيهات حول كيفية إصلاحها.
-
استخدام
malloc
بشكل غير صحيح:
في السطر:cppg->adj = (int**)malloc(sizeof(int) * sizeof(g->v * g->v ));
تحاول تخصيص مساحة ذاكرة لمصفوفة ثنائية الأبعاد باستخدام
malloc
، ولكن الطريقة التي تقوم بها ليست صحيحة. يجب عليك تخصيص مساحة ذاكرة تكفي لتخزينv
صفوف، كل منها يحتوي علىv
عنصر. يمكنك القيام بذلك بالطريقة التالية:cppg->adj = (int**)malloc(g->v * sizeof(int*)); for (int i = 0; i < g->v; ++i) { g->adj[i] = (int*)malloc(g->v * sizeof(int)); }
-
خطأ في الحلقات التكرارية:
في الحلقات التكرارية التي تقوم بتهيئة قيم المصفوفةadj
، يجب أن تتراوح الفهرسات من 0 إلىg->v - 1
، لكنك استخدمت<= g->v
، مما قد يؤدي إلى الوصول إلى مواقع غير معتمدة ذاتيًا. يجب تغيير هذه الحلقات إلى:cppfor (u = 0; u < g->v; ++u) for (V = 0; V < g->v; ++V) g->adj[u][V] = 0;
-
خطأ في إدخال البيانات:
في الحلقة التي تقوم بإدخال بيانات الارتباط، تستخدم<= g->e
بدلاً من< g->e
، مما يمكن أن يؤدي إلى قراءة بيانات زائدة وتجاوز حجم المصفوفة المخصصة. يجب تغيير هذه الحلقة إلى:cppfor (i = 0; i < g->e; ++i) { cin >> u; cin >> V; g->adj[u][V] = 1; g->adj[V][u] = 1; }
بعد إجراء هذه التغييرات، يجب أن يعمل الكود بشكل صحيح دون وجود أخطاء تخصيص ذاكرة أو وصول غير صحيح. يمكنك الآن تجربة تشغيل الكود مرة أخرى ويجب أن يعمل بشكل صحيح.
المزيد من المعلومات
بالطبع، سأقدم لك المزيد من المعلومات حول كيفية عمل بعض الجوانب في الكود، بالإضافة إلى توجيهات حول كيفية تحسينه.
-
فصل دالة البناء عن الكائن الرئيسي:
في الكود الحالي، قمت بتنفيذ بناء الكائن داخل دالةgraph
مباشرةً. بدلاً من ذلك، يمكنك فصل بناء الكائن إلى دالة منفصلة. هذا يجعل الكود أكثر تنظيمًا وسهولة قراءة، ويسمح بإمكانية استخدام الكائن بشكل أفضل في المستقبل. على سبيل المثال:cppclass Graph { private: int v, e; int **adj; public: Graph(int vertices, int edges); void addEdge(int u, int v); void displayAdjacencyMatrix(); }; Graph::Graph(int vertices, int edges) : v(vertices), e(edges) { adj = new int*[v]; for (int i = 0; i < v; ++i) { adj[i] = new int[v]; for (int j = 0; j < v; ++j) { adj[i][j] = 0; } } cout << "Enter connections:\n"; int u, v; for (int i = 0; i < e; ++i) { cin >> u >> v; addEdge(u, v); addEdge(v, u); // Assuming an undirected graph } } void Graph::addEdge(int u, int v) { adj[u][v] = 1; } void Graph::displayAdjacencyMatrix() { cout << "Adjacency Matrix:\n"; for (int i = 0; i < v; ++i) { for (int j = 0; j < v; ++j) { cout << adj[i][j] << " "; } cout << endl; } } int main() { int vertices, edges; cout << "Enter number of vertices and edges: "; cin >> vertices >> edges; Graph g(vertices, edges); g.displayAdjacencyMatrix(); return 0; }
-
إصلاح الحد الأعلى في الحلقات التكرارية:
يجب أن يتراوح الحد الأعلى في الحلقات التكرارية من 0 إلىv - 1
بدلاً من<= v
، حتى لا يتم الوصول إلى عناصر غير معتمدة ذاتيًا. -
عرض مصفوفة الجوار:
تم إضافة دالةdisplayAdjacencyMatrix()
لعرض مصفوفة الجوار. يمكنك استدعاء هذه الدالة لعرض الجوار بشكل منظم.
من خلال تنظيم الكود وإجراء تغييرات صغيرة، يمكنك تحسين القابلية للصيانة والقراءة وفهم كيفية عمل برنامج الرسم البياني.