Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用apr\u数组\u推入D追加数组_C_Svn_Segmentation Fault_D_Apr - Fatal编程技术网

C 使用apr\u数组\u推入D追加数组

C 使用apr\u数组\u推入D追加数组,c,svn,segmentation-fault,d,apr,C,Svn,Segmentation Fault,D,Apr,我正在用svn编写一个D语言的程序,我遇到了一些我不知道如何转换成D语法的东西。我试了一下,但发现有毛病 我试图用C语言实现的示例: svn_auth_provider_object_t provider; providers = apr_array_make(pool, 1, sizeof(svn_auth_provider_object_t*)); svn_auth_get_simple_provider2(&provider, null, null, pool); *(svn_au

我正在用svn编写一个D语言的程序,我遇到了一些我不知道如何转换成D语法的东西。我试了一下,但发现有毛病

我试图用C语言实现的示例:

svn_auth_provider_object_t provider;
providers = apr_array_make(pool, 1, sizeof(svn_auth_provider_object_t*));
svn_auth_get_simple_provider2(&provider, null, null, pool);
*(svn_auth_provider_object_t**)apr_array_push (providers) = provider;
svn_auth_open(&auth_baton, providers, pool);
据我所知,这段代码运行得很好。我发现有几个例子几乎都是这样做的。 以下是我尝试在D中复制的内容:

svn_auth_provider_object_t provider;
providers = apr_array_make(pool, 1, svn_auth_provider_object_t.sizeof);
svn_auth_get_simple_provider2(&provider, null, null, pool);
void* newSlot = apr_array_push(m);
newSlot = provider;
svn_auth_open(&auth_baton, providers, pool);
这会在svn_auth_open上引发分段错误。 我最好的猜测是,提供者的内容并不是以newSlot所持有的指针结束的。我不知道这是为什么

补充守则:

/// Code taken from Apache's APR libary which is licensed under Apache License, Version 2.0

struct apr_array_header_t {
    apr_pool_t* pool;
    int elt_size;
    int nelts;
    int nalloc;
    char* elts;
};

struct svn_auth_provider_object_t
{
    svn_auth_provider_t *vtable;
    void *provider_baton;
}

APR_DECLARE(void *) apr_array_push(apr_array_header_t *arr)
{
    if (arr->nelts == arr->nalloc) {
        int new_size = (arr->nalloc <= 0) ? 1 : arr->nalloc * 2;
        char *new_data;

        new_data = apr_palloc(arr->pool, arr->elt_size * new_size);

        memcpy(new_data, arr->elts, arr->nalloc * arr->elt_size);
        memset(new_data + arr->nalloc * arr->elt_size, 0,
               arr->elt_size * (new_size - arr->nalloc));
        arr->elts = new_data;
        arr->nalloc = new_size;
    }

    ++arr->nelts;
    return arr->elts + (arr->elt_size * (arr->nelts - 1));
}

#define APR_ARRAY_IDX(ary,i,type) (((type *)(ary)->elts)[i])
#define APR_ARRAY_PUSH(ary,type) (*((type *)apr_array_push(ary)))

void
svn_auth_open(svn_auth_baton_t **auth_baton,
              apr_array_header_t *providers,
              apr_pool_t *pool)
{
  svn_auth_baton_t *ab;
  svn_auth_provider_object_t *provider;
  int i;

  /* Build the auth_baton. */
  ab = apr_pcalloc(pool, sizeof(*ab));
  ab->tables = apr_hash_make(pool);
  ab->parameters = apr_hash_make(pool);
  ab->creds_cache = apr_hash_make(pool);
  ab->pool = pool;

  /* Register each provider in order.  Providers of different
     credentials will be automatically sorted into different tables by
     register_provider(). */
  for (i = 0; i < providers->nelts; i++)
    {
      provider_set_t *table;
      provider = APR_ARRAY_IDX(providers, i, svn_auth_provider_object_t *);

      /* Add it to the appropriate table in the auth_baton */
      table = apr_hash_get(ab->tables,
                           provider->vtable->cred_kind, APR_HASH_KEY_STRING);
      if (! table)
        {
          table = apr_pcalloc(pool, sizeof(*table));
          table->providers
            = apr_array_make(pool, 1, sizeof(svn_auth_provider_object_t *));

          apr_hash_set(ab->tables,
                       provider->vtable->cred_kind, APR_HASH_KEY_STRING,
                       table);
        }
      APR_ARRAY_PUSH(table->providers, svn_auth_provider_object_t *)
        = provider;
    }

  *auth_baton = ab;
}
因此,这排除了我的理论,即数据没有到达正确的位置。但是,如果我注释掉数组推行,并将数组发送为空,则效果良好。 因此,这并不意味着:

providers = apr_array_make(pool, 1, svn_auth_provider_object_t.sizeof);
svn_auth_open(&auth_baton, providers, pool);
我也知道它不是svn_auth_get_simple_provider2,因为这也是一个错误

providers = apr_array_make(pool, 1, svn_auth_provider_object_t.sizeof);
svn_auth_provider_object_t* newSlot = cast(svn_auth_provider_object_t*) apr_array_push(providers);
svn_auth_get_ssl_server_trust_file_provider(&newSlot, pool);
svn_auth_open(&auth_baton, providers, pool);

乍一看,对newSlot的第一个赋值是无效的,因为下一行将其覆盖,并将其设置为
null
。尝试:

auto newSlot = cast(svn_auth_provider_object_t**)apr_array_push(m);
*newSlot = provider;
如果不是
void*
,这将导致编译时错误


我认为C版本中唯一无效的D部分是cast。

作为确定segfault的方法,gdb 7.2版应该与D一起使用。因此,如果您使用
-gc
编译并启用了内核转储,然后,您应该能够通过使用gdb看到是什么导致了SEGD故障。我对编写可编译为机器语言的程序不太熟悉。因此,我不熟悉gdb,我正在尝试使用它,但它并不期望它能与D很好地工作。到目前为止,我所能做的就是回溯。auto不是一种类型。它允许推断类型,因为编译器知道从函数返回什么类型。该类型不能更改,您可以使用typeid(var)找到它是什么。这就成功了!即使我错误地将
m'变量留在那里。我将进一步研究这种
auto”类型。我以前看过,但我认为完全理解它会有帮助。如果您能推荐任何资源,我们将不胜感激,因为D文档似乎很少。@Jacks\u Depression:auto只是一个占位符(const或immutable也可以)。一般形式是,类型可以从声明和初始化中省略,并假定它是分配给它的事物的类型:
auto newSlot = cast(svn_auth_provider_object_t**)apr_array_push(m);
*newSlot = provider;