delphi4arab منتديات دلفي للعرب
[تمرين] : عمل محاكاة للدالة rgb - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : تمارين دلفي وحلول (https://delphi4arab.net/forum/forumdisplay.php?fid=16)
+--- الموضوع : [تمرين] : عمل محاكاة للدالة rgb (/showthread.php?tid=5172)

الصفحات: 1 2 3 4 5


[تمرين] : عمل محاكاة للدالة rgb - SMP3 - 30-04-2013

B.M.AbdelAziZ كتب :لم انتبه للشرط الاول بسبب السرعة...هذا حل أخر بوقت اقل من السابق!

[COLOR="Red"]حل صحيح (منطقي) و مقبول أخي B.M.AbdelAziZ .. Big Grin
[/COLOR]
تحليل على السريع : (حتى يفهم من يريد المشاركة معنا )
القيمة التي تعيدها RGB هي COLORREF (حجم 4 بايت ) .. لكن R+G+B لا يتعدى 3 بايت => البايت الرابع = 00

كود :
0B0000 + 0G00 + 0R --------------------- = RGB(R,G,B)
كون البايت في نظام الهكس مكون من رقمين :
كود :
result:=b*$10000 {Alloc 3 bytes} +g*$100 {Alloc 2 bytes} +r; {One byte }



[تمرين] : عمل محاكاة للدالة rgb - SMP3 - 30-04-2013

virtual كتب :عفوا لم انتبه . جو العمل المتعب لم يترك لي مجال للتفكير
a or b = a + b صحيح لكن على مستوى البت الواحد 1 و 0
يبدو ان اجابة الاستاذ B.M.AbdelAziZ هي الصحيحة

نعم على مستوى البت الواحد Smile
بالفعل اجابة الاستاذ B.M.AbdelAziZ صحيحة 100% ..
في انتظار اجابتك ...



[تمرين] : عمل محاكاة للدالة rgb - ALmuhhnad - 01-05-2013

PHP كود :
function MakeRGB(R,G,B : Byte):Cardinal ;
begin
  Result 
:= R * $10000;
  
asm
    MOV EAX
,0
    MOV EAX
,Result
    MOV AH
,G
    MOV AL
,B
    MOV Result
,EAX
  end
;
end;

function 
GetRValue_T(RGB : Cardinal):Byte ;
begin
  Result 
:= RGB div $10000;
end;

function 
GetGValue_T(RGB : Cardinal):Byte ;
begin
  asm
    MOV EAX
,RGB
    MOV Result
,AH
  end
;
end;

function 
GetBValue_T(RGB : Cardinal):Byte ;
begin
  asm
    MOV EAX
,RGB
    MOV Result
,AL
  end
;
end; 

السلام عليكم

هذا حلي ... , انتظر التعليقات على الكود ( سرعة .. كفائة ... إلخ ) << إذا امكن

وشكرا لك اخي المبرمج SMP3 على التمرين وتنشيط المخ/العقل


[تمرين] : عمل محاكاة للدالة rgb - SMP3 - 01-05-2013

ALmuhhnad كتب :السلام عليكم

هذا حلي ... , انتظر التعليقات على الكود ( سرعة .. كفائة ... إلخ ) << إذا امكن

وشكرا لك اخي المبرمج SMP3 على التمرين وتنشيط المخ/العقل

[COLOR="Indigo"]شكرا على المشاركة اخي ALmuhhnad Smile
بالنسية للدالة MakeRGB التي كتبتها فهي خاطئة مع الأسف
جرب :
كود :
a:= MakeRgb($10,$34,$50); b:= Rgb($10,$34,$50);
نفس الأمر ينطبق على الدالة GetBValue_T و الدالة GetٌRValue_T
[/COLOR]

حاول مرة أخرى ..


[تمرين] : عمل محاكاة للدالة rgb - SMP3 - 01-05-2013

تذكر أخي المبرمج أن أعقد الأمور لا تتطلب أعقد الحلول لحلها !!


لتسهيل التحدي : يمكن استخدام عدة طرق للقيام بحل التمرين (لقد قمت بحل التمرين باستخدام ثلاث طرق مختلفة)
-استخدام المؤشرات
-استخدام الأسمبلي
- استخدام تعليمات لغة باسكال : + , - , * , div ...
- استخدام ؟؟؟؟؟؟؟؟ (لن أذكره حتى لا أحرق الفكرة Smile )



[تمرين] : عمل محاكاة للدالة rgb - ALmuhhnad - 01-05-2013

PHP كود :
function MakeRGB(R,G,B : Byte):Cardinal ;
begin
  Result 
:= B * $10000;
  
asm
    MOV EAX
,0
    MOV EAX
,Result
    MOV AH
,G
    MOV AL
,R
    MOV Result
,EAX
  end
;
end; 

تصحيح .. إذا كان الامر بالاماكن فقط @@"


[تمرين] : عمل محاكاة للدالة rgb - ALmuhhnad - 01-05-2013

هذه طريقة آخرى للدالة RGB
PHP كود :
function MakeRGB(R,G,B : Byte):Cardinal ;
begin
  Result 
:= (B*$10000)+(G*$100)+(R)
end; 
لم الحظ ان اخي المبرمج [ B.M.AbdelAziZ ] كتبها قبلي ... في الحقيقة كتبت الحل قبل ان انظر بالحلوول الأخرى


[تمرين] : عمل محاكاة للدالة rgb - SMP3 - 01-05-2013

ALmuhhnad كتب :هذه طريقة آخرى للدالة RGB
PHP كود :
function MakeRGB(R,G,B : Byte):Cardinal ;
begin
  Result 
:= (B*$10000)+(G*$100)+(R)
end; 

[URL="http://www.delphi4arab.net/forum/showpost.php?p=41390&postcount=9"]سبقك اليها الأخ B.M.AbdelAziZ
[/URL] Smile


[تمرين] : عمل محاكاة للدالة rgb - ALmuhhnad - 01-05-2013

إقتباس :لم الحظ ان اخي المبرمج [ B.M.AbdelAziZ ] كتبها قبلي ... في الحقيقة كتبت الحل قبل ان انظر بالحلوول الأخرى

هههههه ... هذه نفس الطريقة لكن بالأسمبلي :
PHP كود :
function MakeRGB(R,G,B : Byte):Cardinal ;
begin
  asm
    MOV EAX
,0
    MOV AL
,B
    MOV ECX
,$10000
    MUL EAX
,ECX
    MOV AL
,G
    MOV CX
,$100
    MUL AX
,CX
    MOV AL
,R
    MOV Result
,EAX
  end
;
end; 



[تمرين] : عمل محاكاة للدالة rgb - SMP3 - 01-05-2013

ALmuhhnad كتب :
PHP كود :
function MakeRGB(R,G,B : Byte):Cardinal ;
begin
  Result 
:= B * $10000;
  
asm
    MOV EAX
,0
    MOV EAX
,Result
    MOV AH
,G
    MOV AL
,R
    MOV Result
,EAX
  end
;
end; 

تصحيح .. إذا كان الامر بالاماكن فقط @@"

[COLOR="Navy"]آه لم أنتبه لهذا الرد ..
حل صحيح و مقبول لكن لن ماذا عن الدالة GetBValue_T و الدالة GetٌRValue_T !!!
--------------------------------
تعديل بسيط على الدالة :
هكذا أفضل :[/COLOR]
PHP كود :
function MakeRGB(R,G,B : Byte):Cardinal ;
 
asm
     MOV CH
,AL
     
XOR EAX,EAX
     MOV  AL
,CL
     IMUL EAX
,$10000
     MOV AH
,DL
     MOV AL
,CH
 end
;