• ベストアンサー

コーディングが悪いというのは?

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1590132 のNo5の方のおっしゃっている意味が良く分からなくて質問します。 VB任せの変換になるので、コーディング的にはあまり良くありません。 というのは、コンパイラ(VBもコンパイラと言うのでしょうか?)に任せたプログラムはやめたほうがいいぞ と受け取りました。 実際、C言語だろうがVBだろうがコンパイルする場合にはコードがどのようにアセンブラに変換され、機械語に変換されたかしっかり確かめる必要のある人(技術がある人)は最初からアセンブラで書いたほうがいい様に思います。 その手間が嫌なのでVBを使っている人がformatとvalを使い分ける明確な理由がイマイチ良く分かりません。 実行速度の問題なのならCを使えば良いだろうし、何がそこまで違うのかも理解できません。 (宣言せずに使用するよりは)int long stringをしっかり分けて使うのがいいぞ というのと、valを使うのは良くないぞ と言うのはまったく違う意味ですよね? aをintegerで宣言してa=val(b)等と書けば自然とintegerになるのではないのですか? 結局、val()とformat()をきっちり使い分けるためにはそれぞれの関数のプログラムを理解する必要があると思うのですが、それぞれ関数の内容は公開されているのでしょうか?(簡単に調べられるのは使用方法ぐらいのような気もするのですが。)

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

  • ベストアンサー
回答No.7

No.5です。 >aをdoubleで宣言しておけばvalを使うのは曖昧じゃないと言う事でしょうか? >それでもやはりCDblを使えと言われそうな気がするのですが。 型の問題だけで言えば、Cdblは不要です。 但し、普通は、ValをやめてCdblを代わりに使用すると思います。 曖昧性はともかく、速度面からCdblの方が有利です。 Val関数は、便利そうですが、結構色々な動きをします。それを全て理解して使用するのであれば問題ないとは思いますが。 {例} Val("1,000") は 1 、Clng("1,000")は 1000 Val("123a45") は 123 、Clng("123a45")は エラー Val("123 456") は 123456 、Clng("123 456")は エラー また、val関数とは直接関係ありませんが、浮動小数点型は扱いに注意が必要です。 Val("0.3") - Val("0.2") - Val("0.1") Cdbl("0.3") - Cdbl("0.2") - Cdbl("0.1") Cdec("0.3") - Cdec("0.2") - Cdec("0.1") の結果を、他の変数に代入せずに直接出力してみて下さい。 (Val と Cdbl は同じ結果になりますが、Cdec は違う結果になります)

taunamlz
質問者

お礼

色々な動作をする事は理解できました。 そこまで理解していても使わない理由は速度が原因なんですね。 ありがとうございました。

その他の回答 (9)

  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.10

ほぼ、結論は出てると思いますが 別の観点から。 VB4かVB5か忘れましたが、「Val()関数を使うとメモリリークする」という問題がありました。 なのでVal()関数に対するアレルギーというのも(その頃から使う人なら)多少はあったと思います。 少なくとも私はそうで、Val()をVB5の頃まで全く使わないで来ました。VB4でVal()を使わなかった分、挙動が分かりづらいんですよね。#7さんが挙げておられる例を、イミディエイトウインドウで確認することなく全て分かっている人というのは少ない・・・というか、まずいらっしゃらないのではと思います。 一方、CInt()やCLng()の入力/出力は、#7さんが例で出されているように直感的で分かりやすいですし、少しでも間違ってるとエラーになるのでバグの混入を比較的防げるというメリットもあります。Val()はまずエラーになりませんので、バグに気づきにくいということになります。 もともとの質問である「001」→「1」という変換であれば、Val()を使うのは間違いではない・・・と思いますよ。 私も、ちょっとしたテストプログラムであればそうすると思います。CInt()などだとエラートラップやIsNumericなど余計なコードを書かないといけなくなったりしますし・・・ ただ、「(入力が限定されている状況であればValでも良いと)分かっていて使っている」ならVal()でいいのですが、 そうでない場合は・・・お分かりですよね(^^; それも経験のうちではありますが。

taunamlz
質問者

補足

気づきにくいような場所に使うというのは、実際のデバックの時にその実験をしない事が多いので、結局cintでもバグとして通り過ぎるんじゃないかな?と思いました。 何故VB任せと言っていたのか、その理由が解ったので今後に生かして行こうと思います

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.9

こんばんは。 #4 の私の前言を訂正させていただきます。 # CInt関数やFormat関数が、Val関数に優先するというのは、私には分りません。単に、それぞれの使い方の違いしかないと思います。 と書きながら、もう一度考え直してみました。前言を翻して申し訳ありませんが、やはり、めったにVal関数は、ちょっと使わないですね。 前の人たちにかぶることもありますが、 Val("2457")  '(1) Val(" 2 45 7") '(2) Val("24 and 57") '(3) こういう使い方は、皆無に近いですね。(2),(3) は、まず、確実性が乏しいし、そういう場面で、Valを使うということはありえません。空白値があるなら、空白値を調べます。 それから、(1)は、その必要性を感じません。私の場合、Double型で出力する場面なんて、ほとんどありません。必要ならば、桁に応じて、CLng や CIntでよいですから。Double型で使うような場合は、最初から、数値で扱いますね。テキストインポートで取り扱うにしても、Val を用いません。 あえてValを使うなら、 Val("&HFFFF") 文字列を10進に直すということなら別ですが、それさえ、あまり使いませんね。 >>関数の内容は公開されているのでしょうか? >というのは、HELPに載っているような内容ではなく、コードが公開されているのか と言うことを聞きたかったんです。 それは、公開されていないですね。(たぶん) よく使っている人にしか分らない経験値による、感覚的なものしかないと思います。

回答No.8

No.6です。再び回答させて頂きます。 > 俺のイメージではそれこそ「Val関数は型を特定しないことから変換に有効的」なイメージですので。 というお言葉のとおり、変換対象が数値、文字、日付などどんな型か分からない場合、Val関数は有効かも知れません。 ただ、普通は値に合った型の変数で受けますよね。数値型の変数に入れる場合でも、日付型の変数に入れる場合でも、IsNumericやIsDateなどの関数で値をチェックして、然るべき型の変数に格納して扱うのが無難なのです。 例えば、数値データだと思って、Val関数で変換したら、変換後の値が0だった。数値が入ってきてるからOKかと思っていたら、実は文字列のデータをVal関数で変換した結果の0だった、などということが後々発覚すると、致命的な障害になりかねません。当然、「Val関数が文字列を勝手に0に変換したんです!」などという言い訳は通じません(笑) 「型を特定しないことから変換に有効的」を逆手にとられたケースですかね。 この時、CIntなどの数値変換関数だったらエラーになりますし、IsNumeric関数で事前にチェックすれば、Falseを返してくれるでしょう。 説明が下手で、ご納得いただけないかも知れませんが、要するに個人的に障害になりえるものだという概念があるので、Val関数は使用しない方がいいと申し上げました。 No.5さん > いつも適切なご説明ありがとうございます。

taunamlz
質問者

お礼

ただ、どうしてvalが嫌われ者なのかは分かりました。 ありがとうございました。

taunamlz
質問者

補足

事態がよく解りませんが、valで0になるような事態だったら、cint、isnumericを使えばなんとなく動くような事にはなりませんが、正常な動作とは言えないような気もするのですが。どっちにしろバグになってしまうのではないのでしょうか。

回答No.6

すみません。だいぶ波紋を広げてしまいましたね。 訂正しますと、Val関数は使っても良いです。私もどうしようもなければ使用します。 しかし、#5さんのお言葉をお借りしますと、 > もし業務としてプログラミングを行うのであれば、曖昧性を排除し、VBでも実行速度を考慮する必要があります。 ということなのです。 曖昧な処理は障害の原因になりかねないし、業務においては実行速度だけの問題で、安易にVBをCにするなんてことはしません(お金の絡みもありますし)。プロジェクトに開発規約があれば、Val関数(Variant型など)の記述があると思います。 ちなみに、先の質問に対しては、「アドバイス」という回答種類で質問者にお伝えしたまでです。その方法がいけなかったのであれば、以後改めます。 皆様、お騒がせ致しました。

taunamlz
質問者

補足

本人様に来ていただけるとは思っていませんでした。 ありがとうございます。 アドバイスが良くないと言う事ではなく、なぜvalが良くないのか、あの回答を見ただけでは個人的にぜんぜん理解できなかったため、質問させていただきました。(俺のスキルが無いだけです) なので、ぜんぜん改める必要は無いと思います。 出来ればval関数の曖昧な点を教えていただけますでしょうか?俺のイメージではそれこそ「Val関数は型を特定しないことから変換に有効的」なイメージですので。

回答No.5

>数値以外を入力するとエラーを返すのはcintもですよね? cint("0a1")はエラーになりますが、val("0a1")はエラーにはならないです。 あと、val関数は、VB4.0の頃にメモリリークを起こしていたので、何となしに避ける方向にあります。 個人の趣味でコードを書くなら、VBはお手軽に記述できますので、taunamlzさんのおっしゃる通り、楽に記述すればよいと思います。 個人的には、変数宣言もなしで全然構わないと思っています。 しかし、もし業務としてプログラミングを行うのであれば、曖昧性を排除し、VBでも実行速度を考慮する必要があります。 例えば、a=val(b)なら、valの返値はdoubleなので、少なくとも、a=Cint(val(b))と記述するがあります。 (他の言語では型が異なるのでコンパイルエラーになる場合があります) 少なくとも、自分の勤務している会社の開発規約では、Val関数は使用禁止で、Format関数も基本的にはFormat$を使用する必要があります。

taunamlz
質問者

補足

>例えば、a=val(b)なら、valの返値はdoubleなので、少なくとも、a=Cint(val(b))と記述するがあります。 aをdoubleで宣言しておけばvalを使うのは曖昧じゃないと言う事でしょうか? それでもやはりCDblを使えと言われそうな気がするのですが。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 元の書き込みで、私は、「VB任せ」「コーディング的」という言葉が適切かどうかは分りませんし、その意味をよく理解できません。あえていうなら、そういうことは「経験的」ということしかないと思います。 Val関数ですと、その引数を無作為に入れれば、#3さん等が、ご指摘のように失敗することもある、というぐらいでしょうね。私の場合は、それは、Val関数に限ったことではありませんが、何度も何度も失敗して覚えただけで、私のような人間は、転ばぬ先の杖で教わったとしても、やっぱり失敗しなければ覚えられませんね。でも、CInt関数やFormat関数が、Val関数に優先するというのは、私には分りません。単に、それぞれの使い方の違いしかないと思います。 ただ、その元のごく短いご質問からみると、そういう可能性を示唆する必要性があるかどうか、なんとも言えません。質問から与えられた条件は、その条件がご質問者さんの想定内なら、そんな憂慮は関係ないことです。特定の条件の中で使われるものについて、想定外について考慮に入れるのは、とどのつまり、製作者側(ご質問者)の判断でしかありません。それ以上は、特に掲示板上では、[経験的に]無意味なんですね。 >関数の内容は公開されているのでしょうか? Help で見れば載っているはずですが……。

taunamlz
質問者

補足

つまり、エラー回避のコードを埋めたほうが良いと書きたかったのではないか?と言う事ですよね? しかし、Freelancerさんはvalが良くないと言っていますよね? 「Val関数は型を特定しないことから」ここが重要なポイントだと思うのです。おそらくエラー云々ではなく、何かあるのだと思うのですが。 >関数の内容は公開されているのでしょうか? というのは、HELPに載っているような内容ではなく、コードが公開されているのか と言うことを聞きたかったんです。 たとえその内容がCで書かれていようがVBで書かれていようが、コードが分かれば変換の具体的な方法が分かりますので、cintとformatとvalを比較し、cint,formatがどのように優れているのか分かりますから。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.3

Cintが良くて、Valが駄目とするのは理解できないです。 文字列から文字列への変換であれば、Formatを使うのもありでしょうけど、いずれにせよ > 渡すデータがどういう書式あるいは内容なのかを判断してやらないと予期しないエラーを招くことになります。 これを考慮する必要があります。

  • 0x131cc6e
  • ベストアンサー率36% (42/115)
回答No.2

#1です。念のため補足。 val()関数は全く使ってはいけない、という意味ではありませんよ。 元発言者の方も >その値がどういう性質のものなのかを考慮し と書かれています。 val()で変換しても毎回確実に同じ結果が返されるようなデータ仕様ならval()でも問題ないと思いますよ。

  • 0x131cc6e
  • ベストアンサー率36% (42/115)
回答No.1

コンパイル結果云々の話ではないですよ。 処理の結果が保証されないようなコーディングはするべきではない、という事ですね。 val()の仕様が、 「数値に変換できる部分までを数字として扱うが、%などが含まれているとエラーが発生する」 というものですので、渡すデータがどういう書式あるいは内容なのかを判断してやらないと予期しないエラーを招くことになります。 データ内容をVBの標準関数に判断させずに、自前の処理内で判断して常に同じ変換を行うようにした方がいいですよ、ということでしょう。 たとえ技術が無い人でも一定の結果が出るように処理を書かなければいけません。 なぜなら、それこそが「プログラミング」だからです。

taunamlz
質問者

補足

数値以外を入力するとエラーを返すのはcintもですよね? Freelancerさんは「valを使うことが良くない事」と言っていますよね?IsNumericを使うことで回避できる問題なのですから、なぜvalが駄目なのかが解りません。 0x131cc6eさんのおっしゃっていることだと「valだろうがcintだろうが事前にIsNumeric等を使ってエラーを回避しましょう」と言っているのだと思うのですが。 それだとvalを使うことが良くないと言う理由にはならないと思うのですが。

関連するQ&A

  • C to 68000アセンブラ

    こんにちは。 早速ですが、Cプログラムを68000アセンブラに変換できるツール・コンパイラがありましたら知っている方、教えてください。 よろしくおねがいします。

  • 8080用のクロスコンパイラは、ないでしょうか。

    8080用のクロスコンパイラは、ないでしょうか。 TK-80シミュレーターにて、プログラム開発をしたいのですが、さすがにアセンブラはきついので、Cコンパイラを探しています。 フリーのソフトで、MS-WindowsかLinuxで動作するクロスコンパイラはないでしょうか。 (8080アセンブラを出力するCコンパイラ) 以前探したときは、(確か)C言語をZ80にコンパイルして、それをさらに8080用アセンブラに変換するのを見つけましたが、うまく動きませんでした。 何か情報をもらえるとありがたいです。 よろしくお願いします。

  • vb6の桁数指定

    こんばんわ。 vb6使用で、色々探してみたのですが、わかりませんでした。 12313133→そのまま 9797879797977896→9797977896 121212→そのまま 等を10桁に変換する関数です。 If IsNumeric(val) Then val = Format(val, "##########") endif これで10桁にできないのですが、正しい方法を教えてほしいです。 同様に 111.938 を 11.9(3は四捨五入) にする方法も、##.0ではないでしょうか? よろしくお願い致します。

  • C#で文字列を数値に変換する方法

    Visual Stdio .NET 2003を使っています。 C#で文字列(数字)を数値に変換したいのですが、 VBでいうVal関数のような物はありますか?例えば、 double a; a = Val("3.14"); とすると、aに3.14が入るような関数を使いたいです。 検索したのですが、見つかりませんでした。宜しくお願いします。

  • コンパイラの作り方

    ずーっと疑問におもっていることがあります。、コンパイラを作るのにコンパイラを使うと聞いたことがあるのですが、そのコンパイラはどう作るのでしょうか?OSもC言語やアセンブラで書かれていると聞いたことがありますが、じゃあアセンブラはどうやって作るんですかね?答えられる人がいるとは思えませんが、もし、ご存知でしたら宜しくお願いします。

  • PICライタ (C言語→HEXファイル)

    今PICライタについて独学で勉強しています。 今ソフト的には秋月のPICライタおよび、MPLAB使ってます。 しかし、MPLABがC言語読み込めないため迷っています。 そこで質問なんですが (1) C言語をアセンブラ言語に変換する無料ソフトありますか? (2) (1)をあきらめたとしてアセンブラ言語で書くとして、アセンブラ言語でPICのプログラム書くための、わかりやすい本などご存知ですか? やっぱりCコンパイラを買うしかないのでしょうか??

  • ###の意味

    format関数で使われる###の意味がわからないので教えていただきたいです。 format("123456789", "###,###")は123,456,789をかえします。 これは理解できるのですが以下が理解できません。 format("123456789", "#,###")は123,456,789をかえします。 format("123456789", "###,#")は123,456,789をかえします。 もし12345678,9を返したいときどうすればよいのでしょうか? この#の意味がどういう意味なのでしょうか。 よろしくお願いします。 環境 windowsXP vb.net2003

  • C言語もしくはC++言語プログラマになれますか?

    私は30歳になったばかりです。諸事情によりずっと家にいます(母親の病気などです)。 5年ほど前JavaでWebシステムを作っていましたが、やめました。それ以降もJavaやPHP、VB.NETなどやってはいるんですが、なかなか腰を落ち着けられません。 私は本来の性格として基礎固めが大好きというか基礎がしっかりしていないと意味がないと考えてしまうタイプです。こと、プログラムに関しても、コンピュータの仕組みから理解してアセンブラやらの書物を読み、C言語を勉強したりするとコンピュータを根本から理解できて、やっと自分の役に立つという思考しかできないものです。いきなり高級言語のJavaやらC#やら.NETやらやっても、うわべだけさすってるようで、根本的な理解を得られないので(コンピュータに対する)、無駄だなあとどうしても感じてしまうのです。また、それよりも基礎からしっかり積み重ねた方が後々、新しい言語ができても理解の度合いというかどっしりと理解できるとおもうのです。 しかし、就職のことを考え、PHPやらC#やらJavaやらVB.NETやらを優先してきてどれもどっちつかずになってしまいました。当然Cなども合間をぬってやっていました。 で、私は、そのどっちつかずな状態がいやなので、CとC++に絞って勉強することにしました。で、低級コンパイラの中身やアセンブラも勉強していこうと決心しました。しかし、就職のことを考えると不安です。 あと、1年みっちり勉強するとして、CやC++の就職先はあるのでしょうか?自分としては、働ける限り年齢がいくつになってもがんばりたいとおもうのですが、なにしろ世間的にいうと全く遅い年齢です。もし、励ましになるような事もありましたら、ご回答していただければ、うれしいです。よろしくお願いします。

  • アセンブラの実行速度

    高速なオセロの終盤ソルバーを作りたいと思い、調べていると あるソルバーのソースにインラインアセンブラが使われていました。 やはり高速なプログラムを作るにはアセンブラを使うほうが高速なのでしょうか 最近のコンパイラは最適化が向上していると聞きます。 アセンブラを使うとどれくらい高速化の効果がありますか? C++はある程度わかるのですが、アセンブラはさっぱりで学ぼうか迷っています。

  • h8 モニタプログラムの改良について

    はじめまして、H8初心者です. 現在実務訓練でH8/3048Fを使用して、測定機器を作成しているところです。そこで、モニタプログラムをROMに書き込むまでできているのですが、Htermを利用してRAMに書き込むプログラムの容量が足りないということで、ROMの余っている部分に関数を書き込みRAMの要領を出来るだけ確保しようと考えています。しかし、いろいろなHPで調べているのですが初心者にはよくわからないことが多く、質問させていただきました。 一応使っているコンパイラ、アセンブラ、リンカは付属CDの秋月製のものです。いろいろと試して、ライブラリ関数を宣言してオブジェクトファイル形式にしようとしているのですが作成されたMAPファイルを見てみても関数が含まれておらず、よくわかりません。 方法としてWatoson8さんという方がその方法について解説しているホームページを参考にさせていただこうと思いましたが、その方法が深く理解できないため、足踏みしている状態です。 そのホームページの内容を秋月製のコンパイラなどを使用して作成する方法でも、その他の方法でも何か知っていることがあったら教えていただきたいです。よろしくお願いします。