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

مجتمع لينوكس المصري

موش هتقدر تطفي الكمبيوتر
 
الرئيسيةالبوابةأحدث الصورالتسجيلدخول

 

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

اذهب الى الأسفل 
كاتب الموضوعرسالة
taaz30




المساهمات : 114
تاريخ التسجيل : 28/11/2008

[شرح] شرح لل functions و ال dynamic memory allocating Empty
مُساهمةموضوع: [شرح] شرح لل functions و ال dynamic memory allocating   [شرح] شرح لل functions و ال dynamic memory allocating Icon_minitimeالأحد ديسمبر 28, 2008 3:45 am



اقتباس :
#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);
}

#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);
}

#include<stdio.h>
اقتباس :

#include<stdlib.h>
دوال مكتبيه
وهنا استدعينا stdlib لانها تحتوي علي malloc function prototype
كود PHP:

اقتباس :
void copy(char *from,char * to );
تعريف دالة ذات two pointers as a parameter for it
يعني داله ذات مؤشرين كمدخلات اليها راجع درس الفنكشنس بتاعي
char *array, *array2;
مؤشرين من النوع char
كود 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
اقتباس :
malloc(size);
اذن فان المؤشرات الاثنين يقوما بحجز مكانين في الذاكره قدرهما 20 بايت

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

اقتباس :
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);
}
هنا نحن قمنا بعريف الداله وساتخدامها
راعي اننا هنا قمنا بتميير مؤشرات الي الداله ك arguments
array2=array;
ببساطه شديده تعني
اجعل المؤشر array2 يساوي اول عنوان في array كيف ؟؟؟؟؟
ولكن ذلك سوف يجعله يطبع اول حرف فقط في ماادخلت ؟
لا هذا سوف يفعل الاتي
ياخذ اول عنوان للذاكره
ويظل يطبع مافيها الي ان يصادف \0 وهذه هي علامة انتهاء السلسله النصيه او المصفوفه
فبالتالي سوف تاخذ القيمه المسجله في الذاكره كلها حتي تنتهي
نفس الشرح في الكود الثاني مع اختلاف

اقتباس :
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

اقتباس :
#include<stdio.h>
#include<stdlib.h>
void copy( char *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:
اقتباس :
#include<stdio.h>
#include<stdlib.h>
void merg( char * , 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 merg( char *y , char *x)
{
printf(" Merged string is %s %s",y,x);

}
اقتباس :
#include<stdio.h>
#include<stdlib.h>
int comp( char * , 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 comp( char *y , char *x)
{
if(*y == *x)
{
return 1;

}
else
{
return 0;
}
}
ملاجظه : الكود يقوم بمقارنه اول حرف فقط ولذلك يحتاج تعديل.سوف اعدله لاحقا


اقتباس :
i am just gonna explain this part
if(*y == *x)
{
return 1;

}
else
{
return 0;
واحد يسالني
هو مش انت قلت قبل كده ان طباعة السلسله بتتم من غير *
وانك قلت انه لما بيطبعها بياخد اول عنون لحد مايوصل ل 0
طيب انت ليه استخدمت *
الموضوع بسيط جدا ياجماعه
هنا انت مش بتطبع
انت بتقارن قيمه مسجله
مش عنوان
وممكن تتاكد بان تشيل *
في كلتا الحالتين لو طبعت جمله متطابقه او غير متطابقه حيديك
strings are'n compatible
لانك في الحاله ديت بتقارن عنواين ذاكره مش قيمه مسجله داخل عناوين الذاكره
ملاحظه : انا مش بنقل مواضيعي من SG عشان ازود مشركاتي ولا عشان اتعرف ولا عشان حد يقولي برافو
كل ما في الامر اني عايز اكسب ولو حسنه باني افيد اي مبتدىء زي او اي حاجه
سلام
الرجوع الى أعلى الصفحة اذهب الى الأسفل
 
[شرح] شرح لل functions و ال dynamic memory allocating
الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
مجتمع لينوكس المصري :: الأقسام التطويرية (البرمجية) في بيئة GNU/Linux :: .: المقالات والدورات البرمجية :.-
انتقل الى: