我有一项功课要做:我需要在一个包含100000个数字的随机数组中测量bubblesort的时间。当我尝试随机生成数字时,我收到错误。如果我不随机生成数字,我每次都会得到0。 到目前为止我这样做了:
main.c
int main()
{
int *a,n = 0;
srand(time(0));
beolvas(&a,&n,"be.txt");
clock_t start,stop;
start = clock();
bubblesort(a,n);
stop = clock();
float timespent = (stop - start)/CLOCKS_PER_SEC;
printf("%f\n",timespent);
kiir(a,n);
free(a);
return 0;
}
kibe.c(sorry I write it bad)
void beolvas(int **a,int *n,const char * file)
{
int i;
FILE * fin;
fin = fopen("be.txt", "rt");
*a = (int*)malloc(*n*sizeof(int));
if(a == 0){printf("Error");return 0;}
for(i = 0; i < 100000; ++i){
*a = rand() % 100;
}
fclose(fin);
}
void bubblesort(int *a, int n)
{
int i,j,csere;
for(i = 0; i < n-1; ++i){
for(j = 0; j < n - i -1; ++j){
if (a[j] > a[j + 1]){
csere = a[j];
a[j] = a[j + 1];
a[j + 1] = csere;
}
}
}
}
void kiir(int *a,int n)
{
int i;
for(i = 0; i < n; ++i){
printf("%i ",a[i]);
}
}
如你所见,我需要使用标题......这真的很无聊......
修改
现在我完全重写所有程序没有错误没有警告,但它没有打印出阵列,排序时间仍然是0.我忘了做什么?为什么我的写函数什么都不做?
sema.c
void read(int *a,int n)
{
int i;
scanf("%d",&n);
a = (int*)malloc(n*sizeof(int));
if(a == 0){printf("Error");return 0;}
for(i = 0; i < n; ++i){
a[i] = rand() % 100;
}
}
void bubblesort(int *a,int n)
{
int i,j,csere;
for(i = 0; i < n-1; ++i){
for(j = 0; j < n - i -1; ++j){
if (a[j] > a[j + 1]){
csere = a[j];
a[j] = a[j + 1];
a[j + 1] = csere;
}
}
}
}
void write(int *a,int n)
{
int i;
for(i = 0; i < n; ++i){
printf("%i ",a[i]);
}
}
sema.h
void read(int*,int*);
void write(int*,int);
void bubblesort(int*,int);
的main.c
int main()
{
double *a = NULL ,n = 0;
read(&a,&n);
clock_t start,stop;
start = clock();
bubblesort(a,n);
stop = clock();
float elapsedTime = (stop - start)/CLOCKS_PER_SEC;
printf("%f",elapsedTime);
write(a,n);
free(a);
return 0;
}
答案 0 :(得分:1)
第void beolvas(int **a,int *n,const char * file);
行
将a
声明为指针指针。
但这一行:
*a = rand() % 100;
只取消引用它一次并为一个指针赋值(有效导致内存泄漏,因为它是malloc
- 之前编辑过的)
所以你得到了各种不确定的行为。
答案 1 :(得分:0)
你不应该使用int ** var而只是使用int *。实际上,您只需要将int的地址传递给您的beolvas函数。然后,不要忘记通过以下方式初始化随机函数:
srand(time(NULL));
否则,您将始终生成相同的“随机”数字。这是因为C编译器需要时间作为参考。
不要忘记C中的.h文件应该只包含函数头。函数本身应该写在同名的.c文件中。
其余的,你的代码看起来还不错。尝试改变你的指针并给我们错误(如果有的话)。
答案 2 :(得分:0)
[..]没有错误没有警告[..]
您使用的是哪种编译器?我高度怀疑:
在main
中,您声明指向double
:
double *a = NULL;
您将该指针的地址(因此指向该指针的指针,double **
)传递给您的函数,但是它们期望指向整数的指针:
void read(int*,int*);
void write(int*,int);
void bubblesort(int*,int);
第二个参数也是如此,在函数中大多称为n
:函数声明假定为int
,但是你传递...
double n = 0;
read(&a,&n);
// ...
bubblesort(a,n);
// ...
write(a,n);
...曾经是指向double
的指针,两次指向double
的函数。
通常,您似乎对传递参数的概念感到困惑,特别是与指针结合使用时。请记住:传递给C中函数的每个参数都会复制。因此:
void foo(int a) {
a = 42;
// a is now 42 for the rest of only this function
}
void bar(void) {
int a = 21;
foo(a);
// a is still 21, this is not the a from foo.
}
也许您还应该阅读词汇范围,它在C(以及大多数当前语言)中使用。现在考虑传递一个指针:
static int fred = 42;
void foo(int * a) {
// Dereferencing a gives us acces to whatever it points to
*a = 42;
// But modifying the variable a ...
a = &fred;
// a points to fred for the rest of only this function
}
void bar(void) {
int john = 21;
int * a = &john;
foo(a);
// a still points to john, this is not the a from foo.
// but john is now 42!
}
传递指针也只复制指针(将其视为地址)。但是使用该指针,您可以访问它指向的任何内容。
回到手头的问题,我认为您应该尝试编写以下功能(假设您仍然需要int
个数字):
/** Allocate an array with random integers.
This function takes as parameter the count of elements the
array is supposed to have. A pointer to the array filled with random
integers should be returned.
*/
int * allocate_random_integers(size_t count);
/** Sort the array.
This function is supposed to sort the given array (a pointer to its
first element is given along with the number of elements).
*/
void bubblesort(int * array, size_t count);
/** Print the array to stdout.
This function is supposed to write each element of the given array to
stdout.
*/
void print(int const * array, size_t count);
有几点需要注意:
size_t
来表示“大小”(包括索引)。allocate_random_integers
返回指针之外,还可以传递指向指针的指针,并将指针指向它指向数组的指针(void allocate_random_integers(int ** array_ptr, size_t count)
)。print
使用int const *
代替int *
,使调用者(和类型系统)明白在打印过程中不会修改数组。free
数组。