البرمجة

تحسين أداء برنامج إدخال بيانات الأصدقاء في لغة C

في البداية، يظهر أن الكود الخاص بك يحاول إنشاء سجل لأصدقائك باستخدام مصفوفة من مصفوفات السلاسل الطويلة (pointer to pointer) ويستخدم realloc لتحديد حجم السلسلة لكل اسم. ومع ذلك، يبدو أن هناك مشكلة في كيفية تخصيص وتحرير الذاكرة.

لنبدأ بفحص الكود خطاً بخط. أولاً وقبل كل شيء، يتعين عليك تصحيح خطأ في تخصيص الذاكرة للمصفوفة الرئيسية للأصدقاء. يجب عليك استخدام sizeof(char*) بدلاً من sizeof(char) لأنك تقوم بتخصيص مصفوفة من المؤشرات (pointers). السطر يجب أن يكون كالتالي:

c
char** friendBook = (char**)malloc(sizeof(char*) * friends);

الآن بعد أن قمت بتصحيح هذا الخطأ، دعنا ننتقل إلى الجزء الذي يتعلق بالتخصيص والتحرير الفعلي لكل سلسلة. في هذا السياق، يوجد خطأ في استخدام realloc. يجب أن تعتبر أيضًا حجم الصفر عند استخدام realloc لتحرير الذاكرة. بمعنى آخر، يجب عليك استخدام strlen(str) + 1 بدلاً من strlen(str) لأخذ في اعتبارك نهاية السلسلة ('\0').

c
*(friendBook + i) = (char*)realloc(*(friendBook + i), (sizeof(char) * (strlen(str) + 1)));

والآن، عندما يتم تخصيص الذاكرة بشكل صحيح، يجب عليك أيضًا القضاء على الذاكرة المخصصة عند الانتهاء من استخدامها. في هذه الحالة، أنت تقوم بتحرير ذاكرة كل سلسلة ثم تحرير ذاكرة المصفوفة الرئيسية. يبدو أن الجزء الخاص بالتحرير الذي كتبته لم يعمل بشكل صحيح.

لتحسين عملية تحرير الذاكرة، يمكنك تغيير الجزء الخاص بالتحرير كما يلي:

c
for (i = 0; i < friends; i++) { free(*(friendBook + i)); } free(friendBook);

بهذا الشكل، ستقوم بتحرير الذاكرة بشكل صحيح لكل سلسلة قبل تحرير المصفوفة الرئيسية.

الملاحظات:

  1. يُفضل دائمًا استخدام sizeof(type) بدلاً من sizeof(variable) في malloc و realloc.
  2. يُفضل دائمًا تحرير الذاكرة بعد الانتهاء من استخدامها لتجنب تسرب الذاكرة.

المزيد من المعلومات

بالطبع، دعني أوضح بشكل أكثر تفصيلاً بعض النقاط وأقدم بعض النصائح المفيدة لفهم الكود وتحسينه:

  1. تصحيح تعليمات التحكم في البرنامج:
    في النهاية من البرنامج، لا تحتاج إلى استخدام system("PAUSE") لتجنب إغلاق النافذة فور انتهاء التنفيذ. يمكنك استخدام getchar() بدلاً من ذلك. هذا سيتيح للمستخدم الضغط على Enter لإغلاق البرنامج بشكل نظيف.

    c
    getchar(); // استبدل system("PAUSE");
  2. تحسين تعليمات الإدخال:
    عند قراءة العدد الذي يمثل عدد الأصدقاء، يمكنك إضافة تحقق إضافي للتأكد من أن القيمة المدخلة صحيحة وإعادة المحاولة إذا لم تكن.

    c
    while (1) { printf("Hello bro, how U doin'?\nTell me how many friends do you have?\n"); if (scanf("%d", &friends) == 1 && friends > 0) { break; } else { printf("Invalid input. Please enter a valid number of friends.\n"); while (getchar() != '\n'); // تنظيف الباقي من الإدخال السابق } }
  3. تجنب الاختلاط بين scanf و fgets:
    عند استخدام scanf يمكن أن تتبعه مشاكل عند استخدام fgets، حيث يمكن أن يتبقى السطر الجديد في الذاكرة ويؤثر على fgets. لتجنب ذلك، استخدم getchar() بعد scanf لتنظيف السطر الجديد.

    c
    scanf("%d", &friends); getchar(); // لتنظيف السطر الجديد
  4. التحقق من نجاح malloc و realloc:
    قبل استخدام الذاكرة التي تم تخصيصها باستخدام malloc أو realloc، يجب عليك التحقق من نجاح عملية التخصيص.

    c
    char** friendBook = (char**)malloc(sizeof(char*) * friends); if (!friendBook) { printf("Memory allocation failed. Exiting...\n"); return 1; }

    وكذلك في realloc:

    c
    *(friendBook + i) = (char*)realloc(*(friendBook + i), (sizeof(char) * (strlen(str) + 1))); if (!*(friendBook + i)) { printf("Memory reallocation failed. Exiting...\n"); return 1; }

    تحقق من نجاح عمليات التخصيص يساعد في تفادي الثغرات وضمان استخدام آمن للذاكرة.

  5. توثيق الكود:
    قم بإضافة توثيق (تعليقات) لشرح ما يقوم به الكود في كل مرحلة. هذا يساعد على فهم القارئ للغرض من الكود وتسهيل عملية الصيانة في المستقبل.

باتباع هذه النصائح وتصحيح الأخطاء المذكورة، يجب أن يكون لديك برنامج يعمل بشكل صحيح ويتفاعل بشكل جيد مع الإدخال والإخراج.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!