• 締切済み

メモリの確保

noboru2000の回答

回答No.1

どのようなプログラムですか? ソースを書いてくれないとなんとも言えません。(全部書く必要はありませんが)

suka19809876
質問者

補足

回答有難うございます。そうですよね。すいません。見づらいプログラムですが、宜しくお願い致します。 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> #include <GL/glut.h> #define NUM_BOXES 1088 /* 箱の数 */ #define MAX_STEPS 100000 /*ラジアン*/ #define one_degree 0.0174532 /* 2pi/360 */ #define six_degrees 0.1047192 #define twelve_degrees 0.2094384 #define twenty_degrees 0.3490658 #define thirty_degrees 0.5235987 #define fourty_degrees 0.6981315 #define fourty_five_degrees 0.785398 #define fifty_degrees 0.87266444 #define ninety_degrees 1.570796 #define one_hundred_eighty_degrees 3.141592 #define pai 3.1415926535 /*物理*/ #define GRAVITY 9.8 /*重力加速度*/ #define MASSCART 10.0 /*台車の質量*/ #define MASSPOLE 0.2 /*棒の質量*/ #define TOTAL_MASS (MASSPOLE + MASSCART) #define LENGTH 1.0 /* 棒の半分の長さ */ #define POLEMASS_LENGTH (MASSPOLE * LENGTH) //#define FORCE_MAG1 10.5 /*台車に加える力*/ #define FORCE_MAG2 100.0 /*台車に加える力*/ #define TAU 0.01 /* ステップ時間 */ #define FOURTHIRDS 1.3333333333333 /*変数*/ static double shoulder = 0, q = 0,r = 0; static int RND_SEED = 3; static double ALPHA = 0.1; /* 学習率 */ static double EPSILON=0.05; /* 探査率 */ static double GAMMA = 0.99; /* 割引率 */ static double q_val[NUM_BOXES][2]; static first_time1 = 1; static first_time2 = 1; static int cur_action, prev_action,action,next_action; static int cur_state, prev_state,top_state; unsigned long success,trial; void cart_pole(int,double*,double*,double*,double*); int get_action(double,double,double,double); int top_action(double,double,double,double); int get_box(double, double, double, double); void Q_update(int,int,int,int,double); void reset_controller(void); double noise(); typedef struct Data { double x, /* カート位置 */ x_dot, /* カート速度 */ theta, /* 柱角度、ラジアン */ theta_dot; /* 柱角速度 */ }DATA; DATA data[500][MAX_STEPS];/*思考回数*/ void cart_pole(int prev_action,double *x,double *x_dot,double *theta,double *theta_dot) { double xacc,thetaacc,force,costheta,sintheta,temp; force = (prev_action > 0)? FORCE_MAG2 : -FORCE_MAG2; costheta = cos(*theta); sintheta = sin(*theta); temp = (-force - (MASSPOLE * POLEMASS_LENGTH * *theta_dot * *theta_dot * sintheta)) / TOTAL_MASS; thetaacc = (GRAVITY * sintheta + costheta * temp) / (LENGTH * (FOURTHIRDS - MASSPOLE * costheta * costheta / TOTAL_MASS)); xacc = (force + MASSPOLE * POLEMASS_LENGTH * (*theta_dot * *theta_dot * sintheta - thetaacc * costheta)) / TOTAL_MASS; /*** Update the four state variables, using Euler's method. ***/ *x += TAU * *x_dot; *x_dot += TAU * xacc; *theta += TAU * *theta_dot; *theta_dot += TAU * thetaacc; }

関連するQ&A

  • メモリ確保方法を教えてください。

    Visual Studio.NET でC言語でプログラムを組んでいるのですが、二次元配列をたくさん使用したプログラムで、コンパイルして実行しようとするとエラーが表示されてしまいます。配列の要素を少なくすると実行はされるのですが、要素数が多くなるとエラーが表示されます。 実行時にユーザの使用メモリ数が制限されているなら、その使用メモリを増やす方法があれば教えていただけませんか?よろしくお願いします。

  • 配列の操作やメモリの確保のミスについて

    プログラミング初心者です。 Visal Studio 2010を使用してC++の勉強をしています。 配列の操作やメモリの確保でエラーを起こした場合、OSや他のプログラムにもエラーを引き起こすことがあるのでしょうか? (記述・実行しているプログラムは教材に記されているただのコンソールアプリです。複雑であったり大規模なものではありません。) たとえば、mallocで配列のメモリを確保したが、その配列の要素数以上に値を書き込んだり参照したり、freeをし忘れたりした場合です。 その時、想定していないメモリ領域に値が書き込まれることで、他のプログラムが壊れたりするんじゃないかと心配です。 というのも、配列の操作やmallocを失敗したときに、パソコンの動作が不安定になるのです。(画面がちらついたり、表示がおかしくなる。) explorer.exeを再起動するだけで収まるように見えるのですが、何が起きているのか不思議です。 以上になります。長文お読みいただきありがとうございました。 よろしくお願いいたします。

  • malloc関数によるメモリの確保

    C初心者です。 malloc関数によるメモリの確保に関して教えてください。 2次元配列のサイズに対してmalloc関数の引数値をたとえば、 (double*)malloc(datasize*sizeof(double)) などとしメモリ領域を確保すると、メモリアドレスはデータのサイズ によらず一定 1234044、1234048となります。 データサイズを大きくし、datasize*sizeof(double)が16Kバイトを超えるとcmd.exeがエラーとなり落ちます。 デバックモードで実行すると 「"System.AccessViolationException"のハンドルされていない例外が不明なモジュールです。で発生しました。 追加情報:保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリがこわれていることが考えられます」 というメッセージがでます。 コンパイラはExpressEdition2008です。 この現象を回避するにはどうすべきか、なぜこのようなことが起こるのかご教授ください。 よろしくお願いいたします。

  • アドレス格納のための二次元配列のメモリ動的確保

    アドレス格納のための二次元配列のメモリ動的確保 二次元配列のためにメモリを動的確保しなければならないのですが、 その配列に格納したいものが 「DATA型のポインタ」です。(DATA型はtypedefした構造体です。) プログラム実行中にmallocで確保した、数あるDATA型の構造体の、その先頭アドレスを リストアップするための配列です。 この場合、どのような形でmallocすればよいのでしょうか? 教えていただけるとありがたいです。よろしくお願いいたします。 -- たとえば m×n のint型の配列は、 ◆ int *i; ◆ i = (int *)malloc( m * n * sizeof(int) ); となりますよね。 この要領がでやるのが一般的にわかりやすいものだとするならその方法でやりたい (後発の人が自分のソースコードを読む可能性があるため)のです。 -- 同様にm×nの「DATA型のポインタを格納するための二次元配列」を動的確保したい場合、 ◆ DATA *d; ◆ d = (DATA *)malloc( m * n * sizeof(DATA) ); この文にどのように付け加えたら良いのでしょう? もうあと一歩な気がするのですが(笑)。しかし参考書等で勉強しましたがわかりませんでした・・・。 わかる方、どなたかよろしくお願いいたしますm(_ _)m あとこれだけ通ればコンパイルが通るんです!!!!! たぶん(笑)

  • メモリ確保の謎。

    C言語のメモリの確保の所でふと疑問に思ったのですが、 malloc,calloc,realloc,memset,memcpyなどの関数を使うときって #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <malloc.h> とか書かないといけないと本にはありますが、#include <stdio.h>だけで なんのエラーにもならずに実行できてしまうのはなぜでしょうか? 実際のプログラムにはmallocとreallocしか使ってないのですが、#include <stdio.h>でできてしまいます。 でも教科書には他にも書かなきゃいけないとかいてありますが、なぜ書かなくても実行できてしまうのでしょうか?

  • VBで動的なメモリの確保

    VBでCのmallocのように動的なメモリ確保はどうやってするのでしょうか? 具体的にはstring型をn個用意したいのです。

  • 2次元配列を確保したいのですが、

    2次元配列を確保したいのですが、 size of array 'buf' is too large というエラーで確保できません。 mallocを使って確保しようとしましたが、コンパイルできましたが、 実行するとメモリ確保に失敗します。 大きな2次元配列を確保する方法を教えてください。

  • C言語 動的なメモリの確保 実行できない

    malloc関数を使いメモリを確保しそこへ"ABCD"と記憶させ、ポインタ*Cを使い確保したメモリの内容を表示するプログラムです。 ********************************************* #include <stdio.h> #include <stdlib.h> int main(void) {   int i;   char *C;   C = (char *) malloc (sizeof(char) * 5);   C = "ABCD";   for(i = 0; i < 5; i++){     if(C[i] != NULL){       printf("%s", C[i]);    ←※エラー※     }   }   free(C);   return 0; } ********************************************* 正常にコンパイルできますが実行エラーになります。VCを使いF10のデバッグテストで※のところエラーになります。なぜなのでしょうか?

  • C++ 最適なメモリ確保

    画像処理をするために実験的にC++でプログラムを書いています。 malloc関数でBMP画像の画素位置を、画像画素分確保するだけのint型配列を作成するにはどうしたらよいでしょうか。 因みに、入力画像の解像度は640x480です。 一番左下の画素を(x,y)=(0,0)として考えています。 ある条件の画素に該当する画素座標を、下のStackX,StackYにx,y成分ごとに格納していくものです。 //////// int *StackX = (int *)malloc(sizeof(int)*100000); int *StackY = (int *)malloc(sizeof(int)*100000); //////// 上のように書くと、途中でクラッシュしてしまいます。 ですが、大目にメモリをとって //////// int *StackX = (int *)malloc(sizeof(int)*10000000); int *StackY = (int *)malloc(sizeof(int)*10000000); //////// で実行すると、最後まで動いてくれます。

  • C言語 メモリ?

    最近、C言語の勉強を始めているものです。 gccでコンパイルし、実行ファイルを実行すると 強制終了 と表示されます。 gdbで実行してみると、 Program terminated with signal SIGKILL, Killed. The program no longer exists. You can't do that without a process to debug. と表示されました。 プログラムの中で、二次元配列 a[10000][10000],b[10000][10000] というような大きい配列を使っているのが原因なのかなと思っていますが、どうなんでしょうか?mallocでメモリを確保したらいいのでしょうか? ソースを載せることができなく申し訳ないですが、よろしくお願いします。