C 使用apr\u数组\u推入D追加数组
我正在用svn编写一个D语言的程序,我遇到了一些我不知道如何转换成D语法的东西。我试了一下,但发现有毛病 我试图用C语言实现的示例: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_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;