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]。