SDKで解析ソフトを作っている大学生です。
デュアルCPUのコンピューターでプログラムを
走らせるた場合、2個のCPUを同時に使って早い処理をして
くれるのでしょうか?
デュアルCPU専用のプログラミングをしなければ2個のCPU
を同時に使用して計算することができないと聞きました。
そのためデュアルCPUのワークステーションを買うかどうか迷って
います。
どなたかご教授頂ければ幸いです。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

折角並列計算をなさろうとしていらっしゃるのに水を差すようですが、解析ソフトを並列化したところで2CPUだから性能が2倍ということはとても望めません。


もちろん、特殊な場合にはそういうこともありますが、もし解析を速く行いたいというのであれば、大抵の場合は幾つかのパラメータで複数回計算させるわけですから2CPUのマシンであれば2つのケースを通常の逐次計算プログラムで同時に計算させた方が実質的な効率はよくなります。
問題によっては並列化のための前処理、後処理のコストがかかって実質的には逐次計算と大差ないということもありますし、並列化自体が難しい場合もあります。
1回の計算に膨大な時間がかかりそれをどうしても短くしたいというニーズがあれば並列化する意味もあるとは思いますが・・・。

マルチCPUのマシンでC++を使って並列計算をしたいというのであれば皆さんがおっしゃっているようにマルチスレッドを利用するのが一番効率がいいと思われます。もちろんマルチプロセスでも出来ますが前者の方が計算負荷という意味では低コストです。
マルチスレッドを使いこなすのはかなりハードルは高いですが、並列計算という以外にも実用的なソフトウェア開発という意味では必要になってくるテクニックですので学習なさっても損はないと思います。
しかし解析が主で、並列計算に興味があるのでしたらmpich(先のリンクを参照下さい)等も学習する意味があると思います。

VC++でマルチスレッドをというのであればオライリーから「Win32/C++マルチスレッドプログラミング詳解」という本が出ていますし、Unix系でいくのならば同社から「Pthreadsプログラミング」という参考書が出ています。マルチスレッドについての概要を知りたければこれらの本の冒頭部分を立ち読み?なさってみたら如何でしょう。
    • good
    • 0
この回答へのお礼

有意義なご回答ありがとうございました。
みなさんのご回答をもとに自分で勉強していきたいと思います。

お礼日時:2001/04/06 19:59

パソコンは何の考慮もなく作ったプログラムの何処を並列に処理できるか判断できるほど賢くありません。



1つのプログラムで2CPUの恩恵にあずかろうと思ったら、そのようなプログラムを作る必要があります。

VC++であれば、「スレッド」というキーワードでマニュアルを探してみてください。完全にSDKだけ(Win32APIだけ)でいくならCreateThread、MFCを使うならAfxBeginThread、という関数を使いますからこれらの関数とその関連リンクを調べてみるとよいでしょう。
    • good
    • 0
この回答へのお礼

具体的なご回答ありがとうございます。
これからいろいろと調べて勉強していきたいと思います。

お礼日時:2001/04/06 20:04

書き忘れましたがコンパイラがパラレル化に対応していても初めからパラレル化に向くプログラミングをすれば効率よく処理を行えます。



ちょっと気をつけるかどうかでものすごく処理時間は変わりますよ。

確かfork文という物を持ったC言語があったはずですがこれを使えば上手くやればきっちり早くなります。

ただパラレル化向きのプログラミングとは?とは聞かないでください。
とてもここでは書き切れませんので書店に行って並列プログラミングの本を買ってください。
    • good
    • 0

>CPUが2個ついたWSを買えば、勝手に2個のCPUを使って計算してくれないのですか?



それはコンパイラによると思います。
良くできたコンパイラがあって尚かつそのコンパイラのオプション指定でパラレル化オプションが出来るようでしたら可能な限りパラレル化してくれます。
ただ今現在はどうか分かりませんが以前はC言語よりもフォートランの方がパラレル化の率が高かったです。構造化プログラミングされたプログラムは特にパラレル化の率が低かったです。現在はコンパイラが良くなっているかと思いますが。

>マルチCPUに対応したアプリケーションを作らなければ片方のCPUは眠ったままで、
>プログラムをしない人にはマルチCPUっていうのはまったく
>意味がないということですよね?

いえ、そんなことはありません。プロセスを2本以上同時に動かす場合はOSによってはちゃんとCPUを割り振ってくれますので単独CPUよりは効率的にアプリケーションを動かせますので。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
みなさんのご回答をもとに、これから勉強していきたいと思います。

お礼日時:2001/04/06 20:01

要するに並列計算がしたいということですよね?


それこそgooで「並列計算」というキーワードで探せば腐るほど情報が得られますよ。
asucaさんも述べておられる通り、並列計算をさせたかったらば、それなりに並列で計算するようなプログラミングをしなければいけません。
SDKとおっしゃってますが何のSDKなんでしょう?
普通、解析プログラムといえばFortran、C、C++などを使って記述するのが普通ですが、それぞれそれなりに方法はあります。
コンパイラー自体にそれなりの機能があって割と簡単に並列化できる場合もありますし、フリーのライブラリを使ってかなり細かく書かなければいけないけれどもかなり効率のよい並列プログラムを書くことも出来ます。
デュアルCPUといったマルチCPUのマシンを使う場合は前者の候補が増えます。
並列化したいプログラムにもよりますが、別にマルチCPUのマシンでなくともネットワークでつながった複数のマシンで並列計算を行うことも出来ます。
もちろんCで書けば何でも出来てしまいますから、別にライブラリ等がなくとも、例えばマルチCPUのマシンであれば複数のプロセスを起動するか複数のスレッドを起動することにより並列化したプログラムを書くことも可能です。
とにかくWeb上にたくさんの情報がありますし、並列計算に関する本もたくさん出版されています。それなりに奥の深い分野ですので学生さんであれば腰を据えて勉強なさった方がよいかと思います。

参考URL:http://www-unix.mcs.anl.gov/mpi/mpich/

この回答への補足

ご回答ありがとうございます。
僕はC言語を使っています。コンパイラはVC++6.0です。
またばかな質問をしますが、申し訳ありません。

CPUが2個ついたWSを買えば、勝手に2個のCPUを使って計算してくれないのですか?
マルチCPUに対応したアプリケーションを作らなければ片方のCPUは眠ったままで、プログラムをしない人にはマルチCPUっていうのはまったく
意味がないということですよね?

補足日時:2001/04/05 19:14
    • good
    • 0

デュアルCPUの場合ソフトウェアでそれように作ってやらなければ2つのCPUを使うことはありません。


そのままは知らせても1つのCPUしか使用しないでしょう。
プログラムの時は静的にメモリをとってもメモリを同時に書き込んだりして不都合が起こらないようにしてやるなど工夫が必要です。

たしかサブルーチンごと別プロセスにしてもう一つのCPUを利用できたはずですが関数名を忘れてしまいました。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAMD製CPUの性能比較サイト

AMD製CPUの性能を数値で一覧で比較しやすいサイトはありますでしょうか?
INTELの比較サイトはあったのですが、AMDは見つかりません…。
おおまかな比較でもかまいません。

異なるCPUの性能は単純に比較できない事は分かっています。
ですが、性能を細かく正確に知りたいワケではなく、おおまかに位置付けを感覚的に把握したいので、強引にでも杓子定規でも何でも、性能を数値化してCPUの種類を超えて、ある程度過去から現在にかけてのCPU性能を比較しているサイトが好ましいです。
具体例として、このような比較表のサイトが望ましいです。

INTELのCPUの比較表のサイト
http://maximums.gatt.nobody.jp/cpu.html
GPUの性能比較
http://mizushima.ne.jp/topic/GPU-benchmark/index.php

今回はAMDの過去から現在にかけてのCPU性能を比較しているサイトを質問していますが、分かりやすいINTELとAMD製CPU比較サイトもありましたらよろしくお願いします。

AMD製CPUの性能を数値で一覧で比較しやすいサイトはありますでしょうか?
INTELの比較サイトはあったのですが、AMDは見つかりません…。
おおまかな比較でもかまいません。

異なるCPUの性能は単純に比較できない事は分かっています。
ですが、性能を細かく正確に知りたいワケではなく、おおまかに位置付けを感覚的に把握したいので、強引にでも杓子定規でも何でも、性能を数値化してCPUの種類を超えて、ある程度過去から現在にかけてのCPU性能を比較しているサイトが好ましいです。
具体例として、このよう...続きを読む

Aベストアンサー

>INTELのCPUの比較表のサイト
>http://maximums.gatt.nobody.jp/cpu.html
ここにAMDも載っているのですが、これではダメなのでしょうか。

Qプログラムの各行に説明を書いて頂けませんか?

下記に記載したプログラムは一定時間、時刻を周期Tで割った物を整数化する事で得た周期外時刻分を引いて周期内数値に変え、周期前半なら1後半なら-1を格納しているだけだそうです。
このプログラムを理解したいのですが、各行に説明が書いてないのでいまいちよくわかりません。
なので、どなたか各行に「//」を書いたのでその横にその行のソースの説明を書いて頂けませんか?


#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define rint(x) ((int)((x)+0.5))//
#define trunc(x) ((int)(x))//

int main(void){//

/* (1) definition */
double tstep = 0.01, last_time = 5.00;//
int max_step; max_step = rint(last_time/tstep);//
double i, REtime, time, *output = new double[max_step];//

output[max_step], time;//
double T = 1.0; /* wave cycle *//
int j=0, multi;//

/* (2) generating square wave */
// amplitude : 1
// time cycle : T = 1.0[sec]
// time step : 0.01[sec]
// last time : 5[sec]

for (time = 0.0; time < (last_time+tstep); time = time+tstep){//
i = time/T; multi = trunc(i);//
REtime = time - T*multi;//
if (REtime <= T/2.0)//
output[j] = 1;//
else//
output[j] = -1;//
j = j+1;//
}

/* (3) file out */

int t1;//
FILE *f1;//
f1 = fopen("square.csv","w");//
for(t1 = 0; t1 < 500; t1++)//
fprintf(f1,"%f,\n",output[t1]);//
fclose(f1);//

return 0;

}

下記に記載したプログラムは一定時間、時刻を周期Tで割った物を整数化する事で得た周期外時刻分を引いて周期内数値に変え、周期前半なら1後半なら-1を格納しているだけだそうです。
このプログラムを理解したいのですが、各行に説明が書いてないのでいまいちよくわかりません。
なので、どなたか各行に「//」を書いたのでその横にその行のソースの説明を書いて頂けませんか?


#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define rint(x) ((int)((x)+0.5))//
#define trunc(x) ((int)(x))//

int...続きを読む

Aベストアンサー

説明を分かりやすくするため、時間の単位を「秒」とします。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define rint(x) ((int)((x)+0.5))//小数点以下四捨五入
#define trunc(x) ((int)(x))//小数点以下切り捨て

int main(void){//プログラムの開始

/* (1) definition */
// tstep・・・波形を記録する時間間隔
// last_time・・・記録終了の時間
// ⇒下の場合、0.01秒毎に5秒になるまで記録します。
double tstep = 0.01, last_time = 5.00;

// max_step・・・終了時間まで記録する為に必要なレコード数。
// 0.01秒毎に5秒間記録するから、500個のレコードを保存する事になります。
// ⇒「四捨五入」で整数化していますが、これに+1するか、あるいは「切り上げ」
//  の方がいいと思います。入れ物は大きいにこした事はないです。
int max_step; max_step = rint(last_time/tstep)+1; //←勝手に+1を追加しました。

// i・・・波数(1周期を1.0として、何周回ったか)
// REtime・・・単周期内の経過時刻(1周期経過するごとに0.0になる)
// time・・・記録開始からの経過時間
// output・・・記録を保存するバッファ
double i, REtime, time, *output = new double[max_step];

output[max_step], time;// いらない行です。

// T・・・1周期の時間
// j・・・何個記録したかのカウンタ
// multi・・・何周期進んだか(iの整数部)
double T = 1.0; /* wave cycle *//
int j=0, multi;//

/* (2) generating square wave */
// amplitude : 1
// time cycle : T = 1.0[sec]
// time step : 0.01[sec]
// last time : 5[sec]

// 0.0秒から5.0秒まで、0.01秒毎に記録していきます。
// ぴったり5.0秒の場合も記録したいので、5.01秒までループさせます。
for (time = 0.0; time < (last_time+tstep); time = time+tstep){
// i=現在の波数(1周期を1.0として、何周回ったか)
// multi=現在何周目か(iの整数部)
// T*multi=現在の周期に入った時間
// REtime=現在の周期に入ってからの経過時間
i = time/T; multi = trunc(i);
REtime = time - T*multi;

// 現在の周期に入ってからの経過時間が半周期以内なら、1を、
// そうでなければ-1をバッファに格納し、バッファの格納位置を1つ進める。
if (REtime <= T/2.0)
output[j] = 1;
else//
output[j] = -1;
j = j+1;
}

/* (3) file out */
int t1; // ループカウンタ
FILE *f1; // 保存するファイルのポインタ
f1 = fopen("square.csv","w");// ファイルを開きます。

// output[]に格納した値を1つずつファイルに保存します。
// ⇒個数を500としていますが、各パラメータが変更された場合に修正する必要があるので、
//  500の代わりに、jを使った方が良いです。
//  (jにはoutput[]に格納された数が入っています)
for(t1 = 0; t1 < j; t1++)//
fprintf(f1,"%f,\n",output[t1]);//
fclose(f1);//
delete[] output;// ※outputはdeleteしないといけません。
return 0;

}

last_timeやtstepの値を変更する場合は、
for (time = 0.0; time < (last_time+tstep); time = time+tstep)
でループする回数が、max_step の数値以下になっているかどうか注意が必要です。
微妙な場合は、とにかくmax_stepを大きめにとりましょう。

説明を分かりやすくするため、時間の単位を「秒」とします。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define rint(x) ((int)((x)+0.5))//小数点以下四捨五入
#define trunc(x) ((int)(x))//小数点以下切り捨て

int main(void){//プログラムの開始

/* (1) definition */
// tstep・・・波形を記録する時間間隔
// last_time・・・記録終了の時間
// ⇒下の場合、0.01秒毎に5秒になるまで記録します。
double tstep = 0.01, last_time = 5.00;

// max_step・・・終了時間まで記録する為に必...続きを読む

Qcpuの比較

最近はCPUがたくさんありますが、いまいち比較ができません。
インテルはクロック重視だし
AMDはIPC?(一サイクルに使うクロック?みたいな)重視なので、単純には比較できません。

そこで、もっと比較しやすい基準ってないんですか?
ベンチマークみたいな

そんなサイトがあれば、価格とパフォーマンスをみてcpu決められるんですが・・・

ちなみに同じことがグラフィックボードにもいえます。
nVIDIAとATIで比較できないし

Aベストアンサー

CPUの比較は色々なサイトで見つかりますよ。
例えば、これ↓
http://www.xbitlabs.com/articles/cpu/

ビデオカードならこれ↓とか。
http://www.xbitlabs.com/articles/video/

Q間違いを指摘して頂けませんか?(切実)

私は大学で春からプログラミングの基礎を学び始めたプログラミング初心者です。
今、if関数のネストについて習っていて、if関数のネストを利用したプログラム作成の課題が出て、一応書いてはみたのですがどうしても上手くいきません。下に課題の内容と私の書いたプログラムを書いておきますので、間違っている箇所を指摘、修正して貰えませんか?宜しくお願い致します。


【課題】
次の項目に従ってプログラムを作成せよ。

(1)整数型の変数noを宣言
(2)「整数を入力してください。」と表示して改行
(3)キーボードから入力された値を変数noに代入
(4)入力された値が
・偶数で4で割り切れる数なら「整数○は偶数で4で割り切れます。」
・偶数で4で割り切れない数なら「整数○は偶数だけど4で割り切れません。」
・奇数で3で割り切れる数なら「整数○は奇数で3で割り切れます。」
・奇数で3で割り切れない数なら「整数○は奇数だけど3で割り切れません。」
の○の位置にnoの値を当てはめて表示した後、改行


#include <stdio.h>

main(void)
{
int no;

printf("整数を入力してください。\n");
scanf("%d",&no);
if(no/2==0,no%4==0){
printf("整数%dは偶数で4で割り切れます。\n",no);
}else{
if(no/2==0,no%4!==0){
printf("整数%dは偶数だけど4で割り切れません。\n",no);
}else{
if(no/2!=0,no%3==0){
printf("整数%dは奇数で3で割り切れます。\n",no);
}else{
printf("整数%dは奇数だけど3で割り切れません。\n",no);
}
}
}

}


※なお、上のプログラムは全て左詰めになってしまっていますが、質問する上で表示出来なかっただけですので…実際にはちゃんと然るべき箇所にTabキーによる余白は入れてあります。

私は大学で春からプログラミングの基礎を学び始めたプログラミング初心者です。
今、if関数のネストについて習っていて、if関数のネストを利用したプログラム作成の課題が出て、一応書いてはみたのですがどうしても上手くいきません。下に課題の内容と私の書いたプログラムを書いておきますので、間違っている箇所を指摘、修正して貰えませんか?宜しくお願い致します。


【課題】
次の項目に従ってプログラムを作成せよ。

(1)整数型の変数noを宣言
(2)「整数を入力してください。」と表示して改行
(3)...続きを読む

Aベストアンサー

No4です。
>「かつ」の演算子についてはまだ習っていないのですが、>&&を使わない場合は回答者No.3の方が書いているように
>if(no%2==0){
>if(no%4==0){
>とすれば良いのでしょうか?

その通りです。&& を使わないのであればNo3の方のようにしてください。
if (偶数か){
 if (4で割り切れるか){
  4で割り切れる場合のケース
 }else{
  4で割り切れない場合のケース
 }
}else{
 if (3で割り切れるか){
  3で割り切れる場合のケース
 }else{
  3で割り切れない場合のケース
 }
}

QCPUの性能比較サイトを教えて欲しい

Core2DuoとPenDとPen4とCeleronDの性能比較したグラフを以前どこかのサイトで見たのですが知っている方、おられませんでしょうか?
いくら探しても見つかりません。
また4種類のCPU比較ではなくても良いので、CPUのベンチマークなどの性能比較しているサイトがあれば教えてください。

Aベストアンサー

Tom's Hardware Guide Processors: CPU Charts 2006
http://www23.tomshardware.com/cpu.html?modelx=33&model1=430&model2=464&chart=173
他にもPCマーク、オフィスのベンチもあります
http://www.dosv.jp/feature/0610/05.htm

Qfor文が機能しません。どなたか原因を指摘して頂けますか。

こんにちは。質問させて頂きます。

pcap.hで、「リスト構造に格納された送受ID・ポート」と、「キャプチャされたパケットの送受ID・ポート」を順に比較していって、同じであれば同一の通信フローとみなす、といったプログラムを作っています。
しかし、何故かfor文自体が機能せず、for文の中のprintf文が全く表示されないところをみると、for文をスルーしてしまっているようです。for文の中身の記述がおかしいのか、条件記述がおかしいのかのどちらかだとは思うのですが特定できません。
皆さんのお力をお貸し頂けないでしょうか。
以下がプログラムの一部です。

//ID・ポートを含んだリスト構造体作成
struct list
{
struct in_addr src, dst;
u_short sport;
u_short dport;
struct list *next;
};

//キャプチャされるパケットのID・ポート情報を記録する構造体
struct new_capture
{
struct in_addr new_src, new_dst;
u_short new_sport;
u_short new_dport;
};

ループバック関数(){

//キャプチャされたパケット情報を構造体に写す
struct new_capture nc;
nc.new_dport = tcp->th_dport;
nc.new_sport = tcp->th_sport;
nc.new_src = ip->ip_src;
nc.new_dst = ip->ip_dst;

//リスト構造体の先頭と、ループさせるためのポインタを宣言
struct list flow_head;
struct list *looplist;

//問題のfor文
//looplistを利用して、キャプチャされたパケット情報と
//リスト構造体に格納された情報とを比較する
//同一ならばそれでbreak、全ての構造体と相違ならば
//構造体の末端に新たに追加する
for (looplist = &flow_head; looplist ; looplist = looplist->next)
{

if (inet_ntoa(looplist->src) == inet_ntoa(nc.new_src))
{
if (inet_ntoa(looplist->dst) == inet_ntoa(nc.new_dst))
{
if (looplist->sport == nc.new_sport)
{
if (looplist->dport == nc.new_dport)
{
printf ("送受アド、送受ポート同一");
break;
}
}
}
}
else if (looplist->sport == nc.new_dport)
{
if (looplist->dport == nc.new_sport)
{
if (inet_ntoa(looplist->dst) == inet_ntoa(nc.new_src))
{
if (inet_ntoa(looplist->src) == inet_ntoa(nc.new_dst))
{
printf ("送受アド、送受ポート同一逆順");
break;
}
}
}
}
else
{
printf ("同一ではない");
}
}
//通信フロー数を1増やし、リスト構造体にIDとポートを追加する
if (looplist == NULL)
{
flow_counts++;
printf ("通信フロー追加:%d\n", flow_counts);
looplist = (struct list *) malloc (sizeof (struct list));
  looplist->dport = nc.new_dport;
looplist->sport = nc.new_sport;
looplist->src = nc.new_src;
looplist->dst = nc.new_dst;
}

free(looplist);
return;
}


上のlooplistにアドレスを代入しているはずなのに、ずぅ~っとNULLになっているらしく、for文が終わった後のif文が常に機能するようになってしまっています。
for文が機能しないのは何故なのか。
looplistがずっとNULLなのは何故なのか。
この二つが解決出来ればなんとか出来ると思うのですが力不足でそれに及びません。何か気が付かれた事等ありましたらご教授頂けないでしょうか。どうぞよろしくお願いします。

こんにちは。質問させて頂きます。

pcap.hで、「リスト構造に格納された送受ID・ポート」と、「キャプチャされたパケットの送受ID・ポート」を順に比較していって、同じであれば同一の通信フローとみなす、といったプログラムを作っています。
しかし、何故かfor文自体が機能せず、for文の中のprintf文が全く表示されないところをみると、for文をスルーしてしまっているようです。for文の中身の記述がおかしいのか、条件記述がおかしいのかのどちらかだとは思うのですが特定できません。
皆さんのお力をお貸...続きを読む

Aベストアンサー

ざっと見た感じですが……

・flow_headがローカル変数なので関数呼び出しごとに初期化される
・if()の構成が間違っている(どのprintf()にも到達しないパターンがある)
・リストが構築されてない(malloc()で確保したメモリのアドレスをnextに入れる処理がない)
・追加で確保した要素のnextをNULLにしてない(このままリストに入れたら終端判定ができなくなる)
・関数脱出直前のfree(looplist)は不要というかここでやってはいけない(ヒットした要素、もしくは作ったばかりの新要素を壊してしまうことになる)

とりあえずこんなところで。
ループは一回は入ってると思いますが、ステップ実行で追ってみましたか?

QCPUの処理スピード比較がわかるサイト

最近のパソコンに使用されているCPUには、たくさんの種類がありますが、それらのCPUについてベンチマークテストによるスピード比較が行われているようなサイトはありますか?

Aベストアンサー

いわゆるパソコン用のオフィスやマルチメディア系のアプリケーションのための性能ではなく、計算(CPUとメモリ)の性能という意味ではSPECというベンチマークが有名で、信頼されています。整数計算のSPEC INTと、実数計算のSPEC FPがあります。

参考URL:http://www.spec.org/cpu2000/results/cpu2000.html

QC言語のプログラムでおかしな動作をするのですが教えて頂けないでしょうか?

VisualStudio2008使用しています。
問題は、サイコロを200回振ってその出た目の数の個数分*を表示するプログラムです。
サイコロの目はランダムで出しています。
次のプログラムは正常に動作するものです。
/*
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 200

int DICE(int min,int max);
int main()
{
int n,i,j;
int y[7]={0};
srand((unsigned int)time(NULL));

for(i=0;i<N;i++){
n=DICE(1,6);
y[n]++;
}

for(i=1;i<7;i++){
printf(" %2d: ",i);
for(j=0;j<y[i];j++){
printf("*");
}
printf("\n");
}

return 0;
}

int DICE(int min,int max)
{
return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}
*/

次のプログラムが問題で、授業で先生が配列にはstaticをおまじないとしてつけないと暴走すると言われたので、つけて見ると明らかに間違ってると思われるプログラムで動作するのですが原因を教えて頂けないでしょうか?
以下問題のプログラム!
配列の前にstaticをつけたら、添え字をいくつにしても正常に動作します。普通は添え自分しか領域って確保されないですよね???
/*
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 200

int DICE(int min,int max);
int main()
{
int n,i,j;
//以下が問題の配列宣言
static int y[2]={0};
srand((unsigned int)time(NULL));

for(i=0;i<N;i++){
n=DICE(1,6);
y[n]++;
}

for(i=1;i<7;i++){
printf(" %2d: ",i);
for(j=0;j<y[i];j++){
printf("*");
}
printf("\n");
}

return 0;
}

int DICE(int min,int max)
{
return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}

質問の意味が正確に伝わらなかった場合は補足しますので、ご回答よろしくお願いします。

VisualStudio2008使用しています。
問題は、サイコロを200回振ってその出た目の数の個数分*を表示するプログラムです。
サイコロの目はランダムで出しています。
次のプログラムは正常に動作するものです。
/*
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 200

int DICE(int min,int max);
int main()
{
int n,i,j;
int y[7]={0};
srand((unsigned int)time(NULL));

for(i=0;i<N;i++){
n=DICE(1,6);
y[n]++;
}

for(i=1;i<7;i++){
printf(" %2d: ",i);
for(j=0;...続きを読む

Aベストアンサー

ローカル変数の場合はスタックと呼ばれる領域に確保されます。
この場合、指定したデータ量分しかもらえません。
例えば char s[2] = { 0xDE, 0xAD};とした場合

┏━┳━┳━┳━
┃s0┃s1┃s2┃s3...
┣━╋━╋━╋━
┃DE┃AD┃プログラムに必要なデータ等等・・・

s[2](s2)以降に何かを書き込むとデータが上書きされプログラムが暴走します。

staticをローカル変数につけるとスタックとは別の領域に置かれます。
この領域はコンパイル時に自動的にある程度余裕を持って確保されます。
また、データのみの領域としてローカル変数のようにプログラムが使用するデータ(実行に必要なアドレスなど)はありません。
static char s[2] = { 0xDE, 0xAD};とした場合
┏━┳━┳━┳━
┃s0┃s1┃s2┃s3...
┣━╋━╋━╋━
┃DE┃AD┃空き領域
s[2] = 0xBE; s[3] = 0xEF;と代入すると
┏━┳━┳━┳━
┃s0┃s1┃s2┃s3...
┣━╋━╋━╋━
┃DE┃AD┃BE┃EF
と一見なんの問題もないようにデータが書き込まれます。
しかし、
static char s[2] = { 0xDE, 0xAD};
static char t[2] = { 0xCA, 0xFE};
として
┏━┳━┳━┳━
┃s0┃s1┃t0┃t1...
┣━╋━╋━╋━
┃DE┃AD┃CA┃FE
s[2] = 0xBE; s[3] = 0xEF;と代入すると
┏━┳━┳━┳━
┃s0┃s1┃t0┃t1...
┣━╋━╋━╋━
┃DE┃AD┃BE┃EF
のように上書きされてしまいます。
今回はstaticな変数が一つだったので問題がないように見えただけです。

つまり、staticをつけると普通のローカル変数とは記憶される場所が違うということです。

ローカル変数の場合はスタックと呼ばれる領域に確保されます。
この場合、指定したデータ量分しかもらえません。
例えば char s[2] = { 0xDE, 0xAD};とした場合

┏━┳━┳━┳━
┃s0┃s1┃s2┃s3...
┣━╋━╋━╋━
┃DE┃AD┃プログラムに必要なデータ等等・・・

s[2](s2)以降に何かを書き込むとデータが上書きされプログラムが暴走します。

staticをローカル変数につけるとスタックとは別の領域に置かれます。
この領域はコンパイル時に自動的にある程度余裕を持って確保されます。
また、データのみの領域としてロ...続きを読む

QCPUの比較

CPUの比較が基本的にできないことをなんとなく理解はできるのですが、下記のCPUの性能比較についてはどうでしょうか?
(1) インテル Core2Duoプロセッサー
(2) インテル Pentium Dual-Coreプロセッサー
(3) AMD Turion64×2 モバイル・テクノロジー
(4) AMD Athlon64×2

ハイビジョン撮影したビデオカメラの編集用に、これから新しいPCを購入しようと思うのですが、どのCPUがいいですか? できれば長く使いたいのと、初期不良とかの不安要素はできるだけ、減らしたいという考えです。
皆様の使用感でもいいのでアドバイスお願いします。

Aベストアンサー

たびたびすいません。
No.4に書き忘れました。

数字の文字列はお察しの通り、大きいほどCPU性能は上昇します。
例)「Core 2 Duo E6600」は動作周波数2.40GHzで「E6700」は2.66GHz

IntelとAMDではそのナンバーと動作周波数が違うので比較する際には注意してください。

Qどんなプログラムになるのかわからないのでプログラムを作って頂けませんか

どんなプログラムになるのかわからないのでプログラムを作って頂けませんか?

3分間英単語タイプ練習プログラム作ってを5日以上にわけて計25回以上実行します。

1 単語ファイルword.txtを単語数未知として読み込むこと.3975単語含まれているが,単語数をプログラムに直接書き込むことや実行時に与えることは禁止.
2 単語は一様乱数を用いてランダムに呈示すること.プログラム完成後,プログラムの先頭に「srand((unsigned)time(NULL));」を付加しなさい.これにより,実行時刻によって乱数シードが変わるから,異なった単語(系列)が呈示されることになる.
3 各回の得点は「正答した単語の文字数の総和」とする.
4 毎回「月/日/年-時:分:秒,得点」を結果ファイルscore.csvに追加的に書き込む(追記モード)。秒と得点の間のカンマは半角にする必要があることを注意しておく.

Aベストアンサー

とりあえず使いそうな関数だけ書いておきます。あとは調べてください。

fgets, fseek

とりあえずこれだけで作れる・・・かな?word.txtの中身が分からないですが、一行につき一単語のみが書いてあると仮定するとfgetsをループすれば単語数は求められます。

単語をメモリに格納した方が速度は早くなるのでそのときはfgets, malloc, freeで作れるかと。

ポインタは分かっていますか?
ポインタ分かってないとちょっと厳しいかも・・・

がんばってください。


人気Q&Aランキング

おすすめ情報