Как вернуть значение из указателя в C - PullRequest
0 голосов
/ 08 июля 2011

У меня есть следующий код, и я хотел бы вернуть значение 'out' и распечатать его в файл. Как мне вернуть значение «out» вместо местоположения. Кроме того, как я могу вызвать функцию uint32_pack из основной функции? Спасибо за вашу помощь.

#if HAVE_PROTOBUF_C_CONFIG_H
#include "protobuf-c-config.h"
#endif
#include <stdio.h>                      /* for occasional printf()s */
#include <stdlib.h>                     /* for abort(), malloc() etc */
#include <string.h>                     /* for strlen(), memcpy(), memmove() */
#if HAVE_ALLOCA_H
#include <alloca.h>
#elif HAVE_MALLOC_H
#include <malloc.h>
#endif

#include "protobuf-c.h"

int main(void){
uint32_t hexvalue = 0x20;
int gnuvalue;
uint8_t fake_out;
  FILE *fp;

  fp = fopen("binarydata.txt","w");
  gnuvalue = uint32_pack (hexvalue, fake_out);
  fprintf(fp,"%x",gnuvalue);
  fclose(fp);
}


/* === pack() === */
/* Pack an unsigned 32-bit integer in base-128 encoding, and return the number of bytes needed:
   this will be 5 or less. */
static inline size_t
uint32_pack (uint32_t value, uint8_t *out)
{
  unsigned rv = 0;

  if (value >= 0x80)
    {
      out[rv++] = value | 0x80;
      value >>= 7;
      if (value >= 0x80)
        {
          out[rv++] = value | 0x80;
          value >>= 7;
          if (value >= 0x80)
            {
              out[rv++] = value | 0x80;
              value >>= 7;
              if (value >= 0x80)
                {
                  out[rv++] = value | 0x80;
                  value >>= 7;
                }
            }
        }

  /* assert: value<128 */
  out[rv++] = value;
  return &out;
  }
}

Ответы [ 3 ]

1 голос
/ 08 июля 2011

Здесь в вашем коде есть что-то странное

  uint8_t fake_out;
  gnuvalue = uint32_pack (hexvalue, fake_out);

, в то время как прототипу для uint32_pack нужно uint8_t *, поэтому оно должно быть &fake_out.А затем, чтобы вернуть его, вам нужно просто разыменовать указатель, чтобы изменить fake_out, что-то вроде *out = value;.

Если вам нужно вернуть два значения (gnuvalue и fake_out), вот как вы можете.

Другим вариантом может быть возвращение указателя на структуру malloc-ed в функции (тогда вам нужно ее рано или поздно освободить), и структура содержит как "gnuvalue", так и "fake_out".

1 голос
/ 08 июля 2011

Вы хотите разыменовать указатель, используя унарный оператор *, например:

return *out;

При этом он вернет значение, сохраненное в месте, указанном out.

0 голосов
/ 08 июля 2011

Вы должны вернуть *out. И обновите комментарий, чтобы отразить это. На практике кажется, что out должно вписываться в size_t (т.е. sizeof size_t будет достаточно большим), но предполагать это хакерством *

При вызове с основного, текущий способ не будет работать, потому что fake_out это uint8_t, а не uint8_t*. Конечно, &fakeout завершится сбоем, так что не делайте этого, вы должны выделить достаточно большой массив uint8_t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...