PDA

View Full Version : سوال: return کردن یک آرایه



danial19
یک شنبه 03 دی 1391, 22:37 عصر
برای return کردن یک آرایه ی int از یک تابع چه کار باید کرد؟
لطفا اگر در آرگومان تابع هست آن رانیز بنویسید
مرسی

omidshaman
یک شنبه 03 دی 1391, 22:50 عصر
می تونی vector استفاده کنی به جای ارایه و vector رو برگردونی
یا یک پوینتر رو قرار بدی مساوی ارایه و پوینتر رو برگردونی

omidshaman
یک شنبه 03 دی 1391, 23:10 عصر
#include <iostream>
#include<vector>
using namespace std;
vector<int> test(void);
int main()
{
vector<int> a;
vector<int>::iterator it;
a=test();
for (it=a.begin(); it<a.end(); it++)
cout <<*it;
}
vector<int> test()
{
int array[]={1,2,3,4};
vector<int> a;
a.insert (a.begin(), array, array+4);
return a;
}


#include <iostream>
using namespace std;
char *test(void);
int main()
{
cout<<test();
}
char *test()
{
char *a="abcd";
return a;
}


#include <iostream>
using namespace std;
int *test(void);
int main()
{
int *a=test();
cout<<a[2];
}
int *test()
{
int array[]={1,2,3,4};
int *a=array;
return a;
}

Ananas
یک شنبه 03 دی 1391, 23:45 عصر
به نظر من یک راه خوب برای این کار اینه که شما یک اشاره گر به اشاره گر رو بفرستی به تابع و هم چنین یک اشاره گر به یک عدد صحیح که تابع آرایه رو با اون اشاره گر برگردونه و تو اون عدد صحیح هم سایز آرایه رو بنویسه مثلا :

#pragma hdrstop
#pragma argsused

#include <tchar.h>
#include <stdio.h>
#include <alloc.h>


struct TVec3D
{
public:
float x, y;
};

void * CreateListOfVector(float ** pVec, size_t * pSize, int count_ParametreEkhtiary)
{
int count = count_ParametreEkhtiary * 10;
*pSize = count * sizeof(TVec3D);
*pVec = (float *)malloc(*pSize);
//...
return (*pVec);
};

int _tmain(int argc, _TCHAR* argv[])
{
TVec3D * arrayVec3 = NULL;
size_t size = 0;
CreateListOfVector((float **)&arrayVec3, &size, 20);
//...
free(arrayVec3);
return 0;
}

omidshaman
دوشنبه 04 دی 1391, 00:02 صبح
قضیه این public چیه که توی struct گزاشتین؟
من یک مدته c کار نکردم مطمینین نبایدخط 19 و26 این جوری باشه؟
*pSize = count * sizeof(struct TVec3D);
struct TVec3D * arrayVec3 = NULL;
و این که جدا یک مقدار پیچیدست من که نفهمیدم چی به چیه:لبخند:
کار این چیه؟!

(float **)&arrayVec3

Ananas
دوشنبه 04 دی 1391, 01:22 صبح
قضیه این public چیه که توی struct گزاشتین؟ نمی دونم ولی به نظرم قبلا نمی گذاشتم و متغیر هامو private می شناخت و در بعضی قسمت ها اجازه ی دسترسی نمی داد.


من یک مدته c کار نکردم مطمینین نبایدخط 19 و26 این جوری باشه؟
*pSize = count * sizeof(struct TVec3D);
struct TVec3D * arrayVec3 = NULL;
منظورت c هست یا C++‎‎‎‎ ؟
چیزی که نوشتم رو می دونم درسته ولی نمی دونم چیزی که شما نوشتید چطور عمل میکنه.


و این که جدا یک مقدار پیچیدست من که نفهمیدم چی به چیه:لبخند:

آره خوب باهات موافقم. بعد از اینکه نوشتم ظاهرشو نگاه کردم دیدم یک مقدار گیج کننده ست. ولی توضیح میدم:
ما یک متغیر از نوع اشاره گر داریم که ممکنه به هر جایی اشاره کنه و یا اصلا مقدارش باشه NULL. این آرایه ی ماست. حالا باید آدرس آرایه رو بدیم به تابع تا بتونه محتویاتشو تغییر بده. محتویاتش خودش یک آدرس هست که قراره اعداد اعشاری ما تو اون قسمت باشن. یعنی ما باید اشاره گر ای به اشاره گر رو بفرستیم به تابع. همونطور که می دونید ما برای این که یک حافظه بگیریم بدیم به اون، میایم از malloc استفاده میکنیم. حالا اگه بخوایم این حافظه گرفتن رو داخل یک تابعی انجام بدیم، آدرس اشاره گرمون رو به تابع میدیم تا نتیجه رو بریزه توی مکانی که آرایه مون قراره ذخیره شه (به شکل یک آدرس از اعداد اعشاری)، یعنی تابع، نتیجه (آدرس حافظه ی گرفته شده با malloc) رو بریزه تو مکانی که بهش گفتیم (اشاره گر به آرایه ای از اعداد اعشاری که با float ** نمایش میدیم). و همچنین سایزشو بریزه تو متغیر pSize. یعنی الان اگه همه جا بجای
float *
بنویسیم
PFLOAT
شاید یک مقدار بهتر بشه دید. در واقع ما آدرس PFLOAT خودمون (PFLOAT همون آرایه ای از float رو میگم) رو فرستادیم به تابع تا تابع هم حافظه ای رو که گرفته به عنوان یک آرهیه از اعداد float بریزه داخل متغیر PFLOAT ما.

کار این چیه؟!
1
(float **)&arrayVec3
من ابنجا آرایه ای از TVec3D که خودش دو تا float هست، رو تبدیل کردم به آرایه ای از float ولی چون آدرس یک آرایه او دارم تبدیل میکنم پس باید دو تا ستاره بگذارم تا اون رو تبدیل به آدرس آرایه ای از float کنم.

omidshaman
دوشنبه 04 دی 1391, 09:38 صبح
نمی دونم ولی به نظرم قبلا نمی گذاشتم و متغیر هامو private می شناخت و در بعضی قسمت ها اجازه ی دسترسی نمی داد.
فکر نمی کنم همچین چیزی امکان داشته باشه!

منظورت c هست یا C++‎‎‎‎‎‎‎‎‎‎ ؟
چیزی که نوشتم رو می دونم درسته ولی نمی دونم چیزی که شما نوشتید چطور عمل میکنه.
نه منظورم همونیه که گفتم
چیزی که شما نوشتین درسته به شرط این که توی فایل C++‎‎‎‎‎ بنویسین توی c حتما باید اون جوری باشه
و دلیلی هم نداره وقتی با new میشه کار کرد از اون malloc کرد!

#include<iostream>
using namespace std;
void CreateListOfVector(int *&a ,int Count)
{
a=new int[Count];
a[1]=4;
};

int main()
{
int *a;
CreateListOfVector(a,10);
cout<<a[1];
delete [] a;
return 0;
}

و این که من کد شما رو تست کردم درست نیست فکر نمی کنم این خطش درست باشه(کمپایل میشه ولی ارایه درست برنمی گرده!)

CreateListOfVector((float **)&arrayVec3, &size, 20);

smemamian
دوشنبه 04 دی 1391, 11:46 صبح
یکی از مزیت هایی که new نسبت به malloc داره این هست که نیاز به sizeof نداره !


*pSize = count * sizeof(TVec3D);
*pVec = (float *)malloc(*pSize);

khalkhal
دوشنبه 04 دی 1391, 12:34 عصر
سلام به تمام دوستان
یه را ساده اینکه شما یه ارایه به تابع میفرستی و بعد چون ارایه ها از نوع مرجع هستن (ادرس ارایه به تابع فرستاده می شود) پس شما هر بلایی سر ارایه بیاری بیرون از تابع اعمال میشود .

Ananas
دوشنبه 04 دی 1391, 15:55 عصر
و این که من کد شما رو تست کردم درست نیست فکر نمی کنم این خطش درست باشه(کمپایل میشه ولی ارایه درست برنمی گرده!)
1
CreateListOfVector((float **)&arrayVec3, &size, 20);


چطور تست کردید و چه نتیجه ای گرفتید که درست نیست؟ چرا من امتحان میکنم درسته؟ :

#pragma hdrstop
#pragma argsused

#include <tchar.h>
#include <stdio.h>
#include <iostream.h>

using namespace std;

struct TVEC3
{
public:
float x, y;
};

void * CreateArrayOfVec3(float ** pArray, size_t * pSize, int count)
{
*pSize = count * sizeof(TVEC3);
*pArray = (float *)malloc(*pSize);
for (int i = 0; i < count; i++)
{
((TVEC3 *)(*pArray))[i].x = i;
((TVEC3 *)(*pArray))[i].y = i * 3.0f;
}
return (void *)(*pArray);
};

int _tmain(int argc, _TCHAR* argv[])
{
TVEC3 * vec3s = NULL;
size_t size = 0;
CreateArrayOfVec3((float **)&vec3s, &size, 10);
for (int i = 0; i < 10; i++)
{
cout << vec3s[i].x << " " << vec3s[i].y << endl;
}
getchar();
return 0;
}





سلام به تمام دوستان
یه را ساده اینکه شما یه ارایه به تابع میفرستی و بعد چون ارایه ها از نوع مرجع هستن (ادرس ارایه به تابع فرستاده می شود) پس شما هر بلایی سر ارایه بیاری بیرون از تابع اعمال میشود .

سلام. بله درسته و روش من تقریبا مشابه روش شما عمل میکنه.

omidshaman
دوشنبه 04 دی 1391, 19:33 عصر
اره اشتباه از من بود کد شما درسته