C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>18
自分がある程度詳しい分野のちゃんとした英語のドキュメントを読んでると、ここはこういう意味か、こんな時はこんな表現するのか、と言うのがある程度身についてくると思う。 RFC読んだ後は、プログラム関係の文書だけは、英語でも何となくわかるようになったなぁ
人の和訳みながらよんだだけだけど C言語の勉強をするためのおすすめのIDEを教えてください Cの文法だけ知りたいんならIDEで身につくと思うけど、CのUNIX的な使い方とかMakefileの作り方まで含むならやっぱりターミナルでVimかEmacsが一番身につくと思うな IDEであろうがなかろうが
複数の環境を使ったほうがいい
1つの環境だけ使っていると
間違った知識をたっぷり吹き込まれる
その環境が悪いわけじゃなく
Cには処理系定義だの未規定だのがたくさんあるからだ 汎用機でトライグラフとワードアドレッシングな奴をやっておけば完璧だね 関数を呼び出すたびごとにいちいちGETMAINするのかと思ったら違った 実際のところトライグラフの環境ってあるのかね
汎用機のEBCDIC(英字)も記号は一通りあるよね カード穿孔機くらいかな
トライグラフの必要性を感じたデバイスは NEC MSコンピューターとかかな
シリーズで言うと MS120,MS140,MS190 ヨーロッパとかで英語以外の国で、C言語で使う記号のところに別の文字が割り当てられてるケースとか。文字コードまたはキーボードのキーとして。 バックスラッシュがあるべき文字コードの場所が
現地の通貨記号に置き換わってる環境でトライグラフ使わね? >>42
そもそもそんな環境で開発なんてしたことないし ノーマークでトライグラフになっちまってたことは過去に何度か・・・
(s)printf 中の format 文字列で >>47
最近のコンパイラはデフォでトライグラフを抑制してくれてるようだけど
古いコンパイラは、そんな気がきいてないから
警告文 "warning??!" ってやって実際の出力が warning| で なんじゃこりゃ?と それでも ??/ → \ で
次の文字をエスケープして大事故にというのは無かったかな >>47
>>45じゃないけど "不正な値です: ??(10)" ってやったら "不正な値です: [10)" ってなって
はあ?ってなったことあるわ CとC++は馬鹿には使えない
惨事が起きるから
使わせてはいけないと聞いた いくつかのコンパイラはトライグラフがデフォルトで無効になっていたと思う clとclangとgccはデフォルトで無効だし、今じゃ有効な環境のほうが珍しいんじゃないの char s[3] = "abc";
printf("%s %lu", s, strlen(s));
これの出力がabc 3にならず
abc 9abc 9とか
abcea 9abcea 9みたいに毎回不定で文字列が出力されるんですけど何でですか? s[4]か、サイズ未指定のs[]にする。
\nを追加する。 strlenの返却値はsize_tだから、%luは間違い。 組み込みのショボいライブラリじゃ使えなかったりするから
unsigned intにキャストして%u
でいいや キャスト毛嫌いしてたんだけど、size_t や int*_t シリーズを printf 書式で使う時のベストプラクティスだと気付いてしまったよ。 サイズの変わる型キャストは、(通常無視できる程度の)少しだけコストがかかることに言及しておこう。 わずかに時間と計算量がかかるという意味のコストね。 printf使ってるときなら、無視できるレベルだな 大抵の場合、暗黙でintに変換されるので%dで問題ない >>63
64ビットで渡すより32ビットで渡す方が普通は速い >>65
intより大きいサイズはintに変換されない >>65
問題大ありだよ
64bit 環境では、sizeof sizeof 1 == 8 だぞ 脇道に逸れるが整数のサイズってどいつもこいつもイマイチだね
char 8
short 16
int 32
long 64
long long 128
と、せっかく5階級あるのを無駄なく使えるようになってない そんなに細かく分ける意味あんのかね。
64bitだけでいいだろ。 Makefileの書き方なんだけど
makeが実行されているときに 今何を実行してるか表示されるけど
「なんでこれが実行されているんか」の理由も表示したい
依存関係の hoge: fuga を表示したい
.c.o:
@echo $@:$^
$(CC) $(CFLAGS) -c $<
みたいに書いたりしてんだけど、全部に書くのもダサい気がするし
良い方法はないでしょうか >>72
128が標準にあれば使い途いろいろあるぞ >>73
GNU make なら -d (デバグ表示)とかは?
ただ「なぜこれが実行される」って、ファイルの更新日時ぐらいしか
ないと思うけど >>75
このコマンドを実行したのは○○より△△が古いから
って言うのを知りたいんでしょ
$^ の意味も知らないならROMってなよ
>>73
make コマンド自体に手を入れた方が早いかも すみません初歩的なことですが・・
前置インクリメントa++
後置インクリメント++a
がありますが、a=a+1は後置になりますよね? b=a++ と b= a= a+1 は違う気がする。 回答有難うございます
実験してみたのですが、a=a+1は前置(a++)にも後置(++a)にもなるのですね
http://i.imgur.com/teLsUGY.jpg a[i++] = i; は悪魔召還だけど
インクリメント演算子なしのこれ
a[i =i+1] = i;
も鼻から悪魔になるのかな >>78
>前置インクリメントa++
>後置インクリメント++a
考え方が逆
変数を基準に考えるのではなく演算子を基準に考える
前置インクリメント++a : 演算子を’前’置した場合、変数(式)の評価’前’に演算子が適用される
後置インクリメントa++ : 演算子を’後’置した場合、変数(式)の評価’後’に演算子が適用される >>84
なるでしょ
iの変更と最後のiの評価の間に順序性がない事に変わりはない i = i + 1;
の、iの変更と最後のiの評価の間の順序性は? デバッガはデバッガで起動すればいいし、printf があるし。 >>87
6.5.16 Assignment operators
「The side effect of updating the stored value of the left operand is sequenced after the value computations of the left and right operands. The evaluations of the operands are unsequenced.」
左オペランドの変更は、左右オペランドの評価の後 >>84
MISRA-C で、禁止されている
a[式]
この式に、副作用があったら、ダメ。
バグるから >>91
thx
だよな、そこは断り書きが必要な箇所 >>92
バグが入りやすい書き方ってだけでバグるわけじゃない 事実上どうなっているという話ではなく
理屈の上でどうなのかという話
ちゃんと断り書きがあったからめでたしだが
そうでなかったら大変だった defineした定数を文字列定数にいれるにはどうしたらいいの?
#define EOL 0x0d
const char version_message[] = "Version 1.0\x0d"
↑この文字列の改行コードに定数EOLを展開した値を入れたいです。 typedef struct hoge {
int a;
int b;
} hoge;
hoge h = {1, 2};
構造体に含まれるメンバ名と値を全て出力する方法を教えてください
上の構造体なら
a,1
b,2
と出力したいです >>100
小さな部品を繋いで大きなものを得るのはとても簡単にできるけど
部分を削って小さな部品を得るのはとても大変なのよ
だから本来は改行文字は機能的にレイアウトなのでデータとは分離しておいて
表示なりなんなりするときに結合して使うのが望ましいもちろんVersionと数字もね
その上で既存コードのメンテ等でどうしても必要なら>>101がベスト >>100
#define EOLSTR "\x0d"
const char version_message[] = "Version 1.0" EOLSTR; >>104
それは迷ったんだよねー
次点でその文字列をマクロで作ることも考えたけどあかんかったw >>102
変数名はあくまで人間が扱いやすいように何らかの領域(一般的にメモリアドレス)に付けるあだ名であって
プログラム(コンピュータ)的にはメモリアドレスのほうが扱いやすいのであだ名は不要(アドレスのほうはプログラム的に出せる)
なのであだ名のほうが欲しいなら以下のように直書きするしかない
printf("%s,%d\n", "a", h.a); >>106
そうなんですか・・・
全部直書きするのキツイのであだ名がなくてもかまわないのでこの場合の方法ないでしょうか? >>101,104、ありがとうございます、
PCとUSBシリアルで通信する組み込み機器のドライバをメンテしていて
受信したテキストの終端検出にEOLはキャラクタで扱っているし
送信する固定テキストは改行含めてリテラルにしたく
プリプロセッサの#か##で連結でなんとかできないか悩んでました。 メモリアドレスを出力させればいいんじゃない?
%pで&aを表示できるはず 与えられた変数から、メンバ名とその値を再帰的に列挙して欲しいんだろうけど
そんな都合の良い言語じゃないから自分で並べるしかない
必要に応じて毎回並べるか
並べて出力したものを関数化しといてそれを呼び出すか 再帰的に列挙は自動だととんでもない情報量になったりするからな
そこから欲しい情報をどうやって抜き出すかが頭の使いどころ >>100
#include <stdio.h>
#define EOL x0a
#define _STRING(s) # s
#define STRING(s) _STRING(s)
#define _VALUE(s) 0 ## s
#define VALUE(s) _VALUE(s)
char a[] = "Hello" STRING(\EOL);
void main(void) {
int n;
n = VALUE(EOL);
printf("%02x [%s] \n", n, a);
} >>115
これってさ、メンバ名をconst char*にするんだよね? >>115でいいと思うけど、
そもそもこれがしたい場合にC言語を使うのが間違いでしょ。
動的言語かリクレクションがある言語を使えばいいだけ。
ちなみにVC++/CLIでよければリフレクションが使えるけどね。
質問者には無理だろうけど。
レベルからいって>>108が当たりだろうね。 >>117
#x の所? そうじゃないかな。gcc -E とかやって見てみるとわかると思うが、 h.a は単純に "h.a" になっている。
>>118
C使わなきゃいいってのはその通りだが、それを言っちゃあお終いよ。 構造体のメンバ名がほしいとかデバッグ以外に何があるの ■ このスレッドは過去ログ倉庫に格納されています