for文内の計算時に出るエラーについて

このQ&Aのポイント
  • 配列に格納している値を使って計算するプログラムを作成していますが、エラーが発生しています。
  • プログラムの内容は、2次元配列に格納された値をfor文で加算するものです。
  • エラーメッセージによると、ランタイムの重大なエラーが発生していて、CLRのバグである可能性があります。
回答を見る
  • ベストアンサー

for文内の計算時に出るエラーについて

配列に格納している値を使って計算するプログラムを作成しているのですが、以下のエラーが出てプログラムを実行していくことができません。2次元配列に格納している値をfor文を回して加算するプログラムになっています。プログラム・エラーメッセージと以下に載せていますので、解決策・改善策がお分かりになる方はぜひ教えていただきたいと思います。よろしくお願い致します。 使っているソフトはVisual Studio2010(Visual C++)のWindowsFormアプリケーションです。 プログラム: for(j=1;j<=768;j++){ for(i=1;i<=10;i++){ a[i][j].num+=b[i][j].num } } エラー内容: ランタイムの重大なエラーが発生しました。エラーのアドレスは 0x690c169f、スレッド 0x19e4 です。エラー コードは 0xc0000005 です。これは CLR のバグであるか、またはユーザー コードのアンセーフまたは確認不可能な部分にバグがある可能性があります。このバグの一般的な原因には、スタックが壊れる可能性のある COM-interop または PInvoke のユーザー マーシャリング エラーが含まれています。

  • kitct
  • お礼率13% (7/53)

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

添え字の範囲が越えちゃってるんじゃないの?

kitct
質問者

お礼

回答ありがとうございました。 ご指摘の通りでした。 プログラムを上書きしながら作成していて、配列aの宣言の部分を更新していないことが原因でした。

その他の回答 (3)

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.4

「0xc0000005」で検索しましたか? メモリアクセス違反です 要は、i又はjまたはa構造体のnumの何れかに於いて、溢れが発生している

kitct
質問者

お礼

回答ありがとうございました! aで宣言している値を超えていたのが、原因でした。 プログラムを上書きしながら作成していて、宣言の値を更新していない確認ミスでした。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

配列の添え字は0から…かと思いますが…… >for(j=1;j<=768;j++){ > for(i=1;i<=10;i++){ >  a[i][j].num+=b[i][j].num > } >} i,jともに1からになっているのは想定通りですか? また、a[][]とb[][]はどのように作成されていますか? a[10][768]、b[10][768]だったら吹っ飛びますよ。 a[11][769]、b[11][769]ならOKですが。

kitct
質問者

お礼

回答ありがとうございました! 単純に1からの方がわかりやすいかと思い、0は使用しないようにしていました。 ただ、aで宣言している値を計算時に超えていたのが、原因でした。 プログラムを上書きしながら作成していて、宣言の値を更新していない確認ミスでした。

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.2

aとbの宣言はどうなってます? ちなみに、配列の添字は0始まりです。

kitct
質問者

お礼

回答ありがとうございました! aで宣言している値を超えていたのが、原因でした。 プログラムを上書きしながら作成していて、宣言の値を更新していない確認ミスでした。

関連するQ&A

  • エラーがどこかわからない

    #include<stdio.h> #include<math.h> #define NUM 100000 int main(void){ int prime[NUM+1],i,j,Limit; for(i=2;i<=NUM;i++){ prime[i]=1; } Limit=(int)sqrt(NUM); for(i=2;i<=Limit;i++){ if(prime[i]==1){ for(j=2*i;j<=NUM;j+=i){ prime[j]=0; } } } for ( i=2;i<=NUM;i++) {  if (prime[i]){    printf("%d\n",i); } } }  これは100000未満の素数の総数を求めるプログラムなんですが、実行したらエラーが出てくるんです。何度も確認しても正しいはずなんですがエラー出てきて困っています。どこが間違っているでしょうか?

  • 教えて下さい。for文内での変数宣言について

    Javaのプログラムで困っています。 for文内でfor分だけ変数を宣言したいのですが、 その際変数名に数字(ナンバリング)を付与した形にしたいと考えています。 例) String Test1 String Test2 : : 上記の様な場合、for文をどの様に作成したらいいですか? num = 5; for(int i = 0; i < num; i++){ String Test = null; } ⇒このままだと変数Testが1つしか出来ない・・・   変数の後にナンバリングしたいのですが上手くいきません。 numの数はユーザの指定で毎回変更されるため、 for文でその数だけ変数を作成したいと考えています。 どなたかご教授宜しくお願い致します。

    • ベストアンサー
    • Java
  • for文内での変数定義

    以前にC++の講義を受けた際に for(int i = 0; i < hoge ; i++){    int j;    ・    ・    ・ } のようなコードを書くと、jがhoge分だけ"生成されて しまう"のでよろしくありません。と教えられました。 しかし、最近別の方からこの部分に関しては、jをfor文の 中に定義しようが、最適化?によりfor文の外に出された バイナリが生成されると聞きました。そのため、jが 必要となる直前でjを定義しても(for文の中に定義しても) 問題ない。と教えられました。 どちらが正しいのでしょうか? 近年にC++の仕様変更があったとしたら、それに伴い 変更されたのでしょうか? また、どのようなコードが望ましいなどありましたら 教えてください。

  • CSVファイル読込みのエラーに関して??

    下にプログラムの一部を書いてます。 このプログラムでは、b[g]にあたるCSVファイルを読み、 csv_value[j4][i4]に格納しようとしています。 しかし、すべての列で1列目の値が配列に格納されてしまいました。 間違いがわからずに困っています。 もし詳しい方がいましたら教えていただけないでしょうか? どうかよろしくお願いいたします。 char b[1000][50]; long g; long i4; long j4; char str0[500000]; long line_number; g=0; fp = fopen(b[g],"r"); for(i4=0;i4<line_number;i4++){ fgets(str0,500000,fp); for (j4=0;j4<32;j4++){ csv_value[j4][i4]=atoi(strtok(str0,",")); } }

  • こんな処理は可能ですか?(動的な命名)

    以下のように、switchでnumの値を分岐させてその値ごとに tmp[j][i]に格納する変数を変えたいのですが、こういうことはもっと スマートにできないでしょうか? int num = (ランダムな数取得); for ( int j = 0; j < 100; j++ ){   for ( int i = 0; i < 100; i++ ){     switch ( num ){     case 1: tmp[j][i] = num1[j][i]; break;     case 2: tmp[j][i] = num2[j][i]; break;     case 3: tmp[j][i] = num3[j][i]; break;      ・      ・      ・     }   } } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 上のコードを int num = (ランダムな数取得); char *str = "num"; strcat( str, (char *)num ); //文字列の連結 tmp[j][i] = (*str)[j][i]; 見たいな雰囲気でスマートにできるのではないかと思ったのですが・・。 動的な関数呼び出しとか##演算子とかそういうのと組み合わせてこんなことは 実現できないでしょうか?

  • For文と配列

    下のFor文でセルに0から9999の数字を入力しようとしたのですが 「forで指定された変数は既に使用されています」というエラーがでます。 Dim i As Integer Dim Num(3) As Integer For Num(0) = 0 To 9 For Num(1) = 0 To 9 For Num(2) = 0 To 9 For Num(3) = 0 To 9 Cells(i, 1) = Num(3) + Num(2) * 10 + Num(1) * 100 + Num(0) * 1000 i = i + 1 Next Num(3) Next Num(2) Next Num(1) Next Num(0) 他には何にも書いていないマクロなので他所で使用しているとも思えないですが うまくゆきません。 続きの作業でNum()を配列として作業したいのでこの形を変えたくありません。 何がいけないのでしょう?

  • for文を簡単な処理に書き変えたい

    いま、配列を作る作業をしているのですが、for文を使うと、forをいくつ書けば良いのか分からない状態です。 作ろうとしている配列が、A[X][Y]で、Xの要素数は固定で良いのですが、Yの要素数が実験のたびに変動するためです。そして、処理したいのが、この配列の各列の値を適当な値(このfor文の前に値が決まっています)を代入することです。 例えば、for文だと、Y=3のときには for(i=0;i<○;i++){ for(j=0;j<○;j++){ for(k=0;k<○;k++){ A[line][0] = C[i];//(Cという配列のi成分) A[line][1] = B[j]; A[line][2] = E[k]; } } } のように書くような内容なのですが、Yが増えると、for文も増やさないといけません。 ここで、再帰処理のような方法をつかってうまく書きたいのですが、どう書いたら良いのか分かりません。 一般的なfor文の書き換え方みたいなことでも良いので、教えて頂けませんか?宜しくお願いします。

  • for文の実行結果について

    public class Trace2 { public static void main (String[] args) { int i; int num; num = 1; for (i = 0; i < 10; i++) { num += num; } System.out.println("iの値は" + i); System.out.println("numの値は" + num); } } 実行結果は iの値は10 numの値は1024になります。 for文をfor (i = 0; i <= 10; i++) { に変えるとiの値は11でnumの値は2048になります。 i < 10はiが10より小さいときtrue、i <= 10はiが10以下のときtrue。 10より小さいと10以下の違いが解りません。 何故、i <= 10になるとiの値は11でnumの値は2048になるのでしょう?

    • ベストアンサー
    • Java
  • for文内での関数の使用がうまくいきません。

    いつもお世話になってます。flash初心者です。 環境:flash 2004 MX, WIN XP ボタンが3つ、それぞれ a0, a1, a2~ a(n個)という名前で存在します。このボタンを押したときに変数の値を代入するためのスクリプトを作りました。 文が長くて、for文を使って、繰り返しの処理を省略したいのですが、for文内で、変数に 配列の値を代入することに失敗してしまいます。 まず、ダイナミックテキストの変数名を myhoge にする。 //各ボタン用のテキストを定義 var hoge = new Array(); hoge[0] = "0番のボタンを押したときのテキスト"; hoge[1] = "1番のボタンを押したときのテキスト"; hoge[2] = "2番のボタンを押したときのテキスト"; ↓ hoge[99] = "99番のボタンを押したときのテキスト"; for (var i:Number = 0; i <= 99; i++) { _root["a"+i].onRelease = function() { _root.myhoge = _root.hoge[i]; } } 上記で、該当ボタンをクリックしたときは、ボタンは反応するのですが、配列のところがうまくいってないみたいです。 原因がわかる方いらっしゃいましたらお願いいたします。

  • for文

    整数を読み込んで、その値を0までカウントダウンしながら表示するプログラム作りたいのですが、 while文ではできたのですが、for文ではうまくいきません。 どこが間違っているのでしょうか? OS:Windows XP C++Builder X パーソナル #include <stdio.h> int main(void) { int i; int num; printf("整数を入力してください:"); scanf("%d", &num); for(i = num; i <= 0; --i) { printf("%d", i); } return 0; } 宜しくお願いします。