【问题标题】:What to change to make my C program more user-friendly?为了让我的 C 程序更加用户友好,需要进行哪些更改?
【发布时间】:2019-02-23 14:23:49
【问题描述】:

我有一个程序可以在 C 中创建、插入、删除和销毁优先级队列。一切正常,但我有一个任务让用户更容易创建队列。

int Error;
PrQueue* q1= create(&Error);
PrQueue* q2 = create(&Error);
PrQueue* q3 = create(&Error);

这是我创建优先级队列的方法。

PrQueue* create(int* Error)
{
PrQueue* Meta = (PrQueue*)malloc(sizeof(PrQueue));
if(Meta == NULL)
{
    *Error = 1;
    return NULL;
}
Meta->NrOfItems = 0;
Meta->Head = NULL;
*Error = 0;
return Meta;
}

这就是功能

typedef struct Element
{
int Data;
int Priority;
struct Element *Next;
struct Element *Prev;
} Element;


typedef struct
{
int NrOfItems;
struct Element *Head;

} PrQueue;

这就是结构。 所有这些代码部分都在不同的文件中。第一个是 main.c ,第二个是 functions.c ,第三个是 .h 头文件。 所以我需要以某种方式让用户更容易在 main 中创建优先级队列,我应该以某种方式摆脱 main 中的指针符号。我真的不知道它应该是什么样子,但据我所知,它不应该主要使用 * 。任何想法我应该改变什么以及如何改变?

谢谢!

【问题讨论】:

  • 你将不得不解释更多。与PrQueue *create( int *Error ) 相比,使代码更易于使用 很难。也许您可以简单地更改代码以省略int *Error 参数并使用errno 指示错误原因,因为对malloc() 的调用将设置errno 失败。除此之外?您的代码简单、直接且易于理解。 IMO 任何需要它“更容易”的人都可能在拼写 C 时遇到问题,而忘记在其中进行编码。因为当您使用malloc() 动态创建对象时,不可能不返回指针。
  • but as I understand it shouldn't use * in the main 你可以typedef the pointer 离开。我认为这是不好的做法,但如果这是你的导师想要的......
  • @martin 你应该发布到代码审查堆栈交换,因为你实际上是在要求人们审查你的代码。
  • 是的,我就是这么想的。相信我,我并不真正了解自己有什么问题,但任务很明确“从 main 中删除 * 星,以便用户更容易”。我不知道,也许我应该以某种方式将其更改为 void 功能或类似的东西? int *Error 部分无关紧要,我可以省略,但这不是重点。
  • @NickODell Maybee!我怎样才能做到这一点?

标签: c


【解决方案1】:

我的建议是将您的create() 函数转换为init() 函数;这将允许用户在其他对象和/或堆栈上创建PrQueue 对象,而不仅仅是在堆上:

void init(PrQueue * Meta)
{   
   Meta->NrOfItems = 0;
   Meta->Head = NULL;
}

这也意味着函数没有失败的可能性,因此用户不必进行任何错误检查。

用户可以这样使用它:

int main(int argc, char ** argv)
{
   PrQueue q;
   init(&q);
   [...]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2017-05-02
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多