مشاكل البرمجة

  • تقنيات نقل الملفات الثنائية في لغة البرمجة C

    في البرمجة بلغة C، يعتبر نقل الملفات الثنائية واحدة من المهام الأساسية، ويُستخدم ذلك على نطاق واسع في مجال تطوير البرمجيات. يقدم الشيفرة التي قدمتها لنا مثالًا على كيفية نسخ ملف ثنائي باستخدام دوال fread وfwrite. سنقوم بفهم الشيفرة وتوضيح القضايا التي قد تظهر.

    في البداية، تقوم الشيفرة بفتح ملف CSV.csv للقراءة و CSVDest.csv للكتابة. يتم تعيين حجم البايتات التي ستقرأ في كل مرة باستخدام الماكرو PER_READ. ثم يتم إنشاء مصفوفة buffer بحجم 500 بايت لاحتواء البيانات المقروءة.

    في الحلقة do-while، يتم استخدام الدالة fread لقراءة البيانات من الملف المصدر (CSV.csv) إلى المتغير buffer، ويتم تحديث المتغير finished بعدد البايتات التي تمت قراءتها. يتم تكرار هذه العملية حتى يتم قراءة كل البيانات من الملف المصدر.

    بعد ذلك، يتم استخدام الدالة fwrite لكتابة البيانات الموجودة في buffer إلى الملف الهدف (CSVDest.csv) باستخدام المتغير finished الذي يحتوي على عدد البايتات التي تمت قراءتها.

    ومع ذلك، هناك بعض القضايا المحتملة في الشيفرة. في البداية، يتم استخدام sizeof(char*) في دالتي fread وfwrite، ولكن يفضل استخدام sizeof(char) لأن البايت هو الوحدة الأساسية في البرمجة ثنائية البيانات. علاوة على ذلك، يمكن أن يكون هناك تعديلات على التفاصيل الخاصة بالتحكم في نجاح فتح الملفات.

    يمكن أن يساعد فهم هذه النقاط في تحسين الكود وتجنب المشاكل المحتملة في عملية نسخ الملفات الثنائية في بيئة البرمجة بلغة C.

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

    بالتأكيد، سنوسع في فهم عملية نسخ الملفات الثنائية في برمجة C ونتناول بعض النقاط الأخرى المهمة.

    أولاً، دعونا نلقي نظرة على السطور التالية في الشيفرة:

    c
    finished = fread(buffer, sizeof(char*), PER_READ, CSV);

    و

    c
    fwrite(buffer, sizeof(char*), finished, csvDest);

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

    c
    finished = fread(buffer, sizeof(char), PER_READ, CSV);

    و

    c
    fwrite(buffer, sizeof(char), finished, csvDest);

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

    c
    FILE* CSV = fopen("CSV.csv", "rb"); if (CSV == NULL) { perror("Error opening CSV file"); return 1; // أو أي رقم آخر يُشير إلى وجود مشكلة }

    ونفس الشيء ينطبق على csvDest.

    ثالثًا، استخدام دالة system("PAUSE") لوقف تشغيل البرنامج قد يكون غير مفيد في بعض الأحيان، ويفضل استخدام دالة getchar() أو أية وسيلة أخرى للاستمرار بانتظار إدخال من المستخدم.

    أخيرًا، قد تكون هناك حاجة إلى إغلاق الملفات المفتوحة باستخدام fclose بعد الانتهاء من استخدامها لتجنب تسريب الموارد.

    باختصار، يُفضل دائمًا فحص نجاح عمليات الفتح والإغلاق، وضبط حجم البيانات المُستخدمة في fread و fwrite بشكل صحيح لضمان عملية نسخ الملفات الثنائية بشكل صحيح وفعال.

  • حل مشكلات قراءة الملفات وكتابتها في Java: دليل تصحيحي

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

    أولًا، يجب أن تعلم أن دالة readLine() في BufferedReader تقوم بقراءة سطر واحد فقط من الملف في كل مرة. لذا، يجب عليك تخزين السطور المقروءة في متغير ثم استخدامها لاحقًا. في الوقت الحالي، تقوم بقراءة السطر وتقوم بتجاوزه فورًا دون استفادة من المحتوى.

    تعتمد على readLine() للتحقق من نهاية الملف، لكن يجب أيضًا مراعاة التحقق من قيمة null بشكل منفصل.

    بالإضافة إلى ذلك، يجب أن تتحقق من وجود الملف “marc21.txt” وأن تتأكد من أن الملف قابل للقراءة. يمكن أن يكون عدم وجود الملف أو عدم قدرة البرنامج على قراءته سببًا آخر في الأخطاء.

    علاوة على ذلك، يجب تصحيح بعض الأخطاء النحوية في الكود. على سبيل المثال، يجب عليك استخدام bw.close() بعد الانتهاء من الحلقة while وليس داخلها، لضمان أن تكون الكتابة في الملف قد اكتملت بشكل صحيح.

    إليك تصحيح لبعض النقاط المشار إليها:

    java
    public static void main(String[] args) throws IOException { String file = "marc21.txt"; String line; BufferedReader br = new BufferedReader(new FileReader(file)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("marc22.txt"))); while ((line = br.readLine()) != null) { // obtaining first five characters of file String substring = line.substring(0, 4); // converting substring to integer int x = Integer.parseInt(substring); System.out.println("x is " + x); // taking record to marc21 to another file marc22 bw.write(line.substring(0, x)); bw.write("\n"); } // close the BufferedWriter outside the loop bw.close(); // close the BufferedReader br.close(); }

    تأكد من تحليل هذا الكود بعناية وتعديله وفقًا لاحتياجاتك ومتطلبات برنامجك.

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

    من خلال النظر إلى الكود الذي قدمته، يظهر أن هناك عدة مشاكل قد تؤدي إلى حدوث أخطاء في تنفيذ البرنامج. سأقوم بتحليل الكود وتقديم بعض الإقتراحات لتصحيح الأخطاء المحتملة.

    أولًا، يبدو أن هناك خطأ في استخدام دالة readLine() حيث يجب حفظ السطر الذي تم قراءته في متغير لاحقاً. لذا، يُفضل تخزين السطر المقروء في متغير لاستخدامه لاحقاً.

    أيضًا، يجب وضع الجزء الخاص بإغلاق BufferedWriter (bw.close()) خارج الحلقة while. إذا قمت بإغلاقها داخل الحلقة، فإنها ستُغلق في كل تكرار، وهذا قد يؤدي إلى مشاكل في كتابة الملف.

    علاوة على ذلك، يجب التأكد من أن الملف “marc21.txt” متاحًا وموجودًا في المسار الصحيح.

    إليك نسخة من الكود مع التصحيحات المقترحة:

    java
    import java.io.*; public class Main { public static void main(String[] args) throws IOException { String file = "marc21.txt"; String line; BufferedReader br = new BufferedReader(new FileReader(file)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("marc22.txt"))); while ((line = br.readLine()) != null) { // obtaining first five characters of line String substring = line.substring(0, 4); // converting substring to integer int x = Integer.parseInt(substring); System.out.println("x is " + x); // taking record to marc21 to another file marc22 bw.write(line.substring(0, x)); bw.write("\n"); } // close the BufferedWriter outside the loop bw.close(); br.close(); } }

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

  • حلا لمشكلة mysql_fetch_assoc() في PHP

    في هذا السياق، يظهر لديك رسالة تحذيرية في الكود البرمجي الخاص بك، تشير إلى خطأ في استخدام دالة “mysql_fetch_assoc()” حيث يتوقع أن يكون المعامل الأول مصدرًا (resource) ولكن تم تمرير قيمة “null” بدلاً من ذلك. يبدو أن هذا الخطأ قد حدث في السطور التالية:

    php
    while ($crow = mysql_fetch_assoc($commment_result)) {

    الخطأ يحدث هنا لأنه تم كتابة “commment_result” بدلاً من “comment_result”. يجب تصحيح الأخطاء الإملائية لتجنب هذا الخطأ. يجب أن تكون السطر الصحيح كالتالي:

    php
    while ($crow = mysql_fetch_assoc($comment_result)) {

    علاوة على ذلك، يفضل عدم استخدام دوال mysql المهملة في الإصدارات الحديثة من PHP، حيث أنها تمثل مخاطر أمان وقد تكون قديمة. بدلاً من ذلك، يُفضل استخدام دوال MySQLi أو PDO لتحقيق أمان وأداء أفضل.

    يمكنك استخدام دالة mysqli_fetch_assoc() بدلاً من mysql_fetch_assoc()، ويمكن تحديث الاتصال بقاعدة البيانات إلى MySQLi أيضا. قد يكون التحديث إلى استخدام استعلامات معدة (prepared statements) أمرًا ذا أهمية خاصة لضمان الأمان وتجنب تعرض التطبيق لهجمات حقن SQL.

    الكود الصحيح بعد التعديل يمكن أن يكون كالتالي:

    php
    while ($crow = mysqli_fetch_assoc($comment_result)) {

    ويفضل أيضا تحديث استخدام توصيل MySQL بما يتناسب مع MySQLi أو PDO. يمكن القيام بذلك باستخدام دالة mysqli_connect() بدلاً من mysql_connect().

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

    في هذا السياق، يظهر أن لديك مشكلة في استخدام الدالة mysql_fetch_assoc() في قطعة من الشيفرة البرمجية الخاصة بك. يظهر رسالة تحذير تشير إلى أن المتغير الذي يتم تمريره كمعامل للدالة يجب أن يكون مصدرًا (resource)، ولكن يتم تمرير قيمة null بدلاً من ذلك.

    عند تفحص الشيفرة، يمكن رؤية أن هناك خطأ في كتابة اسم المتغير، حيث كتبت $commment_result بدلاً من $comment_result. هذا الخطأ في التهجئة يؤدي إلى أن المتغير $comment_result لا يتم التعرف عليه، وبالتالي تصبح قيمته null، مما يتسبب في ظهور الرسالة الخطأ.

    لحل هذه المشكلة، يجب تصحيح اسم المتغير في السطر الذي يستخدم الدالة mysql_fetch_assoc()، بحيث يصبح السطر كالتالي:

    php
    while ($crow = mysql_fetch_assoc($comment_result)) {

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

  • تجنب تسريب الذاكرة في لغة C: إدارة تخصيص الذاكرة وتحريرها في قوائم متسلسلة

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

    المشكلة التي تواجهك هي أن جميع الأشخاص في القائمة لديهم نفس الاسم. يحدث ذلك بسبب استخدامك لنوع البيانات char* لتمثيل الاسم في هيكل Human. عندما تقوم بقراءة الاسم من الملف باستخدام fscanf، يتم تخزين عنوان السلسلة في نفس المكان في الذاكرة لجميع الهياكل.

    لحل هذه المشكلة، يمكنك تخصيص مساحة في الذاكرة بشكل فردي لكل هيكل Human، ونسخ الاسم إلى هذه المساحة. يمكن القيام بذلك باستخدام وظيفة مثل strdup لتكرار السلسلة وتخصيص مساحة في الذاكرة بحيث تكون فريدة لكل هيكل Human.

    اليك تعديل بسيط على الكود:

    c
    #include #include #include typedef struct human { int age; char* name; } Human; int main() { Human h; FILE *s = fopen("h.txt", "r"); if (s == NULL) { printf("dsdfsf"); } h.name = (char*)malloc(256); // افتراضياً يمكن أن يكون الحد الأقصى للاسم 256 حرفًا، يمكنك تعديله حسب احتياجاتك fscanf(s, "%d", &h.age); fscanf(s, "%s", h.name); // إضافة h إلى قائمة متسلسلة // كرر هذا الكود عدة مرات لملء القائمة بـ 10 بني آدم free(h.name); // لا تنسى حرر المساحة في الذاكرة بعد الانتهاء من استخدامها return 0; }

    هذا التعديل يقوم بتخصيص مساحة في الذاكرة للسلسلة باستخدام malloc، ويستخدم fscanf لنسخ الاسم إلى هذه المساحة. وفي النهاية، يتم حرر المساحة في الذاكرة باستخدام free عند الانتهاء من استخدام الهيكل.

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

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

    أيضًا، يُفضل أن تتحقق دائمًا من نجاح عمليات فتح الملف والقراءة باستخدام fopen وfscanf بفحص قيمة المؤشر العائدة. يمكنك استخدام الشروط للتحقق من نجاح العمليات واتخاذ إجراءات مناسبة في حالة الفشل.

    أيضًا، إذا كنت تخطط لتخزين الهياكل في قائمة متسلسلة، يمكنك النظر في استخدام هياكل البيانات الديناميّة، مثل الربط الجغرافي، لتسهيل إدارة العناصر بشكل دينامي وتجنب مشاكل التخصيص والتحرير.

    إليك مثال توضيحي للكود يأخذ بعين الاعتبار النقاط المذكورة:

    c
    #include #include #include typedef struct human { int age; char* name; struct human* next; } Human; void freeList(Human* head) { while (head != NULL) { Human* temp = head; head = head->next; free(temp->name); free(temp); } } int main() { Human* head = NULL; for (int i = 0; i < 10; ++i) { FILE* s = fopen("h.txt", "r"); if (s == NULL) { printf("Failed to open file"); freeList(head); return 1; } Human* h = (Human*)malloc(sizeof(Human)); h->name = (char*)malloc(256); // افتراضياً يمكن أن يكون الحد الأقصى للاسم 256 حرفًا h->next = NULL; fscanf(s, "%d", &h->age); fscanf(s, "%s", h->name); // إضافة h إلى قائمة متسلسلة h->next = head; head = h; fclose(s); } // القيام بأي شيء إضافي مع القائمة // تحرير الذاكرة عند الانتهاء freeList(head); return 0; }

    هذا المثال يظهر كيفية إنشاء قائمة متسلسلة من الهياكل البيانية Human وكيفية تحرير المساحة في الذاكرة عند الانتهاء.

  • أنواع الأخطاء في البرمجة

    قال عالم الكمبيوتر الراحل Edsger W. Dijkstra ، “إذا كان التصحيح هو عملية إزالة الأخطاء ، فيجب أن تكون البرمجة هي عملية إدخالها”.

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

    عند التحدث عن أنواع الأخطاء في البرمجة. فأن هنالك ثلاث أنواع من الأخطاء في البرمجة يمكن تقسم الاخطاء تحتها  وهي:

    1-Syntax errors.
    2-Semantic errors.
    3-Logical errors.

     

    1- الــ Syntax errors

    أو مايُسمى بالعربية “الأخطاء اللغوية” وهي الأخطاء اللغوية الناتجة من المبرمج عند كتابة الكود، مثلاً أن ينسى وضع ( ; ) في بعض لغات البرمجة، أو يكتب كلمة محجوزة في اللغة بطريقة خاطئة ككتابة c out مثلاً إذ يوجد فراغ بين الكلمة وهذا النوع من الأخطاء سهل اكتشافه نوعاً ما في بعض لغات البرمجة، ولا يتم تشغيل البرنامج إلا بعد تصحيح هذه الأخطاء.

     2- الــ Semantic errors

    هذا النوع من الأخطاء لا يظهر تقريباً إلا بعد ظهور نتائج البرنامج، يكون هذا الخطأ رياضياً في أغلب الأحيان، مثال على ذلك :
    طلب منك إيجاد معدل للطلاب والعلامات تكون بين 0 و 100 وعندما تم تنفيذ البرنامج كانت النتائج 125 مثلاً، هنا الخطأ ربما ليس في الكود بل في الإدخال أو العمليات الحسابية، وهنا يتم تنفيذ الكود بحد ذاته دون اي مشكلة.

     3- الــ Logical errors

    هذا النوع يُسمى أيضاً بــ Runtime errors وهو الخطأ الذي يظهر أثناء تنفيذ البرنامج، وهو خطأ منطقي مثلاً :
    عملية حسابية يكون فيها المقام صفر أو ندخل قيمة مُتغييرة سالبة، ونريد طباعة قيمة لمصفوفة ونُسند هذا المتغير إلى الموقع، بالطبع سيكون خطأ منطقي لأن المصفوفات تبدأ من صفر وتكون دلئماً موجبة.
    هذه بعض أشهر أنواع الأخطاء في البرمجة.

  • AppStore اسباب رفض التطبيقات على

    اكثر اسباب رفض التطبيقات شيوعاً على متجر AppStore و ساسرد بشكل مختصر اكثر الاسباب لرفض التطبيقات على المتجر التي الاحظها عند المبرمجين

    ١… سياسة الخصوصية: اي تطبيق يجمع بيانات مستخدمين (مثلا يحتوي تسجيل حساب) يجب ان يحتوي على رابط لعرض سياسة الخصوصية، بحيث توضح كيفية استخدام بيانات المستخدمين المجموعة وهل يتم مشاركتها مع اطراف اخرى ام لا،
    يفضل ان يكون رابط لسياسة الخصوصية في شاشة انشاء الحساب، ورابط اخر في اعدادات التطبيق، مع توضيح طريقة الوصل لها عند رفع التطبيق حتى تتمكن ابل من الوصول لها بسهولة

    ٢… مشاكل شاشة انشاء حساب:
    ممنوع اجبار المستخدم على انشاء حساب او تسجيل الدخول في تطبيق يقدم معلومات عامة
    مثلا: لو كان عندي تطبيق يعرض مواعيد المباريات: هنا ممنوع اجبار المستخدم على تسجيل الدخول قبل استخدام التطبيق، وامام حل من ٢ الاول ان تضيف زر Skip الى شاشة التسجيل و الثاني هو ان يدخل المستخدم للتطبيق مباشرة وعندما يحتاج ان يستخدم احد الخدمات التي تتطلب تسجيل حينها تظهر للمستخدم شاشات التسجيل

    Apple refused to refund £1,100 on accidental App Store purchases -  MacMagazine

    ٣… بيانات تسجيل حساب جديد في التطبيق
    في حالة كان المستخدم مجبر على انشاء حساب في التطبيق، حينها ابل تشدد على البيانات التي يتم جمعها في خانات انشاء حساب
    مثلا: لنفرض تطبيق لحفظ الصور على سيرفر، والتسجيل اجباري هنا لاستخدام التطبيق، ممنوع مثلا طلب تاريخ ميلاد المستخدم، لانها تعتبر معلومة غير ذات علاقة بالخدمة ولا تؤثر على عمل التطبيق

    ٤… عر ض بيانات بدون ارفاق تصريح بذلك
    بعض التطبيقات قد تعرض بث اذاعي لراديو مثلا، او تعرض فيديوهات من اليوتيوب في هذه الحالة يجب ارفاق ورقة موقعة من صاحب البث او صاحب القناة بانه يخولك رفع تطبيق يحتوي فيديوهات من قناته على اليوتيوب

    ٥… عدم اضافة خيار الحظر عندما يكون التطبيق اجتماعي
    انت ملزم باضافة خاصية حظر للمستخدمين اذا كان هناك خيارات اجتماعية داخل التطبيق مثل الشات او اضافة صديق

    ٦… اذا كان التطبيق يحتوي بيانات يضيفها المستخدمين، مثلا تطبيق يعرض اعلانات بيع و شراء منتجات
    يجب بالضرورة التوضيح في خانة الملاحظات عند الرفع ان ادارة التطبيق تراقب المحتوى و تزيل اي بيانات مسيئة من التطبيق
    او الخيار الاخر هو اضافة امكانية الابلاغ عن اعلان مسيء

    وبالنهاية اي خلل في التطبيق او بيانات وهمية مثل test test test يؤدي لرفض التطبيق
    او رفع تطبيق ممنوع من الرفع من حيث الفكرة
    او ادراج قمار داخل التطبيق وهذه لها حالات خاصة بها

  • أنواع الاخطاء البرمجية

    الخطأ هو مصطلح يستخدم لوصف أي مشكلة تنشأ بشكل غير متوقع والتي تتسبب في عدم عمل الكمبيوتراو البرنامج بشكل صحيح. يمكن أن تواجه أجهزة الكمبيوتر او البرامج او المترجمات او الاجهزة الملحقة ولغات البرمجة  أي أخطاء في البرامج أو أخطاء في الأجهزة ومن حيث الخطأ فأن

    هناك ثلاث انواع :

    syntax errors (compile errors)

    نتيجة بحث الصور عن ‪syntax error‬‏

    الاخطاء البرمجية

    هى الاخطاء الناتجة من قيام المبرمج بكتابة قواعد اللغة بطريقة خطأئة .
    ويتم اكتشافها عن طريق المترجم compiler (قبل) تنفيذ البرنامج
    مثل فى بعض اللغات قد ينسيء المبرمج وضع ;
    او يكتب كلمة محجوزة فى اللغة بطريقة خاطئة مثل كتابة نوع البيانات Int بدلا من int

    Runtime errors (Exception errors)

    وهى الاخطاء التى تحدث (اثناء) تنفيذ البرنامج ولايمكن اكتشافها عن طريق المترجم compiler .
    مثل تعريف متغير من النوع int يقوم بااستقبال رقم صحيح من المستخدم الا ان المستخدم يقوم بادخال رقم عشرى بالخطأ .
    وهذة الاخطاء يجب على المبرمج عمل معالجة لها .

    logical errors

    نتيجة بحث الصور عن ‪logical error‬‏

    الاخطاء المنطقية
    وهى الاخطاء التى تحدث (بعد) التنفيذ
    او بمعنى اخر هو خطا فى نتيجة او مخرجات البرنامج .
    يتم اكتشافها بعد التنفيذ عند عمل test للبرنامج
    لايمكن اكتشافها عن طريق المترجم compiler
    مثل حساب perimeter of square بطريقة خطائة

    perimeter of square =length*5;

    بدلا من

    length*4;

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

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر