変数とデータ型について勉強してるんですが #include <stdio.h> #include <float.h> int main(void) { double pai=3.14159265358979; printf("円周率は%fです\n",pai); fflush(stdin); getchar(); return 0; } とした場合、表示が3.141593になるのは何故でしょうか?
>>2 %f は何も指定がなければ小数点以下6桁まで出力するようになっているから
小数点以下14桁まで出力したければ %.14f と書けばいいよ
%g 推奨。
>>3 なるほど
ありがとうございます
それと、もう少し教えて欲しいのですが
float型は有効小数点桁数6桁、double型は有効小数点桁数8桁と本に書いてありました。
>>2 の場合
double pai=3.14159265358979;
としているからdouble型だけど%fだから小数点以下6桁までの出力なのでしょうか?
float型とdouble型の違いは扱える実数の範囲が違うっていう認識しかないのですが…
よく解っていなくて質問がおかしいかもしれません、申し訳ないです
6 :
2 :2009/10/06(火) 21:34:02
名前にレス番号入れてませんでした、すいません
>>4 これは便利だ
%fと%eの両方の性質を持つみたいですね
ありがとうございます
>>5 有効桁数以上に出力することはできるけど
有効桁数以上の意味は無い
あと一般的な有効桁数は double が 15桁、 float が 7桁で
浮動小数点型には有効小数点桁数なんてものは存在しない
頭から15桁目まで(float なら 7桁目まで)が信頼できるだけ
8 :
2 :2009/10/06(火) 22:12:08
>>7 なるほど、ようやくすっきりしました
重ね重ねありがとうございました
>>9 4096*1024*1024 == 0 ???
>>9 4096*1024*1024 がオーバーフローしてるっぽい。
4096LL*1024*1024 にしたら表示された。
>>9 オーバーフローだろそりゃさすがに。
int型じゃなくてlong longにしてごらん。
long long ago
14 :
デフォルトの名無しさん :2009/10/07(水) 15:46:11
質問です pointer がどちらに渡って居るのかが いまいち理解できません /*次の関数を改良せよ*/ int smaller(char *s, char *t) { if (strcmp(s, t) < 1) return 1; else return 0; } と 為っているのですが お願いします
>>14 質問の意味が分からない
改良という意味では仮引数に const をつけるくらい
return (strcmp(s, t)<1); とするのはちょっと嫌
16 :
デフォルトの名無しさん :2009/10/07(水) 16:12:48
>>15 確かに嫌です…
if (const(strcmp(s, t) < 1))
return 1;
...
と 云う事でしょうか?
いやまずは
>>14 の2行目が いまいち理解できません です。
それは strcmp がわからないという意味か? 調べてみたか?
>>18 > pointer がどちらに渡って居るのか
ここが理解できたおまえさんはすごいよ。
strempが1以下ってどういうこった?
1以下じゃないだろ 1未満、つまりゼロかマイナスということだ
int a=0,b=0,c=0; って意味のことを書きたい時まとめて書く方法はありませんか?
>>21 strcmp(s,t) <= 0
こうするんじゃないの?
>>22 ありません
>>23 同じだからどっちでもいいよ分かりやすい方を使えば
>>14 の
> pointer がどちらに渡って居るのかが いまいち理解できません
分かる人はこれの意味を解説してくれよ
>と 為っているのですが お願いします もなかなか。
>>24 でもまぁ、0と比較するほうがコストの低いコードになる可能性もあるし、
そもそも大小を変更するときに間違う恐れもあることだし、1との比較は避けるべきだな。
>>14 日本人とは思えない日本語だな。
ここはC言語の入門スレではあるが
日本語の入門スレではないぞ?
>>29 jpg とか馬鹿じゃねーの?
エラーメッセージくらい嫁クズ
31 :
tax :2009/10/07(水) 18:11:29
float tax calcTax(int i) が違っているのではないだろうか
演算子の優先順位について質問です 以下の式はなんで真にならないのでしょうか? (sizeof(short) + 1) > -sizeof(short)
よく読まずに脊髄レスしてみる × float tax calcTax(int i) ○ float calcTax(int i)
37 :
デフォルトの名無しさん :2009/10/07(水) 18:33:26
>29 たぶん3行目の//コメントと5行目のtaxの所為だな 3行目 s/\/\/\(.*\)/\/*\1 *\// 5行目 5s/tax //
>>35 あー。なるほど。演算子の優先順位が原因と勘違いしてました
回答ありがとうございます
39 :
デフォルトの名無しさん :2009/10/07(水) 18:52:37
すみません入門書を購入したいのですが ソフトバンクから出ているので柴田望洋シリーズと林晴彦シリーズっていうのがあるみたいなのですが どちらがいいのでしょうか?
>>30 ,
>>32 ,
>>33 ,
>>36 ,
>>37 回答ありがとうございます
次回から質問する際はかならずソースコードを貼るようにします
>>33 さんのサイトを利用させていただくかもしれません
ちなみにエラーメッセージは
Declaration syntax errorで宣言構文エラーのようでした
それでコンパイルが通らなかった理由は
float tax calcTax(int i)
に余分に「tax」が入っていたせいでした
ひでぇ、>31がちゃんと回答しているのに無視だぜ。
・・・?
もう銅でも良くね>
44 :
デフォルトの名無しさん :2009/10/07(水) 19:23:49
また明日も来ますね^^
おまちしておりますお
名前欄に気がつかないというより 自分が見たくないレスが見えないんだろうな エラーメッセージも見たくないから見ないんだろうな
47 :
デフォルトの名無しさん :2009/10/07(水) 19:32:07
そんなやつたくさんいるからどうでもいいけど、文字だけでやりとりしたかったら、訓練してよん
これからやとうと思う人は普通本買う。 そして、ここは入門篇と書いてある。 本があるのに、こういうところで聞くということは、 本が悪い、理解できる能力がない、2chが好き…、検索しない などの理由だろうから、まともな人が来ないのは当然。
やっとうううううう!!!!
51 :
デフォルトの名無しさん :2009/10/07(水) 20:03:57
でもその通りだろ
53 :
デフォルトの名無しさん :2009/10/07(水) 20:20:15
>>52 ひとつだけ plus 思考な物が在りますが? 自分に嘘をつけない type ですかw
54 :
デフォルトの名無しさん :2009/10/07(水) 20:35:21
雇う
56 :
デフォルトの名無しさん :2009/10/07(水) 21:06:17
最近この板にわいた日本人じゃない頭のおかしなヤツだな。
日本人なら語尾はゴザルまたはアリンスのはず
きさま、日本人じゃないな!?
>>49 ・本を買えないほど貧乏
・プログラミング如きに1円たりとも使いたくない
・実はそれほどやる気がない
61 :
デフォルトの名無しさん :2009/10/08(木) 10:20:00
俺も書籍で学習するのが好きだけど サーバ構築して遊ぼうと思っているから、しばらくは我慢。 貧乏学生でしゅ^^;
Cの入門書なんて2〜3000円で買えるだろ
63 :
デフォルトの名無しさん :2009/10/08(木) 10:26:05
というか、技術書って無駄に高いの多くないか? いや普通か。
"入門"ってどこら辺のレベルなんだろ コンパイラの入手方法を知らない、辺り? ソースコードを書いてコンパイルすれば実行できることは知っている、辺り?
コンパイル環境がないのは入門以前だろw
for,while辺り
ifは結構理解しやすいじゃん? やっぱループ教えるには先にifとgoto教える方が理解しやすいんじゃねのかな?
俺的にはとりあえず 標準仕様のうち「簡単なもの」を一通り 使えるぐらいまでが入門じゃないかと。
>>67 どうせgotoは使うなって教えるんだから
最初からif, for, whileでいいだろ。
その後do-whileとgotoを教えて、gotoは極力避けろと教えればいい。
70 :
デフォルトの名無しさん :2009/10/08(木) 11:35:50
sys/time.hが私のパソコンの中に入っていないのですが、 どうやったら手に入れることができるでしょうか?
まずLinuxを入れます
それはOS依存の部分だからなあ Windowsで実行するにはCygwinを使えばいいんじゃね?
>>70 Linuxなりのソースから拾ってきてもいいし、Webで検索しても見つかると思う。
寧ろそんなことよりも、何故それが必要だと思ったのかを説明した方がゴールに辿り着けると思うぞ。
コンパイラBCC使っています。 char c='5'; printf("%x--%x",&c,*(int *)&c); とすると、結果が 12ff8b--12ffb835 となりました。 アドレスはいいとして、2個目がどうして12ffb835になるのか分かりません なんかアドレスの8bが逆になったのがくっついてるし・・・ やりたいのは、cの値をint*にキャストして表示したいということです
> やりたいのは、cの値をint*にキャストして表示したいということです (int *)c こういうこと? *(int *)&c は cのポインタを int のポインタとして、指している場所に書かれている int 値
・「cの値」は整数なので、ポインタにキャストすることはできない。 ・cのポインタ、つまり&cをint *にキャストすることはできなくはないが、そのポイント先が安全と言う保証がないので未定義動作する。 ・その結果、2個目の%xで出力された16進数の下位2桁はどうやらたまたま'5'のアスキーコードのようだ。
>>74 12ffb8はスタックに残ったゴミで意味のあるのは35(='5')だけだ
>>76 >そのポイント先が安全と言う保証がないので未定義動作する。
キャストしただけなら問題ないが、キャストした瞬間に未定義動作ということだな。
>74の場合は落ちないようだが、環境によってはセグメンテーションフォルトで落ちるだろうし。
cのアドレスを受け取って、それをint*にキャスト
その後に、そのアドレスを基にして実際の値を取得したいということでした。
>>75-78 未定義動作なんですね
詳しい解説ありがとうございました。
80 :
デフォルトの名無しさん :2009/10/08(木) 18:10:35
> ・「cの値」は整数なので、ポインタにキャストすることはできない。 アホ
そりゃまぁ、厳密にはキャストできないわけじゃないだろうけど、初心者がやるようなことじゃないよな。
学校の課題を家でやるときテキストエディタで書いてBorlandさんにコンパイルさせてるんだけど お勧めのエディタってある? スレ違いなら該当スレ頼む
そういえば前スレでlinuxの自動インデントのエディタを聞いた者だけど 普通にgeditの設定で出来た
>>82 秀丸エディタ。
初心者ならこれがぴったりだと思う。
>>82 BorlandならCpadが簡単操作でいいんじゃね?
>>84-85 thx
とりあえずどちらもダウンロードしてきてしばらく使ってみる
関数外で動的確保した領域のサイズを、ポインタを引数でもらうだけで知ることはできますか? int func(int *pi) { int size; ... return size; } int main(void) { int *buf = malloc(16); func(buf); return 0; }
>>87 普通は無理ですが
コンパイラによっては専用の命令を持っていることもあります
>87 int func(int *pi) { size_t size; size = *((size_t *)pi-1); ... %nbsp;return size; } int main(void) { int *buf = malloc(16+sizeof(size_t)); *(size_t *)buf = 16; buf = (size_t *)buf + 1; func(buf); free((size_t *)buf - 1); } あくまで局所的にやらないこともなかったりする 構造体使う方が読みやすくなると思うけど struct { size_t size; int *buf; } foo; まぁ、どう考えても自分でメモリ管理ライブラリ作って使ったほうがいいと思う、今後のためにも
>>86 秀丸は、金払ってまで使う意義はないだろ。
フリーのやつつかえ。
>バグあるけどな kwsk よく使ってるんだが
エディタへの瑣末な不満は尽きない。TeraPadとかも
自分で不満の無いエディタを作ったらいいのに。
vim
BZ
まあ、エクセルさえあれば何でもできるけどな。
統計と学習を同義とするなら、エクセルで人工知能も作れるしな
表計算から年賀状作成まで。 万能ツールだよな。エクセル。
よくきたなもまえら、でもここは「C言語なら俺に聞け(入門篇) Part 54」だ エディタの話がしたいのなら別のところでやってくれ
>>93 たまにメモリの開放を忘れる程度
特に支障はない
なんてったってうちの会社の標準環境だしなwww
よくC言語の解説で「動作を保証しない」とか「非常に危険です」とか 説明があるけど最悪何が起こるの? パソコンがフリーズするくらいなら立ち上げなおせば元に戻るよね
最悪も未定義です
>>104 vista以降はOS側で最悪の動作(I/O操作、定義外のディスクリプタテーブルのメモリ操作)はブロックする。
どうして誰もemacsenを薦めないのか
>>108 そんなあなたにxyzzyをお勧めしておきます。
が、エディタの話はエディタスレでどうぞ。
>>106 何が最悪かなんて人による。
実行権限次第でファイルシステムの消去くらいできるが
せっかく集めたエロ動画が消えたら最悪だろう。
画像は3重にバックアップとってるから消えても大して痛くないよ
112 :
106 :2009/10/09(金) 13:03:48
予期しないアドレスを参照したり書き込んだりするだけでハードディスクの エロ画像が消えたりする可能性があるの?だったら確かに非常に危険だな
113 :
104 :2009/10/09(金) 13:08:46
バッファオーバーランとかを突いて管理者権限を乗っ取るとかいう話はよく聞くが 実際に目にしたことはない もし乗っ取られたら、画像を消すくらいは簡単だろうと思う
画像を消去するために乗っ取るわけじゃないし
>>116 ファイルを先頭から終端まで読んでしまっているので、そのままではそれ以上読むものがないという状態。
二回目以降の読み込みに先立って、ファイルの先頭から読めるようにファイルポインタを移動する必要がある。
その目的には、rewind()を使えばいい。
・scanf()の使い方が危険。 せめて、scanf("%63s", fname)としよう。 ・if文中での代入は避けた方が読み易い(但し異論もあり)。 変数の寿命の点からも、file = fopen(); if (file == NULL) {}とした方がいいと思うが。 ・エラーメッセージは標準エラー出力を使おう。 ・Cのループは0オリジンがお約束。 間違いじゃないけれど、for (cnt = 0; cnt < no; ++cnt) {}とした方が多くの人が見慣れている。 ・変数の局在化のためにも、変数宣言を関数の先頭に集中させるのはやめよう。 例えば、int chはforの内側で宣言すれば充分。
>>119 詳しくありがとうございます。
サイトぐるぐる回るのと本屋立ち読みやってたので知識があいまいなんです
今度ちゃんと本買います
わざわざBASICとの違いを出すために不完全な言語仕様を作るのもおかしいよな。
>>119 for の内側で宣言するのはやめておいたほうがいいと思うよ
C言語だと
でたらめ
125 :
デフォルトの名無しさん :2009/10/09(金) 17:25:37
逝ってよし
ループの中で宣言って、ループが終わるたびに解放してまた確保してるイメージなんだけど、 実際にはどうなの?
実際にはそんな無駄なことはしない 確保したまま回る
>>126 C++ならコンストラクタ・デストラクタが動くけど、Cなら何も起こらない。
ありがとう これからは躊躇無くループの中で宣言できる
131 :
122 :2009/10/09(金) 18:06:44
for(int i=0;i<10;i++) // C99 から OK C言語ならこの書き方を勧めるなよ って事なんだが… C99 が一般的になったのか?
forの内側と言うのは、普通はfor (ここ)のことではなくfor () {ここ}のことだと思うんだ。
( * ) ここ
>>131 どこをエスパーしたのか知らないが、そんなことは言ってない、と、思う
>>131 まさかとは思うが、大昔からCでもこれができることは知らなかったとは言わないよな。
int main(int argc, char ** argv)
{
int i;
for (i = 0; i < argc; ++argc) {
int j = atoi(argv[i]);
printf("%d ", j);
}
return 0;
}
136 :
122 :2009/10/09(金) 18:13:10
すまん、ブロックの先頭の事だったか
と、思う( * ) ここ
プログラミングの上級者〜プロはprintf、scanf関数を使わないと聞きましたが、 じゃあ標準入出力はどんな関数を使ってるんでしょうか?
139 :
デフォルトの名無しさん :2009/10/09(金) 18:16:04
( * ) ここ
>>138 いいえ、前者なら愛用しています。
入力には大抵fgets()、出力には大抵fprintf()を使っていますが、後者は前述の通りprintf()も使います。
また、バイナリデータを扱うケースではfgetc(), fputc()も使います。
fgets( * ) ここ
,. '" _,,. -…; ヽ |タ l l.|: : ::::::: (i'"((´ __ 〈 } | | j: :::/: |__ r=_ニニ`ヽfハ } | | |: /: : : ヾ|! ┴’ }|トi } | j | !: : :/ |! ,,_ {' } | l |:/ :::: 「´r__ァ ./ 彡ハ、 | !| : : : : : ヽ ‐' / "'ヽ | |: : /:: ヽ__,.. ' / ヽ. | |/::::_;. /⌒`  ̄ ` ヽ\_ | |:ー'´: : / i ヽ \ | |: : : : : :
>>139 よ。お前みたいな奴をみると、あの日のことを思い出すよ。
2001年8月25日。2ちゃんが本格的に閉鎖になりかけた日だよ。
転送量が多すぎて、費用が月700万もかかってるって発表されて、「数日中に閉鎖」って予告されてさ、
その日のうちにあっちこっちの板が封鎖されてた日だよ。
あのときのUNIX板の住人、カッコよかったんだぜ。「総力を結集」ってのはまさにああいう状態だよ。
転送量を1/3に削減しないと閉鎖、ってもんだから、新しいプログラム組んでさ、
そしたらほんの何時間かで完成したんだよ。それが聞いてくれよ、目標は1/3だったのに
1/16まで圧縮に成功しやがったんだよ。職人技なんてもんじゃねえよ、神技だよ。
でもよ、そうやって頑張る人がいた一方で、「ボクの肛門も閉鎖されそうです」とか駄スレ立ててたバカも
いたわけだよ。ちょうど、今のお前みたいにな。
だからよ、俺たちは総力を結集して、お前のバカ度を1/16に圧縮しようと思うよ。
ま、圧縮後でもお前のバカ度はこの世に生かしておくことのできないレベルだけどな。
要するに俺らの力を結集してもお前を助けることができないってことだ。
わかったら、まわりに迷惑をかけないようにひっそりと死んでくれよな
146 :
デフォルトの名無しさん :2009/10/09(金) 18:37:15
whileでどちらかが真なら〜ってどうやってかくの
while (x == 1 || x == 2) {
// ( * ) ここ }
( 'A `) (⊃⌒*⌒⊂) /__ノωヽ__) r-''ニl::::/,ニ二 ーー-- __ 肛門がしゃべった!! .,/: :// o l !/ /o l.}: : : : : : :`:ヽ 、 /:,.-ーl { ゙-"ノノl l. ゙ ‐゙ノノ,,,_: : : : : : : : : :ヽ、 ゝ、,,ヽ /;;;;;;;;;;リ゙‐'ー=" _゛ =、: : : : : : : :ヽ / _________`゙ `'-- ヾ_____--⌒ `-: : : : : : : ...-''"│ ∧ .ヽ. ________ / ____ ---‐‐‐ーー \: : : : ! / .ヽ ゙,ゝ、 / ________rー''" ̄''ー、 `、: : .l./ V `'''ー-、__/__r-‐''"゛  ̄ ̄ \ ゙l: : l .,.. -、、 _ ‐''''''''-、 l !:
コテかトリップ推奨 デフォルトの名無しさんをあぼんすれば解決 あらしは過疎スレでやってくれ
#include <stdio.h> int main(){ for(int i=0; i<4;i++){ int i=0; printf ("%d", i); i++; } printf ("%d\n", i); return 0; } これの出力結果を答えられる?
コンパイルエラーになるのでは
いまどきVC6使ってるカスは氏ね。
スレ違いを覚悟で敢えて言えば、某C++コンパイラのver6ではtypoを直せばコンパイルできる。
>>151 の不思議なところは
いったいどうやってそれを入力したのかということ
真性キチガイなら勝手に左手動いた・・・とかあるだろうけど
左手?
右手?
#include <stdio.h> int main(){ int i; for(i=0; i<4;i++){ int i=2; printf ("%d", i); i++; } printf ("%d\n", i); return 0; } こうだな。
>>138 楽して使えるものは何でも使ったらいい
大昔は「実行ファイルが大きくなる」とか情けない理由もあったりした
for(i=0; i<4;i++){ for(i=0; i<4;i++){
>>144 っていうけど、gzip圧縮しただけだよな
尾ひれがついてとてもすごいことをやってるように思われてるのはちょっと。
手品のタネが分かればみんなそう言うもんだw
2chのソースが公開されてたけど、まさかのCだったな。
とりあえずインクリメント用の変数にiだのjだの付けるのはやめてくれないか?目が痛くなる。 せめて3文字以上にしてくれよ。cntとかidxとかさ。
iとjでいいよ。
( * )ここ
ソースをみてて、cnt, chk, idx みたいな変数があると、懐かしい気分になるな。
>>162 思いつくまで大変だったのかもね。
mod_gzipをインストールする技術はなにか特別なわけではないし、
導入しているサーバは世にごまんとあった。
当時スレ見てた?それともその後のflashで知った世代か?
確かに圧縮がどうこうじゃなく、それによる負荷上昇をなるべく抑える事が肝要だったな。
>>168 見苦しいぞ古参
外野からいつもいつも「そんなこと余裕」ってうっせーんだよ
( * )ここ
172 :
デフォルトの名無しさん :2009/10/09(金) 22:48:32
世代ってなんだろ? 2ちゃんねる(笑)始めるのに年齢とか関係あるの?
また始まったよ、糞が。どうしようもないな
いいじゃん。 こんな糞コミュニティの古参気取っても自慢にならないし。
便所の壁が綺麗だったことなど一度もない!
過大評価されてる情報を鵜呑みにしてるから、そうでもなかったよと 真相を伝えてるだけじゃないの?老いると教えたがるみたいだしなー 俺はそんなのどうでもいいし、2ch使えればそれでいいw
古参がコピペにマジレスするとは
179 :
デフォルトの名無しさん :2009/10/10(土) 01:05:22
つい最近、C言語始めたものですが下記のような文章でコンパイルしても 65とか入力しても「×です。」って出るんですけどなぜでしょうか? #include<stdio.h> int main(void) { int a ; printf("数字を入力してください。 \n"); scanf("%d", &a); if( 0 <= a <= 59 ){ printf(×です。\n"); } return 0; }
>>179 if( 0 <= a && a <= 59 ){
181 :
デフォルトの名無しさん :2009/10/10(土) 01:13:21
ありがとうございます。
>>179 のコードもコンパイルできるのか
考えてみたらif(0<=a<=59)は
まず0<=aが評価されて、0<=65だからこの式が真(1)と評価されて
次に1<=59が評価されて真(1)になるから
if文の中のprintf文が実行されるってことか
int main(void) { char buf[1024]; char *log[1000]; int line, printline; FILE *fp = fopen("abc.txt", "r"); puts("これから読み込み\n"); for(line = 0; fgets(buf, sizeof buf, fp); line++){ log[line] = malloc(strlen(buf) + 1); strcpy(log[line], buf); } puts("これから表示"); for(printline = 0; printline < line; printline++){ printf("%s", log[printline]); free(log[printline]); } fclose(fp); return 0; } for(line = 0; fgets(buf, sizeof buf, fp); line++) って部分のfgets(buf, sizeof buf, fp)は文字列を取り出してると思うんですが、 forの終わりの条件部分に当たる箇所になぜこれを指定してるんでしょうか?
forの終わりじゃないから
line = 0; while(fgets(buf, sizeof buf, fp) { log[line] = malloc(strlen(buf) + 1); strcpy(log[line], buf); line++; }
>>183 >fgets
>戻り値
>ファイルの終わりかファイルエラーの場合は NULL を返します。
188 :
デフォルトの名無しさん :2009/10/10(土) 17:59:35
ポインタが理解できない理由を考えてみた。 ポインタは指し示すもの。値を参照したいときに利用するにとどめるべき。 unsgined char str[] = "123"; unsigned char *ptr; ptr = str; //ここでptrはstrを指し示している。 *(++ptr) = 'A'; //*を使って値を書き換えようとする時点でポインタではない。
189 :
デフォルトの名無しさん :2009/10/10(土) 18:18:14
s/unsgined/unsigned/
関数名に「$」を使ったら講師に怒られたのですが何故だめなんでしょう? 英数字とアンダーバーで無いとだめだって。 コンパイルは通るのですが何がだめなのかわかりません。
>>190 コンパイルできるなら別にダメじゃないよ。
・講師が間違っている
・講師の頭が硬い
・これまでのCプログラマが築いた習慣を尊重している(でもダメだと頭ごなしに怒るのは間違い)
のいずれかだろう。
>>190 C99からはユニバーサルアルファや処理系定義な文字が識別子に使えるので、
C89縛りがないなら使ってかまわない。
より規格に準拠するなら \u0024 と書くべき
> 講師に怒られたのですが何故だめなんでしょう? なんにせよその場で質問しなきゃいかんよ
改行したいのですがバックスラッシュが入力できません。 開発環境はVCです。 お願いします。
>>195 頭の悪いやつに何を訊いても意味がない。
自分で調べた方がマシ
\ コピペしる
>>196 「¥」 = 「\」
Windowsの標準的なフォントではバックスラッシュと円記号が同じキャラクタコードに割り当てられていて
なおかつ、円記号しか表示されないようになっています。
エスケープシーケンス等を使用したければ、「¥」を使いましょう。
>>196 trigraph を使えばよい。
??/ ←このように3文字書けばバックスラッシュとして扱われる。
まあ日本語環境での話だけどね。
日本語環境ならJISコードにバックスラッシュが無いから、 本来はトライグラフを使わなければならないはずなんだよな。
永遠にスラッシュ=円記号って仕様を引っ張ろうとしている マイクロソフトの意思は理解できない。
なんでマイクロソフトのせいになるんだ
>>205 LinuxとかMacだとその仕様がもうとっくになくなってるんでしょう?
っていうか最初からなかったかもしれない
は?
英文フォントに変えてみろ
MSではなくJISに文句を言うべきだろう
コンソールアプリで何かキーを一つ押されたら(エンターキーが押されなくても)すぐに処理を進めるにはどうしたらいいですか
何かキーが一つ押されるまで処理を進めないようにすればいい。
kbhit()とか
それは関係ない。
conioのgetchでできましたありがとうございました。
グローバル変数使いまくりのプログラムをマルチスレッド化しようと思って まずグローバル変数を構造体に纏めて関数に構造体のポインタを渡して処理するよう改造したんですが 速度が約半分になってしまいました。 まだマルチスレッド化はしておらずシングルスレッドでの比較です。 何か改善する方法があれば教えてください。
プロファイリングしてどの部分で時間食ってるのか調べる方法をググれ。
ポインタ演算が増えたからだろ
ポインタ演算で速度が半分に落ちるとは思えない。 おそらく、どこかが期待通りのコードになってないんだろう。 ポインタ渡しのつもりが、全部コピーになってるとか
structを返す関数は仕様上遅い筈 逆に言えばCは言語仕様的に決して速度を最優先したものではない こと示す例
221 :
デフォルトの名無しさん :2009/10/11(日) 11:33:25
グローバルでは絶対番地だけでアクセスできていたのが、 構造体にした途端にベース+ディスプレースメント計算がいちいち必要になったんだろ それと別な話、マルチスレッド化ってことはコンテキストスイッチも入るから更に遅くなるはず 速度を気にするならシングルスレッドのまま二足のわらじを履いたほうがいい
はあ?
>>221 理論だけで語るなら、コンパイラの最適化とかCPUのパイプライン処理とかあるから、
アドレスの計算量が2倍になったくらいで、全体の処理速度が半分になるとは信じがたい。
マルチスレッド化しようと思って排他制御でも入れたんじゃね?
225 :
デフォルトの名無しさん :2009/10/11(日) 12:18:28
まあ、アドレス計算=全体の速度なわけはないな
>>215 は「ポインタを渡して」と言っているわけで引数に関しては無から有への変更だ
関数がインラインでない場合は分岐がパイプラインに影響しかねんし、仮にリンクレジスタ使ってもネストすれば結局メモリアクセスになる
最適化による自動 register 指定が逆効果(同時使用レジスタ数とメモリアクセスのジレンマ)ということも考えられる
電話相談で簡単に答えてしまう医者はすくなくともモグリか薮
227 :
デフォルトの名無しさん :2009/10/11(日) 12:54:08
ご心配なく 一番肝心なことは言ってないし
- 結果としてBASICが根幹にあるんですね。 どうしてでしょうか。 簡単で手軽、誰にでも学習の機会があることでしょうね。 CやHSPだとこうはいきません。 CやHSPだとAPIのノウハウが必要になりますし、それは大きな障壁となります。
1つの変数に複数の型の配列を入れたいんですが、 void **list = malloc(sizeof(void) * 2); list[0] = malloc(sizeof(char) * 10); list[1] = malloc(sizeof(int) * 10); とした場合、list[0]はcharポインタを指し、list[1]はintポインタを指してるという認識であってますでしょうか。 list[0]に10文字以上のcharを代入してもエラーが起きないのがよくわかりません。
( * )ここ
list[0]はvoid *だからchar *にキャストすれば、そのように捉えることもできるが 所詮メモリ上のバイト列だからどうとでも考えられる >list[0]に10文字以上のcharを代入してもエラーが起きない メモリチェックツール使えばエラーを捕えられるよ あとsizeof(void)じゃなくてsizeof(void *)じゃないかな
>>230 > list[0]はcharポインタを指し、list[1]はintポインタを指してるという認識であってますでしょうか。
あってません。
> list[0]に10文字以上のcharを代入してもエラーが起きないのがよくわかりません。
10文字以上のcharを代入したいプログラマがいるかもしれないから、エラーにはしない主義。
( * )ここ
>>230 >list[0]に10文字以上のcharを代入してもエラーが起きないのがよくわかりません。
Cの基本的考えは自己責任。
小さな政府&自己責任。
市場原理主義派のプログラミング言語です。
list[ * ]ここ
C99ですね、わかります オナニーは自分の部屋でやってください
list[ * ]ここ
何とC99が関係あるんだ
C99はマルス券の万能取り消し符号
そもそもsizeof(void)なんかコンパイラを通るの? voidはサイズなどなかったような…
242 :
デフォルトの名無しさん :2009/10/11(日) 22:58:03
> void **list = malloc(sizeof(void) * 2); シムラ〜後ろ後ろ > list[1] = malloc(sizeof(int) * 10); 本当にヤバいのは、むしろこっち
void(無形)として宣言してるものにint(有形)の型を代入してるもんな。 逆(void→int等)はキャストで可能だし普通に使うけど。
void*にint*を代入するのは全く問題ないだろう
245 :
デフォルトの名無しさん :2009/10/11(日) 23:47:26
malloc の戻りは常に void * なんだけどね list[x] がホーキング放射みたいに特徴がなくなるんだよ
複数の異なる型を保持したいなら配列じゃなくて構造体を使うべき。
共用体だろ
list[0]とlist[1]をまとめて1つの領域として扱いたがってるようには見えないが?
249 :
230 :2009/10/12(月) 00:52:19
mallocの質問した者です。 何故このようなことをしたいのかとうと、現在MySQL APIのラッパを作成しており、MySQLの仕様によると select int_col1, int_col2, str_col3 from master; のようなSQL結果を取得する場合、 int foo = int_col1; int bar = int_col2; char *baz = str_col3; のようにテーブルの型に合ったCの型へ代入するべきとあるのです。 SQLはどのような型が渡されるか実行時でないと判別できないため、共用体ではなくmallocによる動的確保を考えました。 mallocの方法でもエラーは出ないのですが、より良い対応はありますでしょうか。
> SQLはどのような型が渡されるか実行時でないと判別できない 普通SQLを実行する側がどのような型で取得すべきか知っているはず なので取得したい型で準備するだけ どんなラッパーを作ろうとしてるんだろ?
>>249 発行するSQL文の種類だけ、ラッパーを個別に用意するのはダメなん?
>select int_col1, int_col2, str_col3 from master;
なら、MySQLにおけるテーブルの型が既知な訳で、SQL文も規定されている訳だから
代入すべき変数の型もプログラム作成時に決まるはずでない?
>SQLはどのような型が渡されるか実行時でないと判別できないため
というのがイマイチ理解不能。動的に変化する検索結果のレコード数を気にして
mallocするならともかく。変数の型を抽象化する必要があるってことは、つまり
動的なSQL文にも対応できる、汎用的なラッパーを作りたいってこと?
>>251 説明不足ですいません、汎用的なフレームワークを作ろうとしてます。
そのため、どのようなクエリ(型)が送られてくるかは実行時まで不明です。
フレームワーク内で適切な型にオートマッピングさせておきたいのです。
好きなようにすればいいんじゃね? そこは C の問題じゃないだろ。
特定の変数をマクロで無効にする方法ってないですか? int 型の a という変数があって a はプログラムの色んな所(数百箇所)で参照されています。 この変数を「Debug時には使う、 Release時には使わない(変数自体無い)」という風にしたいんです。 一応、#ifdefで良さそうなんですが 結構、あちこちで参照されているので#ifdefで囲むと 手間がかかり、ソースも読みづらくなりそうです。 こんな時、あまりソースの変更をせずに変数を無効にすることって出来ますか? (例えば、変数の宣言の所だけを変えるだけで 変数の参照の部分も無効(コンパイルしない)にするなど・・・) #ifdefで一つ一つ書いてくしかないんでしょうか?
無効ってどういう意味だ
>>254 int a;
もし仮にこれをRelease時だけ消えるようにしたとしたら
このaを使ってる部分がエラーになるんだが
>254 どういう状況か今ひとつ把握できないのだが aを評価している式や式文も同じように(「Debug時には使う、Release時には使わない」)しないといけないと思うのですが 式や式文自体をマクロで囲っておいてコンパイルフラグ一発とかやったりはする #ifdef NDEBUG # define foo(expression) /* foo bar comment */ #else # define foo(expression) expression #endif /* NDEBUG */ int bar(int x) { x += 128; foo(fprintf(stderr, "x : %d\n", x)); return x; } みたいなのか
>>252 どういうフレームワークを作ろうとしているのかいまいちわからんが、
とりあえず全部文字列にして取得しとけばいいんじゃないの?
260 :
デフォルトの名無しさん :2009/10/12(月) 12:39:17
int *p; p = &p; *p = 3; printf("%p = %d\n",p,*p); ポインタ変数にもアドレスがあるのでそこを利用してpに&pを代入することで通常のローカル変数のように扱うことができる。 動かしてないのでわからんが、うちの脳内ではそれがうまくいくと信じてる。
>260 それはない
262 :
デフォルトの名無しさん :2009/10/12(月) 13:10:49
お前にはいってない
お前にはいりたい
お前に入れたい
お前にいれた
お前らいらね
267 :
デフォルトの名無しさん :2009/10/12(月) 13:41:23
コピペ君って馬鹿だな、まで読んだ。
"無効にしたい"って考えるから難しくなる。 "必要なときだけ有効にしたい"と考えればいい。
>>260 *p = 3 によって pがpのアドレスから3に書き換わるため、
*pでそこを参照しようとするのは危険。
0点 p = 3 と *p = 3 の違いからやりなおし
Or2=3;
>271 一般的なセマンティクスはそうだろうけど、>260ではint *にint **を代入している 暗黙の型変換でint **はint *に変換されて問題なく代入できる しかし、実際にはint **であるので、int *を間接参照してもそれはintではなくint *である 正確に言えば、シンタックス上はintであるが、>260のセマンティクス上はint *であるのだ よって、>270は正しいことを言っていると僕は考える あくまでセマンティクス上の話だからね、実行した場合は未定義動作だな
int** とint*暗黙的型変換が出来ることを好んでいるか否かは CPUによるから、一般的にはあんまりしないほうが良いだろな たとえ出来た場合でも、そのソースをその環境から出さないとい うのならともかくよそで使われることを想定するのなら 本質的に処理系依存であることを明示する為に キャスト演算子の直書きは避け 例えば int **pint2ppint_80x86(int *) int **pint2ppint_PowerPC_G5(int *) とか使うべきだろうな(マクロでも良いが) C++でクラスの場合は、直系クラス間でのポインタの相互運用性 は保証されている(できなければC++コンパイラと名乗る資格は 無い)からルールに沿って行うべきだが
BCCのフリー版では getopt() がつかえないみたいなんですが、 コマンドライン引数は一般的にどのように処理しているのでしょうか?
argvの内容を一つずつ取り出して評価していけばいいのでは?
>>276 今までそのようにしていたんですけど、getopt() を使う方が見た目も
すっきりしてわかりやすいので使ってみようと思いました。
BCCになかったので、何か代替のものがあるのかと思って質問しました。
getopt()は非標準
posixにあるのに?
posixはposix
CHAR_BITSってcharのbit数ですよね? charが8bitでintは12bitといった処理系も世の中にはあるらしいんですが、この場合1byteのbit数っていうのは何bitなんでしょうか? そもそもこのintは2byte?それとも1.5byte?
intは最低16ビットなければいけない いや、16ビットというふうに決まっているわけではないが、 少なくとも -32767 〜 +32767 の値を表現できなければならないので、 16ビット以上なければおかしい
int main(void) { char buf[LINE_BUF]; char buf2[LINE_BUF]; char *log[10]; char *log2[10]; FILE *fp = fopen("a.txt", "r"); FILE *fp2 = fopen("b.txt", "r"); while(fgets(buf, sizeof buf, fp)) { //printf("bufだよ%s",buf); //printf("%s", log[0]); while(fgets(buf2, sizeof buf2, fp2)) { //printf("buf2だよ%s",buf2); if(strncmp(buf,buf2,3)==0) { break; } else if(strncmp(buf,buf2,3)>0) { printf("%s",buf); break; } } } fclose(fp); return 0; }
int main(void) { char buf[LINE_BUF]; char buf2[LINE_BUF]; char *log[10]; char *log2[10]; FILE *fp = fopen("a.txt", "r"); FILE *fp2 = fopen("b.txt", "r"); while(fgets(buf, sizeof buf, fp))//NULLが返ってくるまで・・・ { while(fgets(buf2, sizeof buf2, fp2))//NULLが返ってくるまで・・・ { if(strncmp(buf,buf2,3)==0)//先頭から3文字が一致したらbreak { break; } else if(strncmp(buf,buf2,3)>0)//a.txtの行の値のほうが大きくなった=つまりb.txtにはもう存在しないため抜き出す { printf("%s",buf); break; } } } fclose(fp); return 0; } ファイルは降順にソートされています。 a.txtにあってb.txtない行を抜き出すプログラムのつもりですが、当然正常に処理されていません。 2重目のwhile文で、抜けるたびに行を先頭から見るいくにはどうしたらよいでしょうか?(今のプログラムだと抜けるたびに次の行へ移動してしまいます)
285 :
284 :2009/10/12(月) 22:41:42
見やすくそろえたつもりですが、左揃えになってますね。。。
>>285 Tabは削除されます
スペースはデータ上は残りますがブラウザの仕様で表示されません
長いソースを詠みやすい状態で貼り付ける時は別の方法を使うしかありません
>>286 そうでしたか。
1つ目のwhileの{の終わりがfcloseの上です。
2つ目のwhileの中にほとんどの処理が入っています。
見にくいと思いますが解読お願いします。。
>>284 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LINE_BUF 1024
int main(void)
{
char buf[LINE_BUF];
char buf2[LINE_BUF]="";
FILE *fp = fopen("a.txt", "r");
FILE *fp2 = fopen("b.txt", "r");
if(fp==NULL || fp2==NULL) exit(1);
while(fgets(buf, sizeof buf, fp))
{
if(feof(fp2) || strncmp(buf, buf2, 3)<0)
{
printf("%s",buf);
}
else
{
while(fgets(buf2, sizeof buf2, fp2) && strncmp(buf, buf2, 3)>=0)
;
}
}
fclose(fp);
fclose(fp2);
return 0;
}
290 :
284 :2009/10/12(月) 23:40:08
>>289 インデントのないコードは読まない事にしている
>>290 ちょっと面白かったw
専ブラでポップアップ表示しな
292 :
288 :2009/10/12(月) 23:47:37
>>289 細かい部分も修正ありがとうございます。
実行してみたのですが、a.txtの先頭行以外がすべて表示されるプログラムとなっています。。。
2chブラウザ開発しているやつって暇なの? エラー処理も満足に実装できない糞APIなのに、どうして頑張っちゃうの? ドカタ根性ってやつ?
>>292 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LINE_BUF 1024
int main(void)
{
char buf[LINE_BUF];
char buf2[LINE_BUF];
FILE *fp = fopen("a.txt", "r");
FILE *fp2 = fopen("b.txt", "r");
if(fp==NULL || fp2==NULL) exit(1);
fgets(buf2, sizeof buf2, fp2); // 追加
while(fgets(buf, sizeof buf, fp))
{
if(feof(fp2) || strncmp(buf, buf2, 3)>0) // 不等号の向きを変えた
{
printf("%s",buf);
}
else
{
while(fgets(buf2, sizeof buf2, fp2) && strncmp(buf, buf2, 3)<=0) // 不等号の向きを変えた
;
}
}
fclose(fp);
fclose(fp2);
return 0;
}
暗黙の型変換される訳ね―だろksg
アンカーつけろよ
Turbo C++ 1.01 のパッケのなかに getopt.c があるからそれ使えば?
インデントが1桁ってありえないわー 最低でも2桁だろう
インデントは8桁が正統
はい、またインデントは何桁がいいかが始まりましたが、 雑談は雑談スレでお願いします
そうそう。 今インデントを決める大事な話をしてるんだから、雑談なんかで邪魔するんじゃないぞ。
4タブや2タブは、画面の幅が640しかなかった時代の苦肉の策。 今は1920もあるんだから8タブに戻すべき。
変数名なども長くなる傾向にあるから、いくら画面の幅が広くてもあまりソースの幅が広がると単純に読みづらくなる ソースだけでなくプロパティウィンドウやデバッグ出力など色々なペインも並べなくちゃならないし 5-10-15…が適当
4桁が正義。 それだけ行っとく。
デフォルト8桁、お好みで4桁
>>305 インデントに使うキャラクタをいろいろ混在させないことだけが正義だろw
たしかに、半角スペースとハードタブが入り混じったソースを見るとイラっと来るわ それでもインデントが整ってればまだいいんだけど(エディタのマクロでハードタブに一括置換すればいいから)、 たまに半角スペースが1個足りなかったり多かったりする行とかあるのな
タブの手前に紛れ込んでるスペースがクソw
整形ツール使えよ
>>308 ネットからコピペするとそうなりやすい。。
俺はそういうの気になるから一つ一つ既存のコードにあわせて修正してるけどな。
>>312 自分で作ったわけじゃない
どっかで公開されてたのを拾っただけ
>>312 エディタが何かも判らずクレクレ言うような奴には
つ彡テイッ! [map T 1G!Gunexpand -a -t 4^V^M]
昔は GNU indent とか使って整形したこともあったけど 今はxyzzy上でワンキーで自分好みに整形するだけだな。読むときは。
indentは微妙に好みの設定にできないから嫌。
・n x { ごとに、行頭からisgraph()が真になるまでの0個以上の半角スペースおよびタブを、n x 1個のタブに置き換える。 ・{ ごとに、n++する。 ・} ごとに、n--する。 っていう整形ツールでも作ればいいじゃない。
318 :
デフォルトの名無しさん :2009/10/13(火) 18:55:45
で } が多すぎた瞬間に自爆とか、楽しそう
タブ厨氏ね
注意していても誤字脱字が多くて困っています。 少なくする方法を知りませんか?
>>317 printf("{");
まぁ、gg=Gとかですませる。
>>321 いや、そこはなんかちが、、、
tabでキーワード補完しろという意味じゃないよね?
ちょっとスレチかもしれんが、みんなは「自分だけが使う小物ツール」とかよく作るほう? 自分がC初心者の頃は、学習を兼ねて例え同じようなものがフリーであっても作ってみたりしてた。
>>323 作るよ。
問題解決のためにふつーにプログラミングできるようになって一人前。
自分だけの環境を構築するなら、プログラミング必須だろ。
float型の配列のソート方法が分からなくて困っています. 配列の数は9個で,降順,昇順どちらでも構いません. 中身は,float f_hairetu[9] = {145.20, 55.32, 33.20, 55.55, 348.99, 12.01, 1.29, 88.29, 0.98} などのデータが入っています.
qsortつかえば
329 :
デフォルトの名無しさん :2009/10/14(水) 08:14:38
ソースファイルから、 define、グローバル変数、関数名 などなどの情報を抜き出して一覧化してくれるフリーソフトがありましたら教えてください。
330 :
デフォルトの名無しさん :2009/10/14(水) 08:34:12
doxygen
331 :
327 :2009/10/14(水) 09:18:10
>>328 ありがとうございます。qsort関数は、検索してint型のソートなら良さげなサンプルが見つかったのですが、float型のものは見つからず仕様も良く分からなくて困っています。
int compare(const void *p1, const void *p2) | float f1 = *(float *)p1, f2 = *(float *)p2; if (f1 == f2) return 0; return f1 > f2 ? -1:1; } int main() { float data[] = { ... }; qsort(data, sizeof(data)/sizeof(data[0]), sizeof(data[0]), compare); ... }
まあそれだとNaNが含まれてるときソートできないな
NaNとかなる
NaNってC言語の比較内で判定できるのか
C99ならできる
C99なら △ C99では ○ C99においては ◎
>int型のソートなら良さげなサンプル 2項を引き算してたりしてw
>>337 それは意味が変わっているだろ。
「C89ではNaNを正しく扱えないが、C99において*なら*できる」
の省略としての「C99なら」なのだから「なら」を取ってしまってはいけない。
>>339 素直にC89ではできないと述べれば良い
sizeof(long)==sizeof(float) なら、これでも比較できる int float_compare(const void *a, const void *b){ const long *p, *q; p=a; q=b; if(*p<*q) return -1; if(*p>*q) return 1; return 0; }
floatのときとlongのときとで大小関係が一致することは確実なの?
float のフォーマットに依存しないかい? IEEE754 だと、上位から 符号 指数部 仮数部 の並びだけど… うまくいくのかな?
345 :
デフォルトの名無しさん :2009/10/14(水) 12:35:08
10分置きに実行するってのは Sleep(600000);でいいの?
だめ それだと10分+αになる αの長さは不定
ソート順なんでもいいみたいだからいいんじゃね 処理系依存の何らかの順番でソートされるであろう
349 :
デフォルトの名無しさん :2009/10/14(水) 13:53:59
大小関係に矛盾があると未定義の動作だぜbaby
>>349 数値としての大小関係に一致するかはともかく、
大小関係を定義するcompare関数としての動作に矛盾はないかと?
>>349 compare(p1,p2) が 正の値を戻すとき
compare(p2,p1) が負の値を戻さないのなら そうだろうね
#define TEST 1 #define TEST2 2 #define TEST3 3 こんなことをして プログラムの中で、TEST3 を使ってみたのですが 期待通りTEST3は3に置き換えられていました。 ふと、TESTは1に置き換えられるから、TEST3は13になったりしないのかと 思ったのですが、なぜ大丈夫だったのでしょうか?
cppはちゃんと考えて置換してくれるんだよ
355 :
デフォルトの名無しさん :2009/10/14(水) 20:12:08
今まで色んなライブラリを作ってきたんだけど、それらの機能を統合したライブラリを作りたいんだ。 でも、ただ一緒にしようとしたら、.libファイルが無駄に多くなって使いづらくなっちゃって… この多くの.libファイルを一つの.libファイルにまとめたいのだが、何か方法はないかな? 開発環境はVisual Studio 2008 (Visual C++)で、出来れば嬉しい。 前作ったプロジェクトは、ライブラリが完成した後にHDDの整理で消してしまってるから、もうないんだ。
>>357 教科書のタイトルと、今使ってる処理系の名前かけよ
>>357 どんなエラーが出たのかも言わずに解説しろとな?
codepadのエラーからエスパーすると「conio.hが無い」ってエラーが出てるじゃんとしか言いようがありません。
360 :
357 :2009/10/14(水) 23:46:09
よっしゃ 教科書 「すぐわかるC/C++」塚越一雄 エラー 「error C3861: 'get_charset': 識別子が見つかりませんでした」 ちなみに環境はvisualc++2008exedition
知らんけど、本のどこかにget_charsetの定義あるだろ。探せよ
そうだね、飛ばすという発想がそもそも間違っていたと反省中。 地道に勉強します
飛ばすとかじゃなくてコピペしてくるコードが足りないだけだろうが……
364 :
デフォルトの名無しさん :2009/10/15(木) 00:21:28
C++ スレの二の舞か 答えない奴は説教もするな
365 :
デフォルトの名無しさん :2009/10/15(木) 00:24:13
整数値を入力してください:33 3-->6-->9-->12-->15-->18-->21-->24-->27-->30-->33--> って感じのプログラムを書かないけないんだが誰か教えてくれ。 for?とかなんかそういうのを使ったりしてるんだが全くできねえ。 33ってのは入力した数で、その入力した数までの三の倍数が表示されないといけないらしい・・・
>>365 そんな事は無いよ、表示されなくていいよ。
宿題なら宿題スレへ
ふつーに、 3から始めて、33以下である間、3ずつインクリメント
最近の小学校ってこんな高度な授業があるのか。 大変だな。
マイクロソフトロックされるのですがどうしたらいいでしょうか?
scanf("%d",&a); a = a/3; for(b=1;b<=a;b++){ printf("%d-->",b*3); }
372 :
デフォルトの名無しさん :2009/10/15(木) 01:24:49
できたぜ! まさか答えてくれる人がいるとは・・・ 本当にありがとうございます!!!
int i, n; scanf("%d", &n); for(i=3; i<=n; i+=3) printf("%d-->", i);
setvbuf()ってどういうときに使うの?
基本の教科書の内容をクリアして、応用に入るためのわかりやすい参考書あったら教えてください。
何に応用しようとしてるのかが分からないと、勧めようがない。
specificationとusageは別物だと思うが
>>378 特に無いんですが、もっとCに詳しくなりたくて・・・
>>381 実際に何かソフトを作ってみれば自然と詳しくなる
何か便利なツールが欲しくなったとき、誰かが作ったフリーウェアを探すんじゃなくて自分で作ることをまず考える
CではCPUをOCするソフトは作れないんですよね?
385 :
デフォルトの名無しさん :2009/10/15(木) 23:31:29
ちょっとハードいじる必要があるが不可能ではない
そうんですか。インターフェースって雑誌でそれが出来ないのがCの弱点みたいなことが 書いてあったんで。まだレベル的に意味がよく分からないんですけど
その雑誌だとどの言語ならそれができると書かれていたの?
Pascalです
いや、C入門の特集だったんで。大学の図書館のやつで まだ組み込みはやる気ないんでちゃんと読んではいないです
コンピュータの中、ソフトウェアのレベルでは何でも出来るんだけどって話かな。 個人的にはC言語で飯が炊ければと・・・
最近のOCって、BIOSで設定変えるだけだったりするよね。 昔はハード的に別クロック入れてたけど。
正確にはOCとは書いてなかったんですけど、たぶん
>>390 みたいな話だと思います
Pascalだとできるというのがよく分からんのだけど、まあそうなんでしょう
>>390 炊飯ジャーのプログラムはCだっったりするんじゃないの
>>395 現状自分でプログラムできないよねってこと。
外出先から携帯でもつかって、自宅の飯の支度ができたら楽だと思うんだ。
おいしく炊くのは難しいかもしれないけど、 ちょっと古いタイプの炊飯器なら個人でも制御できると思うよ 高校の時にポケコンで制御してるやつがいた
「CPUをオープンコレクタする」って何じゃい、と一瞬考えてしまった。
cosの計算をするプログラムなんですけど #include <stdio.h> #include <math.h> main(){ double a,b; scanf("%lf",&a); b=cos(a); printf("b=%lf",b); } 正確に計算してもらえません どこがいけないのでしょうか?
>>399 取り敢えず、0を入れたら1が出力されるのは確認した?
正確じゃないのは仕方ないよ
何を入力して何を期待して何が出力されたのかくらい書けよ
>>396 Cだとそれができないというのは変な話だな
炊飯器のボタンの上にアームをつけてそれを制御すればいいじゃん 例のジョークRFCを実装したコーヒーポットとかそんな感じだろ
良く読むと HTCPCP準拠の実装じゃなかった
◆宣伝、広告◆
腕に自信のあるプログラマは、以下のコンピュータ大富豪大会に参加しましょう。
ひろゆき杯コンピュータ大富豪大会
http://uecda.nishino-lab.jp/2009/ ○What's UECda?
大貧民(または大富豪)は、我が国で最もポピュラーなトランプ・ゲームのひとつでしょう。
このゲームは、1960年頃に日本で生まれたと言われており、海外では、ほとんどプレイされていないようです。
本大会は、その日本固有の人気トランプ・ゲームである大貧民を、人が直接プレイするのではなく、
プレイするコンピュータ・プログラムを作成して持ち寄り、対戦させる大会です。
主催
電気通信大学
でたらめ言うな 中国でも有名なゲームだ
ふつう海外に中国は入らない
>>401 したよ
πいれても1になっちゃったけどね
ほかにもπ/3なんかも1になる
πを3.14・・・にしたらなんかできました なんでπだとだめだったんだろう
( ゚д゚)ポカーン
なるほど、数値入力の場面で「π」を入力したのか。 んで、たまたまaの初期値が0だったから1になったんだな。 当然、「π/3」を入れても同じ結果なわけだ。
PIと入れればよかったのに
scanfが数式を勝手に変換してくれると思ってたのか
まあ言いたいことは分かるけどね…
419 :
デフォルトの名無しさん :2009/10/16(金) 19:46:51
int i = 3; このとき i=i+1;やi++;や++i ; の意味は分かっていますが、 i = i++; は未定義の動作になるのですね。 i = ++i; はどうでしょうか? これも未定義の動作になりますか?
未定義です。
422 :
デフォルトの名無しさん :2009/10/17(土) 00:03:50
ポインタを勉強中なんですが、voidポインタに一度格納したlong値を 表示するにはどうやれば良いのでしょうか。 下記例ではコンパイルが通りません。 long a = 10; void *p = &a; printf("%f", *p);
423 :
デフォルトの名無しさん :2009/10/17(土) 00:05:29
ポインタを勉強中です。 voidポインタに格納したlong値を表示するにはどうやれば良いのでしょうか。 次の実装ではエラーが起きてしまいます。 long a = 3.14; void *p = &a; printf("%f", *p);
>>423 printf("%ld", *((long*)p));
なんだか、2ちゃんねるがおかしい。 重くてやってらんね。 もう寝る...
426 :
デフォルトの名無しさん :2009/10/17(土) 01:00:54
重くないのだが・・・
428 :
327 :2009/10/17(土) 01:04:39
レス下さった皆様ありがとうございました. いつもこのスレにはお世話になってます.m(_ _)m
重いよ
どういたしまして
433 :
デフォルトの名無しさん :2009/10/17(土) 03:23:07
(´・ω・`)←さっきポイ捨てされたこれを踏んだ。祝日。
今から学ぶとしたらC/C++/Javaどれが一番最初がいい?
次に書き込んだときの秒数が1〜3ならC、4〜6ならC++、7〜9ならJava、0なら全部
最初はインタプリタの方がなじみやすいと思う
Cだったな
short x; x = (x+0x4000) >> 15; このコードの意味を教えてください
>>439 if(x+0x4000>=0) x=0;
else x=-1;
xたす0掛ける4000が15より十分大きいかどうかの真偽値をxに代入
442 :
デフォルトの名無しさん :2009/10/17(土) 12:44:39
>>はビットシフトで切り捨ての処理だと思うんですが,0x4000 を加算する理由がわかりません
実装依存だからこのコードに確かな意味は無いよ
>>442 上位1ビットが整数部、下位15ビットが小数部の固定少数で、
四捨五入してんじゃね?
classのprivateにしたら、そのクラス以外アクセスできないと聞いていたが ポインタでメンバーにアクセスできんぞ、いいのかこれ
設計上良いか悪いかはあるけど、仕様の上では問題ない
>>445 なんか無理やりなことをしないとアクセスできないだろ?
それにここ、Cのスレだし。
ぐぐってみたらコンパイル前にしかprivate,publicは影響しないんだな
449 :
447 :2009/10/17(土) 13:32:07
よく考えたら、無理やりじゃなくても、メンバ変数のポインタを外にだすメンバ関数があればそうなるのか。 メンバ変数のナマのハンドルやら外にだすなってのは、オブジェクト指向のお作法本によく書いてあるな。
>>439 int main(void)
{
short x;
short y;
for(x=-32768;x<=32767;x++)
{
y=(x+0x4000)
>>15 ;
printf("x=%d y=%d\n",x,y);
}
return 0;
}
double型の変数にビットシフトはできないですか? 値を2倍、4倍,8倍としたいんですが
円周率を出力するプログラムpi.exeがあったとして、これを一度pi.datに出力して double pi = #include "pi.dat" ; とすればpiには円周率が入りますが、一度ファイルに出力をせずにそのままほかのプログラムの出力結果をincludeするといったことはできないでしょうか?
指数部があるからね
>>452 doubleに入れるくらいの桁数なら、ソースに直書きでいいんじゃね?
円周率ってmath.hで定義されてなかったけ
456 :
452 :2009/10/17(土) 14:38:24
>>454 すいません円周率は例で、ファイル経由せずにプログラムの出力をincludeする方法が知りたいんです
# define M_PI 3.14159265358979323846 /* pi */
こんにちは。どなたかC♯でBMI計算プログラムをvisual studio 2008 もしくは2005 で作成してアップしてくださいませんか・・・? そのプロジェクトフォルダ全部をアップお願いします。
いつからここは丸投げスレになったんだ?
マルチしてるバカがいるんだよ
#include "/dev/tty○○" とかしたら
何となく書いたら1レス前に既出だった……
466 :
デフォルトの名無しさん :2009/10/17(土) 17:29:57
const float *const hoge; これはどういったポインタなんでしょうか?;
>>466 const float *hoge;
*hoge = 1.0; //エラー
hoge = NULL; //OK
float const *hoge;
同上
float * const hoge;
*hoge = 1.0; //OK
hoge = NULL; //エラー
>>468 ポインタがさす実体は変えれない。
さすところは変えれます
const float *hoge;
*hoge = 1.0; //エラー
hoge = NULL; //OK
?
float const *hoge;
同上
?
float * const hoge;
*hoge = 1.0; //OK
hoge = NULL; //エラー
よくわかりません。 *がどこに関連するのかが見えません
基数ソートの勉強をしています。 16ビット長の値(unsigned short)を4ビットずつ分割して、その分布を調べて ソートする、というアルゴリズムらしいのですが、ちょっとわからない点があります。 2^4 = 16 ですから、分布を数えるために使う配列は int count[16] と宣言しました。 16ビット長の値を4ビットずつ分割して(分割された値を A とします)、その分布を調べるわけですが、 教科書にあるコードは count[A & 0x0f]++; となっています。 ここで、A & 0x0f するのはどうしてでしょうか? A は4ビット長なわけですから、大きさ16の配列 count に収まるはずです。 なぜ、わざわざ 0x0f との論理積を求めるのか謎です。 よろしくお願いします。
じゃあ float other = -1.0; const float *hoge1 = &other; float const *hoge2 = &other; float * const hoge3 = &other; const float * const hoge4 = &other; のように直してそれぞれコンパイルしてみろ。
>>466 float型のconst変数を指すポインタ型のconst変数
float a; // float型の変数
const float b; // float型のconst変数
const float *c; // float型のconst変数を指すポインタ型の変数
const float *const d; // float型のconst変数を指すポインタ型のconst変数
>>470 unsignedで4bitに収まる保証があるなら論理積とらなくてもいいよ
>>470 それだけじゃ分からん。Aの時点ではまだ4bitに分割しきれてないとか。
>>473 あ、すみません。。
ソース読み直してみたら、僕が勘違いしていますた。
忘れてください。
低水準ファイル入出力を使うメリットを教えてください
>>476 それを聞くような人にとってはメリットはありません
C言語始めたばかりでまだifとforぐらいしか使えません 2で割れる数、5で割れる数、2と5で割れる数を1000個目まで出力したいのですがうまくカウントできません for ( k = 1 ,count =1 ; count <= 1000 ; k++, count=count+1) { if( k%5==0 && k%2==0){ printf("%dは5,2で割り切れます。%d回目 \n" , k,count) ; }else if(k%2==0){ printf("%dは2で割り切れます。 %d回目 \n" , k ,count) ; }else if(k%5==0){ printf("%dは5で割り切れます。 %d回目 \n" , k,count ) ; } } こんな感じで書いたのですがどこが悪いんでしょうか?
別に悪くないよ?
for ( k = 1 ,count =1 ; count <= 1000 ; k++) { if( k%5==0 && k%2==0){ printf("%dは5,2で割り切れます。%d回目 \n" , k,count++) ; }else if(k%2==0){ printf("%dは2で割り切れます。 %d回目 \n" , k ,count++) ; }else if(k%5==0){ printf("%dは5で割り切れます。 %d回目 \n" , k,count++) ; } } よくわからんが、こういうこと?
if( k%5==0 && k%2==0){ これはこうも書けるな if( k%10==0 ){
↑ 数学厨おつ
483 :
482 :2009/10/18(日) 12:27:37
あ、なんでもないっす^^ さーせん w
なんでもないことないだろう そこんとこ詳しく教えてくれないかな
485 :
デフォルトの名無しさん :2009/10/18(日) 12:33:56
略 a='d' b='h' 略 fprintf(file,"abc%c efg%c",a,b); とすると出力が abcd efgh といった具合に自動で開業されてしまいます。 させな方法はありますか? abcd efgh と出力させたい
>>480 ありがとうございます
望んでいたような結果が出力されました
ちなみに丁度1000個目だけを出力することってできますか?
if(count==1000)のときだと違う結果が出力されてしまいます。
>>485 改行されてるのはどうやって確認したの?
実際に入ってる改行コードは何
488 :
デフォルトの名無しさん :2009/10/18(日) 12:48:45
>>487 windows、VC++でコンパイルしてできた.exeを実行しました。
改行コード \n,\rとかですか?
489 :
デフォルトの名無しさん :2009/10/18(日) 12:58:28
fscanfで読もうとしている、に1000ペリカ
490 :
デフォルトの名無しさん :2009/10/18(日) 13:02:29
fscanfはつかってないのに?ww
全角スペース。
C体験記じゃんw
>>488 いやいや、実行してできたファイルをダンプしたりしてみてよ
デバッガは使えないのかな?
その実際のコード貼れよ。 その例みたいに全角スペースなのか?
>>486 for(k=1,cnt=1; ; k++) if(k%2==0 || k%5==0) if(cnt++ == 1000) break;
printf("%d", k);
>>485 別のプロセスで出力ファイルが開かれてたりして、実際には書き込まれてないんじゃないかな。
>>496 そのプログラムちょっとミスって
fork(k=1,cnt=1; ; k++) if(k%2==0 || k%5==0) if(cnt++ == 1000) break;
printf("%d", k);
ってやったら大変なことになっちゃったんだけど。
絶対落ちないって有名なLinuxが二度と起動しなくなった。
コンパイル通るのか?
アホか。 ゾンビプロセスが増えただけで、カーネルは落ちてないだろ。 死ねよマルエツマカ。
コンパイルできない
>>498 はいはい、面白い面白い。
これで満足?
>491 間違っている部分は、直してあげた方がいいのか。 >498 俺様fork()ならたぶんコンパイルできると思うけど、一般的なfork()ではコンパイルできないと思われる。
またマルエツマカが荒らしてる
505 :
485 :2009/10/18(日) 14:38:59
506 :
485 :2009/10/18(日) 14:42:58
コード貼れっつーの。 勝手に改行なんてしねえよ。 何かミスってるだけだろ。
>>506 どうやって改行してることを確認したかってのはまさにそのことが知りたかったのだけど。
使ってるエディタやコントロールが、自動で折り返したんじゃないかと。
だからファイルに出力したらダンプやバイナリエディタで改行コードが入ってるのか調べてみなさいよ、と。
Q1: QUESTION1; ←ヘッダーにあるdefineで問題呼び出し fgets (buf, sizeof (buf), stdin); sscanf (buf, "%d", &ans); if (1 <= ans && ans <= 3 ){ if (ans == 2){ printf("正解\n"); point++; }else{ printf("はずれ\n"); } }else{ printf("1〜3の数字おして。もっかい。\n"); goto Q1; } Q2: ans = 0; QUESTION2; 以下ループ 3択クイズ形式学習プログラムを作ったのですが、fgets→sscanfのところで数字を入力してEnterを押すと、 次の問題のif文のelseが1度実行される(1〜3を押せエラー→Gotoで問題が2回表示される)のですが、 なぜそうなるのかわからず対処できません。 単純にエンターを1回押してるのに入力を2回(複数回)受け付けてるだけなんでしょうか・・? もし、そうならどのように対処すればいいのでしょうか。
これの前後の部分に問題ありってことだね。 「問題」ってのは question じゃなくて problem な。
>>510 ?
3択クイズの問題 = question
すげえ読解力だな。
const char * name[] = {"aaa" , "bbb" , "ccc" , "ddd" , "eee" , "fff"}; このとき、 name の要素数を取得するにはどうすれば良いでしょうか?
514 :
513 :2009/10/18(日) 20:12:38
すみません。 ちょっと撤回します。 失礼しました。
>>119 の
for (cnt = 0; cnt < no; ++cnt) {}の方が見慣れてるって本当?
入門書ってだいたい
for(cnt = 0; cnt < no; cnt++){}ってかいてあるけど
>>515 「見慣れてる」ってのは0からカウントするってところだろ。
517 :
デフォルトの名無しさん :2009/10/18(日) 20:47:42
> cnt++ その世代に言わせると整数は i だろ
cntならiのほうがいいな。
>>515 C++の流儀だな。
cnt++より++cntの方が、オブジェクトを生成しない分高速。
usage: command.exe 〜みたいなコマンドのヘルプを表示させるとき、決まった構文ルールはあるの? 省略可能なオプションは[]とか、必須オプションは<>とか。
正規表現の簡易型みたいな感じだろ。
char型の変数の中身を参照するときに文字コードとして扱いたいときは if(moji[0] == 115) のような形でいいんでしょうか?
はい ただし char は符号付きの場合があるので 128 以上の値の扱いに気をつけて
stdinの中身を確認する方法ないですか? 空かどうかわかるだけでもいいです。
空とはどういう状態か?
feof() 辺りかな? つーか、これを使う機会って無いよな。
ああ、もしかして stdin の接続先のことなのかな? 質問が曖昧で難しいな。
エスパーに期待してるんだよ
「中身」ってなんだよ? 普通に getchar() で読めば良いだろ。
エスパーすると、kbhit
入力した数字が素数かどうか判別するプログラム作ったんだけど2と3が判別できない どこが違ってる? for(b = 2 ; b<=a/2 ; b=b+1){ if(a%b == 0){ printf("%dは素数ではありません。" ,a); break; } else { printf("%dは素数です。" ,a); break; } }
判別の基準が間違ってる。
4とか5なら判別できるのか?それ
9とか15とか
b = 2 ; b<=a/2 ってaが2や3の時はね
ループの意味がないw
539 :
デフォルトの名無しさん :2009/10/19(月) 06:47:26
||って一つ目左が真なら右の判定を行うってこと? 偽なら右判定はしないのか?
||は左が真の時点で右の判定を行わない。 &&は左が偽なら右の判定を行わない。
ありがとう
542 :
525 :2009/10/19(月) 07:49:18
void sgets(char *buf,int n) { int i; char c; for(i=0;i<n;i++){ c=getchar(); if(c=='\n'){ break; } buf[i]=c; } /*入力バッファを空読みする*/ if(i==n){ while(getchar()!='\n'); } /*文字数が一文字以外は最後に'\n'を加える*/ if(i!=1){ buf[i]=NULL; } } 525です。 上の関数を呼び出した後、入力バッファが空読みされたかどうかをmainで確認 する方法を教えてください。
>542 ひどいコードだ
>>542 空読みする方法は無いと思え。
初心者なら尚更
再帰を使わないで処理する方法はありますか?
>再帰を使わないで処理する方法はありますか? 再帰を使わないで処理する方法はないと思うのですか?
総ての再帰は展開できるはずなんだっけか
549 :
デフォルトの名無しさん :2009/10/19(月) 17:35:27
再帰ってなんですか? まだ勉強をはじめたばかりなのでわかりません。
void func() { func(); } ↑みたいなのが再帰です
数学的帰納法のなかまです
>>547 EOFは読もうとしないと意味がない。
従って、入力が空かどうかは「読み出そうとしたときは空だったかどうか」わかるというだけ。
箱の中の猫は見ようとしたときだけ生きてるか死んでるかわかるというだけ。
うぜえよお前。
>>553 え?
見ようとしなければ生きてるか死んでるか分からないが、どっちかだと言っている?
556 :
デフォルトの名無しさん :2009/10/19(月) 21:30:11
箱の中の猫に心拍計を取り付けて、遠隔でモニタすれば箱を開けなくても生死の別は判断可能
それは箱に覗き窓が付いてるのと同じこと
それが量子的な現象の影響だとしても 確率的だと言うのはマクロスケールでは現実的ないと思うよ
>>547 改行まで空読みしてるだけだろ?
なんでEOFが関係あるんだ。
上のほうの「空読みする方法はない」とか、なんか空読みが
別のものと勘違いされる。
542にEOFのチェックがないんだけど
>>556 心拍計が壊れている可能性がある
心拍計が正常かどうかを確かめる装置を用意してもそれが壊れているかもしれない
以下無限ループ
つサーモグラフィー
だからそういう話しじゃないが サーモグラフィーで観測した瞬間に猫の生死状態が確定するというお話。
そもそも箱の中に猫が存在しているかどうかや箱の中に猫が入るような空間が本当に存在しているかどうかなんかも観測しなければ未確定。
物理板でやれぼけども
物理学者とは犬猿の仲だろjk
>>565 ×ぼけども
○ぼけ
×物理板
○50代板
そのジョーク、いまいち面白くない。
569 :
デフォルトの名無しさん :2009/10/20(火) 00:37:05
ぼけは、私が見ているときにしか、そこにいないのか
じゃあ人間が箱の中に入れば良いだろ馬鹿が
それを訊いてるんじゃないでしょ? > 実際に文字を読み込まずに読む文字があるかどうか確かめ られたかどうかを訊いてるんじゃないの
#if defined(DEBUG) | defined(_DEBUG) と #if defined(DEBUG) || defined(_DEBUG) の違いってわかります?要は|と||なんですが。。。
× Apple II ○ Apple ][
577 :
576 :2009/10/20(火) 05:28:53
578 :
525 :2009/10/20(火) 07:45:46
525です。
いろいろ回答ありがとうございます。
自分の意図としては
>>571 で言っている通りで、それをmainで確かめる
方法を探していたんですけど、難しいのであきらめて違う方法を探してみます。
わかりづらい質問ですいませんでした
579 :
523 :2009/10/20(火) 12:05:26
>>524 ありがとうございます
unsigned charを使えば問題なさそうでした
トリップ生成プログラムなんかを試しに作ってみたいんですがgccでコンパイルしたところ以下のエラーが出ます
trip.c:36: error: parse error before "salt"
trip.c:79: error: incompatible types in assignment
79行目のエラーに関してはきっと自分がcrypt関数についてよくわかってないだけな気がするんですが、
36行目のエラーの原因がいまいちわかりません
今までこういう構文エラーの原因は大体前の行に;を忘れていたくらいだったのですが・・・
ttp://f50.aaa.livedoor.jp/~iwazaki/uploader/src/up4250.bin どうかよろしくお願いします
> else(salt[i] == '`') このような構文は無い elseに条件式は付かない
>>573 |はビット演算のORで||は論理演算のORじゃなかろか
][ 表記は10kBASICからだな
583 :
579 :2009/10/20(火) 14:01:41
>>580 参考書引っ張ってきて読んだのにこんなミスするなんて・・・
どうもありがとうございました
>>581 俺もそう思う。
上は必ず両辺が評価され、下は必ずしも両辺が評価されないという差も出てくるが、
それがこの場合にどう影響するかがわからん
事実上、全く同じだね。
3項演算子に空文は使えないんですか。そういう場合はif文で冗長にやるしかないんですか (aaa == bbb) ? flag = true : ; ;
>>586 flag = (aaa == bbb) ? true : flag ;
というかそこに代入処理を書くのはif文が冗長だと思える人から見てスマートな記述なの?
(aaa == bbb) ? flag = true : 0 ;
いまどきのコンパイラなら3項演算子もif文(処理が一行)もかわらない ってことはないですか?
590 :
デフォルトの名無しさん :2009/10/20(火) 22:12:38
コンパイラの短縮処理は異常
>>589 「かわらないから、読みやすいifのほうがいいじゃん」ってこと?
短い場合は3項のほうがifより見やすい俺
今読んでるOCamlの本は、 if x < 30 then kihonkyu + x * jikyu else kihonkyu + x * yugu_jikyu より kihonkyu + x * (if x < 30 then jikyu else yugu_jikyu) のほうを薦めてるな。
>>593 そここそ3項演算子だと思うが、その本ではifですか
OCamlっていう言語だたのね。 3項演算子が無い言語ってことかな。
値を持ってるifと条件演算子は同じだろ。
>>593 これ見て「うわifだ、条件演算子がない言語って不便ね」みたいな
感想をもつやつは、たぶん条件演算子も使えてない。
そんな感想持ってるやつは今のところいなさそうだが、誰に向けてレスしてんだ?
レスじゃないよ。
>>593 を見て、ifと条件演算子の脳内置き換えができないやつを評してる。
いるかどうかもわからないヤツを想像してまで叩きたいのかw
話がずれてるな。
処理したくない場合、どう書くかについての話だろ?
>>593 はななめってる
こんなマヌケな書き込みしといて、まだバレてないとか、ごまかせるとか思ってるのか。
>>601 いやぜんぜんななめじゃないよ。
条件演算子を効率のためにつかってるって思ってるやつに、
そうじゃないって例を示しただけ。
こんな簡単な例じゃどっともかわらねぇよ
>>586 使えない。値を返す必要があるから空文があったら困るだろ。
どうしてもってことなら適当な変数でx=xとか入れときゃいいんじゃね?
>>586 > (aaa == bbb) ? flag = true : ; ;
つーか、式を返す形で使わなきゃダメだろ。色々と。
>>606 みて分かれよ。
プログラミングの基礎って本に載ってるぞ。
サイエンス社2300円。
高い
>>604 > 条件演算子を効率のためにつかってるって思ってるやつに、
> そうじゃないって例を示した
だから、ななめじゃん
三項演算子は値を返すから 変数 = 条件?成功:失敗; return 条件?成功:失敗; みたいな形でよく使われる。 良く使われるということは、そう書くとみんな理解しやすい。 コンパイラ的に見ると if ( 条件 ) 変数=成功 else 変数=失敗; と吐き出されるコードは多分一緒。 逆に言えば、値を返す必要のないときに 三項演算子を使うのは理解しにくい?
C++だと初期化でたまに使いたくなる
>>612 「ななめじゃん」って一言レスしてれば、ななめだってことにできると思ってるのか。
いまだに三項演算子なんて言う人がいるとは
if ( 条件 ) 変数=成功 else 変数=失敗; より ( 条件 ) ? 変数=成功 : 変数=失敗; の方がコード量減るからいいじゃん。 プロはこの辺の効率も求めていかなければならない。
七行スレから来ました
619 :
デフォルトの名無しさん :2009/10/20(火) 23:48:36
ご教授お願い致します。 以下のような文字列から数字部分(10桁)の「1111111112」だけを抜き出したいと思います。 但し以下のような条件があります。 ・数字の前は必ず「AAA」があります。 ・下記はカンマ区切りだけど、カンマ区切りとは限りません ------------------------------------- あいうえお,AAA1111111112,かきこけこ ------------------------------------- strstr関数など、いろいろ試してみたのですがどうもうまくいきません。 皆様、よろしくお願い致します。 こんなのもわからなくて恥ずかしいです。。。。
宿題は宿題スレへ
>>617 > ( 条件 ) ? 変数=成功 : 変数=失敗;
変数 = ( 条件 ) ? 成功 : 失敗;
普通こうでしょ…?
622 :
デフォルトの名無しさん :2009/10/20(火) 23:50:49
623 :
デフォルトの名無しさん :2009/10/20(火) 23:55:02
了解。宿題すれにいきマイケル。
>>624 代入するのは成功か失敗かなのに?
あとから二ヶ所でチェックするんですか?(笑)
てか"文"を書くなと。
>>586 aaa == bbb && flag = true;
if ( aaa == bbb || (flag = false,0) ) flag = true;
アホだw
ちょっとした質問なんですが scanf関数で数字を入力する際に 数字を打ち込みエンターキーを押すと改行してしまいます もう一度数字を入力すると、前に打ち込んだ数字が認識されます 二度目の数字を入力しないと、ずっと改行しつづけます この仕様はどうにかならないんでしょうか
scanf()の使い方を間違ってる
635 :
633 :2009/10/21(水) 03:14:31
636 :
633 :2009/10/21(水) 03:17:40
今見たら、
>>634 さんの言うとおり
scanf()の中に\nを混ぜてしまっていました
お粗末な質問に答えていただき有難うございました
うむ
638 :
634 :2009/10/21(水) 07:49:24
お前が言うなw
よきにはからえ
条件演算子を三項演算子と呼んで疑問を感じないようではいけないな。 単項、二項、三項は項の数を問題にしているのであって条件式であることは無関係でしょ?
ふーん
どっちでもいいや
643 :
デフォルトの名無しさん :2009/10/21(水) 14:39:25
Aのプログラムから数秒後にBのプログラムに切り替えたいです。 そういった時にはtime関数で現在時刻を取得してからでないとだめなんですか? プログラムの組み方がよくわからないので教えてください
>>643 標準関数だけでは無理があるので、環境依存スレでどうぞ。
現在時刻は要らないだろ。 開始からの経過時間さえ判ればよい。 だから普通は clock() を使う。
>>646 time()だけでやるのは待ちループが必要になって現実的でないということは理解している?
>>645 あんたも同類か。ついでに言えば、clock()だからと言ってtime()と手間がさして変わるわけではないが。
sleepしてexecすればいいのでは
それは標準ではないだろ。
とはいえ、POSIXに準拠しとけば初心者が使う大抵の環境で動くんじゃなかろうか。
651 :
デフォルトの名無しさん :2009/10/21(水) 16:21:56
ポインタ変数の勉強しています。初心者です。 int i; int *ip = &i; 2行目のコードの記述がおかしいです。 ipはアドレスを保持するポインタ変数で、*ipはポインタが指し示す領域の内容ですよね? *ipには3とか-1といった整数値が入るものだと思っていましたが上の例ではアドレスを代入しています。 アドレスも整数に分類される値ということでしょうか。 これでもコンパイルが通るので何が何だかさっぱりです…
int *ip は、 int* ip と思えばわかりやすいかな。 int* という型なのだ。でも int* p1, p2とかやるとはまるから注意な。
宣言時の代入は、初期化の利便性のために少し特殊になっている。 コンパイルの結果は変わらないから、気に入らなければ宣言時代入は使わなくてもいい。
655 :
デフォルトの名無しさん :2009/10/21(水) 16:35:17
分かったようで分からないようではっきりしませんが、つまり int *ip = &i; は置き換えると int *ip ip = &i; ですか。
656 :
デフォルトの名無しさん :2009/10/21(水) 16:36:36
もしかしたらスレ違いかもしれませんが質問させてください。 C言語を始めたばかりの初心者です。 LSI C-86 Ver3.30c 試食版というものを使っています。 コンパイルをして、コードをコマンドプロンプトで表示させると、 日本語が文字化けしてしまいます。 コンパイルもできているし、アルファベットや数字はきちんと出るのですが……。 どうすれば日本語が表示できるようになるのでしょうか? ぐぐってもよく判らなかったため、質問させていただきました。 どうかよろしくお願いします。
>>656 悪いことは言わないから、そのコンパイラは捨てなさい。
それはもう、10年以上も前のパソコン通信時代の代物だ。
659 :
デフォルトの名無しさん :2009/10/21(水) 16:48:58
>>658 ありがとう。あやうく誤解するところでした。。
>>656 文字コード体系が違う。
以前の Windows では CP-932 が使われていたが、
最近は UTF-16LE に変わってきている。
古いソフトなどを使うと、それらが混在するので文字化けすることがある。
ソースコードと表示系の文字コードを同じものに揃えれば問題ない。
個人的には Turbo-C 2.01 がオススメ。 軽量・高速で使いやすく、変な制限もない。
>>657 >10年以上も前のパソコン通信時代
20年前ですw
16ビットのコンパイラはおすすめ出来ません。 32ビットよりも難しいです。
selectでSleepの代わりに出来ない?
>>664 できなくはありませんが、厳密には違う動作です。POSIXならusleep()という選択肢もありますが。
UTF16でもコンパイラ通るの? エラー出るだろ?
そりゃ環境による
文字列をセットする関数を作りたいのですが、どうすればいいですか? 下のソースは間違ってますが、 やりたいことは、値によって、aaa、bbbを出力したいのです。 コンパイラに依存しない?標準のC言語の範囲でお願いします。 void hoge(){ char s[256]; setText(0,s); printf("%s\n",s); // aaa を出力したい settext(1,s); printf("%s\n",s); // bbb を出力したい } void setText(int n , char *str){ if (n == 0) { strcpy(str,"aaa"); }else{ strcpy(str,"bbb"); } }
それで良いじゃん。
>>668 setTextがsettextになってる以外は別に間違ってないぞ
先頭に
#include <stdio.h>
void hoge();
void setText(int n , char *str);
int main(){ hoge(); return 0; }
を付ければ問題なく動く
672 :
656 :2009/10/21(水) 22:15:16
みなさま本当にありがとうございます……。 コンパイラが古いのですね。 Turbo-C 2.01というものをダウンロードしてみることにします。 本当にありがとうございました。
せっかくMicrosoftがVisualStudioを無料で配布してるのに、なんで初心者は使わないんだ? BCCとかLSI-Cよりよっぽど使いやすいのに。 どうしてもコマンドラインがいいっていうんならLinux入れてgcc使うべき。
mingwでいいよ.古いけど
Cマシンとかいう奴を使え。
676 :
デフォルトの名無しさん :2009/10/22(木) 00:02:31
つーマシン作れよ
VisualStudioはごちゃごちゃしてるからだよ 分厚い、単なる取扱説明書みたいなものが本屋に溢れてる
VCはC++標準への準拠度は低いし Cライブラリがグローバル名前空間を汚染してるし 勉強には向いてないよ。
つーか、学習段階なら日本語周りは後回しにしたほうが良いんじゃね。 とりあえず ASCII 文字だけで一通りやってみたら?
680 :
デフォルトの名無しさん :2009/10/22(木) 00:14:55
C言語の学習にはBCC+cpadが理想的
お手軽ではあるが、理想的ではない
関数の引数に構造体を渡す場合に値を書き換えない場合は値渡しにするのが一般的ですか。ポインタ渡しの方がデータのコピー量が少ないのでどっちがいいのか悩みます。
ポインタ渡ししましょう。
好きな方にすれば良いよ。
>682 foo_t foo(const struct foo *foo); 最後のfooは、foo()の名前(シンボルへのポインタ)を関数のスコープで別の型のシンボルfooで上書きしているから、barの方がいいか。 まぁ、なんだ、const修飾しとけと言いたかったんだ。
>>685 つまりなんだ、関数名と構造体名と変数名は同時におなじものを使えるが、いまいちよくないということか
構造体のタグは名前空間が違うからどうでもいいよ
>687 そんなことはわかっているんだよ 関数名と変数が同じ名前だから、再帰呼び出しや関数ポインタが使えないと言っているわけで。
粘着するつもりは無いが、 >688の変数というと語弊があるので、s/変数/仮引数/としておく。 まぁ、そうはいっても関数スコープのちょっと上で宣言された変数なんだけどね。 スタックですね、わかります。
691 :
686 :2009/10/22(木) 03:29:00
>>687 なるほど。ありがとう
ちなみにtypedefしちゃうとだめだよね?
>>688 あぁー、そういう弊害が出てくるんですね。為になります。
func(&kouzoutai); const付けたとしてもこの関数呼び出しの後でkouzoutaiのメンバが書き換わるのかどうかわからないすよね。 func(kouzoutai); だったら書き換わらないことがわかるけど。 キャストすればいいのかな。。
funcのシグネチャによるだろ
>const付けたとしてもこの関数呼び出しの後でkouzoutaiのメンバが書き換わるのかどうかわからないすよね。 「呼び出しの後」が呼び出した関数内の話なら自己責任だろ。 「呼び出しの後」が呼び出した先の呼ばれた関数内の話ならその関数の宣言でconstポインタなら書き換わらないだろ。
あえてconstをはがさない限りは変えられないんじゃないの?
func() { Kouzoutai kouzoutai; kouzoutai.member = 100; //func()では書き換えたい func2(&kouzoutai); //func2()では書き換えたくない。関数呼び出しからそれを明記できないか。 }
>>696 void func2(const Kouzoutai * parameter);
func2()自体が書き換え可能なのだとしたら、呼び出すこと自体が無茶。
func() { Kouzoutai kouzoutai; const Kouzoutai *kouzoutai_constptr = &kouzoutai; kouzoutai.member = 100; func2(kouzoutai_constptr); }
C++でも func(const T &in, const T &in2, T *out) //定義 func(in, in2, &out) //呼び出し みたいにして、呼び出しの記述を見て関数内で変更されうることが類推しやすくしたりするね そういう意味では func2((const Kouzoutai *)&kouzoutai) でいいのかも知れんが、全部それやらないと本末転倒
値渡しでいいだろ。速度も落ちねえよ。
なんでそんな無茶を言い出すの
無茶ではない。 値渡しこそ正義。
参照渡しがいいの!
値渡しだろ
間を取って、コピーしたもののアドレスを渡す、でどうか
とるなし
fuck()
よく言われる
いつも神様って呼ばれてる。天才と言われることは滅多にない
いつも旧神って呼ばれてる。ノーデンスと言われることは滅多にない
神様にもいろいろいるしね 貧乏神や疫病神でないことを祈る
死神だろ。
func() { Kouzoutai kouzoutai; kouzoutai.member = 100; //func()では書き換えたい func2(&kouzoutai); //func2()では書き換えたくない。関数呼び出しからそれを明記できないか。 kouzoutai.member = 100; //func()では書き換えたいんだってば }
func2(kouzoutai); //func2()で書き換えても平気。値渡しだから。call by valueだから。
return fuck(you);
メイン関数でポインタを宣言し、関数Aに引数でポインタを渡し動的にメモリを確保するとともにデータをセット 次に関数Bでそのデータを処理、みたいな事をしたいのですがうまくいきません。 どうも関数Aで確保したメモリがmainに戻ってくると解放されているようす・・・なにか方法はないですか? void main(void) { char *p; 関数A(p); 関数B(p); } void 関数A(char *p) { //ここで*pに動的メモリを割り当て&データセット } void 関数B(char *p) { //*pのデータを処理 }
動的にメモリを割り当てられてないんでしょ。
>>717 void 関数A(char **p)
じゃないと p@main が書き換わらないよ
そしてmain内では 関数A(&p); にする 普通の変数を関数内で書き換えるときと同じ。
こうしろ。 void main(void) { char *p; p = 関数A(); 関数B(p); } char *関数A(void) { //ここで動的メモリを割り当て&データセット } void 関数B(char *p) { //*pのデータを処理 }
722 :
717 :2009/10/24(土) 16:14:34
ありがと書き換えてみるわ
>>723 インデントを説明するための例なので、内容については説明しません
int foo(){return 0;}
int bar(){return 0;}
int main(){int a,b;for(a=0;a!=5;a++){b=((b+a)*b+a)/a;foo();bar();}return 0;}
せめてバグがない物を提示しないか
上のプログラムはコンパイラに掛けると、エラーはなく実行できるコードを返してくれます。 と続いてるわけだし。
>723 多くの人によって編集されていくと、スタイルがバラバラになる可能性があるので、 最低限は決めておいた方がいいと思う。 また、説明などに使う用語やどの規格に準拠して書くかなども。 これ以上はスレチなので、新しくスレを立ててからお願いします。
free() や fclose() に NULL を渡したらどうなりますか?
どうもならない。
>>727 fclose に NULL を渡すのはダメ
730 :
デフォルトの名無しさん :2009/10/25(日) 14:55:59
「車輪の再発明はするな」という言葉で車輪の再実装を阻む行為は、 「車輪を実装した」という経験をもたせないようにして、先行者利益を確保するという、孔明の罠なのです。
車輪の調子が悪い時にメンテナンスできないしな
実装の仕方がまちがっているのに得意げな車輪の再実装は 止めてやるべき
自作の暗号アルゴリズムほど恐ろしいものはない
実験を一人でやれない奴は発明するな
日本に航空機製造をさせない某国のような
再発明と再開発・再生産とは違う。 発明するのが無駄ってことだろ。
孔明の罠??
やらない言い訳に使うなってことでもあるな。 ありもしないライブラリを再発明になるといけないので探してます、とかな。
光明の罠
741 :
デフォルトの名無しさん :2009/10/25(日) 18:13:11
1. その本を閉じる 2. 2chviewer をアンインストールする
744 :
デフォルトの名無しさん :2009/10/26(月) 02:48:27
方向キー押すと1づつ大きくなるカウンタってどうやって作りますか? 押している間じゃないです お願いします
処理系依存
>>726 準拠する規格は『JISX3010:2003 プログラム言語C』で
「
http://www.jisc.go.jp/ 」→「JIS検索」→
「JIS規格番号からJISを検索」で「X3010」と入力し
「一覧表示」→「JISX3010」→「規格の閲覧」で閲覧できます
c99かよ
int func(){ for(;;){ } return 0; } こういうスタイルって、紙の本で行数が間延びしないためのものだろ。 実機での記述でこのスタイルにしてる奴って、それを理解してないんじゃないのか?
昔の画面全体で25行しか無い時も有効だったかもな。
FDD全盛のころは改行コードすらもったいなかったんだよ
>>748 ディスプレイで見たときにも間延びするとかっこわるい。
詰まってる方がかっこわるいだろ
int foo(int n, int m) { int i, j, k, something; for ( i = 0; i < n; ++i ) if ( i != m ) { (void)something; for ( j = 0; j < n; ++j ) for ( k = 0; k < n; ++k ) { (void)something; if ( k != m ) (void)something; { int a, b; (void)(something = a + b); (void)something; } } } else (void)something; (void)something; return 0; } 関数化しろとかインデントが2カラムと言うのは無しで、こういうソースはできれば見たくない
>>753 見なきゃいい
エディタ起動時に必ず整形ツールを通すようにすればいいだけだ
この形に美しさを感じられない奴は コンピュータプログラミングには向いていないよ。
プログラムの途中でコアを吐く?のだけど、そんなエラー見たことないし、 調べても何か特定の原因があるってわけでもなさそうなのでさっぱり意味がわかりません。 一つ一つの処理ごとにprintfを挟んでみたところ以下のようでした。 #define _XOPEN_SOURCE #include <stdio.h> #include <string.h> #include <unistd.h> main(void) { int i, j, len; unsigned char tripkey[11] = ""; unsigned char salt[3] = ""; unsigned char trip_f[256] = ""; unsigned char trip[11] = ""; printf("トリップキーを入力:"); scanf("%u", &tripkey); printf("トリップキー入力"); ←これが表示されずにコアを吐く
>>757 > scanf("%u", &tripkey);
scanfの使い方調べろよ
>>753 Java見たいで嫌だ書き直す
int foo(int n, int m){
int i, j, k, something;
for(i = 0; i < n; ++i){
if(i != m){
(void)something;
for(j = 0; j < n; ++j){
for(k = 0; k < n; ++k){
(void)something;
if(k != m) (void)something;
{
int a, b;
(void)(something = a + b);
(void)something;
}
}
}
}else (void)something;
}
(void)something;
return 0;
}
漏れが許せる隙はこれが限界だ
制御にくっつく単文でもブレースで括ってくれと言いたかったんだ ブレースだけの行があるのが嫌な人もいるんだろうけどね もう慣れているからどちらでもいいんだけど、修正時のエンバグ対策に{}付けていた体質を改めようかな、はっはっはぁ
>>753 インデントついてるからまだましだけど
その書き方でインデントめちゃくちゃなやつもいた
if(k != m) (void)something; {
int a, b;
(void)(something = a + b);
(void)something;
}
とかもう
関数は int foo(int n, int m) { } って書く方が好みだ。 関数名を検索するときに、/^foo\(/でジャンプできるからな。 '{'を独立した行に置くのは、K&R第1版の頃の foo(n, m) int n; int m; { } からの慣れかな。
>>753 他人が読むことを想定していないコードだな
スタイル議論してるスレがあるはず。
関数は /*! * @brief fuga * * hoge * * @return piyo */ int foo( int n, /*!< [in] bar */ int m /*!< [in] baz */ ) { } って書く方が好みだ。 ただの似非Doxygenスタイルだけど。
int foo(int n, int m){ int i, j, k, something; for(i=0; i<n; ++i){ if(i != m){ (void)something; for(j = 0; j < n; ++j){ for(k = 0; k < n; ++k){ (void)something; if(k != m) (void)something;{ int a, b; (void)(something = a + b); (void)something; } } } } else (void)something; } (void)something; return 0; }
>>767 >>753 は、非難されるほどひどいスタイルには見えん。
ひどい点があるなら、教えてくれないか
スタイルじゃなくて、これが紛らわしいってこと if ( k != m ) (void)something; { int a, b; (void)(something = a + b); (void)something; }
if ( k != m ){ (void)something; } { int a, b; (void)(something = a + b); (void)something; }
#define BEGIN do{ #define END }while(0) if ( k != m ){ (void)something; } BEGIN int a, b; (void)(something = a + b); (void)something; END;
>>771 htmlでインデントを表現するために、わざと全角空白をつかってるんじゃないか?
>>775 使え
受け取った方がコピペでコンパイル出来るようになる
&を忘れたのねw
>>776 一部の専ブラでは書き込まれた&nbspをコピペすると化ける。
>>758 なんだかよくわからなかったのでgetsを使ってみたけれどそれでもダメでした
なんだかよくわからないものをなんだかよくわからないまま使っても なんだかよくわからない結果にしかならないと思うんだ
>>780 scanfのフォーマット指定子とそれに対応する引数を考えてみて。
つかあまりにも適当に指定してるようにしか見えないから、
正解をズバリ書くのもはばかられるわ
>>782 %sと%cを試してみたけど変わりませんでした
char s[6]="INTEL"; sは長さ6の文字列へのポインタで、その値は変更不能な文字列 (リテラル)"INTEL"を指すポインタ値 なのか sは長さ3の文字列へのポインタで、その値は変更可能な文字配列 を指すポインタ値で、変更可能な文字列配列はあらかじめ コンパイラによって変更不能な文字列"INTEL"を複製したもの が設定されている。
>>784 どちらも間違い。 sはポインタではなく配列
char s[7]="foobar"; sは長さ7の変更不能な文字配列である"foobar"の名前である のか sは長さ7の変更可能な文字配列で(コンパイラにより) 変更不能な文字配列(リテラル)"foobar"の複写で初期化された ものの名前である。
PHPをかなりやってきて、 プログラミングの基本とか だいたい理解したと思うので そろそろCをはじめようかと 思うのですが、Cをはじめる 前に、これを先にPHPで勉強 しておいたほうがいい、 っていうの、何かありますか? 一応、PHPで、 print文で画面に文字とかを出力、表示する ifでの分岐 switch文での分岐 for、while、foreachでのループ ユーザー定義関数 関数への値渡し、引数渡し includeで他のファイルを読み込んで使う 配列、連想配列(ハッシュ) ファイルへの読み書き OOP基礎 ---------------------------------------------- ↑こんくらいはマスターしました。 Cに移行する前に、何かもっと 勉強しておいたほうがいい知識はありますか?
別に真っ白な状態からCを学んでも良いと思うけど。
>>788 PHP→Cは結構苦労するってなんかの本に書いてあったな
逆にC→PHPは3日で覚えられるって事も
PHPで、 セッションやら、 クッキーやら、 サニタイズやら、 BASIC認証やら、 やらされたので、Cだと そういうのないので、 かえって勉強しやすいかなー と思ってます。
>>787 後者。
でも「変更不能な文字配列(リテラル)"foobar"の複写で」がなんか違和感あり。
char s[6] = "INTEL";
は、
char s[6] = {'I', 'N', 'T', 'E', 'L', 0};
と全く同じよ。
リテラルの複写とは全く違うから後者も間違いだろw
>>783 引数もちゃんと考えようぜ。
例を見て&つけてるんだろうけど、何で&がついてるかわかるか?
配列の[]無しはどういうものかも。
>>791 C-CGI作るならもちろんその辺もやらないとだめだよ
CでCGIなんか作るわけねーだろ。あほか? USBで外部デバイスを接続して パソコンでプログラム組んで ROMライターで焼いて、、、 ってやるんだよ。 お掃除ロボットのルンバの プログラム組んだりとか ロボット作ったりとかしてーんだよ。 空気よめよwww
Cのコンパイラーは どっからダウンロードするんにゃ〜〜 おしえれ〜〜
2chのread.cgiはcだそうだ
>798 どっかのFlashで見たなそういえば、 zlibとか使って圧縮して通信容量減らして危機を救ったとかなんとか 十分慎重に組めばセキュアなCGIも作れるわけだが CでCGI作るというウェブサイトや書籍にろくなものが無い気がしないでもない
文字解析以外はCもperlのようなものも一緒でしょ というか、2chのC化自体はあまり効果が無かったような
2chブラウザのおかげね。
今はむしろ2chブラウザのせいで通信量が増えてるわけだが
どうして?
>>803 タブをたくさん開きーのそいつらをいっせいにリロードしーの
あまつさえ自動でリロードしーの
多くの専ブラはそれの対応したはずだが
対応といっても更新間隔に制限を設けただけだからな 100タブ単位で開いてると馬鹿にならない
それって専ブラの起因した問題じゃないと思うが
というか量増えちゃだめなの?PCの能力あがったんだからたくさんの情報をロードできるから仕方ないじゃん。
人間の能力はあがってないだろ
読もうとしてないスレもリロードしたりするじゃん。 なのにそのスレ読むときにまたリロードしたりして。 専ブラに起因した問題じゃないってのはタブ型ブラウザのことでも指してるのかなぁ
あれはリロードじゃなくてDATの量を見てるだけだし読むときは差分だけだし なにか勘違いしてない?
なら転送量は増えないの?
いま仕様みてきたけど、次回dat読み込むときは HTTPリクエストヘッダに Range: bytes= で差分を指定できるみたいだね。(この場合は gzip 圧縮はされない) ただ、リクエストしまくるとバーボン規制やボボン規制を食らう可能性もある。
>>792 char s[]="書き換えてはならない文字列";
s[2]='¥0';
この場合コンパイルは通る?動作は保証される?
>>817 解釈ルール上からは大丈夫な筈であるが
char *s="書き換え禁止文字列";
とかと混同使用されている現実から安全対策の為、
強く警告を出して事実上禁止している処理系が
多いのでやらないほうが良い。
>>819 そんなのがあるとは…
ちなみに処理系の名前を教えて欲しいです
821 :
デフォルトの名無しさん :2009/10/26(月) 22:57:47
>>819 混同してるのも安全対策が必要なのもてめーだけだ
何を禁止or警告されているかくらい読めぼけ
VC++2008で見てみたけど、警告レベル最高でもべつに警告はでなかった。
823 :
デフォルトの名無しさん :2009/10/26(月) 23:10:19
リテラルに関しては特別である件について int array[]={0,1,2,3,4,5,}; の要素がLValueになれない処理系はモグリだが char array[]="012345"; の要素がLvalueになれない処理系がモグリだと 決めつけられないとオモ char array[6]="012345"; でLValue禁止はモグリだが
>>824 そういう処理系がある可能性もあるから
名前が知りたいだけですよ
GCCやらVCみたいなメジャーなやつで警告でないなら、べつに気にしない。
827 :
デフォルトの名無しさん :2009/10/26(月) 23:20:49
>>824 > 決めつけられないとオモ
何が「特別」なのかどう頑張っても足掻いても完璧にわかってないな
char s[]="12345" がconst char s[6]={'1','2','3','4','5',0}と 等価だって保証されてる?
830 :
解説 :2009/10/26(月) 23:49:59
>>824 とか
リテラル表現を見つけるとCコンパイラは機械的にそれを
void *型のconst ポインタ値に置換するというウワサ
(void*)の(char*)のキャスト省略は認容されているからprintfとかに
与えても文法上合法だし、その処理系に付属しているライブラリ関数
ならば期待した動作をする。
問題はvoid*が指しているアドレスに実際に何が書かれているかに
ついての規定が不可能になってきていること。
エンコーディング(フォントの種類とかサイズランク
(微妙に書体が変わるんで)まで規定できる新しいコード体系とか)
によっては連続したメモリ領域にマップしないほうが良い場合もあり
得るし実際しないだろうし。
そいった状況になったらchar s[]="うんたらかんたら";
がchar s[]={ 文字配列要素定義列 };
という解釈をしてもらえるという保証が無くなる可能性がある
Cの規格上ではつかないよ。 char s[]="12345"; は左辺のために新たに確保された領域に 右辺の値がコピーされるから、つける必要もないし。
>>830 そういうヘボい実装をしている処理系を知っているなら教えて欲しい
○○向け○○コンパイラとか
あ、ちなみに処理系よってはANSIやJIS規格に従わないコンパイラなんていくらでもある。
だから、
>>819 や
>>824 はその処理系の名前を具体的にあげてくれればいい。
それだけで話は終了する。これは一般論じゃないから。
特定の文字エンコーディングに依存する実装のほうがヘボい だろ。Cの現状的には
>>830 そもそも
> char s[]="うんたらかんたら";
> がchar s[]={ 文字配列要素定義列 };
> という解釈をしてもらえるという保証が無くなる可能性がある
char s[] = "うんたらかんたら";
と
char s[] = {'う', 'ん', 'た', 'ら', 'か, 'ん, 'た, 'ら'};
は違うんじゃないの?
>>834 そうだろうね。いずれにせよ
>>830 は
実例をひとつ挙げればそれですむ話を延々としているだけ。
誰もそういう実装のコンパイラが存在しないとは考えていないわけで
規格に合致しないコンパイラがあるなら
その名前を挙げてくれと言っているにすぎない。
もっと重要な違いがあるだろ
compile error
840 :
皐 :2009/10/27(火) 02:43:41
このプログラムソースの解説をお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> int c; char *p, o[] = "= +-*/^ "; double x[26]; int get(void) { do c = *p++ & 0xff; while (isspace(c)); return c; }
うちではインデントのないソースコードは見ないことになっている
842 :
皐 :2009/10/27(火) 02:49:29
インデントとはなんですか?
pにアドレスを入れていないのに *p++ してるから、いわゆる糞ソース
844 :
皐 :2009/10/27(火) 03:02:54
ソース長いんです。 分割でのっけます。 double expr(const char *s) { double v; if (*s == '=') { char *q = p; int n = get(); v = (islower(n) && get() == '=') ? (x[n-'a'] = expr(s)) : (p = q, expr(s+2)); } else if (*s) for (v = expr(s+2); c == s[0] || c == s[1]; ) switch (c) { case '+': v += expr(s+2); break; case '-': v -= expr(s+2); break; case '*': v *= expr(s+2); break; case '/': v /= expr(s+2); break; case '^': v = pow(v, expr(s)); break; }
845 :
皐 :2009/10/27(火) 03:03:51
3番目です。 else if (get() == '.' || isdigit(c)) v = strtod(p-1, &p), get(); else if (c == '(') v = expr(o), c == ')' ? get() : (c = 1); else if (c == '-') v = -expr(s); else if (c == '+') v = expr(s); else if (!memcmp(p-1, "sqrt",4)) p += 3, v = sqrt(expr(s)); else if (!memcmp(p-1, "exp", 3)) p += 2, v = exp(expr(s)); else if (!memcmp(p-1, "log", 3)) p += 2, v = log(expr(s)); else if (!memcmp(p-1, "sin", 3)) p += 2, v = sin(expr(s)); else if (!memcmp(p-1, "cos", 3)) p += 2, v = cos(expr(s)); else if (!memcmp(p-1, "tan", 3)) p += 2, v = tan(expr(s)); else if (!memcmp(p-1, "atan",4)) p += 3, v = atan(expr(s)); else if (islower(c)) v = x[c-'a'], get(); else v = c = 1; /* error */ return v; }
あー大体わかった。多分逆ポーランド記法で演算器じゃないか?
847 :
皐 :2009/10/27(火) 03:05:34
これで最後になります。 int main(void) { char buf[1024]; double v; while (printf("> "), fgets(buf, sizeof buf, stdin) && *buf != '.') { p = buf; v = expr(o); if (c) puts(" error"); else { p = buf; if (!islower(get()) || get() != '=') printf(" %.15g\n", v); } } return 0; }
848 :
皐 :2009/10/27(火) 03:11:17
はい、電卓を作ろうと思ったので、いろいろとソースを見てたのですが、プログラムの意味が全く分からないんです。 関数電卓で、まず四則演算と三角関数を1つの式で計算しようと思っています。
文字列の先頭へのポインタSがあったとして、 Sの示す文字列の3文字目を表す場合どう表現すればいいんでしょうか? S[2]と書いたら、それはint型だとか言われました
typedef unsigned orzchar_t; orzchar_t s[] = {0x1a33, 0x48b1, 0x5273, 0x542e}; orzchar_t *S; S = s; (void)S[2]; とか、そういうことは無いよな wchar_t使っていると怪しい とりあえず、コード片でも貼るといいお
851 :
849 :2009/10/27(火) 04:22:34
お察しの通りwchar_tを使ってます wchar_t wcStr[sizeof(szStr)]; WCHAR* strprev = wcStr; これでif文の中でstrprev[2]としたらint型だと言われました
多分>850そのままだと思うんですが、 どうすればSからsのn番目の要素を取り出すことができるんでしょうか?
既に出来ているから安心汁
http://codepad.org/iPSWOKX6 wchar_t を使う場合、
1. locale を正しくセットすること、
2. wchar_t対応のライブラリを使うこと
3. wchar_t と char をごっちゃにしないこと
の3点が重要です^^
ちなみに、wchar_tは符号なし1バイト整数以上のサイズであれば良いとしか規定されていないので
shift_JISすらまともに扱えない環境も普通に存在します^^
855 :
デフォルトの名無しさん :2009/10/27(火) 05:54:01
皆様よろしく。 Cを独学し始めたばかりの初心者です。目的はVBAで書いたコードをCに書き直すこと です。VBAも独学なので冗長な表現や不要な処理が多々あると思われますが、 とりあえず動いているのでよしとしています。 と、ここからが本題なのですが、とりあえずVBAコードをまとまりのある ブロックに分けてCに書き直し、コンパイル→実行して意図通りに動いているか 確かめています。すでに4,5個分はチェックできました。 使っているエディタ?は「C言語を始めよう!」というフリーのものですが、 今引っかかっているブロックでは「問題が発生したため、block3.exe を終了します。 ご不便をおかけして申し訳ありません。エラー報告する しない云々・・」という おなじみの表示が出てしまって、実行できません。 BCCを使っているみたいで、コンパイルエラーは出ないのですが実行できないのです。 これはコードの問題なのか、エディタもしくはそれ以外の問題なのかが目下の悩みです。 この「C言語を始めよう!」は、コード書く→コンパイル→実行という とてもシンプルで使いやすいのですが、他の「統合開発環境」と名の付くソフト (たとえばWildStudioなど)はビルドやらプロジェクトやら、意味が分からんことばかりで 使い方を学ぶまで時間がかかりそうで尻込みしています。 コードがまずいのだろうと思われますが、それを確かめるためにも、初心者やさしいエディタ (開発環境)があれば、教えてください。ただしフリーのもので。
メモ帳
857 :
855 :2009/10/27(火) 06:12:06
メモ帳にコード書いて・・そのあとが分かりません。コンパイル、実行は どうやってするの?
それこそが彼が意地悪たる所以である
いや、メモ帳はフリーではないだろう。
862 :
849 :2009/10/27(火) 07:21:53
色々ためしたけどやはりよく分かりません setlocaleもやってみましたが全く変化ありません どうすればwchar_tのn番目の要素とL""の比較ができるんでしょうか? デバッグ中は期待通りの文字列が見えるのに、一文字だけ取り出そうとするとint型になってしまいます コマンド引数に/Zc:wchar_tを指定しても変わりありませんでした (VC++では規定で有効らしいので当たり前ですが)
/D_UNICODE
const wchar_t* str = L"あいうえお"; const wchar_t comp = L'う'; // == L"う"[0] if (str[2] == comp) {}
>865 それだとif文で左辺がint型、右辺がconst wchar_t*型でエラーが出ます Unicodeを調べて両辺int型でやればなんとかうまくいくようです wchar_t型の文字のUnicodeを求める関数などはあるのでしょうか?
ある
>>866 >右辺がconst wchar_t*型で
???
>>866 うん。明らかに君の使っているコンパイラは標準に合致してない。
別のコンパイラに変えるしかないよ。
そのコンパイラではどうやってもwchar_t同士の比較はできない。
>>866 wchar_t が unsigned なのかも
>>855 アドバイスするとしたら
わざわざC言語使わなくてもVBAでいいんじゃない?
ってことくらいかな。
あと、異常終了するのはまず間違いなくコンパイラやエディタのせいではない
と思っていい。
ヘッダで #define wchar_t int とかやってたりしてな。
873 :
855 :2009/10/27(火) 12:25:42
>>871 >わざわざC言語使わなくてもVBAでいいんじゃない?
プログラムをLinuxで走らせたいのです。
>異常終了するのはまず間違いなくコンパイラやエディタのせいではない
やはり、コードですかね。問題は。
もうちょっとがんばってみます。 ありがとうございました。
>>873 スクリプト系言語にしたら?
LinuxならRubyでもPythonでも選り取り緑でしょ。
C言語を始めよう!はwindowsじゃないの?
>>873 Linuxで動かすつもりなら、Linuxで開発したほうが楽だと思うけどね。
Windowsと違うところ結構あるし。
あと、まさかWindows特有の機能使おうとはしてないよね?
877 :
855 :2009/10/27(火) 13:16:49
>>875 >>876 あの〜、この辺まったく知らないんですが、Windows上で動くcプログラムでも
Linuxで動かないってことあるんですか?あ、もちろんWindows特有の機能ってのは
使わない上での話ですが。
「Linuxで走らせる」っていうのも先の目標でして、実際はKnoppixのデスクトップ画面
を、自身のPCで見たことがある程度の者です。
>>877 > Windows上で動くcプログラムでも
> Linuxで動かないってことあるんですか?
あるねぇ。
> あ、もちろんWindows特有の機能ってのは
> 使わない上での話ですが。
あなたのレベルでは、Windows特有の機能かどうかの判断は難しいと思う。
>>877 自分のLinux上で動くcプログラムが
他人のLinuxで動かないってこともある
880 :
855 :2009/10/27(火) 13:44:25
>>879 ほんとですかw。どーゆーこと?って感じですね。
理由がわからん香具師はおとなしくスクリプトつかっとけ Windows の VB に相当するのは Python だ
標準ライブラリからちょっとでも逸脱しなければ大抵大丈夫だと思うが
>>794 引数に配列名を持ってくるときは自動的に配列の1番目の要素のアドレスを表すので&は不要ということはわかりましたが
そこを直してもやはりダメでした
というかunsigned charに対するフォーマット指定子は%sでよいのでしょうか?
もちろん文字列入力を行うということなのですが・・・
問題はI/O。標準ライブラリでのI/Oって、stdin, stdout, stderrとfopen系のストリームくらい。 ディレクトリ操作すら標準化されてない。GUIなど無論。
どうダメだったの? scanf("%s", tripkey); これでダメなら原因は別のとこにある。
>>887 crypt()周辺がおかしいんで内科医?
crypt()の仕様はどうなってんのよ。
つーか、手元にcrypt()がないからコメントアウトしたら、実行しても少なくともコアは吐かないんだが。
>>877 C言語を始めよう!ってなんじゃろうと思って調べたら統合開発環境だた
いろいろ間違ってるが、crypt(tripkey, salt);のように*をはずしたら最後までいったな
>>887 cryptの呼び出しは
strcpy(trip_f, crypt(tripkey, salt));
こんな感じ?
>>887 printf("トリップキーを入力:");
scanf("%u", &tripkey);
printf("トリップキー入力"); ←これが表示されずにコアを吐く
fflush(stdout); ←これを追加したら↑これ出ないかな
>891 本来ならそんな感じで呼び出すはずだけど 僕の環境では /usr/include/unistd.h:1073:extern char *crypt (__const char *__key, __const char *__salt) /usr/lib/i386-redhat-linux4E/include/unistd.h:1019:extern char *crypt (__const char *__key, __const char *__salt) となっていたから diff 96c96 < *trip_f = crypt(*tripkey, *salt); --- > strcpy(trip_f, crypt(tripkey, salt)); 結果 ./up1812 トリップキーを入力:foo トリップキー入力トリップキー前処理salt作成1回目:OK2回目:OK3回目:OK4回目:OK5回目:OK◆yaoo
typedef struct data{ ___char mozi[100]; //文字列格納用 _______int year[100];//点数格納用 }Data; Data data[100];構造体を100個用意 data[0].mozi="aaaaaaaa";←*1 printf("%s",data[0].mozi); これでコンパイルすると*1の部分が「左辺値が必要」といわれてしまいます。 どうやったら文字列を格納できるのでしょうか?
strcpy
strcpy(data[0].mozi,"aaaaaaaa");
char *a[8]; char (*b)[8]; この違いを教えてください。
Cってカンタンだよね。 すぐにUSB接続デバイスとか 作れそう。
道路の交通量調査などに使われてる(?)紅白で野鳥の会の人が使ってる(?) カウンターの様な機械をC言語で作ってみたいと思っています。 コマンドプロンプト上で、Enterを押せば数字が増えていくというモノです。 Enterの入力があれば用意した変数に1を足して出力 とするプログラムはすぐに書けると思うのですが、 C:\>counter.exe Enterの入力回数:1 Enterの入力回数:2 Enterの入力回数:3 ・・・・ Enterの入力回数:100 の様な感じになると思います。 C:\>counter.exe Enterの入力回数:XXX として、Enterを押せばXXXの部分の数字だけを書き換える という事は出来るのでしょうか? 説明が下手なのですが、内容を察して教えて下さい。 もしよろしければコーディングまでよろしくお願いします。
CLSして再描画する?
#include <stdio.h> int main(void) { int counter=0; while(1){ int c = getchar(); if(c=='\n'){ counter++; } system("clear"); printf("counter:%d\n", counter); } return 0; } ※windowsならsystem("cls");
>>901 非標準な事をすれば可能
環境を書いてくれないと無理
>>901 conio.h があるなら
#include<stdio.h>
#include<conio.h>
#define KEY_ENTER 0x0d
#define KEY_ESCAPE 0x1b
int main(void){
int count=0, key;
while(1){
key=getch();
if(key==KEY_ENTER) printf("\rEnterの入力回数:%d ", ++count);
if(key==KEY_ESCAPE) break;
}
return 0;
}
>>901 本当はこうなってるんじゃないの?
C:\>counter.exe
Enterの入力回数:1
Enterの入力回数:2
Enterの入力回数:3
・・・・
Enterの入力回数:100
表示が本当に
>>901 の通りなら入力にエコーが無いから
単に改行しなければ良いだけだろ
int counter=0; これってCだと必須なんだ。 変数を宣言しないと つかえないから。
908 :
894 :2009/10/27(火) 23:17:53
/**おまじない省略**/ struct suji{ char moji[100];//文字列格納 int su[100];//数字格納用 }; int main(void) { ____struct suji score[100];//100の構造体を用意 ____FILE *fp; ____char *tp; ____char str[256];//ファイルの行を格納する配列 ____int i=0,k=0; ____ if((fp= fopen("input.txt", "r")) == NULL)exit(1); ____________while( fgets(str,256,fp) != NULL)//ファイルの中身がなくなるまで ____________{; /************文字列格納******************************/ ________________tp=strtok(str,","); //文字列格納 tp=ポインタ ________________strcpy(score[i].moji , tp); //文字列コピー ________________printf("%s\n" , score[i].moji); //テスト表示 ________________i++;//構造体を一つ進める /***************数字格納******************************/ ____________________while(tp!=NULL){//一行読みきるまで ____________________________score[i-1].su[k] = atoi(strtok(NULL , "," ));//i-1は上でi++してるため無効化する作業 ____________________________printf("%d\n" , score[i-1].su[k] ); //テスト表示 ____________________________k++; ____________________} _____________} ___________fclose(fp); ___________return 0; }
909 :
894 :2009/10/27(火) 23:18:57
上のプログラムはCSVファイルを一行ごとに構造体配列に格納するプログラムを目指してます。 input.txtには、文字列,数字1,数字2・・・,数字n(文字列は行の先頭に一つだが、数字はいくつでも可能)といった形式で入っています。 このプログラム、コンパイルは正常にできますが実行するとエラーで強制終了となります。 何がおかしいかご教授ください。 CSVファイルが aiueo,10,23,53,55,60 kakikukeko,22,33 の2行だったら格納後、適当なメンバを参照すると score[0].enzan=aiueo score[0].su[0]=1 score[0].su[1]=2 score[1].enzan=kakikukeko score[1].su[1]=33 という具合になる予定です。
score[0].su[0]=10 score[0].su[1]=23 の間違いです。
今、大学の課題を考え中なのですが、 「定義域 -1.5<=x<=1.5の時 関数 y=3x^3-0.2x^2+0.3x-0.7 の値を出力するプログラムを作れ。 なお、xは-1.5から0.1刻みで増やすこと」 という問題なのですが、 ↓のようなプログラムを実行させると なぜか、x=1.5のときだけ出力されません・・・
913 :
つづき :2009/10/27(火) 23:28:59
#include <stdio.h> main() { float x, y, step; x=-1.5; step=0.1; y=0.0; while(x>=-1.5 && x<=1.5){ y=3.0*x*x*x-0.2*x*x+0.3*x-0.7; printf("%4.1f %9.5f\n", x, y); x = x + step; } } ちなみに、 whileの中の条件式を x>=-1.5 && x<1.6 (右の不等式のイコールをとって、1.6にしてみた) とか x>=-1.5 && x<=1.51 とかにかえると正しい結果が得られました。 どこで間違ってるのでしょう?? どなたかご教授願います m(_ _)m
914 :
デフォルトの名無しさん :2009/10/27(火) 23:40:45
>>911 使い道はある
(単純な二次元配列でも使うし固定長配列へのポインタを関数の引数にする場合にも使う)
>>898 >char *a[8];
char *a; が8個
char *a[8] = {"abcd", "ef", "gh", "ijkl", "mnopq", "rst", "uv", "wxyz"};
>char (*b)[8];
char [8]へのポインタb または char [8]がn個 の配列
char (*b)[8] = {"abcdefg", "1234567", "zyxwvut"};
浮動少数は厳密なものじゃなく近似値だから ピッタリでは判定できないことが多いよ。
916 :
デフォルトの名無しさん :2009/10/27(火) 23:46:56
while(!((x+1.5)<0.0 || (x-1.5)>0.0)){
>>913 0.1を正確に表せないから。
step=0.1;
としても、0.1よりちょっとずれた値になるので、何度も足してると誤差が蓄積する。
誤差少なくするなら、
double x;
int n;
for(n = 0; n <= 30; n++){
x = -1.5 + n*0.1;
...
}
みたいな。
>>917 へぇ〜
そんな話、聞いたことありませんでした!!
ありがとうございました!!
ところで、
どうして、その1次関数で
誤差を少なくすることができるのでしょうか??
何度も何度も聞いてしまってスイマセン・・・
m(_ _)m
>898 型が違う。 aはcharを指すポインタの配列(要素数は8) bはcharの配列(要素数8)を指すポインタ aに+1するとsizeof(char*)増加(32ビット環境なら通常4) bに+1するとsizeof(char[8])増加(8)
>897 >配列=配列ができないのと同じ原理なんですね。 というか、文字列リテラル("aaaaaaaa")の型はconst charの配列 なので、問題の箇所は「配列=配列」そのもの。
>911
>>898 >全然違う。後者に使い道はない。
いやいや、普通にあるでしょ。
char a[N][8];
を引数にとる関数の仮引数の型がそう。
ならなんで char *(b[8]); じゃないの?
fclose() が NULL を受け付けないおかげで fclose(func(fopen(fname,"r"))); みたいに出来ないから困る。 free(func(malloc(s))); ならできるのにな。
char (*b)[8];について、 演算子の優先順位で覚えればいいと言いたい所だけど、 *は、演算子では無くポインタ宣言子なわけで、 (ついでに言うと、[]もここでは演算子でないのよ、優先順位は、高 () > [] > * 低) でも、間接参照するときは、(*b)[i]のようにしないと演算子の優先順位があって、 いや、何というかね char *(b[8]);は、bに[]が付いているから、bは配列、それに*が付いているから、ポインタの、型はcharである。 つまり、bは、char型のポインタの配列と解釈されるわけで。b is array[8] of pointer to char.優先順位の高い方から低い方へ。 まぁ、『Cの強化書』とか『エキスパートCプログラミング』でも読めばいいよ。
NULLを受け付けるようなfcloseを自分で作るとか一瞬だけ思ったんだが駄目かな int myfclose(FILE *stream) { if(NULL == stream) return 0; else return fclose( stream ); }
素直にwrapper作ればよくないか 標準関数を直呼びすることはあまり無くなった int safe_fclose(FILE *f) { if ( f == NULL ) { return 1; } return fclose(f); } 戻り値を何にするかちょっと悩んだ。
#include <stdio.h> #include <time.h> #include <Windows.h> int main(void){ time_t timer; struct tm *t_st; while(1){ time(&timer); printf("現在時刻: %.24s\r", ctime(&timer)); Sleep(1000); } } このプログラムで、Ctrl+Cの強制終了ではなく、Escapeなどできれいにプログラムを終了させるには どうしたら良いでしょうか?
>char *(b[8]);は、bに[]が付いているから、bは配列、それに*が付いているから、ポインタの、型はcharである。 doubt
windowsみたいだから getchでESC押されたか判定して抜けると良いんじゃない
どうしてそんなにsleepしたがるのだ。 OSに大麻イベントをセットしてWM_TIMERで読んでもらえばいいじゃないか。 え?ミリ秒単位で制御したいの? どっかのスレで誰かが副作用で暴れてたなぁ。
>>927 #include <stdio.h>
#include <time.h>
#include <Windows.h>
#include <conio.h>
int main(void){
time_t timer;
struct tm *t_st;
while(1){
time(&timer);
printf("現在時刻: %.24s\r", ctime(&timer));
Sleep(1000);
while(kbhit()){
if(getch()==0x1b)break;
}
}
}
ごめん間違えた。
934 :
927 :2009/10/28(水) 02:17:14
>>929 #define KEY_ESCAPE 0x1b
int key;
while()1{
key=getch();
if(key==KEY_ESCAPE) break;
・・・・・
}
としてみたのですが、何かキーを押さないと時刻を更新しなくなります。
>>930 そうですよね。
強制終了ではなく、キー入力でwhileから抜けて処理終了を「きれい」と言っていました。
>>931 全く知識がないので、sleep使えば手っ取り早くできるかなと思いまして・・・・
#include <stdio.h> #include <time.h> #include <Windows.h> int main(void){ time_t timer; struct tm *t_st; while(1){ while(!_kbhit()){ time(&timer); printf("現在時刻: %.24s\r", ctime(&timer)); Sleep(1000); } if(_getch()==0x1b)break; } }
エレガントじゃないな。 #include <stdio.h> #include <time.h> #include <Windows.h> #include <conio.h> int main(void){ time_t timer; struct tm *t_st; do{ while(!_kbhit()){ time(&timer); printf("現在時刻: %.24s\r", ctime(&timer)); Sleep(1000); } }while(_getch()!=0x1b); return 0; } こうだろ。
937 :
927 :2009/10/28(水) 02:37:30
kbhit()なんてものがあったんですね。
もしお時間があれば、
>>931 さんの言うタイマーイベントを使ったプログラムのサンプルをお願いします。
私の環境はWinVista
コンパイラ:Borland C++ 5.5.1
です。
よろしくお願いします。
ボーランドのコンパイラなら _kbhit() → kbhit() _getch() → getch() に置き換えだな。 MicroSoft は非標準には '_' を付けてる。
Windows のタイマーイベントはウィンドウメッセージだから、 それを受け取るウィンドウが必要だぞ。
つ select
宿題スレでもC++対応でそこに誘導している以上 このスレもC++拒否じゃなくて、無保証対応で 良くね?
>>937 #include <stdio.h>
#include <time.h>
#include <Windows.h>
VOID CALLBACK tp(HWND hwnd, UINT u, UINT_PTR p, DWORD dw){
time_t timer;
struct tm *t_st;
time(&timer);
printf("現在時刻: %.24s\r", ctime(&timer));
}
int main(void){
SetTimer(0,0,1000,tp);
while(getch()!=0x1b);
return 0;
}
>>924 その本には char (*b)[8]がポインタの配列であると書いてるの?
そうなら子供の落書き帳にでもしちゃいなよ
うあ? 途中から char *(b[8])の話になってる。すまんこ。
select
946 :
デフォルトの名無しさん :2009/10/28(水) 23:03:47
>922 なんか、違う人間が同じ問にレスしてわけわかになっていますな。 >ならなんで >char *(b[8]); 宣言子においては*と[]では[]の方が結びつきが強いので char *b[8]; と char *(b[8]); は同じ。 かえって混乱するかもしれないけど『関数の仮引数の宣言部では』 void func(char b[N][8]); void func(char b[][8]); void func(char (*b)[8]); は全て同等。 ついでに上のbと下のcは別物。下の宣言同士は全て同等 void g(char *c[N]); void g(char *c[]); void g(char **c); >924さんはもちろん理解していると思うけど、 >間接参照するときは、(*b)[i]のようにしないと いやそこは普通はb[0][i]になるよね。
>>908-909 ざっと見て2つほど明らかなバグがあるけど面倒なので詳細は説明しない。
・2つ目のwhileの条件
・k
デバッガの使い方を覚えて1行ずつトレースしてみるのいいと思うよ。
>>948 > >間接参照するときは、(*b)[i]のようにしないと
> いやそこは普通はb[0][i]になるよね。
ケースバイケースじゃないか?
C言語を学び始めたのですが文字列の扱いで詰まってしまいました。 ある文字列について、任意のn番目の文字からx文字だけ参照したいときにはどんな関数を使えばよいのでしょうか? strcpyやstrncpyでは先頭からしか見ることができないので困っています。 ////////////////////////////// char STR[] char Buf[] sprintf( Buf ,"123,456\0"); ////////////////////////////// このようなコードがあるときにSTRにBufの5文字目から7文字目まで(456)だけ コピーするにはどうすれば… 任意のトークンで区切れるstrtokも状況によっては使えそうなのですが 挙動が分からずNullエラーになってしまったりして安定しません…
>>951 sprintf(Buf, "123,456\0"+4);
char Buf[10]; char *str = "123,456\0"; int start = 5; int end = 7; sprintf(Buf, "%.*s", end - start + 1, str + start - 1);
速やか過ぎる返信ありがとうございます。
>>952 のも
>>953 のもどちらも実行結果は正しいのですが
肝心の何故こうなるのかが理解できてません。ダメジャンorz
>>952 の方のはsprintf関数の挙動を調べればなんとなく分かりそうなのですが(文字列操作に+4って何事?状態)
>>953 のお方のは正直何が起こっているのかさっぱりです。ポイン・・・タ・・・?
とにかくとっかかりは掴めたのでもう少し調べてみようと思います。ありがとうございました
Buf+4 は &Buf[4] と同じ・・・ と言ってもわからないだろうか? 正直、ポインタの理解なしに文字列操作は厳しいと思う
>>955 >Buf+4 は &Buf[4] と同じ
だということを今知ったレベルでした。
ポインタはなんとなーく概念的にはつかんでいるものの使いこなすには至らず逃げてばかりだったので…
ネットワーク間でデータをやりとりしたいため文字列操作に手を出さざるを得なくなったのですが
ポインタの基礎から把握していないと駄目っぽいですね…
957 :
953 :2009/10/29(木) 11:37:57
こう書けば読めたりするだろうか。 char str[10]; strcpy(str, "123,456"); sprintf(Buf, "%.3s", str[5-1]); /* 5文字目の添え字は4 */
958 :
951 :2009/10/29(木) 11:47:59
>>957 お恥ずかしながらフォーマット指定子で .[整数] ってなんだっけ…レベルです。
そして%sでstr[4]を指定すると何故5文字目以降が参照されるのかもしっかり把握していません。
後者は
sprintf(Buf,"%s",str);
は str[0]から\0にぶつかるまで参照していたということなのでしょうか。
とにかく、今やってみたおかげで
>>957 に類するコードを入力したら
何故かは知らないけどこうなる!というのが分かる状態になりました…
がそんなんでは使いものになりませんよね
そもそも"123,456\0"と言う風に'\0'を文字列リテラルに入れている時点で文字列操作を理解していないことが判るじゃないか。
悔しいけども正論過ぎて泣いた。 本なりサイトなりで勉強し直すのが一番早そうですね。 丁寧に教えて下さった方、ありがとうございました。 \0を手動で入れていたのは、 ネットワークから送り込まれてくるデータがバッファに際限なく溜まっていってしまうため 区切りとして入れたのですがきっとそんなことになってしまう時点で何かがおかしいんですねわかります。
962 :
953 :2009/10/29(木) 12:08:20
>>958 %[整数1].[整数2]s
と書くと、最低でも[整数1]幅、最大でも[整数2]幅という指定になる
最低幅に足りない場合は先頭にスペースが埋められ、最大幅を超えた部分は切り捨てられる。
ネットワーク間でのデータやりとりだと、最大幅に足りない場合は後ろにスペースを埋めたいという
ニーズもあるかと思う。
その場合は
%-[整数1].[整数2]s
とすればいい。
そのうち慣れるからがんばれ。
>>961 ネットワークから流れてくるものは文字列ではない。あれは只のバイト列だ。
と言う意識がないといつまでもカスみたいなコードしか書けないよ。
# 某SIerのプロパーがまさしくそれなんだが……
神経質な人は、文字列で扱うときはcharでバイト列として扱うときは(unsigned charをtypedefした)BYTEにしているくらいだ。
# それはそれで、文字列系の標準関数を使うたびにキャストする必要があるので時としてあれだけど。
>>961 ?
バッファに際限なくたまるというのは確かにそうなってる時点でなんか変だと思う。
recv近辺のコードを上げてくれたらなんか分かるかも。
965 :
951 :2009/10/29(木) 12:27:47
>>963 なるほど、覚えておくと見やすくなるだけでなく色々活用できるんですねえ…
>>963 今まで平気で文字列として扱ってきたのですがバイトだったのですか!
…それを知ったところで今すぐ何かが変わるわけじゃないのが不勉強なところですが
保存したレスをいつか発掘したら意味がちゃんと分かるようになってるといいなあ…
>>964 相談したいのは山々なのですが
ネットワーク周りはDXライブラリの関数を使用しているので
ここだとスレ違いな気がするのです。
>>965 念の為に捕捉。
>963は、ナル文字で終端されていることがはっきりしている場合を文字列と言っている。
終端されていないものにはstrlen()やstrcpy()などの関数が使えないから、意識しておかないとね。
だからと言って、受信バッファより多めにメモリを確保して事前にクリアするなんてのは下策。
尚sprintf()の場合は、>962にあるようにサイズ制限ができるからバイト列に対しても使えなくはない。
>>966 >
>>963 は、ナル文字で終端されていることがはっきりしている場合を文字列と言っている。
別に
>>963 がどうとかじゃないよね。
Cにおける文字列の定義の話でしょ。
969 :
デフォルトの名無しさん :2009/10/29(木) 14:38:26
1から40までの数のなかで、3がつく数字とさんの倍数をすべて表示するプログラムを教えてください。
>>969 puts("3 6 9 12 13 15 18 21 23 24 27 30 31 32 33 34 35 36 37 38 39");
971 :
デフォルトの名無しさん :2009/10/29(木) 14:44:44
>>969 #include <stdio.h>
#include <string.h>
int main(void) {
int i;
char buf[32];
for(i = 1; i <= 40; i++) {
sprintf(buf, "%d", i);
if (i % 3 == 0 || strchr(buf, '3') != NULL) {
printf("%d\n", i);
}
}
return 0;
}
#define _XOPEN_SOURCE #include <stdio.h> #include <unistd.h> int main() { char a[100]; *a = crypt("hogehoge", "EV"); printf("%s", a); return 0; } crypt関数について調べようと思ってこんなん作ったんだけどaに何も入らないのはなぜ? crypt関数自体がアレなのかなと思って int main() { char a[100]; printf("%s", crypt("hogehoge", "EV")); return 0; } を試しに実行してみたけどこれはまともに動いた。
gcc -Wall
>>972 char a[100]; の時、a は &a[0] と同じ
つまり、*a はa[0]と同じ
a[0] = crypt・・・
が変なのはわかるだろ。
strcpy使え。
*a = crypt("hogehoge", "EV"); は a[0] = (char)crypt("hogehoge", "EV"); と同じ
C言語学びはじめてもうすぐ半年になるが、いつになったらタッチタイピングできるようになるんだ
>>976 英語配列に変えてみた、、がまだ慣れない。
>>976 プログラミングとタッチタイピングを同時に学ぼうと言うのがそもそも間違い。
プログラミングは、基本的にキー入力速度が速い必要はないからね。
どうせなら C でタイピング練習ゲーム作ったらどうか。
ビット演算について質問です char aの上位4バイトに 64以下の整数char bを代入したい場合、 (a & 0b00001111) + (b << 4) でできるのはわかるのですが、 もっと単純な表記方法はあるでしょうか?
ゲームセンターにあるタイピングオブザデッドに憧れてタイピング練習しはじめて ローマ字覚える前にタッチタイピングマスターしちまったなぁ 最近出た第二弾はわからんがタイピング覚える気ならゾンビ打マジおすすめ 本当の意味でゲーム感覚で覚えられるタイピングソフト 他にもいろいろタイピングソフトやってみたがまともなのはこれしかなかった スレチごめんね
環境によっては union {struct {unsigned ah:4; unsigned al:4} s; char c} a; として a.s.ah = b; と書ける。 或いは、 a = (a % 16) + (b * 16); とも書ける。 いずれの場合も、bが16以上の場合は破綻する。
>>980 >char aの上位4バイトに 64以下の整数char bを代入したい場合、
char aの上位4ビットに 15以下の整数char bを代入したい場合、
の書き間違いかな?
>>980 charの上位4バイトってなんだよpgr
985 :
980 :2009/10/29(木) 20:19:56
>982 どうも 4ビットって64じゃなくて16でしたね… こんなんでビット演算とかやらない方が安全か
>>985 「こんなんで・・・」はないと思うぞ。
1ビットでも必要な時はビット演算をする。
そもそも何のためにやるのかだよね。
屁こくな
間違いの指摘するならちゃんと教えてやれよ。 まあ、うっかりミスだろうから指摘するまでもないが。
>>982 そのunionの使い方って厳密には保証されないんじゃないっけ?
俺にはその間違い探し難しすぎるぜ
>>991 上下どちらのビットから割り付けるかは処理系定義なので
移植性はないけどもどっちかに決まっているはず。
ume
>>991 処理系によっては、妙な割り付け方をするかもしれないね。
ume
997 :
デフォルトの名無しさん :2009/10/30(金) 10:04:35
age
>>992 >957のことなら、& str[5 - 1]だ。
ume
1000 :
デフォルトの名無しさん :2009/10/30(金) 10:21:41
03e8
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。