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

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

zwiの回答

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

>説明: >初めの10秒間でsw1が押されなかったらエラー処理1を実施して終了。 >無事にsw1が押されると次の10秒がスタートする。 >次の10秒間でsw2が押されなかったらエラー処理2を実施して終了。 >無事にsw2が押されると次の次の10秒がスタートする。 >次の次の10秒間でsw3が押されなかったらエラー処理3を実施して終了。 No.4回答者さんの方法なら別に問題なく書けますよ。 ------------- ここから /*開始*/ int timer //型宣言 timerは1秒割込みで0になるまで1秒置きに-1されるものとする enum { ERR_NASHI, ERR_SYORI1, ERR_SYORI2, ERR_SYORI2, }; switch( timerCheck() ) { case ERR_SYORI1: ____エラー処理1 ____break; case ERR_SYORI2: ____エラー処理2 ____break; case ERR_SYORI3: ____エラー処理3 ____break; } int timerCheck() { ____timer = 10; // 10秒をセット ____while( sw1 == off ) { ________if(timer == 0) return ERR_SYORI1; ____} ____timer = 10; // 10秒を再セット ____while( sw2 == off ) { ________if(timer == 0) return ERR_SYORI2; ____} ____timer = 10; // 10秒を再々セット ____while( sw3 == off ) { ________if(timer == 0) return ERR_SYORI3; ____} ____return ERR_NASHI; } ------------- ここまで とにかく、いろんな手法を心得た上でgotoが一番簡潔だと言う結論なら分かるのですが、gotoまず有りきに見えるのが気になるところです。 私も場合によっては使いますよ。 この処理はどうかと思います。 >do{ >____if(timer == 0){ >________エラー処理3 >ERR_SYORI2: >________エラー処理2 >ERR_SYORI1: >________エラー処理1 >________break; >____} >}while(sw3 == off)

noname#175419
質問者

補足

例題の説明ですが、私の説明が悪かったです。すいません。 正しくは、 初めの10秒間でsw1が押されなかったらエラー処理1を実施して終了。 無事にsw1が押されると次の10秒がスタートする。 次の10秒間でsw2が押されなかったら""エラー処理2を行った後エラー処理1を""実施して終了。 無事にsw2が押されると次の次の10秒がスタートする。 次の次の10秒間でsw3が押されなかったら""エラー処理3を行った後エラー処理2を行いエラー処理1""を実施して終了。 です。 gotoを使った方が一つの関数で済むのでスッキリすのではと 主張したかったからです。 とある書籍では「スパゲティになるのでgotoは使わないように」と目の敵のように書かれており、納得がいかなかった次第です。 アセンブラでは、ブランチ命令のようにラベルに飛ばすことは、 当たり前のように行っていたのにC言語になると「goto使うな」です。どの書籍も説明不足なんです。 今回のように、gotoで書いた例文をgotoのない文に変更して、 比較するなどの説明をしてほしいのものです。

関連する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#って何?」というところから、理解できていませんのでよろしくお願いします。