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

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

ただいまの
回答率

90.51%

  • C

    4529questions

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

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

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 8,798

sort_merge

score 10

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

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

#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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、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 20:41

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

    キャンセル

checkベストアンサー

0

こんにちは。

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

int swap(i,j)
int i,j;
{
  int temp;

  temp=A[i];
  A[i]=A[j];
  A[j]=temp;
}

int selectionsort(p,q)
int p,q;
{
  int i,j,a,cmin;
(以下略)

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/02 20:40

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

    キャンセル

0

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

int swap();


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/02 20:43

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

    キャンセル

0

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/02 20:42

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

    キャンセル

0

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

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

#define MAXN 100000
int inputdata();
double selectionsort();
void swap(int i, int j);
void printA(int n, char* message);

int A[MAXN];

int main(int argc, char** argv) {
  int n;
  double time;

  n = inputdata();

  printA(n, "-------------入力データ--------------");
  time = selectionsort(1, n);
  printA(n, "--------------ソート済みデータ------------------");

  printf("ソートの処理時間は%f秒です。 \n", time / CLOCKS_PER_SEC);
  return 0;
}

double selectionsort(int p, int q) {
  clock_t start, end;
  start = clock();
  for (int j = p; j <= q; j++) {
    int cmin = j;
    for (int i = j + 1; i <= q; i++) {
      if (A[cmin] > A[i]) {
        cmin = i;
      }
    }
    swap(j, cmin);
  }
  end = clock();
  return end - start;
}

int inputdata() {
  int n;
  srand((unsigned)time(NULL));
  printf("出力する乱数の個数を入力===>");
  scanf("%d", &n);
  printf("\n");
  for (int i = 1; i <= n; i++) {
    A[i] = rand() % 10000;
  }
  return n;
}

void swap(int i, int j) {
  int temp = A[i];
  A[i] = A[j];
  A[j] = temp;
}

void printA(int n, char* message) {
  printf("%s\n", message);
  for (int i = 1; i <= n; i++) {
    printf("A[%d]=%5d    ", i, A[i]);
    if (i % 5 == 0) {
      printf("\n");
    }
  }
  printf("\n");
}


実行例:

$ ./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 23:35

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

    キャンセル

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

  • C

    4529questions

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