はじめまして。C言語の勉強を最近始めたのですが、
以下のプログラムで教えていただきたい点があります。
#include <stdio.h>
#include <math.h>
#define x 10000
#define y 200000
#define z 1.0E-12
#define k 1.38
#define kE 1.0E-23
#define h 6.63
#define hE 1.0E-34
#define c 3.00
#define cE 1.0E+08
void main(void){
int i;
double A[x+1];
double B[x+1];
for(i=0;i<=x;i++) {
A[i]=(i+y)*z;
B[i] = exp(-(h*hE*c*cE)/(A[i]*k*kE*1000));
printf("%e %e\n",A[i],B[i]);
}}
このプログラムで、xを100000にするとプログラムが動かなくなってしまいます。OSはWindowsXP、ソフトはVisual C++ 6.0を使っています。
解決方法を教えていただけないでしょうか。
No.8ベストアンサー
- 回答日時:
デフォルトスタックサイズは1MBでしたか。
存じませんでした。スタックオーバーフローなら対策はスタックを使わないようにすること。
てことで、さくっとやっときました。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>// 追加
#define x 100000
#define y 200000
#define z 1.0E-12
#define k 1.38
#define kE 1.0E-23
#define h 6.63
#define hE 1.0E-34
#define c 3.00
#define cE 1.0E+08
void main(void){
int i;
double*pA, *pB;
//double A[x+1];
//double B[x+1];
if(NULL == (pA = (double *)calloc( x+1, sizeof(double))) ){
perror("pA のメモリ確保失敗");
return;
}
if(NULL == (pB = (double *)calloc( x+1, sizeof(double))) ){
perror("pB のメモリ確保失敗");
return;
}
for(i=0;i<=x;i++) {
pA[i]=(i+y)*z;
pB[i] = exp(-(h*hE*c*cE)/(pA[i]*k*kE*1000));
if(i%1000==0) // 間引いて表示
printf("%e %e\n",pA[i],pB[i]);
}
return;
}
やったことは、スタックじゃなくてヒープからメモリを確保しただけ。
動作確認済み。
でも。ループ10万回っていう設計はセンスが悪い気がします。
No.5
- 回答日時:
あのー?
考えてます?
double型機種依存だと思いますが8バイトは最低でも確保されますよね?
8バイト*100000=80Mb位になるんじゃないの?
その配列2つで160Mbですよね?
Visual C++ 6.0でコンパイルもしくはリンクオプション付けないで、大きなメモリエリアは確か私の記憶では、確保出来ません。
No.4
- 回答日時:
Borand C++ Compiler 5.5で同様の現象を確認しました。
下記の変更で動きました。試してみてください。
スタックが足りないのかな。
void main(void){
int i;
static double A[x+1];
static double B[x+1];
No.3
- 回答日時:
ANo.1の方が
>int i;では、 iの値が-32768~32767までしかもてません。
と書かれていますが、これは勘違いです。というのはint型のサイズは処理系依存で、16bitという保証が無いからです。
Visual C++ 6.0のヘルプで int型のサイズを確認すると、int型のサイズは4バイト(=32bit)と記載されていました。ですから、とりうる値の範囲は -2147483647-1~2147483647 です。(これはlongのとりうる値の範囲と同じです。)
No.2
- 回答日時:
動かなくなってしまう、とは具体的にどのようになるのでしょうか?
> for(i=0;i<=x;i++) {
> A[i]=(i+y)*z;
> B[i] = exp(-(h*hE*c*cE)/(A[i]*k*kE*1000));
> printf("%e %e\n",A[i],B[i]);
>}
このループがx=100000回もまわるのですから、重たいprintfが繰り返されてコンソールにだ~~~~と文字列が流れて操作を受け付けないであろうことは想像できます。printfを100回に1回とか、1000回に1回に間引けば軽くなるでしょうね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- Microsoft ASP LEDで電光掲示板に「A B C D E」と表示したいのですが・・・ 1 2023/07/04 07:37
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
テイラー展開(C言語)
-
C言語 関数プロトタイプ宣言の...
-
c言語で、繰り返し文の中で、0....
-
C言語で-23乗を取り扱うには
-
c言語のコンパイルエラー canno...
-
関数におけるif文とreturn文に...
-
C 開放してるのにエラー(doubl...
-
c言語 標準体重計算のプログラ...
-
doubleは常に%lfとするべきなのか
-
long doubleの表示方法
-
C言語でdouble型の小数点の引き...
-
待ち行列シュミレーションのプ...
-
C言語(プログラミング)関連の質...
-
計算速度をはやくするには
-
処理時間計測
-
ニュートン法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
C 開放してるのにエラー(doubl...
-
Cで3乗根を求める方法
-
float型とdouble型の変数の違い...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
int とdoubleの比較
-
関数におけるif文とreturn文に...
-
C言語初心者 構造体 課題について
-
c言語のコンパイルエラー canno...
-
C言語 関数プロトタイプ宣言の...
-
C言語を実行すると-infが出てき...
-
float?数字の後にLがつくもの
-
数値を指数部と仮数部に分離したい
-
difftime()について
-
浮動小数点数が表示されないん...
-
たくさんの数の平均を求める方...
-
DWORDの警告
-
-1.#IND00と出てしまうのですが...
おすすめ情報