C言語なら俺に聞け(入門編)Part 116
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/06/14(金) 20:22:05.73★前スレ
C言語なら俺に聞け(入門編)Part 115
http://toro.2ch.net/test/read.cgi/tech/1368444993/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 164代目
http://toro.2ch.net/test/read.cgi/tech/1370255305/
★C++言語については避けてください。C++対応明記スレへどうぞ。
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。
# サイズが大きい場合はアップローダ等を利用してください。
http://codepad.org/C/C++の宿題片付けます 165代目
http://ideone.com/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0619デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANプログラムいらんわ
0620デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANSleep の単位はミリ秒だから1000倍しないと
0621デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN#include <windows.h>
int main(){
Sleep((60*2+40)*1000);
printf( "Let's go!\n" );
system( "happysynthesizer.mp3" );
}
>>618
あざっす
system初めて使った
>>619
>>620
あれはうっかりミスw
みんなありがとう
とりあえず何とか完成した
今後はこういう簡単なものから順次ステップアップしていく予定
次はMMORPG用の汎用鯖を開発する
0622デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANMMO鯖の仕様書が完成した
http://www.age2.tv/rd05/src/up9968.png
だから次はLinuxで開発することになるな
今日の作業はここまで
0623デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN> 次はMMORPG用の汎用鯖を開発する
#include <windows.h>
int main(){
system("mmorpgcommonserver.exe");
}
0624デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANそれだとWMPが起動するのにかかる時間も考慮しないとだめじゃね?
0625デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANvipprogのプログラミング言語スレまとめ?みたいなので
#include <stdio.h>
void inc(int x){
x = x + 1;
}
main(){
int a = 5;
inc(a);
printf("%d\n", a);
}
で実行結果が
5
になる理由を読んだのですが、全然分かりません。
void inc(int* x){
*x = *x + 1;
}
というようにポインタを使えば6になる理由も分かりません。
無能ですみませんが教えていただけないでしょうか。
0626625
2013/07/06(土) NY:AN:NY.AN間接代入的なことするんですね
0627デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANmain関数から"コピー"して持ってきただけ(値渡し)だから
main関数内の変数は影響されない
詳しくは値渡しと参照渡しで
0629デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANしても文字列が消えないんですがおかしいですか?
printff("hello");
fflush(stdout);
hello残ったままです。
0630デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0631デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN> printff("hello");
確かに、残ってるのはおかしいな。
そもそも、普通にやるとリンクでエラーになると思うが。
0632デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN消す機能はない。
0633デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANこの3者を正確に理解しなければ道は開けない
0634デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN何故fflushが必要なのか分りません。
fflushって何の役割なんですか?
言葉の意味的にはフラッシュつまり消すという意味なんですけど。
0635デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANあんたバカなの?
言葉の意味的にはバカつまり素晴らしいという意味なんですけど
0636デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANprint("hello world ")
fflush(stdout);
sleep(pow(10,3))
print("\rheilo world")
でそうなりますし。
fflushないとバグります。
0637デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN> フラッシュつまり消すという意味なんですけど。
はあ?
辞書ちゃんとひいてこい。
0638デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0639デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0640デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANコピペですよ。
コピペは正しいんだからfflushの用途も正しいんでしょうね。
まぁ技術的難点はこういうものだって覚えておいたほうがいいでしょうかな。
0641デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0642デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN出力せずにバッファ(メモリ)に溜めておいて、一定量出力がたまったら
まとめて出力するって動作をするから、printf()を呼んでもバッファに溜まる
だけで実際には出力されないことがある。
バッファの内容を強制的に出力したいときにfflush()を使う。
0643デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0644デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANscanf()の後だと分かるけど。
それとバッファってコマンドラインの事ですか?
それも曖昧で分りません。
0645デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANscanf()の後で使っている奴がいたら、用法の誤り。
0646デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANどこからコピーしたコードなんだろうか
0647デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANsetvbuf で _IONBF を指定しろ
0648デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN>>636 print("hello world ")
確かに、未知だわ (w
0649デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0650デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANだから本来なら出力される値を
fflushによって書き込まないようにするんでしょ?
そういう理解です。
0651デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0652デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN「クソ食らえ」、つまり意訳すると「どうぞ、糞をお召し上がりください」という事ですね
チョンにとってはご褒美
0653デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN逆だ。
出力される予定だけどまだ出力されてない値を強制的に出力させる操作。
0654片山博文MZパンク ◆0lBZNi.Q7evd
2013/07/06(土) NY:AN:NY.AN0655デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0656デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN区別しないと。
0657デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN\rってGUI的な機能ですよね。書いた文字を消すなんて....
端末プログラミングでこんな事ができることに驚いた。
0658デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANプリンタデバイスにリダイレクトし
文字多重書きで細工(下線つけたり 打ち消し線いれたり)という技巧も昔はやってたな
0659デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANしかも英語としても意味が違うし
トイレでジャーって流すのがフラッシュだよ
まだ出力してないで溜めておいた内容を
全部出力するのが fflush だよ
0660デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANttp://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/fflush.3.html
>標準では、入力ストリームに対する動作は規定されていない。
>>650,655
ま、どうしても違うと思いたいなら、それ以上は何も言わないけど・・・。
0661デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN俺も大変驚いている
0662デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0663デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANと書きたかったけど、よくよく見たらどう見ても Windows で
やってるんだろうな。
cmd.exe もエスケープシーケンスぐらいサポートすればい
いのに…
0664デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANでもscanfでキー入力待ちをしておいてプログラムがそのまま進行するのは
何故ですか?ブロックは落ちますよね?scanfを時間制限かけてスルーしたり
できるんですか?
0665デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANGUIから入った人には、\rの動きはイメージ沸かないかぁ。
といっても、私も辛うじてラインプリンタがあったくらいの時代だから、テレタイプとかはしらないけど。。。
0666デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANGUI こそ \r の使いどころ
0667デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANコンパイラの方言、若しくは特定のOSであるのでしょう
標準関数には無いよね?
0668デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN計算結果を出力するだけの端末プログラミングに必要とされない
からね。\rとか\bとかは異常。
0669デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN//mmo_server.c
int main(){
InitSystem();
StartDataThread();
StartGameThread();
StartNetworkThread();
StartAdminThread();
while(1){
//スレッドの終了チェック
//終了フラグが立ったら全スレッドを終了させて抜ける
//どれか一つのスレッドが終了した場合も異常とみなして他のスレッドを終了させて抜ける
}
return 0;
}
0670デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN仕様書を読むのに慣れてない人のために軽く説明しておく
□データスレッド
アカウントやキャラクターデータの入出力を行う
設定により、ファイル、データベース、データベース鯖など複数の選択肢を提供する
保存データの入出力を制御するスレッドであり、データそのものは保持しない
□ゲームスレッド
ここがメイン
キャラクターの移動、攻撃、防御、ステータスの変化、などのあらゆるデータを処理する
ファイルやデータベースなどにデータを保存する際にはデータスレッドへデータを投げる
処理結果の送信データは通信スレッドに投げる
□通信スレッド
受信したデータはゲームスレッドに投げ、ゲームスレッドから投げられたデータは各ソケットに送り出す
投げるってのは専用のキューを用意しておきそこに積んでいくことを指す
データスレッドとゲームスレッドの間にはデータ→ゲーム用と、ゲーム→データ用の2つのキュー、
ゲームスレッドと通信スレッドの間には、ゲーム→通信用と、通信→ゲーム用の2つのキューが、
アクティブなキャラクターの数分必要
0671デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN管理のための接続専用スレッドだ
起動した後はここから各種情報を見たり設定変更、鯖の終了等を行う
0672片山博文MZパンク ◆0lBZNi.Q7evd
2013/07/06(土) NY:AN:NY.AN0673デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0674デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANhttp://toro.2ch.net/test/read.cgi/tech/1366526476/
呪いを調べるとか怖くて
kbhit()!!
コピペごめんね
0677デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN内容の種類を示す4byteと、内容を示す可変長byteをセットにしてやりとりする
例えばチャットの場合、先頭から
4byte・・・チャットであることを示す"10"
4byte・・・チャットの内容の文字数
文字数byte・・・チャットの内容
という形だ
攻撃(藏から鯖に送るデータ)なら、
4byte・・・攻撃であることを示す"450"
4byte・・・対象のID
4byte・・・攻撃の種類(必殺技の種類とか)
これはあくまで一例だから、バフはどうするのかとか
攻撃も対象ではなく場所に対して発動させる場合はどうするのかとか
その辺りはきちんと考えて決めていく必要がある
しかも汎用鯖だからな
0678デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANここはオレに聞けスレなので、鬱陶しいから出て行ってくんない?
0679デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANお前が消えれば済むさっさと出ていけゴミ。
0680デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANここでやると邪魔だから
ゲーム作るよ → 頓挫
が許される場所でやれ
GEP
http://ex14.vip2ch.com/news4gep/
板情報を追加すれば2ch専用ブラウザでも使える
0681デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANお前みたいに非生産的なカキコしかできないksよりマシw
0682デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN俺が>678の立場だったら吊るね
人として最低限のプライドがあるから
0683デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0684デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0685デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN「何がしたいのかを書いてくれないと、解決法の教えようがない。
本当にそんな処理が必要なの?」
とか言い出すんだよ。
自己顕示欲を満たしたいだけの典型的な池沼。
知能に問題があるって本当にハンディキャップだな。
0686デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN>鬱陶しい
個人的感想はブログに書いてろバーーーーーーカwwwwwwwwwwwwww
0687デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0688デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0689デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANゴミクズは建設的な書き込みなど出来ない。
0690デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANIDがでれば>>677のようなゴミクズも楽にスルー出来るんだがなあ。
0691デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN0692デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.AN救いようのないゴミクズ。
0693デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANお前誰にも必要とされてないんだからこのスレ見なくていいんだよ?
嫌なら見るなバカガキ。
0694デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANでなければ噛みつき方が不自然
0695デフォルトの名無しさん
2013/07/06(土) NY:AN:NY.ANここはゴミ捨て場じゃねーぞ。ゴミクズはゴミ箱に捨てろ。
0696デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.ANIDが無くても手であぼーんしてますが何か?
お前内容を読まずにあぼーんするつもりか?
0697デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.AN頭が悪い事を完全に暴露されてついに病気が脳に来たか?
0698デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.AN0699デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.AN>>675 >>676
0700デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.AN当たり前だ。お前のようなゴミクズが捻り出すのはゴミクズレスだけ。
読まずにゴミ箱で問題ない
0701デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.AN0702デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.AN0703デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.ANfopenで開くファイル名を変数で指定しちゃったらいいよ。
その変数に入れるファイル名を実行時に指定。
0704デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.ANint bh[170][60][11200]=(int *)malloc(100);
のところで「無効な初期化子」とエラーが出ました。
これはどういうことなのでしょうか。
0705デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.AN0706704
2013/07/07(日) NY:AN:NY.ANmallocはポインタしか使えないのですね。
メモリ確保後、配列で扱おうと
int *bh;
bh=(int *)malloc(100);
int a=0,b=0,c=0;
bh[a][b][c]=0;
としたのですが、配列が定義されていないと出ました。
当然だろと思ったのですが、
以下のプログラムは動くので、よく分かりません。
教えていただけないでしょうか。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int *heap;
heap = (int *)malloc(sizeof(int) * 10);
if (heap == NULL) exit(0);
for (i = 0;i < 10;i++) {
heap[i] = i;
}
printf("%d\n",heap[5]);
free(heap);
return 0;
}
0707デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.ANとりあえず構造体にしておけば簡単
0708704
2013/07/07(日) NY:AN:NY.ANint ***bh;
bh=malloc(sizeof(int*)*3);
としたらコンパイルできました。
回答ありがとうございました。
0709デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.AN0710デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.ANint (*bh)[170][60][11200]=malloc(sizeof(*bh));
アクセスするときは(*bh)[0][0][0]
0711704
2013/07/07(日) NY:AN:NY.ANint ***bh,i,j,a;
bh=malloc(sizeof(int*)*30);
for(i=0 ; i<70; i++){
for(j=0 ; j<160 ; j++){
for(a=0;a<11200;a++){
printf("debug\n");
bh[j][i][a]=0;
printf("debug\n");
}
}
}
としたところ、
debug
Segmentation fault (コアダンプ)
となりました。
bh[0][0][0]=0;
だけでセグフォになったみたいですが、なぜなのでしょうか・・・。
0712704
2013/07/07(日) NY:AN:NY.AN710の通りにしたらできました。
ありがとうございました。
0713デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.ANそれより開発を続けていく
スレッドの作成は置いておいて、まずはキューの実装から行っていく
昨日書いた通りキューはいくつかあるが、まずはゲームスレッドと通信スレッドの間のキューを実装していこうと思う
キュー用のバッファはグローバルとして定義しておき、
ここに追加・取り出しをする
昨日の説明通り、4byteのヘッダに続いて様々なbyte数のデータが続くが、どのような実装がよいだろうか?
0714デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.ANゲームスレッド→通信スレッドの場合、
char queue[4*1024];
としてキュー用のバッファを確保しておくとする
ゲームスレッドは書き込み位置を記憶するためのポインタchar *w;をもっており、
通信スレッドは読み出しの位置を記憶するためのポインタchar *r;を持っている
そして書き込み/読み込みが終わったときに、次の書き込み/読み込み位置をw/rに保持する
当然起動した瞬間は、queue=w=rであり、キューに追加されてw>rとなった時点で読み出しが行われる
但し、このバッファは使い回すため、w<rとなる可能性もあり、読み出し条件はw!=rとしたほうがよいと思われる
また読み出しが追い付かない場合、キューに溜まっているデータが確保したバッファサイズを越えた瞬間重大なエラーを引き起こす
C言語でのキューの実装はこれでいい?
0715デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.ANゴミクズには無理。全然ダメ。
0716デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.ANアプリを作るための丸ごとの相談をしたいなら
専用スレ立ててそこでやってくれよ
0717デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.ANmain関数から sub関数に、配列array を引数で渡して、sub関数内で配列arrayの要素数を求める方法はありますか?
以下のコードでは、main関数内では要素数を求められますが、sub関数内では求めることができませんでした。
#include <stdio.h>
#define N(array) (sizeof(array)/sizeof(array[0]))
void sub(int *array) {
printf("%d\n", N(array));
}
int main(void) {
int array[10] = {0};
printf("%d\n", N(array));
sub(array);
return 0;
}
実行結果:
10
1
0718デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.AN無い
■ このスレッドは過去ログ倉庫に格納されています