switch文の引数について質問します

このQ&Aのポイント
  • switch文の引数について疑問があります
  • ch.ntb.usb.testAppの中のルーチンについて調査しています
  • switch文の引数に珍しい書き方があるようです
回答を見る
  • ベストアンサー

switch文の引数について質問します

ch.ntb.usb.testAppの中に下記のルーチンがあり、switch文の最初に "8.$"の記述があります。 Q1)この様な書き方があるのでしょうか? 注)ch.ntb.usb.testAppは、ch.ntb.usb-0.5.9.jarの中のpackageです。 void setOutEpAddr() { switch (8.$SwitchMap$ch$ntb$usb$testApp$AbstractDeviceInfo$TransferMode[this.dev.getOutMode().ordinal()]) { case 1: this.outEpText.setText(toHexString(this.dev.getOutEPBulk())); break; case 2: this.outEpText.setText(toHexString(this.dev.getOutEPInt())); break; } } 以上、宜しくお願いします。

  • Java
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • sech1152
  • ベストアンサー率72% (45/62)
回答No.4

No.3 です。 TestApp.classについて このようなパッケージの構成の場合は、 case TransferMode.Bulk: や case TransferMode.Interrupt: は、「TransferMode.」を省略して、 case Bulk: や case Interrupt: で大丈夫みたいですね。 TestDevice.classについて switch (this.dev.getOutMode()) { と switch (this.dev.getInMode()) { // 2つ目はgetOutModeではなくgetInModeですよね? は、それぞれ switch (getOutMode()) { と switch (getInMode()) { です。 switchの中を戻すのは、$SwitchMap~の後の[]で囲まれた中から“.ordinal()”を除いたものです。 と、いろいろ書いてきましたが、もしソースコードを知りたいだけでしたら、 https://svn.code.sf.net/p/libusbjava/code/branches/libusb_api_0v1/java/ からたどっていけば出てきます。(検索していたら、さっき見つけました。) たとえば、TestAppは、 https://svn.code.sf.net/p/libusbjava/code/branches/libusb_api_0v1/java/src/ch/ntb/usb/testApp/TestApp.java です。

bakabon_X
質問者

補足

sech1152  さん 本当に、貴重な情報有難うございます。 訂正して、やってみます。 >いろいろ書いてきましたが、もしソースコードを知りたいだけでしたら、 https://svn.code.sf.net/p/libusbjava/code/branches/libusb_api_0v1/java/ からたどっていけば出てきます。(検索していたら、さっき見つけました。) たとえば、TestAppは、 https://svn.code.sf.net/p/libusbjava/code/branches/libusb_api_0v1/java/src/ch/ntb/usb/testApp/TestApp.java です <---この情報が本当に欲しかったところです。

その他の回答 (3)

  • sech1152
  • ベストアンサー率72% (45/62)
回答No.3

8というのは、コンパイラが内部処理用に自動で生成したクラスの名前です。 本来は、「8」という数字だけのクラス名は認められていませんが、内部だけで使用する目的でそう名前をつけたものが、逆コンパイルするときに、そのまま表示されてしまったのでしょう。 その8というクラスの中に、「$SwitchMap$ch$ntb$usb$testApp$AbstractDeviceInfo$TransferMode」という名前の配列(staticなフィールドとしてのint[] )があるのだと思います。 ch.ntb.usb-0.5.9.jarを解凍すると、「TestApp.class」のほかに「TestApp$8.class」というようなクラスが生成されているのが分かると思います。 (.jarの解凍の仕方は、拡張子のjarをzipに変えれば、zipとして解凍できます。) これは、列挙型を使ったswitch文をコンパイルするときに、内部的にはこのように処理されるということのようです。 参考サイト:ひしだま's 技術メモページ、Java列挙型「switchの実装」 http://www.ne.jp/asahi/hishidama/home/tech/java/enum.html#h2_switch おそらく元のソースでは、 void setOutEpAddr() { switch (this.dev.getOutMode()) { case TransferMode.Bulk: this.outEpText.setText(toHexString(this.dev.getOutEPBulk())); break; case TransferMode.Interrupt: this.outEpText.setText(toHexString(this.dev.getOutEPInt())); break; } } のようになっていたと思われます。

bakabon_X
質問者

補足

sech1152 さま 貴重な情報有難うございます。 ch.ntb.usb-0.5.9.jarの中のch.ntb.usb.test.Appの中のTestApp.classとTestDevice.classの中にはswitch文が合計4箇所あります。 各switch文は、read/write、epin/epoutに分かれています。 よって、各switch文は、少しづつコンパイルエラーがあります。 (xxxxx:ngで示す箇所) このコンパイルエラーの解決方法を、推論できれば、お教え頂けないでしょうか? 尚、私も、今検討中です。 TestApp.class void setOutEpAddr(){ switch (this.dev.getOutMode()) { case TransferMode.Bulk: //TransferMode.Bulk:ng this.outEpText.setText(toHexString(this.dev.getOutEPBulk())); break; case TransferMode.Interrupt: //TransferMode.Interrupt:ng this.outEpText.setText(toHexString(this.dev.getOutEPInt())); break; } } void setInEpAddr(){ switch (this.dev.getOutMode()) { case TransferMode.Bulk: //TransferMode.Bulk:ng this.inEpText.setText(toHexString(this.dev.getInEPBulk())); break; case TransferMode.Interrupt: //TransferMode.Interrupt:ng this.inEpText.setText(toHexString(this.dev.getInEPInt())); break; } } //================= TestDevice.class switch (this.dev.getOutMode()) { //OutMode():ng case TransferMode.Bulk: lenWritten = dev.writeBulk(getOutEPBulk(), data, length, getTimeout(), false); sb.append("write_bulk, ep: 0x" + Integer.toHexString(getOutEPBulk()) + ", " + lenWritten + " Bytes sent: "); break; case TransferMode.Interrupt: lenWritten = dev.writeInterrupt(getOutEPInt(), data, length, getTimeout(), false); sb.append("write_interrupt, ep: 0x" + Integer.toHexString(getOutEPInt()) + ", " + lenWritten + " Bytes sent: "); } switch (this.dev.getOutMode()) { //getOutMode:ng case TransferMode.Bulk: lenRead = dev.readBulk(getInEPBulk(), data, dev.getMaxPacketSize(), getTimeout(), false); sb.append("read_bulk, ep: 0x" + Integer.toHexString(getInEPBulk()) + ", " + lenRead + " Bytes received: Data: "); break; case TransferMode.Interrupt: lenRead = dev.readInterrupt(getInEPInt(), data, dev.getMaxPacketSize(), getTimeout(), false); sb.append("read_interrupt, ep: 0x" + Integer.toHexString(getInEPInt()) + ", " + lenRead + " Bytes received: Data: "); } このソースの解析目的は、USBのhighSpeed転送を行なうことですが、私はjavaに関しては 初心者です(VC++は多少知識があります)。 以上、宜しくお願いします。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

それはEclipseが逆コンパイルしたソースね 逆コンパイルの精度の問題で そんな風になっちゃっているだけだと思うわ 実際に実装したソースには こんな風には書いていないの 推測だけど switch(AbstractDeviceInfo.TransferMode[this.dev.getOutMode().ordinal()]) しか書いていなかったんじゃないかしら 実際にはソースを入手しないと誰にも分からないけど

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

実装してみれば分かると思うけど コンパイル通らないと思うわ

bakabon_X
質問者

補足

javaでは、コードをキーインした時点でコンパイルが行なわれます。 この時点でエラーとなります。 ch.ntb.usb.testAppの中には、この記述がありますので質問したわけです。 拡張子は、TestApp.classとなっています。

関連するQ&A

  • javaのUSBの読込命令について質問

    下記は(//========で囲まれた部分)、USBの読込命令に関連したコードです。 USBのデーターを読込みますと、読込みましたバイト数をsize_readDで返してきます。 読込むデーターが無い場合は、size_readDはゼロにならず、catchもされず、下記の 他のUSBExceptionが発生します。 Q1)ゼロを含めた読込みバイト数を返す読込み命令はありますか(例えば、readBulk)? /** * Dispatch an uncaught exception to the handler. This method is * intended to be called only by the JVM. */ private void dispatchUncaughtException(Throwable e) { getUncaughtExceptionHandler().uncaughtException(this, e); } //============================== import ch.ntb.usb.Device; import ch.ntb.usb.LibusbJava; import ch.ntb.usb.USB; import ch.ntb.usb.USBException; import ch.ntb.usb.Usb_Bus; import ch.ntb.usb.Usb_Config_Descriptor; import ch.ntb.usb.Usb_Device; import ch.ntb.usb.Usb_Device_Descriptor; import ch.ntb.usb.Utils; try{ size_readD=dev.readBulk(0x82, readData_byte, DATAWORDX*4, 500, true);   //size_readDはゼロにはならず、特別な割込みが発生します } catch (USBException e) { System.out.println("readBulk_Error_PLR(USBException): size_readD="+size_readD); System.exit(1); } if(size_readD==0){ //このコードは機能せず System.out.println("size_readD="+size_readD); break; } //===========================

    • ベストアンサー
    • Java
  • ch.ntb.usb-5.0.9.jarの使用

    毎度、お世話になります。 javaのusbWrapper(ch.ntb.usb-5.0.9.jar)をdownloadしてます。 そして、このpackageが利用できる様にするために、下記の如くdosコマンドを実行しています。 java -classpath c:\pleiades44\workspace\ch.ntb.usb-5.0.9.jar ch.ntb.usb-5.0.9.jar そこで、下記のエラーが表示されます。 メインクラス:ch.ntb.usb-5.0.9.jarが見つかりません。 なお、usbWrapperに関しましては、http://libusbjava.sourceforge.net/wp/?page_id=8 を 参照しています。 この件に関しましてコメント頂けますと大変助かります。

    • ベストアンサー
    • Java
  • for文の中にswitch文はいれられない??

    題名の通りfor文の中にswitch文はいれられないのでしょうか? 例えばの例ですが、 for(i=1;i<3;i++){ switch (i) { case 1: printf("←\r"); Sleep(400); break; case 3: printf("↑\r"); Sleep(400); break; default: printf("others\n"); break; } } このようなプログラムはかけないのでしょうか。 実行すると何も表示されないのですが、どこかおかしいのでしょうか?? どなたかご指導お願いします><

  • switch文 defaultについて

    switch文で曜日を表示するプログラムを作成したいのですが、 任意の月の1日を日曜日とし、入力された日にち(変数date)の曜日を変数dayとしました。 day=(date-1)%7 とし、day=0のとき日曜日、day=1のとき月曜日、・・・、day=6のとき土曜日とします。 dateに0以下の数が入力されたとき、default文で「その月は1日から始まります。」 dateに32以上の数が入力されたとき、default文で「その月は31日までです。」 といったエラーを表示させたいと思います。 1つのswitch文の中に2種類のdefault文をどうやって書いたらいいのかわかりません。 switch文以下のプログラムは、以下のように書いてみました。 day=(date-1)%7; switch(day) { case 0: printf("1月%d日は日曜日です。",date); break; case 1: printf("1月%d日は月曜日です。",date); break; case 2: printf("1月%d日は火曜日です。",date); break; (case 3~case 5も同様に書く。) case 6: printf("1月%d日は土曜日です。",date); break; default: printf("1月は31日までです。"); /*dateに32以上の数が入力された場合のエラー表示*/ break; default: printf("1月は1日から始まります。"); /*dateに0以下の数が入力された場合のエラー表示*/ break; } しかし、1つのswitch文にdefault文は1つしか書けませんよね? 入力された日によってdefault文を使い分けるにはどうしたらよいのでしょうか。

  • Javaのswingについて質問です。

    public class Enshu12 extends JApplet { private JLabel lb1; private JLabel lb2; int num=0; int now=0; public void init() { lb1=new JLabel("数字を入力してください。"); lb2=new JLabel(""+num+""); add(lb1,BorderLayout.NORTH); add(lb2,BorderLayout.SOUTH); addKeyListener(new SampleKeyListener()); } public class SampleKeyListener extends KeyAdapter { int i; public void keyPressed(KeyEvent e) { char c=e.getKeyChar(); int mod=e.getModifiersEx(); if(mod==InputEvent.SHIFT_DOWN_MASK||c=='-'||c=='/'){ select(c); } else{ inputNum(c); calc(); lb2.setText(""+num+""); } } public void select(char c) { switch(c){ case '+': now=1;lb1.setText("足し算をします。数字を入力して下さい。");break; case '-':now=2;lb1.setText("引き算をします。数字を入力してください。");break; case '*':now=3;lb1.setText("かけ算をします。数字を入力して下さい。");break; case '/':now=4;lb1.setText("割り算をします。数字を入力して下さい。");break; } } public void inputNum(char c) { switch(c){ case '0': i=0;break; case '1': i=1;break; case '2': i=2;break; case '3': i=3;break; case '4': i=4;break; case '5': i=5;break; case '6': i=6;break; case '7': i=7;break; case '8': i=8;break; case '9': i=9;break; } } public void calc() { switch(now){ case 1: num=num+i; break; case 2: num=num-i; break; case 3: num=num*i;break; case 4: num=num/i; break; default : num=i; break; } } } 簡単な電卓を作り電卓機能としてはできたのですが、数字と演算子を交互に入力させたいため、数字または演算子の入力が連続入力された場合は例外処理をさせたいのですが、例外のクラスは作るとしてどのような仕組みにしたら良いでしょうか?単純にbooleanでそれぞれの切り替えをするとうまく動きません・・><教えてください。

    • ベストアンサー
    • Java
  • switch文の中でforeach

    switch文の中でforeachをしたいのですが、うまくいきません。 <現状> $x=5; switch( $x ){  case 2:   echo $x="JavaScript";    break;  case 5:   echo $x="PHP";   break;  default:   echo $x="未分類"; } <やりたいこと>判定データを別で用意して、読み込ませたい $x_master = array(  2 => "JavaScript",  5 => "PHP", ); ■テスト1 $x=5; switch( $x ){  foreach( $x_master as $key => $value ){   case $key:    echo $x=$value;   break;  }   default:    echo $x="未分類"; } これを試すと、Parse error: syntax error, unexpected T_FOREACH, expecting T_CASE or T_DEFAULT or '}'となります。これは、switchの中でforeachは使えないということでしょうか? ■テスト2 $x=5; foreach( $x_master as $key => $value ){  switch( $x ){   case $key:    echo $x=$value;    break;   default:    echo $x="未分類";  } } $x=2;だとJavaScript未分類となるのに、$x=5;だと未分類未分類になります。 $x=2と$x=5で挙動が異なる理由が分かりません。 ■テスト3 $x=5; foreach( $x_master as $key => $value ){  switch( $x ){   case $key:    echo $x=$value;   break;  } } これでようやく望んだ結果が得られたのですが、これでo.k.のなのでしょうか? なんでdefault入れてはダメなのでしょうか? foreachでいくら回しても、該当部分が存在する限り、breakして、defaultへはいかないと思うのですが…。それともforeachの一番最後の終了処理で何かが返ってきて、それが該当項目に存在せず、defaultへ流れる結果となるのでしょうか? そもそも、考え方として、foreachで回している以上、この場合、例外というか、switch文のdefaultに該当する部分は必要ないとの認識でよいでしょうか? 質問内容 ■テスト1が、syntax errorとなる理由 ■テスト2で、$x=2なら$x_masterを読み込むのに、$x=5なら$x_masterを読み込まない理由 ■テスト3のケースは、default部分を本当に書かなくてo.k.でしょうか? またその理由は?

    • ベストアンサー
    • PHP
  • switch文とscanfについて

    ソースコード------------------------------------- #include <stdio.h> void main(){ int i; char s, ch; while(1){ printf("Input 1 or 2\n"); scanf("%c", &s); switch(s){ case '1' : printf("Input a number\n"); scanf("%d", &i); printf("You input '%d'\n", i); break; case '2' : printf("Input a character\n"); scanf("%c", &ch); printf("You input '%c'\n", ch); break; } } } ----------------------------------------------- 実行例----------------------------------------- Input 1 or 2 1 Input a number 4 You input '4' Input 1 or 2 Input 1 or 2 //------(1) 2 Input a character You input ' //------(2) ' Input 1 or 2 ----------------------------------------------- (1)について。 なぜ"Input 1 or 2"が二回繰り返されているのですか。 (2)について。 scanfが呼び出されて入力待ちになることを期待しているのですが、 なぜ(2)のようになってしまうのでしょうか。

  • Switch文における、returnとbreakについて

    いつもお世話になります。 今回は、switch文において質問します。 XOOPSの中のスクリプトからですが、 ■ A code: --------------- switch($esc_type){ case 'html': return htmlspecialchars($string, ENT_QUOTES, $char_set); case 'htmlall': return htmlentities($string, ENT_QUOTES, $char_set); -----(中略)------ default: return $string; } ■ B code: --------------- switch($level){ case '1': return '\part{'; break; -----(中略)------ case '6': return '\subparagraph{'; break; } というのがありますが、 質問(1) switch文には故意にbreakを書かないのちょっと別として、 return は、breakを、省略できるのか、それともこれらは、等価なのか、 それとも、やはり、returnでもbreakを書くのがいいのか、教えてください。 質問(2) また、通常では、defaultでも、break が必要だとおもいますが、 省略?されているのも結構ありますが、breakがあるのが正解ですか? それとも、defaultでbreakはもともと必要ないのですか? これも教えてください。 どうか、よろしくお願いします。

    • 締切済み
    • PHP
  • javaのswingについて質問です。

    1桁の演算をする簡単な電卓を書いてみたのですが。。。分からない所だけ少し抜粋しました。見て下さい。 class SampleKeyListener extends KeyAdapter { public void keyPressed(KeyEvent e) { if(flag==false){    //ここで演算子の処理を.....1 char key=e.getKeyChar(); switch(key){ case '-': lb1.setText("引き算をします。数字を入力して下さい。");lb2.setText(str);lb3.setText("-"); now="minus";break; case '+': lb1.setText("足し算をします。数字を入力して下さい。");lb2.setText(str);lb3.setText("+"); now="plus";break; case '*': lb1.setText("かけ算をします。数字を入力して下さい。");lb2.setText(str);lb3.setText("*"); now="kakeru";break; case '%': lb1.setText("割り算をします。数字を入力して下さい。");lb2.setText(str);lb3.setText("%"); now="waru";break; } } if(flag==true){   //ここから数字の処理を(1桁のみ)....2 int k=e.getKeyCode(); switch(k){ case KeyEvent.VK_0: str="0";if(now=="plus"){ sum=sum+0; } else if(now=="minus"){ sum=sum-0; } else if(now=="kakeru"){ sum=sum*0; } else if(now=="waru"){ sum=sum/0; } else{ sum=0; } flag=false;break; //以下9まで同じ処理をします。(数値だけ変更しますが) } b2.setText(str); lb3.setText(Integer.toString(sum)); } .... ここで数値と演算しを交互に入力させて、どちらかを続けて入力するとエラーをはくしくみにしたいのですが、最初の考えはint count=0;などをつくりメソッドが呼び出された回数を数え上のメモの1、2、を切り替えてswitch文の条件にないものを入力したときはエラーをという考えでした。しかしそうしてしまうと演算子のほうで乗算記号と8が自分のPCでは同じキー(乗算の演算子のときはshiftキーを押します)なのですが、乗算のときに乗算とともに8も反応してしまい結果がおかしくなるのと演算子と数字を交互に入力させる制限もうまくいきませんでした。そこで上の様にbooleanでフラグを作true,falseで分岐させると乗算演算子のときに8は反応しなくなったのですが(入力の制限もできています)みてお分かりになるように、数字の入力→演算子の入力でとまってしまいます。flagをfalseからtrueに変えるのをそれぞれの演算子の方のswitch文にいれるとこんどはまた8が反応してしまうのと入力制限ができないです。どこにflagの切り替えをまたはどのようにしたらうまくできるでしょうか

  • importファイルのdownLoad方法

    下記のjavaプログラムをsite(URL参照)からdownLoadしました。 ここで、importするファイルとしまして、ch.ntb.usb.Device、ch.ntb.usb.USB、 ch.ntb.usb.USBExceptionがありますが、これらのファイルの入手方法に 付きまして、コメント頂けますと大変助かります。 (javaのlibに、既に格納されているかも知れませんが) 初心者の質問であり、また基本的な質問ですが、宜しくお願いします。 http://libusbjava.sourceforge.net/wp/res/demos/ReadWrite.java.html ================================== /* * Java libusb wrapper * Copyright (c) 2005-2006 Andreas Schläpfer <spandi at users.sourceforge.net> * http://libusbjava.sourceforge.net * This library is covered by the LGPL, read LGPL.txt for details. */ package ch.ntb.usb.demo; import ch.ntb.usb.Device; <--これらの入手方法がわかりません。 import ch.ntb.usb.USB; <--- import ch.ntb.usb.USBException; <-- /** * Demo class to demonstrate simple read and write operations to an USB device.<br> * * @author schlaepfer * */ public class ReadWrite { 以下、省略 =================================== 以上

    • ベストアンサー
    • Java

専門家に質問してみよう