الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية استخدام pointeur في structure

بدأه مومو (momo) في 15 مايو 2012 · 6 رد · 907 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته

السؤال هو كيفية استخدام Pointers to Structures ؟

الكود:

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

typedef struct Coordonnees  Coordonnees;
typedef struct personne personne;


struct Coordonnees
{

   int x; // Abscisses
   int y; // Ordonnées
};


struct personne
{

    char *nom;
    char *prenom ;
    struct Coordonnees *p[2];

};


int main()
{


 Coordonnees momo;
 personne karim;

momo.x=5;
momo.y=10;

karim.p[0]=&momo;

printf("%d\n\n",*(karim.p[0]));
printf("%d",*((karim.p[0])+1));

    return 0;
}

فتخرج النتيجة على هذا النحو

5


2147307520

عوض أن تكون هكذا

5


10

لماذا لم أحصل على النتيجة بشكل صحيح ؟؟؟

دون استخدام هذه الطريقة ؟؟

karim.p[0]=&momo.x;
karim.p[1]=&momo.y;

printf("%d\n\n",*(karim.p[0]));
printf("%d\n\n",*(karim.p[1]));

i love you mama

#2

الكود المكتوب بأخر المشاركه السابقه خاطئ حيث انك تقوم بوضع قيمه من نوع int داخل متغير من نوع *Coordonnees

فى الكود الأول: كود الطباعه الأول الذى استخدمته غير دقيق و الثاني غير صحيح، لماذا كل العناء و يمكنك استخدام طريقه اسهل:

printf("%d\n\n", karim.p[0]->x);
printf("%d\n\n", karim.p[0]->y);

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة Μωάμεθ αλάά في 15 مايو 2012 في 01:28

2

مدونتي: C++ Tips and Tricks

#3
Μωάμεθ αλάά كتب:

الكود المكتوب بأخر المشاركه السابقه خاطئ حيث انك تقوم بوضع قيمه من نوع int داخل متغير من نوع *Coordonnees

فى الكود الأول: كود الطباعه الأول الذى استخدمته غير دقيق و الثاني غير صحيح، لماذا كل العناء و يمكنك استخدام طريقه اسهل:

printf("%d\n\n", karim.p[0]->x);
printf("%d\n\n", karim.p[0]->y);

و الله ولي التوفيق

ما شاء الله عليك

لم أفكر بهذه الطريقة الممتازة

أفدتني كثيرا

2

i love you mama

#4

هناك حل آخر

struct personne
{

    char *nom;
    char *prenom ;
    int *p[2];

};

ولكي لا يحدث خطأ اجعل

karim.p[0]=(int*)&momo;

تم تعديل هذه المشاركة بواسطة nadir02 في 15 يونيو 2012 في 11:12

1
#5
nadir02 كتب:

ولكي لا يحدث خطأ اجعل

karim.p[0]=(int*)&momo;

بالعكس تماما يحدث خطأ وبإمكانك التأكد بنفسك

//warning:assignment from incompatible pointer type

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

karim.p[0]=(Coordonnees*)&momo;

شكرا لك أخي ناذر على مشاركتنا أفكارك

تم تعديل هذه المشاركة بواسطة مومو (momo) في 23 يونيو 2012 في 16:31

1

i love you mama

#6

الطريقة الصحيحة


char str1[100];
sprintf(str1,"%d\n",(int)*((BYTE*)karim.p[0] + 4));
MessageBox(0,str1,"MSG",0);

يجب أن تحول المؤشر karim.p[0] إلى مؤشر من من نوع BYTE أصغر نوع بيانات

ثم تتحرك بمقدار 4bytes حجم الـ int لنتخطى العنصر x و تكون على أول byte من

العنصر y ثم نحول الـمؤشر إلى Int و نقوم بطباعته

ما الفرق بين الطريقة الأولى و التي قمت بها و بين الطريقة السابقة

الطريقة الأولى و هي



sprintf(str1,"%d\n",*((karim.p[0])+1));
MessageBox(0,str1,"MSG",0);

عند ما تضيف لمؤشر البنية Coordonnees الرقم واحد فأنت تتحرك بمقدار حجم

يعادل حجم البنية كاملا و الذي يساوي حجم int + int يساوي 8bytes و بذلك

أنت تخطيت العنصرين x و y و أصبحت خارج نطاق المؤشر

العملية + على المؤشرات مرتبطة ببنية المؤشر كل واحد يضاف للمؤشر يؤدي لتحرك

على المؤشر بحجم يعادل حجم بنيته بمعنى العدد المضاف في العملية + مضروب

في حجم بنية المؤشر و عندما نستخدم البنية أو نوع البيانات BYTE فنحن قياسا

على ذلك نظرب الرقم المضاف عبر عملية + في حجم نوع البيانات BYTE و الذي

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

نحول مؤشر البنية لمؤشر من نوع BYTE ثم نجري العملية + ... في رعاية الله .

تم تعديل هذه المشاركة بواسطة Wolf_Oman في 25 يونيو 2012 في 07:45

Wolf_Oman

صرح السماء

wolf9228

ناقوس الخطر

#7

و هذه طريقة أخرى


char str1[100];
sprintf(str1,"%d\n",*((int*)karim.p[0] + 1));
MessageBox(0,str1,"MSG",0);

حولنا المؤشر karim.p[0] لمؤشر من نوع Int ثم أضفنا واحد واحد

مضروب في حجم int و الذي هو 4 يصبح الناتج 4 عكس العملية السابقة

و بذلك تحركنا بمقدار 4bytes و تخطينا العنصر x لنكون على أول byte من

العنصر y

و هذه بطريقة أخرى


sprintf(str1,"%d\n",(int)*((short*)karim.p[0] + 2));
MessageBox(0,str1,"MSG",0);
char str1[100];

حولنا المؤشر karim.p[0] لمؤشر من نوع short ثم أضفنا إثنين إثنين

مضروب في حجم short و الذي هو 2 يصبح الناتج 4 تحركنا بمقدار 4bytes

و تخطينا العنصر x لنكون على أول byte من العنصر y ثم حولنا المؤشر إلى Int

شكرا

تم تعديل هذه المشاركة بواسطة Wolf_Oman في 25 يونيو 2012 في 08:23

Wolf_Oman

صرح السماء

wolf9228

ناقوس الخطر

مواضيع مشابهة