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

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

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

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

Q&A

解決済

2回答

187閲覧

実行日時、実行時間を表示して、実行時間の短い順に表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2017/09/23 05:38

編集2017/09/24 06:47

実行日時、実行時間を、実行時間の短い順に表示したいのですが、
コンパイルはできる状態です。コードの下に実行結果を張り付けています。
実行時間時間の短い順に表示されない。

コード #include <stdio.h> #include <stdlib.h> #define NDATA ((sizeof lst)/(sizeof(DATA_TIME))) typedef struct // { int year; // int mon; // int mday; // int hour; // int min; // int sec; double score; }DATA_TIME; // --------------- 比較用の関数 cmp cmp ------------------- int cmpptr( const void *p, const void *q ) { return (*(DATA_TIME**)p)->score - (*(DATA_TIME**)q)->score; } // ---------------------------------------------------- int main() { DATA_TIME lst[]={{2017, 9,16, 8,18,10,10.6}, {2015,12, 7,19,59, 8, 8.0}, {2016, 1, 3, 1, 9,11, 7.5}, {2016, 4, 5,19,16, 8, 9.0}, {2015, 6, 4,19, 2,44, 7.5}, {2016, 8, 7,22,31,52, 9.3}, {2014, 1, 4,23,43,50,10.2}, {2016, 5,31,21, 9,53, 7.0}, {2014, 2,12,28,31,49,13.0}, {2016, 2,28, 2,27,20, 7.8}, {2015, 5, 2,16,43,32, 6.3}, {2017, 9,14,10,21,18, 6.0}, {2017, 9,16, 8,18,10, 8.6}}; int i; DATA_TIME *plst[NDATA]; // ポインタの配列 plst に構造体配列のアドレスを代入 for(i=0; i<NDATA; i++) plst[i]=&lst[i]; // 実行時間の短い順にソート qsort(plst, NDATA, sizeof(DATA_TIME*), cmpptr ); //並べ替え後の内容を表示 for( i=0; i<NDATA; i++ ) printf(" %d年 %d月 %d日 %d時 %d分 %d秒 実行時間:%.1f秒\n\n" ,plst[i]->year, plst[i]->mon, plst[i]->mday, plst[i]->hour, plst[i]->min, plst[i]->sec, plst[i]->score); } /*実行結果 C:\MinGW\users\chap09\kadai>gcc -I. -o narabekae2 narabekae2.c -Wall C:\MinGW\users\chap09\kadai> narabekae2 2017年 9月 14日 10時 21分 18秒 実行時間:6.0秒 2015年 5月 2日 16時 43分 32秒 実行時間:6.3秒 2016年 1月 3日 1時 9分 11秒 実行時間:7.5秒 2015年 12月 7日 19時 59分 8秒 実行時間:8.0秒 2015年 6月 4日 19時 2分 44秒 実行時間:7.5秒 ・・・おかしい 2016年 2月 28日 2時 27分 20秒 実行時間:7.8秒 ・・・おかしい 2016年 5月 31日 21時 9分 53秒 実行時間:7.0秒 ・・・おかしい 2016年 4月 5日 19時 16分 8秒 実行時間:9.0秒 2016年 8月 7日 22時 31分 52秒 実行時間:9.3秒 2014年 1月 4日 23時 43分 50秒 実行時間:10.2秒 2017年 9月 16日 8時 18分 10秒 実行時間:8.6秒 ・・・おかしい 2017年 9月 16日 8時 18分 10秒 実行時間:10.6秒 2014年 2月 12日 28時 31分 49秒 実行時間:13.0秒 C:\MinGW\users\chap09\kadai> */

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

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

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

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

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

guest

回答2

0

ベストアンサー

回答依頼ありがとうございます。原因が判明したのでお伝えします。


ずばり原因は、cmp関数にあります。
この関数の返り値は暗黙のうちにintにキャストされます。

つまり、差が0~0.99999999...までの場合、0が返されます。
これは、入れ替える必要がないと通達することと同じです。


多少泥臭いですが、次のように書き換えれば期待通りに作動します。

C

1int cmp(const void *p, const void *q) { 2 double p_score = ((tim_t *)p)->score; 3 double q_score = ((tim_t *)q)->score; 4 5 if (p_score > q_score) return 1; 6 else if(p_score < q_score) return -1; 7 else return 0; 8}

投稿2017/09/24 06:58

編集2017/09/24 10:52
LouiS0616

総合スコア35660

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

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

LouiS0616

2017/09/24 06:59

あれ、質問のプログラムが変わっていますね。 それでも原因は一緒です。
退会済みユーザー

退会済みユーザー

2017/09/24 10:04

すみません。同じことをいろいろ試しています。同じ目的のためです。今からやってみます。 ありがとうございます。比較関数を直すだけでいいのですね。解らないときはまたこめんとします。
退会済みユーザー

退会済みユーザー

2017/09/24 10:27

louiS0616さん、できました。ありがとうございます。int p_scoreはdouble p_scoreで実行させていただきました。コード書き直しながらこれだけで2日掛かりました。いろいろ試したコードの整理をしたいと思います。この次に復習に備えて。また同じような質問が出てくると思いますが、おしえてください。
LouiS0616

2017/09/24 10:54

p_scoreの型は凡ミスしたので、直しておきました。 小さなプログラムから始めて、不安を残さないように進めていくのがよいと思います。 他の人のコードも読んでみましょう。 頑張ってくださいね。
退会済みユーザー

退会済みユーザー

2017/09/24 11:13

ありがとうございます。
guest

0

コメントアウトされているqsortの呼び出しで、合ってると思います。

#追記
すいません。よく見切れてませんでした。

C

1int cmpptr( const void *p, const void *q ) { 2 return ((SCORE_DATA*)p)->score - ((SCORE_DATA*)q)->score; 3} 4・・・・・・・ 5 qsort( local, *count, sizeof(SCORE_DATA), cmpptr );

じゃないですかね。

投稿2017/09/23 15:58

編集2017/09/24 01:35
otn

総合スコア84499

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

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

退会済みユーザー

退会済みユーザー

2017/09/24 00:29

otnさんありがとうございます。過去履歴は表示されるようになりましたが、並べ替えがうまくいってないようです。いろいろやったのですが、表示がされても時間がぐちゃぐちゃだったり、今は表示自体ができない状態です。途中のアルゴリズムがおかしいようなきもします。前に作ってうまく動いたのですが、保存の仕方が 悪くて、修正できないので、1個ずつ分割してつくりなおしています。並べ替えのコードのところを見てもらえませんか?
退会済みユーザー

退会済みユーザー

2017/09/24 01:05

debugしてみると、Program received signal SIGSEGV, Segmentation fault. 0x0040146b in cmpptr (p=0x61f258, q=0x61f270) at narabekae.c:25 25 return (*(SCORE_DATA**)p)->score - (*(SCORE_DATA**)q)->score;というふうにでています。ここをどのように調べて、どのようになおすのでしようか。
退会済みユーザー

退会済みユーザー

2017/09/24 04:28

qsort( local, *count, sizeof(SCORE_DATA), cmpptr );とqsort( local, *count, sizeof(SCORE_DATA*), cmpptr );でやってみましたが並べ替えができないですね。簡単な書き換えプログラムに変更してみますので、おねがいします。順番が少しおかしいです。教えてください。
退会済みユーザー

退会済みユーザー

2017/09/24 06:49

大体小さい順になっているがおかしい順番になっているところがあります。 どうしてかわかりません。教えてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問