Логическая ошибка-цель C - PullRequest
0 голосов
/ 06 мая 2011

Я не получаю правильный вывод.

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

Ожидаемый результат -

2 0 0 17

. Но его печать мне

2 0 0 0

.

Мне нужно передать значения, назначенные в

метод initWithData

в data.m до

TxCreateMessage

в data.m.

1 Ответ

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

Мой ответ не имеет значения, так как я что-то упустил в вашем вопросе. проблема в том, что вы преобразуете int * в char *, приведение указателей является корнем многих проблем (в данном случае это, вероятно, проблема с порядком байтов).

Если вы хотите использовать 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...