انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: learner:~$ در 30 تیر 1403، 12:55 ب‌ظ

عنوان: برگرداندن چندین مقدار ( حل شد )
ارسال شده توسط: learner:~$ در 30 تیر 1403، 12:55 ب‌ظ
درود

میخوام یک تابع (‌به زبان سی ) بنویسم که یک شعاع دریافت بکنه و محیط و مساحت دایره رو برگردونه. بیشتر چیزی شبیه به تاپل ها نیاز دارم.
هیچ راهی وجود نداره که اینکار رو بکنم؟ یا با ارجاع؟ یا اصلا میتونم یک مقدار رو به متغیری که میخوام برگردونم؟ با ساختار ها نمیشه اینکار رو کرد؟
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 30 تیر 1403، 12:57 ب‌ظ
برای برگردوندن چندین مقدار باید از اشاره‌گرها استفاده کنی.
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: learner:~$ در 30 تیر 1403، 01:27 ب‌ظ
برای برگردوندن چندین مقدار باید از اشاره‌گرها استفاده کنی.
خب چطور؟؟  اگه بخوام یه  ساختمان اشاره گر برگردونم چطور؟
یک راه موقت پیدا کردم ولی اصلا بدرد نمیخوره و خیلی بده
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 30 تیر 1403، 01:42 ب‌ظ

void fun(int *px, *py)
{
*px=10;
*py=2;
}

main()
{
int x, y;

fun(&x, &y);

printf("%d %d", x, y);
}


نقل‌قول
اگه بخوام یه  ساختمان اشاره گر برگردونم چطور؟
باید نوع اون ساختمانو به صورت سراسری تعریف کنی بعد نام اونو که خودش یک اشاره گر هستو برگردونی.
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: learner:~$ در 30 تیر 1403، 01:48 ب‌ظ

void fun(int *px, *py)
{
*px=10;
*py=2;
}

main()
{
int x, y;

fun(&x, &y);

printf("%d %d", x, y);
}


نقل‌قول
اگه بخوام یه  ساختمان اشاره گر برگردونم چطور؟

واقعا همین چیزی منظورم نبود اینطوری که نمیتونم هم محیط رو برگردونم هم مساحت ( به یک متغیر )‌
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 30 تیر 1403، 01:50 ب‌ظ
نقل‌قول
واقعا همین چیزی منظورم نبود اینطوری که نمیتونم هم محیط رو برگردونم هم مساحت ( به یک متغیر
یعنی یک متغیر در یک زمان دو مقدارو داشته باشه؟! نمیشه که.
منظورتو نمیفهمم.
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: learner:~$ در 30 تیر 1403، 02:20 ب‌ظ
منظورم همچین چیزیه:‌
#include <stdio.h>
int main()
{

}
float p_and_s(float* R )
{
    float PI = 3.14;
    float S = PI * *R * *R;
    float P = 2 * PI * *R;
    // return S, P?
}


توی راست میشه اینکار رو کرد و حتی پایتون ولی توی سی مطمئن نیستم چطوری( به تابع توجه کنید )‌
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: esmaeelE در 30 تیر 1403، 02:59 ب‌ظ
دو راه دارید.

۱. ساده‌ترین کار استفاده از ساختار struct با دو مقدار
۲. استفاده از امکانات اشاره‌گر برای پیاده‌سازی pass by reference (ارسال آدرس متغیر به تابع دیگر)


https://stackoverflow.com/a/2620158/7508077
https://stackoverflow.com/a/2229510/7508077

عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 30 تیر 1403، 04:56 ب‌ظ
// return S, P?این نمیشه.

.....
float PI = 3.14;این میشه ولی چون عدد پی همیشه ثابته یا تا دورقم اعشارشو define کن یا تا چندین رقم اعشارش به صورت شاخص شده در math.h هست.  یا ته تهش به صورت متغیر غیرقابل تغیر تعریفش کن. یه const بزار اولش.

.....
درضمن همه‌ی این تابع ها در math.h هست البته با عدد پی ۱۵ رقم اعشار و چون توابع خیلی ساده ای هستند خودت دیگه تاحالا هزار بار نوشتیشون پس از توابع کتابخانه ای اون استفاده کن و در زمان کامپایل یه lm- هم جلویی gcc بزار
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: learner:~$ در 30 تیر 1403، 05:48 ب‌ظ
هیچ کدومش رو درک نمیکنم چون کاربردی نداره.  اشاره گر به تابع؟‌نه فکر کنم زیادی از این زبان انتظار دارم و این درست نیست. اگر میتونستم تاپل هارو پیاده سازی کنم عالی میشد. به نظرم راحت ترین راه استفاده از متعیر های عمومی و خارج اسکوپ هست که این زیاد روش جالبی نیست.
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: Stewart در 30 تیر 1403، 06:41 ب‌ظ
هیچ کدومش رو درک نمیکنم چون کاربردی نداره.  اشاره گر به تابع؟‌نه فکر کنم زیادی از این زبان انتظار دارم و این درست نیست. اگر میتونستم تاپل هارو پیاده سازی کنم عالی میشد. به نظرم راحت ترین راه استفاده از متعیر های عمومی و خارج اسکوپ هست که این زیاد روش جالبی نیست.
بنظرم راه حل pointer که خیلی خوبه :D
با این حال اگه میخوای میتونم برات یه دوره ++C جامع بفرستم که شاید دیدنش خیلی کمکت کنه.
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: جادی در 31 تیر 1403، 09:00 ق‌ظ
هیچ کدومش رو درک نمیکنم چون کاربردی نداره.  اشاره گر به تابع؟‌نه فکر کنم زیادی از این زبان انتظار دارم و این درست نیست. اگر میتونستم تاپل هارو پیاده سازی کنم عالی میشد. به نظرم راحت ترین راه استفاده از متعیر های عمومی و خارج اسکوپ هست که این زیاد روش جالبی نیست.

بچه ها یکی دو بار جواب درست رو دادن: استفاده از struct. حالا اینکه بگی درک نمی کنی چون کاربرد نداره خب یعنی نمی خوای سی یاد بگیری (: مساله اینه که الان پایتون بلدی و انتظار داری سی مثل پایتون کار کنه. اگر علاقمندی سی یاد بگیری با حوصله استراکت رو بخون.
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: learner:~$ در 31 تیر 1403، 09:50 ق‌ظ
من هیچوقت با زبان  پایتون حال نکردم هرکس به یک چیز علاقه دارد و تنها دو دلیل برای یاد گرفتن پایتون در سطح مبتدی داشتم:‌
۱:‌گسترش دانش خودم.
۲: استفاده از کتابخانه ریکوئست و اسکپی .

من هیچوقت از یادگیری فرار نکردم مخصوصا زبان سی!
دوستان یافتم! ممنون از لینکی که در اختیار بنده دادید.
#include <stdio.h>
void sum_and_product(int a, int b, int* sum, int* product);
int main()
{

    int sum, product, a = 5, b = 2;
    sum_and_product(a, b, &sum, &product);
    printf("sum:%d\tproduct:%d\n", sum, product);

    return 0;
}
void sum_and_product(int a, int b, int* sum, int* product)
{
    *sum = a + b;
    *product = a * b;
}

از زبان سی پلاس پلاس متنفرم تنفری که نسبت به سی پلاس پلاس دارم از پایتون بیشتره.
من کلیات این زبان رو یاد گرفتم و الان وقته جزئیات هست.
دوستان میدونم ربطی به تاپیک نداره  ولی میتونم از توابع اشاره گر در ساختار ها استفاده کنم؟
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 31 تیر 1403، 10:19 ق‌ظ
نقل‌قول
دوستان یافتم!
همون اشاره‌گر دیگه.
نقل‌قول
میتونم از توابع اشاره گر در ساختار ها استفاده کنم؟
یعنی چجوری؟
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: learner:~$ در 31 تیر 1403، 10:33 ق‌ظ
یک همچین چیزی:

https://www.codeproject.com/Tips/800474/Function-Pointer-in-C-Struct
 (https://www.codeproject.com/Tips/800474/Function-Pointer-in-C-Struct)
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: Aminavy-r در 31 تیر 1403، 10:52 ق‌ظ
البته اگه همه چیزایی که می خوای نتیجه اون عملیاتی که تابع انجام میده از یه نوع باشن، می تونی از یه اشاره‌گر یا آرایه استفاده کنی.
باید هواست به جایی که اون مقدار ها نگهداری میشن هم باشه (علاوه بر تعریف).

اگه زبان (از نظر نحوی) کامل یاد گرفته باشی،‌ دیگه چیز دیگه‌ای نیست که سی در اختیارت بزاره،‌بقیه رو باید خودت یه جوری پیاده کنی.
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: learner:~$ در 31 تیر 1403، 11:01 ق‌ظ
البته اگه همه چیزایی که می خوای نتیجه اون عملیاتی که تابع انجام میده از یه نوع باشن، می تونی از یه اشاره‌گر یا آرایه استفاده کنی.
باید هواست به جایی که اون مقدار ها نگهداری میشن هم باشه (علاوه بر تعریف).

اگه زبان (از نظر نحوی) کامل یاد گرفته باشی،‌ دیگه چیز دیگه‌ای نیست که سی در اختیارت بزاره،‌بقیه رو باید خودت یه جوری پیاده کنی.
ممنون الان اینطوری خوبه؟‌
   int (*funcPtr)(int);
   

   struct FunctionHolder {
       int (*funcPtr)(int);
   };
   

   int addOne(int x) {
       return x + 1;
   }

   struct FunctionHolder holder;
   holder.funcPtr = addOne;
   

   int result = holder.funcPtr(5);  // This will call addOne(5) and store the result in 'result'
   

عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: Aminavy-r در 01 امرداد 1403، 08:28 ق‌ظ
بالاخره منظورت اشاره‌گر به تابع توی ساختار هست یا یه تابع داری که چند تا نتیجه داره؟
این چیزی که نوشتی، عملا کار خاصی رو انجام نمیده که یه اشاره‌گر توی ساختار داشته باشه.
منظور من این بود که اگه مثلا تابعی داری که دو تا مقدار رو به عنوان نتیجه داره و اونا هم از یه نوع هستن می تونی از اشاره‌گر بهشون استفاده کنی.

مثلا تابعی رو داریم که a رو می گیره و b و c رو به عنوان نتیجه اون عملیات تابع در نظر می گیریم:
void func(int *a)
{
*a = a/2;
*(a+1) = a%2;
}

برای فراخوانی این تابع باید  اشاره‌گری به دو تا int (منظورم اینه که باید به اندازه دو تا int حافظه بهش بدی) رو به عنوان آرگومان به تابع بدی. یا می تونی از آرایه استفاده کنی (آدرس عنصر اول).
ولی اگه از یه نوع نباشن باید از ساختار استفاده کنی (ترجیحا اشاره‌گر به ساختار، نه اشاره‌گر داخل ساختار)
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: nixoeen در 02 امرداد 1403، 01:41 ب‌ظ
راحت‌ترین روش احتمالا اینه:

void test(int *a, int *b)
{
  *a = 1;
  *b = 2;
}
int main()
{
  int a,b;
  test(&a, &b);
  printf("%d %d\n", a, b);
}
عنوان: پاسخ : برگرداندن چندین مقدار
ارسال شده توسط: learner:~$ در 02 امرداد 1403، 02:01 ب‌ظ
خب دوستان ممنونم از راهنمایی همتون مشکلم برطرف شد.
از همه متشکرم:)
عنوان: پاسخ : برگرداندن چندین مقدار ( حل شد )
ارسال شده توسط: Dragon- در 06 شهریور 1403، 09:00 ب‌ظ
یکم دیر جواب میدم ولی اینطوری هم می‌تونید انجامش بدید:
یه تابع بنویسید که اول حافظه‌ای برای ذخیره کردن ۲ تا عدد اختصاص میده. اون جایی که برای عدد اول هست رو با مقدار مساحت پر می‌کنه و جای دوم رو با محیط محاسبه شده. بعد این اشاره‌گر رو بر‌می‌گردونه.
این هم کدش:
#include <stdio.h>
#include <stdlib.h>

double *circle_parameters(const double r);

int main(void)
{

        double *a = circle_parameters(5);

        printf("A = %f\t P =%f\n", a[0], a[1]);

        return 0;
}


double *circle_parameters(const double r)
{

        double *ret = malloc(2 * sizeof(double));
        ret[0] = 3.14 * r * r; // Area
        ret[1] = 2 * 3.14 * r; // Perimeter

        return ret;
}

ولی با این حال استفاده از structure‌ها بهتر به نظر میاد.
عنوان: پاسخ : برگرداندن چندین مقدار ( حل شد )
ارسال شده توسط: learner:~$ در 06 شهریور 1403، 09:51 ب‌ظ
درود
من تونستم چندین مقدار برگردونم.
الان دارم به مفاهیم جدیدی پی میبرم. مثل استفاده از متد ها در زبان سی. و یا چیزی شبیه شئی گرایی.
الان دارم روی یک مفهوم جدید کار میکنم.
آرایه ایی از متد ها یا آرایه ایی از توابع.
عنوان: پاسخ : برگرداندن چندین مقدار ( حل شد )
ارسال شده توسط: Dragon- در 06 شهریور 1403، 10:37 ب‌ظ
توی جوابی که بالاتر فرستادم، باید بررسی کرد malloc مقدار NULL برنگردونه. این برنامه چنین کاری انجام نمیده و ممکنه با اجرای برنامه یه Segmentation fault قشنگ ببینید. البته از اونجایی که malloc حافظه خیلی کمی درخواست می‌کنه، احتمال این اتفاق خیلی خیلی کمه.

درود
من تونستم چندین مقدار برگردونم.
الان دارم به مفاهیم جدیدی پی میبرم. مثل استفاده از متد ها در زبان سی. و یا چیزی شبیه شئی گرایی.
الان دارم روی یک مفهوم جدید کار میکنم.
آرایه ایی از متد ها یا آرایه ایی از توابع.
یه struct از توابع، بیشتر به کار میره. یه عملکردی شبیه به شیئ گرایی توی بقیه زبان‌ها داره.
عنوان: پاسخ : برگرداندن چندین مقدار ( حل شد )
ارسال شده توسط: nixoeen در 07 شهریور 1403، 04:15 ب‌ظ
یه تابع بنویسید که اول حافظه‌ای برای ذخیره کردن ۲ تا عدد اختصاص میده.
عموما این ایدهٔ خوبی نیست که یک تابع خودش فضا رو اختصاص بده و رهاش بکنه. در اکثر موارد باعث Memory Leak میشه (مثل کدی که نوشتید). بهتره همیشه فضا توی یک تابع اول ایجاد بشه، بعد آدرس اون فضا به تابع دوم داده بشه. وقتی تابع اول کارش با اون فضای اختصاص‌داده‌شده تموم شد، اون فضا توی تابع اول آزاد بشه.
عنوان: پاسخ : برگرداندن چندین مقدار ( حل شد )
ارسال شده توسط: esmaeelE در 07 شهریور 1403، 11:45 ب‌ظ
از این روش هم می‌تونید استفاده کنید.

یک متغیر از نوع ساختاری به نام Circle تعریف می‌کنید و نامش را c1 می‌گذارید.

و دادهٔ شعاع دایره را درون آن ذخیره می‌کنید.

* در اینجا c1 متغیری است از جنس Circle
* خود Circle یک ساختار(Structure) است. این نوع دارای سه قلم داده است.

سپس متغیر c1 را به تابع محاسبه‌گر calculate ارسال می‌کنید.
محاسبات را در تابع انجام می‌دهید و c1 را که به تابع ارسال کردید پر می‌کنید.
در پایان متغیر c1 را از تابع برمی‌گردانید و در تابع صدا زننده main از اون استفاده می‌کنید.

البته می‌شد با استفاده از فراخوانی با ارجاع و کاربرد اشاره‌گرها حافظه را بهتر مدیریت کرد(به جای خود متغیر اشاره‌گر به اون رو ارسال کرد) ولی در اینجا همین شیوه برای توضیح مناسبه.


#include <stdio.h>
#define PI 3.14f /* Define the value of pie */

typedef struct Circle {
    double RADIOUS;
    double ARIA;
    double PERIMETER;
} Circle;


Circle calculate(Circle c){
    c.ARIA = PI * c.RADIOUS * c.RADIOUS;
    c.PERIMETER = 2 * PI * c.RADIOUS;
    return c;
}


int main(void) {

    double radius=0;

    /* Taking input of the radious of the circle from the user */
    printf("Enter radius of the Circle:\n");
    scanf("%lf", &radius);

    Circle c1;
    c1.RADIOUS=radius;

    // call a function, pass structure, return structure
    c1 = calculate(c1);

    printf("Perimeter: %0.4lf\n", c1.PERIMETER);
    printf("Area: %0.4lf\n", c1.ARIA);

    return 0;
}



اجرا
clang -Wall run.c -o run
./run

عنوان: پاسخ : برگرداندن چندین مقدار ( حل شد )
ارسال شده توسط: learner:~$ در 19 شهریور 1403، 06:42 ب‌ظ
یه تابع بنویسید که اول حافظه‌ای برای ذخیره کردن ۲ تا عدد اختصاص میده.
عموما این ایدهٔ خوبی نیست که یک تابع خودش فضا رو اختصاص بده و رهاش بکنه. در اکثر موارد باعث Memory Leak میشه (مثل کدی که نوشتید). بهتره همیشه فضا توی یک تابع اول ایجاد بشه، بعد آدرس اون فضا به تابع دوم داده بشه. وقتی تابع اول کارش با اون فضای اختصاص‌داده‌شده تموم شد، اون فضا توی تابع اول آزاد بشه.
من یکم تحقیق کردم و فهمیدم میشه اینکار رو کرد ولی برای آرایه ها.
و صدا زننده حتما باید بعد از استفاده از تابع اون رو آزاد بکنه. خیلی زیبا و کاربردی :)
عنوان: پاسخ : برگرداندن چندین مقدار ( حل شد )
ارسال شده توسط: nixoeen در 19 شهریور 1403، 08:22 ب‌ظ
من یکم تحقیق کردم و فهمیدم میشه اینکار رو کرد ولی برای آرایه ها.
برای همه‌چیز میشه اینکار رو کرد، ولی همینطور که گفتم، ایدهٔ خوبی نیست.
عنوان: پاسخ : برگرداندن چندین مقدار ( حل شد )
ارسال شده توسط: learner:~$ در 19 شهریور 1403، 08:47 ب‌ظ
من یکم تحقیق کردم و فهمیدم میشه اینکار رو کرد ولی برای آرایه ها.
برای همه‌چیز میشه اینکار رو کرد، ولی همینطور که گفتم، ایدهٔ خوبی نیست.
خب پس روش بهتر چیه؟؟
چطور میتیونیم یک مقداری که در یک تابع برای اون حافظه تخصیص کردیم رو برگردونیم؟ یا چطور میتونیم یک مقدار خیلی بزرگ رو برگردونیم؟ منظورم از بزرگ چیزی بیشتر long long unsigned int یا همچین چیزی.
عنوان: پاسخ : برگرداندن چندین مقدار ( حل شد )
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 19 شهریور 1403، 08:51 ب‌ظ
نقل‌قول
منظورم از بزرگ چیزی بیشتر long long unsigned int یا همچین چیزی.
unsigned را باید بزاری قبل همشون.