【发布时间】:2015-03-08 04:57:37
【问题描述】:
我有这个代码:
static char * display(const u8 array[], int length) {
int i;
char *str;
for (i = 0; i < length; i++) {
if (i%32 == 0) {
//printf("\n");
strcat(str, "\n");
}
if (i%8 == 0) {
//printf(" ");
strcat(str, " ");
}
//printf("%02X", array[i]);
strcat(str, (char *)array[i]);
}
return str;
/*
char str[80];
strcpy (str,"these ");
strcat (str,"strings ");
strcat (str,"are ");
strcat (str,"concatenated.");
puts (str);
return 0;
*/
}
最初这段代码是打印一个字符串。我不希望它打印一个字符串,我需要让它返回一个字符串。但它给了我这个错误:
main.c:在函数“显示”中:
main.c:1707:9:警告:传递 'strcat' 的参数 2 生成指针 从没有强制转换的整数 [默认启用]strcat(str, array[i]); ^ In file included from main.c:61:0:/usr/include/string.h:133:14:注意:预期的 'const char * restrict' 但参数类型为 'u8' extern char *strcat (char *__restrict __dest, const char *__restrict __src)
^ sh-4.2# gcc -o main *.c
main.c:在函数“显示”中:
main.c:1707:21:警告:从不同的整数转换为指针 大小 [-Wint-to-pointer-cast]
strcat(str, (char *)array[i]);
编辑:
构建共享对象并加载:
VALUE generateIt(char *valor) {
struct NESSIEstruct w;
u8 digest[DIGESTBYTES];
int i;
for(i=0; valor[i]!='\0'; ++i);
int sizeo = i;
NESSIEinit(&w);
NESSIEadd((u8*)valor, 8*sizeo, &w);
NESSIEfinalize(&w, digest);
return displayIt(digest, DIGESTBYTES);
}
最重要的是:
#include 'ruby.h'
我还添加了这个:
void
Init_whirlpool(){
rb_mWhirlpool = rb_define_module("Whirlpool");
rb_cClass = rb_define_class_under(rb_mWhirlpool, "Class", rb_cObject);
rb_define_method(rb_cClass, "generate", generateIt, 1);
}
【问题讨论】:
-
嗯,
u8显然不是正确的类型。 -
str是一个未初始化的指针,具有未定义的值。使用时可能会崩溃。 -
@iharob * u8 -> 无符号整数类型,至少8位,相当于unsigned char
-
@PSantos
VALUE是什么ruby使用的泛型类型?类似void *?我几乎可以肯定问题是您需要使用一些 ruby 自定义内存分配功能,让解释器处理内存分配。你在哪里添加了free? -
@iharob 在 Ruby C API 中,每个 Ruby 类型/类都是一个 VALUE C 类型。实际上 VALUE 只是一个 uintptr_t C 类型,或者 void* 来简化事情。这就是 Ruby 的松散类型在 C 中实现的方式。