[تمرين] : عمل محاكاة للدالة rgb
#11
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     }
الرد
#12
virtual كتب :عفوا لم انتبه . جو العمل المتعب لم يترك لي مجال للتفكير
a or b = a + b صحيح لكن على مستوى البت الواحد 1 و 0
يبدو ان اجابة الاستاذ B.M.AbdelAziZ هي الصحيحة

نعم على مستوى البت الواحد Smile
بالفعل اجابة الاستاذ B.M.AbdelAziZ صحيحة 100% ..
في انتظار اجابتك ...
الرد
#13
PHP كود :
function MakeRGB(R,G,Byte):Cardinal ;
begin
  Result 
:= * $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 على التمرين وتنشيط المخ/العقل
الرد
#14
ALmuhhnad كتب :السلام عليكم

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

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

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

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


لتسهيل التحدي : يمكن استخدام عدة طرق للقيام بحل التمرين (لقد قمت بحل التمرين باستخدام ثلاث طرق مختلفة)
-استخدام المؤشرات
-استخدام الأسمبلي
- استخدام تعليمات لغة باسكال : + , - , * , div ...
- استخدام ؟؟؟؟؟؟؟؟ (لن أذكره حتى لا أحرق الفكرة Smile )
الرد
#16
PHP كود :
function MakeRGB(R,G,Byte):Cardinal ;
begin
  Result 
:= * $10000;
  
asm
    MOV EAX
,0
    MOV EAX
,Result
    MOV AH
,G
    MOV AL
,R
    MOV Result
,EAX
  end
;
end

تصحيح .. إذا كان الامر بالاماكن فقط @@"
الرد
#17
هذه طريقة آخرى للدالة RGB
PHP كود :
function MakeRGB(R,G,Byte):Cardinal ;
begin
  Result 
:= (B*$10000)+(G*$100)+(R)
end
لم الحظ ان اخي المبرمج [ B.M.AbdelAziZ ] كتبها قبلي ... في الحقيقة كتبت الحل قبل ان انظر بالحلوول الأخرى
الرد
#18
ALmuhhnad كتب :هذه طريقة آخرى للدالة RGB
PHP كود :
function MakeRGB(R,G,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
الرد
#19
إقتباس :لم الحظ ان اخي المبرمج [ B.M.AbdelAziZ ] كتبها قبلي ... في الحقيقة كتبت الحل قبل ان انظر بالحلوول الأخرى

هههههه ... هذه نفس الطريقة لكن بالأسمبلي :
PHP كود :
function MakeRGB(R,G,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
الرد
#20
ALmuhhnad كتب :
PHP كود :
function MakeRGB(R,G,Byte):Cardinal ;
begin
  Result 
:= * $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,Byte):Cardinal ;
 
asm
     MOV CH
,AL
     
XOR EAX,EAX
     MOV  AL
,CL
     IMUL EAX
,$10000
     MOV AH
,DL
     MOV AL
,CH
 end

الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم