|
Name: コウタロウ ..かけだし(1,333ポイント)
Date: 2008/12/05(金) 20:53
No:25153
|
|
Title: 通れない場所の作り方について
|
|
以下のような配列で通れない場所を設定しているのですが、
1の所を上下からは通れないのですが、横からは通れてします。
キャラ画像は28×28の画像を用いています。
どなたか原因がわかる方、ご教授願います。
int hantei1_1[13][18] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1 },
{ 1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1 },
{ 1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,1 },
{ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1 },
{ 1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
int can_or_cannot(int x,int y,int muki){//進めるかを判定する
if(muki==0)//上向きなら
if(hantei1_1[y-1][x]==1)//進めるか判定
return 1;//進めない
if(muki==1)//左向きなら
if(hantei1_1[y][x-1]==1)
return 1;
if(muki==2)//下向きなら
if(hantei1_1[y+1][x]==1)
return 1;
if(muki==3)//右向きなら
if(hantei1_1[y][x+1]==1)
return 1;
return 0;//正常
}
if(ch.x%28==0 && ch.y%28==0){ //座標が28で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=0; //上向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT ] == 1 ) //右ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=2; //下向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT] == 1 ) //左ボタンが押されたら
ch.muki=3; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
if(ch.walking_flag==1) //もし歩くなら
if(can_or_cannot(ch.x/28,ch.y/28,ch.muki)==1)//行き先が歩けないなら
ch.walking_flag=0; //歩かないフラグを立てる
}
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==0) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x++;
else if(ch.muki==2) //下向きならch.y座標を増やす
ch.y++;
else if(ch.muki==3) //右向きならch.x座標を増やす
ch.x--;
}
1,333ポイント を手に入れた。
|
|
|
|
Name: コウタロウ ..かけだし(1,376ポイント)
Date: 2008/12/05(金) 21:04
No:25155
|
|
Title: Re:通れない場所の作り方について
|
|
すいません。以後気をつけます。
キャラの初期座標はちゃんと28の倍数で設定しています。
43ポイント を手に入れた。
|
|
|
|
|
Name: conio ..初心者(5,388ポイント)
Date: 2008/12/05(金) 21:09
No:25156
|
|
Title: Re:通れない場所の作り方について
|
|
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=0; //上向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT ] == 1 ) //右ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=2; //下向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT] == 1 ) //左ボタンが押されたら
ch.muki=3; //右向きフラグを立てる
↑このプログラムは、
------------------------------------------------
下ボタンが押された時 ⇒ 下向きフラグを立てる
上ボタンが押された時 ⇒ 上向きフラグを立てる
右ボタンが押された時 ⇒ 右向きフラグを立てる
左ボタンが押された時 ⇒ 左向きフラグを立てる
------------------------------------------------
という解釈でいいんですよね?
右と左が逆になっているような気がするのですが。
右ボタンが押された時、左向きフラグが立ってますよ。(左ボタンも同様)
246ポイント を手に入れた。
|
|
|
|
|
Name: コウタロウ ..かけだし(1,366ポイント)
Date: 2008/12/05(金) 21:17
No:25158
| 解決!
|
Title: Re:通れない場所の作り方について
|
|
conioさん、ありがとうございます。解決しました。
こんな些細なミスでお恥ずかしいです。
10ポイント を落としてしまった。
|
|
|
|
|
Name: box ..ハッカー(130,744ポイント)
Date: 2008/12/05(金) 21:18
No:25159
|
|
Title: Re:通れない場所の作り方について
|
|
何かの関数のコードに割り込む形で
can_or_cannot関数のコードが入っているように見えるのは
いいのですか?
56ポイント を手に入れた。
|
|
|
|
Name: 自尊心 ..ぴよぴよ(306ポイント)
Date: 2008/12/04(木) 17:29
No:25068
|
|
Title: error: expected specifier-qualifier-list
|
|
タイトルのエラーが出たのですが、調べてもよくわかりませんでした。
typedef で構造体に名前を付け、その変数を作成している箇所でエラーが出ているのですが、エラーの詳細と対策等教えてください。
49ポイント を手に入れた。
|
|
|
|
Name: 自尊心 ..ぴよぴよ(371ポイント)
Date: 2008/12/04(木) 17:57
No:25079
|
|
Title: Re:error: expected specifier-qualifier-list
|
|
返信ありがとうございます。
今、構造体名を変えてみましたが、やはりその構造体名の前に expected specifier-qualifier-list
となってしまいます。
他に何か考えられる原因はあるでしょうか。
65ポイント を手に入れた。
|
|
|
|
|
Name: 自尊心 ..ぴよぴよ(648ポイント)
Date: 2008/12/05(金) 17:52
No:25136
|
|
Title: Re:error: expected specifier-qualifier-list
|
|
最初に大事な事を書き忘れていました…
作成しているプログラムは、実は Yacc プログラムでして、そのプログラムをコンパイルしてCの構文解析プログラムを作成し、そのCプログラムをコンパイルするとエラーが出ています。
この質問が場違いでしたら削除します。
以下は作成したCプログラムでエラーに関係のあると思われる箇所です。
typedef struct {
enum {INT, DBL} Type;
union {
int I;
double D;
} V_fld;
} val_t;
val_t div(val_t, val_t);
val_t mod(val_t, val_t);
val_t power(val_t, val_t);
val_t Memory[M_SIZE];
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
#line 50 "Calc.y"
typedef union YYSTYPE {
int ival;
double rval;
val_t Val;
} YYSTYPE;
277ポイント を手に入れた。
|
|
|
|
Name: いけやん ..上級者(17,020ポイント)
Date: 2008/12/05(金) 10:37
No:25114
|
|
Title: プログラムの簡略化について
|
|
いつもお世話になっております。
いけやんです。
始めに言いますと開発は「VB」になります。(一応規約を読むとC以外でもおkとの事だったので・・・)
大丈夫かな?
タイトルにある通りプログラムを簡略化(もしくは、短く、効率、がいい様)にしたく
又、考え方等がCでもVBでも関係なく通用するかな?と思い質問さして頂きました。
開発環境
Win XP
VB6.0
今VBでクリックで「・」点を打ち、座標を取ってくるプログラムを作っています。
そして、そこの処理で「具体的な座標」と「おおよその座標」が必要な処理で悩んでいます。
「具体的な座標」はうまくいったのですが、「おおよその座標」の処理が
例えば「具体的」X = 8391.0だったとすると
おおよそに直すとX = 8000.0にし、8521.0の場合は9000.0にくり上げする仕様です。
(三桁目を見て○500から上はくり上げ)
(○499までは切り捨てとなっております)
そこで自分が考えた処理は
if X = 1000から1999の間か{
if 1000から1499までか{X = 1000代入}
else X =2000代入
}
次は2000の処理,3000の処理・・・と続いていくので
非効率かなと思い皆様のお力を借りにきました。
例
X = 7488.0→7000.0
X = 3963.0→4000.0
この様な感じになっております、質問がわかり難い、見にくい等
あると思いますが、どうぞよろしくお願い致します。
480ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(34,157ポイント)
Date: 2008/12/05(金) 10:46
No:25115
|
|
Title: Re:プログラムの簡略化について
|
|
1.具体的な座標を整数型の変数Aに入れる(2のため)
2.Aを1000で割ったあまりを変数Bに入れる
3.変数Bが500未満であれば、おおよその座標は具体的な座標を1000で割った商
変数Bが500以上であれば、おおよその座標は具体的な座標を1000で割った商+1000
で出来ると思います。
86ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(34,400ポイント)
Date: 2008/12/05(金) 10:52
No:25117
|
|
Title: Re:プログラムの簡略化について
|
|
最後間違えてる(^^;
3.変数Bが500未満であれば、おおよその座標は具体的な座標を1000で割った商に1000掛ける
変数Bが500以上であれば、おおよその座標は具体的な座標を1000で割った商+1して1000掛ける
VBは昔やったけど忘れてしまったのでCで書いてみた。
構文はともかく考え方は同じと思うので。
double d_gutai = 8500.0;
int i_gutai;
int amari;
int oyoso;
i_gutai = d_gutai;
amari = i_gutai % 1000;
if (amari < 500) {
oyoso = (i_gutai / 1000) * 1000;
} else {
oyoso = ((i_gutai / 1000) + 1) * 1000;
}
243ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..上級者(17,082ポイント)
Date: 2008/12/05(金) 11:26
No:25118
|
|
Title: Re:プログラムの簡略化について
|
|
Mistさん
御津凪さん
ご回答、ありがとうございます。
御二方のソースを打ってから、また返信したいと思います。
2倍のポイントを手に入れた! 62ポイント を手に入れた。
|
|
|
|
|
Name: いけやん
Date: 2008/12/10(水) 10:16
No:251141228871780
| 解決!
|
Title: Re:プログラムの簡略化について
|
|
申し訳ありません。ご返信が遅くなりました。
月曜ぐらいには、できていたのですが掲示板を見ていなかったので
遅れました(汗
御二方のソースを参考(ほぼ、Mistさんですが・・・)
下記の様な感じになりました。
Private Function TGhn_FT_X(nX As Single) As Integer
Dim Ans As Integer
Dim amari As Integer
amari = nX Mod 1000
amari = Abs(amari)
If Abs(amari) < 500 Then
Ans = (Abs(nX / 1000)) * 1000
Else
Ans = (Abs(nX / 1000) + 1) * 1000
End If
Ans = Ans - amari'3桁以下を000にする
'元の値が−なら−にしてやる
If nX < 0 Then
Ans = Ans * -1
End If
TGhn_FT_X = Ans
End Function
御二方、ありがとうがざいました。
完成してから気付いたのですが、四捨五入のプログラムでしたね。
ググればいっぱいでてきましたorz
お手数をお掛けしました。
|
|
|
|
Name: 天使 ..ぴよぴよ(306ポイント)
Date: 2008/12/04(木) 17:32
No:25069
|
|
Title: DOSプログラムについて
|
|
DOSでキー情報を取得する方法について教えていただきたいです。
WindowsAPIなどでしたらVK_で書けると思うのですがDOSだとわかりません。
現在は
int EscCheck(void)
{
scanf("%d",&Key);
if(Key == 1){
return 0;
}else{
return -1;
}
}
と書いています。
このようではなくif文で直接、Escキーが押されたらや1が押されたらと書きたいです。
またDOS上で警告などの文字を一部赤字にしたいのですができるのでしょうか?
APIではフォントセットみたいなのがあってサイズも指定できたのでできるのでしたら教えていただきたいです。
212ポイント を手に入れた。
|
|
|
|
Name: non ..上級者(16,685ポイント)
Date: 2008/12/04(木) 17:49
No:25074
|
|
Title: Re:DOSプログラムについて
|
|
ESCキー情報を取得するってのは、私が質問の意味を理解出来てないのかもしれないけど、
int main(void)
{
int ch;
while((ch=getche())!=0x1b);
return 0;
}
MS-DOSなら エスケープシーケンスで
printf("\033[31m");
とすると赤だったかな。DOS窓では使えないけど。
114ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(131,081ポイント)
Date: 2008/12/04(木) 17:54
No:25077
|
|
Title: Re:DOSプログラムについて
|
|
WINDOWS上でのコマンドプロンプト(コンソールアプリ)ではなく、MS-DOSなんでしょうか?
コンソールアプリであれば、APIを使用すれば文字の色の変更ができます。キー入力はgetchar関数の戻り値で判定してはいかがでしょうか?
MS-DOSの仕様は分かりませんが、APIを使用したコンソールアプリではファンクションキーや特殊キーは2回に分かれて情報が飛んできますので、getchar関数を2度実行する必要があります。
120ポイント を手に入れた。
|
|
|
|
Name: esu ..ぴよぴよ(749ポイント)
Date: 2008/12/04(木) 21:26
No:25100
|
|
Title: for文においての数の増え方
|
|
お世話になります。
下記のfor文の継続条件式ならiは0から4まで増える事になりますよね?
ですがその下のif文による比較、if(i == cnt)は実行されます。
cntには5が代入されて、iにはfor文で増加した4が入りif(i == cnt)は
実行されないと考えているのですが、間違っているのでしょうか?
ちなみに継続条件式を i <= cnt; にすると0から5まで表示されて
if文は実行されません。これはなぜなんでしょうか?
#include <stdio.h>
int main(void){
int i;
int cnt = 5;
for (i = 0; i < cnt; i++){
printf("%d\n",i);
}
if(i == cnt){
printf("aaa");}
return 0;
}
217ポイント を手に入れた。
|
|
|
|
Name: esu ..ぴよぴよ(903ポイント)
Date: 2008/12/04(木) 21:38
No:25102
|
|
Title: Re:for文においての数の増え方
|
|
お答え頂きありがとうございます。
i < cnt;は5、i <= は6になったということですね。
i < cnt;の場合、最後の4がprintfで出力されfor文が終わった後に1がプラスされる
という考えで間違っていませんか?
質問とは関係ありませんが、でプログラムソース全体を囲えば字下げ
されるはずですよね?
154ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(130,572ポイント)
Date: 2008/12/04(木) 21:53
No:25103
|
|
Title: Re:for文においての数の増え方
|
|
当該のコードにおいて、for 文のループを脱出するのは、
i が 5 になったときです。
つまり、for 文のループを脱出した時点における
i の値は 5 です。
したがって、当該の if 文の結果は真となります。
もともとのソースが字下げしてあれば、
<pre>と</pre>で挟むと
投稿時も字下げしてくれます。
2倍のポイントを手に入れた! 196ポイント を手に入れた。
|
|
|
|
|
Name: esu ..ぴよぴよ(965ポイント)
Date: 2008/12/04(木) 22:21
No:25104
|
|
Title: Re:for文においての数の増え方
|
|
理解できました。ありがとうございます。
字下げされなかったのは元々のソースが字下げされてないためのようでした。
62ポイント を手に入れた。
|
|
|
|
Name: フォンクス ..かけだし(1,038ポイント)
Date: 2008/12/04(木) 19:33
No:25090
|
|
Title: フォントの変え方で
|
|
DXライブラリを使ってゲームソフトを作っているのですが、タイトル画面で
標準で入ってたフォントで良いのが無かったのでネットで探して
ダウンロードしたのですが、フォントをインストール(?)しないで
使用する方法はありますか?
67ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(281,274ポイント)
Date: 2008/12/04(木) 20:07
No:25096
|
|
Title: Re:フォントの変え方で
|
|
そのフォントの著作権的に問題がなければ、画像編集ツール上で表示に必要な文字を
画像に出力して、それをアプリで表示すればいいかと思います。
41ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(281,405ポイント)
Date: 2008/12/04(木) 21:13
No:25099
|
|
Title: Re:フォントの変え方で
|
|
あ、一応 WinAPIの AddFontResource()を使うという手もあります。
これを使えばそのアプリケーションだけが使えるフォントを追加することができたはずです。
(ただ事実上インストールすることになるので、要望からはちょっと外れてしまいますが)
AddFontResource 関数
ttp://msdn.microsoft.com/ja-jp/library/cc428317.aspx
DXライブラリ3Dでオリジナルフォントを読み込ませてみよう
ttp://fatalita.sakura.ne.jp/3DLib/Tips/OriginalFont/index.html
131ポイント を手に入れた。
|
|
|
|
Name: 初心者。 ..ぴよぴよ(178ポイント)
Date: 2008/12/04(木) 15:13
No:25044
|
|
Title: 物理の式
|
|
C言語〜ゲームプログラミングの館〜
の
27. ジャンプの考え方1(物理)
の式なんですが
y = (int) ((sqrt ( 2.000 * g * y_max) * t - 0.500 * g * t * t) * 448.000 / y_max);
この式で時間の値が分かっても、y_maxの値が分からないとyの値が分からないないと思っているのですが、y_maxの値はどのように決まるのでしょう?
y_maxの値を600mとかに変えたりしてジャンプさせていたのですが、よく分かりません><
よろしくお願いします。
178ポイント を手に入れた。
|
|
|
Name: Sora ..かけだし(2,450ポイント)
Date: 2008/12/04(木) 15:25
No:25047
|
|
Title: プログラムのことで
|
|
だいぶ前に投稿させてもらったSoraです。
プログラムとにらめっこしてみたり、C言語のサイトを見てみたりしたのですが
やっぱり解らないというか、どうしたらできるのか解りません。
#include<stdio.h> /*stdio.hをインクルードする*/
#include<string.h> /*string.hをインクルードする*/
#include<ctype.h> /*ctype.hをインクルードする*/
int main(){ /*メインクラス*/
int cnt=0,max1=0,cnt2=0,i=0,swich=0,soe=0; /*int型宣言*/
char str[128],max[128],su[128]; /*char型で宣言*/
printf("数字を10回入力してください。\n");
while(cnt2<10){
i=0;
printf("%d回目の入力をしてください。" , cnt2+1);
/*scanf("%c" , su[i]);*/
while(1){
swich = 0;
scanf("%c" , &su[i]);
if(su[i] == '\n'){
su[i] = '\0';
swich = 2;
break;
}
if(isdigit(su[i])==0){
swich = 1;
break;
}
i++;
}
if(swich == 1){
printf("数値を入力しなおしてください\n");
continue;
}
if(swich == 2 && i == 0){
printf("未入力ですもう一度入力してください。\n");
continue;
}
for(i=0;i<strlen(su);++i){
if((su[i]%2) != 0){
if(su[i]>max1){
max1 = su[i];
}
}
}
cnt2++;
}
printf("一番大きい奇数は>%d" , max1);
rewind(stdin); /**/
getchar();
}
2つのプログラムの後半なので、切る部分が適切でないかもしれませんが;
やりたいことは
・scanf関数を使用して、数字を10回入力し、最も大きな奇数を表示しなさい。
※未入力、半角数値以外の入力はエラーとし、もう一度入力できるようにする事。
です。
未入力半角数値以外という入力エラーがまじめに解りません;
どこをどのように改変すれば出来る様になるのか、がわかりません。
前もご指南いただいたのですが、改変する場所が違ったのか出来ませんでした。
よろしくお願いします。
637ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(908,833ポイント)
Date: 2008/12/04(木) 15:55
No:25051
|
|
Title: Re:プログラムのことで
|
|
とりあえず、キーボードから数値入力を読み取り、エラーが起きると再入力を促すサンプルを作ってみました。
#include <stdio.h>
/* キーボード入力された int 型データを引数に格納する */
/* 関数値 0:正常 1:異常 */
int GetInt(int *iVal){
int iRet;
if( scanf( "%d", iVal ) != 1 ) {//正常に格納されなかったら
iRet = 1;
} else {
iRet = 0;
}
while( getchar() != '\n' );//改行まで読み飛ばす
return iRet;
}
int main(void){
int i;
int iVal[5];
for(i=0; i<5; i++){
printf("%d個目の数値を入力して下さい-> ", i+1 );
if( GetInt( &iVal[i] ) == 0 ){
printf( "[%d]を格納しました\n\n", iVal[i] );
} else {
printf( "エラーです。再入力して下さい\n\n" );
i--;
}
}
printf( "\n**配列に格納された数の一覧**\n" );
for(i=0; i<5; i++){
printf("[%d]\n", iVal[i] );
}
return 0;
}
実行結果(例)
1個目の数値を入力して下さい-> 1010
[1010]を格納しました
2個目の数値を入力して下さい-> 200s123
[200]を格納しました
3個目の数値を入力して下さい-> s2000
エラーです。再入力して下さい
3個目の数値を入力して下さい-> -2-2
[-2]を格納しました
4個目の数値を入力して下さい-> 2k2k
[2]を格納しました
5個目の数値を入力して下さい-> 100000000000000000000000000
[-469762048]を格納しました
**配列に格納された数の一覧**
[1010]
[200]
[-2]
[2]
[-469762048]
実行結果例で5回いろんな入力をしてみたので、その時々によって、どうなるのか確認して下さい。
一つ弱点なのが、オーバーフローしてしまう点ですが、そこまで条件わけ処理しろと書いてないので大丈夫かと。
これがわかれば課題は解けますかね?
677ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(908,990ポイント)
Date: 2008/12/04(木) 15:58
No:25054
|
|
Title: Re:プログラムのことで
|
|
入力された数値が奇数が偶数か判定するサンプルです。
#include <stdio.h>
int main(void) {
int a;
scanf( "%d", &a );
if( a % 2 == 0 ){
printf( "%dは偶数です\n", a );
} else {
printf( "%dは奇数です\n", a );
}
return 0;
}
実行結果
101
101は奇数です
2わったあまりが0なら偶数、1なら奇数であるとわかりますね。
答えこの辺においときます。 h ttp://dixq.net/code/kotae.html
157ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(909,151ポイント)
Date: 2008/12/04(木) 16:51
No:25064
|
|
Title: Re:プログラムのことで
|
|
そういえば、
if( a % 2 == 0 ){
printf( "%dは偶数です\n", a );
} else {
printf( "%dは奇数です\n", a );
}
これじゃ負の数が計算できませんね
if( a % 2 != 0 ){
printf( "%dは奇数です\n", a );
} else {
printf( "%dは偶数です\n", a );
}
に訂正します
131ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(16,571ポイント)
Date: 2008/12/04(木) 17:18
No:25067
|
|
Title: Re:プログラムのことで
|
|
とりあえず、添付されたプログラムでは最大値が出ないでしょうから
for(i=0;i<strlen(su);++i){
if((su[i]%2) != 0){
if(su[i]>max1){
max1 = su[i];
}
}
}
この部分を
if(max1<atoi(su) && atoi(su)%2)
max1=atoi(su);
このように変更したら動きます。
94ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(40,429ポイント)
Date: 2008/12/04(木) 18:20
No:25086
|
|
Title: Re:プログラムのことで
|
|
このスレのおかげでまた知らない関数・文知りましたw
continueは使えそうな気がしますが・・・
なんだか多用すると思わぬバグ引き起こしそうですね。。
あとコード全体がみづらくなりそうな・・・。
isdigitも全然知りませんでした^^;
勉強になります。
失礼しました
83ポイント を手に入れた。
|
|
|
|
Name: ざこ ..ぴよぴよ(192ポイント)
Date: 2008/12/04(木) 14:32
No:25036
|
|
Title: ファイル(初心者です)
|
|
今ファイルを一行ずつ読み込み、一行の最後尾まで移動して後ろから順に.があるまで取り出すプログラムを作成中なのですが
{
FILE *fp
char *str
char buf[1000]
if((fp=fopen("ファイル名","r"))!=NULL){
str=buf;
int len=strlen(str);
for(i=0,i<=len;i++){
str++;
}
while(isdigit(*str)){
for(i=0;i<len;i++){
str--;
}
printf("%d\n",str);
}
}
}
1234.321.151(実行前)
↓
151
123
4321(実行後)
という具合にしたいんですけど上記のプログラム全然違いますよね?
コメント付きで教えていただけるとうれしいです。
192ポイント を手に入れた。
|
|
|
|
Name: ざこ ..ぴよぴよ(233ポイント)
Date: 2008/12/04(木) 14:43
No:25039
|
|
Title: Re:ファイル(初心者です)
|
|
ファイル名のとこだけ手書きでした・・後コピー漏れが少しありました。変更しておきます。
41ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(130,329ポイント)
Date: 2008/12/04(木) 14:50
No:25040
|
|
Title: Re:ファイル(初心者です)
|
|
ファイルをオープンしただけで、読み込み処理を行っていませんね。
ついでに、ファイルのクローズも忘れているようです。
47ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(41,218ポイント)
Date: 2008/12/04(木) 14:56
No:25041
|
|
Title: Re:ファイル(初心者です)
|
|
コメント付けました。
(見やすいように字下げしておきます)
{ // int main() が無い
FILE *fp // ';' が無い
char *str // ';' が無い
char buf[1000] // ';' が無い
if((fp=fopen("ファイル名","r"))!=NULL){
// テキストを buf に読み込んでいない
str=buf;
int len=strlen(str);
/*
for(i=0,i<=len;i++){
str++;
}
*/
// 上の代わりにこうしたほうがラク。
str += len;
/* これは処理が色々おかしいので間違い。
while(isdigit(*str)){
for(i=0;i<len;i++){
str--;
}
printf("%d\n",str);
}
*/
// 代わりにこうすると良いかも。
--str;
while(buf <= str){
if(isdigit(*str)){
printf("%c",*str);
}
else if(*str == '.'){
printf("\n");
}
--str;
}
printf("\n");
}
// ファイルをクローズしていない
}
分からないところがあれば聞いてください。
(何が原因だったのかとかなんでこれで動くのかとか)
あ、動作チェックはしていませんのであしからず。
498ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..ぴよぴよ(408ポイント)
Date: 2008/12/04(木) 15:28
No:25048
|
|
Title: Re:ファイル(初心者です)
|
|
ありがとうございます。では質問させていただきます。
for(i=0,i<=len;i++){
str++;
の代わりに
str += len;ですよね
for文の方は最後尾まで移動する。最初が1234.4567.328であれば8に。
str+=lenの方は実際にはstr=str+lenで
strには文字列が入っていてlenは数字でそれを足したらfor文の方といっしょになるというのが
いまいちよくわからないのです。
175ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(41,990ポイント)
Date: 2008/12/04(木) 15:57
No:25052
|
|
Title: Re:ファイル(初心者です)
|
|
これは「ポインタ」が大きく絡むのですが、サンプルで簡単に説明します。
int main(){
char* buf = "sample text.";
char* str;
int i;
int len = strlen(buf);
printf("str++ を使った処理\n");
str = buf;
for(i=0;i<len;i++){
printf("%d文字目は'%c'\n",*str);
str++;
}
printf("str += 1 を使った処理\n");
str = buf;
for(i=0;i<len;i++){
printf("%d文字目は'%c'\n",*str);
str+=1;
}
printf("str[i] を使った処理\n");
str = buf;
for(i=0;i<len;i++){
printf("%d文字目は'%c'\n",str[i]);
}
printf("str = buf+i を使った処理\n");
str = buf;
for(i=0;i<len;i++){
str = buf+i;
printf("%d文字目は'%c'\n",*str);
}
return 0;
}
それぞれの処理は全て同じ結果になるはずです。
str 自体は文字列では無く、文字列への場所(ポインタ)を指しています。
なので、str = buf とした場合は文字列のコピーではなく str は buf を指すだけです。
ここで str += len (str = str + len) とした場合、文字列に len を足すのではなく、
str の指す場所を len 文字ずらすと言う処理になるのです。
500ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..ぴよぴよ(518ポイント)
Date: 2008/12/04(木) 16:30
No:25061
|
|
Title: Re:ファイル(初心者です)
|
|
>str 自体は文字列では無く、文字列への場所(ポインタ)を指しています
質問するのも躊躇するぐらい簡単な質門なのですが本を見てもよくわからなかったので・・
*strがstrのポインタで場所を示す と思ってたんですが。
strと*strの違いがピンと来ないんです。
103ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(54,822ポイント)
Date: 2008/12/04(木) 16:41
No:25062
|
|
Title: Re:ファイル(初心者です)
|
|
>strと*strの違いがピンと来ないんです。
*strとstr[0]は同じ意味
*(str + 1)とstr[1]も同じ意味になります。
配列を先に勉強していると思うので
これでわかると思うのですが、いかがでしょうか?
34ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..ぴよぴよ(545ポイント)
Date: 2008/12/04(木) 16:47
No:25063
|
|
Title: Re:ファイル(初心者です)
|
|
成る程、変にとらえてました。*str=str[0]なのは勉強した覚えがあります。
27ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(130,961ポイント)
Date: 2008/12/04(木) 17:03
No:25065
|
|
Title: Re:ファイル(初心者です)
|
|
ポインタは最初は理解しづらいですよね(^_^;)
私は、配列を本に例えて考えてみたら、パッと理解できました。
変数の名前(str) = 本のタイトル
配列の要素数(今回は1000) = ページ数(ただし、0ページから始まるとする)
今回は本を例えに使いますので、ポインタを栞(しおり)として考えます。
『str += len』というのは、strという本の最初のページからlenページ分進めた位置にはさんである栞だと思ってください。『*(str + len)』というのは、その栞が挟んであるページそのものだと思ってください。
栞の内容を書き換えても、本のページには変化ありませんよね?
ですから、ページの内容を書き換えたい場合には、栞の挟んであるページそのものを書き換えてやる必要がある…ということになります。
どうでしょう、かなり本題から話が逸れてしまいましたが、私はこういう風に考えてポインタを理解しましたんで、手助けになればいいかと思い、書き込みしてみました。
2倍のポイントを手に入れた! 632ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..ぴよぴよ(947ポイント)
Date: 2008/12/04(木) 17:16
No:25066
|
|
Title: Re:ファイル(初心者です)
|
|
{
FILE *fp;
char *str;
char buf[1000];
if((fp=fopen("ファイル名","r"))==NULL){
printf("fail open error");
return 0;
}
while(fgets(buf,1000,fp){
int len=strlen(str);
{
str+=len;
--str;
while(buf <= str){
if(isdigit(*str)){
printf("%c",*str);
}
else if(*str == '.'){
printf("\n");
}
--str;
}
printf("\n");
}
// ファイルをクローズしていない
}
一行ずつ読み込むというのが抜けたので修正しました。
while(fgets(buf,1000,fp){ の部分でfpから読んだ文字列1行をbufに入れる。
str=bufでstrはbufを指すという意味。
少し簡単にする為に最後尾から読むという作業は省きますが
デバッグで確認した所、bufに123.435.456という文字列が入っていました。上記のは一文字ずつ読んで表示しているのかな?
123
435
456
を保存する方法も知りたいです。
質問が曖昧ですが、123,435,456はbufに入っています。
では123と435と456を一旦保存しておくことはどうやったらできるのかということなんです。
すごく参考になります。
ポインタはまだ認識が甘い所がありますので。>バグさん
402ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(54,916ポイント)
Date: 2008/12/04(木) 17:35
No:25071
|
|
Title: Re:ファイル(初心者です)
|
|
>では123と435と456を一旦保存しておくことはどうやったらできるのかということなんです。
保存というのは、プログラム内部で保存ですか?
それともファイルに保存ですか?
もし、ファイルに保存するのであれば、printfをfprintfに変更するだけで実現可能になります。
94ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(42,368ポイント)
Date: 2008/12/04(木) 17:40
No:25073
|
|
Title: Re:ファイル(初心者です)
|
|
ファイルから buf に読み込んだ後、 str = buf でポインタを代入していないので、
strが初期化されず、処理がおかしくなってしまいます。
バグさんの本で例えるなら、本に栞を挟んでいない状態です。
> デバッグで確認した所、bufに123.435.456という文字列が入っていました。
読み込み元のテキストにはその一行が入っていますか?
(最初の質問時のテキストと違うのですが。)
> 上記のは一文字ずつ読んで表示しているのかな?
実はその周りの処理で数値だけを反転して数値を行で区切って表示しています。
buf の最後から逆方向に1文字ずつ表示し、'.'が出たら改行しています。
187ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(55,070ポイント)
Date: 2008/12/04(木) 17:49
No:25075
|
|
Title: Re:ファイル(初心者です)
|
|
きちんとしたものを作るには、動的確保を行ったほうがいいのですが
やり方が難しいので、今回は固定配列でやります。
char save[10][100]; // 10行、1列100文字まで対応
という保存領域を作っておき、カウンタを2つ用意します。
int cnt1, cnt2;
これらのカウンタはsave配列のインデックスに使用します。
save[cnt1][cnt2];
そして
while(buf <= str){
の中で、数字が来たらsave[cnt1][cnt2]の中に数字を保存して、cnt2を+1する。
[.]が来たら、cnt1を+1し、cnt2を0にする。
こうすることで、saveの中に、データが保持されます。
154ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..かけだし(1,353ポイント)
Date: 2008/12/04(木) 17:56
No:25078
|
|
Title: Re:ファイル(初心者です)
|
|
>最初の質問時のテキストと違うのですが
一行ずつ読み込むというのが抜けたので修正しましたと記載した通りです。
>>ファイルから buf に読み込んだ後、 str = buf でポインタを代入していないので
違うのをコピーしていました。
{
FILE *fp;
char *str;
char buf[1000];
if((fp=fopen("ファイル名","r"))==NULL){
printf("fail open error");
return 0;
}
while(fgets(buf,1000,fp){
str=buf
int len=strlen(str);
str+=len;
--str;
while(buf <= str){
if(isdigit(*str)){
printf("%c",*str);
}
else if(*str == '.'){
printf("\n");
}
--str;
}
printf("\n");
}
}
かな。ですが今行うと何も表示されませんね。
401ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..かけだし(1,397ポイント)
Date: 2008/12/04(木) 18:06
No:25082
|
|
Title: Re:ファイル(初心者です)
|
|
成る程、あぁセミコロンがないですね・・手書きだとどうも忘れてしまいます。
後1つがわかりません。
44ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(55,038ポイント)
Date: 2008/12/04(木) 18:10
No:25084
|
|
Title: Re:ファイル(初心者です)
|
|
>while(fgets(buf,1000,fp){
です。
手書きではなく、実際にコンパイルしているソースをコピペするようにしてください。
16ポイント を手に入れた。
|
|
|
|
Name: 西村 ..初心者(7,004ポイント)
Date: 2008/11/29(土) 17:33
No:24754
|
|
Title: X-Windowを知ってる方に質問です
|
|
上下左右キーのキーシンボルをご存知の方、どうか教えてください。Enterや Esc のキーシンボルは解っているのですが、上下左右は色々なサイトを巡っても見付かりませんでした。
Enter が XK_Return だから、↑は XK_Up かなぁと試したのですが、コンパイルは通るのに↑を押しても反応が無かったあたり間違っているみたいで・・・一々キーコードを取得してプログラムするのは手間なので、教えていただければ楽になるのですが。
X-Windowを使い始めて身に染みました。DXライブラリは解りやすい。
63ポイント を手に入れた。
|
|
|
|
Name: 西村 ..初心者(7,034ポイント)
Date: 2008/12/04(木) 18:04
No:25081
| 解決!
|
Title: Re:X-Windowを知ってる方に質問です
|
|
SDLを導入することにより解決しました。
ま・・・まぁ、一応質問立てた者のケジメとして結果を報告しておきます・・・
30ポイント を手に入れた。
|
|
|
|
Name: 天使 ..ぴよぴよ(94ポイント)
Date: 2008/12/03(水) 18:10
No:24983
|
|
Title: 階乗について
|
|
1〜入力された数字までの階乗を求めるプログラムを書こうと思っています。
添付したものはソースです。
最後に2つ追加したいです。
1つ目はもう一度計算するかをキーで入力させます。
2つ目はunsigned longで42憶程度まで計算できるようにしていますが
それを超えてしまった場合入力をやり直させるということです。
急いではいませんので質問が理解でき、お時間のある方のみで構いませんので
教えてください。
94ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(906,211ポイント)
Date: 2008/12/03(水) 18:56
No:24992
|
|
Title: Re:階乗について
|
|
同じ事を繰り返す時はループを使うといいです。
while(1){
//計算;
//キー入力
if(キー == 続ける){
continue;
}
else{
break;
}
}
こんな感じでどうでしょうか?
後、文字列はscanfじゃなくても読み取れます。
色んな実装方法があると思いますが、getcharを使ってこんなの書いてみました。
どうやったらキーボード入力からエラーなく効率よく取ってこれるのかイマイチよく知りませんが、
私の実装案です。
sizeof(4)のint型のキーボード入力された値をとってくる関数です。
(バグがあったため、次の投稿で提示します)
strtolを使うと、渡した文字列をint型に変換するとき、オーバーフローなら
( errno == ERANGE || errno == EINVAL ) でかつ
( *iVal == LONG_MIN || *iVal == LONG_MAX )
になることを利用して、エラーを判定しています。
また文字列に格納する時に、10億である10桁よりも多い数が入力された時点でエラーフラグを立てています。
格納したい変数のアドレスを渡します。
かえってきた値が0なら正常、1ならエラーです。
これで判定してみてはどうでしょう。
660ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(906,876ポイント)
Date: 2008/12/03(水) 19:14
No:24996
|
|
Title: Re:階乗について
|
|
unsigned int でしたね。ちょっと書き換えてサンプルにしました。
実行して確認して下さい。
#include <stdio.h> //printf等の為に必要
#include <errno.h> //errnoの為に必要
#include <stdlib.h> //strtoulの為に必要
#include <ctype.h> //isdigitの為に必要
/* キーボード入力された unsigned int 型の値を引数に格納する */
/* 関数値は 0:正常 1:異常 */
int GetUnsignedInt( unsigned int *iVal )
{
int i=0, iCh;
int iErrorFlag=0; /* エラーフラグ */
int iSignFlag=0; /* 符号フラグ 0: 1 文字目が数字、 1: 1 文字目が"+"、 2: 1 文字目が"-" */
char cStr[12] = {0,}; /* キーボード入力された文字列を数値に変換する為の配列 */
while ( ( iCh = getchar() ) != '\n' ) {
/* 改行が行われるまで iCh に入力しながらループ */
/* 1 文字目が符号ならそれによる数値を代入 */
if( i == 0 ){
if( iCh == '+' ){
iSignFlag = 1;
}
else if( iCh == '-' ){
iSignFlag = 2;
}
}
if( ( iSignFlag ? i == 1 : i == 0 ) && ( iCh == '0' ) ) {
/* 一桁目が 0 なら飛ばす */
continue ;
}
if ( ( !( ( i == 0 ) && ( iCh == '+' || iCh == '-' ) ) && isdigit( iCh ) == 0 )
|| ( iSignFlag ? i >= 11 : i >= 10 )
|| iSignFlag == 2 ) {
/*
最初に + か - である以外の文字で、10 進数で表せないか、
最初に文字がある時は 11 文字以上、無い時は 10 文字以上であるか
マイナスである時
*/
iErrorFlag=1;
} else if ( iCh != EOF ) {
/* それ以外で EOF でなければ格納する */
cStr[ i ] = (char) iCh;
}
i++;
}
/* エラーナンバーを 0 に設定 */
errno = 0;
/* cStr を10進数整数に変換する */
*iVal = strtoul( cStr, NULL, 10 );
if ( ( iErrorFlag == 1 )
|| ( ( errno == ERANGE || errno == EINVAL ) && ( *iVal == ULONG_MAX ) )
|| ( errno != 0 && *iVal == 0 ) ) {
/* エラーフラグがオン、または
errno が ERANGE か EINVAL で、かつ *iVal が ULONG_MAX ではない、または
errno が 0 じゃなく、*iVal が 0 であるとき
異常終了する */
return 1;
} else {
/* 正常終了する */
return 0;
}
}
int main(void){
signed int iVal;
unsigned int uiVal;
if( GetUnsignedInt( &uiVal ) == 0 ){
printf( "%u\n", uiVal );
} else{
printf( "エラー\n" );
}
return 0;
}
実行結果例1
3000000000
3000000000
実行結果例2
5000000000
エラー
実行結果例3
-3000000000
エラー
665ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(907,497ポイント)
Date: 2008/12/03(水) 20:06
No:24999
|
|
Title: Re:階乗について
|
|
int型を取ってくる関数にしてみました。
#include <stdio.h> //printf等の為に必要
#include <errno.h> //errnoの為に必要
#include <stdlib.h> //strtoulの為に必要
#include <ctype.h> //isdigitの為に必要
/* キーボード入力された int 型の値を引数に格納する */
/* 関数値は 0:正常 1:異常 */
int GetInt( int *iVal )
{
int i=0, iCh;
int iErrorFlag=0; /* エラーフラグ */
int iSignFlag=0; /* 符号フラグ 0: 1 文字目が数字、 1: 1 文字目が"+"、 2: 1 文字目が"-" */
char cStr[12] = {0,}; /* キーボード入力された文字列を数値に変換する為の配列 */
while ( ( iCh = getchar() ) != '\n' ) {
/* 改行が行われるまで iCh に入力しながらループ */
/* 1 文字目が符号ならそれによる数値を代入 */
if( i == 0 ){
if( iCh == '+' ){
iSignFlag = 1;
}
else if( iCh == '-' ){
iSignFlag = 2;
}
}
if( ( iSignFlag ? i == 1 : i == 0 ) && ( iCh == '0' ) ) {
/* 一桁目が 0 なら飛ばす */
continue ;
}
if ( ( !( ( i == 0 ) && ( iCh == '+' || iCh == '-' ) ) && isdigit( iCh ) == 0 )
|| ( iSignFlag ? i >= 11 : i >= 10 )) {
/*
最初に + か - である以外の文字で、10 進数で表せないか、
最初に文字がある時は 11 文字以上、無い時は 10 文字以上であるとき
*/
iErrorFlag=1;
} else if ( iCh != EOF ) {
/* それ以外で EOF でなければ格納する */
cStr[ i ] = (char) iCh;
}
i++;
}
/* エラーナンバーを 0 に設定 */
errno = 0;
/* cStr を10進数整数に変換する */
*iVal = strtol( cStr, NULL, 10 );
if ( ( iErrorFlag == 1 )
|| ( ( errno == ERANGE || errno == EINVAL ) && ( *iVal == LONG_MIN || *iVal == LONG_MAX ) )
|| ( errno != 0 && *iVal == 0 ) ) {
/* エラーフラグがオン、または
errno が ERANGE か EINVAL で、かつ *iVal == LONG_MIN か *iVal == LONG_MAX であるときか、
errno が 0 じゃなく、*iVal が 0 であるとき
異常終了する */
return 1;
} else {
/* 正常終了する */
return 0;
}
}
int main(void){
int iVal;
if( GetInt( &iVal ) == 0 ){
printf( "%d\n", iVal );
} else{
printf( "エラー\n" );
}
return 0;
}
実行結果例1
2000000000
2000000000
実行結果例2
3000000000
エラー
実行結果例3
-3000s000000
エラー
実行結果例4
-0000002000000000
-2000000000
621ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(15,738ポイント)
Date: 2008/12/03(水) 20:23
No:25001
|
|
Title: Re:階乗について
|
|
>printf("階乗結果は %d です。\n\n",Sum);
unsugned long なので %lu です。
また、staticにする意味はないと思います。
仮にunsigned long の最大値が 4294967295だとすると、12の階乗までしか求められないですね。
12までってプログラムしちゃいけないんですね。
計算されて出てきた数をその時、かけた数で割ってみて、もとの数と同じかチェックしてみたらいかがでしょう。違っていたら、オーバーフローしていたということになりませんかね。
143ポイント を手に入れた。
|
|
|
|
|
Name: 天使 ..ぴよぴよ(396ポイント)
Date: 2008/12/04(木) 17:34
No:25070
|
|
Title: Re:階乗について
|
|
getcharを使っていたのですが文字列ではなく数値を取り出しているのでscanfを使っています。
正直、両方の使い方がいまいちわからないのですが
getcharはchar型の文字列や文字
scanfは数値
と考えていいのでしょうか?
%luについて
すいませんwww
はじめintでしてたので直していませんでしたw
90ポイント を手に入れた。
|
|
|
|
Name: うい ..かけだし(1,398ポイント)
Date: 2008/12/03(水) 20:28
No:25002
|
|
Title: ヘッダ
|
|
分割コンパイルを楽にするために.hを作りたいと思うのですが、VC++でやる場合はほかの.cppと同じように、新規でつくって、同じようにDXライブラリの設定をすればよろしいのでしょうか?
64ポイント を落としてしまった。
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(40,306ポイント)
Date: 2008/12/03(水) 23:24
No:25008
|
|
Title: Re:ヘッダ
|
|
よく意味が理解できないのは自分だけでしょうか^^;
.hを作って、Dxlib.hをインクルードさせるという意味ですか?
そうしたら.cppではそのヘッダーをインクルードすればよいですよね。
とりあえずやってみて出来なかったら聞きにいらしたほうがいい回答が得られる気がしますが・・・。
2倍のポイントを手に入れた! 242ポイント を手に入れた。
|
|
|
|
Name: 初心者 ..上級者(22,454ポイント)
Date: 2008/12/03(水) 21:43
No:25004
|
|
Title: ウィンドウ化と背景画像について
|
|
すごく初歩的なことだと思いますが、お願いします。
1.ウィンドウ化して表示するのにサイズの指定はどうすればいいんですか?
2.背景を指定して、その上をキャラを動かさせたいのですが真っ黒のままで背景が出ません。
どのように書けばいいのでしょう?
調べてみたのですが、わかりませんでした。どなたか教えてください。
120ポイント を手に入れた。
|
|
|
Name: yasya ..かけだし(2,169ポイント)
Date: 2008/12/02(火) 20:04
No:24947
|
|
Title: ヘッダーファイルについて
|
|
クラスを入れたヘッダーファイルを他のヘッダーファイルで読み込んで、さらにそれを複数のソースファイルで使いたいと思ってるんですけど、どうすればいいかわかりません。そもそも、これは可能なのでしょうか?
教えてください。
あと、ファイルを添付しておきます。(今の状態ではエラーが出ますけど^^;)
104ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(130,376ポイント)
Date: 2008/12/02(火) 20:15
No:24948
|
|
Title: Re:ヘッダーファイルについて
|
|
「多重インクルード」や「インクルードガード」という
キーワードについて調べてみると、何かよいことがあるかもしれません。
39ポイント を手に入れた。
|
|
|
|
|
Name: yasya ..かけだし(2,295ポイント)
Date: 2008/12/03(水) 15:56
No:24967
|
|
Title: Re:ヘッダーファイルについて
|
|
boxさんが言うように、インクルードガードについて調べて、それを使ってコンパイルしてみました。
しかし、やっぱりエラーが出てしまいます・・・。どうしてでしょうか?
/* CString.h */
#ifndef CSTRING_H
#define CSTRING_H
中略
#endif
今上に書いたような感じになってるんですけど、これが間違ってるんでしょうか?
126ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(40,382ポイント)
Date: 2008/12/03(水) 16:22
No:24969
|
|
Title: Re:ヘッダーファイルについて
|
|
添付されているファイルにはインクルードガードとほぼ同様の #pragma once が入っているので、
結果はかわらないと思います。
ヘッダファイルにはクラスメンバ関数の定義があるので、その部分だけを別のソースファイル(*.cpp)に移してやってみたらどうでしょうか。(CString.hへのインクルードは必要)
83ポイント を手に入れた。
|
|
|
|
|
Name: yasya ..かけだし(2,332ポイント)
Date: 2008/12/03(水) 17:55
No:24977
|
|
Title: Re:ヘッダーファイルについて
|
|
御津凪さんの言うようやってみましたが、ダメでした・・・。
他にいい方法はないでしょうか?
37ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..プログラマー(25,507ポイント)
Date: 2008/12/03(水) 18:09
No:24980
|
|
Title: Re:ヘッダーファイルについて
|
|
> 今の状態ではエラーが出ますけど
「エラーが出る」ではなく,「こういうエラーが出る」と,具体的なエラーの中身を提示してみてください。
エラーメッセージをCopy & Pasteするのが一番良い方法ですが,ファイル名などは隠しても問題ないと思います。
56ポイント を手に入れた。
|
|
|
|
|
Name: yasya ..入門者(3,430ポイント)
Date: 2008/12/03(水) 18:22
No:24985
|
|
Title: Re:ヘッダーファイルについて
|
|
とりあえず、上で添付したファイルをコンパイルすると、
mein.obj : error LNK2005: "public: __thiscall CString::CString(void)" (??0CString@@QAE@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: __thiscall CString::CString(int)" (??0CString@@QAE@H@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: __thiscall CString::~CString(void)" (??1CString@@QAE@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::CopyString(char *,int)" (?CopyString@CString@@QAEAAV1@PADH@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::CatString(char *)" (?CatString@CString@@QAEAAV1@PAD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __cdecl CString::Format(char *,...)" (?Format@CString@@QAAAAV1@PADZZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::LeftTrim(void)" (?LeftTrim@CString@@QAEAAV1@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::RightTrim(void)" (?RightTrim@CString@@QAEAAV1@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Trim(void)" (?Trim@CString@@QAEAAV1@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Left(int)" (?Left@CString@@QAEAAV1@H@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Right(int)" (?Right@CString@@QAEAAV1@H@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Mid(int,int)" (?Mid@CString@@QAEAAV1@HH@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Delete(int,int)" (?Delete@CString@@QAEAAV1@HH@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::Find(char)" (?Find@CString@@QAEHD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::Find(char *)" (?Find@CString@@QAEHPAD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::ReverseFind(char)" (?ReverseFind@CString@@QAEHD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::ReverseFind(char *)" (?ReverseFind@CString@@QAEHPAD@Z) は既に a.obj で定義されています。
LINK : fatal error LNK1104: ファイル 'DxLib.lib' を開くことができません。
と、18個のエラーが出ます。
1,098ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..プログラマー(25,835ポイント)
Date: 2008/12/03(水) 18:58
No:24994
|
|
Title: Re:ヘッダーファイルについて
|
|
リンクエラーですね。
今回の場合は,最後の物 (DxLib.libを開けない) を除くと,単一定義規則違反のようです。
インクルードガードは,「ひとつの」翻訳単位に対してのみガードする物です。
それに対して,このエラーは,「複数の」翻訳単位に同一名の関数があるために起きています。
・インライン関数 (クラス内定義,テンプレートなどの暗黙による物を含む) を除くすべての関数は,インクルードされるファイルに書かない
・変数の定義は,インクルードされるファイルに書かない
これを守る必要があります。
2倍のポイントを手に入れた! 328ポイント を手に入れた。
|
|
|
|
|
Name: yasya ..入門者(3,464ポイント)
Date: 2008/12/03(水) 19:16
No:24997
| 解決!
|
Title: Re:ヘッダーファイルについて
|
|
ありがとうございます。
指示してくれた通りやればエラーが消えました。
質問に答えてくれた皆さん、本当にありがとうございました^^
34ポイント を手に入れた。
|
|
|
|
|
Name: dic ..初心者(6,861ポイント)
Date: 2008/12/03(水) 17:36
No:24975
|
|
Title: Re:3角形の法則について
|
|
A(x,y)とB(x',y')の座標が分かっていてて
AからBへの角度を求める方法を知りたかったのです
説明が下手ですいません
前回の問題も、今回の問題もなんとか解決できそうです
ありがとうございました。
つまづいたら、また質問します
106ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(8,714ポイント)
Date: 2008/12/03(水) 17:40
No:24976
|
|
Title: Re:3角形の法則について
|
|
下の行を2乗すると
C^2 = A^2 + B^2 ではなく
C^2 = A + B になってしまいます。
なので
C^2 = A^2 + B^2 の両辺をCで割ります
C = (A^2 + B^2)/C になります。
学生ではないので間違えている可能性があるので
ググってみてください。
77ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..上級者(16,490ポイント)
Date: 2008/12/03(水) 18:10
No:24981
|
|
Title: Re:3角形の法則について
|
|
> 学生ではないので間違えている可能性があるので
> ググってみてください。
間違ってます。両辺にCが残った、意味のない変形です。
28ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(8,721ポイント)
Date: 2008/12/03(水) 18:13
No:24984
|
|
Title: Re:3角形の法則について
|
|
すいませんww
たいちうさん
残さないでということでしたか><
よくみたら解決されたみたいなのでよかったですw
7ポイント を手に入れた。
|
|
|
|
|
Name: dic ..初心者(6,935ポイント)
Date: 2008/12/03(水) 19:01
No:24995
| 解決!
|
Title: Re:3角形の法則について
|
|
管理人さん
ご返答ありがとうございます
学校で習っていないものが出ているようなので
独自で作りました
丁寧な解説ありがとうございました
また、解決ボタン押し忘れました
すいません
74ポイント を手に入れた。
|
|
|
|
Name: レッド ..ぴよぴよ(460ポイント)
Date: 2008/12/01(月) 20:29
No:24863
|
|
Title: scanfについて
|
|
#include <stdio.h>
void main()
{
int ia,ib;
scanf("%d",&ia);
scanf("%d",&ib);
printf("**** %d ト %d ノ シソクエンザン ****",ia,ib);
}
上記のような簡単なプログラムを作りました。
プログラムを実行して、scanfがあるので入力しますが、キーボードで入力した文字が表示されて、そして、printfのところができます。
キーボードで入力したのを見えないようにできませんか?
174ポイント を手に入れた。
|
|
|
|
Name: 初級者 ..入門者(2,747ポイント)
Date: 2008/12/01(月) 21:01
No:24866
|
|
Title: Re:scanfについて
|
|
お使いのOSによっては、以下のようなソースで
目的に近づけるかもしれません。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int ia,ib;
scanf("%d", &ia);
system("cls");
scanf("%d", &ib);
system("cls");
printf("**** %d ト %d ノ シソクエンザン ****", ia, ib);
return 0;
}
175ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(14,149ポイント)
Date: 2008/12/01(月) 21:02
No:24867
|
|
Title: Re:scanfについて
|
|
こういうことでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int strIn(void)
{
char str[80];
char *s;
int ch;
s=str;
while((ch=_getch())!='\r')
*s++=ch;
*s='\0';
return atoi(str);
}
int main(void)
{
int ia,ib;
ia=strIn();
ib=strIn();
printf("**** %d ト %d ノ シソクエンザン ****",ia,ib);
return 0;
}
216ポイント を手に入れた。
|
|
|
|
|
Name: レッド ..ぴよぴよ(499ポイント)
Date: 2008/12/01(月) 21:44
No:24872
| 解決!
|
Title: Re:scanfについて
|
|
ありがとうございます。
かいけついたしました。
ひとつべんきょうになりました。
39ポイント を手に入れた。
|
|
|
|
|
Name: at ..入門者(2,667ポイント)
Date: 2008/12/01(月) 22:51
No:24874
|
|
Title: Re:scanfについて
|
|
どうでもいいけどscanf()はバグがあることで有名だから使わない方がいいよ。処理が面倒でもfgets()とかがオススメ。
2倍のポイントを手に入れた! 116ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..入門者(2,776ポイント)
Date: 2008/12/01(月) 23:08
No:24876
|
|
Title: Re:scanfについて
|
|
今回のように、scanfを使うか他の関数を使うかが問題の本質ではない場合、
使用上の注意が必要なことをわかった上で
scanfを使うことには特に問題がないものと思量します。
29ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..入門者(2,833ポイント)
Date: 2008/12/03(水) 18:46
No:24991
|
|
Title: Re:scanfについて
|
|
「うまく動かない」だけしか言わないのは、
ここのような場所では「何も言っていない」のと
同じであることに気づいてください。
47ポイント を手に入れた。
|
|
|
|
Name: ちゅんこ ..ぴよぴよ(246ポイント)
Date: 2008/12/03(水) 01:50
No:24960
|
|
Title: プログラミングがうまく書けません
|
|
配送センター(1つ)から、納品先へ製品を届けるトラックの台数を最小化することが目的です。簡単に説明させていただきますと、(まだアルゴリズムがうまく書けていないのですが…)
制約条件といたしましては
@納品先毎に個別の指定時間を設ける場合、指定無し(納品回数に関連:1日1回等)を加える場合と、2つの条件設定を考えております。
A物流センターからの出荷時間は24時間可能のものとする
まずトラック1台からスタートして、もし24時を過ぎたら2台目を発車させる…という具合に、トラックを増やしていきます。
ステップ1:配送先の決定.
例) 配送優先順位 182976534
納品先 123456789
この場合、優先順位の最も高い納品先4へ配送する.
ステップ2:
@顧客の需要量がトラック積載量よりも多かった時,
・需要量=需要量−トラック積載量
・トラック積載量=0
⇒ステップ4へ
A顧客の需要量がトラック積載量よりも少なかった時,
・トラック積載量=トラック積載量−需要量
・需要量=0
・納品先を消す
⇒ステップ5へ
ステップ4:
倉庫へ戻り満タンにする.
トラック積載量=トラック積載量+10
⇒ステップ1へ
ステップ5:発車可能時刻+配送時間+サービス時間+配送時間<24時ならステップ7へ
それ以外ならステップ1へ
ステップ6:
トラック=トラック+1
⇒需要量が0以上の配送場所があったらステップ7へ.
なかったら終了
ステップ7:ルート選択
顧客が複数だったら,ステップ1へ
顧客が一つだったら,ステップ2へ
理解していただけたか不安なんですけれども、説明が下手で申し訳ございません。
こちらのファイルのfunction関数を上記のアルゴリズムで書きたいです。
246ポイント を手に入れた。
|
|
|
|
Name: 通りすがり ..中級者(13,191ポイント)
Date: 2008/12/03(水) 02:03
No:24961
|
|
Title: Re:プログラミングがうまく書けません
|
|
プログラムが見にくすぎです。とても読んで欲しいと思っていると思えません。
きちんとインデントし、括弧の対応に応じて字下げし、
きちんと注釈を入れて下さい。
26ポイント を手に入れた。
|
|
|
|
|
Name: conio ..初心者(5,551ポイント)
Date: 2008/12/03(水) 14:48
No:24966
|
|
Title: Re:プログラミングがうまく書けません
|
|
とりあえず、プロトタイプ宣言はmain関数の前に書くのが一般的ではないでしょうか?
--------------------------------------------------------------------------------
/*前略*/
void init(int [][NBIT]); /* 関数 init の型、引数の型等の宣言 */
void shuffle(int [][NBIT]); /* シャッフル関数の宣言 */
void print0(int [][NBIT]); /* 表示用関数の宣言 */
void func(int [][NBIT],double *,double *); /* 関数 func の型、引数の型等の宣言 */
void print1(int [][NBIT], double [N], double [N]); /* 表示用関数の宣言 */
void roulette(double *,double *); /* 関数 roulette の型、引数の型等の宣言 */
void printpq(double *,double *); /* 表示用関数の宣言 */
void select(int [][NBIT],double *); /* 関数 select の型、引数の型等の宣言 */
void cross(int [][NBIT]); /* 関数 cross の型、引数の型等の宣言 */
void mutation(int [][NBIT]); /* 関数 mutation の型、引数の型等の宣言 */
void find_max(double *,double *,double *,double *);
void main()
{
/*以下略*/
--------------------------------------------------------------------------------
こんな感じです。
2倍のポイントを手に入れた! 782ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(15,595ポイント)
Date: 2008/12/03(水) 17:05
No:24972
|
|
Title: Re:プログラミングがうまく書けません
|
|
添付されたプログラムは、遺伝的アルゴリズムの全然別の関数の最大値を求めようとしたプログラムで
今回の課題ではありませんね。つまり、自分で作ったプログラムではないということです。
こういう課題(遺伝的アルゴリズム)が出題されたということは、それなりの授業を受けたと思われますし
目的関数をどうするのか仕様をはっきりしてもらわないと、こちらも考えようがありません。
(正確には考えたくありません。だって難しいんだもん。)
丸投げはやめましょう。
196ポイント を手に入れた。
|
|
|
|
|
Name: やそ ..比類無きプログラマー(85,858ポイント)
Date: 2008/12/03(水) 17:57
No:24978
|
|
Title: Re:プログラミングがうまく書けません
|
|
ちゅんこさんの質問したいことは、
No:24960 に書かれたとおりで、
プログラムの書き方(見た目、正規表現?、書式)を添付したサンプル(全く別のプログラム)のようなイメージで書きたい。
とおっしゃっているのだと思います。
なので、フローチャートを示してあげるなり、
全部(もしくは一部)のプログラムを見せてあげるなり、
取っ掛かりを回答してあげればよいのではないでしょうか?
ちょっと私は仕事が忙しく、チラ見しただけなので、回答できるほど読み込んでいません。
時間が取れれば回答してあげたいですが^^;
回答者の皆さん、お手すきな方はどうか導いてやってください^^
165ポイント を手に入れた。
|
|
|
|
Name: go ..ぴよぴよ(235ポイント)
Date: 2008/12/03(水) 14:38
No:24964
|
|
Title: 文字が表示されない
|
|
void yomikomi(int zenin,int syoin)
{
if(zenin==1){
if(EOF == fscanf(fpz,"%d%d",&zcode,&kazu)){
zcode=99999;
}
}
if(syoin==1){
if(EOF == fscanf(fps,"%d%S%d",&scode,&namae,&tanka)){
scode=99999;
}
}
return;
}
上記の関数プログラムでnamaeをテキストファイルから入力しているのですが、一文字目しか
認識しません。どうしたらよいのでしょうか?
ちなみにnamaeはchar[20]で宣言しています。
235ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(40,299ポイント)
Date: 2008/12/03(水) 14:45
No:24965
|
|
Title: Re:文字が表示されない
|
|
> if(EOF == fscanf(fps,"%d%S%d",&scode,&namae,&tanka)){
↑%s ではないでしょうか。
%S だと、読み込み元ファイルがUNICODE文字でない限り正しく読めません。
103ポイント を手に入れた。
|
|
|
|
|
Name: go ..ぴよぴよ(252ポイント)
Date: 2008/12/03(水) 16:06
No:24968
|
|
Title: Re:文字が表示されない
|
|
ありがとうございました。
その通りでした。
大変助かりました。
17ポイント を手に入れた。
|
|
|
|
Name: 初心者 ..上級者(23,396ポイント)
Date: 2008/12/02(火) 17:30
No:24934
|
|
Title: 左辺値
|
|
double bx=100,by=100;
void ShiftCoords(double *x, double *y)
{
*x=*x+100;
*y=-*y+100;
}
{
FILE *fp;
char *str,buf[1000];
char subbuf[100],*s1;
char buf2[100],*s2;
char buf3[100],*s3;
char buf4[100],*s4;
ShiftCoords(&atof(buf3),&atof(buf4))
if ((fp = fopen("test.txt", "r")) == NULL) {
printf("ファイルが開けません\n");
return EXIT_SUCCESS;
}
while (fgets(buf, 1000, fp) != NULL) {
str=buf;
while((*str!='\0'){
if(*str!='\0' && *str=='G'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s2=buf2;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0'&&(isdigit(*str) || *str=='-' || *str=='.'))
*s2++=*str++;
*s2='\0';
}
if(*str!='\0' && *str=='X'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s3=buf3;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.')) *s3++=*str++;
*s3='\0';
}
if(*str!='\0' && *str=='Y'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s4=buf4;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) |*str=='||*str=='.')) *s4++=*str++;
*s4='\0';
}
else
str++;
}
CDC *v;
v=GetDC();
if((int)atof(buf2)==92){
MoveTo((int)atof(buf3),(int)atof(buf4));
bx=(int)atof(buf3);
by=(int)atof(buf4);
ReleaseDC(v);
}
else if((int)atof(buf2)==01){
MoveTo((int)bx,(int)by);
LineTo((int)atof(buf3),(int)atof(buf4));
bx=(int)atof(buf3);
by=(int)atof(buf4);
ReleaseDC(v);
}
}
fclose(fp);
return 0;
}
昨日教えていただいたプログラムに符号-を扱えるよう点を移動する関数を組み込んだモノなのですが
&の左辺値がありませんと出ます
>>ShiftCoords(&atof(buf3),&atof(buf4))
ここがおかしいみたいなんですが・・
double A=(int)atof(buf3);
double B=(int)atof(buf4);
ShiftCoords(&A,&B)
とするとエラーは出なくなったのですが図形がおかしくなりました。
原因と対策を教えてください。
1,489ポイント を手に入れた。
|
|
|
|
Name: non ..中級者(14,931ポイント)
Date: 2008/12/02(火) 17:54
No:24935
|
|
Title: Re:左辺値
|
|
何をやりたいのかよくわからないのですが・・・
>ShiftCoords(&atof(buf3),&atof(buf4))
buf3やbuf4に何も入ってないのにいきなりですし・・・関数名に&ね。
>とするとエラーは出なくなったのですが図形がおかしくなりました。
whileの前で処理したことがwhileの中に影響しているというのでしょうか?A,Bは代入後
使っていないようですが。 おかしくならず、前のままだと思います。
原点移動のために、100増やしたいなら、わざわざ関数を作らなくて、
MovetoやLinetoのとき
MoveTo((int)bx+100,(int)by+100);
すれば、いいのでは?
281ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(23,572ポイント)
Date: 2008/12/02(火) 18:15
No:24938
|
|
Title: Re:左辺値
|
|
関数作るのは移動させたときにy座標反転させないといけないらしく、そのときに便利だからなんですけど。
double A=atof(buf3);
double B=atof(buf4);
ShiftCoords(&A,&B)をどこに入れるかがわからないんだと思います。
どこにいれるかで全然値変わりますよね
174ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(15,138ポイント)
Date: 2008/12/02(火) 18:24
No:24940
|
|
Title: Re:左辺値
|
|
じゃ、これを呼び出している場所の間違いでしょう。
double A=atof(buf3);
double B=atof(buf4);
ShiftCoords(&A,&B)
グラフィックを描いているブロックのところで行うこと。この後、
MoveTo((int)A,(int)B); って呼び出す。
それより、シングルドキュメントだと原点移動やy軸反転とかする関数があるみたいですけど。
前回のスレッドに私が載せたプログラムは原点移動して、y軸反転もしてたんですけど。
207ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(21,951ポイント)
Date: 2008/12/02(火) 18:36
No:24941
|
|
Title: Re:左辺値
|
|
それは原点移動でしょう。私のは原点移動ではないですし。
使ってるVC++少し違うみたいでなんとも言えないんですがSDIベースとダイアログベースは
また少し違うんで、私の使ってるダイアログベースではOnDraw関数が無いのかな。代わりのものはあるようですが
OnDraw関数を参考にしてやってもうまくいきませんので。
それと原点移動なんですが
void CVTestView::OnDraw(CDC* pDC)
{
CVTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: この場所にネイティブ データ用の描画コードを追加します。
CRect r;
GetClientRect(r);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(1000, 600); // 窓の論理サイズの指定
pDC->SetViewportExt(r.right, -r.bottom); //ビューポートの指定
pDC->SetViewportOrg(r.right/2, r.bottom/2); //原点の指定
CPen p(PS_SOLID, 1, RGB(0, 255, 0));
CPen* oldp=pDC->SelectObject(&p);
pDC->MoveTo(-500, 0); pDC->LineTo(500, 0);
pDC->MoveTo(0,300); pDC->LineTo(0, -300);
LineTo(100,100);
LineTo(300,100);
とかってすると完璧にできてるのですが
void CVTestView::OnDraw(CDC* pDC)
{
CVTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: この場所にネイティブ データ用の描画コードを追加します。
CRect r;
GetClientRect(r);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(1000, 600); // 窓の論理サイズの指定
pDC->SetViewportExt(r.right, -r.bottom); //ビューポートの指定
pDC->SetViewportOrg(r.right/2, r.bottom/2); //原点の指定
CPen p(PS_SOLID, 1, RGB(0, 255, 0));
CPen* oldp=pDC->SelectObject(&p);
pDC->MoveTo(-500, 0); pDC->LineTo(500, 0);
pDC->MoveTo(0,300); pDC->LineTo(0, -300);
FILE *fp;
char *str,buf[1000];
char subbuf[100],*s1;
char buf2[100],*s2;
char buf3[100],*s3;
char buf4[100],*s4;
static double bx=0;
static double by=0;
if ((fp = fopen("test.txt", "r")) == NULL) {
printf("ファイルが開けません\n");
return EXIT_SUCCESS;
}
while (fgets(buf, 1000, fp) != NULL) {
str=buf;
while((*str!='\0'){
if(*str!='\0' && *str=='G'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s2=buf2;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0'&&(isdigit(*str) || *str=='-' || *str=='.'))
*s2++=*str++;
*s2='\0';
}
if(*str!='\0' && *str=='X'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s3=buf3;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.')) *s3++=*str++;
*s3='\0';
}
if(*str!='\0' && *str=='Y'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s4=buf4;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) |*str=='||*str=='.')) *s4++=*str++;
*s4='\0';
}
else
str++;
}
CDC *v;
v=GetDC();
if((int)atof(buf2)==92){
MoveTo((int)atof(buf3),(int)atof(buf4));
bx=(int)atof(buf3);
by=(int)atof(buf4);
ReleaseDC(v);
}
else if((int)atof(buf2)==01){
MoveTo((int)bx,(int)by);
LineTo((int)atof(buf3),(int)atof(buf4));
bx=(int)atof(buf3);
by=(int)atof(buf4);
ReleaseDC(v);
}
}
fclose(fp);
return 0;
}
とすると原点移動できてなかったんですけど、何が問題なのでしょうか
1,621ポイント を落としてしまった。
|
|
|
|
|
Name: non ..上級者(15,264ポイント)
Date: 2008/12/02(火) 18:54
No:24942
|
|
Title: Re:左辺値
|
|
質問に答えられるほど、VC++はわかりません。なんせ、先週から勉強始めました。
今現在、クラスがどうのこうので、こんがらがってます。
素人考えでは
MoveToをpDC->MoveToにしなくてよくエラーが出ないなと思うぐらいです。
bx,byの考え方は間違っていません。ただ、現在の状況ではstaticにしている意味はないと思いますが・・
(OnDrawで呼び出されるたびに、ファイルから読んでますからね)
126ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(129,293ポイント)
Date: 2008/12/02(火) 18:56
No:24943
|
|
Title: Re:左辺値
|
|
ダイアログベースの場合はOnDrawではなく、OnPaintが描画時に呼ばれます。
しかし、名前が違うだけで内部処理は基本的に同じはずです。つまり、OnDrawで出来て、OnPaintで出来ない事は基本的にないはずです。
ダイアログベースだろうが、SDIだろうが、WINDOWであることには変わりありません。
そこは勘違いされないように。
138ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(22,156ポイント)
Date: 2008/12/02(火) 19:02
No:24944
|
|
Title: Re:左辺値
|
|
あ・・pDCにしてないからダメだったみたいです。
質問ばかりでもうしわけないんですが
else if((int)atof(buf2)==01){
double A=atof(buf3);
double B=atof(buf4);
ShiftCoords(&A,&B);
MoveTo((int)bx,(int)by);
LineTo((int)atof(buf3),(int)atof(buf4));
に入れたんですが
MoveTo((int)A,(int)B)にすると
LineTo関数の方はどうなるんでしょう?
205ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(22,160ポイント)
Date: 2008/12/02(火) 19:07
No:24945
|
|
Title: Re:左辺値
|
|
OnPaintとOnDrawは内部構造は似たようなものだと思いますが使い分ける知識はありませんという
意味です。転写しただけではエラーでますし、もう少し後になってから使おうと思います。
4ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(15,399ポイント)
Date: 2008/12/02(火) 20:00
No:24946
|
|
Title: Re:左辺値
|
|
本人はおわかりでしょうが、見ている人は、初心者さんがどうしたいのか理解できておりません。
もしかしたら、理解していないのは私だけかも知れませんが、
前回のスレッドのときと線の引き方は変わったのですね。
すなわち、前は原点からG01コードの場合は放射線状に線を引いていたけど、G01コードは前の
ポイントから線を一筆書きにしていく。そのとき、ファイルから読んだ座標を変換するってことで
よろしいですね。
だとすると、私の認識ではLineToは前の座標から引いてくれるので、MoveToは必要ないのではないでしょうか?
したがって、前の座標を覚えておく変数もひつようない。
ただし、関数の最初でMoveTo(100,100);が必要ですが。
CDC *v;
v=GetDC();
この2行はwhileの中で、しなくてはいけないのですか?関数の頭で1度やればいいのでは?
この場所で
A=atof(buf3);
B=atof(buf4);
ShiftCoords(&A,&B);
をやっちゃいましょう。(宣言は関数の最初で)
if((int)atof(buf2)==92){
あいかわらず92のままです。
MoveTo((int)atof(buf3),(int)atof(buf4));
bx=(int)atof(buf3); <−不要
by=(int)atof(buf4); <−不要
ここがMoveTo((int)A,(int)B);
ReleaseDC(v); <−?
これも、そのたび必要なものなんですか?関数の最後で1回じゃダメ?
}
else if((int)atof(buf2)==01){
MoveTo((int)bx,(int)by); <−不要
LineTo((int)atof(buf3),(int)atof(buf4));
ここを LineTo((int)A,(int)B));
bx=(int)atof(buf3); <−不要
by=(int)atof(buf4); <−不要
ReleaseDC(v); <−?
}
135ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(22,334ポイント)
Date: 2008/12/03(水) 09:32
No:24962
| 解決!
|
Title: Re:左辺値
|
|
>>だとすると、私の認識ではLineToは前の座標から引いてくれるので、MoveToは必要ないのではないでしょうか?
したがって、前の座標を覚えておく変数もひつようない。
必要です。といってもそう思われるのも無理ないかもしれません。今回はムダに長くなるので省略していますが直線だけじゃなく円弧も書きますのでこうしないと円弧の終点から直線をひいたり直線の終点から円弧が書けないためです。
後不必要なプログラムもムダに打ち込んでしまってますがこれはそのうち改善されると思います。
174ポイント を手に入れた。
|
|
|
|
Name: レッド ..ぴよぴよ(866ポイント)
Date: 2008/12/02(火) 21:49
No:24951
|
|
Title: 大至急お願いします(文字列ソートについて)
|
|
・テーマ 文字列のソート
・プログラム説明
2次元の文字配列bufferに文字列をキーボードより入力し、入力終了後文字列の昇順にソートして出力する。
ただし、終了条件はend または END が入力された時とする。
・補足
文字列の比較には関数 strcmp を使用するとよい。
ただし、string h を #include すること。
・出力例
データ入力
buffer[0]=ebcde
buffer[1]=bcde
buffer[2]=abcd
buffer[3]=END
データ出力
abcd
bcde
edcde
上記が問題です。よろしくお願いします。
/* システム 1ネン 31バン (**個人名が書かれていたので管理人が削除しました**) */
/* EX110 */
/* モジレツノソート */
#include <stdio.h>
#include <string.h>
void main()
{
char buffer[256][256], w[256];
int i,j, ia;
i = 0;
j = 0;
printf(データ入力);
printf(\nbuffer[%d]=, i);
gets(buffer[i]);
while(strcmp(buffer[i], END) != 0 && strcmp(buffer[i], end) != 0){
i++;
j++;
printf(buffer[%d]=, i);
gets(buffer[i]);
}
for(j = j - 1; j > 0 && ia != 0; j--){
ia = 0;
for(i = 0; i < j; i++){
if(strcmp(buffer[i], buffer[i + 1]) > 0){
strcpy(w,buffer[i]);
strcpy(buffer[i],buffer[i + 1]);
strcpy(buffer[i + 1],w);
ia = 1;
}
}
}
printf(\n);
puts(データ出力);
for(i = 0;strcmp(buffer[i], END) != 0 && strcmp(buffer[i], end) != 0; i++){
puts(buffer[i]);
}
puts();
}
これが私の作ったプログラムなのですが、もっと簡単にできませんか?
------------------------------------------------------------
(理由の提示無く突然記事が削除された為、管理人により記事は元に戻されました)
367ポイント を手に入れた。
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(66,174ポイント)
Date: 2008/12/02(火) 22:27
No:24955
|
|
Title: Re:大至急お願いします
|
|
質問の意味が良く分からないです。
簡単にというのは、もっと短いコードで書いて欲しいという意味ですか?
想定される出力結果が出ないのは置いといて、無駄に長くなく、大体よさげなコードを書いているので
コードを短くする必要はないと思います。
あとは想定される出力結果に合わせてあげればいいのでは。
#とりあえずインデントがそろってないのでコードが読みにくいです。
152ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(66,334ポイント)
Date: 2008/12/02(火) 22:47
No:24956
|
|
Title: Re:大至急お願いします
|
|
あら、いつの間にか質問文が消えてる。
質問をした意図と理由は何となく見当がつくので、的確に質問をしてくれれば、
解に繋がる回答をしようと思っていたのですが。。。
2倍のポイントを手に入れた! 160ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(905,247ポイント)
Date: 2008/12/02(火) 23:15
No:24957
|
|
Title: Re:大至急お願いします
|
|
質問文を理由無く消す事は規約違反です。
勝手な理由で質問文を消す事は回答してくれた人に大変失礼です。
また、記事は投稿、修正、された時点で全てこちらにバックアップが保存されますので、記事は消しても戻せます。
規約に「明確な理由無く削除した場合は元に戻す」とさせていただいています。
もし何か不都合がある場合はその理由を教えて下さい。
何も理由の提示が無い場合は元に戻します。
130ポイント を手に入れた。
|
|
|
|
|
Name: conio ..入門者(4,769ポイント)
Date: 2008/12/02(火) 23:31
No:24959
|
|
Title: Re:大至急お願いします
|
|
文字列に関する質問でしたが、いつの間にか変わってますね。
(一応自分なりにプログラムを考えていた途中でした)
先のプログラムへの意見:初期化は特別な事情が無い限り、した方がいいです。
とりあえず、解決したのならば、「解決!」にするか、何らかのコメントを残すべきかな、と。
「ああ」って何でしょう?
インデントが揃っておらず、プログラムが読みにくい、等の指摘が気分を害したのでしょうか?
201ポイント を落としてしまった。
|
|
|
|
Name: けんけん ..ぴよぴよ(122ポイント)
Date: 2008/12/02(火) 14:01
No:24901
|
|
Title: 教えてください
|
|
2つの整数値を取り、その差分を得るという関数diffをC言語で設計し、その関数のソースコードを書いてください。引数の変数名はaとbとし、戻り値の変数をxとします。解答は、算術演算子、代入演算子どちらを用いても構いません。
っていう問題なんですが、プログラム初心者でわかりませんどなたか教えていただけませんか?
122ポイント を手に入れた。
|
|
|
|
Name: non ..中級者(14,273ポイント)
Date: 2008/12/02(火) 14:44
No:24905
|
|
Title: Re:教えてください
|
|
>解答は、算術演算子、代入演算子どちらを用いても構いません。
どういう意味で先生は課題を出しているのかなって考えてます。
代入演算子を使わないで関数を作れってのは return a-b; かなって思うのですが、
算術演算子を使わないのはどうやって実現しろっていうんでしょ。どう思います?
86ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(20,775ポイント)
Date: 2008/12/02(火) 14:48
No:24906
|
|
Title: Re:教えてください
|
|
>nonさん
確か
a += b ←これって代入演算子ですよね?
これでも良いって事では・・・
違ってたらすみません。
38ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(14,365ポイント)
Date: 2008/12/02(火) 15:19
No:24916
|
|
Title: Re:教えてください
|
|
> a += b ←これって代入演算子ですよね?
確かに。複合代入演算子ですね。
>引数の変数名はaとbとし、戻り値の変数をx
いずれにしても、課題がこう書いてあるのだから、
x=a-b;
return x;
って先生は期待しているはずで、両方使えってのが、正しいと思いますよね。
92ポイント を手に入れた。
|
|
|
|
|
Name: conio ..入門者(4,970ポイント)
Date: 2008/12/02(火) 22:15
No:24954
|
|
Title: Re:教えてください
|
|
@二つの値を変数a,bに入力させる
A関数diffを呼び出す
B関数diffにより、a,bの差分を求める
C差分xを表示
-----------------------------------------
● diff(●){
/*差分を求める処理*/
return(●);
}
int main(void){
/*変数a,bを作る*/
/*値を入力させる処理*/
/*関数diffを呼び出し、その結果をxへ*/
/*差分xを表示*/
return(0);
}
----------------------------------------
大体こんな感じでしょうか。
課題自体は、難しくないので、参考書の例題等を見れば恐らく分かると思います。
一応、大まかなプログラムを上記に示してみました。(一部穴あき)
255ポイント を手に入れた。
|
|
|
|
Name: macka ..ぴよぴよ(140ポイント)
Date: 2008/12/02(火) 15:26
No:24917
|
|
Title: 文字列をつなぐ
|
|
はじめまして今私はポインタの勉強をしていて文字列をつなぐ下記のようなプログラムを作ったのですがabc123と表示させたいのに実行するとabcbcとしか表示されません。間違いの指摘をしていただきたいです。お願いします。
#include<stdio.h>
char *ketugou(char *,char *);
int main(void)
{
char str[10]="abc";
char ptr[10]="123";
printf("%s,%s\n",str ,ketugou(str,ptr));
getchar ();
return 0;
}
char *ketugou(char *s,char *p)
{
int i=0;
while('\0'!=*(s++)){
while('\0'!=*(p+i)){
*(p+i)=*(s+i);
i++;
}
}
*(p+i)='\0';
return p;
140ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(40,166ポイント)
Date: 2008/12/02(火) 15:52
No:24920
|
|
Title: Re:文字列をつなぐ
|
|
現在の ketugou 関数は、 p に s を中途半端に代入しています。
具体的に処理を追うと、
・最初の while 文で '\0'!=*(s++) を比較(sは比較後次のポインタ位置へ)。真なのでループ内へ
・次の while 文で '\0'!=*(p+i) を比較。真なのでループ内へ
・*(p+i)=*(s+i);
i は 0 なので、 p[0] = s[0] と同じ。
ただし、s は呼ばれた時と違うポインタ位置(一つずれている)なので、s[0] は 'b' 。
・i++;し、次のループへ。
・*(p+i)=*(s+i);
i は 1 なので、 p[1] = s[1] と同じ。(s[1] は 'c' )
・i++;し、次のループへ。
・*(p+i)=*(s+i);
i は 2 なので、 p[2] = s[2] と同じ。(s[2] は '\0' )
・i++;し、次の判定で 偽となるため内側の while 文を抜ける。
・外側の while 文で s++ されているが、 i に変化が無いので、内側の while 文にいくことなく
そのまま while 文を抜け、関数が終了する。
結果、返されるポインタの文字列は "bc" となる。
47ポイント を落としてしまった。
|
|
|
|
|
Name: box ..ハッカー(130,337ポイント)
Date: 2008/12/02(火) 15:57
No:24921
|
|
Title: Re:文字列をつなぐ
|
|
> printf("%s,%s\n",str ,ketugou(str,ptr));
ここで何を出力したいのか、正確に教えてください。
abc123と出力させたいのに、と書かれていますが、上記のprintf()の実行では、
2つの文字列をカンマで区切って出力します。
abc123と出力させることは、もともとできません。
2倍のポイントを手に入れた! 168ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(904,650ポイント)
Date: 2008/12/02(火) 16:01
No:24922
|
|
Title: Re:文字列をつなぐ
|
|
こんな感じでどうでしょう。
連結される側のポインタst1を終端まで進め、そこから連結する側の文字列をコピーする。
コピーした文字が終端記号ならそこで終わる。
コピー先の文字列の先頭アドレスを返す
#include<stdio.h>
char *MyStrcat(char *st1, const char *st2){
char *p = st1;
/* st1を終端まで進める */
while ( *st1 != '\0' ){
st1++;
}
/* 連結作業 */
while ( 1 ){
/* st2をst1の終わりからつなげる */
*st1 = *st2;
/* つなげた文字が終端記号なら抜ける */
if( *st1 == '\0' ){
break;
}
/* ポインタを進める */
*st1++;
*st2++;
}
return p;
}
int main(void){
char str[10]="abc";
char ptr[10]="123";
printf("%s,%s\n",str ,ptr);
printf("-> %s\n",MyStrcat(str,ptr));
getchar ();
return 0;
}
実行結果
abc,123
-> abc123
上記の関数は以下のようにかいても同じ意味です。
char *MyStrcat(char *st1, const char *st2){
char *p = st1;
while (*st1) st1++;
while (*st1++ = *st2++) ;
return p;
}
337ポイント を手に入れた。
|
|
|
|
|
Name: macka ..ぴよぴよ(161ポイント)
Date: 2008/12/02(火) 16:15
No:24925
| 解決!
|
Title: Re:文字列をつなぐ
|
|
皆さんありがとうございます わかりやすく教えていただいたおかげで理解できました
21ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(14,511ポイント)
Date: 2008/12/02(火) 16:30
No:24928
|
|
Title: Re:文字列をつなぐ
|
|
本当にもう大丈夫ですか?
管理人さんのプログラムは難しいと思うけど・・・教科書通りじゃないって気がするけど。
なにが、教科書かって・・つっこまないで。
それでは、問題です。下のプログラムは、なぜ、駄目なんでしょうか。
課題1
char *MyStrcat(char *st1, const char *st2){
char *p = st1;
while (*st1++) ;
while (*st1++ = *st2++) ;
return p;
}
課題2
char *MyStrcat(char *st1, const char *st2){
char *p = st1;
while (*st1) st1++;
while (*st2) *str++=*str++;
return p;
}
146ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(14,650ポイント)
Date: 2008/12/02(火) 16:56
No:24930
|
|
Title: Re:文字列をつなぐ
|
|
課題2にミスがありました。失礼しました。
課題2
char *MyStrcat(char *st1, const char *st2){
char *p = st1;
while (*st1) st1++;
while (*st2) *st1++=*st2++;
return p;
}
>途中で抜けてしまうから
回答が、簡単すぎるので、mackaさんがわかっておられるか、ちょっとはかりかねますが、
おわかりなら、OKです。
139ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..プログラマー(39,430ポイント)
Date: 2008/12/02(火) 03:25
No:24884
|
|
Title: 自作アプリ公開
|
|
邪魔します。
暇つぶしに作っていたツール&ホームページが完成したので報告いたします。
っというか・・・ホームページって作るのって結構面倒なんですね^^;
まだメールフォームぐらいしかありませんが。。
まだ最高に見づらいので時間を見つけていじっていこうかと思います。
とりあえずメモ帳でやりましたが・・・見づらいの極みでした。。
visual C++ぐらい使いやすいエディタないですかね。。
タグをツールバーで選択できるとか・・・。
皆さんはどのようなのをお使いなのでしょうか^^;
今回の作ったやつなんですが、概要は、
画像ファイルをウィンドウ内にドラッグ&ドロップし、
その画像をマウスで好きなように配置をし、
その画像ファイルの名前、位置等を出力するツール
です。
学校、遊び等を優先してたらめちゃくちゃ時間がかかりました^^;
しかも中心がはじめての線形リストだけあって、理解しては忘れの繰り返しでした。。
配列の線形リストでやれば絶対にもっと早くできたのになぁと。
とにかく完成してよかったです。
ダウンロードはHPのSOFTにありますので、そちらからDLをしてください。
使い方は同封のRead Meをお読みください。
あとデバッグは十分にしたと思いますが、思わぬバグがあると思います。
(おそらくすぐに^^;)
何かございましたらレスをつけていただくか、
HPのMAILからメールで報告していただけると嬉しいです。
感想を書いていただけるだけでも幸せになれますので、よろしくお願いします。ww
509ポイント を手に入れた。
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(74,907ポイント)
Date: 2008/12/02(火) 09:04
No:24886
|
|
Title: Re:自作アプリ公開
|
|
> visual C++ぐらい使いやすいエディタないですかね。。
> タグをツールバーで選択できるとか・・・。
Visual StudioでもHTMLを編集できますよ。
> 皆さんはどのようなのをお使いなのでしょうか^^;
私はもっぱらCMS派です。手打ちもできますが、やはり面倒ですから。
もっとも、CMSを使っても、各ページはゴリゴリHTMLでコーディングしています。
2倍のポイントを手に入れた! 178ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(40,003ポイント)
Date: 2008/12/02(火) 10:15
No:24887
|
|
Title: Re:自作アプリ公開
|
|
# ページデザインはテンプレートを使用したのですね。
私のところのホームページではPHPを使用していますが、表示にはHTML+CSSで行っています。
ソフトの方はもう少し発展させて、グリッド移動とか、現在のシーンをキャプチャして保存とか、
画像の現在位置を表示などを追加すれば、もっと使いやすいかもしれませんね。
こういう手のプログラムは、メニューとかを並べるのに重宝しそうです。
ある程度機能のあるエディタなら、色づけしてくれるので、
後は自分の使いやすいものを選んだほうが良いですね。
少々古いですが へてむるクリエイタ〜 をオススメします。
260ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(39,622ポイント)
Date: 2008/12/02(火) 13:17
No:24900
|
|
Title: Re:自作アプリ公開
|
|
>雷さん
一応フリーのを使ってみたのですが・・・
タグを忘れているせいであまりうまく使いこなせませんでした^^;
エディタ作ってみようかな・・・。いや、面倒かつ詰まってしまいそうなのでやめますw
>たかぎさん
>Visual StudioでもHTMLを編集できますよ。
これは知りませんでした。。今日時間できたら早速使ってみます!
こりだすとキリないですよね・・・。
>御津凪さん
># ページデザインはテンプレートを使用したのですね。
楽がしたかったんです・・・w
すべてを作ろうと思ったらタグの復習からやらなければいけなかったので^^;
例がついててある程度楽できました。
>ソフトの方はもう少し発展させて、グリッド移動とか、現在のシーンをキャプチャして保存とか、
>画像の現在位置を表示などを追加すれば、もっと使いやすいかもしれませんね。
やはりそうですよね。。候補には挙げていたのですが、
機能が多くなると
・キーで対応
・メニューを作る
のどちらかなんですが、なんだかキーが多くなると、
何回も説明読む羽目になってしまいそうな気がして。。
バージョンを上げるときは是非メニューウィンドウを作っていき、
機能を増やしたいと思います。
>少々古いですが へてむるクリエイタ〜 をオススメします。
早速試してみます。
192ポイント を手に入れた。
|
|
|
|
|
Name: 藍 ..初心者(7,468ポイント)
Date: 2008/12/02(火) 14:59
No:24913
|
|
Title: Re:自作アプリ公開
|
|
kazuoniさんこんなツールを作っていただき。本当にありがとうございます。m(_ _)m
ちょうど弾幕作りをしてまして、すごい便利です!画像の座標が出てくれるのがすごいありがたいです。
これを使えば龍神録の文字弾幕も作れそうですねぇ
本当に感謝です!m(_ _)m
82ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..プログラマー(39,325ポイント)
Date: 2008/12/02(火) 16:05
No:24923
|
|
Title: Re:自作アプリ公開
|
|
私も雷さんと一緒でタグ打ち派です。
使ってるソフトはホームページビルダー7で、外観を軽く作って細かい部分はメモ帳で編集してました。
なので とっても軽いメモ帳を愛用してます。
タグ打ちといっても、綴りを覚えてないのは大抵コピペなので
> タグをツールバーで選択できるとか・・・。
こういう機能欲しいですよね〜。この掲示板についてる「簡単タグ入力」機能もかなり便利です。
他のコンテンツも出来上がるの楽しみにしてます♪
133ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(39,801ポイント)
Date: 2008/12/02(火) 16:14
No:24924
|
|
Title: Re:自作アプリ公開
|
|
>藍さん
感謝は全く想定外でしたw
もう少し機能を増やしていこうかと思っています。
不定期UPになりますが^^;
>管理人さん
制作お疲れました^^;
ちょっといろいろ知らないエディタが出てきたので、
とりあえず全部試してみますw
>メールは忍者メールフォーム使ってるんですねw
すべて忍者さんから借りています。
とても使い勝手がよいです。(広告は仕方ないですね。。)
CGI・・・懐かしい。またトライしてみようか・・・。
御津凪さん、藍さん、管理人さんDLしていただきありがとうございました^^
179ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(39,944ポイント)
Date: 2008/12/02(火) 16:27
No:24926
|
|
Title: Re:自作アプリ公開
|
|
>arrayさん
>私も雷さんと一緒でタグ打ち派です。
自分も見よう見まねのタグ打ちで頑張りましたが・・・
複雑になってくると、字下げが大変になるのかなーっと。。
>他のコンテンツも出来上がるの楽しみにしてます♪
ガンガンUPしていきたいですが、不定期にがんばります。
ありがとうございました^^
143ポイント を手に入れた。
|
|
|
|
Name: Haru ..上級者(20,572ポイント)
Date: 2008/12/02(火) 10:33
No:24888
|
|
Title: VC++2008
|
|
以前Cで作った住所録のプログラムをVC++で
ダイアログベースで作成を行っています。
(まだ、理解がたりないので質問文がおかしかったらすみません)
そこで、質問なのですが、、
どのようにすれば良いのか現在検討も付かない状況です。
もし、よろしければ、参考になる参考書、
または、サイトのURLなどがあれば教えていただけますか?
139ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(33,683ポイント)
Date: 2008/12/02(火) 10:46
No:24889
|
|
Title: Re:VC++2008
|
|
上流工程である住所録の全体設計から出来ないのか、下流工程でダイアログベースでのプログラミングがわからない、もしくはデータベース制御のプログラミングが出来ないのどちらですか?
データベースを単純にテキストファイルで済ませてしまうのか、SQLにするのか、Accessにするのかでもぜんぜん違いますけど(^^;
89ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(20,678ポイント)
Date: 2008/12/02(火) 10:53
No:24890
|
|
Title: Re:VC++2008
|
|
今の時点でMistさんに聞かれていることが理解できていなかったので・・・
調べてみましたが、恐らく
>>下流工程でダイアログベースでのプログラミングがわからない
に当てはまると、思います。
まずは、テキストファイルで済ませてしまおうと思います。。
いつもありがとうございますm(_ _)m
106ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(129,087ポイント)
Date: 2008/12/02(火) 10:56
No:24891
|
|
Title: Re:VC++2008
|
|
ダイアログベースという事はMFCを使用しているのでしょうか?(いや、そうとも限らないかな?(^_^;))
29ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(20,679ポイント)
Date: 2008/12/02(火) 10:58
No:24892
|
|
Title: Re:VC++2008
|
|
>バグさん
>ダイアログベースという事はMFCを使用しているのでしょうか?
使用していません!
1ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(20,737ポイント)
Date: 2008/12/02(火) 14:29
No:24903
|
|
Title: Re:VC++2008
|
|
やはり私の言い方がおかしかったのかもしれません。
アプリケーションの作成です。
以前C言語で作成した、プログラムをアプリケーション化したい。
と、言うことになると思います。(また、変な文章になってたらすいません)
58ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(129,155ポイント)
Date: 2008/12/02(火) 14:49
No:24907
|
|
Title: Re:VC++2008
|
|
ようするに、イベントドリブン形式のWindowsプログラミングがよく分からないという意味でしょうか?
47ポイント を落としてしまった。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(54,788ポイント)
Date: 2008/12/02(火) 14:56
No:24912
|
|
Title: Re:VC++2008
|
|
時代的に、WindowsSDKを直接使ってウインドウプログラムを組まないので、参考文献が見つかりにくいですね。
C++ならMFC、他言語使用可能なら、VBかC#を使うでしょう。(私はC#を使います)
猫でもわかるプログラミング、Windows SDK編第13章に情報がありますが、かなり昔のやり方ですし
また、ダイアログベースで説明していないので、わかりづらいと思います。
一応ダイアログベースの雛型のプログラムを添付しましたので、よろしければ参考にしてください。
2倍のポイントを手に入れた! 442ポイント を手に入れた。
|
|
|
|
Name: 初心者 ..上級者(19,114ポイント)
Date: 2008/12/01(月) 10:15
No:24818
|
|
Title: プログラム
|
|
例えば
G01X100Y100
X200
Y300
G02
とすると最初の行はG01でX=100Y=100
次の行はG01でX=200,Y=100
最後の行はX=200Y=300のように
@Gは次のGがあるまでその値を引き継ぎ
AXやYは記入がないならば前の値を引き継ぐという風にしたいのですが
FILE *fp;
char *str,buf[1000];
char subbuf[100],*s1;
char buf2[100],*s2;
char buf3[100],*s3;
char buf4[100],*s4;
static double bx=0;
static double by=0;
if ((fp = fopen("test.txt", "r")) == NULL) {
printf("ファイルが開けません\n");
return EXIT_SUCCESS;
}
while (fgets(buf, 1000, fp) != NULL) {
str=buf;
while((*str!='\0'){
if(*str!='\0' && *str=='G'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s2=buf2;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0'&&(isdigit(*str) || *str=='-' || *str=='.'))
*s2++=*str++;
*s2='\0';
}
if(*str!='\0' && *str=='X'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s3=buf3;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.')) *s3++=*str++;
*s3='\0';
}
if(*str!='\0' && *str=='Y'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s4=buf4;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) |*str=='||*str=='.')) *s4++=*str++;
*s4='\0';
}
CDC *v;
v=GetDC();
if((int)atof(buf2)==92){
MoveTo((int)atof(buf3),(int)atof(buf4));
bx=(int)atof(buf3);
by=(int)atof(buf4);
ReleaseDC(v);
}
else if((int)atof(buf2)==01){
MoveTo((int)bx,(int)by);
LineTo((int)atof(buf3),(int)atof(buf4));
bx=(int)atof(buf3);
by=(int)atof(buf4);
ReleaseDC(v);
}
else
str++;
}
}
fclose(fp);
return 0;
}
が現在のプログラムです。@の方は
{
FILE *fp;
char *str,buf[1000];
char subbuf[100],*s1;
char buf2[100],*s2;
char buf3[100],*s3;
char buf4[100],*s4;
if ((fp = fopen("test.txt", "r")) == NULL) {
printf("ファイルが開けません\n");
return EXIT_SUCCESS;
}
while (fgets(buf, 1000, fp) != NULL) {
str=buf;
while((*str!='\0'){
if(*str!='\0' && *str=='G'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s2=buf2;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0'&&(isdigit(*str) || *str=='-' || *str=='.'))
*s2++=*str++;
*s2='\0';
}
if(*str!='\0' && *str=='X'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s3=buf3;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.')) *s3++=*str++;
*s3='\0';
}
if(*str!='\0' && *str=='Y'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s4=buf4;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) |*str=='||*str=='.')) *s4++=*str++;
*s4='\0';
printf("G[%f]X[%f]Y[%f]",atof(buf2),atof(buf3),atof(buf4));
}
else
str++;
}
}
fclose(fp);
return 0;
}
で試してみるとちゃんと
G01X100Y100
X200Y100と
G02X300Y300すると
G01X100Y100
G01X200Y100
G02X300Y300
となります。図形作成プログラムの所でミスをしているのでしょうか?
Aはやり方も思いつきません・・
教えてください
1,348ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(128,379ポイント)
Date: 2008/12/01(月) 10:32
No:24820
|
|
Title: Re:プログラム
|
|
仕様に関しての質問なのですが…
1行分のデータ文字列が、1つのコマンドという認識でいいですか?(つまり、2行以上にまたがってのコマンドというのは考えなくていいんでしょうか?)
50ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(128,435ポイント)
Date: 2008/12/01(月) 10:41
No:24823
|
|
Title: Re:プログラム
|
|
メンバ変数かグローバル変数を追加して、その変数に読み込んだ値を保持しておき、値が無い場合はその値を更新せずに、そのまま使用すればいいのだけなのではないでしょうか?
56ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(19,236ポイント)
Date: 2008/12/01(月) 10:53
No:24824
|
|
Title: Re:プログラム
|
|
今Gの値Xの値Yの値はbuf2,buf3,buf4で格納?されてるとおもうのですが、このことでしょうか?
後書き忘れも少しあり
G01X100Y100
X200Y100と
M90
G02X300Y300
のように3行目にはGとXとYの値を取り出すこのプログラムには不必要な文字列もあります。
109ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(128,510ポイント)
Date: 2008/12/01(月) 11:03
No:24826
|
|
Title: Re:プログラム
|
|
そういうことならば、G、X、Yの値を格納する専用の変数を用意しては如何でしょうか?
ちなみに、ローカル変数、グローバル変数、メンバ変数の違いは分かっていますか?
75ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(19,816ポイント)
Date: 2008/12/01(月) 11:15
No:24828
|
|
Title: Re:プログラム
|
|
わかってないので調べてわからなかったらまたご質問します。
ありがとうございました。
30ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(11,698ポイント)
Date: 2008/12/01(月) 11:53
No:24831
|
|
Title: Re:プログラム
|
|
> G01X100Y100
> X200Y100と
> M90
> G02X300Y300
> のように3行目にはGとXとYの値を取り出すこのプログラムには不必要な文字列もあります。
M90は捨てていいのでしょうか?
捨ててはいけないなら設計段階から、どうするのか考えておいた方がいいのですが・・・
これが、NCコードなら、他にも先頭1文字目に来る文字があると思いますが、最終的にはどこまで
考えておられるのでしょうか?
74ポイント を落としてしまった。
|
|
|
|
|
Name: 初心者 ..上級者(19,834ポイント)
Date: 2008/12/01(月) 13:00
No:24833
|
|
Title: Re:プログラム
|
|
捨てていいと思います。他にも先頭一文字目にくる文字もありますがあくまでとりだすのはGとXとYだけですので
それ以外は切り捨てかな。
18ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(19,964ポイント)
Date: 2008/12/01(月) 13:11
No:24834
|
|
Title: Re:プログラム
|
|
まずGがない(省略されている)のは
if(*str!='\0' && *str !=G && (*str!=='X'||*str!=='Y')){
で書き出しで大丈夫だと思いますが
今使っているローカル関数のbuf2,buf3,bu4でG、X,Yの値を格納していますが
これをグローバル関数に直し、
ここからがいまいちよくわからないんです。
130ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(12,079ポイント)
Date: 2008/12/01(月) 13:57
No:24835
|
|
Title: Re:プログラム
|
|
字下げをして、エラーをでなくしました。
なるべく、元のプログラムのままにしました。
で、今の段階でグローバル変数の必要はないですが、これから何します?
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
char *str,buf[1000];
char subbuf[100],*s1;
char buf2[100],*s2;
char buf3[100],*s3;
char buf4[100],*s4;
if ((fp = fopen("test1.txt", "r")) == NULL) {
printf("ファイルが開けません\n");
return 1;
}
while (fgets(buf, 1000, fp) != NULL) {
str=buf;
while(*str!='\0'){
if(*str!='\0' && *str=='G'){
str++;
if(*str!='\0' && (isdigit(*str) || *str=='-' || *str=='.'))
s2=buf2;
if(*str!='\0' && (isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0'&&(isdigit(*str) || *str=='-' || *str=='.'))
*s2++=*str++;
*s2='\0';
}
if(*str!='\0' && *str=='X'){
str++;
if(*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s3=buf3;
if(*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
*s3++=*str++;
*s3='\0';
}
if(*str!='\0' && *str=='Y'){
str++;
if(*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s4=buf4;
if(*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) || *str=='-' ||*str=='.'))
*s4++=*str++;
*s4='\0';
}
else
str++;
}
printf("G[%f]X[%f]Y[%f]\n",atof(buf2),atof(buf3),atof(buf4));
}
fclose(fp);
return 0;
}
381ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(21,007ポイント)
Date: 2008/12/01(月) 14:15
No:24836
|
|
Title: Re:プログラム
|
|
{
FILE *fp;
char *str,buf[1000];
char subbuf[100],*s1;
char buf2[100],*s2;
char buf3[100],*s3;
char buf4[100],*s4;
if ((fp = fopen("test.txt", "r")) == NULL) {
printf("ファイルが開けません\n");
return EXIT_SUCCESS;
}
while (fgets(buf, 1000, fp) != NULL) {
str=buf;
while((*str!='\0'){
if(*str!='\0' && *str=='G'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s2=buf2;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0'&&(isdigit(*str) || *str=='-' || *str=='.'))
*s2++=*str++;
*s2='\0';
}
if(*str!='\0' && *str=='X'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s3=buf3;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.')) *s3++=*str++;
*s3='\0';
}
if(*str!='\0' && *str=='Y'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s4=buf4;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) |*str=='||*str=='.')) *s4++=*str++;
*s4='\0';
}
CDC *v;
v=GetDC();
if(atof(buf2)==92){
MoveTo(atof(buf3),atof(buf4));
ReleaseDC(v);
}
else if(atof(buf)==01){
MoveTo(0,0);
LineTo(atof(buf3),atof(buf4));
ReleaseDC(v);
}
else
str++;
}
}
fclose(fp);
return 0;
}
で図形を書くのです。2個目のプログラムはあくまで
G01X100Y100
X200Y100
のファイルだとすると2行目のGはちゃんと01になっていた
G01X100Y100
X200Y200
G02X400Y500
X0Y0
の場合は4行目のGは02になっていた。
それならば
G01X100Y100
X200Y100
の例で図形を書くと(0,0)から(100,100)までの直線と(100,100)から(200,100)までの直線が
描かれるはずが最初の直線だけでちゃんとかけないわけです。
1,043ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(21,094ポイント)
Date: 2008/12/01(月) 14:21
No:24837
|
|
Title: Re:プログラム
|
|
さらに
G01X100Y100
X200
というファイルのときに(0,0)から(100,100)までの直線と
(100,100)から(200,100)までの直線を書きたいわけです。
要はGの値が省略されていて書かれていない場合(先頭にXorYがある場合)前のGの値を使う。
XとYの値も同様で、例だとYの値が記述されていないので前回のY100を使う
そんなプログラムです。
87ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(12,131ポイント)
Date: 2008/12/01(月) 14:30
No:24838
|
|
Title: Re:プログラム
|
|
私が添付したファイルを実行してみました?
省略されていても、前の値が出ているはずですが・・・
グラフィックを描くのは、MFCを使ったことがないのでしらないけど・・・
52ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(21,163ポイント)
Date: 2008/12/01(月) 14:35
No:24839
|
|
Title: Re:プログラム
|
|
その通りです。最初の質問文でも書いてありますが、前の値が出ているんですね。
仕分けの方は大丈夫なんですがいざ図形を書こうとするとちゃんとかけないのです。
69ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(12,140ポイント)
Date: 2008/12/01(月) 14:41
No:24840
|
|
Title: Re:プログラム
|
|
グラフを描くためのプログラムを入れている部分を、私のプログラムの
printf("G[%f]X[%f]Y[%f]\n",atof(buf2),atof(buf3),atof(buf4)); がある場所に
入れてみませんか?
9ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(33,361ポイント)
Date: 2008/12/01(月) 14:41
No:24841
|
|
Title: Re:プログラム
|
|
今回の問題は、値の引き継ぎ云々よりも線描画のほうだと思うけど
else if(atof(buf)==01){
MoveTo(0,0);
LineTo(atof(buf3),atof(buf4));
ReleaseDC(v);
}
これだと原点からの直線しか引けないでしょ。
G01を引き継いだ場合は原点移動しない。
という条件を追加しないといつまでたっても思うようにはならないと思うよ
#前回の指摘は思いっきり無視されているけどatof(buf)で本当にあってるの?
233ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(12,484ポイント)
Date: 2008/12/01(月) 14:45
No:24842
|
|
Title: Re:プログラム
|
|
無駄な部分が多く、プログラムがわかりにくいので書き直してみました。
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
char* makeNum(char *str,float *n)
{
char work[100],*buf;
buf=work;
while(*str!='\0'&&(isdigit(*str) || *str=='-' || *str=='.'))
*buf++=*str++;
*buf='\0';
*n=atof(work);
return str;
}
int main(void)
{
FILE *fp;
char *str,buf[1000];
struct {
float g;
float x;
float y;
}ncData;
if ((fp = fopen("test1.txt", "r")) == NULL) {
printf("ファイルが開けません\n");
return 1;
}
while (fgets(buf, 1000, fp) != NULL) {
str=buf;
while(*str!='\0'){
switch(*str){
case 'G':
str=makeNum(++str,&ncData.g);
break;
case 'X':
str=makeNum(++str,&ncData.x);
break;
case 'Y':
str=makeNum(++str,&ncData.y);
break;
default:
str++;
}
}
printf("G[%f]X[%f]Y[%f]\n",ncData.g,ncData.x,ncData.y);
}
fclose(fp);
return 0;
}
344ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(21,224ポイント)
Date: 2008/12/01(月) 14:51
No:24843
|
|
Title: Re:プログラム
|
|
>Mistさん
変更するの忘れてました。続けて直線を書けるようになっています。
本文の方修正しておきます。申し訳ありません。
※前回の指摘とはどれのことです?
61ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(33,437ポイント)
Date: 2008/12/01(月) 15:04
No:24844
|
|
Title: Re:プログラム
|
|
else
str++;
一番最後のこの部分について2個質問。
1.str++;している理由は?
2.ReleaseDCしていないけど問題ないの?
76ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(21,328ポイント)
Date: 2008/12/01(月) 15:06
No:24845
|
|
Title: Re:プログラム
|
|
あー前回の質問ですね。本当はちゃんとなってるんですが質問するときは
開発用のPCからコピペできないので手書きか前回の質問を部分部分コピペしてやってますので
気づかず載せてしまうこともあります。申し訳ない。
104ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(21,483ポイント)
Date: 2008/12/01(月) 15:26
No:24846
|
|
Title: Re:プログラム
|
|
1,これは以前誰かのスレでみたのをぱくっただkですが
これがないとエラーはでませんが正常に動きません
2,図形描写じゃないのでいらないとおもいますが・・
例えばですね
G01X100Y100
X200Y100
X300
などを
G01X100Y100
G01200Y100
G01X300Y100としてやるとちゃんと書けるんですよ。
ですので値が無い場合前の文字の値をそのまま入れるという機能を加える
以外は動きます
155ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(12,622ポイント)
Date: 2008/12/01(月) 16:09
No:24847
|
|
Title: Re:プログラム
|
|
データが
G01X100Y100
X200
Y300
G02
の場合、どんな図形が描かれると正解なんですか?
1 原点から(100,100)まで線を引く
2 原点から(200,100)まで線を引く
3 原点から(200,300)まで線を引く
4 (200,300)に表示開始位置を移動する。
ってことでしょうか?
ところで、atof(buf2)==92 ってコードは02の間違い?
そいえば8進数ってのが指摘されてましたね。
138ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(33,560ポイント)
Date: 2008/12/01(月) 16:12
No:24848
|
|
Title: Re:プログラム
|
|
> 気づかず載せてしまうこともあります。申し訳ない。
あなたの事情は知ったこっちゃないですが、正しい情報を提供してもらわないと正しい回答は出せませんのであしからず。
ここに載せているソースでは正しくても、実際に動かしているソースで間違っている可能性だってあるわけで。
ソース見る限り間違いないように思うけど。
ステップ実行してみて、X200Y100の読み取り後のbuf2とbuf3とbuf4を確認してみるのがいいと思います。
123ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(21,701ポイント)
Date: 2008/12/01(月) 16:18
No:24849
|
|
Title: Re:プログラム
|
|
まさにその図形ですね。4だけ少し、02はあくまでG01がどこまで省略されているのかをわかりやすくするためであって
本当は円弧書くときに使います。ですので1~3まで書ければ大丈夫です。
>>ところで、atof(buf2)==92 ってコードは02の間違い?
そいえば8進数ってのが指摘されてましたね。
すいません。余計なことするからややこしくなってしまいますね。
G01X100Y100
X200
Y300
G02
は
G01X100Y100
X200
Y300
G92X0Y0とでも考えていただければいいです。
218ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(12,683ポイント)
Date: 2008/12/01(月) 16:25
No:24850
|
|
Title: Re:プログラム
|
|
Vc++.net2003をインストールして、シングルドキュメントで動かしてみました。
問題なく、原点から線が3本引かれました。
61ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(13,805ポイント)
Date: 2008/12/01(月) 16:49
No:24853
|
|
Title: Re:プログラム
|
|
VC++は先週から勉強し始めましたので、printfをどうすればよいのかわかりませんので、
みっともないプログラムですが、ご容赦ください。
ほとんど、前に貼り付けたプログラムです。
こちら様のプログラムをベースに流用させていただきましたのであしからず。
http://mail2.nara-edu.ac.jp/~asait/visual_cpp/intro_cpp.htm#section3
char* makeNum(char *str,double *n)
{
char work[100],*buf;
buf=work;
while(*str!='\0'&&(isdigit(*str) || *str=='-' || *str=='.'))
*buf++=*str++;
*buf='\0';
*n=atof(work);
return str;
}
void CVTestView::OnDraw(CDC* pDC)
{
CVTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: この場所にネイティブ データ用の描画コードを追加します。
CRect r;
GetClientRect(r);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(1000, 600); // 窓の論理サイズの指定
pDC->SetViewportExt(r.right, -r.bottom); //ビューポートの指定
pDC->SetViewportOrg(r.right/2, r.bottom/2); //原点の指定
CPen p(PS_SOLID, 1, RGB(0, 255, 0));
CPen* oldp=pDC->SelectObject(&p);
pDC->MoveTo(-500, 0); pDC->LineTo(500, 0);
pDC->MoveTo(0,300); pDC->LineTo(0, -300);
FILE *fp;
char *str,buf[1000];
struct {
double g;
double x;
double y;
}ncData;
if ((fp = fopen("test1.txt", "r")) == NULL) {
printf("ファイルが開けません\n");
return ;
}
while (fgets(buf, 1000, fp) != NULL) {
str=buf;
while(*str!='\0'){
switch(*str){
case 'G':
str=makeNum(++str,&ncData.g);
break;
case 'X':
str=makeNum(++str,&ncData.x);
break;
case 'Y':
str=makeNum(++str,&ncData.y);
break;
default:
str++;
}
}
if(ncData.g==2.0){
pDC->MoveTo((int)ncData.x,(int)ncData.y);
}
else if(ncData.g==1.0){
pDC->MoveTo(0,0);
pDC->LineTo((int)ncData.x,(int)ncData.y);
}
}
fclose(fp);
}
型変換の警告がでないように若干変更しました。
1,122ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(13,929ポイント)
Date: 2008/12/01(月) 17:09
No:24855
|
|
Title: Re:プログラム
|
|
あらためて読み直すと
>G01X100Y100
>X200Y100
>の例で図形を書くと(0,0)から(100,100)までの直線と(100,100)から(200,100)までの直線が
>描かれるはずが最初の直線だけでちゃんとかけないわけです。
って描いてありますね。ってことは最初のG01は原点から引いて、次からは最終点から引くのじゃないの?
まっ!いいか。
124ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(21,794ポイント)
Date: 2008/12/01(月) 18:26
No:24857
|
|
Title: Re:プログラム
|
|
else
str++;
の位置が悪かったみたいですね。
人のぱくってろくに理解もせずに使うからこうなるんですね。
以後気をつけます
50ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(129,105ポイント)
Date: 2008/12/02(火) 11:24
No:24894
|
|
Title: Re:プログラム
|
|
>>ま〜くさん
それ、私も気になっていたんですよ。
描画内容を保持しておかないと、後々問題が出そうな感じですよね。
18ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(21,807ポイント)
Date: 2008/12/02(火) 11:34
No:24895
|
|
Title: Re:プログラム
|
|
確かにOKWAVEの方でも聞いていますよ。私の場合回答がないor難しい回答だった場合聞いています。
OKWAVEの方では禁止事項にマルチポストが入ってなかった為大丈夫だとココの規約に書いてあったと思いますよ
リンク先書いてないのは問題ではありますが、向こうの掲示板では特にルールなど指定されていませんので。
まずこちらで聞いて上記のような理由場合のみ質問します。C言語の方はたくさんの人が学んでおられますが、VC++の特にMFCの方では回答者が少ないです。というより限定的です。上記の理由の場合しかたないと考えますが、
NGかどうかは管理人様に聞いてからにします。管理人様見ていたら回答お願いします。
13ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(129,202ポイント)
Date: 2008/12/02(火) 11:46
No:24897
|
|
Title: Re:プログラム
|
|
ここの規約によると、マルチポスト先の掲示板との相互リンクが条件になっているようですね。
ようするに、『マルチポストしています』という事を質問と一緒に書き込みしないといけないという訳ですか…
私も規約を熟読してなかったので、初めて知りましたが(汗)、どちらの回答者にも失礼にならない最善の方法かと思います。
97ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(21,907ポイント)
Date: 2008/12/02(火) 11:57
No:24898
|
|
Title: Re:プログラム
|
|
違う掲示板で聞くとそれを見たこちらの掲示板の方が気分を害する、のは今議論されている通りわかります。
ただ、『マルチポストしています』って書いてもこちらの方はもちろん向こうの方も気分害されると思うんですけどね。私はまだ人に教えれる知識は持ち合わせていませんのでそういう気持ちはわかりませんが。
書いた方がいいなら普通に書きますがね(ルール的にということじゃなく心情的に)
100ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(40,213ポイント)
Date: 2008/12/02(火) 12:24
No:24899
|
|
Title: Re:プログラム
|
|
> ただ、『マルチポストしています』って書いてもこちらの方はもちろん向こうの方も気分害されると思うんですけどね。
マルチポストの理由をきちんと書けばそれ限りではないと思います。
確かにMFC使用者はここには少ない(私も使ったことが無い)です。
マルチポストした旨の発言も、
「回答が難しいのでもっと他の方の意見を知りたいのでマルチポストします」
みたいな感じの文章を添えてリンクを張れば良いのではないかと。
回答の途中で何の断りも無くマルチポストするのは規約に抵触しますし。
ここの掲示板は他の質問系サイトに比べて(いい意味で)局地的ですし、
質問に対して十分な回答が得られない場合がありますので、
上記のように一言添えて行えば問題は無いはずだと私は思います。
210ポイント を手に入れた。
|
|
|
|
Name: Libra ..かけだし(1,041ポイント)
Date: 2008/11/30(日) 21:20
No:24805
|
|
Title: データ入出力について
|
|
はじめまして。Libraと申します。
大学のサークルでC言語を後輩に教えているのですが、ファイル入出力の分野でcsvファイルの読み込みのソースを11章「エクセルを使って敵の出現データを作ってみよう」を参考に、C言語でファイル入出力を行いました。その際に疑問点が出たので質問します。
1)11章のload_story()関数内、int input[64]はどの様に使われているのか?は必要あるのか
2)11章のload_story()関数内、continue文上の『i=-1;//カウンタを最初に戻して』の部分は使われているのか?
1)に関して:int input[64]をchar inputc[64]に変更しても機能したのですが、何かしらinput[]を使わないと機能として不具合が生じる条件等があれば教えていただきたいです。
2)に関して:continue文の上のi=-1を抜いても普通に動きました・・・。continue文の仕様だとi=-1が無いとダメなハズなのですよね?上と同様に不具合が生じる条件等があれば教えていただきたいです。
ソースは以下の通りです。
#include<stdio.h>
#include<stdlib.h>
//構造体宣言(2次元配列を渡すため、変数charadataを構造体に)-----------
typedef struct charadata{
int charadata[32][32];
}Charadata_t;
//プロトタイプ宣言===================================================
void LoadData(Charadata_t*chara);//データのロード
void DisplayData(Charadata_t*chara);//ロードしたデータの表示
//main関数===========================================================
int main(void){
int i,j;
Charadata_t chara;
LoadData(&chara);
DisplayData(&chara);
return 0;
}
//ロードデータ関数----------------------------------------------------
void LoadData(Charadata_t *chara){
FILE *fp;
int i=0,j=0,num;
char inputc[64];
fp=fopen("data/data.csv","r");//ファイルを開く
if(fp==NULL){
printf("ファイルのオープンに失敗しました。");
exit(1);
}
while(1){
for(num=0;num<64;num++){
inputc[num]=fgetc(fp);//1文字取得する
if(inputc[num]=='/'){//スラッシュがあれば
while(fgetc(fp)!='\n');//改行までループ
continue;
}
if(inputc[num]==',' || inputc[num]=='\n'){//カンマか改行なら
inputc[num]='\0';//そこまでを文字列とし
break;
}
if(inputc[num]==EOF){//ファイルの終わりなら
goto EXFILE;//終了
}
}
chara->charadata[i][j]=atoi(inputc);//読みとった文字を数字に変換
j++;
if(j==32){
j=0;
i++;
}
}
EXFILE:
fclose(fp);
}
//データ表示関数-----------------------------------------------
void DisplayData(Charadata_t*chara){
int i,j;
for(i=0;i<32;i++){
for(j=0;j<32;j++){
if(chara->charadata[i][j]==0){
printf("□");
}
else if(chara->charadata[i][j]==1){
printf("■");
}
//読み込むデータに二桁の数字を入れた場合も使用してみるため
else if(chara->charadata[i][j]==10){
printf("●");
}
}
printf("\n");
}
}
また、読み込むファイルを添付したファイルも添付します。
コマンドライン上で32×32の絵が表示されます。
1,041ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(280,988ポイント)
Date: 2008/11/30(日) 22:22
No:24807
|
|
Title: Re:データ入出力について
|
|
>1)に関して
まず第一に FileRead_getc() / fgetc()の戻り値は int型です。
その戻り値を charで受けると、EOFの判定が正しくできないことがあります。
その為、文字列として格納するために inputcに、EOFや文字の判定の為の変数として inputに格納しているのでしょう。
とはいえ、inputに関しては配列である必要はなく、ふつうの int型の変数でいいとは思います。
>2)に関して
一見それで動いているように見えますが、結果としてはおかしな挙動になります。
i=-1が無い場合、iの値はそのままで continueされ、forの中で ++iされます。
ここで csvの次の行の先頭の文字を調べる処理に入ることになりますが、
ここで iの値が 0になっていないと inputcは前の行の文字も引き継いだ状態に
なってしまいます。
今回のコードですと、
・ 最初の文字を取得する -> inputc[0]に '/'が代入される
・ 1行空読みして continue
・ forの先頭で num++されて、numは 1になる
・ 次の文字を取得する -> inputc[1]に 次の文字が格納される。
さて、ここまで来たときに inputc[0]には前の行の '/'が残ったままになっています。
・ そのまま続いて文字を読み、どこかでカンマか改行が来たので breakして
文字を数字に変換する。
-> inputcの先頭が '/'なので、変換失敗!
これはマズイですよね?
試しに csvの2行目のデータ('/'のある次の行)の先頭のデータを 0以外の
数値にしてみて下さい。
648ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(902,571ポイント)
Date: 2008/12/01(月) 04:05
No:24811
|
|
Title: Re:データ入出力について
|
|
仰る通り、inputが配列である必要ないですね(汗
それにしても我ながら何と言う意味のわかりにくい変数名・・。
どっちかというとinputcの方が一文字だけ入りそうな感じしますね・・。
とりあえず
int input;
にしておいて
for(i=0; i<64; i++){
inputc[i] = input = FileRead_getc(fp);//1文字取得する
if(input == '/'){//スラッシュがあれば
while(FileRead_getc(fp)!='\n');//改行までループ
i = -1;//カウンタを最初に戻して
continue;
}
if(input == ',' || input == '\n'){//カンマか改行なら
inputc[i] = '\0';//そこまでを文字列とし
break;
}
if(input == EOF){//ファイルの終わりなら
goto EXFILE;//終了
}
}
でいいですね。
あ〜なんかあちこち修正したいところだらけ何ですが、
こういうのって一回公開すると変更できないのが辛いですね・・。
全ての章の内容変えないといけなくなるし・・。
今まで読みなれた人にも迷惑かけてしまうし、
支館にも影響与えるでしょうし・・orz
2倍のポイントを手に入れた! 782ポイント を手に入れた。
|
|
|
|
|
Name: Libra ..かけだし(1,427ポイント)
Date: 2008/12/02(火) 02:36
No:24883
| 解決!
|
Title: Re:データ入出力について
|
|
お二方共、的確で素早い解答ありがとうございます。
<Justy様
2)に関してですが、データが0の時『□』を、データが1の時『■』を表示するようにしていたので、たまたま上手くいってしまっていたようです。指摘の通り、『/』の次の行に0以外のデータを入れると見事に失敗しました。
<Dixq (管理人)様
館ページを参考に、シューティングゲームを作成しているのですが、csvファイルを知る前は全て敵のデータをプログラム内に書いていました。そのため、データ入力だけで3000行以上書いていました(汗)。とても参考になってます。
現在、シューティングゲームを作成しており、数ヶ月後にはステージ1くらいは完成出来そうなので、その時またご指導等よろしくお願いします。
2倍のポイントを手に入れた! 386ポイント を手に入れた。
|
|
|
|
Name: バグ [URL] ..ハッカー(126,953ポイント)
Date: 2008/11/28(金) 11:08
No:24676
|
|
Title: DXライブラリを使用して、テトリスを作ってみました
|
|
そういえば、DXライブラリを使用して何かを作った事ないなぁ…と思いまして、勉強を兼ねてテトリスを作ってみました。
見た目とか、スコアなんかの表示部分は手抜きもいいところですが、とりあえず遊べますんで、よかったら遊んでみてください。
プログラムソースも添付しておきますので、こちらも興味がある方はどうぞ♪
153ポイント を手に入れた。
|
|
|
|
Name: kazuoni ..プログラマー(38,089ポイント)
Date: 2008/11/28(金) 14:43
No:24700
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
・・・今までDXライブラリ使ったことなかったんですかっww^^;
シンプルイズザベストだと思います^^
DLさせてもらいました。
お疲れ様でした。
「よし、コード今後の参考にっ!!」
・・・C++まだ手をつけていませんw
70ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(127,485ポイント)
Date: 2008/11/28(金) 15:04
No:24703
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
DL有難う御座います。
ソースコードもプロジェクト形式ではなく、本当にソースだけなので、見づらいかもしれませんがご了承ください(苦笑)
DXライブラリを全く使用したことがないという訳ではないのですが、本格的に1つの作品にしてみたのは始めてですね。
C++と言っても構える必要はないと思いますよ。STLはほとんど(CShuffleクラスに少し使ってますが…)使っていませんし、クラスも構造体の延長みたいな使い方しかしてませんので(^_^;)
一応、簡単なファイル構成を書いておきますね。
CPiece … 落下してくるテトリミノに関するクラスです。ブロックの色情報や、座標なんかがここに格納されています。
CField … ゲームフィールド全般に関するクラスです。テトリミノとの衝突判定、スーパーローテーション、ライン消去処理なんかを行っています。
CEvent … ゲームの流れ全般を制御するクラスです。キー入力に応じたテトリミノの移動処理や、スコア、レベル、ウェイトなんかの計算もここで行います。
CInputkey … キー入力に関するクラスです。押されているかいないかだけではなく、今押されたキーかどうかの判定も行います。
CShuffle … 指定された範囲の重複しない乱数を生成するクラスです。次に落ちてくるテトリミノの生成に作成しています。
こんな感じで、このゲームは構成されています。
こういう風に役割を分割しておくと、デバッグの際に原因を見つけるのがかなり楽になるんですよね(^-^)
398ポイント を手に入れた。
|
|
|
|
|
Name: ouh ..かけだし(1,448ポイント)
Date: 2008/11/28(金) 22:21
No:24730
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
バグさん、多分初めまして。
遊ばせてもらいました。
ちゃんと転がしができることに感動しました。
転がせなきゃテトリ○じゃないですよね。
ぶつけて転がす、ぶつけて転がす。こうやって時間稼ぎつつ、
というのができて楽しいです。
2倍のポイントを手に入れた! 144ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(127,850ポイント)
Date: 2008/11/28(金) 22:38
No:24732
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
>>管理人さん
オリジナルルールですかぁ…。なかなか難しい要求ですね(笑)
オリジナルではありませんが、セガサターン用の『天地無用!連鎖必要』とか、アーケードゲームの『マジカルドロップ』シリーズ、携帯アプリの『キラキラ』、ファミコンの『ドクターマリオ』なんかはアイデアが秀逸なので、移植したい思いはあります(^-^)
あと、同じテトリスでも対戦に特化したシステムのスーパーファミコン版『テトリス武闘外伝』なんかは素晴らしいですよ。
>>ouhさん
こちらこそはじめまして(^-^)
いやぁ…そこに気が付くとはお目が高い!(笑)
実は私、携帯アプリのテトリスが大好きで、暇さえあれば遊んでいるんですよ。なので、あれに近い操作感を再現しようと、動きの部分は一番時間を掛けて試行錯誤したんですよね(^_^;)
まぁ、まだ納得した訳ではありませんが、そこそこ近い感じにはなったんじゃないかと思ってます。
新作に取組む前に、もうすこし完成度を上げようかな…
304ポイント を手に入れた。
|
|
|
|
|
Name: こめかみ ..プログラマー(38,341ポイント)
Date: 2008/11/29(土) 02:23
No:24742
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
テトリスと聞いてスッ飛んできました。
ぬう・・・作ってみましたとか簡単におっしゃいますが、
開発スパンはいかほどなのでしょうか。
自分もバグさんのアドバイスをもとに(忘れられてるかもしれませんが)
落ち物ゲームにトライしたりしていますが、
なかなか時間が取れなくって(泣)
隙を見てはトライしているのですが、
やはりC言語基礎がなっていないようで、ちっとも進展しないのでほとんど保留中です。
基礎勉強のための寄り道は楽しいので別にいいんですけどね。
しかしちょっと話を聞く限りバグさんの落ちゲーの体験量が半端じゃなさそうです、種類的な意味で。
初代GB版テトリスを遠い昔にやりこんだことがあるくらいじゃ、
経験不足なのかなあ。
遅くなりましたが遊ばせてもらいました。
一回プレイするだけで一、二時間消費した気がします。
わかっていたこととはいえ、パズルゲーったら時間泥棒なんだから。
でもちょっとだけ、
なかなかゲームオーバーさせてくれないゲームのせいにしたかったり。
いろんな種類のテトリスをやったことあるわけじゃないので相場がさっぱりなのですが。
スピードのレベルアップ遅くないですか?
自分がちょうどいいスピードと感じたのは多分13レベル辺りでした。
ゲームオーバーも13レベルぐらいでしたが(オイ)
再挑戦したくてもレベルアップが遅くて、気軽にリトライできないです。
初期レベルの設定とかできたらいいですね、
GBテトリスそのまんまですが。
えと、他には
左右の移動がなんかヌルヌルしてるような気がして不思議な感じがします。
もっとカクカクな動きのイメージしか持ってなかったので。
自分はゲームボーイのような古くて低スペックなのしかやってないので(貧乏でして)
知らないだけかもしれませんが、
最新のテトリス、
またはハイスペックなテトリスはミンナこうなんでしょうか。
>>転がす
転がす?
(再起動中・・・)
えーなにこれ?
こんな機能アリですか?
チートっぽくない?
やばい、自分のテトリスの常識に疑問が生じはじめました。
最新のテトリス買って来ようかなー。
561ポイント を手に入れた。
|
|
|
|
|
Name: こめかみ ..プログラマー(38,396ポイント)
Date: 2008/11/29(土) 02:37
No:24743
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
『テトリス武闘外伝』ちょっと調べてみました。
いいなあ、面白そう。
スーファミ欲しかったなぁ。 …今から買ってしまおーか。
55ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(128,284ポイント)
Date: 2008/11/29(土) 09:13
No:24745
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
>>こめかみさん
GB版テトリスとは懐かしいですね(^-^)
あれは対戦が熱かったです!
スピードの上がり方は確かに遅いですね。もう少し速くてもよかったかな?あ、でも最終レベルの15は凄いですよ(笑)
今回の開発スパンはコーディングに3〜4時間、調整に3〜4時間って感じですね。調整と称して遊んでいた時間の方が長かった気がしますが…(苦笑)
さて本題ですが…実は、テトリスにはガイドラインなる標準ルールが作られまして、最近のテトリスはそれに準拠したものが多いんですよ。
例えば、テトリミノの順番はガイドラインができるまでは基本的に完全ランダムでしたが、偏りを防ぐ為に7種類が万遍なく落ちて来るようになってます。
他には、ouhさんが『転がし』と呼ばれていた、着地後の操作不能になるまでの猶予時間もそうですし、スーパーローテーションと呼ばれる回転時に軸をずらして補正を行なう機能もそうです。
私のテトリスでは採用していませんが、次に落下するテトリミノを3つ以上表示しなければならないとか、気に入らないテトリミノを交換できるホールド機能とか…
かなり色々なルールがあるんですね。私が参考にした携帯アプリ版のテトリスは、ガイドライン準拠らしいので、ガイドライン制定前のGB版しかプレイされてなければ違和感を感じるのは仕方ないかと思います。
434ポイント を手に入れた。
|
|
|
|
|
Name: ouh ..かけだし(1,770ポイント)
Date: 2008/11/29(土) 15:38
No:24752
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
歳が知れてしまいそうであまり言いたくないのですが、
私の場合、テトリスと言えばゲームセンターにあった
懐かしいあれです。
ゲームセンターにあったテトリスはまさにバグさんの
作られたテトリスで、着地後に回転できますし、入る
はずないように見えるところに回転で入れることがで
きたりできなかったり。
ゲームセンターにあったテトリスはいわゆる「ぬるげー」
でした。スピードがMAXになってからはぶつけて転がして
時間稼ぎをし、その間にどこにどう落とすか考えながら
やっていればエンドレスに続けられるゲームでした。
私もレベル、得点ともにオール9並びというのができま
した。100円で自分がやめたくなるまで遊べてしまうの
でとても重宝していました(^^
そうなるまでにつぎ込んだ金額はかなりのものですが…
そんなわけで私は家庭用ゲーム機などで次々出てくる
どのテトリスよりバグさんのテトリスが楽しいです。
といってしまうとバグさんのテトリスをエンドレスに
プレイできたように聞こえてしまうので言っておきます
が、レベル16までしか行けませんでしたorz
322ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(128,329ポイント)
Date: 2008/11/29(土) 16:48
No:24753
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
>>ouhさん
安心してください。あのテトリスはレベル15までしか遊べません。
なぜなら、レベル16になった時点で強制的にゲームオーバーになるからです(笑)
45ポイント を手に入れた。
|
|
|
|
|
Name: ouh ..かけだし(1,776ポイント)
Date: 2008/11/29(土) 21:03
No:24760
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
あらら。じゃぁ私の勘違いです。
多分レベル15までしかいってません。
6ポイント を手に入れた。
|
|
|
|
|
Name: fumi ..ぴよぴよ(674ポイント)
Date: 2008/11/29(土) 23:31
No:24764
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
DLさせていただきました!
黙々とプレイしてLEVEL15までたどり着いた所で、思わず吹き出してしまいました(笑)
そして、どうすることもできないままGAMEOVER。orz
それにしても、短時間でちゃんと遊べるものを作ってしまうとは。。さすがの一言です。
ソースも添付してくれているようなので、参考させてもらいます♪
106ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..プログラマー(38,992ポイント)
Date: 2008/11/30(日) 04:58
No:24779
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
こんな深夜にですが遊ばせてもらいました。私もテトリスで最近遊んだのは携帯アプリで、最近のテトリスは便利な機能が付いてるんだなと感心してました。
ホールドを使い込んでた私は、ホールド使いてえーと苦難しながらプレイし、レベル5でゲームオーバーでした。
「転がし」という名前が付いてる事は知りませんでしたが、本物と違和感なく遊べました。
興味津津にプログラムソースを見ましたが、私にはプログラムが半分も読めませんでした。私もいつかその域に達した時に、解読させてもらいますφ(..;)
176ポイント を手に入れた。
|
|
|
|
|
Name: こめかみ ..プログラマー(38,686ポイント)
Date: 2008/11/30(日) 17:00
No:24799
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
GBテトリスの対戦は当時のGB人口の少なさと、
ROMが二つ必要だったこともあってほとんどやったこと無いです(泣)。
兄が通信ケーブルを持ってる神だったので、一度もやったこと無いはずは無いのですが、
だれと対戦したのかとか、対戦内容とか全く覚えてないですね。
開発スパン総計7、8時間ですか。
一日もかからないなんて・・・自分には遠い世界の話のようです。
>>テトリスのガイドライン
>偏りを防ぐ為に7種類が万遍なく落ちて来る
GBは、偏って落ちてくる印象は無いですね、発展途上のテトリスって感じです。
>他には、ouhさんが『転がし』と呼ばれていた、着地後の操作不能になるまでの猶予時間もそうですし、スーパーローテーションと呼ばれる回転時に軸をずらして補正を行なう機能もそうです。
猶予時間って言うか、多分スーパーローテーションて奴の方ですけど、
長い棒と地面で無限に猶予時間を作れますよ?
こう・・・横倒しの長い棒が地面につきそうになったら、すぐに二手、回転!
これで無限時間猶予ですが、いいんですか?
着地点がたいらじゃなきゃ出来ないのかもしれませんが。
普通に遊んでれば気付きませんし、問題ないかな。
しかし、いろんなルールがあるんですね。
遊ぶだけでもテトリス道の奥は深いです。
>>でも最終レベルの15は凄いですよ(笑)
な、何が起こるんだ(((゜д゜;)))
290ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(39,667ポイント)
Date: 2008/11/30(日) 17:36
No:24801
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
遊んでみました。
>>>でも最終レベルの15は凄いですよ(笑)
>な、何が起こるんだ(((゜д゜;)))
うわ、速っ!
…て感じですね。
やってて思ったのですが、なんとなく操作ミスしやすいなーと思うのですが。
移動間隔が短いせいか、位置がずれやすいです。
操作ミスの所為でレベル15はクリアできなかった…。
(久しぶりのキーボード操作は難しい)
でも、楽しませてもらいました。
ソースのほうは程よく見やすくていいと思います。
C++ のサンプルとしては十分かも。
186ポイント を手に入れた。
|
|
|
|
|
Name: こめかみ ..プログラマー(38,881ポイント)
Date: 2008/12/01(月) 04:43
No:24816
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
GB版テトリスの音楽っぽいものを作ってみました。
バグさんのテトリスに勝手に組み込んで遊んでしまおーかと思ったのですが、
うまくループファイル作れなかったので挫折。
でもせっかく作ったので場違いとは思いますが公開してみます。
せっかくファミトラッカーで作ったのにMIDIに変換するとファミコン音源で無くなってしまうのですね、残念。
ファミコン音源で再生したって出来のいいものではないですけどね。
195ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(129,058ポイント)
Date: 2008/12/01(月) 11:24
No:24829
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
>>fumiさん
ありがとうございます。
予想通りの反応をしていただいたようで、なによりです。
14〜15に変わった瞬間にいきなり速くなるので、驚いてくれたら嬉しいなぁ〜♪
と思いながら実装しました(笑)
>>arrayさん
すみません、ソースコードは全くコメントを入れていなかったので、見づらかったですよね(^_^;)
ホールドに関しては、私は否定派なんですよね。携帯で遊んでいても絶対に使用しないので、とりあえず今回のテトリスに関しては導入しませんでした。バージョンアップ時には導入しようかと思っています。
>>こめかみさん
音楽はバージョンアップ時に導入したいと思っていたんですよ。
私には音楽を作る才能は欠片もないものでして…使わせてもらっても良いでしょうか?
>開発スパン総計7、8時間ですか。
>一日もかからないなんて・・・自分には遠い世界の話のようです。
これに関しては、もともと落ち物パズルを作るのが好きなので、使いまわしの出来るようにクラスを作成していたのが大きいです(^_^;)
>猶予時間って言うか、多分スーパーローテーションて奴の方ですけど、長い棒と地面で無限に猶予時間を作れますよ?
>こう・・・横倒しの長い棒が地面につきそうになったら、すぐに二手、回転!
>これで無限時間猶予ですが、いいんですか?
>着地点がたいらじゃなきゃ出来ないのかもしれませんが。
>普通に遊んでれば気付きませんし、問題ないかな。
実はこれもガイドラインにありまして、インフィニティと呼ばれている機能なんですよね。
ヘビーユーザーには不評を買っていたようですが…
最近の作品には無限ではなく、有限になっているものが多いようです。
>>御津凪さん
>やってて思ったのですが、なんとなく操作ミスしやすいなーと思うのですが。
>移動間隔が短いせいか、位置がずれやすいです。
実は、これを作る直前にドコモ携帯用のテトリスも作った(バグがあり未完成です)んですが、友人に同じことを言われたので、(自分的には)相当長めにウェイトを入れておいたんですが、まだ早かったみたいですね…この辺りは私好みの調整にしかできないので、色々と意見をいただけるのは非常にありがたいです(^_^;)
548ポイント を手に入れた。
|
|
|
|
|
Name: こめかみ ..プログラマー(39,135ポイント)
Date: 2008/12/01(月) 23:59
No:24878
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
聞き苦しさを少し調整しました。
>>使わせてもらっても
本気ですかw
実は一曲きっちり作ったのは初めてなんですが。
こんなんでよければどうぞ。
でもどうせならファミコン音源で使ってもらいたいので、
何とかnsfをwavやその他のDXライブラリで使える音声ファイルに変換する方法を調べてみます。
添付したmidはDXライブラリでそのまま使えたかどうか、
ちょっと調べなきゃわかりませんが、
先述の通りうまくループファイル作れなかったので、
使えたとしても扱いづらいかもしれません。
それ以前に、ファミコン用の音情報が無理やりmidで再生されるのでお聞き苦しいかと思います。
wavやoggなら確実に再生できるはずなのですが、
変換方法がまだよくわからなくて・・・
それと音の使用の最終判断はバグさんにお任せします。
使っても使わなくてもOKですので、
どうぞバグさん流のテトリスを貫いてください。
遅くなっても怒らないでくださいね?
音の用意が遅かったら無視してガンガン進めちゃってください。
ちなみに、nsfファイルは再生だけなら
ttp://www.pokipoki.org/dsa/index.php?NSFplay
このツールが簡単です。
良かったらどうぞ。
>>最終レベルの15
たどり着けました。
これはもはや瞬間移動でしょうw
254ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(10,650ポイント)
Date: 2008/12/02(火) 00:53
No:24880
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
変換方法ですが、
audacityで録音し、ノイズがあれば削るというのはどうでしょう。
2倍のポイントを手に入れた! 44ポイント を手に入れた。
|
|
|
|
|
Name: こめかみ ..プログラマー(39,183ポイント)
Date: 2008/12/02(火) 02:21
No:24882
|
|
Title: Re:DXライブラリを使用して、テトリスを作ってみました
|
|
変換出来ました。
zipでもrarでも好きな方をどうぞ。
ttp://cid-d72819af3901253a.skydrive.live.com/browse.aspx/%E5%85%AC%E9%96%8B%E7%B4%A0%E6%9D%90?uc=2
>>lbfuvabさん
ノイズ気になっちゃいますか?
にわか知識なのですが、ファミコン音楽は音の波形で言うと
二つの矩形波と、
三角波、
ノコギリ波(いわゆるノイズ)、
DPCM(サンプリング音源)、
で構成されるそうです。
これらの音源を通常の楽器に当てはめて曲を構成するのですが、
チップチューンに聞きなれていない方には、
ドラムパートがただの不快な雑音に聞こえることも多々あるのではないかと想像します。
人に講釈するほど私も詳しいわけではありません。
こうすれば聞き心地がいいというのがありましたら、
言っていただければ参考になります。
でもこのスレッドの話題から脱線しちゃいますので、
改善案とかもしあったらまたの機会にお願いします。
>>audacityで録音し、ノイズがあれば削るというのはどうでしょう。
なんだかよさげな編集ソフトですね、ご紹介ありがとうございます。
今回はfoobar2000というフリーソフトにプラグインで読み込ませて変換する方法を見つけました。
変換後曲が二回再生されて保存されてしまうので、ファイル容量の半分は無駄だということになります。
まだよく調べていませんがaudacityが音ファイルの分割に役に立ちそうなので、
今度是非試してみます。(今日はもう無理ー)
48ポイント を手に入れた。
|
|
|
|
Name: makotyan ..ぴよぴよ(210ポイント)
Date: 2008/12/01(月) 10:28
No:24819
|
|
Title: nの階乗を求めるプログラム
|
|
キーボードから整数nを読み込み、
nの階上 n!=1×2×3×…n
を求めて表示させるプログラムを求めたいのですが、よくわかりません。
あと条件に0以下または13以上の場合は再入力するみたいです。
106ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(33,082ポイント)
Date: 2008/12/01(月) 10:33
No:24822
|
|
Title: Re:nの階乗を求めるプログラム
|
|
この掲示板は丸投げ禁止です。
まず、キーボードから整数nを読み取るプログラムを作れませんか?
2倍のポイントを手に入れた! 68ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(19,786ポイント)
Date: 2008/12/01(月) 11:02
No:24825
|
|
Title: Re:nの階乗を求めるプログラム
|
|
階乗のプログラムはウェブ上にいくらでも載ってると思います。その中の1つを拝借
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 1000
#define SUPREMUM 10000
int main(void)
{
int i, j, n, x, amari, p = 0, sho = 0;
static int kekka[ARRAY_SIZE];
do
{
printf("0以上の数を入力:");
scanf("%d",&n);
}
while(n < 0);
kekka[0] = 1;
for(i = 0; i < n; i++)
{
for(j = 0; j <= p; j++)
{
x = kekka[j] * (i + 1) + sho;
sho = x / SUPREMUM;
amari = x % SUPREMUM;
kekka[j] = amari;
if(sho > 0 && p == j)
{
p++;
}
}
}
for(i = p, j = 1; i >= 0; i--,j++)
{
if(i == p)
{
printf("%4d",kekka[i]);
}
else
{
printf("%04d",kekka[i]);
if( (j % 10) == 0 )
{
printf("\n");
}
}
}
printf("\n");
return 0;
}
0以上の階乗計算プログラムのようですが13以下の条件はどっかにいれてください。これが実行できるかは
試してないのでわかりません。
550ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(74,729ポイント)
Date: 2008/12/01(月) 19:29
No:24860
|
|
Title: Re:nの階乗を求めるプログラム
|
|
いつもいうことですが、キーボードからの読み込みを行うための一般的な方法はありません。
とはいえ、エディタならキーボードから読み込んでくれそうなので、次のようにしてもよいでしょう。
#include <iostream>
#include <boost/static_assert.hpp>
template <int n>
struct factorial_helper
{
static const int value = n * factorial_helper<n - 1>::value;
};
template <>
struct factorial_helper<0>
{
static const int value = 1;
};
template <int n>
struct factorial
{
BOOST_STATIC_ASSERT(0 < n && n < 13);
static const int value = factorial_helper<n>::value;
};
int main()
{
const int n = /* ←に好きな整数をキーボードで入力すること! */;
std::cout << factorial<n>::value << std::endl;
return 0;
}
こんなことを書くとまた怒られそうですが...。
456ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(10,555ポイント)
Date: 2008/12/01(月) 20:04
No:24862
|
|
Title: Re:nの階乗を求めるプログラム
|
|
段階で考えましょう。但し、キーボード入力は標準入力と読みかえています。
@標準入力から数字を読み取る。
解説:scanfで良いと思いますよ。scanf("%d",&hoge);
A0以下か13以上なら繰り返し
解説:while文かfor文かdo-while文。
while(1){
//処理
if(hoge>1 && hoge<12)
break;
}
B階乗の計算
解説:while文。
fact=1;
while(hoge)fact*=hoge--;
C表示
解説:printfです。
printf("%d\n",hoge);
こんなもんですかね。
197ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..入門者(2,572ポイント)
Date: 2008/12/01(月) 20:55
No:24865
|
|
Title: Re:nの階乗を求めるプログラム
|
|
>lbfuvabさん
Aに境界値バグがあります。
1の階乗と12の階乗が求まりません。
2倍のポイントを手に入れた! 48ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(10,606ポイント)
Date: 2008/12/01(月) 21:50
No:24873
|
|
Title: Re:nの階乗を求めるプログラム
|
|
>Aに境界値バグがあります。
>1の階乗と12の階乗が求まりません。
すいません。適当に読み替えてください。
51ポイント を手に入れた。
|
|
|
|
|
Name: conio ..入門者(4,715ポイント)
Date: 2008/12/01(月) 23:02
No:24875
|
|
Title: Re:nの階乗を求めるプログラム
|
|
階乗は、再帰的関数の呼び出しの原理を理解する為の例題で時折見かけますね。
と言うわけで、再帰的な関数でやってみます。
-------------------------------------------------
#include<stdio.h>
int saiki(int n)/*再帰で階乗を求める*/
{
if(n > 0) return(n * saiki(n - 1));
else return(1);
}
int main(void)
{
int t;
scanf("%d",&t); /*値を入力する*/
printf("%d",saiki(t));/*値の階乗を表示*/
return(0);
}
----------------------------------------------------
以上です。
個人的に再帰は、パズルゲームで隣の色が同じかどうかを調べる時に非常に役に立ちました。(ぷよぷよ系)
あと、再入力の処理はあえて書いていません。
main関数の値を入力する部分に、do文などを実装するといいでしょう。
(何のことか分からない場合は、もう一度参考書等を読み返すと効率的に学習できると思います。)
287ポイント を手に入れた。
|
|
|
|
Name: LaL ..ぴよぴよ(138ポイント)
Date: 2008/11/25(火) 19:08
No:24546
|
|
Title: ひとつのfstreamで複数のファイルを開くとき
|
|
どうもこんにちは。
fstreamについての質問です。
学校の宿題で、ひとつのifstreamのみで、複数のファイルを開こうとしているのですが、うまくいきません…。
メインの中で、
string inputFileName;
ifstream inputFile;
ofstream outpuFile;
と宣言して、
ユーザーからgetline(cin,inputFileName);でインプットファイル名であるstringを読み取って、
inputFile.open(C-stringのファイル名);
という具合にして、一つ目のファイルは難なく開けるのですが、do-whileを使用して、二つ目のファイルを開くときにエラーが起こってしまい、開けません。
二つ目のファイルを開く前に一つ目のファイルはinputFile.close()で閉じてあるのですが…。
また、以下のようなコードで、EOFまで読み取っているはずなのですが、もし何か私の見落としに気付く方がいらっしゃれば、有難いです(_ _)
while(inputFile.peek() != EOF){
inputFile >> fromFile;
x[length++] = atof(fromFile.c_str());
if(!inputFile){
length--;
inputFile.clear();
break;
}
}
138ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(275,116ポイント)
Date: 2008/11/26(水) 01:12
No:24571
|
|
Title: Re:ひとつのfstreamで複数のファイルを開くとき
|
|
ifstreamのオブジェクトを再利用するなら、inputFile.close()した際に
inputFile.clear()もコールして下さい。
C++入出力
ttp://www.cppll.jp/cppreference/cppio_details.html#clear
91ポイント を手に入れた。
|
|
|
|
|
Name: LaL ..ぴよぴよ(152ポイント)
Date: 2008/12/01(月) 19:23
No:24859
| 解決!
|
Title: Re:ひとつのfstreamで複数のファイルを開くとき
|
|
どうもありがとうございました(_ _)
14ポイント を手に入れた。
|
|
|
|
Name: 長い間悩まされている ..ぴよぴよ(177ポイント)
Date: 2008/11/28(金) 14:56
No:24702
|
|
Title: 変な質問か超難しい質問
|
|
と思われるかもしれませんが、
純粋なC言語問題ではないです。
長い間悩まされている問題です。
MS-WindowsのExplorerを開いた時に、
いつもOSの存在するデスクCの中身が開かれて、
これは無意味で、面倒くさいと思います。
好ましいのは
デスクがExplorerを開く時に、
デスクC以外のデスクの中身(いろいろのフォルダ名)が自動表示されることです。
これはできるのでしょうか。
177ポイント を手に入れた。
|
|
|
|
Name: 長い間悩まされている ..ぴよぴよ(227ポイント)
Date: 2008/12/01(月) 11:10
No:24827
|
|
Title: Re:変な質問か超難しい質問(お礼 +)
|
|
ま〜くさん
ご返答ありがとうございます。
面白いやりかたと思いますが、
どうもコマンドラインの話見たいですね。
モウスでExplorer を開く場合に、適用できるのでしょうか。
また宜しくお願い致します。
50ポイント を手に入れた。
|
|
|
|
Name: 猿 ..ぴよぴよ(781ポイント)
Date: 2008/11/26(水) 14:05
No:24593
|
|
Title: 経過時間の表示
|
|
今ゲームを作っています
VC++の2008です
ゲームにタイムオーバーを設定したいのですが
例として何か経過時間が常に実行中に表示されるプログラムを作ってもらえませんか??
75ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(38,592ポイント)
Date: 2008/11/26(水) 14:46
No:24600
|
|
Title: Re:経過時間の表示
|
|
もっと具体的な質問を書いたほうがいいと思います。
どこまでやって、何ができないのかを明確に書かないと、時間がかかるばかりか、よい回答もできません。
詳しくは、規約を読めば分かります。
void ShowRestTime(int ms){
printf("%02d:%02d:%03d\n",ms/6000,(ms/1000)%60,ms%1000);
}
とりあえず上記は時間の表示の例です。 ms にはミリ秒を渡します。
189ポイント を手に入れた。
|
|
|
|
|
Name: 猿 ..ぴよぴよ(827ポイント)
Date: 2008/11/30(日) 13:19
No:24790
|
|
Title: Re:経過時間の表示
|
|
ありがとうございます。次は、明確に記述しますのでお許しください
すみませんでした。またよろしくお願いします
46ポイント を手に入れた。
|
|
|
|
|
Name: 猿 ..かけだし(1,227ポイント)
Date: 2008/11/30(日) 13:46
No:24792
|
|
Title: Re:経過時間の表示
|
|
(追記)
私は、今回経過時間の表示&経過時間を求めるプログラムについて質問しています
御津凪さんのプログラムを試しましたができませんでした。
↓このようなエラーがでました
1>コンパイルしています...
1>main.cpp
1>.\メイン画面\main.cpp(739) : error C2601: 'ShowRestTime' : ローカル関数の定義が正しくありません。
1> .\メイン画面\main.cpp(720): この行は '{' を含んでいますが、これに対応するものがありません。
1>ビルドログは "file://c:\Users\hama\Documents\サッカーゲーム2008\Debug\BuildLog.htm" に保存されました。
1>サッカーゲーム2008 - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
知識はC言語を少し知っている程度です!!
C++については、ほとんど分かりません
現在 VC++ 2008EE をつかっています。
DXライブラリーを使用しています
シューティングゲームに経過時間表示をしたくて質問させていただきました。
経過時間を表示&経過時間をを求めるプログラムを教えてください。
お願いします。
400ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(13,165ポイント)
Date: 2008/11/30(日) 14:58
No:24795
|
|
Title: Re:経過時間の表示
|
|
とりあえずエラーメッセージが出たのならそれ読みましょう。
720行目に括弧があるのに、それに対応した閉じ括弧がありませんって書いてあるんだから
質問しなくてもどうすれば直るか予測つきますよね。
86ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(39,481ポイント)
Date: 2008/11/30(日) 17:25
No:24800
|
|
Title: Re:経過時間の表示
|
|
私は提示しているコードはコンソールアプリ用の関数を使っているので、
エラーを直したところでDXライブラリでは表示されません。
DXライブラリでは printf 関数の代わりに DrawFormatString を呼べば(渡すパラメータが違うことに注意)、
表示されると思います。
それと、エラーメッセージを載せる時に、乗せる内容に注意してください。
パスに個人情報が含まれていますよ。
エラーの内容からして恐らく、int main(void)
{
void ShowRestTime(int ms){
printf("%02d:%02d:%03d\n",ms/6000,(ms/1000)%60,ms%1000);
}
return 0;
}
このように main 関数の中に入れていませんか?
関数の中に関数を書く(定義する)ことは出来ません。
もし、上記に対してどう対処して言いのかわからない場合、
もう少しC言語について覚えたほうがいいかもしれません。
321ポイント を落としてしまった。
|
|
|
|
Name: 山崎 ..入門者(3,784ポイント)
Date: 2008/11/30(日) 15:29
No:24797
|
|
Title: FileRead_scanfで
|
|
お世話になっております、山崎です。
以前、FileRead_scanfについてお伺いしましたが、申し訳ないながらもう一度
FileRead_scanfについてお尋ねしたいと思います。
現在、次のようなファイル(ポーション.itm)を、
":"の前後で二つの文字列型変数に分け読み出そうとしております。
ItemIndex:2
ItemName:ポーション
ItemExplanation:HPを80回復します。
そこで、以下のようなコードを書きました。
テストのため、まだループはさせないであります。
...
char ItemData1[20];
char ItemData2[200];
int ItemFileHandle=FileRead_open("ポーション.itm");
//do{
FileRead_scanf(ItemFileHandle,"%s:%s",ItemData1,ItemData2);
...
//}while(0==FileRead_eof(ItemFileHandle));
FileRead_close(ItemFileHandle);
...
このコードを実行したところ、
ItemData1には"ItemIndex:2",
ItemData2には"ItemName:ポーション"という文字列が代入されてしまい、
期待通りの結果が得られませんでした。
期待では、":"の前後で一行読み込んだ文字列を分け、
":"以前をItemData1,":"以降をItemData2に格納したいと思っています。
例のファイルの一行目を読んだとすると、
ItemData1には"ItemIndex"、ItemData2には"2"を代入させたい、といった感じです。
":"ではなく" "(スペース)でファイルの文字列を区切ったところ
とりあえずは期待通りの文字列がItemData1とItemData2に格納されたのですが、
やはり":"だと動かない理由が気になります。
どのようにすれば、ファイルの":"の前後の文字列をItemData1とItemData2に分けて
取り出せるのでしょうか。
皆様のお知恵におすがりしたいと思います。
449ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(39,743ポイント)
Date: 2008/11/30(日) 17:39
No:24802
|
|
Title: Re:FileRead_scanfで
|
|
たしか、scanf 系の関数は、基本文字列の読み込みを空白で区切るため、この問題が出ていると思います。
(空白文字は半角スペースのほかに、タブ文字、改行文字も含まれています)
簡単に解決するならば、":"の代わりに半角スペースかタブ文字を入れてはどうでしょうか。
76ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(54,126ポイント)
Date: 2008/11/30(日) 18:09
No:24803
|
|
Title: Re:FileRead_scanfで
|
|
FileRead_scanf(ItemFileHandle, "%[^:]:%s", ItemData1, ItemData2);
できると思います
39ポイント を手に入れた。
|
|
|
|
|
Name: 山崎 ..入門者(3,931ポイント)
Date: 2008/11/30(日) 19:56
No:24804
| 解決!
|
Title: Re:FileRead_scanfで
|
|
御津凪様 GPGA様
ご返信、誠にありがとうございます。
GPGA様のおっしゃる方法を試してみたところ、見事に期待通りの
結果を得ることができました。
まだ私の実力ではなぜこの方法でうまくいくのかは
よくわかりませんが、精進していこうと思います。
このたびは誠にありがとうございました。
147ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(54,346ポイント)
Date: 2008/11/30(日) 22:20
No:24806
|
|
Title: Re:FileRead_scanfで
|
|
scanfにおいて
%[0-9]とした場合、数字である限り、読み続けるという意味になります。
%[^0-9]とした場合、数字でない限り、読み続けるという意味になります。
以下のプログラムを実行して、挙動を確認してみてください
int main() {
char s1[80], s2[80];
char* str = "abc123def";
sscanf(str, "%[a-z]%[0-9]", s1, s2);
printf("%s\n", s1);
printf("%s\n", s2);
sscanf(str, "%[^0-9]%[^a-z]", s1, s2);
printf("%s\n", s1);
printf("%s\n", s2);
return 0;
}
上記に従いまして、%[^:]は、:でない限り、読み続けるという意味になります。
220ポイント を手に入れた。
|
|
|
|
|
Name: 山崎 ..入門者(4,021ポイント)
Date: 2008/12/01(月) 07:28
No:24817
|
|
Title: Re:FileRead_scanfで
|
|
GPGA様
わざわざサンプルコードを示してくださり、誠にありがとうございます。
scanfは正規表現のようなことができるのですね・・・これは全く知りませんでした。
プログラマとしてまたひとつ賢くなりました。
お手数をおかけして申し訳ございません、本当にありがとうございました。
90ポイント を手に入れた。
|
|
|
|
Name: dic ..初心者(6,674ポイント)
Date: 2008/11/29(土) 07:45
No:24744
|
|
Title: ステージの構成について
|
|
シューティングゲームの骨組みはできたのですが、
ステージの構成、つまり敵の配置や動き方、敵の弾の発射など
どのようにして決定していくのがベストなのでしょうか?
61ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(901,105ポイント)
Date: 2008/11/29(土) 11:22
No:24747
|
|
Title: Re:ステージの構成について
|
|
ゲームの骨組みが出来たのなら、外部ファイルから敵の配置や動き方などの情報を読み込んで、その通りに表現すればいいと思います。
例えば龍神録の館ではエクセルデータで表現していますが、
こんな風にステージ情報をもったデータをいくつも作ってやり、1面を表現するのと同じように2面も表現すればいいと思います。
龍神録で1面と2面で違うのは、初期化と背景位です。
スコアや残機数などは初期化してはいけない(仕様によりますが)ので、初期化関数は場合わけ処理しましょう。
140ポイント を手に入れた。
|
|
|
|
|
Name: dic ..初心者(6,729ポイント)
Date: 2008/11/30(日) 09:59
No:24782
| 解決!
|
Title: Re:ステージの構成について
|
|
う〜ん、ちょっと意図が伝わらなかったようです
ステージ構成というかゲーム性についてですけど
なかなか答えづらいですよね
ありがとうございました
55ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(278,810ポイント)
Date: 2008/11/30(日) 14:52
No:24794
|
|
Title: Re:ステージの構成について
|
|
多分レベルデザインの話なのでしょうか?
作ろうとしているゲームのコンセプト・ターゲットユーザーなどを考慮に入れなければ
なりませんし、作り手のスタイル・好みもあるのでズバリな回答は難しいです。
慣れていれば理論的に、或いは何か意図を持った配置をしたりとかできますが、
慣れないうちはそういうのは難しいと思うので、とりあえずどういうゲームにしたいのか、
という方向性だけ念頭において、適当に勘で決めてみてどうでしょうか。
それで、出来上がったものをレビューして修正していくのが、
いいかと思います。
後は平行して、Webや書籍を参考にしたり、とか。
ゲームヘル2000 - レベルデザイン講義
ttp://www5.atwiki.jp/yaruhara/pages/84.html
2006-03-23 - ゲームプログラムめも日記
ttp://d.hatena.ne.jp/kenmo/20060323#p1
Amazon.co.jp: レベルデザイナーになる本
ttp://www.amazon.co.jp/o/ASIN/4862460070
365ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(902,874ポイント)
Date: 2008/12/01(月) 04:22
No:24815
|
|
Title: Re:ステージの構成について
|
|
あ〜なるほど。
Justyさんが仰っているようなことがお聞きになりたかったのでしたら、
まず自分が好きなシューティングを真似てみると言うのも手だと思います。
シューティングを作ろうとするということは、かつて自分がやったシューティングが面白かったからではないでしょうか。
そういうシューティングを真似る事で、勉強にもなり、同時に、昔やったゲームに近いものが自分で作れていることに対する喜びも感じられ、
モチベーションが上がると思います。
190ポイント を落としてしまった。
|
|
|
|
Name: うい ..かけだし(1,353ポイント)
Date: 2008/11/30(日) 03:50
No:24774
|
|
Title: keyの入力の判定
|
|
int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;
}
この一文をただメイン関数の前に書けばもうそれでどれくらい入力されているか判定できるようになり、
if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
のようなことはできるようになるのでしょうか?
2倍のポイントを手に入れた! 636ポイント を手に入れた。
|
|
|
|
Name: GPGA ..熟練のプログラマー(54,078ポイント)
Date: 2008/11/30(日) 03:55
No:24776
|
|
Title: Re:keyの入力の判定
|
|
キーリピートを実装したいということですね。
こんなのはどうでしょう。
int count = 0; // グローバル
if (キーが押されている時) {
if (count == 0 || count == 30) {
// 処理
}
if (++count >= 35) {
count = 30;
}
} else {
count = 0;
}
114ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(54,087ポイント)
Date: 2008/11/30(日) 04:16
No:24778
|
|
Title: Re:keyの入力の判定
|
|
あー、質問文をちゃんと見てませんでした。
一言で言うと、「やってみればいかがですか?」に限ります。
試すことができるのに、試さないで質問するのは愚の骨頂ですよ。
まず試してみる。
それで、うまくいかなければ考える。
それでもわからなければ、質問するようにしましょう。
111ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(901,578ポイント)
Date: 2008/11/30(日) 13:11
No:24789
|
|
Title: Re:keyの入力の判定
|
|
「どれくらい」という表現がちょっと曖昧でよくわかりませんが、
int型がカウント出来る数には限界があるので、どれ位の時間その限界以内で使用できるかということでしょうか?
unsigned int はだいたい40億までカウント出来ます。
一方、60FPSでゲームを作ったとすると、
1秒で 60
1分で 60*60
1時間で60*60*60
1日で 60*60*60*24
1年で 60*60*60*24*365
ですね。
40億÷1年のカウント数
で計算してみます。
2.11.....
です。つまり2年以上キーを押しっぱなしにすると0に戻ります。
しかしまずそういうことは無いですよね。
常識的にありえなさそうなことまできちんと制御しないといけない本格的なゲームには適さないかもしれませんが、
とりあえずこれでも問題無いかと思っています。
もしそれでも気持ち悪いということならLONGLONG型を使うというのもありかもしれません。
2000京、20エクサ回カウント出来るのでこれがオーバーフローするころには地球は滅亡してるでしょう。
(キロ、メガ、ギガ、テラ、ペタ、エクサ)
453ポイント を手に入れた。
|
|
|
|
|
Name: うい ..かけだし(1,453ポイント)
Date: 2008/11/30(日) 23:50
No:24809
|
|
Title: Re:keyの入力の判定
|
|
質問の仕方が悪かったみたいです。
あの一番上の長い文があると一体どうなっているのかが、説明を見てもよくわからなかったので、
少しわかりやすく説明をしてもらえるとありがたいです。
85ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(902,995ポイント)
Date: 2008/12/01(月) 04:15
No:24813
|
|
Title: Re:keyの入力の判定
|
|
渡されたKeyStateBufには現在のキー入力状態が入ります。
int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;
}
キーボードは一つしかないでしょうから、この関数内で静的変数で用意してもいいんですが、一応引数にしてます。
とりあえずGetHitKeyStateAll_Keyには今の瞬間のキーの入力状態がはいりますよね。
今の入力状態がオンならそのキー入力状態カウンタをカウントアップします。
オフなら0にします。
そうすることで、キーがどれ位おされているかカウント出来るようになっているのです。
例えば60FPSのゲームでエンターを2秒おしっぱなしにしたら
引数[ KEY_INPUT_RETURN ] には120が入っています。
特定のキーの入力状態を表示するプログラムを作り、実際にキーを押してみたらよく解ると思います。
243ポイント を手に入れた。
|
|
|
|
Name: うい ..かけだし(1,368ポイント)
Date: 2008/11/30(日) 23:48
No:24808
|
|
Title: VC++を使った時の分割コンパイル
|
|
VC++を使った時の分割コンパイルは、どのようにやればよろしいのでしょうか?
ただいつものようにビルドでやればよいのでしょうか?
あと、そもそも分割コンパイルについてしっかりと理解できてないかもしれませんので少し解説も入れてもらえるとうれしいです。
70ポイント を手に入れた。
|
|
|
Name: うい ..かけだし(1,298ポイント)
Date: 2008/11/30(日) 03:54
No:24775
|
|
Title: セーブデータの作り方
|
|
ゲームプログラミングの館に、
save_dataというセーブデータの構造体があったとします。これをいちいち何かにわけて処理をする必要がなく
fwrite( &save_data, sizeof(save_data_t), 1, fp ) ;
とかけば構造体のデータがそのままファイルに保存出来ます。
このように書いてあるのですが、これのサンプルもC++でそのまま使えるのでしょうか?
あと、同人のゲームを作ろうと思っているのですが、暗号化などはした方がよろしいでしょうか?
55ポイント を落としてしまった。
|
|
|
|
Name: GPGA ..熟練のプログラマー(53,976ポイント)
Date: 2008/11/30(日) 03:58
No:24777
|
|
Title: Re:セーブデータの作り方
|
|
>これのサンプルもC++でそのまま使えるのでしょうか?
使えます。
>暗号化などはした方がよろしいでしょうか?
セーブデータなので暗号化はしなくてもいい気がしますが
改編されないためにCRCチェックは入れたほうがいいかもしれません。
102ポイント を落としてしまった。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(901,789ポイント)
Date: 2008/11/30(日) 13:39
No:24791
|
|
Title: Re:セーブデータの作り方
|
|
セーブデータが改竄されたかどうかチェックする方法はゲームプログラミングの館の一番最後に書いてあります。
必要があるかどうかは、ご自身の判断に任せます。
セーブデータがネット上に出回りそうな本格的なソフトなら行った方が良いでしょうが、
特にそういうわけではない時は、ある程度改竄されにくくする程度で大丈夫なんじゃないでしょうか。
しかし排他的論理和でデータかえるのは簡単なので、それ位しておいたほうが無難だと思います。
211ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(279,207ポイント)
Date: 2008/11/30(日) 15:12
No:24796
|
|
Title: Re:セーブデータの作り方
|
|
>このように書いてあるのですが、これのサンプルもC++でそのまま使えるのでしょうか?
使えることは使えます。
ですが、構造体の中身に依って、或いは環境に依っては、それを読み込んだとき
正しく動くかどうかは保証できないことがあります。
Cでも構造体内にポインタが含まれていたらダメでしょうし、
C++の場合それに加えて参照やコンストラクタ・デストラクタ、
仮想関数を含んだり、継承したりすることができますが、
それらを含んでいると保証できなくなります。
>暗号化などはした方がよろしいでしょうか
保存する中身が重要なものでなく、改変されても問題もので有れば
必要ないと思います。
逆に言えば、重要で保護する必要があれば、暗号化&チェックサムを
付けた方がいいでしょう。
397ポイント を手に入れた。
|
|
|
|
Name: へろり ..初心者(8,796ポイント)
Date: 2008/11/30(日) 14:13
No:24793
|
|
Title: 名前空間
|
|
先日ちょっと気になるコードを目にして、色々いじってたのですが、
分からないところが出てきましたのでご教示おねがいします。
(1)
typedef struct{
...
}HOGE;
main(void)
{
HOGE HOGE;
}
(2)
typedef struct{
...
}HOGE;
HOGE HOGE;
main(void)
{
...
}
上記のような(1)、(2)のコードについて、なぜ(1)のコードが良くて、
(2)のコードがダメなのか。
よろしくお願いします。
183ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(280,340ポイント)
Date: 2008/11/30(日) 16:24
No:24798
|
|
Title: Re:名前空間
|
|
どちらかと言えば、名前空間というより有効範囲の問題ですね。
同一名前空間の中での、有効範囲の違いによる問題ですので。
わかりやすく言えば、関数の外で typedefで HOGEを宣言すると、ファイル有効範囲で
HOGEという名前が予約済みになります。
で、(2)は同じファイル有効範囲で宣言した HOGE HOGEは変数名が被るので
エラーになります。
しかし、(1)のように関数内でローカル変数として宣言した場合、その変数名は関数内だけの有効範囲に
なり、有効範囲が異なりますので被りません。
この有効範囲が違うということを利用すると、以下のようなコードも有効になります。
#include <stdio.h>
typedef struct
{
int a;
} HOGE;
int main(void)
{
typedef struct
{
int b;
} HOGE;
HOGE h1 = { 0 };
printf("%d^n", h1.b);
{
typedef struct
{
int c;
} HOGE;
HOGE h2 = { 0 };
printf("%d^n", h2.c);
}
return 0;
}
関数内で typedefした HOGEは、関数の外で typedefしたものとは有効範囲が異なるので、
問題なくコンパイルできます。
しかも、関数の中で、更に {}のブロックで囲った中は別の有効範囲になるので、
また別の HOGEを持つことができます。
但し、異なる有効範囲の HOGEは不可視となりますので、その中では使うことは出来きなくなります。
で、当然ですが、関数内の有効範囲でも(1)と同じように HOGE HOGEと
いうことをすれば、関数内の typedefされた HOGEと有効範囲が同じなので、同様にエラーになります。
int main(void)
{
typedef struct
{
int b;
} HOGE;
HOGE HOGE = { 0 }; /* コンパイルエラーになる */
return 0;
}
1,133ポイント を手に入れた。
|
|
|
|
Name: ピョン ..ぴよぴよ(5ポイント)
Date: 2008/11/29(土) 23:50
No:24767
|
|
Title: DxLib.slnファイルについて
|
|
サンプルプログラム実行用フォルダ内にあるDxLib.slnファイルがなく、DxLib_VC2008_and_2005用.slnがあるのですが、これをダブルクリックしてもVC++が起動しません。何がいけないんでしょうか?
5ポイント を手に入れた。
|
|
|
|
Name: ピョン ..ぴよぴよ(103ポイント)
Date: 2008/11/30(日) 09:03
No:24780
|
|
Title: Re:DxLib.slnファイルについて
|
|
VC++のインストールは大丈夫だと思います。
他のプロジェクトファイルは開けました。
再起動もかけましたがやはり起動しません。
DXライブラリの設定も手順通り行いました。
初心者なのですごく初歩的なミスかもしれませんが、よろしくお願いします。
98ポイント を手に入れた。
|
|
|
|
|
Name: ピョン ..ぴよぴよ(197ポイント)
Date: 2008/11/30(日) 10:24
No:24783
|
|
Title: Re:DxLib.slnファイルについて
|
|
管理人さん、nonさん、ありがとうございます。ファイルは開けました。
しかし、実行しても画面が一度真っ黒になるだけで、画像が表示されません。
DXライブラリの設定も出来ていると思うのですが。
どなたかアドバイスお願いします。
94ポイント を手に入れた。
|
|
|
|
|
Name: ピョン ..ぴよぴよ(257ポイント)
Date: 2008/11/30(日) 13:08
No:24788
| 解決!
|
Title: Re:DxLib.slnファイルについて
|
|
原因はわかりませんが、いろいろ試していたら動きました。
お手数おかけしました。
2倍のポイントを手に入れた! 60ポイント を手に入れた。
|
|
|
|
Name: OMEGA [URL] ..ぴよぴよ(96ポイント)
Date: 2008/11/30(日) 11:21
No:24784
|
|
Title: 無題
|
|
OMEGAと申します。
「高校生のゲームプログラミング」というブログを書いています。
今回はリンクを張らせていただいたので、ご連絡をしようと思い、
書き込ませていただきました。
とても良いサイトだと思います!
これからも頑張ってください。
96ポイント を手に入れた。
|
|
|
Name: esu ..ぴよぴよ(198ポイント)
Date: 2008/11/29(土) 19:22
No:24756
|
|
Title: 計算の結果が表示されません。
|
|
1〜100までの偶数と奇数をそれぞれ足して合計を求めたいのですが、
奇数の表示されません。なぜなんでしょうか?
int main(void){
int sum1 = 0;
int sum2 = 0;
int i = 0;
int j = 1;
while(i != 100){
i = i+2;
sum1 += i;
}
printf("偶数の合計は%dです。\n",sum1);
while(j != 100){
j = j+2;
sum2 += j;
}
printf("奇数の合計は%dです。\n",sum2);
return 0;
}
198ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(130,169ポイント)
Date: 2008/11/29(土) 19:41
No:24758
|
|
Title: Re:計算の結果が表示されません。
|
|
ちなみに、奇数の計算時に現在陥っている無限ループを
解消しただけでは、正しい答えを出力しません。
合計に足し込むタイミングが間違っています。
51ポイント を手に入れた。
|
|
|
|
|
Name: esu ..ぴよぴよ(239ポイント)
Date: 2008/11/29(土) 19:48
No:24759
|
|
Title: Title: Re:計算の結果が表示されません。
|
|
早速のご回答ありがとうございます。
2回目のwhile文の条件式(j != 100)にならずに表示されない訳ですね。
41ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..かけだし(2,131ポイント)
Date: 2008/11/29(土) 22:02
No:24761
|
|
Title: Re:計算の結果が表示されません。
|
|
あたしだったら、こんな風に書きます。
#include <stdio.h>
int main(void)
{
int even, odd, i;
for (even = odd = 0, i = 1; i <= 100; i++) {
if (i % 2 == 0) even += i;
else odd += i;
}
printf("偶数の合計は%dです。\n", even);
printf("奇数の合計は%dです。\n", odd);
return 0;
}
27ポイント を手に入れた。
|
|
|
|
|
Name: esu ..ぴよぴよ(267ポイント)
Date: 2008/11/29(土) 22:30
No:24762
|
|
Title: Re:計算の結果が表示されません。
|
|
回答ありがとうございます。
大変参考になりました。
%で余りを利用して偶数か奇数かを判定する方法は考えたのですが、
もしこの判定方法を用いずに計算するにはどうすればいいのでしょうか?
2倍のポイントを手に入れた! 28ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..かけだし(2,236ポイント)
Date: 2008/11/29(土) 22:48
No:24763
|
|
Title: Re:計算の結果が表示されません。
|
|
#include <stdio.h>
int main(void)
{
int even, odd, i;
for (even = odd = 0, i = 1; i <= 100;) {
odd += i++;
even += i++;
}
printf("偶数の合計は%dです。\n", even);
printf("奇数の合計は%dです。\n", odd);
return 0;
}
105ポイント を手に入れた。
|
|
|
|
|
Name: esu ..ぴよぴよ(506ポイント)
Date: 2008/11/29(土) 23:48
No:24766
|
|
Title: Re:計算の結果が表示されません。
|
|
初心者さんお答え頂きありがとうございます。
回答を見直してみたのですが、
なぜoddとevenの値が変わってくるのかが理解できませんでした。
もしよろしければ教えて頂けませんか?
自分なりに考えた方法は以下の通りでした。
#include <stdio.h>
int main(void){
int sum1 = 0;
int sum2 = 0;
int i = 0;
int j = 1;
while(i <= 100){
sum1 += i;
i = i+2;
}
printf("偶数の合計は%dです。\n",sum1);
while(j <= 100){
sum2 += j;
j = j+2;
}
printf("奇数の合計は%dです。\n",sum2);
return 0;
}
239ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..入門者(2,524ポイント)
Date: 2008/11/30(日) 00:09
No:24768
|
|
Title: Re:計算の結果が表示されません。
|
|
さっき提示したソースコードは、下のものと同じことをしています。
#include <stdio.h>
int main(void)
{
int even, odd, i;
for (even = odd = 0, i = 1; i <= 100;) {
odd += i; /* oddには奇数を加える */
i++; /* iは偶数になる */
even += i; /* evenには偶数を加える */
i++; /* iは奇数になる */
}
printf("偶数の合計は%dです。\n", even);
printf("奇数の合計は%dです。\n", odd);
return 0;
}
288ポイント を手に入れた。
|
|
|
|
|
Name: esu ..ぴよぴよ(532ポイント)
Date: 2008/11/30(日) 01:19
No:24770
| 解決!
|
Title: Re:計算の結果が表示されません。
|
|
for文の一度目のiで1、2度目のiで2をそれぞれ代入しそれを繰り返している訳ですね。
粘り強く答えて頂きありがとうございます。
おかげ様でようやく理解する事ができました。
26ポイント を手に入れた。
|
|
|
|
Name: matu ..入門者(3,123ポイント)
Date: 2008/11/28(金) 18:01
No:24718
|
|
Title: 関数の呼び出し
|
|
すいませんまた質問させてください。
関数の複数回呼び出すことがうまくできません、
コードの中に質問も書いておきました。
#include <stdio.h>
#define MAX 61
#define N 4
int v[N + 1];
int p[N + 1];
int minv[N + 1];
int min1;
void perm(int);
void perm1(int);
int main()
{
int i,tmp;
int a[2][5]={{0,0,0,0,0},
{0,1,2,3,4}};
for (i=1;i<=N;i++){
p[i] = i;
}
min1=10000;
v[0]=0,
v[1]=8,
v[2]=7,
v[3]=13,
v[4]=24,
/*交換*/(1と8の交換)
tmp=a[1][1];
a[1][1]=v[1];
v[1]=tmp;
/*呼び出し*/
perm(1);
/*元にもどす*/
tmp=a[1][1];
a[1][1]=v[1];
v[1]=tmp;
/*交換*/(2と8の交換)
tmp=a[1][2];
a[1][2]=v[1];
v[1]=tmp;
ここで「2,7,13,24」の最短距離とその道順を求めた
permの処理をもう一回したいのですがわかりません。
どうやってよびだせばよいでしょうか。
return 0;
}
void perm(int i)
{
int j, t,sum1;
sum1=0;
if (i < N)
{
for (j = i; j <= N; j++) {
t = p[i]=v[i]; p[i]=v[i] = p[j]=v[j]; p[j]=v[j] = t;
perm(i + 1);
t = p[i]=v[i]; p[i]=v[i] = p[j]=v[j]; p[j]=v[j] = t;
}
}
else {
int d[MAX+1][MAX+1]={
};
/*距離(sum)をだしている*/
for(j=1;j<N;j++)
{
sum1 +=d[v[j]][v[j+1]];
}
/* printf("%d",sum1);*/
/*printf("%d",sum2);*/
/*printf("\n");*/
if(min1>=sum1){
min1=sum1;
for(j=1;j<=N;j++){
minv[j]=v[j];
printf("%d ",minv[j]);
}
}
printf("%d",min1);
printf("\n");
}
}
878ポイント を手に入れた。
|
|
|
|
Name: kazuoni ..プログラマー(38,890ポイント)
Date: 2008/11/28(金) 18:26
No:24719
|
|
Title: Re:関数の呼び出し
|
|
すみません。めちゃくちゃ見づらかったので、字下げしておきました。
先に貼り付けておきます。
あ、
>/* printf("%d",sum1);*/
>/*printf("%d",sum2);*/
>/*printf("\n");*/
などは初めから消しておいたほうがいいと思います。
次回からは気を付けてください。
#include <stdio.h>
#define MAX 61
#define N 4
int v[N + 1];
int p[N + 1];
int minv[N + 1];
int min1;
void perm(int);
void perm1(int);
int main()
{
int i,tmp;
int a[2][5]={{0,0,0,0,0},{0,1,2,3,4}};
for (i=1;i<=N;i++)
{
p[i] = i;
}
min1=10000;
v[0]=0,
v[1]=8,
v[2]=7,
v[3]=13,
v[4]=24,
/*交換(1と8の交換)*/
tmp=a[1][1];
a[1][1]=v[1];
v[1]=tmp;
/*呼び出し*/
perm(1);
/*元にもどす*/
tmp=a[1][1];
a[1][1]=v[1];
v[1]=tmp;
/*交換(2と8の交換)*/
tmp=a[1][2];
a[1][2]=v[1];
v[1]=tmp;
ここで「2,7,13,24」の最短距離とその道順を求めた
permの処理をもう一回したいのですがわかりません。
どうやってよびだせばよいでしょうか。
return 0;
}
void perm(int i)
{
int j, t,sum1;
sum1=0;
if (i < N)
{
for (j = i; j <= N; j++)
{
t = p[i]=v[i]; p[i]=v[i] = p[j]=v[j]; p[j]=v[j] = t;
perm(i + 1);
t = p[i]=v[i]; p[i]=v[i] = p[j]=v[j]; p[j]=v[j] = t;
}
}
else
{
int d[MAX+1][MAX+1]={};
/*距離(sum)をだしている*/
for(j=1;j<N;j++)
{
sum1+=d[v[j]][v[j+1]];
}
if(min1>=sum1)
{
min1=sum1;
for(j=1;j<=N;j++)
{
minv[j]=v[j];
printf("%d ",minv[j]);
}
}
printf("%d",min1);
printf("\n");
}
}
801ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(33,014ポイント)
Date: 2008/11/28(金) 18:43
No:24721
|
|
Title: Re:関数の呼び出し
|
|
この掲示板はタブ幅が8なので、エディタの設定でタブ幅が8以外の人(大半は4だと思うけど)はタブとスペースを混ぜるとすれずれになってしまいますね(^^;
57ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(11,625ポイント)
Date: 2008/11/28(金) 18:52
No:24722
|
|
Title: Re:関数の呼び出し
|
|
なぜか、前の時と同じように訳がわからない変数が、元に戻りましたね。
何をやりたいのか、配列pや配列aが何を意味するのか説明してください。
再度関数を呼ぶのなら
ただたんに、再度 perm(1);すればいいのですが、前提として配列vに行きたい店が格納されているという
のが、この前までの条件でした。
2倍のポイントを手に入れた! 256ポイント を手に入れた。
|
|
|
|
|
Name: matu ..入門者(3,184ポイント)
Date: 2008/11/29(土) 17:36
No:24755
|
|
Title: Re:関数の呼び出し
|
|
すいません・・・同じ者です。
課題を正確に説明するために、もっと与えられた課題自体をもっと理解します。
49ポイント を手に入れた。
|
|
|
|
Name: ryu ..ぴよぴよ(510ポイント)
Date: 2008/11/28(金) 23:38
No:24735
|
|
Title: どこまでが「効率化」?
|
|
お初です。
STGにおいて、「弾が発射されているか」や「敵が画面内にいるか」といったフラグのチェックは膨大な回数行っているかと思います。
公開されているプログラムでは、敵の弾を描写するだけでも「敵の最大出現数」*「一体の敵が撃てる最大弾数」という全組み合わせのフラグチェックを行っています。
それを見て思うのですが、「フラグチェックは効率化すべき」なのでしょうか?
たとえば、「出現していない敵」と「出現している敵」、「発射されている弾」と「発射されていない弾」を綺麗に住み分けられるとすれば、弾の描写はもちろん「出現している敵」の「発射されている弾」のみを見ればいいわけです。
そうなれば効率化に繋がると思いますが、ソースもまた難解複雑になるでしょう。拡張性も狭まり、その後の改編も苦労することになります。
その点、公開されているプログラムは不特定多数の閲覧者のために明快かつ確実なプログラムで、だけど原始的です。
機械に任せる仕事なのだから原始的なプログラムでも充分、ということは多々ありますが、環境が変われば動作も繊細に変わります。ある環境では通常通りに動作するプログラムも、少しスペックの低い環境では動作が不充分である可能性も中には存在します。60.0fps丁度で安定していた動作が59.0fpsまでが限界になるかもしれません。その原因がフラグチェックの過多で、そこの効率化を図れば0.1fps分の利益を得るかもしれません。
そういったことがあるとしたら、フラグチェック(だけに括らずとも、その他細かな処理まで)にも工夫を施すべきなのでしょうか。それとも、僅かな利益のためにソースを複雑にするのは効率化ではなく改悪なのでしょうか。
変な質問かと思いますが、多くの意見を聞きたくなったので……。
みなさんはどう思いますか?
510ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(278,445ポイント)
Date: 2008/11/29(土) 01:29
No:24741
|
|
Title: Re:どこまでが「効率化」?
|
|
>フラグチェック(だけに括らずとも、その他細かな処理まで)にも工夫を施すべきなのでしょうか。
ボトルネックになっているところがどこかなのか(全体の処理時間のうち、
どの関数の処理が多く使われているのか、一番多く呼ばれている関数は何かなど)を
調べた上で、そこを改善すれば一定以上の向上が見込めるところに
ついてだけにした方がいいでしょう。
枝葉な細かな処理をちょっと効率よくしたからといって、そうそう全体が速くなる
わけではないですから。
パレードの法則「プログラムの処理にかかる時間の80%はコード全体の20%の部分が占める」
ttp://ja.wikipedia.org/wiki/%E3%83%91%E3%83%AC%E3%83%BC%E3%83%88%E3%81%AE%E6%B3%95%E5%89%87
>弾の描写はもちろん「出現している敵」の「発射されている弾」のみを見ればいいわけです。
>そうなれば効率化に繋がると思いますが、ソースもまた難解複雑になるでしょう。
>拡張性も狭まり、その後の改編も苦労することになります。
それは書き方、改善の仕方次第だと思うのですが、もしそうなるのであれば
メリットとデメリットを考えてデメリットが大きければその部位の修正は
止めるべきでしょうね。
とはいえ、ゲームとかではよく性能をフルに出すためにある程度の保守性・拡張性を
犠牲にして、高速化を求めることも多々ありますので、一概にはいえませんが。
>「フラグチェックは効率化すべき」なのでしょうか?
龍神録の館のコードのフラグチェックだけに限っていってしまえば、
チェック総数が非常識な数になっていなければ必要ないように思います。
でも、そうですね。
今現在使用している配列の最大インデックス数くらいは覚えておくといいかもしれません。
例えば配列が 10000の要素あったとしても、実際に使われている配列が
{ 0, 1, 5, 8, 14 } の5つだけだとしたら、14という数字さえを覚えておけば
15以降の残りの 9985個は使われていないことがわかるので、スキップできます。
500ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(900,265ポイント)
Date: 2008/11/29(土) 11:53
No:24748
|
|
Title: Re:どこまでが「効率化」?
|
|
色々と効率化は出来るには出来ると思います。
線形リストを使うとか、ベクターを使うとか。
配列だとどうしても、0〜10まで弾を登録したあと、例えば2番と8番の弾が画面外に出たとき2,8は穴の開いたような状態になり、無駄が出来ます。
しかし毎回穴の空いた部分を詰める処理をすると逆に非効率な気がします。
私は本物の龍神録の中ではJustyさんが仰っているように「登録されている最大数」を弾幕情報に格納し、その番号までチェックしています。
具体的にどれ位計算時間が違うのか試していないのですが、結局色々考えた結果シンプルに配列にしました。
弾が非常に多く出てくる場面では、かなり頻繁にフラグのオンオフが繰り返されるので、
配列のままでいいかなと。
まぁこれだとどうしてもグローバル変数にドカンと結構な容量取ってしまうので、その点ネックですが。
ただ、この辺って思ったより重要じゃない場合が多いみたいなんですよね。
色んなパソコンでテストプレイして見たところ、今のCPUは非常に優秀で、1秒に1億回位の計算は簡単にやってしまうので
大してこの辺効率化したからって全体的に軽くなったと感じない場合が多いみたいです。
それより重い原因はグラフィックにあるようです。
なので館ではあえて効率的にはせずわかりやすさ重視で書いています。
・・とは言え、バックで画面キャプチャソフトを動かしている場合なども考えられるので効率化するにこしたことはないですけどね。
龍神録で一番無駄な処理をしているのは、弾の階層わけ描画ですね・・。
館では紹介していませんが、弾って階層にわけて描画する必要があるんです。
例えば大玉の下に小玉が隠れていると、理不尽死にしてしまう場合があります。
大きな弾は常に下に描画しないといけません。
そこで龍神録では弾の種類番号を大きさ順に並べ、ループのカウンタ番号がその番号になったら描画するようにしています。
なので、普段行っている計算量 X 弾の種類 になるので相当な数になっています。
具体的には
for(t=0; t<弾の種類の最大数; t++){
/* 登録されている弾幕の、登録されている弾を描画 */
for(i=0; i<弾幕の総数; i++){
if(弾幕.フラグ == オン){
for(s=0; s<登録されている弾の総数; s++){
if(弾幕.弾.フラグ == オン){
if(弾幕.弾.種類 == t){
//描画;
}
}
}
}
}
}
黄色の部分が館で紹介している描画の仕方ですよね。
これに弾の種類数を乗算した回数の計算が必要になります。
つまりt=0の弾の種類番号が最も大きく、tの数が大きい種類番号ほど小さい弾の画像になっています。
登録されている弾の種類番号別に最大数を保存しておけば少しはましになりそうですが、
いまいちこれといったすっきりした効率化手段は考え付いていません・・。
840ポイント を落としてしまった。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(74,273ポイント)
Date: 2008/11/29(土) 12:26
No:24750
|
|
Title: Re:どこまでが「効率化」?
|
|
> 僅かな利益のためにソースを複雑にするのは効率化ではなく改悪なのでしょうか。
すでに回答が出ていますが、(アプリケーションレベルでは)ボトルネックになるところを調べて、そこを集中的に最適化するほうが得策です。「時期尚早な最適化」は諸悪の根源でしかありません。
ライブラリの場合は若干事情が異なりますが、可読性を落としてまで何でもかんでも最適化すべきでないのは同じです。
一方で、特に可読性が低下するわけでもないのに、わざわざ効率の悪い書き方をするのは「時期尚早な不最適化」です。
例えば、ソートに関しては、利用可能な状況では std::sort を使うべきで、わざわざ効率の悪い qsort を使うのは得策ではありません。ましてや、バブルソートを自分で実装するのは最悪です。
フラグに関しても同じことがいえます。
ビット演算や論理演算で簡潔に書けるところを、if文の連続で書くのは得策とはいえません。
仮にブール代数が不得意だからif文の連続にするというのであれば、真のボトルネックは数学が不得意な点にあります。
394ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(900,367ポイント)
Date: 2008/11/29(土) 13:28
No:24751
|
|
Title: Re:どこまでが「効率化」?
|
|
Justyさんの御書きになった{ 0, 1, 5, 8, 14 }を見て思ったのですが、弾の軌道計算の部分で、何番の弾が登録されてるかも同時に調べてその番号を格納すればいいかもしれません。
0, 1, 5, 8, 14の弾が今登録されてるなら0, 1, 5, 8, 14という番号を他の配列にいれ、その配列の値を配列番号に指定すればイフ文がいらなくなりますね。
102ポイント を手に入れた。
|
|
|
|
|