2

私はgslライブラリを分析してきましたが、abdはヘッダーファイルgsl_block_double.hとその関数定義を持つ複数のソースファイルに出くわしました。多くの1つはblock_source.cです。私はCを知らないので、これらの関数がどのように機能し、C++でそれらを実装する方法がわかりません。とにかく、ここにその2つの機能の定義を含むヘッダーとソースファイルがあります。

#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);
4

1 に答える 1

0

あなたが正確に理解していないことは、質問から私には明らかではありませんか? FUNCTION マクロが何かはわかりませんが、ここに表示されているのはおそらく 2 つの OOP get 関数です。

これは gsl_block 型のオブジェクト (c++ では、おそらく名前が異なる) と考えることができます。このオブジェクトには、内部生データ (b->data) 用の 2 つの get 関数と、そのサイズ (b->size) 用の 1 つの関数があります。

于 2011-08-19T04:18:25.343 に答える