2016-11-17 4 views
-1

申し訳ありません。私は本当にこの問題を定義する方法を知らなかった。void関数を使用して配列を指す

N個の数値の整数配列を宣言し、void関数の乱数でそれを満たす必要がありました。その配列はメインに印刷する必要があります。私は、void関数でprintfを使用することは許されていないので、メインで印刷する方法は、私が推測するポインタを使うことだけです。私が指針で初心者であるので、私の知識は限られています。 Thxは事前に悪い英語のために申し訳ありません。

ここまでは私のコードです。コンパイルすると、セグメント化エラーがマークされます。

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

void form(); 

int main() 
{ 

    int N, a[100]; 

    printf("Input index: \n"); 
    scanf("%d", &N); 

    form(N, &a); 

    printf("Array: \n"); 

    for (int i = 0; i < N; i++) { 
     printf("a[%d] = %d", i, a[i]); 
    } 

} 


void form(int N, int *ptr[100]) 
{ 

    srand(time(NULL)); 

    for (int i = 0; i < N; i++) { 
     *ptr[i] = rand() % 46; 

    } 
+0

あなたのコンパイラはあなたに叫ぶ必要があります。正しいプロトタイプを使用すると、コードは標準に準拠しておらず、未定義のビヘイビアが呼び出されます。 (それはポインタよりもはるかに基本的です。あなたのCブックの関数と関数宣言についての章はスキップしましたか?) – Olaf

+0

あなたは望む関数で 'printf'を使うことができます。 – user3528438

+0

user3528438これは学校の運動であり、教授はprintfを使わないように教えてくれました。 @Olafこのプロトタイプは正しいですか:void form(int、int)。関数の宣言はうまくいきます。それが私が教えられた方法です。 – Misery

答えて

0

コードにはいくつかの問題があります。

1)配列のデコンダクションform()は廃止されました。適切なプロトタイプを使用してください。

2)VLAを宣言する場合は、固定サイズの配列を使用する代わりにNを読み込んだ後に宣言します。

3)配列は、関数に渡されると、最初の要素へのポインタに変換されます。参照してください:あなたのコードのWhat is array decaying?


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

void form(int, int*); /* see (1) */ 

int main(void) /* Standard complaint prototype for main. 
       If you need to pass arguments you can use argc, and argv */ 
{ 
    int N; 

    printf("Input size: \n"); 
    scanf("%d", &N); 

    int a[N]; /* see (2) */ 
    form(N, a); /* see (3) */ 
    printf("Array: \n"); 

    for (int i = 0; i < N; i++) { 
     printf("a[%d] = %d", i, a[i]); 
    } 
} 


void form(int N, int *ptr) { /* Modified to match the prototype 
    srand(time(NULL)); 

    for (int i = 0; i < N; i++) { 
     ptr[i] = rand() % 46; 

    } 
} 
0

ので、カップルの事:

void form(); 

オラフはをほのめかしたように、この宣言が正しくありません - あなたは、適用可能なパラメータが欠落しています。 - どのような

*ptr[i] = rand() % 46; 

あなたはactaullyあなたに番号を与えているiにおけるポインタを、逆参照されています。その代わりに、それはあなたのプログラムがクラッシュしている主な理由が原因で次の行である

void form(int N, int ptr[100]); 

する必要がありますあなたがしたい私の新しいランダムな値でポインタの値を割り当てることです:FUNCように配列を渡すことについて、このquestionを参照してください、関連読書のよう

ptr[i] = rand() % 46; 

(基本的にint ptr[]int * ptrと同じです)

+1

void form(int N、int ptr [100]); – user3528438

+0

@ user3528438申し訳ありません、忘れてしまいました。 – schil227

+0

@ user3528438:それは間違っています。それは 'int ptr [N]'(最も明確なバージョン)または 'int ptr []'または 'int * ptr'でなければなりませんが、' int ptr [100] 'ではありません。 – Olaf

-1

小変更:

1)訂正と関数呼び出しでパラメータ処理の簡素化。 "a"を渡すだけです。配列なので、住所です。int *ptrまたはint ptr[]またはint ptr[100]を仮パラメータリストに使用できます。だからあなたの関数では単純にptr [i]を使うことができます。

2)パラメータリストを提供する旧式の宣言から関数のプロトタイプを作成します。

3)forループの前int i;宣言 - 必須ではありません、標準のコンパイラに依存し

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

void form(int N, int *ptr); 

int main() 
{ 

    int N, a[100]; 

    printf("Input index: \n"); 
    scanf("%d", &N); 

    form(N, a); 

    printf("Array: \n"); 
    int i; 
    for (i = 0; i < N; i++) { 
     printf("a[%d] = %d", i, a[i]); 
    } 

} 


void form(int N, int *ptr) 
{ 

    srand(time(NULL)); 
    int i; 
    for (i = 0; i < N; i++) { 
     ptr[i] = rand() % 46; 

    } 
} 
+0

OPは全く何も教えていません。ただ彼に魚を与える。 – Olaf

+0

@Olaf確かに、あなたは正しいです。私は私の答えを訂正しました。 – quantummind

+0

"パラメータリストによるプロトタイプ宣言の修正。" - あなたは**試作品にすることを意味します**。今のように、プロトタイプではなく古いスタイルの宣言だけです。 – Olaf

関連する問題