EMC_TASK_SET_STATE state_msg;
There is no malloc because memory is allocated automatically then function is 
entered and deallocated automatically then it exit. It is allocated stack like 
and most probably on the stack but are not sure this is always the case.

Local variable I consider the best method to allocate memory then it could be 
used for several reasons, usually most important because it is a local 
variable. But it also have advantage memory could be allocated with increasing 
pointer, this is fast and deterministic. Think ADA have a method so that 
pointer to allocated memory is not remembered by misstake at compile time but 
not C/C++. If you do not know what the stack is, it is a pointer to a memory 
set aside this purpose, then a function is called adress before jump is stored 
on stack while stack pointer is updated increased/decreased, then function exit 
it is the opposite order. malloc have to find a free area while stack like 
memory just increase/decrease a pointer but it only work for local variables in 
functions.


Variable is initialized by row below although I are not sure all fields are 
initialized. Compiler may warn if it is not initialized but as I remember it 
will not warn if some fields are unitialized.
  state_msg.state = EMC_TASK_STATE_ESTOP;


malloc return a pointer to "void" which is more or less equivalent to pointer 
to unknown data type which must be the reason you get "no viable conversion 
from int to EMC_TASK_SET_STATE" warning. You have to use type conversion to get 
rid of warning (EMC_TASK_SET_STATE)malloc(...) and make sure correct size is 
allocated by using sizof(...) and you also have to remember deallocate/free 
memory then not used anymore but not before.





> >
> > Memory may be allocated with malloc but unless function
> > emcCommandBuffer->write(...) store the pointer internally, copy data
> > internally is below might be a much better idea. If state_msg variable is
> > not used further down or at least is not supposed the block will also limit
> > life time of variable.
> >
> 
> this row of code is extract from shcom.cc:
> 
> int emcCommandSend(RCS_CMD_MSG & cmd)
> {
>     // write command
>     if (emcCommandBuffer->write(&cmd)) {
>         return -1;
>     }
>     emcCommandSerialNumber = cmd.serial_number;
>     return 0;
> }
> 
> int sendEstop()
> {
>     EMC_TASK_SET_STATE state_msg;
> 
>     state_msg.state = EMC_TASK_STATE_ESTOP;
>     emcCommandSend(state_msg);
>     if (emcWaitType == EMC_WAIT_RECEIVED) {
> return emcCommandWaitReceived();
>     } else if (emcWaitType == EMC_WAIT_DONE) {
> return emcCommandWaitDone();
>     }
> 
>     return 0;
> }
> 
> but there is not malloc for state_msg and not see where is initialized ....
> 
> In my row code is the same situation .... but if try to use malloc obtain
> warning like "no viable conversion from int to EMC_TASK_SET_STATE" .... is
> because I try to use malloc with bad variable type?
> In my QtDro.h file I use these .hh file of Lcnc:
> 
> #include "include/cmd_msg.hh"
> #include "include/stat_msg.hh"
> #include "include/emc_nml.hh"
> #include <stat_msg.hh>
> #include <cmd_msg.hh>
> #include <nml.hh>
> #include "emc.hh"               // EMC NML
> #include "include/emcglb.h"             // EMC_NMLFILE, TRAJ_MAX_VELOCITY,
> TOOL_TABLE_FILE
> #include "include/emccfg.h"             // DEFAULT_TRAJ_MAX_VELOCITY
> #include "inifile.hh"           // INIFILE
> 
> Not understand how to initialize state_msg.
> 
> thanks and good end of 2019 and new 2020 at all.
> 
> bkt
> 
> Il giorno gio 19 dic 2019 alle ore 17:54 N <nicklas.karlsso...@gmail.com>
> ha scritto:
> 
> > > just a guess.
> > >
> > > EMC_TASK_SET_STATE *state_msg;
> > >
> > > state_msg is a pointer, yet no memory allocated for it.
> > >
> > > state_msg->state = EMC_TASK_STATE_OFF;
> > >
> > > you try to write in a memory space that officially has no memory
> > assigned yet.
> > >
> > > ju
> > You are correct no memory assigned. Maybe no warning for using an
> > unitialized variable, if turned a warning would be issued for using
> > unitizialized variable.
> >
> > Memory may be allocated with malloc but unless function
> > emcCommandBuffer->write(...) store the pointer internally, copy data
> > internally is below might be a much better idea. If state_msg variable is
> > not used further down or at least is not supposed the block will also limit
> > life time of variable.
> >
> > {
> >   EMC_TASK_SET_STATE state_msg;
> >
> >   state_msg.state = EMC_TASK_STATE_OFF;
> >   state_msg.serial_number = ++emcCommandSerialNumber;
> >   emcCommandBuffer->write(&state_msg);
> > }
> >
> >
> > _______________________________________________
> > Emc-developers mailing list
> > Emc-developers@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/emc-developers
> >
> 
> _______________________________________________
> Emc-developers mailing list
> Emc-developers@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/emc-developers


-- 
N <nicklas.karlsso...@gmail.com>


_______________________________________________
Emc-developers mailing list
Emc-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/emc-developers

Reply via email to