• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語のGOTO文(組み込み系))

C言語のGOTO文(組み込み系)

このQ&Aのポイント
  • C言語でgoto文は使うな、スパゲティプログラムになりやすい。使うなら多重ループからの脱出のみ
  • C言語のgoto文はスパゲティプログラムになりやすいため、基本的には使わない方が良いです。
  • 例えば、あるサイトの図6をC言語で書いてみましたが、gotoを使わずにわかりやすいコードを書くことも可能です。

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.13

>初めの10秒間でsw1が押されなかったらエラー処理1を実施して終了。 >無事にsw1が押されると次の10秒がスタートする。 >次の10秒間でsw2が押されなかったら""エラー処理2を行った後エラー処理1を""実施して終了。 >無事にsw2が押されると次の次の10秒がスタートする。 >次の次の10秒間でsw3が押されなかったら""エラー処理3を行った後エラー処理2を行いエラー処理1""を実施して終了。 >です。 それなら、こうすればお望み通りになります。 switch( timerCheck() ) { case ERR_SYORI3: ____エラー処理3 case ERR_SYORI2: ____エラー処理2 case ERR_SYORI1: ____エラー処理1 ____break; } ・ERR_SYORI3→ERR_SYORI2→ERR_SYORI1 ・ERR_SYORI2→ERR_SYORI1 ・ERR_SYORI1 ですので、これでOKですか?

noname#175419
質問者

お礼

OKです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (15)

回答No.5

 No.4回答者さんが正解です。構造化プログラミングです。再帰呼び出しも出来るように(自分から自分を呼び出す。)なります。  ただメモリーマップドI/Oと思われますので切り替えてからある程度のディレイ時間が必要かも知れません。  読み込みポート指定出力してからの時間をWRITE_DELAY_TIME,  読み込んで次のポートを読み出す為の時間READ_DELAY_TIMEが必要かも知れませんので  万が一に備えて#defineで宣言して変更し易くしておくのが良いかと思われます。  Sleep()はスレッド停止時間が使用出来ればそのまま、使えないならForNextLoopでSleep()を新規に作成します。  組み込みのハードウェアのタイミングについては質問者さんが一番ご存知だと思われますが。 #define WRITE_DELAY_TIME 0 #define READ_DELAY_TIME 0 int checkButton(){ int register=0; p74 = High; Sleep(WRITE_DELAY_TIME); if(p70 == High){register ++;} Sleep(READ_DELAY_TIME); if(p71 == High){ register ++;} Sleep(READ_DELAY_TIME); if(p72 == High){ register ++;} Sleep(READ_DELAY_TIME); ... return (register == 1) ; }

noname#175419
質問者

補足

今回の場合は、DO-WHILE文で代替ができそうです。 では、下記のような場合はどうでしょう。 N0.8さんが言われる「出口を一か所に集中させるにはgoto文を使う」です。 果たして、goto文を使わないでできるのでしょうか。 説明: 初めの10秒間でsw1が押されなかったらエラー処理1を実施して終了。 無事にsw1が押されると次の10秒がスタートする。 次の10秒間でsw2が押されなかったらエラー処理2を実施して終了。 無事にsw2が押されると次の次の10秒がスタートする。 次の次の10秒間でsw3が押されなかったらエラー処理3を実施して終了。 /*開始*/ int timer //型宣言 timerは1秒割込みで0になるまで1秒置きに-1されるものとする timer = 10; // 10秒をセット do{ ____if(timer == 0){goto ERR_SYORI1;} }while(sw1 == off) timer = 10; // 10秒を再セット do{ ____if(timer == 0){goto ERR_SYORI2;} }while(sw2 == off) timer = 10; // 10秒を再セット do{ ____if(timer == 0){ ________エラー処理3 ERR_SYORI2: ________エラー処理2 ERR_SYORI1: ________エラー処理1 ________break; ____} }while(sw3 == off) /*終了*/

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

私なら、こんな感じにすると思います while(継続条件) { if( checkButton() ) { playSound(); } } そして、その流れ図のようなチェックをして、「音を鳴らしてはならない」なら0,「音を鳴らす」なら1を返す checkButton() 関数を作ります。 コードは、あなたが書いたのと似たのになりますが、 int checkButton(){ int register=0; p74 = High; if(p70 == High){register ++;} if(p71 == High){ register ++;} if(p72 == High){ register ++;} ... return (register == 1) ; } と、gotoは使いませんし、KAISIへ戻ったりもしません。 さて、このプログラム、「わかりづらい」でしょうか? gotoが害、というのは、構造化プログラミングという考え方から来たものです。 http://ja.wikipedia.org/wiki/%E6%A7%8B%E9%80%A0%E5%8C%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0 現在主流のオブジェクト指向は、この構造化を発展させたものです。 現在主流の言語の多くは、goto文がありません。「ループからの脱出」等の特定の使い方に限定されたジャンプ命令(continue,break等)があるだけです。 では、どうするのか? 最初からgotoを使わない設計をします。 その記事をざっと斜め読みしましたが、初級者がアセンブリでプログラムしているようです。 Cでのif+gotoにあたる条件付分岐命令を使うことを念頭にフローチャートを作っているように思われます。 命令の少ないアセンブリでは、それが正しいやりかたかもしれません。 それをそのままCへ持ってこようとすれば、どうしてもgoto文を使いたくなります。 ですが、最初から、例えば構造化プログラミングを念頭に設計すれば、フローチャート自体が別なものになるでしょう。 goto文を使うことも無いはずです。 /* フローチャート自体も、最近のプログラミング設計には向かないと言われています */

noname#175419
質問者

補足

回答で書かれた文において、 最後の文の return (register == 1) ; はどういう意味でしょうか? 教えてください。 宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

私もdo~while()で書いちゃいますね。 やりたいことからすると、無駄が有るけどこんなかんじで。 ____do { ________doremi = 0; ________register = 0; ________p74 = High; ________if(p70 == High) { ____________register++; ____________doremi = 1; ________} ________if(p71 == High) { ____________register++; ____________doremi = 2; ________} ________if(p72 == High) { ____________register++; ____________doremi = 3; ________} ________if(p73 == High) { ____________register++; ____________doremi = 4; ________} ________ ________・ ________ ________・ ________ ________ ____} while( register!=1 );

全文を見る
すると、全ての回答が全文表示されます。
  • jk39
  • ベストアンサー率54% (366/670)
回答No.2

私ならこう書きます。 まあ、do-while文も結構敬遠される書き方で、 do-whileにせざるを得ない設計は 他人のことを考えない悪い設計と私の職場なら言われかねません。 do{  p74 = High;  if(p70 == High){   register = 1;  }  if(p71 != High){   break;  }  register = register + 1; }while(register != 1); if(p72 == High){  ・  ・

全文を見る
すると、全ての回答が全文表示されます。
noname#214300
noname#214300
回答No.1

組み込み系という事で、企業などでPGをされている方だと仮定しますが、余所の人間がどうこう言おうと、職場の宗教に合わせるのが良いと思います。 (個人であれば、明日の自分の事を考えて使用頻度を見極めれば良いかと) GOTOを使わないというのは、単に他人がそのソースをメンテするときに処理を追いにくくなるからであって、要はその他人がGOTOを追い切れる土壌にあるならばそれなりに使って構わないと思います。 ちなみに自分の職場ではGOTOの使用は『例え何があっても』御法度といった宗教で動いていますが(GOTOを使わなければ書けないアルゴリズムはそれ自体が間違っているとのこと)、自分でしかメンテしないモジュールには適度にGOTOを使っています。神の領域に逝ってしまった諸先輩の技量に合わせるために残業はしたくありませんので……。 GOTOを使えばステップ数もそれなりに減るのに、使わない為にIF文を8重くらいにネストしたコードを弄ったことがありますが、そこまで来ると別の弊害を感じました。そのくせやたらめったらグローバルに変数置いてたりして、一体どうなってるのかと。 要は、何事も適度がいいって事だと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 組み込み系C言語の学習法

    私は組み込みソフトを8年やってきました。 規模としては、白物家電をイメージしてもらうと良いです。 但し、電子レンジなど表示機能がない製品が近いかもしれません。 近いものでは、洗濯機や冷蔵庫といった感じでしょうか。 マイコンは、旧三菱の740ファミリのM38000系です。 ただソフト経験(アセンブラ)はあるものの、C言語の経験は皆無なのです。 ただし、if-else, switch-case, for, while, break, continue は充分理解できます。 何故かというと、旧三菱系のマイコンには構造化アセンブラと言って、 C言語もどきの記述ができるのです。上記文のみ特別に設けられていたのです。 それを使ってソフトを作っていたので上記分は理解できるのです。 しかし、ややこしいのがポインタや構造体や共有体や配列です。 同じことをアセンブラでもやっているはずなのです。 ポインタや構造体や共有体をアセンブラで書くとどうなるかが知りたいのです。 ここの部分が書いてある書籍がないのです。 例えば、ポインタや配列は、旧三菱系で言うとXレジスタやYレジスタを 使って行っていた作業と似てるのかなと推測できます。 同じ境遇の方で克服された方がいらっしゃいましたらアドバイスをお願いします。 また、アマゾンで下記の本を見つけました。 参考になるのでしょうか? よろしくお願いします。  ""組込み現場の「C」プログラミング基礎からわかる徹底入門""

  • 組み込みアセンブラとは何ですか?

    私はx86でアセンブラを勉強中ですが、ネットでアセンブラ関係のことを検索していて組み込みアセンブラという記述をを見ました。 C言語から利用する場合インラインアセンブラより良いとかなんとか。 組み込みアセンブラという名前も怪しく合っているかわかりません。 掲示板のようなところで組み込みアセンブラの方が良い、早いと書いてありました。いろいろ検索して見かけたのでどこの掲示板かもわかりません。後から探したのですが見つけることができませんでした。 そこで質問なのですがそのその組み込みアセンブラとは何なんでしょうか? C言語からアセンブラを利用する場合、今読んでいる本「やさしいアセンブラ入門」にはインラインアセンブラとアセブラ言語モジュール(オブジェクトファイル)をCプログラムでリンクする方法の2種類が書いてありますが。組み込みアセンブラはモジュールで使うということでしょうか? 違うとすればどのような方法でアセンブラを利用することでしょうか? わかる方教えてください。ヨロシクお願いします。

  • PICのC言語でキャリーオーバー

    アセンブラはそこそこ使えるんですが最近C言語をはじめました。 一見簡単そうですがむずかしいですね。 アセンブラの場合 CNT からデータを取り出す場合 RLF CNT,F BTFSC STATUS,C GOTO APGM GOTO BPGM とやります。これをHi-tecC言語で自己流で cnt=cnt<<1; if(STATUS,0==1) APGM(); else BPGM(); なんて書いてみたんですがエラーでまくりです。 どう書くんでしょうか、おしえてください。 検索ずいぶんやったんですがSTATUS,CやSTATUS,0なんてCでは使わないんでしょうか?

  • 組み込みプログラマ

    制御系(マイコン)のプログラマに就職が決まった大学生です。 現在、アセンブラの勉強をしています。 今まで、Z80、PICの経験があります。 しかし、C言語で組み込み系のプログラムを書いたことはありません。 そこで、実際に組み込み系で働いておられる方に質問があります。 1.現在のマイコンではC言語が主流ですか? 2.アセンブラだけでは食っていけませんか? 3.組み込み系は寿命が長いと聞いたことがあるのですが、   本当でしょうか?

  • 25才ですが、組み込み系への転職を考えています。

    私は現在サーバの設定などを業務で行っています。 ですが、月の給料が総至急で18万程度、手取りで15万程度です。 実家暮らしなのでこの給料でもなんとかやっていけるのですが、 会社まで車で片道1時間運転をせねばならず、この点も苦痛です。 給料・通勤のことがあり転職を真剣に考えています。 私は2年ほど現在の会社でサーバの設定などを行っていますが、 その前の会社では1年ほどセンサチップのレジスタ値を読むプログラムをC言語で開発していました。 私はスクリプト言語よりもC言語やアセンブラなどが好きであり、 前の業務と似たような仕事をしたいと考えています。 組み込み系は慢性的な人手不足だと取引先の方に聞いたのですが、 組み込み系の職種でC言語を扱える人材を求めていたりしますでしょうか? また、組み込み系に転職しようとした場合、電気・電子の知識は必要になりますか?私は電気・電子については知識がありません。

  • 組込みでのC言語勉強法

    はじめまして。 最近、組込みのC言語を勉強しています。 処理速度の面や、可読性の良いプログラム、効率のよいプログラムを書けるようになりたいと思っています。 引数の数はレジスタで処理できる範囲におさめる事や、 構造体を使用するときにはポインタで渡すなど、 コードを書く際に気をつけるポイントがまとまってる書籍やHPなどを知りませんか? もしくは参考にすべき、サンプルコードなど知っていましたら、情報をいただけるとありがたいです。 よろしくお願いします。

  • goto を使わずに

    VC++でプログラムを作ったんですが、上司からgotoは使うなとの指示があり困ってます。 なにせ、まだまだVC++になれてないし、かなりの初心者です。 C言語は学生のころ習いました。 if(a==0x0030){ //0による除算を回避するために0は入力不可とする(0ディバイト) int ret; //エラー画面出力 ret=AfxMessageBox("0は入力不可です。",MB_OK|MB_ICONEXCLAMATION);//入力が0の場合エラーを表示 goto end; } ・ ・ ・ end: //エラーがあった場合ここにとんで最初からやり直される ; } こんなかんじなのですが、なにか解決法ありませんか?

  • 組込みで身に付けるべきこと

    SEとして就職して1年が経ちました。 組込みの分野で働いています。 ただ、組込みといっても、アセンブラでもなくオシロスコープをバシバシ使うこともなく、 普通のC言語によるアプリケーションでした。メモリも豊富らしく、気にするのはスタックくらいですし、 プロセッサを意識することもまずありません。 作業は単体や資料作成、設計書作成、動作確認などです。 周りの先輩たちのスキルも高いとは言えない印象です…(一部に凄い方もいらっしゃいます)。 二次請けの会社で人売りで利益を上げているということが分かってきました。 このまま働き続けてスキルが身に付くのか不安でなりません。 不安なので休日には参考書を購入してきて、組込み以外の分野の 勉強も始めています。 そこで教えていただきたいのですが、組込みをやっている(やっていた)からには、 最低限、このスキルを身に付けなければいかんというものがあれば教えて下さい。 また、組込みに限らずエンジニアが身に付けておいたほうが良いことは何でしょうか。 学歴も無いので、手に職付けたいです。 某掲示板を覗くと、この業界の悪い部分ばかりが書かれていて心が折れそうになります。 ネットワークやオブジェクト指向が必要かと思いますが、どうでしょうか? エンジニアの御先輩方、どうかアドバイスをお願い致します。

  • C言語で簡単暗号

    C言語を初めてけっこう立つんですが。 自分なりにソフトを作ってみました 暗号化、解読ができるソフトです 1.暗号化 2.解読 3.Quit ソースは #include <stdio.h> int main(void) { int i; char da; back: modo: do{ printf("1.angouka\n"); printf("2.kaidoku\n"); printf("3.Quit\n"); scanf("%d",&i); }while(i<1 || i>3); if(i==1){ da=getchar(); while(da){ printf("%c",da+1); da=getchar(); if(da=='.'){ goto modo; } } } else if(i==2){ da=getchar(); while(da){ printf("%c",da-1); da=getchar(); if(da=='.'){ goto back; } } } return 0; } なんですが。感想などここはこうした方が良いなどと教えてもらいたいんですが。 もっと簡潔にかけて破かれにくい暗号を書くにはどうしたらいいでしょう 教えて下さい

  • 家庭で楽しむプログラミング C#は?

    Windows上で、あくまでも趣味でプログラミングを楽しみたいと思っていますが、 最近はC#の開発環境が無料で手に入るのですね。 下記の経験しかない初心者にとってはどうでしょうか。C#はとっつきにくいですか? Microsoft QuickBasic VisualBasic 2.0、5.0、6.0 LSI-C86試食版(MS-DOS) シャープMZシリーズのHu-Basic、S-BASIC Z80アセンブラ PICアセンブラ 組み込み用マイコン(PIC)のMPLAB開発環境のCなど(ANSI-C) ゲームは作りませんが、画面上にグラフを表示したり、自作のUSB機器やシリアル接続の回路との通信をするのが主な目的です。 「C#って何?」というところから、理解できていませんのでよろしくお願いします。

このQ&Aのポイント
  • 黒インクが出なくなりました。かすれがひどく、ヘッドクリーニングを何度も行っても改善されません。
  • 製品名:MFC-J6983CDW
  • 環境:Windows10、接続:無線LAN、電話回線:ひかり回線
回答を見る