トップページ⇒tech
1001コメント286KB

C言語なら俺に聞け(入門編)Part 117

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
C言語の入門者向け解説スレッドです。

★前スレ
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/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0153デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>152
何をした、以前の問題で何をすればいいのか分からないところです。
0154デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
二次元配列を諦めて
一次元配列で扱えば良い

割とマジで

2つ目の要素数が決まってるなら手段があるけど、
不定だと本当に手段が無い
0155デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
じゃあ、一次元配列なら出来るの?
0156デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
#define DEFFUNHA(a,b,c) void fun##b##_##c##ary(a*d){\
a(*p)[b][c]=(void*)d;\
…\
}

DEFFUNHA(char,5,10) /* void fun5_10ary(char*){…} */
0157デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>154
ポインタ配列?ってやつを使えばいいんでしょうか…?
0158デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>149
一次元配列を宣言して、関数に渡して値を上書きする方法は分かる?
0159デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>158
分からないです。
0160デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
本読めって、言いたくないほうだけど
入門書読んでね
ってとしか
0161デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
漠然とした質問だと、答えが中々返ってこない。
一つ目の方法は、「こういう事をしたいのだが、はどうすればできるか?」と具体的に聞いてみる。
二つ目の方法は、入門書の、「配列とポインタ」、「関数を使った処理」が書いてあるところを読む。
その上で、分からないところがあれば、「これはどういうこと?」と聞いてみる。

一つ目は、解決が差し迫っているなら有効だけど、上手に聞かないと回答がこないかも。
0162 ◆QZaw55cn4c 2013/07/17(水) NY:AN:NY.AN
>>149
http://codepad.org/OEL84wkY
前も似たようなコード書いた、これって需要があるの?
0163デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
mainだけで動くもの作って、関数化していくってのも手なんだけど
右も左もわからず、いきなり高度なことやろってのがよーわからんのよね
0164デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
まず、main関数でa[][]の初期設定(値の格納)
↓
関数を用いて、a[][]の一部を上書き
↓(これを複数回)
最終的にmainの最後で表示

という流れをやりたいです。
オセロの盤面みたいな感じで操作ごとに一部を上書きしたいと思っています。
二次元配列を利用した理由はまた同じ例になりますが、オセロの盤面の1マスを二次元配列の1要素に見立てたいと思ったからです。

値渡しとポインタ渡しの所が少し自分の中で混ざって解釈してる気がしたので、ここで質問し、そこの部分の確認もしたいと思っていました。
0165デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
上書き=代入でいいんだよな?
0166デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
すでに格納してあるcharの1文字を別の1文字に書き換えて、mainでも保持させたいということです
0167デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
オセロなら0と1で表現できるからint型でもいいと思うよ
0168デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>167
オセロの盤面は例であって、オセロではないのでintではなくcharで扱いたいです。
0169デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>162
例えば配列ary[5][5]があったとして
ary[0][0],ary[0][1],...,ary[0][5],ary[1][0],...,ary[5][5]
はアドレスが連続ではないのですか?
連続なら関数へ渡すとき
ary[0][0]やary[1][0]などのアドレスを保持させる意味がわからないんですが・・・
0170 ◆QZaw55cn4c 2013/07/17(水) NY:AN:NY.AN
>>164
http://codepad.org/J1XrFwQu or >>162
0171デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
多分、二次配列、と参照渡しの複合問題だからそれぞれ別々に考えたほうがいいよ
0172 ◆QZaw55cn4c 2013/07/17(水) NY:AN:NY.AN
>>169
http://codepad.org/yORMquQm
でいいのなら、>>162 や >>170 は忘れてください
0173デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
ホントに1バイトのcharでいいなら代入で上書きできるけど、
たとえば、Windowsでなんの工夫もしなければ、
○も●も2バイトになるよ。char[3]
0174デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>169
配列ary[6][6]があったとして
ary[0][0],ary[0][1],...,ary[0][5],ary[1][0],...,ary[5][5]
は、配列だからアドレスが連続です。それが配列の特徴
0175デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>169
ary[1][0]のように1, 0を指定したら、ary[1][0]の記憶領域のアドレスを計算してくれるんだよ
0176デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
コンソールで
scanf関数を抜ける事ってできますか?
一定時間入力が無かったらスルーみたいな事はできないですかね?
0177デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>176
unix系なら
http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/function.html#setjmp
0178デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>177
いやCygwinで無理ですか?
端末上で行うゲームを作りたいんですが、繰り返し制御の中で
scanf使うと思うんですけど入力が無いときも処理が進むようにしたいんです。
0179デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
cygwinってunixと似てる
0180デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>178
Cygwinのマニュアル読むなり、テストコード書くなりしてみたら?
10分で終わるでしょ。
終わったら結果報告よろしく。
0181デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
signal処理はunixとWindowsで大きく違うところじゃん。
リンク先見てないけどSIGALRMでlongjmpするんでしょ。

> Cygwinのマニュアル読むなり、テストコード書くなりしてみたら?
これが最も早いとは思えないな。
0182デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
ゲームならここのgetch()とkbhit()をコピペすればいいんじゃないの。

http://peroon.hatenablog.com/entry/20110730/1311996770
0183デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>181
そうだね。
ヒント出されても自分で調べたり確かめたりできないから聞いてるんだろうしね。
0184デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
何もわかりません
全部、考えてください
って、言ってる?
0185デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
そもそもゲームでscanf()を使うと言う発想が理解できん。
0186デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
もしかして、日本語で動作を考えてるだけ
0187デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
配列とポインタアクセスをごちゃごちゃに理解してるような
0188デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
ぬるぽ(^^
0189デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
ニューラルネットワークで質問があります
http://d.hatena.ne.jp/ura_ra/20111026/1319642014
のサイトなんですが
//閾値設定x[NUM_INPUT] = 1.0
x[NUM_INPUT] = (double)1.0;

//隠れ素子の計算
for( j = 0; j < NUM_HIDDEN;j++)
{
net_input = 0;
for(i = 0; i < NUM_INPUT+1; i++)
{
net_input = net_input + w1[i][j] * x[i];
}

NUM_INPUT+1なぜ+1なのでしょうか??
閾値ってのは閾値をこえたら発火するという役割なんじゃないのでしょうか?
net_input=に閾値までいれてどんな役割をこなしているのかわかりません!!
このド低能のクソ豚めにどうかご教授ください!
0190デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>189
http://hooktail.org/computer/index.php?Perceptron

単純パーセプトロン のところ
 N個 の セル + 閾値判定 を
 N+1個 の セル ただし最終セルは常時閾値となる
に置き換えたモデルだね
0191デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
発火判定: Σ(i=0〜n-1)w[i]x[i] が 閾値 を超えたら発火
= Σ(i=0〜n-1)w[i]x[i] - 閾値 が 正なら発火
 w[0]x[0] + w[1]x[1] + ... w[n-1]x[n-1] - 閾値

 引き算を w[n] = -1 に、閾値を x[n] = 閾値 に置き換えると
 w[0]x[0] + w[1]x[1] + ... w[n-1]x[n-1] + w[n]x[n]
 こう書ける (ってことは 0〜n までの積和だねい)

常時 x[n] = 閾値に、 学習で w[n] = -1 (に収束するといいな)
Σ(i=0〜n)w[i]x[i] で発火判定すれば良いことになるん
0192デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
Cの場合、配列は0から数えるからでしょ
0193デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>185
じゃぁどうやって入力するの?
標準ライブラリだけしか使っちゃいけないなら
scanf必須でしょう?
0194デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
標準ライブラリのみって縛りだったらscanf()でタイムアウト処理はムリ。
初心者だからしょうがないけど環境とかこういう条件は最初に言うように。
0195デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
入力にscanf使って良いのは初心者向けの入門書だけ。
0196デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>195
何使えばいいでしょうか?
hで右
gで左
上がy
下がb
という標準キー設定にしたいんですが。
0197デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
環境は
と問いかけられてるのスルーする質問者
0198デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
scanfの解説でページ数稼げるからかも、入門書系
テスト作って採点するときも楽なのかもね、scanf
0199デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>197
すいません。
さっきのCygwinです。
0200デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
Cygwinなら、ncurses使うのが

とりあえず、このへんから
ttp://www.kis-lab.com/serikashiki/man/ncurses.html
0201デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
cygwinでDOSプロンプトでcursesは苦労するかもしれん
なんかローグ動かそうとして苦労した記憶がある
0202デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
やりたいことが、入門編じゃないところが...
0203デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>182 で十分だと思うけどこれをスルーしたってことは>>200とか使うの無理なんじゃないの。
0204デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
夏休み中に出来れば、いいのかもね
0205デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
結局DXlib使えば楽勝すぎだなw
CUIでゲームとか職人にもほどがある
0206デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
scanfがセキュリティ的に危ない関数であるのは分かったけど何故?
格納される変数のサイズ以上に入力されたときも変数を超えてメモリへ格納されるから?
じゃあ何の関数を使えばいい?
0207デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
scanfじゃなくて、やりたいことができる自前の関数を作る
自己責任関数がおすすめ
0208デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
鯖にしてANSIエスケープシーケンス対応の端末ソフト側に●投げ
入力はノンブロッキングでいけるハズ

本末転倒な解w
0209デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>206
fgets使えば
0210デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
このスレの人はDXlibについてどう思う?
便利過ぎだろって思う?
0211デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
便利さならプラットフォーム選ばない分SDLのほうが上
0212デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
プラットフォームって何?
OSのこと?
0213デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
黙ってろ
0214デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>212 ← 人生諦めたほうがいい池沼の典型例
0215デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>206
ちゃんと使えばセキュリティーも問題ないけど使い方がけっこう複雑だし、
仕様とかに精通したって、入門書を卒業して実用的なコードを書き出したら
まず使わないし時間の無駄っていうか。
0216 ◆QZaw55cn4c 2013/07/17(水) NY:AN:NY.AN
>>201
昔 CUI 花火のコードを宿題スレで公開した猛者がおられましたが、それを実行したのは cygwin/bash では無理で cmd? いや、もしかすると command.com だったかな‥‥
0217デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
昔は int や in/out でグラフィックを扱っていた物だ
0218デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>216
そのプログラム感動したわ
何年か前だったと思うが今でもおぼえてる
0219 ◆QZaw55cn4c 2013/07/17(水) NY:AN:NY.AN
>>218
エスケープシーケンスだけであそこまで出来るなんて‥‥
どなたか URL をご存じないかと‥‥
codepad か ideone なら今でも拾えるはず‥‥

手元に置かなかったのは不覚でした
0220デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
初歩的な質問で申し訳ないのですが
例えばint型のnという変数を宣言したとき、
同時にnのアドレスを保持した変数&nも宣言されるのでしょうか。
それとも&nが使われる時にnのアドレスを確認してそのアドレスを格納した変数&nができるのでしょうか。
0221デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>同時にnのアドレスを保持した変数&nも宣言されるのでしょうか。
いいえ

>それとも&nが使われる時にnのアドレスを確認してそのアドレスを格納した変数&nができるのでしょうか。
いいえ

&は「nのアドレスを確認してそのアドレスを」値として返すだけの演算子でやんす
単項のマイナス -n なんかと同じ (nの値を確認してその値の符号を変えたものを返す演算子)
02222202013/07/17(水) NY:AN:NY.AN
>>221
では++&nなど&n自体を弄ることはできないんですね
マイナスの例えわかり易かったです。ありがとうございました
0223デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
マクロの置き換えで、nをループ出来るような仕組みは作れるでしょうか
↓だとA(i)でコンパイル引っかかる
  int i;
  int A0 = 1;
  int A1 = 2;
#define A(n) A ## n
  for (i=0; i<2; i++)
    printf("%d\n", A(i));
0224デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
/*  for (i=0; i<2; i++)*/
   printf("%d\n", A(i));
   printf("%d\n", A(i));
0225デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>224
アホ
0226デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
   printf("%d\n", A0);
   printf("%d\n", A1);
0227デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
int *arrayA[] = { &A0, &A1 };
と配列を用意しておいて

#define A(i) (*arrayA[(i)])

こうするぐらいしかアイデアが思い浮かばない
0228デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
forは実行時のループ
マクロを展開するためのループじゃねえし
0229デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
>>216
多分これじゃないかと思う。
http://unkar.org/r/tech/1217741118/86

回答は多分、
http://unkar.org/r/tech/1217741118/138
のようだけど、アップロードしたサイトは既に閉鎖している
0230デフォルトの名無しさん2013/07/18(木) NY:AN:NY.AN
>>227
ああ、#define使わないでそうした方がいいですかね

>>228
分かった上で一応聞いてみたんだが
0231デフォルトの名無しさん2013/07/18(木) NY:AN:NY.AN
C++のtemplateに逃げる
0232デフォルトの名無しさん2013/07/18(木) NY:AN:NY.AN
自前で展開したソース吐くようなプログラム書けばいいのに
0233デフォルトの名無しさん2013/07/18(木) NY:AN:NY.AN
そもそもわかってるものは、こんなもんにマクロ使おうとしない
0234デフォルトの名無しさん2013/07/18(木) NY:AN:NY.AN
可変個引数マクロで
#define FOR(m, ...) ここは考えろ
FOR(A, 1, 2, 3, 4)
0235デフォルトの名無しさん2013/07/18(木) NY:AN:NY.AN
ここでうだうだ言ってないで、
こつこつ、エディタでコピペしながらやるほうが早かったりして
0236デフォルトの名無しさん2013/07/18(木) NY:AN:NY.AN
いずれは国籍なんて無視して理系及び理系の重要性を認めて理系側についた
人間(ニュータイプ)だけで独立国家のジオン公国つくって、何も生み出す
能力がなく金や資源や穀物を右から左に動かして中間搾取するだけのモラル
の無い腐りきった文系男(オールドタイプ)国家に戦争しかけるのが人類の
最終形態だろう、200年先になるか300年先になるかはわからんが
0237デフォルトの名無しさん2013/07/18(木) NY:AN:NY.AN
C言語やってたら頭ぼけるってあれは嘘だな
細かい事に躓くタイプがぼけるだけで、これやりてーとか
頭ふるちんぽしてたらかなり頭使うからボケない
0238デフォルトの名無しさん2013/07/19(金) NY:AN:NY.AN
簡単に作れるゲームない?
表示とかは記号で十分なんだが
0239デフォルトの名無しさん2013/07/19(金) NY:AN:NY.AN
Tic tac toe
0240デフォルトの名無しさん2013/07/19(金) NY:AN:NY.AN
hangman(単語当て)
数十分もあれば作れるはず
0241デフォルトの名無しさん2013/07/19(金) NY:AN:NY.AN
hangmanってクロスワードの1ワード版みたいなやつだっけ?
0242デフォルトの名無しさん2013/07/19(金) NY:AN:NY.AN
Cでは文字列を複数格納するにはどんなデータ型がいいですか?
ファイルから読み込んだ文字列を格納したいです。

apple
tree
orange
notebook
eggplanet
jym
mountain
0243片山博文MZパンク ◆0lBZNi.Q7evd 2013/07/19(金) NY:AN:NY.AN
>>242
char*かchar[]でしょうね。strdupで動的に確保することもできるし。
0244片山博文MZパンク ◆0lBZNi.Q7evd 2013/07/19(金) NY:AN:NY.AN
typedef struct {
char word[64];
} WORD;
か
typedef struct {
char *word;
} WORD;
として、
WORD word_table[100];
か
WORD* word_table;
0245デフォルトの名無しさん2013/07/19(金) NY:AN:NY.AN
>>243
それぞれの要素の文字にアクセスできますか?
0246片山博文MZパンク ◆0lBZNi.Q7evd 2013/07/19(金) NY:AN:NY.AN
word_table[i].word[j]でできるよ。
単語の長さはstrlen(word_table[i].word)
0247デフォルトの名無しさん2013/07/19(金) NY:AN:NY.AN
char str[]={"apple\0tree\0orange\0notebook\0eggplanet\0jym\0mountain\0"}; // \0をセパレータ \0\0をセンチネル
0248デフォルトの名無しさん2013/07/19(金) NY:AN:NY.AN
>>247
strcatでfgetsで持ってきた文字列を追加した後にヌル文字を付加する感じですか?
0249デフォルトの名無しさん2013/07/19(金) NY:AN:NY.AN
文字列に制限がないなら
char **
0250 ◆QZaw55cn4c 2013/07/19(金) NY:AN:NY.AN
>>244
ここはやっぱり
typedef struct {
.....いろいろ
char word[0];
} WORD;
と不定長構造体で決めたいところ
0251デフォルトの名無しさん2013/07/20(土) NY:AN:NY.AN
老人性痴ほう症が進んだか? WWWW
可変長構造体は否定してたんじゃないのか? WWWW
しかもGCCの拡張形式。WWWW
てめーはフレキシブル配列メンバは使用禁止だ WWWW

http://toro.2ch.net/test/read.cgi/tech/1349527750/672
> あと可変長構造体はリッチーはすごく嫌っていたみたい
> http://www.kouno.jp/home/c_faq/c2.html#6
> >ただしDennis Ritchieは「Cの実装への根拠 のない馴れ馴れしさ」と呼んだ。
> C99 では公認されたにしてもちょっとねえ、妙なところは技巧的にいくんだ?
0252デフォルトの名無しさん2013/07/20(土) NY:AN:NY.AN
>>251
半年前のレスを引っ張り出してきて粘着するとか
■ このスレッドは過去ログ倉庫に格納されています