برای برگردوندن چندین مقدار باید از اشارهگرها استفاده کنی.خب چطور؟؟ اگه بخوام یه ساختمان اشاره گر برگردونم چطور؟
void fun(int *px, *py)
{
*px=10;
*py=2;
}
main()
{
int x, y;
fun(&x, &y);
printf("%d %d", x, y);
}
اگه بخوام یه ساختمان اشاره گر برگردونم چطور؟باید نوع اون ساختمانو به صورت سراسری تعریف کنی بعد نام اونو که خودش یک اشاره گر هستو برگردونی.
واقعا همین چیزی منظورم نبود اینطوری که نمیتونم هم محیط رو برگردونم هم مساحت ( به یک متغیر )کد: [انتخاب]
void fun(int *px, *py)
{
*px=10;
*py=2;
}
main()
{
int x, y;
fun(&x, &y);
printf("%d %d", x, y);
}نقلقولاگه بخوام یه ساختمان اشاره گر برگردونم چطور؟
واقعا همین چیزی منظورم نبود اینطوری که نمیتونم هم محیط رو برگردونم هم مساحت ( به یک متغیریعنی یک متغیر در یک زمان دو مقدارو داشته باشه؟! نمیشه که.
#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?
}
توی راست میشه اینکار رو کرد و حتی پایتون ولی توی سی مطمئن نیستم چطوری( به تابع توجه کنید )
// return S, P?
این نمیشه.float PI = 3.14;
این میشه ولی چون عدد پی همیشه ثابته یا تا دورقم اعشارشو define کن یا تا چندین رقم اعشارش به صورت شاخص شده در math.h هست. یا ته تهش به صورت متغیر غیرقابل تغیر تعریفش کن. یه const بزار اولش.هیچ کدومش رو درک نمیکنم چون کاربردی نداره. اشاره گر به تابع؟نه فکر کنم زیادی از این زبان انتظار دارم و این درست نیست. اگر میتونستم تاپل هارو پیاده سازی کنم عالی میشد. به نظرم راحت ترین راه استفاده از متعیر های عمومی و خارج اسکوپ هست که این زیاد روش جالبی نیست.بنظرم راه حل pointer که خیلی خوبه :D
هیچ کدومش رو درک نمیکنم چون کاربردی نداره. اشاره گر به تابع؟نه فکر کنم زیادی از این زبان انتظار دارم و این درست نیست. اگر میتونستم تاپل هارو پیاده سازی کنم عالی میشد. به نظرم راحت ترین راه استفاده از متعیر های عمومی و خارج اسکوپ هست که این زیاد روش جالبی نیست.
#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;
}
از زبان سی پلاس پلاس متنفرم تنفری که نسبت به سی پلاس پلاس دارم از پایتون بیشتره.دوستان یافتم!همون اشارهگر دیگه.
میتونم از توابع اشاره گر در ساختار ها استفاده کنم؟یعنی چجوری؟
البته اگه همه چیزایی که می خوای نتیجه اون عملیاتی که تابع انجام میده از یه نوع باشن، می تونی از یه اشارهگر یا آرایه استفاده کنی.ممنون الان اینطوری خوبه؟
باید هواست به جایی که اون مقدار ها نگهداری میشن هم باشه (علاوه بر تعریف).
اگه زبان (از نظر نحوی) کامل یاد گرفته باشی، دیگه چیز دیگهای نیست که سی در اختیارت بزاره،بقیه رو باید خودت یه جوری پیاده کنی.
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'
void func(int *a)
{
*a = a/2;
*(a+1) = a%2;
}
void test(int *a, int *b)
{
*a = 1;
*b = 2;
}
int main()
{
int a,b;
test(&a, &b);
printf("%d %d\n", a, b);
}
#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;
}
درودیه struct از توابع، بیشتر به کار میره. یه عملکردی شبیه به شیئ گرایی توی بقیه زبانها داره.
من تونستم چندین مقدار برگردونم.
الان دارم به مفاهیم جدیدی پی میبرم. مثل استفاده از متد ها در زبان سی. و یا چیزی شبیه شئی گرایی.
الان دارم روی یک مفهوم جدید کار میکنم.
آرایه ایی از متد ها یا آرایه ایی از توابع.
یه تابع بنویسید که اول حافظهای برای ذخیره کردن ۲ تا عدد اختصاص میده.عموما این ایدهٔ خوبی نیست که یک تابع خودش فضا رو اختصاص بده و رهاش بکنه. در اکثر موارد باعث Memory Leak میشه (مثل کدی که نوشتید). بهتره همیشه فضا توی یک تابع اول ایجاد بشه، بعد آدرس اون فضا به تابع دوم داده بشه. وقتی تابع اول کارش با اون فضای اختصاصدادهشده تموم شد، اون فضا توی تابع اول آزاد بشه.
#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
من یکم تحقیق کردم و فهمیدم میشه اینکار رو کرد ولی برای آرایه ها.یه تابع بنویسید که اول حافظهای برای ذخیره کردن ۲ تا عدد اختصاص میده.عموما این ایدهٔ خوبی نیست که یک تابع خودش فضا رو اختصاص بده و رهاش بکنه. در اکثر موارد باعث Memory Leak میشه (مثل کدی که نوشتید). بهتره همیشه فضا توی یک تابع اول ایجاد بشه، بعد آدرس اون فضا به تابع دوم داده بشه. وقتی تابع اول کارش با اون فضای اختصاصدادهشده تموم شد، اون فضا توی تابع اول آزاد بشه.
من یکم تحقیق کردم و فهمیدم میشه اینکار رو کرد ولی برای آرایه ها.برای همهچیز میشه اینکار رو کرد، ولی همینطور که گفتم، ایدهٔ خوبی نیست.
خب پس روش بهتر چیه؟؟من یکم تحقیق کردم و فهمیدم میشه اینکار رو کرد ولی برای آرایه ها.برای همهچیز میشه اینکار رو کرد، ولی همینطور که گفتم، ایدهٔ خوبی نیست.
منظورم از بزرگ چیزی بیشتر long long unsigned int یا همچین چیزی.unsigned را باید بزاری قبل همشون.