Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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 如何处理hashmap中缺少的键_C - Fatal编程技术网

C 如何处理hashmap中缺少的键

C 如何处理hashmap中缺少的键,c,C,当请求一个无法返回的键时,正确的错误或返回代码可能是什么 void hash_delete(hash_table* table, const char* key) { hash_item* item = hash_get(table, key); if (item == NULL) ; // what error to raise? else delete_hash_item_internal(item); } 我的想法是让函数返回一个b

当请求一个无法返回的
键时,正确的错误或返回代码可能是什么

void hash_delete(hash_table* table, const char* key)
{
    hash_item* item = hash_get(table, key);
    if (item == NULL)
        ; // what error to raise?
    else
        delete_hash_item_internal(item);
}

我的想法是让函数返回一个
bool
(1=found,0=notfound),或者执行一个
exit()
。您认为什么是处理此问题的正确方法?

您有几种可能性,因为您是设计此功能的人。但是,调用
exit()
不是一个好的选择,因为它总是强制函数执行相同的基本行为。最好让调用者有权决定停止程序、继续、记录某些内容等(正如已经在OP的评论中指出的那样)。 所以我会选择在键存在和不存在时返回不同的值。您可以在以下选项中进行选择:

  • 返回一个简单的
    bool
    。找到(删除)键时返回
    true
    。未找到键时返回
    false
    。最简单易懂的行为
  • 返回一个
    字符*
    。找到(删除)键时返回
    NULL
    。当未找到
    键时,返回该键本身。此方法允许直接根据结果采取可能的进一步行动。这可能很有用,例如,如果密钥是从函数获得的,并且除非函数失败,否则不需要存储在变量中
  • 返回一个
    散列项*
    。找到键时返回
    变量。未找到键时返回
    NULL
    。这是删除函数中最典型的行为之一,它允许将
    delete
    函数的返回值直接用作
    get
    +
    delete
    以避免单独调用。注意:根据
    哈希表
    的实现方式,此方法可能存在一些问题。例如,如果它包含指向
    hash_项的指针,则该项
    可能因此包含“valid”
    NULL
    值,这些值可以解释为删除函数而不是查找包含
    NULL
    的项。如果
    delete\u hash\u item\u internal()
    函数从存储在表中的指针(您将返回该指针)或类似的内容中释放内存,则返回
    项也可能有问题

如果我必须选择,我会选择最后一个选项(如果由于我提到的问题可能)。如果不可能,为了简单起见,我会使用第一个。但最终由设计师决定哪一个更好,同时考虑到您需要的其余代码以及您希望函数如何使用。

通过设计,此类函数通常只返回一个值,表示您是否退出应用程序或不执行任何操作时未找到输入,通常由呼叫方决定。发出错误信号的黄金法则是“被信号方是否可以对错误采取任何行动?”;如果没有,最好放弃;如果是这样,最好发出错误信号。例如,在libc中,如果无法以指定的方式访问命名文件,open()将返回一个错误;因此,open可用于探测文件。Lseek,当提供了一个
从何处
而该
未设置SEEK\u时,SEEK\u CUR,SEEK\u END
会在调用者身上发出信号。这意味着,从未定义的点进行搜索没有合理的更正。而且,将第二个和第三个参数转换为lseek()太容易了。ps:精确地填充注释的最大空间是否有额外的好处?@Jack like a
bool
表示成功/失败,或者像这样的函数通常有多个错误代码?@tadman yea这里的键是唯一的,所以它要么是1(删除),要么是0(未删除)。