• ベストアンサー

乗算が配列として認識されてしまう

a[k1][l1] = 500 * (pow((xl/xn),(1.0/3.0))-pow((yl/yn),(1.0/3.0))); としたとき、 右辺は計算式の意味でかいているものなのですが、 error C2109: 配列または、ポインタでない変数に添字が使われました。 というエラーがでてきます. これはどうやって解消すればいいのでしょうか. よろしくお願いいたします.

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4856/10272)
回答No.1

aの宣言方法が間違ってます。 右辺は関係ありません。

mitti0157
質問者

お礼

ほんとでした! おはずかしいです。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ルンゲクッタ法の解き方(初期条件)

    二階の常微分方程式をプログラムをつかって数値的に解きたいのですが 初期条件をいれるとk1の分母が0になってしまうばあい,どのように計算すれば良いかわかりません.どのように通常解くのかおしえていただけませんか? 具体例として y''=((y')^2+1)/sin(arctan(y')) 初期条件 y(0)=C1(定数) y'(0)=0 k1=0.5*h*f(xn,yn,yn') k2=0.5*h*f(xn+0.5h,yn+K,yn'+k1) (ここでK=0.5h(yn'+0.5k1)) k3=0.5*h*f(xn+0.5h,yn+K,yn'+k2) k4=0.5*h*f(xn+h,yn+L,yn'+2k3)  (ここでL=h(yn'+k3) k1の値を計算すると分母が0になるので計算できません. どうぞ宜しくお願いします. ちなみにy'(0)=0.001など小さい値をいれてみても途中の計算で発散してしまいます.

  • 「配列名はポインタ」という表現は間違っているのでは?

    よくネット上で、「配列名はポインタ」というような表現が出てきますが、 「配列名はポインタになっているのである。 http://www.wakhok.ac.jp/~kanayama/C/99/node111.html」 このような表現は、間違っているのではないでしょうか? C言語を作った本人によるK&Rのp.121には、次のように書かれています。 配列名とポインタの間には、心に留めておかなければならない違いが一つある。 ポインタは変数であり、したがってpa=aやpa++は意味のある演算である。   ←(1) しかし配列名は変数ではない。したがって、a=paやa++のような構文は正しくない。 ←(2) (1)より、 ポインタは、変数である ので、この対偶をとると、 変数でないものは、ポインタではない  ←(3) となります。 (2)より、 配列名は、変数ではない  ←(4) となるので、 (3)と(4)から、 配列名は、ポインタではない ←(5) となります。 そうすると、「配列名はポインタ」というような表現は間違っていることになり、誤解の元になるので、改めるべきではないかと思うのですが。

  • 確率変数Xnで定義されるYnはやはり確率変数でしょうか?

    確率変数Xnで定義されるYnはやはり確率変数でしょうか? お手数を掛けてすみませんが、教えてください。 以下が問題です、最後の部分で確率変数の定義が引っ掛かります。 「独立な確率変数の列{Xn}において、Xnの平均値をμ、分散をσ^2,(n=1,2,…) とした場合、 Yn = 1/n ?[k=1 n]Xk-μが恒等的に0に確率収束すると示せ」 1/n?[k=1 n]Xk の平均値、E(1/n ?[k=1 n]Xk)=μ 1/n?[k=1 n]Xk の分散が、σ^2(1/n ?[k=1 n]Xk)=σ^2/n となりますので、1/n?[k=1 n]Xkに関するチェビシェフの不等式に代入しますと、 p(|1/n ?[k=1 n]Xk-μ|<ε)>=1-(1/ε・σ^2/n) つまり、p(|Yn|<ε)>=1-(1/ε・σ^2/n) ※0<ε lim[n→∞]p(|Yn|<ε)>=1-(1/ε・σ^2/n) lim[n→∞]p(|Yn|<ε)>=1 確率の性質より lim[n→∞]p(|Yn|<ε)=1 ∴Ynは常に0以下であって、”Ynが確率変数であるならば”、恒等的に0に確率収束すると 示せるのですが… どうなのでしょう?

  • verilogで配列の任意の8bitを取り出す方法

    配列の中の任意の8bitを取り出すのに、  hoge[fuga:fuga + 8] と書きましたが、エラーになってしまいました。 配列の添え字には、変数は記述できないのでしょうか? とすると、他にどの様な書き方があるのでしょうか? 教えてください。よろしくお願いします。 (verilog初心者です)

  • PL/SQLでの配列についてetc

    PL/SQLについて、何点か質問があります。 どれかひとつでも構わないので、皆さんのお知恵をお貸しください。 (1)ある配列変数に格納されている要素を全てDBMS_OUTPUT.PUT_LINE();で表示することってできますか? (PHPのecho var_dump();のような感じで) (2)ある配列変数に使用されている添え字(もしくは添え字の数)を取得することってできますか? (3)ORA-01403エラーはカーソルのデータが存在しない場合に、発生するケースはありますか? よろしくおねがいします。

  • 三次元配列の動的メモリの確保?

    const int SLICE=2; const int SIZE=256; signed short int *matrix=new signed short int[SLICE][SIZE][SIZE]; for(int i=0; i<SLICE; i++){ for(int j=0; j<SIZE; j++){ for(int k=0; k<SIZE; k++){ fin.read((char*) &matrix[SLICE][SIZE][SIZE],sizeof(signed short int)); } } } delete[] data; 三次元データを読み込むために、三次元配列を使って読み込もうとしたのですが、上手く読み込めません。 三行目の所で、error C2440: '初期化中' : 'short (*)[256][256]' から 'short *' に変換できません。 七行目の所で、error C2109: 配列または、ポインタでない変数に添字が使われました。 というエラーがでます。動的メモリの確保の仕方がまずいのでしょうか? どなたか教えて頂けますでしょうか?よろしくお願いします。

  • ルンゲクッタ法の二階微分方程式(Fortran)

    数値計算の演習問題で以下の二階微分方程式をルンゲ・クッタで解けという問題があります。 -y"+x^2・y=e・y(eは定数、”・”は単なる掛け算) y(0)=1, y'(0)=0, 0<=x<=2までを計算せよ。 これは y’=z・・・(1)   z'=(x^2-e)y・・・(2) この2つの連立方程式を解けばよいところまではわかります。 まず(2)を解くときにルンゲ・クッタの場合 (k1+2k2+2k3+k4)/6の項(←公式の右辺第二項)のk(1~4)を求めなければいけません。 質問はkの求め方です。 本にはy'=f(x,y,z) , z'=g(x,y,z)とおけば (2)の場合だと例えばk1は k1=g(xn,yn,zn)dxで計算する。と書いてあります しかしz'=(x^2-e)y(←zが入ってない) なので、計算すると k1=g(xn,yn)dxとなってしまうんですがどうなんでしょう? おそらくどこかで勘違いしてると思うんです。 長い質問になってしまいましたがどうかご教授のほどよろしくお願いします。

  • C言語、配列とポインタとアスタリスクの関係

    ちょっと行き詰まっています。 苦しんで覚えるCで勉強しているのですが、まさに苦しんでいます。 http://9cguide.appspot.com/19-01.html #include <stdio.h> #include <stdlib.h> int main() { int i; int *heap; heap = (int *)malloc(sizeof(int) * 10); if (heap == NULL) exit(0); for (i = 0;i < 10;i++) { heap[i] = i; } printf("%d\n",heap[5]); free(heap); return 0; } int *heap; ここで int ポインタを宣言しています。 heap = (int *)malloc(sizeof(int) * 10); ここでヒープを確保しています。(int *) のキャストも sizeof(int) も理解できました。 for (i = 0;i < 10;i++) { heap[i] = i; } まず1点目の疑問はここです。 変数 heap は「ポインタ変数」です。それでいて配列です。 ポインタ変数は、プログラムの文中で通常の変数として使うときには「*heap」のように先頭にアスタリスクを付けなければならかなったと記憶しています。 アスタリスクなしの「heap」はアドレス格納用の変数ではないでしょうか。 printf("%d\n",heap[5]); そして、その疑問をよそに、この命令が成り立っているようです。 画面上に出される結果は「5」であり、変数「heap」がただの配列として機能しているように見えます。 この printf 次のように書き換えると、エラーが出てコンパイルできませんでした。 書き換え実験1 printf("%p\n",*heap[5]); アスタリスクを付けて、通常の変数として扱い、受ける方も「%d」から「%p」に書き換えてアドレスを表示してみようと思ったのですが、 「「pointer」を付け忘れています。」というエラーが表示されました。 書き換え実験2 printf("%p\n",heap[5]); 受ける方を「%d」からポインタを受ける「%p」にしましたが、変数の方はアスタリスクなしです。 すると、結果はアドレス「00000005」が返ってきました。 (変数にアスタがないのになぜ?) 書き換え実験3 printf("%d\n",*heap[5]); これはもうめちゃくちゃですが、一応やってみました。コンパイルエラーで、 「「pointer」を付け忘れています。」というエラーが表示されました。 つまり、こういうことです。 0:printf("%d\n",heap[5]); //5 1:printf("%p\n",*heap[5]); //エラー 2:printf("%p\n",heap[5]); //00000005 3:printf("%d\n",*heap[5]);//エラー この結果から推測するに、アスタリスクはそもそも付けるとエラーになり、アドレスを表すか、そのアドレスに格納された値を表すかを切り替えるには、単にその変数を受ける「%d」や「%p」を変えるだけ、ということになるのだと思います。 mallocで返ってくるのは、ポインタ変数(の配列)だと思うので、変数のモードを切り替えるためにアスタリスクが必要なのだと思っていましたが、どこかで重大な勘違いをしているようです。 この件について、どなたか教えていただけないでしょうか。

  • 赤球がr個、白球がm-r個入った箱がある。ただし、m、rが自然数である

    赤球がr個、白球がm-r個入った箱がある。ただし、m、rが自然数である。箱から球を一個取り出して色を確認してから箱に戻す試行が独立繰り返す。はじめて 赤球が出るまでの試行の回数をX1とする。以降、n>=2として(n-1)回赤球が出た後に再び赤球が出るまでの試行回数はXnとする。 (1) X1=kと確率p(k)を求め よ  X1の特性関数を計算し、平均 分散を求めよ。 (2) Yn=X1+X2+。。。+Xnとするとき、Yn=kとなる確率fn(k)とその特性関数を求めよ  難しいですね~~~

  • 配列ポインタの関数中のメモリ領域

    C初心者です。 関数中で配列ポインタを宣言する場合についての質問です。 たとえばDouble型の2次元のローカルな配列ポインタを用いる場合、 その配列要素数が100である場合は void 関数名(引数1,引数2,...){ int i; double *a[2]; for(i=0;i<2;i++){ a[i] = (double*)malloc(100*sizeof(double)); } for(i=0;i<2;i++){ free(a[i]); } } またこの値を引数1とする場合、引数1をoutとすると void 関数名(double *out,....) とし、 for(i=0;i<2;i++){ out[i] = a[i]; } とすればよいのでしょうか? もしこれがあっているとすると、つぎのような現象で困っています。 配列要素数を50000個ぐらいとし、複数の関数で、同様に mallocを用いて、配列ポインタのローカルでメモリ領域を確保しようとした場合、コンパイルは成功するのですが、その後実行すると、エラーが発生したというメッセージとともにコマンドウィンドが強制終了します。 コンパイラはVisual C++ EXpress Edition 2008です。 データサイズを小さくすると、エラーは起きません。 malloc関数で確保するメモリサイズは、関数の入力引数で定義された変数を用いて計算しており、データサイズに応じて変更されます。 よろしくお願いいたします。