控制到达 C 中非 void 函数的结尾

Posted

技术标签:

【中文标题】控制到达 C 中非 void 函数的结尾【英文标题】:Control reaches end of non-void function in C 【发布时间】:2018-10-23 08:44:35 【问题描述】:

我想检查一个数组是否在 C 中按 acs 或 desc 顺序排序。 这是使用 mpicc -Wall -o file file.c 编译的结果,因为我在后面的代码中使用了 MPI 库。

mypractice1.c: In function ‘isSorted’:
mypractice1.c:38:1: warning: control reaches end of non-void function [-Wreturn-type]
 
 ^
/usr/bin/ld: unrecognised emulation mode: ypractice1
Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu i386linux elf_l1om elf_k1om i386pep i386pe
collect2: error: ld returned 1 exit status

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <mpi.h>



//Function to check the order

 int isSorted(int size, int array[]) 

   if(size<=1) 
    return 1; //is ordered
    int i;
    for(i = 1; i < size; i++)
    if(array[i] >= array[i-1])
        return 1; //is Sorted ascending
    else if (array[i]< array[i-1])
return 2; //is sorted descending
else return 0;  //is not ordered


我该如何解决这个错误?

【问题讨论】:

请说明您看到的问题。现在问题说“编译得不是很好”,但是您可以通过引用编译错误消息来使其更清楚。还请显示编译器在哪一行抱怨(例如,如果它说“第 15 行”,请在代码中添加注释“第 15 行在这里”,这样人们会很容易看到它)。 int *orden = isSorted(num_elements_per_proc, buffer); - orden 是一个指向 int 的指针,isSorted 返回 int 编译不好是什么意思?它要么编译,要么不编译。 randomNumbers() 不返回任何内容。尝试使用-Wall 编译并首先修复所有警告。 这就是分段错误。 【参考方案1】:

你说你有:

// Function to check the order

int isSorted(int size, int array[])

    if (size <= 1)
        return 1; // is ordered
    for (int i = 1; i < size; i++)
    
        if (array[i] >= array[i - 1])
            return 1; // is Sorted ascending
        else if (array[i] < array[i - 1])
            return 2; // is sorted descending
        else
            return 0; // is not ordered
    

您不能只检查前两个值而返回。您可能应该定义您希望数据按升序还是降序排序,并验证这是您所拥有的,但如果您真的想分析数据的顺序,那么您可以使用:

// Function to check the order
//  0 all equal
//  1 non-decreasing (ascending)
//  2 non-increasing (descending)
// -1 inconsistent (some ascending, some descending)

int isSorted(int size, int array[])

    if (size <= 1)
        return 1;      // is ordered; deemed ascending

    int num_eq = 0;    // Number of adjacent pairs that are equal
    int num_lt = 0;    // Number of adjacent pairs sorted ascending
    int num_gt = 0;    // Number of adjacent pairs sorted descending

    for (int i = 1; i < size; i++)
    
        if (array[i] > array[i - 1])
            num_gt++;  // is sorted ascending
        else if (array[i] < array[i - 1])
            num_lt++;  // is sorted descending
        else
            num_eq++;  // is not ordered
    

    assert(num_gt + num_lt + num_eq == size - 1);

    if (num_gt == size - 1)
        return 1;      // ascending with all unique
    if (num_lt == size - 1)
        return 2;      // descending with all unique
    if (num_eq == size - 1)
        return 0;      // all rows equal
    if (num_gt != 0 && num_lt != 0)
        return -1;     // inconsistent sorting
    if (num_gt + num_eq == size - 1)
        return 1;      // ascending with some equal
    if (num_lt + num_eq == size - 1)
        return 2;      // descending with some equal
    return -1;         // can't happen?

还有其他方法可以做到这一点,但用尾部 cmets 解释起来相当简单。在函数的尾部使用else if 链是可行且清晰的。它有一些优点。您可以对更多返回值进行编码,以区分严格递增和非递减,或严格递减或非递增。

【讨论】:

为什么要断言?真的有必要吗?它给了我编译问题 然后删除它。但是assert() 是来自&lt;assert.h&gt; 的标准宏,应该不会出现问题。

以上是关于控制到达 C 中非 void 函数的结尾的主要内容,如果未能解决你的问题,请参考以下文章

Linux C语言编译警告:control reaches end of non-void function

警告:从 C 中不兼容的指针类型返回

warning: control reaches end of non-void function

目标-c:从另一个控制器调用 void 函数

控制到达非 void 函数的末尾是 xcode 上的错误,但不是 gcc 上的错误

Xcode 认为由于 if/else 语句中的返回,控制可能会到达非 void 函数的末尾