سؤال

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

ومع ذلك، لا أستطيع أن أفهم هذا

*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?

و

*ports = (struct port_t*) calloc(2, sizeof(*ports)); 

يبدو أنني أقوم بتخصيص مؤشر واحد يشير إلى كائنين منفذين مخصصين في المتجر المجاني؟

لا أستطيع أن أفهم لماذا أستخدم عامل النقطة مع عامل السهم؟المنافذ[0]->port_id = 20;برينتف("port_id:%d "، المنافذ[0]->port_id);

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

#define MAX_PORTS 10

struct port_t
{
    int port_id;
    char name;
} *ports[MAX_PORTS];

int main(void)
{
    *ports = (struct port_t*) calloc(2, sizeof(*ports));

    ports[0]->port_id = 20;

    printf("port_id: %d\n", ports[0]->port_id);

    return 0;
}

عادة، ما قمت به في الماضي هو هذا:

struct port_t
{
    int port_id;
    char name;
} *ports;

ports = (struct port_t*) calloc(2, sizeof(*ports));

ثم قم بتعيين أي مما يلي أدناه.ومع ذلك، فقد أعلن المبرمج السابق كل شيء كما عرضته في الأعلى لذا لا أستطيع تغيير أي شيء.

ports[0].port_id = 10;
ports->port_id = 10;

مع جزيل الشكر لاية مقترحات،

هل كانت مفيدة؟

المحلول

*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?

نعم، كنت صنع مجموعة من عشرة مؤشرات

*ports = (struct port_t*) calloc(2, sizeof(*ports));

و... ولكن هذا الخط هو هراء. انها نفس هذا:

ports[0] = (struct port_t*) calloc(2, sizeof(port_t));

وأي. كنت وضع المؤشر الأول للإشارة إلى الذاكرة ما يكفي لاثنين من الموانئ.

لشيء من هذا القبيل صغير من شأنه أن يجعل أكثر بكثير معنى لجعل عشرة موانئ ولكن لم تستخدمها كل شيء:

#define MAX_PORTS 10

struct port_t
{
    int port_id;
    char name;
} ports[MAX_PORTS];

/* number of ports in use */
int numPorts = 0;

int main(void)
{
    numPorts = 3;
    for (int i=0; i<numPorts; i++) {
     ports[i].port_id = i;
     printf("port_id %d: %d\n", i, ports[i].port_id);
    }
    return 0;
}

نصائح أخرى

تحتوي كتلة التعليمات البرمجية الأولى الخاصة بك على

struct port_t
{
    int port_id;
    char name;
} *ports[MAX_PORTS];

وهي عبارة عن مجموعة من المؤشرات.وهذا يعني لاحقًا عند الاستخدام

ports[0]->port_id

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

أعتقد أن نواياك هي أكثر على غرار:

struct port_t
{
    int port_id;
    char name;
} *ports;

int main(void)
{
    *ports = (struct port_t*) calloc(2, sizeof(*ports));

    ports[0].port_id = 20;

    printf("port_id: %d\n", ports[0].port_id);

    return 0;
}

نظرًا لأنك تستخدم C99، فيمكنك تجنب calloc()/malloc()، إذا كنت تريد حقا أن باستخدام تعريف المصفوفة المتغيرة لـ C99.

port_t array_on_mains_stack[some_runtime_port_count];
ports = array_on_mains_stack;

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

والموانئ هي ومجموعة من المؤشرات إلى port_t الأشياء، وذلك عن طريق القيام الموانئ [0] تحصل على المؤشر، وليس كائن، وتحتاج إلى الوصول إليه مع ->

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

هنا الصورة رابط تستحق القراءة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top