我遇到了我的代码问题。我正在使用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
答案 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