PDA

View Full Version : تبديل struct از C++‎‎‎ به C#‎‎‎



alireza_bahonar
دوشنبه 10 بهمن 1390, 10:29 صبح
با سلام
من ميخوام يك درخت دودويي رو از سي پلاس به سي شارپ تبديل كنم
يك ساختار اينجوري تعريف شده در سي پلاس
struct nod

{
int id;
int phone;
char name[100];
nod *left;
nod *right;
};
براي تبديلش به سي شارپ كه اينجوري ميشه
struct node
{
int id;
int phone;
char[] name= new char[100];
nod left;
nod right;
}
از اين قسمت خطا ميگيره :
nod right
nod left
و مينويسه
Struct member '' of type '' causes a cycle in the struct layout

ميشه راهنمايي فرماييد؟

Amir Oveisi
دوشنبه 10 بهمن 1390, 11:39 صبح
struct ها value type هستند بنابراين در صورتي كه حالت nested يا تو رفته (struct در struct) داشته باشند تو حافظه يه ساختاري ايجاد ميشه كه ميزان مصرف حافه بي نهايت ميشه و يه چرخه بي پايان براي توليد struct بوجود مياره.
براي اين كار به جاي struct از class استفاده كنيد كه reference type هست و اين مشكل رو نداره.

masoudalmas
سه شنبه 02 خرداد 1391, 22:27 عصر
سلام بر دوستان عزيز ميخواستم اين كد رو از c++ به C# تبديل كنم و از عناصر به صورت آرايه اي استفاده كنم



struct lru{
int e;
int c;
int b;
}p[100];

ممنو ميشم راهنامييم كنيم. ميخوام حتما توي struct بنويسم و استفاده كنم

masmas.mhj
دوشنبه 29 آبان 1391, 20:16 عصر
سلام دوستان میخواستم این برنامه رو که با struct در زبان c# نوشته شده رو به کلاس در زبان c++ تبدیل کنم . ممنون میشم اگر کسی میدونه راهنمایی کنه .
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication17
{
public struct smartcard
{
public long id;
public string plk;
public string nm;
public short tp;
public float bl;
}
class Program
{
public static smartcard [] cards=new smartcard [1000];
static void Main(string[] args)
{
int noc;
Console.WriteLine("enter the number of smart cards:");
noc=Int32.Parse(Console.ReadLine());
for(int i=0;i<noc;i++)
{
Console.WriteLine("enter id,plk,nm,bl,tp(1=savari , 2=vanet)");
cards[i].id = long.Parse(Console.ReadLine());
cards[i].plk = Console.ReadLine();
cards[i].nm = Console.ReadLine();
cards[i].bl = float.Parse(Console.ReadLine());
cards[i].tp = short.Parse(Console.ReadLine());
}
int c;
while (true)
{
Console.WriteLine("enter a number:");
c = Int32.Parse(Console.ReadLine());
switch (c)
{
case 1:
{
for (int i = 0; i < noc; i++)
sort();
break;
}
case 2:
{
float used, balance;
long idno;
Console.WriteLine("enter your id & mizane masraf:");
idno = long.Parse(Console.ReadLine());
used = float.Parse(Console.ReadLine());
if (amend('d', idno, used, ref balance) == 1)
Console.WriteLine("{0},{1}", balance, idno);
else Console.WriteLine("sahmieh kafi nist,{0}", idno);
break;
}
case 3:
{
float used=0, balance=0;
long idno=0;
amend('c', idno, used, ref balance);
break;
}
case 4:
{
for (int i = 0; i < noc; i++)
Console.WriteLine("{0}",cards[i]);
break;
}
default:
{
Console.WriteLine("entekhabe ghalat!");
break;
}
}
}
}
public static void sort()
{
for (int i = 999; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (string.Compare(cards[j].nm, cards[j + 1].nm) > 0)
{
smartcard temp;
temp = cards[j];
cards[j]=cards[j+1];
cards[j + 1] = temp;
}
}
}
}
public static int amend (char actn, long idno, float used, ref float balance)
{
switch (actn)
{
case 'd':
{
int i;
for (i = 0; i < 1000 && cards[i].id != idno;i++ ) ;
if (cards[i].bl >= used)
{
cards[i].bl = used - cards[i].bl;
balance = cards[i].bl;
return 1;
}
else return 0;
break;
}
case 'c':
{
for (int i = 0; i < 1000; i++)
{
if (cards[i].tp == 1)
cards[i].bl += 60;
else cards[i].bl += 300;
return 1;
}
break;
}
}
}
}
}