PDA

View Full Version : سوال: مقدار بازگشتی تابع بصورت آرایه



mehran788
یک شنبه 18 تیر 1391, 22:20 عصر
با سلام و خسته نباشید
آیا می شود که مقدار بازگشتی یک تابع یک آرایه باشد.اگر می شود لطفا من را راهنمایی کنید.
ممنون

uniqueboy_ara
یک شنبه 18 تیر 1391, 22:31 عصر
بله!
فقط کافیه موقع تعریف تابع، نوع مقدار بازگشتی رو مشخص کنی و بعد از اتمام تعریف، متغییری با همون نوع رو Return کنی
مثلا این یه تابع ( فقط جنبه آموزشی داره ) خیلی ساده که یه رشته رو میگیره و اون رو از اسلش ها میشکنه و داخل یه آرایه خروجی میده:
private string[] Spliter(string Input)
{
string[] s = Input.Split('/');
return s;
}

salehbagheri
یک شنبه 18 تیر 1391, 23:17 عصر
بله!
فقط کافیه موقع تعریف تابع، نوع مقدار بازگشتی رو مشخص کنی و بعد از اتمام تعریف، متغییری با همون نوع رو Return کنی
مثلا این یه تابع ( فقط جنبه آموزشی داره ) خیلی ساده که یه رشته رو میگیره و اون رو از اسلش ها میشکنه و داخل یه آرایه خروجی میده:
private string[] Spliter(string Input)
{
string[] s = Input.Split('/');
return s;
}

البته از این پس توصیه میشه که از Generic ها استفاده کنید.

uniqueboy_ara
دوشنبه 19 تیر 1391, 00:08 صبح
چشم جناب مدیر :)
بنده که عرض کردم " فقط جنبه آموزشی داره" ، خواستم دوستمون راحت متوجه بشه، گفتم اگه از List استفاده کنم، کلا گیج میشه ;)

ASKaffash
دوشنبه 19 تیر 1391, 07:23 صبح
سلام
لطفا دلیل فنی را ارائه فرمائید

البته از این پس توصیه میشه که از Generic ها استفاده کنید.

mehran788
دوشنبه 19 تیر 1391, 09:24 صبح
بله!
فقط کافیه موقع تعریف تابع، نوع مقدار بازگشتی رو مشخص کنی و بعد از اتمام تعریف، متغییری با همون نوع رو Return کنی
مثلا این یه تابع ( فقط جنبه آموزشی داره ) خیلی ساده که یه رشته رو میگیره و اون رو از اسلش ها میشکنه و داخل یه آرایه خروجی میده:
private string[] Spliter(string Input)
{
string[] s = Input.Split('/');
return s;
}


ممنون. مشکلم حل شد. ولی حالا تو فراخوانی این تابع مشکل دارم.
ن تابع زیر رو نوشتم حالا چطور a و b ورودی رو تو فراخوانی بکار ببرم.

public int[,] zarb(int[,] a, int[,] b, int n)
{
int[,] c = new int[n, n];
for (int i = 0; i <= n - 1; i++)
{
for (int j = 0; j <= n - 1; j++)
{
c[i, j] = ((a[i, j] * b[j, i]) + (a[i, (j + 1)] * b[(j + 1), i]));
}
}
return c;
}

tooraj_azizi_1035
دوشنبه 19 تیر 1391, 10:57 صبح
سلام
مثل اینکه برنامه ضرب ماتریس رو داری می نویسی. a و b رو مثل همه متغیرهای دیگه به متد پاس کن.
ارسال آرایه به متدها به عنوان پارامتر:
Passing Arrays as Parameters (C#‎‎ Programming Guide) (http://msdn.microsoft.com/en-us/library/hyfeyz71%28v=VS.80%29.aspx)



این نسخه موازی برنامه شماست و سرعت در سیستم 4 هسته ای 4 برابر می شود (در دات نت 4 امکان پذیر است):


static void MultiplyMatricesParallel(double[,] matA, double[,] matB, double[,] result)
{
int matACols = matA.GetLength(1);
int matBCols = matB.GetLength(1);
int matARows = matA.GetLength(0);

// A basic matrix multiplication.
// Parallelize the outer loop to partition the source array by rows.
Parallel.For(0, matARows, i =>
{
for (int j = 0; j < matBCols; j++)
{
// Use a temporary to improve parallel performance.
double temp = 0;
for (int k = 0; k < matACols; k++)
{
temp += matA[i, k] * matB[k, j];
}
result[i, j] = temp;
}
}); // Parallel.For
}


می بینید که نتیجه حاصلضرب هم خودش به متد پاس داده شده است.

mmd2009
دوشنبه 19 تیر 1391, 13:12 عصر
لطفا دلیل فنی را ارائه فرمائید

باسلام

این (http://msdn.microsoft.com/en-us/library/512aeb7t.aspx)لینک رو بخونید

موفق باشید

mehran788
دوشنبه 19 تیر 1391, 18:34 عصر
سلام
مثل اینکه برنامه ضرب ماتریس رو داری می نویسی. a و b رو مثل همه متغیرهای دیگه به متد پاس کن.
ارسال آرایه به متدها به عنوان پارامتر:
Passing Arrays as Parameters (C#‎‎ Programming Guide) (http://msdn.microsoft.com/en-us/library/hyfeyz71%28v=VS.80%29.aspx)

این نسخه موازی برنامه شماست و سرعت در سیستم 4 هسته ای 4 برابر می شود (در دات نت 4 امکان پذیر است):


static void MultiplyMatricesParallel(double[,] matA, double[,] matB, double[,] result)
{
int matACols = matA.GetLength(1);
int matBCols = matB.GetLength(1);
int matARows = matA.GetLength(0);

// A basic matrix multiplication.
// Parallelize the outer loop to partition the source array by rows.
Parallel.For(0, matARows, i =>
{
for (int j = 0; j < matBCols; j++)
{
// Use a temporary to improve parallel performance.
double temp = 0;
for (int k = 0; k < matACols; k++)
{
temp += matA[i, k] * matB[k, j];
}
result[i, j] = temp;
}
}); // Parallel.For
}


می بینید که نتیجه حاصلضرب هم خودش به متد پاس داده شده است.



ممنونم ولي من بصورت زير فراخواني كردم و خطا داد

int[,] a = new int[n , n];
int[,] b = new int[n , n];
int[,] c = new int[n , n];
c = zarb(a, b[,], n);

tooraj_azizi_1035
دوشنبه 19 تیر 1391, 19:41 عصر
گفتم اینطوری:
c = zarb(a, b, n);

mehran788
دوشنبه 19 تیر 1391, 20:15 عصر
گفتم اینطوری:
c = zarb(a, b, n);

شرمنده ولي اينطوري هم خطا ميده

Hossenbor
دوشنبه 19 تیر 1391, 20:29 عصر
دوست عزیز شما دارید داده خام تحویل تابع میدین باید اونو مقدار دهی کنید در ضمن اگر امکان داره خطایه مورد نظر رو کپی و اینجا پیست کنی تا بتونیم راهنماییت کنیم

ASKaffash
سه شنبه 20 تیر 1391, 06:52 صبح
سلام
لینک خراب است


باسلام

این (http://msdn.microsoft.com/en-us/library/512aeb7t.aspx)لینک رو بخونید

موفق باشید

mmd2009
سه شنبه 20 تیر 1391, 12:23 عصر
سلام
لینک خراب است

برای من که باز میشه :متفکر:

ASKaffash
چهارشنبه 21 تیر 1391, 06:55 صبح
سلام
بلاخره لینک را باز کردم و خوندم اتفاقا خیلی جالب بود چون به فکر اولیه من نزدیک بود (من خودم در 99٪ موارد از جنریک استفاده می کنم) خوب شکی نیست که قابلیت و انعطاف پذیری Generic ها در شرایط مساوی از ArrayList ها خیلی خیلی بیشتر است ولی نباید یک نسخه کامل تجویز گردد که از این ببعد از Generic استفاده شود چون بنظر میرسد مثلا برای حل یک دستگاه 1000 معادله و 1000 مجهول (مثلا به روش چولسکی) میزان منابع استفاده شده برای حالت Generic بیشتر از یک Array است که تمام اعضای آن ثابت و ایستا است از طرفی موضوع ByVal و ByRef و همچنین موضوع استفاده از کلاس به جای Struct هم در میان است مثلا :


public class M
{
public M(int Row, int Col, int Value)
{
this.Row = Row;
this.Col = Col;
this.Value = Value;
}
public M(int Row, int Col)
: this(Row, Col, 0)
{
}
public int Row { set; get; }
public int Col { set; get; }
public int Value { set; get; }
}
private void f()
{
int[,] a =new int[1000, 1000];
a[0, 0] = 10;
List<M> b =new List<M>(1000);
b.Add(new M(0, 0));
b[0].Value = 10;
}