Something is not right with the fragment you sent.
You start an escaped C block with "%{" but that block is never closed.
So, the SNL compiler passes the rest of the code to the C compiler
which does not have a definition for roba.
Try something like this:
ss string_handler {
state stateN {
when () {
/* rob_pj is the string received from the device: "1+32.23" or
"2-50.01" */
sscanf(rob_pj, "%d%f", &chanNum, &value);
if ( (1 <= chanNum) && (chanNum <= 5) ) {
channel[chanNum-1] = value;
pvPut(channel[chanNum-1]);
}
} state stateN
}
}
Pete
Jiro Fujita wrote:
> Eric,
> Here is what the code looks like right now:
>
> program snchygrometer
>
> %%#include <ctype.h>
> %%#include <stdlib.h>
> %%#include <stdio.h>
>
> %%char rob[10] ;
> char *roba;
> assign roba to "rawdata" ;
> monitor roba ;
> float ch1 ;
> float ch2 ;
> float ch3 ;
> float ch4 ;
> float ch5 ;
> assign ch1 to "PV1";
> assign ch2 to "PV2";
> assign ch3 to "PV3";
> assign ch4 to "PV4";
> assign ch5 to "PV5";
>
> %%int v ;
> %%int z ;
> %%extern char *wa1 ;
> %%char *sign="+-" ;
>
> %{
> when()
> {
> rob=&roba; /*i dont know how to do this & wont work w/ roba as just
> rob*/
> v=rob[0]; /*Get first char from string*/
> wa1=strpbrk(rob, "+-"); /*Break string at +-,rest is wa1*/
> z=(float)wa1; /*convert string to float z*/
>
> ss ss1 {
> state state1 {
> when ( v==1) {
> ch1 = z; pvPut(ch1);
> } state state2
> }
> state state2 {
> when ( v==2) {
> ch2 = z; pvPut(ch2);
> } state state3
> }
> state state3 {
> when ( v==3) {
> ch3 = z; pvPut(ch3);
> } state state4
> }
> state state4 {
> when ( v==4) {
> ch4 = z; pvPut(ch4);
> } state state5
> }
> state state5 {
> when ( v==5) {
> ch5 = z; pvPut(ch5);
> } state state1
> }
> }
>
>
> (This is the entire code).
> and here is the error we are getting:
>
> make[3]: Entering directory
> `/home/sysuser/epics3.14.8.2/hygrometerApp/hygrometerApp/src/O.linux-x86'
> /usr/bin/gcc -c -D_POSIX_C_SOURCE=199506L -D_POSIX_THREADS
> -D_XOPEN_SOURCE=500 -D_X86_ -DUNIX -D_BSD_SOURCE -Dlinux
> -D_REENTRANT -ansi -O3 -Wall -g -I. -I..
> -I../../../include/os/Linux -I../../../include
> -I/home/sysuser/epics3.14.8.2/base-3.14.8.2/../modules/soft/seq-2.0.11/include/os/Linux
>
> -I/home/sysuser/epics3.14.8.2/base-3.14.8.2/../modules/soft/seq-2.0.11/include
>
> -I/home/sysuser/epics3.14.8.2/base-3.14.8.2/include/os/Linux
> -I/home/sysuser/epics3.14.8.2/base-3.14.8.2/include
> -I/home/sysuser/epics3.14.8.2/modules/soft/asyn/4-6/include/os/Linux
> -I/home/sysuser/epics3.14.8.2/modules/soft/asyn/4-6/include
> sncProgram.c
> ../sncExample.stt:35: warning: return type defaults to `int'
> ../sncExample.stt: In function `when':
> ../sncExample.stt:36: `roba' undeclared (first use in this function)
> ../sncExample.stt:36: (Each undeclared identifier is reported only once
> ../sncExample.stt:36: for each function it appears in.)
> ../sncExample.stt:39: pointer value used where a floating point value
> was expected
> make[3]: *** [sncProgram.o] Error 1
> make[3]: Leaving directory
> `/home/sysuser/epics3.14.8.2/hygrometerApp/hygrometerApp/src/O.linux-x86'
> make[2]: *** [install.linux-x86] Error 2
> make[2]: Leaving directory
> `/home/sysuser/epics3.14.8.2/hygrometerApp/hygrometerApp/src'
> make[1]: *** [src.install] Error 2
> make[1]: Leaving directory
> `/home/sysuser/epics3.14.8.2/hygrometerApp/hygrometerApp'
> make: *** [hygrometerApp.install] Error 2
>
> What we are wondering is, why does it think rob is defaulting to int,
> when we are setting it as char?? Obviously, there is something wrong
> with array vs pointer (this is what I have been telling to my
> students), but this seems to compile without any issues outside of
> EPICS (well, the original ones we started out did, anyway).
>
> On 6/29/06, Eric Norum <[email protected]> wrote:
>>
>> I'm not sure what you have changed, but the code you posted
>> originally seems
>> to be mixing up the notion of "array of characters" and "pointer to
>> character". See my comment below:
>>
>> program snchygrometer
>>
>> %%#include <ctype.h>
>> %%#include <stdlib.h>
>> %%#include <stdio.h>
>>
>> %%char rob[10] ;
>> char *roba;
>> assign roba to "rawdata" ;
>> monitor roba ;
>> float ch1 ;
>> float ch2 ;
>> float ch3 ;
>> float ch4 ;
>> float ch5 ;
>> assign ch1 to "PV1";
>> assign ch2 to "PV2";
>> assign ch3 to "PV3";
>> assign ch4 to "PV4";
>> assign ch5 to "PV5";
>>
>> int v ;
>> float z ;
>> %%extern char *wa1 ;
>> %%char *sign="+-" ;
>>
>> %{
>> rob=&roba <<<<<<<<<<<<< EVEN WITH A SEMICOLON AT
>> THE END
>> THIS LINE MAKES NO SENSE.
>> v=rob[0]; /*Get first char from string*/
>> wa1=strpbrk(rob, "+-"); /*Break string at +-,rest is wa1*/
>> z=(float)wa1; /*convert string to float z*/
>> }%
>>
>>
>>
>> Perhaps you could mail me your latest code??
>>
>>
>> --
>> Eric Norum <[email protected]>
>> Advanced Photon Source
>> Argonne National Laboratory
>> (630) 252-4793
>>
>>
--
----------------------------------------------------------
Pete R. Jemian, Ph.D. <[email protected]>
Beam line Controls and Data Acquisition, Group Leader
Advanced Photon Source, Argonne National Laboratory
Argonne, IL 60439 630 - 252 - 3189
-----------------------------------------------------------
Education is the one thing for which people
are willing to pay yet not receive.
-----------------------------------------------------------