2013-03-06 59 views
0

我想在这里写作业,写一个程序,显示距离(0,0)的某些点数。然而由于某种原因,一旦我的程序启动,windows就说它已停止工作。我用两种不同的编译器试了一下,他们不给我任何错误信息。我的C程序已经停止工作

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

struct point { 
    int x; 
    int y; 
}; 

struct point getPoint(); 
void printPoint(struct point); 
double distanceToO(struct point p); 
void createArray(struct point, int); 

int main() { 

    int number, i; 
    struct point coord[number]; 

    printf("Type the number of points you want to create: "); 
    scanf("%d", &number); 

    printf("\n\n"); 

    for(i=0;i<number;i++) 
     coord[i]=getPoint(); 

    printf("\n\t\tPoint\tDistance to (0,0)\n"); 

    for(i=0;i<number;i++) {   
     printPoint(coord[i]); 

     printf("\t%0.2lf", distanceToO(coord[i])); 
    } 

    system("pause"); 
    return 0; 
} 

struct point getPoint() { 
    struct point p; 

    printf("Type the x and the y-value for a point with a space in between: "); 
    scanf("%d %d", &p.x, &p.y); 

    return p; 
} 

void printPoint(struct point p){ 
    printf("\n\t\t(%d,%d)",p.x,p.y); 
} 

double distanceToO(struct point p) { 
    return sqrt((0-p.x)*(0-p.x)+(0-p.y)*(0-p.y)); 
} 

这是何等的具体做到:

写一个程序,首先问许多问题应该如何创建,然后请求对x和点y值的用户。 然后程序应该给出一个表格,显示点和距离(0,0)。 必须创建/使用以下函数: “point getpoint()” - 要求输入坐标 “void printpoint(point p)” - 打印点的坐标 “double distanceToO(point p) “ - 将距离返回到(0,0) 创建一个结构点,该点具有两个成员的x坐标和点的y坐标。

有人可以告诉我什么是错的?

+3

你试图调试它? – 2013-03-06 13:43:30

+3

我注意到的第一件事是这行:'struct point coord [number];'你正在尝试使用尚未初始化的数字创建一个数组。 – jonhopkins 2013-03-06 13:43:58

+0

您应该在编译器上启用警告,例如使用gcc:-Wall -Wextra – hyde 2013-03-06 13:59:49

回答

2

变量number在用于指定数组coord中元素的数量时未初始化。然后访问该数组,并且不知道它们中有多少个元素。使用它之前,请阅读有效值成number并检查一个有效的价值肯定被阅读:

/* scanf() returns number of assignments made. */ 
if (scanf("%d", &number) == 1) 
{ 
} 

经常检查输入操作的结果,以确保后续的代码处理与有效的值的变量。

5
int number, i; 
struct point coord[number]; 

number尚未初始化,并且您使用它来声明coord数组的大小。您将在堆栈上生成一个有效随机大小的数组,这可能会导致崩溃。

+0

随机?这就是'rand()'的工作原理! *厚脸皮的笑容* – Sebivor 2013-03-06 17:01:23

1
int number; 
struct point coord[number]; 

我看不到number在哪里初始化。如果你真的想使用VLA,您应该事后申报coord

int number; 

scanf("%d", &number); 

struct point coord[number]; 

否则,因为number具有自动存储时间,其价值将是不确定的。

+0

虽然这需要C99 +。 – Jite 2013-03-06 13:45:12

+0

@Jite:由于OP已经在他的原代码中使用了VLA(C99),我猜他知道这一点。 – md5 2013-03-06 13:46:08

1

我很惊讶你不这样得到一个警告/错误:

int number, i; 
struct point coord[number]; 

你分配的struct point数组的大小等于一个未初始化的变量。

请注意,如果您使用Visual Studio,它并不完全支持C99标准要么所以它不允许有声明之前的语句,如:

int number; 
number = some_number; 
struct point coord; // Error, you have a statement above 
+0

AFAIK,它也不会被允许使用VLAs ... – md5 2013-03-06 13:48:06

+0

我所知道的是MS实现了它的一些功能,但不是全部。声明之前的声明是他们不支持的东西,(反之亦然,声明后声明)。你可能是对的,但其他人不得不填写那部分。我更新了这个例子不包含VLA,因为这个例子不需要它。 – Jite 2013-03-06 13:49:33