実行結果を細大漏らさず書いてくれ。
自分が想定しているものと、実際のものとを
898です。
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
clock_t start, stop;
int i;
start = clock();
for(i=0; i<320000; i++);
stop = clock();
cout << "開始時間取得: " << start << "\n";
cout << "終了時間取得: " << stop << "\n";
return 0;
}
実行結果
開始時間取得: 0
終了時間取得: 0
898です。
自分が想定しているもは??
同じサーバ上でPHPでは
<?php echo date("Y/m/d H:i:s (D)", time()) ?>
実行結果
2004/01/11 13:07:57 (Sun)
時間取得できてました。
PHPの例なんて出されてもな。
clock() の仕様きちんと見てあるか?
clock_t は(通常) long 型だ。文字列が入るわけはない。
初期化してない clock_t 変数に 0 が入ってるってことは
関数はきちんと値を返している。
問題は、
その値がきちんと初期化/更新されていないか
計算速度が速すぎて値が変化していないかだ。
start = clock();
とした後に
while( clock() < 1000 );
みたいな処理を入れてループを抜けられるか確認してみるとかしてみろ
>>902 意図がよくわからんが、
for(i=0; i<320000; i++);
のループの時間を計測しようとしてるか?
ひょっとするとコンパイラが最適化で、
意味のないループだと判断してまるごとループを取り除いてるかもしらんぞ。
コンパイラがなんだかわからんが(gccだろうと思うが)
最適化しないオプションつけてコンパイルしてみれ。
gccなら-O0(大文字のオーに数字のゼロ)だ。
898です。
>計算速度が速すぎて値が変化していないかだ。
こちらでした。
for(i=0; i<320000; i++); → for(i=0; i<32000000; i++);
実行結果
開始時間取得: 0
終了時間取得: 450000
になりました。
ありがとうございます。
>>894 scanf の戻り値を確認していないから。
double timp[250][5500] = { 0 };
なる宣言があると、実行時にエラーでとまってしまいます。
[250][50]くらいだと止まりません。
うまいこと[250][5500]でできないでしょうか?
記憶クラスをstaticに汁
そんなでかい配列を作らない、ってのが定石。
>>908 あと、static記憶クラスの変数は、自動的に0で初期化されるから、
static double timp[250][5500] = { 0 };
なんて書くなよ。
>>909,913
ありがとうございます。
これから試してみます。
別に書いたっていいだろ。意味ないけど
コマンドプロンプトで
program source(.exe)
みたいな形でCのexeファイルを実行出来るprogramって
ボーランドCコンパイラかWindowsに含まれてませんか?
何をしたいかと言うと、TeraPadでなるだけ外部ツールを使わずに
拡張子無しファイル名を渡して実行させたいのですが。
意味不明
少なくともCの話じゃない。
ソフトウェア板向きだな。
どこで聞いても意味不明
>916
理解しようと努力したけどだめでした。
Cインタプリタか?
>>922 単にTeraPadの外部ツール作りたいだけだらう。
924 :
デフォルトの名無しさん:04/01/13 17:41
容量の小さいプログラムを作りたいとき
どんなことに気をつければいいのでしょうか。
色んな注意点を教えてください。お願いします。
無駄なコードを減らす。
まとめられる処理はまとめる。
928 :
デフォルトの名無しさん:04/01/13 19:43
>>927 BCCで作ったプログラムがUPXできないのってなぜでしょう?
__
/ _∀\
@《 ゚Д ゚)
(( つコ= -=三(◎)
∧人/ |
.. (_) /_)
┏━━━━━━━━━━━━━━━━━┓
┃エックス「 だいさんには シグマ いじょうの┃
┃ あくを かんじるんだ!!」 ┃
┗━━━━━━━━━━━━━━━━━┛
930 :
デフォルトの名無しさん:04/01/13 22:23
すいません、間違えました。メモリの確保です。
メモリをなるべく無駄遣いしないようにするには
どういうプログラムを組めばいいのでしょうか。
インラインアセンブリで書く
(一応Cだからなぁ)
再利用できるものは再利用する。
934 :
デフォルトの名無しさん:04/01/14 00:06
毎回free()関数で開放するといいんでしょうか。
何回も使う関数内でのデータの開放は無駄なんでしょうか.
mallocでちまちまと領域を取らないというのがいいかと。
取るならドーンと取って(できればmallocじゃなくsbrkで)、
自分でセコく管理。
あとは、構造体のpaddingに注意して、
フラグを構造体に入れたければビットフィールドにするとか。
これ以上の個別ノウハウは、
メモリの絶対量が少ないから節約したいのか、
扱うデータが多すぎるから節約したいのか、
どんなデータかとか、もっと情報がないと。
保存せずに毎回再計算する。
>>934 一般にはなんともいえない。
多くの実装においてmalloc族で確保したメモリは、
プロセスが生きている限りOSに返されることはない。
だから一般にプロセス生成から時間が経つにつれて
ワーキングセットが拡大することになる。
freeした領域は次回mallocしたときに再利用されることを期待してもいいが、
それとて様々な理由により再利用されないこともありうる。
こまめにmalloc、freeを繰り返すとブロックが分断化されていって、
結局OSからフリーストアを貰うことになるかもしれない。
まあなんだ。君がどの程度の制約でどれくらいの大きさのものを
扱おうとしているかわからんのだが、まずはできるだけ綺麗に、
ワーキングセットのことは考えずに書いてみてそれから
そのプログラムの挙動を観察し、ネックになりそうな部分を書き換えていけばよいと思う。
細かいメモリブロックをいちいちmallocしていくと、mallocその物が使う管理領域も
バカにならなくなるので、でかい領域を確保しちゃって自分でその中身を
やりくりするという手法もある。というかメモリに厳しいというのならそうすべき。
でもまず最初はその辺をmalloc/freeに任せて様子を見たほうがいいと思うね。
>>937 いいたいことはあってるけど、
ワーキングセットの用語の使いかたがちがっとる。
つーか、sbrkなんか使うな
ふつー mmap
>>930 メモリにデータを書かずにHDにデータを書く。
mmapのないSunOSで育ったんだYO!
[ウァァァンのAA]
typedef struct _STRUCTSUB{
void (*OnSub1[])( void * );
void (*OnSub2[])( void * );
} STRUCTSUB;
上のような構造体定義は無理なのでしょうか?
「サイズが0の配列があります」
というエラーが出ます。
サイズが0の配列=サイズ未指定の配列
int a[];
と同じ
>>946 早いレスありがとうございます。
しかし、
typedef struct _STRUCTSUB{
void (*OnSub1[])( void * );
} STRUCTSUB;
こうするとエラーが消えるんですが、
2つのサブルーチンポインタの定義は出来ないということでしょうか?
一部のコンパイラは、可変長構造体をサポートするための独自拡張で
「構造体の最後のメンバーに限り」配列のサイズを0にすることを認めている。
strut s1 {
int a[];
};
と
strut s2 {
int a[];
int b[];
};
で確かめてみるとよい。
>>948 なるほど、そんな機能があった訳ですか。
勉強になりました。
結論は、
>>945は無理ということですか。
ありがとうございました。
950 :
デフォルトの名無しさん:
フラグとして変数を使いたいとき、
1ビットだけでいいのですが、
1ビットだけ確保して使うというのはできないのでしょうか。