質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

コンパイルエラーが直せません。

sort_merge
sort_merge

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

5回答

0グッド

0クリップ

29920閲覧

投稿2016/01/02 09:17

選択ソートの実行時間を計測するためのプログラムを書いているのですが、コンパイルエラーが直すことができません。

以下がソースコードです。

#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAXN 1000000 int inputdata(); int selectionsort(); int printdata(); int A[MAXN],n,m; int main(){ inputdata(); selectionsort(1,n); printdata(); } int selectionsort(p,q) int p,q; { int i,j,a,cmin; clock_t start, end; start = clock(); for(j = p; j <= q; j++){ cmin=j; for(i=j+1; i<=q; i++) if(A[cmin]>A[i]) cmin=i; swap(j,cmin); } end = clock(); m=end-start; } int inputdata(){ int i; srand((unsigned)time(NULL)); printf("出力する乱数の個数を入力===>"); scanf("%d",&n); printf("\n"); printf("-------------入力データ--------------\n"); for(i=1; i<=n; i++){ A[i] = rand()%10000; printf("A[%d]=%5d ",i,A[i]); if(i%4 == 0){ printf("\n"); } } printf("\n"); } int printdata(){ int i; printf("\n"); printf("--------------ソート済みデータ------------------\n"); for(i=1; i <= n; i++){ printf("A[%d]=%5d ",i,A[i]); if(i%4 == 0){ printf("\n"); } } printf("\n"); printf("ソートの処理時間は%f秒です。 \n",(double)m / CLOCKS_PER_SEC); } int swap(i,j) int i,j; { int temp; temp=A[i]; A[i]=A[j]; A[j]=temp; } コード

このソースをコンパイルすると以下のようなエラーが出てしまいます。

warning: implicit declaration of function 'swap' is invalid in C99
[-Wimplicit-function-declaration]
swap(j,cmin);
^
Selectionsort2.c:30:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
Selectionsort2.c:49:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
Selectionsort2.c:63:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
Selectionsort2.c:73:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
5 warnings generated.

どう改善したらよいか教えてください。
どうかよろしくお願いいたします。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答5

1

もっとも単純な対処法は

-Wimplicit-function-declaration

を取ってしまうことでしょう。

ただ、なんらかの理由があってワーニングオプションをつけていると思うので、
妥当な範囲でもっとも簡単な対処法は、 swap 関数の記述を最初に(使用している箇所より前に)持ってくることでしょう。

エラーの意味は、swap() 関数のプロトタイプ宣言がないということだと思います。

-Wimplicit-function-declaration

は、そのチェック(プロトタイプ宣言のし忘れ)をさせるためのオプションです。

もう少し手間のかかる方法としては、swap() 関数に関するすべての記述の前に以下のようなプロトタイプ宣言を書くことです。

int swap(int i,int j);

最初に書いた関数の記述を前に持ってくる方法はこの方法の一種の代替えです。
(ちょっと調べてみましたが、私が使っている gcc では引数のチェックは、この形式の宣言がないとおこなわれませんね)

外部のファイルから swap 関数を使用する場合は、ヘッダファイルなどでこの記述を共有する必要があり、関数を前に書くやり方はつかえません。

使い捨てのプログラム、またはswap() を同一ファイル内でしか使わないのであれば、関数を前に書くやり方でも構わないとは思いますが、ある程度長期的に使うツールないしライブラリであれば、きちんとプロトタイプ宣言をしたほうがいいでしょう。

あと、コンパイルオプション、特に -W系のワーニングオプションは(こういうことをチェックしたいという)意図を持って使うものです。
(違反していてもコンパイルができないわけでもなく、記述に間違いがなれば動作もする)
なので、状況によって取ってしまう(プロトタイプ宣言でのチェックなんかなくても俺は間違えない、そんなことより早く動かしたいという場合など)という選択もありえるわけです。

投稿2016/01/02 09:45

kozuchi

総合スコア1192

zeroa👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

sort_merge

2016/01/02 11:41

アドバイス本当にありがとうございました! 無事実行することができました!

0

すでにベストアンサーが決まっていますが、
私なりに全体を書き換えてみたものを示してみます。
主な変更点は、
グローバル変数をなるべく少なくする、配列の内容表示部分の重複をなくした
の2つです。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5#define MAXN 100000 6int inputdata(); 7double selectionsort(); 8void swap(int i, int j); 9void printA(int n, char* message); 10 11int A[MAXN]; 12 13int main(int argc, char** argv) { 14 int n; 15 double time; 16 17 n = inputdata(); 18 19 printA(n, "-------------入力データ--------------"); 20 time = selectionsort(1, n); 21 printA(n, "--------------ソート済みデータ------------------"); 22 23 printf("ソートの処理時間は%f秒です。 \n", time / CLOCKS_PER_SEC); 24 return 0; 25} 26 27double selectionsort(int p, int q) { 28 clock_t start, end; 29 start = clock(); 30 for (int j = p; j <= q; j++) { 31 int cmin = j; 32 for (int i = j + 1; i <= q; i++) { 33 if (A[cmin] > A[i]) { 34 cmin = i; 35 } 36 } 37 swap(j, cmin); 38 } 39 end = clock(); 40 return end - start; 41} 42 43int inputdata() { 44 int n; 45 srand((unsigned)time(NULL)); 46 printf("出力する乱数の個数を入力===>"); 47 scanf("%d", &n); 48 printf("\n"); 49 for (int i = 1; i <= n; i++) { 50 A[i] = rand() % 10000; 51 } 52 return n; 53} 54 55void swap(int i, int j) { 56 int temp = A[i]; 57 A[i] = A[j]; 58 A[j] = temp; 59} 60 61void printA(int n, char* message) { 62 printf("%s\n", message); 63 for (int i = 1; i <= n; i++) { 64 printf("A[%d]=%5d ", i, A[i]); 65 if (i % 5 == 0) { 66 printf("\n"); 67 } 68 } 69 printf("\n"); 70}

実行例:

$ ./a.out 出力する乱数の個数を入力===>10 -------------入力データ-------------- A[1]= 7340 A[2]= 4195 A[3]= 5248 A[4]= 1943 A[5]= 6844 A[6]= 1519 A[7]= 7825 A[8]= 5134 A[9]= 4426 A[10]= 1680 --------------ソート済みデータ------------------ A[1]= 1519 A[2]= 1680 A[3]= 1943 A[4]= 4195 A[5]= 4426 A[6]= 5134 A[7]= 5248 A[8]= 6844 A[9]= 7340 A[10]= 7825 ソートの処理時間は0.000005秒です。

投稿2016/01/02 12:08

katoy

総合スコア22306

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

sort_merge

2016/01/02 14:35

ありがとうございます! 参考にさせていただきます!

0

ベストアンサー

こんにちは。

swap()を定義する前にselectionsort()で呼び出しているため、最初の警告が出ています。
単純にselectionsort()の定義の前にswap()関数の定義を移動すれば先頭の警告は消えます。

C

1int swap(i,j) 2int i,j; 3{ 4 int temp; 5 6 temp=A[i]; 7 A[i]=A[j]; 8 A[j]=temp; 9} 10 11int selectionsort(p,q) 12int p,q; 13{ 14 int i,j,a,cmin; 15(以下略)

2番目以降の警告は、戻り値を指定しているのに何も返却していないことの警告です。
下記4箇所です。

int selectionsort(p,q)
int inputdata(){
int printdata(){
int swap(i,j)

上記の「int」は各関数がint型を返却する指定です。しかし、各関数はreturn文がなく、戻り値を返却していません。簡単な対処としては、全てのintをvoidへ書き換えれば警告は出なくなる筈です。

投稿2016/01/02 09:44

Chironian

総合スコア23251

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

sort_merge

2016/01/02 11:40

改善することができました! 本当にありがとうございました!

0

ちょっと見で気が付いた所だけですが・・
int swap(i,j)の宣言が呼び出し前に無い。
関数に戻り値が無いのでintの代わりにvoidをつけましょうd^^
int swap(i,j)
int i,j;
{
は古い書き方です。
通常void swap( int i, int j)
{

投稿2016/01/02 09:29

編集2016/01/02 09:43
cateye

総合スコア6847

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

sort_merge

2016/01/02 11:42

とても参考になりました! 本当にありがとうございました!

0

C言語では関数を使う前に宣言か定義がなければなりません。

C

1int swap();

を最初の方の関数の宣言をしているところに追加してみてください。

投稿2016/01/02 09:26

raccy

総合スコア21689

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

sort_merge

2016/01/02 11:43

コンパイルすることができました! 本当にありがとうございました!

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。