Как работает эта функция? - PullRequest
       5

Как работает эта функция?

2 голосов
/ 19 августа 2011

Я анализировал библиотеки gsl. Abd натолкнулся на заголовочный файл gsl_block_double.h и несколько исходных файлов с определениями функций. Одним из многих является block_source.c. Я не знаю C, поэтому я не уверен, как эти функции работают и как мне следует реализовывать их в C ++. В любом случае, вот заголовок и исходный файл с определениями двух его функций:

#ifndef __GSL_BLOCK_DOUBLE_H__
#define __GSL_BLOCK_DOUBLE_H__

#include <stdlib.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_types.h>

#undef __BEGIN_DECLS
#undef __END_DECLS
#ifdef __cplusplus
# define __BEGIN_DECLS extern "C" {
# define __END_DECLS }
#else
# define __BEGIN_DECLS /* empty */
# define __END_DECLS /* empty */
#endif

__BEGIN_DECLS

struct gsl_block_struct
{
  size_t size;
  double *data;
};

typedef struct gsl_block_struct gsl_block;

GSL_EXPORT gsl_block *gsl_block_alloc (const size_t n);
GSL_EXPORT gsl_block *gsl_block_calloc (const size_t n);
GSL_EXPORT void gsl_block_free (gsl_block * b);

GSL_EXPORT int gsl_block_fread (FILE * stream, gsl_block * b);
GSL_EXPORT int gsl_block_fwrite (FILE * stream, const gsl_block * b);
GSL_EXPORT int gsl_block_fscanf (FILE * stream, gsl_block * b);
GSL_EXPORT int gsl_block_fprintf (FILE * stream, const gsl_block * b, const char *format);

GSL_EXPORT int gsl_block_raw_fread (FILE * stream, double * b, const size_t n, const size_t stride);
GSL_EXPORT int gsl_block_raw_fwrite (FILE * stream, const double * b, const size_t n, const size_t stride);
GSL_EXPORT int gsl_block_raw_fscanf (FILE * stream, double * b, const size_t n, const size_t stride);
GSL_EXPORT int gsl_block_raw_fprintf (FILE * stream, const double * b, const size_t n, const size_t stride, const char *format);

GSL_EXPORT size_t gsl_block_size (const gsl_block * b);
GSL_EXPORT double * gsl_block_data (const gsl_block * b);

__END_DECLS

#endif /* __GSL_BLOCK_DOUBLE_H__ */

// block_source.c

size_t
FUNCTION(gsl_block,size) (const TYPE(gsl_block) * b)
{
  return b->size ;
}

ATOMIC *
FUNCTION(gsl_block,data) (const TYPE(gsl_block) * b)
{
  return b->data ;
}

Любая помощь будет принята с благодарностью! Спасибо.

РЕДАКТИРОВАТЬ: я чувствую, что мне нужно указать, что определены следующие функции:

size_t gsl_block_size (const gsl_block * b);
double * gsl_block_data (const gsl_block * b);

1 Ответ

0 голосов
/ 19 августа 2011

Что именно вы не понимаете, не понятно мне из вопроса?Я не знаю, что такое макрос FUNCTION, но то, что вы видите здесь, это, вероятно, две функции ООП get.

Вы можете думать о нем как об объекте типа gsl_block (в c ++, вероятно, по-другому называют), который имеетполучить функции для внутренних необработанных данных (b-> data) и одну для ее размера (b-> size).

...