0

ここで宿題をしようとしています。これは、特定の数のポイントの (0,0) までの距離を示すプログラムを作成することです。ただし、何らかの理由で、プログラムが起動するとすぐに、Windows は動作を停止したと表示します。2 つの異なるコンパイラで試しましたが、エラー メッセージは表示されません。

#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)" - を返しますdistance to (0,0) ポイントの x 座標と y 座標の 2 つのメンバーを持つ構造ポイントを作成します。

誰かが何が悪いのかヒントを教えてもらえますか?

4

4 に答える 4

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

numberは初期化されておらず、coord配列のサイズを宣言するために使用しています。スタック上で実質的にランダムなサイズの配列を生成することになり、クラッシュの原因となる可能性があります。

于 2013-03-06T13:43:37.250 に答える
2

number配列内の要素数を指定するために使用される場合、変数は初期化されませんcoord。その後、配列にアクセスしますが、配列に含まれる要素の数はわかりません。number有効な値を使用する前に読み取り、有効な値確実に読み取られていることを確認します。

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

入力操作の結果を常にチェックして、後続のコードが有効な値を持つ変数を処理していることを確認してください。

于 2013-03-06T13:43:34.300 に答える
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
于 2013-03-06T13:44:41.903 に答える
1
int number;
struct point coord[number];

numberどこが初期化されているかわかりません。本当に VLA を使用したい場合は、coord後で宣言する必要があります。

int number;

scanf("%d", &number);

struct point coord[number];

それ以外の場合、 number自動保存期間があるため、その値は未定義になります。

于 2013-03-06T13:43:47.677 に答える