C言語何でも質問掲示板


アンケートにご協力下さい → >> アンケートフォーム <<

規約と使い方

 
   クイックソートエラー ....   
   コンパイル時に   
   分割コンパイルにおけ ....   
     ・[13197] たかぎ 
     ・[13326] ibis 
     ・[13328] Ban 
     ・[13331] ibis 
   教えて!   
     ・[13323] 管理人 
   文字列の初歩的な問題 ....   
     ・[13227] Blue 
     ・[13280] YK 
     ・[13295] 通りすがり 
     ・[13320] YK 
   助けてください、、、   
     ・[13303] 通りすがり 
     ・[13304] ダメな子 
     ・[13308] 通りすがり 
     ・[13312] C言語マスター 
   入門編なんですが   
     ・[13294] やそ 
     ・[13300] RARA 
     ・[13305] バグ 
     ・[13306] ネル 
     ・[13309] RARA 
   フーリエ変換プログラ ....   
     ・[13189] 管理人 
     ・[13206] 鳥取砂丘 
     ・[13208] 管理人 
     ・[13210] 鳥取砂丘 
     ・[13214] 管理人 
     ・[13239] しっぽ 
     ・[13240] しっぽ 
     ・[13243] tkmakwins15 
     ・[13245] 鳥取砂丘 
     ・[13289] しっぽ 
     ・[13301] 鳥取砂丘 
   画面のリセット   
     ・[13299] たかぎ 
   見取算   
     ・[13149] 管理人 
     ・[13150] 管理人 
     ・[13177] tirimu 
     ・[13182] 管理人 
     ・[13183] box 
     ・[13185] 管理人 
     ・[13235] parapara 
     ・[13236] YuO 
     ・[13238] たかぎ 
     ・[13293] parapara 
   質問です   
     ・[13248] prg 
     ・[13274] 管理人 
     ・[13282] Justy 
     ・[13287] prg 
   多次元配列   
     ・[13261] たかぎ 
     ・[13263] bbb 
     ・[13264] しりうす〜 
     ・[13265] tkmakwins15 
     ・[13266] JEX 
     ・[13267] bbb 
     ・[13268] keichan 
     ・[13269] bbb 
     ・[13272] しりうす〜 
     ・[13273] parapara 
     ・[13275] 管理人 
     ・[13283] tkmakwins15 
   doubleの小数点をたて ....   
     ・[13258] フリオ 
     ・[13259] 通りすがりの黒猫 
     ・[13262] たかぎ 
   未解決の外部シンボル ....   
     ・[13242] box 
     ・[13254] mouse 
     ・[13256] mouse 
   質問   
     ・[13252] 管理人 
     ・[13253] JEX 
   scanf関数とループ処理 ....   
     ・[13133] box 
     ・[13247] 朴訥 
   管理人さんへ質問   
     ・[13131] 管理人 
     ・[13246] 朴訥 
   ファイル操作について   
     ・[13219] マルクス 
     ・[13223] マルクス 
     ・[13224] マルクス 
     ・[13237] マルクス 
   PSDK-x86.exeについて   
     ・[13229] Blue 
     ・[13230] 初心者 
     ・[13231] たかぎ 
     ・[13232] 初心者 
     ・[13233] たかぎ 
     ・[13234] Hermit 
   CかC++か   
     ・[13186] 管理人 
     ・[13191] 初心者 
     ・[13194] ibis 
     ・[13196] 初心者 
     ・[13200] オルムント 
     ・[13202] 管理人 
     ・[13221] たかぎ 
     ・[13225] 初心者 
   ババ抜き   
     ・[12903] tkmakwins15 
     ・[12904] やそ 
     ・[12905] YuO 
     ・[12914] 荒丸 
     ・[12915] tkmakwins15 
     ・[13111] 荒丸 
     ・[13115] やそ 
     ・[13118] 管理人 
     ・[13120] 管理人 
     ・[13121] やそ 
     ・[13122] やそ 
     ・[13123] 管理人 
     ・[13166] 荒丸 
     ・[13170] 管理人 
     ・[13178] やそ 
     ・[13179] Hermit 
     ・[13181] 管理人 
     ・[13216] やそ 
     ・[13218] 荒丸 
     ・[13222] やそ 
   クイックソート   
     ・[13212] tkmakwins15 
     ・[13213] オルムント 
   自分の名前を忘れてし ....   
     ・[13065] 管理人 
     ・[13077] sd 
     ・[13080] 管理人 
     ・[13156] sd 
     ・[13207] sd 
     ・[13209] 管理人 
   時間の取得   
     ・[13139] 管理人 
     ・[13140] 管理人 
     ・[13141] PINK 
     ・[13142] PINK 
     ・[13143] 管理人 
     ・[13144] PINK 
     ・[13145] バグ 
     ・[13146] PINK 
     ・[13147] 管理人 
     ・[13148] 管理人 
     ・[13151] バグ 
     ・[13152] PINK 
     ・[13153] バグ 
     ・[13154] PINK 
     ・[13176] PINK 
     ・[13187] 管理人 
     ・[13193] PINK 
     ・[13201] 管理人 
     ・[13204] PINK 
     ・[13205] 管理人 
   アドバイスお願いしま ....   
     ・[13192] バグ 
     ・[13195] K-I 
   動画をDrawBox関数で表 ....   
     ・[13184] 管理人 
   キー入力   
     ・[13138] 管理人 
     ・[13167] キー 
     ・[13171] 管理人 
     ・[13174] キー 
   自機の当たり判定がわ ....   
     ・[13104] 管理人 
     ・[13112] ゲーム大好きっ子 
     ・[13119] ゲーム大好きっ子 
     ・[13125] 管理人 
     ・[13126] tkmakwins15 
     ・[13130] ゲーム大好きっ子 
     ・[13132] tkmakwins15 
     ・[13135] GPGA 
     ・[13155] tkmakwins15 
     ・[13165] GPGA 
     ・[13168] tkmakwins15 
     ・[13169] GPGA 
   toupper関数   
     ・[13158] たかぎ 
     ・[13160] オルムント 
     ・[13161] やそ 
     ・[13162] たかぎ 
     ・[13163] オルムント 
     ・[13164] オルムント 
   状態の変化について   
     ・[13117] 0 
   関数の戻り値について   
     ・[13109] toyo 
     ・[13110] tkmakwins15 
     ・[13116] こぶた 
   動画の利用   
     ・[13114] 管理人 
   ビットマップリソース ....   
   大量ファイルの読み込 ....   
     ・[13095] GPGA 
     ・[13097] hum-king 
     ・[13100] GPGA 
     ・[13101] hum-king 
   ソートプログラム   
     ・[13086] box 
     ・[13087] オルムント 
     ・[13088] box 
     ・[13090] オルムント 
     ・[13091] box 
     ・[13093] オルムント 
     ・[13096] box 
     ・[13099] オルムント 
   何もしていない筈なの ....   
     ・[13081] フリオ 
     ・[13082] 通りすがりの黒猫 
     ・[13083] Blue 
     ・[13084] box 
     ・[13092] 通りすがりの黒猫 
   C言語の解読   
     ・[13089] box 
   二次配列に代入できな ....   
     ・[13030] 組木紙織 
     ・[13031] Hermit 
     ・[13035] takk 
     ・[13059] たかぎ 
     ・[13075] Hermit 
     ・[13076] たかぎ 
   ポインターを使った数 ....   
     ・[13064] box 
     ・[13066] 通りすがりの黒猫 
     ・[13069] box 
     ・[13073] 通りすがりの黒猫 
   年月日計算   
     ・[13057] box 
     ・[13060] 幻 
     ・[13061] フリオ 
     ・[13062] box 
     ・[13068] 幻 
     ・[13071] box 
     ・[13072] 幻 
   なぜか、できません   
     ・[13024] tkmakwins15 
     ・[13025] 1020 
     ・[13026] tkmakwins15 
     ・[13027] バグ 
     ・[13028] 1020 
     ・[13050] 1020 
     ・[13051] バグ 
     ・[13055] tkmakwins15 
     ・[13058] Justy 
     ・[13067] 1020 
     ・[13070] tkmakwins15 

Name: オルムント  ..初心者(7,012ポイント)   Date: 2008/01/12(土) 17:29   No:13342       
Title: クイックソートエラーC2440    
いつもお世話になってます。
動的な領域確保について質問します。

現在データの入ったファイルを読み込み
その中のデータをソートするプログラムを作っています。

管理人様のクイックソートプログラム解説アプリで勉強させていただきました。
ですが、現在作っているプログラムにどうやって対応させればよいのか
分からず困っています。

右の数字部分を降順に並べ替えて出力したいと思って実行しますと、

error C2440:'=':'int'から'seito'に変換できません。
error C2440:'=':'seito'から'int'に変換できません。

とエラー出力が表示されてしまいます。

あと、現在のプログラムは特定の行数以上読み込むと暴走してしまいます。
いまファイルデータが100行あるので下記のプログラム中に
struct seito x[100];
としていますが、何行でも対応できるようにしたいと思い調べたら
malloc関数というものを見つけました。
対応のさせ方がわからなくて困っています

お手数ですが、わかる方ご指導お願いします。

↓ファイルデータ↓
C00001 45
C00002 49
C00003 47
C00004 40
C00005 58
C00006 61
C00007 51
C00008 38
C00009 59
C00010 52
C00011 49
C00012 50
C00013 56
C00014 48
C00015 48
C00016 43
C00017 48
C00018 53
C00019 47
C00020 47
C00021 53
C00022 47
C00023 40
C00024 41
C00025 49
C00026 55
C00027 48
C00028 57
C00029 62
C00030 40
C00031 56
C00032 40
C00033 53
C00034 47
C00035 48
C00036 47
C00037 47
C00038 44
C00039 53
C00040 54
C00041 50
C00042 51
C00043 56
C00044 38
C00045 61
C00046 41
C00047 38
C00048 50
C00049 58
C00050 51
C00051 55
C00052 65
C00053 56
C00054 51
C00055 44
C00056 66
C00057 50
C00058 52
C00059 53
C00060 49
C00061 52
C00062 49
C00063 49
C00064 56
C00065 59
C00066 49
C00067 45
C00068 58
C00069 50
C00070 61
C00071 45
C00072 59
C00073 53
C00074 56
C00075 53
C00076 44
C00077 54
C00078 43
C00079 49
C00080 51
C00081 56
C00082 52
C00083 54
C00084 43
C00085 62
C00086 59
C00087 53
C00088 56
C00089 47
C00090 48
C00091 52
C00092 52
C00093 46
C00094 52
C00095 45
C00096 53
C00097 55
C00098 44
C00099 43
C00100 49


↓プログラム↓

#include <stdio.h>
#include <stdlib.h>

FILE* fp;
int kijun,cnt,i,j,num,ninzu;
struct seito {
char c;
int no;
int ten;
}SEITO;
struct seito x[100],temp;

void fileopen(void){
if ((fp=fopen("testfile","r"))==NULL) {
printf("not open file\n");
exit(1);
}
for (cnt=0;;cnt++){
if (fscanf(fp, " %c%05d %d",&x[cnt].c,&x[cnt].no,&x[cnt].ten)!=3);
if(ferror(fp)||feof(fp))break;
}
}

void sort(void){
int left,right;
int left0=left,right0=right;
int pivot;
if(left>=right)return;
pivot=(x[left].ten+x[(left+right)/2].ten+x[right].ten)/3;
while(1){
while(x[left].ten<pivot)left++;
while(x[right].ten>pivot)right--;
if(left>=right)break;
temp=x[left].ten;
x[left].ten=x[right].ten;
x[right].ten=temp;
left++;
right--;
}
sort(x,left0,left-1);
sort(x,right+1,right0);
}

void show(void){
for (i=0;i<cnt;i++){
if (x[i].ten>=kijun){
printf("C%05d %d\n",x[i].no,x[i].ten);
}}
}

int main(void){

fileopen();
num=sizeof(x)/sizeof(x[0]);
sort(x,num, sizeof(SEITO));
show();
fclose(fp);
return 0;
}


1,079ポイント を手に入れた。




Name: マカロニサラダ  ..ぴよぴよ(95ポイント)   Date: 2008/01/12(土) 10:09   No:13338       
Title: コンパイル時に    
VisualC++とDxライヴラリ、Platform SDKをそろえ、設定もちゃんと行っているにもかかわらず
"DxLib.exe"がありません とでてきました。
なにかダウンロードし忘れたのか、設定を間違えているのかはわかりませんが、
少しでも情報があれば教えてください。


95ポイント を手に入れた。




Name: ibis  ..かけだし(1,951ポイント)   Date: 2008/01/08(火) 22:27   No:13188       
Title: 分割コンパイルにおける型定義    
定義というより宣言の話ですが。
他の翻訳単位に定義がある場合のclassやstructの宣言はどうすればよいですか。


46ポイント を手に入れた。


Name: たかぎ [URL]  ..上級者(21,631ポイント)   Date: 2008/01/08(火) 23:44   No:13197     
Title: Re:分割コンパイルにおける型定義    
質問の意図を確認させてください。

クラスの宣言というのは、
class A;



です。
それに対して、クラスの定義は、
class A

{
public:
void func();
};


です。
宣言であれば、前述以外の書き方はできないのですが、そういうことでよろしいでしょうか?


85ポイント を手に入れた。

Name: ibis  ..かけだし(2,185ポイント)   Date: 2008/01/11(金) 22:30   No:13326     
Title: Re:分割コンパイルにおける型定義    
お返事遅くなり申し訳ございません。

質問の内容ですが、もう少し具体的に言うと、
例えばa.cppというファイルでクラスを定義して
b.cppというファイルでそのクラスを使う場合に、
b.cppでクラスを宣言していてもエラーがでますよね。
例えばbccでは以下のエラーが。
・未定義の構造体
・サイズが不明、あるいはゼロ
この対処はどうすれば良いのか、ということです。
関数や変数ならexternキーワードが使えますが、
クラスの宣言には使えないようですし。


193ポイント を手に入れた。

Name: Ban  ..ぴよぴよ(128ポイント)   Date: 2008/01/11(金) 23:19   No:13328     
Title: Re:分割コンパイルにおける型定義    
1. classをヘッダで定義し、両方のcppから#includeする。
2. b.cppでa.cppを#includeする。
 そして必要なら、a.cpp自体はコンパイルしない、
 #ifdefマクロで切り替えるなど、の対策を追加。
3.そのクラスはポインタ(ハンドル)としてしか使わない。
 > でそのクラスを使う場合に、
 # C/C++のFILE*みたいな使い方。

classの宣言についてはたかきさんの書かれている通りで、
本当に"宣言"しかなくて、classの定義が必要な使い方をする限り、
そうするしかない。


128ポイント を手に入れた。

Name: ibis  ..かけだし(2,428ポイント)   Date: 2008/01/12(土) 00:09   No:13331 解決!     
Title: Re:分割コンパイルにおける型定義    
回答ありがとうございます。

先程の投稿の後、自分でももう一度調べてみました。
まぁBanさんの挙げた中では1の方法しか見つかりませんでしたが。
翻訳単位毎に定義できるので、翻訳単位が増えれば定義可能回数も増えると。
定義が複数あるというのは、なんとなく気持ち悪いですけどね。


86ポイント を手に入れた。



Name: サラ  ..ぴよぴよ(5ポイント)   Date: 2008/01/11(金) 15:59   No:13307       
Title: 教えて!    
何かゲームのプログラムを教えて!


5ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(481,304ポイント)   Date: 2008/01/11(金) 21:58   No:13323     
Title: Re:教えて!    
何かと言われましても、どうお答えしたらよいのでしょう?
簡単なゲームのコードが欲しいのか、何か作りたいゲームの理論が知りたいのか、色々ありますので、
もう少し詳しく書いていただけないでしょうか?


88ポイント を手に入れた。



Name: YK  ..ぴよぴよ(399ポイント)   Date: 2008/01/09(水) 17:39   No:13226       
Title: 文字列の初歩的な問題で苦戦しています。    
二つの文字列oneとtwoを引数として、oneをtwoにコピーする関数copy()を作成するという問題で
自分なりに作ってみたのですが動作しません。どこが違っているのか教えていただけないでしょうか?

#include <stdio.h>

int copy( char one[] , char two[] )
{
unsigned i,j=0;
while (one[i]){
if (one[i]=='\0')
break;
two[j]=one[i];
i++;
}
return i,j;
}

int main (void){

char three[512];
char four[512];

printf("Input...");
scanf("%s",three);

mystrcopy(three,four);

printf("%s\n",copy(three,four));
return 0;
}


187ポイント を手に入れた。


Name: Blue  ..初心者(5,908ポイント)   Date: 2008/01/09(水) 17:47   No:13227     
Title: Re:文字列の初歩的な問題で苦戦しています。    
>copy
はint型の値を返しますので、%sで出力できません。

>mystrcopy(three,four);
が不明ですが、

>printf("%s\n",copy(three,four));
copy(three, four);
printf("%s\n",four);


ちなみに
>if (one[i]=='\0')
>break;
の処理は行われないのでは。
また、twoには文字列の終端を表す'\0'を入れなければ正しく表示できないでしょう。


131ポイント を手に入れた。

Name: YK  ..ぴよぴよ(772ポイント)   Date: 2008/01/10(木) 22:23   No:13280     
Title: Re:文字列の初歩的な問題で苦戦しています。    
返信ありがとうございます。
>mystrcopy(three,four);
は修正前の誤字です。くだらないミスで混乱させてしまい申し訳ありません。
返信の内容をふまえて考えられるだけ作ってみたのですが

#include <stdio.h>

int copy( char one[] , char two[] )
{
unsigned i,j=0;
while (one[i]){
two[j]=one[i];
i++;
if (one[i]=='\0')
two[j]='\0';
break;
}
return i,j;
}

int main (void){

char three[512];
char four[512];

printf("Input...");
scanf("%s",three);

copy(three,four);
printf("%s\n",four);

return 0;
}

このプログラムを動かしたところ、1文字しか値が返ってきません。
原因はBlueさんが書いてくださった、
>if (one[i]=='\0')
>break;
>の処理は行われないのでは。
の中にあるような気がして色々と試したのですがどうにもうまく行きません。
僭越ながらもう一度ヒントを頂けないでしょうか。



373ポイント を手に入れた。

Name: 通りすがり  ..初心者(6,180ポイント)   Date: 2008/01/11(金) 10:06   No:13295     
Title: Re:文字列の初歩的な問題で苦戦しています。    
 > unsigned i,j=0;

iが初期化されてないですよ。
jの使い道は?
unsigned i=0;
だけでいい。


 > two[j]=one[i];

jはインクリメントされていないので常に0。
(と言うかjはいらない。)
two[i]=one[i];


 > if (one[i]=='\0')
 > two[j]='\0';
 > break;

ifの後を{}に入れないと、1行しか実行されませんよ。
つまり、break;は常に実行されるので、ループからすぐ抜ける。
1文字しかコピーされなくて当然ですね。


 > return i,j;

何を意図しての戻り値なのかわかりません。
コピーした文字数('\0'除く)なら、
return i-1;
でしょうか。
コピーしない(0文字)場合の処理もいりますが。

もう少し入門書などで構文などを勉強することをお勧めします。


276ポイント を手に入れた。

Name: YK  ..ぴよぴよ(904ポイント)   Date: 2008/01/11(金) 21:23   No:13320 解決!     
Title: Re:文字列の初歩的な問題で苦戦しています。    
通りすがりさん、返信有り難うございました。
返信して下さった皆様のおかげでようやく形になりました。

単なる勉強不足でのミスをなくすよう心掛けます。


2倍のポイントを手に入れた! 132ポイント を手に入れた。



Name: ダメな子  ..ぴよぴよ(67ポイント)   Date: 2008/01/11(金) 14:48   No:13302       
Title: 助けてください、、、    
自分は学生で先日C言語実習で課題を出され2週間、考えたのですが解りません、

もしよかったら考えてみてもらえませんか。
人様に頼るのは良くないと思っていますが提出が迫っています。
力を貸していただいたら光栄です。


課題2−1
以下の実行例のように,直線y = ax + b の係数a, b を入力し,その直線上の座標値(xi, yi) を求め,さらに各yi に
のみ誤差を加え,その座標値をテキストファイルとして出力するプログラムを作成せよ.

課題2−2
課題2–1 で出力したデータファイルの内容を読み込み,最小二乗法によって,直線y = ax + b のパラメータa, b を
求めるプログラムを作成せよ.

課題2−3
グラフィックライブラリを用いて,
• 課題2–1 で入力したパラメータa, b を用いた直線(元の直線),
• 課題2–1 でファイルに出力した,誤差を含む点の座標値,
• 課題2–2 で求められたパラメータa, b を用いた直線(推定直線)
を全て1つのグラフィックウィンドウ上に表示するプログラムを作成せよ.
グラフ描画例(印刷の都合,白黒を反転している) 



67ポイント を手に入れた。


Name: 通りすがり  ..初心者(6,343ポイント)   Date: 2008/01/11(金) 15:04   No:13303     
Title: Re:助けてください、、、    
丸投げでしてくれる人がいるかわかりませんが・・・
どこまで自分で考えたかとか、どこがわからんかくらいは示してみてはどうでしょう。

・数学的な問題としてアルゴリズムがわからんが、アルゴリズムがわかればプログラムは書ける
・解き方(アルゴリズム)はわかるが、プログラムが書けん
・どっちもわからん ← 2週間も何を考えたの?


163ポイント を手に入れた。

Name: ダメな子  ..ぴよぴよ(613ポイント)   Date: 2008/01/11(金) 15:19   No:13304     
Title: 御指摘ありがとうございます。    
課題の1は解けたのですが2で最小二乗法が出てきてどの様な考え方でプログラムを作成すればいいのか解りません。
1はこんな感じで考えました。
#include <stdio.h>
#include <stdlib.h>
#define NUM 10


int main(void)
{
double x, y;
int a, b, i;
char filename[20]="line.dat";

FILE *fp;

printf("係数 a >");
scanf_s("%lf", &a);
printf("係数 b >");
scanf_s("%lf", &b);
printf("ファイル名>");
scanf_s("%s", filename);

srand(130);

if ((fp = fopen("line.dat", "w")) == NULL) {
printf("Can't open file.\n");
exit(1);
}

for (i = 0; i < NUM; i++) {
x = i;
y = (double)(a * i + b);
y += (double)(rand()%(int)(2.0*3.0/0.001))*0.001-3.0;
fprintf(fp, "%d %lf\n", i, y);

}

fclose(fp);



return 0;
}


2倍のポイントを手に入れた! 546ポイント を手に入れた。

Name: 通りすがり  ..初心者(6,353ポイント)   Date: 2008/01/11(金) 15:59   No:13308     
Title: Re:御指摘ありがとうございます。    
最小二乗法のC言語サンプルなんていくらでも出てきそうですが、考え方の参考として。

http://szksrv.isc.chubu.ac.jp/lms/lms1.html
http://www5d.biglobe.ne.jp/~tomoya03/shtml/algorithm/Linear.htm


10ポイント を手に入れた。

Name: C言語マスター  ..ぴよぴよ(7ポイント)   Date: 2008/01/11(金) 16:55   No:13312     
Title: Re:御指摘ありがとうございます。    
俺もよくわからんのや。。。

7ポイント を手に入れた。



Name: RARA  ..ぴよぴよ(45ポイント)   Date: 2008/01/11(金) 06:14   No:13291       
Title: 入門編なんですが    
はじめまして
現在ここのサイトさんの入門編をやってみたのですが、線や画像などが一瞬しか表示されません
具体的には、何かキーを押したときに、ウインドウが消える直前に表示される状態です
WaitKeyは指定された場所に書いてあるのですが、なぜこうなるのでしょうか?


45ポイント を手に入れた。


Name: やそ  ..初心者(8,524ポイント)   Date: 2008/01/11(金) 09:35   No:13294     
Title: Re:入門編なんですが    
まずはルールに則り、OSや使用コンパイラなどの環境と、
再現性のある最小構成のソースコードを提示してくださいませ。


2倍のポイントを手に入れた! 124ポイント を手に入れた。

Name: RARA  ..ぴよぴよ(457ポイント)   Date: 2008/01/11(金) 13:21   No:13300     
Title: Re:入門編なんですが    
OSはVistaで、VS2005アカデミック版を使用しています。
入門編のどのソースコードをコピーしても上に書いたような状態になってしまいます^^;
途中からですが例えば下のようなコードです。
この場合だと、実行しても真黒な画面で、何かキーを押すと図形が一瞬表示されると同時にウインドウが消えます
解決方法を教えてください。

    int White,Red,G_Blue;

White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
Red = GetColor( 255 , 0 , 0 ) ; // 赤色の値を取得
G_Blue = GetColor( 0 , 255 , 255 ) ; // 緑と青の混合色の値を取得

DrawLine ( 10 , 10 , 630 , 10 , White ) ; // 線を描画
DrawBox ( 10 , 50 , 310 , 100 , G_Blue , FALSE) ; // 四角形を描画
DrawBox ( 10 , 150 , 310 , 200 , G_Blue , TRUE ) ; // 四角形を描画(塗りつぶし)
DrawCircle( 500 , 300 , 100 , Red , TRUE) ; // 円を描画(塗りつぶし)


WaitKey() ; // キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}


412ポイント を手に入れた。

Name: バグ  ..比類無きプログラマー(69,876ポイント)   Date: 2008/01/11(金) 15:38   No:13305     
Title: Re:入門編なんですが    
ためしにDrawCircle関数とWaitKey関数の間に

ProcessMessage();

と書き足してみてください。ひょっとしたら動くかもしれません。


56ポイント を手に入れた。

Name: ネル  ..ぴよぴよ(6ポイント)   Date: 2008/01/11(金) 15:43   No:13306     
Title: Re:入門編なんですが    
わざわざ有難うございました!

6ポイント を手に入れた。

Name: RARA  ..ぴよぴよ(504ポイント)   Date: 2008/01/11(金) 16:12   No:13309     
Title: Re:入門編なんですが    
解答ありがとうございます!
ですが
ProcessMessage();
を書き足してみましたが、変化はありませんでした…
これらの図形は本来、何かキーを押す前に表示されてるんですよね…?


47ポイント を手に入れた。



Name: 鳥取砂丘  ..ぴよぴよ(593ポイント)   Date: 2008/01/08(火) 14:50   No:13175       
Title: フーリエ変換プログラムについて    
縦軸を振幅(出力電圧)として横軸を時間軸から周波数軸に変化させたいので、フーリエ変換プログラムを作ってみたいのですが・・・


#include <stdio.h>
#include <math.h>

#define PI 3.14
#define MAX 64

int main (void)
{
double x[MAX],y[MAX],value;
int i,j;
double tmp_x[MAX],tmp_y[MAX];
FILE *fp,*fp2,*fp3;



/* ファイル読込み */
if((fp = fopen("text01.txt","r")) == NULL){
return(-1);
}
if((fp2=fopen("outdate.txt","w")) == NULL){ ← 出力電圧
return(-1);
}
if((fp3=fopen("syuuhasu.txt","w")) == NULL){  ← 周波数
return(-1);
}

for(i=0; i<MAX; i++){
fscanf(fp,"%lf\n",&value);
x[i] = value; /* x :実数成分 */
y[i] = 0; /* y :虚数成分 */
}


/* データを一旦コピー */
for (i=0; i<MAX; i++) {
tmp_x[i] = x[i];
tmp_y[i] = y[i];
}

for (i=0; i<MAX; i++) {
x[i] = 0;
y[i] = 0;
for (j=0; j<MAX; j++) {
x[i] += tmp_x[j]*cos(2*PI*i*j/MAX) + tmp_y[j]*sin(2*PI*i*j/MAX);
y[i] += -tmp_x[j]*sin(2*PI*i*j/MAX) + tmp_y[j]*cos(2*PI*i*j/MAX);
}
/* DFT */

for(i=0; i<MAX; i++){

fprintf(fp2,"%5.5f\n",x[i]); ← これが出力電圧なはず?
}
for(i=0; i<MAX; i++){

fprintf(fp3,"%5.5f\n", sqrt(x[i]*x[i]+y[i]*y[i])*2/MAX); ←これで時間を周波数にできる?
}

}
fclose(fp);
fclose(fp2);
fclose(fp3);

return(0);

}

 

式は合っているはずなのですが周波数がこれでOKなのかが疑問です。

気になる点があればドシドシアドバイスください。


593ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(477,328ポイント)   Date: 2008/01/08(火) 22:32   No:13189     
Title: Re:フーリエ変換プログラムについて    
計算式については見ていないのですが、二重ループの中で両方iが使われているからおかしくないですか?
実際iはMAXになってぬけているので、外側のループは一度しか通っていないのではないかと思います。

しかし見た感じ二重ループする必要がなさそうなので、、括弧の対応が間違ってるんでしょうか?


93ポイント を手に入れた。

Name: 鳥取砂丘  ..ぴよぴよ(893ポイント)   Date: 2008/01/09(水) 01:36   No:13206     
Title: Re:フーリエ変換プログラムについて    
この部分でしょうか?

for (i=0; i<MAX; i++) {
x[i] = 0;
y[i] = 0;
for (j=0; j<MAX; j++) {
x[i] += tmp_x[j]*cos(2*PI*i*j/MAX) + tmp_y[j]*sin(2*PI*i*j/MAX);
y[i] += -tmp_x[j]*sin(2*PI*i*j/MAX) + tmp_y[j]*cos(2*PI*i*j/MAX);
}

これを

for (i=0; i<MAX; i++) {
x[i] = 0;
y[i] = 0;
     }

for (j=0; j<MAX; j++) {
x[i] += tmp_x[j]*cos(2*PI*i*j/MAX) + tmp_y[j]*sin(2*PI*i*j/MAX);
y[i] += -tmp_x[j]*sin(2*PI*i*j/MAX) + tmp_y[j]*cos(2*PI*i*j/MAX);
}

このようにするということですか?


300ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(477,966ポイント)   Date: 2008/01/09(水) 02:13   No:13208     
Title: Re:フーリエ変換プログラムについて    
計算式を知らないのでなんともいえませんが、そこでiのカウンタのfor文を閉じないと構文的におかしくないでしょうか?
後、memset関数を使えばfor文を使わなくても初期化できますよ。


68ポイント を落としてしまった。

Name: 鳥取砂丘  ..ぴよぴよ(931ポイント)   Date: 2008/01/09(水) 02:27   No:13210     
Title: Re:フーリエ変換プログラムについて    
あまりCを理解してないのでforしかわからないです。すいません・・・。

とりあえずこれでやってみようと思います。


38ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(478,372ポイント)   Date: 2008/01/09(水) 07:37   No:13214     
Title: Re:フーリエ変換プログラムについて    
memsetは特に難しい関数じゃないので覚えておくと便利ですよ。
memsetは

・第一引数の先頭アドレスから
・第二引数の値で
・第三引数の量だけ埋める

という関数です。
memsetの仕様を見てみると
http://www9.plala.or.jp/sgwr-t/lib/memset.html


void *memset(void *buf, int ch, size_t n);

void *buf : セット先のメモリブロック
int ch  : セットする文字
size_t n : セットバイト数


と書いてありますよね。
第一引数に初期化したい配列名を書きます。2番目に何の値で初期化したいかその値を、3番目にその量を書きますから、今回の場合では
xを0で初期化して、その量はdouble型のサイズMAX分なのでこうなります。

memset(x,0,sizeof(double)*MAX);

別にforで初期化してもいいですけど、今回のようにループがあちこちあると見にくいような場合にはオススメです。


275ポイント を手に入れた。

Name: しっぽ  ..初心者(8,744ポイント)   Date: 2008/01/09(水) 23:01   No:13239     
Title: Re:フーリエ変換プログラムについて    
> fprintf(fp2,"%5.5f\n",x[i]); ← これが出力電圧なはず?
違います。電圧スペクトルの実部です。

> fprintf(fp3,"%5.5f\n", sqrt(x[i]*x[i]+y[i]*y[i])*2/MAX); ←これで時間を周波数にできる?
これが、電圧スペクトルの振幅なのかという意味の質問ならYES(*2が必要かどうかは知りません)。

蛇足
> x[i] += tmp_x[j]*cos(2*PI*i*j/MAX) + tmp_y[j]*sin(2*PI*i*j/MAX);
> y[i] += -tmp_x[j]*sin(2*PI*i*j/MAX) + tmp_y[j]*cos(2*PI*i*j/MAX);
x[i]、y[i]はMAXで割る必要があるのでは。


207ポイント を手に入れた。

Name: しっぽ  ..初心者(8,843ポイント)   Date: 2008/01/09(水) 23:09   No:13240     
Title: Re:フーリエ変換プログラムについて    
訂正

sqrt(x[i]*x[i]+y[i]*y[i])*2/MAX
でMAXで割っているので、下記は撤回します。

> x[i] += tmp_x[j]*cos(2*PI*i*j/MAX) + tmp_y[j]*sin(2*PI*i*j/MAX);
> y[i] += -tmp_x[j]*sin(2*PI*i*j/MAX) + tmp_y[j]*cos(2*PI*i*j/MAX);
x[i]、y[i]はMAXで割る必要があるのでは。



99ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..熟練のプログラマー(49,786ポイント)   Date: 2008/01/09(水) 23:53   No:13243     
Title: Re:フーリエ変換プログラムについて    
->管理人さん

double型変数の配列にmemset()は危険だと思います。全ビット0の状態が必ずしもdouble型の0になるとは限らないようです。


51ポイント を手に入れた。

Name: 鳥取砂丘  ..かけだし(1,312ポイント)   Date: 2008/01/10(木) 01:25   No:13245     
Title: Re:フーリエ変換プログラムについて    
ということは・・・

for(i=0; i<MAX; i++){
fscanf(fp,"%lf\n",&value);
x[i] = value; /* x :実数成分 */
y[i] = 0; /* y :虚数成分 */
}


/* データを一旦コピー */
for (i=0; i<MAX; i++) {
tmp_x[i] = x[i];
tmp_y[i] = y[i];
}

for (i=0; i<MAX; i++) {
x[i] = 0;
y[i] = 0;
for (j=0; j<MAX; j++) {
x[i]/MAX += tmp_x[j]*cos(2*PI*i*j/MAX) + tmp_y[j]*sin(2*PI*i*j/MAX);←改善
y[i]/MAX += -tmp_x[j]*sin(2*PI*i*j/MAX) + tmp_y[j]*cos(2*PI*i*j/MAX);←改善
       }
/* DFT */

for(i=0; i<MAX; i++){

fprintf(fp2,"%.5f\n",sqrt(x[i]*x[i]+y[i]*y[i])*2/MAX); ← これが出力?
}
for(i=0; i<MAX; i++){

fprintf(fp3,"%.5f\n", (double)i/100);←サンプリング件数/サンプリング周波数=100から、これ                         が周波数?
}

といった感じにすればいいのでしょうか?

二重ループの問題を指摘されたりもしましたがその点も改善すべきでしょうか?(管理人さんの指摘より)


381ポイント を手に入れた。

Name: しっぽ  ..中級者(9,102ポイント)   Date: 2008/01/11(金) 00:51   No:13289     
Title: Re:フーリエ変換プログラムについて    
> x[i]/MAX += tmp_x[j]*cos(2*PI*i*j/MAX) + tmp_y[j]*sin(2*PI*i*j/MAX);←改善
> y[i]/MAX += -tmp_x[j]*sin(2*PI*i*j/MAX) + tmp_y[j]*cos(2*PI*i*j/MAX);←改善
ゴメンなさい。私が変なことを言ったため、この部分はペケです。
元のままでいいです(スペクトルを書き込む段階でMAXで除しているから)。

> fprintf(fp2,"%.5f\n",sqrt(x[i]*x[i]+y[i]*y[i])*2/MAX); ← これが出力?
電圧スペクトルの大きさだけ(位相は無視)でよいなら、YES。

> fprintf(fp3,"%.5f\n", (double)i/100);←サンプリング件数/サンプリング周波数=100から、
> これが周波数?
時間軸でのサンプリング周期=1(サンプリング周波数=1)かつサンプリング件数=100という意味なら、
YES。

> 二重ループの問題を指摘されたりもしましたがその点も改善すべきでしょうか?(管理人さんの指摘より)
変更の必要ないです。好みの領域の問題だと思います。



259ポイント を手に入れた。

Name: 鳥取砂丘  ..かけだし(1,359ポイント)   Date: 2008/01/11(金) 14:38   No:13301 解決!     
Title: Re:フーリエ変換プログラムについて    
ありがとうございました。

うまくできたような感じです。

みなさんありがとうございました!


47ポイント を手に入れた。



Name: HEAVEN  ..ぴよぴよ(323ポイント)   Date: 2008/01/11(金) 12:38   No:13298       
Title: 画面のリセット    
質問です。

include<stdio.h>
void main(void){
puts("abc");
}

と入力して実行した場合「abc」と表示されますよね?
その後、画面を一度リセットして画面に「CBA」と表示させたい場合、どのようにすれば良いのでしょうか。
分かりづらくてすみません、返答お願いします。


132ポイント を手に入れた。


Name: たかぎ [URL]  ..上級者(22,389ポイント)   Date: 2008/01/11(金) 12:47   No:13299     
Title: Re:画面のリセット    
> と入力して実行した場合「abc」と表示されますよね?

環境しだいです。
少なくとも、

> void main(void){

というのは動作が未定義になる可能性があります。
これでまともに動くことが保証されている環境は限られています。

> その後、画面を一度リセットして画面に「CBA」と表示させたい場合、どのようにすれば良いのでしょうか。

画面をリセットするというのが何を意味しているのか分かりませんが、おそらく一般的な方法は無いと思います。


99ポイント を手に入れた。



Name: tirimu  ..ぴよぴよ(174ポイント)   Date: 2008/01/07(月) 20:35   No:13128       
Title: 見取算    
少し前に学校でC言語を習い始めました。そして本日学校で見取算(フラッシュ暗算)の課題が出ました。

内容はどんな方法を使ってもいいので作成しなさいとの事です。

一応「TmEditCR」を使い挑戦してみました。

乱数で文字を表示、その後出た数字を足してその答えを当てるのようなものです。

しかし\rを使って前に出た数字を上書き上書きで進みたいのですが普通に作ると処理が速いので画面を出した瞬間に答えを求められてしまいます。

出来れば上書きスピードを決めれて目視できるようにしたいのですが良い方法はありますでしょうか?

もしこれならいいのが出来るというのがありましたらそれをご伝授ください。

よろしくお願いします。


174ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(475,043ポイント)   Date: 2008/01/08(火) 00:41   No:13149     
Title: Re:見取算    
windows.h
がインクルードできる環境ならばsleep関数で時間を止められます。
sleep(1000);
を書けば1000ミリ秒、つまり1秒待つ事になります。
1.2秒待たせたければ
sleep(1200);
とかけばよいでしょう。


75ポイント を落としてしまった。

Name: 管理人 [URL]  ..伝説のハッカー(475,243ポイント)   Date: 2008/01/08(火) 00:50   No:13150     
Title: Re:見取算    
作ってみたので、実行して望んだものであるか確認してみてもらえますか?

要は


printf("%d\r",rand()%1000);
Sleep(1000);

を繰り返せばいいわけです。
ただ、連続して表示すると、2回連続で表示するとわかりにくいので、
以下のように何もないものを上書きして一回消した方がいいです。




#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>

int main(){
int n,sum=0,r;
srand((unsigned)time(NULL));

for(int i=0;i<3;i++){
printf("%d秒前\r",3-i);
Sleep(1000);
}

for(int i=0;i<5;i++){
r=rand()%10;
printf("%d \r",r);
sum+=r;
Sleep(900);
printf(" \r");
Sleep(100);
}

printf("答えを入力してください。\n");
scanf("%d",&n);

if(sum==n)
printf("正解!!\n\n");
else
printf("不正解。答えは%dです。\n\n",sum);
}

 


200ポイント を手に入れた。

Name: tirimu  ..ぴよぴよ(193ポイント)   Date: 2008/01/08(火) 15:13   No:13177 解決!     
Title: Re:見取算    
少し構文エラーが出ましたが何とかなりました。

とても勉強になりました。

本当にありがとうございます。


19ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(475,625ポイント)   Date: 2008/01/08(火) 21:39   No:13182     
Title: Re:見取算    
エラーが出ました?
scanfは使わないほうがいいよという警告ではなく、どこかおかしかったでしょうか?


14ポイント を手に入れた。

Name: box  ..ハッカー(104,067ポイント)   Date: 2008/01/08(火) 21:56   No:13183     
Title: Re:見取算    

> for(int i=0;i<3;i++){

C++ではコンパイルできますが、Cではコンパイルできない、
ということではないでしょうか。



74ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(476,980ポイント)   Date: 2008/01/08(火) 22:16   No:13185     
Title: Re:見取算    
なるほど、そうでしたね。
Cのコンパイラだとエラーになってしまいますね。


39ポイント を手に入れた。

Name: parapara  ..上級者(15,849ポイント)   Date: 2008/01/09(水) 20:26   No:13235     
Title: Re:見取算    
for(1;2;3)文の1の文って、確か変数宣言出来ないはずですよね?
C++だと宣言できるんでしょうか?
前にそこの所でつまづいたもので、教えていただければ幸いです。