2016-10-31 2 views
-2

ベクトル構造体とaddVectorsubVector関数を作成しました。私はまた、印刷ベクトル関数を作成しました。Cの構造体に問題がある

入力用に2つ、出力用に2つ(加算用と減算用)の4つのベクトルインスタンスを作成する必要があります。 addVectorの結果とsubVectorの結果を印刷するには、printVectorに電話する必要があります。私はそれのほとんどが正しいと思います。私は何をすべきか分かりません。

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

typedef struct { 
    double x; 
    double y; 
    double z; 
} VECTOR; 

VECTOR addVector(VECTOR *addOne, VECTOR *addTwo) { 
    double addX = addOne->x + addTwo->x; 
    double addY = addOne->y + addTwo->y; 
    double addZ = addOne->z + addTwo->z; 
}; 

VECTOR subVector(VECTOR *subOne, VECTOR *subTwo){ 
    double subX = subOne->x - subTwo->x; 
    double subY = subOne->y - subTwo->y; 
    double subZ = subOne->z - subTwo->z; 
}; 

void printVector(VECTOR *printVector) { 
    printf("%lf, %lf, %lf\n", printVector->x, printVector->y, printVector->z); 
}; 

void main() { 
    VECTOR A; 
    VECTOR B; 
    VECTOR C = addVector(&A, &B);  
    VECTOR D = subVector(&A, &B); 

    printf("Enter three doubles.\n"); 
    scanf_s("%lf %lf %lf", &A.x, &A.y, &A.z); 

    addVector(&A, &B); 

    printVector(&C); 

    subVector(&A, &B); 
    printVector(&D); 

    system("pause"); 
}; 
+0

CとDを宣言するときは、それぞれaddVectorとsubVectorを呼び出す必要があります。 – bruceg

+1

'addVector'と' subVector' *関数は何かをするように見えますが、その結果を破棄します。関数によって 'struct'は返されません。または、渡されるターゲット引数がありません。 –

+1

良いコンパイラがあなたのコードに関する問題について警告していたでしょう。 – Barmar

答えて

2

VECTOR座標の値をaddVectorsubVectorに計算しますが、VECTOR構造体は返しません。ここで

はそれを行う方法であり、またVECTOR引数が変更されていないため、ポインタがこのプロパティを強調する資格constでなければならないことに注意してください:あなたのmain機能で

VECTOR addVector(const VECTOR *addOne, const VECTOR *addTwo) { 
    VECTOR add; 
    add.x = addOne->x + addTwo->x; 
    add.y = addOne->y + addTwo->y; 
    add.z = addOne->z + addTwo->z; 
    return add; 
} 

VECTOR subVector(const VECTOR *subOne, const VECTOR *subTwo) { 
    VECTOR sub; 
    sub.x = subOne->x - subTwo->x; 
    sub.y = subOne->y - subTwo->y; 
    sub.z = subOne->z - subTwo->z; 
    return sub; 
} 

void printVector(const VECTOR *printVector) { 
    printf("%lf, %lf, %lf\n", printVector->x, printVector->y, printVector->z); 
} 

、あなたはベクトルを使用AおよびBを初期化したり、ユーザーから値を読み取ったりする前に実行してください。コードをこのように変更します。

void main() { 
    VECTOR A = { 0, 0, 0 }; 
    VECTOR B = { 0, 0, 0 }; 
    VECTOR C, D; 

    printf("Enter three doubles for A\n"); 
    scanf_s("%lf %lf %lf", &A.x, &A.y, &A.z); 

    printf("Enter three doubles for B\n"); 
    scanf_s("%lf %lf %lf", &B.x, &B.y, &B.z); 

    C = addVector(&A, &B); 
    printVector(&C); 

    D = subVector(&A, &B); 
    printVector(&D); 

    system("pause"); 
} 

最後に、あなたの関数の本体後;を入れないでください。

上記のような愚かなバグを避けるために、すべてのコンパイラ警告を有効にする必要があることにも注意してください。コマンドラインコンパイラにはgcc -Wall -Wまたはclang -Weverythingを使用し、使用する場合はVisual Studio IDEで警告レベルを上げてください。

+0

)の戻り値を使用します。ポインタへのポインタ渡しが好ましいです –

+0

@MM:良い点、更新済み – chqrlie

+0

ありがとう私はちょうど学校でコーディングを始めました。 –

0

addVectorsubVectorは、新しいベクトルの成分を計算し、実際に新しいベクトルを返しません。

は、ここに私のコードです。しかし、addVectorsubVectorを呼び出し、戻り値を無視するので、少なくとも一貫しています。

+1

実際には一貫していないので、彼は 'VECTOR C = addVector(&A、&B);' – Barmar