لماذا يبدو Strlen () إرجاع في مصحح الأخطاء VC ++؟ [مغلق

StackOverflow https://stackoverflow.com/questions/576396

  •  05-09-2019
  •  | 
  •  

سؤال

لدي سلسلة في C ++ من النوع const char* مرت كحجة إلى Strlen، لكنه يعود باطل.

يذهب مثل

strlen(astruct.string);

شكرا..

تحرير: فعل بعض التدقيق،

strlen("test");

لا يزال يعطي باطل .. لماذا؟

تحرير: إليك الصورةhttp://img14.imageshack.us/img14/1808/stlen.png.

آسف لكونك غير واضح سابقا. التنسيق لم يكن يعمل بشكل جيد للغاية. على أي حال، تم حل الارتباك من قبل كلا Evan Teran وفلاد روماسكانو. إلقاء نظرة أيضا على إجابة Brian R. Bondy.

شكرا. لا تتردد في إغلاق.

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

المحلول

في اشارة الى طلقة شاشتك: يعرض المصحح الخاص بك <void> بالنسبة strlen(...) عندما تكون في الواقع، يجب أن تعرض خطأ.

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

ما يمكنك القيام به هو، في التعليمات البرمجية الخاصة بك، إضافة مؤقتا:

size_t tmp_len = strlen(struc.string);

ثم ترجمة، وإضافة TMP_LEN إلى الساعة.

نصائح أخرى

أنت مرتبك من قبل المصحح Crappy من Visual Studio 6.0. لا تعتمد على هذا. من المحتمل أن تتمكن من الحصول على قيمة العودة بسبب الارتفاع أو شيء مماثل.

اطبع القيمة للحصول على القيمة الحقيقية.

تحرير: أيضا، من مثالك، يبدو أنك قد لا تخزن نتيجة Strlen على أي حال. قد يكون هذا أيضا سببا لعدم رؤية مصحح الأخطاء قيمة الإرجاع. من الممكن تماما أن قرر المحول البرمجي أنه لا يحتاج إلى تنفيذ Strlen بالفعل إذا لم تستخدم القيمة.

ملاحظة: في هذه المرحلة، لا يوجد عذر حقيقي ل ما يزال باستخدام VC ++ 6.0. إنه مترجم قديم وأيد IDE وهو مترجم سي فقير محروق. الإصدارات الأحدث من مترجم Visual C ++ مجانية (بدون IDE)، استخدمها.

Strlen ليس من عائد نوع الفراغ، إنه مصححك الذي لا يعطي الرسالة الصحيحة.

لماذا يظهر debbuger فراغ؟

من المحتمل أن يكون تنفيذ Strlen الذي تستخدمه الذي تستخدمه حول Strlen #DefineName_strlen.

ربما لا يدعم مصحح الأخطاء # Define بشكل صحيح أو بعض المعدلات الأخرى على الوظيفة.

سيكون عليك القيام بشيء ما مثل Ilen = Strlen ("اختبار") ثم تحقق إيلين في ساعتك.

عادة يمكنك استدعاء الوظائف في ساعتك. على سبيل المثال، حاول تحديد الوظيفة التالية ثم اتصل بها في مراعتك:

int testFunc(char*)
{
  return 5;
}

من المحتمل أن تحصل على 5 في ساعاتك نتيجة لذلك.

Strlen إرجاع عدد صحيح، لذلك أفترض أنك تعني أنه يعود "0".

أيضا، الطريقة التي تحدد بها نوع البيانات الخاص بك، لا أستطيع أن أقول تماما إذا كان الأمر CONST char * أو const char **. إذا كان هذا الأخير، فأنت بحاجة إلى التأكد من أنك تجريد ** إلى واحد *.

تخميني هو أن السلسلة تبدأ ب byte null، ولهذا السبب يعود 0.

في C ++، تعمل الوظائف دائما على إرجاع قيمة النوع الذي يتم الإعلان عنه للعودة. منذ strlen إعلان الوظيفة يبدو شيئا مثل هذا:

size_t strlen(const char *);

الشيء الوحيد الذي يمكن أن ربما العودة هو size_t. وبعد يستخدم برنامج التحويل البرمجي هذه المعلومات في وقت ترجمة وقت لتحديد كيفية التعامل مع قيمة الإرجاع عند استدعاء الوظيفة. النقطة هنا هي أنه إذا كان strlen يتم الإعلان عن الوظيفة على النحو الوارد أعلاه، لا يمكن أن تقرر العودة void في بعض الأحيان وقيمة النوع size_t أوقات أخرى.

هذه هي عموما سمة لغات مكتوبة ثابتة مثل C ++. في اللغات المكتوبة بشكل حيوي (بيرل، Python، Ruby، PHP، إلخ) يمكن أن تقرر دالة إرجاع قيمة أي نوع في كل مرة يتم استدعاؤها.

لا يمكن العودة باطل. الفراغ هو عدم وجود قيمة الإرجاع، لذلك لا يمكنك، أخطأ، إرجاعها.

كيف يمكنك التحقق من الفراغ على أي حال؟ باطل ليست قيمة. يرجى إظهار كيف تحصل باطل. هل تجميع الوقت أو وقت التشغيل؟

إذا كنت تفعل في الواقع نظام حيث strlen أعلن مع void نوع العودة، تشغيل بأسرع ما يمكن في الاتجاه الآخر.

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