2016-05-05 9 views
-5

配列添え字を使わずに、内積用の関数を書くようにしようとしています。私は何時間もコードを見てきました。 まだ間違いを修正できませんでした。誰かがそれを修正できますか?C内の内積関数

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

int inner_product(int *a, int *b, int size) 
{ 
    int sum = 0, i; 

    for (i = 0; i < size; ++i) 
    { 
     printf("enter value for first array: "); 
     scanf("%d", &(a + i)); 
    } 

    for (i = 0; i < size; ++i) 
    { 
     printf("enter value for first array: "); 
     scanf("%d", &(b + i)); 
    } 

    for (i = 0; i < size; ++i) 
     sum += *(a + i) * *(b + i); 

    return sum; 
} 

int main() 
{ 
    int n, a, b; 
    printf("How many elements do you want to store? "); 
    scanf("%d", &n); 

    printf("%d", inner_product(&a, &b, n)); 

    system("pause"); 
    return 0; 
} 
+2

...これには多大な誤りがあります。 'int'を' int'配列として扱うように見えますか? – Kupiakos

+0

あなた(または私たち)は間違いがあることをどのように知っていますか? – KevinDTimm

+4

あなたのクラスメートは最近[類似の質問](http://stackoverflow.com/questions/37058242/inner-product-function-without-using-array-subscripting-in-c)に尋ねました。 –

答えて

0

コードには非常に多くのエラーがあります。まず、配列を配列として定義するのではなく、単一のint値として定義します。

int *a, *b; 

第2に、配列を割り当てていないことです。

a = (int*)malloc(sizeof(int) * n); 
b = (int*)malloc(sizeof(int) * n); 

第三に、あなたが変更する必要はありませんので、リファレンスとしてお使い配列の値を渡す必要はありません:あなたは、実行時にそれらを作成したい場合は、あなたが彼らのためにサイズを取得した後malloc()を使用する必要がありますそれら:あなたのinner_product()関数の内部

printf("%d", inner_product(a, b, n)); 

:(それはメモリブロックのサイズに依存するため)

&(a + i)&(b + i)はあなたに配列項目のメモリ位置を与えることはありません。代わりに&a[i]&b[i]を使用して配列値を取得する必要があります。

あなたの変数abが配列されているので、あなたの内側の製品はこのように計算されるべきである。

for (i = 0; i < size; ++i) 
    sum += a[i] * b[i]; 

ヒント:inner_product()を呼び出した後free(a)free(b)を呼び出すことによって、あなたに割り当てられabの配列を解放するようにしてください。

これだけです!

0

aとbは、メモリが割り当てられた配列でなければなりません。

int a[1000]; 
int b[1000]; 

は簡単な修正ですが、最高の入力は、これが唯一のクラスの割り当てであれば、あなたはこのようなチェックせずに逃げることができます(1000年よりも大きくないが、生産コードはより堅牢にする必要があるコードかどうかをチェックします)。関数を呼び出すときに&の前にabを必要とせず、代わりにinner_product(a, b, n)を呼び出します。