سؤال

تحية موسمية! لديّ وظيفة تطبع محتويات char ** التي يتم استخدامها كصفيف لتخزين عدد من الأوتار. تم إعلان مثل هذا:

char** commandArray = (char**)malloc(historySize);

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

    /* prints the contents of the history buffer */
void printHistory(char*** historyBuff)
{
    /* a counter for the loop */
    int loopIdx = 0;

    for (loopIdx = 0; loopIdx < historySize; loopIdx++)
    {
        /* print the current history item */
        printf ("\nhistoryBuff[%i] = %s\n", loopIdx, *historyBuff[loopIdx]);
        fflush(stdout);
    }
}

أنا أمرر char ** إلى وظيفة مثل هذه:

printHistory (&commandArray);

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

شكرا لك مقدما على أي وجميع المساعدة أو الاقتراحات!

-بن

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

المحلول

  1. لجعل التعليمات البرمجية الخاصة بك تعمل كما هو ، يجب أن تكون dereference مثل هذا:

    (*historyBuff)[loopIdx]

    الطريقة التي كتبت بها أشياء [] يحدث من قبل * بسبب أسبقية المشغل في C ، وهذا ليس ما تريد.

  2. تحتاج إلى تخصيص مساحة أكبر لمجموعة القيادة الخاصة بك. في الوقت الحالي ، ليس كبيرًا في الواقع بما يكفي للاحتفاظ به historySize char*'س:

    char** commandArray = (char**)malloc(historySize * sizeof(char*));
    
  3. لا تحتاج إلى تمرير هذا الصفيف عن طريق "المرجع". يمكنك فقط إعلان وظيفتك مثل هذه:

    void printHistory(char** historyBuff)
    

    ويمر commandArray مباشرة. ستحتاج فقط إلى المرور في char*** إذا كنت تنوي تغيير مؤشر الصفيف الفعلي في مكان ما في الوظيفة (على سبيل المثال ، إذا كنت بحاجة إلى ذلك realloc لجعل مساحة أكبر).

  4. للحصول على وظيفة تقوم فقط بطباعة الأشياء ، يمكنك الذهاب إلى أبعد من ذلك وإعلان الأشياء const. هذا "ضمان" للمتصل (بقدر ما يمكنك ضمان أي شيء في ج) أنك لن تقوم بتعديل الصفيف أو الأوتار الموجودة فيه:

    void printHistory(const char *const * historyBuff)
    

نصائح أخرى

1.

malloc يخصص عدد من بايت, ، ليس مؤشرات. لو historySize هل عدد مؤشرات الأحرف التي تخصصها ، ستحتاج إلى التغيير:

char** commandArray = (char**)malloc(historySize);

ل:

char** commandArray = malloc( historySize * sizeof(char*) );

2.

لك printHistory() لا يغير commandArray مؤشر. لا تحتاج إلى تمرير أ char***. أ char** سوف تفعل.

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