C言語何でも質問掲示板


必ずお読み下さい → 規約と注意事項  アンケートはこちら  エラーで投稿できない方はこちら  過去ログ検索はこちら

 
   ソート   
     ・[33465] kazuoni 
     ・[33499] ビギナー 
     ・[33504] kazuoni 
     ・[33520] Hermit 
   vista BCC DX   
     ・[33517] 七誌 
   曲線の描画について   
     ・[33220] lbfuvab 
     ・[33303] ゆうき 
     ・[33315] lbfuvab 
     ・[33322] ゆうき 
     ・[33329] lbfuvab 
     ・[33357] ゆうき 
     ・[33408] たいちう 
     ・[33476] ゆうき 
     ・[33516] たいちう 
   変数になぜかおかしな ....   
     ・[33459] N 
     ・[33461] kazuoni 
     ・[33508] N 
     ・[33509] N 
     ・[33510] N 
     ・[33512] kazuoni 
     ・[33513] N 
     ・[33514] N 
     ・[33515] Ma 
   このエラーはどうすれ ....   
     ・[33263] たかぎ 
     ・[33492] situmon 
   ファイルへの書き込み   
     ・[33487] non 
     ・[33488] pooka 
     ・[33489] ほのか 
   リダイレクト   
     ・[33478] 研修生 
     ・[33480] toyo 
     ・[33481] 研修生 
     ・[33483] toyo 
     ・[33484] 研修生 
     ・[33486] 研修生 
   3次元三角形の透視投影 ....   
   ネット上にスコア記録   
     ・[33467] toyo 
     ・[33468] Ma 
     ・[33470] バグ 
     ・[33471] Ma 
     ・[33472] たかぎ 
     ・[33473] Ma 
   普通のC言語での質問 ....   
     ・[33448] toyo 
     ・[33450] ファウスト 
     ・[33451] MNS 
     ・[33452] ファウスト 
     ・[33453] Dixq (管理人) 
     ・[33454] ファウスト 
     ・[33455] box 
     ・[33456] MNS 
     ・[33457] ファウスト 
   じゃんけんゲームの勝 ....   
     ・[33324] MNS 
     ・[33325] さが 
     ・[33326] box 
     ・[33352] じゃが 
     ・[33374] TKOZ 
     ・[33375] 御津凪 
     ・[33444] じゃが 
   ファイルを分割してみ ....   
     ・[33411] N 
     ・[33412] N 
     ・[33415] Mist 
     ・[33441] N 
   単語出力   
     ・[33425] Mist 
     ・[33426] 研修生 
     ・[33428] Mist 
     ・[33429] non 
     ・[33430] 研修生 
     ・[33431] Blue 
     ・[33432] 研修生 
     ・[33433] non 
     ・[33435] 研修生 
     ・[33437] non 
     ・[33440] 初級者 
   三角形(ポリゴン)を ....   
     ・[33197] Justy 
     ・[33200] TKOZ 
     ・[33313] TKOZ 
     ・[33320] Justy 
     ・[33436] TKOZ 
   経過時間   
     ・[33420] non 
     ・[33421] POP 
     ・[33422] Mist 
     ・[33423] non 
     ・[33427] やそ 
     ・[33434] TKOZ 
   住所録プログラムで…   
     ・[33372] Mist 
     ・[33405] pooka 
     ・[33414] ほのか 
     ・[33417] pooka 
     ・[33418] ほのか 
   画像処理について   
     ・[33406] fumi 
     ・[33416] s-rush 
   数独を解けるか解けな ....   
     ・[33008] non 
     ・[33014] R 
     ・[33018] non 
     ・[33119] R 
     ・[33413] R 
   無題   
     ・[33404] ベリ工 
   FPSの固定   
     ・[33067] Justy 
     ・[33068] ゲーム創!! 
     ・[33321] ゲーム創!! 
     ・[33330] Justy 
     ・[33335] ゲーム創!! 
     ・[33354] Justy 
     ・[33362] ゲーム創!!  
     ・[33366] Justy 
     ・[33400] ゲーム創!!  
   連続した文字列の位置   
     ・[33378] GPGA 
     ・[33379] Mist 
     ・[33381] 研修生 
     ・[33382] 研修生 
     ・[33383] 御津凪 
     ・[33384] 研修生 
     ・[33385] Mist 
     ・[33386] Mist 
     ・[33387] 初級者 
     ・[33388] 研修生 
     ・[33390] 御津凪 
     ・[33391] 研修生 
     ・[33392] 研修生 
     ・[33393] 初級者 
     ・[33394] 研修生 
     ・[33398] 初級者 
   myShape.hというヘッダ ....   
     ・[33396] 御津凪 
     ・[33397] 初心者 
   フルパワー時のアイテ ....   
     ・[33376] 御津凪 
     ・[33389] yu 
   今日習ったばかりなの ....   
     ・[33360] クロマ 
     ・[33363] たかぎ 
     ・[33365] クロマ 
     ・[33369] toyo 
     ・[33380] たかぎ 
   文字の表示が・・・   
     ・[33291] Justy 
     ・[33353] yasya 
     ・[33367] Justy 
     ・[33373] yasya 
   敵の画像を進行方向に ....   
     ・[33337] MNS 
     ・[33338] ひよこ 
     ・[33351] MNS 
     ・[33355] ひよこ 
     ・[33356] ひよこ 
     ・[33358] MNS 
     ・[33364] ひよこ 
   文字列を折りたたむ   
     ・[33341] tutor 
     ・[33342] tutor 
     ・[33343] 研修生 
     ・[33344] 通りすがり 
     ・[33345] tutor 
     ・[33346] 通りすがり 
     ・[33349] 研修生 
   プログラムの説明   
     ・[33316] 御津凪 
     ・[33317] lbfuvab 
     ・[33339] 研修生 
     ・[33347] 通りすがり 
   プロンプトで文字をゆ ....   
     ・[33286] バグ 
     ・[33287] やっくん 
     ・[33296] toyo 
     ・[33298] バグ 
     ・[33311] やっくん 
   空白削除   
     ・[33304] Blue 
     ・[33305] Mato 
     ・[33306] tutor 
     ・[33307] tutor 
     ・[33308] 研修生 
   無題   
     ・[33281] 餅 
     ・[33282] たかぎ 
     ・[33283] 餅 
     ・[33290] たかぎ 
     ・[33301] non 
   サンプルプログラム   
     ・[33216] Mist 
     ・[33217] 初級者 
     ・[33218] Mist 
     ・[33219] Kou 
     ・[33297] 研修生 
     ・[33300] 初級者 
   コピーコンストラクタ ....   
     ・[33274] たかぎ 
     ・[33277] 大工 
     ・[33278] たかぎ 
     ・[33279] 大工 
   音声処理のプログラム   
     ・[33255] Justy 
     ・[33265] s-rush 
     ・[33267] Justy 
     ・[33269] s-rush 
     ・[33272] Justy 
     ・[33276] s-rush 
   無題   
     ・[33246] MNS 
     ・[33251] たかぎ 
     ・[33271] s-rush 
   GetHitKeyStateAll関数 ....   
     ・[33270] s-rush 
   12.画像を動かすにて   
     ・[33250] 狼太郎 
     ・[33254] 通りすがり 
     ・[33266] 256bit 
   コンパイル時にmainフ ....   
     ・[33257] たかぎ 
     ・[33259] やっくん 
     ・[33260] やっくん 
   ProcessMessage関数に ....   
     ・[33258] Justy 
   弾幕について   
     ・[33231] あ〜る 
     ・[33232] Dixq (管理人) 
     ・[33235] あ〜る 
     ・[33237] Dixq (管理人) 
     ・[33239] あ〜る 
     ・[33247] あ〜る 
   100桁位の数の計算   
     ・[33243] たかぎ 
     ・[33244] CUSER 
   次の言語は?   
     ・[33203] バグ 
     ・[33225] たかぎ 
     ・[33234] Dixq (管理人) 
   龍神録プログラミング ....   
     ・[33170] ゆー 
     ・[33174] 通りすがり 
     ・[33181] dic 
     ・[33226] ゆー 
     ・[33233] Dixq (管理人) 
   初期化   
     ・[33207] 初級者 
     ・[33208] dic 
     ・[33209] 研修生 
     ・[33210] 初級者 
     ・[33211] 研修生 
     ・[33212] dic 
     ・[33213] Mist 
     ・[33214] toyo 
     ・[33230] hss12 
   無題   
     ・[33229] hss12 
   みすちー再び←   
     ・[32947] BEMANI 
     ・[32960] yu 
     ・[33205] 零裂虚識 
   tolower   
     ・[33188] Blue 
     ・[33189] 研修生 
     ・[33190] Blue 
     ・[33191] 研修生 
     ・[33192] Blue 
     ・[33193] 研修生 
     ・[33195] non 
     ・[33202] 研修生 
   アプレット   
     ・[33177] Koot 
     ・[33199] Koot 
   バグ   
     ・[33171] Justy 
     ・[33173] ちゅん 
     ・[33175] Justy 
     ・[33178] ちゅん 
     ・[33196] Justy 
     ・[33198] ちゅん 
   プロジェクトのダウン ....   
     ・[32995] さが 
     ・[33100] 無 
     ・[33169] NakanotyayaNo3 
     ・[33184] 新人 
     ・[33185] 新人 
     ・[33194] 無 
   変換指定子の書式   
     ・[33155] たかぎ 
     ・[33179] チルチル 
   STLのリストについて   
     ・[33166] たかぎ 
     ・[33168] alice 
   ナンプレ(数独)の解 ....   
     ・[33161] たいちう 
     ・[33163] TG 
   龍神録プログラミング ....   
     ・[33080] situmon 
     ・[33093] おかし 
     ・[33096] situmon 
     ・[33101] おかし 
     ・[33103] yu 
     ・[33120] おかし 
     ・[33145] pooka 
     ・[33156] おかし 
     ・[33157] pooka 
     ・[33158] おかし 
     ・[33159] pooka 
     ・[33162] おかし 

Name: ビギナー  ..ぴよぴよ(674ポイント)   Date: 2009/05/15(金) 01:58   No:33464       
Title: ソート    
こんばんは、初心者です。
ソートについてです。
書いてある説明はわかるのですが、いざプログラミングしてみると
正直、どのような処理が行われているのかわかりません。
下記は、手伝っていただき、出来たものです。

よろしければ、どのような処理が行われているのかコメントしていただけませんか?

//~が行われている

など簡単でかまいません。
また、お時間がありましたら、詳しい解説をお願い致します。


#include <stdio.h>

#include <string.h>

#define N 10

void main(void)
{
static struct girl {
char *name;
int year;
} *t,*p[N],a[]={"Ann",18,"Rolla",19,"Nancy",16,"Eluza",17,"Juliet",18,
"Machilda",20,"Emy",15,"Candy",16,"Ema",17,"Mari",18};
char *min;
int s, i, j;

for(i=0;i<N;i++)
p[i]=&a[i];

for(i=0;i<N-1;i++){
min=p[i]->name;
s=i;
for(j=i+1;j<N;j++){
if (strcmp(p[j]->name,min)<0){
min=p[j]->name;
s=j;
}
}
t=p[i]; p[i]=p[s]; p[s]=t;
}

for(i=0;i<N;i++)
printf("%10s%4d\n",p[i]->name,p[i]->year);
}




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


Name: kazuoni [URL]  ..比類無きプログラマー(84,101ポイント)   Date: 2009/05/15(金) 02:50   No:33465     
Title: Re:ソート    
#include <stdio.h>


#include <string.h>

#define N 10

void main(void)
{
// 構造体の定義&変数宣言
static struct girl {
char *name;
int year;
} *t,*p[N],a[]={"Ann",18,"Rolla",19,"Nancy",16,"Eluza",17,"Juliet",18,

"Machilda",20,"Emy",15,"Candy",16,"Ema",17,"Mari",18};

char *min;

int s, i, j;

// 配列aの各配列の要素のアドレスをpに代入する
// 値コピーではないので、pの要素を書き換える=aの要素を書き換える
for(i=0;i<N;i++)

p[i]=&a[i];

// pの要素を昇順もしくは降順にソートする。
// strcmpの戻り値の「0より大きいか」「0より小さいか」は文字コードに依存するので、昇順か降順かは環境依存
// 自分は降順で表示される環境が何かまでは知りませんが・・・
for(i=0;i<N-1;i++){
min=p[i]->name; // ソート対象のnameをコピー
s=i; // ソート対象のyearをコピー

for(j=i+1;j<N;j++){
// p[j]name-num(p[i]->name)<0かどうか比較
// 真ならば並びかえるために必要な情報を更新
if (strcmp(p[j]->name,min)<0){
min=p[j]->name;
s=j;
}
}

// 交換する。
// 交換しない時は、s=iなので、自分自身の内容がコピーされる。
t=p[i]; p[i]=p[s]; p[s]=t;
}

for(i=0;i<N;i++) // 出力
printf("%10s%4d\n",p[i]->name,p[i]->year);
}


ソートの詳しい解説は、バブルソートで検索してみてください。


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

Name: ビギナー  ..ぴよぴよ(778ポイント)   Date: 2009/05/15(金) 22:01   No:33499     
Title: Re:ソート    
詳しくありがとうございます。

ですが、まだ初心者の自分には難しいです^^;
ポインタは難しいと聞いてますし、理解できない自分が情けないです。

もっと詳しい解説は可能でしょうか?

お手数ですがよろしくお願いします。


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

Name: kazuoni [URL]  ..比類無きプログラマー(84,363ポイント)   Date: 2009/05/15(金) 23:04   No:33504     
Title: Re:ソート    
理解できないところを列挙してみてください。
できる限り詳しく解説します。
その際、一度自分で調べることも重要かと。
聞けばなんとなくわかる→プログラムを組む時にやっぱり同じところで躓く
ってことがありがちです(少なくとも自分はそうでした。)

自分で出来る限り、参考書またはネットのページで調べて、
それでも理解できなかったら質問っという形がベストかと思います。


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

Name: Hermit  ..上級者(22,805ポイント)   Date: 2009/05/16(土) 12:59   No:33520     
Title: Re:ソート    
//http://ja.wikipedia.org/wiki/%E9%81%B8%E6%8A%9E%E3%82%BD%E3%83%BC%E3%83%88

//選択ソート 参照
#include <stdio.h>
#include <string.h>
#define N 10
int main(void) {
static struct girl {
char *name;
int year;
} data[] = {
"Ann", 18, "Rolla", 19, "Nancy", 16, "Eluza", 17, "Juliet", 18,
"Machilda", 20, "Emy", 15, "Candy", 16, "Ema", 17, "Mari", 18};
int i, j;

for (i = 0; i < N - 1; i++) {
int min = i;
struct girl swapTmp;
for (j = i + 1; j < N; j++)
if (strcmp(data[j].name, data[min].name) < 0)
min = j;
swapTmp = data[i];
data[i] = data[min];
data[min] = swapTmp;
}
for (i = 0; i < N; i++)
printf("%10s%4d\n", data[i].name, data[i].year);
}
ソートにあまり関係なさそうなところを削ってみました。


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



Name: kuruse  ..ぴよぴよ(6ポイント)   Date: 2009/05/16(土) 01:43   No:33511       
Title: vista BCC DX    
はじめまして。
vista、BCC、DXという組み合わせで使いたいのですが、無理でしょうか。
すでにウィンドウを表示するサンプルで強制終了されてしまいました。


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


Name: 七誌  ..かけだし(1,829ポイント)   Date: 2009/05/16(土) 10:50   No:33517     
Title: Re:vista BCC DX    
Vista,BCC(BCC Developer),DX(DXライブラリ)を使用していますが、機能しています。

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



Name: ゆうき  ..ぴよぴよ(155ポイント)   Date: 2009/05/08(金) 11:40   No:33204       
Title: 曲線の描画について    
初めまして、C言語初心者の「ゆうき」と申します。

お仕事で複数の円弧を接続して描画させるというプログラムを考えています。
既知な値は、1)円弧の長さ 2)円弧の半径 3)描画開始点のみです。

現在「Borand C++」と「BCC developer」でプログラムの練習中です。
いろいろと調べ、「GrWinグラフィックス・ライブラリ」を入れてみたのですが、
半径を指定して描画することができないようで、何か良い方法が無いかと考えております。

詳しくは、添付ファイルを確認して頂きたいのですが、そもそもC言語でこのようなことが可能なのでしょうか?
※実際の数値も記入しましたので、実際にプログラムしていただけると幸いです。

よろしくお願いいたします。


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


Name: lbfuvab  ..上級者(20,373ポイント)   Date: 2009/05/08(金) 20:17   No:33220     
Title: Re:曲線の描画について    
ん〜、手順的には
区間A,Bの開始点をa,bとすると
@a,bから半径分はなれている点を求める(二つ)
Aどちらに凸かで中心点を確定
B円が外接する正方形の頂点を出す(二つ)。
Caの角度を出す(x軸方向との)
Dbの角度を出す(aとの)

でGWarc使って頑張ってください。


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

Name: ゆうき  ..ぴよぴよ(534ポイント)   Date: 2009/05/11(月) 15:03   No:33303     
Title: Re:曲線の描画について    
lbfuvabさん、返信ありがとうございます。

早速GWarcを使って円弧の接続を行いました。
しかしながら、GWarcでは円弧の描画だけで、
後々の両端直線との距離を計算できないことが分かりました。
※勉強にはなりました・・・。

そこで、円弧上の座標を0.1mm刻みで描画していくGWsetpxlを使って
座標の取得と描画を行うことにしました。

1区間中の描画は繰り返し(while 〜区間末端まで)を使って、
区間描画が済むと次の区間に移るようにし、
連続した円弧の描画ができるようになったのですが、
変数が常に更新されているので、任意座標の再取得ができませんでした。

そこで、座標が更新される前にどこかにメモ(プログラム中の変数orCSVに書き込み)して
最後に任意座標を読み込むようなロジックを組み込みたいのですが、
そのようなことは可能でしょうか?

アドバイスいただけると幸いです。


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

Name: lbfuvab  ..上級者(20,418ポイント)   Date: 2009/05/11(月) 18:39   No:33315     
Title: Re:曲線の描画について    
直線距離を出すならΔx^2 + Δy^2 = d^2で(Δxはx座標の距離、Δyはy座標での距離、dは距離)
弧の長さならr * θで出ませんか?(rは半径、θは角度)


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

Name: ゆうき  ..かけだし(1,011ポイント)   Date: 2009/05/11(月) 21:58   No:33322     
Title: Re:曲線の描画について    
lbfuvabさん、毎回返信くださりありがとうございます。

ええと、正確に何をしたいのかと言いますと、

1) 円弧が複数連なった曲線があり、
2) その両端(描画開始点と描画終了点)を直線で結びます。
3) 任意に曲線状の点を選び、
4) その点から直線までの距離(垂線)を計算します。

例えば、ファイル中のパラメータの場合50mm×8区間で
全長400mmのクネクネした曲線が描けます。
そこから、描画開始後200mmの点だったり167.5mmの点だったりと任意に選んで
両端を結ぶ直線はどのくらい離れているかを計算したいのです。

任意の点は曲線描画後に選びたいので、全座標(0.1mm刻みで4000点)を
覚えておく必要があるのではと思います。

※実はこないだのGWにC言語の本を買って始めたばかりですので、
どのような命令があって、どのようなことができるか分からない状態です。
こういう命令で外部ファイルに書き込みができるよとか、
外部ファイルからデータを読み込むにはこうしたらいいよとか、
実際のプログラムでお教えいただけると良いのですが・・・。


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

Name: lbfuvab  ..上級者(20,538ポイント)   Date: 2009/05/12(火) 00:18   No:33329     
Title: Re:曲線の描画について    
円弧の長さは一定なら、
~~~~~~~~~~~~~~~~~
@どの二点間(AB、BC、CD等)にするか乱数で決定する。
A選んだ二点上で(弧の長さ) = (半径) * (角度)を使い、どの点にするか決定する。

で任意の点(すべての点で可能性は等しい)を選べると思いますが、やはりややこしいでしょうか?


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

Name: ゆうき  ..かけだし(1,036ポイント)   Date: 2009/05/12(火) 21:42   No:33357     
Title: Re:曲線の描画について    
lbfuvabさん、すみません、アドバイスの内容が理解できませんでした。
円弧の描画後、特定の必要座標のみを再度求め直すということでしょうか?

今のところ考えているのは以下の方法で、任意座標の取得が必須となります。

曲線を描画した時点で変数内に残っているのは
1)描画開始点 Xs=0, Ys=0
2)描画終了点 Xe, Ye
のみ。

そこから、2点を結ぶ直線の式を求め、それに直交する傾き(逆数×-1)を持つ
任意座標(Xc,Yc)を通る直線式との連立方程式で、交点座標(Xa,Ya)を求め、
(Xc,Yc)と(Xa,Ya)から距離を求めるという方法です。

そもそも問題そのものがややこしいぞ、というご指摘を受けそうですね・・・。


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

Name: たいちう  ..プログラマー(27,895ポイント)   Date: 2009/05/14(木) 00:28   No:33408     
Title: Re:曲線の描画について    
仕事でやっているのにプログラムしてくれ、というのはどうかと思うよ。
面白そうだったので作ったけど、見ての通りGrWinは使っていないし、色々手抜き。
動作確認は「猫でもわかる…」のSDKの部分とかを参考にしてほしい。

void Draw(HDC hdc)

{
int data[] = { -93, -61, 71, 80, 77, 78, -43, -69 };
double x0 = 0, y0 = 0, angle = 0; // 初期値(原点、右向き)
const double pi = 3; // 若さをアピール

for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++) {
// データの分解
int flag = (data[i]) > 0 ? 1 : -1;
int r = abs(data[i]);

// 円の中心座標
double cx = x0 + flag * r * cos(angle + pi / 2);
double cy = y0 + flag * r * sin(angle + pi / 2);

// 中心から見た始点と終点の角度
double d0 = angle - flag * pi / 2;
double d1 = d0 + flag * 50. / r;

// 座標変換
int cx_ = (int)(200 + cx + 0.5);
int cy_ = (int)(300 - cy + 0.5);
int sx_ = (int)(cx_ + r * cos(d0) + 0.5);
int sy_ = (int)(cy_ - r * sin(d0) + 0.5);
int ex_ = (int)(cx_ + r * cos(d1) + 0.5);
int ey_ = (int)(cy_ - r * sin(d1) + 0.5);

// 描画
if (flag > 0)
::Arc(hdc, cx_ - r, cy_ - r, cx_ + r, cy_ + r, sx_, sy_, ex_, ey_);
else
::Arc(hdc, cx_ - r, cy_ - r, cx_ + r, cy_ + r, ex_, ey_, sx_, sy_);

// 始点の更新
x0 = cx + r * cos(d1);
y0 = cy + r * sin(d1);
angle += d1 - d0;
}
}


# 今日やっと時間と気力とノンアルコールの条件が整った。
# 所要時間1時間。30分位で作りたいんだけどな。


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

Name: ゆうき  ..かけだし(1,284ポイント)   Date: 2009/05/15(金) 13:23   No:33476 解決!     
Title: Re:曲線の描画について    
初めまして、たいちうさん。
実際のプログラムありがとうございました。
あと、(お仕事の件)ご指摘ごもっともです。

早速動作確認と考察をしてみます。
※設定をいじりましたが「外部シンボル 'WinMain' が未解決」とエラーが出て、
 すぐにはできませんでした。

各座標の記録は、もう少し自分で考えてやってみます。

lbfuvabさん、たいちうさん
ありがとうございました。




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

Name: たいちう  ..プログラマー(28,191ポイント)   Date: 2009/05/16(土) 08:51   No:33516     
Title: Re:曲線の描画について    
http://homepage2.nifty.com/c_lang/sdk/sdk_00.htm
のサンプルを次のように変更すれば呼び出せるのではないかな。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

{
HDC hdc;
PAINTSTRUCT ps;
switch (msg)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
Draw(hdc);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, msg, wParam, lParam));
}
return (0L);
}


同じサイトの↓も参考になるかも。
http://homepage2.nifty.com/c_lang/bcc/index.html


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



Name:  ..入門者(3,831ポイント)   Date: 2009/05/14(木) 23:52   No:33458       
Title: 変数になぜかおかしな値が入ってしまいます    
連日に投稿してすみません。
Visual Studio 2008 Express EditionとDXライブラリを使って、ゲーム(と呼べるレベルのものではまだありませんが)を作っています。
コンパイルはちゃんとできるのですが次のようなエラー?がでて、対処が分かりません。

Game2.exe の 0x004012e6 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xc07fd410 を読み込み中にアクセス違反が発生しました。

エラーメッセージで検索もしてはみたのですが自分には書いてあることの意味が理解できませんでした。
エラーメッセージと同時に表示される情報を見ておかしいと思ったのが、char.ccpの

if(*(p_block+(ch.y/32+1)*20+(ch.x/32+1))==1 && ch.sky==1){

のあたり(直前?)でch.yになぜか-2147483296が代入されているらしいということなのですが、なぜそんな数が代入されてしまうのかが分からず、そもそもそれが原因であるかどうかも確信できません。
解決法を教えてください。


//main.ccp
#include "DxLib.h"
#include "Keys_Blocks.h"

void char_coord(int *Key,int *p_block);

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

//Loading pics
int back_i=0;
int ground=LoadGraph("Stones.png");

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない
//Back
LoadGraphScreen(-back_i,0,"virgo.jpg",FALSE);
if(back_i>1080-680)LoadGraphScreen(1080-back_i,0,"virgo.jpg",FALSE);
if(back_i>1080)back_i=0;
back_i++;

//Ground
int ground=LoadGraph("stones.png");
for(int i=0;i<20;i++){
for(int j=0;j<15;j++){
if(block[j][i]==1)DrawGraph(i*32,j*32,ground,TRUE);
}
}

//draw_char
char_coord(Key,p_block);

ScreenFlip();
}

DxLib_End();
return 0;
}



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


Name:  ..初心者(5,270ポイント)   Date: 2009/05/14(木) 23:52   No:33459     
Title: Re:変数になぜかおかしな値が入ってしまいます    
//char.ccp
#include "DxLib.h"
#include <math.h>

#define g 6.6
#define y_max 2.0

typedef struct{
int x;
int y;
int img;
int direct;//right 1 or left 3
int inertia;
int j_flag;
int sky;
}cha;

cha ch={680/4,480-32*4,0,1,0,0,0};

void char_coord(int *Key,int *p_block){

int dora[12];
LoadDivGraph("char.png",12,3,4,24,32,dora);

int ex_y=ch.y;
int time1=0,time2=0;
double t;

//char_x
if(Key[KEY_INPUT_RIGHT]>0){
if(ch.sky==1)ch.x+=4;//accerate in the sky
ch.x+=3,ch.direct=1;//start walking
}
if(Key[KEY_INPUT_RIGHT]>10)ch.x+=4,ch.inertia=10;//start running and get inertia force
if(ch.direct==1 && Key[KEY_INPUT_RIGHT]==0 && ch.inertia==10)ch.inertia--;//inertia force is weakening
if(ch.direct==1 && ch.inertia<10 && ch.inertia>0)ch.x+=2,ch.inertia--;

if(Key[KEY_INPUT_LEFT]>0){
if(ch.sky==1)ch.x-=4;
ch.x-=3,ch.direct=3;
}
if(Key[KEY_INPUT_LEFT]>10)ch.x-=4,ch.inertia=10;
if(ch.direct==3 && Key[KEY_INPUT_LEFT]==0 && ch.inertia==10)ch.inertia--;
if(ch.direct==3 && ch.inertia<10 && ch.inertia>0)ch.x-=2,ch.inertia--;

//char_jump
if(Key[KEY_INPUT_UP]==1 && ch.j_flag<=2){
time1=GetNowCount();
ch.j_flag++; //up flag
ex_y=ch.y; //where it was
}

if(ch.j_flag!=0){
time2=GetNowCount();
t=(double)(time2-time1)/1000;
ch.y=ex_y-(int)((sqrt(2*g*y_max)*t-0.5*g*t*t)*(32*2)/y_max);//culc y
if((int)((sqrt(2*g*y_max)*t-0.5*g*t*t)*(32*2)/y_max)>0)ch.sky=1;

if(*(p_block+(ch.y/32+1)*20+(ch.x/32+1))==1 && ch.sky==1){
ch.y=(ch.y/32)*32;//discard fractions
ch.j_flag=0;
ch.sky=0;
}
}

ch.img=dora[((ch.x+ch.y)%12)/4+ch.direct*3];//choosing picture based on coordinates
if(ch.x>400){
ch.x=400;//cant move right anymore
ch.img=dora[(Key[KEY_INPUT_RIGHT]+Key[KEY_INPUT_UP])%3+3];//choosing picture based on KEY_INPUT_RIGHT time
}
DrawGraph(ch.x,ch.y,ch.img,TRUE);

}

//Keys_Blocks.h
int Key[256];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}

int block[15][20] = {
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};

int *p_block=(int *)block[0];





よろしくお願いします!


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

Name: kazuoni [URL]  ..比類無きプログラマー(84,076ポイント)   Date: 2009/05/15(金) 00:11   No:33461     
Title: Re:変数になぜかおかしな値が入ってしまいます    
規約は読んでください。プレタグ、字下げで、解読しやすくしてください。

ちょっと内容訂正します^^;

*(p_block+(ch.y/32+1)*20+(ch.x/32+1))==1

で、
「(配列p_blockの先頭アドレス+整数)のアドレスのエイリアス==1なら」
っとなっていますが、(違ってたらごめんなさい。)
ch.x、ch.yの値によっては、p_blockの配列の確保している領域を超えて、
アクセスしていってしまっています。
ch.yはこのアクセスをする前までは正常のようです。
この不正アクセスによって、ch.yにも影響してしまっているので、
不適当な数値になっています。

もう一度、ch.x、ch.yの計算または今回の問題の条件を改善してみてください。


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

Name:  ..初心者(5,451ポイント)   Date: 2009/05/16(土) 01:22   No:33508     
Title: Re:変数になぜかおかしな値が入ってしまいます    
>kazuoniさん

>規約は読んでください。プレタグ、字下げで、解読しやすくしてください。
すいません。

*(p_block+(ch.y/32+1)*20+(ch.x/32+1))==1
の直前に

if(ch.y/32+1>=0 && ch.y/32+1<15 && ch.x/32+1>=0 && ch.x/32+1<20)
を追加してみたところ起動まではできたのですが、このif文の次の行が全く実行されなくなってしまいました。
これはこの時点でch.yの値がおかしくなっているということでしょうか?
この行をはさむことで確保していない領域にアクセスすることはなくなると思ったのですがダメでした。

他にどのような点に注意して改善すればよいのか教えてください。



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

Name:  ..初心者(5,809ポイント)   Date: 2009/05/16(土) 01:22   No:33509     
Title: Re:変数になぜかおかしな値が入ってしまいます    

//main.ccp
#include "DxLib.h"
#include "Keys_Blocks.h"

void char_coord(int *Key,int *p_block);

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

//Loading pics
int back_i=0;
int ground=LoadGraph("Stones.png");

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない
//Back
LoadGraphScreen(-back_i,0,"virgo.jpg",FALSE);
if(back_i>1080-680)LoadGraphScreen(1080-back_i,0,"virgo.jpg",FALSE);
if(back_i>1080)back_i=0;
back_i++;

//Ground
int ground=LoadGraph("stones.png");
for(int i=0;i<20;i++){
for(int j=0;j<15;j++){
if(block[j][i]==1)DrawGraph(i*32,j*32,ground,TRUE);
}
}

//draw_char
char_coord(Key,p_block);

ScreenFlip();
}

DxLib_End();
return 0;
}


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

Name:  ..初心者(5,873ポイント)   Date: 2009/05/16(土) 01:28   No:33510     
Title: Re:変数になぜかおかしな値が入ってしまいます    
上はミスです。
コードを字下げして入れなおそうと思い、<pre>と</pre>を始めと終わりにつけたのですが、反映されないようです。
コード見難くてすいません。


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

Name: kazuoni [URL]  ..比類無きプログラマー(84,371ポイント)   Date: 2009/05/16(土) 03:27   No:33512     
Title: Re:変数になぜかおかしな値が入ってしまいます    
またもやちらっとしか見ていないので適切かどうか分かりませんが・・・
もしかしたら、アクセス領域を超えているのではなくて、
オーバーフローを起こしているかもしれないです。
っというのも、time1は上キーか押された時はif文条件に合致し、
GetNowCount()の戻り値を代入しますが、
次のループはこの条件に合致しません。(Key[KEY_INPUT_UP]=0 or Key[KEY_INPUT_UP]=2になるため)
そして、フラグが立つので、次のループでは
if(ch.j_flag!=0)
に合致して、処理をします。
t=time2-time1としていますが、time1はローカル変数のため、実質は
t=time2-0
です。GetNowCount()はミリ秒単位なので、time2は結構大きな値だと思います。
その次に
ch.y=ex_y-(int)((sqrt(2*g*y_max)*t-0.5*g*t*t)*(32*2)/y_max)

ですが、t^2があるので、ここでオーバーフローを起こし、変な値が入っているのかもしれません。

一度、time1,time2を外部変数または静的変数にしてみてください。


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

Name:  ..初心者(5,917ポイント)   Date: 2009/05/16(土) 05:18   No:33513     
Title: Re:変数になぜかおかしな値が入ってしまいます    
>kazuoni
time1、time2を静的関数にしたら警告など出ずに動きました!
画面の前で奇声を発するほどうれしいです!!
本当にありがとうございます!!


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

Name:  ..初心者(5,922ポイント)   Date: 2009/05/16(土) 05:20   No:33514 解決!     
Title: Re:変数になぜかおかしな値が入ってしまいます    
解決!

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

Name: Ma  ..初心者(7,180ポイント)   Date: 2009/05/16(土) 08:26   No:33515     
Title: Re:変数になぜかおかしな値が入ってしまいます    
> <pre>と</pre>
半角を使ってください。


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



Name: situmon  ..プログラマー(30,100ポイント)   Date: 2009/05/09(土) 23:08   No:33262       
Title: このエラーはどうすればなおるのですか?    
とても初心者な質問なのですが、
このようなエラーはどうすればなおるのでしょう。
LIBCMTD.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。...
などのエラーです。
前から気になってたのでお願いします。


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


Name: たかぎ [URL]  ..ハッカー(100,334ポイント)   Date: 2009/05/09(土) 23:40   No:33263     
Title: Re:このエラーはどうすればなおるのですか?    
http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=811
上記は参考になりませんか?
というか、検索ぐらいはしましょう。


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

Name: situmon  ..プログラマー(30,116ポイント)   Date: 2009/05/15(金) 18:36   No:33492 解決!     
Title: Re:このエラーはどうすればなおるのですか?    
ありがとうございます。
すいませんでした・・・


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



Name: ほのか  ..ぴよぴよ(907ポイント)   Date: 2009/05/15(金) 14:04   No:33479       
Title: ファイルへの書き込み    
添付ファイルのソースをご覧いただきたいのですが、このソースの処理を終了する最後の関数内で、登録した名前等をファイルに書き込んでから終了させたいのですが、どうすれば良いのでしょうか?;
いろいろ試してみましたがよくわかりませんでした…
よろしくお願いします。


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


Name: non  ..熟練のプログラマー(40,725ポイント)   Date: 2009/05/15(金) 16:06   No:33487     
Title: Re:ファイルへの書き込み    
まず、fopenしたファイルはfcloseしましょう。
プログラムの最初でファイルを読み込んだら、ほかの処理をする前に閉じた方がいいので、
mainの考え方を変えましょう。

if((fp = fopen(path,"r"))==NULL){
printf("File Open ERROR\n");
return 1;
}
ファイルの読み込み
すでにあるいろんな処理
書き込むために再度fopen
書き込み

のように作りましょう。

ところで、while(1)でmainを作るのはやめましょう。
exit(0)でプログラムを終了するのは感心しません。




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

Name: pooka  ..かけだし(2,476ポイント)   Date: 2009/05/15(金) 16:22   No:33488     
Title: Re:ファイルへの書き込み    

void write(Jusyoroku *data,int cnt,char *path){
FILE *fp;
int i;

if((fp = fopen(path,"w")) == NULL){
printf("file open error\n");
exit(1);
}

for(i=0;i<cnt;i++){
fprintf(fp,"氏名:%s\n",data[i].name);
fprintf(fp,"郵便番号:%s\n",data[i].yubin);
fprintf(fp,"住所:%s\n",data[i].add);
fprintf(fp,"電話番号:%s\n",data[i].tel);
fprintf(fp,"性別:%s\n",data[i].sei);
fprintf(fp,"\n");
}

fclose(fp);
}

こんなかんじでファイルに書き込む関数を作ってみてはどうでしょうか?

ファイルを読み込むのであればファイルへの書き方を読み込みやすいように書き換えてください。


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

Name: ほのか  ..ぴよぴよ(943ポイント)   Date: 2009/05/15(金) 16:39   No:33489 解決!     
Title: Re:ファイルへの書き込み    
回答ありがとうございます。
無事書き込みができました!ありがとうございました^^


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



Name: 研修生  ..初心者(6,269ポイント)   Date: 2009/05/15(金) 13:47   No:33477       
Title: リダイレクト    
を使いたいのですが使い方が調べてもわかりません。


#include <stdio.h>

enum { NON_BLANK, BLANK, BLANKS };

int main(void)
{
int c, mode = NON_BLANK;

while ((c = getchar()) != EOF) {
if (c != ' ') {
switch (mode) {
case BLANK: case BLANKS:
putchar(' ');
/* fall thru */
case NON_BLANK:
putchar(c);
mode = NON_BLANK;
break;
}
}
else {
switch (mode) {
case NON_BLANK:
mode = BLANK;
break;
case BLANK: case BLANKS:
mode = BLANKS;
break;
}
}
}
return 0;
}



例えばこのプログラムの入力をファイルから読み込むとするとどのようにプログラムを改善すれば
いいのでしょうか? 



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


Name: 研修生  ..初心者(6,283ポイント)   Date: 2009/05/15(金) 13:49   No:33478     
Title: Re:リダイレクト    
開発環境はvisualC++6.0です

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

Name: toyo  ..プログラマー(32,920ポイント)   Date: 2009/05/15(金) 14:23   No:33480     
Title: Re:リダイレクト    
プログラムの変更は必要ないのでは
実行時に
C:\〜> hoge.exe < file.txt
のように < でリダイレクトします


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

Name: 研修生  ..初心者(6,347ポイント)   Date: 2009/05/15(金) 14:30   No:33481     
Title: Re:リダイレクト    
色んなサイトにもそうかいてありましたが
F7(ビルド)押してF5+Ctrl(実行)押すだけでして・・
超絶ど素人なもので・・お手数ですが教えて下さい。


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

Name: toyo  ..プログラマー(33,067ポイント)   Date: 2009/05/15(金) 14:40   No:33483     
Title: Re:リダイレクト    
コマンドプロンプトというもので実行しないとだめなんですよ
OSはWindowsXPですかね
左下にある「スタート」の「ファイル名を指定して実行」に
cmd
と入力してOKするとコマンドプロンプトという黒い画面のウィンドウが開きます
CDコマンドで実行ファイルのある場所に移動するんですがちょっと面倒なので画面に表示されている
C:\〜>
の〜に該当するフォルダに実行ファイルをコピーしたほうが早いですかね


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

Name: 研修生  ..初心者(6,431ポイント)   Date: 2009/05/15(金) 15:13   No:33484     
Title: Re:リダイレクト    
C:\〜>cd (実行ファイルがあるフォルダ)

C:(そのフォルダ)> ○○○.exe < test .txt

コンパイル

でいいのでしょうか?
ところでVC++のコンパイルってclじゃなかっけ・・
clは内部コマンド、または外部コマンドとして認識されないとかでまくる・・


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

Name: 研修生  ..初心者(6,451ポイント)   Date: 2009/05/15(金) 15:30   No:33486 解決!     
Title: Re:リダイレクト    
やっとなぞがとけました。toyoさんありがとうございました。

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



Name: ユウ  ..入門者(2,758ポイント)   Date: 2009/05/15(金) 15:20   No:33485       
Title: 3次元三角形の透視投影    
閲覧ありがとうございます。
以下のテンプレートに従い質問をさせて頂きます。

[1] 質問文
 [1.1] 3次元三角形の透視投影
 [1.2] 任意の2次元三角形を出力するプログラムまでは作成できたと思います
   (添付したファイルを参照してください)
 [1.3] 方法自体が全く分かりません
 [1.4] 3次元三角形の透視投影をプログラミングで行う方法

[2] 環境  
 [2.1] OS : Windows
 [2.2] コンパイラ名 : VC++ 6.0
 [2.3] 使用言語:C言語
[3] その他
 ・C言語は構造体が少し分かる程度です
 ・ライブラリは使っていません

よろしくお願い致します。


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




Name: Ma  ..初心者(6,826ポイント)   Date: 2009/05/15(金) 04:22   No:33466       
Title: ネット上にスコア記録    
よくオンラインゲームなどでもみかけるランキングですが、
BCC Developer で C++ とDXライブラリ を用いて、そのランキングシステムもどきを作れないかとふと思いました。
(実際にやるかわかりませんが・・)

=以下想像です=

無料サーバーなどを借りて、アプリからサーバーにデータを送信して、
あとは、サーバー上でCGIとかPHP?とかを使えば、プレイヤーがデータを送って即時にランキングが変わるような
オンラインゲームのサイトのランキングシステムもどきが完成。

のような事は可能なのでしょうか?


なお、サーバーやインターネット関連の知識は皆無に近いです><
「このサイトを読め!」とか、そういうアドバイスも助かります。


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


Name: toyo  ..プログラマー(32,893ポイント)   Date: 2009/05/15(金) 06:34   No:33467     
Title: Re:ネット上にスコア記録    
可能ですがランキングをリアルタイムに反映させるのは無理です
たとえばA、Bの2人がオンライン中でAがデータを送りランキングを更新してもその結果はAにしか送られません
Bに結果を反映させるためにはBのほうからサーバにデータを取りにいかないとだめです
一定時間ごとにデータを取りに行くようにすればタイムラグはありますがランキングシステムもどきは可能でしょう
専用サーバに専用のプログラムで通信すればリアルタイムな通信も可能ですがレンタルサーバでは無理でしょう


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

Name: Ma  ..初心者(7,036ポイント)   Date: 2009/05/15(金) 07:39   No:33468     
Title: Re:ネット上にスコア記録    
>可能ですがランキングをリアルタイムに反映させるのは無理です
あ、アプリ上ではなく、ブラウザ上でランキング表示するつもりでした。
でも、言われてみればアプリ上でもランキングが見れたらいいかもしれませんね。

>Bに結果を反映させるためにはBのほうからサーバにデータを取りにいかないとだめです
つまり、ランキングを観覧しようとしたたびに、サーバーからデータを貰えば問題ないわけですね。

>レンタルサーバ
DXライブラリのサンプルなどから、PCからPCへの通信はIPアドレスでできることは知っているのですが、
サーバーへの通信の仕方が想像もできません。

サーバーへの通信となると、そのレンタルするサーバー次第でコードが大きく変わってしまうのでしょうか?
もし、大差ないようでしたら、通信手段、またはそれを紹介するサイトなど、教えていただけませんか?


*追記
すいません、もうすこしぐぐってみたら、丁度いいのがみつかりました。
しばらく読んでみて、質問ができたらまたよろしくお願いします<(_ _)>。


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

Name: バグ  ..ハッカー(159,685ポイント)   Date: 2009/05/15(金) 08:10   No:33470     
Title: Re:ネット上にスコア記録    
DXライブラリを使用するなら、下記URLの書籍が参考になりますよ。

http://www.amazon.co.jp/gp/aw/d.html/ref=redir_mdp_mobile/376-4487239-2326335?a=4899772408


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

Name: Ma  ..初心者(7,257ポイント)   Date: 2009/05/15(金) 08:58   No:33471     
Title: Re:ネット上にスコア記録    
>バグ 様
わざわざ、ありがとうございます。
ですが、良い参考になるサイトを見つけれました。

こちらが、私が参考にさせていただいたサイトです。
http://akiragoya.sakura.ne.jp/blog/archives/352



ところで、サーバーからのダウンロードは問題なくできたのですが
アップロードには、やはりCGIが必要なようです。

ここまで聞いていいのか分かりませんが、
お勧めのレンタルサーバー、ご紹介していただけませんか?
(一箇所みつけたのですが、すでにサービスが放棄されてたりしたのでorz)

容量は少なくて問題ありません。
審査がないと助かります。あとは、CGIが使えればOKです。


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

Name: たかぎ [URL]  ..ハッカー(100,859ポイント)   Date: 2009/05/15(金) 09:04   No:33472     
Title: Re:ネット上にスコア記録    
> お勧めのレンタルサーバー、ご紹介していただけませんか?

予算は?
また、CGIはどんな言語で作るつもりですか?
cronは必要ですか?


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

Name: Ma  ..初心者(7,170ポイント)   Date: 2009/05/15(金) 10:10   No:33473 解決!     
Title: Re:ネット上にスコア記録    
>たかぎ 様
TOK2 が一番かと思いまして、いま登録とCGIのサンプルをみているところです。
もし他に推奨があれば、そちらも見てみたいと思います。
協力ありがとうございます<(_ _)>


>予算は?
0です。

>また、CGIはどんな言語で作るつもりですか?
しばらくはコピペです><
欲を言えば java か C,C++ が理想です。


cronは必要ですか?
>いらないです。





*追記
悪戦苦闘をしばらく繰り返して、TOK2 において アップロード、ダウンロードに成功しました。
おそらく、これで用はたりるとおもいます。
ご協力ありがとうございました。


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



Name: ファウスト  ..ぴよぴよ(86ポイント)   Date: 2009/05/14(木) 22:13   No:33447       
Title: 普通のC言語での質問です    
私は今タイピングゲームの試作品を作っているのですが
表示した文字と入力した文字の比較でうまくいかず困っています
どうすれば比較することができるのでしょうか?
回答よろしくお願いします


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


Name: toyo  ..プログラマー(32,705ポイント)   Date: 2009/05/14(木) 22:18   No:33448     
Title: Re:普通のC言語での質問です    
どうすればといわれても普通に比較演算子を使うとしか答えようが無いです
==

!=
で比較します


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

Name: ファウスト  ..ぴよぴよ(280ポイント)   Date: 2009/05/14(木) 22:22   No:33450     
Title: Re:普通のC言語での質問です    
==をつかってるんですがうまくいかないんです・・・
ソースコード書きます
#include<stdio.h>

int main(char *ss)
{

char a[] = "kyouhaiitennkidesune\n",c;
printf("%s",a);

gets(ss);
c = puts(ss);

if(c == a){
printf("おみごと!!");
}
else{
printf("残念");
}
return 0;
}


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

Name: MNS  ..初心者(8,240ポイント)   Date: 2009/05/14(木) 22:22   No:33451     
Title: Re:普通のC言語での質問です    
文字列の比較で困っているとしたら、
strcmp などの文字列比較関数を使いましょう。
文字列の比較に==などの演算子は使うことができません。
(std::stringなどを使う、という手もありますが)。


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

Name: ファウスト  ..ぴよぴよ(289ポイント)   Date: 2009/05/14(木) 22:25   No:33452     
Title: Re:普通のC言語での質問です    
初心者さんありがとうございます!!
試してみます


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,024,255ポイント)   Date: 2009/05/14(木) 22:34   No:33453     
Title: Re:普通のC言語での質問です    
まず、比較するものが違います。
aはアドレスであるのに対し、cは1文字データそのものを入れる変数です。

例えば「この手紙に書いてあるAさんというのは3号棟に住んでるAさんのことか?」という事が調べたいのに
「中身と住所」を比較しているので
「この手紙に書いてあるAさんというのは3号棟のことか?」
のような意味不明な比較になってしまっています。

文字列の比較はMNSさんの仰る通り、関数を使うか、1文字ずつ調べていく必要があります。
また、「初心者」はポイントランク名であって、名前ではありませんので。


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

Name: ファウスト  ..ぴよぴよ(530ポイント)   Date: 2009/05/14(木) 22:39   No:33454     
Title: Re:普通のC言語での質問です    
また質問すいません・・・

なぜか入力した後うごかなくなるんですがどうしてなんでしょうか?
ソースコードはります
#include<stdio.h>
#include<string.h>
int strcmp(const char *ss,const char *a);
int main(char *ss)
{

char a[] = "kyouhaiitennkidesune\n";
printf("%s",a);


gets(ss);
puts(ss);

if(strcmp(ss,a) == 0){
printf("おみごと!!");
}
else{
printf("残念");
}
return 0;
}
という感じです・・・
たびたびすいません・・・


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

Name: box  ..ハッカー(139,836ポイント)   Date: 2009/05/14(木) 22:45   No:33455     
Title: Re:普通のC言語での質問です    
ssを定義する場所と、定義する内容が根本的に違っています。
main関数の引数ではない場所で、配列として定義してください。
なお、string.hをインクルードしていますので、strcmpのプロトタイプ宣言は不要です。
そのプロトタイプ宣言は、string.hの中に書いてあります。


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

Name: MNS  ..初心者(8,320ポイント)   Date: 2009/05/14(木) 22:49   No:33456     
Title: Re:普通のC言語での質問です    
まず、ssを引数にせず、グローバル変数にするか、a[]と同じように、main関数内で宣言してください。
また、ssは配列にしなくてはなりません。
ss[256]などと十分な大きさをとる必要があるでしょう。
あとは、
int strcmp(const char *ss,const char *a);
この宣言は必要ないと思います。

それくらいですかね。


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

Name: ファウスト  ..ぴよぴよ(596ポイント)   Date: 2009/05/14(木) 23:01   No:33457 解決!     
Title: できました!!    
おかげさまでできました!!ありがとうございました
MNS様
box様
管理人様
toyo様
また質問するかもしれませんがその時はおねがいします!!


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



Name: じゃが  ..入門者(2,711ポイント)   Date: 2009/05/11(月) 22:09   No:33323       
Title: じゃんけんゲームの勝敗の出し方    
じゃんけんゲームというのを作っているのですが、勝ち負けあいこを出そうとすると0で表示されてしまいます・・・。

わかる方ご解答お願いします。

またどこか簡単にできる部分もありましたらご指南お願いします。


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

void Init()
{
srand(time(NULL));
}


int Draw(int aiko ,int win ,int lose)
{
int jibun , teki;
printf("0.グー 1.チョキ 2.パー ");
scanf("%d", &jibun);

teki = rand() % 3;

switch(teki)
{
case 0:
printf("敵は%sです\n" , "グー");
break;
case 1:
printf("敵は%sです\n" , "チョキ");
break;
case 2:
printf("敵は%sです\n" , "パー");
break;
}

if(jibun == teki)
{
printf("アイコです\n");
aiko += 1;
}
else if((jibun == 0 && teki == 1) || (jibun == 1 && teki == 2) || (jibun == 2 && teki == 0) )
{
printf("勝ち\n");
win += 1;
}
else
{
printf("負け\n");
lose += 1;
}

return aiko , win , lose;
}


void main()
{
int Input , aiko = 0 , win = 0 , lose = 0;

Init(); // データの初期化

// ゲームループ
while(1)
{
Draw(aiko, win, lose); // データの表示

Input = getch(); // 入力待ち
if(Input == 0x1B)
{
break;
}
}
printf("勝ち...%d\t負け...%d\t引き分け...%d\n",win , lose , aiko);
}


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


Name: MNS  ..初心者(7,955ポイント)   Date: 2009/05/11(月) 22:23   No:33324     
Title: Re:じゃんけんゲームの勝敗の出し方    
Draw関数が値渡しになっています。
ポインタ渡しか、参照渡しに変更してください。


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

Name: さが  ..入門者(3,538ポイント)   Date: 2009/05/11(月) 22:33   No:33325     
Title: Re:じゃんけんゲームの勝敗の出し方    
懐かしくなって、ファイル漁っていたらあったので判定の参考にどうぞ

if(me==enemy)
printf("アイコ");
else if(me==enemy-1||me==enemy+2)
printf("勝ち");
else
printf("負け");

このころはまだ良かった。


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

Name: box  ..ハッカー(139,704ポイント)   Date: 2009/05/11(月) 22:41   No:33326     
Title: Re:じゃんけんゲームの勝敗の出し方    

ポインタを渡すのが正解です。
なお、今のソースコードにおける

> return aiko , win , lose;

この書き方では、
1)aikoを評価
2)winを評価
3)loseを評価
の3つを順に行なった結果、最後に行なったloseの評価結果「だけ」が有効となります。
呼び出し元に返るのは、loseの値です。
しかも、その結果を呼び出し元で使っていないので、勝ち・負け・あいことも
ゼロを出力します。



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

Name: じゃが  ..入門者(2,500ポイント)   Date: 2009/05/12(火) 17:32   No:33352 解決!     
Title: Re:じゃんけんゲームの勝敗の出し方    
ご解答ありがとうございます。
MNSさん
ポインタを使うということでようやく分かりました;
読む分には分かるのですが、自分で使うと分からなくなってしまいます・・・orz

さがさんのプログラムは理解に時間がかかりましたが、すごくすっきりしますね。
参考にさせて頂きます。
この頃はまだ良かった・・・?なにかあったのでしょうか。。

boxさん
return文はこれではloseしか返していなかったんですね;
自分で応用できるように頑張ってみます。


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

Name: TKOZ  ..上級者(22,265ポイント)   Date: 2009/05/13(水) 13:24   No:33374     
Title: Re:じゃんけんゲームの勝敗の出し方    
TKOZです。ネットカフェから書き込みです。
もっと短くしてみました。

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

#define GUU 0
#define CYOKI 1
#define PAA 2

int main(void)
{
char Guu[3][20]={"アイコです。","勝ちです。","負けです。"};
char Cyoki[3][20]={"負けです。","アイコです。","勝ちです。"};
char Paa[3][20]={"勝ちです。","負けです。","アイコです。"};
char janken[3][20]={"グー","チョキ","パー"};
int input,com;
printf("じゃんけんゲームです。\n");
srand(time(NULL));
while(1)
{
printf("手を入力してください。\n(0:グー,1:チョキ,2:パー)->");
scanf("%d",&input);
com=rand()%3;
printf("コンピュータは%sを出しました。\n",janken[com]);
if(input==GUU){printf("%s\n",Guu[com]);}
else if(input==CYOKI){printf("%s\n",Cyoki[com]);}
else if(input==PAA){printf("%s\n",Paa[com]);}
}

}


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

Name: 御津凪 [URL]  ..比類無きプログラマー(86,666ポイント)   Date: 2009/05/13(水) 13:51   No:33375     
Title: Re:じゃんけんゲームの勝敗の出し方    
> もっと短くしてみました。

私も負けじともう少し短くしてみました。
(TKOZ さんのコードを元にし、やめられるように改良もしてます)

#include<stdio.h>

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

int main(void){
char* result[3][3] = {
{ "あいこ", "勝ち", "負け" },
{ "負け", "あいこ", "勝ち" },
{ "勝ち", "負け", "あいこ" }
};
char* ken[3] = { "グー", "チョキ", "パー" };
int input, com;
printf("じゃんけんゲームです。\n");
srand(time(NULL));
loop:
printf("手を入力してください。\n(0:グー,1:チョキ,2:パー,3:やめる)->");
scanf("%d", &input);
if(input < 0 || 3 < input){
printf("値が違います。\n");
goto loop;
}
if(input == 3) return 0;
com = rand() % 3;
printf("コンピュータは%sを出しました。\n", ken[com]);
printf("%sです。\n", result[input][com]);
goto loop;
return -1;
}


勝ち負けを2次元配列のテーブルで参照している部分がミソです。


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

Name: じゃが  ..入門者(2,541ポイント)   Date: 2009/05/14(木) 21:40   No:33444     
Title: Re:じゃんけんゲームの勝敗の出し方    
おお、ありがとうございます。
2次元配列は分かるんですが、苦手なんですよね・・・。
参考にさせて頂きます〜。


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



Name:  ..ぴよぴよ(192ポイント)   Date: 2009/05/14(木) 07:14   No:33410       
Title: ファイルを分割してみたらエラーが消えなくなってしまいました。    
Visual Studio 2008 Express EditionとDXライブラリを使って、ゲーム(と呼べるレベルのものではまだありませんが)を作っています。
ソースファイルを分割しようとしてみたところ、つぎの様なエラーメッセージがでて、その解決方法が分からなくなって困っています。

以下エラーメッセージです。
1>------ ビルド開始: プロジェクト: Game2, 構成: Debug Win32 ------
1>コンパイルしています...
1>char.cpp
1>main.cpp
1>コードを生成中...
1>リンクしています...
1>main.obj : error LNK2019: 未解決の外部シンボル "void __cdecl char_coord(int *,int)" (?char_coord@@YAXPAHH@Z) が関数 _WinMain@16 で参照されました。
1>C:\Documents and Settings\ryosuke\My Documents\Visual Studio 2008\Projects\Game2\Debug\Game2.exe : fatal error LNK1120: 外部参照 1 が未解決です。
1>ビルドログは "file://c:\Documents and Settings\ryosuke\My Documents\Visual Studio 2008\Projects\Game2\Game2\Debug\BuildLog.htm" に保存されました。
1>Game2 - エラー 2、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========



error LNK2019: 未解決の外部シンボル "void __cdecl char_coord(int *,int)" (?char_coord@@YAXPAHH@Z) が関数 _WinMain@16
↑この行で検索をかけてみたところ、「win32 コンソールアプリケーション」を使えばエラーは消えるらしいのですがプロジェクトを作り直しwin32 コンソールアプリケーションを選んで、"stdafx.h"をchar.ccpとgame3.ccpに追加した以外は全く同じコードで試してみたところ、以下のようなエラーメッセージがでました。

1>------ ビルド開始: プロジェクト: game3, 構成: Debug Win32 ------
1>コンパイルしています...
1>game3.cpp
1>c:\documents and settings\ryosuke\my documents\visual studio 2008\projects\game3\game3\game3.cpp(9) : fatal error C1083: include ファイルを開けません。'Keys_Blocks.h': No such file or directory
1>ビルドログは "file://c:\Documents and Settings\ryosuke\My Documents\Visual Studio 2008\Projects\game3\game3\Debug\BuildLog.htm" に保存されました。
1>game3 - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

無事にコンパイルできるようにするにはどうしたらいいかご教授ください。



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


Name:  ..かけだし(1,963ポイント)   Date: 2009/05/14(木) 07:16   No:33411     
Title: Re:ファイルを分割してみたらエラーが消えなくなってしまいました。    
以下はソースファイルです。


<pre>
//game3.ccpとmain.ccpは始めの一行以外は同じものです。
#include "stdafx.h"
#include "DxLib.h"
#include "Keys_Blocks.h"

void char_coord(int *Key,int block);

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

//Loading pics
int back_i=0;
int ground=LoadGraph("Stones.png");

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない
//Back
LoadGraphScreen(-back_i,0,"virgo.jpg",FALSE);
if(back_i>1080-680)LoadGraphScreen(1080-back_i,0,"virgo.jpg",FALSE);
if(back_i>1080)back_i=0;
back_i++;

//Ground
int ground=LoadGraph("stones.png");
for(int i=0;i<20;i++){
for(int j=0;j<15;j++){
if(block[j][i]==1)DrawGraph(i*32,j*32,ground,TRUE);
}
}

//draw_char
char_coord(Key,block[15][20]);

ScreenFlip();
}

DxLib_End();
return 0;
}




//char.ccp
#include "stdafx.h"
#include "DxLib.h"
#include <math.h>

#define g 6.6
#define y_max 2.0

typedef struct{
int x;
int y;
int img;
int direct;//right 1 or left 3
int inertia;
int j_flag;
int sky;
}cha;

void char_coord(int *Key,int block[15][20]){
//int *coord;

int dora[12];
LoadDivGraph("char.png",12,3,4,24,32,dora);

cha ch;
ch.x=680/4;
ch.y=480-32*4;
ch.direct=1;
ch.inertia=0;
ch.j_flag=0;
ch.sky=0;

int ex_y=ch.y;
int time1=0,time2=0;
double t;

//char_x
if(Key[KEY_INPUT_RIGHT]>0){
if(ch.sky==1)ch.x+=4;//accerate in the sky
ch.x+=3,ch.direct=1;//start walking
}
if(Key[KEY_INPUT_RIGHT]>10)ch.x+=4,ch.inertia=10;//start running and get inertia force
if(ch.direct==1 && Key[KEY_INPUT_RIGHT]==0 && ch.inertia==10)ch.inertia--;//inertia force is weakening
if(ch.direct==1 && ch.inertia<10 && ch.inertia>0)ch.x+=2,ch.inertia--;

if(Key[KEY_INPUT_LEFT]>0){
if(ch.sky==1)ch.x-=4;
ch.x-=3,ch.direct=3;
}
if(Key[KEY_INPUT_LEFT]>10)ch.x-=4,ch.inertia=10;
if(ch.direct==3 && Key[KEY_INPUT_LEFT]==0 && ch.inertia==10)ch.inertia--;
if(ch.direct==3 && ch.inertia<10 && ch.inertia>0)ch.x-=2,ch.inertia--;

//char_jump
if(Key[KEY_INPUT_UP]==1 && ch.j_flag<=2){
time1=GetNowCount();
ch.j_flag++; //up flag
ex_y=ch.y; //where it was
}

if(ch.j_flag!=0){
time2=GetNowCount();
t=(double)(time2-time1)/1000;
ch.y=ex_y-(int)((sqrt(2*g*y_max)*t-0.5*g*t*t)*(32*2)/y_max);//culc y
if((int)((sqrt(2*g*y_max)*t-0.5*g*t*t)*(32*2)/y_max)>0)ch.sky=1;

if(block[ch.y/32+1][ch.x/32+1]==1 && ch.sky==1){
ch.y=(ch.y/32)*32;//discard fractions
ch.j_flag=0;
ch.sky=0;
}
}

ch.img=dora[((ch.x+ch.y)%12)/4+ch.direct*3];//choosing picture based on coordinates
if(ch.x>400){
ch.x=400;//cant move right anymore
ch.img=dora[(Key[KEY_INPUT_RIGHT]+Key[KEY_INPUT_UP])%3+3];//choosing picture based on KEY_INPUT_RIGHT time
}
DrawGraph(ch.x,ch.y,ch.img,TRUE);

//coord[0]=ch.x;
//coord[1]=ch.y;

//return 0;
}


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

Name:  ..入門者(2,768ポイント)   Date: 2009/05/14(木) 07:17   No:33412     
Title: Re:ファイルを分割してみたらエラーが消えなくなってしまいました。    
//Keys_Blocks.h
int Key[256];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}

int block[15][20] = {
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
</pre>

長くなってすいません。
よろしくお願いします!


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

Name: Mist  ..熟練のプログラマー(60,542ポイント)   Date: 2009/05/14(木) 09:54   No:33415     
Title: Re:ファイルを分割してみたらエラーが消えなくなってしまいました。    
> error LNK2019: 未解決の外部シンボル "void __cdecl char_coord(int *,int)" (?char_coord@@YAXPAHH@Z) が関数 _WinMain@16
> ↑この行で検索をかけてみたところ、「win32 コンソールアプリケーション」を使えばエラーは消えるらしいのですがプロジェクトを作り直し

この対応は間違いです、元に戻してください。
未解決シンボルエラーになるのはプロトタイプ宣言と関数の実体の定義が一致していないからです。

プロトタイプ:void char_coord(int *Key,int block);
関数宣言:void char_coord(int *Key,int block[15][20]){

関数のほうの [15][20]はいらないのでは?


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

Name:  ..入門者(2,820ポイント)   Date: 2009/05/14(木) 21:11   No:33441 解決!     
Title: Re:ファイルを分割してみたらエラーが消えなくなってしまいました。    
関数の定義や多次元配列を見直したところ、無事コンパイルできました!
Mistさん、本当にありがとうございます!!!


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



Name: 研修生  ..初心者(5,822ポイント)   Date: 2009/05/14(木) 15:50   No:33424       
Title: 単語出力    
入力した単語を一行ずつに1つずつ表示するプログラムを組んでいるのですが
わからなくなったのでご質問します。
※単語はスペースで一区切りにしています。
例 abc edf fgだと
abc
edf
fgと出力されます。


int main()
{
int c;
char s[1000];
for(int i = 0; c == '\n'; i++){
    c = getchar()
if(c== ' ' || c == '\n'){
s[i] = '\0';
printf("%s\n", s);
shokika(s);
}
else{
s[i] = c;

}
}

return 0;
}

void shokika(char s[])
{
int len = strlen(s);
for(int i = 0; i < len; i++){
s[i] = ' ';
}
}

また変なプログラムになってしまいましたが・・
aa aaと入力すると最初の方しか入っておらず対処方法がわかりません。
教えて下さい。


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


Name: Mist  ..熟練のプログラマー(60,679ポイント)   Date: 2009/05/14(木) 15:56   No:33425     
Title: Re:単語出力    
> for(int i = 0; c == '\n'; i++){

ソースコードは実行しているものと一致していますか?

cが不定値な上にforの継続条件が「c == '\n'」では相当運がよくないとforに入らないですが。
前回も指摘ありましたがfor文の使い方を再学習されては?


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

Name: 研修生  ..初心者(5,834ポイント)   Date: 2009/05/14(木) 15:58   No:33426     
Title: Re:単語出力    
for(int i = 0; c != '\'n; i++)でした・

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

Name: Mist  ..熟練のプログラマー(60,821ポイント)   Date: 2009/05/14(木) 16:09   No:33428     
Title: Re:単語出力    
s配列を紙に書いて、自分がコンピュータになったつもりでプログラムを一行ずつ読んで配列のデータを書き換えてみることをお勧めします。

ヒントは「s[i] = c;」です。


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

Name: non  ..熟練のプログラマー(40,311ポイント)   Date: 2009/05/14(木) 16:10   No:33429     
Title: Re:単語出力    
shokika(s);
でやりたいことがわからない。
試しに、この行の代わりに、
i=0;って書いたらどうなる?(またはi=-1)




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

Name: 研修生  ..初心者(5,865ポイント)   Date: 2009/05/14(木) 16:33   No:33430     
Title: Re:単語出力    
よくわからないけどa aと入力すると
a
aaと返ってくるからどこかおかしい・・


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

Name: Blue  ..中級者(10,200ポイント)   Date: 2009/05/14(木) 16:52   No:33431     
Title: Re:単語出力    
#include <stdio.h>


int main()
{
int c;
while (1)
{
c = getchar();
if (c == EOF || c == '\n')
{
putchar('\n');
break;
}
if (c == ' ') {
putchar('\n');
}
else {
putchar(c);
}
}
return 0;
}


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

Name: 研修生  ..初心者(5,797ポイント)   Date: 2009/05/14(木) 16:52   No:33432     
Title: Re:単語出力    
ab cdと入力すると
最初
s[0] = 'a';
s[1] = 'b';
s[2] = '\0';

2回目
s[0] = ' ';
s[1] = ' ';
s[2] = ' ';
s[3] = 'c';
s[4] = 'd';

となってるのかな。うーむ


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

Name: non  ..熟練のプログラマー(40,373ポイント)   Date: 2009/05/14(木) 17:36   No:33433     
Title: Re:単語出力    
>よくわからないけどa aと入力すると
>a
>aaと返ってくるからどこかおかしい・・

i=-1;にしたらどうだったの?





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

Name: 研修生  ..初心者(5,809ポイント)   Date: 2009/05/14(木) 18:35   No:33435     
Title: Re:単語出力    
−1だと正しい感じになりますね。

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

Name: non  ..熟練のプログラマー(40,587ポイント)   Date: 2009/05/14(木) 18:40   No:33437     
Title: Re:単語出力    
動けばいいのなら、これで終わりだけど、
結局、次の単語にするときにi=0にする必要があるということです。
で、なんでi=-1なのかというと、forが+1するからですね。
つまり、他の方が言われるように、forの使い方に問題があるわけです。
この問題なら使わない方がわかりやすいです。


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

Name: 初級者  ..初心者(6,233ポイント)   Date: 2009/05/14(木) 20:32   No:33440     
Title: Re:単語出力    

昨日だれかが提示したソースを1箇所だけ修正すればOKです。
応用力の問題。


#include <stdio.h>

enum { NON_BLANK, BLANK, BLANKS };

int main(void)
{
int c, mode = NON_BLANK;

while ((c = getchar()) != EOF) {
if (c != ' ') {
switch (mode) {
case BLANK: case BLANKS:
putchar('\n');
/* fall thru */
case NON_BLANK:
putchar(c);
mode = NON_BLANK;
break;
}
}
else {
switch (mode) {
case NON_BLANK:
mode = BLANK;
break;
case BLANK: case BLANKS:
mode = BLANKS;
break;
}
}
}
return 0;
}




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



Name: TKOZ  ..上級者(21,655ポイント)   Date: 2009/05/07(木) 17:02   No:33186       
Title: 三角形(ポリゴン)を描画したら、変に…?    
3Dエンジンを作ろうとしているTKOZです。
久しぶりです。
この掲示板にはお世話になってます。
ところで、とあるWebページを参考に三角形(ポリゴン)描画をしたら、
通常のDrawTriangle関数と違って、紫色で、妙に変形したポリゴンが描画されました。
一体何が原因なのか、よく分かりません。
本当は、青いフラットシェーディングで立方体が表示されるはずなのですが
うまくいきません。

今は、デバッグ用に、両方とも描画できるようなソースにしてあります。
どうすれば、三角形(ポリゴン)が上手く描画できるでしょうか?

Main.cppの中の

void DrawTriange(vertex2 num1,vertex2 num2,vertex2 num3,int Cr)
{
DrawTriangle( (int)num1.x,(int)num1.y,(int)num2.x,(int)num2.y,
(int)num3.x, (int)num3.y, Cr , TRUE ) ;
vertex cc[3];
cc[0].x=num1.x;cc[0].y=num1.y;
cc[1].x=num2.x;cc[1].y=num2.y;
cc[2].x=num3.x;cc[2].y=num3.y;
DrawSankaku(cc,3,Cr);

}

DrawTriangle()が、前まで描画していた関数です。
そして、DrawSankaku()が新しく作った関数です。
環境は、WindowsXP Pro CPU Pentium4 2.67Ghz メモリ503MB HDD33GB
VisualC++6.0です。
ソースをアップします。


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


Name: Justy  ..伝説なるハッカー(351,227ポイント)   Date: 2009/05/07(木) 22:23   No:33197     
Title: Re:三角形(ポリゴン)を描画したら、変に…?    

>妙に変形したポリゴンが描画されました

 GraphLock〜DrawPoint周りの処理をみると、すべて shortで計算をしています。
 これは、初期化時に 16bitを指定しているからだとは思いますが、
たしかウインドウモードでの色深度の変更は(デスクトップの色深度に引きずられて)
有効ではなかったような気がします。
 
 試しにフルスクリーンで実行してみてください。
(正常な DrawTriangle()はコメントアウトした方がいいかも)


 もしそれでうまくいったのなら、位置や色がおかしい原因は 1pixel 4バイトで計算するところを
2バイトで行っていたから、となります。

 さて、その場合の解決方法は4つ。

1 フルスクリーンモード専用で作る。
2 画面の色深度が 16bitでないと正常に動作しない、という条件をつける。
3 起動したら強制的に画面全体を 16bitにしてしまう。
4 画面の色深度を見て、32bitなら unsigned intで、16bitなら unsigned shortですべてを
処理するようにする。

 ってところでしょうか。


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

Name: TKOZ  ..上級者(21,689ポイント)   Date: 2009/05/08(金) 06:08   No:33200 解決!     
Title: Re:三角形(ポリゴン)を描画したら、変に…?    
Justyさん、
ありがとうございます。
フルスクリーンで上手くいきました。
これからは、
フルスクリーン専用で作る事にします。

>解決ボタン忘れてました。^^;


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

Name: TKOZ  ..上級者(21,955ポイント)   Date: 2009/05/11(月) 17:17   No:33313     
Title: Re:三角形(ポリゴン)を描画したら、変に…?    
>>3 起動したら強制的に画面全体を 16bitにしてしまう。
>>4 画面の色深度を見て、32bitなら unsigned intで、16bitなら unsigned shortですべてを
処理するようにする。
やはり、ウィンドウモードで作った方が後々便利な気がするので、すみませんが、
具体的な処理方法を教えてください。

自分で調べてみたところ、WINAPIの画面の色深度は、GetDeviceCaps()で取得できそうなのですが、
よくやり方が分かりません。


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

Name: Justy  ..伝説なるハッカー(351,906ポイント)   Date: 2009/05/11(月) 21:23   No:33320     
Title: Re:三角形(ポリゴン)を描画したら、変に…?    
 一番簡単なのは4で、DXライブラリの GetScreenState()を使って色深度を取得、
その値によって処理を分けてしまえばいいかと。

 3の方がいいのであれば、WinAPIの

ChangeDisplaySettings 関数
ttp://msdn.microsoft.com/ja-jp/library/cc428309.aspx



ChangeDisplaySettingsEx 関数
ttp://msdn.microsoft.com/ja-jp/library/cc428310.aspx

を使って変更することができます。


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

Name: TKOZ  ..上級者(22,178ポイント)   Date: 2009/05/14(木) 18:38   No:33436 解決!     
Title: Re:三角形(ポリゴン)を描画したら、変に…?    
Justyさん、ありがとうございます。
無事に実装することが出来ました。


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



Name: POP  ..ぴよぴよ(166ポイント)   Date: 2009/05/14(木) 14:33   No:33419       
Title: 経過時間    
このプログラムの計算結果の経過時間を表示したいのですがどのようにすればいいですか?
C言語初めてまだ2ヶ月で知識はそれほど深くありません。
よろしくお願いします。

#include <stdio.h>
#define MAX 100000 // 素数チェックの最大値
#define PRIME 0 // 素数
#define NOT_PRIME 1 // 素数でない

main()
{


int number[MAX+1]; // 素数チェック配列
int i, j; // カウンタ変数
int count; // 表示個数のカウンタ
// 素数チェック配列の初期化
for(i = 1; i <= MAX; i++)
number[i] = PRIME;
// エラトステネスのふるい
number[1] = NOT_PRIME;
for(i = 2; i <= MAX; i++) {
if(number[i] == PRIME) {

for(j = 2 * i; j <= MAX; j += i)
number[j] = NOT_PRIME;
}

}
// 素数の表示
count = 0;
for(i = 1; i <= MAX; i++) {

if(number[i] == PRIME) {
printf("%5d", i);
count++;
if(count % 10 == 0)
printf("\n");
}
}
printf("素数の数: %d\n", count);


exit(0);

}


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


Name: non  ..熟練のプログラマー(40,262ポイント)   Date: 2009/05/14(木) 15:21   No:33420     
Title: Re:経過時間    
ここを参考にされたらどうでしょうか?
http://kzk9.net/column/time.html


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

Name: POP  ..ぴよぴよ(106ポイント)   Date: 2009/05/14(木) 15:23   No:33421     
Title: Re:経過時間    
#include <sys/time.h>が見つかりませんと出てまったくプログラムが動かなかったんですけどどうすればいいですか?

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

Name: Mist  ..熟練のプログラマー(60,612ポイント)   Date: 2009/05/14(木) 15:28   No:33422     
Title: Re:経過時間    
まず、規約を読んで
・開発環境の明記
・実行環境(OS)の明記
・ソースの字下げ
をしましょう。

一応言っておくとnonさんのリンク先はLinuxですよ。


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

Name: non  ..熟練のプログラマー(40,273ポイント)   Date: 2009/05/14(木) 15:39   No:33423     
Title: Re:経過時間    
clockならWindowsでも使えます。


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

Name: やそ  ..比類無きプログラマー(88,107ポイント)   Date: 2009/05/14(木) 16:00   No:33427     
Title: Re:経過時間    
time.h
が置いてあるフォルダの位置はあってます?


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

Name: TKOZ  ..上級者(22,158ポイント)   Date: 2009/05/14(木) 18:32   No:33434     
Title: Re:経過時間    
グローバル変数int sec=0;とし、
void STimer(void)
{
sec=GetTickCount();
}
でタイマーをセットし、
int PutTimer(void)
{
return (GetTickCount()-sec)/1000;
}
で、STimer()からかかった秒数を計算できます。
Windows限定ですが、参考にしてください。


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



Name: ほのか  ..ぴよぴよ(742ポイント)   Date: 2009/05/13(水) 10:01   No:33371       
Title: 住所録プログラムで…    
添付ファイルのソースをご覧頂きたく思います。
データを変更する関数内の「データを変更します。よろしいですか」で「N」を入力した際、「変更する項目番号は?」のところに戻りたいのですが、どうすれば戻れるでしょうか?
それと、変更データを入力したあと変更データ以外のデータが文字化けするのですが…
何か解決策があれば教えていただけると幸いです;


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


Name: Mist  ..熟練のプログラマー(60,222ポイント)   Date: 2009/05/13(水) 10:40   No:33372     
Title: Re:住所録プログラムで…    
ソース掲載する場合は規約にあるとおりpreタグを使用して字下げしてください。
ソースが読みにくいので解析しにくいです。


Name: pooka  ..かけだし(2,258ポイント)   Date: 2009/05/13(水) 22:49   No:33405     
Title: Re:住所録プログラムで…    
とりあえず文字化けを直してみました。
ざっと見ただけなので、他にもダメなところがあるかもしれません。
直したところはmain関数(あまり関係ないかも)、shinki関数、henkou関数です。
shinki関数は

switch(ans){
case 'Y':
case 'y':
/* テンポラリデータの文字列をコピー */
*data = temp; //<--変更箇所
printf("◆登録完了◆\n\n");
cnt++;
break;
case 'N':
case 'n':
printf("---登録しませんでした---\n\n");
break;
default:
printf("---YかNを入力してください---\n\n\n");
continue;
}

でhenkou関数は

switch(ans){

case 'Y':
case 'y':
for(i=no-1;i<cnt-1;i++){
data[i] = data[i+1];
}
*temp = afterdata; //<--変更箇所
printf( "◆変更完了◆\n\n");
cnt--;
break;
case 'N':
case 'n':
printf("---変更しませんでした---\n\n");
break;
default:
printf("---YかNを入力してください---\n\n\n");
continue;

}

です。
実際の変更は添付ファイルを見てください。
henkou関数の
*temp = afterdata;
だと、変更していない他のメンバも変えてしまっていると思います。
他にもいい方法があると思いますが、

switch(koumoku){
case 1:
strcpy(temp->name,afterdata.name);
break;
case 2:
strcpy(temp->yubin,afterdata.yubin);
break;
case 3:
strcpy(temp->add,afterdata.add);
break;
case 4:
strcpy(temp->tel,afterdata.tel);
break;
case 5:
strcpy(temp->sei,afterdata.sei);
break;
}

こんなかんじにswitch文を使って分けました。

追記

Label1:
printf("変更する項目番号は?(99:終了)");

・(省略)

case 'N':
case 'n':
goto Label1;

のようにgoto文を使ってみるとか


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

Name: ほのか  ..ぴよぴよ(782ポイント)   Date: 2009/05/14(木) 09:42   No:33414     
Title: Re:住所録プログラムで…    
回答ありがとうございます。
変更関数内でswitch文を使ってみたところ、他の住所登録者の名前も変更されてしまうのですが…;
どうしたら直るでしょうか??;


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

Name: pooka  ..かけだし(2,419ポイント)   Date: 2009/05/14(木) 11:12   No:33417     
Title: Re:住所録プログラムで…    
私が今回添付したファイルでも文字化けしますか?
今気付いたのですが、henkou関数内の

for(i=no-1;i<cnt-1;i++){
data[i] = data[i+1];
}

はどういう意図で書かれました?
sakujo関数にもあるようにずらしているみたいですが、henkou関数でも必要ですか?
なので添付したファイルはそこをコメントアウトしています。

後goto文を使って「変更する項目番号は?」のところに戻るようにしています。

もし直らなければもう一度ファイルを添付していただけますか?


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

Name: ほのか  ..ぴよぴよ(823ポイント)   Date: 2009/05/14(木) 11:30   No:33418 解決!     
Title: Re:住所録プログラムで…    
回答ありがとうございます。
変更関数内の
for(i=no-1;i<cnt-1;i++){


}
の部分をなくしたら問題なくできました!

ありがとうございました!


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



Name: ubuntu  ..ぴよぴよ(430ポイント)   Date: 2009/05/12(火) 05:53   No:33336       
Title: 画像処理について    
いつもお世話になっております。
今回画像処理の学習をする中で、まだ初心者なので分からない部分が多々あり質問させてもらいます。
今表色系の変換でRGB値をXYZ値に変換するプログラムを組もうとしているのですが、いろいろ調べた結果、

X=2.7689*R+1.7517*G+1.1302*B
Y=1.0000*R+4.5907*G+0.0601*B
Z=0.0000*R+0.0565*G+5.5943*B

この変換式を用いて各ピクセルの値を変換することまでは分かったのですが、実際プログラムを組む際にどのような手順で組んでいいのか分からずこの場で質問させてもらいました。
何か良いアドバイスお願いいたします。


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


Name: fumi  ..入門者(3,806ポイント)   Date: 2009/05/13(水) 23:14   No:33406     
Title: Re:画像処理について    
RGB値が事前にわかっているなら、変換式に代入するだけなのですが…

もしかしてビットマップなどのファイルのRGB値を読み込んで変換したいということでしょうか?
もしそうなら、DXライブラリの関数を用いるか、バイナリでファイルを読み込みビットマップのフォーマットを調べ、生の画像データ(RGB値)を取り出す必要があります。

あと、変換式が違うかと思います。

ttp://image-d.isp.jp/commentary/color_cformula/XYZ.html


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

Name: s-rush  ..熟練のプログラマー(50,963ポイント)   Date: 2009/05/14(木) 11:01   No:33416     
Title: Re:画像処理について    
DXライブラリを使用しないのであれば、fumiさんのおっしゃるように
バイナリでファイルを読み込む必要がありますね。

手順としては、
fopneでビットマップのファイルを読み込む。
(情報ヘッダの読み込み)
メモリの(動的)確保
freadでデータ部の読み込み
RGB→XYZ変換

といった感じでしょうか?

そこからさらに画像ファイルとして出力するのであれば
(XYZ変換をよく知らないので、画像出力する必要があるのかどうかわかりませんが^^;)
fwriteでデータ部をバイナリに書き込みをすればOKです。


多少端折っている部分もありますが、流れとしてはこんな感じです。


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



Name: R  ..かけだし(2,241ポイント)   Date: 2009/05/03(日) 18:26   No:33006       
Title: 数独を解けるか解けないかの判定をするプログラム    

#include<stdio.h>
#define BUFLEN 80
int map[4][4];
int gyo[4][4];/*gyo[i][m]=0:i+1行に数字m+1が出現していない*/
int retu[4][4];/*retu[i][m]=0:i+1行に数字m+1が出現していない*/
int block[4][4];/*block[i][m]=0:i+1ブロックに数字mが出現していない*/
int count=0;
int numpre(){
int i,j,k,m;
/*配列の初期化*/
for(i=0;i<4;i++)
for(j=0;j<4;j++){
block[i][j]=0; retu[i][j]=0; gyo[i][j]=0;}
for(i=0;i<4;i++)
for(j=0;j<4;j++){
m = map[i][j];
if(m>0){
gyo[i][m-1]=1;retu[j][m-1]=1;
k=(i/2)*2+j/2+1;
block[k-1][m-1]=1;
}
}
/*ここから先に可能性をしぼりこむコードをかく*/
}
int main(void){
char buf[BUFLEN];
int i,j;
for(i=0;i<4;i++){
fgets(buf,BUFLEN,stdin);
sscanf(buf,"%d %d %d %d",
&map[i][0],&map[i][1],
&map[i][2],&map[i][3]);
}

if(numpre()==1)
printf("解けた");
else
printf("解けない");
}


4×4の数独の問題を入力し、それが解けるか否かを出力するプログラムを作成しています。
http://puzzle.lavot.com/java/numberplace/algorithm.html
こちらのアルゴリズムを参考に、行,列,2×2のブロックに1~4の数字が出現しているときに配列gyo,retu,blockに格納するところまで作ったのですが、URLのステップ1,"ある数字が入る可能性のあるマスが1ヶ所しか残っていない場合"の判定をどうするかで詰まりました。
助言をお願いします。
なお、大学の課題なのでmain関数は改変不可です。


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


Name: non  ..熟練のプログラマー(40,345ポイント)   Date: 2009/05/03(日) 19:51   No:33008     
Title: Re:数独を解けるか解けないかの判定をするプログラム    
課題の意味について質問ですが、
数独が解けるか否かというのはどういう意味なのでしょうか?
つまり、数独なら未記入の枠を与えると思うのですが、その枠はどのように
与えるのでしょうか?
もしくは、適当に16個入力された数字が、数独としての矛盾がないかチェックすると
いうことなのでしょうか?

入力データ例を示してもらえますか?

また、
int gyo[4][4];/*gyo[i][m]=0:i+1行に数字m+1が出現していない*/
int retu[4][4];/*retu[i][m]=0:i+1行に数字m+1が出現していない*/
int block[4][4];/*block[i][m]=0:i+1ブロックに数字mが出現していない*/
これらの変数は課題で与えられているのでしょうか?



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

Name: R  ..入門者(2,645ポイント)   Date: 2009/05/03(日) 21:13   No:33014     
Title: Re:数独を解けるか解けないかの判定をするプログラム    
>>課題の意味について質問ですが、
数独が解けるか否かというのはどういう意味なのでしょうか?
 適当に1〜4までの数字で問題を与え
 つまり、数独なら未記入の枠を与えると思うのですが、その枠はどのように
 与えるのでしょうか?


与えた問題に対して、以下の条件を満たす数字の配置ができるとき解けるといいます。空白は0で与えます。
・同一ブロック内に配置された数字はすべて異なっている
・同一行、同一列に配置された数字はすべて異なっている
・最初に問題として与えた数字を上書きしてはいけない
解けるときに1を、解けないときに0を返す関数を作成するのが課題です

>>入力データ例を示してもらえますか?

1 0 0 2
0 0 0 0
0 0 0 1
3 0 0 1
この場合は解けません。


>>また、
int gyo[4][4];/*gyo[i][m]=0:i+1行に数字m+1が出現していない*/
int retu[4][4];/*retu[i][m]=0:i+1行に数字m+1が出現していない*/
int block[4][4];/*block[i][m]=0:i+1ブロックに数字mが出現していない*/
これらの変数は課題で与えられているのでしょうか?

いいえ、main関数以外は与えられていません。


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

Name: non  ..熟練のプログラマー(40,176ポイント)   Date: 2009/05/03(日) 21:35   No:33018     
Title: Re:数独を解けるか解けないかの判定をするプログラム    
空白は0を入力するのですね。理解しました。

私なら、各マスに対し、9つの数字をチェックするための配列を用意します。
例えば、

struct NUM{
int dif_num; //決定された数字
int chk[10]; // 入れる可能性のある数字 0は未使用
}num[4][4];

つまり、あるマスに格納できる数字が1か3なら、
chk[1]とchk[3]を1にします。他は0(booleanの型にしてもいいのですが)

あのアルゴリズムの第1ステップと第2ステップだと第2の方が簡単なので
先に解きたいのでけどね。あの方がいいのでしょうか。
どっちが、先でもいいのかもね。

 


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

Name: R  ..入門者(2,708ポイント)   Date: 2009/05/06(水) 04:04   No:33119     
Title: Re:数独を解けるか解けないかの判定をするプログラム    
nonさんに教えていただいた方法でリンク先ステップ2を実行することができました。
あとはこれを無限ループに組み込んだときの終了条件を考えればなんとかなりそうです。


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

Name: R  ..入門者(2,733ポイント)   Date: 2009/05/14(木) 09:06   No:33413 解決!     
Title: Re:数独を解けるか解けないかの判定をするプログラム    
無事終わりました。nonさんありがとうございました。

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



Name: DB初心者  ..ぴよぴよ(211ポイント)   Date: 2009/05/13(水) 20:26   No:33399       
Title: 無題    
C言語からODBC経由でデータ(レコード?)の追加を行いたいのですが・・。
エラーが出て進めません。
ソースは下記の通りです。
ご解説宜しくお願い致します。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <tchar.h>


#define DATASORCE "OracleDataBasic" //データソース名
#define USER_ID "WRX" //ユーザーID名
#define PASSWORD "STI" //パスワード名
#define RESET 0 //初期化用マクロ
#define TEST_RECORD 7 //レコード数

#pragma comment(lib, "odbc32.lib") //ODBC使用時用ライブラリ

struct person{
char name[20];
char code[20];
char num[20];
char money[20];
};

int main(int argc, char **argv){
/*変数宣言?*/
SQLHENV henv;
SQLHDBC hdbc;
SQLRETURN sqlrc;
HSTMT hstmt = RESET;
RETCODE rc = RESET;
struct person dt[TEST_RECORD];
struct person save;
int iCount = RESET;
int i = RESET;
char insert_test[200];
char char_int[10];

//初期化?
memset(dt, 0x00,sizeof(dt));
memset(&save, 0x00,sizeof(&save));
memset(insert_test,0,sizeof(insert_test));
memset(char_int,0,sizeof(char_int));
SQLAllocEnv(&henv); //環境ハンドルの割り当て
SQLAllocConnect(henv, &hdbc); //接続ハンドルの割り当て

/*接続処理及び接続結果判定*/
sqlrc = SQLConnect(hdbc,_T(DATASORCE), SQL_NTS,_T(USER_ID), SQL_NTS, _T(PASSWORD), SQL_NTS);//SQL接続
if (sqlrc != SQL_SUCCESS && sqlrc != SQL_SUCCESS_WITH_INFO) { //SQLに接続出来なかった時
SQLDisconnect(hdbc); // ODBC接続を切断
SQLFreeConnect(hdbc); // ODBC接続状態のメモリを開放
SQLFreeEnv(henv); // ODBC環境のメモリを開放
return 9;
}

printf("a\n");

SQLAllocStmt(hdbc, &hstmt);

strcpy(insert_test,"insert into atm values('北条','3420','00000020',\'");
strcpy(char_int,"3420");
strcat(insert_test,char_int);
strcat(insert_test,"\');");

/*SQL処理実施*/

//データ追加分
if(SQLExecDirect(hstmt, _T(insert_test), SQL_NTS) == SQL_SUCCESS){ //※ここのinsert_testがおそらく問題点です。
printf("成功");
}else{
printf("失敗");
}
/*ODBC接続処理入れます*/
return 0;
}

使用環境:
C言語:Visual Studio 2008
oracle:Oracle in XE(10g)
(Oracleのデータソース名:OracleDataBasic ユーザーID:WRX

なお、_T(insert_test)を_T("insert into atm values('北条','3420','00000020','10'")にすると
いけました。
修正後(該当部分のみ)のソースを見せていただけると幸いです。
ご解説宜しくお願い致します。


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


Name: ベリ工  ..かけだし(1,311ポイント)   Date: 2009/05/13(水) 21:56   No:33404     
Title: Re:無題    
>なお、_T(insert_test)を_T("insert into atm values('北条','3420','00000020','10'")にすると
>いけました。

と言っているなら普通

>strcpy(insert_test,"insert into atm values('北条','3420','00000020',\'");
>strcpy(char_int,"3420");
>strcat(insert_test,char_int);
>strcat(insert_test,"\');");

のSQL文がきちんとしたSQL構文になっているかを確認しませんか?
なのでinsert_test変数の中身のSQL文が間違っていないか確認してください。

また、SQLExecDirect関数が返却するエラーコード等でどういうエラーか
分からないのですか?


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



Name: ゲーム創!!  ..ぴよぴよ(306ポイント)   Date: 2009/05/05(火) 01:53   No:33066       
Title: FPSの固定    
60FPSで回したいのですが
処理が止まらなくなってしまいます・・・
修正個所がわからないのですがどなたか教えてはいただけないでしょうか?


const DWORD FPS_MAX = 60; // FPS設定
DWORD FPS; // FPS計測値
BOOL EndF = FALSE; // 終了フラグ

//==============================================================================================
// メインループ
//==============================================================================================
void GameMain(void){

//メインループ
while(!EndF){
FPSCount(&FPS); // FPS の計測
}

}

//==============================================================================================
// FPSウェイト
//==============================================================================================
void FPSWait(DWORD wait_time){
MSG msg;
DWORD start_time = timeGetTime();

do{
// メッセージ処理
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}

if(wait_time > 0) Sleep(1); // ちょっと休憩(CPUの占有率を下げるため)
}while(timeGetTime() < wait_time + start_time); // wait_time だけ回る
}

//==============================================================================================
// FPSの固定
//==============================================================================================
void FPSSet(DWORD wait_time){
DWORD StartTime, EndTime, PassTime;

StartTime = timeGetTime();
EndTime = timeGetTime();
PassTime = EndTime - StartTime; // 経過時間の計算
(1000 / FPS_MAX > PassTime)? FPSWait(1000 / FPS_MAX - PassTime) : FPSWait(0); // 待つ。
}

//==============================================================================================
// FPS の計測
//==============================================================================================
void FPSCount(DWORD *fps){
static DWORD before_time = timeGetTime(); // 以前の時間
DWORD now_time = timeGetTime(); // 現在の時間
static DWORD fps_ctr = 0;

if(now_time - before_time >= 1000){
// 初期化
before_time = now_time;
*fps = fps_ctr;
fps_ctr = 0;
}

fps_ctr++;
}



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


Name: Justy  ..伝説なるハッカー(349,872ポイント)   Date: 2009/05/05(火) 02:36   No:33067     
Title: Re:FPSの固定    

>処理が止まらなくなってしまいます・

 意味がよくわかりません。どういう状況で止まらないのでしょうか?


 強いてこのコードから読み取れる問題点を挙げるとしたら、2点ほど。

・ PeekMessage()がメインループから呼ばれていない可能性がある
・ WM_QUITのメッセージがきたときの処理がない。

 ってところでしょうか。


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

Name: ゲーム創!!  ..ぴよぴよ(469ポイント)   Date: 2009/05/05(火) 03:47   No:33068     
Title: Re:FPSの固定    
ご回答ありがとうございます。

void FPSSet(DWORD wait_time)

void FPSSet()
にかえてGameLoopで呼んだら留まるようになりました。

ただFPSを表示してみると61FPSでまわっているのと
GameLoopを呼んでいる位置が間違っているのかもしれないのですが
画面を動かすと処理が止まってしまいます。


以上の2点を修正したいのですが
どのようにすればよいのでしょうか?



//ウィンドウの生成
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{

            〜処理〜


GameMain(); // ここ
ReleaseDC(hWnd, hDC_Wnd);

return TRUE;
}




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

Name: ゲーム創!!  ..ぴよぴよ(544ポイント)   Date: 2009/05/11(月) 21:39   No:33321     
Title: Re:FPSの固定    
自分なりに調べてみたのですが40FPSをうわまることはできませんでした・・・
またやはりウインドを動かしてしまうと処理が止まってしまうのと
かなりカクカク動いてしまいます。

ソースが長すぎてはりつけることができませんでしたので
txtを添付します。

何度も質問すいません。


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

Name: Justy  ..伝説なるハッカー(352,602ポイント)   Date: 2009/05/12(火) 00:33   No:33330     
Title: Re:FPSの固定    

>40FPSをうわまることはできませんでした・

 CPUの処理が追いついていない、ということはないですか?
 環境に問題がなければ、誤差の関係で指定した FPS値になる保証はありませんが、
近い値になるはずです。



>ウインドを動かしてしまうと処理が止まってしまうのと

 ウインドウをドラッグで動かした時ということでしょうか?
 たしかに一瞬 fpsが低下しますね。

 であれば、メインの処理(fpsの計算など)を別スレッドで行うようにしてみては
どうでしょうか。
 
 これならウインドウの状態やメッセージ処理中であっても、ユーザー側の処理を
行うことができます。



# ところで BitBltをそんなところで実行するといろいろ問題がありそうな気がしますが……。


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

Name: ゲーム創!!  ..ぴよぴよ(656ポイント)   Date: 2009/05/12(火) 05:53   No:33335     
Title: Re:FPSの固定    
ご回答ありがとうございます
const DWORD FPS_MAX = 60; // FPS設定
を160とかまであげると数値も64近辺を行き来します・・・
なのでCPU関係ではないかと思ったのですが・・・
FPSWaitなどはあっているのでしょうか?


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

Name: Justy  ..伝説なるハッカー(352,812ポイント)   Date: 2009/05/12(火) 19:04   No:33354     
Title: Re:FPSの固定    

>FPSWaitなどはあっているのでしょうか

 FPSSetでほとんどのケースで PassTimeは 0になります。
 それから timeGetTime()の精度を timeBeginPeriod()、timeEndPeriod()を使って
上げておいた方がいいかと思います。

 フレームレート制御周りで、おかしいところはそれくらいです。


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

Name: ゲーム創!!  ..ぴよぴよ(88ポイント)   Date: 2009/05/12(火) 22:55   No:33362     
Title: Re:FPSの固定    
>>justyさん
ご回答ありがとうございます。
timeBeginPeriod()らの引数に1を渡して試してみたのですが
ダメでした・・・・

FPSSetがおかしいのでしょうか?

http://zahyou.hp.infoseek.co.jp/cgame/fps_f.htm

を参考に作っているのですがなぜか定義した値より少ない40しかまわりません。
またいくつかのサイトを見て回ったところプログラムでは
1秒は1000で扱っているみたいなことがあったのですが
それは関係ないですよね・・・


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

Name: Justy  ..伝説なるハッカー(352,927ポイント)   Date: 2009/05/13(水) 00:10   No:33366     
Title: Re:FPSの固定    

>定義した値より少ない40しかまわりません

 PassTimeが 0になる件は修正されていないようですが、直しても影響はないのでしょう。
 添付のソースだとどうなりますか?


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

Name: ゲーム創!!  ..ぴよぴよ(97ポイント)   Date: 2009/05/13(水) 20:29   No:33400     
Title: Re:FPSの固定    
できました><
Justyさんには何度も助けていただけて
感謝しています。

ありがとうございます。


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



Name: 研修生  ..初心者(5,359ポイント)   Date: 2009/05/13(水) 14:27   No:33377       
Title: 連続した文字列の位置    
getcharで入力した文字列の中に連続した2個以上の連続した空白がある場合1つの空白に置き換えるプログラム
を作っている所ですが・・getcgarで入力した1行の文字列の中の連続した空白の始まりの位置を終わりの位置について
導きだせないのでおしえてください。

s=a○○○aのときs[1]の1が始めの位置で終わりはs[3]の3です。この数字2つを求めたいのですが

char s[1000];
int c, x;


//入力した文字を配列sにいれる
for(int i=0; i<(c = getchar()) != EOF && c != '\n'; ++i){
s[i] = c;
}

//位置を探す
for(int j=0; j<i; j++){
if(s[j] == s[j + 1] && s[j] ==' '){
x = j;
}
}


まだ全然できていないんですがここからわかりません・・
位置を探すプログラムですが例えばa○○aなら正しく動くんですが
a○○○aやそれ以上の空白があるとxの値が更新されうまくいきません。
多分やり方がおかしいと思います。どのようにすれば導き出せるか教えて下さい。






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


Name: GPGA  ..熟練のプログラマー(61,979ポイント)   Date: 2009/05/13(水) 14:43   No:33378     
Title: Re:連続した文字列の位置    

前のプログラムのときから気になっていますが、for文のループ継続条件の
i<(c = getchar()) != EOF
の意味を、きちんと理解していますか?

1, c = getchar()を実行する
2, i < c を実行する。この結果を仮にxとする
3, x != EOF を実行する。
ということをやっているのですよ。

以下、位置を求めるプログラム。
最終目的の空白を詰めるのに役立つかどうかは別。
#include <stdio.h>
#include <string.h>

int main()
{
const char* s = "a a b b c";
const int len = strlen(s);
int cnt = 0;
for (int i = 0; i < len; ++i) {
if (s[i] == ' ') {
if (cnt == 0) {
cnt = i;
printf("空白開始ポイント:%d\n", cnt);
} else {
++cnt;
}
} else {
if (cnt != 0) {
printf("空白終了ポイント:%d\n", cnt);
}
cnt = 0;
}
}
}

 



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

Name: Mist  ..熟練のプログラマー(60,304ポイント)   Date: 2009/05/13(水) 14:55   No:33379     
Title: Re:連続した文字列の位置    
私の会社の新人研修と同じ問題でびっくり。

> 連続した2個以上の連続した空白がある場合1つの空白に置き換える

この仕様を満たせばいのであればこんなめんどくさいことはしないです。
「//入力した文字を配列sにいれる」の部分で「今読んだ文字が空白の場合、ひとつ前の文字が空白だったら配列に入れない」とすればいいだけです。



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

Name: 研修生  ..初心者(5,276ポイント)   Date: 2009/05/13(水) 16:22   No:33381     
Title: Re:連続した文字列の位置    
そんなやり方もあったんですね。それでちょっとくんでみたら

int main()
{
int i,c;
char s[1000];
for(i = 0; i < (c= getchar()) != EOF && c!= '\n'; ++i){
if(c == ' ' && s[i - 1] == ' '){
;
}

else{
s[i] = c;
}

}

printf("%s", s");
return 0;
}


これうまくいかないんですがどこかおかしいでしょうか?
デバッグでみればわかるかもなのですが超絶ド素人の為ステップインしていくと
for(i = 0; i < (c= getchar()) != EOF && c!= '\n'; ++i){
のところで下記画像のようなのがでてきてしまいます。
開発環境はVisualC++ 6.0です。


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

Name: 研修生  ..初心者(5,287ポイント)   Date: 2009/05/13(水) 16:24   No:33382     
Title: Re:連続した文字列の位置    
これのせいで中身が上手く見れません・・

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

Name: 御津凪 [URL]  ..比類無きプログラマー(86,993ポイント)   Date: 2009/05/13(水) 16:27   No:33383     
Title: Re:連続した文字列の位置    
おそらく、ステップインで getchar() の中に入っていませんか?
(ソースデータが見つからないのでこのようなダイアログが出ます)
ステップオーバーで進めると、関数の中には入らないようになります。


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

Name: 研修生  ..初心者(5,333ポイント)   Date: 2009/05/13(水) 16:38   No:33384     
Title: Re:連続した文字列の位置    
デバッグはできました・・ ありがとうございます。
見るとa○○aを入力すると
i=2のときにifに入ってませんね・・
値は一致してるのになんでだろ・・


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

Name: Mist  ..熟練のプログラマー(60,396ポイント)   Date: 2009/05/13(水) 16:43   No:33385     
Title: Re:連続した文字列の位置    
> s[i - 1]

うん、何となくこの失敗するような気がしてました。
iは0から始まるからi=0のときs[-1]を参照することになります。
範囲外アクセスです。

ヒント:最初の一文字目が「空白が連続した場合」という条件にヒットすることはありえるでしょうか。


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

Name: Mist  ..熟練のプログラマー(60,422ポイント)   Date: 2009/05/13(水) 16:48   No:33386     
Title: Re:連続した文字列の位置    
あと、GPGAさんの指摘をもう一度よく読みなおして。

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

Name: 初級者  ..初心者(5,317ポイント)   Date: 2009/05/13(水) 17:06   No:33387     
Title: Re:連続した文字列の位置    

こんな感じ?

#include <stdio.h>

enum { NON_BLANK, BLANK, BLANKS };

int main(void)
{
int c, mode = NON_BLANK;

while ((c = getchar()) != EOF) {
if (c != ' ') {
switch (mode) {
case BLANK: case BLANKS:
putchar(' ');
/* fall thru */
case NON_BLANK:
putchar(c);
mode = NON_BLANK;
break;
}
}
else {
switch (mode) {
case NON_BLANK:
mode = BLANK;
break;
case BLANK: case BLANKS:
mode = BLANKS;
break;
}
}
}
return 0;
}




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

Name: 研修生  ..初心者(5,366ポイント)   Date: 2009/05/13(水) 17:07   No:33388     
Title: Re:連続した文字列の位置    
for(i = 0; i < (c = (getchar() != EOF)) && c != '\n'; i++)
にしろってことかな・・ なんかおかしいのはわかったきがする・・


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

Name: 御津凪 [URL]  ..比類無きプログラマー(87,150ポイント)   Date: 2009/05/13(水) 17:25   No:33390     
Title: Re:連続した文字列の位置    
> for(i = 0; i < (c = (getchar() != EOF)) && c != '\n'; i++)



これでは、
"getchar() != EOF" で比較した結果(真偽値)を c に代入し、
それ( c )と i の比較をする、
という処理順序になります。
これだと c に入力した文字が入りませんし、正しくループされません。

for(i = 0; i < 1000 && (c = getchar()) != EOF && c != '\n'; i++)



が、正しいかと思います。


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

Name: 研修生  ..初心者(5,412ポイント)   Date: 2009/05/13(水) 17:30   No:33391     
Title: Re:連続した文字列の位置    
初級者さんの提示されたプログラムだとちゃんとできました。ありがとうございました。
自分が今までやってきた方法でもやってみようとおもいます。


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

Name: 研修生  ..初心者(5,433ポイント)   Date: 2009/05/13(水) 17:34   No:33392     
Title: Re:連続した文字列の位置    
そういうことか・・
確かにcに文字が入らないですね


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

Name: 初級者  ..初心者(5,355ポイント)   Date: 2009/05/13(水) 17:48   No:33393     
Title: Re:連続した文字列の位置    
あのソースはどういう考え方によって書いてあるのかを、よく吟味してください。

「動いた〜」だけではダメですよ。


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

Name: 研修生  ..初心者(5,510ポイント)   Date: 2009/05/13(水) 18:02   No:33394     
Title: Re:連続した文字列の位置    
それなんですよ。じっくりデバッグで辿っていくと正しいプログラムだというのはわかります。
しかしこれが自分で思いつけるか?といったら少し厳しい気がします。
どういう発想で作ったのか理解していくのが大事なのかな


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

Name: 初級者  ..初心者(5,802ポイント)   Date: 2009/05/13(水) 18:29   No:33398     
Title: Re:連続した文字列の位置    

【考え方】
今、自分がどういう状態にいるか(モード)の概念を導入します。

モードには次の3種類があります。
1)非空白モード(NON_BLANK、初期値)
2)1文字空白モード(BLANK)
3)連続空白モード(BLANKS)

各々のモードに対して、入力した1文字が非空白か空白かが対応します。
入力文字とモードの組合せは、下表の6とおりあります。
あのソースは、下表をそのままコード化しただけです。


+-----------+-----------+----------------+----------------+
| モード | 非空白 | 1文字空白 | 連続空白 |
| | NON_BLANK | BLANK | BLANKS |
|入力 | | | |
+-----------+-----------+----------------+----------------+
| | そのまま | 空白&そのまま | 空白&そのまま |
| 非空白 | 出力して | 出力して | 出力して |
| | NON_BLANK | NON_BLANK | NON_BLANK |
| | モードへ | モードへ | モードへ |
+-----------+-----------+----------------+----------------+
| | 何も | 何も | 何も |
| 空白 | 出力せず | 出力せず | 出力せず |
| | BLANK | BLANKS | BLANKS |
| | モードへ | モードへ | モードへ |
+-----------+-----------+----------------+----------------+


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



Name: 初心者  ..プログラマー(32,221ポイント)   Date: 2009/05/13(水) 18:04   No:33395       
Title: myShape.hというヘッダファイルを開きたいのですが    
No:22813 の添付ファイルにmyShape.hというヘッダファイルがあるようなのですが、どうやったら見れますか?
記事は下のリンクからいけると思います。
http://www.play21.jp/board/formz.cgi?action=res&resno=22813&id=dixq&lognum=72&from=tree#22813

実はmyShape.hというヘッダファイルを探しているのですが、サイトによってヘッダファイル内の内容が違ってる上に、どのファイルもインクルードできなくて困っています。せめて、上の記事にあるヘッダファイルだけでも手に入れたいと思っています。
どうかよろしくお願いします。


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


Name: 御津凪 [URL]  ..比類無きプログラマー(87,311ポイント)   Date: 2009/05/13(水) 18:23   No:33396     
Title: Re:この掲示板について質問    
この掲示板では、トピックが過去ログへ流れると、添付されたファイルが自動的に削除されます。
よって、過去ログの添付ファイルはサーバー上にないので見れません。

例外として、管理人さんが独自で添付ファイルを保存していることがあります。
もし No:22813 の添付ファイルが保存されているのであれば、見られるかもしれません。
(望み薄ですが)

この過去ログの添付ファイルは、そのとき私は閲覧・回答のために一時的に保存していましたが、
回答が済んだら削除しているため、今は手元にありませんので悪しからず。


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

Name: 初心者  ..プログラマー(32,278ポイント)   Date: 2009/05/13(水) 18:25   No:33397 解決!     
Title: Re:この掲示板について質問    
返答ありがとうございます。どうりでいくら探しても見つからないと思いました。
では、また別のところで探してみたいと思います。


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



Name: yu  ..プログラマー(26,928ポイント)   Date: 2009/05/13(水) 08:58   No:33370       
Title: フルパワー時のアイテム変更について    
こんにちは。
このサイトのプロジェクトを使ってシューティングゲームを作らせていただいている者です。

東方等のシューティングゲームでは、パワーMAXの時は、敵はパワーアイテムの代わりに得点アイテムを落としますよね。
あのシステムを実装したいのですが、よくやり方がわかりません。

どなたか教えて頂けないでしょうか?
お願いします。


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


Name: 御津凪 [URL]  ..比類無きプログラマー(86,843ポイント)   Date: 2009/05/13(水) 14:12   No:33376     
Title: Re:フルパワー時のアイテム変更について    
どのアイテムを出すかを指定できる部分で、
パワーMAXの時はパワーアイテムを得点アイテムに差し替えるように指定すれば可能かと思います。

龍神録プログラミングの館の39章を例にとると、
アイテム登録関数内の、
item[k].knd =item_n[i];



を、
item[k].knd =((item_n[i] == 0 || item_n[i] == 4) && /*パワーMAXか?*/) ? 1 : item_n[i];



のように変えるだけでできるはずです。
(/*パワーMAXか?*/ の部分は同等の条件に置き換えてください)


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

Name: yu  ..プログラマー(26,953ポイント)   Date: 2009/05/13(水) 17:14   No:33389     
Title: 実装できました!    
実装できました!

回答ありがとうございましたm(__)m


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



Name: クロマ  ..ぴよぴよ(90ポイント)   Date: 2009/05/12(火) 22:17   No:33359       
Title: 今日習ったばかりなのですが…    
初めまして、クロマと申します。C++超絶初心者です、どんなおばかも救ってくれるサイト様だと聴いて
やってきました。 今日学校で習ったばかりの演算子の質問をさせてください、課題がだされているので
そこからお聞きしたいと思います。

char型変数dataの0ビット目のみ0にして、その他のビットは変化させないようにする演算式を作りなさい

という課題です、データ型や変数の定義や表記法、制御文字列等の理解は出来ているのですが、ビットシフトや
ビットセットの類が物凄く苦手で、そのての演算式だけが出来ないんです。 何か有効な勉強方法を教えて頂けたらありがたいですm(-.-)m 今回の課題も解説して頂けますでしょうか? よろしくお願いします。


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


Name: クロマ  ..ぴよぴよ(123ポイント)   Date: 2009/05/12(火) 22:31   No:33360     
Title: Re:今日習ったばかりなのですが…    
すみません、先ほどのクロまです。アドレスを忘れてマシた!
ドジですいません!


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

Name: たかぎ [URL]  ..ハッカー(100,743ポイント)   Date: 2009/05/12(火) 23:20   No:33363     
Title: Re:今日習ったばかりなのですが…    
たぶん求めている回答ではありませんが、まずは正直に解説します。

> char型変数dataの0ビット目のみ0にして、その他のビットは変化させないようにする演算式を作りなさい

この課題は非常に難度が高いものです。
問題となる点を以下に列挙します。

・char型が符号付きか符号無しかは処理系定義
・符号付き整数を右シフトした場合の動作は処理系定義
・負の値を持つ符号付き整数の左シフト、または符号付き整数表現範囲を超える左シフトは未定義の動作
・符号付き整数に対するビット演算の結果は処理系定義
・符号付き整数から符号無し整数に型変換した場合、変換後の型の最大値+1を法とする剰余になる
・符号無し整数から符号付き整数に型変換した場合、変換後の型の表現範囲を超えていれば、処理系定義の値になるか、処理系定義のシグナルが発生
・符号付き整数に対するビット演算またはシフト演算の結果、トラップ表現が生じる可能性あり

これらを考慮すると、char型が符号付きの場合、
data = (char)(data / 2 * 2);


とするしかないように思います。

ただし、負の値に1の補数表現を使う場合、-1 / 2 * 2は0になるわけですが、これが-0になってくれるかどうかは処理系定義です。
となると、処理系に依存しない実現方法はないような気もします。

最後の手段として、共用体の使用も考えられますが、代入したメンバとは異なるメンバを通してデータにアクセスした場合の振る舞いは処理系定義なってしまいますので、やはりだめです。


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

Name: クロマ  ..ぴよぴよ(215ポイント)   Date: 2009/05/12(火) 23:40   No:33365 解決!     
Title: すばやい回答ありがとうございます!    
たかぎ さん、急な質問に対しての回答ありがとうございました!!
内容も親切でとても解かりやすかったです。
課題の発表が明日だったのですが、自信を持って臨めます!
本当にありがとうございました!!(⌒▽⌒)


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

Name: toyo  ..プログラマー(32,672ポイント)   Date: 2009/05/13(水) 08:00   No:33369     
Title: Re:すばやい回答ありがとうございます!    
いや
求めてる回答ではない
とわざわざ書かれていますよ

data = data & 0xFE;
でいいと思います


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

Name: たかぎ [URL]  ..ハッカー(100,775ポイント)   Date: 2009/05/13(水) 16:11   No:33380     
Title: Re:すばやい回答ありがとうございます!    
> data = data & 0xFE;

これはダメでしょう。
普通は、

data = data & ~1;

です。


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



Name: yasya  ..入門者(3,603ポイント)   Date: 2009/05/11(月) 00:38   No:33289       
Title: 文字の表示が・・・    
こんばんは。
今、ゲームプログラミングの館などを参考にして文字をノベルゲーム風に表示させる関数を作っているのですが、文字の表示がおかしなことになって文字が表示されません・・・。
どうしたらいいか教えてください。
詳しくはファイルを添付するので、そちらを参照してください。


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


Name: Justy  ..伝説なるハッカー(351,798ポイント)   Date: 2009/05/11(月) 02:15   No:33291     
Title: Re:文字の表示が・・・    

>どうしたらいいか教えてください

 まず、one_moji_bufの一文字しか表示しない、というところを直してください。
 
 画面はメインループの ClearDrawScreen()によって毎フレーム綺麗さっぱり全て消去されます。
 従って、表示したい文字は全て毎フレーム表示し直す必要があります。

 そのあたりに注意して直してみてください。


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

Name: yasya  ..入門者(3,638ポイント)   Date: 2009/05/12(火) 17:58   No:33353     
Title: Re:文字の表示が・・・    
> まず、one_moji_bufの一文字しか表示しない、というところを直してください。

すいません、具体的にどうしたらいいかアドバイスだけでも教えてもらえませんか^^;


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

Name: Justy  ..伝説なるハッカー(354,083ポイント)   Date: 2009/05/13(水) 00:28   No:33367     
Title: Re:文字の表示が・・・    
 一文字だけ表示して終わり、にしないで、指定された文字数目までを切り出した文字列を作ってください。
 
 たとえば「あいうえおかきくけこ」という文字列があるとき、3文字目まで、なら「あいう」を、
5文字目までなら「あいうえお」となるように。

 これは大元の文字列から切り出せばいいでわけですが、切り出す際に改行や画面外判定などを
入れて必要に応じて改行をします。

 その改行の際に、切り出した文字列を表示すればいいかと思います。


 以下はサンプルです。

void writetring( int X, int Y, CString CS, int color )
{
    CString s;
    int yOffset = 0;
    
    for(int n=0; n<cp; n+=2)
    {
        bool draw = false;
        bool cr = false;
        
        if(CS[n] == 'K')
        {
            cp++;
            ++n;
            cr = draw = true;
        }
        else
        if(CS[n] == '\0' || CS[n] == 'E')
        {
            end_flag = 1;
            draw = true;
        }
        else
        {
            char t[] = { CS[n], CS[n+1], '\0' };
            s += t;
            if(X + GetDrawStringWidth(s.GetString(), s.GetLength(), 0)> 640 - MOJI_SIZE)
            cr = draw = true;
            
            if(n + 2 >= cp)
                draw = true;
        }
        
        if(draw)
        {
            DrawString( X , Y + yOffset, s.GetString() , color );
            s.Clear();
        }
        
        if(cr)
            yOffset += 16;
    }
    
    if(!end_flag)
        cp += 2;
}


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

Name: yasya  ..入門者(3,698ポイント)   Date: 2009/05/13(水) 12:09   No:33373 解決!     
Title: Re:文字の表示が・・・    
Justyさんどうもありがとうございます^^
何とかなりそうなので、あとは自分で調べてがんばってみようと思います。


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



Name: ひよこ  ..プログラマー(30,442ポイント)   Date: 2009/05/11(月) 23:41   No:33328       
Title: 敵の画像を進行方向に向けたい    
はじめまして。大変お世話になっています。初心者です。
EnemyPattarnの円運動を参考にして、
左上から右下へ向かい中央で円運動して左斜め下へ
向かうとか、数パターン作ってみたんですが、
Enemyの画像が宇宙船タイプなので、
Enemyが常に下を向いているのでは違和感を感じます。
進行方向を向く方法のアドバイスをお願いします。


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


Name: MNS  ..初心者(7,847ポイント)   Date: 2009/05/12(火) 06:02   No:33337     
Title: Re:敵の画像を進行方向に向けたい    
DrawRotaGraph関数を使うと良いと思います。
http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_graph.html#R3N10

移動量を角度で求めている場合は話は早いですが、
移動量をベクトルで求めている場合は、atan2などの関数で
角度に変換する必要があるかもしれません。


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

Name: ひよこ  ..プログラマー(30,687ポイント)   Date: 2009/05/12(火) 07:49   No:33338 解決!     
Title: Re:敵の画像を進行方向に向けたい    
MNSさん、ありがとうございます。
atan2ですか。
敵弾の場合はplayer.x,player.yがあるので
atan2が使えますが、enemy[i]の場合は目標がありません。

出現時の角度は分かっているので、それ以降は10個古い座標を
記憶して一番遠い座標といまの座標でatan2を求めればいいのかと
考えいろいろやってみましたが、記憶の仕方が悪いのか、
考え方自体が悪いのか、結果が出ませんでした。

atan2を使う方向で試行錯誤してみたいと思います。
今回は弱音を吐くのが早すぎたようです。
ありがとうございました。


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

Name: MNS  ..初心者(8,064ポイント)   Date: 2009/05/12(火) 17:20   No:33351     
Title: Re:敵の画像を進行方向に向けたい    
敵の移動量はどうやって求めているのでしょうか?

例えば、敵が斜め右下に移動する場合、
ベクトルで移動量を求めるとすると、
enemy.x += 1;
enemy.y += 1;
などとやることになりますが、
この時の角度は、atan2(1,1)で求めることができます。

角度で求める場合は、
double theta = 4.7123889803846898576939650749193;
enemy.x += cos(theta);
enemy.y += sin(theta);
で移動量が求められますが、
この場合はこのthetaをそのまま使えばいいです。

(DrawRotaGraph関数で使う場合は、角度に90度分のラジアンを足す必要があります)



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

Name: ひよこ  ..プログラマー(30,730ポイント)   Date: 2009/05/12(火) 20:49   No:33355     
Title: Re:敵の画像を進行方向に向けたい    
MNSさん、ありがとうございます。
ここで勉強させてもらっていますので
enemy.x += 1;
enemy.y += 1; です。

サンプルのプログラムでは
enemy.vx = 1;
enemy.vy = 1;
enemy.x += enemy.vx;
enemy.y += enemy.vy;
となっているので
atan2(enemy.vy, enemy.vx)
というかんじでしょうか。
さっそく試してみたいと思います。
ありがとうございました。


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

Name: ひよこ  ..プログラマー(30,957ポイント)   Date: 2009/05/12(火) 21:30   No:33356     
Title: Re:敵の画像を進行方向に向けたい    
さっそくやってみました。

void enemy_enter(){ の下のほうにある

// enemy[i].vx = 0;
// enemy[i].vy = 0;をコメントアウトして
enemy[i].ang = 0;を
enemy[i].ang = atan2(enemy[i].vy,enemy[i].vx);
としたら、やはり
enemy[i].vx = 0;
enemy[i].vy = 0; は必要なようなので
void enemy_act()関数の中へ移動しました。
結果は、確かに移動中に向きが変わりました。
まだ完全ではないのでMNSさんのアドバイスを
参考にして詰めていきたいと思います。




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

Name: MNS  ..初心者(8,159ポイント)   Date: 2009/05/12(火) 22:16   No:33358     
Title: Re:敵の画像を進行方向に向けたい    
そちらでどのようなコードを書いていらっしゃるかわからないのですが、
ひよこさんの言うとおり、atan2(enemy.vy, enemy.vx)などで求めればよいと思います。

どうやら、ang という変数がenemy構造体にあるようですね。
恐らく、ひよこさんは初期化の段階で角度を求めようとされたと思うんですが、
特に、「左上から右下へ向かい中央で円運動して左斜め下へ 向かう」
などの動きは、時間によってenemy[i].vx,vyの値が変わってくるはずです。
その値を決める処理が書かれているところで、一緒にangの値を求めればいいと思います。

描画方法は、
DrawRotaGraph(enemy[i].x, enemy[i].y, 1.0, enemy[i].ang + 1.57, enemy[i].img, TRUE);
のような感じで行えば良いでしょう。

頑張ってください。


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

Name: ひよこ  ..プログラマー(31,467ポイント)   Date: 2009/05/12(火) 23:28   No:33364     
Title: Re:敵の画像を進行方向に向けたい    
シューティングゲームの館の円運動をさせるをちょっとアレンジして
//=====================================================================
// 斜め右下へ途中で円を描いて左斜め下へ
//=====================================================================
void enemy_pattern11(int i){
int t=enemy[i].cnt;
if(t<360){
enemy[i].vx=1.0f;
enemy[i].vy=1.0f;
}
if(t>=360 && t<600){
enemy[i].vx=float(sin(PI*(t-320.0f)/160.0f)*1.2f);//300
enemy[i].vy=float(sin(PI*(t-240.0f)/160.0f)*1.2f);//240
}
if(t >= 600){
enemy[i].vx = -1.0f;
enemy[i].vy = 1.0f;
}
}
これを龍神録プログラミングの館のenemy_act_patternに加えました。
enemy.cppの
//敵の行動制御
void enemy_act(){
int i;
for(i=0;i<ENEMY_MAX;i++){
if(enemy[i].flag==1){//その敵のフラグがオンになってたら
 if(0<=enemy[i].pattern && enemy[i].pattern<ENEMY_PATTERN_MAX) {
enemy_pattern[enemy[i].pattern](i);
          //ここにatan2をいれた
enemy[i].ang =atan2(enemy[i].vy, enemy[i].vx);
// enemy[i].vec.x+=cos(enemy[i].ang)*enemy[i].sp;
// enemy[i].vec.y+=sin(enemy[i].ang)*enemy[i].sp;
enemy[i].vec.x+=enemy[i].vx;
enemy[i].vec.y+=enemy[i].vy;
enemy[i].cnt++;
//敵が画面から外れたら消す
if(enemy[i].vec.x<FLD_X-en_w || FLD_X+FLD_W<enemy[i].vec.x ||
 enemy[i].vec.y<FLD_Y-en_h || FLD_Y+FLD_H<enemy[i].vec.y)
 enemy[i].flag=0;
    if(enemy[i].bltime == enemy[i].cnt)
 enter_shot(i);
}
}
}
}
結果は、大成功です。見事に進行方向を向いたまま
回転しました。
たいへんありがとうございました。


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



Name: 研修生  ..入門者(4,730ポイント)   Date: 2009/05/12(火) 12:16   No:33340       
Title: 文字列を折りたたむ    
長い入力行を入力のn字目にある最後の非ブランク文字の後で折りたたむプログラムを作っています。
イメージとしては文字列のn字目に改行をいれて分ける という風だと考えまして


int main()
{
int c, n, len;
char s[1000];

printf("何文字目で折りたたみますか?");
scanf("%d", &n);
for(int i = 0; i< (c = getchar()) != EOF; ++i){
s[i] = c;
len = getline(s,1000);
if(len > n){
s[n] += '\n';
printf("%s\n", s);
}
else{
printf("NG");
}
}

return 0;
}

int getline(char s[], int lim)//文字列の文字数を数える
{
int c, i;
for(i = 0; i < lim -1 && (c = getchar()) != EOF && c != '\n'; ++i){
s[i] = c;
}

if(c == '\n'){
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}



としたところうまくいきません。というのも改行が埋め込めていないようでして・・
3文字目に折りたたむとしてabcdefgと打ち込むと希望としては
abc
defg
なのですが
abcnefgと出力されてしまいます。
s[n] + '\n'の所がちゃんとできていないんだとおもいます。
どうすればうまくいきますか?



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


Name: tutor  ..ぴよぴよ(143ポイント)   Date: 2009/05/12(火) 13:12   No:33341     
Title: Re:文字列を折りたたむ    
s[n] += '\n';
がダメだと思います。

s[n] = '\n';にしたかったのではないかと思います。


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

Name: tutor  ..ぴよぴよ(151ポイント)   Date: 2009/05/12(火) 13:23   No:33342     
Title: Re:文字列を折りたたむ    
あ、↑だと一文字消えちゃいますね。
改行以降をひとつずつ後ろにずらさないと


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

Name: 研修生  ..入門者(4,788ポイント)   Date: 2009/05/12(火) 13:26   No:33343     
Title: Re:文字列を折りたたむ    
それだと例えば3文字目でabcdefgを入力すると
abc
efgになってa[3]の値がd→'\n'に変わってdが消えちゃうんですよね。
だからd + '\n' という形にしようとしていたいのですが・・
難しいですね。


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

Name: 通りすがり  ..上級者(16,929ポイント)   Date: 2009/05/12(火) 14:32   No:33344     
Title: Re:文字列を折りたたむ    
#include <stdio.h>

#include <string.h>

#define MAXLEN (1000)

int main(void)
{
char s[MAXLEN];
int n;

do {
printf("何文字目で折りたたみますか? > ");
scanf("%d", &n), rewind(stdin);
} while (n <= 0);

while (printf("文字列を入力してください > "), fgets(s, sizeof(s), stdin)) {
char *p = s;
int m = n;

s[strlen(s)-1] = '\0';
if (strlen(s) > n) {
while (m--) {
putchar(*p++);
}
putchar('\n');
}
puts(p);
}
return 0;
}




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

Name: tutor  ..ぴよぴよ(512ポイント)   Date: 2009/05/12(火) 15:04   No:33345     
Title: Re:文字列を折りたたむ    
投稿者はポインタが使いたくないとみたので、配列で頑張りました。
文字列自体の中に改行コードを入れたいのかな?



#include<stdio.h>

int main()

{

int c, n, len;
int i,j;
char t2,t1;

char s[1000];


printf("何文字目で折りたたみますか?");


scanf("%d", &n);

for(i = 0; i< (c = getchar()) != EOF; ++i){

s[i] = c;

len = getline(s,1000);

if(len > n){

//s[n] += '\n';

for(j=n;j<len;j++){
t2=s[j];
s[j]=t1;
t1=t2;
}//改行以降を後ろにずらす
s[n]='\n';//開いてるところに改行を入れる


printf("%s\n", s);

}

else{

printf("NG");

}

}



return 0;

}



int getline(char s[], int lim)

{

int c, i;

for(i = 0; i < lim -1 && (c = getchar()) != EOF && c != '\n'; ++i){

s[i] = c;

}



if(c == '\n'){

s[i] = c;

++i;

}

s[i] = '\0';

return i;

}


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

Name: 通りすがり  ..上級者(16,995ポイント)   Date: 2009/05/12(火) 15:14   No:33346     
Title: Re:文字列を折りたたむ    
投稿者はポインタを使いたくないと思っている、
というのが仮に本当だとして…。

いつまでもポインタを避けて通るわけにはいきません。
今回のような簡単な問題を使って、慣れておく必要があります。
そうしないと、いつかつまづくことでしょう。


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

Name: 研修生  ..入門者(4,895ポイント)   Date: 2009/05/12(火) 16:06   No:33349 解決!     
Title: Re:文字列を折りたたむ    
避けて・・るのかもしれません。まだ配列とポインタの関係理解できてないんですよね。
配列でやったらできるのにポインタでやると実体がないのかプログラムに問題が発生しましたとでて
落ちることがよくあるので・・。 tutorさん、通りすがりさんありがとうございました。


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



Name: 研修生  ..入門者(4,311ポイント)   Date: 2009/05/11(月) 18:36   No:33314       
Title: プログラムの説明    
問題自体が複雑になって理解しずらいのでご質問します

入力されたタブを次のタブ・ストップまでのスペースをうめる適当な数のブランク(空白)で置き換える
プログラムdetabを書け。タブ・ストップの位置は例えばn文字ごとというように固定して考えよ
nは変数にすべきか、記号パラメータにすべきか?


という問題なのですが意味がよくわかりません。何がわからないの?と質問出るかと思いますが
結局実行結果がどんな風になればいいのかがわかれば作りやすいので教えて下さい。
後タブとタブ・ストップの違いがわかりません・・



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


Name: 御津凪 [URL]  ..比類無きプログラマー(86,366ポイント)   Date: 2009/05/11(月) 19:10   No:33316     
Title: Re:プログラムの説明    
(ブラウザでのタブ表現が8文字なら、以下のテキストは希望通りの表示ができているはずです)

まず、タブ(Tab)とは、キーボードの左側にある Tab キーを押すことで入力される文字です。
タブ・ストップは、文字で指定文字分の間隔ごとに右にずらし、揃える機能です。
(タブは英訳で Tab stop と呼ぶので、実質的には同義のはずです)
 ←空白1字

←空白2字
←空白4字
←空白8字
←タブ1字
←タブ2字


上記部分をそれぞれ選択してみると、タブの部分だけまとまって選択されるのがわかると思います。

また、
1	10	100

200 300 400


のように、各文字の間にタブ文字を入れると、行の先頭から指定文字の間隔で右にずれ、
綺麗に並ぶようになります。

(これだけではちょっとわかりづらいかもしれません。図があるともっとわかりやすいのですが)
一応、Wikipedia の解説へのリンクも張っておきますね。

ちなみに「指定文字の間隔」は、 2, 4, 8 文字が一般的で、メモ帳などは 8 文字です。


それで、プログラムの処理内容ですが、
このタブ文字で整形されたレイアウトを崩すことなく、空白文字に置き換える、
ということです。
・実行前(タブは8文字と仮定)


10 000 1 0
100 1 100
1 10 1

・実行後(見た目は変わりませんが、選択してみると置き換えられているのがわかります)

10 000 1 0
100 1 100
1 10 1


という感じです。
(単にタブ文字を指定文字数分の空白に置き換えると、レイアウトが崩れてしまうので注意してください)


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

Name: lbfuvab  ..上級者(20,435ポイント)   Date: 2009/05/11(月) 19:41   No:33317     
Title: Re:プログラムの説明    
nを変更するなら変数で、しないなら定数扱いでいいでしょう。



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

Name: 研修生  ..入門者(4,326ポイント)   Date: 2009/05/12(火) 11:17   No:33339 解決!     
Title: Re:プログラムの説明    
なんとなくわかりました。ありがとうございました。

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

Name: 通りすがり  ..上級者(16,939ポイント)   Date: 2009/05/12(火) 15:52   No:33347     
Title: Re:プログラムの説明    
× 理解しずらい
○ 理解しづらい


よく見かけるまちがいです。
理解するのが「つらい」のです。
理解するのが「すらい」ということばは、ありません。


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



Name: やっくん  ..ぴよぴよ(636ポイント)   Date: 2009/05/10(日) 23:11   No:33285       
Title: プロンプトで文字をゆっくり表示するには    
CUIでRPGを作ってるのですが、
文字がRPG風に1文字1文字or1行ずつゆっくり表示する方法を探しています。
CUIといっても一応会話は作りたいので。

自分が考えたのは一文ごとにキー入力待ちの状態にし、
エンターを押せば次に進むというものです。

何も押さず時間が経つと表示されていく物はできないでしょうか?


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


Name: バグ  ..ハッカー(159,587ポイント)   Date: 2009/05/10(日) 23:36   No:33286     
Title: Re:プロンプトで文字をゆっくり表示するには    
環境が分からないのですが、もしWindowsであれば、conio.h内の_kbhit関数と、windows.h内のSleep関数辺りを利用すればうまくいきそうです。

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

Name: やっくん  ..ぴよぴよ(693ポイント)   Date: 2009/05/10(日) 23:47   No:33287     
Title: Re:プロンプトで文字をゆっくり表示するには    
解答ありがとうございます!
ですが、ごめんなさい;
環境は
OS:LINUX
コンパイラ:GNONE
です><


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

Name: toyo  ..プログラマー(32,654ポイント)   Date: 2009/05/11(月) 08:52   No:33296     
Title: Re:プロンプトで文字をゆっくり表示するには    
GNOMEはコンパイラの名前ではありませんよ。デスクトップ環境の名前です。
Linuxのコンパイラなら普通gccでしょう。
#include <unistd.h>
して
sleep( )関数で待つのはどうでしょう。


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

Name: バグ  ..ハッカー(159,664ポイント)   Date: 2009/05/11(月) 12:13   No:33298     
Title: Re:プロンプトで文字をゆっくり表示するには    
待機するだけでは、「エンターキーが押された場合に次に進む」という仕様に対応できないのではないでしょうか?

「Linux キー入力」でググるとそれらしいサンプルが結構ヒットしますので、調べてみるとよいかと思います(^-^)


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

Name: やっくん  ..ぴよぴよ(730ポイント)   Date: 2009/05/11(月) 16:40   No:33311 解決!     
Title: Re:プロンプトで文字をゆっくり表示するには    
toyoさん
なるほど・・・。
GNOMEはコンパイラの名前ではなかったのですね

関数を教えていただきありがとうございます!
その様な関数があったのですか><
いくら探しても見つけることができなかったのでとても感謝してます。
使ってみると、うまく作動したのでありがたく使わせていただきます♪

バグさん
わざわざ調べていただきありがとうございます
検索してみた結果いっぱいでてきました
見てみた結果、今自分の求めてるものに適しているのはsleep関数の方なので、
ひとまずsleep関数を使うことにしてみます。(お手軽ってこともあって)
ですがこの検索内容のサンプルはまた別の機会に使えそうな気がするので、
参考になりました(^^)


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



Name: 研修生  ..入門者(3,969ポイント)   Date: 2009/05/11(月) 14:53   No:33302       
Title: 空白削除    
getcharで入力した文字列の中の空白を削除するプログラムについてうまくいかないのでご質問します

int main()
{
char s[100];
int c, i;
for(i = 0; i< (c = getchar()) !=EOF && c != '\n'; ++i){
if(c != ' ' || c!= '\t'){
s[i] = c;
}
}

s[i] = '\0';
printf("%s", s);
return 0;
}


と試しに組んでましたが、希望のプログラムにはいたらず空白削除が行なわれていません。
こちらとしては一文字ずつみていって空白かタブがなければsにいれるとしているつもりですが・・


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


Name: Blue  ..中級者(10,103ポイント)   Date: 2009/05/11(月) 15:05   No:33304     
Title: Re:空白削除    
空白というかゴミが入っているような。
スキップしているのに、iを進めるとそこには何も入らないです。


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

Name: Mato  ..ぴよぴよ(748ポイント)   Date: 2009/05/11(月) 15:09   No:33305     
Title: Re:空白削除    
 Blueさんの通り、例えば空白が入力されたとき(このときを仮にIとする)を考えますと、s[I]に何も代入が行われず、未定義状態のままになりますね。

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

Name: tutor  ..ぴよぴよ(1ポイント)   Date: 2009/05/11(月) 15:12   No:33306     
Title: Re:空白削除    
if(c != ' ' || c!= '\t')
この書き方だとcの中身が何であれif文に入るのではないでしょうか?


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

Name: tutor  ..ぴよぴよ(120ポイント)   Date: 2009/05/11(月) 15:22   No:33307     
Title: Re:空白削除    
こんな感じでいいんじゃない?

int main()
{
char s[100];
int c, i,j;

for(i = 0, j = 0; i< (c = getchar()) !=EOF && c != '\n'; ++i){
if(c != ' ' && c!= '\t')
s[j++] = c;
}

s[j] = '\0';
printf("%s", s);
return 0;
}


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

Name: 研修生  ..入門者(4,051ポイント)   Date: 2009/05/11(月) 15:29   No:33308 解決!     
Title: Re:空白削除    
そういうことか・・ 理解できたと思います。
悪い点指摘していただいた方もサンプル提示していただいた方もありがとうございました。


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



Name:  ..ぴよぴよ(40ポイント)   Date: 2009/05/10(日) 21:27   No:33280       
Title: 無題    
はじめまして餅です。
早速ですが質問があります。

グローバル変数などを用意してプログラムを書いているのですが
少し多くなってきましたので関数化しようかと考えています。

しかし普通に関数をつくったらローカル変数になってしまうかと思います。

どうすればよいのでしょうか?


int a = 0; // グローバル変数

int main(void){
return 0;
}


これを

void function(void){
int a = 0; // グローバル変数
}

int main(void){

function();
return 0;
}





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


Name:  ..ぴよぴよ(13ポイント)   Date: 2009/05/10(日) 21:28   No:33281     
Title: グローバル変数を関数に    
タイトルを書き忘れていました。
申し訳ありません。


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

Name: たかぎ [URL]  ..ハッカー(100,471ポイント)   Date: 2009/05/10(日) 21:34   No:33282     
Title: Re:グローバル変数を関数に    
これでどうでしょう?

int *function(void){
static int a = 0; // グローバル変数
return &a;
}


C言語の場合はあまり利点を感じないかもしれませんが、C++だと大きなメリットが出てきます。


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

Name:  ..ぴよぴよ(70ポイント)   Date: 2009/05/10(日) 22:25   No:33283     
Title: Re:グローバル変数を関数に    
>>たかぎさん
それだと複数の変数をもてなくないでしょうか・・・?
できれば複数のグローバル変数をまとめたいのです。


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

Name: たかぎ [URL]  ..ハッカー(100,479ポイント)   Date: 2009/05/11(月) 00:39   No:33290     
Title: Re:グローバル変数を関数に    
> それだと複数の変数をもてなくないでしょうか・・・?
> できれば複数のグローバル変数をまとめたいのです。

構造体にすればよいだけです。


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

Name: non  ..熟練のプログラマー(40,225ポイント)   Date: 2009/05/11(月) 14:21   No:33301     
Title: Re:グローバル変数を関数に    
>グローバル変数などを用意してプログラムを書いているのですが
>少し多くなってきましたので関数化しようかと考えています。

グローバル変数が多くなったから、関数化するメリットって何ですか?


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



Name: 研修生  ..入門者(3,821ポイント)   Date: 2009/05/08(金) 17:53   No:33215       
Title: サンプルプログラム    

#include <stdio.h>
#define MAXLINE 100
int getline(char line[], int maxline);
void copy(char to[], char from[]);

int main(int argc, char* argv[])
{
int len;
int max;
char line[MAXLINE];
char longest[MAXLINE];

max = 0;
while((len = getline(line, MAXLINE))> 0){
if(len > max){
max = len;
copy(longest, line);
}
}

if(max > 0){
printf("%s", longest);
}

return 0;


}

int getline(char s[], int lim)
{
int c, i;
for(i = 0; i < lim -1 && (c = getchar()) != EOF && c != '\n'; ++i){
s[i] = c;
}

if(c == '\n'){
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}

void copy(char to[], char from[])
{
int i;
i=0;
while((to[i] = from[i]) != '\0'){
++i;
}
}


このサンプルプログラムは一群の行を読み込んで一番長い行をプリントするプログラムとのことですが
何が行なわれているのかさっぱりです。実行してみてもずっと入力で、何もでてきません・・
説明していただける人いませんか?



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


Name: Mist  ..熟練のプログラマー(60,185ポイント)   Date: 2009/05/08(金) 18:03   No:33216     
Title: Re:サンプルプログラム    
> 実行してみてもずっと入力で、何もでてきません・・

「Ctrl+C」か「Cntl+Z エンター」すればgetlineが-1を返すから終了しますよ。


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

Name: 初級者  ..入門者(4,975ポイント)   Date: 2009/05/08(金) 18:27   No:33217     
Title: Re:サンプルプログラム    
Ctrl+C
は有無をいわせず強制終了するので、
思い通りの結果を得ることが
できないのではないでしょうか。


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

Name: Mist  ..熟練のプログラマー(60,222ポイント)   Date: 2009/05/08(金) 18:45   No:33218     
Title: Re:サンプルプログラム    
ん〜、私の環境だとCtrl+Cでも正常に動作しますね。(WinXP SP3 + BCC)
たまたまでしょうか?


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

Name: Kou  ..入門者(4,537ポイント)   Date: 2009/05/08(金) 19:25   No:33219     
Title: Re:サンプルプログラム    
getchar()はCtrl+SでEOF、つまり-1を返したと思います。
最近使用していない関数なので曖昧ですが・・・

※上記Ctrl+SはCtrl+Zの間違いでした。お詫びして訂正します。


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

Name: 研修生  ..入門者(3,837ポイント)   Date: 2009/05/11(月) 10:38   No:33297 解決!     
Title: Re:サンプルプログラム    
報告忘れていました。Ctrl+Zでできました。ありがとうございました。

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

Name: 初級者  ..入門者(4,981ポイント)   Date: 2009/05/11(月) 12:38   No:33300     
Title: Re:サンプルプログラム    
Ctrl+C
でOKでした。
失礼いたしました。


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



Name: 大工  ..プログラマー(33,553ポイント)   Date: 2009/05/10(日) 13:38   No:33273 解決!       
Title: コピーコンストラクタが呼ばれる回数    
ダイクストラ法を実行するプログラムを作っています.(まだ骨組みですが^^;

fromWhatクラスを要素にもつvectorの初期化をinit_path関数で行っています.
具体的な内容は

char from_ -> どのノードから来たのか 初期値は '-'
int what_ -> ここまでにどれくらいコストがかかったのか 初期値は UNDEF(= -1)

です.

久しぶりにC++を触るのでコピーコンストラクタが動いてるのかな?と確認したとろこ

実行結果:
before
0x804c008call
hoge
0x804c018call
0x804c020call
hoge
0x804c030call
0x804c038call
0x804c040call
hoge
after

が得られました.

いま,sizeを3としているのですがコピーコンストラクタが僕の予想では3回だったのに
予想を上回る回数が呼び出されています.(グラフのサイズが大きくなるとこの回数は無視できない気がします.

なぜこの様な事態が起こってしまうのでしょうか?

理想的な形としてはpush_backする度にコピーコンストラクタが1度呼ばれる -> この繰り返し

です.これは可能でしょうか?


#include<iostream>
#include<vector>
#include<map>
#include<list>

// MACROS
#define UNDEF -1

// STRUCT
class fromWhat {

public:
fromWhat(char _from, int _what);
fromWhat(const fromWhat& obj);
void from(char _from);
void what(int _what);
char fromShow() {return from_;}
int whatShow() {return what_;}

private:
char from_;
int what_;
};

fromWhat::fromWhat(char _from, int _what) {

from_ = _from;
what_ = _what;
}
fromWhat::fromWhat(const fromWhat& obj) {

std::cout << this;
std::cout << "call" << std::endl;
}
void fromWhat::from(char _from) {

from_ = _from;

return;
}
void fromWhat::what(int _what) {

what_ = _what;

return;
}

// PROTOTYPE DCLARE
void init_path(std::vector<fromWhat>*, int);
void init_adj(std::vector<std::list<char> >*, int);

int main(void) {

//source -> source node
//
//size -> the number of node
//
//path -> store path infomation
// ex:
// path[1]: 1 is node id
// char : from node id
// cost : how cost from source to here
//
//adj -> show adjacency list eace node

int source_;
int size_;
std::vector<fromWhat> path_;
std::vector<std::vector<char> > adj_;

size_ = 3;

std::cout << "before" << std::endl;
init_path(&path_, size_);
std::cout << "after" << std::endl;

// for(int i = 0; i < size_; i++) {
//
// std::cout << "one node" << std::endl;
//
// std::cout << path_[i].fromShow() << std::endl;
// std::cout << path_[i].whatShow() << std::endl;
// }

// adjacency list
// std::vector<char> degree;
//
// for(int i = 0; i < 3; i++) {
//
// degree.push_back('a' + i);
// }
//
// for(int i = 0; i < 3; i++) {
//
// std::cout << degree[i] << std::endl;
// }

// adj_.push_back(degree);
//
// degree.push_back('k');
//
// adj_.push_back(degree);
//
// std::cout << adj_.size() << std::endl;
//
// for(int i = 0; i < adj_.size(); i++) {
//
// std::vector<char>::iterator it = adj_[i].begin();
//
// while(it != adj_[i].end()) {
//
// std::cout << i << ": ";
// std::cout << (*it) << std::endl;
// it++;
// }
// }
//
// adj_.pop_back();
//
// std::cout << adj_.size() << std::endl;
//
// for(int i = 0; i < adj_.size(); i++) {
//
// std::vector<char>::iterator it = adj_[i].begin();
//
// while(it != adj_[i].end()) {
//
// std::cout << i << ": ";
// std::cout << (*it) << std::endl;
// it++;
// }
// }
return 0;
}

void init_path(std::vector<fromWhat>* _path, int _size) {

for(int i = 0; i < _size; i++) {

_path->push_back(fromWhat('-', UNDEF));
std::cout << "hoge" << std::endl;
}

return;
}


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


Name: たかぎ [URL]  ..ハッカー(100,517ポイント)   Date: 2009/05/10(日) 14:18   No:33274     
Title: Re:コピーコンストラクタが呼ばれる回数    
> なぜこの様な事態が起こってしまうのでしょうか?

vectorが内部で管理しているメモリ領域を拡張するたびに、元の領域から新しい領域にコピーする必要があるためです。
多くの実装では、メモリ領域のサイズが倍、倍に拡張されますので...

before
0x804c008call ← push_back
hoge
0x804c018call ← メモリ領域拡張(1個コピー)
0x804c020call ← push_back
hoge
0x804c030call ← メモリ領域拡張(1個コピー)
0x804c038call ← もう1個コピー
0x804c040call ← push_back
hoge
after

ということかと思います。

> 理想的な形としてはpush_backする度にコピーコンストラクタが1度呼ばれる -> この繰り返し

これを実現したいのであれば、事前にreserveしておく必要があります。
あるいは、vectorではなくlist等を使ってください。


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

Name: 大工  ..プログラマー(33,558ポイント)   Date: 2009/05/10(日) 16:23   No:33277     
Title: Re:コピーコンストラクタが呼ばれる回数    
なるほど

ですが,listを使うと添字を使ったアクセスが出来なくなってしまうのでvectorのままにします

reversですか…
いま携帯からアクセスしてるので詳しく調べられないのですが,
配列の順番が変わってしまうのでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(100,552ポイント)   Date: 2009/05/10(日) 16:48   No:33278     
Title: Re:コピーコンストラクタが呼ばれる回数    
> reversですか…

reversではなくreserveです。
あらかじめ確保すべき領域のサイズを予約しておくためのものです。
配列の順序は関係ありません。


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

Name: 大工  ..プログラマー(33,590ポイント)   Date: 2009/05/10(日) 18:56   No:33279     
Title: Re:コピーコンストラクタが呼ばれる回数    
あら…

お恥ずかしい^^;

グラフのサイズは有限ですのでその方法を取りたいと思います


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



Name: s-rush  ..熟練のプログラマー(49,381ポイント)   Date: 2009/05/09(土) 12:44   No:33240       
Title: 音声処理のプログラム    
いつもお世話になっています。
大学の課題でつまずいてしまったので、皆さんのお力をお借りしたく質問させていただきます。

今、wave形式の音声ファイルの加工プログラムを作成しています。
データ部の読み込みを以前は1バイトならunsigned char型、2バイトならshort型で読み込んでいたのですが、
これを、2バイトでもunsigned char型で読み込んでから、little endianの仕様に従い(?)
short型に変換して読み込むという方法に変えました。
1バイトの場合でも、途中の処理はshort型として扱っています。
この方法に変えてから、今まで作ってきた加工処理を行うと、思い通りの音声が生成されなくなりました。
今まで作ってきた加工処理は
・音を半分にする
・ステレオをモノラルに変換する
・倍速にする
というものです。
デバッグとして、各値をファイル出力してみてみると、どんな音声ファイルでも(16ビット)
iが2048以降はすべて同じ値になっているので、
どうもmain関数内のfread, fwriteあたりが怪しいと思っているのですが、
どこが間違っているのかが分かりません。

ブロックサイズは8192として扱っているので、16ビットの音声ファイルだと、
実質ブロックサイズは4096になっています。
このブロックサイズを変更すると、生成された音声ファイルの問題点が明白になるので、
ブロックサイズに依存しているようです。

ソースコードをアップしておきますので、どなたかご教授お願いします。
テストの音声ファイルは
・test16_s   ステレオ 16ビット
・test16_m   モノラル 16ビット
・test8_s    ステレオ 8ビット
・test8_m    モノラル 8ビット
となっています。


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


Name: Justy  ..伝説なるハッカー(351,021ポイント)   Date: 2009/05/09(土) 22:24   No:33255     
Title: Re:音声処理のプログラム    

>どこが間違っているのかが分かりません


・ 16bitの時の wave_data_trans()ですでに元バッファサイズの半分になった t_sizeで
ループを回しているのに、for文で i+=2をしているので処理が途中で終わってしまっており、
data_inの残りの部分が不定になっている。

・ 同様に wave_data_inv()もループの回数が足りない

・ write_flag == 1が常に trueなので、ループを通過する度にヘッダを書き込んでしまっている

 こんなところじゃないでしょうか。


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

Name: s-rush  ..熟練のプログラマー(50,053ポイント)   Date: 2009/05/10(日) 00:12   No:33265     
Title: Re:音声処理のプログラム    
>>Justyさん
>処理が途中で終わってしまっており
おっしゃる通りでした。
16ビットデータの時、変換後のブロックサイズに合わせてしまっていたので、
元のデータ後ろ半分が処理されていませんでした^^;
テキストデータで出力させてみると、2048以降が同じ数値だったので、
値が入れられていない(初期化になるんでしょうか?)のかな?とは睨んでいたのですが、
少し見当違いの個所をずっと修正していました。

おかげさまで、無事正常な音声ファイルが出力されるようになりました。
ありがとうございます。


もう一点だけ質問させてください。
音声を倍速かつ音(音声)が高くならないプログラムを作っているのですが、
(double_speed2関数です)
これがずっとうまくいきません。
ステレオであれば、正常な音声ファイルが出力されるのですが、
モノラルだと、変な音声ファイルが出力されています。
文章では説明しづらいので、プログラムを実行していただければ
何が問題であるのかご理解いただけると思います。
(無責任で申し訳ないです)
処理にフーリエ変換を使用しています。
dft_idft()とfft_ifft()には間違いはないと思います。
1周期分のsin波を上記2つの関数に渡したところ、正常に変換されています。
となると、周波数空間での加工部分、もしくは引数を渡す部分に間違いがある、
としか考えられません。

これもどこに問題があるのかが分かりませんorz
かれこれ1か月ほど悩んでいます。

修正版のソースをアップしておきますので、こちらの方もご教授お願いします。


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

Name: Justy  ..伝説なるハッカー(351,612ポイント)   Date: 2009/05/10(日) 02:17   No:33267     
Title: Re:音声処理のプログラム    

>こちらの方もご教授お願いします

 いや、サウンド方面はさほど得意ってわけじゃないんですが・・・・・・。

 でもまぁ、精度を気にしないのであれば加工の部分は

    for(i=0; i<size/2; i++){
        re[i] = t_re[2*i];
        im[i] = t_im[2*i];
    }
    for(; i<size; i++){
        re[i] = 0;
        im[i] = 0;
    }

でいいんじゃないのでしょうか?

 ちゃんとやるなら

Pitch Shifting Using The Fourier Transform - The DSP Dimension
ttp://www.dspdimension.com/admin/pitch-shifting-using-the-ft/
 とか

SoundTouch
ttp://www.surina.net/soundtouch/

 を研究した方がいいかもしれません。


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

Name: s-rush  ..熟練のプログラマー(50,288ポイント)   Date: 2009/05/10(日) 10:46   No:33269 解決!     
Title: Re:音声処理のプログラム    
>>Justyさん
ありがとうございます。
おかげで解決することができました^^

配列にはa[-10]みたいに負の数がないというのを忘れていました。
なので、コンピューター内と、実際に考える周波数空間の並び方が異なっているのですね。

>Pitch Shifting Using The Fourier Transform - The DSP Dimension
>ttp://www.dspdimension.com/admin/pitch-shifting-using-the-ft/
>SoundTouch
>ttp://www.surina.net/soundtouch/
せっかく教えていただいたので、こちらの方も研究して、
さらに良い処理ができるようにしてみたいと思います。

ちなみに
>for(; i<size; i++){
iの初期値が書かれていないですけど、
for(i=size/2, i<size, i++){
でいいのですよね?


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

Name: Justy  ..伝説なるハッカー(351,621ポイント)   Date: 2009/05/10(日) 13:13   No:33272     
Title: Re:音声処理のプログラム    

>iの初期値が書かれていないですけど、
>for(i=size/2, i<size, i++){
>でいいのですよね?

 それでもいいですし、そのままでも大丈夫ですよ。
 1つ上の forで使われた iの値をそのまま引き継いで使っていますから。


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

Name: s-rush  ..熟練のプログラマー(50,813ポイント)   Date: 2009/05/10(日) 14:53   No:33276     
Title: Re:音声処理のプログラム    
for(; i<size; i++){
という書き方もできるのですね。
for文の()内は必ず3つの条件を記入しなければいけないと思っていたので、知りませんでした。

おかげさまですべての問題が解決できました。
ありがとうございます。


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



Name: 動作が・・・  ..ぴよぴよ(49ポイント)   Date: 2009/05/09(土) 19:55   No:33245       
Title: 無題    
今2Dのゲームを作っているのですが
使う画像を増やすと処理がかなり重くなりゲームがかなり遅くなるのですが
何か対策などはありますか?

お願いします


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


Name: MNS  ..初心者(7,933ポイント)   Date: 2009/05/09(土) 20:17   No:33246     
Title: Re:無題    
情報が少な過ぎます。
どのようなジャンルのゲームを作成しているのですか?
どのくらいの量の画像を使っているのですか?
画像のサイズはどの程度ですか?
あなたが使用しているコンピュータの性能はどのくらいですか?
開発言語はCですか?
使用しているライブラリはDXライブラリですか?

この程度の情報がないと、回答ができません。
仮に、DXライブラリで開発しているとしたら、
ディスクアクセスで描画などをしていないか確認してみてください。
下のページが参考になります。
http://homepage2.nifty.com/natupaji/DxLib/lecture/lecture5.html


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

Name: たかぎ [URL]  ..ハッカー(100,179ポイント)   Date: 2009/05/09(土) 21:56   No:33251     
Title: Re:無題    
環境からして全く不明ですが...

もっとも効果的な対策としては、ハードウェアを強化することです。
特に処理に時間がかかる部分に関しては、専用のハードウェアを作るか、別のDSP等で処理させることをお勧めします。
画像データは磁気ディスクやCD/DVD等に格納するのではなく、メモリデバイスに格納するようにしましょう。

次に有効な対策はソフトウェアの最適化です。
ボトルネックになる部分をプロファイラ等で調べて最適化してください。


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

Name: s-rush  ..熟練のプログラマー(50,713ポイント)   Date: 2009/05/10(日) 11:36   No:33271     
Title: Re:無題    
私も以前似たような症状がでて悩んだことがありました。

私はRPGを製作しているのですが、マップ情報を増やしたとたんに動作が重くなりました。
ある意味では、使用している画像を増やしたことになりますかね^^

MNSさんやたかぎさんもおっしゃっていますが、質問者様の製作しているジャンルも分からないし、
環境も分からないので、あまり回答ができませんが、
龍神録見たいなシューティングゲームの弾幕を増やした時に動作が重くなるというのであれば、
マシンのスペックや、MNSさんのおっしゃるようなディスクアクセスはしていませんか?

もしくは私みたいにRPGを制作中、マップを増やした時に動作が重くなるというのであれば、
描画範囲を決めていますか?

マシンのスペックや言語、開発環境、ゲームジャンルを教えていただければ
より良い回答が得られると思いますよ。


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



Name: 256bit  ..ぴよぴよ(421ポイント)   Date: 2009/05/10(日) 02:52   No:33268       
Title: GetHitKeyStateAll関数のキーコードについて    
 11章のGetHitKeyStateAll関数の「キーコードは0〜255の数字に対応している」と聞いて思ったのですが、GetHitKeyStateAllに使われるキーコードはASCUコード表のキーコードのことですか?

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


Name: s-rush  ..熟練のプログラマー(50,411ポイント)   Date: 2009/05/10(日) 11:23   No:33270     
Title: Re:GetHitKeyStateAll関数のキーコードについて    
>GetHitKeyStateAllに使われるキーコードはASCUコード表のキーコードのことですか?
ASCUコードではなく、DxLib.hでマクロ定義されたものだったと思います。


ttp://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_input.html#R5N2


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



Name: 256bit  ..ぴよぴよ(285ポイント)   Date: 2009/05/09(土) 21:24   No:33248       
Title: 12.画像を動かすにて    
 12の「画像を動かす。」まで来たのですが、プログラムを入力しても、画像が動きません。
 前からセキュリティソフトも読み込む最中に反応するのですが、セキュリティ上の問題でしょうか?
 


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


Name: 狼太郎  ..かけだし(2,189ポイント)   Date: 2009/05/09(土) 21:54   No:33250     
Title: Re:12.画像を動かすにて    
画像が動かないということは、表示はされるのでしょうか?
自分のPCでもそれは動きませんでしたが、13aのプログラムを実行したらきちんと動かすことができました。


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

Name: 通りすがり  ..上級者(16,721ポイント)   Date: 2009/05/09(土) 22:23   No:33254     
Title: Re:12.画像を動かすにて    
12章にちゃんと注意書き書いてありますよ

  この章は13章のようなプログラムが何故必要になるかを示すためのもので、

  適切ではないプログラムの例を紹介しています。
  実行結果はこれと異なる場合があり、何も表示されないかもしれません。

 


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

Name: 256bit  ..ぴよぴよ(334ポイント)   Date: 2009/05/10(日) 01:34   No:33266 解決!     
Title: Re:12.画像を動かすにて    
 その通りでした^^;
 あの後、もう一度12・13章を読み直してやってみたら、しっかり画像が動きました。

 皆さん、本当にありがとうございます。


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



Name: やっくん  ..ぴよぴよ(263ポイント)   Date: 2009/05/09(土) 22:06   No:33252       
Title: コンパイル時にmainファイルが消えます。    
OS:LINUX
コンパイラー:GNOME
ーーーーーーーーーー
自作ゲームを作成中に少し困ったことがあったので知恵を貸してもらえないでしょうか。

龍神録のゲーム作成(5章)のようにヘッダーファイルで変数&プロトタイプ宣言&構造体宣言を行っていて、
mainや他の関数で使うときもインクルードしています。
最初は問題なくコンパイルできてたのですが・・・。
同じソース、同じモジュールを使ってのコンパイルを行っているうちに、
構造体の未定義参照エラーが出るようになりました。
エラー後に何故かコンパイル時に一番先頭にしているファイルが消失します;
構造体の変数を使っている場所全てで同じエラーが出ます。

ためしに構造体の宣言が間違っていたのでは無いかと別にソースを書いて、
変数に値を容れて同じ用に使ってみましたが問題ありませんでした。
でもまた、同じように数度コンパイルしているうちにエラーが出始め消失しました。

書いたように、数度コンパイル成功しているファイルなのでソース自体に問題は無いと思います。
このような現象が何故起こるか分かる方居ないでしょうか?;


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


Name: たかぎ [URL]  ..ハッカー(100,268ポイント)   Date: 2009/05/09(土) 22:30   No:33257     
Title: Re:コンパイル時にmainファイルが消えます。    
GNOMEというコンパイラは知りませんが...

> エラー後に何故かコンパイル時に一番先頭にしているファイルが消失します;

コンパイルエラーが発生するとソースファイルが削除されるということであれば、明らかにコンパイラの不具合です。ベンダーに問い合わせることを強くお勧めします。


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

Name: やっくん  ..ぴよぴよ(294ポイント)   Date: 2009/05/09(土) 22:37   No:33259     
Title: Re:コンパイル時にmainファイルが消えます。    
そうなんですか・・・

そうしてみることにします!
ありがとうございました^^


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

Name: やっくん  ..ぴよぴよ(487ポイント)   Date: 2009/05/09(土) 22:45   No:33260 解決!     
Title: Re:コンパイル時にmainファイルが消えます。    
ごめんなさい><
ようやく何故か気づきました。

原因は、
コンパイル時に実行ファイルを焦って指定してなかったみたいです。

自分はコンパイル時に前のコマンドを呼び出してるので、
ずっと同じミスをしたコマンドを使ってました・・・。
ファイルがどんどん消去されていって焦っていたのと、
原因はソースにある!って決めつけていたのが悪かったようです。
なんというか、このようなミスに3時間も費してしまったのでショックな半面
致命的なバグじゃなくてホットしました。

おさわがせして本当にすみませんでした;


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



Name: 狼太郎  ..かけだし(2,144ポイント)   Date: 2009/05/09(土) 21:52   No:33249       
Title: ProcessMessage関数について    
#include"DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init()==-1)return -1;
int image[16];/*分割画像用変数*/
int x=640-24;
int x2=0;
char Key[256];/*キー入力用変数*/
LoadDivGraph("char.png",16,4,4,32,32,image);
SetDrawScreen(DX_SCREEN_BACK);
while(1){
ClearDrawScreen();
x-=3;
x2+=3;
DrawGraph(x,150,image[4],TRUE);
DrawGraph(x2,350,image[12],TRUE);
if(x<0)break;
ScreenFlip();

}
DxLib_End();
return 0;
}


#include"DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init()==-1)return -1;
int image[16];/*分割画像用変数*/
int x=640-24;
int x2=0;
char Key[256];/*キー入力用変数*/
LoadDivGraph("char.png",16,4,4,32,32,image);
SetDrawScreen(DX_SCREEN_BACK);
while(!ProcessMessage){
ClearDrawScreen();
x-=3;
x2+=3;
DrawGraph(x,150,image[4],TRUE);
DrawGraph(x2,350,image[12],TRUE);
if(x<0)break;
ScreenFlip();

}
DxLib_End();
return 0;
}
と繰り返しの条件にProcessMessageを入れると実行されないままプログラムが終了してしまいます。
なぜですか?


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


Name: Justy  ..伝説なるハッカー(351,140ポイント)   Date: 2009/05/09(土) 22:33   No:33258     
Title: Re:ProcessMessage関数について    

>ProcessMessageを入れると実行されないままプログラムが終了してしまいます
>なぜですか?

 ProcessMessageの関数のアドレスを評価して 0だった場合は whileループが実行されますが、
この場合 0ではないので while内が実行されず、そのまま WinMain関数が終了するからです。

 関数を実行したい時は ()をつけてください。


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



Name: あ〜る  ..初心者(8,843ポイント)   Date: 2009/05/09(土) 00:08   No:33224       
Title: 弾幕について    
こんばんは。弾幕について質問があります。
18way*2のレーザーを回転させながら、9way*2の渦巻き弾を出す感じの弾幕です。
今日始めて自分でオリジナルの弾幕を作ってみたんですけど、上手く動きませんでした。
18way*2のレーザーを回転させながら、9way*2の渦巻き弾を出す感じの弾幕なんですけど、レーザーはしっかり描画されるんですけど、渦巻き弾が本来20カウントに一回出るのでもうちょっと出るはずなんですけど、まばらにしか描画されませんでした。(画像参照)
多分、処理のスピードとかの問題だと思うんですけど、それはそれで初心者なのでどこをどうすれば効率化が出来るのかわからないので、教えていただけると嬉しいです。

<お詫び>
コードはプレタグで、っていうのは知ってるんですけど、プレタグっていうのが何なのか分かんなかったので、普通に書いてしまいました・・・申し訳ございません・・・

void boss_shot_bulletH010(){
#define TM010 240
#define DIST 0
int i,j,k,l,m,n,s,t=boss_shot.cnt%TM010,t2=boss_shot.cnt;
double angle,angle2;
static int num;
int plmn=1;
angle=PI;
angle=PI2;
if(t2==0)num=4;
if(boss.hp<=0) {
lazer[i].flag=0;
lazer[i].haba=0;
}
if(t==0){
for(l=0;l<2;l++){
for(j=0;j<2;j++){
for(s=0;s<18;s++){
if((k=search_lazer())!=-1){
lazer[k].col = j*2+1;//弾の色
lazer[k].knd = 0;//弾の種類
lazer[k].angle = angle+PI2/18*s+PI/18*j;//角度
lazer[k].startpt.x= boss.x+cos(lazer[k].angle)*DIST;
                       //座標
lazer[k].startpt.y= boss.y+sin(lazer[k].angle)*DIST;
lazer[k].flag = 1;
lazer[k].cnt = 0;
lazer[k].haba = 2;//幅
lazer[k].state = j;//ステータス
lazer[k].state2 = l;
lazer[k].length = 0;//レーザーの長さ
lazer[k].hantei = 0;
lazer[k].lphy.conv_flag=1;//回転フラグ
lazer[k].lphy.conv_base_x=boss.x;//回転基準位置
lazer[k].lphy.conv_base_y=boss.y;
lazer[k].lphy.conv_x=lazer[k].startpt.x;//回転元の位置
lazer[k].lphy.conv_y=lazer[k].startpt.y;//代入
input_lphy(&lazer[k],80,0);
}
}
}
}
}
if(t%20==0){//20カウント毎に発射
for(m=0;m<9;m++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd=0;
boss_shot.bullet[k].x=boss.x;
boss_shot.bullet[k].y=boss.y;
boss_shot.bulle[k].angle=angle2+PI2/9*m+PI2/TM010*t;
                       //渦巻き
boss_shot.bullet[k].flag=1;
boss_shot.bullet[k].cnt=0;
boss_shot.bullet[k].spd=2;
boss_shot.bullet[k].eff_detail=1;
boss_shot.bullet[k].state=0;
se_flag[0]=1;
}
}
}
if(t%20==0){
for(m=0;m<9;m++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd=0;
boss_shot.bullet[k].x=boss.x;
boss_shot.bullet[k].y=boss.y;
boss_shot.bullet[k].angle=angle2+PI2/9*m−PI2/TM010*t;
                       //渦巻き
boss_shot.bullet[k].flag=1;
boss_shot.bullet[k].cnt=0;
boss_shot.bullet[k].spd=2;
boss_shot.bullet[k].eff_detail=1;
boss_shot.bullet[k].state=1;
}
}
}
//60カウント毎に弾の色を変える
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag==1){
if(t>0 && t<59){
boss_shot.bullet[i].col=3-boss_shot.bullet[i].state*2;
}
if(t>60 && t<119){
boss_shot.bullet[i].col=1+boss_shot.bullet[i].state*2;
}
if(t>120 && t<179){
boss_shot.bullet[i].col=3-boss_shot.bullet[i].state*2;
}
if(t>180 && t<239){
boss_shot.bullet[i].col=1+boss_shot.bullet[i].state*2;
}
}
}
//レーザー計算
for(i=0;i<LAZER_MAX;i++){
if(lazer[i].flag>0){
if(t2<30){
lazer[i].length=lazer[i].length+20/(lazer[i].state2*2+1);
              //レーザーの根元に短いレーザーで当たり判定調節
}
if(lazer[i].state==0){//stateが0のレーザーの時間による処理
if(t>0 && t<19){
lazer[i].haba+=0.5;
lazer[i].hantei+=0.03;
}
if(t>40 && t<59){
lazer[i].haba-=0.5;
lazer[i].hantei=0;
}
if(t>120 && t<139){
lazer[i].haba+=0.5;
lazer[i].hantei+=0.03;
}
if(t>160 && t<179){
lazer[i].haba-=0.5;
lazer[i].hantei=0;
}
}
if(lazer[i].state==1){//stateが1のレーザーの処理
if(t>60 && t<79){
lazer[i].haba+=0.5;
lazer[i].hantei+=0.03;
}
if(t>100 && t<119){
lazer[i].haba-=0.5;
lazer[i].hantei=0;
}
if(t>180 && t<199){
lazer[i].haba+=0.5;
lazer[i].hantei+=0.03;
}
if(t>220 && t<239){
lazer[i].haba-=0.5;
lazer[i].hantei=0;
}
}
if(t<239){
lazer[i].angle+=PI/1190;
}
}
}
if(t==TM008-1)
num=(++num);
}


2,171ポイント を手に入れた。


Name: あ〜る  ..初心者(8,857ポイント)   Date: 2009/05/09(土) 07:39   No:33231     
Title: Re:弾幕について    
環境はBCCでWindowsXPです

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

Name: Dixq (管理人) [URL]  ..ウィザード(1,022,548ポイント)   Date: 2009/05/09(土) 08:26   No:33232     
Title: Re:弾幕について    
龍神録の館に書いてないメンバがあったり、定義があったりするので、コピペで試してみる事が出来ません。
コンパイル出来るようなコードを提示してもらえるとありがたいです。
また、プレタグについては規約をご覧下さい。


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

Name: あ〜る  ..初心者(8,799ポイント)   Date: 2009/05/09(土) 08:41   No:33235     
Title: Re:弾幕について    
すいません、勝手に追加したの忘れてました
お手数ですがレーザーの構造体にstate2を追加して下さい
多分それだけだと思うので
よろしくお願いします

規約ちゃんと読めてなくてすいません…
家帰ったらパソコンでチェックします


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,023,763ポイント)   Date: 2009/05/09(土) 09:04   No:33237     
Title: Re:弾幕について    
mPI2には何が入っています?

なお、プレタグを使った投稿は<pre>と</pre>でコードを囲めばOKです(<>は半角)


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

Name: あ〜る  ..初心者(8,865ポイント)   Date: 2009/05/09(土) 09:28   No:33239     
Title: Re:弾幕について    
わ、すいません、−をいれ忘れてました…
mPIではなくm−PIです
誤字とかいうオチだったらすいません…
でも一応コンパイルは通っているし、レーザーを描画しなかったらちゃんと渦巻きになったので、多分掲示板に書く時に何かミスったんだと思います
最初の投稿のコードは直しときます


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

Name: あ〜る  ..中級者(9,058ポイント)   Date: 2009/05/09(土) 20:19   No:33247     
Title: Re:弾幕について    
すいません、自己解決しました;
自己解決といっても理由はよくわからないですが、何故か弾幕の順番で2番目にこの弾幕が来るようにすると正常に動作せず、他の順番だったら普通に動きました
自分でも理由がよくわからないので、情報が少ないですが、何か理由だと思われるものがあったら教えて下さい
あと、弾幕効率化の方法は随時募集中です
自分的には、いちいち動きをカウンタで設定してるのはどうにかしたいです…


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



Name: CUSER  ..ぴよぴよ(36ポイント)   Date: 2009/05/09(土) 19:19   No:33242       
Title: 100桁位の数の計算    
言語で用意されている型の精度以上の数値の計算をしたいとき、
そんな方法ってありますか。

100桁とまではいかなくても
用意されているせいぜい20桁くらいの桁を超える数の計算ってできますか?

別にコンパイラを作ろうという話じゃありません。


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


Name: たかぎ [URL]  ..ハッカー(100,104ポイント)   Date: 2009/05/09(土) 19:34   No:33243     
Title: Re:100桁位の数の計算    
多倍長演算に付いて調べてください。


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

Name: CUSER  ..ぴよぴよ(89ポイント)   Date: 2009/05/09(土) 19:49   No:33244 解決!     
Title: Re:100桁位の数の計算    
ちょっと検索してみました。
難しそうなので、ゆっくり読んでみたいと思います。
理解できるころには、"これ"はおそらく相当古くなっていそうなので
ここでいったん解決としておきます。


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



Name: キナ  ..ぴよぴよ(65ポイント)   Date: 2009/05/08(金) 10:46   No:33201       
Title: 次の言語は?    
こんにちは。

Cを独学で勉強しているのですが1年ちょい勉強したくらいでほかの言語に移るのは早過ぎるでしょうか?

いまはCからC++に移って勉強したいと考えています。


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


Name: バグ  ..ハッカー(159,544ポイント)   Date: 2009/05/08(金) 11:18   No:33203     
Title: Re:次の言語は?    
何が出来るようになっているかが重要であって、1年が長いか短いかは分かりません。
それから、CとC++は文法こそほぼ同じですが別物なので、Cからのステップアップとして学ぶものではないかと思います。
もし、オブジェクト指向言語を学びたいという明確な目的があるのならば、C++の他にC#、Javaなどもありますので、好みで選ばれると良いかと思います。VB.Netなんかも、ほぼオブジェクト指向言語といって差し支えないと思いますし…


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

Name: たかぎ [URL]  ..ハッカー(100,087ポイント)   Date: 2009/05/09(土) 00:50   No:33225     
Title: Re:次の言語は?    
Cを勉強した目的は何でしょうか?
その目的は達成できましたか?
C++を勉強したい理由は何でしょうか?

これらによると思います。
単に趣味で言語知識をコレクションするだけなら何でもかまいませんが、そうでなければ目的を見失わないように注意しましょう。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,022,956ポイント)   Date: 2009/05/09(土) 08:38   No:33234     
Title: Re:次の言語は?    
プログラミング経験の年数と実力は必ずしも比例しなかったりするので、
年数だけではわからない部分があります。
かといって「わかった」レベルは人によって違うでしょうから、明確な理解度を示す言葉を表現しにくいですよね。
そこで年数が基準になってしまうのだと思いますが・・。

例えばy=10xで伸びている直線とy=1/10xで伸びている直線。xが10になった時の値は両者にかなり違いがあります。
そんな感じです。

上のお二方が仰っているように、Cを学ぶことで何を得たかったか、何が得られたかを明確にすることが大事だと思います。
自分がCを学ぶことで得たかったものが得られたのなら他の言語の勉強をするのもありかと思います。
言語ごとに色んな性質がありますから、一つの言語だけ勉強するより、色んな言語を勉強する方が自分の可能性が広がると思います。

しかし、色んな言語に手を出してしまうことでどの言語も中途半端にしか知識が付かないのでは勿体無いですからその辺のさじ加減を大事にするといいと思います。

なお、C++は「Cと他の言語」というよりCの拡張版で、VC++などの場合、同じコンパイラでコンパイル出来ます。


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



Name: ゆー  ..ぴよぴよ(506ポイント)   Date: 2009/05/06(水) 01:37   No:33116 解決!       
Title: 龍神録プログラミング 構造体の改変    
龍神録プログラミングについてなんですが、
struct.cppの以下の構造体に、新しくメンバを追加することは可能でしょうか?


//弾に関する構造体
typedef struct{
//フラグ、種類、カウンタ、色、状態、少なくとも消さない時間、エフェクトの種類
int flag,knd, cnt, col, state, till, eff, kaiten, eff_detail;
int cnt_till, cnt_stt;
//座標、角度、速度、ベースの角度、一時記憶スピード
double x, y, vx, vy, angle, spd, base_angle[1], rem_spd[1];
int c_flag;
double cx, cy;
//■このあたりにメンバを追加したいんです。(例えば加速度adspdとか適当に)
// やってみるとエラーにはなりませんでしたが弾の挙動がおかしくなってしまいます…
// ここに宣言してしまうと画面上に表示される弾が1つだけになり
// 先頭で宣言してしまうと画面上に表示される弾が全く動かなくなります
}bullet_t;



そもそもC言語の知識が浅はかなもので構造体について基礎知識程度にしか無い初心者です^^;
もしかしたらとんでもない勘違いをしているかもしれないですが…


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


Name: ゆー  ..ぴよぴよ(515ポイント)   Date: 2009/05/07(木) 00:40   No:33170     
Title: Re:龍神録プログラミング 構造体の改変    
(´;ω;)

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

Name: 通りすがり  ..上級者(16,577ポイント)   Date: 2009/05/07(木) 01:36   No:33174     
Title: Re:龍神録プログラミング 構造体の改変    
私も同じような事になった事があるのですが、不具合が出るファイルを保存してVC++を終了させてから、再度VC++を起動してコンパイルしたら直りませんか?
もしくは、デバックモードからリリースモードに変えてみるとか。


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

Name: dic  ..上級者(20,672ポイント)   Date: 2009/05/07(木) 08:26   No:33181     
Title: Re:龍神録プログラミング 構造体の改変    
ゼロで初期化してますか?

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

Name: ゆー  ..ぴよぴよ(71ポイント)   Date: 2009/05/09(土) 00:50   No:33226 解決!     
Title: Re:龍神録プログラミング 構造体の改変    
デバッグモードからリリースモードにしてビルドしたら(何故か)正常に動作しました
どのような違いがこのような結果を生むのか分かりませんが^^;

ゼロ初期化はまだ試してないですが関係あるんですかね・・・?


//弾に関する構造体
typedef struct{
//フラグ、種類、カウンタ、色、状態、少なくとも消さない時間、エフェクトの種類
int flag,knd, cnt, col, state, till, eff, kaiten, eff_detail;
int cnt_till, cnt_stt;
//座標、角度、速度、ベースの角度、一時記憶スピード、加速度、最大速度
double x, y, vx, vy, angle, spd, base_angle[1], rem_spd[1];
int c_flag;
double cx, cy;
double addspeed, limspeed;
}bullet_t;


とりあえずはこんな感じになりました
まだ色々やってみたいことがあるのでプログラム理解しつつやってみたいです
ありがとうございましたー


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,022,662ポイント)   Date: 2009/05/09(土) 08:31   No:33233     
Title: Re:龍神録プログラミング 構造体の改変    
メンバの追加は仰るとおり単に追加していけばいいだけです。
龍神録のサンプルではなるべく避けましたが、メンバの数が多くなりすぎて解りにくくなる時は
そのメンバごとに構造体を作って構造体をさらに構造化するのもありだと思います。


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



Name: 研修生  ..入門者(3,425ポイント)   Date: 2009/05/08(金) 15:47   No:33206       
Title: 初期化    
空白を数えるプログラムを作りました

main()
{
int c, n1;
n1 = 0;
while(( c = getchar()) != EOF){
if(c == ' '){
++n1;
printf("%d\n", n1);
}
}

}


としました。これはどんどん空白をカウントしていきます
1回打ち込む度n1をリセットしたいのですがが望む形は空白を1個、2個、4個をそれぞれ入力すると
1
2
4
と出力する形です。今だと
1
3
7になります。
printfの↓で初期化をいれると
1
1
1
になってしまいます。
whileループの後で入れるとループが終わらないらしくそこまでいきません。

どのようにすればうまく初期化できますか?


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


Name: 初級者  ..入門者(4,913ポイント)   Date: 2009/05/08(金) 16:05   No:33207     
Title: Re:初期化    
1回打ち込むたび、というのは、
Enter キーを押すたび、ということですか?

であれば、'\n' を検知するたびに
カウンターをリセットすればよいでしょう。


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

Name: dic  ..上級者(20,829ポイント)   Date: 2009/05/08(金) 16:14   No:33208     
Title: Re:初期化    

#include <stdio.h>
#include <string.h>

void main()
{
int n1;
char c[100];
n1 = 0;
while(( gets(c)) ){
int i;
for( i=0; i<strlen(c); i++ )
{
if( c[i] == ' ' )
{
++n1;
printf("%d\n", n1);
}
}
n1 = 0;
}
}

ではいかがでしょうか?


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

Name: 研修生  ..入門者(3,462ポイント)   Date: 2009/05/08(金) 16:15   No:33209 解決!     
Title: Re:初期化    
そんな手があったとは気が付きませんでした。
できましたありがとうございました。


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

Name: 初級者  ..入門者(4,938ポイント)   Date: 2009/05/08(金) 16:30   No:33210     
Title: Re:初期化    
main関数の型がvoidというのは、
ありなのでしょうか。


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

Name: 研修生  ..入門者(3,491ポイント)   Date: 2009/05/08(金) 16:45   No:33211     
Title: Re:初期化    
一応動いてますが、気になるようでしたらintにすればいいのでは

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

Name: dic  ..上級者(20,870ポイント)   Date: 2009/05/08(金) 16:56   No:33212     
Title: Re:初期化    
私はコマンドラインでパイプライン処理などを行わないので
main関数はほとんどvoid型です


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

Name: Mist  ..熟練のプログラマー(60,167ポイント)   Date: 2009/05/08(金) 17:12   No:33213     
Title: Re:初期化    
Windowsのコマンドラインはmain関数の戻り値を無視するから、戻り値を参照するバッチファイルなどを組まなければ問題ありませんが、ISO-C/ANSI-Cではmain関数は

int main(void)
または
int main(int argc, char *argv[])
int main(int argc, char **argv)

と決められているのでvoidにはしないほうがいいです。


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

Name: toyo  ..プログラマー(32,634ポイント)   Date: 2009/05/08(金) 17:26   No:33214     
Title: Re:初期化    
私はvoid main( )と書いてある本やサイトは信用しないことにしています
http://www.kouno.jp/home/c_faq/c11.html#15


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

Name: hss12  ..中級者(12,898ポイント)   Date: 2009/05/09(土) 04:57   No:33230     
Title: Re:初期化    
ANSI-Cを持ち出されると間違いになってしまいますが、
別のプログラムの関数にするときにvoid型とすぐに分かりますし
return 0;も省略できますし。
エラーにならないなら柔軟に書いても良いと思いますけどね。

入門書でなんの説明もなしにいきなりvoid main()になっているのはどうかと思いますが。
規格を知らずに書いているのなら、ほかの部分も知らずに書いているのだろうから
信用できないというのは同意できますね。


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



Name: てる  ..かけだし(1,010ポイント)   Date: 2009/05/09(土) 01:35   No:33227       
Title: 無題    
うるう年かどうかを判定するプログラムを作り、
動作を確認し正常に動いていることは確かなのですが、
プログラミングを始めたばかりなので、知識はあまりないのですが、
条件をしぼっていくのはこのような形でよろしいのでしょうか?
あと、見やすいプログラムへの改善点なども教えていただきたいです。

条件

4の倍数の年(4年毎)をうるう年
ただし100の倍数の年は平年
しかし400の倍数の年はうるう年



#include<stdio.h>

int main(void)
{
int yy,a;
do{

printf("西暦を入力してください:");
scanf_s("%d",&yy);

if(yy<100){
if((yy % 4)==0)
printf("%d年はうるう年です\n",yy);
else
printf("%d年は平年です\n",yy);
}
else if((yy % 400)==0)
printf("%d年はうるう年です\n",yy);
else if((yy % 100)==0)
printf("%d年は平年です\n",yy);
else if((yy % 4)==0)
printf("%d年はうるう年です\n",yy);
else printf("%d年は平年です\n",yy);

printf("もう一度?Yes=1...No=0...");
scanf_s("%d",&a); //繰り返すか?

}while(a);

return 0;

}


2倍のポイントを手に入れた! 1,006ポイント を手に入れた。


Name: hss12  ..中級者(12,825ポイント)   Date: 2009/05/09(土) 03:47   No:33229     
Title: Re:無題    
良いと思いますが、最初のif(yy<100)はいらないような気がします。
見やすくするなら、else ifがどんどん右へ行ってしまっているので
縦をそろえたほうが良いです。また、このような場合は省略せず
すべてに{}をしっかり書いたほうが、見やすいかと思います。

冗長なので短くするなら、うるう年の場合をすべて書いてしまいます。
まず、400で割り切れるときは必ずうるう年なので||にします。
400で割り切れなくてうるう年の場合は、100で割り切れなく && 4で割り切れるときです。
それ以外はうるう年ではありません。

#include<stdio.h>

int main(void)
{
int yy,a;
do{
printf("西暦を入力してください:");
scanf_s("%d",&yy);

if((yy % 400 == 0) || ((yy % 100 != 0) && (yy % 4 == 0)))
printf("%d年はうるう年です\n",yy);
else
printf("%d年は平年です\n",yy);

printf("もう一度?Yes=1...No=0...");
scanf_s("%d",&a); //繰り返すか?

}while(a);
return 0;
}



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



Name: 零咲  ..ぴよぴよ(102ポイント)   Date: 2009/05/01(金) 15:40   No:32945       
Title: みすちー再び←    
いつぞやの鳥目について質問したものでございます。。。
この度データがぶっ飛んで修復不可能にorz
で、鳥目プログラムも当然消え去りまして、過去ログにも見当たらなかったので再びご指導いただきたいのですが…

教訓:バックアップ大事←今更


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


Name: BEMANI  ..プログラマー(27,928ポイント)   Date: 2009/05/01(金) 17:54   No:32947     
Title: Re:みすちー再び←    
>>零咲さん
具体的にどのような処理をしたいのでしょうか・・・


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

Name: yu  ..プログラマー(26,704ポイント)   Date: 2009/05/01(金) 21:23   No:32960     
Title: Re:みすちー再び←    
過去ログにありましたよ〜。
ですが、確かに見つけにくいですね・・・
「過去ログ検索はこちら」からでは出てくれませんでした。

http://www.play21.jp/board/formz.cgi?action=res&resno=28599&page=&lognum=90&id=dixq&rln=28890

#あれ・・・過去ログの投稿者様と違った方ですね;
#すみませんでしたorz


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

Name: 零裂虚識  ..ぴよぴよ(45ポイント)   Date: 2009/05/08(金) 15:35   No:33205     
Title: ありましたかww    
前にどの名前で投稿したか忘却していただけですので←
見つけていただいてありがとうございました!


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



Name: 研修生  ..入門者(2,959ポイント)   Date: 2009/05/07(木) 17:06   No:33187       
Title: tolower    

int stricmp(const char *string1, const char *string2)
{
char *p=string1;
for(; *p; p++){
*p = tolower(*p);
}

char *q = string2;
for(; *q; q++){
*q = tolower(*q);
}

(処理)
}


今stricmp関数の実装に挑戦してますが、文字を小文字にするという作業で詰まっています。
エラーはconst char *から char*に変換できません です。
なにかしら構成に問題があると思います。ずっと考えていますがちっともできないので1回
正解を見た方がいいのでは・・と思いますのでこの小文字への変換だけでいいのでちゃんとできる
コードを教えてもらえないでしょうか。お願いします。


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


Name: Blue  ..中級者(9,829ポイント)   Date: 2009/05/07(木) 17:10   No:33188     
Title: Re:tolower    
マルチっぽいが。。。
http://oshiete1.goo.ne.jp/qa4938722.html

ループ中に1文字ずつ変数に入れて比較すれば書き換えなくて済むと思われますが。

以下適当
int left, right;

while (*string1 != '\0' && *string2 != '\0')
{
left = tolower(*string1);
right = tolower(*string2);

// 比較

++string1;
++string2;
}


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

Name: 研修生  ..入門者(2,923ポイント)   Date: 2009/05/07(木) 17:24   No:33189     
Title: Re:tolower    
私が使ってるのはこの掲示板だけですが。。
質問が似てるんで同じ研修生かもしれません。


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

Name: Blue  ..中級者(9,965ポイント)   Date: 2009/05/07(木) 17:30   No:33190     
Title: Re:tolower    
>私が使ってるのはこの掲示板だけですが
まえ別の掲示板で聞きます的な発言があって、その直後にスレが立ったことがあったけど。

http://www.play21.jp/board/formz.cgi?action=res&resno=32889&id=dixq&from=tree
>Date: 2009/04/30(木) 15:44
>残念ながらわかる方がいらっしゃらないので他でご質問します。

http://oshiete1.goo.ne.jp/qa4920831.html
>質問投稿日時:09/04/30 15:43

あ、直後ではないかw

それにしてもものすごい偶然ですねwww


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

Name: 研修生  ..入門者(2,960ポイント)   Date: 2009/05/07(木) 17:38   No:33191     
Title: Re:tolower    
同じ部屋で同じ課題に一緒に取り組んでいる研修生いるんでその人かもしれないといってるわけで。
あんま話さんからしらんけど。


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

Name: Blue  ..中級者(10,074ポイント)   Date: 2009/05/07(木) 17:46   No:33192     
Title: Re:tolower    
つうか本題がそれていますけど。
重要なのはマルチポストしているかどうかではないので。

ちなみに、向こうの掲示板は放置スレが5つぐらいあります。
同じ部屋にいるのであれば、カナリ失礼な行為なのでレスをつけるように言っておいてもらえると
助かります。


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

Name: 研修生  ..入門者(3,105ポイント)   Date: 2009/05/07(木) 17:58   No:33193     
Title: Re:tolower    
1人1人に○○さんですか?と聞いていくのも何かアレなんでそちらの掲示板に書き込んでおいたらいいのでは?
過去の質問的に同じ研修生ってのは間違いないかとは思いますが別グループの可能性もありますし
まぁそんな犯人探しみたいなことするほどのことでもないと思うのでそちらの掲示板に書いておいた方が
確実かとは思います。この放置っぷりは過去の質問は放置してそうな雰囲気はありますけどね。


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

Name: non  ..熟練のプログラマー(40,217ポイント)   Date: 2009/05/07(木) 20:25   No:33195     
Title: Re:tolower    
const char *なので、書き換えることができません。
Blueさんが指摘されているように、1文字ずつ小文字にしながら比較するのが妥当だと
思います。どうしてもいやなら、動的に配列を確保し、そこに文字列を小文字にしながら
コピーしていくのでしょうね。



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

Name: 研修生  ..入門者(3,119ポイント)   Date: 2009/05/08(金) 11:00   No:33202 解決!     
Title: Re:tolower    
ちょっと難しいですが考えてみますね

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



Name: Koot  ..初心者(5,901ポイント)   Date: 2009/05/07(木) 01:49   No:33176       
Title: アプレット    
今回の質問はアプレットに関するものです。


[1] 質問文
 幅、高さをもつボード上に、ボードの左隅を原点として幅、高さ、左上の位置座標(x,y),色情報をもった  長方形を配置していくというプログラムを、すでにjavaで記述しました。そこで、ボード上の長方形を    アプレットにより、可視化できるようにしたいと考えています。
   javacコマンドでコンパイルし、javaコマンドで実行という流れに加えて、appletviewerでアプレットを  表示してからコンパイル・実行し、標準入力で値を入力しながらリアルタイムでアプレットを更新させたい  のです。しかし、アプレットを起動すると、アプレット起動に使用しているコマンドプロンプトになにも入  力できないので、コマンドプロンプトを新たに起動しソースファイルを実行しても、アプレットには反映さ  れません。
   appletviewerでアプレット画面を表示している状態で、ソースファイルを実行し、アプレットに反映させ  るにはどうしたらいいのでしょうか。


   長々と申し訳ありませんが、現在つぎのものができあがっています。

[i](EIEV3パッケージの)ボードに長方形を配置するソースファイル EIEV3/RectangleEditor.java
   ソースが長いため、内容を説明します。
   EIEV3でパッケージされていて、クラスは次の通りです。

RectangleEditorクラス … まず、ユーザにボードの大きさの入力を促し受け取った値をBordに渡す。
                 次に、長方形作成・移動・重なり部分の抽出・拡大縮小・削除等々のコマ                 ンドを選択し、Commandクラスに渡す、を無限ループ。

Bordクラス … RectangleEditorクラスからのボードの大きさ情報を保持

   Rectangleクラス … 受け取った長方形情報を二次元配列に保持(長方形の作成は10まで)

   Commandクラス … 指定されたコマンドにより、Rectangleクラスに情報を渡して長方形を作成等々を行             う

  [ii]appletviewerで使用するhtmlファイル Test.html
<HTML>
<HEAD><TITLE>Test</TITLE></HEAD>
<BODY>
<APPLET CODE="EIEV3/RectangleEditor.class" WIDTH=300 HEIGHT=300>
</APPLET>
</BODY>
</HTML>


[2] 環境  
 [2.1] OS : Windows
 [2.2] コンパイラ名 : コマンドプロンプト javac

[3] その他
 ・Javaは、本を片手でなんとか書いています。アプレットに関しては、まったくの初心者です。


よろしくお願いします。


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


Name: Koot  ..初心者(5,922ポイント)   Date: 2009/05/07(木) 01:52   No:33177     
Title: Re:アプレット    
見にくくなってしまいました。

管理人さん 申し訳ございません。


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

Name: Koot  ..初心者(5,939ポイント)   Date: 2009/05/08(金) 00:02   No:33199 解決!     
Title: Re:アプレット    
なんとかできました。

お騒がせしました。


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



Name: ちゅん  ..かけだし(2,421ポイント)   Date: 2009/05/07(木) 00:04   No:33167       
Title: バグ    
こんばんは。昨日の今日で誠に申し訳ないのですが、また教えて頂きたいことができました。
今まで正常に動作していたプログラムに突然バグが起こり、困っております。
使用しているのはVisual C++ 2008 EEです。
少し長くなりますが、ご容赦ください。

まず、バグが起こる直前に行った操作です。

GameBaseというクラスにメンバとしてbool hoge[200]を追加。
GameBaseのコンストラクタを用いて

int i;
for( i = 0; i < 200; i++ ) hoge[i] = false;

 
と初期化。
以上です。この際、初期化部分をコメントアウトすると、エラーがなくなります。

次に、エラーが起こった場所です。

void Chara::setName( char *pName )
{
size_t size;

if( pName == NULL )
return;

if( m_pName )
{
delete m_pName;
m_pName = NULL;
}

size = strlen( pName )+1;
> m_pName = new char[ size ];  

if( m_pName == NULL )
return;

strcpy_s( m_pName, size, pName );
}

 
どうやら、メモリ確保に失敗するようで、std::bad_allocが返ってきています。
setName関数をコメントアウトして飛ばしてみると、次のnewで同じエラーが出ました。
空きメモリは約620MBありますが、これでは足りないのでしょうか。

そして、これがエラーを起こした場所の出力です。

***.exe の 0x7c95ab8e で初回の例外が発生しました: 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。
***.exe の 0x7c812a6b で初回の例外が発生しました: Microsoft C++ の例外: std::bad_alloc (メモリの場所 0x0012fb08)。
***.exe の 0x7c812a6b でハンドルされていない例外が発生しました: Microsoft C++ の例外: std::bad_alloc (メモリの場所 0x0012fb08)。


最後に、呼び出し履歴です。

kernel32.dll!7c812a6b()
[下のフレームは間違っているか、または見つかりません。kernel32.dll に対して読み込まれたシンボルはありません。]
kernel32.dll!7c812a6b()
***.exe!_CxxThrowException(void * pExceptionObject=0x0012fb08, const _s__ThrowInfo * pThrowInfo=0x0082a9e8) 行 161 C++
***.exe!operator new(unsigned int size=7) 行 64 C++
***.exe!operator new[](unsigned int count=7) 行 7 + 0x9 バイト C++
> ***.exe!Chara::setName(char * pName=0x0080139c) 行 50 + 0x9 バイト C++
***.exe!GameBase::init() 行 57 C++
***.exe!Game::run() 行 17 C++
***.exe!WinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00151f46, int nCmdShow=1) 行 28 + 0x8 バイト C++
***.exe!__tmainCRTStartup() 行 263 + 0x2c バイト C
***.exe!WinMainCRTStartup() 行 182 C
kernel32.dll!7c816fe7()

 
新しく加えた場所に問題があるように思えません。
原因として考えられる箇所を教えて頂けると幸いです。
どうか宜しくお願い致します。


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


Name: Justy  ..伝説なるハッカー(351,027ポイント)   Date: 2009/05/07(木) 00:45   No:33171     
Title: Re:バグ    

>原因として考えられる箇所

 new[]しようとしたサイズも小さいようですし、挙げられたコードの中には原因になりそうなところは
見あたりません。

 つまり、setName()が呼ばれる以前の処理に問題がある可能性が高いです。


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

Name: ちゅん  ..入門者(2,871ポイント)   Date: 2009/05/07(木) 01:12   No:33173     
Title: Re:バグ    
以前の処理はこのようになっております。


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
if( ChangeWindowMode( TRUE ) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;

int result;

SetTransColor( 68, 14, 98 );
dat_load();
SetDrawScreen( DX_SCREEN_BACK );

Game *pGame = new Game;

result = pGame->run();

delete pGame;

DxLib_End();
return result;
}

int Game::run()
{
init();
while( ProcessMessage() == 0 && ClearDrawScreen() == 0 && GetHitKeyStateAll_2(KeyBuf) == 0 && KeyBuf[KEY_INPUT_ESCAPE] == 0)
{
switch(function_status)
{
case 0:
title();
break;
case 1:
cycle();
break;
default:
DxLib_End();
return 0;
break;
}
ScreenFlip();
if( esc == 1 ) break ;
}
return 0;
}


 
setName関数はinit関数の最初の項目です。
GameクラスはGameBaseクラスの子クラスでして、initがループの外に出ているのはコンストラクタを知らなかった頃の名残です。

もしかしてexternで配列を取ると余計にメモリを食ったりしますか?
dat_load用にint型配列をいくつかexternでとってます。たいした量じゃないですが。


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

Name: Justy  ..伝説なるハッカー(350,813ポイント)   Date: 2009/05/07(木) 01:38   No:33175     
Title: Re:バグ    
 やはりこのコードの中にも原因になりそうな箇所は見あたりません。
 疑わしいのは dat_load()と Gameと GameBaseのコンストラクタ、Game::init()の中です。
 
 試しに dat_loadをコメントアウトしたらどうなりますか?
 これで init()の処理を終えることができたのなら dat_load()が、
だめなら Gameと GameBaseのコンストラクタ、Game::init()あたりを疑ってみてください。

 

>externで配列を取ると余計にメモリを食ったりしますか?

 勿論その分だけ消費しますが、本当にいくつか程度であればほぼ影響はないかと思います。


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

Name: ちゅん  ..入門者(3,127ポイント)   Date: 2009/05/07(木) 02:46   No:33178     
Title: Re:バグ    
dat_loadをコメントアウトしてみたら、Initのみならず他のエラーも吐かず正常に終了できました。
しかし、ある意味困った問題が…
コメントアウトを解いてみたところ、何故か正常に稼動するように。
このまま放っておいたらまずいですよね?

取り敢えず書いておきますけど、Gameのコンストラクタは空、GameBaseは変数メンバを初期化しているだけです。
initの中身も

void GameBase::init()
{
m_player.setName("hoge");
m_player.m_status.setParameter( NULL ); //ステータス初期化

messageMake(); //メッセージウィンドウ作成
}

 
と特に何もないと思われます。
お騒がせしてしまい本当にすいません。

お騒がせついでに1つお尋ねしたいのですが、エラーが出たときの原因は決まってそれ以前にあるものなんですか?
実は今回、よく解らないエラーなこともあって何処を探せばよいかわからず、かなりの時間を使ってしまいましたので…
またバグが発生したときの参考にさせて頂きます。


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

Name: Justy  ..伝説なるハッカー(350,935ポイント)   Date: 2009/05/07(木) 21:31   No:33196     
Title: Re:バグ    

>このまま放っておいたらまずいですよね?

 再発する可能性があるので、再度再現可能なら原因は調べた方がいいですね。
 でも、単純にビルドした各オブジェクトの整合性がうまくとれていなかっただけかもしれません。
(その場合はもう調べようがないかも……)



>エラーが出たときの原因は決まってそれ以前にあるものなんですか?

 普通はそうですね。


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

Name: ちゅん  ..入門者(3,257ポイント)   Date: 2009/05/07(木) 22:45   No:33198 解決!     
Title: Re:バグ    
バグの起爆剤となった部分(bool hoge[200])をコメントアウトしたり戻したりしても何も起こりませんし、
今日もプログラムを少し弄っていましたが、特に何も起こりません。
手の出しようがないので、もしまた起こった際に対策を考えてみます。

Justyさん、いろいろとご指導頂き本当にありがとうございました!


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



Name:  ..ぴよぴよ(39ポイント)   Date: 2009/05/03(日) 12:18   No:32994       
Title: プロジェクトのダウンロードが完全に出来ない    
Purojectの2章から9章がダウンロードできません。

どうしたらよいのでしょうか。

(5/4 9:20 管理人により題名が変更されました)


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


Name: さが  ..かけだし(2,078ポイント)   Date: 2009/05/03(日) 13:11   No:32995     
Title: Re:無    
projectを一括ダウンロードして解凍したのなら

・ダウンロードが完了していない → もう一回ダウンロード
・解凍ソフトが正常に動作しなかった。 → ソフトを変えてみる。Winrarをインストールしてみてください。

この二つを試してみてください。


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

Name:  ..ぴよぴよ(77ポイント)   Date: 2009/05/05(火) 21:42   No:33100     
Title: Re:無    
一応

  DLしたときのサイズ→202KB

これじゃ間違っているのでしょうか?

もう、わかりません。


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

Name: NakanotyayaNo3  ..ぴよぴよ(147ポイント)   Date: 2009/05/07(木) 00:37   No:33169     
Title: 分割ダウンロードすること大丈夫だと思います    
環境によってだと思うのですが、ダウンロードが途中で途切れてします事があるみたいですね。
私もprojectをダウンロードできなくて困りましたので、以下のような分割・ダウンロードが途中で切れても続きからできる機能をもったダウンロード支援ソフトを使いました。そしたら、正常にダウンロードができました。
http://www7.ocn.ne.jp/~otoku/free-s-download-01.htm




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

Name: 新人  ..入門者(2,907ポイント)   Date: 2009/05/07(木) 16:38   No:33184     
Title: Re:分割ダウンロードすること大丈夫だと思います    
僕も最近このサイトを見て始めようと思ったんですが、プロジェクトがダウンロードできませんでした。
貼ってあるリンクのソフトを使ってもダウンロードできませんでした

どうしたらいいんでしょう?


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

Name: 新人  ..入門者(2,941ポイント)   Date: 2009/05/07(木) 17:02   No:33185     
Title: さっきは    
すみません 
できました ありがとうございました


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

Name:  ..ぴよぴよ(109ポイント)   Date: 2009/05/07(木) 18:52   No:33194     
Title: Re:さっきは    
できました!NakanotyayaNo3さん。

ありがとうございました。


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



Name: チルチル  ..中級者(12,971ポイント)   Date: 2009/05/06(水) 18:35   No:33154       
Title: 変換指定子の書式    
実数型変数の値が9.55の場合09.55のように表示する変換指定子の書式がわかりません、
%04.2fで行けるかと思ったらできないんですよね・・
こういう場合どうすればいいでしょうか?


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


Name: たかぎ [URL]  ..比類無きプログラマー(99,745ポイント)   Date: 2009/05/06(水) 18:42   No:33155     
Title: Re:変換指定子の書式    
> %04.2fで行けるかと思ったらできないんですよね・・

%05.2fでどうですか?
最小フィールド幅は、数値の桁数ではなく、出力する文字列の桁数を制御するものです。
すなわち小数点を含みます。
厳密に言えば、小数点は2桁以上になる可能性がありますので、

printf("%0*.2f", 4 + strlen(localeconv()->decimal_point), 9.55);

とすべきかもしれません。


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

Name: チルチル  ..中級者(11,772ポイント)   Date: 2009/05/07(木) 08:20   No:33179 解決!     
Title: Re:変換指定子の書式    
%05.2fにしたら問題なく動作しました、
どうもありがとうございます。


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



Name: alice  ..ぴよぴよ(310ポイント)   Date: 2009/05/06(水) 23:23   No:33165       
Title: STLのリストについて    
初投稿です。よろしくお願いします。内容はSTLのリストについてです。


class Super{
public:
virtual void draw();
};

class Sub1 : public Super{ //Sub2なども存在する
public:
virtual void draw();
};


というクラスがあるとき
list<Super> tmp;
で確保したリストにSub1,Sub2…などの派生クラスのインスタンスを格納し、


tmp.push_back(Sub1());
tmp.push_back(Sub2());

list<Super>::iterator itr = tmp.begin();
list<Super>::iterator itrEnd = tmp.end();
for( ; itr != itrEnd; itr++){
itr->draw();
}


このようにdrawを呼び出していますが、親のdrawが呼び出されてしまっています。
派生クラスのdrawを呼び出すことは可能でしょうか?


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


Name: たかぎ [URL]  ..ハッカー(100,004ポイント)   Date: 2009/05/06(水) 23:32   No:33166     
Title: Re:STLのリストについて    
これは絶対行ってはいけないことです。
std::list<Super>の要素はあくまでもSuperクラスですので、これに対してpush_backで派生クラスのオブジェクトを追加しようとするとスライスが発生します。その結果、プログラムは破綻します。

> 派生クラスのdrawを呼び出すことは可能でしょうか?

std::listクラステンプレートの要素をSuperへのポインタか、スマートポインタにしましょう。
扱いが簡単なのは、

std::list<std::tr1::shared_ptr<Super> > tmp;
tmp.push_back(std::tr1::shared_ptr<Super>(new Sub1));

のようにする方法です。
あるいはboost::ptr_list<Super>を使うのもよいでしょう。


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

Name: alice  ..ぴよぴよ(341ポイント)   Date: 2009/05/07(木) 00:33   No:33168 解決!     
Title: Re:STLのリストについて    
環境がVS2008SP1なので前者の方法をとり無事解決しました。
早い回答ありがとうございました。


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



Name: TG  ..ぴよぴよ(576ポイント)   Date: 2009/05/06(水) 20:46   No:33160       
Title: ナンプレ(数独)の解の有無のプログラム    
大学で4×4ナンプレ(数独)が解けるかどうか、又、解ける場合解を印字するプログラム(最近似たような記事があったようですが。)を書けという課題が出ました。
手も足も出なかったためネット上で検索したところ
http://motonaga.hp.infoseek.co.jp/Sudoku/Sudoku.html
上記のページを見つけました。
しかし、私がポインタを使いこなせるレベルではなく、,main関数内の意味も分からなかったので、とりあえず真似だけでもと思い、他の関数を参考に以下のプログラムを作りました。

#include<stdio.h>
#define BUFLEN 80
int initial[4][4],solve[4][4],x,y;

int copy(void){//1〜4以外の数値の時空欄(0)と置き直す関数
int i,j;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(
initial[i][j]==1||initial[i][j]==2||
initial[i][j]==3||initial[i][j]==4
){
solve[i][j]=initial[i][j];
}else{solve[i][j]=0;
}
}
}
return 0;
}


int print_answer(void){//答えの印字の関数
int i,j;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
printf("%2d",solve[i][j]);}
printf("\n");
}
printf("\n");
return 0;
}

int blank_search(){//空いた枡を見つける
int i,j;
for(i=0;i<4;i++){
for(j=0;j<4;j++)
if (solve[i][j] == 0){
x=i; y=j;
return 1;
}
}
return 0;
}

int permit_puting(int k){
int i,j;
for(i=0;i<4;i++){ /* 縦に同じ数はないか */
if(solve[i][y] == k){return 0;}
}
for(j=0;j<4;j++){/* に同じ数はないか */
if(solve[x][j] == k){return 0;}
}
for(i=0;i<2;i++){/* blockに同じ数はないか */
for(j=0;j<2;j++){
if(solve[2*(x/2)+i][2*(y/2)+j]==k){return 0;}
}
}
return 1;
}

int trial_error(int solve[4][4]){
int k;
if (blank_search()==1){/* 盤に空いた枡(x,y)があるか */
for(k=1;k<=4;k++){
if(permit_puting(k)==1){/* 枡(x,y)にkを置けるか */
solve[x][y] = k; /* 置けるなら置く */
//print_answer();
trial_error(solve); /* 次を確かめる */
solve[x][y] = 0; /* 枡(x,y)にkを置けないとして別の置き方はないか */
}
}
}else{
print_answer();
}
return 0;
}

int number_place(){//未完成(最終的にmainに記述された分岐のために0か1を返すように作る予定)

copy();
trial_error(solve);




return 0;
}

//以下は変更できない
int main(void){
char buf[BUFLEN];
int i;
for(i=0;i<4;i=i+1){
fgets(buf,BUFLEN, stdin);
sscanf(buf,"%d %d %d %d",
&initial[i][0],&initial[i][1],
&initial[i][2],&initial[i][3]);
}

if (number_place()==1){
printf("solved.\n");
}else{
printf("not solved");
}

return 0;
}

コンパイルは可能です。またいくつかの問題も解くことはできるのですが、すべて空欄の場合解が1つしかでないなど欠陥があるようです。
trial_error内のprint_answerを実行させたところ、どうも再帰がうまくいってないような気がします。しかし改善方法も分からない状態です。
上記の通り、できればポインタは使いたくありませんが、ポインタを使わなければいけないようでしたら再考してみます。
Visual C++2008を使っています。

初投稿で至らない点があるとは思いますがよろしくお願いします。


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


Name: たいちう  ..プログラマー(27,193ポイント)   Date: 2009/05/06(水) 21:29   No:33161     
Title: Re:ナンプレ(数独)の解の有無のプログラム    
参考元のTry()とあなたのtrial_error()を比較してください。
Try()はローカル変数として、xとyを使用していますよね。
Try()が再帰関数として10回呼ばれたとすると、
x, yも10組の独立した変数が用意されます。

あなたのプログラムでは、xとyはグローバル変数ですので、
trial_error()が複数回呼ばれたとき、xとyはどんどん更新されてしまい、
再帰から戻っても元の値を取り出せません。
これが再帰が機能していない原因です。

直し方はTry()の用にローカル変数にすることで、
この変数をblank_search()やpermit_puting()で使えるようにするには、
これもTry()で行っているように、ポインタを渡すのが一番簡単でしょう。
(お手本もあることですし)

ポインタの学習をしましょう。
ポインタを避ける工夫が、アルゴリズムを破壊してしまっています。


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

Name: TG  ..ぴよぴよ(742ポイント)   Date: 2009/05/06(水) 21:54   No:33163 解決!     
Title: Re:ナンプレ(数独)の解の有無のプログラム    
回答ありがとうございます
やはりポインタを使うのが得策なのですね。

>ポインタの学習をしましょう。
今後のためにも、頑張って身につけたいと思います。

今回は本当にありがとうございました。
また何かありましたら、ご指導のほどよろしくお願いします。


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



Name: おかし  ..ぴよぴよ(276ポイント)   Date: 2009/05/05(火) 15:03   No:33076       
Title: 龍神録プログラミング5章について    
はじめまして「おかし」といいます
龍神録プログラミング5章についての質問です。

サイトのほうを見てやっているのですが、
1>load.obj : error LNK2001: 外部シンボル ""int (* img_ch)[12]" (?img_ch@@3PAY0M@HA)" は未解決です。
1>graph.obj : error LNK2001: 外部シンボル ""int (* img_ch)[12]" (?img_ch@@3PAY0M@HA)" は未解決です。
1>graph.obj : error LNK2001: 外部シンボル ""struct ch_t ch" (?ch@@3Uch_t@@A)" は未解決です。
1>C:\Documents and Settings\・・\デスクトップ\project\project\プロジェクト\Debug\RyuJin.exe : fatal error LNK1120: 外部参照 2 が未解決です。

といったエラーがでてこまっています。
プロジェクトの一括ダウンロードして見比べてみたのですが、同じように書いてあるように思えます(見落としがあるかもしれません)

できれば、エラーの意味、考えられる原因、対処法を教えていただけると幸いです。
C言語暦は一ヶ月くらいです。

OSはwindowsXP
コンパイラはVC++2008EEです。

関係ありませんが、こういった掲示板に書き込むのは初めてですので、至らない点などあると思いますが回答よろしくお願いします。


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


Name: situmon  ..プログラマー(28,565ポイント)   Date: 2009/05/05(火) 17:11   No:33080     
Title: Re:龍神録プログラミング5章について    
もしかしたら
初期化宣言されないか(i=0だと=0が初期化宣言)
グローバル宣言で
int img_ch[12]=0;
とやったり
エクスターン宣言
でextern int_ch[12];とやってなかったり、
load.cppで
キャラクター画像を読み込んでなかったりしていませんか?


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

Name: おかし  ..ぴよぴよ(595ポイント)   Date: 2009/05/05(火) 21:14   No:33093     
Title: Re:龍神録プログラミング5章について    
回答ありがとうございます。

しかし、グローバル変数での初期化はしていませんし、extern宣言は5章の上のほうの処理を書いた後、全て消してしまいました。(消さないほうがよかった宣言もあるのでしょうか?)

GV.hは、
#include "../../../include/DxLib.h"

#include "define.h"

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

#include "function.h" //関数宣言

//画像用変数宣言部
GLOBAL int img_ch[2][12]=0; //キャラクタ画像9枚分×2

//構造体変数宣言部
GLOBAL ch_t ch; //キャラクタデータ宣言


load.cppは、

#include "../include/GV.h"


void load(){
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}

こんな感じです。



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

Name: situmon  ..プログラマー(28,575ポイント)   Date: 2009/05/05(火) 21:22   No:33096     
Title: Re:龍神録プログラミング5章について    
//画像用変数宣言部
GLOBAL int img_ch[2][12]=0;の
=0を消してみてください。

これが原因のきがします。

0を入れたのにそれにまた画像を入れちゃってますよ。


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

Name: おかし  ..ぴよぴよ(693ポイント)   Date: 2009/05/05(火) 21:45   No:33101     
Title: Re:龍神録プログラミング5章について    
消してみましたが、結果は変わりませんでした・・・・・。
エラーの意味は、あの部分の処理が終わっていないという意味で解釈してもよろしいでしょうか?
graph.cppのほうに問題があるのでしょうか?

あと、私の書いたコード、なんか読みにくいですね。今度から気をつけます。


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

Name: yu  ..プログラマー(26,689ポイント)   Date: 2009/05/05(火) 21:51   No:33103     
Title: Re:龍神録プログラミング5章について    
一度リビルドしてみると良いかもしれません。

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

Name: おかし  ..ぴよぴよ(736ポイント)   Date: 2009/05/06(水) 06:24   No:33120     
Title: Re:龍神録プログラミング5章について    
回答ありがとうございます。

リビルドも試してみましたが、やはり同じようなエラーが出てきてしまいます。


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

Name: pooka  ..かけだし(1,579ポイント)   Date: 2009/05/06(水) 13:23   No:33145     
Title: Re:龍神録プログラミング5章について    
GV.hの
#ifdef GLOBAL_INSTANCE
とmain.cppの
#define GLOBAL_INSTANCE
は同じようにGLOBAL_INSTANCEになっていますか?
プロジェクトを一括ダウンロードして、5章を見てみると、
GLOBAL_INSTANCEではなくて_GLOBAL_INSTANCE_
となっていたので確認してみてください。


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

Name: おかし  ..ぴよぴよ(865ポイント)   Date: 2009/05/06(水) 18:43   No:33156     
Title: Re:龍神録プログラミング5章について    
回答ありがとうございます

両方とも、GLOBAL_INSTANCEとなっていたので
_GLOBAL_INSTANCE_と直してビルドしてみましたが、結果かわらずです・・・・。

それと、私のDLしたソースはGLOBAL_INSTANCEなっていたのですが・・・・。

なかなか解決せず申し訳ないです;;


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

Name: pooka  ..かけだし(1,596ポイント)   Date: 2009/05/06(水) 18:55   No:33157     
Title: Re:龍神録プログラミング5章について    
一度main.cppを見せてもらってもいいですか?

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

Name: おかし  ..かけだし(1,217ポイント)   Date: 2009/05/06(水) 19:38   No:33158     
Title: Re:龍神録プログラミング5章について    
はい。
main.cppです。


#define GOBAL_INSTANCE
#include "../include/GV.h"

//ループで必ず行う3大処理
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら−1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら−1を返す
GetHitKeyStateAll_2();//現在のキー入力処理を行う
return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

load();//データロード

while(ProcessLoop()==0){//メインループ

graph_main();//描画メイン

if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
}

DxLib_End();//DXライブラリ終了処理
return 0;
}


よろしくお願いします。


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

Name: pooka  ..かけだし(1,684ポイント)   Date: 2009/05/06(水) 19:51   No:33159     
Title: Re:龍神録プログラミング5章について    
>#define GOBAL_INSTANCE
#define GLOBAL_INSTANCE
Lが抜けてますね^^


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

Name: おかし  ..かけだし(1,309ポイント)   Date: 2009/05/06(水) 21:38   No:33162 解決!     
Title: Re:龍神録プログラミング5章について    
ありがとうございます。

無事コンパイルできました^^
原因は、タイプミスだったようです・・・・お恥ずかしい・・・・
お手数をおかけしました。

この質問に回答してくださった皆様、本当に本当にありがとうございました。
また質問させてもらうことがありましたらまたよろしくお願いします^^;


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +