需要帮助设计带有约束的比较器
Need help designing a comparator with constraints
我正在尝试编写一个比较器来比较两个“签名”。所以我在想我可以写一个函数,给它一个“签名”returns一个整数值。
int *signature_to_integer(Signature *sig) {
// TODO
}
但是,我有两个限制:
- 比较器应包括“签名”结构的所有字段
- 要比较两个
ASTNode
,我需要在定义它们的源代码中使用它们的 行号 来比较它们
所以我想我可以做这样的事情:
int val = is_input * 1 + is_var * 10 + line_number(source_class) * 100 + num_actuals * 1000 + ...;
但这是个坏主意,因为行号可能大于 1000,这会打乱我的逻辑。我感谢任何提示或想法。
谢谢。
“签名”结构:
struct Signature_type
{
bool is_input;
bool is_var;
ASTNode source_class;
int num_actuals;
ASTNode actuals[];
};
typedef struct Signature_type Signature;
I was thinking I can write a function that given a "Signature" it returns an integer value.
I appreciate any hint or ideas.
不要编写将对象转换为整数值的函数。相反:
I trying to write a comparator to compare two "Signature"s
这样做。模仿传递给 qsort
.
的函数指针的 return 值
// return an integer less than, equal to, or greater than zero
// if the first argument is considered to
// be respectively less than, equal to, or greater than the second.
int signature_compare(const Signature *sig1, const Signature *sig2) {
if (sig1->is_input != sig2->is_input) {
// decide ordering. Should sig1 be _before_ sig2_?
// return sig1->is_input < sig2->is_input ? -1 : 1;
return sig1->is_input < sig2->is_input ? 1 : -1;
}
if (sig1->is_var != sig2->is_var) {
return sig1->is_var - sig2->is_var;
}
if (line_number(sig1->source_class) != line_number(sig2->source_class)) {
// note: substraction with int's may overflow
// handle specific cases
return line_number(sig1->source_class) - line_number(sig2->source_class);
}
// etc. etc. etc.
return 0;
}
我正在尝试编写一个比较器来比较两个“签名”。所以我在想我可以写一个函数,给它一个“签名”returns一个整数值。
int *signature_to_integer(Signature *sig) {
// TODO
}
但是,我有两个限制:
- 比较器应包括“签名”结构的所有字段
- 要比较两个
ASTNode
,我需要在定义它们的源代码中使用它们的 行号 来比较它们
所以我想我可以做这样的事情:
int val = is_input * 1 + is_var * 10 + line_number(source_class) * 100 + num_actuals * 1000 + ...;
但这是个坏主意,因为行号可能大于 1000,这会打乱我的逻辑。我感谢任何提示或想法。
谢谢。
“签名”结构:
struct Signature_type
{
bool is_input;
bool is_var;
ASTNode source_class;
int num_actuals;
ASTNode actuals[];
};
typedef struct Signature_type Signature;
I was thinking I can write a function that given a "Signature" it returns an integer value.
I appreciate any hint or ideas.
不要编写将对象转换为整数值的函数。相反:
I trying to write a comparator to compare two "Signature"s
这样做。模仿传递给 qsort
.
// return an integer less than, equal to, or greater than zero
// if the first argument is considered to
// be respectively less than, equal to, or greater than the second.
int signature_compare(const Signature *sig1, const Signature *sig2) {
if (sig1->is_input != sig2->is_input) {
// decide ordering. Should sig1 be _before_ sig2_?
// return sig1->is_input < sig2->is_input ? -1 : 1;
return sig1->is_input < sig2->is_input ? 1 : -1;
}
if (sig1->is_var != sig2->is_var) {
return sig1->is_var - sig2->is_var;
}
if (line_number(sig1->source_class) != line_number(sig2->source_class)) {
// note: substraction with int's may overflow
// handle specific cases
return line_number(sig1->source_class) - line_number(sig2->source_class);
}
// etc. etc. etc.
return 0;
}