forループで計算しているときに、配列にどんどん値を格納しているとします。
で、計算結果がNaNになったときは格納しないようにしたいのです。
困っています。お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

Double、Floatなら isNaN() や isInfinite() メソッドを使えばよいのでは。

。。ってそんな素直な話では無いですか?

boolean Double.isNaN(d)
なので

double d;

//dを計算

if(Double.isNaN(d)){
 //例外処理
}else{
 //配列に格納
}

参考URL:http://java.sun.com/products/jdk/1.2/ja/docs/ja/ …
    • good
    • 1
この回答へのお礼

お礼遅れました.うまく実行できました.ありがとうございます。

お礼日時:2001/12/19 15:09

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCなどで要素の数が固定できない配列はどうやって実現しますか?

配列について質問します。

BASIC系では配列は動的配列で要素の数が自由に変えられます。
ですが、C等では宣言時に配列の要素の数を決めておかねばならなかったと思います。
もし、C等で要素の数がわからないけど、配列を使いたい場合、どうすればいいのでしょうか?
どのように実現するのでしょうか?
配列と同じ使い勝手なら配列でなくともかまいません。

今はVBAでプログラムを組んでいるので、動的配列を使えばすむのですが、いずれ他の言語に移植したいので、できるだけ使わないようにしたいと思っています。

よろしくお願いいたします。

Aベストアンサー

malloc等のメモリ確保はNo.1さんの回答のリンクが詳しいですね。
C言語でプログラムを組む場合は、大抵はこれらメモリ操作関数のお世話になります。

これに加えて、C++やJavaのライブラリでは、動的配列クラスというものが使えます。
C++だとvectorやlist、JavaだとVectorやArrayListあたりですね。
他にも、言語や環境に依存したライブラリ、フレームワークで
様々な動的配列の機構が用意されていたりします。

簡単にまとめると、
・malloc、free、realloc等を使う方法 → ReDim
・動的配列クラス → Collection
のようなものだと考えてください。

QJava:配列に配列を格納する方法

Javaの配列について質問です。
配列の各要素に別の配列を格納するような配列を作成したいのですが、
上手く行かなくて困っています。
float型の配列circle
   {x座標,y座標,x方向の速さ,y方向の速さ}
を要素に持つcirclesという配列を作りたいと思っています。

例えば
circles[0]には{0,0,10,10}
circles[1]には{3,3,10,10}

circleは1つ1つの円のパラメータ、
circlesにはその円をそれぞれ格納したいと思っています。
下記の様に定義しようとしたのですが、circleが型に解決出来ませんと
エラーが出てしまいます。
どうすれば良いのか解らず、困っています。
どなたか正しい書き方を教えて下さい。
宜しくお願いいたします。
-----------------------------------------------------------
//float型の要素を持つ配列circle
//{x座標,y座標,x方向の速さ,y方向の速さ}
float[] circle;

//各球のオブジェクトを入れておく為の配列circles
//各要素はcircle型
circle circles[];
circles = new circle[10];

//circlesの各要素に各々newしたcircle配列を入れてやる。
circles[0] = new circle[4];
circles[1] = new circle[4];

Javaの配列について質問です。
配列の各要素に別の配列を格納するような配列を作成したいのですが、
上手く行かなくて困っています。
float型の配列circle
   {x座標,y座標,x方向の速さ,y方向の速さ}
を要素に持つcirclesという配列を作りたいと思っています。

例えば
circles[0]には{0,0,10,10}
circles[1]には{3,3,10,10}

circleは1つ1つの円のパラメータ、
circlesにはその円をそれぞれ格納したいと思っています。
下記の様に定義しようとしたのですが、circleが型に解決出来ませんと
エラーが出てしま...続きを読む

Aベストアンサー

配列の配列ならこんな感じ。
//--------------------------------------
class Q7261738a {
public static void main(String[] args) {
float[][] circle = {{0, 0, 10, 10}, {3, 3, 20, 20}};
for (int i = 0; i < circle.length; i++) {
for (int j = 0; j < circle[i].length; j++) {
System.out.print(" " + circle[i][j]);
}
System.out.println();
}
}
}
//--------------------------------------

オブジェクトの配列ならこんな感じ。
//--------------------------------------
class Q7261738b {
public static void main(String[] args) {
Circle[] circles = new Circle[2];
circles[0] = new Circle(0, 0, 10, 10);
circles[1] = new Circle(3, 3, 20, 20);
for (int i = 0; i < circles.length; i++) {
Circle c = circles[i];
System.out.println(c.x + " " + c.y + " " + c.xv + " " + c.yv);
}
}
}
class Circle {
float x, y, xv, yv;
Circle(float x, float y, float xv, float yv) {
this.x = x;
this.y = y;
this.xv = xv;
this.yv = yv;
}
}
//--------------------------------------

配列の配列ならこんな感じ。
//--------------------------------------
class Q7261738a {
public static void main(String[] args) {
float[][] circle = {{0, 0, 10, 10}, {3, 3, 20, 20}};
for (int i = 0; i < circle.length; i++) {
for (int j = 0; j < circle[i].length; j++) {
System.out.print(" " + circle[i][j]);
}
System.out.println();
}
}
}
//--------------------------------------

オブジェクトの配列ならこんな感じ。
//--------------------------------------
class Q7261738b {
public...続きを読む

QC#かJavaで、配列の中から別の配列を探し出す

お世話になります。

C#かJava(CやC++は入れない)で、特定の配列の中に、該当する
配列があるかどうかを調べるメソッドがあれば、教えてください。

例えば…

int[] a={0,0,0,1,2,3,4,5,6,7};
int[] b={3,4,5};

ならば、『5』が返ってくるなどです。

力技では、aの配列を順にみていき、bの一番目と同じなら、
お互いの配列の次の要素を比較…などとやっていくのですが、
これらの方法を、標準のメソッドがあれば…と思い、
質問させていただきました。

以上、よろしくお願いいたします。

Aベストアンサー

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の先頭の添字だけ欲しい場合
listA.indexOf(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の最後の添字だけ欲しい場合
listA.lastIndexOf(b[index]);

最初に見つかる添字だけ欲しいなら標準ライブラリで取得できますが、
全添字が欲しいとなると途端に泥臭くなります。

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオ...続きを読む

QJavascriptでforループの中にsetTimeoutを入れたときの引数の保存のしかたは?

Javascriptでテニスゲームを作っています。
ボールがマウスカーソル(ラケット)に当たると跳ね返るやつです。


マウスカーソル(ラケット)とボール(複数ある。tn_MaxBalls - 1 個。)が当たってから 500ミリ秒の間は、その当たった i 番目のボールは 接触判定をなくしたいので、
当たったとき hantei[i]=false;にしてしまって、
500ミリ秒後に 関数 hantei_relief() によって
hantei[i]=true;にしようとしました。

しかし、このやり方でコードを実行すると、
あるボールAに当たって0.5秒以内に他のボールBに当たると、
iPlus == ボールBのナンバー  となってしまうので、ボールAは
hantei[iPlus]=true に戻る機会を永久に失ってしまいます。
(ずっと hantei[Aのナンバー]==false のままです。)


他のボールに当たったときに全ボールの hantei[i]=true にしてしまうのは、手軽な解決策ですが、結局500ミリ秒以内に ボールAに2回当たる場合がなくせないので、そのやり方は避けたいです。

どうすれば 500ミリ秒の間 iPlusの値を複数保持できるのでしょうか?


コード(一部)は下記のようなもので、tn_main()が 常時 繰り返し処理されています。


function tn_main(){

for(var i=0;i<tn_MaxBalls;i++)
{
if(hantei[i]==true)
{
   if((-tn_by[i]+tn_ry-2<5)&&(-tn_by[i]+tn_ry-2>-5)&&(Math.abs(tn_bx[i]-tn_rx-8)<10)&&(hantei[i]==true))
   {
    // ↑ボールとラケットの接触判定
   hantei[i] = false;
   iPlus=i;
   setTimeout("hantei_relief(iPlus)", 500); //500ms後に実行
   }
}
}
tnTimeId=setTimeout("tn_main()",tn_interval);// 割込処理

}//Main終了

function hantei_relief(){ hantei[iPlus]=true;}




一案として、iPlus = i の代わりに

if (iPlus_A_dash == false){
iPlus_A = i ; iPlus_A_dash = true;
}

//既にiPlus_Aが使われている場合
else if (iPlus_B_dash == false){
iPlus_B = i ; iPlus_B_dash = true;
}

hantei_relief_A(){hantei[iPlus_A]=true; iPlus_A_dash =false;}


と、既に使われている場合には別の (iPlus_B) を使うというのもやってみて、
これならうまくいったのですが、
できれば配列を使うやり方を知りたいので お願いします(^^;)

Javascriptでテニスゲームを作っています。
ボールがマウスカーソル(ラケット)に当たると跳ね返るやつです。


マウスカーソル(ラケット)とボール(複数ある。tn_MaxBalls - 1 個。)が当たってから 500ミリ秒の間は、その当たった i 番目のボールは 接触判定をなくしたいので、
当たったとき hantei[i]=false;にしてしまって、
500ミリ秒後に 関数 hantei_relief() によって
hantei[i]=true;にしようとしました。

しかし、このやり方でコードを実行すると、
あるボールAに当たって0.5秒以内に他の...続きを読む

Aベストアンサー

ANo2~5です。
ひとまず無事に動作したようなので、あわてて書いた3~5は無いものにしてください(汗)


>クォーテーションの有無で 何が違うのでしょうか?
setTimeout()には概ね2種類の書式があります。
 https://developer.mozilla.org/ja/docs/Web/API/Window/setTimeout

ご質問文でご提示のクォーテーションで囲う書式は、第一引数に文字列を渡す書式で、実行する時に文字列がスクリプトとして評価されます。(実は非推奨です)
それなので、変数の値なども実行時に取られている値になります。
ということは、500ms経過後のインデックス(iやiPlus)の値が採用されることになるので、その結果、ご質問のような状況が生まれていたことになるかと。

ANo2で提示したものは
 setTimeout(func, delay)
形式の書式で、指定時間経過後にfunc()が実行されるという書式ですが、変数の参照は実行時に行われるので、そのまま関数内でiやiPlusを参照すると同じことが起こってしまい、実は、解決にはなりません。(書式を変えただけ)

ANo2は上記の書式ではありますが、第一引数が hantei_relief ではなく、hantei_relief(i)となっているところがミソで、setTimeoutの構文解釈時に hantei_relief(i)が評価されます。(この時点のiの値は使用して欲しい値をまだ持っていることはわかりますよね)
そして、hantei_relief(i)を実行して返される匿名関数 function(){ hantei[i] = true; } が500ms後に実行すべき関数として保持されることになります。

えっ、でも結局、同じことでは?・・・と思われるかも知れません。
(変数iを重複して使ってしまったので、分かりにくくなってしまっていて申し訳ない)
実はこちらのiは、hantei_relief(i)を実行した際にすでに評価しているので、関数hantei_relief内のローカル変数になっていて、匿名関数を実行する際にも実行した時の値を保持しているのです。
 function hantei_relief(jj){
  return function(){ hantei[jj] = true; }
 }
と置き換えて考えていただいた方が、多少は理解しやすいかもしれません。
main側でiやiPlusの値を変えても、匿名関数で参照するi(あるいはjj)は別の変数なので影響をうけないのです。

このような仕組みを内包(クロージャ)というらしいですが、私もたいして理解しているわけではないので、正しい説明ができないのと、誤解を与えてしまってはいけないので…
以下あたりをとっかかりに調べてみてください。
(javascriptの場合は、厳密な意味ではクロージャではないらしいですが…)
 http://www.atmarkit.co.jp/ait/articles/0708/21/news116_4.html

とりあえずなんとかなったようなので、良かったですね。

ANo2~5です。
ひとまず無事に動作したようなので、あわてて書いた3~5は無いものにしてください(汗)


>クォーテーションの有無で 何が違うのでしょうか?
setTimeout()には概ね2種類の書式があります。
 https://developer.mozilla.org/ja/docs/Web/API/Window/setTimeout

ご質問文でご提示のクォーテーションで囲う書式は、第一引数に文字列を渡す書式で、実行する時に文字列がスクリプトとして評価されます。(実は非推奨です)
それなので、変数の値なども実行時に取られている値になります。
というこ...続きを読む

QC言語の2次元配列 容量が大きすぎる場合の対処方法

私はC言語をもちいて2次元配列を作ろうとしています。

しかし、配列数が double c[10000][10000];
と大きいものにすると、エラーになってしまいます。

もちろん小さい double c[10][10];
のような配列では問題ありません。

malloc関数とかも調べたのですがなかなかいい文献が見つからずに
困っています。
どうかいいご意見があればよろしくお願いします。

Aベストアンサー

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fread(&c, 1,8, fp);
 return c;
}

void write_c(FILE *fp, double *c, int x, int y) {
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fwrite(c, 1,8, fp);
}

int main(void)
{
 FILE *fp;
 double c,s;
 int x,y;
 int a[10000],b[10000];
 
 fp = fopen("c.dat","w+b");// double c[10000][10000]; の意味
 
 for(x=0; x<10000; x++) {
  for(y=0; y<10000; y++) {
   c=a[x]*b[y];
   write_c(fp, &c, x,y);// c[x][y]=a[x]*b[y]; の意味
  }
 }
 
 for(x=0; x<10000; x++) {
  s=0;
  for(y=0; y<10000; y++) {
   s += read_c(fp, x,y);// s += c[x][y]; の意味
  }
  b[x] = s / 10000;
 }
 
 fclose(fp);
 return 0;
}

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);...続きを読む

QJavaScriptの計算のNaNの判定について…

いろいろなアドバイスを参考に以下のようなプログラムを作り、値が正の時はちゃんと計算されるのですが負の時はNaNと判定されてしまいます。どうしたら負の場合でもちゃんと計算されますか?いろいろ調べたのですが見つかりませんでした…。よろしくお願いします。

<html>
<body>

<script type="text/javascript">
var rslt1 = 0;
var rslt2 = 0;
var rslt3 = 0;
function hoge1(){
var a=document.getElementById('a').value;
var b=document.getElementById('b').value;
var rslt;
if (a==1 && b==1) { rslt1=-100;
} else {
if (a==1 && b==2) { rslt1=-90;
} else {
if (a==2 && b==1) { rslt1=-80;
} else {
rslt1=-70;
}}}
document.getElementById('txt1').value=rslt1;
sum1();
}

function hoge2(){
var a=document.getElementById('a').value;
var c=document.getElementById('c').value;
var rslt;
if (a==1 && c==1) { rslt2=-95;
} else {
if (a==1 && c==2) { rslt2=-85;
} else {
if (a==2 && c==1) { rslt2=-75;
} else {
rslt2=-65;
}}}
document.getElementById('txt2').value=rslt2;
sum1();
sum2();
}

function hoge3(){
var a=document.getElementById('a').value;
var d=document.getElementById('d').value;
var rslt;
if (a==1 && d==1) { rslt3=-60;
} else {
if (a==1 && d==2) { rslt3=-50;
} else {
if (a==2 && d==1) { rslt3=-40;
} else {
rslt3=-30;
}}}
document.getElementById('txt3').value=rslt3;
sum2();
}

function sum1()
{
document.getElementById('txt4').value=rslt1 + rslt2;
}
function sum2()
{
document.getElementById('txt5').value=rslt2 + rslt3;
}
function sum3()
{
document.getElementById('txt6').value=((document.getElementById('txt4').value + rslt2 + document.getElementById('txt5').value * 2) / 4);
}
</script>

<select id="a" onChange="hoge1()">
<option value="1">1<option value="2">2
</select>  
<select id="b" onChange="hoge1()">
<option value="1">1<option value="2">2
</select>  
<select id="c" onChange="hoge2()">
<option value="1">1<option value="2">2
</select>
<select id="d" onChange="hoge3()">
<option value="1">1<option value="2">2
</select><p>
<input type="text" id="txt1" value=""><p>
<input type="text" id="txt2" value=""><p>
<input type="text" id="txt3" value=""><p>
<input type="text" id="txt4" value=""><p>
<input type="text" id="txt5" value=""><p>
<input type="text" id="txt6" value=""><p>
</body>
</html>

いろいろなアドバイスを参考に以下のようなプログラムを作り、値が正の時はちゃんと計算されるのですが負の時はNaNと判定されてしまいます。どうしたら負の場合でもちゃんと計算されますか?いろいろ調べたのですが見つかりませんでした…。よろしくお願いします。

<html>
<body>

<script type="text/javascript">
var rslt1 = 0;
var rslt2 = 0;
var rslt3 = 0;
function hoge1(){
var a=document.getElementById('a').value;
var b=document.getElementById('b').value;
var rslt;
if (a==1 && b=...続きを読む

Aベストアンサー

inputのvalueを計算で使うときは型を確定するためにも
parseFloat()するなど対応が有効かもしれません

Qc言語の配列の先頭アドレスが偶数アドレスとなる理由について

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
printf("%p\n",&nc);
printf("%p\n",&nd);


}

実行結果
0xbffff8cf
0xbffff8ce
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8b0 0xbffff8b1 0xbffff8b2 ← S配列
0xbffff8af
0xbffff8ae

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
pr...続きを読む

Aベストアンサー

メモリの配置はコンパイラとコンパイルオプションに依存します。
デフォルトだと、32ビットのメモリ処理単位=4バイトとか8バイトが多いかと。
理由は32ビットCPUが4バイト単位でメモリにアクセスするのでアクセス効率を優先したためです。

例えば、
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8ce 0xbffff8cf 0xbffff8d0 ← S配列
だとしたら、S配列の内容全てを参照するためにCPUは0xbffff8ccと0xbffff8d0の合計8バイトにアクセスする必要が出てきます。無駄ですよね。

Qjavascriptで結果表示テキストフィールドにInfinityやNaNを表示させない方法はありますか?

テキストフィールドに合計ともう1つの合計を
わるのですが、合計/合計とした場合、
最初の合計が0/3となっていると、Infinityと表示し、
空白/3となると、NaNを表示します。
表示させない方法はありますか?
教えて下さい。

Aベストアンサー

 isNaN() という関数があるので、それで不正な数値かどうかチェックできます。

 また、数値オブジェクトは Number.POSITIVE_INFINITY と Number.NEGATIVE_INFINITY という2つのシステム変数を使ってチェックできます。

 つまり、たとえばテキストフィールドの名前が TEST1 だった場合、

 obj = document.all;
 num = obj.TEST1.value-0;
 if ( isNaN(num) ||
    num = Number.POSITIVE_INFINITY ||
    num = Number.NEGATIVE_INFINITY ) ) obj.TEST1.value="";

 というプログラムによって、不正な数値を "" にすることができます。

QC言語でunsigned char配列を連結する方法ってありますか?

C言語でunsigned char配列を連結する方法ってありますか?

例えば
unsigned char test[]={0x00,0x02,0x03};
unsigned char test2[]={0x05,0x06};
という配列があったとして

test[]という配列のあとにtest2の配列を追加することは可能でしょうか?
{0x00,0x02,0x03,0x05,0x06}という配列になればOKです。

よろしくお願いします。

Aベストアンサー

testの領域は3バイトのため、それ以上の配列を追加することは出来ません。
もし、testのサイズが5バイト以上あれば、test2を追加することは、できます。
その場合は、memcpy(&test[3],test2,2); とすれば、
testの4バイト目からあとに、test2の2バイトが追加されます。
新たに配列を作成して良いなら、
unsigned char test3[5];として
memcpy(test3,test,3);
memcpy(&test3[3],test2,2);
とすれば、test3はtestとtest2を連結したものとなります。

QStrutsで配列の値を取得するととき

bean writeみたいな方法で取得できないでしょうか。
iterateみたいにループさせるのではなく
直接値を取りたいのですが

Aベストアンサー

<bean:write name="hoge" property="array[i]">
こういう書き方でできます。

public class Hoge {
private String[] array;
public String[] getArray() {
return array;
}
public void setArray(String[] array) {
this.array = array;
}
}

参考URL:http://struts.apache.org/struts-doc-1.2.7/api/org/apache/struts/taglib/bean/package-summary.html#doc.Properties


人気Q&Aランキング

おすすめ情報