إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

شرح لل functions و ال dynamic memory allocating

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • شرح لل functions و ال dynamic memory allocating

    كود PHP:
    #include<stdio.h>
    #include<stdlib.h>
    void copy(char *from,char to );
    char *array, *array2;
    main()
    {
    array2=(malloc(20*(sizeof(char))));
    array=(
    malloc(20*(sizeof(char))));
    printf("enter a string to store in array:\n");
    gets(array);
    printf("\nyou posted %s",array);
    printf("\ni will copy it");
    copy(array,array2);
    }
    void copy (char *from char *to)
    {

    array2=array;

    printf("\narray2=%s",array2);

    كود PHP:
    #include<stdio.h>
    #include<stdlib.h>
    void copy(char *from,char to );
    char array[20], array2[20];
    main()
    {


    printf("enter a string to store in array:\n");
    gets(array);
    printf("\nyou posted %s",array);
    printf("\ni will copy it");
    copy(array,array2);
    }
    void copy (char *from char *to)
    {
    int count;
    for(
    count=0;count<20;count++)
    {

    array2[count]=array[count];

    printf("\narray2=%s",array2);

    كود PHP:
    #include<stdio.h>
    #include<stdlib.h> 
    دوال مكتبيه
    وهنا استدعينا stdlib لانها تحتوي علي malloc function prototype
    كود PHP:
    كود PHP:
    void copy(char *from,char to ); 
    تعريف دالة ذات two pointers as a parameter for it
    يعني داله ذات مؤشرين كمدخلات اليها راجع درس الفنكشنس بتاعي
    char *array, *array2;
    مؤشرين من النوع char
    كود PHP:
    كود PHP:
    array2=(malloc(20*(sizeof(char))));
    array=(
    malloc(20*(sizeof(char)))); 
    نتوقف هنا لبعض الوقت
    كيف يتم تخزين عناصر المصفوفات في الذاكره ؟
    ماعلاقة هذا بهذا البرنامج ؟
    العلاقه سهله وواضحه جدا لمن عنده معرفه بالمصفوفات
    اذا كانت المصفوفه من النوع int فان كل عنصر فيها يحتاج 2 byt من الذاكره
    اذن العنصر التالي سوف ياخذ علي سبيل المثال 1002 والثالث 1004 من مواقع الذاكره
    حسناا هذا جيد ولكن ايضا ما علاقة هذا بالبرنامج انت الان قمت بتعريف مؤشر وقد قمت باستخدام maloc يكلي تحصل علي ذاكره فارغه يؤشر اليها هذا المؤشر وهيذ الذاكره قدرها 20 بايت
    لكن هل تضمن ان كل جهاز يتعامل معه هذا البرنامج يكون المتغير char ياخذ فيه i1 بايت فقط؟؟؟
    بالتاكيد لا
    اذن انت تتضربها في قيمة sizeof(char) اذا كان 1 اذن 20 * 1 = 20
    اذا كان علي جهاز اخر 2 يكون 20*2=40 وهكذا
    اذن انت تضع كل حرف في كل اثنين بايت
    ولكن الشائع هو بايت واحد فقط
    وهذه هي صيغة malloc
    كود PHP:
    malloc(size); 
    اذن فان المؤشرات الاثنين يقوما بحجز مكانين في الذاكره قدرهما 20 بايت

    كود PHP:
    printf("enter a string to store in array:\n");
    gets(array); 
    واضحه جدا علي مااظن ولكننا استعمنا gets لان scanf سوف تضع في الذاكره اول كلمه لحد اول مسافه ولكن gets تتجاوز ذلك وسوف اشرح فيما بعد هذه النقطه

    كود PHP:
    printf("\nyou posted %s",array);
    printf("\ni will copy it");
    copy(array,array2); 
    واضحه جدا ايضا ولا تحتاج الي شرح

    كود PHP:
    void copy (char *from char *to)
    {

    array2=array;

    printf("\narray2=%s",array2);

    هنا نحن قمنا بعريف الداله وساتخدامها
    راعي اننا هنا قمنا بتميير مؤشرات الي الداله ك arguments
    array2=array;
    ببساطه شديده تعني
    اجعل المؤشر array2 يساوي اول عنوان في array كيف ؟؟؟؟؟
    ولكن ذلك سوف يجعله يطبع اول حرف فقط في ماادخلت ؟
    لا هذا سوف يفعل الاتي
    ياخذ اول عنوان للذاكره
    ويظل يطبع مافيها الي ان يصادف \0 وهذه هي علامة انتهاء السلسله النصيه او المصفوفه
    فبالتالي سوف تاخذ القيمه المسجله في الذاكره كلها حتي تنتهي
    نفس الشرح في الكود الثاني مع اختلاف

    كود PHP:
    for(count=0;count<20;count++)
    {

    array2[count]=array[count];

    تتسائل الم تقل ان اسم المصفوفه يساوي pointer for the first array's element ؟
    اجل ولكن بدون sup script اي [] وفي هذه الحاله نحن نسند قيم الي المصفوفه الثانيه فبالتالي احتاج الي عدااد كي يقوم بعد عناصر المصفوفوه الاولي ويضعها في المصفوفه الثانيه
    وراي اننا ايضا استخدمنا مؤشرات هنا
    وراعي اننا مررنا اسم المصفوفات بدون supscript الي الداله لانه لايمكن استخدام عناصر المصفوفه كلها ك arguments راجع درس المصفوفات
    ونفس نقطة معرفة النهايه هي هي نفس
    ويظل يطبع مافيها الي ان يصادف \0 وهذه هي علامة انتهاء السلسله النصيه او المصفوفه
    ديت لاثبات ان ال array name with out sup script is a pointer to the first element

    كود PHP:
    #include<stdio.h>
    #include<stdlib.h>
    void copychar *from,char *to);
    int count;
    char array[20],*ptr;
    main ()
    {
    ptr=malloc(20 sizeof(char ));
    puts("Enter A string ");
    gets(array);
    puts("you entred ");
    puts(array);
    puts("i will copy it ");
    copy(array,ptr);

    void copy(char *from char *to )
    {

    ptr=array;
    printf("array2=%s",ptr);

    كل ال انت بتحتاجه عشان تطبع سلسله هو مؤشر الي اول حرف او بدايتها
    طبعا مش محتاج شرح
    الي عايز يسال يسال

    ========================================
    merge two strings
    كود PHP:
    كود PHP:
    #include<stdio.h>
    #include<stdlib.h>
    void mergchar * , char *);
    main()
    {
    char *ptr,*ptr2;
    ptr=malloc(100 sizeof(char));
    ptr2=malloc(100 sizeof(char));
    puts("HI PUT SOME STRING");
    gets(ptr);
    puts("you Entred");
    puts(ptr);
    puts("ENTER Another string");
    gets(ptr2);
    puts("YOU Entred ");
    puts(ptr2);
    merg(ptr,ptr2);
    }
    void mergchar *char *x)
    {
    printf(" Merged string is %s %s",y,x);


    كود PHP:
    #include<stdio.h>
    #include<stdlib.h>
    int compchar * , char *);
    main()
    {
    char *ptr,*ptr2,ch;
    ptr=malloc(100 sizeof(char));
    ptr2=malloc(100 sizeof(char));
    puts("HI PUT SOME STRING");
    gets(ptr);
    puts("you Entred");
    puts(ptr);
    puts("ENTER Another string");
    gets(ptr2);
    puts("YOU Entred ");
    puts(ptr2);
    ch=comp(ptr,ptr2);
    if(
    ch==1)
    {
    printf("strings are compatible");
    }
    else if (
    ch==0)
    {
    printf("strings are'n compatible");
    }
    }
    int compchar *char *x)
    {
    if(*
    == *x)
    {
    return 
    1;

    }
    else
    {
    return 
    0;
    }

    ملاجظه : الكود يقوم بمقارنه اول حرف فقط ولذلك يحتاج تعديل.سوف اعدله لاحقا


    كود PHP:
    i am just gonna explain this part
    if(*== *x)
    {
    return 
    1;

    }
    else
    {
    return 
    0
    واحد يسالني
    هو مش انت قلت قبل كده ان طباعة السلسله بتتم من غير *
    وانك قلت انه لما بيطبعها بياخد اول عنون لحد مايوصل ل 0
    طيب انت ليه استخدمت *
    الموضوع بسيط جدا ياجماعه
    هنا انت مش بتطبع
    انت بتقارن قيمه مسجله
    مش عنوان
    وممكن تتاكد بان تشيل *
    في كلتا الحالتين لو طبعت جمله متطابقه او غير متطابقه حيديك
    strings are'n compatible
    لانك في الحاله ديت بتقارن عنواين ذاكره مش قيمه مسجله داخل عناوين الذاكره
    ملاحظه : انا مش بنقل مواضيعي من SG عشان ازود مشركاتي ولا عشان اتعرف ولا عشان حد يقولي برافو
    كل ما في الامر اني عايز اكسب ولو حسنه باني افيد اي مبتاد زي او اي حاجه
    سلام
    BOOOF , I AM GONE
    Still , you gotta wait for my PRESENT :D
    C programming arabic Tutorial|Programming-fr34ks

  • #2
    بارك الله فيك اخي ستورم ........................ ^_^
    GCS

    تعليق


    • #3
      مجهود متميز ربنا يزيدك ياباشا ..
      Programming-Fr34ks[dot]NET
      Ma Weblog
      ابدأ بتعلم Python | Ruby
      كتاب البايثون متوافر الآن
      لا اتواجد بهذا المنتدى ... للإتصال

      تعليق


      • #4
        السلام عليكم ،،
        مشكور اخي St0rM-MaN على المشاركة ،،
        ولي بعض الافكار اود طرحها،، (مسوي فاهم )

        ===========
        الدالة :
        كود:
        void copy (char *from , char *to) 
        { 
        
        array2=array; 
        
        printf("\narray2=%s",array2); 
        }
        لم تستخدم فيها الوسائط ،، وانما استخدمت المؤشرات array ، array2 وهما global

        تعديل بسيط:
        كود PHP:

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

        void copy(char *from,char to ); 

        main() 

        [
        COLOR="Red"]char *array, *array2; [/COLOR]
        array2=(malloc(20*(sizeof(char)))); 
        array=(
        malloc(20*(sizeof(char)))); 
        printf("enter a string to store in array:\n"); 
        gets(array); 
        printf("\nyou posted %s",array); 
        printf("\ni will copy it"); 
        copy(array,array2); 

        void copy (char *from char *to


        [
        COLOR="red"]to=from ; [/COLOR]

        printf("\narray2=%s",to); 


        ثانيا : طريقة النسخ ،، غير فعالة
        فعند العودة الي الدالة main وطلبنا عرض السلسة داخل array2 ،، فان القيمة التي تظهر هي الاولى (وهنا سوف تكون اي قيمة تصادف في الذاكرة)،، هل تتذكرون الدالة swap !!
        عندما نمرر كقيمة وكمؤشر ،، هنا نفس الحالة

        التعديل :
        يوجد حلان :
        *pointer to pointer
        * reference to pointer

        الحل الاول للغة السي ،، والحلين للغة c++ وذلك لدعمها لل reference

        الحل الاول:

        كود:
        #include<stdio.h> 
        #include<stdlib.h> 
        void copy(char **from,char ** to ); 
        
        main() 
        { 
        char *array, *array2; 
        array2=(malloc(20*(sizeof(char)))); 
        array=(malloc(20*(sizeof(char)))); 
        printf("enter a string to store in array:\n"); 
        gets(array); 
        printf("\nyou posted %s",array); 
        printf("\ni will copy it"); 
        copy(&array,&array2); 
        [B][COLOR="Red"]printf("\narray2=%s",array2); [/COLOR][/B]
        } 
        [COLOR="Green"]void copy (char **from , char **to) 
        { 
        
        to=*from *; 
        
        }[/COLOR]



        والثاني :: للغة سي ++

        كود:
        #include<stdio.h> 
        #include<stdlib.h> 
        void copy(char *&from,char *& to ); 
        
        main() 
        { 
        char *array, *array2; 
        array2=(malloc(20*(sizeof(char)))); 
        array=(malloc(20*(sizeof(char)))); 
        printf("enter a string to store in array:\n"); 
        gets(array); 
        printf("\nyou posted %s",array); 
        printf("\ni will copy it"); 
        copy(array,array2); 
        [B][COLOR="Red"]printf("\narray2=%s",array2); [/COLOR][/B]
        } 
        [COLOR="Green"]void copy (char *&from , char *&to) 
        { 
        
        to=from ; 
        
        }[/COLOR]
        تحياتي للجميع ،، وما شاء الله عليكم نشيطين جدا ،، وعقبال ما اصير مثلكم .

        تعليق


        • #5
          تسلم ياSudaNix
          بس انا مش فهمت قصدك ب
          "
          ثانيا : طريقة النسخ ،، غير فعالة
          فعند العودة الي الدالة main وطلبنا عرض السلسة داخل array2 ،، فان القيمة التي تظهر هي الاولى"
          ياريت توضح
          BOOOF , I AM GONE
          Still , you gotta wait for my PRESENT :D
          C programming arabic Tutorial|Programming-fr34ks

          تعليق


          • #6
            كود:
            #include<stdio.h> 
            #include<stdlib.h> 
            void copy(char *from,char * to ); 
            
            main() 
            { 
            char *array, *array2; 
            array2=(malloc(20*(sizeof(char)))); 
            array=(malloc(20*(sizeof(char)))); 
            printf("enter a string to store in array:\n"); 
            gets(array); 
            printf("\nyou posted %s",array); 
            printf("\ni will copy it"); 
            copy(array,array2); 
            [COLOR="Red"]printf("\narray2=%s",array2); 
            المشاركة الأصلية بواسطة St0rM-MaN مشاهدة المشاركة
            تسلم ياSudaNix بس انا مش فهمت قصدك ب " ثانيا : طريقة النسخ ،، غير فعالة فعند العودة الي الدالة main وطلبنا عرض السلسة داخل array2 ،، فان القيمة التي تظهر هي الاولى" ياريت توضح
            السلام عليكم ،، اعتذر عن التأخيــــــــــر لم اقصد بانها لا تعمل ،، هي تعمل بشكل رائع ،، الا في حالة واحدة فقط وهي عند حذف السطر التالي من الدالة copy
            كود:
            printf("\narray2=%s",array2);
            ووضعه داخل الدالة main . لكي يتضح لك ما افول جرب هذه البرامج :
            } void copy (char *from , char *to) { to=from ; }
            لاحظ السطر الاحمر . ودعنا نتتبع هذا البرنامج من
            كود:
            copy(array,array2);
            :
            قمنا هنا بتمرير الموشرين array , array2 الى الدالة copy

            نذهب الى الدالة copy :
            كود:
            void copy (char *from , char *to) 
            { 
            to=from ; 
            }
            لديها مؤشرين from , to وهما مؤشرات محلية local
            اي لن نستطيع استخدامهم خارج الدالة copy
            وطبعا سوف يحمل from عنوان array (اي سيصبح مؤشر الى نفس النص)
            وكذلك to سوف يؤشر الى نفس النص الذي يشير اليه array2

            داخل الدالة ،،
            تم تعيين قيمة from الى to
            اي ان الناتج هو ان يصبح to مؤشر الى نفس النص الذي يشير اليه from

            الى هنا كل شيء تماااااااام ،، ولو قمنا بعمل printf لل to لوجدنا ان النسخ تم بشكل صحيح
            ولكن عندما تنتهي الدالة copy ونرجع الى الدالة main ،، وقمنا بعمل printf لل array2 فاننا لن نجد المطلوب .

            لماذا !! اتركه لكم .:clown:



            ======================
            التعديل للغة سي ++ :

            كود:
            #include<stdio.h> 
            #include<stdlib.h> 
            void copy(char *&from,char *& to ); 
            
            main() 
            { 
            char *array, *array2; 
            array2=(malloc(20*(sizeof(char)))); 
            array=(malloc(20*(sizeof(char)))); 
            printf("enter a string to store in array:\n"); 
            gets(array); 
            printf("\nyou posted %s",array); 
            printf("\ni will copy it"); 
            copy(array,array2); 
            printf("\narray2=%s",array2); 
            } 
            void copy (char *&from , char *&to) 
            { 
            
            to=from ; 
            
            }
            تحياتي لك اخي strom
            واعذرني على استخدام لغة سيئة للشرح ،،
            واذا لم تفهم شيء مما ذكرت ،، علمني حتى اقوم بكتابة درس مفصل لهذا الامر .[/COLOR]

            تعليق


            • #7
              كويس ان في ناس جميله زيك بتحب تناقش
              بس انت برنامكك مختلف عن برنامجي
              كود:
              main() 
              { 
              char *array, *array2;
              هنا ال مؤشرات local
              عندي انا global يعني اي تاثير في اي داله بياثر في قيمتهم
              كود PHP:
              void copy(char *from,char to );
              char *array, *array2
              ملاحظ ان التعريف قبل main
              كلامك 100/100 في حالة لو ان انا معرفهم داخل main زيك
              كتر الف خيرك ياباشا علي النقاش
              لغه سيئه مين ياعم امال انا ابقي ايه
              جرب بنفسك
              كود PHP:
              #include<stdio.h>
              #include<stdlib.h>
              void copy(char *from,char to );
              char *array, *array2;
              main()
              {
              array2=(malloc(20*(sizeof(char))));
              array=(
              malloc(20*(sizeof(char))));
              printf("enter a string to store in array:\n");
              gets(array);
              printf("\nyou posted %s",array);
              printf("\ni will copy it");
              copy(array,array2);
              printf("\narray2=%s",array2);
              }
              void copy (char *from char *to)
              {

              array2=array;



              BOOOF , I AM GONE
              Still , you gotta wait for my PRESENT :D
              C programming arabic Tutorial|Programming-fr34ks

              تعليق


              • #8
                اهلااااا بيك مجددا :clown:

                برنامجك يعمل 100% ولكن فيه ملاحظة بسيطة
                وهي ان الدالة copy لن تعمل الا اذا عرفنا array ,arra2 كمؤشرات global

                طيب السؤال الان ؟؟ ما الفائدة من الوسائط ؟؟
                في الحقيقة لا شيء !!
                لانك لم تستخدمها .:angry_red:

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

                يعني هذه الدالة :

                كود:
                void copy (char *&from , char *&to) 
                { 
                
                to=from ; 
                
                }
                تقول لمبرمجنا ،، اديني اي مؤشرين وانا تحت الخدمة يا افندم

                وشكرا لك على تحمل القنابل الموجهة اليك..
                وان شاء الله نشوف اسلحتك جاهزة عندما ابدأ بالكتابة :joker:

                والى القــــــــــــــــــــاء

                تعليق


                • #9
                  اووووووو معليش يا جماعة
                  لا تستخدموا دالتي !!

                  فهي تتسبب في تسرب للذاكرة memory leak
                  السبب؟؟

                  عندنا array مؤشر لنص ،، وليكن storm
                  وarray2 مؤشر لنص اخر وليكن man

                  عند استدعاء دالتي ،، سيحصل الاتي:
                  array , array2 سيؤشران لنفس النص storm

                  طيب والذاكرة المحجوزة واللي عليها الكلمة man ،، ماذا سيحصل معها ؟
                  الاجابة : لن نستطيع الوصول اليها ،، لان المؤشر الذي يشير اليها ، اصبح يشير الى شيء اخر

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

                  ونفس الحال بالنسبة لدالتك يا خي


                  لذا يجب التفكير في حل اخر.اممممممممممممم ، وبعد تفكير
                  الحل : النسخ حرف بحرف ،، وليس عن طريق تغير المؤشرات ..

                  طبعا يجب التأكد من ان النص الاول اقل من الثاني ،، والا سنقع في ال buffer over flows

                  سأكتب اكوادا عن ذلك ان توفر الوقت !!

                  اي افكار اخرى ؟؟ تصحيحات ؟؟ تنمى مشاركتها حتى تعم الفائدة
                  تحياتي ..

                  تعليق


                  • #10
                    جرب هذا الكود الضعيف
                    لن ينسخ اذا كان ال source اكبر من ال destination

                    كود:
                    bool copy(char x[],char y[])
                    {
                    
                    	int yLen=strlen(y);
                    	int xLen=strlen(x);
                    
                    	if(yLen > xLen) return false;
                    
                    	for(int i=0;i<yLen;i++)
                    		x[i]=y[i];
                    
                    	x[i]='\0';
                    
                    	return true;
                    }
                    اذا ما اشتغل انا مش مسؤووووووووووووووول

                    تحياتي

                    تعليق


                    • #11
                      SudaNix
                      وحش كاسر
                      راجعلك تاني ولسوف تري الاعصار الحقيقي
                      BOOOF , I AM GONE
                      Still , you gotta wait for my PRESENT :D
                      C programming arabic Tutorial|Programming-fr34ks

                      تعليق


                      • #12
                        اتمني انك مش تفهمني غلط
                        طيب السؤال الان ؟؟ ما الفائدة من الوسائط ؟؟
                        صدقتني انا مش بفهم عربي علي قد الانجليزي
                        ياريت تقولي قصدك ايه بالوسائط لو قصدك بيها ال reference ياريت تقولي
                        تقول لمبرمجنا ،، اديني اي مؤشرين وانا تحت الخدمة يا افندم
                        كلامك سليم طب وانا ليه مش اعمل
                        free(ptr);
                        واخلص من مشكلة تسرب الذاكره قبل ماضيفله اي حاجه
                        الحل : النسخ حرف بحرف ،، وليس عن طريق تغير المؤشرات ..
                        طبعا يجب التأكد من ان النص الاول اقل من الثاني ،، والا سنقع في ال buffer over flows
                        كويس قوي انك جبت السيره ديت
                        ساعتها انت ممكن تستخدم strncpy الي بتنسخ عدد معين وتحط للباقي NULL
                        كود PHP:
                         strncpy(array,array2strlen(array)) 
                        كده خلصنا منها
                        لن ينسخ اذا كان ال source اكبر من ال destination
                        ليه انا بسال سؤال هو مش لو كان ال '\0' محطوط في اخر ال array خلصت كده والباقي نفايه ؟
                        سؤال بجد انا مش فاهمه
                        وبعد التحليل
                        ادي الداله
                        كود:
                        void copy(char *x,char *y)
                        {
                        free(y);
                        strncpy(x,y,strlen(x);
                        {
                        وكمان ممكن
                        كود:
                        void copy(char x[],char y[])
                        {
                        int a;
                        int z;
                        int f;
                        a=strlen(x);
                        for(z=0;z<a;z++)
                        {
                        y[z]=x[z];
                        {
                        y[z+1]='\0';
                        {
                        وادي برنامج
                        ياريت لو عندك اي حاجه تانيه عن ال buffer over flows تقولي
                        كود PHP:
                        #include<stdio.h>
                        #include<string.h>
                        void copy(char f[],char z[]);
                        main()
                        {
                        char x [20];
                        char y [20];
                        gets(x);
                        printf("\nx=%s",x);
                        copy(x,y);
                        printf("\ny=%s",y);
                        }
                        void copy(char f[] , char z[])
                        {
                             
                        int g,a;
                             
                        g=strlen(f);
                             for(
                        a=0;a<g;a++)
                             {
                             
                        z[a]=f[a];
                             }
                             
                        z[a]='\0';
                             } 
                        اخر طلب
                        يااااااااااااارييييييييييييييييييت
                        تستمر في توجيه تلك الاسلحه الفتاكه في وجههي
                        يشرفني اني بتكلم مع شخص مثلك
                        تحياتي ياباااااااااااااشا
                        BOOOF , I AM GONE
                        Still , you gotta wait for my PRESENT :D
                        C programming arabic Tutorial|Programming-fr34ks

                        تعليق


                        • #13
                          اهلا وسهلا..
                          شرف الله قدرك يا باشا

                          الوسائط:
                          اقصد بالوسائط ال parameters او arguments وهي المتغيرات التي تمرر الى الدالة
                          وما عارف لها معنى بالعربي غير هذا .

                          كلامك سليم طب وانا ليه مش اعمل
                          كود:
                          free(ptr);
                          واخلص من مشكلة تسرب الذاكره قبل ماضيفله اي حاجه
                          ممكن ،، ولكن ليس في كل الحالات .
                          راح ندخل في متاهات كثيرة . قد ندرس بعض الحالات ،، ان توفر الوقت :angry_red:

                          ساعتها انت ممكن تستخدم strncpy الي بتنسخ عدد معين وتحط للباقي NULL
                          اذا اردت استخدام دالة جاهزة (وهو الافضل ،، لانها مجربه 100%) كان من الاول تسنخدمها
                          وتريح بالك

                          يعني البرنامج يصبح كذا:

                          كود:
                          #include<stdio.h>
                          #include<stdlib.h>
                          #include<string.h>
                          
                          void copy(char *from,char * to );
                          char *array, *array2;
                          main()
                          {
                          array2=(malloc(20*(sizeof(char))));
                          array=(malloc(20*(sizeof(char))));
                          printf("enter a string to store in array:\n");
                          gets(array);
                          printf("\nyou posted %s",array);
                          printf("\ni will copy it");
                          strcpy(array2,array);
                          printf("\narray2=%s",array2);
                          }


                          ليه انا بسال سؤال هو مش لو كان ال '\0' محطوط في اخر ال array خلصت كده والباقي نفايه ؟
                          سؤال بجد انا مش فاهمه
                          طيب ،، لازم نتكلم شوية عن السلاسل النصية strings
                          يوجد طريقتين لعمل سلسلة:
                          الاولى : عن طريق المصفوفات :
                          كود:
                          char str[10];
                          والثانية : عن طريق المؤشرات :
                          كود:
                          char *ptr;

                          طيب في الطريقة الاولى ،، لازم تكون المصفوفة معروفة الحجم (الحجم ثابت ، لن يتغير اثناء
                          عمل البرنامج) وهو احد العيوب :shocking:
                          ويمكن الاعلان عن المصفوفة ،، واعطائها قيم ابتدائية initialize كالاتي:

                          كود:
                          char str[]={'a','h','m','a','d','\0'};
                          او
                          كود:
                          char str[]="ahmad";
                          لاحظ ان الاولى تحتاج الى رمز الانهاء
                          كود:
                           '\0'
                          بينما الثانية ، لا تحتاج ،، لان المترجم يعمل على اضافتها "توماتيكي"


                          اما الطريقة الثانية : بالمؤشرات فهي الافضل ،، ولكن تحتاج الى تركيز اثناء العمل

                          كود:
                          char *ptr;
                          هنا اعلنا عن مؤشر لنص ،، ويجب القول بأن احد الاخطاء الشائعة هو استخدام هذا المؤشر بدون حجز ذاكرة ،، شوف المثال:

                          كود:
                          char *ptr;
                          gets(ptr);

                          يعني يجب حجز الذاكرة اولا ،، ومن ثم استخدام المؤشر كالاتي:

                          كود:
                          char *ptr=(char*)malloc(sizeof(char)*10);
                          gets(ptr);
                          طيب قد تتسائل لماذا لا يوجد
                          كود:
                           '\0'
                          ؟؟
                          الاجابة : لان دوال الادخال تتكفل بهذا .

                          سؤال اخر : ما همية
                          كود:
                           '\0'
                          ؟؟
                          الاجابة : بدون هذا الرمز والذي يدل على نهاية السلسة ،، قد تحدث كارثة :angry_red:
                          وذلك لان معظم الدوال التي تتعامل مع السلاسل ،، تستمر في عملياتها حتى الوصول الى هذا الرمز .
                          مثل الدالة puts() ،، فاذا لم تجد هذه الدالة هذا الرمز فانها تستمر في الطباعة حتى تصل اليه
                          ربما تجده ،، وربما لا :twister2: لذلك قد تظهر احرف غريبة على الشاشة $^@ * `
                          وهي عبارة قد قيم موجودة في الذاكرة لم تستبدل .
                          ففي الذاكرة لا يوجد سيء اسمه حذف ؟؟ كيف ؟؟ نفرض ان لدينا مؤشر لعدد ما وليكن 3
                          وقمنا بحذف المؤشر ،، طبعا الذاكرة ستتحرر free ،، ولكن هل القيمة ستحذف ؟؟ الاجابة لا
                          ستظل القيمة في الذاكرة ،، الى ان تجحز الذاكرة وتعين فيها قيمة اخرى.

                          وفي الحقيقة ،، لم افهم ماذا تقصد بهذا السؤال ، فأجبت بشكل عام.


                          كود:
                          void copy(char *x,char *y)
                          {
                          free(y);
                          strncpy(x,y,strlen(x);
                          {
                          جيد جدا ،، ولكن لم تحجز مساحة للمؤشر y ،، كارثة !!



                          كود:
                          [QUOTE]void copy(char x[],char y[])
                          {
                          int a;
                          int z;
                          int f;
                          a=strlen(x);
                          for(z=0;z<a;z++)
                          {
                          y[z]=x[z];
                          {
                          y[z+1]='\0';
                          {[/QUOTE]
                          رائع ،، ولكن فيه مشكلتين؟؟
                          اذا كان x يشير الى ahmad و y يشير الى ed مثلا
                          فان النسخ لا يصح.
                          يعني بالعربي ، كيف اصب جالون ماء في كاس صغير ؟؟ اكيد سينسكب صحيح،وكذلك الحال هنا سينسكب باقي الاحرف الى الذاكرة ويسبب لنا مشكلة ال BOF

                          المشكلة الثانية لماذا
                          كود:
                          y[z+1]='\0';
                          عند الخروج من ال loop فان z تكون قد ازدادت بمقدار واحد ، وهذا هو سبب الخروج
                          لذلك لاحاجة لل z+1 ،، فقط z .


                          كود:
                          [QUOTE]#include<stdio.h>
                          #include<string.h>
                          void copy(char f[],char z[]);
                          main()
                          {
                          char x [20];
                          char y [20];
                          gets(x);
                          printf("\nx=%s",x);
                          copy(x,y);
                          printf("\ny=%s",y);
                          }
                          void copy(char f[] , char z[])
                          {
                               int g,a;
                               g=strlen(f);
                               for(a=0;a<g;a++)
                               {
                               z[a]=f[a];
                               }
                               z[a]='\0';
                               }[/QUOTE]

                          هذا هو الحل الصحيح. :thumpsup_green:


                          اي اسئلة اخرى ؟؟ تعديلات ؟؟
                          ولا شكر على واجب ،،
                          اخوك :احمد
                          الى اللقـــــــــــــــــاء.

                          تعليق


                          • #14
                            Buffer overflow
                            اولا ال buffer هي مساحة تخزين مؤقتة .
                            و Buffer overflow هو عبارة عن خطأ برمجي ،، سببه تدفق البيانات من الى الذاكرة ،
                            ويؤدي الى مشاكل كثيرة ،، وينهي البرنامج .

                            طبعا لست خبيرا باستغلال واكتشاف هذا الخطأ ،، بالرغم من انه بسيط نوعا ما :shocking:

                            ويحدث غالبا عند نسخ string ل string اخر.
                            لذلك قد وضعت الشرط التالي عند كتابة الدالة copy :

                            كود:
                            bool copy(char x[],char y[])
                            {
                            
                            	int yLen=strlen(y);
                            	int xLen=strlen(x);
                            
                            	[COLOR="Red"][B]if(yLen > xLen) return false;
                            [/B][/COLOR]
                            
                            	for(int i=0;i<yLen;i++)
                            		x[i]=y[i];
                            
                            	x[i]='\0';
                            
                            	return true;
                            }
                            ويوجد عدة حلول لمنع هذا الخطأ مثل اختيار لغة امنه ، وكذلك مكتبات ودوال ... الخ
                            ولكن الحل الوحيد (كما ارى) هو في المبرمج نفسه ،، وذلك بكتابة كود جيد.

                            وشكرا ..

                            تعليق


                            • #15
                              باشا والله من يومك
                              انا بقري ال faqs دلوقتي عشان طلع في مشاكل في الدوال ال stander هههههههههه
                              BOOOF , I AM GONE
                              Still , you gotta wait for my PRESENT :D
                              C programming arabic Tutorial|Programming-fr34ks

                              تعليق

                              يعمل...
                              X