トップページ⇒tech
955コメント275KB

C言語なら、俺に聞け! <12>

■ このスレッドは過去ログ倉庫に格納されています
0001ウルトラハッカー 日下部陽一NGNG
おれは39才、22年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
Cのことならぜんてわかるから、疑問な点があったらオレに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

Cプログラマならこれを買っとけ。
・プログラミング言語C(K&Rと呼べば通だ)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/yfcbookshelf-22/250-3950205-1475419

K&Rで挫折するようなヤツはこれでも買え。
これでわからない、救いがたいヤツはあきらめろ。
・作ってわかるCプログラミング(アヒル本と呼べば通だ)
http://dennou.gihyo.co.jp/books/void_c/
http://www.amazon.co.jp/exec/obidos/ASIN/477411328X/qid%3D1005618315/250-3950205-1475419

・前スレ C言語なら、オレに聞け! <11>
http://pc.2ch.net/test/read.cgi/tech/1009499565/l50
0153デフォルトの名無しさんNGNG
http://www.cumtv.com/now/livecams.jsp?Ref=4freebucks
0154デフォルトの名無しさんNGNG
CとC++は全然違うの?
0155デフォルトの名無しさんNGNG
ぜんぜん
ちがう
0156 NGNG
>>154
中身は一緒
0157高校生NGNG
俺も、別物に一票。。。
仮想関数テーブルとかリンカの修飾方法とかぜんぜんちゃうやん。
0158名無しさんNGNG
おまえらCプログラマならこれ聴くだろ

「ゴルァ」
http://www.j-wave.co.jp/special/livingintokyo/morley/cgi-bin/images/img20020128211936.wav

「ゴッゴゴゴッゴッ、ゴルァ」
http://www.j-wave.co.jp/special/livingintokyo/morley/cgi-bin/images/img20020128212016.wav
0159デフォルトの名無しさんNGNG
> 中身は一緒
反論も多い言い方だろうけど、同意しとこ。
C言語にやたらと多機能なプリプロセッサを被せた物≒C++
0160デフォルトの名無しさんNGNG
>>152
ワラタ

不可逆暗号でバイナリ化したら、データファイルの意味が・・・
0161デフォルトの名無しさんNGNG
>160
DESをハッシュの一種と思ってる香具師ハッケーン
0162_NGNG
つーか不可逆暗号って?
と思ったら俺がDQNだった。逝ってこよう
0163160NGNG
>>161
うお、指摘されて初めて知った・・・

↓読んで出直してきます。
http://www-6.ibm.com/jp/developerworks/security/010316/j_s-rijn.html

ワラテスマソ>>152
0164デフォルトの名無しさんNGNG
>>161
DESでもハッシュできるけど?
0165ん?NGNG
そもそも暗号自体ハッシュに使えんか?
0166デフォルトの名無しさんNGNG
>>165
使えるね。
0167デフォルトの名無しさんNGNG
ビットパターンを縮小できないとハッシュにならないんじゃ?
CRC はハッシュになるけど
0168デフォルトの名無しさんNGNG
local変数にstaticってつけたこと無いんだが
どういうときに使うんだ?
ループに入る前に宣言しちゃえばいいんじゃないの?
0169デフォルトの名無しさんNGNG
>>168
関数呼び出しをまたいで状態を保持しておきたいとき。
0170デフォルトのななしNGNG
すみませんが、読んでるソースがマクロが多くて
やたら読みづらいです
#defineマクロだけ展開してくれるツールみたいなものってありますか?
厨房ですまんです(;´Д`)
0171デフォルトの名無しさんNGNG
あるライブラリを作っているときに、
そのライブラリが参照しているリンクのエラーを
コンパイル時に確かめることは出来ますか?
それともそのライブラリを使ったプログラムを
作りコンパイルして確かめるしかないのでしょうか?

コンパイラはgccです。よろしくお願いします。
0172デフォルトの名無しさんNGNG
>>170
ていうか、プリプロセッサとかテキストエディタで
できないと思っているのか?
0173デフォルトの名無しさんNGNG
>>171
リンクが動的ならプログラムを実行しない限りエラーするかどうかはわからない。
objdump や ldd 使って自分の環境ではエラーしないことは確かめられるかもしれんが。
0174170NGNG
>172
出来るんですか!?
コンパイラのオプションを調べたけどそれらしいものが無かったです。
テキストエディタで手動で置換すれば出来るだろうけど・・
そういえば今まで気にしたこと無かったけど
「プリプロセッサ」ってなんだろう??????
0175171NGNG
>>173
そうですか。
libtoolとか関係ありそうなのでちょっと調べてみます。
ありがとうございました。
0176デフォルトの名無しさんNGNG
>>174
M-x c-macro-expand
0177デフォルトの名無しさんNGNG
マクロのせいで読みにくいって、マクロ定義したやつのセンスが悪い場合と、
読むほうにソース読み力が無い場合とあるからなぁ…
0178デフォルトの名無しさんNGNG
>>171
http://sources.redhat.com/autobook/autobook/autobook_toc.html
http://www.iecc.com/linker/
0179171NGNG
ところで皆さんautomakeやautoconfは使いこなしてますか?
makefileすら下手なの書くのが精一杯なのにこれ以上ツールを
覚えるのはしんどい・・・
でも#ifdefで分けてやるのもちょっとめんどくさくなってきました。
上の二つを覚えると楽できるんでしょうか。
0180デフォルトの名無しさんNGNG
> ところで皆さんautomakeやautoconfは使いこなしてますか?
私も知りたい。特にautomakeやautoconfの実践的な本

makeはオライリーのmakeの本で覚えた。
0181171NGNG
>>180
http://shimaki.hoops.ne.jp/autoconf/book1.html
今ここを見ていろいろといじってるところなんですが、
ちょっと気合入れて覚えないとだめですね。
ヘタレなおれは慣れるまでに2週間ぐらいかかりそうw。
0182171NGNG
このネタでUNIX板に立てても怒られないかな?
どうでしょうか?
automake,autoconf,libtoolの三本立てで。
0183デフォルトの名無しさんNGNG
>>182
むしろ歓迎。
0184170NGNG
>176
emacs使ってなくて
Windowsなんですよ。
Win環境で何かご存知使えるものは無いですか?
秀丸のマクロをあたったんだけど無いみたいです。
0185デフォルトの名無しさんNGNG
>>184
gccに展開させれば?
0186デフォルトの名無しさんNGNG
Borland C++にはcpp32(c preprocessor)ってのがついてたな
0187デフォルトの名無しさんNGNG
>182
昔この板で立ってた気がするけど、あんまり盛りあがらなかった様な。
実際使ってるやつのリサーチとかしてみると良いと思われ。
大抵そういうやつは2ch見てないんだな・・・
0188デフォルトの名無しさんNGNG
sz=4410;
LPBYTE lpData=new BYTE[sz];

このnewで不正な処理が発生するのですが、
考えられる原因は何がありますでしょか。
0189デフォルトの名無しさんNGNG
szが実はoperator=(int)とoperator size_t()を定義したクラスのインスタンスで、
operator size_t()内で強制終了するようなことをしてる・・・とか、まさか無いよね?
0190デフォルトの名無しさんNGNG
本気で原因が解らず new BYTE[4410] ともしてみましたが、駄目でした。
2000/XPでは大丈夫なのですが、9xでは全く駄目な様です。
0191デフォルトの名無しさんNGNG
それの実行まえにヒープが破壊されていた、に一票。
0192電波5号NGNG
FAQを調べるの
しんどい
なんでも聞けて
怒らない人いないかなぁ・・・・・
0193デフォルトの名無しさんNGNG
>192
Mr.Google。
0194デフォルトの名無しさんNGNG
>>191
どの段階で破壊されているのか調べる術はありますでしょか?
0195デフォルトの名無しさんNGNG
>194
vc++なら、_heapchkをばらまく。
いずれにせよ、銀の弾丸は存在しない。
運が良ければ、BoundsChecker、Purifyなどの
境界チェッカ等が役に立つかも。
0196デフォルトの名無しさんNGNG
>>195
あ。。。その様な便利な関数が用意されていたんですね。。

問題が出る以前の所で確保しても逝く事が解ったので、
LogPut("********00..");
lpData=new BYTE[4096]; delete lpData
LogPut("ok\r\n");
をあらゆる所にばら蒔いて、なんとか発見・駆除出来ました。
有り難うございました m(_ _)m
0197デフォルトの名無しさんNGNG
>>187
同意。2chだと技術的に面白くても
厨房の食いつきが悪そうなスレはどんどん下がっていく。
http://www.ainet.or.jp/~inoue/gnu/autoconf.html
ここ読んで、そのあとに一冊だけあるまともな本を読めばいい。
あとはソースに必ず入ってるconfigure.in,Makefiel.amを
読みまくり、パクル。
0198デフォルトの名無しさんNGNG
>>192
わからないことがあったとき調べるんじゃなくて、
時間を作って通して読んどけ。
0199デフォルトの名無しさんNGNG
>>192
大学の先輩で、レポートの下調べも彼女にやらせて
口述で報告させてから自分で書く、とかやってる人が居て。ヽ(;´д`)ノ
首尾よく卒業して、就職して。
数年後、リコーン ヽ(´Д`)ノ
   ∴ うざうざな輩は嫌がられるらしい。
0200デフォルトの名無しさんNGNG
void age();
0201デフォルトの名無しさんNGNG
main関数で引数を受けるときchar *argv[]で受けますよね。
あれはなんで何ですか?
char argv[]では配列のサイズが指定されていないから駄目なんですか?
0202デフォルトの名無しさんNGNG
>>201
配列と、ポインタの配列の違いは解る?
0203201NGNG
>>202
[]の方が*より優先順位が高いから
char *argv[]は配列に対するポインタじゃないんですか?
じゃあchar *argvでもいいような気がするんですが...
0204デフォルトの名無しさんNGNG
>>201
ダメです。
だからその方法で受け取るととても不安定になります。

ウインドウズはそうやってC言語で作られている部分があるために
フリーズしやすく不安定です。
Linuxではvoid main()で作ってあるので頑丈です。
0205デフォルトの名無しさんNGNG
>>203
> char *argv[]は配列に対するポインタじゃないんですか
ポインタの配列です。

>>204
わけわからん事書くな。
0206デフォルトの名無しさんNGNG
char* argv[]; // argv is an array of "pointer to char"
なら argv[0] は文字列。 argv[1] は文字列。argv[2] は文字列…。

char* argv; じゃ全然ちゃうだろ。
0207201NGNG
>>202,205,206
レスありがとうございます。
確かにchar *argvじゃ駄目なことはわかりました。
だけどchar *argv[]がポインタの配列てのがよくわかりません。
ポインタの配列とは配列の要素がポインタであるものですよね?
じゃあ、argv[0]もargv[1]もポインタですか?
0208デフォルトの名無しさんNGNG
>>207
typedef char* pchar;
pchar argv[];
こう書けば分かるか?
pchar = char*、charのポインタ
argv[] = pchar型の配列
0209デフォルトの名無しさんNGNG
>207
ひょっとして char * はポインタじゃないと思ってます?
0210201NGNG
>>208
うわっ!本当にありがとうございます。
優先順位てそういうことだったんですね。
やっとわかりました。
すっごいすっきりしました。
ありがとうございました。
0211デフォルトの名無しさんNGNG
マクロに関する質問。
Cで制御系プログラムを組むのだが、
レジスタに値をセットするとき、
下記の(1)の様に関数にすると処理が遅くなってしまう。

SetRegister(Address, Data); ----- (1)

仕方なく、

Address = 0xXXXX; ----- (2)
*Address = Data;

とするのだが、見やすくするために、
出来れば(2)をマクロにして1行で書きたい。
これって可能?
基本的な質問で申し訳ない。
0212デフォルトの名無しさんNGNG
やってみれ。
0213211NGNG
なぜか動いたけど、これ安全?

#define SetRegister(ADDR, DATA) Address=ADDR;*Address=DATA;

数年前、ARMのCコンパイラで動かしたらうまく行かなかったんだが、
なぜかBCCでは動いとる。
0214デフォルトの名無しさんNGNG
>>213
#define SetRegB(ADDR,DATA) *((unsigned char *)ADDR) = DATA
#define SetRegW(ADDR,DATA) *((unsigned short *)ADDR) = DATA
こにゃにゃかんじで。
0215 NGNG
0xbeef=0xff;
なんて書いてたころが懐かしいな。
0216デフォルトの名無しさんNGNG
なんでメモリに書くのにSetRegister?とおもったら、メモリマップドI/Oなのね、もしかして。
0217デフォルトの名無しさんNGNG
そ、あるICのConfigを設定するレジスタ。
0218213NGNG
>>214
な〜るほど、こう書けば良いのか。
どうもありがとう。
0219デフォルトの名無しさんNGNG
C言語で典型的な構造体のメモリ配置を教えてください。
ワードに揃えると聞きましたが、要するに2バイト単位で配置されるのですか?
0220デフォルトの名無しさんNGNG
「C言語で典型的な構造体のメモリ配置」なんぞない。
処理系依存だ。
コンパイラスウィッチで変更できる処理系もある。
0221デフォルトの名無しさんNGNG
>>219
> 要するに2バイト単位で配置されるのですか?
16bitマシンの時代はそういう配置が多かったな...

> C言語で典型的な構造体のメモリ配置を教えてください。
で、知ってどうするつもり?
0222デフォルトの名無しさんNGNG
レスありがとうございました。

>で、知ってどうするつもり?
気になって仕方が無いのです。
書籍を読んでも構造体のメモリ配置について詳しく説明してるのには一度も出会った事は無いので。

0223デフォルトの名無しさんNGNG
>222
勉強しろ
http://www.pro.or.jp/~fuji/mybooks/cpro/cpro.4.3.1.html
0224デフォルトの名無しさんNGNG
>>222
> 書籍を読んでも構造体のメモリ配置について詳しく説明してるのには
> 一度も出会った事は無いので。

Cプログラミング専門課程
4.3 アラインメントを読んで見ろ
http://www.pro.or.jp/~fuji/mybooks/cpro/index.html
0225デフォルトの名無しさんNGNG
>>222
メモリ配置について理解したいなら、C 言語ではなくて、その背景にあるプロセッサ
アーキテクチャについて調べる必要がある。Intel や MIPS あたりは Web で資料を
公開してるから、拾ってきて読んでみなよ。
0226224NGNG
あらら、考えてることは同じなのね。
0227デフォルトの名無しさんNGNG
本当にありがとうございました。
これからそれぞれ巡って勉強したいと思います。
0228デフォルトの名無しさんNGNG
キーワードはbyte alignmentだ。
「アライメント」などと書くバカがいるが,
「アラインメント」だ。
0229こんな本を買ったNGNG
「C言語 関数の使い方+作り方 完全制覇」

これ、どうですか?
0230デフォルトの名無しさんNGNG
>>229
いい本ですよ。
0231こんな本を買ったNGNG
>>230
辞書的な使い方ではなく、本の先頭から順にこなしていく使い方の方がいいですか?
0232デフォルトの名無しさんNGNG
んなもん好きにすりゃいいべや
0233こんな本を買ったNGNG
>>232
そう言わずに教えてくれよ。
0234デフォルトの名無しさんNGNG
>>233
どう見ても「全部読む」タイプの本だろ。それは。
0235デフォルトの名無しさんNGNG
googleにて
 アライメント 26,900件
 アラインメント 3,260件
正直ネイティブ発音に拘る奴って馬鹿にしか見えん
0236デフォルトの名無しさんNGNG
もともと *int だった void* から int の値を取り出す時って

nValue = *((int*)p);

こう書くしかないでしょうか?なんかもっと簡単な記述ありましたっけ?
0237デフォルトの名無しさんNGNG
>>235
馬鹿
0238236NGNG
誤: *int
正: int*
0239デフォルトの名無しさんNGNG
memcpy(&nValue, p, sizeof(int));
もっとめんどい?
0240ギリギリのところに立ってる名無しNGNG
当方学生で、ただいま四則計算の電卓をC言語で作成しようと悪戦苦闘しています。
どなたか方針のヒントをください。



0241デフォルトの名無しさんNGNG
>>239
それはポータビリティーが無いだろ。
0242デフォルトの名無しさんNGNG
>240
仕様は?
0243デフォルトの名無しさんNGNG
>>240
どういう環境で仕様の電卓を作りたいか説明出来る?
0244デフォルトの名無しさんNGNG
>>235
確かに拘り始めたら、ファイルランチャーとか言えんくなるなw
0245デフォルトの名無しさんNGNG
>>236
それで充分簡単じゃん
0246デフォルトの名無しさんNGNG
>>244
「ストレージ」モナー。
0247デフォルトの名無しさんNGNG
>>240
> 方針のヒントをください。
yacc lexで検索

または
int main(void){ return system("bc"); }
0248デフォルトの名無しさんNGNG
>>236
一応、括弧を一つ外せる。
nValue = *(int*)p;

>>241
ポータビリティのなさでは>>236も>>239も似たようなものだと思うけど。
まあ普通は>>239なんてことはやらんけど。
0249デフォルトの名無しさんNGNG
>>246
data の発音は、ネイティブでもまちがってる率高いらしいしな。
0250デフォルトの名無しさんNGNG
>>240
GUI?
0251239NGNG
>>241
ん?
たとえばどういう時にマズいの?
おせーて。
0252デフォルトの名無しさんNGNG
>>248
> ポータビリティのなさでは>>236も>>239も似たようなものだと思うけど。

ぜんぜん違う。
■ このスレッドは過去ログ倉庫に格納されています