سؤال

هذا هو الكود الذي أريد أن أحاول كتابته:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

int main(int argc, char *argv[])
{
    float arry[3] = {0};

    memset(arry, (int) 10.0, 3*sizeof(float));

    return 0;
}

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

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

المحلول

وصب مزدوجة إلى int فقط يخلق الرقم الثنائي 00001010 (10 في ثنائي)، وهذا هو القيمة التي يتم memset'ed. منذ انها شار، كل من العوامات الخاصة بك هو في الواقع تلقي النقش بت 00001010 00001010 00001010 00001010.

نصائح أخرى

Memset يأخذ الباحث، ولكن يلقي ذلك إلى الحرف غير الموقعة، ثم يملأ كل بايت من تعويم (sizeof (تعويم) هو على الارجح 4) مع هذا النمط قليلا. إذا كان هذا هو ج ++، تفضل ملء بدلا من ذلك:

#include <algorithm>
using namespace std;

//...

fill (arry,arry+3,10.0);

ولا. memset يأخذ بايت واحد ويكتب عليه إلى مجموعة. A تعويم هو نوع متعدد بايت.

وتحرير: نعم، وأنا أعلم memset يأخذ عدد صحيح. ولكنه يستخدم فقط الحرف غير الموقعة (بايت واحد) لملء مع.

لماذا لا مجرد for حلقة بسيطة؟

في الواقع محاولتك مضللة بعض الشيء، memset يعمل على وحدات البايت..في الواقع، استخدام قيمة تعويم لقيمة memset ليس له أي معنى!

يحتوي التنسيق العائم فقط على 23+1 بت للجزء العشري و8 بت للأس.عندما تكتب قيم البايتات الأولية (باستخدام memset) داخل تعويم، فإنك لا تعرف ما الذي تحصل عليه لأنك تقوم بتعيين قيم سيتم تفسيرها بطريقة مختلفة!

في المقتطف الخاص بك، قمت أيضًا بتحويله إلى (int) لتحويل تعويم 4 بايت يحتوي على 10.0f في عدد صحيح 4 بايت يحتوي على القيمة 10..ولكن كما ذكرنا من قبل، إذا قمت بتعيين تعويم بـ 10 (= 0x0a) فسينتهي بك الأمر بالحصول على 0x0A0A0A0A الذي ليس 10.0f بتنسيق تعويم، يمكن أن يكون أي قيمة (أيضًا شيء قريب جدًا من 0، كما هو الحال في حالتك).

في الحقيقة memset يكون مفيدًا عندما تريد تهيئة مجموعة من الأحرف (نظرًا لأنك تحصل بشكل فعال على هذه القيمة لكل حرف لأنها بطول بايت واحد) أو عندما تريد تعيين كل شيء على 0 (NULL) الذي يعمل مع كل نوع أساسي من البيانات.

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