停止printf打印两次在C中运行检查框架?

巴托·拜尔·齐雷诺夫
  1. 大概深入地解释在c和c线程中如何进行打印将可以解决该问题
  2. 在任何时候都没有使用循环和scanf
  3. 因为我的代码使用检查框架,所以我会假设正在进行一些分叉。
  4. 最有可能与缓冲区有关,因此我正在使用fflush(stdout),以防万一是由于框架内的某些东西引起的,我希望知道框架的人会解释发生的事情。
  5. 检查框架页面check.sourceforge.net
  6. Git链接是否可以以某种方式帮助https://github.com/batousik/Practical-C2
  7. 链接到构建/测试日志,在第438行,打印开始https://travis-ci.org/batousik/Practical-C2/builds/53513707

代码样例

START_TEST(test_START_EMPTY_TREE_TREEBASE_PRINT_FREETREE_TEST) {
    printf("_________START_EMPTY_TREE/TREEBASE_PRINT/FREETREE_TEST__________\n");
    fflush(stdout);

    int *ptr;
    for (int i = 0; i < arr_size; i++) {
        ptr = malloc(sizeof(int));
        memcpy(ptr, (int_arr_ptr + i), sizeof(int));
        insert(ptr_tree_base_int_1, ptr);
    }
    // should print tree
    printf("!!!Next lines has to be tree printed out\n");
    fflush(stdout);
    ck_assert_int_eq(printTree(ptr_tree_base_int_1), true);
    printf("_____________________\n");
    fflush(stdout);

    // No output
    ck_assert_int_eq(freeTree(ptr_tree_base_int_1), true);
    // should print cannot free empty tree
    printf("!!!Next line has to be:\"cannot free empty tree\"\n");
    fflush(stdout);
    ck_assert_int_eq(freeTree(ptr_tree_base_int_1), true);

    // should print cannot print empty tree
    printf("!!!Next line has to be:\"cannot print empty tree\"\n");
    fflush(stdout);
    ck_assert_int_eq(printTree(ptr_tree_base_int_1), false);
    printf("_____________________\n");
    fflush(stdout);

    ptr_tree_base_int_1 = NULL;
    free(ptr_tree_base_int_1);

    // should print cannot free empty tree base
    printf("!!!Next line has to be:\"cannot free empty tree base\"\n");
    fflush(stdout);
    ck_assert_int_eq(freeTree(ptr_tree_base_int_1), true);

    // should print cannot print empty tree base
    printf("!!!Next line has to be:\"cannot print empty tree base\"\n");
    fflush(stdout);
    ck_assert_int_eq(printTree(ptr_tree_base_int_1), false);
    printf("_____________________\n");
    fflush(stdout);

    free(int_arr_ptr);
    int_arr_ptr = NULL;
    printf("freeing the array...\n");
    fflush(stdout);
    printf("________END_____________\n");
    fflush(stdout);
    ck_assert_int_eq(ptr_tree_base_int_1->size, 0);
} END_TEST

PrintTree功能

bool printTree(TreeBase *tree){
void *previous = NULL;
int cnt_tasks = 0;
if (!tree) {
    printf("PRINT: Cannot print empty tree base\n");
    fflush(stdout);
    return false;
}
/* set current to root of binary tree */
TreeNode *current_node = tree->base;
if (!(tree->base)) {
    printf("PRINT: Cannot print empty tree\n");
    fflush(stdout);
    return false;
}
StackNode *stack = NULL;
while (true) {
    if(current_node) {
        push(&stack, current_node);
        current_node = current_node->left;
    } else {
        if (stack) {
            current_node = pop(&stack);
            if (cnt_tasks > 1) {
                if (tree->comp(previous, current_node->value) != -1) {
                    printf("PRINTTREE: Invalid BST\n");
                    fflush(stdout);
                    assert(NULL);
                }
            }
            previous = current_node->value;
            tree->print(current_node->value);
            cnt_tasks++;
            current_node = current_node->right;
        } else {
            return (cnt_tasks == tree->size);
        }
    }
}

}

树->打印功能

void print_ints(void *p){
   printf("%d\n", *(int*)p);
   fflush(stdout);
}

样品输出

    FREETREE: Cant free empty tree
    !!!Next line has to be:"cannot free empty tree"
    FREETREE: Cant free empty tree
    FREETREE: Cant free empty tree
    !!!Next line has to be:"cannot print empty tree"
    PRINT: Cannot print empty tree
    PRINT: Cannot print empty tree
    _____________________

那是很多代码,要点在!!!之后!应该有一行,但印有两行

    printf("PRINT: Cannot print empty tree\n");
    fflush(stdout);
    return false;

^^此行打印两次

提意见:什么是“宏”?这是从API

#define     ck_assert_int_eq(X, Y)   _ck_assert_int(X, ==, Y)
侦探眼

Check单元测试框架的0.9.6版中引入ck_assert_int_eq 定义为:

#define _ck_assert_int(X, O, Y) ck_assert_msg((X) O (Y), \
  "Assertion '"#X#O#Y"' failed: "#X"==%d, "#Y"==%d", X, Y) 
#define ck_assert_int_eq(X, Y) _ck_assert_int(X, ==, Y) 

可以看出,参数在宏定义中出现两次:一次用于实际的相等性检查((X) O (Y)部分),另一次ck_assert_msg(..., X, Y)用于最后的参数,以便在发生故障时记录消息。查看代码的特定部分:

// should print cannot print empty tree
printf("!!!Next line has to be:\"cannot print empty tree\"\n");
fflush(stdout);
ck_assert_int_eq(printTree(ptr_tree_base_int_1), false);

C预处理器将相应地将宏扩展为等效于以下代码:

// should print cannot free empty tree
printf("!!!Next line has to be:\"cannot free empty tree\"\n");
fflush(stdout);
ck_assert_msg((printTree(ptr_tree_base_int_1)) == (false), 
  "Assertion '"#X#O#Y"' failed: "#X"==%d, "#Y"==%d", 
  printTree(ptr_tree_base_int_1), false);

printTree因此,函数被调用两次,并具有所有相关的副作用,包括"PRINT: Cannot print empty tree"两次打印该行保护自己免受此类错误影响的一种方法是,确保宏参数不会产生任何副作用。这可以通过将调用移到printTree宏外部来实现:

bool printTreeResult;
printTreeResult = printTree(ptr_tree_base_int_1);
ck_assert_int_eq(printTreeResult, false);

请注意,由于此类宏通常容易出错(如您刚刚所经历的那样),因此ck_assert_int_eq0.9.9版中将的定义改进为:

#define _ck_assert_int(X, OP, Y) do { \
  int _ck_x = (X); \
  int _ck_y = (Y); \
  ck_assert_msg(_ck_x OP _ck_y, \
    "Assertion '"#X#OP#Y"' failed: "#X"==%d, "#Y"==%d", _ck_x, _ck_y); \
} while (0)
#define ck_assert_int_eq(X, Y) _ck_assert_int(X, ==, Y)

相应地,解决输出线重复的问题的另一种方法是,如果可以的话,将Check单元测试框架的安装升级到更新的版本(即至少为0.9.9)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C中使用printf时,为什么字符串两次打印两次?

来自分类Dev

jQuery停止功能运行两次

来自分类Dev

在XCode IDE中运行main.c两次

来自分类Dev

宏中的消息打印了两次

来自分类Dev

C ++输出被打印两次

来自分类Dev

为什么我的 printf() 语句运行两次?

来自分类Dev

脚本在raspbian中运行两次

来自分类Dev

如何停止Xamarin.UITest运行两次Tests?

来自分类Dev

如何停止Xamarin.UITest运行两次Tests?

来自分类Dev

打印语句在 perl 的外部块中打印两次

来自分类Dev

Nodejs打印两次

来自分类Dev

打印日期两次

来自分类Dev

printf在C中打印2次输出

来自分类Dev

检查 if 语句两次

来自分类Dev

在 SQL Server 中两次打印相同的行

来自分类Dev

在python中打印和数组两次

来自分类Dev

PrintWriter 在文件中打印两次“line.separator”

来自分类Dev

C:字符串错误打印两次

来自分类Dev

C ++ ifstream; 每个'\ n'字符打印两次

来自分类Dev

processMessage运行两次

来自分类Dev

TimePickerDialog运行两次

来自分类Dev

两次运行服务

来自分类Dev

SlideUp()运行两次

来自分类Dev

C ++程序连续两次尝试运行写循环时显示“ ..停止工作”错误

来自分类Dev

在java中检查当前时间是否在两次

来自分类Dev

检查元素是否在数组中两次

来自分类Dev

检查数组javascript中是否存在两次值

来自分类Dev

FCGX_Accept_r在C上的简单FastCGI应用程序中运行两次

来自分类Dev

如果用户在C#中单击多次,如何防止按钮代码运行两次?