C程序获取链接器错误。我真的无法看出错误

时间:2014-05-24 00:31:54

标签: c linker

我遇到了我的代码问题。我正在使用Dev-C ++ 4.9.9.2 ...... 问题是LINKER ERROR,我知道通常链接器错误是常见的 链接器错误如下:也许我忽略了但严重的是我不知道什么是错的!

[链接器错误]未定义对`getUniqueNumber'

的引用

[链接器错误]未定义对`straight_select_int'的引用

[链接器错误]未定义对`straight_insert_int'的引用

[链接器错误]未定义对`bubblesort_int'的引用

[链接器错误]未定义对`quicksort_int'的引用

ld返回1退出状态

U:\ My Documents \ alg \ AlgProject \ ALG \ Makefile.win [Build Error] [Project1.exe] Error 1

Anyhoo,这是我的代码:

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <dos.h>

# define N 30000

void bubblesort_int(int p[]); 
void quicksort_int(int left, int right, int p[]);
void straight_select_int(int p[]);
void straight_insert_int(int p[]);
int getUniqueNumber(int *p, int i);



int main(int argc, char *argv[])
{
int p[N],pA[N];

int i,j,x;

time_t t0,t1;



for (j=0; j<10; j++)
{
   srand(time(0));

    for(i=0;i<N;i++)
    {
        p[i]=getUniqueNumber(p,i);
    }

  for (i=0; i<N; i++)
    {
        pA[i] = p[i];
    }

       time(&t0);     
  straight_select_int(p); 
  time(&t1);
  x=difftime(t1,t0);



    for(i=0;i<N;i++)
    {
        p[i]=pA[i];
    }

    time(&t0);    
    straight_insert_int(p); 
    time(&t1);
    x=difftime(t1,t0);





    for(i=0;i<N;i++)
    {
        p[i]=pA[i];
    }


    for (i=0;i<N;i++)
    p[i]=pA[i];    

    time(&t0);     
    bubblesort_int(p);  
    time(&t1);
    x=difftime(t1,t0);



    for(i=0;i<N;i++)
    {
        p[i]=pA[i];
    }

    time(&t0);     
    quicksort_int(0, N-1, p);  
    time(&t1);
    x=difftime(t1,t0);





   system("PAUSE");
   return 0;
   getch();
   }
   ////////////////////////////////////////////////////////////////////////////////


   void straight_select_int(int p[]);
   {
   int i,j,k,min;

   for (i=0; i<N-1; i++)
   {
    k = i;
    min = p[i];
    for (j = i+1; j<N; j++)
        {
     if (p[j] < min)
        {
           k = j;
            min = p[j];
        }
     }
     p[k] = p[i] ;
     p[i] = min;
    }
   }
   ////////////////////////////////////////////////////////////////////////////////


   void straight_insert_int(int p[])
    {
    int i,j,x;
    for (i = 1; i < N; i++)
       {
           x = p[i];
           j = i-1;
           while ((x < p[j]) && (j >= 0))
            {
                p[j+1] = p[j] ;
                j = j-1 ;
            }
            p[j+1] = x ;
       }
 }


  ////////////////////////////////////////////////////////////////////////////////



void bubblesort_int(int p[])
{
int i,j,temp;
for (i=1; i<N; i++)
   for (j=N-1; j>=i; j--)
     if (p[j-1] > p[j])
       {
         temp = p[j-1];
         p[j-1] = p[j] ;
         p[j] = temp ;
       }


////////////////////////////////////////////////////////////////////////////////


void quicksort_int(int left, int right, int p[])
{
 int i, j, mid, x, temp;
  if (left < right)
    {
       i = left;
       j = right;
       mid = (left+right)/2;
       x = p[mid];
       while (i < j)
          {
             while (p[i] < x)
             i++;
             while (p[j] > x)
                 j--;
             if (i < j)
                {
                   if (p[i] == p[j])
                     {
                       if (i<mid)
                           i++;
                           if (j>mid)
                              j--;
                     }
                   else
                      {
                         temp = p[i];
                         p[i] = p[j];
                         p[j] = temp;
                      }
                  }
          }
       quicksort_int(left,j-1,p);
       quicksort_int(j+1,right,p);
     }


}

////////////////////////////////////////////////////////////////////////////////

int getUniqueNumber(int *p, int i)
{
int x,j, found;

do
{
    x = rand();
    found = 0;
    j = 0;
    while (j<=i && found == 0)
    {
        if (p[j] == x)
        {
            found = 1;
        }
        else
        {
            j++;
        }
    }
}
while (found == 1);
return x;
}
}
}  

先谢谢你们...如果答案很简单而愚蠢,请原谅我因为迟到了! :/:P

2 个答案:

答案 0 :(得分:2)

您的代码包含main()中定义的所有函数体。标准C中不允许这样做。某些编译器将其作为扩展名提供,但main::straight_insert_int内的本地函数main()是与自由函数straight_insert_int不同的实体。

这就是你得到链接器错误的原因;你从未定义过自由函数straight_insert_int

要解决此问题,请将代码结构更改为:

int main()
{
     // main's code here
}

void straight_insert_int(int p[])
{
    // straight_insert_int's code here
}

void bubblesort_int(int p[])
{
    //bubblesort_int's code here
}

如果您使用这种一致的缩进方式,那么您会发现更容易保持支撑笔直。一些文本编辑器也有一个键命令,如果你在一个支撑上按下它,它将带你到相应的支撑。

答案 1 :(得分:0)

问题代码主要有大括号的缺陷。这里的代码格式好一点。它现在可以正确编译和链接。 但是,它没有正确执行。 (或者,它可能完全符合预期目的?)

在任何情况下,都会解决链接器错误(问题的关键点)。如果您需要进一步的帮助来找出代码未正确执行的原因,也许您应该在新问题中发布代码。

#include <stdlib.h>
#include <time.h>
//#include <dos.h> non-portable

# define N 30000

void bubblesort_int(int p[]);
void quicksort_int(int left, int right, int p[]);
void straight_select_int(int p[]);
void straight_insert_int(int p[]);
int getUniqueNumber(int *p, int i);


////////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
   {
   int p[N],pA[N];
   int i,j,x;
   time_t t0,t1;

   for (j=0; j<10; j++)
      {
      srand(time(0));
      }                  // +++ Added this line.

   for(i=0;i<N;i++)
      {
      p[i]=getUniqueNumber(p,i);
      }

   for (i=0; i<N; i++)
      {
      pA[i] = p[i];
      }

   time(&t0);
   straight_select_int(p);
   time(&t1);
   x=difftime(t1,t0);

   for(i=0;i<N;i++)
      {
      p[i]=pA[i];
      }

   time(&t0);
   straight_insert_int(p);
   time(&t1);
   x=difftime(t1,t0);

   for(i=0;i<N;i++)
      {
      p[i]=pA[i];
      }

   for (i=0;i<N;i++)
      p[i]=pA[i];

   time(&t0);
   bubblesort_int(p);
   time(&t1);
   x=difftime(t1,t0);

   for(i=0;i<N;i++)
      {
      p[i]=pA[i];
      }

   time(&t0);
   quicksort_int(0, N-1, p);
   time(&t1);
   x=difftime(t1,t0);

//   system("PAUSE");  Not needed.
   return 0;
//   getch();  Non-portable, and also beyond the return code is not executed.
   }

////////////////////////////////////////////////////////////////////////////////
void straight_select_int(int p[])   // --- Removed: ';' at the end of this line.
   {
   int i,j,k,min;

   for (i=0; i<N-1; i++)
      {
      k = i;
      min = p[i];
      for (j = i+1; j<N; j++)
         {
         if (p[j] < min)
            {
            k = j;
            min = p[j];
            }
         }

      p[k] = p[i] ;
      p[i] = min;
      }

   return;
   }

////////////////////////////////////////////////////////////////////////////////
void straight_insert_int(int p[])
   {
   int i,j,x;

   for (i = 1; i < N; i++)
      {
      x = p[i];
      j = i-1;

      while ((x < p[j]) && (j >= 0))
         {
         p[j+1] = p[j] ;
         j = j-1 ;
         }

      p[j+1] = x ;
      }

   return;
   }

////////////////////////////////////////////////////////////////////////////////
void bubblesort_int(int p[])
   {
   int i,j,temp;

   for (i=1; i<N; i++)
      for (j=N-1; j>=i; j--)
         if (p[j-1] > p[j])
            {
            temp = p[j-1];
            p[j-1] = p[j] ;
            p[j] = temp ;
            }
   return;       // +++ Added this line.
   }             // +++ Added this line.

////////////////////////////////////////////////////////////////////////////////
void quicksort_int(int left, int right, int p[])
   {
   int i, j, mid, x, temp;

   if(left < right)
      {
      i = left;
      j = right;
      mid = (left+right)/2;
      x = p[mid];
      while (i < j)
         {
         while (p[i] < x)
            i++;

         while (p[j] > x)
            j--;

         if (i < j)
            {
            if (p[i] == p[j])
               {
               if (i<mid)
                  i++;

               if (j>mid)
                  j--;
               }
            else
               {
               temp = p[i];
               p[i] = p[j];
               p[j] = temp;
               }
            }
         }

      quicksort_int(left,j-1,p);
      quicksort_int(j+1,right,p);
      }

   return;
   }

////////////////////////////////////////////////////////////////////////////////
int getUniqueNumber(int *p, int i)
   {
   int x,j, found;

   do {
      x = rand();
      found = 0;
      j = 0;
      while (j<=i && found == 0)
         {
         if (p[j] == x)
            {
            found = 1;
            }
         else
            {
            j++;
            }
         }
      } while(found == 1);

   return x;
   }
// --- removed: '}'
// --- removed: '}'

PS; user3670661,如果你真的想成为一名程序员,你需要为你的代码更加自豪。问题中贴出的代码缺乏一致的风格。布局代码的方法有很多种;你需要选择一种可接受的布局风格,并在编码时养成习惯。只需对齐开括号和闭括号就是调试代码的第一步。祝好运! --Mahonri