Objective c 逻辑错误目标C
我没有得到正确的输出Objective c 逻辑错误目标C,objective-c,Objective C,我没有得到正确的输出 data.m --------- @implementation data - (id) initWithID:(int) uMessageId withData:(id)pData withSize:(size_t) uDataSize { //if(self=[super init]) //{ // Initialize the member variables m_uSessionId
data.m
---------
@implementation data
- (id) initWithID:(int) uMessageId withData:(id)pData withSize:(size_t) uDataSize
{
//if(self=[super init])
//{
// Initialize the member variables
m_uSessionId = 0x00;
m_chSequenceChar= 0;
// Initialize values from derived class
m_nMessageId = uMessageId;
m_pData = (int*)pData;
m_uDataSize = (int)uDataSize;
//}
return self;
}
- (BOOL) TxCreateImage:(id) pData withLen:(id)uLen
{
sprintf((char *)pData,"%x%d%d%d",ASCII_STX,m_uSessionId,m_chSequenceChar,m_nMessageId);
//uLen = ENCODED_MSG_DATA_OFFSET;
NSLog(@"%s",pData);
return YES;
}
- (void)dealloc
{
[super dealloc];
}
@end
data_derived.m //derived class of data
--------------------
@implementation requestSession
- (id)init
{
char* pData[4096];
size_t asize = sizeof(st);
self=[super initWithID:ID withData:(id)pData withSize:asize];
if (self) {
data* dat = [[data alloc]init];
[dat TxCreateImage:self withLen:self];
}
return self;
}
- (void)dealloc
{
[super dealloc];
}
@end
test2.m
---------
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
requestSession* session = [[requestSession alloc]init];
[pool drain];
return 0;
}
remote.h
-----------
#import <Foundation/Foundation.h>
struct RMH_REQUEST_SESSION_MSG //Message Data
{
int uDeviceID;
int uProtocolVersion;
int uReserved[5];
};
typedef enum
{
RM_REQUEST_SESSION = 0x11 //Message ID
} REMOTE_MESSAGE_ID;
@interface remote : NSObject {
}
@end
data.h
---------
#import <Foundation/Foundation.h>
#import "remote.h"
@interface data : NSObject {
@public
int m_nMessageId; //Message ID
int m_uSessionId; //Session ID
int m_chSequenceChar; //Sequence ID
int* m_pData; //Integer buffer to carry data
int m_uDataSize; //Datasize
}
- (id)initWithID:(int) uMessageId withData:(id)pData withSize:(size_t) uDataSize;
- (void)dealloc;
- (BOOL) TxCreateImage:(id) pData withLen:(id)uLen;
//+ (id)CreateMessage:(REMOTE_MESSAGE_ID)nMessageNumber;
//+ (id)CreateMessage:(const int*)szMessageName;
@end
data_derived.h
---------------------
#import <Foundation/Foundation.h>
#import "data.h"
#define DECLARE_RS232_NEWMSG(ClassID)\
enum \
{ \
ID = ClassID \
}; \
@interface requestSession : data {
@public
DECLARE_RS232_NEWMSG(RM_REQUEST_SESSION);
struct RMH_REQUEST_SESSION_MSG st;
int size;
}
-(id)init;
-(void)dealloc;
@end
data.m
---------
@实施数据
-(id)initWithID:(int)uMessageId with data:(id)pData with size:(size\u t)uDataSize
{
//if(self=[super init])
//{
//初始化成员变量
m_uSessionId=0x00;
m_chSequenceChar=0;
//从派生类初始化值
m_nMessageId=uMessageId;
m_pData=(int*)pData;
m_uDataSize=(int)uDataSize;
//}
回归自我;
}
-(BOOL)TxCreateImage:(id)带有len:(id)uLen的pData
{
sprintf((char*)pData,“%x%d%d%d”,ASCII_STX,m_uSessionId,m_chSequenceChar,m_nMessageId);
//uLen=编码的数据偏移量;
NSLog(@“%s”,pData);
返回YES;
}
-(无效)解除锁定
{
[super dealoc];
}
@结束
data_-derived.m//派生的数据类
--------------------
@实现请求会话
-(id)init
{
char*pData[4096];
尺寸=尺寸(st);
self=[super initWithID:ID withData:(ID)pData with size:asize];
如果(自我){
data*dat=[[data alloc]init];
[dat TxCreateImage:self with Len:self];
}
回归自我;
}
-(无效)解除锁定
{
[super dealoc];
}
@结束
test2.m
---------
int main(int argc,const char*argv[]{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
requestSession*会话=[[requestSession alloc]init];
[泳池排水沟];
返回0;
}
远程.h
-----------
#进口
struct RMH\u REQUEST\u SESSION\u MSG//消息数据
{
内特维赛德;
int拔出凝固;
国际货币基金组织[5];
};
类型定义枚举
{
RM_请求_会话=0x11//消息ID
}远程消息标识;
@远程接口:NSObject{
}
@结束
数据.h
---------
#进口
#导入“remote.h”
@接口数据:NSObject{
@公开的
int m_nMessageId;//消息ID
int m_uSessionId;//会话ID
int m_chSequenceChar;//序列ID
int*m_pData;//用于传输数据的整数缓冲区
int m_uDataSize;//数据大小
}
-(id)initWithID:(int)uMessageId with data:(id)pData with size:(size_t)uDataSize;
-(无效)解除锁定;
-(BOOL)TxCreateImage:(id)带有len:(id)uLen的pData;
//+(id)CreateMessage:(远程消息id)NMessagUnmber;
//+(id)CreateMessage:(const int*)szMessageName;
@结束
数据_.h
---------------------
#进口
#导入“data.h”
#定义DECLARE_RS232_NEWMSG(ClassID)\
枚举\
{ \
ID=ClassID\
}; \
@接口请求会话:数据{
@公开的
声明RS232新消息(RM请求会话);
结构RMH\u请求\u会话\u消息st;
整数大小;
}
-(id)init;
-(无效)解除锁定;
@结束
预期产量为
20017
。但它在印刷我
200 00
我需要传递中指定的值
initWithData方法
在data.m到
TxCreateMessage
在data.m.中,我的回答与你的问题无关,因为我遗漏了你问题中的某些内容。问题是您正在将
int*
强制转换为char*
,指针强制转换是许多问题的根源(在本例中,它可能是endianess问题)
如果要使用sprintf,请在char*
上使用它,而不是int*
:
- (BOOL) TxCreateImage:(id) pData withLen:(id)uLen
{
char printStr[30];
sprintf(printStr,"%x%d%d%d",ASCII_STX,m_uSessionId,m_chSequenceChar,m_nMessageId);
//uLen = ENCODED_MSG_DATA_OFFSET;
NSLog(@"%s",printStr);
return YES;
}
我无法将initWithData更改的值获取到TxCreateMessage上,因为它在本地作用域中。m_nMessageId为17,但它不会打印它。它将打印为0。在initWithID中,分配给该作用域的变量是本地的。因此,这些值不会打印在另一个函数TxCreateMessage中。为什么在上面的代码中需要char printStr[30]。