PDA

View Full Version : تعریف آرایه با طول متغیر در struct



marall80
شنبه 16 آذر 1387, 14:34 عصر
من می خوام داخل bodyیک رشته باشه که طولش متغیر هست و تو برنامه پر می شه

اینجوری که نوشتم error میده چه جوری باید تعریفش کنم و براش فضا بگیرم


typedef struct_packed{
uint16 command;
unsigned char mimetype;
char *body;
} TMS_msg_t;



TMS_msg_t *TMS_req_msg = 0, *TMS_rsp_msg = 0;


TMS_req_msg->body = (char *)malloc(sizeof(char));
TMS_rsp_msg->body = (char *)malloc(sizeof(char));

mehdi.mousavi
شنبه 16 آذر 1387, 15:29 عصر
من می خوام داخل bodyیک رشته باشه که طولش متغیر هست و تو برنامه پر می شه

اینجوری که نوشتم error میده چه جوری باید تعریفش کنم و براش فضا بگیرم


typedef struct_packed{
uint16 command;
unsigned char mimetype;
char *body;
} TMS_msg_t;



TMS_msg_t *TMS_req_msg = 0, *TMS_rsp_msg = 0;


TMS_req_msg->body = (char *)malloc(sizeof(char));
TMS_rsp_msg->body = (char *)malloc(sizeof(char));


باید هم ایراد بگیره! وقتی شما دارید یک Pointer از اون Structure تعریف میکنید، ابتدا باید اون Pointer رو new کنید:



TMS_msg_t *tms = new TMS_msg_t();
tms->body = (char *)malloc(sizeof(char));


یا میتونید، اونو در Local Stack ایجاد کنید:



TMS_msg_t tms = {NULL};
tms.body = (char *)malloc(sizeof(char));


البته فراموش نکنید که حافظه های تخصیص پیدا کرده رو بعدا به سیستم بر گردونید و آزاد کنید.

marall80
یک شنبه 17 آذر 1387, 08:43 صبح
برای این می خوام struct بنویسم نمی دونم data type چی باید باشه
تو پست قبلی گفتم که تو body یه استرینگ قرار میگیره

size int16
//left byte is high byte and right byte is low byte

command int16
//4 BCD digit

mimetype byte
//2 BCD digit

body variable length
//of mimetype

mehdi.mousavi
یک شنبه 17 آذر 1387, 10:59 صبح
برای این می خوام struct بنویسم نمی دونم data type چی باید باشه
تو پست قبلی گفتم که تو body یه استرینگ قرار میگیره

size int16
//left byte is high byte and right byte is low byte

command int16
//4 BCD digit

mimetype byte
//2 BCD digit

body variable length
//of mimetype




سلام.
به نظر من جای CHAR * ، اونو BYTE * تعریف کنید.
برای سایز هم از DWORD استفاده کنید.

پاورقی: متوجه نمیشم، مشکل چی هستش!

marall80
یک شنبه 17 آذر 1387, 13:02 عصر
من باید یک پیغام درست کنم که قالب اون این شکلیه که گفتم
حالا من باید این پیغام و درست کنم و بفرستم که شامل این سه تاست command mimetype ,body
پیغام اول شامل 0001 که 4 رقم BCD هست در command و 01 در mimetype و "terminalid=1323" که در body قرار میگیره
حالا من نمی دونم که چه جوری باید اینا رو تعریف کنم و پر کنم

mehdi.mousavi
یک شنبه 17 آذر 1387, 13:37 عصر
من باید یک پیغام درست کنم که قالب اون این شکلیه که گفتم
حالا من باید این پیغام و درست کنم و بفرستم که شامل این سه تاست command mimetype ,body پیغام اول شامل 0001 که 4 رقم BCD هست در command و 01 در mimetype و "terminalid=1323" که در body قرار میگیره حالا من نمی دونم که چه جوری باید اینا رو تعریف کنم و پر کنم

تعریفش رو که گفتم. پر کردنش هم خوب ابتدا باید بهشون حافظه اختصاص بدید - بسته به تکنولوژی و کاری که میخواهید بکنید، ممکنه نیاز باشه تا حافظه رو با Win32 API خاصی از سیستم بگیرید (بعنوان مثال تو COM باید از CoTaskMemAlloc برای گرفتن حافظه استفاده کنید)و سپس اون حافظه ها رو با مقادیر دلخواهتون پر کنید. واقعا متوجه نمیشم کجای کار پیچیده یا مشکله!

پاورقی: گفتید پیام رو درست کنم و بفرستم! کجا بفرستید؟ به یه Process دیگه؟ روی سیم؟ به یک DLL؟ یه بعنوان یک Control Code به یه درایور؟ همه اینا به هم فرق میکنه. فکر میکنم بهتره تا یک کتابی در زمینه کاری که میخواهید انجام بدید، ابتدا مطاله کنید، سپس اقدام به طراحی نرم افزار و ساختارها کنید.

marall80
یک شنبه 17 آذر 1387, 14:09 عصر
ببینید من این پیغام رو با ip و port به سویچ میفرستم که اون در جوابم یه چیزی بفرسته
من باید از memcpyاستفاده کنم واسه پر کردنشون
typedef struct_packed{
unsigned char command[TMS_MSG_command_LEN];
unsigned char mimetype[TMS_MSG_mimetype_LEN];
char *body;
} TMS_msg_t;

TMS_msg_t *TMS_req_msg = new TMS_msg_t();
TMS_req_msg->body = (char *)malloc(sizeof(char));

memcpy((void *)TMS_req_msg->command, "0001" , 4);
memcpy((void *)TMS_req_msg->mimetype, "01" , 2);
memcpy((void *)TMS_req_msg->body, "Terminal_id=000026", strlen( "Terminal_id=000026"));
اینا که من نوشتم چقدرش درسته

mehdi.mousavi
یک شنبه 17 آذر 1387, 15:13 عصر
ببینید من این پیغام رو با ip و port به سویچ میفرستم که اون در جوابم یه چیزی بفرسته
من باید از memcpyاستفاده کنم واسه پر کردنشون
typedef struct_packed{
unsigned char command[TMS_MSG_command_LEN];
unsigned char mimetype[TMS_MSG_mimetype_LEN];
char *body;
} TMS_msg_t;

TMS_msg_t *TMS_req_msg = new TMS_msg_t();
TMS_req_msg->body = (char *)malloc(sizeof(char));

memcpy((void *)TMS_req_msg->command, "0001" , 4);
memcpy((void *)TMS_req_msg->mimetype, "01" , 2);
memcpy((void *)TMS_req_msg->body, "Terminal_id=000026", strlen( "Terminal_id=000026"));
اینا که من نوشتم چقدرش درسته


سلام.
اگر قرار بود من بنویسم، اینطوری مینوشتم:



typedef struct _TMS_MSG {
BYTE Command[TMS_MSG_COMMAND_LEN];
BYTE MimeType[TMS_MSG_MIMETYPE_LEN];
CHAR *Body;
} TMS_MSG;


و برای پر کردن پیام:



TMS_MSG msg = {NULL};

CHAR token[] = "Terminal_id=000026";
DWORD cbSize = (DWORD)strlen((CONST CHAR *)token);

msg.Body = new CHAR[cbSize + 1];
memcpy(msg.Body, token, cbSize);
msg.Body[cbSize] = NULL;


البته من نمیدونم ساختار این پیام دقیقا چی هستش، اما اگر Layout اون در حد بیت براتون مهم باشه، باید در تعریف Structure یه تجدید نظری کنید. ضمن اینکه، میتونید برای Structure اتون، ctro بذارید، تا عملیات تکراری Set کردن یک پیام رو در اون انجام بدید.

Nima_NF
یک شنبه 17 آذر 1387, 15:22 عصر
برای این می خوام struct بنویسم نمی دونم data type چی باید باشه
تو پست قبلی گفتم که تو body یه استرینگ قرار میگیره

size int16
//left byte is high byte and right byte is low byte


من هم دقیق متوجه نشدم این همه کار و تخصیص حافطه برای چی هست !



برای پر کردن high byte , low byte هم به این شکل دو ماکرو تعریف کنید، البته در C استاندارد به جای BYTE از unsigned char و به جای DWORD_PTR هم از unsigned long استفاده کنید:



#define LOBYTE(w) ((BYTE)(((DWORD_PTR)(w)) & 0xff))
#define HIBYTE(w) ((BYTE)((((DWORD_PTR)(w)) >> 8) & 0xff))

BYTE size ;
size = LOBYTE(5);
size = HIBYTE(0);

برای دسترسی و پر کردن محتویات یک struct هم نیازمند استفاده از کپی کردن حافظه نیست، اگر طول رشته متغیر و اشاره گر است، به اندازه مورد نیاز حافظه تخصیص دهید (در C به جای new از malloc) و سپس از نقطه . یا <- برای دسترسی استفاده کنید و با استفاده از strcpy رشته مورد نظر را کپی کنید:



char *string2 = new char[100];

strcpy( string2, "your text" );