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

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

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

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

Q&A

解決済

5回答

31515閲覧

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

sort_merge

総合スコア16

C

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

0グッド

0クリップ

投稿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.

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

もっとも単純な対処法は

-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

総合スコア1193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sort_merge

2016/01/02 11:41

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

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

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sort_merge

2016/01/02 14:35

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

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

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sort_merge

2016/01/02 11:40

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

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

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sort_merge

2016/01/02 11:42

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

0

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

C

1int swap();

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

投稿2016/01/02 09:26

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sort_merge

2016/01/02 11:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問