أعلم أنه يمكنك استخدام الفئات المحددة بواسطة المستخدم للمصفوفات ، لكن لا يمكنني المرور بها. لنفترض أنني أريد تنفيذ تعويمي:
public class MyFloat
{
private float value;
public MyFloat(float value)
{
this.value = value;
}
public static MyFloat operator *(MyFloat a, MyFloat b) => new MyFloat(a.value * b.value);
public static MyFloat operator +(MyFloat a, MyFloat b) => new MyFloat(a.value + b.value);
public static MyFloat operator /(MyFloat a, MyFloat b) => new MyFloat(a.value / b.value);
public static MyFloat operator -(MyFloat a, MyFloat b) => new MyFloat(a.value - b.value);
public static MyFloat Zero => new MyFloat(0);
public static implicit operator MyFloat(float a) => new MyFloat(a);
public static implicit operator float(MyFloat a) => a.value;
public static implicit operator MyFloat(int a) => new MyFloat(a); // this one is needed for Constant<T>.Zero
}
ثم أقوم بإنشاء مصفوفتين وحاول ضربهما
var a = new Matrix<MyFloat>(3, 5);
for (int i = 0; i < a.Rows; i++)
for (int j = 0; j < a.Columns; j++)
a[i, j] = 3;
var b = new Matrix<MyFloat>(5, 6);
for (int i = 0; i < b.Rows; i++)
for (int j = 0; j < b.Columns; j++)
b[i, j] = 5;
var c = a * b;
Console.WriteLine(c);
وبعد ذلك توقف. أعتقد أنني أفتقد شيئًا ما ، لكن لم أتمكن من العثور عليه في المستندات أو العينات ، ولكن كيف أجعله يعمل؟
اسف على الجواب المتاخر. يبدو أن هناك مشكلة في الكود الخاص بي. إنه في الواقع ليس في كود المصفوفة ، إنه في طريقة ComputePi
والتي تعمل حاليًا عندما أصل إلى فئة Constant<T>
. من المحتمل أن يكون هذا حلًا سهلاً ، ومن المحتمل أن يكون الإصلاح جاهزًا بحلول الغد. :)
ما أحتاج إلى فعله هو إما إصلاح الحلقة اللانهائية التي تحدث في طريقة ComputePi
أو أحتاج إلى منع حساب جميع الثوابت في فئة Constant<T>
. على الرغم من أنني أقوم بالوصول إلى Constant<T>.Zero
، إلا أنه يحسب حاليًا Constant<T>.Pi
نظرًا لأن جميع أعضاء هذه الفئة عبارة عن حقول ثابتة. لقد فعلت هذا في الأصل لأسباب تتعلق بالأداء.
شكرا لتقديم القضية. سأقوم بنشر هذه المشكلة مرة أخرى عندما يتم إصلاحها. :)
لقد أصلحت المشكلة ، على الرغم من أنني أحتاج حاليًا إلى عدد قليل من المشغلين أكثر من المشغلين فقط في عينتك. جميع طرق الاختبار لمشروع Towel
موجودة داخل مشروع Tools/Towel_Testing
. لقد أضفت طريقة اختبار لعينتك هنا:
https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Tools/Towel_Testing/Mathematics/Matrix.cs#L1737
يمكنك أن ترى أنني أضفت العوامل التالية:
public static bool operator <=(MyFloat a, MyFloat b) => a.value <= b.value;
public static bool operator >=(MyFloat a, MyFloat b) => a.value >= b.value;
public static bool operator ==(MyFloat a, MyFloat b) => a.value == b.value;
public static bool operator !=(MyFloat a, MyFloat b) => a.value != b.value;
public static MyFloat operator -(MyFloat a) => new MyFloat(-a.value);
بالنسبة لطريقة ComputePi
... لقد نسيت ++
متغيرًا ... لذا شكرًا لالتقاط ذلك. لا يزال هناك مجال للتحسين ، لكن هذا أدى إلى حل مشكلتك على الأقل. :) هنا كان السطر الذي نسيت ++
على: https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Sources/Towel/Constant.cs#L64
لم أقم بتحديث حزمة nuget اعتبارًا من هذا المنشور ، لكنني سأفعل ذلك في المستقبل القريب.
هل هناك إصلاح عاجل يمكنني جعله يعمل الآن؟ ربما يجب علي إضافة طريقة أو عامل آخر؟
أعتقد أنه تم إصلاح هذه المشكلة في PR # 54. إذا كانت لا تزال هناك مشكلة أو مشاكل أخرى ، فالرجاء إعادة فتح هذه المشكلة أو فتح مشكلة جديدة.
التعليق الأكثر فائدة
اسف على الجواب المتاخر. يبدو أن هناك مشكلة في الكود الخاص بي. إنه في الواقع ليس في كود المصفوفة ، إنه في طريقة
ComputePi
والتي تعمل حاليًا عندما أصل إلى فئةConstant<T>
. من المحتمل أن يكون هذا حلًا سهلاً ، ومن المحتمل أن يكون الإصلاح جاهزًا بحلول الغد. :)ما أحتاج إلى فعله هو إما إصلاح الحلقة اللانهائية التي تحدث في طريقة
ComputePi
أو أحتاج إلى منع حساب جميع الثوابت في فئةConstant<T>
. على الرغم من أنني أقوم بالوصول إلىConstant<T>.Zero
، إلا أنه يحسب حاليًاConstant<T>.Pi
نظرًا لأن جميع أعضاء هذه الفئة عبارة عن حقول ثابتة. لقد فعلت هذا في الأصل لأسباب تتعلق بالأداء.شكرا لتقديم القضية. سأقوم بنشر هذه المشكلة مرة أخرى عندما يتم إصلاحها. :)