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

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

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

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

Q&A

4回答

515閲覧

コードを短くする方法

ironman2w

総合スコア1

C

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

0グッド

1クリップ

投稿2020/09/02 16:27

このコードを短くする方法はありますか?

include <3048f.h> //3048f.hの読み込み

/main関数/
int main(void)
{
int i,j; //待ち時間処理で使う変数の宣言

//LEDドットマトリクスの入出力設定 P4.DDR=0xff; PB.DDR=0xff; //点滅の永久ループ while(1) { //一行目のLEDがすべて点灯 P4.DR.BYTE=0x80; PB.DR.BYTE=0x00; //待ち時間処理(500[m秒]) for ( i=0; i<500; i++ ) //待ち時間処理(500*1[m秒]) { for ( j=0; j<20000; j++ ) //待ち時間処理(1[m秒]) ; } //二行目のLEDがすべて点灯 P4.DR.BYTE=0x40; PB.DR.BYTE=0x00; //待ち時間処理(500[m秒]) for ( i=0; i<500; i++ ) //待ち時間処理(500*1[m秒]) { for ( j=0; j<20000; j++ ) //待ち時間処理(1[m秒]) ; } //三行目のLEDがすべて点灯 P4.DR.BYTE=0x20; PB.DR.BYTE=0x00; //待ち時間処理(500[m秒]) for ( i=0; i<500; i++ ) //待ち時間処理(500*1[m秒]) { for ( j=0; j<20000; j++ ) //待ち時間処理(1[m秒]) ; } //四行目のLEDがすべて点灯 P4.DR.BYTE=0x10; PB.DR.BYTE=0x00; //待ち時間処理(500[m秒]) for ( i=0; i<500; i++ ) //待ち時間処理(500*1[m秒]) { for ( j=0; j<20000; j++ ) //待ち時間処理(1[m秒]) ; } //五行目のLEDがすべて点灯 P4.DR.BYTE=0x08; PB.DR.BYTE=0x00; //待ち時間処理(500[m秒]) for ( i=0; i<500; i++ ) //待ち時間処理(500*1[m秒]) { for ( j=0; j<20000; j++ ) //待ち時間処理(1[m秒]) ; } //六行目のLEDがすべて点灯 P4.DR.BYTE=0x04; PB.DR.BYTE=0x00; //待ち時間処理(500[m秒]) for ( i=0; i<500; i++ ) //待ち時間処理(500*1[m秒]) { for ( j=0; j<20000; j++ ) //待ち時間処理(1[m秒]) ; } //七行目のLEDがすべて点灯 P4.DR.BYTE=0x02; PB.DR.BYTE=0x00; //待ち時間処理(500[m秒]) for ( i=0; i<500; i++ ) //待ち時間処理(500*1[m秒]) { for ( j=0; j<20000; j++ ) //待ち時間処理(1[m秒]) ; } //八行目のLEDがすべて点灯 P4.DR.BYTE=0x01; PB.DR.BYTE=0x00; //待ち時間処理(500[m秒]) for ( i=0; i<500; i++ ) //待ち時間処理(500*1[m秒]) { for ( j=0; j<20000; j++ ) //待ち時間処理(1[m秒]) ; } } return 0;

}

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

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

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

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

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

cateye

2020/09/02 16:52 編集

なぜ、同じ処理(待ち時間処理など)を、関数にしないのでしょう? 待ち時間処理だけでも、48行が14行程度に成ります。 基本、main()は、制御構造だけをかいたほうが良いですよd^^
退会済みユーザー

退会済みユーザー

2020/09/02 23:53

インデントが消えて見づらくなるので、ソースは「コードの挿入」で記入してください。
thkana

2020/09/03 03:27

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11231031376 https://teratail.com/help#posted-otherservice 「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。 」 まずはマルチポストの理由をどうぞ。
guest

回答4

0

C

1#include <3048f.h> 2 3int main(void) 4{ 5 for (P4.DDR = 0xff, PB.DDR = 0xff; ; ) 6 for (int i, m = 0x80; m; m >>= 1) 7 for (P4.DR.BYTE = m, PB.DR.BYTE = i = 0; i < 500; i++) 8 for (int j = 0; j < 20000; j++) ; 9}

投稿2020/09/03 00:06

kazuma-s

総合スコア8224

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

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

cateye

2020/09/03 01:17

コンパイラがどういったコードを吐くか分かりませんが、 出力ポート(P4.DR.BYTE:8ビット)にintを出力するのは如何なものかと?
kazuma-s

2020/09/03 01:40

質問のコード P4.DR.BYTE = 0x80; を否定するのですか? 0x80 は int です。
cateye

2020/09/03 02:59

http://www008.upp.so-net.ne.jp/funfly/h8_2.html には、即値(リテラル)で書いてあります。 まぁ、コンパイラがどう解釈するかなんでしょうが・・・通常int→charはワーニング対象だと思います。
guest

0

31行

c

1#include <stdint.h> 2 3void func(uint8_t v) 4{ 5 P4.DR.BYTE = v; 6 PB.DR.BYTE = 0x00; 7 //待ち時間処理(500[m秒]) 8 for(int i = 0; i < 500; i++) { //待ち時間処理(500*1[m秒]) 9 for(int j = 0; j < 20000; j++) //待ち時間処理(1[m秒]) 10 ; 11 } 12} 13/*main関数*/ 14int main(void) 15{ 16 //LEDドットマトリクスの入出力設定 17 P4.DDR = 0xff; 18 PB.DDR = 0xff; 19 20 uint8_t v = 0x80; 21 //点滅の永久ループ 22 while(1) { 23 //N行目のLEDがすべて点灯 24 func(v); 25 v >>= 1; 26 if(v == 0x00) { 27 v = 0x80; 28 } 29 } 30 return 0; 31}

「追記」これなら29行

c

1#include <stdint.h> 2 3void func(uint8_t v) 4{ 5 P4.DR.BYTE = v; 6 PB.DR.BYTE = 0x00; 7 //待ち時間処理(500[m秒]) 8 for(int i = 0; i < 500; i++) { //待ち時間処理(500*1[m秒]) 9 for(int j = 0; j < 20000; j++) //待ち時間処理(1[m秒]) 10 ; 11 } 12} 13/*main関数*/ 14int main(void) 15{ 16 //LEDドットマトリクスの入出力設定 17 P4.DDR = 0xff; 18 PB.DDR = 0xff; 19 20 static uint8_t va[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; 21 size_t pos = 0; 22 //点滅の永久ループ 23 while(1) { 24 //N行目のLEDがすべて点灯 25 func(va[pos]); 26 pos = (pos + 1) & 0x07; 27 } 28 return 0; 29}

投稿2020/09/02 21:45

編集2020/09/02 23:17
cateye

総合スコア6851

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

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

cateye

2020/09/02 22:21 編集

環境がないので、型名などは適当です。 stdint.hやuint8_tがなければ、unsigned charに読み替えてください。 ・・・charは処理系依存なので、シフトした時の最上位ビットの扱いが違う場合があります。
guest

0

  • n行目のLEDの点灯関数
  • nm秒の待ち時間関数

の2つを作っておけば、main関数は、関数呼び出しを並べるだけでできますね

投稿2020/09/02 21:30

y_waiwai

総合スコア88042

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

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

0

以下のような関数を作り、それを呼ぶように置き換えればコードの行数は短く出来るのではないでしょうか?
(関数名とか変数名とか適当です。wait2は引数とせず定数値のままでも良いかもしれません。)

void SetLED( int P4, int PB, int wait1, int wait2 ) { //一行目のLEDの操作 P4.DR.BYTE=P4; PB.DR.BYTE=PB; //待ち時間処理 for ( i=0; i<wait1; i++ ) //待ち時間処理(wait1*wait2[m秒]) { for ( j=0; j<wait2; j++ ) //待ち時間処理(wait2[m秒]) ; } }

投稿2020/09/02 16:44

編集2020/09/02 16:49
hidezzz

総合スコア1248

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問