static char Hexa_table[16] = "0123456789ABCDEF" ;
if ( (number_string = malloc( (string_size) * sizeof(char) ) ) == NULL ){
ذلك أن العبارة '== NULL' لا داعي لها ويمكن الاستعاضة غنها بـ !. ولأن هناك مساواة داخل شرط الـ if وهو ما لا أفضله في أغلب الحالات وأخيراً بسبب العبارة sizeof(char) والمعرفة دوماً على أنها 1 فلا داعي لها.بتاريخ 23 سبتمبر 2009 02:35 م، قطب عبد اللطيف حاجي علي حاجبيه بشدة وهو يقول:
-نقطة لأن فشل حجز المصفوفة يؤدي إلى خطأ منطقي جسيم في الزمن الحقيقيوفي 23 سبتمبر 2009 02:35 م، أعرب عبد اللطيف حاجي علي عن رأيه بالموقف كالآتي:
-نقطة لأن الإجراء يقوم بالطباعة على المدخل القياسي. أمر ليس من المفروض أن يفعله إجراء كهذا.في 23 أيلول 2009 09:26 م، غمغم انس باستغراب قائلاً:
لم افهم هذه النقاط هلا اعدت شرحها لي ؟if ( (number_string = malloc( (string_size) * sizeof(char) ) ) == NULL ){
printf("Error : can't allocate memorie\n");
}
else memset( number_string,'\0',string_size ); // clean memorie
number_string[i] = Hexa_table[rest] ;
بتاريخ 23 أيلول 2009 09:26 م، قطب انس حاجبيه بشدة وهو يقول:
-نقطة لأن الإجراء يقوم بالطباعة على المدخل القياسي. أمر ليس من المفروض أن يفعله إجراء كهذا.printf("My number is: ");
printf("%s", Dicimal_to_hex(0x452));
My number is: rest 2
rest 5
rest 4
rest 0
0452
My number is: Error : can't allocate memorie
وفي 23 سبتمبر 2009 10:34 م، أعرب عبد اللطيف حاجي علي عن رأيه بالموقف كالآتي:
هذا الإجراء يقوم بأخذ رقم ويعيد نصاً يحوي التمثيل الست عشري للرقم. تخيل ماذا سيكون شعور المستخدم إذا أراد تنفيذ شيء كهذا:في 23 سبتمبر 2009 10:34 م، قال عبد اللطيف حاجي علي بهدوء وتؤدة:
-نقطة لأن الرقم 0xA يعيد 0A بدلاً من A على سبيل المثال //i = string_size ; wrong
i = string_size-1 ;
// convert Decimal into Hexadecimal
while( i >= 0 ) {
rest = number%16 ;
number /= 16 ;
number_string[i] = Hexa_table[rest] ;
i-- ;
}
printf("%s \n", Dicimal_to_hex (1254); // تحرير الذاكرة
ام ان الحل الوحيد هو تمرير مؤشر لدالة و هي تقوم بالعمل الازم من تحقق من حجم السلسلة الخ ؟في 24 أيلول 2009 02:53 ص، قال انس بهدوء وتؤدة:
شكرا جزيلا على التنبيه، استطعت الان اكتشاف المشكلة.وفي 04/شوال/1430 09:35 ص، قال عبد اللطيف حاجي علي متحمساً:
وأخيراً بسبب العبارة sizeof(char) والمعرفة دوماً على أنها 1 فلا داعي لها.char* Dicimal_to_hex ( unsigned int number , char* user_string ) {
unsigned int temp_number = number ;
int string_size = 0 ;
int rest = 0 ;
int i = 0 ;
static const char Hexa_table[17] = "0123456789ABCDEF" ;
// exception with 0
if ( number == 0 ) {
user_string[0]= '0';
user_string[1] = '\0';
return user_string;
}
// get the string size
while( temp_number > 0 ) {
rest = temp_number%16;
temp_number >>= 4;
string_size++ ;
}
// be sure to put the '\0' at the end of the string
user_string[ string_size ] = '\0';
// initialisation of the variable
rest = 0;
i = string_size-1 ;
// convert Decimal into Hexadecimal
while( i >= 0 ) {
rest = number%16 ;
number >>= 4 ;
user_string[i] = Hexa_table[rest] ;
i-- ;
}
return user_string;
}
المشكلة هي انني حذفت التعليمات التي تتحقق من حجم سلسلة المحارف.اذن فل يتحمل المستخدم مسؤلية ذلك ☺ .Write Code Here
أما في 24 أيلول 2009 04:26 م، فقد تنهد أحمد عبد الغني بارتياح وهو يرد:
سؤال: هل هناك منصات تتعامل مع char على أنه أكبر من بايت؟في 24 أيلول 2009 04:26 م، غمغم أحمد عبد الغني باستغراب قائلاً:
استخدام sizeof هو مثالية حميدة برأيي ولن يخسر أي شيء باستخدامه لها. فالتعليمة في النهاية ستتحول إلى الرقم الصحيح أثناء بناء البرنامج.int i = 10*1;
size_t sMySize = sizeof(int) * sizeof(char);
char buffer[50];
size_t mySize = sizeof(buffer) / sizeof(buffer[0]);
بتاريخ 24 أيلول 2009 04:26 م، قطب أحمد عبد الغني حاجبيه بشدة وهو يقول:
بالنسبة لمشاركة وسام، ففيها فكرة جميلة جداً لم تكن لتخطر على بالي. فوسام يتعامل مع الرقم الست عشري بنفس منطلق الرقم العشري أو غيره (حالة عامة). فرياضياً، الرقم 142 هو رقم عشري. لو قسمنا على 10 لأزحنا الأرقام خانة واحدة إلى اليمين فيصبح الرقم 14.2 أو 14 بعد تجاهل الفاصلة.لو ضربنا بـ 10 لأصبح الرقم 1420 أي تمت إزاحته لليسار خانة.