编译器gcc出错:对'main'的未定义引用

时间:2015-06-10 09:32:25

标签: c linux algorithm sorting gcc

我正在编写这个程序,用于C语言中的K_均值聚类,以及在Linux中的GCC编译器上编译该程序 编译器错误按摩如下

***/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status***

我的完整计划正在关注

#include <stdlib.h>
#include <assert.h>
#include <float.h>
#include <math.h>

int *k_means(double **data, int n, int m, int k, double t, double
**centroids) {    /* output cluster label for each data point */    int *labels = (int*)calloc(n, sizeof(int));

   int h, i, j; /* loop counters, of course :) */    int *counts =
(int*)calloc(k, sizeof(int)); /* size of each cluster */    double
old_error, error = DBL_MAX; /* sum of squared euclidean distance */ 
double **c = centroids ? centroids : (double**)calloc(k,
sizeof(double*));    double **c1 = (double**)calloc(k,
sizeof(double*)); /* temp centroids */

   assert(data && k > 0 && k <= n && m > 0 && t >= 0); /* for
debugging */

   /****    ** initialization */

   for (h = i = 0; i < k; h += n / k, i++) {
      c1[i] = (double*)calloc(m, sizeof(double));
      if (!centroids) {
         c[i] = (double*)calloc(m, sizeof(double));
      }
      /* pick k points as initial centroids */
      for (j = m; j-- > 0; c[i][j] = data[h][j]);    }

   /****    ** main loop */

   do {
      /* save error from last step */
      old_error = error, error = 0;

      /* clear old counts and temp centroids */
      for (i = 0; i < k; counts[i++] = 0) {
         for (j = 0; j < m; c1[i][j++] = 0);
      }

      for (h = 0; h < n; h++) {
         /* identify the closest cluster */
         double min_distance = DBL_MAX;
         for (i = 0; i < k; i++) {
            double distance = 0;
            for (j = m; j-- > 0; distance += pow(data[h][j] - c[i][j], 2));
            if (distance < min_distance) {
               labels[h] = i;
               min_distance = distance;
            }
         }
         /* update size and temp centroid of the destination cluster */
         for (j = m; j-- > 0; c1[labels[h]][j] += data[h][j]);
         counts[labels[h]]++;
         /* update standard error */
         error += min_distance;
      }

      for (i = 0; i < k; i++) { /* update all centroids */
         for (j = 0; j < m; j++) {
            c[i][j] = counts[i] ? c1[i][j] / counts[i] : c1[i][j];
         }
      }

   } while (fabs(error - old_error) > t);

   /****    ** housekeeping */

   for (i = 0; i < k; i++) {
      if (!centroids) {
         free(c[i]);
      }
      free(c1[i]);    }

   if (!centroids) {
      free(c);    }    free(c1);

   free(counts);

   return labels; }

请帮助我们。

#include <stdlib.h>
#include <assert.h>
#include <float.h>
#include <math.h>

int *k_means(double **data, int n, int m, int k, double t, double
**centroids) {    /* output cluster label for each data point */    int *labels = (int*)calloc(n, sizeof(int));

   int h, i, j; /* loop counters, of course :) */    int *counts =
(int*)calloc(k, sizeof(int)); /* size of each cluster */    double
old_error, error = DBL_MAX; /* sum of squared euclidean distance */ 
double **c = centroids ? centroids : (double**)calloc(k,
sizeof(double*));    double **c1 = (double**)calloc(k,
sizeof(double*)); /* temp centroids */

   assert(data && k > 0 && k <= n && m > 0 && t >= 0); /* for
debugging */

   /****    ** initialization */

   for (h = i = 0; i < k; h += n / k, i++) {
      c1[i] = (double*)calloc(m, sizeof(double));
      if (!centroids) {
         c[i] = (double*)calloc(m, sizeof(double));
      }
      /* pick k points as initial centroids */
      for (j = m; j-- > 0; c[i][j] = data[h][j]);    }

   /****    ** main loop */

   do {
      /* save error from last step */
      old_error = error, error = 0;

      /* clear old counts and temp centroids */
      for (i = 0; i < k; counts[i++] = 0) {
         for (j = 0; j < m; c1[i][j++] = 0);
      }

      for (h = 0; h < n; h++) {
         /* identify the closest cluster */
         double min_distance = DBL_MAX;
         for (i = 0; i < k; i++) {
            double distance = 0;
            for (j = m; j-- > 0; distance += pow(data[h][j] - c[i][j], 2));
            if (distance < min_distance) {
               labels[h] = i;
               min_distance = distance;
            }
         }
         /* update size and temp centroid of the destination cluster */
         for (j = m; j-- > 0; c1[labels[h]][j] += data[h][j]);
         counts[labels[h]]++;
         /* update standard error */
         error += min_distance;
      }

      for (i = 0; i < k; i++) { /* update all centroids */
         for (j = 0; j < m; j++) {
            c[i][j] = counts[i] ? c1[i][j] / counts[i] : c1[i][j];
         }
      }

   } while (fabs(error - old_error) > t);

   /****    ** housekeeping */

   for (i = 0; i < k; i++) {
      if (!centroids) {
         free(c[i]);
      }
      free(c1[i]);    }

   if (!centroids) {
      free(c);    }    free(c1);

   free(counts);

   return labels; }

1 个答案:

答案 0 :(得分:4)

如果您保留整个代码的代码格式,而不仅仅是它的部分,那么它将更具可读性。

但是当我试图找到一个主要功能时,我没有找到任何功能。因此没有对main的引用,因为你没有实现一个,至少在你发布的代码中没有实现。

相关问题