سؤال

هذا في إشارة إلى حل تم نشره على: حلق صفيف بحجم ثابت دون تحديد حجمه في ج

هذا هو رمز العينة الخاص بي:

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

int main(int argc, char *argv[])
{
    static const char *foo[] = {
           "this is a test",
           "hello world",
           "goodbye world",
           "123", 
           NULL
    };

    for (char *it = foo[0]; it != NULL; it++) {
        printf ("str %s\n", it);
    }

    return 0;

}

محاولة تجميع هذا يعطي:

gcc -o vararray vararray.c
vararray.c: In function ‘main’:
vararray.c:14: warning: initialization discards qualifiers from pointer target type
vararray.c:14: error: ‘for’ loop initial declaration used outside C99 mode
هل كانت مفيدة؟

المحلول

إلى جانب التهيئة في الحلقة ، فأنت تتزايد في المكان الخطأ. أعتقد أن هذا ما تعنيه (لاحظ أنني لست بالضبط C Guru):

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

int main(int argc, char *argv[])
{
    static const char *foo[] = {
           "this is a test",
           "hello world",
           "goodbye world",
           "123", 
           NULL
    };
    const char **it;
    for (it=foo; *it != NULL; it++) {
        printf ("str %s\n", *it);
    }

    return 0;

}

نصائح أخرى

  1. متغير حلقة الخاص بك it من النوع char*, ، محتويات الصفيف من النوع const char*. إذا تغيرت it ليكون أيضا const char* يجب أن يختفي التحذير.

  2. أنت تعلن it داخل البيان ، هذا غير مسموح به في C قبل C99. يعلن it في بداية main() في حين أن.
    بدلاً من ذلك يمكنك إضافة -std=c99 أو -std=gnu99 إلى أعلام GCC الخاصة بك لتمكين ميزات لغة C99.

يستخدم -std=c99 الخيار عند تجميع الكود الخاص بك من أجل استخدام C99 الميزات.

يتغيرون it إلى const char* اكتب (لإزالة التحذيرات)

قبل C99 ، أعلن أن مؤشر الشخصية في الحلقة غير قياسي.

أنت بحاجة إلى شيئين للحصول على هذا التجميع بدون تحذيرات: أعلن عن التكرار const char* it, ، وافعل ذلك في بداية الوظيفة وليس في بيان الحلقة.

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