статическое поведение-> цель C - PullRequest
0 голосов
/ 06 мая 2011

У меня есть static декларация m_pData=1099656 в class.

В main NSLog(@"Testing:%d",m_pData);

Его печать мне 0.

Как получить то же значение m_pData в классе и в основной функции.

Я не могу использовать obj.m_pData или obj->m_pData для доступа к переменной.

отредактировано:

test2.m
----------


#import <Foundation/Foundation.h>
#import "data_derived.h"

int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    data* dat = [data alloc];
    requestSession* session = [requestSession alloc];
    [session init];

    [dat TxCreateImage:RM_REQUEST_SESSION];
    NSLog(@"Testing:%d",m_pData); //the static variable is not printing the value its holding.Its printing Zero.If printed the same variable inside the class it gives some numbers.
    [dat dataBuffer:&m_pData withLen:&m_uDataSize]; //here the actual values of static values are not passed.when printed both of them contains zero values.

    [pool drain];
    return 0;

}

data.h
--------

#import <Foundation/Foundation.h>
#import "remote.h"

static int m_nMessageId;      //Message ID
static int m_uSessionId;      //Session ID
static int m_chSequenceChar;  //Sequence ID

static int* m_pData;          //Integer buffer to carry data
static int m_uDataSize;       //Datasize

@interface data : NSObject {

    @public


}

- (id)initWithID:(int) uMessageId withData:(id)pData withSize:(size_t) uDataSize;
+ (void)initialize;
- (void)dealloc;
- (id) dataBuffer:(int**)m_Data withLen:(int**)uLen;
- (BOOL) TxCreateImage:(int)messageId;

@end

data.m
---------

#import "data.h"

#define ENCODED_MSG_DATA_OFFSET 8

@implementation data

+ (void)initialize
{
    m_uSessionId    = 0;
    m_chSequenceChar= 0;

    // Initialize values from derived class
    m_nMessageId    = 0;
    m_pData         = 0;              
    m_uDataSize     = 0; 

}

- (id) initWithID:(int) uMessageId withData:(id)pData withSize:(size_t) uDataSize
{
        if(self=[super init])
        {
           // Initialize the member variables
            m_uSessionId    = 0xFF;
            m_chSequenceChar= 10;

           // Initialize values from derived class
            m_nMessageId    = uMessageId;
            m_pData         = (int*)pData;              
            m_uDataSize     = (int)uDataSize;            
        }
        NSLog(@"Data size:%d",uDataSize);
        NSLog(@"m_pData:%d",m_pData);
        NSLog(@"pData:%d",pData);

        return self;    
}

- (id) dataBuffer:(int**)m_Data withLen:(int**)uLen
{
       if ( m_uDataSize <= RMH_MAX_ENCODED_LENGTH )
       {
        int abBigEndian[RMH_MESSAGE_MAX_SIZE];
        memcpy(abBigEndian,m_Data,m_uDataSize);
        NSLog(@"m_Data:%d",*m_Data);
        NSLog(@"abBigEndian:%d",abBigEndian);
        uLen += ENCODED_CRC_BYTE_LEN + 1;
        NSLog(@"%d",*uLen);
        }

        NSLog(@"END!");
        return self;    
}

- (BOOL) TxCreateImage:(int)messageId
{
    char pData[4096];
    sprintf(pData,"%x  %d  %d  %d  %x",ASCII_STX,m_uSessionId,m_chSequenceChar,m_nMessageId,ASCII_ETX); //uLen = ENCODED_MSG_DATA_OFFSET;
    NSLog(@"%s",pData);
    return YES;
}


- (void)dealloc
{
    [super dealloc];
}

@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;
}

-(id)init;
-(void)dealloc;

@end

data_derived.m
---------------------


#import "data_derived.h"

@implementation requestSession

- (id)init
{
    size_t asize = sizeof(st);
    st.uDeviceID = RS232_PROTOCOL_DEVICE_ID;
    st.uProtocolVersion = RS232_VERSION;
    memset(st.uReserved,0x00,sizeof(st.uReserved));
    NSLog(@"Address of the structure:%d",&st);
    self=[super initWithID:ID withData:(id)&st withSize:asize];
    if (self) {

    }
    return self;
}

- (void)dealloc
{
    [super dealloc];
}

@end

1 Ответ

2 голосов
/ 06 мая 2011

Не помещайте статические элементы в файл .h.Переместите их в data.m.

Также о ключевом слове static - в C (и Objective C, который явно заменяется на C), при использовании static с глобальными переменными (как у вас),только указывает, что эти переменные будут локальными для файла, в котором вы объявили эти переменные. Таким образом, глобальные переменные в любом случае имеют только один экземпляр с модификатором static или без него.Если вы не используете static, то вы можете получить доступ к этим переменным из других файлов с помощью объявления external, например:

// file1.m
int variable = 4;

// file2.m
external int variable; // variable == 4

Именно поэтому ваш код печатает вас 0. m_pData в test2.m - это не то же самое m_pData, которое вы имеете в data.m.Без модификатора static вы получите ошибку компоновщика.

И, возможно, вы захотите написать методы получения / установки для статических членов.Нравится:

+ (int *)pData {
    return m_pData; // or smth like memcpy
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...