2011-05-19 65 views
-1

我在下面的代码中收到错误。我无法猜测我为这样的错误出现了什么错误。目标C中出现错误

remote.h

struct RMH_REQUEST_SESSION_MSG //Message Data 
{ 
    int uDeviceID; 
    int uProtocolVersion; 
    int uReserved[5]; 
}; 

RS232MsgRequestSession.m

@implementation RS232MsgRequestSession 

-(id)init 
{ 
    if (self = [super init]) { 
     struct RMH_REQUEST_SESSION_MSG st; 
    } 
    return self; 
} 
@end 

xyz.h

#import "RS232MsgRequestSession.h" 

@implementation xyz 

    -(void)Open{ 

     RS232MsgRequestSession* pMsg = [[RS232MsgRequestSession alloc]init]; 

    pMsg->st.uProtocolVersion = RS232_VERSION; //error 
    pMsg->st.uDeviceID = RS232_PROTOCOL_DEVICE_ID; //error 
    memset(pMsg->st.uReserved,0x00,sizeof(pMsg->st.uReserved)); //error 

    } 
@end 

错误: '结构RS232MsgRequestSession' 没有名为 'ST'

回答

2
成员

把iVar声明在类的@interface块中。在你的代码ST只是在init方法的局部变量:

@interface RS232MsgRequestSession : NSObject{ 
... 
@public 
struct RMH_REQUEST_SESSION_MSG st; 
} 
... 
@end 
+0

类定义正确地指出out.Thanks。 – spandana 2011-05-19 08:42:53

+0

谢谢all.I根据您的所有建议更正了代码。 – spandana 2011-05-19 08:44:23

+0

为什么downvote? :\ – Vladimir 2011-05-19 12:34:05

1

你忘了做的是什么包括在struct@interface作为公共实例变量:

@interface RMH2532MsgRequestSession : NSObject { 
@public 
    struct RMH_REQUEST_SESSION_MSG st; 
} 
- (void) Open; 
@end 

和你@implementation应空:

@implementation RS232MsgRequestSession 
@end 

PS - 为什么你必须在这里使用@public的原因是因为在xyz,你正在使用成员操作员->直接解除对象的引用。在使用Objective-C对象时,这是默认不允许的。但是,如果实例变量属于@public属性,那么执行此操作时不会有任何问题。

正如您现在可能已经猜到的那样,使用@public很糟糕的想法 - 通常。它打破封装并打开潘多拉盒子的潜在问题,如果你使用了适当的封装,那么你将不会拥有这些问题。

+0

感谢您解释清楚使用情况。 – spandana 2011-05-19 14:12:11

1

您正在将st定义为init函数中的局部变量。

移动struct RMH_REQUEST_SESSION_MSG st;在RS232MsgRequestSession.h