PDA

View Full Version : سوال: نحوه نوشتن تابعي كه يك رشته را بر ميگرداند؟



one hacker alone
چهارشنبه 16 فروردین 1391, 00:55 صبح
سلام عزيزان
ما در فراخواني ها از روشي به نام فراخواني با ارجاع استفاده ميكرديم كه ادرس رو ميفرستاديم
من تابعي دارم كه يك رشته توليد ميكنه حالا الگوي اين تابع چجوري ميشه و توي برنامه چجوري ميتونم رشته توليد شده توسط اون تابع رو داخل يك رشته بريزم؟

jannatmakan
چهارشنبه 16 فروردین 1391, 02:52 صبح
سلام. خوب ... اگر تابعتون رو هم ارسال می کردید بهتر بود . چون مطمئن نیستم که سوالتون رو فهمیدم یا نه؟ ولی پیشاپیش یه حدس هایی می زنم.

خوب. اینطور که شما گفتید، تابع شما رشته ای رو تولید کرده . و شما می خواهید اون رشته رو به مثلاً یک پراسیجر دیگه یا به رشته ای که داخل main تعریف کردید. منتقل بشه.

1- یک راهش که استفاده از متغیرهای سراسری یا همون Global هست. که در تمام طول اجرای برنامه و در تمام توابع ، ثابت و پابرجاست.

2- یک راه دیگش که احتیاج به متغیر سراسری نداره اینه که شما یک آرگومان دیگه از نوع رشته به تابعتون اضافه کنید. که کار اون انتقالِ رشته ی تولید شده توسط تابع به جایی دیگر است.

به عنوان مثال، اگر نام آرگومان اضافه شده STRTF و نام رشته ی تولید شده توسط تابع، yourstr باشد، این گونه می توان عمل کرد:


void your_function(arg1 , arg2 , .... , STRTF)
{
your code
.
.
.
STRTF=yourstr;
}

int main()
{
string newstr;
یا
char newstr[100];

your_function(arg1,arg2,... , newstr);

getch();
return 0;
}


نتیجه ی شبه کد بالا این است که مقدار تولید شده توسط کاربر ، به وسیله ی آرگومان STRTF به newstr موجود در main منتقل می شود.

one hacker alone
چهارشنبه 16 فروردین 1391, 15:04 عصر
ممنون از راهنماييتون اين چيزي هم كه شما گفتين ميشه و اين به ذهنم نرسيد اما دنبال يه روش ديگه هستم نميخوام از اين روش استفاده كنم
ببينيد به عنوان مثال تابع زير رو در نظر بگيريد

void f()
{
cahr *str;
*str="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
}
main()
{
cahr *s;
.....
cout<<s;
return 0;
}

ببينيد تابع من هيچ ورودي نداره اما داخل خودش قراره ي رشته توليد كنه كه هر سري طولش متفاوت هست حالا چجوري ميتونم اين رشته رو به main بفرستم و بريزم توي s تا جايي كه ميدونم بايد با اشاره گر ها كار رو انجام بديم اما يادم نمونده اين كار رو چجوري انجام ميداديم

Ananas
چهارشنبه 16 فروردین 1391, 22:00 عصر
سلام.
شما یک اشاره گر به ابتدای رشته بساز و به خروجی تابع ببر بعد هر کجا که از این اشاره گر استفاده کنی موقع خوندن اطلاعات طول رشته رو با رسیدن به کاراکتر NULL خودش پیدا میکنه. اگه کاراکتر ها رو یکی یکی خودت تو یک آرایه میریزی کاراکتر NULL رو هم خودت دستی به آخر آرایه اضافه کن. کاراکتر NULL رو تو گیومه هم میتونی بنویسی به این شکل :
"\0"

jannatmakan
پنج شنبه 17 فروردین 1391, 01:45 صبح
اه اه . راست می گی ها .
آقا انصافاً این راه حلّت خیلی باحال بود.:متفکر:

one hacker alone
پنج شنبه 17 فروردین 1391, 19:54 عصر
سلام.
شما یک اشاره گر به ابتدای رشته بساز و به خروجی تابع ببر بعد هر کجا که از این اشاره گر استفاده کنی موقع خوندن اطلاعات طول رشته رو با رسیدن به کاراکتر NULL خودش پیدا میکنه. اگه کاراکتر ها رو یکی یکی خودت تو یک آرایه میریزی کاراکتر NULL رو هم خودت دستی به آخر آرایه اضافه کن. کاراکتر NULL رو تو گیومه هم میتونی بنویسی به این شکل :
"\0"

منظورتون رو میدونم اما این اشاره گر رو داخل تابع تعریف میکنم و رشته ای که تولید میشه رو توی اون میریزم اما چجوری تو main استفاده کنم ؟
میشه یه مثال خیلی ساده بزنین ممنون
این چیزی که شما میگین من به اشکال مختلف امتحان کردم اما وقتی می خوام چاپ کنم برنامه هنگ میکنه

Ananas
پنج شنبه 17 فروردین 1391, 20:56 عصر
میشه یه مثال خیلی ساده بزنین ممنونچرا که نه :

#include <iostream>
using namespace std;

char * f()
{
char *str;
str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
return str;
}

main()
{
char *s = f();
cout << s;
getchar();
return 0;
}


این چیزی که شما میگین من به اشکال مختلف امتحان کردم اما وقتی می خوام چاپ کنم برنامه هنگ میکنهمن کد شما رو تغییر دادم و به شکل بالا نوشتم. اشکال کد شما این بود که برای تابع f عبارت return نوشته بودین و اینجا
*str="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
نباید ستاره بگذارید. و دیگه اینکه اگه از char * قبل از تابع f استفاده نمیکنید باید اینجا :
void f()
بعد از void ستاره بگذارید و تو تبدیل void * به اشاره گر کاراکتر به این شکل استفاده کنید :

#include <iostream>
using namespace std;

void *f()
{
char *str;
str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
return (void *) str;
}

main()
{
char *s = (char *)f();
cout << s;
getchar();
return 0;
}