人 うんこ体操の時間だよ! (__) (__) (( o(,,・∀・ ) うっ、うっ! 丿 ノo )) (,/ヽ_) 人 (__) (__) (,,・∀・ ) うんこ〜♪ ⊂ と丿 ヽ__)-' 人 (__) (__) (,,・∀・ ) みんなで、みんなで! (( ノ つ ⊃ )) (__ノヽ_) 人 (__) (__) ('( ・∀・,,)') うんこ〜♪ ( ) U-U
以下経験が云々の話題禁止
janeの隠し機能 1.書き込みウィンドウを出し半角入力に切り替える 2.Wキーを押しっぱなしにする 3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW あなたのIPは219.134.234.342です。 送信しました
大量のファイルを読み込むプログラムが必要な状況です。 boost::threadを使って,ファイル読み込みと処理の部分をマルチスレッド化しようと思っていますが,うまくいきません。 大量のファイルを読み込み,最初の一行をvectorに読み込む場合,下のようなプログラムになると思うのですが,何がだめなのでしょうか? boost::mutex state_guard; class FileOpener { public: FileOpener(std::string file_name, std::vector<std::string> *first_lines) : file_name(file_name), first_lines(first_lines) { }; virtual ~FileOpener(){}; void run() { boost::mutex::scoped_lock lk(state_guard); std::fstream member_csv(file_name.c_str(), std::ios::in); std::string str; getline(member_csv, str); first_lines->push_back(str); member_csv.close(); } private: std::string file_name; std::vector<std::string> *first_lines; };
スレタイが理解できない頭の悪さが問題です。
>何がだめなのでしょうか? このスレで質問したこと
前にもどこかで見たけど、コピペと違うの?
最近見たね 無視しとけばいいんじゃない
11 :
476 :2009/03/02(月) 11:28:48
#include <stdio.h> int fact(int i); int main(void) { printf("%d\n",fact(4)); return 0; } int fact(int i) { if(i==1) return 1; else return i*fact(i-1); } これなんですが int fact(int i) { if(i==1) return 1; else return i*fact(i-1); }の場所の if(i==1) return 1;なんですが 何で return 1なんですが?しかしreturn 1なのに1ではなく、ちゃんと階乗された値が表示されます 何故 return 1;で1と表示されずに ちゃんと表示される理由をおしえてください
>>11 なぜ、return 1で1と表示されるんだよw
printf("%d\n",fact(4));
4くらいならメモ取りながら動きを追っかけてみるよろし。
最初は i == 0 に入らないよね? だからどうなる? 次は?
13 :
476 :2009/03/02(月) 11:36:46
ちがいます 何故if(i==1)return 1;なんですか? fact(4)で 4=i 1回目はiが4なので elseのreturn i*fact(4-1);ですよね それで 2回目もiが3になるので return i*fact(3-1); ってわかってるんですが 何故その値を返すとき return 1;なのか知りたいです return かけた分; では無く 何故 return 1;なのか main関数のように正常終了は return 1ときまってるんでしょうか?
fact() の仕様だもの 1*2*3* ... n を計算するのに、そう記述してるだけ
15 :
476 :2009/03/02(月) 11:41:59
ん〜よくわかりません return 2;とやると24の倍の数がでますし return 1;の意味がよくわからないです if(i==1)break;とかでもいいかとおもってましたが できませんでした return i*fact(i-1);をやってあるので int fact();にいってるとおもったんですが 最後のreturn 1; これだと1って表示されるかとおもいますが 詳しく教えてください
fact(4) fact(3) fact(2) fact(1) 引数1なので1を返す 返った1と2をかけて結果の2を返す 返った2と3をかけて結果の6を返す 返った6と4をかけて結果の24を返す
17 :
476 :2009/03/02(月) 11:48:46
一度関数に制御が移ると局所変数は作成されますが、 その関数を出るまでその局所変数は保存されます。 他の関数で同名の変数が作成されても、保護されます。 その関数自信が直接間接的に再度呼び出されても 値は保護されなければなりません。 (つまり多くのコンパイラはバグってますね。)
18 :
476 :2009/03/02(月) 11:57:16
再帰むずかしいですね もしかしてポインタより難しいです 再帰の書いてある場所が少なかったんですが、再帰っておぼえるとどんなとき役にたつんですか?
すべてのC処理系で再帰が使える事は保証されてないので
再帰がどうとかじゃなくて算数の問題だよ
幼稚園児と大学生の会話だなw
構文解析も再帰使ったほうが書きやすいかな?
>>23 モノにもよるだろ
だが再帰で書きやすい文法にしないと誰も覚えちゃくれないという
ことは言えてる。
Visual C++を使ってCで作成したコンソールアプリをビルドし、Visual C++がインストールされていないPCで実行するとエラーが出て使えません。 msdn等を調べましたが、専門用語が多く理解しかねました。 やはり、ランタイム等をインストールしないと使えないのでしょうか? また、フリーウェア等で配布されているものでコンソールアプリのみで動く物をよく見かけますがどうすれば単体で動くのでしょうか? きっかけだけでも教えていただければ、後は調べますのでよろしくお願いします。
デバッグ用でビルドしてるんじゃね?
>>24 逆だろw
LISPが覚えやすいと感じるお前のセンスは病気に近いと思う
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW あなたのIPは139.256.43.192です 送信しました
>>25 です。
>>26 Releaseでビルドしていると思いますが、一応確認してみます。
>>28 そのアプリが使用しているDLLファイル等を調べる事ができるんですね。
色々と読んでみます。
お二方ありがとうございました。
>>30 ランタイムライブラリの設定を静的リンク (/MT)にすればいい。
>>27 構文解析を再帰でかけるかどうかの話なのに何でLISPが出てくるんだ
>>25 です。
>>31 ご指摘のとおり設定しビルドしたところファイルサイズに変化が表れました。
現在、もう一台のPCが使用中なので明日、実行してみます。
ありがとうございました。
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
36 :
476 :2009/03/03(火) 12:37:21
サブルーチンって関数って意味であってますか?
あってたとしたらどうなの? 間違ってたとしたらどうなの?
どうなるか聞いてどうなるの?
39 :
476 :2009/03/03(火) 13:37:25
どうなるかはどうでもいいので、あってるか教えてください
ハ,,ハ ( ゚ω゚ ) お断りします / \ ハ,,ハ お断りします ((⊂ ) ノ\つ))( ゚ω゚ ) (_⌒ヽ((⊂ノ ヽつ )) ヽ ヘ } (_⌒ヽ ε≡Ξ ノノ `J ノノ `J
41 :
デフォルトの名無しさん :2009/03/03(火) 13:45:17
>>36 閉じたサブルーチンとしてよく使われるのが関数
開いたサブルーチンとしてよく使われるのがマクロ
>>36 関数は式であって、値を返す
サブルーチンは処理の単純にまとめたもので値を返さない、ので式の一部にはなれない
程度の認識だな
C言語の場合でいうと、復帰値voidの場合サブルーチン的とか
ただ、Cでは厳密な定義はないのでどちらにしろあいまい、普通に検索したほうがはやそう
メインルーチンも関数だけどね
44 :
デフォルトの名無しさん :2009/03/03(火) 14:12:20
サブルーチンも結果を出力するやん、しばしば関数と同じ方法で
何度呼び出しても返す値が変わらないものをfunction と呼ぶのが正しいかって問いのほうが重要な気がする。 言語のfuncitonとかねw
関数とサブルーチンの定義は言語によって違い、 Cの場合は関数はあるけどサブルーチンは定義されてないという認識
3つの構造体をtypedefしたいのです。 typedef struct a{ int i; A *part_a; B *part_b; C *part_c; }A; typedef struct b{ long l; A *part_a; B *part_b; C *part_c; }B; typedef struct c{ long long ll; A *part_a; B *part_b; C *part_c; }C; コンパイルが通りません。 どうやればいいんでしょうか?教えてください。
typedef された型名を使わずに書くだけ typedef struct a{ int i; struct a *part_a; struct b *part_b; struct c *part_c; }A; typedef struct b{ long l; struct a *part_a; struct b *part_b; struct c *part_c; }B; typedef struct c{ long long ll; struct a *part_a; struct b *part_b; struct c *part_c; }C; かただかポインタなので、その構造体の内部配置が確定している必要はない # んだが、非ポインタで要素をもつ構造体の巡回参照は定義できたっけか?
typedef struct A{ int i; struct A *part_a; struct B *part_b; struct C *part_c; }A; typedef struct B{ long l; struct A *part_a; struct B *part_b; struct C *part_c; }B; typedef struct C{ long long ll; struct A *part_a; struct B *part_b; struct C *part_c; }C;
50 :
デフォルトの名無しさん :2009/03/03(火) 14:56:47
できるけど教えてやんない C を C++ っぽく使いたがる奴は C を Pascal っぽく使いたがる奴と同質 そんなガイキチ増えて欲しくない
typedef struct a A; typedef struct b B; typedef struct c C; struct a{ int i; A *part_a; B *part_b; C *part_c; }; struct b{ long l; A *part_a; B *part_b; C *part_c; }; struct c{ long long ll; A *part_a; B *part_b; C *part_c; };
>>48 ,49
ありがとうございました。両方ともコンパイルが通りました。
>>50 が出来るけど教えてあげないことって
>>48 ,49,51
とは違うよね。やっぱり
>そんなガイキチ増えて欲しくない そうだね、>50だけで充分だ。
55 :
476 :2009/03/03(火) 15:43:01
ありがとうございました サブルーチンは値を返さない実行っておぼえます void fu(int x) { printf("%d",x); } これがサブルーチンで値を返す int fu(int x) { return x; } とてもわかりやすかったですありがとうございました 42さん
サブルーチンはFORTRAN/BASIC用語 Cではサブルーチンという表現はしないほうが良い。
57 :
476 :2009/03/03(火) 16:05:08
これがサブルーチンで値を返すではなく これが関数で値を返すの間違えでした 独習Cにサブルーチンという表現が書いてありました
Cのmain()って一応関数だよな。 となるとCはサブルーチンのみから構成されるから サブルーチンという言い方を敢えてするのはおかしいわけ。
まだこいつに釣られているのか ヒマなことだ
60 :
デフォルトの名無しさん :2009/03/03(火) 17:20:27
Visual C++ standard edition academic SDKで組んでいます. long型の変数 xdim の値を文字列に変えて, 設定用ダイアログボックスの Edit Controll に 入れる事をしたいです. 以下のように組んでいますが上手くいきません. long xdim = 12; char *long2char(long num); LRESULT CALLBACK SetDlgProc(HWND hDlgWnd, UINT msg, .... ) { switch(msg) { case WM_INITDIALOG: SetDlgItemText(hDlgWnd, IDC_EDIT_X, (LPCSTR)long2char(xdim)); break; ... } char *long2char(long num) { char str[256]; sprintf(str, "%ld\n", num); return str; } 文字化け?した文字列が Edit Controll に入力されます. (LPCSTR)"12" とすると,文字列 12 が入力されます. ltoa 関数なども調べましたが,sprintf の方が良いと書かれていたのでこちらで書いています. どのように修正したらよろしいでしょうか?よろしくお願いします.
>>60 >char str[256];
>return str;
このstrはlong2char()から抜けた時点で消滅する。
メモリ割り当てるか、静的に確保 (long xdim = 12 の下とか) しないと。
63 :
デフォルトの名無しさん :2009/03/03(火) 17:43:53
バッファ自分でとって long2char に引数で渡瀬
>>476 サブルーチンは何度も利用する複数の処理をまとめておいたもの
関数は値を与えて処理して値を返すもの
Cは全部関数と呼び、Perlは全部サブルーチン(または関数)と呼ぶ
VBは値を返すものが関数プロシージャ、返さないものをサブプロシージャ
HSPは値を返すものは関数、返さないものは命令、gosub+ラベルで呼び出すものは
サブルーチンというように使い分けている
>>64 何処の誤爆だよ?
って言うか、用語ぐらいちゃんと調べろよ
>>65 476と名乗っているコテが張り付いているんだよ。用語が滅茶苦茶なのには同意。
結局476とやらは 「学びて思わざれば則ち罔し」 を地でいってるんだな
>>66 ああ、まだいるのか。
NGNAMEにしてるから気づかなかった。
69 :
60 :2009/03/03(火) 20:38:23
>>62-63 ありがとうございます.
実現できました.
まだまだ勉強が足りないようです.
70 :
64 :2009/03/03(火) 21:56:44
一応、情報処理用語辞典で調べて書いたんだが解釈が間違っているみたいだな あと476にもかまっちゃいけないルールなのね いろいろすまん
>>25 です。
>>31 さん
遅くなりましたが、本日試してみたところ無事実行されました。
ありがとうございました。
また、
>>26 さん、
>>28 さんもアドバイスありがとうございました。
>>70 ルールってことはないだろ。
ただ、オレは見たくないから見ないだけ。
はじめてのC 独習C C言語入門(ビギナー編) などいろいろありますが どの本がお勧めですか?(上記3つ以外でも結構です)
74 :
デフォルトの名無しさん :2009/03/04(水) 11:27:23
べつにスレ違いじゃねえだろうw オライリーのC++実践プログラミング。 C++って書いてあるけど、前半はCについて書いてる。 プログラミング上の作法なども書いてくれていて役立つ。 C++ならC++ プライマー。 詳細に綿密に系統立てて網羅してある。 あいまいだったり説明不足だったりは無く、 とても心強い。高いけど。
Cに関係ないことないだろうww
入門者に薦めたくないC言語関係の本ってある?
ってどんな本?
K&R
K&R読めたら上級者
ってか?
25年前のC初心者は全員K&Rで始めたわけだが。
翻訳者の石田晴久氏はK&Rでいくらもうけたのだろう?
88 :
デフォルトの名無しさん :2009/03/05(木) 01:28:10
VC++2005を使っています。ファイルオープンダイアログを用いて ファイルパスを取得したいのですが、拡張子の指定が上手くいきません。 void GetFilePath( ..., char *ext) { // GetFilePath(..., "txt"); として使用しています OPENFILENAME ofn; char szFile[MAX_PATH] = ""; char strExt[64]; if (!strcmp(ext, "txt")) { wsprintf(strExt, "Text file(*.%s)\0.%s\0All files(*.*)\0*.*\0\0", ext, ext); } ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(OPENFILENAME); //ofn.lpstrFilter = "Text file(*.txt)\0.txt\0All files(*.*)\0*.*\0\0"; ofn.lpstrFilter = strExt; ofn.lpstrFile = szFile; ofn.nMaxFile = MAX_PATH; ofn.lpstrDefExt = ext; ofn.Flags = OFN_FILEMUSTEXIST; GetOpenFileName(&ofn); 上手くいかない点1: ファイルオープンダイアログでのファイル選択時に Text file(*.txt) しか項目に表示されません。 コメントアウトした方の書き方なら、 All file(*.*) も表示されます。 上手くいかない点2: Text file(*.txt) のばあいでも、拡張子が .txt のファイルが表示されません。 All file(*.*) なら、全てのファイルが問題なく表示されます。 どこに問題があるのでしょうか?よろしくおねがいします。
wsprintfに渡した定数が \0 で文字列終了と認識されてる \0 入りの文字列は標準Cライブラリでは処理できない
ということを本当にチェックするのはどうればいいのか?
|で区切るんじゃないの?
>>87 25年前はC言語が日本に紹介されてすぐということで、
読者はプログラミング言語初心者でなくて、
他の言語を経験したC言語初心者が多かったはずだから
脱落者は少なかったのでは。
COBOLやOFRTRANからCは敷居が高かったけど
PL/Mとかシステム記述用言語からCはさくっといけたのでは
>>90 wsprintf(strExt, "Text file(*.%s)\0.%s\0All files(*.*)\0*.*\0\0", ext, ext)
wprintf("%s",strext);
while(*strext++);
wprintf("%s",strext);
while(*strext++);
wprintf("%s",strext);
while(*strext++);
とでもして、本当に編集されているかどうかデバッグ出力してチェックする。
IDE開発している人ならstrextをデバッガでトレースして前後で変化がちゃんと起こってるか
確かめてから質問するだろな
94 :
88 :2009/03/05(木) 02:10:29
>>89 ありがとうございました。
別の方法を考える事にします。
一応ですが、
>>90 さんとは別人ですので。
25年前のC初心者 と現代のC初心者 は、基本的な質が違う。
ところで前の話掘り下げて盛って埋め直すけど みんなが言ってた一週間は換算すると何時間なのだろう。
98 :
88 :2009/03/05(木) 02:18:56
すみません、
>>88 の「上手くいかない点2」も
よろしくお願いします。
拡張子が txt のファイルは確かにあるのですが、
ファイル選択フィールドは真っ白で
ファイルが1つも表示されません。
>>98 .txt => *.txt とかじゃないの
ちなみに元の処理でよくあるやり方は、例えば
>>91 が書いてるみたいな '|' などの文字を
\0 の代わりに置いて sprintf などで整形したあとで '|' を '\0' に置換したりするとか
>>99 ありがとうございます。
* を入力し忘れていたようです。
>>91 さんの書いている事はそういう事でしたか。
試してみます。ありがとうございました。
VC++2005でstrcpyを使うと警告が出ます。 代替関数としてstrcpy_sが用意されていますが、 返り値が(char *)である関数を使いたいのです。 何かあるでしょうか?
>>101 2行に分けて書くか、strcpyを使うか。
自分でつくるか
>>101 通常、strcpy()の戻り値を何かに利用するのは可読性を落とす原因になる。
この手の引き数をそのままスルーして返すタイプの関数全般に言えることではあるが。
それとstrcpy_s()は標準ではないから、警告をオプションで抑制するなどしてstrcpy()を使う方が一般的だろう。
strlcpy はまだ標準じゃないんだっけ?
size_tやんけ
>>96 「パソコンとはBASIC {が使える | しか使えない} もの」
という時代にCをやろうなんて考える奴は
プログラミング経験者でかつそういうのが好きな物好きしかいない。
マシン語つかってただろ
コンパイラとか個人で趣味で買える様な代物じゃなかったしね 無料でコンパイラが使えるとか当時考えもしなかった BASICかレポート用紙のアセンブラしかなかった
ハンドアセンブルですね? 相対ジャンプを手計算しなければいけないという…
tp://www.pro.or.jp/~fuji/mybooks/cdiag/index.html#mokuji ここで言われてることって今でも信頼出来る?
スレ違いじゃねえだろうよw
>>114 別に間違ったことは書いてなかったはず。
今ではもっといい方法があるかもしれないけど、
何がマズイか、は今も昔も同じだと思われ。
おまえらって C++に移行できなかった落ちこぼれだろ 今更Cで何してんだよ教えろよ
今更C++に移行ってw 117はC++で何やってるの?
今時Cを教えている大学って……
いまどきはJavaだよな!
goto でやってはいけないケースをスコープ外からスコープ内へのジャンプ以外にあれば教えてください
>>117 最近C++に移行できた「つもり」になっているんですね。
分かります。
>>117 ええ。C++を使わせてもらえるなら是非とも使いたいですよ。
>>124 ラベルつきbreakとかないんだから、gotoは使う場合あるだろ。
>>125 ねーよ
繰り返しで十二分に表現可能だしそもgoto自体ソース初見の際把握しにくいんだから使うべきではない
それは理想だけど、 多重breakとか例外とかない、制御構造が貧弱なCでは無理だろ。 分かりづらさはコメントで補うとして。
普通配列に添字演算子使うときって 配列の参照はその型の先頭オブジェクトへのポインタに成り下がるから それに添字分加算してその参照を取るから要素(オブジェクト)の参照になるんだよな。。。 とか頭で考えて(意識して)ますか? ときどきもっと簡単そうに考えてしまいそうで怖いんですが。
17.10: gotoは悪で絶対に使ってはならないという人がいる。ちょっとこれは行き過ぎではないか。 A: プログラミングの作法は文章作法と同じで、ちょっとした技能でガチガチの規則で明文化することはできない。 ただし書き方についての議論はもっぱらそういう規則を中心に回るようである。 goto文については、gotoを好き勝手に使うとすぐに スパゲッティのようにもつれた保守不能なコードになると昔からいわれている。 しかし、何も考えずに単にgoto文を使うことを禁止しても すぐに美しいプログラミングに結び付くとは限らない。 体系立てて考えないプログラマーならgoto文をまったく使わなくても 同じように複雑怪奇にもつれたコードを書いてしまう (たぶん代わりに妙に入れ子になったループやブール値の制御変数を使って)。 プログラムの書き方に関するたいていの意見や"規則"は規則としてよりは指針として考えたほうがうまくいく。 プログラマーが、この指針で何を成し遂げたいのか理解すればもっとうまくいく。 ある種の構文を無闇に敬遠したり、理解することなく規則に従うことは、 規則を使えば避けられることになっているのと同じくらい多くの問題を引き起こす可能性がある。 さらに、プログラムの書き方に関する見解は所詮見解にすぎない。 "書き方論争(style wars)"に引きずり込まれても、たいてい何も産み出さない。 一部の論点(質問9.2, 5.3, 5.9, 10.7で挙げたような)については お互い相手の意見を認めたり、意見が違うことを認めたり、議論を打ち切ったりすることはないように見える。
>>128 意識はしないよ
必要なのは蛇口をひねるとどうして水が出るのかを理解していることで、
蛇口をひねるたびにああこの水は水道管から圧力で押し出されてるんだなと考えることじゃない
そうですか ちょっと安心しました。
まあ厳禁て訳でも無いけど、goto無しであらゆるプログラムが作れるんだから、 ここで聞くようなレベルなら、使わないほうがいいな。例外はgotoより難しいから 使わない方がいいよ。プログラマの上澄みだけ集めるgoogleでさえ、例外禁止してるじゃん C++は昔より難易度下がった。20年前は一つの基底クラスから全部継承して作れって奴が、 いたもんな。
goto避けるために無駄に同じエラー処理を複数書いたりエラーフラグをつけるより gotoでエラーラベルに飛んだほうがわかりやすい時もある
ほとんど無いけどね。
>>132 Googleは例外が難しいから禁止しているわけではないだろ。
現に禁止なのはC++だけで、ほかの言語ではそんな決まりないはず。
エラー検知→早々に エラーコードつけてreturn 上位の呼び出し側に○投げ エラー検知→フラグ立てて→後で一括後始末エラー処理 エラー検知→goto で後始末へジャンプ→一括後始末エラー処理
フラグの乱用もプログラム破綻の原因とされてるね。
>>135 スレチだから短く書いたが、EHを使うことで発生する問題を回避する為に
googleでは禁止している。簡単に言えば難しいから。objective-c(c++)でも推奨してない。
カーネルとかはgoto必須だけどな
>>138 そういうことか。例外処理の概念を人間が理解することが難しいと言っているのかと思った。
gotoが多いコードの信頼性が無いことが往々にしてあることは 良く知られているが、gotoなくすとフラグを使いたくなる。 フラグはその数が増えるとたちまち扱いが難しくなる。 フラグ多用なコードの信頼性も決して高くはない。
>>138 >EHを使うことで発生する問題
例外ハンドラ内でさらに例外を投げてしまう可能性のある記述 とか?
判っててヤル愉快犯が最狂な世界なら非推奨で片付く問題が 判らない理解しないDQNが呼びもしないのに混ざってくるから 「禁止」とか極端な話になるんだよ
>>136 関数内でmallocやfopenしてたら呼び出し側に丸投げできないとかある
free、fcloseしてreturnを複数書くより最後にまとめておいたほうがいいと思うんだけどね
自分がgoto使うのはこの処理だけ
>>144 malloc / free や fopen /fclose のペアを呼び出し元に追い出す
ってのは無し?
ま、malloc/free はテンポラリ的な使い方もあるので、気持ちは十分jわかるw
いちいち貼るなよ ガキかてめーは
148 :
デフォルトの名無しさん :2009/03/06(金) 00:01:36
scanf("%d",&u[i]); と数字をうけるんですが 文字をいれるとクラッシュしてしまうんですが 対策はないですか?
fgetsしてsscanfしろ
enum型の変数にはそのenum定義の定数以外代入できないとあるのですが、 なぜかコンパイルが通ってしまうんですが何かおかしいのでしょうか?(環境はVC2005) ご教授尾長いします。 #include <stdio.h> typedef enum _E_TYPE { TYPE_A = 10U, TYPE_B = 20U, TYPE_C = 30U, } E_TYPE; void main( void ) { E_TYPE A; A = 1000U; ★ここでエラーになると思っています。 }
152 :
デフォルトの名無しさん :2009/03/06(金) 02:41:06
んなこともわかんねーのにプログラムなんてやんじゃねーよ
154 :
151 :2009/03/06(金) 03:05:46
>>153 ありがとうございます。
一応 VC2005、Eclipse(gcc)、H8系?(High-performance Embedded Workshop)でもやってみたんですが結果は同じでした。
ガードしたいんですが、こうなるとenumの意味があまりないような...
VC2005はC++なら一応コンパイルエラーになるけどな (ただしキャストすれば代入可能)
enumの目的は定数をシンボル化することと別種のシンボルを混同しないようにすることであって ある変数の値の取る範囲を制限することじゃない 要するに、そもそもenumにナマ値を入れるようなコードを書くな
C++とCでは挙動が違うのでは?
Cなら、たしかenumに任意の整数型を代入や初期化などしても、エラーが出ないが、 ただ、列挙体の定義時に書いてない値でそれをやって上手くいく保証はないはず。 現実的には、例えばE_TYPEの大きさが1バイトになって 1000が入らないなんてことが考えられる。
enumはintだろ、jk
160 :
121 :2009/03/06(金) 03:34:44
すいません 作法的な話じゃなくて やると未定義だとか未規定だとかになる例がほかにないか知りたかったんです goto 禁止とかでぐぐっても、作法の話しかでてこなかったので なんか宣言に関することであった気がするんですが思い出せないんです
空class経由でenumをクラインの壺みたいにして使う タイプセーフ enum があるけど そこまでするならカンマ式かなんかでassertを仕掛けた方が気が楽な様に思う。
162 :
デフォルトの名無しさん :2009/03/06(金) 06:48:01
> goto 禁止とかでぐぐっても、作法の話しかでてこなかったので www
本文無しは甘え
ポインタがNULLじゃないっていうときは if(p)で十分っていうけどif(p != NULL)のほうが親切じゃないですか? 最適化されて同じになるなら後者のほうが優れてますよね?
165 :
デフォルトの名無しさん :2009/03/06(金) 16:20:27
優れてません。それはただのオナニーです。簡素化出来るに越したことは無いのだからイチイチ余計なもの付け足すなよ おめーみたいな自称「おれって気配り出来るヤツだなあ」なクズが増えているからいけない
気配りありがとうございます
可読性を重視するか簡潔さを重視するかのスタンスの違いであって どちらが優れているとかどちらを使うべきとかいう問題ではない 強いて言えばプロジェクトグループ内でどちらを選ぶかの合意がありさえすればいい
if(p != NULL)は無いわ。 俺も最初の数ヶ月くらいはやってた覚えあるけど、 今となっては冗長以外の何者でもないw ポインタがNULLかどうかなんて結局、 山のようにチェックせにゃならんのだから。
ヌルポチェックをアチコチに記述しなきゃいけない設計技量を 鍛えなおすべきだな。
スタイル議論はよそでやってください
174 :
デフォルトの名無しさん :2009/03/06(金) 17:41:45
議論になってない、ただの罵り合いだ
175 :
デフォルトの名無しさん :2009/03/06(金) 17:43:38
なんか抽象クラスをインスタンス化できないらしいのですがどうすればいいですか? 派生クラスは無いのですが
>>175 ????
釣り?
抽象クラスがインスタンス化出来ないのは、設計上当たり前だろ?
178 :
デフォルトの名無しさん :2009/03/06(金) 17:50:19
その派生クラスの無い抽象クラスが型な引数をとる関数を使いたいのですが初期化?の方法がわかりません
>>178 引数に抽象クラスが使われるのは、その抽象クラスの派生クラスなら
何でも使えるということを明示する意味だヨ
抽象クラスじゃなかったら、その派生クラスを引数に与えても
コンパイルは通っても実行時にクラッシュする可能性すらある。
スレチの相手をする奴はスレチと同罪と、イギリスの元首相が言ってた
>>180 スレチでも答えてあげるのが優しさだと勘違いしてるのかもな
>>183 スレチと突っぱねるのがカコイイと思ってるんだろな
184 :
デフォルトの名無しさん :2009/03/06(金) 20:12:58
w
C言語で ポインタって どういうメリットがあるのでしょうか?
187 :
デフォルトの名無しさん :2009/03/06(金) 22:23:10
必要性を感じない人には「ない」
どんなCプログラムでもポインタを一切使わずに(ライブラリ関数は ラッパーを使う)書き直すことが出来るでしょうか?
ポインタを一切使わないとputs()さえ使えないので、役に立つようなプログラムは殆ど書けません。
できない。 ポインタを使わないというのは関数を呼べないというのと同義で、 つまりライブラリ関数すら呼べないしAPIも勿論使えない。 入力にも出力にもアクセスすることができない。
C言語では配列をなるべく使わずポインタに統一して扱うほうが 良いのでしょうか?
@Initialize { CutIn(YOUMU, name, "", 0, 0, 0, 0); SetLife(250000); SetTimer(60); SetScore(4000000); LoadGraphic(imgBoss); SetTexture(imgBoss); TMain; } @MainLoop { SetCollisionA(GetX, GetY, 32); SetCollisionB(GetX, GetY, 16); yield; } @DrawLoop { DrawGraphic(GetX, GetY); } @Finalize { DeleteGraphic(imgBoss); } // メインタスク task TMain { CreateShot01(GetX, GetY-150, 3, 90, AQUA32, 0); yield; setGraphicStop; }
>>191 初心者はとかくポインタを使いたがるけど、
配列の方がわかりやすい箇所は配列を使うべき
東方弾幕風をやってるんですが、 ↑のプログラムで TMAINに飛ぶ → 括弧内の処理を終える → yieldに飛ぶ となるのか。 TMAINに飛ぶ → 処理の途中でyieldに飛ぶ → MainLoop内の処理をする → Tmainの中のyieldの下からまた処理をする となるのか、よくわかりません どっちですか?
スレタイよめ、アホが
これってCじゃないんですかね?
197 :
デフォルトの名無しさん :2009/03/06(金) 22:57:37
>>191 おそらく、おまえさんの言っている「配列」のほとんどがポインタだよ
short型(16bit)のポインタをint型(32bit)のポインタに代入すると、場合によっては32bitで表すキリの良い値に丸め込まれるって本当でしょうか? これまでは特に気にしていなかったんですが、CPUのアーキテクチャによる?
下のコードで、コメントアウトした部分もその下の部分と同じ表示をしてくれると思っていたんですが、コメントアウトしたやつだと「timer2=0」と表示されてしまいます。これはコードが間違ってるんですか?? ちなみに私の環境はVC++2008、vistaです。(↓のコードはCです。include文は改行が多いと怒られたんで省略してます。) void main() { int i = 1; time_t t1, t2; time(&t1); // t1に、表示前の秒数を格納 /* 適当に時間経過させる */ time(&t2); // t2に、表示後の秒数を格納 // printf("\ntime1=%ld time2=%ld\n",t1,t1); printf("\ntime1=%ld ",t1); printf("time2=%ld\n",t2); printf("かかった時間は、%d秒です。\n", t2 - t1); return; }
環境依存かもしれないけどcintという処理系っていい?
>>198 バス関係でのアライメントの話をしているのか
near far huge ポインタの話をしているのか
どっち?
>>199 %ldが何型へのポインタを要求しているか考え直すこと
203 :
198 :2009/03/07(土) 00:39:56
アライメントです。 そういえば、構造体のメンバーが意図的に4Byte単位でパディングされていたような気がします。
>>202 ×何型へのポインタ
○何型
Vistaのtime_tって本当にlongで32ビットか?
time_tって普通signedじゃないのか? あとvistaのtime_tは64ビットだったような
time_tはCライブラリなのでOSでなくVCのバージョンによるね VC2005から変更されてるはず >_USE_32BIT_TIME_T が定義されている場合、time_t は長整数になります。定義されていない場合は、64 ビット整数になります。 %ld => %lld に直すのかな
>>199 は
printf("\ntime1=%ld time2=%ld\n",t1,t2);
と
printf("\ntime1=%ld ",t1);
printf("time2=%ld\n",t2);
とでt2の表示値が違う。ということだよね。
下の表示ではtime2はそれらしい値が表示されるが、上の表示ではtime2=0となる。
printfの問題だろう。もう一度確認してみ。
まあ何にせよ、ライブラリ定義型が何か特定のものであると 決めてかかってはいけないってこった
time_tが64ビットだとすると printf("\ntime1=%ld time2=%ld\n",t1,t2); のtime2はt1の上位32ビット(=0)が表示されてしまう ということか。
time_t同士を引き算するのも厳密には保証されないんじゃなかったっけ?
2027年より後を考えるのなら、こうするのが無難か。 printf("%lld\n", (long long) t1); そうでないならこれでも事が足りる。 printf("%d\n", (int) t1);
>>211 標準関数にdifftime()がある。こいつは戻り値がdoubleだ。つまり、こうなる。
printf("%g\n", difftime(t2, t1));
猫はWinAPI32使いであって厳密にはC使いではないので それ以外の環境では特に鵜呑みにしてはいけない
215 :
198 :2009/03/07(土) 01:10:39
アライメントをヒントに検索したら書いてありました。(使っているのはARMなので多分これです)
ポインタで検索していたので見つかりませんでした。
解決しました。ペコリ
http://www.yokogawa-digital.com/arm/support/faq/index.php?RDS-F-08 ※一部抜粋
◆アライメントされていないポインタ◆
コンパイラがより効果的なコード展開を行うために、
ARMコンパイラは通常の'C'のポインタがメモリ中でアライメントされたワードをポイントしていると想定します。
例えば、もしポインタ'int *'が1ワードの読み出しを行うとき、ARMコンパイラは命令生成時にLDR命令を使用します。
アドレスが4の倍数(つまり、ワードバウンダリ)であるとき、これは期待通りに動作します。
しかしながらもしアドレスが4の倍数でない場合、LDRは通常のアライメントされていないワードのロードイメージではなく、ローテートされた結果を返します。
実際のローテートされた結果はシステムのオフセットとエンディアンに依存します。
例えば、ポインタのロード開始アドレスが 0x8006の場合、0x8006, 0x8007, 0x8008, 0x8009の中身が結果として期待されることが予想されます。
しかし、ARMにおいてはこのようなアクセスは 0x8004, 0x8005, 0x8006, 0x8007の内容をローテートさせた結果をロードします。
(怖いっス)
216 :
199 :2009/03/07(土) 01:12:36
>>205-207 本に書いてあったんでlongだとばかり思ってました。
sizeof関数とtime.hで調べたらunsignedの64bitでした。すいません。
そして64bit整数のときの表示の仕方もわからなかったんですごく助かりました。ありがとうございます!
>>216 >212-213辺りにも注目。
>>215 int *へのshort *の代入についての問題では、バスエラーを起こす場合もあるので要注意。
要は、そんな代入はするなと言うことで。
>>211 そのとおり
time_tは規格上は算術型(整数型とは限らない)と定義されているけど
time_t同士を直接演算した結果が時間表現として意味のあるものである保証はない
>>216 本当にunsigned?エラー値とかどーすんだろー
-1をキャストして符号なし64ビットの最大値だろjk
sizeofは関数ではない
>>219 いちいちキャストつけなきゃならないのは面倒くさいがまあ規格に従うなら仕方ないか
符号なしなら%lluにしなきゃならんな(まだ問題起きないだろうけど)
223 :
199 :2009/03/07(土) 02:19:11
質問ばかりですいません・・・。 fprintf(fp, "%s", '\n'); と書くべきところを fprintf(fp, "&s", '\n'); とかいて実行してしまいました。 それに気づいて変更してもう一度実行してみたのですが、 エラーが出てしまいファイル書き込みが行えなくなってしまいました。 結構致命的なことをやってしまったんでしょうか? Cはなにかと破壊してそうなイメージがあるんで怖いんですが。。。 わかる方お願いします。
>>223 そのfprintf(fp, "&s", '\n')は問題のないコードだ。
寧ろ、fprintf(fp, "%s", '\n')は大問題だが。
だからprintf書式指定子の意味くらいちゃんと調べろよ
fprintfならまだいいが、コーディングは気を付けて行わないとそのうちディレクトリ配下のファイルを根こそぎヤってしまうぞ。
>>223 > エラーが出てしまいファイル書き込みが行えなくなってしまいました。
エラーの詳細を教えてもらわないと答えようがない。
228 :
199 :2009/03/07(土) 02:46:59
>>224-225 ありがとうございます。
よくみたら%sじゃなくて%cですね。
C言語に怖いイメージがあるんで、ついエラーが出ると焦ってしまって。
しょうもないミスですいません。
VC++2005でWAVEの扱いを勉強しています。 PCデバイスのマイクから録音したものを そのままスピーカから再生する というサンプルソースが置かれているサイトなどありませんでしょうか? マイクからの録音 や waveファイルの再生 の個々について扱っているサイトはいくつか見つかったのですが、 複合となるとよく分からなくなってしまいます。 例えば waveIn*** 関数の引数である WAVEHDR と waveOut*** 関数の引数である WAVEHDR は同じもので良いのか(もしくは同じでは駄目/なくては駄目) など、分からない事が多く、上手く実装できない状態です。 よろしくお願いします。
>>228 C言語は怖くないですよw最悪、プログラムが落ちることぐらいです。
ファイルを消したらアレだけど、ファイルを消すならVBでもできるし。
233 :
229 :2009/03/07(土) 02:55:01
>>231 先入観のみで語らないで下さい。恥ずかしい方ですね。
このスレには数ヶ月ぶりの書き込みで、内容で言えば初めてです。
>>232 誘導ありがとうございます。
235 :
デフォルトの名無しさん :2009/03/07(土) 05:50:36
>>234 死ね
ちなみに私は229ではありません
とりあえずほかの人が質問しにくくなるから、もちつけ
>>235 人に死ねなんて言えるおまえが死ねよ。
どうせそんな時間に書き込んでるんだから、
誰も困らないぞ?
今日もスレ違いと罵倒で埋まるのであった。
flagという名前のflag変数を使うのってどう思うよ?
頭悪いと思うよ
>>240 最近某スレでそういうのを書いた覚えがある身としては
使い捨てコードなら別にいいんじゃないかと答えてみたり
244 :
梅 :2009/03/07(土) 10:23:41
悩んでいます。 初心者の初心者ですが、C言語を始めて5つ目の問題で早々につまづいてしまいました。 下記プログラムは教科書どおりに入力しているのですが(メモ帳使用)、 何度やってもコンパイルエラーが出てしまいます。 エラーは「W8065」が出てきます。 (使用コンパイラは、borland5.5、出力はコマンドプロンプトです) 基本的な入力方法が間違っているのか、手持ちの参考書やWebサイトで調べても間違いが わかりません。 プログラムに熟練の皆様、何かご教授いただけると有難く思います。 ↓↓↓↓↓↓↓ココカラ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ #include < stdio.h > int main( void ) { int no; no = 75; printf( "noの値は%dです。\n" , no ); return( 0 ); } ↑↑↑↑↑↑↑↑ココマデ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
>>244 #include<>
の<>内はファイル名だから勝手にスペースを追加してはいけない
>>244 そんなマイナーなコンパイラのエラーの番号なんて誰も覚えちゃいないから
エラー番号じゃなくてメッセージを貼れよ。
本当にコンパイルエラーか? どう判断した? 警告じゃないのか?
stdio.h の前後に空白が入ってるね。 入れちゃ駄目
入れたい
250 :
梅 :2009/03/07(土) 10:57:25
244です。 >245さん ありがとうございます。 おっしゃるとおりでした。助かりました。 こんな間違いに気づかず悶々と悩んでた自分が恥ずかしいです。 >246さん はっ!ご指摘ありがごうとざいます。失礼しました。 「W8065」のエラー内容は、 「プロタイプ宣言のない関数'printf'の呼び出し(関数 main)」 でした。
>>245 へぇ*10
入れたことないので知らなかった
ファイル名の空白を無視する某OSでは>244でもコンパイルできてしまう罠。
ライブラリを使わずに平方根を求めるプログラムで double root(int num, int deapth) { double ret = 0.0; double unit = 1.0; int d; for(d = 0; d < deapth; ret += unit) { /* ぴったりですけど */ if(num == SQPOW(ret)) break; /* 越えたんですけど */ if(num < SQPOW(ret)) { ret -= unit; /* 一個前なんですけど */ unit /= 10.0; /* 位変えるんですけど */ d++; } } return ret; } を作りましたが、root(5, 100)とすると フリーズしてしまいます。どうすればいいでしょうか?
おっと忘れてました。SQPOW()は平方です。 #define SQPOW(n) n*nです。
>>253 恐らく、ret*retがどんぴしゃで整数にならずに脱出できなくなっていると思われる。
あんたのコンパイラは、実数値の等値性に関する警告は出ないのか?
つりだろ。 doubleで平方根を100桁調べようとか、ありえないから。
doubleはせいぜい十進法で15桁分くらいの精度しかない(IEEE 754の倍精度として)。 実際に動かしてみたけど、ret = 2.2360679774997889, unit = 1e-016になって、 このとき、ret += unitしても、retの値が変化せず無限ループに陥っていた。
アセンブラの人は、8bitで何桁でも計算しますよ
精度に制限設けようと思って悩んでいたところ
>>257 見てそれだと思い
ret -= unit;
limitter = temp = root;
unit *= 0.1;
limitter += unit;
if(limitter == temp) break;
ってやったらできました。ありがとうございました。
261 :
260 :2009/03/07(土) 18:00:19
rootじゃなくてretですね。
262 :
デフォルトの名無しさん :2009/03/07(土) 19:21:53
雑学レベルの質問なんですが、char型のポインタ、int型のポインタ、DWORD型のポインタ、short型のポインタ、 いろんなポインタがありますが、サイズはみんな共通して32ビットって本当ですか?char型ポインタでもDWORD型ポインタもサイズ同じ?
基本的にプラットフォーム/アーキテクチャに依存します。 32bit OSなら32bit、64bit OSなら64bitという具合です。 同一プラットフォーム/アーキテクチャなら同じと思っていいですが、関数ポインタだけは例外です。
昔はnear, far, hugeポインタなる物があってな… 今16bitの開発はどうやってるんだろう
265 :
デフォルトの名無しさん :2009/03/07(土) 19:37:16
> 同一プラットフォーム/アーキテクチャなら同じと思っていいですが、関数ポインタだけは例外です。 いまこれ書いてる俺の PC ではポインタが 32bit だったり 64bit だったりするし、 関数ポインタだけでなく const ポインタもビット数が違う環境もある
const を別扱いするメリットが判らん ROM化ならリテラル用のセクション構文用意すれば済む話じゃないか
C++ のconst変数に毒されてるのでイマイチ自信がないけど 配列変数もconstだよね 265 仕様で c言語って成り立たなくね?
>配列変数もconstだよね 違います
270 :
デフォルトの名無しさん :2009/03/07(土) 23:12:52
set_quoting_style (struct quoting_options *o, enum quoting_style s) { (o ? o : &default_quoting_options)->style = s; } この判定文の意味がわかりませぬ
C言語では条件式が必要な場所では常に 0と比較した結果が等しくなければ条件成立で そうでなければ不成立になる ポインタを0と比較すると0がヌルポインタに変換されるため 条件式にポインタを与えるとポインタがヌルポインタでなければ条件成立で そうでなければ不成立になる ?:演算子の意味がわからないなら教科書を読み直すこと
272 :
デフォルトの名無しさん :2009/03/07(土) 23:24:40
日本語おかしくない?
>>270 oがnullじゃなかったらo->styleにsを代入。
oがnullだったらdefault_quoting_options.styleにsを代入
>>262 ワードマシンだとchar*/void*だけ大きさが違うとは聞く。
そもそもワードマシン自体、伝説と化しているけど。
「宣言」ってなんすか?
ギレン総帥のアレ
C言語において0のポインタ値へのキャストは常にヌルポインタである と規定されているでしょうか? また(int)(void*)0!=(int)0となる処理系はあるでしょうか?
>>277 >規定
意味が判らない
>となる
ないよ
元がどんな値でも(int)とキャストした時点でintのとりうる値に削られる
でっていう
>>277 ポインタを整数にキャストできるのは、
整数の大きさがポインタよりも大きい場合に限らる。
しかし、空ポインタを整数にキャストしても0になるとは限らない。
整数をポインタにキャストできるのは、
1. 整数が定数の0である場合
2. ポインタを整数にキャストしたものを元に戻す場合
に限られる。
前者は空ポインタ定数を生成し、
後者では元と同じポインタに戻ることが保証されている。
これら以外の変換は定義されない。
285 :
デフォルトの名無しさん :2009/03/08(日) 05:30:45
どう違うの?
287 :
デフォルトの名無しさん :2009/03/08(日) 05:46:24
void *p; p = 0; /* 変換 */ p = (void *)0; /* キャスト */
誰一人として正しいことを言っていない… 質問者は正解が欲しければ規格スレに行った方がいい
>>277 > C言語において0のポインタ値へのキャストは常にヌルポインタである
> と規定されているでしょうか?
整数定数0をポインタ型にキャストすればヌルポインタになる。
その他の場所から整数0を持ってきてキャストしてもヌルになる保証はないし、
そもそもキャストできる保証もない。
> また(int)(void*)0!=(int)0となる処理系はあるでしょうか?
(void*)から(int)にキャストできない場合があるし、
仮に出来たとしても0にならないかもしれない。
>>283 > 規約されていない。(int*)0がフルアクセス可能なintポインタ値な
> 場合がありえる。
(int*)0はヌルポインタ。
>>284 最後の行が間違ってる(
>>285 )。
どう違うの?
>>284 は無知にもほどがある
初歩から勉強しなおせ
>>277 (void*)0はヌルポインターだけど、ヌルポインターをintにキャストしたものが
0になることは保証されていない(処理系定義)ということじゃないかな。
>>290 さんの言いっていることが正しい。
> C言語において0のポインタ値へのキャストは常にヌルポインタである
> と規定されているでしょうか?
JISX3010 6.3.2.3 ポインタ から
値0をもつ整数定数式又はその定数式を型void *にキャストした式を、空ポインタ定数
(null pointer constant)と呼び、いかなるオブジェクト又は関数へのポインターと
比較しても等しくないことを保証する。
> また(int)(void*)0!=(int)0となる処理系はあるでしょうか?
JISX3010 6.3.2.3 ポインタ から
任意のポインタ型は整数型に型変換できる。これまでに規定されている場合を除き、
結果は処理系定義とする。結果が整数型で表現できなければ、その動作は未定義とする。
結果はなんらかの整数型の範囲に含まれているとは限らない。
294 :
デフォルトの名無しさん :2009/03/08(日) 11:26:54
僕は15歳なのだが、向上心があればゆとり学力の僕でもC言語を勉強して理解できるかな? まぁ・・・がんばってみるか。
> 任意のポインタ型は整数型に型変換できる。これまでに規定されている場合を除き、 > 結果は処理系定義とする。結果が整数型で表現できなければ、その動作は未定義とする。 > 結果はなんらかの整数型の範囲に含まれているとは限らない。 勉強になるなぁ。
>>294 向上心は大事な必要条件の一つ。
15歳で興味を持ったなら俺より素質あるよw
15でCは早いだろ。まずはAぐらいにしときなさい
つまんね…
日にちを入力して、六日を金曜日とする月の曜日を出力したいのですが、
エラー E2291 youbi.c 11: } が必要(関数 main )
エラー E2141 youbi.c 11: 宣言の構文エラー(関数 main )
エラー E2139 youbi.c 11: 宣言に ; がない(関数 main )
警告 W8070 youbi.c 11: 関数は値を返すべき(関数 main )
警告 W8004 youbi.c 11: 'youc' に代入した値は使われていない(関数 main )
警告 W8004 youbi.c 11: 'youi' に代入した値は使われていない(関数 main )
警告 W8004 youbi.c 11: 'hiniti' に代入した値は使われていない(関数 main )
エラー E2190 youbi.c 11: 不要な }
エラー E2040 youbi.c 11: 宣言が正しく終了していない
エラー E2293 youbi.c 13: ) が必要
エラー E2293 youbi.c 14: ) が必要
エラー E2293 youbi.c 15: ) が必要
エラー E2303 youbi.c 16: 型名が必要
エラー E2451 youbi.c 16: 未定義のシンボル hiniti
エラー E2293 youbi.c 17: ) が必要
エラー E2040 youbi.c 18: 宣言が正しく終了していない
エラー E2190 youbi.c 19: 不要な }
*** 13 errors in Compile ***
↑のようなエラーが出ます。
どこを直せばよいでしょうか?
ソース↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8954.txt
char *youc[]={"月", "火", "水", "木", "金", "土", "日"}, note[3]={0}; printf("%d日は%s曜日です。\n",hiniti,youc[youi]);
301 :
299 :2009/03/08(日) 14:33:00
>>300 ありがとうございます。
文字の間にあったスペースは余計だったのでしょうか?
303 :
299 :2009/03/08(日) 14:39:40
>>302 char youc[]={"月",■"火",■"水",■"木",■"金",■"土",■"日"}, note[3]={,0};
はい、今黒い四角になっている部分です。
スペースは関係ないよ、* と , だろ。
まず、コンパイルには無関係。あってもなくてもいい。 コーディングスタイルとしては、個人的にはあったほうがいいと思う。 他のところでも、 #include■<stdio.h> int main(void)■{ int hiniti■=■0, youi■=■0; youi■=■hiniti■%■7; fgets(note,■2,■stdin); とする。個人的に。
306 :
299 :2009/03/08(日) 14:43:38
>>304 試してみたらそうでした。
ありがとうございます。
307 :
299 :2009/03/08(日) 15:01:29
別に問題はないよ あくまで習作としてならだけど
>>307 Cの仕様上はまったく問題ない
インタフェースとしてはあまりスマートではないが、まだ君が気にする必要はない
課題は自分でやれ 出来なくても、それが実力なんだからそのままにしとけ
日曜の夕方からイライラしてないでサザエさんでも見てろ
困ってます。教えてください。 1つはサウンドバッファ書き込み用のCALLBACK関数で、 もう一つはMAINスレッドにあるリードルーチン。 MAINスレッドにあるリードルーチンをある条件時に寝かせ、 CALLBACK関数側から寝てる状態を起こしたい処理なのですが、 何か良い方法ありますでしょうか? sigwait()を使ってできそうなんだが、通常処理なので signalは使いたくないのです。よろしくお願いします。
313 :
デフォルトの名無しさん :2009/03/08(日) 18:55:57
>>312 標準 C にスレッドサポートはない
環境依存スレで聞いてはどうだ
てかsignal使いたくないから別スレッドにしたんだろ?
バイナリで 00 00 01 EB のデータを 16進数1EB→10進数491にして491を取得したいのですがどう記述すればよろしい のでしょうか? ご教授よろしくお願いします
バイナリ?文字列じゃないのか? もしバイナリなら、エンディアン気にして入れ替えるかキャストで。 socket.hの関数使ってもいいけど
>>315 printf("%d\n", 1 * 0x100 + 0xeb);
318 :
315 :2009/03/09(月) 13:06:01
>>316-317 様
具体的にはこのようなことをしたいです
数値変換のほかに文字列への変換も行いたいです
バイナリ→数値の変換
byte hoge[] = {0x00,0x00,0x01,0xeb};
int temp;
〜処理〜
temp→491
UTF8のバイナリ→文字列への変換
byte hoge2[] = {0xE3,0x81,0x8A};
char temp3[1024];
〜処理〜
temp3→お
よろしくお願い致します
>>318 temp = ((hoge[0] * 0x100 + hoge[1]) * 0x100 + hoge[2]) * 0x100 + hoge[3];
memcpy(temp3, hoge2, sizeof(hoge2));
temp3[sizeof(hoge2)] = '\0';
ビッグエンディアンなら temp = *(int*)hoge; リトルエンディアンなら temp = hoge[0] << 24 | hoge[1] << 16 | hoge[2] << 8 | hoge[3]; 文字列ってのは具体的に文字コード何?
>>320 CPUとhogeのアライメントによっては落ちる素敵コードですね。
いいんだよ質問者が環境書いてないんだし
よくねえよ そういうときは環境に依存しないコードを書くもんだ
質問者が何がわかってないかもわからないやつだったのか・・・
325 :
315 :2009/03/09(月) 17:26:36
ありがとうございました
>>319 様の方法で期待通りの結果を得ることができました
質問です ポインタ同士の比較って使ってもよいのでしょうか? ある位置(終了位置)を超えたら最初(開始位置)に戻るというのを考えています。 現在++; if(現在 > 終了){ 現在 = 開始; }
そのポインタ同士がある一つの連続した領域、 要するに配列とかmalloc()した領域を指しているなら、 比較しても問題ない
即レスありがとうございます。 領域は開始位置(配列の頭)から終了位置(配列の最後)までで、 ++またはーーして、この領域間を出たときの判定なのですが、 「領域を出たとき」というのはまずいでしょうか?
それをやるために、一つ前と一つ後を指せることを保障してるんだっけ?
一つ後は指せるけど、一つ前は指せない。
#include <stdio.h> struct pixels{ unsigned int record_number; unsigned short record_length; }; int main(void){ printf("unsigned int: %d unsigned short: %d\n",sizeof(unsigned int),sizeof(unsigned short)); printf("pixels size : %d\n",sizeof(struct pixels)); return 0; } 構造体pixelのサイズが6バイトにならないのはなぜなんでしょう? intが4バイト、shortが2バイトなのに・・・。 環境はXP(32bit)、VisualStudio2005です。
>>332 構造体を二つ並べたときに、intが4byte境界にこなくなるから。
struct pixels をタンスと思いねぇ int が抽斗で中には 仕切り板でパンツ4ヶ入れれる様になってるんだ (32bit int仕様の抽斗な) int の抽斗2個付いてるのが struct pixelsな訳だ 余ってる仕切り2個に詰め込んでタンスの設置面積を節約する事も出来るが どこに入れたか都度2個ズラし云々で抽斗と仮想箪笥の対応を数えなきゃいけないのは面倒だろう?
>>336 たしかに、32bitで探すのが得意な人が16bitずつ探すのは面倒かもしれません。
こいういった細かい仕様(?)も、もっと色んな参考書を読んで勉強してみます。
仕様というかCPUの都合だなぁ 言語の本とかにはあまり載ってない気がする WindowsならAdvanced Windowsにそこそこ詳しく書いてあるよ
メモリーのアライメントといえば 昔のモトローラのCPUは奇数番地をアクセスしただけでバスエラーがでたな。 int *p = (int *)1; *p; <- ここでバスエラー
つーか、x86はバスエラー起こさず単純に遅くなるから始末が悪い。
いや、x86の場合もミスアラインメント例外もハードウェア処理でOSまで届かないよ MSDNでも、the operating system does not make the alignment fault visible to the application.だし 疑うならパフォーマンスモニタのsystemにミスアラインメント例外をチェックするところあるから見てみな
電卓あがりのバイトマシンだからな。
申し訳ない、英語苦手なんで、まさに >the operating system does not make the alignment fault visible to the application の記述から、OS自身がアプリから隠蔽する、と読んでた x64との記述の差異もあるように見えたので パフォーマンスモニタは見てみる
346 :
デフォルトの名無しさん :2009/03/10(火) 14:26:46
バイトマシンなのは電卓上がりだからではない
すまん、文字列を文字コードに変換したいんだけどどうしたらいいかな? 具体的に言うと「A」を「'A'」にしたいんだが。
日本語でおk
char* str = "A"; なら、 str[0] が 'A'
350 :
デフォルトの名無しさん :2009/03/10(火) 16:23:35
16ビット環境だとか32ビット環境というのは何のことですか?
そのOSが動いているCPUの環境
ビット幅
353 :
デフォルトの名無しさん :2009/03/10(火) 16:43:38
このコンピュータのCPUは16ビットだけど、 あのコンピュータのCPUは32ビットだ。 といった感じですか? メモリはよくそういう言い方しますけど、 CPUにもあったということですか? 例えば、僕のPCは プロセッサ:Intel(R) Core(TM)2 Duo CPU E8300 @2.83GHz 2.83GHz メモリ(RAM):4.00GB システムの種類:32ビット オペレーティングシステム となってますが、 CPUの単位はHzですよね? それならなぜ プロセッサ:32bit メモリ:XXXXXbit みたいに言わないんですか? 揃ってた方が分かり易いと思うんですけど・・・。
スレ違いどころか板違いだ
太陽まで距離と近所のコンビニまでの距離
Hzは動作クロックだろ。 Core2Duoは動作モードで16bitにも32bitにも64bitbにもなる(OSがモードを決める) って板違いだな
358 :
デフォルトの名無しさん :2009/03/10(火) 16:57:42
すみません。 確かに板違いですね。 ともかく僕のPCでintを宣言すると32bitになるってことですよね?
よほど変なコンパイラでもない限りは32bitだろうな
そう思い込んでVB触ってインデックスオーバー起こして泣くがいいさ
361 :
デフォルトの名無しさん :2009/03/11(水) 00:53:32
Visual C++2005 で、ヘッダファイルに以下のように記述したところ コンパイルエラーが出ました。 記述しているのはファイルの10行目です。 typedef enum {FALSE, TRUE} Boolean; エラー内容 sub.h(10) : error C2143: 構文エラー : '}' が '定数' の前にありません。 sub.h(10) : error C2143: 構文エラー : ';' が '}' の前にありません。 sub.h(10) : error C2059: 構文エラー : '}' 何が間違っているのでしょうか? よろしくお願いします。
>>361 たぶん、どっかに
#defnie FALSE 0
#defnie TRUE 1
と定義されている
>>何が間違っているのでしょうか? 今更真偽値を自分で定義しようとしていること。
364 :
361 :2009/03/11(水) 01:38:47
float a=1.0f などの変数の数値のあとにつける ’f’とか’e’ってなんていう意味があるんですか?
今どきfloatなんて精度も速度も低い変数を使う男の人って・・・
368 :
本日の名言 :2009/03/11(水) 09:00:01
367 名前:デフォルトの名無しさん 投稿日:2009/03/11(水) 08:55:03 今どきfloatなんて精度も速度も低い変数を使う男の人って・・・
368 本日の名言[] 2009/03/11(水) 09:00:01 367 名前:デフォルトの名無しさん 投稿日:2009/03/11(水) 08:55:03 今どきfloatなんて精度も速度も低い変数を使う男の人って・・・
370 :
本日の名言 その2 :2009/03/11(水) 10:00:45
369 名前:デフォルトの名無しさん 投稿日:2009/03/11(水) 09:29:16 368 本日の名言[] 2009/03/11(水) 09:00:01 367 名前:デフォルトの名無しさん 投稿日:2009/03/11(水) 08:55:03 今どきfloatなんて精度も速度も低い変数を使う男の人って・・・
本物のプログラマは浮動小数点など使わない。 整数型以上の精度がどうしても必要なときは固定小数点ライブラリを 自分で書いて使う
floatでもdoubleでも、書いているプログラムが必要とする精度が保証されれば それでいいんじゃない。
float a=1.0f ならまだいいが double b=1.0f とか書かれてると何がしたいんじゃゴルァ! とは思う
>>365 小数点のある数値リテラルは何もつかないとdouble型なのでf(F)をつけてfloat型にしている
DirectXでは普通にfloatを使うよ
>>372 言いたいことは分かるが、あんたの言う本物のプログラマの意味が曖昧。
必要最低限の制度があれば、あるいは使い方を守っていれば問題なし。
それを言い出すと、この世に完璧なプログラムはないため、本物のプログラマ
そのものが、あんたの価値観、世界観では存在しない。
それで、物申しておきながら、それは駄目と否定するくせに、では
どれが適切か?について述べない卑怯者もいる。
>>372 とか、本物のプログラマとか大きなことを言っておきながら
自分が本物のプログラマかどうかも示さないくせに。
どうせ、引きこもりだろ?
だから、入門編で暴れるなって。醜いだけだよ。
380 :
デフォルトの名無しさん :2009/03/11(水) 11:55:46
char c; c = '漢'; printf("%c", c); とすると、 実行するたびに <何も表示されない> 滑 と、交互に表示されるんですがどういうことですか?
>>380 「漢」が多バイト文字なのに1バイトしか出力しないから、端末エミュレータが混乱している。
文字ではなく、文字列として扱えばよい。
漢字は1byteじゃ入りきらないから
''は文字を括るが、1バイトとは限らない。 だからと言ってint c = '漢';としたところで巧い使い途があるわけでもないが。 従って、const char * c = "漢";とした上でprintf("%s", c);とすればいい。
384 :
デフォルトの名無しさん :2009/03/11(水) 12:16:02
javaは少しやってて 今Cやってるんですけど、 Cってややこしいですね。 単に漢字扱うだけなのに・・・。 今もこれが正しく動かず困ってます。 int main(void) { int num; int a; printf("整数を入力してください:"); scanf("%d", num); printf("何倍しますか?:"); scanf("%d", a); printf("%d倍すると %d になります。", a, (a * num)); return 0; } 表示 整数を入力してください:4 何倍しますか?:6 2147328000倍すると 271482880 になります。 初期化忘れかなと思って、最初に両方に0代入してやったら、 整数を入力してください:4 から操作不可能になった。 終わってる・・・・
そのコードは動かんよw 漢字以前の問題
>>384 scanf("%d", &a);
入門書はちゃんと読もうね
#include <locale.h> int main(void) { wchar_t c; c = L'漢'; setlocale(LC_ALL, "japanese"); wprintf(L"%c", c); } こうすれば正しく動くんじゃないかな
388 :
デフォルトの名無しさん :2009/03/11(水) 12:24:31
あ、本当だ。 何か変なのついてた。 こうなると&つけてないのに一応動いたのが不思議。
>>388 format系の可変引数関数は型チェックできないから間違ってても一応動く
>>388 動くがそのまま続けると大変な事になる可能性が高い
Cの入力や文字列操作って鬱陶しいですよね… scanfは使っちゃ駄目だったり この辺のテクニックが良くまとまった本とかサイトとかないですか?
>>391 scanf()を使っちゃダメなんてことないよ。
エラー処理してくれないから数値入力のときに数字以外の文字を入れられたら厄介だとか、
型チェックしてくれないからプログラマが気をつけるか警告レベルを引き上げて参考にしないといけないとか、
文字列の場合はバッファオーバフローしないように文字数制限をしないといけないとか、
その辺りに気をつけて使えばいいだけだから。
文字列をscanfで入力受付する場合、ちと問題がね・・・
>>394 >393が指摘している以外にどんな問題が?
要は、これで充分使えると思うわけだが。
char buf[100];
scanf("%99s", buf);
空白も含めて入力したいのなら改行で分離するとしてこれでいいし。
scanf("%99[^\n]", buf);
まぁ、printf()みたいに%*sで文字数指定できたら(少しは)楽だったとは思うけどね。
>>395 その通り、分かって使う人は問題ない
ときどき教科書丸暗記タイプの人がファビョるけど
あれは無視していい
初心者に使わせることは意見が別れるところか…
>>395 半端な例だすなよカス
それじゃまだ問題があるだろ
scanf()とかc=getchar(),getch()で文字入力しているプログラムは何がしたいのかさっぱり分からん 初心者って言葉を言い訳に使うな。プログラムを書く人間なら欠陥関数を使うな。以上。
getchar()の欠陥て?
fgetsとsscanfでいいよ。
getchar()は確かにガキ臭い
>>398 お前みたいなのを、口先だけって言うんだよw
自分は出来るみたいな、思い上がり
getch()はまた別の話になると思うんだが・・・何が言いたいんだ、こいつ? 知ったかぶりの意見ってのは、当てにならん。
そろそろ顔真っ赤にして「釣れた釣れたww」言い出しそう かわいそうだからこのへんにしとこうぜ
どの辺が足りないんだか 改行を必要とする部分くらいだろう
マジで同一人物・・・?
411 :
401 :2009/03/11(水) 17:56:21
俺は398じゃねえよ。 今更別人物だと言っても証明のしようがないけど。
んなわけねーだろ
414 :
401 :2009/03/11(水) 18:14:08
あ、あれ……?俺が二人・・・・・・?
さっき別のスレで俺の偽者も出たよ
久しぶりにCを書くことになったんだが... SRでなんでもかんでも初期化するな。と言われた...なんでだ?(´・ω・`) 少々古いマシンだがUNIX上で動かすプログラムなんで初期化処理が処理を重くする要因になるとは思えんのだが... 何か理由に心当たりがある人教えてくださいまし。
ソースレビューです。 あと、書き忘れたんですがオート変数の話です。
まあ、無駄な初期化はいらないんじゃね? カウンタや文字列を0で初期化してたり… 何か意図があるとき以外に初期化をすると、他に意味があるのかと思っちゃうし
まあ不必要に何でもかんでも初期化する必要はないわな
実機のCPUが豆キャッシュ
char buf[256]; memset(buf, 0, 256); // 不必要な初期化 strcpy(buf, "hoge");
>>422 まだこっちのほうがいい?
char buf[256] = {0};
>>422 char buf[256]={0};
とかするとコンパイル後のコードでは memset になってたりするね
>>416 ごくわずかな可能性としてハードウェアに移植する可能性があるとか
FPGAとかだとお手軽だしw
425 :
416 :2009/03/11(水) 19:42:49
世の流れは不要な初期化は要らないって流れなんですね。(´・ω・`) ちなみに言われたのは配列とかでなく、戻り値とかの int rc = 0; とかってのオート変数達です。 不定値は悪!という考えだったんで全部宣言と同時に初期化してました... 今から不要な初期化探して直すのか...めんどくせぇ。(ノД`) 貴重な意見ありがとうございました。 >424 いやぁ...そんな可能性微塵もありません。笑
自動変数を全部初期化するようなソースは見たことないな 処理速度の低下はほとんどないだろうけど 可読性は多少落ちるかな そんなソース見たら確かに「うぜっ」とは思うだろう
427 :
416 :2009/03/11(水) 20:04:39
>>426 組み込みやってた時に初期化初期化言われてて癖になったんですよ。
ポインタに限った話だったんかなぁ...
俺が書いたソース全オート変数宣言と同時に初期化してある。笑笑笑
428 :
デフォルトの名無しさん :2009/03/11(水) 20:13:10
俺は逆だな 組み込みをやってから不必要な初期化がますます嫌いになった
組み込みでもハードウェア寄りをやると不定値なんてくそ食らえだぜ ハードウェアリセット後は一瞬でも存在して欲しくない
defaultやelseパターン削って意味のある初期化にしてしまえばいいじゃん。 余計面倒くさいか
静的変数は必ず初期化されるけど、明示的に書く場合もある static char *p = NULL; if (p) free(p); 動的変数は初期化しないと何のコードも追加されないけど 0で初期化すると mov ebx, [addr] xor eax mov [ebx],eax というようなコードが追加されるかもしらん
432 :
デフォルトの名無しさん :2009/03/11(水) 20:29:30
試しにやってみたら int rc=0; とすると mov dword ptr [ebp-4],0 c7 45 fc 00 00 00 00 という7バイトのコードが追加された
>>434 最適化を有効にするともう少しましなコードになると思うよ。
0代入を0クリアしたり、不要な初期化と判断されれば消し去られたり。
なんにせよ、宣言時初期化をするかどうかは必要性で語られるべきであって 世の中の流れなんて曖昧かつ恣意的に用いられる概念で語るべきではない
必要性というよりコーディングスタイルかなあ
んー、別にどっちでもいいけど、初期化してあるとwatchしやすいかなぁ
初期化してあることによって、バグが顕在化しにくくなることもある。
初期化してないことによって、バグが顕在化しにくくなることもある。
とりあえず、無駄な初期化はだいたい警告で捕まえられると思う
>>440 あるか?
バグの直接の原因になることはよくあるが
バカだから相手しちゃダメw
初期化されてない変数を参照するとコンパイラに怒られるしな
・変数の初期化なんて、ハードウェアーじゃあるまいし不要なのでは? ・必要ない初期化を宣言部で初期化して、そのままリターン値になって 抜けてくるコードなんて、見にくくてダメダメだと思うのだが?
・そのままリターンで抜けてくるのなら必要な初期化だと思うのだが?
そのまま向けるコードなんて書かないだろ? 機能を記述するのに、広範囲になりすぎると思うが、 つまり、宣言部の初期化なんぞ期待しないで、 ある特定の範囲で、代入や演算を記述すると思います。
無理言うなw
>>442 初期化しない事によって、不定な文字列が表示されて、
bugに気が付くって話は、聞いた事ある。
しかし体験した事はないな。
>>447 一般的な長さの関数なら、宣言部で初期化しても、
十分見渡せるだろう。
VisualC++でフフフフはしょっちゅう見るな
VC++はDebugビルドするとフフフフで初期化されるんだっけ
x86のINT 3 だから飛び込んでも止まるしな。
大昔、RagnarokOnlineのモンスター名が8文字を越えると フフフフがついたことがあったらしいけど Releaseビルドでもフフフフで埋めるコンパイラがあるのかしらん
ないと思うがスレ違い。
多少話が横道にそれたくらいでスレ違いとか言う奴って何なの?死ぬの?
多少どころか、どうみてもCのコンパイラの話をしているんだから、 スレ違いとか言ってる方は、レスろくに読んでないとおもわれ・・・
ROはC++だがな。おまけに、ゲ製板というものもあってだな。ついでに、このスレはコンパイラの評価をするスレか? 伝聞で「あったらしい」なんて情報では掘り下げようがないぞ。
普通にコンパイラの話をしているのにどこがすれ違いなんだか
フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ
スレの本筋からはそれている Cは初期化されていない変数の中身になんか言及しないから しかしそんなに長々引っ張ったわけでもないのにムキムキするほうもどうかしている
ムキムキって…
オラなんだかムキムキしてきたぞ!
ムキムキマンのエンゼル体操を思い出して「ムキムキ体操」でググったら 全然違うものだった・・・
会社でググると危険な気がする...(−ω−;)
赤ん坊の皮を剥くってことですぜ。余りにそればかりヒットするんで呆れてしまった。
468 :
デフォルトの名無しさん :2009/03/13(金) 01:51:42
マルチスレッドに関する質問です。
こちらのサイト
ttp://www.kumei.ne.jp/c_lang/sdk/sdk_87.htm を参考にしてVC++2005、SDKで書いています。
リンク先では 親ウィンドウ 子ウィンドウ それぞれにおいて
_beginthread(*,*,*) でスレッドを起動していますが、
子ウィンドウを作った時点で親ウィンドウと動作は分離できているのではないのでしょうか?
例えば 子ウィンドウのプロシージャ関数内で無限ループを回していても
親ウィンドウは自由に操作可能(例えばメニューを開くとか)ではないのでしょうか?
よろしくお願いします。
試してから訊けよ。
試してから訊いています。 _beginthreadを除いて記述した場合 子ウィンドウの WM_CREATE にすら入りませんでした。 そういうものなのか、もしくは私がどこか間違えているのか判断したく 正確にはどういう動作をするべきなのかをお聞きしに来た次第です。 よろしくお願いします。
>>468 サンプルの構造
メインスレッド 親ウィンドウ("猫でもわかるマルチスレッド)、子ウィンドウ("子")
サブスレッド 親ウィンドウ上での描画
子ウィンドウは親ウィンドウと同じメインスレッドで動作しますから、
子ウィンドウのプロシージャで無限ループをしたら、親と子のウィンドウの
メッセージループが走らなくなり、両ウィンドウはブロックされます。
>>471 ありがとうございます。
現在、親スレッドにおいて メッセージ(msg) が大量に送られてくるアプリケーションを
作っておりまして、メッセージが送られて来る間は処理量が多く、
メニュー操作などができなくなってしまっています。
そこで、子ウィンドウを作って子ウィンドウ内でメッセージを受け、
親ウィンドウでメニュー操作をする、 と考えていたのですが
結局メインスレッド上でメッセージを受けて処理する事になるのですね。
何か良い策はありませんでしょうか?
>>472 ウィンドウを持つサブスレッドを作って、そのサブスレッドが処理すればよいのでは。
メッセージ送信をサブスレッドのウィンドウ宛てにしてもよいし、
それができなければ、親が受け取ったメッセージをサブスレッドのウィンドウにPostMessage
してもいい。
いちばん簡単なのは、メッセージを受けとった時にサブスレッドを生成し、処理をサブスレッドに
任せるというもの。
実現方法はいろいろあります。
>>473 試行錯誤して「メッセージを受け取った時にサブスレッドを生成し〜」
までたどり着けました。
が、他にもまだまだ方法はあるのですね。
現在の知識では「ウィンドウを持つサブスレッド」は見当が付かないので
最後に提示していただいた方法で実装してみます。
夜分にありがとうございました。
シングルスレッドでやる方法をきいてるのかと思ったが。
>>474 マルチスレッドプログラミングもあんたの見ていたサイトもWinAPIもC/C++初心者向けもスレがある。
あんたが書いているのがCなら必ずしもスレ違いではないが、ここで聞くのは余り適当とは言えないぞ。
入門編向きではないな マルチスレッド
マルチスレッドって「逃げ」だよな。
どこが?
480 :
デフォルトの名無しさん :2009/03/13(金) 16:36:09
通信系のプログラムなんぞシングルで書けと言われるとしんどいな
通信系でも非ブロッキング使えばシングルで書けるし マルチの煩雑さから開放されるメリットもある
むしろマルチスレッドの方が楽だと思うがなあ。
>>478 もそういう感触なんじゃないか?
それに、避けようがない局面もあるし (特にDBや
外部とのI/Fが絡むとな)。
せっかくシステムがスレッドやタスクを利用する反応を用意してくれてるのに わざわざ自前スレッドでラップしたりシステムのスレッド避けたりするのは 「逃げ」って言うより「苦行」と観るが
>>483 >スレッドやタスクを利用する反応
すまん。意味判らん。
>システムのスレッド避けたり
すまん。意味判らん。
つか、
>>482 であげた「避けようがない局面」てのは
スレッドがブロックして全体のスループットが下がってしまう
状況を言ってるんだが。
…そろそろスレ違いだと怒られる予感。
正規表現を覚えておくと、オラクルとかで役に立ちますか?
486 :
デフォルトの名無しさん :2009/03/13(金) 20:43:18
マジレスするとCには正規表現はかんけーない よってこのスレではまともな答えはかえってこない C信者は意外と心が狭いから注意するように
無知だな Cだって正規表現ライブラリ関数が使えるし exprみたいにそれ使ってるメジャーなコマンドもある
>>490 標準ライブラリに含まれてなかったら使えるとは言えない
492 :
デフォルトの名無しさん :2009/03/13(金) 23:36:57
493 :
デフォルトの名無しさん :2009/03/14(土) 03:42:12
>>473 さんが書いている
>ウィンドウを持つサブスレッド
というのは、子ウィンドウを作って WM_CREATE 時に _beginthread する
という事と同じでしょうか?
いや、それだと親ウィンドウと子ウィンドウは同じスレッド上で動くのですよね。
>>473 さんの書き込み内容からすると
「親ウィンドウ」 と 「”ウィンドウを持つサブスレッド”のウィンドウ」
は別のスレッド上で動くという事だと思いますが、
その様に実装するにはどういう書き方をすれば良いのでしょうか?
ググったり書物を見たりしましたが、目的とするものは見つかりませんでした。
よろしくお願いします。
>>493 Windowsのウィンドウはスレッドに属する。
ウィンドウプロシージャはウィンドウの属するスレッドで実行される。
さて、どのスレッドに属するかというと、CreateWindow(Ex)を呼んだスレッド。
またそういうことを
peekmessage でメッセージ取得に優先順位付けるだけじゃダメなのかい?
497 :
493 :2009/03/14(土) 04:25:42
>>494 親スレッドから起動した新スレッド内で
CreateWindow するという事でしょうか。
試してみましたが、 HWND chWnd;
chWnd = CreateWindow(...
でデバッグしたところ、 chWnd には値が入りませんでした。
CreateWindow の引数には WS_CHILD は入れず、WS_OVERLAPPEDWINDOW にし、
HWND の指定は NULL にした状態でのデバッグです。
仮に HWND の引数に、(親スレッドから新スレッドを起動する際に渡しておいた)
親ウィンドウのハンドルを指定したら、デバッグした途端にフリーズしてしまいました。
>>495 どういう事でしょうか?
猫スレに逝けよ。
はっきりと、スレ違いだ失せろって言われないと理解できないアホなんだろ
501 :
497 :2009/03/14(土) 04:52:24
すみません、メニューのIDに存在しないIDを入れていました。 NULLとしたらちゃんと子ウィンドウの WM_CREATE まで入りました。 が、この WM_CREATE 内で試しに無限ループさせてみたところ アプリケーション起動時にフリーズしました。 WM_CREATE: int i = 0; // デバッグでここにすら到達する前にフリーズしました while (1) i++; 別スレッドでウィンドウを作ったはずなのですが・・・
>>498-500 マルチスレッドについて議論されていたので
このスレで訊かせていただきました。
答えていただいた方のみに感謝します。
>>503 で、あなたは今時WinアプリをCde書いていたんですか?
505 :
473 :2009/03/14(土) 04:59:45
>>503 どこで質問するのがいいんですかね。
「Win32API質問箱」
「マルチスレッドプログラミング相談室」
あたりかなあ。
507 :
503 :2009/03/14(土) 05:07:14
>>504 C++⊆C と捉えていました。
すみません。
>>505-506 ありがとうございます。
マルチスレッドプログラミングスレもあったのですか…
スレッド検索が足りませんでした。
猫を参考にして書いてもいますが、猫とは少し違う話だと
思われます。ご提示ありがとうございます。
自分に都合のいいレスしか受け入れられないような奴はどんな分野でも伸びない。
すいません宿題手伝ってください。 要素数10個の整数配列を用意します。要素を入力し、バブルソートを用いて昇順にソートを行うプログラムを作成しなさい。 お願いします。
「手伝う」の意味わかってんのか
なんか「週末に適当なスレに丸投げするヤツ」って言葉遣いが似てるな。 ゆ○とり世代ってヤツ?
514 :
デフォルトの名無しさん :2009/03/14(土) 13:28:35
_,,....,,_ _人人人人人人人人人人人人人人人_ -''":::::::::::::`''> ゆっとり世代ってね!!! < ヽ::::::::::::::::::::: ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄ |::::::;ノ´ ̄\:::::::::::\_,. -‐ァ __ _____ ______ |::::ノ ヽ、ヽr-r'"´ (.__ ,´ _,, '-´ ̄ ̄`-ゝ 、_ イ、 _,.!イ_ _,.ヘーァ'二ハ二ヽ、へ,_7 'r ´ ヽ、ン、 ::::::rー''7コ-‐'"´ ; ', `ヽ/`7 ,'==─- -─==', i r-'ァ'"´/ /! ハ ハ ! iヾ_ノ i イ iゝ、イ人レ/_ルヽイ i | !イ´ ,' | /__,.!/ V 、!__ハ ,' ,ゝ レリイi (ヒ_] ヒ_ン ).| .|、i .|| `! !/レi' (ヒ_] ヒ_ン レ'i ノ !Y!"" ,___, "" 「 !ノ i | ,' ノ !'" ,___, "' i .レ' L.',. ヽ _ン L」 ノ| .| ( ,ハ ヽ _ン 人! | ||ヽ、 ,イ| ||イ| / ,.ヘ,)、 )>,、 _____, ,.イ ハ レ ル` ー--─ ´ルレ レ´
言ったでしょ? 丸投げ当然、ゆとり世代ってね
>>510 バブルソートしてくれる関数を出力するプログラムでも。
#include <stdio.h>
#include <stdlib.h>
static void print_bsort(int n)
{
int i,j;
printf("void bsort%d(int *a)\n{\n int b;\n",n);
for(i=0;i<n-1;++i){
for(j=i+1;j<n;++j){
printf(" a[%d]>a[%d]&&(b=a[%d],a[%d]=a[%d],a[%d]=b);\n",i,j,i,i,j,j);
}
}
printf("}\n");
}
int main(int argc, char **argv)
{
int n;
if(argc!=2) return -1;
n = atoi(argv[1]);
print_bsort(n);
return 0;
}
ある参考書に載っていた以下のプログラムについての質問です。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8970.txt この中の
while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
の箇所で、整数の 1000 ではなく、小数の 1000.0 を使うことに
何か意味はあるのでしょうか?
というのは、
1000.0 * (c2 - c1) / CLOCKS_PER_SEC の結果が小数になるとしても、
xは整数なので
1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x …(A:小数) の判定結果と
1000 * (c2 - c1) / CLOCKS_PER_SEC < x …(B:整数) の判定結果は
c2, c1, CLOCKS_PER_SECの値によらず変わらないと思うからです。
(ただし、(A:小数)の計算にかかる時間と
(B:整数)の計算にかかる時間は同じと仮定しています。)
またこれに付随して確認ですが、
(B:整数)に比べて(A:小数)の計算に極端に時間がかかる環境の場合、
(A:小数)の方がsleep関数の精度は劣りますよね?
(プログラムに関して、clock_t型はunsignedと同義の場合もあれば
signed long intと同義の場合もあると思いますが、処理系依存と考えてください。
CLOCKS_PER_SECも1000の場合もあれば
それ以外の場合もあると思いますが、処理系依存と考えてください。)
>>518 ミスった。下ね。
for(i=0;i<n;++i){
for(j=1;j<n-i;++j){
printf(" a[%d]>a[%d]&&(b=a[%d],a[%d]=a[%d],a[%d]=b);\n",j-1,j,j-1,j-1,j,j);
>>520 このプログラムを使って宿題出すと×食らうから使っちゃだめだよ。
>>519 必要ないと思うけど、オーバーフロー対策かも。
私の学校の課題もやってください。 キューを利用して、プリンタのプリントキューを再現したプログラム(以下に要点を記載)を作成しなさい。 "1”を入力するとキューにデータが追加され"2"を入力するとキューからデータが取り出される キューが満杯になったり、空になったりした際はその旨をメッセージで表示する。 また、以下の関数を作成し、使用しなさい。 vaio enqueue(int val)キューにデータを追加する vaio dequeue() キューからデータを取り出す vaio queue_print()キュー全内容を表示する 以上ですお願いします。
宿題スレ行けよ
いま宿題スレないんですよ
戻り値がvaioってちょっと面白かった。
>>526 すみませんvaioではなくvoidでした。
529 :
519 :2009/03/14(土) 17:24:07
>>521 オーバーフロー対策について詳しく教えてもらいたいのですが。
小数の 1000.0 を使うことでオーバーフローが防げるのですか?
doubleは整数より表現できる範囲が広いから
>>519 CLOCKS_PER_SECが1000以上だと実数と整数じゃ、判定がちがってくるんじゃね?
というよりほぼ100% 1000000だ
最適化オプションなしでコンパイルしても移項してループ用の定数作るだろ
536 :
デフォルトの名無しさん :2009/03/14(土) 20:08:21
538 :
519 :2009/03/14(土) 22:13:05
>>530 なるほど。わかりました。
ちなみに、1000.0 * (c2 - c1) / CLOCKS_PER_SEC における
1000.0 にはオーバーフロー対策以外の意味は
ないと考えてよいのでしょうか?
>>531 判定は変わらないと思います。
(間違っていたらどなたかご指摘ください)
【理由】
仮に CLOCKS_PER_SECが1000000、xが800とする。
このとき、プログラム実行後に
c1 = clock(); でc1に100000が代入されたとすると、
c2が899999以下の時までは
1000.0 * (c2 - c1) / CLOCKS_PER_SEC
1000 * (c2 - c1) / CLOCKS_PER_SEC
のどちらであってもwhile文の判定が成立するのでループが続く。
(なぜなら、c2が899999以下のとき
1000.0 * (c2 - c1) / CLOCKS_PER_SEC <= 799.999000 < x
1000 * (c2 - c1) / CLOCKS_PER_SEC <= 799 < x
であり、どちらもx==800より小さいので)
c2が9000000になると、どちらもwhile文の判定が不成立になる。
質問です JAVAには配列の大小を分別できるmax,minメソッドがあるけど C言語にはそういう専門な関数はないんでしょうか?
配列の大小? 文字列の比較ならstrcmpだが
数値の大小を比較する関数です C言語は文字列の比較の関数はみたことありますが、 数値の大小を比較する関数はみたことないので。
○プログラム例 /* MINMAX.C: __max関数、__min関数を使用して、2 つの数値の大小を * 求め、表示します。 */ #include <stdlib.h> #include <stdio.h> void main( void ) { int a = 10; int b = 21; printf( "%d と %d の大きい方は %d です。\n", a, b, __max( a, b ) ); printf( "%d と %d の小さい方は %d です。\n", a, b, __min( a, b ) ); } ○出力 10 と 21 の大きい方は 21 です。 10 と 21 の小さい方は 10 です。
#define min(a, b) (((a) < (b)) ? (a) : (b))
544 :
デフォルトの名無しさん :2009/03/14(土) 23:24:10
min(a++, b--)
545 :
デフォルトの名無しさん :2009/03/15(日) 00:30:14
Perlの一番使いやすい開発環境を教えてください。
スレ違い
エアコンが効いてて静かな屋内。
一番の開発環境は納期前日であること
>>539 なければ作るのがCです
用意されたものを使うしか出来ない人間には向いていません
550 :
デフォルトの名無しさん :2009/03/15(日) 12:25:10
> なければ作るのがCです ないのを確認せずに作るのは問題だがな
C言語プログラマカッコヨス 一々考え方がしっかりしていてまじ尊敬できる 俺も早くあなたたちみたいになる為に勉強しなくては
ならないほうが人生をエンジョイできる
素人には決して越える事の出来ない ポインタの壁を乗り越えた勇者さまだからな
>>551 C++プログラマも、ちゃんと極めている人はカッコイイよ。
Cプログラマーも、オブジェクト指向プログラミングがまともに理解出来ずC++が使えないバカじゃなくて、
その他の言語もばっちし使えるのにC言語を愛して使い続ける人がカッコイイ。
556 :
デフォルトの名無しさん :2009/03/16(月) 14:46:21
質問です。今、gnuのcatのスクリプトを読んでいるのですが main関数の中にあるinitialize_main関数が見付かりません。 cat.cでincludeされているヘッダーファイルしか読んでいませんので 更にヘッダーファイルのヘッダーファイルをたどっていけばたぶん見付かると思いますが めんどくさくてそこまでやる気がしません。 皆さんはそのファイル内に関数が見付からないときどうやって探していますか? またもしcat.cなど説明してくれているドキュメントがあれば教えていただきたいです。
grepは一昔前の環境を使うなら必須ツールの一つだな 今はIDEが追跡してくれるけどそれでもよく使う
g/Regular Expression/p
Global Regular Expression Print
>>556 > 質問です。今、gnuのcatのスクリプトを読んでいるのですが
~~~~~~~~
> めんどくさくてそこまでやる気がしません。
ためしにcoreutils持ってきて見たけど、src/system.hで /* Redirection and wildcarding when done by the utility itself. Generally a noop, but used in particular for native VMS. */ #ifndef initialize_main # define initialize_main(ac, av) #endif だとさw
つーかcat.cでもsystem.hはインクルードしてるのにな。
564 :
デフォルトの名無しさん :2009/03/16(月) 18:27:50
まさかコマンドでファイルの中の文字を検索出来るとは思いませんでした。。 ありがとうございました。
565 :
デフォルトの名無しさん :2009/03/16(月) 18:43:36
すみません。 正直、その行は見つけていました。書いておくべきでした。 (ac,av)の右側に処理も何も書いてないので 理解できなくて他のところに処理が書いてあるのだろうと思っていました。 cat.cの中でacとavにはアドレスを渡しているのですが この場合、どうなるのでしょう。
何も書いてないんだから コンパイルの時にはプリプロセッサの段階で消える
567 :
デフォルトの名無しさん :2009/03/16(月) 21:20:43
#ifndefはマクロ定義が行われていなければ#ifndef #endif内の処理をするんですよね。 だからこの場合はinitialize_mainがマクロ定義されていなければ #define initialize_main(ac,av)を定義する。 うーん。一応coreutilsディレクトリ以下と/usr/includeディレクトリ以下は全部 確認したけど#define initialize_mainなんてなかったしなんで #ifndef #define initialize_main(ac,av) #endifなんて処理するんだろう。 むずかしい。上記のディレクトリ以下以外にも読み込んでるファイルがあるんですかね
568 :
デフォルトの名無しさん :2009/03/16(月) 22:36:01
コンパイルオプションでdefineを指定する場合もあるから要注意だぜ -define initialize_main みたいにするコンパイラもある
569 :
デフォルトの名無しさん :2009/03/16(月) 22:36:21
引数に関しての質問です 123/456 のような形式で入力を受け取り それぞれを数字として解釈してから出力するコードを書きたかったのですが 以下のエラーが出てしまいます。 -- hoge.c:9: error: conflicting types for 'getnumto' hoge.c:9: note: an argument type that has a default promotion can't match an empty parameter name list declaration hoge.c:5: error: previous implicit declaration of 'getnumto' was here -- 「引数の型がマッチしない」と言われているので 自分がchar の型の使い方を間違えてるのだと思います。 でも、どう間違えてるかがわかりません。 char とは内部的には整数で表される 1byte の文字列だと理解してるのですが、間違えているのでしょか? 以下がエラーを起こすコードです。 #include <stdio.h> main (){ int n1,n2; n1 = getnumto('/'); n2 = getnumto('\n'); printf("%d/%d\n",n1,n2); } int getnumto(char s){ int n = 0; char c; while ((c=getchar())!= s){ n *= 10; n += c-'0'; } return n; }
570 :
デフォルトの名無しさん :2009/03/16(月) 22:39:47
>>569 言っていることはあっているけど、getcharはint型を返す。
なぜなら、charのどの値とも異なるEOFを返す可能性があるので、char型にできないため。
int getnumto(char s); 二行目あたりに↑これ入れる。
573 :
デフォルトの名無しさん :2009/03/16(月) 23:18:08
>>570-572 ありがとうございます。期待通りの動作をするようになりました。
プロトタイプ宣言の必須条件がわからなかったため
検索をかけて調べたところ
「関数の記述より前で使用されているなら宣言する必要がある」とありました。
ですが、今回書いたプログラムでは getnumto(char s) の下に
実際はもうひとつ最大公約数を求める gcd(int n1, int n2) を書き、
main() から呼び出していましたがエラーが出ませんでした。
http://ja.wikipedia.org/wiki/関数プロトタイプ >左括弧付きで式の中に現われた場合、その関数は暗黙のうちに int を返すものと判断され、
これは上記のサイトの内容から判断するに
引数が int のみで構成される場合は
プロトタイプ宣言は必須ではないためエラーがでなかった、ということでしょうか?
574 :
デフォルトの名無しさん :2009/03/16(月) 23:25:49
>>573 正しくないプログラムに対しては、エラーも警告も出る保証がない
エラーや警告が出ないプログラムが正しいとは限らないということだ
>>574 なるほど、ありがとうございます。
常にプロトタイプを忘れないように気をつけることにします。
>>573 関数宣言はかならずするようにしてるんで、プロトタイプなしで
関数をコールしたときの仕様って、よく憶えてないけど、
最初に
n1 = getnumto('/');
でコールしてるから、引数がintだと解釈されて、そのごに
(文字定数の型はcharじゃなくてint)
int getnumto(char s)
と定義してるから型がちがうってエラーになってるんじゃないの?
577 :
デフォルトの名無しさん :2009/03/16(月) 23:50:02
> 引数がintだと解釈されて ダウト
じゃあ何?
579 :
デフォルトの名無しさん :2009/03/16(月) 23:59:32
今日はもう寝るぞ
クスッ
整数は int として、浮動小数点数は double として、ポインタはそのままポインタとして 引数に渡る sizeof(int) != sizeof(void*) の系で、かつ可変引数の部分に NULL のつもりでリテラルの 0 を渡すとハマルぜ # NULL の定義が不安な場合には (void*)0 と明示的にポインタ指示することもある
事前にプロトタイプあるいは関数本体で「正しい」形式を与えていないかぎり、 いつも暗黙にintになる
英語ぐらい読め
585 :
デフォルトの名無しさん :2009/03/17(火) 00:41:47
教えてください。 新規ファイルへ書き込みを行ないたいのですが、fprintfで可能なのでしょうか?
もちろん出来る。 つーか printf でも何でも OK.
587 :
デフォルトの名無しさん :2009/03/17(火) 00:56:43
printfでもファイルへの書き込みが出来るんですか!? 勉強になります。 ありがとうございました。
588 :
デフォルトの名無しさん :2009/03/17(火) 01:02:13
すいません。教えて下さい。 文字列からstrstrにて検索した文字の書換えを行ないたいのですが、 一般的にはどの様な方法をとるものなのでしょうか? よろしくお願いします。
memcpy3つ
590 :
デフォルトの名無しさん :2009/03/17(火) 01:24:07
おーありがとうございます。
591 :
デフォルトの名無しさん :2009/03/17(火) 01:47:42
>>568 コンパイラオプション初めて知りました。
#ifndef initialize_main
これって関数ではなくて変数ですよね。仮にこの変数が宣言されていたら
関数の宣言がされないからエラーでますよね。。。
ここはスルーした方がよさそうですね。
皆さんありがとうございました。
変数だと…
これはひどい
594 :
デフォルトの名無しさん :2009/03/17(火) 02:20:29
すいません。変数といういい方はおかしいですね。
そもそも「変数」って訳自体が不適切だからな。
>>595 vaeiable=変数
適切だと思うが
だめだ、俺にc++は向いてないわ・・・
vaeiable の検索結果 約 119,000,000 件中 1 - 10 件目 (0.13 秒) こんなにバカがいるのか。。。なさけないわ
>>600 ただのタイプミスだろ
eとrはキーボードでとなり同士だから
それをわざわざgoogleで検索するバカもなさけない
ルイズ・フランソワーズ・ル・ブラン・ド・ラ・vaeiable
603 :
デフォルトの名無しさん :2009/03/17(火) 07:30:45
本当にfoo[10]って書いたか?
>>604 すいません…。
その部分だけのコードを書いたら通りました。
別の所が原因みたいです。
可変長配列を初期化しようとしてんだろ
607 :
603 :2009/03/17(火) 07:45:45
>>604 この状態で出ました。
回避方法はありますか?
main (){
hoge(10);
}
int hoge(int n){
int foo[n] = {0};
}
>>607 ・諦める。
・C99を使う。
・malloc()の使い方を学ぶ。
・c++でnewを(r
Cで動的配列だと・・・? int *pi; pi = (int *)calloc(n, sizeof(int)); free(pi); が定石じゃね
610 :
603 :2009/03/17(火) 07:56:54
>>608 int *foo = malloc(n*sizeof(int));
としたら確保はできたようなんですが
この場合初期化の {0} が呼び出せず
どうすれば良いのかわかりません…。
そこはcallocだろw
ANSI準拠じゃないけど、その程度の動的配列なら_allocaが適してる 初期化は memset(pi, 0, n * sizeof(int));
>>610 半可通の俺が答えてやんよ!
{0}はリテラル。コンパイル時に静的な処理を行う。
左辺がサイズを指定した配列として宣言してなきゃ、
コンパイラが初期化することができない。
どうだ! つっこみどころまんさいだろう!
>>591 もういないのかもしれんが、これは同じものを2回defineしないための処置
次の行のdefineでinitialize_main()の呼び出しそのものが消える
よってinitialize_main()関数はどこにもない。英語のコメントも読めよ。
ってVMS知らないと読んでもわからんか
616 :
デフォルトの名無しさん :2009/03/17(火) 10:51:03
>>614 >>615 ありがとうございます。いますよ。
消えるって言うのがよくわからんです。cat.cにあるinitialize_main(&wasu,&reta)
も消えるんですか?
コンパイル時に処理が書いてないから自動的に消してくれるということ?
まず消される運命なら書く必要ない気が(noopが関係してるのかな?)
もちろん英語の文だって翻訳しましたよ。でも
「リダイレクションとユーティリティ自体ですると、wildcardingします。
一般にnoopにもかかわらず、特にネイティブのVMSにおいて、使用されています。」
こんな翻訳され。しても意味がわかりません。
まあ冗談はおいといて上の行は単語の意味は知ってますが意味は理解できませんでした。
noop、VMSは知らなかったですね。
調べてnoopはなんとなくですがわかりましたがVMSはよくわかりませんでした。
どうやらもっとハードの方も勉強しなきゃいけないみたいです。
というわけで下の方もソースも読んでいってわからないところは無視するか
ソースを読むこと自体あきらめようと思います。
皆さんありがとうございました。
/* Redirection and wildcarding when done by the utility itself. Generally a noop, but used in particular for native VMS. */ ユーティリティ自身がリダイレクトやワイルドカードの処理をするための関数がinitialize_main()なんだろ。 通常は使わないが、VMSでは使うってこった。
ハードなんかちっとも関係ないね。通常は要らない関数ってことでしょ。
>>616 自分で訳すんだよ
この程度の英語が読めないようじゃだめだろう
勉強始めたいんですが、 C言語の無料で使えるコンパイラで良いのないでしょうか? 入門書買ったけど覚えが悪いのでコンパイラに実際に書きながら練習したいです。
621 :
デフォルトの名無しさん :2009/03/17(火) 11:58:15
英語の説明文ばかりだしやっぱり英語はやるべきですね。 学校の英会話教室行く&自分なりに勉強しようと思います。 こんな時間に返事をしてくれるということは皆さんニー・・・ 学生ですよね?院生でなければ自分と同じか下なのに自分なんかより色々な知識を持っていて羨ましいです。 ハードはいらないとのことですが最近はハード関連の本読んでないしひさしぶりに読んでみようと思います。
>>620 Windowsなら
VisualC++2008 ExpressEditionでいいんじゃない
>>621 悪いが社会人だ。つーか、他人の詮索すんなや。
英会話教室に行くこと自体は止めないが、資料を読むのが目的なら殆ど役に立たないぞ。
大抵、英文法の教え方の研修も受けていない「英会話の専門家」が相手なんだから。
>>620 CUIが苦にならないならcygwin、独特の癖のあるGUIが苦にならないならVisualStudio2008。
>>622 >>623 ありがとうございます!
パソコンWindowsで入力も苦手なので、
教えていただいた、
VisualC++2008 ExpressEditionかVisualStudio2008のどちらかにしようと思います。
>>620 実際に打ちながら勉強するのは普通だよ
特に初めてプログラミングをするなら必須であるといってもいい
>>624 StudioってのはC++やBASICやC#なんかのセットだからCやりたいのならC++だけでいいよ
つーかexpressエディションないだろ
XPのプロンプトで渡した引数ってShiftJISですよね? これをUnicodeに変換してwchar_tの配列に格納したんですけど、やり方がよくわかりません
Unicodeを扱いたいならJavaオヌヌメ
>>629 GetCommandLineW
CommandLineToArgvW
Visual Studio 2008 発売 1 周年を記念して、Visual Studio 2008 Professional Edition のアップグレード対象に Visual Studio 2008 Express Edition が加わりました。この機会に是非上位エディションへの移行をご検討ください。(2009 年 2 月 2 日)
>>629 int wmain(int argc, wchar_t* argv[])
635 :
634 :2009/03/17(火) 15:42:34
#include <windows.h> が必要です
>これをUnicodeに変換してwchar_tの配列に格納したんですけど、やり方がよくわかりません 変換もできて、格納もできて、なんの遣り方が判らないんだ?
>>635 wmainを使うだけならwindows.hは要らないぞ。
632ならともかく。
>>637 この前ぐぐってたら、telephacy?なんとかって掲示板が引っ掛かって、
外国にもエスパースレあるのかと、勝手に解釈して和んだ。
641 :
603 :2009/03/17(火) 19:59:59
locale設定がうまくいきません setlocale(LC_ALL, "") setlocale(LC_ALL, "japanese_japan.932") はうまくいったんですが、ためしに文字コードをUTF-8に変えてみようと setlocale(LC_ALL, "japanese_japan.65001") にすると失敗します なにがいけないんでしょうか?
エラーコードとか取得できるだろ。
お聞きしたいことがあるのですが、 共有メモリにアタッチした時に返ってくるアドレスが プロセス毎に違うのはなぜなんでしょうか?
プロセスごとに未使用メモリ空間が違うからだろう
>>644 同じ場所に読み書きしてるはずなのに・・・・って言う点なら
C上で(というかOS上で)扱うのはメモリの実際の番地ではない仮想アドレスというものだから
>>644 プロセスごとに仮想アドレスと物理アドレスの対応表を持っているからです。
648 :
644 :2009/03/17(火) 23:28:08
ありがとうございます。
作成した共有メモリ → 物理メモリアドレス空間
プロセス内でアタッチした共有メモリ → プロセス毎に割り当てられた仮想メモリアドレス空間
という認識でおk?
で、
>>647 の対応表を用いて書き換えてるわけですね。
仮想記憶でggr DOSの頃は物理アドレス叩けたんだけど・・・
プロセスごとに仮想アドレスと仮想アドレスの対応表があって さらに専用ハードウェアが仮想と物理アドレスを対応してるんじゃないの?
651 :
デフォルトの名無しさん :2009/03/17(火) 23:54:20
>>648 どんな環境か知らないけど、共有メモリってのはいわゆるファイルマッピングのことでしょ。
ファイルマッピングで調べてみ。
>>650 専用ハードウェアっていうかCPUが変換を行っている。
また、実行中プロセスのページディレクトリの先頭アドレスはレジスタに格納されている。
>>621 久々に見たらなんか失礼なことほざいているな。
自分がニート同然だから言ってるのか?
全く・・・。
>>653 詳しくないけどとりあえずそれは違う
普通にマザーに乗ってるからMMU
内蔵していたCPUもあるがな。
CPU内とは限らないだろうが マザーに載ってるってのはそうそう無いだろ。
だって、レジスタ経由でのアドレッシングで得たリニアアドレスを 即物理アドレスに変換しなきゃいけないんだぜ。 普通はCPUが持ってるだろうし そうでなくてもCPUと直結のコプロセッサ的なものに含まれるだろ。
CPUもマザーに載ってるから広義ではマザーに載ってると言えなくもない。
C言語の勉強法でソースコードをひたすら100回とか書けば覚えますか?
>>659 写して弄って理解する
ネットを巡ればソースコードはいくらでも手に入る
for(i = 0; i < 100; i++) puts(code);
>>662 人のコードを見る。Cの文法を勉強する。
この両面から攻めればヨロシ。
>>663 ありがとうございます。
やさしい方が多くてなんかうれしいなぁ
>>664 ポインタに触れる、何かが覚醒する。
それは自分の無能かC言語の可能性か。
C言語で2つのfloat型の最大値を求めたいんですが、 ひょっとして標準ではそういう関数は用意されていないんでしょうか? 自分でMax関数作らないとダメでしょうか?
max = a > b ? a : b;
fMax = (f1 > f2) f1 : f2;
666です 自己解決しました math.hをつかえばできるみたいですね
670 :
デフォルトの名無しさん :2009/03/18(水) 11:50:19
超初心者です。 borlandのCを使って、WindowsAPIをいじることはできますか? どうしてもC言語で音をいじりたいんですが、borlandでは無理ですかねえ。 Visual Cならできるんですか?
672 :
デフォルトの名無しさん :2009/03/18(水) 12:10:43
>>671 本当ですか!???
C++ではなくCから音をいじれるんですか?
音に関するAPIなんてあったか?w
674 :
634 :2009/03/18(水) 12:20:32
>>672 bcc55でもDirectsoundが使える
まあbcc付属のツールでdllからインポートライブラリ作れるから それ使えば他の環境と変わらないやりかたで作れるよ
というかどうしてbccだからAPIが使えないなんて思うんだ APIがなんだかわかってるのか? ああここで聞くなよ APIスレ行け
677 :
デフォルトの名無しさん :2009/03/18(水) 13:13:26
ありがとうございます。
>>676 入門篇なんだから仕方ないじゃないか。
ここはCの入門スレであってプログラミング全般とかWIN32APIとかの入門スレじゃありませんよ。
>>674 670のレベルだとwaveOutくらいで十分な気がする。
低レベルAPIは上級者が使うもんだと思うんだが
音を弄る、という時点で低レベルが必要では。 どの程度いじるのかにもよるが
682 :
670 :2009/03/18(水) 13:51:14
>>678 ですので、C言語超初心者の俺がC言語で音やグラフィックをいじるにはどうしたらいいかを教えてほしかったんです。
>>679 waveファイルを鳴らすやつですか?
そういうのじゃなく、加算合成で音色を作ったりするのがやりたいです。
Max/mspなんかよりもプログラミング言語で作ったほうが面白そうだから。
例えば一番単純な例だけど、ランダムでmidiの音を鳴らしたりするプログラムはどんなやり方で作れますか?
>>682 乱数生成はプログラム言語C標準ライブラリのsrand,rand関数
MIDI音源からの出力はwin32 APIのmidiOut関数
>ですので、C言語超初心者の俺がC言語で音やグラフィックをいじるにはどうしたらいいかを教えてほしかったんです。 まず初心者を脱してください 話はそれからです
自動車学校に来て交通情報を聞くようなものだな
>>670 超初心者だったら無理。
言語仕様とかライブラリとかそう言う問題じゃなくて経験的に無理。
そもそも初心者がCを選択する時点で 他の言語やってから来なさいw
必要な環境は必要に応じて導入すること。要するに、Windows用の プログラムを作りたいなら、あれこれ考えずにMS製の開発環境を 購入しなさい。他人に聞いても、その言葉の意味を理解するまでに 時間が掛かるでしょ?
つーか、midiファイルを作るだけならAPIなんて要らないけどな。
691 :
デフォルトの名無しさん :2009/03/18(水) 16:52:16
>>688 だってー
このスレちゃんと「入門篇」って書いてあるじゃんかあ。
Javaならいいの?かえって難しい様な気がするよ。
他のはN88basicしかやったことない。こんなの実用性ないし
とりあえず無料でできるやつで高機能なやつって考えたらCになった。
>>690 そうではなくて、アルゴリズムに基づいてmidiを鳴らしてみたいのだ実験的に。
たとえば、すごく簡単なのだと、演歌のスタイルをあらかじめプログラミングしておいて、そのスタイルに沿ったランダム音楽を鳴らすとか。
そうやってバッハ風のランダム音楽とか、シェーンベルク風のランダム音楽とかできるでしょ。
とりあえずそれで実験してみたいのだ。
Cを使って。
免許もってないのにドリフトしてーとか言われても困る。
昔そういうのやったなー 俺はC#からWin32APIを使ったよ Cよりは簡単
>>691 貴方のような人を「身の程知らず」といいます
>>691 だから、midiを鳴らすのは既存アプリでいいだろ。
免許のアナロジーで言うなら、宅配便の集配所まで原ちゃりで荷物を持っていくようなもんだ。
MIDIが何か分かってて聞いてるのか、よく知らないで聞いてるのかで 答えが大きく変わるなw
平日の昼間からageで無知な書き込みを連発してる時点で察してやれよ
前半部分は不要。
>>697 あげてるのはすべてつり。
WinAPIスレでも見かけたが、相手にされなくなって移動してきているんだろう。
size_tとかint32_tの_tってなんなの?
typedef
ただのtypeだと思ってたけど違うんだ
typeに一票
POSIX.1 (IEEE Std 1003.1)
709 :
634 :2009/03/20(金) 09:16:57
typedefで定義されていて本来の型は別にあるということか
wchar_tがC++の予約語ってのは笑止の極み
なんで予約語にしちゃったカナ
逆に、なんでCは予約語にしなかったかなと思っていた。 この前どこかで、long charとして入れようとしたけど期限がぎりぎりだからtypedefでお茶を濁したという話を見た。
ま、_tがtypedefされたものである印 の真偽はともかく 現状そう捉えて差し支えなさそう
SDLでゲーム作成の勉強で参考になる本ってありますか?
あんまりありません
自分で調べ、考えることが最高の勉強法です
CとC++とJavaって並行で学習するのって有害?
本人の能力次第
>>720 それぞれの違いを意識しながらやれば問題ない
>>720 既に習得しているプログラミング言語がない(プログラミング言語の学習自体が初めて)レベルならやめといたほうがいい。
>>720 JavaScriptと(C/C++/Javaの何れか)を同時学習するのは
中級者になる迄は絶対に避けたほうがいい。期間を分けてそれぞれ
独立に学習する。(行きつ戻りつせざるを得ないだろうが)
理由は変数という考え方が全然違うから。
どれか1本に絞らないと混乱するだろうな そういう質問をするレベルならJavaから入ったほうがいい
726 :
デフォルトの名無しさん :2009/03/21(土) 09:09:15
>>720 大丈夫
少なくともJavaと言われてJavaScriptを持ち出すようなアフォにはならんw
>>724 誰もJavascriptのことなんざ(ry
聞いとらん といいたいんだろうが、コンソールでチャットみたいにパタパタやって プログラムが出来ると考える奴はオカシイと考える人は テキストエディタでJavaScriptでコード書いてブラウザで表示させる ことでプログラミングやりだした世代以降確実に増加する予定 Win95発売当時高校生だった世代は既に30代に突入しとるw
こんばんは!
731 :
476 :2009/03/21(土) 20:35:04
if(!*name[i]) break; この条件なんですが、gets(name[i])で入力した値があったらbreakで終了するんですか? 本にはエンターを押したら終了っていうかんじで答えの場所にありました エンターを押したら終了ぜんぜんよくわかりませんが if(!*name[i]) break; 野意味教えてください
またお前か
何かよく分からんがマジレス if(!*name[i]) は if(*name[i] == '\0') if(name[i][0] == '\0') と等価 gets(name[i]) でEnterのみ入力すると name[i][0]に'\0'が代入される
734 :
476 :2009/03/21(土) 20:58:27
733さん すごいわかりやすい返答ありがとうございます \0が入るとは思ってませんでした 回答ありがとうございました
735 :
476 :2009/03/21(土) 21:30:21
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 100 void input(void); int menu(void); int i=0; char title[MAX][80]; char name[MAX][80]; char pubs[MAX][80]; int main(void) { switch(menu()) { case 1:input(); break; } return 0; } int menu(void) { int a; do{ printf("\n*******select*****\n"); printf("1,title\n"); printf("2,search\n"); printf("3,book search\n"); printf("input:");
初めて触ったのは横浜BitinnのTK85?です
737 :
476 :2009/03/21(土) 21:36:07
scanf("%d",&a); }while(a<1 || a>3); return a; } void input(void) { int u; for(u=i; u<=MAX; u++){ printf("\nname input (Enter quit):"); gets(name[u]); if(*name[u]=='\0') break; printf("title:"); gets(title[u]); printf("pubs:"); gets(pubs[u]); u++; } i=u; } これなんですが int menu(void) のscanf("%d",&a);で入力した aをreturnで返して その1 menu()でcase 1:input(); をやろうとするのですが うまく次の入力 図書情報を入れる場所までいかずにおわってしまいます gets(a); 本にはint u; u=atoi(a);とかいてあって わざわざ文字列の1aなど1などをatoi(整数)して渡すとうまく1の動作ができ入力できるのですが なぜか整数のintのuに値をいれて 1を渡すと 1の入力の場所がでて入力できずに終わってしまいます 何故終了してしまうのか教えてください
main関数を読むと menu関数を呼ぶ もし戻り値が1ならinput関数を呼ぶ 終了 main関数の中でループさせたかったのだろうと想像
scanfが改行文字をバッファに残してるからだろ
>>わざわざ文字列の1aなど1などをatoi(整数)して渡すとうまく1の動作ができ入力できるのですが >>なぜか整数のintのuに値をいれて 1を渡すと 1の入力の場所がでて入力できずに終わってしまいます さすがにこれは日本語でおkだろう
>>740 そんな御託より直接
C言語でおkだろう
板がわかんなかったからここで聞かせてくれ! C使ってゲーム作ってんだけどフリー素材が見つからない助けて!
#include <time.h> #include <stdio.h> //xミリ秒経過するのを待つ int sleep(unsigned long x) { clock_t c2, c1 = clock(); do { if ((c2 = clock()) == (clock_t)-1); return 0; }while(1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x); return 1; } int main(void) { printf("My name is Bohyou."); fflush(stdout); sleep(2000); printf("\rHow do you do?"); fflush(stdout); sleep(2000); printf("\rThanks. "); return 0; } 2秒ごとに表示される文が変わっていくようなんだけど Thanks.だけしか表示されないです。ぼすけて
> ((c2 = clock()) == (clock_t)-1);
ミスター墓標か
できるだけif文は{}でくくるようにした方がいいかもしらん 今回のように思わぬバグを招きやすい if (a == 0) b = 1; if (a == 1) b = 5; ↑のようなのはまだいいけど if (a ==0) return 0; ↑のようなのは間にセミコロンが入ったりw 命令を追加したときにバグりやすい
750 :
デフォルトの名無しさん :2009/03/22(日) 13:21:36
if(a == 0); { return 0; } 防げんやないかw
俺はいつも if(){ } と書く少数派だが、おかげでそういう間違いは起きない
2行以上なら
>>751 と同じ、1行なら改行せずにそのまま書く俺もそういう間違いはない。
どう改行しようが、そんな間違いはしない
俺も今は752派だけど if () { } だとifだけコメントアウトできると知ってちょっと心が揺らいでいる
>>746 > clock_t c2, c1 = clock();
これできるの?
c2が初期化されないだけ。
>>747 >>749 あっ、できました。何でifの後ろに;を打ったんだろう
それ以前に何でエラーにならないでコンパイルされたんだろう
文法上エラーじゃないもの 論理バグではあるけど
エラーは出んよな 警告レベル上げれば警告するコンパイラはあるけども
>>755 定数以外での宣言時初期化っていつからできるようになったんだ?
>>746 その内容で sleep() と名付けるセンスが許せない。
そだな sleep()は元々マルチタスク環境で他のCPUプロセスにCPU時間を 明け渡すって意味だもんな
ローカル変数ならできるだろ。C89でさえ。
>>767 確かに出来た
gcc -std=c89 a.c
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void){
int tmp=(srand(time(NULL)),0);
int i, data[]={rand(),rand(),rand(),rand(),rand()};
for(i=0;i<sizeof(data)/sizeof(data[0]);i++) printf("%d\n", data[i]);
return 0;
}
770 :
デフォルトの名無しさん :2009/03/22(日) 17:32:06
>>769 そういうときは、-pedantic-errorsつけるべき。
変数とか関数の名前ってコンパイルした後も実行ファイルのどこかに残るの?
>>771 ということは c89 では本来初期化時に関数の返値で初期化できるべきではない?
774 :
デフォルトの名無しさん :2009/03/22(日) 18:16:59
>>771 以下のコード、VC++でもBCCでも、
.cのままでコンパイル通りますけど?
gccの独自拡張は、配列要素の初期化だけでしょ。
int n0;
int func(int n);
int fnc(void) {
int n1 = func(1), n2 = func(2), n3 = 5;
return n1 * n2 + n3 * n0;
}
最初に提示された
>>755 のコードも、当然通りますね。
clock_t cx(void) {
clock_t c2, c1 = clock();
c2 = clock();
return c2 - c1;
}
当たり前ですけど。
宣言ってブロックの最初でしかできないはずだろ。 int main() { int a; a = func(); int b; /*これは駄目*/ return 0; }
>>776 そういう意味じゃなくて
-pedantic
もつけずに、できたとか言うんじゃないよ馬鹿って言う意味
778 :
デフォルトの名無しさん :2009/03/22(日) 18:25:44
>>775 c89ではそうだね
で、突然なんでそんな話を?
で、結局はC89でもローカル変数の初期化に関数つかっても問題ないでオーケー?
オーケー
おk 無知が騒いでただけだから
単純なコンソールプログラムを一時停止させ、適当な入力(任意の入力)を受けて続行する関数を書きたいんだが、なんか良いのない? #include <conio.h> getch(); だと環境依存で、 getchar() だとbcc5.5.1で死ぬ。
784 :
783 :2009/03/22(日) 19:58:41
上のは単にデバッグ用に便利だからって言う程度の考え。 (Cで無理ならC++限定でもおk。)
で、結局はC89でもローカル変数の初期化にその所属関数つかっても問題ないでオーケー?
>>785 無理じゃね?
制御文を前に置けないから無限再帰になるような
所属関数ってなーに?
789 :
デフォルトの名無しさん :2009/03/22(日) 20:16:57
790 :
デフォルトの名無しさん :2009/03/22(日) 20:18:11
Cの猛者の皆さん、こんばんわ。 教えてください。お助け〜 Unix上でPro*Cのプログラムをdbxでデバッグしたいんですが、 ソースがずれてるみたいなんです。 stop in main、run、listとやっているのに、ぜんぜんへんな場所が表示されます。 おそらくCのソースのつもりでブレイクしてるけど、Pro*cのソースが表示されている、 みたいなずれ方だなぁ、と予想しています。 こういう場合どういうぐあいにやると良いのでしょうか?
>>783 なんでgetcharが使えないのかわからないけど、fgets あたりが
簡単でいいのでは
#define wait_enter { char buf[10]; fgets(buf, 10, stdin); }
とか
>>785 これだと意味無いけどこういう奴のこと?
#include<stdio.h>
void countdown(int count){
int temp=count?(printf("%d\n", count),countdown(count-1),1):0;
}
int main(void){
countdown(10);
return 0;
}
795 :
785 :2009/03/22(日) 20:30:16
>>789 詩ね
>>791 氏ね
>>793 int f(int n){
return g(n)
}
int g(int n){
int x[]={f(0),f(1),f(2),....(略)};
return x[n];
}
でコンパイルとおるんだろうけど、倫理面
で問題があるような無いような
>>795 どうみても通らねぇよwwwwwwwww
で、「所属関数」って言葉は規格のどこにあるの?
799 :
785 :2009/03/22(日) 20:37:07
何故掲示板に質問する時でもC言語の規格に沿わなければならないの?
自分ルールじゃ相手に通じない可能性があるから
801 :
デフォルトの名無しさん :2009/03/22(日) 20:40:23
>>799 「所属関数」とは何かという問いに答えないから
答える必要がないという態度に取られたんだろ
それにおまえさんは C89 と言っていた
「問題ない」とは何に対して言ったんだ?
>>799 えええええ??????
マジで言ってんの!?!?
コンパイラですら、変数の初期化に関数を使っている場合、 その関数がその関数に依存していないか程度くらい解析して 親切にエラーを出してくれるんだろうけど このスレの回答者ときたら、頭がどんな石で出来ているのか知りたい もんだ...
804 :
デフォルトの名無しさん :2009/03/22(日) 20:53:20
>>803 だから、どのコンパイラだよ?
具体的に言えってw
所詮「所属関数と書くだけで誰でも理解してくれるだろう」と考える程度の お花畑な脳みそを持ってる人の御言葉ですから。
荒れてるな。 だからスルーしろと言ったのに…。
>>805 所属関数=その識別子が所属している関数定義スコープ
という意味だろw
この程度でいちいち揚げ足取らなくてもいいってw
それよか、「問題無い?」って
>>795 の表現は
コンパイラ作成者にとってか、コンパイラ使用者にとってか
で意味が相当変わってくるだろうけど、
まさかこのスレの目的性から考えるとどう考えても
Cコンパイラ使用者だろ
答えは、「問題あり。処理系依存。コンパイルが通っても
正しく動作することは期待しないほうが良い」
やっぱりお花畑だよ。どう見ても。
揚げ足じゃなくて、理解してもらえると本気で思ってるのが不思議すぎる
810 :
デフォルトの名無しさん :2009/03/22(日) 21:14:46
> 所属関数=その識別子が所属している関数定義スコープ 指示語は適切に使えよ 助け船のつもりか知らんがミイラ取りがミイラだ、それじゃw
ヒント:ゆとり
私は初心者ですが、初心者向けじゃない話がずっと続いていて質問しにくいです。 スレ違いな話題だと思いますので、他で議論してください。
814 :
デフォルトの名無しさん :2009/03/22(日) 22:08:10
>>813 聞きたいことがあるなら流れぶった切ってでも聞けばいいだろ
自分にできることもやらずに、人のせいにしてろよkz
815 :
802 :2009/03/22(日) 22:08:46
>>813 そうか初心者か。それはすまなかったね。
じゃあ初心者なら次のことをよく知っておけ。
>>799 みたいな大人になっちゃダメだぞ。
>>813 いいよ、聞いてくれ。
ここは2chだ。
>>813 入門者向けの話題かどうか判断出来てる時点で
少なくとも初心者じゃないの、出来ればここで
議論してよその初心者スレにはいって迷惑
かけないで欲しいと思いまつ。
あとスレタイトル見ればわかるように
入門者向けスレなので、初心者に常に
適しているとは言えない話題も議論
されても良いと思いまつ。
>>790 OracleとかのプリコンパイラのPro*Cのこと?
あれってSQL入った元ソースをCコードに
トランスレートする奴だよね。
デバッグ作業の時、元ソース見ても多分
ずれる。コンパイラはトランスレートされた
Cソース以外関知しないから。(関知したら
そのコンパイラはアヤシイ)
>>790 ということで、トランスレートされたCソースをデバッグすればいいと思います。
820 :
818 :2009/03/23(月) 13:27:23
C言語がつまらないのですが、どうやったらC言語の勉強が楽しくなりますでしょうか?
声を出して笑いながら勉強する
824 :
822 :2009/03/23(月) 17:33:52
>>823 そんな方法論があるとは驚きです!
早速今日からやってみます。
良きアドバイスをありがとうございました。
やってみたらとっても楽しく勉強できました。どうやったらC言語の 勉強をつまらなくできるでしょうか?
>>825 C言語に関する書籍の一文字一文字を丹念に読み解くとつまらなく勉強することができます
ためしてみてください
827 :
825 :2009/03/23(月) 19:49:18
>>826 ありがとうございます。けど
Java言語に関する書籍の一文字一文字を丹念に読み解いてもつまらなく
なりませんでしたが、C言語でも大丈夫でしょうか?
>>827 それは丹念に読み解くということを本質的に理解していないからですよ
心を無にして、世間というしがらみを開放し、
大自然の恩恵を体に浴びる感じで読み解くことを体得することからはじめなくてはいけませんね
あと10年がんばってください
void main(void){ } はC89では認められていないそうですが本当でしょうか?
多くの場合みとめられていません。
Q 11.12: mainをvoidとして宣言して「mainの戻り値がない」という警告を消すことができるか。 A: できない。mainはintを戻り値とし、(適切な型の)0個か2個の引数を持つと 定義しなければならない。 Q 11.14: void main()と宣言してうまくいかないわけがないと思う。なぜならmainからreturnする代わりに、 exit()を呼んでいるから。だいたい今使っているOSはプログラムのexit値/戻り値を無視する。 A: mainからreturnで戻ってくるかどうかは関係ないし、そのステータスを見るかどうかも関係ない。 問題はmainの宣言がおかしいと、呼び出し側(実行時のスタートアップのコード)が mainを正しく呼び出すことすらできないかもしれないことにある (呼び出しの規約にあるかもしれない不統一による)。 void main()と宣言しても多くのシステムで動くようである。こう書くほうが好都合だと思っていて 移植性についてあまり気にしていないなら、誰も止めはしない。 Q 11.15: それでは、どうして私の持っている本はmainをvoidと宣言しているのか。 A: そういう本は間違っているか、void mainがたまたま動くシステム向けに コードを書くことを想定しているかのどちらかである。
>>829 もし処理系がmain関数をvoid(void)と定義していれば
それも規格に合致する。
処理系がmain関数をvoid(void)と定義していなければ それは規格に合致しないかどうかですね。
834 :
デフォルトの名無しさん :2009/03/23(月) 22:26:33
mainの戻り値がintじゃない場合についても、標準に書かれているので間違いではないよ。
標準ライブラリを極力使うように心がけることはやっぱり 間違いが少ないんでしょうか? (仕様問題、設計問題、処理方式の問題、コーディングポカミスを除く)
>>835 そのとおり。コードは短いほどいい。
> (仕様問題、設計問題、処理方式の問題、コーディングポカミスを除く)
これ以外にあるのかしら?
標準ライブラリを使いさえすればコードが短くかけるんだって
長いのよりは短いのがいいだろ!
短く書くのに便利なコードは標準ライブラリの仲間と考えることは 良いことですか?
コーディングポカミスはコーディング量に比例するから 短いコードのほうがポカミスは少ない ちがうか?
多機能で大規模なプログラムはポカミスだらけでとても作れませんね。
>>845 おまい大丈夫か?
同じ多機能で大規模なプログラムを、だらだらと2万行で作るより、きちんと設計して
1万行で作ったものの方が、コーディングにかかるコスト、テスト&デバッグのコストが
小さくなるということだよ。
3項演算子の真の戻り値に3項演算子が入っていて 更に偽の戻り値にも3項演算子が入っていて、さらにその3項演算子の中にも3項演算子あって 設計して行数を少なくしました、キリッ! とか、目に浮かぶw
最近全角で草生やす低能を良く見るけど春だから?
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
850 :
790 :2009/03/24(火) 07:06:43
>>818 はい。そうです、オラクルのPro*Cです。
やっぱりずれるんですね。
トランスレートされた奴をソースとして指定すればよいのですね。
ありがとうございます。
ちょっとオプションが分からないので調べてやります。
分からなかったらまたお聞きするかも・・
ありがとうございました。
851 :
790 :2009/03/24(火) 07:07:52
あ、オプションっていうのは、dbxにソースファイルとして指定する方法のことです。 pathmapって奴なのかなぁ。。 分からなかったらまたここに聞きに来ます。
819にお礼はしないの?
べつに
>>848 全角も半角も関係ない。草生やしてる段階で低能だろ。
#include <stdio.h> void main() { while(1) printf("w"); }
819は無視されたので怒ってしまいました、
857 :
790 :2009/03/24(火) 10:42:58
>>852 礼を言うほどの回答ではないのでしません
ずばりベストな回答じゃあないかw
無責任な傍観者的表現の818 の回答なんて無視無視.推測でしか書いてないだしょ その点819の回答は潔い。余計な文は 一切無し。すっきりと短くコードしてる。 818が認めているように、偉いのは819。 礼を言うのは819にね。(もう今更求めないけど)
また頭の悪いやつがわいたw
strcmp( )の実装を調べてたんですが
http://www.bohyoh.com/CandCPP/C/Library/strcmp.html /*--- strcmpの実現例 ---*/
int strcmp(const char *s1, const char *s2)
{
while (n && *s1 && *s2) {
if (*s1 != *s2) /* 等しくない */
return ((unsigned char)*s1 - (unsigned char)*s2);
s1++;
s2++;
n--;
}
if (!n) return (0);
if (*s1) return (1);
return (-1);
}
の変数 n が突然出てきているのがよくわかりません
これはなんでしょう
>>790 がそもそもスレ違い気味と感じたのと、
>>819 は尤もな意見だってのと
俺自身 Pro*C は解るが dbx はあんまし知らないって理由で
スルーしたんだが、こんだけ引っ張られるとは思わなんだ。
>>818 >コンパイラはトランスレートされた
>Cソース以外関知しないから。
Pro*C のオプションに LINES=YES を指定すると
生成されたCコードに、プリプロセッサディレクティブ #lines が
追加され、変換前のソースファイル名と行番号がデバッグ情報に
取り込まれる。
…かも知れない。
(少なくとも MS Visual Studio ではそうなる)
strncmpからコピペして消し忘れたとか、そんなとこだろうw
ってstrncmpの方見たら・・・
前にもこのやりとり見たなw
ご意見しようと思ったが連絡先がないな
868 :
790 :2009/03/24(火) 21:51:11
すみません。。お礼しませんでした。。
>>819 さん、大変失礼いたしました。
ありがとうございました。
>>862 さん
ありがとうございます。
ためさせていただきます。
スレッド汚してしまってすみませんでした。
今どきPro*Cとかどんだけー Oracle Power Objects使えよ
871 :
819 :2009/03/25(水) 10:36:03
>>868 いえいえ、別に>818をおちょくりたかっただけですから。
872 :
デフォルトの名無しさん :2009/03/25(水) 10:39:21
C言語での質問です。 以下のソースなのですが、 コンパイルは通るが、実行時にエラーがでます。 どなたか、エラー原因を教えていただけないでしょうか? よろしくお願いします。 =============== #include<stdio.h> #include<string.h> int main() { int n = 0; char *str; sprintf(str,"ほげほげ"); printf("%d",n); return 0; } =============== エラーは実数を出力する際にでているようなのですが・・・・
char *str; ここでポインタを宣言してるが、このポインタがどこを指すのか書いてないから sprintf(str,"ほげほげ"); ここででたらめな場所に"ほげほげ"を書き込んでいる。
>>872 strが就職難民なので、得体の知れないところに"ほげほげ"をコピーしてしまっています。
strには、"ほげほげ"が入るだけの土地を与えてください。
つまんね
char *str; ↓ char str[256];
何でstring.hをインクルードしてんの?
>>876 256はなんですか?魔法の数字ですか?
特に意味はない 単にキリのいい数字なだけ
880 :
872 :2009/03/25(水) 11:07:50
>>873-874 回答ありがとうございます。
ポインタの指す場所が不明だという部分はわかったのですが、
それがなぜ、printf("%d",n)を実行したことでエラーとなって表れるのでしょうか?
逆に言うと↓を以下のようにすると問題なく実行できてしまうんですが・・・
>sprintf(str,"ほげほげ");
>printf("%d",n);
↓
sprintf(str,"ほげほげ",n);
printf("%s",str);
>>877 sprintf関数はstring.hにあるのかと思ったら
stdio.hにありました。ただの勘違いです。
881 :
872 :2009/03/25(水) 11:10:26
>>880 すいませんコピペミスしました
× sprintf(str,"ほげほげ",n);
○ sprintf(str,"ほげほげ");
>>880 でたらめな場所に書き込まれるんだから
たまたまうまくいくときもあるだろうし、あとでおかしくなることもある。
どこかの土地を不当に占拠した廉で訴えられるかもしれませんし、不発弾を踏んでしまうかもしれません。
884 :
872 :2009/03/25(水) 11:35:51
>>882-883 つまり、定義のあやふやな文字列があることで
他の出力にも影響を及ぼすかもしれない、ということですか
回答いただきありがとうございました
変数が実際の土地だとしたら、ポインタってのは土地の住所が書いてある、アドレス帳のような物だ。 アドレス帳に適当な住所を書いても、自分の土地じゃないと住むことが出来ない。 警察を呼ばれる(エラーが出てくれる)か、たまたま空き地だったので何も起きないかは、 使用しているOSと、その時の状態によって予測できない。 って、この前小6の娘の説明したら、理解してる風だった。 いつか娘マクロが、コーディングしてくれるようになるといいな。
マクロがマグロに見えた 順調に病んでいる
ポインタなんか理屈で覚えるより 体で覚えるべし
コーディングにおいて、ローカル定義された変数は、 一律一括に初期化するコードを入れなければならないって コーディング流儀って美徳ですか? 変数に値を設定するステップが、プロシージャの重要なステップに なっているようなコードって無駄ですか?
健全なコードって、宣言した変数に値を設定せず、そのまま使うことですね。
必要なタイミングで代入もしくは初期化するのが健全なコード
未初期化変数を使っちゃうかもしれないから、とりあえず0で初期化しておく。 意味がないだろう、やっぱり未設定のまま使うんだろうし。
>>889 「初期化」を整数なら0にすることと言う意味に定義してるなら、その定義がおかしい。
ロジックに対して必要な値にしておくのが「初期化」。
「プロシージャ」が何を指しているかは知らん。
>>889 ロジックと区別される、セキュリティ対策(バグが発生した場合に
スタックの上に残っているデータから余計な情報が流出する事故
を防止したい場合)や無限ループ突入型のバグ(昔の環境ではリ
セットしなければならない場合もあり、作業の遅滞の原因だった)
防止の為の一括一律初期化は一昔前の貧弱なマシンでの集団開発
作業ではルールだったし、高い事故防止効果を持っていた。
今でもある程度それは有効。Cのようにネィティブコードで実行される
アプリの場合、プロセスを強制終了させると、Windowsとかではリソ
ースリークが起こらないとも限らないからそれが原因になって不安定
になるというのは余り変わってないから。
ただロジックとは区別されるべき初期化はロジックの可読性を損なう
として嫌う人もかなり出てきてるのは、専門プログラマ以外の
人もコードを読んだり資産の一部であると考えるようになってき
ていることが関係してるんじゃないか?
- Cのように → + Cで書かれたアプリのように
898 :
デフォルトの名無しさん :2009/03/25(水) 14:27:27
>>896 セキュリティ対策なら逆だろ
ゼロクリアは初期化時ではなく使用終了時であるべき
>>898 残念ながらすべてのライブラリ関数がそうしてくれてるとは
限らないから
やっぱり最初じゃないと
>>899 残念ながらすべてのライブラリ関数がそうしてくれてるとは
限らないから
やっぱり最後じゃないと
間を取って真中で
>>899 自分がアホなこと言ってるのに気付いてるかな?
>>899 標準ライブラリなど、ソースが無いかあっても書き換えることは許されない
ような関数を呼び出した直後に呼び出されたユーザー関数内では、
スタックの一括初期化による「�清掃」は、関数の先頭で
やらないと自分の関数のバグで、情報が流出してしまうかもしれないので
やるのがマナーというのなら他の関数が自分の関数終了後に呼び出される
ことを想定して、使用した変数でデータを残す必要が無いものは、
同様に「清掃」をしておくのもマナーになるかも知れないな。
保養所とかの共有物の共同利用とかに比べて常識がちょっと違う感じ。
また出た
♪春なのに〜
// / / パカッ //⌒)∩__∩ /.| .| ノ ヽ / | | ● ● | / | 彡 ( _●_) ミ まピョーん☆ / | ヽ |∪| /_ // │ ヽノ \/ " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
>>902 そしてあんたは、自分が一番アホだと気づいた方が良い、周りの目を気にして
プログラミングってつまらないんですけど、どうすれば楽しくなりますか?
笑えば、いいと思うよ
何か作る目的を持って打ち込むこと。まぁ、ぶっちゃけ、本当に詰まらん作業だよ・・・ だいたい、自分がこの世に生まれてプログラミングをし始めて何年経った? 死ぬまでそうしているの?悪い、俺はそいつらを利用して金儲けすることにしたわ。 だるい。PCの前であーだこーだ必死に考えて、無機質な物体を相手に必死になって ムキになって、馬鹿らしいわ。そんな詰まらない人生を送りたいとは思わない。 なんで理系に進んだんだろう?別に生まれたときから理系に進学する予定はなかった。 高校で理数科に所属したがために、英語がやりたかったのに数学を主に学ぶ選択肢を 選んだわけでもないのに、大学でC言語を2単位程度だが必須科目で履修して 今を生きているわけだが。ネットワークの管理をしていても良いかもな。 お前らの馬鹿発言を目の当たりに出来て、笑えるw
>>912 空気読んでないし長文必死過ぎ
どうせ国家試験の勉強でも始めるんだろ?www
縦
何処を縦だよ
行間
918 :
904 :2009/03/25(水) 20:10:34
919 :
デフォルトの名無しさん :2009/03/25(水) 21:18:07
必死だなw
>>898 本を読む前と後に手を洗えって、
図書カードのポケットに書いてあったろ。
オセロのプログラムなのですが、コンピュータが妙な動作をしてしまいます。
具体的には、ミニマックス法で最善手を探してその座標を引数へのポインタでセットする関数があり、
いつもは適切に動いていると思うのですが、終盤になると置けない場所に打とうとする時があるのです。
よく見ると自分が前回打った場所と同じ場所に打とうとしてくるようですが
ソースからはどこがおかしいのか判らない状況です。
評価関数は自分の石の数 - 敵の石の数という単純なものです。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9001.zip なおソースはコンピュータvsコンピュータになっており
もう一人のコンピュータは別のアルゴリズムで乱数で判断するので
ゲームが正常に終了するときと、エラーになるときとがあります。
どうぞよろしくお願いします。
922 :
デフォルトの名無しさん :2009/03/25(水) 22:55:44
ここはデバッグの丸投げスレじゃない
問題は、 intの変数に0を代入することが手を洗うことなのか ということ。
>>921 まず乱数の使用をやめて現象の再現手順を見つけろ
925 :
デフォルトの名無しさん :2009/03/25(水) 23:26:54
誰か2次元配列のポインタ渡しを教えて下さい。 void fun(char *a[]){ int i; for(i=1;i<=10;i++){ a[i]="test";}} void main(void){ char cr[10][100]; int i; fun(cr); for(i=0;i<=10;i++){ printf("test->%s\n",cr[i]); }} 上記の様なことをしたいのですが、どの様に訂正したら問題なく動くのでしょうか?
void fun(char (*a)[100])
落ちこぼれの必死な長文はメシウマということですね。わかります。
>>925 何をさておいてもまず、for 文の中の i の初期値と終了条件が正しいか確かめること。
君が何をしたいのかについては二通りの解釈がある。
ポインタの配列の各要素に文字列リテラルを指させたいのか、
文字配列の配列の各要素に文字列を格納したいのかだ。
まず、君自身がこの違いを理解しているか。
前者は、メモリ空間上のどこかに用意された固定の文字列の場所を、
配列の要素それぞれに覚えこませるだけである。
後者は、文字配列というメモリ空間を意識的に用意して、
そこに目的の文字列の内容をコピーすることである。
前者ならば、cr は以下のように宣言しなければならない。
char *cr[10];
後者ならば、fun() は以下のように定義されなければならない。
void fun(char a[][100]){
int i;
for(i=0;i<10;i++){
strcpy(a[i], "test"); /* 安全上は問題がある可能性がある */
}
}
なお、main() における printf() の呼び出しは変更する必要がない。
これは、cr[i] が配列(後者)であっても、ポインタに成り下がることによって
cr[i] がポインタ(前者)であった場合と同じことになるからである。
なぜ fun() の呼び出しでは同じことが起きないかと言えば、
ポインタの配列(前者)はポインタへのポインタに成り下がるが、
配列の配列(前者)は配列へのポインタに成り下がるからである。
×配列の配列(前者)は ○配列の配列(後者)は
930 :
デフォルトの名無しさん :2009/03/26(木) 00:23:21
>>926 さん
>>928 さん
ホントありがとうございます。
これで明日、作業を進めることが出来ます。
>>928 さんホント丁寧な説明ありがとうございました。
要するにこういう事をさせたいわけね。 #include <stdio.h> #include <string.h> void fun(char (*a)[100]) { int i; for (i = 0; i < 10; i++) sprintf(a[i], "test %d", i); } int main(void) { char cr[10][100]; int i; fun(cr); for (i = 0; i < 10; i++) printf("test->%s\n", cr[i]); return 0; }
>>932 お前向こうで答えてるのあれ間違ってるじゃん。
あれじゃ3次元配列を受け取る意味になっちまうぞ。
934 :
932 :2009/03/26(木) 15:28:07
>>933 確かに3次元配列が2次元配列へのポインタに成り下がることを考えればそうだな。
だが2次元配列へのポインタを受け取るという意味では間違っていない。
char cr[10][100];
fun(&cr);
こういう渡し方を知らんのか?
もともとポインタをコピーしてるのと配列渡してるのと 大本が2次元配列になってるのでgdgdだからな
>>934 なにそれ意味ないじゃん
配列渡しは配列へのポインタを渡しているので
わざわざアドレス渡しをする意味がわからない
初心者が初心者に回答するとこういうことになる
char cr[10][100]; fun(cr); とするならば 1.void fun(char a[10][100]); 2.void fun(char a[][100]); 3.void fun(char (*a)[100]); の何れかになる 1.が一番分かりやすいが[10]の10は無視されるので2.と同一 2.の引数a[]はポインタ*aと同義になるので3.と同一 3.は初心者には分かりづらいので、やっぱ2.がお奨めかな
敢えてaを説明するならば char型の2次元配列(n行100列)の先頭アドレスを格納した変数
>>938 1. がいいと思うよ。10が無視されるとしても
ひでえ VC9でReleaseにしたらfun()が消えてインライン化されちまった
つい struct 化しちまうな struct foo { char elem[100]; }; void fun(struct foo* a); /* void fun(struct foo a[]); */
まあ最終的に3を理解して使えるようになるのが理想ではあるが
最終的には行列と一緒に構造体だろ。生成、消去ごと関数作ってな
946 :
デフォルトの名無しさん :2009/03/26(木) 18:17:28
>>940 10 とは限らないところに 10 と書いてあるのは美しくないと思うが?
>>946 俺もそう思う。
むしろ行数は別パラメータで渡すようにするべき。
どうせ無視されるのだから。
C++なら配列もサイズ毎渡せるんだがな。
#include <stdio.h> typedef struct { char cr[10][100]; } AA; void fun(AA* paa) { int i; for (i = 0; i < 10; i++) { sprintf(paa->cr[i], "hoge %d", i); } } int main() { AA aa; int i; fun(&aa); for (i = 0; i < 10; i++) { printf("%s\n", aa.cr[i]); } return 0; }
949 :
デフォルトの名無しさん :2009/03/26(木) 18:37:29
マジックナンバーなコードだな
配列は決してポインタには成り下がってくれてるわけではな いからこそ、2次元配列以上になると引数で渡すのには一苦 労も二苦労もしなければならない。例えば構造体でくるんで 渡すように。 例えば char a[1000];void f(char*);で f( (char*)&a );とかf(&a)と書くべきところを f(a)と書いても通るのは、慣習に従ってコンパイラが融通を利かせて くれてるだけ
951 :
デフォルトの名無しさん :2009/03/26(木) 18:59:17
> f( (char*)&a );とかf(&a)と書くべきところを /V\ | /◎;;;,;,,,,ヽ | _ ム::::(,,゚д゚):| J ヽツ.(ノ:::::::::.:::::::.:..|) ヾソ:::::::::::::::::.:ノ ` ー U'"U'
char a[1000]; strcpy(&a, "hello, world");
配列名ってのは配列の先頭アドレスを示すラベル(あるいは定数)であるからして それ自体のアドレスはない だからして&(アドレス取得演算子)は使えないぞなもし
>>950 > f(&a)
wwwwwwwwwwwwwwwwww
956 :
デフォルトの名無しさん :2009/03/26(木) 19:24:31
>>953 を擁護する気はさらさらないが、&a と書いただけで警告するコンパイラは昔あったぞ
>>956 ま
f((char*)&(a[0]) );
とか
f( & (a[0] ) );
だな
配列名(アドレスが定義されていない識別子)にアドレス取得
演算子を直接使えると誤解されかねない慣習解釈は問題があるな
だが最近のコンパイラではf( &a )でも通る。C++の影響かな?
959 :
デフォルトの名無しさん :2009/03/26(木) 19:42:46
>>952 はボーランドのコンパイラとおらんかったよ。
どっちなんだよ・・。
配列名は単純に先頭配列へのポインタって理解じゃダメなんかね。。
960 :
デフォルトの名無しさん :2009/03/26(木) 19:45:28
おまえ沢村か?
>>959 ポインタ=アドレスを格納する変数
という定義に従えば
配列名は変数でないからアウツ
962 :
デフォルトの名無しさん :2009/03/26(木) 19:52:25
>>959 通るには通ってるだろ
警告が出るが止まりはしていない
6.3.2.3で認められているし
>>963 そのツッコミはちょっと不親切じゃね。
「配列」のアドレスはとれるけど、「配列の先頭」のポインタとして渡されないってんじゃなかったっけ
965 :
デフォルトの名無しさん :2009/03/26(木) 20:09:28
>>962 &a[0]にしたら問題なく通るけど、
&aなら通らないけどな・・。
>>962 §6.3.2.3にはそんな事書いてねえだろ
よく読み返してみろ
C言語の学習がつまらないのですが、どうしたら楽しくなるのですか?
>>967 何か目標を持て。
ゲームを作るとか、人工知能対戦ロボットを作るとか。
969 :
デフォルトの名無しさん :2009/03/26(木) 20:19:55
>>965 その辺実装依存だったりするし、深入りしない方が良いんじゃないかなあ
普通は
1.配列とポインタは異なる
2.「関数の引数内の配列名」は、ポインタ
3.「式中の配列名」は、ポインタ
とかだけ覚えとけば、書くのも読むのも問題ないんじゃね
>>969 JIS X3010:2003だよな?
7なんてどこにある?
また規格なんか知らん俺がルールだ厨か
|式中に現われる型「Tの配列」という左辺値は、 |3つの例外を除いて、配列の最初の要素を指すポインタに意味が格下げになる。 |結果としてできるポインタの型は「Tへのポインタ」となる。 | |3つの例外とは、 |1) 配列がsizeofのオペランドとなるとき |2) アドレス演算子&のオペランドとなるとき |3) )char型の配列を文字列リテラルで初期値するとき |を指す。 配列に&が使えないとか言ってるのは以前からいる馬鹿なので放置で。
配列型は変更可能ではないが左辺値であり アドレス演算子のオペランドになり得る。 (但し、演算結果は単なるポインタではなく、「配列を指すポインタ」) 実装依存じゃないし、C90から変わってない。 因みに、BCC はその辺バグ多し。
975 :
デフォルトの名無しさん :2009/03/26(木) 20:42:02
>>971 ISO/IEC 9899:1999 (E)
JIS には段落番号がついてないから自分で字下げを数える
ポインタとポインタ変数をごっちゃにするとわけのわからないことになる
>>972 >>970 のこといってるなら、ANSI Cにあるだろ
6.2.2.1に、「式中の配列名が、コンパイラによって配列の最初の要素へのポインタとして扱われる」
6.7.1に、「関数の引数宣言中の配列名は、コンパイラによって配列の最初の要素へのポインタとして扱われる」
この辺まではどのコンパイラでもちゃんと実装されてる。
&演算子で「配列のアドレス」を取得するときの挙動が、なんかまちまちな気がするんだが。
>>976 理解してれば文脈で区別できるんだけどね
なるべくなら面倒がらずにポインタ値/ポインタ変数と書き分けたほうがいい
>>977 違うよ
配列はポインタに成り下がらないとか
&演算子は使えないとか言ってるバカのほうだよ
>>974 おまえはなにをいってるんだ
「規約で決まっていることが、正しく実装されているとは限らない」という意味で実装依存といったが、あんまりそういう言い方はしないか。
規約で決まっていないことは、不定って書くだろ。
実装依存というのは通常、規格が許容する範囲において 実装ごとに異なってもよいことになっている動作のこと。 実装が規格に従っていないのならそれはもはや実装依存以前の問題だ。
>>975 オブジェクト型または不完全型へのポインタは、他のオブジェクト型又は不完全型
へのポインタに型変換できる。その結果のポインタが、被参照型に対して正しく
境界調整されていなければ、その動作は未定義とする。そうでない場合、再び
型変換で元の型に戻すならば、その結果は元のポインタと比較して等しくなければ
ならない。オブジェクトへのポインタを文字型へのポインタに型変換する場合、その
結果はオブジェクトの最も低位のアドレスを指す。その結果をオブジェクトの大きさまで
連続して増分すると、そのオブジェクトの残りのバイトへのポインタを順次生成できる。
えーと、これがJISの該当部分なんですけど、これと配列に&演算子を付けるのとは
どういう関係があるんでしょうか?どうしてもわかりませんでした。
985 :
デフォルトの名無しさん :2009/03/26(木) 21:17:20
>>983 cr へのポインタは、char
へのポインタに型変換できる。その結果のポインタが、char 型に対して正しく
境界調整されていなければ、その動作は未定義とする。そうでない場合、再び
型変換で char(*)[100] に戻すならば、その結果は &cr と比較して等しくなければ
ならない。cr へのポインタを文字型へのポインタに型変換する場合、その
結果は cr の最も低位のアドレスを指す。その結果をオブジェクトの大きさまで
連続して増分すると、cr の残りのバイトへのポインタを順次生成できる。
要は cr がオブジェクトかどうかだ
986 :
985 :2009/03/26(木) 21:19:05
悪い、cr じゃなく a だった
987 :
985 :2009/03/26(木) 21:25:36
あーあかん、疲れとるw a へのポインタは、char へのポインタに型変換できる。その結果のポインタが、char 型に対して正しく 境界調整されていなければ、その動作は未定義とする。そうでない場合、再び 型変換で char (*)[1000] に戻すならば、その結果は &a と比較して等しくなければ ならない。a へのポインタを char 型へのポインタに型変換する場合、その 結果は a の最も低位のアドレスを指す。その結果を a の大きさまで 連続して増分すると、a の残りのバイトへのポインタを順次生成できる。 今日は早寝すんべ
988 :
934 :2009/03/26(木) 21:55:13
>>936 亀レスだが。意味が無いはいいすぎだと思うぞ。(くやしい!w)
・structでくるんだ例が
>>942 で出てるが結局はそれと同じこと
・文字列は終端が分かるからいわば可変長配列のように扱えるから添え字を消してもかまわない。
 しかし,
>>934 の場合「10×100の配列」(ただし渡すときはポインタお願い)であることを
 強制したい/できることに意味があるわけで。
設計の問題であって,意味が無いわけではないからな。ぷんぷん。
まあ確かに動くには動くが・・・・こんな事やったの初めてだぜ #include <stdio.h> #include <string.h> void fun(char (*a)[10][100]) { int i; for (i = 0; i < 10; i++) sprintf(a[0][i], "test %d", i); } int main(void) { char cr[10][100]; int i; fun(&cr); for (i = 0; i < 10; i++) printf("test->%s\n", cr[i]); getchar(); return 0; }
990 :
デフォルトの名無しさん :2009/03/26(木) 23:02:47
小学3年生なんですけど、なんで日本語のプログラム言語は普及しないの?
スレ違い
世界的には日本語を使う人よりも英語を使う人の方が多い
993 :
デフォルトの名無しさん :2009/03/26(木) 23:20:30
英語
入力が面倒臭い
残念ながら、各国の人口を考慮すると言うまでもなく中国語が 母国語として使う人が一番多いんだよな・・・まぁ、地方によって差はあるけどな。
別に母国語としてる人の数とかどーでもいーし
母国語でなくても、世界レベルで英語を日常生活で使う人の人口を考慮したら どんなものか?母国語、国籍に拘らずとも日常生活で使う言語としては より多くの国で選択されるが、現実的に見ると、ヨーロッパ、中東は無視できない。 その他、植民地、支配された国はその支配国の言葉が公用語として使われているが 中には原住民の言葉も根強く残っている国もある。世界は広いぞ。 己の浅はかな知識で語ることなかれ。
だが、大学ではなぜか中国語を履修していたこともある。俺は生っ粋の日本人だ 我 是 日本人、不是 中国人 なんで、そこんとこよろしくー
1000 :
デフォルトの名無しさん :2009/03/27(金) 01:35:06
中国語は各方言間じゃ会話が成り立たないほどに異なるので、 同じ言語としてくくるのは非常に政治的と言わざるをえないけどね。 「中国語」なんてものがあるのかどうかすら怪しい。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。