PDA

View Full Version : سوال: معادل کد c در دلفی



مصطفی ساتکی
یک شنبه 14 اسفند 1390, 22:45 عصر
#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;
class classOne
{
public:
vector<double> A;
int N;
classOne()
{
N = 3;
A.resize(7);
}

const double& TranProb(size_t i, size_t j) const
{
return A[i*N+j];
}


double& TranProb(size_t i, size_t j)
{
return A[i*N+j];
}
};
int _tmain(int argc, _TCHAR* argv[])
{
classOne* instance = new classOne;
instance->TranProb(1,1) = 12.0;
for (int i=0; i < instance->A.size();i++)
cout << instance->A[i] << endl;
//cout << h;
return 0;
}


خروجی
0
0
0
0
12
0
0

Ananas
دوشنبه 15 اسفند 1390, 00:37 صبح
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TClassOne = class
public
A : array of Double;
N : Integer;
constructor Create;
function TranProb(i, j : Integer):PDouble;
end;
constructor TClassOne.Create;
begin
N := 3;
SetLength(A, 7);
end;
function TClassOne.TranProb(i, j : Integer):PDouble;
begin
Result := @A[i * N + j];
end;
var
instance : TClassOne;
I : Integer;
begin
try
instance := TClassOne.Create;
instance.TranProb(1, 1)^ := 12.0;
for I := 0 to High(instance.A) do
begin
Writeln(instance.A[i]);
end;
Readln;
{ TODO -oUser -cConsole Main : Insert code here }
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

مصطفی ساتکی
دوشنبه 15 اسفند 1390, 21:51 عصر
این کدی که قرار دادید خیلی جالب بود.
ولی 2 تا مشکل داره
اول اینکه اگر دقت داشته باشید من 2 تا تابع با نام TranProb دارم که دارای signature های متفاوتی هستند یعنی دارای 2 تابع به نحوی overload هستند ولی 2 دلفی بخاطر اینکه لیست پارامترها یکسانه اجازه همچین کاری رو نمیده

دوم اینکه کد c++ رو به صورت generic هستش و قاعدتاً تو دلفی بایستی به صورت <List<Double تعریف کنید

Ananas
دوشنبه 15 اسفند 1390, 22:49 عصر
این کدی که قرار دادید خیلی جالب بود.


ممنون.


اول اینکه اگر دقت داشته باشید من 2 تا تابع با نام TranProb دارم که دارای signature های متفاوتی هستند یعنی دارای 2 تابع به نحوی overload هستند ولی 2 دلفی بخاطر اینکه لیست پارامترها یکسانه اجازه همچین کاری رو نمیده

من دقیقا متوجه فرق دو تا تابع نشدم یعنی اینجا کلمه const برای چیه؟ چه نیازی به دو تا تابع دارید؟ یعنی در کل چه فرقی بین این دو تا تابع هست؟
اگه خروجی ها فرق میکنن و فقط ورودی ها مثل هم هستن یه راهی به نظرم میاد که شاید درست نباشه ولی میشه برای overload ساختن دلفی رو گول زد به این شکل که یه پارامتر اضافی به یکی از تابع ها بدی مثلا به تابع دوم یه ورودی از نوع boolean اضافه کن که هیچ کاری هم باهاش نداشته باشی فقط موقع فراخونی یه مقدار دلخواه بهش یده که با اون یکی تابع متفاوت باشه.


دوم اینکه کد C++‎‎ رو به صورت generic هستش و قاعدتاً تو دلفی بایستی به صورت <List<Double تعریف کنید

تو دلفی آرایه های پویا طوری تعریف شدن که تا اونجا که می دونم تقریبا همون کار list و vector رو انجام میدن یعنی مثلا با double *d که تو C++‎ هست فرق میکنه. من نمی تونم تو C++‎ طول d رو که می تونه یک آرایه به حساب بیاد رو پیدا کنم. یعنی یه اشاره گر بیشتر نیست ولی array of double تو دلفی کاملا کنترل شده هست و راحت طول آرایه رو با Length() و شماره آخرین عضو با High بدست میاد و طول اون هم با SetLength تغییر میکنه مثل همون resize تو vector .
من تو دلفی چیزی به اسم list به این شکل ندیدم و بلد نیستم.

Ananas
دوشنبه 15 اسفند 1390, 23:31 عصر
خوب من اینو پیدا کردم:

uses
SysUtils, Generics.Collections;
type
TClassOne = class
public
A : TList<Double>;
N : Integer;
constructor Create;
function TranProb(i, j : Integer):PDouble;
end;
constructor TClassOne.Create;
begin
N := 3;
A := TList<Double>.Create;
A.Count := 7;
end;


ولی نتونستم تابع رو بنویسم چون A.Items یک مقدار double خروجی میده ولی ما PDouble رو می خوایم و اشاره گر تحویل نمی ده.

مصطفی ساتکی
دوشنبه 15 اسفند 1390, 23:40 عصر
اگر می خواستم پارامتر اضافه بدم همون مقداری رو که میخام از طریق نام تابع تو آرایه ست کنم رو به عنوان پارامتر می فرستادم.


اما در مورد double *d تو c معادل با d :pdouble در دلفی هستش ما آرایه داینامیک در c نداریم و اگر بخایم تغییراتی بدیم بایستی realloc کنیم.

در ضمن vector در c کلاس هستش همانند list<> در دلفی و اون توابعی که شما ذکر کردید مربوط به آرایه میشه

Ananas
دوشنبه 15 اسفند 1390, 23:49 عصر
پیدا کردم فکر کنم این دیگه همونی باشه که شما می خوای:

program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
Generics.Collections;
type
TClassOne = class
public
A : TList<Double>;
N : Integer;
constructor Create;
function GetTranProb(i, j : Integer):Double;
procedure SetTranProb(i, j : Integer; d : Double);
property TranProb[i ,j : Integer]: Double read GetTranProb write SetTranProb;
end;
constructor TClassOne.Create;
begin
N := 3;
A := TList<Double>.Create;
A.Count := 7;
end;
function TClassOne.GetTranProb(i, j : Integer):Double;
begin
Result := A.Items[i * N + j];
end;
procedure TClassOne.SetTranProb(i, j : Integer; d : Double);
begin
A.Items[i * N + j] := d;
end;
var
instance : TClassOne;
I : Integer;
begin
try
instance := TClassOne.Create;
instance.TranProb[1, 1] := 12.0;
for I := 0 to (instance.A.Count - 1) do
begin
Writeln(instance.A[i]);
end;
Readln;
{ TODO -oUser -cConsole Main : Insert code here }
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

مصطفی ساتکی
پنج شنبه 18 اسفند 1390, 14:26 عصر
این که اصلاً یه چیز دیگس من منظورم همون مقدار دهی از طریق از نام function بود راههای زیادی وجود داره ولی مدنظر معادل بودن کد بدون هیچ کم و کاستی بود

Ananas
پنج شنبه 18 اسفند 1390, 22:33 عصر
این که اصلاً یه چیز دیگس من منظورم همون مقدار دهی از طریق از نام function بود راههای زیادی وجود داره ولی مدنظر معادل بودن کد بدون هیچ کم و کاستی بود
شرمنده. اونو دیگه بلد نیستم. همینو بلد بودم گفتم شاید به کارت بخوره.
راستی جواب سوال منم ندادی که const که پشت تابع نوشتی برای چیه؟ الان تابع اولی تو برنامه استفاده نمیشه. اصلا تو خود c++ حالت overload داره؟ کجا ممکنه اولی رو بجای دومی استفاده کنه؟ الان تابع اولی رو حذف می کنم برنامه بدون اشکال اجرا میشه.
البته یه چیزی هم تو دلفی هست که یک type از جنس تابع تعریف می کنیم و اونو به متغیر ها و یا ثوابتی از جنس همون تابع (با ورودی و خروجی یکسان) نسبت می دیم. منظورت اون هست؟