刀、 , ヘ
/´ ̄`ヽ /: : : \_____/: : : : ヽ、
,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
/: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
/: :.,.-ァ: : : |: : : : : : : : : :\: : : : :: : : :ヽ \ /: : : :/
 ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i / /: : : : :/
/: : ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/ /: : : : :/ 、
. /: : / . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : | /: : : : :/ |\
/: : ィ: : : : :.i: : | \!___/ ヽ:: : : : : : :\|:.:.:.:/:! ,': : : : / |: : \
/ / !: : : : :.ト‐|- ヽ \: : : : : l::::__:' :/ i: : : : :{ |: : : :.ヽ
l/ |: : :!: : .l: :| \: : : l´r. Y {: : : : :丶_______.ノ: : : : : :}
l: : :l: : :ト、| 、___,ィ ヽ: :| ゝ ノ '.: : : : : : : : : : : : : : : : : : : : : : /
|: : :ト、: |: :ヽ ___,彡 ´ ̄´ ヽl-‐' \: : : : : : : : : : : : : : : : : : イ
!: :从ヽ!ヽ.ハ=≠' , ///// ///u /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
V ヽ| }/// r‐'⌒ヽ イ〉、
ヽ、______ー‐‐' ィ´ /:/:7rt‐---、 こ、これは
>>1 乙じゃなくて
ィ幵ノ ./:/:./:.! !: : : : :!`ヽ ポニーテールなんだから
r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\ 変な勘違いしないでよね!
/: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\
1乙
見事 毎度キチガイ認定を受けてきたロールに 戦慄走る―― 「狂気の底が見えねェ!!!」 2ch歴5年を超える経験と勘から相手の狂気を数値化してきたロールにとって 過去に例のない狂気を持つマジキチと出会うこと自体は決して珍しくはない しかし 過去最狂のキチガイAAを据えてすら天秤の対として軽すぎる程の狂気を持つ気狂!!! 遥か膨大なやなせイズムを内包する怪物!!! ____ 前代未聞の経験である / R /\ / /\ \ | / /=ヽ \U | |/ (゚)::::(゚)u \| \ι─ ゝ── ノ \____/
6 :
デフォルトの名無しさん :2008/08/27(水) 05:29:53
1乙です。 質問です。main関数の処理が終了して、また最初の処理に戻すにはどうすればいいのでしょうか? switch文を使って、「プログラムを終了しますか?(Y/N)」のような終了の仕方にしたいので。
そういう場合はmain関数の中でwhileなどでループする部分を作っておいて その中で処理をさせる・・・かな? void main() { while(1) { 処理させる内容をここにかく } } プログラムを終了させたい場合はwhileを抜ける処理を条件判定を入れて 書いておけばOK
全処理を無限ループで囲んでifで抜けるようにするとか
>>6 whileループの中に入れる。
「プログラムを終了しますか?(Y/N)」でYが入力されたら、breakする。
続行するか終了するかの制御変数を用いてもよい。
goto文を使うとか
早朝から沢山のレスありがとうございます。
while文の無限ループを使うってのは理解したんですが、
<<また始めの処理に戻す>>やり方がわかりません。
>>10 さんのgoto文を使うやり方くらいしかないのかな?
12 :
11 :2008/08/27(水) 05:47:42
すみません自己解決しました。 無限ループをすべての処理に適用させるわけですね。 ありがとうございます。
なんで初心者って少し考えればわかりそうなことを聞くのかな 聞く前に考えるってことしないの?
わからない→ググレ→聞いたほうが早いと思った わからない→考えろ→聞いたほうが早いと思った
まあどう考えていいかもわからなかったのが、 聞くために文章にすると気がつくってこともあるからな。
わからない→ググレ→聞いたほうが早いと思った→goto わからない わからない→考えろ→聞いたほうが早いと思った→goto わからない
while (わからない) { if (聞いたほうが早い) { 聞く; } else { なにもしない; } }
できるだけ独りよがりな考えを排除するため
その独りよがりな考えすら浮かばない奴も多いようだが
>>18 それなら自分の考えを書いた上で意見を求めればいいと思うんだ
>>20 まあそうだな、次たてるときまで覚えてたら
>>1 に追加しておくか
なんでintとかのサイズを統一しなかったんだろう
処理系に合わせたほうが速い(はずだ)から
>>22 CPUが進化とともにレジスタ幅を増やしていった経緯もあるし
用途によってはインテルCPUまでのパワーはいらなくて
マイコンで足りるなんてのもあって古いCPUをカスタム化
したのを使ってたりするしね
#include <stdio.h> int Add_Tax (void); int main(void) { int Add_tax(); return 0; } int Add_Tax { int price,tax,taxtax; /*price=値段 tax=価格 taxtax = 消費税を含んだ価格 */ double taxrate; /*taxrate = 消費税1.05%。実数のためにdouble型 */ taxrate = 1.05; printf("商品の値段を入力\n"); scanf("%d\n",&tax); printf("price*taxrate+tax = %d\n",taxtax); } 消費税を求める関数作れない!!
#include <stdio.h> int Add_Tax(); int main() { Add_Tax(); return 0; } int Add_Tax() { ... }
くにへかえるんだな なつやすみはもうおわりだろう
夏休み明けて早々ゆとりですまない C言語に取り組もうと思って本なんか買っちゃったんだが、 実行するソフトや方法が分からず既に涙目だ フリーソフトでも書店とかで買える物でも・・・いや、それも良く分からないんだが 兎に角先ずは作ったプログラムを動かすソフトみたいなものが分からない なんとか教えてもらえないだろうか、お願いします
ぐぐれよ
>>29 マイクロソフトのサイトからVC++でも落とせば?
>>29 プログラミングなんて一から九ぐらいまでは調べ物だから、
サーチエンジンの使い方も分からないようじゃ覚悟しといたほうがいい。
>>29 お前にプログラミングなんて身に付かない
俺が保証する
現在C++という奴をインストールする準備中 本当に無能で申し訳ない 今年の残りと翌年から三年間死ぬ気で頑張る気だ また詰まったら助けを乞うかも知れないが、これから出来るだけ自分で調べてみる ありがとう
業務命令でもない限り無理してやることもないのに
ズブの素人だと3年でも足りるかどうか
38 :
デフォルトの名無しさん :2008/08/27(水) 23:40:26
話ぶっちしてすまんが、 なんで正常終了できんとね ↓ #include <setjmp.h> #include <signal.h> jmp_buf a; void b(int c) { longjmp(a, 1); } int main(void) { signal(SIGINT, b); if (setjmp(a) == 0) for(;;); return 0; }
>>35 大学生か? プログラミングなんかで遊んでないで本職のほう勉強しろよ
>>38 シグナルハンドラが参照する変数はvolatile型でないといけない
>>38 setjmp が割り込みに使用する環境を保存しないからじゃないか?
while("forever") { }
C++をインストール・・・ 斬新な響きだ
44 :
デフォルトの名無しさん :2008/08/28(木) 16:16:09
0x1.fffffeP127F ↑ こんな数値の記述を見かけたんですが、よくわかりません。 16進数なのか浮動少数なのか
浮動小数点数の十六進法表記。 大抵のコンピュータでは浮動小数点数も二進法ベースなので、 十六進法表記できるようにするのは理に適っている。
44の文字列をsscanfでfloat型変数に読み込むにはどうすればいいですか?
訂正 44の数値の文字列をsscanfでfloat型変数に読み込むにはどうすればいいですか?
意味が良くわからん、こういうこと? float f; sscanf("44", "%f", &f);
>>48 >>44 float f;
sscanf("0x1.fffffeP127F", "%f", &f);
コード float f; int n; char c; n = sscanf("0x1.fffffeP127F", "%f%c", &f, &c); printf("n = %d\nf = %f\nc = %c\n", n, f, c); 出力 n = 2 f = 0.000000 c = x できないね
error C2224: '.fffffeP127F' : 左側が構造体または共用体型ではありません
boostのlexical_cast使えば変数に入力できるって聞きました 標準Cでやる手段はないんですかね
externのメリットがあれば教えてください
無い
>>55 まずexternの意味から学んでください
>>52-54 C99対応の処理系で%a使え
ほかには、VC++も2005から%aが使える。
>>58 VC++だと%aが使えるのは、printf系だけだ。
scanf系は使えない。
char型の文字列を配列みたいに保持する方法はありませんか? char mozi[10] という10文字の文字列を200個まとめて持てるデータ構造です
char mozi[200][10]
どうも! char *mozi; mozi="aaaa"; って代入の仕方はOKですか?
ちゃんと理解して使ってるならOK
>>62 文字列リテラルを暗黙的にchar*にキャストするのは控えたほうがいい。
Cでゲーム作る人なんているんですか?
>>62 文字列定数を直接ポインタで引っ張りまわすことはもちろん可能である
しかし文字列定数が書き換え可能であることは保証されていないので、
うっかりクラッシュする原因となる危険性も多分にある
できるかぎりconst char *を使うこと
>>65 いるかもしないし、いないかもしれないし、いたとしてもいなかったとしてもどうでもいいたぐいの問題
今作っています><
69 :
デフォルトの名無しさん :2008/08/28(木) 21:51:14
レスdx
>>40 volatile jmp_buf a;
としてみたが、症状くぁわらん
むぅ・・・
>>41 その辺、怪しいとは俺も思っとやが
割り込みマスクビットが立ったまま main() から return するのはマズいんかいの・・・
宣言で *moziとしたとき どういう状態になってるんでしょうか? 文字の先頭アドレスを指すポインタが宣言されてるだけですか?
文字列じゃなくて文字へのアドレスだよ
関数ポインタの配列作って関数を呼び出すときに引数の数をバラバラにすることってできますか
文字列の先頭へのポインタ =文字列の先頭の文字へのポインタ
>>72 連絡用の構造体を別途用意して関数ポインタで扱う関数にはその構造体のポインターだけ渡して
内部で構造体を見るようにするとか?
>>72 可変個引数関数でできるだろ
va_listとかで(ry
>>76 ということはやっぱり
>>74 のように渡すのはとりあえずポインター1個だけ渡すように統一して
関数内部でそのポインターの先にぶら下がってる構造体を見るとかにしたほうがいいかな?
このスレの話題が大体わかるレベルでやっとってくれるところってあるの? アルバイトでいいんだけど
微妙じゃね・・・ このスレで出てくる話題ってピンきりだし、言うほどレベル高い内容でてこないしな。
>>65 今時は色んな言語使ってるんじゃないの?
LuaとCとアセンブラ、みたいな。
アルバイトでいいなら雇ってくれるとこはあるんじゃないの
Cの絵本渡されて読んできたような人が、派遣元いわく経験者として派遣されてるところもあるとかなんとか・・・
>>82 そんな経歴偽装しまくりなのが今のIT業界では?
なんとか人を放り込んでマージンせしめたい中小零細な社長が多くやっていけるのは
そのためと思ってたけど・・・
使い捨てにされてかわいそうに。 出向先でダメっぷりをひたすら披露して会社の信用を落とすくらいしか反撃方法がないな
このスレのな内容がわかるようなら 「C言語経験3年、プロジェクトリーダーの経験あり」 と、イカサマ派遣ソフトハウスの社長は派遣先に提出する業務経歴書に書くだろう。
PLとかPMとかってどんくらいしんどいの? そういう人達はこのスレにはすんでない?
とりあえず16進浮動小数点表記を変換するのが難しいぜ double convert(const char *str); で作ろうとしてるが手ごわい
>>86 いや、いるだろう。
PLの仕事は計画、メンバー編成、進捗管理、顧客折衝といろいろあるが、
なんといっても、一番大変なのが種々の問題対応
問題の発生しないプロジェクトなんて、ある規模以上なら皆無
計画の遅れ、予算不足、出来上がったシステムの品質の悪さ、人間関係、顧客や上司への説得
タフな人間でないと勤まらない
89 :
87 :2008/08/29(金) 01:09:16
ようやくできた 書式チェックしてないけど… IEEE754前提にして 90行にもわたる超大作
>>89 そんなにかかるか?
NANとかエラーチェックとか適当でよければ、
strtolとかビット演算とか組み合わせて、十数行で済む気がするんだけど。
別の目的で作った簡易atof()から考えて、50か精精70行くらいで済みそうだと思うが。 まぁ、丁寧にエラーチェックすれば90行くらい行くのかも知らん。
70行から90行だともう誤差だよなw
だよなw 70行の奴はやたら1行で終わらせるタイプで 90行の奴は1行で書ける部分も{}でわけちゃうとか if () xxxxx を if() { xxxxx } とかさw
if() { xxxxx } は全然構わない。ていうかやってくれ
95 :
デフォルトの名無しさん :2008/08/29(金) 09:43:59
Cの文法上、定数しか書けない場所とはどういう場合がありますか?
配列宣言時の要素数、自動変数以外の初期化子とかかな。 前者はC99で定数式以外もおけるようになったはずだけど。
おれはこう。 if () { xxxxx }
>>97 の形式は結構使うな
//や#ifとの相性がいい
>>99 確かに。
自分は、蟹飯あがりなもんでずっと
if () {
xxxxx
}
なんだけど、ifのコメントアウト面倒なんだよな。
C#だと勝手に if () { // } になるから今の if () { // } から変えようか悩んでる
>>101 俺がいる。
VC#オプションいじってもどうにもならなくて俺涙目。
if (・・・) ・・・・・; 上級者では、ifの下が一行のときは、{}をつけない人も多いな。
CとC++の間を行ったりきたりふらふらしてる 俺もCだけでバリバリ書けるプログラマになりたい
char str[256] = "hage"; こんな変数があったとしたらstr[4]以降はずっとNULL(\0)が入ってますか?
>>110 そうなんですか?同じようなものと思ってました
文字列の最後につけるのが\0で、ポインタに入れるのがNULL
それで最後の\0以降もずっと\0が続くんですか?
ありがとう
119 :
87 :2008/08/29(金) 21:37:47
BorlandC++Compiler5.5.1 だとビットフィールド間にパディングが入るのですが、 これを抑制するオプションはありますか?
コンピュータ用語としてのNULLにはさまざまな意味があるが、 C言語においてはNULLという特別なマクロの名前が存在するため、 特別な文脈以外ではC言語でNULLといえばこのNULLマクロのことを指す 全てのビットがゼロであるバイトを指す場合にはヌル文字、\0、NULなどが使われることが多い
ファイルポインタで質問があります int main(void)以外の関数内でファイルポインタを使うことはできますか? さっきからエラーが直せなくて困ってます;;
NULLってCでは (void*)0 でしょ?
>>123 うーん、そうですか〜。
どうもありがとうございます。
参考書を終えて初めて100行超えのを自作しているんですが、書いてる最中は楽しいけど
バグ取りがめっちゃめんどくさいですね^^;
とりあえずもうちょい頑張ってみます。
printf("%p", NULL); で0以外の値が表示される環境もあるかもしれない。 -- intが32bit、ポインタが64bitの環境だと、二行目のコードはバグる。 printf("%p %d", NULL, 1); printf("%p %d", 0, 1); -- 下のコードはNULLが0の環境がほとんどなので、まあ、ほとんどの環境で問題なく動くけど、 char s[100]; s[0] = NULL; たとえば、 s[0] = SEEK_SET; と文字列をクリアしてるコードがあったら、だれでもおかしいと思う。 それと同じで、NULLと\0は用途が違うので、 使い分けるべき。
>>126 C89では値ゼロを持つ整数定数か、それをvoid *にキャストした式と決まってたはずだけど、C99では違うの?
0がNULLになるのは保障されてるけど NULLが0であるという保障はなかった記憶が
>>128 君が言いたいのはNULLでなくてヌルポインタでしょう
そこらへんの話はC FAQ読めばいい。
値の内容云々ではなく、 ・アドレスを示していないポインタ ・文字列の終端であることを示す値 の区別を付けられない人がこんなにいるんですね… \0とかNULL、null、(void*)とかそんなことの前に、 ヌルが何も示していない状態・概念を一般化した表現だという 言葉の理解をすれば\0がNULLでは用途の違いどころか意味が 違うと分かるでしょうに…。
132 :
デフォルトの名無しさん :2008/08/29(金) 23:37:47
>>131 言葉てきにはnull文字だからやっぱごっちゃじゃねw
ナル文字でおk
>>127 C99では「処理系依存の空ポインタ定数」としか書いてない。
>>115 \0が続く保障はないだろ。
というか、
>>108 はなんでそのようなことを気にしているんだろうか?
136 :
デフォルトの名無しさん :2008/08/30(土) 00:13:24
>>137 char str[256]={'h','a','g','e','\0'};
だから
char str[256]={'h','a','g','e','\0''\0','\0','\0','\0','\0','\0','\0'・・・'\0',,};
もうNULLは0では無いって言い争い飽きた 分かってるからNULLでも\0でもいいよもう
>というか、
>>108 はなんでそのようなことを気にしているんだろうか?
たぶんstrncpyを使いたいとかそんなんだろう
>分かってるからNULLでも\0でもいいよもう わかってないやつが見たときに誤解するから問題なんだ
>>108 実際何が入ってるか覗いてみればいいのに
ところで配列の要素数に対して初期化子が多い場合にはエラーになるけど、 char ary[4]="hoge"; ができるのは、文字列リテラルによる初期化をするときに 末尾の\0を入れるか入れないかをコンパイラが自動的に判断してるってことでいいのかな
145 :
デフォルトの名無しさん :2008/08/30(土) 02:26:34
「動けばいい」奴は \0 だろうが NULL だろうが、要は 0 が入れば何でもいいんだよ そういう手合いに無理に美意識を押しつけなくても誰も困らんだろう
美意識が何の関係がある 言葉の問題は厳密さの問題で、厳密さはPGに最も必要なものの一つだ
148 :
デフォルトの名無しさん :2008/08/30(土) 03:32:39
NULL のどこが厳密なんだよw
誰もNULLが厳密であるなどと発言していないのにそんなセリフを吐いてしまう君は相当厳密さに欠けているね
>>145 そりゃアセンブラレベルだと文字列の最後の\0も空ポインタへ入れるNULLも0だけどさ
厳密には違うぜ
NULLは実行環境でポインタサイズちがうので4バイト0x00かもしれないしもっと多いかもしれないし少ないかもしれない。
文字列の最後を示す\0だって文字列のエリアを実行時は0x00でクリアしても
実行中は面倒なんで文字列の本当に最後だけ0x00であとは実は前の文字列情報が残ってる場合もある
前 hoge_hoge_hoge\0
後 hoeg_hoge\0hoge\0
うん。
とまあこんな風に誤解がはびこるのでなるべく厳密な言葉の扱いをしようという話だ
154 :
デフォルトの名無しさん :2008/08/30(土) 03:44:23
すまん、こんがらがってる。 誰か解説よろしこ
NULLはヌルポインター '\0'はヌル文字 そう読めばいい。
もで0x00なのは確かでしょ ポインターや文字列が一緒になった構造体配列もmemsetで0x00クリアしたあと わざわざNULLや\0を代入するロジックを見たことがない
誰か釣られてやれよ
>>157 > ポインターや文字列が一緒になった構造体配列もmemsetで0x00クリアしたあと
> わざわざNULLや\0を代入するロジックを見たことがない
それはあまりにも危険なコード。
ひょっとしたら、doubleもmemsetで0x00クリアか?
構造体全体をmemsetで0x00クリア ↓ 構造体のメンバーを参照 コンパイル時、「未初期化変数の参照」のWARNINGがでない?
161 :
160 :2008/08/30(土) 03:57:48
でないか!?
162 :
デフォルトの名無しさん :2008/08/30(土) 03:57:50
>>149 じゃ、何が厳密だって言ったんだよ?
「そんなこと言ってない」で逃げるだけのヘタレの相手はごめんだぜ
まーさすがにdoubleなんかを使う場合は違う方法でやるでしょ。 というかdoubleなんてそんなに使う?
浮動小数点演算を実装する場合0は全ビット0になるように作るのが普通だけどね。 直感的にわかりやすいし。 そのぶん指数桁にゲタを履かせたりして苦労するが、memset(&dbl_var, 0, sizeof(dbl_var)); とできるメリットは結構ある。 というわけで 「ほとんどすべての処理系でdoubleやfloatは全ビットゼロクリアで0になる」 と言ってもよいのでは。
「ほとんどすべて」と「すべて」の間には越えられない壁がある
ほとんどすべての処理系の「ほとんど」が問題なわけで
c++でオブジェクトを初期化しようとして memset(&obj, 0, sizeof(obj)); とやってハングさせたオレが来ましたよ ・・・・だってメンバたくさんあったんだもん。
変数の名前がうまくつけられないのって、英語ができないせいなんですかねぇ・・・。 1ヶ月後にソースみたらさっぱりわからん
確かに辞書引いてつけた変数名はあとでなんだったかわからなくなる
良いコードというのは、英語として読めるコード
英単語の文字をフルにつけちゃうからだろw うまく略すなりするとか。 あとは文字列を検索してわかりやすく表示してくれるツール使うとか。 それをしないと英単語で長い名前にした意味がないw
略して頭文字だけになって何の関数だこれ、になる 素直にローマ字でかいとけばいいのかなぁ
英語は簡単でプログラムによく使われる単語を使う。 和英辞書で単語を探すのは極力避ける。 類似のプログラムを探して、そこで使用されている英語を使う。 略し方にはルールがあるので、それに従う。 業務プログラムはローマ字も可。 こればかりは経験。良いプログラムを多く見ること。
'\0'は1バイト NULLは4バイト
177 :
デフォルトの名無しさん :2008/08/30(土) 10:09:12
404…かと思ったらlが抜けてるのか
NULLはヌルポインタではないし4バイトとも決まっていない
もうどうでもいいよ
とりあえず0をn個で埋められるんでしょ
ある計算を何度もやらせるのに coutで結果を表示させながらやらせた場合と、 何も表示せず最後にだけレポートを表示させた場合で 100倍くらい処理速度に差があるんですが これって普通ですか 標準入出力ってこんなにも重いものなんですか
>>184 最後のレポートが途中の表示の1/100の量なら、普通です。
>>184 そりゃまあ、そんなもんでしょ。
それをファイルに1レコードずつ読み書きに置き換えたらもっとだと思うよ。
表示っていっても数字を渡した場合は関数の中で文字に変換して書式に従って整形
その後画面表示だったらそのAPIなんかに渡したりと意外となかで処理はやってるし。
うへぇ、そうだったんですね 処理速度を気にするプログラムを始めて作っていて これほど差があるものだと思い知りました ありがとうございました
>>181 個人的にはどうでも良いけど、NULLはヌルポインタ定数と呼び、
ヌルポインタ定数をポインタ型にキャストした結果をヌルポインタと呼ぶ。
それを知っててよかったことを200文字以上400文字以下で述べよ
>>189 違和感があるぞ
ポインタ変数への代入後または右辺値でなければNULLはNULLポインタにあらずって感じだ
質問お願いします。 1、PRINTえふで出力した文章って、下に下に書き足されて前の文章がいつまでも残りますよね? そこで、出力してある文章を一旦全部消す方法はあるでしょうか。ないでしょうか。 2、キーボードの矢印キーで入力する方法はあるでしょうか。ないでしょうか。
>>192 A. 両方環境依存ですが方法はあります
>>192 使っている環境をありったけ述べてください
もしlinuxとかなら"\r"だけで行頭に戻るかも
195 :
192 :2008/08/30(土) 20:44:55
>>193 素早いお返事ありがとうございます。
環境依存というのは、自分のパソコンやらキーボードやらコンパイラやらの事、でいいんでしょうか?
まあ自分は完全にアマチュアで、「○を動かして宝さがしゲーム」を組んでみて、やったー!動いてるー!というレベルです。
ですからできなくてもなんら問題はないんですが、参考までにオススメの環境を教えてもらってもいいですか?
196 :
192 :2008/08/30(土) 20:49:57
>>194 とりあえず、コンパイラはborland c++ compiler5.5 です
>>192 矢印の取得なら
PeekConsoleInput とか ReadConsoleInput @ windows.h
もしくは
getch とか kbhit @ conio.h
画面消去は system("cls"); とか
199 :
192 :2008/08/30(土) 21:25:29
>>197 うおおおおお!!!!!感動しました!!
system("cls")で、ぐっとゲームっぽくなりました!
ほかのはちょっと今は理解不能ですけど
ありがとうございました!!
200 :
デフォルトの名無しさん :2008/08/30(土) 21:29:22
>>191 そう言われても、規格にそのように書いてあんだよね。
clsはネタかと思ってたがマジだったのか
値0の整数定数はヌルポインタ定数で、ポインタを必要とするところに書いたらヌルポインタに変換されることが保証されている NULLはマクロで、それはヌルポインタ定数そのものに置換されるかもしれないし、それをvoid*にキャストした式や、(C99の場合は)ヌルポインタそのものに置換されるかもしれない ヌルポインタが何であるかは規格では定められていない
なんにも#includeしない状態で使える関数とか演算子とかってどんなものがあるんでしょう?
>>162 厳密であるとは言葉の持つ意味に曖昧さがないようにするということ
0やNULLやヌルポインタが厳密なのではなく、それぞれの言葉をそれぞれの意味で明確に使い分けることが厳密さ
もちろん、曖昧さがあったとしても、正しく意志が疎通されないわけではない
しかしそれは書き手読み手の双方にCの正しい理解があることが必要であって、
ことこのスレでその前提を期待することは、無根拠な楽観を通り越して明らかな間違いであると言わざるをえない
Temporary Internet Filesフォルダ内の特定のファイルを、 他のフォルダへコピーするにはどうしたらいいのでしょうか? フォルダ内検索でdesktop.iniのみしか表示されない、というところで詰まっています。。。
実態は別の場所にある
>203 関数は引数int(またはなし)で戻り値intのものだけ それ以外は自分でプロトタイプを用意しない限り正しく動かない 演算子はインクルード関係ない
>208 203は関数宣言しなかった際の関数の型解釈(C言語仕様)ではなく、 #include しない場合に使える関数→ビルトイン関数のようなことを 聞いている。きっと。 >203 208の言っていることは間違っていないが、使う関数は宣言するのが 常識とすれば「そんな関数はない」が回答。
ごめん、標準Cなら一個あった。 main がそうだね。
まさにそのビルトイン関数ってやつが知りたかったのですが、ひとつもないんですか・・・ memsetとか使ってみたら警告は出たけど動作はしてるみたいなんですけどこれはたまたまそういうコンパイラだったってことでしょうかね?
>>211 その警告はmemsetがわからねーよってのじゃね?
ワーニングレベルでコンパイル通るけど、その実何もやってないはず。
memset程度ならたまたま使う変数だとかがいい感じで初期化されてただけだと思ったほうがいい
一つもないです。 C言語は言語としての仕様しか提供されていないです。 その代わりというか標準Cライブラリが提供されてます。 C言語が main から動くというのもそのおかげです。 memestが動作したのは、208が言った仕様に従ってコンパイルされた 結果、memsetが入っているclibとリンクできただけ。 高度なサービスがセットになっている言語環境が欲しいなら JavaとかC#とかの方がいいかも。
>>202 JIS(C99)より。
値0を持つ整数定数式又はその定数式をvoid *にキャストした式を
空ポインタ定数(null pointer constant)(注釈55)と呼ぶ。
空ポインタ定数をポインタ型に型変換した場合、
その結果のポインタを空ポインタ(null pointer)と呼び、
いかなるオブジェクト又は関数へのポインタと比較しても
等しくないことを保証する。
(注釈55)
空ポインタ定数としてマクロNULLが
<stddef.h>(及び他のヘッダ)で定義されている。
となってるよ。
まぁ知ってんだろうけど、
>>202 の解釈はちょっと納得出来ないなぁ。
NULLはプリプロセッサで必ず空ポインタ定数に展開されるし、
ヌルポインタが何であるかは規格で定められている。
(何であるか、って内部表現の話か?それだとそもそもそんな話を持ち出す意味が無い)
>ポインタを必要とするところに書いたらヌルポインタに変換されることが保証されている
多くの場合は暗黙の型変換が発生するだけじゃないでしょーか・・・。
printfの%pはポインタを必要とするが、おそらくキャストしない0を渡してもintで渡ると思う。
まぁ、intとポインタのバイト数が違う処理系はまれなんで(ていうか俺は触ったこと無い)
処理系依存だけど殆どの環境で正しく動作する。
>NULLはプリプロセッサで必ず空ポインタ定数に展開されるし C99なら、だろ C89だとただの0とか0Lである場合もある >printfの%pはポインタを必要とするが ちがう 可変個数引数の関数はコンパイラが型チェックをしない だからそれは「プログラマの責任でポインタを書かなくてはいけない場所」であって コンパイラが変換処理をしてくれるところの「ポインタを必要とする場所」ではない
>>215 よく読め、ナマの0も空ポインタ定数に入ってる
ようするにNULLはマクロの名前であってそれ自体はヌルポインタじゃないけど ポインタが必要な場所に書いたらヌルポインタとして扱われるってことだろ この話終了
まとめ 文法上ポインタを要求する場所に0を書いたらそれはヌルポインタに変換される。 0や0をvoid*にキャストしたものを空ポインタ定数(ヌルポインタ定数)と呼ぶ。 NULLはマクロの名前で、空ポインタ定数(のどれか)に展開される。 NULLやヌルポインタの本当の値がゼロである保証は無い。というか関係が無い。 だからNULLをゼロとか\0の意味で使うと誤解を招きやすい。
もともとは\0とNULLの混同だけの話だったのにな・・・
まー実行環境によってはNULLが0だと困るのもあるかもしれないしないかもしれない メモリのアドレスの関係上0x00000000を使ってるが0xFFFFFFFFは使わない場合 NULLは0では困る可能性もあるわけだ。
めんどくせぇなヌルポインタであることを示す予約語をつくろうぜ null_ptr とC++0xの話へもうちょっとだけ続くんじゃ
223 :
デフォルトの名無しさん :2008/08/31(日) 02:48:23
printf("%c", NULL); printf("%p", '\0');
224 :
デフォルトの名無しさん :2008/08/31(日) 02:52:30
225 :
221 :2008/08/31(日) 02:54:49
>>224 まあつべこべ言わずに確認してみろや
ってことじゃね?
そんな環境によって結果が違うコード持ち出されても
可変引数の仕組みから考えたら型情報は失われるから同じになりそうなもんだけど依存なの? 第一引数を元にキャストしてとりだすんだよね
228 :
デフォルトの名無しさん :2008/08/31(日) 03:11:14
いやごめんなさい
>>227 依存
上はNULLがvoid*にキャストされていて、ヌルポインタの内部表現が0でなかったとき0にならない(%cで表示されるかどうかは知らんが)
下はポインタのサイズが文字定数のサイズ(int)より大きかったとき、ゴミを読み込んで0以外の値になるかもしれない
>>227 そもそも、c変換指定子に対応する引数はintでなければならず、
p変換指定子に対応する引数はvoid*でなければならない。
それ以外の場合の挙動は未定義。
C系のスレを荒らすにはNULLで釣れば簡単だと思った。
NULLとgotoで荒れるのは昔から万国共通
gotoは答えが出てるから荒れないよ
未定義未定義言うんじゃなくて各実装ではどうなってるか調べる方法を教えてくだしあ
235 :
デフォルトの名無しさん :2008/08/31(日) 13:23:35
調べて、それでどうするつもりだ 調べるという行為自体が目的なら頑張ればいいが 調べた結果に基づいて書いた処理系依存コードなんぞ窓から投げ捨てるためにあるようなものだ
というか調べることができる保証すらないのが未定義
↑馬鹿
毎回、動作が変わるかもしれないから正確に調べられないのが未定義。
↑馬鹿
ばかっていうやつがばかなんだいぷんぷん
|・未定義(undefined)の動作 |本当に何が起きても不思議はないことを意味する。規格は何の必要条件も課さない。 |コンパイルできないかもしれないし、誤った動きをするかもしれないし |(クラッシュしたり黙って誤った結果を出したり)、 |あるいはたまたまプログラマの意図したとおりの動きをするかもしれない。
#define MAX (100) 見たいな感じで#define での定数に括弧を使ってるソースを見かけたんですが、 括弧のあるなしでなにか動作が変わる例はあるのですか?無い様に思ったんですがひょっとしたらあるのかなと思いまして
>>242 #define add(a, b) ((a)+(b))
9/add(1,2)
数字だけなら変わらないが、考えるの面倒だから全部に括弧つけるって人は多いと思う (100+1)みたいに後から足すこともできるし
バッファ確保等で、MAXを使った積演算を書いたとき、char buff[MAX * N]として ある日MAXを別の条件で定義し直すとする。 #define MAX 100 + 50 /*なんかの理由で50追加*/ なんてソースにしたらバグになるので、 #define MAX (100 + 50) /*なんかの理由で50追加*/ こういう修正がされることを期待してあらかじめ入れておく。 1行だけのif文に { } を入れる・入れないの議論も本来いっしょ。 オレは入れるべきだと思ってる。 MISRA-Cとかに対応するためにはどちらも必須。
>>243 すいませんでした
数字だけなのに括弧つけてて不思議だなぁと思って質問してたんです
お手数かけて申し訳ありません
>>244 やっぱ変わらないですよね
追加のことは思い至りませんでした
どうもありがとうございました
あとはあれだ トークン連結演算子(##)とかにマクロを放り込むバカに注意を出してくれる
はるか昔、ある未定義のコードをコンパイルすると、 インベーダーゲームが始まるCコンパイラがあったよーななかったよーな・・・
ソースを渡した後にゲームをクリアしないとコンパイルを実行してくれないコンパイラはどうか 仕事をしてるふりをして遊べる画期的なコンパイラだ
ゲームの成績がコンパイル結果に反映されるコンパイラ
>>249 よしコンパイルするか〜
↓
「ながい たびが はじまる」
スコアによっては問答無用で GPL なのをリンクしてくれるわけですね
よしコンパイルするか〜 ↓ 「これは ひどい」
254 :
デフォルトの名無しさん :2008/08/31(日) 21:19:58
スコアによってエラー情報の詳細度が変わります
数値Lだったらただlongになるだけでバイトサイズはコンパイラ依存ですよね 数値リテラルの型ではなくてバイト数を固定する方法ってないんでしょうか? 多倍長整数ライブラリとかで変数に巨大な定数を代入したくなったときとかlongまでしかできなかったら不便だと思うんですが・・・
文字列で渡す
>>255 標準Cで扱えないような数値を扱うために多倍長整数ライブラリをつかうわけで…
標準では取り敢えず0llでlong longまで扱えるからそれで勘弁してくれ。
だから標準の処理系ってどこにあるの?
まーたやってる 臨機応変に考えろ。 昔からある言語でいろんなビット幅のCPUで使われてるんだし 時代とともにあれこれ変えて継ぎはぎだらけなんだし。 所詮は道具
処理系依存の話は処理系依存のスレでどうぞ
ぶっちゃけて、プログラマーのみなさんは、C言語(C#やC++でなく)でどんなプログラムを組みますか? そりゃ色々あるのはわかってますよ!バカな質問かもしれませんよ!?こっちはただのドしろーとで悪いと思ってますよ!! でもたとえばテキストベースが多いとか、C言語にはC言語ならではの、得意分野ってあるのかなー、と。 むしろ純粋なC言語のみのプログラムなんてやらないんでしょうか?
とりあえず持っているデジタル製品や家電を全部言ってみてください。
265 :
263 :2008/09/01(月) 23:11:22
えっと、携帯電話、テレビ、洗濯機、パソコン、プレステ2、プレステ、サターン、ドリームキャスト、ファミコンの互換機、冷蔵庫、ファック、MDコンポ、デジカメ、デジタル時計、炊飯器、電子レンジ、扇風機、デジタル貯金箱、GBA、掃除機、ビデオデッキ、DVD、
>>264 まだありますけど、理解しました。
ありがとうございました。
むしろC#やC++のアプリなんてPC上くらいしか存在しないんじゃね? 家電のファームなんてほぼCだろ。ほぼって言うのは少数でアセンブラ含むということで
自動車部品メーカーまわってたら、C++使える?って聞いてくるとこ多かったけどな
最近は組み込みもC++使うよ
へー まあマイコンも性能上がってるしなあ。 書かなきゃいけない規模もあがってるからそうなるのか。
つーか、携帯電話ならJavaも結構使われているしね。
組み込みで STL とか boost はやっぱりだめ?
ちょっとリッチな組み込みでも絶対駄目とまで言わないけどまだ自由には使えない
組み込みではdoubleも使えないことが多いのに
bcc32 5.5.1とgcc 3.4.5で以下のようなコードをコンパイルして実行すると 6.000000 5 となるのは何故でしょうか? Visual studio 2005 pro のコンパイラでは 6.000000 6 となります。 柴田望洋著の『C言語によるアルゴリズムとデータ構造』のList2-13で intへの変換結果が6となることを意図して下のような処理がされていたのですが するべきでない処理なのでしょうか。 #include <stdio.h> int main(void) { int i; double vision = 0.6; printf("%f\n",vision * 10); printf("%d\n",(int)(vision *10)); return 0; }
0.6という数値は二進数では正確に表現できないので、実際には0.599999……になってしまっている。 んで、数の丸めに関する動作は処理系定義。だから直接整数にキャストするのは移植性の高い書き方ではない。 演算の結果が整数に非常に近いことが期待できるなら、(int)(d+0.5)が使える。
訂正 ×整数に ○0以上の整数に
>>274 >intへの変換結果が6となることを意図して下のような処理がされていたのですが
それが本当なら、ブックオフ行きだな
柴田望洋だし
279 :
274 :2008/09/02(火) 13:16:26
>>274 0.6(10) = 0.1001…(以下1001の繰り返し) (2)
となって(vision * 10)は内部では5.999999999…になっているのですね。
それで、intの変換の段階で小数点以下を切り落としてbccとgccでは5になり、
VC++では printf("%f\n",vision); の時のような処理がされていて6にしてくれると。
今回は0.1刻みの値をvisionに格納しているので0.5を足して解決するのがよさそうです。
レス有り難うございます。
>>277 付属のCDに収録されたソースコードでも同様の問題が起きたので
私の打ち間違いではなさそうです。
付属のコンパイラはbcc32なのに別のコンパイラで動作確認したのでしょうか
もう少しCになれたら他の人の本を参考にする必要がありそうですね
アドバイス有り難うございます。
構造体を初期化するときに以下のようなコードを見たのですが問題ないのでしょうか? struct hoge a; a = (struct hoge){0};
C99で追加されたものを使っているんで、ややコンパイラを選ぶ。 初期化自体はstruct hoge a = {0};と同じ方法でやるので問題ない。
ちくしょう便利だなC99め…
>>279 0.1刻みなら内部では10倍で計算しておいて出力時に1/10すれば安心では?
foo bar = {0}; って標準なの?
つか、C99をいまだに使ったことがないわけだが
つ[ICC] 一般の人にはなかなか手が出ませんな。
自家用ならフリーじゃなかったっけ
それ本当?評価版ってのがそうなんだろうけど、これ評価期限ってどうなの? 90日間?
291 :
デフォルトの名無しさん :2008/09/02(火) 22:23:32
10万を超える配列を扱う必要があって、mallocを用いて以下のような プログラムを書いたのですが、どういうわけか1万3000程度で停止してしまいます。 コードには全く意味のない部分もありますが、どうして止まってしまうのか教えてください。また、どのようにすれば解決するかを教えていただけると幸いです。 #include <stdio.h> #include <stdlib.h> int main() { int l,w,v,i,*la,*wi,*va; FILE *fp; fp = fopen("ru.dat","r"); la = (int *)malloc(sizeof(int)*10); if (la == NULL) exit(0); wi = (int *)malloc(sizeof(int)*10); if (wi == NULL) exit(0); va = (int *)malloc(sizeof(int)*10); if (va == NULL) exit(0); i=1; while(fscanf(fp, "%d %d %d", &l,&w,&v) != EOF ){ la[i] = l; printf("%d\n",i); i++;} free(la);free(wi);free(va);fclose(fp); return 0;}
>>291 malloc(sizeof(int)*10); を malloc(sizeof(int)*13000); にしたってこと?
まあ*10は*100000の間違いとして 感じでは実際には512kb=int[128]しか割り付けられてないみたいな? そんな環境あるのかね?
>>293 あ、そっちか
単に割り付けられる限界超えただけだな
DOSで動かしてるとか。
intが16bitでオバーフローしてんじゃね
DOSっていうとちょっと前にLSI-C86試食版がどうこう書いてたレスがあったな
> 1万3000程度で停止してしまいます 停止とは具体的になんなのか!?ここ基本。
まずは実行してる環境書いたほうがいいのでは?
301 :
291 :2008/09/02(火) 22:44:54
>>292 そうです、mallocの引数はこのまま10です。
>>296 詳しくはないのですが、
たぶんDOSではありません。
>>297 どうすればいいですかね・・・
>>301 組み込みか・・・もしかすると某ゲーム機の非公式開発か?
あれならアプリごとのヒープサイズを今回の引っかかってるサイズまで
制限できるからなあ。
>>301 > mallocの引数はこのまま10です。
10じゃマズいじゃん。チャンチャン
305 :
303 :2008/09/02(火) 22:48:21
遅かったか orz
306 :
291 :2008/09/02(火) 22:49:11
>>300 コンパイラはBorland C++ Compiler 5.5でwindows XP・・・
浅学で必要そうな情報がいまいちつかめてませんが、
あとはどのような情報が必要なのでしょうか。すいません。
10万の配列を扱うのにsizeof(int)*10にした根拠は?
309 :
303 :2008/09/02(火) 22:51:06
>>306 (int *)malloc(sizeof(int)*100000); // 使う領域のサイズを確保する;
310 :
291 :2008/09/02(火) 22:52:43
>>307 すいません、ちょっといまわかりません。
でも*10を 10000にしたら14万行まで進めました!
解決したみたいです・・・!
>>308 >>304 変えてみたらできました・・・ほんとありがとうございます!
311 :
291 :2008/09/02(火) 22:54:05
初めて書き込んだのですが、 こんなにも素早く対応していただけて嬉しいです。 もっと上達したらここでアドバイスできるくらいになります! 本当にありがとうございました!
要するに、細かくmallocすると1回1回のmallocで取った領域は実はintx10以上で メモリを食いつぶしてたってこと?
なかなか素直でよろしい
>>291 がんばって勉強してください。
>>310 *10000なのに、14万まで進んだらまずくね?
すごい行き当たりばったりプログラミング。
>>310 >でも*10を 10000にしたら14万行まで進めました!
使う分malloc()してください。
>>312 書いている内容を素直に受け取る限りは
int *x;
x=malloc(sizeof(int)*10);
x[13000]=1234; // 落ちた!何で?
>>316 それはこえーな
メモリのこと理解してねーじゃん
319 :
291 :2008/09/02(火) 23:00:53
>>314 申し訳ないです。
いまやり直したら4万6000だったですが、大丈夫でしょうか。
320 :
291 :2008/09/02(火) 23:02:06
>>317 これからどんどんいじっていく予定です。
とりあえず10万行以上の処理ができるかテストしたら
止まってしまってたので四苦八苦してました。
Linuxで、時刻を変更するプログラムは作れますか?
malloc(sizeof(int)*10); の()の中が何をやってるかどういう意味か理解してからでないとあぶねーな。
323 :
291 :2008/09/02(火) 23:04:16
>>322 配慮ありがとうございます。
ちゃんともう一度読み直して使用します。
>>321 root もしくは実行ファイルに sid があれば可能
一般ユーザ権限では変更できない
>>321 作れるよ。なんらかのシステムコールを使うんだ。settimeだったかな?
まず何行読んだのか数える変数を用意するんだ
じゃない、何行読んだのかをチェックするんだ
329 :
:2008/09/02(火) 23:39:06
小文字→大文字、大文字→小文字変換のプログラムなのだが・・・ 正常終了しないので助けて下さい。 ソースです。 #include <stdio.h> void main(void) { int i,j; char a[30]; printf("文字入力:"); j=getchar(); for(i=0;j!=EOF;i++){ if('A'<=j && j<='Z'){ j = j - ('A'-'a'); putchar(j); }else{ if('a'<=j && j<='z'){ j = j - ('a'-'A'); putchar(j); }else{ putchar(j); } } j=getchar(); } }
>>329 EOFを入力すればおk
Windows環境ならCtrl+Z
Unix系環境ならCtrl+D
ていうかiとかaとかはなんなんだよ
>>329 main()はintを返す。void main()は間違い。
大文字と小文字の変換はctype.hをincludeしてtolower()とtoupper()を使うべし。
333 :
:2008/09/02(火) 23:55:49
>>330 Ctrl+Zを押さなくても終了するようにできますか?
>>333 for文の条件を!=EOFにしてるんだから、EOF入力しなきゃ終わらんだろ。
×EOF入力 ○^zや^dの押下で標準入力をクローズ
#include<stdio.h> int main(void) { char ch; while(1) { printf("終了しますか? Y/N\n"); ch = getchar(); switch(ch){ case 'Y': case 'y': printf("終了します\n"); break; case 'N': case 'n': printf("処理を続行します\n"); break; default: printf("正しく入力してください\n"); } if(ch='Y','y')break; } } Yを入力されない限り、終了しますか? Y/Nを毎回ループさせたいんですが、ちゃんとなってくれません・・・。
> if(ch='Y','y')break; これの意味説明してみろ
339 :
337 :2008/09/03(水) 03:40:17
while文の無限ループをbreakで抜けたいと思いまして
つーかコンパイルできないだろ。正しくは↓。 if (ch == 'Y' || ch == 'y')
if使うならswitch使う意味無いじゃん
342 :
337 :2008/09/03(水) 03:47:32
レスありがとうございます。
>>340 それでいけました。 前のソースコードでもコンパイルはされました(visualC++2008)
カンマ演算子の使い方がイマイチわかってなかったです。ありがとうございます。
>>341 if文だけで作り直してみます。
プログラム自体を終了する気ならば switch(ch){ case 'Y': case 'y': printf("終了します\n"); break; ↑をbreakじゃなくてreturnなりexitなりを使えば良いと思う
>>340 意図した通りかどうかは兎も角、正しくコンパイルできるね。
君にはどういう風に解釈されるのかを考えてもらおうか。
345 :
337 :2008/09/03(水) 04:01:24
レスありがとうございます。
とりあえずif文だけを使って
>>340 さんと同じような意味のコードを書いてみました。
が、Nや何も入力しないと、DOS窓上で
処理を続行します
ただしく入力してください
終了しますか?Y/N
のように2重になってしまいます・・・。うーん難しい。
#include<stdio.h>
int main(void)
{
char ch;
while(1)
{
printf("終了しますか?Y/N\n");
ch=getchar();
if(ch=='Y'||ch=='y')break;
else if(ch=='N'||ch=='n'){
printf("処理を続行します\n");
}
else
printf("正しく入力してください\n");
}
}
346 :
340 :2008/09/03(水) 04:01:31
>>344 ch='Y'で代入されて戻り値は破棄される。次の'y'がifの条件文となる。
つまりif('y')と同義で、常に真となる。
…はずなんだが、それだと常にループ抜けるな。あってる?
>>346 あってる。
>>345 getchar()で喰い残した改行文字が次のgetchar()で喰われている。
再入力前に、食い潰しておけば大丈夫。
>>346 とりあえずおまえは回答者になる資格ぜんぜんなし。黙ってろ。
↑回答すら出来ないゴミに言われたかないね
>if(ch='Y','y')break; がコンパイルできない、などという嘘を垂れ流す方がよっぽどゴミな訳だが
ゴミ同士仲良くすれば
↓の変数のスコープを絞るためだけの{}って標準なの?もっといい方法はない? #include <stdio.h> int main(void){ int x; x = 100; printf("%d\n", x); { int y; y = x; printf("%d\n", y); } return 0; }
ない
>>353 とりあえずそこだけ関数化して呼ぶとか?
意味不明
πってプログラムでいうとM_PIであらわせるけど cosの中だったら180で計算すべきなのかな?
cos sinはラジアンで渡すだろ。 その手前は自分の好きなように
>>352 スコープを絞るというより、そこで変数を宣言したいからと言ったほうが近いように感じる。
360 :
741 :2008/09/03(水) 16:51:07
久しぶりです
>>329 のj = j - ('A'-'a'); ってどういう意味ですか?
全く理解できないんですが j+=('A'-'a');とやってもおかしく表示されたんですが
j = j - ('A'-'a'); の意味を教えてくださいお願いします
j -= 'A' - 'a'
>>360 大文字を小文字に変換してる
文字コードでぐぐればわかるんじゃね?
363 :
741 :2008/09/03(水) 16:53:27
そうそれでした j-='A'-'a'なんですが Aからaをひくいみがわからないんですが。 詳しく説明お願いします
( 'A') ('a' )
( 'A') ( '-' ) ('a' )
>>363 Aのアスキーコード
aのアスキーコード
引くと?
'A'の文字コードは 0x41 'a'の文字コードは 0x61 差は0x20('A' - 'a' なら マイナスだが) 例えば、jの内容が0x4a('J')なら-0x20を引く(=0x20を足す)と0x6a == 'j'になる
'A' - ('A' - 'a') = 'a' 'B' - ('A' - 'a') = 1 + 'A' - ('A' - 'a') = 1 + 'a' = 'b' ・・・
ここで、じゃあ -32と書けばいいのでは、、という質問がくる?
A〜Z まで 順に連続したアスキーコード だとする 同様に a〜z まで 順に連続したアスキーコード だとする j にはアスキーコードが入っている 事前の if で A〜Z 内だと限定できる状況 j - 'A' は Aから数えて何文字目となる j - 'A' + 'a' で Aから数えて何文字目 + aのアスキーコード → jのアスキーコードから対応する小文字化されたアスキーコードが手に入った
>>370 それは意味をわかって書くならいいが、ここで解説してなんとなくで
そのままだといずれハマるな。
特に文字関連の処理をする場合
コードが連続してない場合を考えてないので50点
>>370 -32なんていうマジックナンバーをコード中に埋め込んではだめです、じゃだめかな
375 :
741 :2008/09/03(水) 17:07:32
329のでint jなんですが jにaといれたら 97となるわけですが aAといれたら 97+65=162になるんでしょうか? それと329のchar a[30];は使ってない気がするんですが char a[30];はどこで使われてるんでしょうか?
376 :
デフォルトの名無しさん :2008/09/03(水) 17:08:25
すみません、質問ですが、 struct{ UCHAR a; UCHAR b[2]; UCHAR c; }KOU; main(){ KOU kouzou func_A(kouzou->b);//適当な関数 } int func_A(UCHAR bb[2]){ ・・・ } という構造体メンバの変数bからbbへ 渡しているんですが、sizeof(bb) = 2となりませんでした。 添え字を2で宣言しているのにどうしてサイズが変わるのでしょうか? どなたか御回答お願いしますm(__)m
377 :
376 :2008/09/03(水) 17:10:28
ちなみにC++ builder5を使っています。 失礼しました。
>>376 関数の仮引数の配列の添え字を1000にしても sizeof(CHAR*) と同じ数値になる
なぜなら、そう決まっているから
379 :
376 :2008/09/03(水) 17:14:17
>>378 わかりました!どうもありがとうございますm(__)m
>>375 getcharは1文字入力する関数だから2文字同時には入力されない
1文字ずつしか入らない
使ってない変数が宣言してあっても死にはしない
単に無駄なだけ
気にしないで放っておけばいい
>>376 int func_A(UCHAR bb[2])
これ配列を受けてない。
意味的には
int func_A(UCHAR* bb)
と同じでポインタを受けてる。 だから sizeof(bb) はポインタのサイズ (4 とか 8 とか)
-----------
あえて 配列をスタックに積みきる宣言だと
int func_A((UCHAR bb)[2]);
# で良いんだっけ?
>>381 違う
構造体につめて渡す以外のどんなことをやっても配列をスタックに積むことはできない
>>380 使ってない変数があっても気にしないで放っておけだって?
おまえ教える資格ないから。
なんちゃってプログラマは黙ってろよ。
384 :
741 :2008/09/03(水) 17:29:38
>>380 ああああああ そういう意味ですか
getcharは1文字で aAって入力されたら a=97,A=65って別々に代入してるかんじですよね?
それをforで連続して a-32=A A-32=a ってputcharで出力してるんですね?
文字コードをみたら大文字と小文字は-32の誤差があるってことがわかりました
'a'-'A'ってなんかわかりずらいですね -32にすればいいんですが。
385 :
デフォルトの名無しさん :2008/09/03(水) 17:31:45
そんな無理に期待にこたえてくれなくてもwwwwww
>>384 アスキーコードを使うことが前提なら32を使っても構わない(連続性自体が文字コード依存だから)
その言い方だと'a'-'A'ならアスキーコードじゃなくても通じるみたいに聞こえちゃうだろ
388 :
381 :2008/09/03(水) 17:34:55
'a'-32='A'だが'A'-32='a'はおかしい
>>384 'a'や'A'が実際には数だって事を理解していれば
いちいちコードを調べずに済むからわかりやすいよ
>>384 j = j - ('A'-'a');
これはどっちかといえば
j = (j - 'A') + 'a';
と考えたほうがいい
>387 通じる可能性はあるから間違ってはいない
なんでtoupper(), tolower()を使わないで車輪の再発明しようとしてるの?馬鹿なの?
課題なんじゃね? toupperやtolowerを使ってはいけないという条件付きの
>384 念のために言っておけば、本当に移植性の高いコードは、 (toupper()やtolower()やisalpha()を使わないなら)switchを使ってベタっと記述するものになる switch(c){ case 'a': c='A'; break; case 'b': c='B'; break; : : case 'z': c='Z'; break; case 'A': c='a'; break; case 'B': c='b'; break; : :
簡単な話題だとスレが伸びるねぇ
いや、人のコードを見た上での疑問だろう。
>>395 テーブル使う方法もあるよ!
結果的には同じようなものになるかもしれないけど。
A〜Z 内にあるかの判定が 不連続だとめんどうってだけで 変換部に関しては 不連続でも 'A' を基準に B〜Z のオフセットの値と 'a' を基準に b〜z のオフセットの値とが一致していればよくね?
EBCDICでも使える
401 :
741 :2008/09/03(水) 18:14:10
いま思えば 'b'-'B'でもどっちにしろ32の差があるから-32でよかったんですね!
32の差がある文字コード体系限定ならね
403 :
デフォルトの名無しさん :2008/09/03(水) 19:31:11
Cで継承を実現するにはどうしたらいいですか。
できるわけがない
>>403 君の言っている継承が具体的にどのようなもので、実現というのが具体的に何を指すのかわからないが、たぶん無理
407 :
デフォルトの名無しさん :2008/09/03(水) 20:06:54
多態性は関数ポインタの配列で実現できることが分かったんで継承もできるのかなと。
そりゃやろうと思えばできるよ。
>>406 C++が出る前からオブジェクト指向プログラミングはある
言語でサポートしている範囲が違うだけ
Cでないといけない場合もあるだろうから、そういう記事はあったほうがいい
自分に今必要ないからといって、世の中に必要ないわけではないんだから
変に技巧に走ってもいいことないよ。 素直にC++使えばいい。 Cしか使えないなら、Cらしいコードを書けばいいよ。
>>410 >>406 の記事程度を変な技巧に走っているというなら
C++ で boost を使うのも変な技巧に走っているといえる
Cでオブジェクト指向プログラミングは
実際大した事ではないし、目くじら立てるほどの物でもない
つうか意識しないでも使っちゃうよね
>>411 boostは中身を意識しないで使えるから複雑でもいいよ。
>>406 の記事も、抽象型はいいけど、継承とか、無理やり感があって、筋悪だろ。
>>413 中身を意識しないで使えるようにする方法だよ
class 書くのと変わらない
>>414 中身を書く人向けでしょ。
>>406 の類の技法って。
C++でclassを書くのは、Cで無理やり継承やら多態やらをやるような技法とはぜんぜん違う。
何かと思って読んでみたけど
>>406 のような書き方って大昔からあるじゃん。
いまさらぐちゃぐちゃ言うようなものでない
登録とか面土井じゃん
>>417 抽象データ型みたいのは、標準ライブラリにも入ってるしな。
「Cで継承、多態」みたいのも昔から、言ってるやつはいるけど、ぜんぜん使われてない。
言ってる本人でさえ、本当に使ってるのかよって思うよ。
422 :
デフォルトの名無しさん :2008/09/03(水) 21:49:41
GTK+-2.0はそうなってるよ。 昔からあるし、レアだけど使われてる場合もある。
423 :
デフォルトの名無しさん :2008/09/03(水) 21:57:23
> 「Cで継承、多態」みたいのも昔から、言ってるやつはいるけど、ぜんぜん使われてない。 30年前から某有名どころでやってるのを知らない奴がまさかいるとはな
IPを変えるのってどうやればいいか教えてください!!
使っているOSによる
Vistaでおま
社内LANのIP?
APIスレで聞け
いや、自宅だよ APIにいくわ。ホントはC#が一番知りたかったんだけどね
自宅PCがアク禁を食らっちまって、なんとかIPを変えたいとかいうオチじゃないだろな。 もし、そうだとするならプロバイダーを変えなきゃだめだよ。
最萌でIDでもかぶったんじゃない?
いや、なんかプログラム中でずっとエラーになる時があるんだよね 多分他に原因があるんだとは思うんだけど、IP変えたりしたら繋がる時ってあるじゃん 今後も必要だろうからまずはそのやり方で挑戦してみようと思ったわけです
まずイーサネットから勉強するんだ
435 :
741 :2008/09/03(水) 23:55:21
>>329 これをポインタに直してみました
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *j;
int i;
j=(char *)malloc(sizeof(char)*100);
gets(j);
for(i=0; *(j+i); i++){
*(j+i)-=32;
}
puts(j);
return 0;
}
つか、LANに組み込まれていなければIPは設定されていないだろ 自宅でLANを構築しているというなら話は別だが XPならコントロールパネル/ネットワーク接続/ローカルエリア接続/プロパティ
天才あらわる
440 :
741 :2008/09/04(木) 00:00:05
これポインタに直してみたんですが
自分でもうまくいって満足です
ですがただ小文字を大文字にしか変換できないので、大文字を小文字にするには+=32なんですが
他の繰り返して入力するのをくめなくて
>>329 をポインタでやる方法誰か教えてください
#include <stdio.h> #include <stdlib.h> int main(void) { char *j; int i; j=(char *)malloc(sizeof(char)*100); gets(j); for(i=0; *(j+i); i++){ *(j+i)-=32; *(j+i)+=32; } puts(j); return 0; }
問題発見能力がどうたらこうたら
>>440 forの中身を
if (j[i] >= 'A' && j[i] <= 'Z") {
j[i] += 'a' - 'A';
} else if (j[i] >= 'a' && j[i] <= 'z') {
j[i] += 'A' - 'a';
}
に換えるんだ。
^=32
質問させてください。 明解C言語 入門編という本にある直角三角形を表示する問題です。 #include <stdio.h> int main(void) { int i, j, ln; printf("何段ですか:"); scanf("%d", &ln); for ( i = ln ; i > 0 ; i-- ){ for (j = i ; j > 0 ; j-- ) putchar('*'); putchar('\n'); } return(0); } 何度やってもコンパイルできないのですが、どこが原因なのか全くわかりません。 ご教示いただけますようお願いします。
>>446 何を以ってコンパイルできないと判断したの?
その根拠を提示して欲しいな。
この板ID表示したらおもしろいことになりそうだな。
>>446 プログラムにはまったく問題ない
原因はお前の頭
単継承 テンプレート無し C++ → C のトランスレータが欲しい と思ったことはあった ターゲットの開発環境には Cコンパイラしかなかった ってだけの話で
昔はあったろ。いまはどこにあるのか知らんが
452 :
446 :2008/09/04(木) 09:54:35
自己解決いたしました。 ファイル名を変えたら何の問題もなくコンパイルできました。 お騒がせして申し訳ありませんでした。
>>357 >πってプログラムでいうとM_PIであらわせる
かどうかは解らない。
M_PIってマクロ名は本当に標準な環境では準備されてないはずなんだっけ?
呆れられそうな質問なんですが、ポインタを使うメリットって何ですか?
いろいろ というかCからポインタ−とったらBASIC程度のアプリしかできない悪寒
よその言語が持っているあれもないこれもなくて、 全部ポインタで済ませるというのがC。
>>457 というか元はアセンブラの延長なんで何もないのが基本でしょ。
それによそのあれこれってのが実はC->C++と進化する過程で
ごてごてくっついただけじゃん。
>>454 math.hで#ifで定義されてるからね
#if defined __USE_BSD || defined __USE_XOPEN
みたいな
460 :
741 :2008/09/04(木) 13:01:07
>>329 を配列で改造してみました
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char j[100];
int i;
do{
for(i=0; j[i]; i++){
if(j[i]>='a' && j[i]<='z')
j[i]-=32;
else if(j[i]>='A' && j[i]<='Z')
j[i]+=32;
}
puts(j);
}while(gets(j));
return 0;
}
getsは使用禁止
>>460 最初は
j[0]=='\0';
でないと
いつまでこんなカスみたいなプログラムいじり続けてんだよ
464 :
741 :2008/09/04(木) 13:24:43
getsは何故禁止なんでしょう?
>>462 j[i]!='\0';じゃないんですか? j[i];とも書きますが。
j[0]=='\0';だとiが繰り上がっていかないのでNULL字までいかずに代入できませんi-=32;のように
いや、そう書けって話じゃなくて、i[0]が'\0'じゃないとぶっ飛ぶぞって話だ。 つーか、>460で警告が出ないコンパイラの使い方してるの? 警告くらい出るようにしようや。
まってくれ旦那、そいつは罠だ。触ってはいけねーぜ
>>464 >getsは何故禁止なんでしょう?
gets は、渡されたバッファのサイズなんか知る由もないので
'\n' が現れるまではどんなに長い行でも読もうとする。
→所謂、バッファオーバーラン発生。
(fgets だと、バッファの長さを渡すようになってる)
まあ勉強のための短いコードや作り捨てツールじゃ問題に
ならない事が多いけども、使わないよう癖づけといた方がいい。
>>464 char j[100] = {0};
初期化が必要という話だ
469 :
デフォルトの名無しさん :2008/09/04(木) 22:25:19
まあ、事故れる道具は使うなってこったwww
mallocとかってたとえばwinだったら中でwin32APIとかつかってるの?
ああ
確か使ってるはず
>>470 使ってないんじゃないの?
使ってるかもしれんけど、コールされるたびに毎回API呼ぶような実装にはなってないと思う。
>>470 ヒープ領域の開始アドレスとサイズを取得することと、空
きエリアを管理するテーブルのリストを作ることでmalloc系
は実装されていると思う。
空きエリアの管理にはAPIは必要がない。ヒープ領域の開
始アドレスとサイズを取得するときにAPIを使っているかもしれない。
>>473 最近のVC++だとmallocは単にHeapAllocを呼ぶようになっている。
やつらにとっちゃ、mallocもHeapAllocも自分んとこで実装するわけだし、
2つも作るのは無駄でしかないんだろう。
lsのソースの中にある __FBSDID("$FreeBSD: src/bin/ls/ls.c,v 1.86 2008/04/04 03:57:46 grog Exp $"); って何ですか?
rcsかなんかのバージョン管理ツールで追加されたコードでしょ。
478 :
477 :2008/09/05(金) 03:33:35
間違えたかな?
こんな感じでバージョンを確認するようですよ。 janney:/home/richard$ grep FBSDID /usr/src/sys/dev/pci/pci.c __FBSDID("$FreeBSD: src/sys/dev/pci/pci.c,v 1.292.2.7 2006/01/31 14:42:43 imp Exp $");
480 :
455 :2008/09/05(金) 05:12:08
レスありがとうございます。 先輩も、処理が早くなるから基本的に全部ポインタで作ると言ってました。 ありがとうございます。
そっか なーんも理解してなかったか
ポインターないとすげー柔軟性の無いプログラムになりそうなだな。 構造体リストとかでも可変の場合は最大で使いそうな数以上を 見越して確保した状態でコンパイルとか
C言語体当たり学習って本はタメ口でむかつくな。
金もらって教える立場なんだからせめてメイド口調にしてくれないとな
C言語体当たり学習は落ちこぼれニートの20〜30代のにおいがするぜ。
K&Cの問題の回答をまとめてるwikiとかってありますか? 回答集が売ってますがあまり評判がよくないようなので
プログラミング言語C 弟2版 ANSI規格準拠 あ、K&Rだった。リッチーさん・・・
490 :
デフォルトの名無しさん :2008/09/06(土) 14:59:04
Cアンサー・ブック 第2版 The C Answer Book 2/e ISBN4-320-02748-5 共立出版 原書:The C Answer Book(Prentice Hall) C.L.Tondo, S.E.Gimpel 著 矢吹道郎 訳 A5 246頁 本体価格\2,300 1995/07発売
単純な疑問なんですけど、 for文にはなんで i,j,kがよく使われるの? アルファベットの半分からってわけでもないし
BASICのころからそんな感じ アセンブラの名残かな? レジスタはよく ABCDEくらいまで使ったりするので FGHくらいをあけてIJKあたりがループ用によく使われてる
昔々、FORTRANというプログラミング言語で、 名前がi, j k, ..., nで始まる変数は整数、ほかで始まる変数は実数と決まっていたことに由来する。
FORTRANの暗黙の型宣言じゃないの
i がインクリメントの略だから ポインタに p,q が用いられるのと同じ
Fortran説が正しい。
iteratorだからiつかって、足りなくなったから続けてj,kってしたんじゃね?真実はどか知らんけど
もともとINTEGERのI FORTRANが元なのは書いてあるとおり。
まあそんな感じだよね マシン語のレジスタも Aがアキュムレーター Bがベース とかなんか無理やり付いてるしwww
FORTRANはfor文じゃなくてDO文だけどね。
どっちにしろ昔の命名ルールはなんか省略して記号にするのが多いよね。 やっぱメインフレームとかで1行80文字以下みたいなのがあったのが原因?
まあ、今となってはちゃんと意味の有る命名しようと思う。 自分も適当になると、iとかjk、使いまくり。
ソースの見通しがいいからだよ。 ハンガリアンなぞMSでも否定されとる
FORTRANのINTEGERなのはそうだけどさ… 元々は数学の慣例じゃないの?
>>503 別にループカウンタはiとかjでもいいよ。
>>502 そうだな。
そもそもスクリーンじゃなかったしな。
>>506 そだな。
ループ部分はあんまり関係ないしな。
ただ、これが許されるのはへんなソース書かない奴だけにして欲しいww
ループの中がやったら長いとかそういう場合は簡便w
いやむしろループのカウンタには積極的に使って欲しいがなあ。 これ以外の用途で使うのは簡便
やっぱ簡単な話題だとスレが伸びるねぇ
難しい話題の方が答えられる人少ないに決まってるだろ?バカなの?
何のカウンターなのかそこに命名で意味を持たせるのは、
別に悪いことじゃないと思う。
>>510 全てに於いて、基本は大事よ?
難しい話題で見当違いの回答つけてスレ伸ばすのだけは勘弁
nからmまでの合計の和みたいな計算ってどうやるんでしょうか
>>514 int sumBody(int n, int m, int sum)
{
if (n > m) return sum;
return sumBody(n + 1, m, sum + n);
}
int sum(int n, int m)
{
return sumBody(n, m, 0);
}
main()
{
int n = sum(10, 20);
printf("%d\n", n);
}
このスレ見ててよく思うけど質問のレベルで技量を察してやれよ
再帰なんか分からないだろう
>>514 もっと具体的に
具体的というより厳密に
ヒープとスタックってどないちがうん?
ぜんぜん違う
>>514 エスパーでこんなところか?
int getGoukei() {
int goukei = 0;
int i;
for (i = n; i <= m; i++) {
goukei += i;
}
return goukei;
}
>>521 int getGoukei(int n, int m) {
にしてやらないとな。
523 :
491 :2008/09/06(土) 18:37:52
>>514 (m + n) * (m - n + 1) / 2;
まぁ、IntegerかIteratorかは兎も角、Incrementだけはないわ。
「nからmまでの」と書かれた場合、n<mが前提だと思うのは若干エスパーな希ガス
大丈夫、普通の神経の持ち主ならわざわざ5から3なんて使い方はしない。
528 :
514 :2008/09/06(土) 20:44:51
説明不足ですみません、携帯から失礼します 例えば数字を2つ入力して1つめの数字から2つめの数字までの合計(例えば1から10の合計→55) を出すような感じにしたいのですができる限り簡潔に書くにはどうすればよいのかと思い質問しました
>>524 って何も考えないでみたら顔文字にみえるなw
>>528 #include <stdio.h>
int main()
{
int m, n;
scanf("%d %d", &m, &n);
printf("%d\n", (m + n) * (n - m + 1) / 2);
return 0;
}
これで満足?
それはないわ…
このスレ、学生が定期的に課題丸投げにしてくるな 楽して単位とるなとはいわないけど、せめて宿題丸投げスレで聞けよ
>>491 indexのi。ルーツは数学。iの次だからってj,kも使われる。
いや、integerのiでしょ。
536 :
デフォルトの名無しさん :2008/09/06(土) 22:29:52
不毛だな 旧世代のオッサンが考えたことだ。 理由を探すのも面倒。特に割りとあいまいに処理されるIT関連の擁護とかをみてると。
不毛以前に今までのやり取りをぜんぜん見てないのが気になる
不毛って、普段Cのプログラミングで変数iを使っていて iがどんな意味何かを考えたことはないの? それはそれで問題があるだろ。
>>538 なるほど、同じような書き込みがあったね。スマン。
541 :
537 :2008/09/06(土) 22:52:44
>>539 すまん
ほかの低級言語でそういうごろあわせみたいな意味を持たせてるのは知ってるから
どうせなんか意味あるんだろうなて放置してる。
542 :
デフォルトの名無しさん :2008/09/06(土) 22:57:59
問題です。a[2]を2[a]とするのは正しいでしょうか?
543 :
デフォルトの名無しさん :2008/09/06(土) 22:58:56
いみがわかりません
544 :
デフォルトの名無しさん :2008/09/06(土) 23:01:55
却下
int a[3]と言う宣言に対してa[2]と書いても2[a]と書いても意味は同じ。 尤も、見た目の印象は壊滅的に違うが。
546 :
デフォルトの名無しさん :2008/09/06(土) 23:10:52
a[2]=*(a+2)=*(2+a)=2[a]
2[a] これがかけるのは知らんかった しかしこんな不細工な書き方OKなんだな>コンパイラ
1[strchr("abc", 1["abc"])] = 'C'なんて書かれたら最早何がなんだかw
そもそも[]がシンタックスシュガーだから
551 :
547 :2008/09/06(土) 23:24:37
>>550 なるほど
配列としてみると気持ち悪いが、ポインタとしてみればそんなもんか
552 :
デフォルトの名無しさん :2008/09/06(土) 23:38:16
言わずもがなだが、配列名はポインタと同じくアドレス値をもつが、 ポインタが変数なのに対し、配列名は定数という違いがある。
[]がシンタックスシュガーのわけないだろ。
シンタックスシュガーって a[1] *(a+1) が書き方は違うけど等価になるってことでしょ どっちか片方だけを指して a[1] は糖衣構文だけど *(a+1) は違うとか言わないよね?
>>555 シンタックスシュガーに対する認識が間違ってる。
等価だけどそうじゃなくて プログラマーに優しい別の書き方の事
[ ] の方がプログラマーに優しいって事?
->
>>558 少なくともリッチーはそういう場合もあると考えたということなんだろう。
同じことをするのに違う書き方ができたら全部シンタックスシュガーとか言っちゃうやつ多いな。
ほんとに多いのか? そんな奴俺だけで十分だろう
wikipedia だと for は while のシンタックスシュガーだと書いてある じゃあ while は if と goto のシンタックスシュガーになるのか? 気持ち悪いな
まあ、大抵はタイプ数が少なくなるから 優しいという感じな気がする
566 :
デフォルトの名無しさん :2008/09/07(日) 00:54:03
いきなりですけど・・・C言語とかエディタ上で使う数字は、つまり 表示される数字なんですけど、既に数値なのか、取りあえずテキスト としての数字なのか、どっちなのでしょうか?
後者
> は < のシンタックスシュガーなんだろうか
>>564 それは機械語に置き換わるレベルの話だな
まあ配列がポインター云々も似たような話か
>>566 後者です。
コンパイルする段階で数字などに置き換わります。
>>571 条件判定式の?
だったらアセンブラにあるよ。
ただ||や&&はない
>>572 機械語に置き換わるっていうか、実行時にな。
ソースなんだからそりゃテキストだけど、意味的には数値だろ?
>>566 が、どういう意図で質問したかで答えは変わるか。
575 :
デフォルトの名無しさん :2008/09/07(日) 01:09:09
すいません。あまり深い意味はありませんが・・・ エディタで処理する以上テキストという認識でよいのでしょうか? 早速のご回答有難う御座います。少しかじってみたいのですが。
>>575 自分で書いてるソースをバイナリーエディタで
見てみるとすっきりしますよ。
出てくるコードはアスキーコード表にのってますので
577 :
デフォルトの名無しさん :2008/09/07(日) 01:17:43
ご丁寧に有難う御座います。バイナリーエディタ? 本当に初心者で何をそろえようかなというレベルです。
糖衣構文というのが意味として分かりやすい方というのであれば、 状況によってどちらが糖衣構文になるかは変化すると考えてよい? #include<stdio.h> void swap_char(char *a, char *b){ // 実装は気にしないでね char c; c=*a; *a=*b; *b=c; } void swap_string(char *a, char *b){ // 実装は気にしないでね int flag; for(flag=0;flag!=3;a++,b++){ swap_char(a, b); flag|=(*a=='\0')|((*b=='\0')*2); } } int main(void){ char a[10]="foo", b[10]="bar"; printf("%s %s\n", a, b); swap_string(a, b); // これは swap_string(&a[0], &b[0]); の糖衣構文 printf("%s %s\n", a, b); swap_char(&a[0], &b[0]); // これは swap_char(a, b); の糖衣構文 printf("%s %s\n", a, b); return 0; }
少なくともソースが簡略になっていないと、シンタックスシュガーとは呼べない。
perlには見やすくなったかかなり疑問なシンタックスシュガーあるぜ!
>>578 「シンタックス」 シュガーだろ。
「セマンティクス」シュガーじゃねーよ。
582 :
デフォルトの名無しさん :2008/09/07(日) 03:48:48
Cやってみようか。
583 :
デフォルトの名無しさん :2008/09/07(日) 03:53:05
入門編を信じてお聞きしますが、何かいい書籍(他にスレありそう ですが専門的過ぎて)等ありますか。やはり情報処理試験とかある 程度基本的な資格取りに専念した方がいいのでしょうか? 質問ばかりでスミマセン。
あなたの目的は?
fork, pipe, dup2 を使用して 指定してされたコマンドに標準入力にデータを投入し、 そのコマンドの出力結果を取得する popenの双方向版 のような 関数を作ろうとしております。 具体的には、 -- 指定したコマンドを子プロセスで実行させる。 子プロセスで実行するコマンドの入力は、親から子へのパイプを通して渡し、 コマンドの出力は、子から親へのパイプを通して渡す。 -- のようになります。 このとき、指定したコマンドが 「標準入力を全て read してから標準出力に writeする」 仕様だと問題ないのですが、(sort 等) 「標準入力から read -> 標準出力に write」 を交互に繰り返す仕様の場合、(cat 等)デッドロックが掛かってしまいます。 write ("親から子へのパイプ", buf, bufsize); << ここで止まる。 「標準入力から read -> 標準出力に write」 の場合でも 指定するコマンドの読み書きの仕方/バッファリングの仕方に関係なく 親プログラム側でデッドロックがかからなくする方法を知りませんでしょうか?
586 :
585 :2008/09/07(日) 04:29:07
OKだったコマンドとデッドロックがかかってしまうコマンドの例です。 --<コマンド例>---------- OKの場合: while(..read(..)..){ } // 全て読んでから write(..); デッドロックがかかる場合: while(..read(..)..){ // 読みながら書き込み write(..); } --
587 :
デフォルトの名無しさん :2008/09/07(日) 04:34:15
理系の学生にCをやるとコンピュータ(プログラム)のことが分かる と言われたことがあって、とりあえず基本から始めて、向いていそう だったら、いろいろなアルゴリズムにも手を出してみようかと。 少しあまいかもしれませんが、基本的には好奇心です。仕事などでは Office製品しか使ってません。(あと業務用のパッケージ) ポインタが難しいとかよく聞きますが ポインタ=アドレス?それともポインタとはアドレスを扱う変数? そもそもその辺がちょっとした本を見てもいま一つの感じです。
select() シグナル wait3() 共有メモリ あたりは知ってる?
>>587 先ずは、社会常識と日本語を学ぶことから始めると宜しいかと。
590 :
585 :2008/09/07(日) 07:24:58
>>588 漠然としてて答えにくいですが、知っているつもりです。
select 関数で 読み/書きそれぞれのパイプ(実際にはディスクリプタ)を
監視して、状態の変更に合わせて読み書きすればできるのでしょうか?
ちょっと調べてみます。
自己解決しました
592 :
デフォルトの名無しさん :2008/09/07(日) 08:55:49
ハロワ募集の内容が 基本的な操作ができること どういう意味?
>どういう意味? マ板に逝け。
594 :
デフォルトの名無しさん :2008/09/07(日) 10:22:50
すみません。
CSVファイルを行単位で読み込み、その中のカンマを水平タブに変換する。その後resultファイルで出力 というプログラムなんですが、#define buff_sizeのサイズによって、出力したファイルが化けるのですが原因はなんでしょうか。以下ソースです。 #include<stdio.h> #include<string.h> #define buff_size 2 char g_buffer[buff_size]; char strafter[buff_size]; int subrtn1(); int main(){ FILE *fp; FILE *result; fp = fopen("sample.csv", "rt"); if ( !fp ){ printf("ファイルオープンエラー\n"); return; } result = fopen("result", "w"); while( fgets( g_buffer, buff_size, fp ) != '\0' ){ *strafter = subrtn1(g_buffer); if ( EOF == fprintf(result, strafter) ) printf("ファイル書き込みエラー\n"); } fclose(fp); fclose(result); return ; } int subrtn1(){ int i = 0; while ( g_buffer[i] != '\0' ) { strafter[i] = ( g_buffer[i] == ',' ) ? '\t' : g_buffer[i]; ++i; } return *strafter; }
596 :
595 :2008/09/07(日) 14:52:22
追記。 読み込むファイルは行ごとに文字数がバラバラです。 調べたけれど、原因がほんとに理解できないorz
かんきょーはうぃんどうず?
598 :
595 :2008/09/07(日) 14:58:08
すみません、環境書くの忘れてました。 OS:Linux Fedora8 コンパイラ:gcc (バージョン失念しました。Fedora8インストールの際に入れたものです。
日本語食えないとこに日本語食わせていじったらそら文字化けする。
>>599 S-JISならTABは問題ないとおもうけど
fgetsの使い方が変?
横から質問申し訳ないんですが
>>595 にあるようなfopen("sample.csv", "rt");
のtはどういう意味なんでしょうか
manでfopenを見てもありません
つーかさ1行の文字数ってどのくらいあるの? このソースだと2バイトしか読めないぞ
t text b バイナリー だったかな
時折、ポインタを進めるのにsizeofを使うコードを見かけるんですが、 これって普通に使う手法でしょうか? たとえば、こんな感じですが char* rPtr = &src_data[0]; ←読むデータのポインタ val = *rPtr; ←1バイト分コピーする rPtr +=sizeof(char); sizeofが、コンパイル時時に定数に置き換えられれば良いけど、 プログラム実行時に毎回引数の型のサイズを見てたら、 無駄に処理が重くなるんじゃない?と疑問に思ったりと。
>>605 char*をint*にしたらどうなると思う?
607 :
595 :2008/09/07(日) 15:26:23
>>603 さん
行によってマチマチなんですが、おおよそ1行で150文字くらいですね。
#define buff_size 2 となっているのは暫定で適当につけたものです。
とにかく出力さえ、うまくできれば・・・と思っていますorz
>>605 見ない
それにCでコンパイルすればどっちみ機械語に変換する場合に
型ごとのサイズでポインタが加算されてる。
int型のポインターを+1すると、おおよその環境は+4バイト
short型はポインターを+1すると、+2バイト
Cで型についてうるさいのはこういうことをコンパイラがわからないと困るから。
>>605 ほんとにそんなコード時折見るのか?
指してるサイズ分すすめるのは+1だぞ?
>>607 fgetでrtだと一行まるまるよまれるからそのままだと2バイトしか読まないので
バッファサイズを256にでもしておけば?
>>608 〜609さん
レスありがとうございます。
最近、外注先かの納入物で見ます。
val = *rPtr;
rPtr +=sizeof(char);
↓
val = *rPtr++;
と個人的には書きたいんだけど・・・問題あるのかしら?と悶々としてたり
ちなみに通信系のコードなので、1バイト境界での読み込みしかしませんので、
常にchar*を使用します、int*は使わないです。
intは、2byteか4byte長になるかの機種依存性ありますし・・・。
613 :
595 :2008/09/07(日) 15:39:17
>>610 さん
バッファサイズは3,4,8,16・・・128,256,512,1024など色々試したんですが
いずれも化けるか、おかしな改行が入ったりする状況です。
違う関数のほうがいいのだろうか
>>602 VC++独自だから忘れていい。
604の言う通りだが、通常はbを指定しないことでテキストモードを表す。
元ファイルの改行コードがCRLFとか?
>>612 その例のrPtrは char型のポインタなんで別にsizeof(char)しなくてもOK
>>613 ごめんロジック全部はちゃんとみてないけど
なんかそっちで失敗してると思う。
関数にバッファの中身を処理させてるけど
関数を使う必要がなければもっと簡単にできるはず。
それに
1)g_bufferをクリア
2)g_bufferへ1行読み込み
3)そのまま中身書き換え
4)終わったら出力
これでいいとおもうけど
なんかその処理をみてると2つのバッファ間でへんなことやってるきがする。
あと上の手順はCSVファイルがS-JISだったらOKだけどほかの文字コードは検証してないw
>>614 なるほど
どうりでmanに載っていないわけです
ありがとうございました
>>615 それもくさいな。
fgetって改行コードって全部のOSの分みてくれないんだっけ?
3パターンくらいあったよね?
なんのためのテキストモードだと思ってんだよ・・・
620 :
618 :2008/09/07(日) 15:59:36
すまねえw テキストモードで1行単位で読むと遅いのでバイナリーモードで メモリにあげて自前でやってたから気にしてなかったわ。 じゃあロジックの問題か
621 :
デフォルトの名無しさん :2008/09/07(日) 16:00:18
> > > C++ > > > ものすごくいいよ。 > > > 「アルゴリズム」っていうヘッダまである。 > > > ということでソートなどは覚える必要なくなったよ。 とか言ってる奴がいるんだが大丈夫なのか?覚えなくても
623 :
デフォルトの名無しさん :2008/09/07(日) 16:04:21
>>621 そもそもそういうのがない言語だったとしても、
ググって見つけたコードを書き換えるだけだから、
C++に限らず覚える必要はないと思う、理解さえできていれば。
ちなみに、Cにもqsortがあるよ。
覚えるというか原理位知ってくれないと ソートされてない配列に対してbsearch呼んで 「これライブラリのバグじゃないスかねぇ?」 とか抜かしたウチの新人の様になるので気をつけてください
質問ついでに気づいたことツラツラと
>>595 >>while( fgets( g_buffer, buff_size, fp ) != '\0' ){
→g_bufferは各ループ毎に初期化した方が良いと思う
ちなみにfgetsは読み込んだ文字列の終端に
改行コードを勝手に付けたと思うので仕様を確認してみてはどうでしょう?
>>*strafter = subrtn1(g_buffer);
→strafterも同様に初期化してから文字列を格納している?か確認要かと
>>if ( EOF == fprintf(result, strafter) )
>>printf("ファイル書き込みエラー\n");
→エラーだけど、while抜けなくて良い?
コードを、ざっと見て気になりました。
627 :
デフォルトの名無しさん :2008/09/07(日) 16:26:31
628 :
595 :2008/09/07(日) 16:44:31
皆様ありがとうございます。
>>615 氏
ファイル自体はWindowsで作ったものなんで、CRLFになっているはずですね。
改行コードの処理ちゃんとせないかんですねorz
>>616 氏
バッファの初期化は確かにやってなかったですねorz
ロジック含めてもう一度見直します。
>>626 氏
fgetsはNULLを追加するみたいです。
初期化はやっぱりしてませんでした。その辺の処理きちんとしときます。
while抜ける処理も書いてないですね確かにorz
o(゜◇゜o)ホエ?
>>628 NULLを追加するんじゃなくてエラーが起きたかEOFに達したときはNULLを返す、だろ
>>631 628の言っているNULLは\0のことだと思う。
まあなんにせよいろいろ突っ込みどころの多いコードだな
とりあえず ・returnは値を返せ ・resultのfopenもチェックしろ ・fgetsの戻り値はchar*
っていうかコンパイルできねーだろこれアホか
他にも幾つか。 ・グローバル変数は使うな。 ・入力を再利用しないのなら、入力バッファと出力バッファを分ける必要は無い。 ・','を探すのは、標準関数を使おう。 ・えらーちぇっくするなら、fprintf()だけでなく(出力の)fclose()もエラーチェックすべき。 ・勿論、>634の指摘したとおりfopen()も。 ・型について、もう少し慎重にチェックすること。 ・コンパイラは最低限の警告くらい出すようにしよう。 # 例えばgccなら gcc -Wall ...
>>635 Cではプロトタイプと引数が食い違っててもコンパイルはできるよ
単にstrafterにコピーしたあとヌル文字つけてないだけだろ
あとfprintfの書式指定文字列に配列放り込むな
これでいいんじゃないの クローズチェックはやってないけど #include<stdio.h> #include<string.h> #define buff_size 1024 char buffer[buff_size]; int main(){ FILE *fp; FILE *result; int i; fp = fopen("sample.csv", "rt"); result = fopen("result", "w"); if ( !fp || !result ){ printf("ファイルオープンエラー\n"); return -1; } while( fgets( buffer, buff_size, fp ) ){ for ( i=0 ; buffer[i] ; i++ ){ /* ASCIIしか考慮してないが */ if( buffer[i] == ',' ) buffer[i] = '\t'; } if ( EOF == fprintf(result, "%s", strafter) ){ printf("ファイル書き込みエラー\n"); return -1; } } fclose(fp); fclose(result); return 0; }
>>640 ・fputs()を使わない訳は?
・strchr()を使わない訳は?
・main()で-1を返す訳は?
・fputs()を使わない訳は? 特に無い ・strchr()を使わない訳は? 特に無い ・main()で-1を返す訳は? 特に無い
643 :
641 :2008/09/07(日) 17:40:35
あいわかった。
mainで-1を返すのはエラーだって分かりやすくするために良く使う
641はmainの戻り値は1とか正の値のほうがいいのでは?と言いたいんだと思う。
処が大抵のコマンドインタプリタは終了ステータスを正の整数としてしか扱わない。
647 :
641 :2008/09/07(日) 17:47:02
>>645 ×int main(){return -1;}
○int main(){return 0;}
◎int main(){return EXIT_FAILURE;}
648 :
641 :2008/09/07(日) 17:48:33
うへ、return 0じゃねぇよ、return 1だぜ。
EXIT_FAILUREはexitの時には使うけど returnでは何故か使わない… 考えたら変な癖だな
returnは1、2、3…と増やしていくようにしてるな 使わないけど
651 :
デフォルトの名無しさん :2008/09/07(日) 19:09:33
int main(int argc, char** argv) **って、なに? ポインタのポインタ?
fcloseの戻り値でエラーチェックって、なんかする意味あるのか?
他人のコードを読んでいて、 unsigned char status:4; のような宣言を見つけたのですが、:4はどのような意味があるのでしょうか。
揚げ足とるようで気を悪くされたらすまんが >>fp = fopen("sample.csv", "rt"); >>result = fopen("result", "w"); >>if ( !fp || !result ){ >>printf("ファイルオープンエラー\n"); >>return -1; >>} 別にプロセスが終わってしまうからreturnしても問題は発生しないだろうけど、 fopen出来たものはfcloseする癖をつけたほうが良いですよ。 mallocとFreeみたいに。 >>if ( EOF == fprintf(result, "%s", strafter) )・・も。 1つの関数内でreturnを散逸させるのは控えた方が良い。
>>651 char**は、char*を指すポインタ
>>652 まだバッファに残ってたデータがディスクフルとかで書き込めなかったときにわかるんじゃない?たぶん
>>653 ビットフィールド
>>652 ストリーム出力はバッファリングされるので、fprintf()で全てが出力されるわけではない。
バッファに残っている分は、fclose()によって出力(フラッシュ)される。
従って、(最早殆ど意識する必要が無いとはいえ)最後の最後にディスクフルになって書けないかも知れない。
それを検出するためには、書き込み後のfclose()の戻り値はチェックしておく習慣をつけることが望ましい。
逆に、入力後のfclose()は通常エラーを起こすとは考え難いので省略してしまうことが多い。
Cではmainを再帰呼び出しできるしなぁ
Cって開発環境は何つかえばいいの?
visualC++
660 :
デフォルトの名無しさん :2008/09/07(日) 21:22:38
661 :
デフォルトの名無しさん :2008/09/07(日) 21:23:55
662 :
デフォルトの名無しさん :2008/09/07(日) 21:25:37
>>661 ググってみたんですがC非対応と…
信じて良いですか?
確かに誰も使っていない最新のC99規格には対応していない。 でも、一般的に用いられているC89-C95には対応しているから大丈夫。 ファイルの拡張子やオプションでCとC++から選べるようになっている。
VCが一番。 GCCやBCCとかあるけど、MS製のライブラリはたくさんあるし MS以外のライブラリもたくさんだし、安定度も速度も一級品。
配列a[3]とb[10]c[10]d[10]があって、 a[1]<-b[1],b[2],b[3]・・・・・b[10] a[2]<-c[1],c[2],c[3]・・・・・c[10] a[3]<-d[1],d[2],d[3]・・・・・d[10] のように、配列aに各bcdのポインタの頭を格納したいんだ。 こういうときは、 *&a[1] = b *&a[2] = c *&a[3] = d でいいのかな。
? a[0]=b a[1]=c a[2]=d
>>665 面白いけど
a[1]=b;
でダメな理由が分からない
やっぱそうだよね。でも、こう書くと、 1)a[0]=bを実行 a[0]=b a[1]=不定 a[2]=不定 2)a[1]=cを実行 a[0]=c a[1]=c a[2]=不定 2)a[2]=dを実行 a[0]=d a[1]=d a[2]=d ってなるんだお。意味不・・・
a,b,cの宣言部分から書いてみろよー
あいよ〜 正確には、 /*宣言*/ struct kata* featlist[MAX_FEATURES]; struct kata* tempfeat; tempfeat = new kata[MAX_FEATURES]; /*操作*/ for(i=0,i<10,i++)){ //tempfeatに何らかの操作を施す featlist[i] = tempfeat } という風にしているんだけど、688のようなことが起こるわけ 1)featlist[0]=bを実行 featlist[0]=b featlist[1]=不定 featlist[2]=不定 2)featlist[1]=cを実行 featlist[0]=c featlist[1]=c featlist[2]=不定 3)featlist[2]=dを実行 featlist[0]=d featlist[1]=d featlist[2]=d ウマーーー!!!!!
あ、いやw書いててわかったかもしれんw forの中で毎回宣言しなくちゃならんのかな?
あ・・・れ・・・? C言語にnewなんてあったっけ・・・?
どこから突っ込もうか
すまん、スレ違いだったな。 for内で毎回領域確保しないといけないんだな。 ありがとう。
あ、良かったら突っ込んでください。もっといい書き方あるのかな。
for(i=0,i<10,i++)){ featlist[i] = new kata[MAX_FEATURES]; }
いい書き方より、デバッグの仕方を覚えたほうがいいような?
まず文法がわかってるかどうかから怪しい
679 :
653 :2008/09/07(日) 23:30:36
>>655 ありがとうございます!理解できました。
でででばっくのしかた?
BASICの質問してる人がいるの?
C言語を今日から学ぼうと思ってる者です C言語を学ぶならコンパイルがないと始まらない、と説明書で読んだのでVisual C++ 6を使いたいのですが (これコンパイラですよね?)フリーソフトかどうかわかりません。どういう意味でしょうか?
どういう意味、ってどういう意味なのかよく分からんが、 とりあえず Visual C++ 2008 Express Edition 落としてこれば問題ない
VC++6.0は有償です VC++2008 ExpressEditionで
どうしようもないくらい初歩的なことですみません VC++で1つのプロジェクトに複数の.cppファイルを作ったとき ビルド→実行で全体のプログラム?を実行することはできますがプロジェクトの中にあるうちの 1つだけの.cppファイルを実行したいときはどうすればよいのでしょうか?
関数名をmainにしたら動くんじゃないか。 関数の動作チェックがしたいんかい?
まだ始めたばかりなので上手く表記できないのですが例えば 関数1 { 2を呼び出し 3を呼び出し 4を呼び出し } みたいな感じのときに1(全体)ではなく2、3、4単体の動作チェックを行いたいです
cl.exeをコマンドラインから実行するとか
関数1 { 2を呼び出し /*3を呼び出し*/ /*4を呼び出し*/ }
>>687 テスト用のmain関数を作る。
当然別プロジェクトでテスト対象の関数の.cファイルは同一。
#include <stdio.h> int main(void){ printf("hello"); } 「14歳から始めるわくわくゲームプログラム」 と言う本にあったサンプルプログラムなのですが、エラーが出てしまって全く先に進みません。 ボーランド製のC言語です。
>エラーが出てしまって全く先に進みません。 エラーの種類は?
エラーの内容を正確に書いてくれないと。 環境設定をやってなくて、xxx.objが見つからないとかいうエラーじゃないの?
その前に、stdio.hが見つからない、とかになるか。
return 0;
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照 です
>>691 そんな変なタイトルの本、ほんとにあるのか?w
初期設定しろ!
まず
>>695 のを入れるべきだな。
話はそれからだ。
設定ファイル "bcc32.cfg" と "ilink32.cfg" の設定はしたんだろうな?
ググったら「14歳からはじめる〜」シリーズは結構あるんだなw 姉妹品に、「15歳からはじめるDirectX9 3Dゲームプログラミング」というのもあった。
そういう初めてシリーズだと環境設定から書いてあるだろ。 読んだのか?最初から。 読んでもしそういうのが無ければその本返品しろw
しかし、
>>696 のエラーだとmain()のつづりミスじゃないのかなあ。
質問者はエラーの出たソースをそのままコピペしたか?
>>704 Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
** error 1 ** deleting Debug\renshuu.exe
です
初期設定は本に書いてある通りに行ってます。
>>706 サンプルファイルでそのままフォルダにあったものをコピペしてます。
>>708 その本のどこかに訂正を書いてあるページとかない?
なければゴミシリーズ決定だな>その出版社の本
皆様へ いろいろやってたら動くようになりました。 どうもありがとうございます。
なんちゃそりゃ。
上書きを忘れてたんだよきっと
「12歳から始めるTex」 …ハァハァ
落ちこぼれでもかけちゃう本を読んで学ぶ人に失礼では?
>>485
715 :
デフォルトの名無しさん :2008/09/08(月) 21:22:58
ポインタへの理解に向けてってことで聞きたいんですけど アドレスと変数の中身ってよくメモリの番号とバイト数の関係で説明されるけど 変数がその変数の中身を指してるって事実はどう処理されてるんですか?
意味がわかりません。
>>715 どう処理って何が聞きたいの?俺は100%説明できると思うよ。
変数の格納先の番地はプログラムが把握してるんだよ ポインタの場合はプログラムが把握している番地の領域にさらにメモリの番地が入ってる
static int n; static int x, y; とかって変数があったら、コンパイルの段階で、nは100番地に置くとか、xは104番地に置くとか決めてる。
それはない
721 :
715 :2008/09/08(月) 21:41:27
なんと言うか、型によってアドレスの幅がとられたりするのは直感的にわかりやすいし、 アドレスが連番ってことももちろんわかります、その変数の中身が型のバイト数以内だから変数の中身もわかる と思うんですが、それをどうやってaとか変数名と結び付けてあるのかがわかりません
722 :
717 :2008/09/08(月) 21:41:39
>>718 番地だけじゃない。暗黙のうちに、番地の先にあるオブジェクトのサイズが
包含されてるんだよ。ポインタに演算かけりゃすぐわかるだろ。
Cでさえこれなのに、C++になると頭が破裂しそうに…
>>721 結びつけるっていうか、コンパイラが覚えてるだけだよ。
nという変数を100という番地に置くと決めて、
n = 3;
というコードがあったら、
mov [100], 3
というアセンブラのコードに置き換えるだけ。
>>721 結び付けるも何もコンパイルしたらCの場合はaに該当する
格納先は何らかの形で確保されるけどaなんて表記はないよ。
つーかその辺理解したかったらアセンブラか機械語やらないと無理。
それにそもそもアセンブラや機械語では開発効率が悪いので
Cでそういう配置先とかを意識しなくてよくしたのに
それを理解云々って変なところにこだわりすぎ。
答えは、「結び付けられてない」だなw マシン語では、データはすべてアドレスで持ってる。
>>722 はぁ?ポインタに格納してるのはアドレスだけだろ?
お前がいってるのはポインタの型じゃん
>>725 だなあ。
バイナリーをCソースには戻せないもんな。
アセンブラのソースにはできるが。
なので
Cソース->バイナリの結びつけはなんとか可能だが
その逆はできないし、そもそも必要性を感じない。
仕事でそんなところ詰まってるとすぐ切られるぞ
>>726 型によってポインタの内部表現の種類が違うかもしれない程度かな
規格上は型を持っていてもかまわないんだろうけどそんなコンパイラあるとは思われない
729 :
715 :2008/09/08(月) 22:03:17
次元が高いから内部で何重にも処理されてるのか 配列だとaが先頭のアドレスをさすのに intだとaは変数の中身しか指さないとか理屈的におかしいな〜と思ったわけ その場合左がポインタだと=の意味が変わることになるのも整合性がないし・・・と
配列とポインタについては特別な約束事があるからそうなってるだけだ
>>729 アセンブラレベルでみれば、どっちもさほどコードはかわらん。
配列の先頭のみに限ればだけど。
>配列だとaが先頭のアドレスをさすのに 違う 配列名は本当は配列そのものを意味する ただしいくつかの例外を除いて先頭要素へのポインタに変換される
733 :
デフォルトの名無しさん :2008/09/08(月) 22:08:56
>>732 逆だ
配列名が先頭アドレスで
&配列名が配列へのアドレスだ
sizeofは例外
とりあえずね、マシン語でやってることとC言語でやってることをごっちゃにするのは良くない C言語がやってることというのはコンパイラがやってることを含むから
ちょwwその辺詳しく教えてww
これは何のポインタかな?と思ったら 演算してみるのがおすすめ
>>732 違う。
配列名はアドレスではない、ポインタに変換されるだけ。
というかアドレスとポインタの区別はつけようね。
>>734 も言ってるけど。
738 :
715 :2008/09/08(月) 22:17:20
ポインタp=配列a とした瞬間になんでアドレスに変わるのよ? よくあるメモリの中身と周りに変数名、アドレスが載ってる図じゃ説明できないでしょ
|式中に現われる型「Tの配列」という左辺値は、 |(3つの 例外を除いて)配列の最初の要素を指すポインタに意味が格下げになる。 |結果としてできるポインタの型は「Tへのポインタ」となる。 |3つの例外とは、配列がsizeofのオペランドとなるとき、&のオペランドとなるとき、 |charの配列を文字列リテラルで初期化するとき、を指す。 とまあ規格ではこうなっている ポインタに変換されないことは例外だが、一方でそれが本来の意味だということ
またこいつか 配列がアドレスになるのはおかしいだのなんだの もうわかってて荒らしてるとか思われん
正確に理解したいならアドレスとか実装に依存する事は考えずに あくまで指すもの=ポインタ として理解しないと
いやだからその辺の理屈を知りたければアセンブラやれ。 そうすればあるときはポインタに格下げとか言われてる意味がわかるから。 C使う以上はそんなの気にしてられねえよ。 なんのためのCだよ。
なんだよ。かまってちゃんか。 相手して損した。
745 :
715 :2008/09/08(月) 22:27:14
int a;と宣言したからと言って、変数aがどこかのアドレスに割り当てられるわけじゃないのも混乱の原因になるな。 勿論int * p = & a;としてしまうと、その時点で割り当てられることが確定するわけだが。
>>746 まーなー
コンパイラがレジスタでいけるやんって判断したら
メモリ上には存在しないし。
レジスターも広い意味でアドレスなんだけど
そもそも、最適化で消えてなくなる変数だってあるわけで。
753 :
デフォルトの名無しさん :2008/09/09(火) 20:30:18
pclose()がstdio.hに見つからないんだけどどこにありますか? linux の centosでgccの3.46です
stdio.hだろ そこにないってことは実装されていない?
755 :
デフォルトの名無しさん :2008/09/09(火) 21:03:39
distroがわからないと何とも。
えっ?
glibcにないの?
>>753 grep pclose /usr/include/*.h /usr/include/sys/*.h
staticで宣言したグローバル変数を別ファイルで使うのってできます?
>>759 static を外す
定義しているファイルを include する
関数を使ってアクセスする
アドレスを貰って操作する
等
// file; a.c static int a これを // file; a.c int a; // file; b.c extern int a; ※extern int a;をヘッダーファイルに記述して、そのヘッダーファイルを includeしてもよい。(この方法の方がベター)
>>760 レスありがとうございます
関数を使ってアクセスするとは具体的にどのようにやるのか教えていただけないでしょうか?
// file a.c static int a; int getA() {return a;} // file a.h int getA(void); // file b.c #include "a.h"
764 :
デフォルトの名無しさん :2008/09/10(水) 03:22:45
>>754 popen()はあるし使えるんですよ、
stdio.hを直接見るとに関数宣言はちゃんとあるのに
なぜか暗黙の型宣言といわれてしまいますが(popen()で)
>>755 だからCentOSですってwちなみに4の最終です
>>757 pclose()を使おうとした場合
プロトタイプ宣言がないことで出る警告だけでなく
本体がが見当たらないというほうのエラーもでてるので
libcに無いみたいです
>>758 stdio.hに
見たらプロトタイプ宣言はありました
でもなぜかincludeしてるのに関数の宣言がされてない警告が出てしまいますが
無さそうそうなので諦めて作ることにします、皆さんありがとうございました
コンパイラオプションの関係ではないかな? __STRICT_ANSI__のマクロが定義されているとstdio.hの中のpopen, ocloseのプロトタイプ宣言 は#ifndef __STRICT_ANSI__で展開されない。 > ISO 標準の C。 gcc(1) を -std=c99 や -ansi などのフラグを付けて起動した場合、 > このマクロは暗黙のうちに定義される。
gotoってなんか使わないほうがいいって聞いたんだけど、みんな使ってないの? あれってたまに便利じゃね?
>>767 なんで使うなと言われるのか、くらいはググっとけ。
この板のgotoスレは消滅しちゃったんだな
i love goto
むしろ何でgotoを使いたいか理解できないなあ。 BASICやってたころは使ってたが今はとてもじゃないが使えんわ。 ただチューニングでどうしても関数呼び出しを減らしたい場合は インライン展開できない部分はgotoにしたりするなあ。
#define gogo goto にするといっぱい使いたくなるよ
gotoの使いどころは決まってる
多重ループからの脱出
エラー処理の可読性向上
おつむを換えるべき?
これ以上続けるなら隔離スレ立てちゃうぞ。
780 :
デフォルトの名無しさん :2008/09/10(水) 20:01:11
おむつと空目した。。。
>>777 gcc で-O3にして最適化させてみたけど、予定してたよりサイズ増えなかったんだよね。
つまり期待以上の最適化はやってないことかな?
最適化スレへどうぞ。
ループアンローリング
言語別質問スレしかなかったのでこちらでお聞きします javaとかCをサンプルコードコピペで動かしたことぐらいしかない初心者です 外部からの音声入力を拾ってそれを変数として何か動かすプログラムを書きたいのですが、 C言語で可能でしょうか。 具体的にはマイクの音と連動してウィンドウの色が変わるようなものを考えています。 なんでもいいので、始めるにあたってどうすればよいかご教授願いたいです。 宜しくお願いします。
OSは?
できる まずはウィンドウ作るところからはじめてみたら?
可能です。難しいけど。 Windowsならばウィンドウ関連のAPIとWave関連のAPIの知識が必要。
789 :
785 :2008/09/10(水) 23:44:23
>>786 >>787 >>788 レスありがとうございます。可能だということで安心しました。
OSはWindows Vistaです。(linuxなどの環境も用意できます)
とりあえず何もできない状態なのでウィンドウを作るとこからはじめてみたいと思います。
レス頂いたあとで恐縮なのですが、そもそもこのようなプログラムにC言語は向いているのでしょうか
他にもっと向いている言語等あったら教えていただきたいです。
マイクとかどうやってプログラムと連携させんの?
今やWindowsプログラミングでCが向いている分野なんて皆無
Cが向いているのは(移植性とかを除けば)とにかく性能を追求して かつ開発効率もそれなりに確保したい場合 とにかく動けばいいってんならほかにもっと簡単に作れる言語がいくらもある
>>791 デバイスドライバはまだまだいけるんじゃない?
Cをやる意味は9割がた教養
ffmpegはCで書かれてる。
796 :
デフォルトの名無しさん :2008/09/11(木) 11:07:08
>>789 録音ソフトは過去に作ったことあるんだが
waveの録音ならペゾルドの『プログラミングWindows第5版』つー本の下巻にサンプルコードが載っている
言語はC
これをそのままパクれば録音ソフトは作れる
ただ、前提としてCとWindowsプログラミングの知識は必要
俺の場合2年ぐらいかかった
プログラムの方法はともかく、waveデータを扱うならCぐらいの知識は普通に必要なのでやっておいて損はない
797 :
デフォルトの名無しさん :2008/09/11(木) 11:22:33
798 :
デフォルトの名無しさん :2008/09/11(木) 14:08:52
文字列(数字のみ)で構成されているファイルを読み込んで 文字列を数値に変換して並び替えを行うプログラムを作っているんですけど 文字列を数値に変換をして並び替えを行った結果、 先頭の数字0がなくなった状態で並び替えがされていました。 先頭の数字0がなくならない状態で並び替えを行う方法を教えてください。 お願いします。 例) 先頭の数字0がなくならない並び替え 並び替え前 並び替え後 00159 0101 130 → 130 0101 00159 先頭数字0がなくなった並び替え 並び替え前 並び替え後 00159 101 130 → 130 0101 159
>>79 意味がわかりません。
プログラム内部では文字列の数字ではなく変換後の数字でしょ?
頭に0なんて付かないけど。
>先頭の数字0がなくならない状態で並び替えを行う方法を教えてください。
数字に直す以上は無理です。
回答者もレベル低いなあ。 qsortに渡す関数の中でatoiして比較すりゃいいだけなのに。
>>798 各文字列を残しとけ。int型配列でも作って、そこの数字を並べ替える時に文字列も一緒に並べ変えろ。
宿題スレにいけよ屑
>>800 例がたまたまシンプルなだけで、qsortが使えないような場面の話なんじゃないか?
804 :
デフォルトの名無しさん :2008/09/11(木) 14:29:17
qsortに渡す関数の中でatoiして比較するとは、何ですか? 詳しく教えてください。 プログラムで例を出していただくと助かりますが・・・
805 :
デフォルトの名無しさん :2008/09/11(木) 14:29:38
意訳:課題だるいから早く解答だせよグズ
>>804 自力でやる気があるなら、これだけの情報で充分できるはずだ。
出来ないまま例を見ても鵜呑みにするだけで理解なんて出来ない。
理解する気がないなら誰かに作ってもらえ。する気があるならチャレンジしろ。
>>804 qsortとatoiが使えるなら、文字列をどっかに保存しといて、
atoiで並べ変えられた順に文字列並び替えるだけ。
qsortとatoiが使えないなら、
意味調べて自作汁
×atoiで並べ変えられた順 ○qsortで並べ変えられた順 orz
ここ、一応スレタイ的にも「入門篇」なんだからさ、もちょっと親切にするとかさ。
>>804 qsort でググレカス(AA略
課題丸投げは入門以前 単位ほしいだけだろ
812 :
デフォルトの名無しさん :2008/09/11(木) 16:06:32
課題まるなげなら宿題スレいけば解答もらえますよ と究極に親切な誘導してあげてるじゃないかw
813 :
デフォルトの名無しさん :2008/09/11(木) 17:22:49
C言語の質問か微妙だけど、 K&Rのカーニハンが日本語だいぶうまくなったって本当?
K&Rのローマ字の挨拶と比べてって事? どこからそんなレアな話を聞きつけたんだw
無名の配列とか構造体が使えれば素敵なのに
struct { int foo; } bar;
よくコードジェネレータが使う手だな
struct { int a; int b; } arry[] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
無名の構造体を引数に使いたかった
構造体返す関数作れば?
typedef struct { int foo; } Foo_t; Foo_t * Hoge(Foo_t * piyo); int main() { Foo_t bar = { 10 }; printf("before : bar::foo == %d\n", bar.foo); Hoge(&bar); printf("after : bar::foo == %d\n", bar.foo); return 0; } Foo_t * Hoge(Foo_t * piyo) { piyo->foo = 100; return piyo; } なんか違う気がしてきた
まず無名の構造体じゃないしな
無名の構造体 != 無名構造体ということですね、わかりません。 void * で渡して ((struct { int foo; } * )piyo)->foo = 100; こうするんですね、わかります。 もう年だからぼけてきているのかもしれない、そろそろマをやめるべきだろうか。 はぁ〜、ありえない・・・でも。
struct point { int x; int y; }; void hoge(struct point p); struct point make_point(int x, int y) { struct point t; t.x=x; t.y=y; return t; } int main() { /* hoge({100,200}); */ /* 無名の構造体を渡したい */ hoge(make_point(100, 200)); /* OK! */ } だめ?
826 :
デフォルトの名無しさん :2008/09/12(金) 01:36:52
タグ無し構造体 != 構造体型の束縛無し変数
簡単なTCPサーバを作っているのですが、 struct sockaddr_in sin; inet_aton(addr, &(sin.sin_addr)); /* IPアドレスの設定 */ の、IPアドレスの設定だけを、を別関数で行いたいのですが、どうしたらいいか教えてください。 同じmain関数内で実行するなら上記でいいのですが、 別関数でinet_atonをやりたくて、アドレス渡しでやってみたのですが、うまくできなくて困っています。 できれば、コードを書いていただけると助かります。よろしくお願いします。
828 :
デフォルトの名無しさん :2008/09/12(金) 07:38:45
クラスにしてフレンドつける
構造体を使う練習をしているのですが、初回のwhileループはうまくいくんですが、 2回目以降、名前を入力すると、出力がおかしい事になります。 どういうことですか? #include<stdio.h> typedef struct seiseki{ char name[20]; int kokugo; int sansuu; }Seiseki; int main(void) { Seiseki a[3]; Seiseki *ap = a; while(1){ printf("生徒名,国語,算数の順に入力してください\n"); gets(ap->name); scanf("%d",&ap->kokugo); scanf("%d",&ap->sansuu); printf("出力:生徒名%s,国語%d,算数%d\n",ap->name,ap->kokugo,ap->sansuu); ++ap; } return 0; }
>>830 scanfで残った改行が次のgetsで読みこまれる
832 :
デフォルトの名無しさん :2008/09/12(金) 10:13:57
>>830 scanf の後 \n が入力バッファに残っている
834 :
デフォルトの名無しさん :2008/09/12(金) 10:20:24
ぐぐるとscanf()の前か後ろにfflush() を入れてるサンプルが
>>834 それM$独自の拡張だから
gccでやったら未定義の動作
いや、bccだけど
837 :
830 :2008/09/12(金) 10:56:33
>831,833 有難うございます。
>>836 C++Builderのヘルプより
int fflush(FILE *stream);
The function writes any buffered output to the file associated with the
stream stream and returns zero if successful; otherwise, it returns EOF.
If stream is a null pointer, fflush writes any buffered output to all files
opened for output.
というわけで入力バッファに適用した場合にどうなるとは一言も書かれていない。
メーカーが書いてないんだから実際はM$準拠であれ未定義動作と見た方がよい。
普通に読み捨てでいいじゃん
どうやって読み捨てるんだよ
scanf("%d",&ap->sansuu); gets(dummy);
842 :
デフォルトの名無しさん :2008/09/12(金) 14:18:59
scanf("%d",&ap->sansuu); getchar();
C-dとかC-zで入力きられたらどうすんだよ
typedef struct{ int x, y; }POINT; void Test(char *data) { int pt = (int)*data; //エラーはでない。 } void Test2(char *data) { POINT pt = (POINT)*data; //エラーになります。何故ですか? } error C2440: '型キャスト' : 'char' から 'POINT' に変換できません。
>>845 エラーメッセージのとおり。
>> int pt = (int)*data; //エラーはでない。
「*data」はchar型 (=1バイトの整数型) なので
int に変換して代入できる。
>> POINT pt = (POINT)*data; //エラーになります。何故ですか?
「*data」はchar型なので
POINT構造体には変換できない。
>>845 これがエラーになるのと同じ
char ch = *data;
POINT pt = (POINT) ch; // ←これ
本当にやりたいのはこうではないか?
POINT pt = *(POINT*)data;
>>846 charは1バイトの整数型だから
intやdoubleに変換できるが、構造体には変換できないということですよね?
それは何故なんでしょう?
void Test2(char *data)
{
POINT *p = (POINT*)data;
POINT pt = *p;
}
こうするとエラーがでないのは、ポインタには型の区別がないということですか?
>>847 ああ、なるほど。よく分かりました。
構造体の型でキャストというのが意味不明でしたね。
ありがとうございました。
>ポインタには型の区別がないということですか? ないわけではないが、変換可能 キャストするとはそういうこと
(int)data や (double)data ってキャストは出来るのに (struct hoge)data ってキャストできないのは何でだろう。
>>851 どうやって変換したらいいか判らないからです。
例えば、struct tm dataだったら(int) dataもできません。
C++なら教えることができるので、ちゃんと変換してくれます。
理科大ナンバーがあったら恥ずかしいなw
誤爆?
理科大ナンバーってなんだ?
岡山理科大学の学籍番号
意味わからん
構造体と関数でぐぐって
>>827 をもう一度試したのですがうまくいきません。
どなたかお願いします。
860 :
デフォルトの名無しさん :2008/09/13(土) 19:30:44
>>859 同じ関数内でstruct sockaddr_in aaaを宣言して
inet_atonは普通にできるのはわかるのですが、
mein関数でstruct sockaddr_in aaaを宣言し、
別関数で、構造体の中身(aaa.sin_addr)の値を変更したいのです。
アドレス渡しで試してみたのですが、sin_addrが存在しない的なエラーが出て
うまくいかないのです。
構造体 関数等でググってうまくいかないので質問させていただきました。
どなたかお願いします。教えてください。
>>861 <使い方>
例:192.168.0.10をsockaddr_in構造体に設定する場合
struct sockaddr_in serv;
inet_aton("192.168.0.10", &(serv.sin_addr));
int hoge(struct sockaddr_in *bbb, char *addr) { inet_aton(addr, &(bbb->sin_addr)); return 0; } int main() { struct sockaddr_in aaa; char *str = "192.168.0.10"; hoge(&aaa, str); return 0; }
"○○","××"みたいな形式の2つのデータ群のファイルをそれぞれ別の配列に入れて計算したいのですが どのようにすればいいのでしょうか? fgetsで1行読み込んで「,」で区切る方法がいいんでしょうがよくわかりません
>>864 strtok
sscanf
好きなの使え
まぁそもそも一行目がいまいち何言ってんのかわかんないけど
>>865 16.67188,1.875e-003,
16.67188,1.1875e-002,
16.68188,-8.125e-003,
16.66188,-2.8125e-002,
こんな感じのデータが延々と続いてる奴で、左側のデータと右側のデータを別々の配列に入れたいというわけです
867 :
デフォルトの名無しさん :2008/09/14(日) 10:32:21
scanfだな
868 :
デフォルトの名無しさん :2008/09/14(日) 12:09:39
>>864 >>866 ファイルから一文字一文字読み込めるだろー?
char buf[128]とかして、
@区切り文字までをbufにいれる
Abufから配列にこぴ〜
Bbufくりあ
Cgoto @
でいいんでね?
>>866 のデータ見ると、sprintfは使えないだろうからなぁ
eを処理する関数も必要かもに
>>868 馬鹿は回答しなくても構わないんですよ。
>>866 sscanf()で"%[^,]"で変換するか、strtok()で切り出すか。
atof?
ハッシュ法を使わないといけなくなったんですけど オススメのアルゴリズム関係の書籍がありましたら教えて下さい よろしくお願いします
872 :
デフォルトの名無しさん :2008/09/14(日) 12:41:08
データを20数bitに変換するだけだよ。 たとえば、CRC32でも使えばいい。 衝突したらずらしたり、別領域に記録するんだよ
>>869 scanf()系の書式指定、忘れたけど、
"%f,"とかでいいんじゃね?
>>871 amazonで、アルゴリズムとかで検索して、星がたくさんついてるのを選んだら?
875 :
864 :2008/09/14(日) 12:54:49
レスありがとうございます。sscanfでとりあえず挑戦してみようと思います
文字列として読み込みたいのか数値として読み込みたいのかはっきりしろ
質問文見た限り文字列にしか見えんが なぜか%fとか提案してる人がいるだけで
でも普通文字列に対して計算したいって表現は使わない
どのあたりで文字列だとしか思えないんでしょうか?
880 :
デフォルトの名無しさん :2008/09/14(日) 17:21:35
いつものrfc4180がらみにネタに発展しそう。wkwk スルーカが試されているのか? (そういう俺はスルーできていない)
予告なしのスルー検定がしばしば開催される
882 :
デフォルトの名無しさん :2008/09/14(日) 19:09:41
>>875 アホ
sscanf する前の文字列をどうやってとるねん
バッファリミットはどこから取る気じゃ
思いっきり処理系依存するぞ
スルーしようぜ
884 :
デフォルトの名無しさん :2008/09/14(日) 20:20:43
おまえをな
バッファリミットって、なにだろう。
今作っているものが二重インクルードになってコンパイル出来ないんだ hoge.c #include "aa.h" hoge2.c #include "aa.h" aa.h #ifndef __INCLUDED_AA_H #define __INCLUDED_AA_H 宣言とか #endif これでエラーになるんだけれど、何が悪いのかな?
コピペに失敗したとか?
てか別のファイルなら・・・
889 :
デフォルトの名無しさん :2008/09/14(日) 21:38:47
>>885 おまえは知らなくていい
この板に来なくてもいい
>>889 突っ込まれるのが怖くて説明できないんですね。わかります。
892 :
デフォルトの名無しさん :2008/09/14(日) 22:20:21
>>891 いーや、
>>882 の文脈から「バッファリミット」の意味を見当もつけられない完全素人はまず「入門」してからこのスレに来いという意味だ
バッファリミット関係ないだろ? だから意味が分からない。
895 :
デフォルトの名無しさん :2008/09/14(日) 22:31:04
>>894 お前誰だ?
俺は
>>882 で
>>864 =
>>866 の用途に sscanf を使うことに否定の立場を示している
そこへ自分の立場を隠したまま頓珍漢なレスを返してきた
>>891 を完全に馬鹿にしているところだが、
その馬鹿か、おまえは?
>>895 > 俺は
>>882 で
>>864 =
>>866 の用途に sscanf を使うことに否定の立場を示している
おまえだって、今の今まで言ってなかっただろよ。
人に「立場を隠したまま」とか言うなよ。
だいたいこの問題に、立場とかどう関係してんだよ。
897 :
デフォルトの名無しさん :2008/09/14(日) 22:37:52
>>896 やっぱり、あの馬鹿だったか
バッファリミットもアホも読めてない奴に説明なんかするか
チンパンジーに因数分解を教えるより面倒臭い
だいたい、急に「バッファリミット」とかって言葉を持ち出したのは自分なんだから、人にエスパーを発揮するのを期待しないで、 自分で説明すればそれで済むことだろ。
>896がスルーされているのに気付けないのが哀れでならない。
なんだよ。結局説明できないのか。 ツッコミされるの怖がりすぎだろ。
901 :
デフォルトの名無しさん :2008/09/14(日) 22:44:29
>>898 いーや、sscanf を使う場合のコードが想像できることは、この問題を議論する論客として最低限の資格だ
質問する気にしても、人にものを尋ねるときの態度がまるでなっておらず、質問者として最低限の資格もおまえは備えていない
繰り返すがチンパンジーには無理な問題だ
あきらめて帰れ
人をチンパンジーとか煽るやつが、他人に「態度」とかいうなって。 もうどうでもいいけど、こういう技術系の話題で、あおり芸で切り抜けたつもりになってるやつって、悲しくないのかね。 ほんの数行説明すればすむ話をめんどくさいと言って、避けまくって、煽りだけはめんどくさがらずにひたすら続けてるんだもんなぁ。
904 :
デフォルトの名無しさん :2008/09/14(日) 22:57:14
>>902 バッファリミットの話はどうした?
あいかわらず想像もできていないようだが、事実を指摘されるのが悔しければこれ以上粘るのは得策ではないぞ
それから、説明するかどうかは回答者の自由意志によるもので、その態度で言い返し続けたあげくには何も得る物がないぞ
"バッファリミット" に一致する日本語のページ 8 件中 1 - 8 件目 (0.26 秒)
906 :
デフォルトの名無しさん :2008/09/14(日) 22:58:15
ほんの数行だってよ、説明したら一行だよバーカ
>>904 だから、それは「バッファリミット」を言い出したほうが説明するのが先だろ。
なんで周囲が、あれこれ推測してあげなきゃならないんだよ。
909 :
デフォルトの名無しさん :2008/09/14(日) 23:02:38
自分勝手な造語で喋っちゃうあたりからして、 人に分からせようとする気がないことが容易に推測できる。 無視するのが吉。
>>904 >説明するかどうかは回答者の自由意志によるもので、
だったら「バッファリミットの話はどうした?」って煽るなよ。
お前が説明する気がなかったら、それ以上話は進まないよ。
やーいバッファリミット野郎! ”バッファリミット”の検索結果 8 件中 1 - 8 件目 (0.14 秒)
char buf[200]; fgets(buf, sizeof(buf), fp); char col1[20], col2[20]; sscanf(buf, "%99[^,],%99[^,]", col1, col2); と言うコードがあったとして、バッファオーバランは発生しないし、バッファリミットとやらがどう関係するのかも判らない。 まぁ、col1, col2がそれぞれ実数と言う解釈でいいのならfloat col1, col2; sscanf(buf, "%f,%f", & col1, & col2);でいいわけだけど。 # それ以前に、1行200バイトが妥当かどうかも考慮する必要はあるな。
うん、そうだね。寧ろ、col1[100], col2[100]だろうけど。
916 :
デフォルトの名無しさん :2008/09/14(日) 23:10:54
>>911 そのとおり、話を進める気なんぞ
>>885 の時点から毛頭なかったが、
おまえ何を前提にレス書いて(≠話して)いたんだ?
>>913 バッファリミットって、このコードで、200文字以上の行があった場合のことかな?
>>916 ふーん。そんなにツッコミを怖がらなくてもいいのに。
言い出したやつが説明する気ないから、永遠になぞか。
920 :
デフォルトの名無しさん :2008/09/14(日) 23:15:23
イヤーつまんなかった。
922 :
デフォルトの名無しさん :2008/09/14(日) 23:16:16
>>919 そのとおり
知りたいことが聞き出せなくて残念だったな
>>922 いや、どうせ脳内で見当違いのことを考えてるだけだろうから、どうでもいいよ。
とまあこうしてこのスレの新参たちはキチガイに慣らされていくのであります
925 :
デフォルトの名無しさん :2008/09/14(日) 23:19:20
>>925 でも、ここまで煮詰まってるし、二人以外に何人か参加してるし、もしなんか
「普通のPGならとうぜん知ってるけど、俺が知らないだけ」みたいな点があったら、
なんかツッコミが入ってるだろうけど、そういうのないし、まぁ、あんたがシッタカしてるだけでしょ。
ここまで俺の自作自演
文字列切り出して、atof使えばいいじゃないの?
構造体はなぜ struct XXX { int hoge; }; ではなく typedef struct { int hoge; } XXX; と書くのでしょうか? Cで書いたものもC++でコンパイルすればいいと思うのですが。
930 :
デフォルトの名無しさん :2008/09/14(日) 23:28:59
>>926 イソップのキツネと言われた後の発言としては気が狂ったとしか思えんが
そのツッコミもまたまた読めてないわけで、チンパンジーとキツネの悪いとこ取りで多重継承してる奴だな
>>929 それは単に定義と同時にtypedefをするかどうかの違い
スタイルの話だからなぜもくそもない
別に前者で構わないよ
933 :
デフォルトの名無しさん :2008/09/14(日) 23:31:54
>>929 ん、俺は素では前者で書くぞ
現実には諸般の事情から後者の頻度が高いけどね
C++ も然り、諸般の事情で C 限定の場合がある
>>926 いや、こいつが何を言いたいかはわかるよ、当然注意すべきことだしね
バッファリミットなんて言葉を使っちゃうアホさと無駄に相手を煽るキチガイさは動かんけど
935 :
デフォルトの名無しさん :2008/09/14(日) 23:37:56
なんか荒れてるなぁ・・・。 とりあえず、バッファリミットって言葉は知らんが、 普通、スタックオーバーとか言うね。 sscanfってのは、制限無く書式通りの型を指定先のバッファにぶち込む。 それを知らんで、素人はスタック(≒用意したメモリ領域)を良くぶっ壊してたりするもんさ。 コンパイラチェック入ってないと、何もエラー出んから知らないままいることが多いね。 しかも、普通に動くこと多いんでバグが発見しづらいのが最悪な点かな。 例えば、 char destBuf; sscanf(srcbuf,"data=%d",&destBuf) とすると、 sscanfはint(%d)型のバイト数を値をsrcBufからdestbufにコピーする。 で、int型ってのは処理系依存で、2〜4byteで不定なもんだから使いにくいのよ。
またバカが増えやがった これ以上ややこしくすんな
>>929 単に「Cで書く」って決まってるプロジェクトで、C++のコードを混ぜたらまずいじゃん。
ちなみに
>>936 のサンプルソースは、最近新人が書いたもの。
既に、destBuf(char型)の後方3バイトを壊して、
他の処理系に異常を出した例。
正しくは、char destBuf→unsigned long destBufにせんといかんだけ
こういう事は気づかん所で良くあるねぇ
>>939 %d int
%hd short int
%ld long int
char を受けるのは無いな
>>936 > sscanfはint(%d)型のバイト数を値をsrcBufからdestbufにコピーする。
> で、int型ってのは処理系依存で、2〜4byteで不定なもんだから使いにくいのよ。
絶対なんか勘違いしてる。
943 :
デフォルトの名無しさん :2008/09/14(日) 23:48:12
>>929 自己レスです。
でもtypedefしたないものは自分は見たことないです。
別にCで書くとかそんな決め事ないケースばかりです。
スタイルだけの問題なんでしょうか?
実際的なメリットがあってそうしているのではないかと思うのですが。
自分で考えると
○ Cにしたときにtypedefのが問題がない
× typedefすると無名ができたり似たような名前が二つ出てきたりで面倒
といった感じです。C++では構造体はclassみたいになるし、シンボルも
違ってくると思います。その辺が絡んだメリット/デメリットがあるのかと
思うのですが、どうにも思いつきませんでした。読んでる限りだと実際ないのか
と思い始め、、、そうなの?
>>945 typedef struct tag_XXX {
int hoge;
} XXX;
をオススメする
947 :
デフォルトの名無しさん :2008/09/14(日) 23:56:30
>>945 今、見たことなくても、そのうち見ることあるんじゃないか?
大した理由は俺の知る限りないぞ
ところで typedef の問題ってよくわからんのだが、具体的なコード例は示せるか?
>>939 %dなのにunsignedで受けたらダメじゃん。
>>944 すまん。誤爆した(w
>>945 typedef ・・しておけば、変数のように構造体を使えるので
通常の記述はそうする。
・typedef していない→struct 型名 変数名;
・typedef している →型名 変数名;
>>949 いや、C++だと、typedefなくても、宣言のときにstractなしでできるのに、自分の見たコードは、
typedefしてあって、それはなぜでしょうか? って話だろ?
>>948 細かいところによく気がついてくれた。ありがとう!
誰も突っ込んでくれないんで、どうしようかと oTL オジサン寂しいのん
では、オヤスミ
>>947 Visual Studioなどで、正しく二つ分表示されるのが鬱陶しい。
ソースを元に簡単な解析をしたいときに鬱陶しい。
コード例ではないんですが。。。
953 :
デフォルトの名無しさん :2008/09/15(月) 00:11:03
>>952 ソースを解析するときは逆に typedef で struct を隠されると「鬱陶しい」よな
例えば jmp_buf みたいに構造体ではなく配列であることがミソなコードが読みづらかったりする
enum って、なんて読めばいいんですか?
>>945 Cの構造体(共用体も)の宣言はC++とは異なり、構造体タグを自動で typedef しないことを理解しているか。
Cで書くとはCコンパイラでコンパイルできるということで、C++コンパイラでしかコンパイルできないならそれはC++のコードである。
(実質的に) typedef することはキーワード struct を省略することである。それ以上でもそれ以下でもない。
ちなみに構造体タグとtypedefは別の名前空間だから typedef struct hoge{ }hoge; とかできる
961 :
デフォルトの名無しさん :2008/09/15(月) 00:21:25
俺はえなむって読んでいる
>>956 > Cの構造体(共用体も)の宣言はC++とは異なり、構造体タグを自動で
> typedef しないことを理解しているか
いいえ。C++ではtypedefしているのですか?
> Cで書くとはCコンパイラでコンパイルできるということで、C++
> コンパイラでしかコンパイルできないならそれはC++のコードである。
> (実質的に) typedef することはキーワード struct を省略する
> ことである。それ以上でもそれ以下でもない。
つまりメリットはそこにしかないということですね。
964 :
デフォルトの名無しさん :2008/09/15(月) 00:23:27
ちゃー すきゃんふ
自分だけのソースコードなら好きにすればいい。 他人に読み書きさせるソースコードなら。 このソースは一部C++の機能を使っているので、 C++でコンパイルしてくれと但し書きをしなければならない。
C言語で核ミサイルが作りたいんですけど、どうすればいいですか?
書くミサイルなら
>>966 核
↓
core
できそこないのプログラムなら得意だろ
C言語の基礎をようやく覚えた者です。 Cのソースコード集みたいな本は売ってませんでしょうか? どの方向に使っていくかも決まっていないので いろんなジャンルのソースがみたいです。 サイト上のページでもいいのですが 本は落ち着いて勉強できますので。
標準関数のソースとかは?
俺がアニメ見てる間にこのスレ盛り上がってたんだな orz 少し参加したかった
975 :
デフォルトの名無しさん :2008/09/15(月) 03:23:51
右手にプログラムを 左手にあなたの髪を
num と value って何か違いますか? どっち使いますか
>>977 翻訳の間違いでしたか
ありがとうございます
くそぅバッファリミット祭りに乗り遅れたぜ
次スレ立ててくる
関数の宣言を書くときに一緒にコメント書くの? それとも定義のところで書くから宣言時はいらない?
上司に訊いてください
>>985 は一般的にはどうするのかということです。
コメントの保守できるの?
>>985 一般的にどうするなんてものはない。
コメントの書き方の一流派でいいならDoxygenでも参考にしとけ。
>>987 まさに
>>986 だよ
仕事でやるならコーディング規則だとかコメント規則(笑
とかあるよ。
ころころこれが変わる職場に行ったことがあって、
うっかり修正漏れ(影響ないんだけど)があって
システムが原因不明のトラブルの際に
怒鳴られたことさえあったよwww
小学生の怪我自慢じゃないんだから、そんなこと言わなくていいです。
小物ライブラリならヘッダのコメントとして使い方を書いちゃうのもありだし ちゃんとしたリファレンスを用意するならヘッダには何も書かずにただcopyright表記だけ書いておけばいい。
ライブラリを配布するだけならヘッダに使用に支障の無い程度の情報を書く。 定義ファイルへはメンテする人のためのコメントを書く。 あとは自動ドキュメント作成ツールやらコーディング規則と相談。
スタイルにおいて常に、かつ最も重要なことは、「なぜそう書くのか」を即答しうるかどうかである。 明確な、君がそうするべきと信ずる十分な理由があるなら、そうすることをためらう必要はない。 けして唯一絶対の理由である必要はない。スタイルに唯一絶対の正解は存在しないからである。 しかし特に理由がないのなら、皆がやっているものに合わせるべきである。
インデントや括弧付けについては整形ツールを通すことで簡単に統一できるが、 命名規則は気をつけないと 動詞+名詞 と 名詞+動詞 が入り混じってしまう vectorSetValue vectorValueSet setVectorValue setValueVector // これは無いが…
任意の型をmemset以外で再度0初期化する方法ってある? val = (type)0; ではだめかな
997 :
デフォルトの名無しさん :2008/09/16(火) 22:21:37
>>996 static const someStruct zeroSome = {0};
を用意しておいて、適宜
someStruct foo = zeroSome;
のように代入する。
999げと
ume
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。