Home AMX User Forum NetLinx Studio

Get_buffer_char?

viningvining Posts: 4,368
Why does get_buffer_char(buffer) act differently than get_buffer_string(buffer,1). It boggles my mind that in the below code I need double quote around the get_buffer_char but not the get_buffer_string(buffer,1). I would prefer not using the double quotes at all but if I do at least reiquire them consistently for any single char return. You would think that get_buffer_char would acutally call the the system function get_buffer_string and just pass it the parameter of 1.
{
     STACK_VAR INTEGER nTT_PWR ;
     STACK_VAR INTEGER nTT_Cntry ;
     STACK_VAR INTEGER nTT_Zone ;
     STACK_VAR INTEGER nTT_ST_Mono ;
     STACK_VAR INTEGER nTT_FM_AM ;
     STACK_VAR INTEGER nTT_Mute ;
     STACK_VAR CHAR cTT_FirmWare[3] ;
     STACK_VAR CHAR cTT_FreQ[6] ;
     STACK_VAR CHAR cTT_Preset[2] ;
     STACK_VAR CHAR cRDS_Z_NAME[8] ;
     
     sRcvdStatMSG.StrLenght = atoi(get_buffer_string(iString,2)) ;
     if(find_string(iString,"END_STAT_MSG",1) == (sRcvdStatMSG.StrLenght + 1))
	  {
	  nTT_PWR = atoi("get_buffer_char(iString)") ;
	  nTT_Cntry = atoi("get_buffer_char(iString)") ;
	  nTT_Zone = atoi(get_buffer_string(iString,1)) ;
	  nTT_ST_Mono = atoi("get_buffer_char(iString)") ;
	  nTT_FM_AM = atoi("get_buffer_char(iString)") ;
	  nTT_Mute = atoi(get_buffer_string(iString,1)) ;
	  cTT_FirmWare = get_buffer_string(iString,3) ;
	  cTT_FreQ = get_buffer_string(iString,6) ;
	  cTT_Preset = get_buffer_string(iString,2) ;
	  cRDS_Z_NAME = get_buffer_string(iString,8) ;
	  
	  if(find_string(iString,"END_STAT_MSG",1) == 1)
	       {//everything apparently OK so load structure.
	       sRcvdStatMSG.Power      = nTT_PWR ;
	       sRcvdStatMSG.Cntry      = nTT_Cntry ;
	       sRcvdStatMSG.Zone       = nTT_Zone ;
	       sRcvdStatMSG.ST_Mono    = nTT_ST_Mono ;
	       sRcvdStatMSG.FM_AM      = nTT_FM_AM ;
	       sRcvdStatMSG.Mute       = nTT_Mute ;
	       sRcvdStatMSG.FirmWare   = cTT_FirmWare ;
	       sRcvdStatMSG.FreQ       = cTT_FreQ ;
	       sRcvdStatMSG.Preset     = cTT_Preset ; 
	       sRcvdStatMSG.RDS_Z_Name = cRDS_Z_NAME ;
	       CLEAR_BUFFER iString ;  
	       RETURN TRUE ;
	       }
	  }
     CLEAR_BUFFER iString ; 
          
     RETURN FALSE ; //something is wrong, so clear_buffer and abort structure loading. 
     }

Comments

  • This is just another instance of the good old bad old "single character string problem".

    I suggest that you grit your teeth, ignore the frustration, and simply put double quotes around every string expression in your code that could conceivably be a single character in your mind or the compiler's mind. I think.
  • DHawthorneDHawthorne Posts: 4,584
    This is just another instance of the good old bad old "single character string problem".

    I suggest that you grit your teeth, ignore the frustration, and simply put double quotes around every string expression in your code that could conceivably be a single character in your mind or the compiler's mind. I think.

    Yup, that's pretty much it. After a while, it becomes second nature.
  • AMXJeffAMXJeff Posts: 450
    Get_buffer_char

    GET_BUFFER_CHAR returns a CHAR not a CHAR[1]. So the return value does not have length and is not a char array. ATOI needs a CHAR array. By adding the quotes around GET_BUFFER_CHAR you are actually creating a CHAR array via concatenation. Now ATOI is happy.


    // System Function Declerations
    DEFINE_FUNCTION CHAR GET_BUFFER_CHAR(CHAR cMsg[])

    DEFINE_FUNCTION INTEGER ATOI(CHAR cMsg[])
Sign In or Register to comment.