我有一个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字符串(包括空字符)。

顺便说一下,这些问题与线程无关。

09-16 20:46