我有一个threadMethod
,它每0.5秒在控制台robotMotorsStatus
中显示一次。但是,当我尝试在robotMotorsStatus
方法中更改changeRobotStatus
时,会收到异常。我需要在该程序中放置锁的位置。
#import "AppController.h"
@implementation AppController
extern char *robotMotorsStatus;
- (IBAction)runThread:(id)sender
{
[self performSelectorInBackground:@selector(threadMethod) withObject:nil];
}
- (void)threadMethod
{
char string_to_send[]="QFF001100\r"; //String prepared to the port sending (first inintialization)
string_to_send[7] = robotMotorsStatus[0];
string_to_send[8] = robotMotorsStatus[1];
while(1){
[theLock lock];
usleep(500000);
NSLog (@"Robot status %s", robotMotorsStatus);
[theLock unlock];
}
}
- (IBAction)changeRobotStatus:(id)sender
{
robotMotorsStatus[0]='1';
}
最佳答案
extern char *robotMotorsStatus;
在显示的任何代码中,您都没有将此指针设置为指向任何地方。 (您是否在为某些机器人程序包使用SDK来为您初始化此变量?如果是,可以显示配置设置来告诉它这是要初始化的变量吗?)
string_to_send[7] = robotMotorsStatus[0];
string_to_send[8] = robotMotorsStatus[1];
如果
robotMotorsStatus
尚未通过SDK或未显示的代码初始化,则它们将以随机地址访问内存。如果这使您崩溃,并且这是您提到的但没有提及的“例外”,那也不会令我感到惊讶。robotMotorsStatus[0]='1';
同样的潜在问题。
NSLog (@"Robot status %s", robotMotorsStatus);
假定
robotMotorsStatus
至少包含一个字符,并且最后一个字符是零字节(空字符),即robotMotorsStatus
指向C字符串。正如我已经指出的那样,您没有显示robotMotorsStatus
指向任何确定的东西,即使它确实指向某个地方,也没有显示该内存的内容是C字符串。如果数组的实际边界内没有空字符,则该数组不包含C字符串,并且尝试读取整个C字符串,就像将该数组传递给
%s
格式化程序一样,将导致经过数组末尾后崩溃。如果robotMotorsStatus
的其他两个访问不是您的崩溃,则可能是此崩溃。这里的解决方案不仅是使指针变量指向您想要的位置,而且要在该空间中完全包含有效的C字符串(包括空字符)。
顺便说一下,这些问题与线程无关。