سؤال
لدي الكود التالي:
char *array1[3] =
{
"hello",
"world",
"there."
};
struct locator_t
{
char **t;
int len;
} locator[2] =
{
{
array1,
10
}
};
إنه يجمع بشكل جيد مع "gcc -Wall -ansi -pedantic".ولكن مع وجود سلسلة أدوات أخرى (رولي)، فإنه يشكو
warning: initialization from incompatible pointer type
على السطر حيث char **t هو.هل هذا الرمز غير قانوني بالفعل أم أنه موافق؟
شكرا على كل الجواب.أعرف الآن أين كانت مشكلتي.إلا أنه يطرح سؤالاً جديداً:
المحلول
يبدو قانونيًا تمامًا بالنسبة لي؛ char *[3]
يضمحل ل char **
, ، لذا ينبغي أن يكون التعيين صحيحا.
لا يشكو دول مجلس التعاون الخليجي 4.4.5 ولا CLang 1.1.
نصائح أخرى
رغم أنه في الممارسة العملية array1
يجب أن تتحلل إلى مؤشر من النوع char **
, ، نوعه الحقيقي هو في الواقع char *[3]
, ، ومن هنا التحذير.
لقمع التحذير، يمكنك محاولة إرساله بشكل صريح:
...
(char **) array1;
...
array1 هو رمز علامة عام ، والذي يختلف لغويًا عن رمز العلامة العام ، على الرغم من أنه في الواجب يجب أن يتحلل بشكل رشيق إلى رمز ترميز عام
المؤشرات والمصفوفات ومتوافقة فقط في النطاق الثابت.في النطاق العام ، لا يكون المؤشر والمصفوفة متماثلين ، سيؤدي خلط الاثنين إلى سلوك غير محدد.لذا في رأيي التحذير صحيح.
حاول وضع: Genacodicetagpre
في وحدة واحدة و: Genacodicetagpre
في مكان آخر ، ترجمه واربطه.(لم أجربها ...) أتوقع أن تسوء الأمور ...