2015-01-17 6 views
1

недействительного преобразования из «байт *» до «байт»недействительно преобразование из «байт *» до «байт»

я должен написать эту Arduino функцию

byte receiveMessage(AndroidAccessory acc,boolean accstates){ 
    if(accstates){ 
     byte rcvmsg[255]; 
     int len = acc.read(rcvmsg, sizeof(rcvmsg), 1); 
     if (len > 0) { 
      if (rcvmsg[0] == COMMAND_TEXT) { 
       if (rcvmsg[1] == TARGET_DEFAULT){ 
       byte textLength = rcvmsg[2]; 
       int textEndIndex = 3 + textLength; 
       byte theMessage[textLength]; 
       int i=0; 
        for(int x = 3; x < textEndIndex; x++) { 
         theMessage[i]=rcvmsg[x]; 
         i++; 
         delay(250); 
        } 
       return theMessage; 
       delay(250); 
       } 
      } 
     } 
    }  
} 

это ошибка

In function byte receiveMessage(AndroidAccessory, boolean) invalid conversion from byte*' to 'byte" 

эта функция, чтобы получить данные из андроид и вернуть его в виде массива байтов

+2

Вы не можете сделать это 'вернуть theMessage;' 'потому, что theMessage' является локальным переменным, а также' задержка (250) ' ничего не делает. –

+0

есть несколько проблем: 1) оператор return возвращает «указатель на байт», но объявленный тип возврата - «байт» 2) первая задержка не нужна, поскольку вы перемещаете память в память. 3) вторая задержка никогда не будет выполнена из-за заявления о возврате перед ним. 4) когда функция завершается, массив сообщений [] не определен, поэтому необходимо malloc область и вернуть указатель на эту область malloc'd. – user3629249

ответ

2

Вы должны использовать динамическое выделение, или передать массив в функцию в качестве параметра, который является лучшим решением в вашем случае

void receiveMessage(AndroidAccessory acc, boolean accstates, byte *theMessage){ 
    if (theMessage == NULL) 
     return; 
    if(accstates){ 
     byte rcvmsg[255]; 
     int len = acc.read(rcvmsg, sizeof(rcvmsg), 1); 
     if (len > 0) { 
      if (rcvmsg[0] == COMMAND_TEXT) { 
       if (rcvmsg[1] == TARGET_DEFAULT){ 
       byte textLength = rcvmsg[2]; 
       int textEndIndex = 3 + textLength; 
       int i=0; 
        for(int x = 3; x < textEndIndex; x++) { 
         theMessage[i]=rcvmsg[x]; 
         i++; 
         delay(250); 
        } 
       return; 
       } 
      } 
     } 
    }  
} 

с этим, вы будете вызывать функцию, проходящую массив к нему, например,

byte theMessage[255]; 

receiveMessage(acc, accstates, theMessage); 
/* here the message already contains the data you read in the function */ 

Но вы не можете вернуть локальную переменный, так как данные действительны только в области, где переменный является действительным, на самом деле это недопустимые права за пределами if (rcvmsg[0] == COMMAND_TEXT) блока, так как вы определили его локальным для этого блока.

Примечание: пожалуйста, прочитайте комментарий Виммель «s, или вы можете установить последние байты '\0' если это просто текст, а затем использовать массив в виде строки.

+1

Вероятно, вы хотите вернуть длину полученного сообщения, чтобы вызывающий абонент знал, что что-то получено и сколько. – wimh

+0

ا Привет этой строке, которая получит сообщение int len ​​= acc.read (rcvmsg, sizeof (rcvmsg), 1); я суслим этот метод, чтобы получить его, поэтому я не могу баса его перед тем, как его очистить –

0

Что касается ошибки, вы возвращаете неправильное значение.

theMessage is a byte array not a byte 

Также последние ответы объясняет, почему не может вам вернуть локальный переменный указатель