• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:switch文の引数について質問します)

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

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

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

  • ベストアンサー
  • 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