the_king
مدیرکل انجمن
مقدار بازگشتی تابع همیشه یک مقدار بازگشتی ئه، نه چند مقدار بازگشتی. اما مقدار بازگشتی می تونه آدرس یک موقعیت از حافظه باشه که در اون موقعیت چند مقدار قرار بگیره،با سلام مجدد و تشکر از جناب آقای علی سعید
مهندس آیا امکان برگرداندن دو مقدار و یا بیشتر در یک فایل dll وجود دارد؟
چگونه و به چه ترتیب متغیرها باز میگردن؟
مثلا یک آرایه باشه، یک struct باشه و ... در زبانهایی مثل C++ / C که مدیریت حافظه در دست برنامه نویسه، خیلی راحت میشه از یک تابع چند مقدار دریافت کرد، اما
به این نکته توجه کنید که اگر دارید DLL می سازید :
اولا زبانی که از این DLL استفاده می کنه مهمه، روش های برگرداندن چندین مقدار از تابع زیاده اما همه زبان ها اشاره گر و مدیریت حافظه انعطاف پذیر ندارند و در
بعضی زبان ها نمیشه از هر روشی استفاده کرد.
ثانیا FreeLibrary حافظه ای که در DLL استفاده میشه آزاد می کنه، اگر هنوز به مقداری که حافظه اش در DLL تخصیص داده شده نیاز دارید FreeLibrary رو اونجا اجرا نکنید.
جایی اجراش کنید که دیگه به مقدار ها نیازی نیست.
روش اول
در داخل تابع :
1) در داخل تابع یک حافظه ای به اندازه مورد نیاز ایجاد کنید.
2) مقدار های دلخواه رو در اون حافظه قرار دهید.
3) آدرس اون حافظه رو از تابع برگردونید.
در جایی که تابع رو فراخوانی کرده اید :
1) آدرس حافظه رو از تابع تحویل بگیرید.
2) از مقادیری که در اون آدرس حافظه هست هر طور که مایلید استفاده کنید.
3) حافظه مورد نظر رو آزاد کنید.
کد:
#include <iostream>
#include <conio.h>
using namespace std;
int *MyFunction()
{
int *p = new int[3];
p[0] = 123;
p[1] = 456;
p[2] = 789;
return p;
}
int main()
{
int *x = MyFunction();
int a = x[0];
int b = x[1];
int c = x[2];
cout << a << endl << b << endl << c << endl;
delete[] x;
getch();
return 0;
}
روش دوم
در داخل تابع :
1) آدرس حافظه ای رو به عنوان محل قرار گیری مقادیر دریافت کنید (پارامتر ورودی)
2) مقادیر رو در اون حافظه ثبت کنید.
در جایی که تابع رو فراخوانی کرده اید :
1) آدرس حافظه ای رو که قرار است مقادیر در آن ثبت شوند به عنوان پارامتر ورودی به تابع ارسال کنید.
2) از مقادیری که در اون آدرس حافظه هست هر طور که مایلید استفاده کنید.
کد:
#include <iostream>
#include <conio.h>
using namespace std;
void MyFunction(int *p)
{
p[0] = 123;
p[1] = 456;
p[2] = 789;
}
int main()
{
int x[3];
MyFunction(x);
cout << x[0] << endl << x[1] << endl << x[2] << endl;
getch();
return 0;
}
ممکنه به سنکرون بودن و نبودن ربطی نداشته باشه، برخی از سخت افزار ها دو تا پورت خاص مثلا X و Y دارند، در X آدرس مورد نظر m رو قرار می دهید (مرحله تنظیم آدرس)ضمنا یک سوال دیگه داشتم و اینکه ی فایل dll که حدود 120 ورودی میتواند دریافت نوشتم و از یک نرم افزار مونیتورینگ صنعتی فرا خوندمش، با نوشتن یک عدد ثابت dll به خوبی کار میکنه، اون عدد ثابت شماره کانال یک A/D صنعتی هست، اما وقتی
بیشتر از یک عدد به عنوان انتخاب کانال ورودی میفرستم یک عدم هماهنگی بین dll و نرم افزار مونیتورینگ به وجود میاد و فقط یکی از مقادیر خروجی و اونم اولین مقدار در تمام متغییرها قرار میگره، حال آنکه با انتخاب کانال می بایست مقدار دیجیتال مربوط
به هر کانال در متغییر مربوطه قرار بگیره، نرم افزار مونیتورینگ کدهای مخصوص خودش را داره و اسم زبانش cicode می باشد، به انعطاف پذیری زبان نرم افزار مطمین نیستم و از طرفی به سنکرون بودن و یا عدم سرعت پاسخگویی کافی dll هم شک دارم
از لحاظ برنامه نویسی c++ چه کاری میتوان برا سنکرون سازی انجام داد؟
با تشکر از جنابعالی.
و در ادامه در Y مقدار v رو قرار می دهید (مقدار v در آدرس m سخت افزار قرار می گیره) یا از Y مقدار v رو می خونید (مقدار v از آدرس m سخت افزار خونده میشه)
حالا اگر زمانی که بین قرار دادن مقدار در X و Y مکث می کنید کم باشه، سخت افزار مورد نظر فرصت تنظیم آدرس روی m رو نداره و عملیات موفقیت آمیز نمیشه.