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

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

اوبونتو ۲۴٫۰۴ با پشتیبانی بلند مدّت (۱۲ سال) منتشر شد 🎉

نویسنده موضوع: برگرداندن چندین مقدار ( حل شد )  (دفعات بازدید: 839 بار)

0 کاربر و 2 مهمان درحال مشاهده موضوع.

آفلاین Aminavy-r

  • Jr. Member
  • *
  • ارسال: 55
  • جنسیت : پسر
پاسخ : برگرداندن چندین مقدار
« پاسخ #15 : 31 تیر 1403، 10:52 ق‌ظ »
البته اگه همه چیزایی که می خوای نتیجه اون عملیاتی که تابع انجام میده از یه نوع باشن، می تونی از یه اشاره‌گر یا آرایه استفاده کنی.
باید هواست به جایی که اون مقدار ها نگهداری میشن هم باشه (علاوه بر تعریف).

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

آفلاین learner:~$

  • Hero Member
  • *
  • ارسال: 798
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
پاسخ : برگرداندن چندین مقدار
« پاسخ #16 : 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

  • Jr. Member
  • *
  • ارسال: 55
  • جنسیت : پسر
پاسخ : برگرداندن چندین مقدار
« پاسخ #17 : 01 امرداد 1403، 08:28 ق‌ظ »
بالاخره منظورت اشاره‌گر به تابع توی ساختار هست یا یه تابع داری که چند تا نتیجه داره؟
این چیزی که نوشتی، عملا کار خاصی رو انجام نمیده که یه اشاره‌گر توی ساختار داشته باشه.
منظور من این بود که اگه مثلا تابعی داری که دو تا مقدار رو به عنوان نتیجه داره و اونا هم از یه نوع هستن می تونی از اشاره‌گر بهشون استفاده کنی.

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

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

آفلاین nixoeen

  • ناظر انجمن
  • *
  • ارسال: 4838
  • جنسیت : پسر
  • masoft قدیم
پاسخ : برگرداندن چندین مقدار
« پاسخ #18 : 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:~$

  • Hero Member
  • *
  • ارسال: 798
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
پاسخ : برگرداندن چندین مقدار
« پاسخ #19 : 02 امرداد 1403، 02:01 ب‌ظ »
خب دوستان ممنونم از راهنمایی همتون مشکلم برطرف شد.
از همه متشکرم:)
مثل سمی کالونم( ; ).
خواستار پایان.
محکوم به کامپایل.

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5118
  • جنسیت : پسر
پاسخ : برگرداندن چندین مقدار ( حل شد )
« پاسخ #20 : 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:~$

  • Hero Member
  • *
  • ارسال: 798
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
پاسخ : برگرداندن چندین مقدار ( حل شد )
« پاسخ #21 : 06 شهریور 1403، 09:51 ب‌ظ »
درود
من تونستم چندین مقدار برگردونم.
الان دارم به مفاهیم جدیدی پی میبرم. مثل استفاده از متد ها در زبان سی. و یا چیزی شبیه شئی گرایی.
الان دارم روی یک مفهوم جدید کار میکنم.
آرایه ایی از متد ها یا آرایه ایی از توابع.
مثل سمی کالونم( ; ).
خواستار پایان.
محکوم به کامپایل.

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5118
  • جنسیت : پسر
پاسخ : برگرداندن چندین مقدار ( حل شد )
« پاسخ #22 : 06 شهریور 1403، 10:37 ب‌ظ »
توی جوابی که بالاتر فرستادم، باید بررسی کرد malloc مقدار NULL برنگردونه. این برنامه چنین کاری انجام نمیده و ممکنه با اجرای برنامه یه Segmentation fault قشنگ ببینید. البته از اونجایی که malloc حافظه خیلی کمی درخواست می‌کنه، احتمال این اتفاق خیلی خیلی کمه.

درود
من تونستم چندین مقدار برگردونم.
الان دارم به مفاهیم جدیدی پی میبرم. مثل استفاده از متد ها در زبان سی. و یا چیزی شبیه شئی گرایی.
الان دارم روی یک مفهوم جدید کار میکنم.
آرایه ایی از متد ها یا آرایه ایی از توابع.
یه struct از توابع، بیشتر به کار میره. یه عملکردی شبیه به شیئ گرایی توی بقیه زبان‌ها داره.
میدونید که زکات علم نشر آن است

آفلاین nixoeen

  • ناظر انجمن
  • *
  • ارسال: 4838
  • جنسیت : پسر
  • masoft قدیم
پاسخ : برگرداندن چندین مقدار ( حل شد )
« پاسخ #23 : 07 شهریور 1403، 04:15 ب‌ظ »
یه تابع بنویسید که اول حافظه‌ای برای ذخیره کردن ۲ تا عدد اختصاص میده.
عموما این ایدهٔ خوبی نیست که یک تابع خودش فضا رو اختصاص بده و رهاش بکنه. در اکثر موارد باعث Memory Leak میشه (مثل کدی که نوشتید). بهتره همیشه فضا توی یک تابع اول ایجاد بشه، بعد آدرس اون فضا به تابع دوم داده بشه. وقتی تابع اول کارش با اون فضای اختصاص‌داده‌شده تموم شد، اون فضا توی تابع اول آزاد بشه.

آفلاین esmaeelE

  • ناظر انجمن
  • *
  • ارسال: 1239
  • جنسیت : پسر
پاسخ : برگرداندن چندین مقدار ( حل شد )
« پاسخ #24 : 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

« آخرین ویرایش: 08 شهریور 1403، 12:08 ب‌ظ توسط esmaeelE »