On Thu, Nov 3, 2011 at 12:41 AM, Tomek CEDRO <tomek.ce...@gmail.com> wrote:

> Hey,
>
> I have some problems with pointers and need some support plz ;-)
>

I'm not sure I understand what the problem is, but I can give some general
hints.

int swd_bus_read_ack(swd_ctx_t *swdctx, swd_operation_t operation, char
> **ack){
>  swd_cmd_enqueue_miso_ack(swdctx, ack);
>

You discard the return value and one of the parameters, but perhaps this is
not the complete function?

}
>
> int swd_cmd_enqueue_miso_ack(swd_ctx_t *swdctx, char **ack){
>  if (swdctx==NULL) return SWD_ERROR_NULLCONTEXT;
>  int res;
>  swd_cmd_t *cmd;
>  cmd=(swd_cmd_t *)calloc(1,sizeof(swd_cmd_t));
>

As a side note, cmd = calloc(1, sizeof(*cmd)); is preferred, in case the
type of cmd changes later.

 if (cmd==NULL) return SWD_ERROR_OUTOFMEM;
>  if (ack!=NULL) *ack=&cmd->ack;
>

You probably want to wait with setting *ack until after checking res below.
If swd_cmd_enqueue fails, ack will point to free'd memory, but you discard
the return value in swd_bus_read_ack so the caller won't be able to tell.
Leave *ack unchanged unless the function succeeds.

 cmd->bits=SWD_ACK_BITLEN;
>  cmd->cmdtype=SWD_CMDTYPE_MISO_ACK;
>  res=swd_cmd_enqueue(swdctx, cmd); //should be 1 on success
>  if (res<1) free(cmd);
>  return res;
> }
>
> main(){
> int *ack;

swd_bus_read_ack(swdctx, operation, ack);
>

This won't even compile. You pass a pointer-to-int, but swd_bus_read_ack
expects a pointer-to-pointer-to-char.

}
>
> The problem is:
> 1. I need to use double pointers to return back the address of the
> queue element (*ack=&cmd->ack).
>

Correct.

2. If I use single pointer *ack the value of the ack is only changed
> inside swd_cmd_enqueue_miso_ack() but after its return to
> swd_bus_read_ack() the ack value is taken back to the state as it was
> before swd_cmd_enqueue_miso_ack() call.
>

You have already concluded that you need a double pointer in 1, so I don't
know why you say this. A single pointer won't work.

3. I have tried to use single pointer *ack and call
> swd_bus_read_ack(swdctx, operation, &ack) but is changes nothing.
>

Ditto. You're reusing the same name (ack) for several things in your
description (two function parameters and a variable) so it's hard to
understand what you mean.


> This makes impossible to give back data on queue_dp_read(). There is
> something wrong with these pointers!!! Help! :-)
>
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to