1 :
土曜の朝も名無しさん :
03/05/24 06:25
2 :
デフォルトの名無しさん :03/05/24 06:26
3 :
デフォルトの名無しさん :03/05/24 06:26
4 :
1日で何も見ずにここまで書けるようになったんだけど凄い? :03/05/24 07:13
#include <stdio.h> main() { int x; printf("あなたは2チャンネラーですか?yesなら1を、Noなら2を、"); scanf("%d",&x); switch(x){ case 1: printf("あなたは2チャンネラーなんですね。"); break; case 2: printf("あなたは2ちゃんねらーではないのですね。"); }} #include <stdio.h> main() { int sn; printf("弊社製品をお買い上げありがとうございます。CDケースの裏に記載されたシリアルナンバーをご入力ください。"); scanf("%d",&sn); if(sn==93410507){ printf("登録完了!"); } if(sn!=93410507){ printf("通報しました。") } }
>>4 >yesなら1を、Noなら2を Yes,Noか yes,noの組み合わせなら凄い(ってプログラミングに関係無いじゃんw) return 0;が書かれていないのでだめ。 >}} 重ねるのはどうかな? >printf("弊社製品をお買い上げありがとうございます。CDケースの裏に記載されたシリアルナンバーをご入力ください。"); 途中に'\n'が入っていないので減点。
>printf("通報しました。") 文末のセミコロン抜けてるじゃん
シリアルナンバーって通し番号でしょ?たったひとつでシリアルナンバーというのかな・・・
そこの部署に送られて来るものは一種類しかないと言う事でいいんじゃない? ってちがうな。固有記号だもんな、変と言えヴァへんw
if(sn==93410507){ printf("登録完了!\n"); } else { printf("通報しました。\n"); }
製品一個梱包するために、そこを書き換えてコンパイルしなおすんだよ。
分割コンパイルの真価が発揮されるね!
つーかソースファイルはひとつだ。。。
16 :
デフォルトの名無しさん :03/05/24 15:55
あのー今日Cの入門書買ってきたんですけど、いきなりコンパイルするところで 躓いちゃったんです。 コンパイルしようとすると KKUFUNCが組み込まれました。 準備ができていません。 って表示されるんですけど、これは何ですか? 入門書にはこういう場合のことは書いてなかったんでもうどうしたらいいか
>>16 無視してもかまわんぞ。あ、でも操作できないのかな? よくわかんないや。
そのメッセージが出るってことはDOSのコードを走らせたっぽいな。LSI-C86か?
だからLSI-C86は使うなとあれほど・・・
19 :
デフォルトの名無しさん :03/05/24 16:47
下のプログラムはcos(x)をマクローリン展開で求めるものですがこれのsinバージョンを教えて下さい double cosine(double x){ inti,n=10; /*nは項数*/ double ans=-1.0,term=1.0,mx=-x*x; for(i=1;i<n;i++){ term*=mx2/(2*i*(2*i-1)); ans+=term; } return(ans); }
Auron : We called it Sin...
>>19 ans = x, term = x
term *= mx / ((2 * i + 1) * 2 * i);
これでいいのかな
23 :
デフォルトの名無しさん :03/05/24 17:08
Microsoft .NET Framework 1.0 SDK こういったフリーのコンパイラって使いやすいですか? 使ってる人、使ったことのあるひとの感想お待ちしてます。
27 :
デフォルトの名無しさん :03/05/24 17:20
Cゲンゴ入門〜発展(C++?)までお世話になれる製品ありますか? 何がお勧めですか?
LSI-Cの"試食版"はint型が16bitらしいからやめた方がいいよ。
>>26 そのページは見てませんでした。ありがとうございます。
でも、今度はそのページに書かれている設定の仕方がわかりません。。。
>>30 それが判らないならLSI-C86を使うのはやめておけ。
今時intが16ビットじゃ話にならん。
おまけに、ちょっと大きなプログラムやちょっと多めのメモリ空間を
扱おうとすると途端に32KBの壁にぶつかる。
>>32 細かいことだけど訂正。
LSI-C86の試食版はsmall modelしか作れないので、
コードとデータともに64kまで。
# 無論farポインタ使いまくればその制限を突破できるけど、
# ライブラリなんかを自分で作らねばならない。
次の制限は8086で扱えるメモリの壁が!とか? EMSひっぱりだすか・・・
まあ hello world 作るなら問題ないけどね。
>>31 どうもありがとうございます。それをインストールしました。
でも、入門書はLSI-C86を使って解説してあるみたいなんですが、LSI-C86と同じようにして大丈夫なんでしょうか?
>>36 その入門書がMS-DOSに依存しまくった変な解説してなきゃ大丈夫。
つっても入門者がそれを見極めることは不可能なんだよな…
38 :
デフォルトの名無しさん :03/05/24 18:30
>>36 使う関数も、<dos.h>に依存した_dos_XXX()やint86()ばかりじゃ
C言語の勉強というよりもMS-DOSの勉強になるから注意だ。
先に答えておくと、 graphic.hというのは 入ってないからね。
あのー、Borland C++ Compiler 5.5ってC++のコンパイラですよね? Cで書かれたソースもコンパイルできるんですか? とりあえず入門書に書いてあったとおりにソースを書いてみたんで、それをコンパイルしたいんですが LSI C-86とBorland C++ Compiler 5.5じゃコンパイルする時に打つ文も(Lccとか?)違うんですかね? とりあえず、書いたソースをコンパイルさえできれば先に進むことができるんですが。。。
doskey lcc=bcc32 -nologo $*
>>41 コンパイルできました。お付き合いありがとうございました。
#include<stdio.h> void func(char* p){ p++; printf("%c",*p); } int main(void){ char* str = "hello world"; printf("%c",*str); str++; printf("%c",*str); func(str); printf("%c",*str); return 0; } よろしくお願いします、funcに文字列の先頭アドレスを渡して 一文字表示すると、「l」と表示されます、ですがメインに帰ってきて また表示してみると「e」に戻ってしまいます、向こうでインクリメント しても、mainでは反映されないのでしょうか?funcでインクリメントが 反映されるようにするにはどうすればいいのでしょうか?
>>44 main() の str と func() の str は別もんだよ。
func() 呼び出し時に、main() の str の値が func() の str へコピーされるだけ。
fcun() でどんな風に変えようと main() の str に関係ない。
反映させるには、main() の str のポインタ渡して、 func() 側でそのポインタの示す先 (= main() の str) を変更する。
もしくは、str をグローバルにする。(非推奨)
ちなみに、VB では呼び出され側で ByVal と ByRef キーワードを使ってコピー渡し (値渡し) とポインタ渡し (アドレス渡し) を決められる。
C には、そんなおしゃれな機能はないから、全部自分でやる。
func()でインクリメントしているのはstrじゃなくて、 strの値を渡されたパラメータ(仮引き数)。 strの値をインクリメントしたいなら、 strの場所(strを指すポインタ)を渡し、その中身をインクリメントする必要がある。
ごめん間違えた。 誤: func の str 正: func の p に訂正。
48 :
デフォルトの名無しさん :03/05/24 22:42
みなさん、Cを学んでいらっしゃるようですが、 Cってどんな言語なんですか? メモ帳とか、アプリ作れるんですか?ただ、あの黒い Dos画面に何か表示させるだけなんですか? 教えてください
49 :
デフォルトの名無しさん :03/05/24 22:51
Dosアプリが作れる!
>>48 UnixやWindowsといったOSをつくれる。
そもそも Unix のために生まれた言語。
52 :
デフォルトの名無しさん :03/05/24 23:04
ファイルから入力するときに、 fgets使うと改行が入ってきちゃって、 fprintで表示しても美しくできません・・・・。 なぜですか???助けて
53 :
デフォルトの名無しさん :03/05/24 23:05
きれいなコードの定義って何ですか?
#pragmaの存在って?
>>45 >>46 色々調べてみて、ポインタのポインタ(?)でやってみた所
うまくいきました。親切にありがとうございました!
これでいいのか不安ですが^^;
57 :
デフォルトの名無しさん :03/05/25 00:46
>>44 >>45 も
>>46 もそう言ってるが。<ポインタのポインタ
恥ずかしいからダブルポインタなんて言うのだけはやめてくれよな。
>>52 自力で改行コードを取り除きましょう。
char *removeLastNewLineChar(char *str)
{
if (str) {
size_t len = strlen(str);
if (len) {
if (str[len - 1] == '\n') {
str[len - 1] = '\0';
}
}
}
return str;
}
>>58 関数名長げーよー。
chomp でいーだろー。
関数も長げー char *p = strchr(str, '\n'); if (p) *p = '\0';
>>60 それは動作が違うだろう。
"Hello\nWorld\n" を渡したら "Hello" になるぞ。
63 :
デフォルトの名無しさん :03/05/25 03:36
>>58 ダブルポインタって言うよね・・・?
言わないの!?
void chomp(char *s) { for (; *s && *s != '\n'; s++); *s = '\0'; }
>>61 確かにもとの関数と同値ではないが、
fgetsの末尾の\nを取り除くのには60ので十分じゃないかな。
>>65 そういう仕様なのを忘れた(知らない)まま他のところで使ってしまって
痛い目をみないための工夫が必要だな。
関数名を remFirstRet にするとか。
getsを使えばいいじゃん
つーかファイルからか。getsじゃどちらにしろだめだ(恥)
gets 使う香具師は馘。
char *p = strrchr(str, '\n'); if (p) *p = '\0';
"Good-by\n2ch"が"Good-by"になってしまうぞ。
char *p = strrchr(str, '\n'); if (p && !p[1]) *p = '\0';
char *p = str + strlen(str) - 1; if (*p == '\n') *p = '\0';
で、エラーチェックっていうか、使用ミス対策をすると
元の
>>58 になる罠。
if(!*str) return;
76 :
デフォルトの名無しさん :03/05/25 09:48
処理を1秒おきにしたいときって どういう風に書けばいいんですか?
if (str && *str && *(str += strlen(str)-1) == '\n') *str = '\0';
#include <stdio.h> main() { int a,b,c; a = 50,b = 30,c =20; a =a + b; printf("\d",a + c); }
>>58 はぁ ? 誰が「ポインタのポインタ」なんて言ってんだよ。
ダブルポインタ知ってますっていう知ったか厨房君か ?
>>77 >>58 を一行にまとめただけやん。
まあ、fget() なら、改行コードは高々1つだし、改行コードがあるときは文字列の最後なんだし、バッファは自分が確保してるなら NULL かのチェックもサボれるだろうから
>>60 で十分だよ。
80 :
デフォルトの名無しさん :03/05/25 10:15
>まあ、fget() ・・・(一行が長すぎ。改行くらい入れろよ)・・・・
>>60 で十分だよ。
あたりまえすぎることをえらそうに。
そういえば、読み直して思いだした。
>>45 を最初読んだとき、なんか違和感があった。
このスレの場合、「VBでは」じゃなく「C++では」という人の方が多いから。
83 :
デフォルトの名無しさん :03/05/25 10:25
85 :
デフォルトの名無しさん :03/05/25 11:19
#include <stdio.h> int main() { int x; for(x=2;x<11;x++) { printf("繰り返し9回\n"); } }
なんか馬鹿が増えたなぁ。
87 :
デフォルトの名無しさん :03/05/25 11:37
#include <stdio.h> main() { int a,b,c,d; a=20,b=30; printf("a=%d\tb=%d\n",a,b); c=a+b,d=a-b; printf("和は%d\t差は%d\n",c,d); }
次のようなプログラムがあるのですが、2回目の test() の呼び出しの時には、 i は 50 で初期化されないのですか? というか、 static はそもそもそういうものなのですか? int main(void) { test(); test(); return 0; } void test(void) { static int i = 50; i += 10; printf("i = %d\n", i); }
>>81 当たり前って言うか
>>65 で既出。
でも、
>>71 とかアフォなこと言う奴いるから書いただけ。
偉そうな発言に見えた ?
なんかコンプレックスでもあるのか ?
>>82 C++ 知ってる奴なら、
>>44 みたいな質問は普通しないだろ。
まあ、
>>44 は VB 知ってるという保証はないけど、可能性としては一番高そうに思ったから。
そういうもの
>>88 だってstaticつけたり関数外で定義したものは一度しか生成されないもん。
なら当然初期化は一度だけ。
つーか呼ぶたびに初期化されてしまったらstaticの意味がなくなっちまう。
調べる対象がはっきりしてるのに、 なんで本やウェブで調べようとしないのかがわからん。
94 :
デフォルトの名無しさん :03/05/25 12:13
#include <stdio.h> main() [ int tensu; tensu=96; if(tensu>=80){ printf("%d点です。80点以上なので合格",tensu); } ] 検索してここがでてきたのですが、このコードの悪いところって何ですか? コンパイルしたらintが間違っていると表示が出ます。 お願いします。教えてください
>>94 [を{に、]を}に書き換える。 とマジレスしてみる。
なんで[]で関数本体をくくるのかわからん。
かぶった。鬱。
98 :
デフォルトの名無しさん :03/05/25 12:47
Cでテトリス作りたいんですけど何か特別な環境じゃないと できないとかありますか? コンパイラはボーランドのフリーのやつです。
99 :
デフォルトの名無しさん :03/05/25 12:51
がんばってリソースを定義してウィンドウ作って、 APIとかで描画すれば、何の問題もありません。
100 :
デフォルトの名無しさん :03/05/25 12:59
CでWinアプリ作るのと、Dos画面にコード打って作るのって 基本は一緒なんですか?自分はCを勉強してるんですが、自分は 何を作りたいのか、何を作るためにCを学んでるのかが分からなくなりました。 お騒がせしてすみまそん
>>99 分かりました。やってみます。
本来「推薦図書・必読書スレ」に行くべきなのですが、ここで
質問させてください。
お勧めのAPI入門書は無いでしょうか?
プログラミングWindows第5版〈上〉Win32 APIを扱う開発者のための決定版! Microsoft Programming Series
と長いタイトルの本がありましたが、どうでしょうか?
103 :
デフォルトの名無しさん :03/05/25 13:27
>>101 了解です。とても分かりやすいサイトですね。
もっと勉強します。
ありがとうございました。
104 :
デフォルトの名無しさん :03/05/25 14:31
#include <stdio.h> int main() { int x; for(x=0;x=1;x++){ printf("繰り返し\n"); } } なんでこれは無限に繰り返されるのでしょうか? x=1のとき 処理=printf("繰り返し\n"); をするんですよね? 変数の更新は処理が1度行われるごとに実行されるんですよね? なら、 初期x=0のとき→x=1ではないのでなにもしない なにもしない処理を行った(こんなのありですか?)ので、変数の更新が実行され、 xに1が足され、x=1になるのでprintfが実行される。 printfが実行されたので、変数の更新が実行され、 xに1が足され、x=2になるので、x=1の条件に当てはまらないので、 printfは実行されない。 よって「繰り返し」は1個だけ表示されるはずだと思いました。 というか処理条件が=のときだけ矛盾しまくります。 例えばfor(x=0;x=0;x++)でやってみると、何も起こりません。 0以外にすると、無限に繰り返されます。 >や>=のときは考えたとおりの結果になるんですが・・・ もしかして処理条件に=(のみ)を使ってはいけないんでしょうか?
==
>>104 x = 1 の実行結果が常に 1 (=真) だから。
int a;
int b = -1;
a = (b = 1);
で、a も b も 1 になるのは知ってるか ?
>>104 とりあえず入門書の一冊でも読んでから質問すれや。
108 :
デフォルトの名無しさん :03/05/25 15:10
109 :
デフォルトの名無しさん :03/05/25 15:20
汎用を凡用などと書いてしまうサイトなど、参考にすることは出来ません。
111 :
デフォルトの名無しさん :03/05/25 15:29
ま、マジで助けてください。 ボーランドのfreecommandlinetools2.exeをDLしたんですが、 後の作業が分かりません。せっかく本かってきたら、「read.meを 読んでください」だってさ。読んで分からないから本買ったのに。 どなたか教えてください。お願いします
>>111 インストールすれば説明書もインストールされるからそれを読めばよい。
包装してあったんです。 すみません。
つーか読んだのか・・・・ その通りのことをするだけだよ。ファイルをふたつつくる。
作るには作りました。 ここから・・・何を?
( ̄o ̄;)
( ´∀`){お願い はぁと
<インストールしたディレクトリ>\binをPATHに追加する・・・
やること全部書いて。おねがーい。
>>119 もう、それも終わったよ〜い。
次だよ、次〜
>>109 ありがとうございます。参考にさせていただきます。
123 :
デフォルトの名無しさん :03/05/25 16:15
>次だよ、次〜 「次」は無い
何を起動させればいいの〜? わほーい
わほーい(^O^*)
126 :
111(本物) ◆pTcVZxjbV2 :03/05/25 16:37
なんか知らない間に偽物がイパーイ・・。 マジです。本当にどれを起動させるか分からないんです。 お願いします。
プログラムソースの先頭にそのプログラムの説明を入れたい場合はどうすればいいのですか? 例えば「プリント文の構成プログラム」というのを#include<stadio.h>の上の段に入れてコンパイルしたら エラーになってしまうのですが。 このように実際プログラムを走らせた時には表示されないがソースを見た時一目で何のプログラムか 分かるように説明を付けたいのですが教えてください 初心者的質問ですみませんどなたかよろしくお願いします
なんで「挿入ソート」をコメントにしないんだろう・・・
130 :
111(本物) ◆pTcVZxjbV2 :03/05/25 17:08
/*................*/
131 :
デフォルトの名無しさん :03/05/25 17:55
印刷させる処理ってどうかいたらよいですか?
>>131 OS依存・環境依存の部分が多くあるので、ここで扱うべきではないのですが・・・
>>128 ~130
どうもありがとうございます
こういう書き方すればいいのですね
最近C勉強し始めたばっかでまったく知りませんでした^^;
struct unko{ メンバが5個くらい。 }; void func1(const struct unko baba) { func2(unko.メンバ); } main() { struct unko baba; func1(baba); } というようなプログラムを書く人がいるのですが、 func1のconstは意味があるのでしょうか? メンバが5個くらいあるので、&babaをfunc1に渡した方がいいような気がするのですが(func1の宣言も変える)。 汚いプログラムですみません。
> func1のconstは意味があるのでしょうか? func1の定義内では意味がある。 呼び出し側では意味が無い。 ポインタ渡しに返るならconstは重要(Cでもいけたっけ?)。
>>135 ありがとうございます。
もうひとつ聞きたいのですが、
void func1(const struct unko *baba)
main(){
func1(&baba);
}
私はこのようにしたほうがすきなのですが、
これに比べ
>>134 の利点は何かありますでしょうか?
>>136 func1内でのbabaメンバへのアクセスが速くなる。
パラメータのコピーに比べてメンバアクセスの速度が支配的なときは有利になるかもしれん。
>128が何であぼ〜んされてるんだろうと思ったらmiyaか
#include<stdio.h> char* func(char* p){ p++; printf("%c(from func)",*p); return p; } int main(void){ char* str = "hello world"; str=func(str); printf("%c(from main)",*str); return 0; } funcの引数にする
>>137 ありがとうございます。
勉強になりました。
>>138 あ、ついでに... これにmallocを組み合わせるとメモリリークの可能性があるので注意(笑)
最初に確保したポインタの他に走査用ポインタを用意したほうが良い。
そうしないとmallocで確保したメモリの位置がわからなくなる(んじゃなかったっけ?)
>>142 ダブルポインタ**かい?そんなものつかったら、初心者にゃきつくないかい?
>>144 ドッペルって言いたかっただけですので気にしないで下さい。
だからなんでダブルポインタなんて奇妙な言葉を作るのさ。 そんなことだから面接で「ダブルポインタなら任せてください。 トリプルポインタは苦手ですが。」なんて言う阿呆が出てくるじゃないか。 ポインタにダブルも減ったくれもあるかい。
わりい、「変数のポインタに関するポインタ」にしとくよ。
double pointerはたまに使われるから、それをそのままカナにしてしまったんだろうて
>>146 アホを判別できていいじゃないすか。
ところでポインタのポインタのポインタってながいよね。
で、その「変数のポインタに関するポインタ」を使った
>>44 の正解教えてください。
>>150 ヴァリアブルのポインタに関するポインタ**かい?そんなものつかったら、初心者にゃきつくないかい?
関するって変な感じ ポインタのポインタでいいじゃん
>>150 きつくてもいいので教えてください。お願いします。
のアドレス へのポインタ
#include<stdio.h> void func1(char** p){ (*p)++; printf("(from func1) - %s\n", *p); } void func2(char* p){ p++; printf("(from func2) - %s\n", p); } int main(void){ char* str = "hello world"; func2(str); printf("(from main ) - %s\n",str); func1(&str); printf("(from main ) - %s\n",str); return 0; }
どうもダブルポインタときくと(double *)を連想してしまって困る。 というか、普通(double *)じゃないの? (char **)とかじゃねえだろ。
>>155 ありがとうございます。やっと理解できました。
#include<stdio.h>
void func(char** p){
(*p)++;
printf("%c",**p);
}
int main(void){
char* str = "hello world";
printf("%c",*str);
str++;
printf("%c",*str);
func(&str);
printf("%c",*str);
return 0;
}
ってことですよね。
func(char** p)とfunc(&str);まではいけたのですが、
printf("%c",**p)の **p に気が付かなかった。
英語だと、こうみたいな雰囲気。 pointer to int pointer to double pointer to pointer こっちのほうがずっといいなぁ...
159 :
デフォルトの名無しさん :03/05/25 21:20
自分はC machine Version 2.00というコンパイラを使っているのですが、 皆さんはどんなコンパイラ使ってますか?自分の使っているコンパイラが どんなものなのかがよく分かりません。これから、徐々にスキルが上がっても 使用できるものなのか。 オススメがあったら紹介してください。
すれ違い
Cのコンパイラの話もダメなんすか
>>161 ダメじゃあないけど、C machineとかいうのはC処理系と似ているようで、
全く違うよくわからんものというコンセンサスがこのスレにはある。
「挙動が変なんだけど」って質問がきたときに、
「それC machine使ってるだろ」って突っ込みに大抵yesだもんで。
まあこのスレ的にはスレ違いと言っといていいんじゃないかな。
とにかくそれはC処理系じゃない。
はい。すみません。 スレちがいみたいでしたね。
while文で「enterを入力したら終了」、ていう風にするにはどうすればいいんでしょうか?
while(!enter)
while(enter != '\n')
167 :
◆2bmoujqRHk :03/05/25 23:18
このスレの上のほうで出てますがBorland C++ Compiler 5.5.1ってのは Cのコンパイルできるんですか? 一般に売ってるCの本で習得した技術だけで使えるモンなのですか?
>>167 使えるよ。
インストールのやり方とかコンパイルのしかたは、検索して調べれば、
すぐわかるよ。
169 :
デフォルトの名無しさん :03/05/25 23:26
170 :
◆2bmoujqRHk :03/05/25 23:30
>>168 レスありがとうございます。
ちょうどいま、高橋麻奈さんの本読んで勉強してるんですよ。
>>164 while(!strcmp(str,"enter")){ ... }
173 :
デフォルトの名無しさん :03/05/26 07:11
C言語のCって何の略? 普通にComputerのCでいいの?
Bの次のC。よってC自体に意味はない。
,,v‐v-/l_ (⌒) _「/ ̄ く / lYノノ/_ノl_ヽ)) <イ( l l )l> / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ <|)'|l、"(フノ|l < えっちなのはいけないと思います! ,(ヨリ<>o<>リ'] \______________ |ト‐!]-ム- i']l ヽ_ノv__l/ / . ノ[//‐─‐/_/、 ( /E|, (フlヨ \ ,-| El___lヨ / └-\`^^^^^^´/  ̄ ̄ ̄
>>175 'H'ではなく、'C'だっつーとんじゃい
177 :
デフォルトの名無しさん :03/05/26 07:58
超ナンジャタウンって感じー
,,v‐v-/l_ (⌒)プンプン _「/ ̄ く / lYノノ/_ノl_ヽ)) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ <イ( l l )l> < Cはいけてないと思います! <|)'|l、"(フノ|l \____________ ,(ヨリ<>o<>リ、 |ト‐!、。 ) 。).| ヽ_ノv l | . ノ[// , ./_/ ( /~'、--‐ソ_) ,-i ヽ/'´ヽ └-\. \ ) ヽ、__,ノ`
180 :
デフォルトの名無しさん :03/05/26 14:58
ディスプレイに表示するにはどうしたらいいんですか。
>>171 だから 0 と比較しないと分かりにくくなるだろうと...。
ディスプレイの定義から始めようか
はぁ?
ひぃ?
#include <stdio.h> int main(void){ int a; for(;;){ scanf("%d", &a); if (a == 0) return 0; } return 0; } これを実行した時に数字じゃなくて文字を入力すると暴走するのは何で? mainの引数がvoidだとかいう突っ込みは無しで…
>>186 >scanf("%d", &a);
int の領域に文字列を入力するんだから当然だろ。
scanf()は数字以外の入力を無視するから。
scanf("%s", s);やれってこったな。
いや、ここは素直にfgets()とsscanf()のコンビで。
typedef struct{ struct chinko; struct manko; unsigned char hoge; //hogeは可変長 }tbl; static tbl piyo; static tbl mona; こういった状況でpiyoのhogeを monaのhogeにコピーしたいのですが どのようにするのが確実で安全なのでしょうか? 構造体同士は mona.chinko = piyo.chinko; で、できるのですが unsigned char同士だとどうもできません。 ご教授お願い致します。
>>186 scanf()はバッファをフラッシュしないから。
「fflush( stdin );」をループの終わりに入れれ。
普通に mona.hoge = piyo.hoge; でできると思うが。できないと言うのはどう言うことか具体的にどうぞ。
>>193 数字が来るまでバッファをフラッシュしつづけるのか?
おめでたいな。
> unsigned char hoge; //hogeは可変長 ここがキモなのかな。これで可変長というのは信じられないから、 実際は unsigned char hoge[0];というところなんではないか?
>>195 >>193 だと、数字が来てもだろ?
とりあえず、scanf()の戻り値を判定して、
エラーの時にフラッシュする、ってところか。
>>196 さらに、可変長なのに有効データ長もないしな。
>>198 NUL-terminatedなら必要ない。
まぁ、あきらかにコンパイルも通らないコードを示されても話にならんってこった。
みなさんありがとうございます。 mona.hoge = piyo.hoge; これでできるのですか・・・ すみません知りませんでした。。。 ウツだ(ry 有効データ長さは4Kくらいっす。。。 ついでに質問なんですが typedef struct{ struct chinko; struct manko; unsigned char hoge; //hogeは可変長 }tbl; static tbl piyo; static tbl mona; typedefっつーのは上記のような使用方法で いいんですよね? 型が同じ構造体を2つ記述する必要ないから 便利!みたいな?
>>201 > 型が同じ構造体を2つ記述する必要ないから
便利というより、それはしちゃいけない。
Cでは実際の構造が一緒でも、別個に定義されていれば別々の構造体になる。
COBOLなどのように構造が一緒なら同じものと見なされるということはない。
なんか話しがまとまってないね。
>>186 #include <stdio.h>
int main(void){
int a;
char s[1024]; /* これは適当 */
for(;;){
if (scanf("%d", &a)) {
if (a == 0)
return 0;
} else if (scanf("%s", s)) { // バッファをクリアな意味合い※1
continue;
}
}
return 0;
}
// こういうコーディングが良いとか悪いとかは無しで…
> これを実行した時に数字じゃなくて文字を入力すると暴走するのは何で?
※1
>>201 > mona.hoge = piyo.hoge;
> これでできるのですか・・・
可変長ならできないって...。
void tbl_copy_hoge(tbl* dst, const tbl* src);
という関数を自分で作って、それを使ってコピーすれ。
コピーの方法は、俺らには hoge をどういう仕様にしてるのか分からんので、
自分でやってちょ。
便利なHTML生成プログラムをCで作れますか?
>>202 サソ
ということは、構造体同士をコピーする際には
構造体を2つ用意する必要があるのでしょうか?
>>203 もしかして、数字が入力されたらscanf("%d", &a)して
文字が入力されたらscanf("%s", s)されるコードを書いたつもり?
>>201 あと、typedef の使い方はあってるけど、仕様目的が違う。
typedef 書かないと
static struct tbl piyo;
とかなるのを
static tbl piyo;
と書けるというのと、
tbl が構造体だということを知らなくて良いという効能がある。
もっとも、後者については tbl.chinko とか直接使う場合には
関係ないんだけどね。
あと、構造体というものがまだよく分かってないように見える。
tbl a; と int b; とを見比べて、
tbl とは何か、a とは何かを小一時間考えるべし。
猫でコピーした丁半ゲームのソースコードをメモ張にペーストして 拡張子.cで保存し、コマンドプロンプトで開くと 「内部コマンドまたは外部コマンド、操作可能なプログラムまたは バッチファイルとして認識されていません」と表示されます。 なぜですか?
>203 実際のところこれが一番OK?
>213 問題はscanfで取得しなかった文字入力をどうやってフラッシュするか…?
そもそもscanfを使うなよという心境の人が多いだろうな
>>215 そそ、
取得しなかった文字を捨てる(Flush)のではなくて、
ちゃんと取得した上で取捨選択するべきだね。
>>216 > > これを実行した時に数字じゃなくて文字を入力すると暴走するのは何で?
> scanf()は数字以外の入力を無視するから。
質問と回答がまったくもってかみ合っていません。
>>214 フラッシュの方法は、scanf("%s", s)しか思いつきません。
他になにかあったら教えて。
>217 ラジャァ。 こんな感じで? #include <stdio.h> char buf[256]; int main(void){ int a; for(;;){ fgets(buf, 256, stdin);/*エラー処理は省略*/ sscanf(buf, "%d", &a); if (a == 0) return 0; } return 0; }
#include <stdio.h> int main() { int a; char buf[256]; while (fgets(buf, sizeof buf, stdin) && (sscanf(buf, "%d", &a) != 1 || a != 0)); return 0; }
>220 very thanks!
char wk; short val; とありまして wk に valを代入したいのですが wk = val;では代入できないものなのでしょうか? 厨房ですみませんがよろしくお願いします。
>>222 できないのわかってて聞いてるんでしょ。
>>222 処理系によっては警告が出たり、charの範囲を越える値は元に戻せなかったり
するが、代入自体はできるだろ。
どういう意味でできないと言っているのかしらないけど、文法上ならなんの問題もない。 警告は出るかもしれないけど。
スミマセンソ・・・ 別に釣りしてるわけじゃないんす。。。 こういう場合はmemcpy()でやるもんなんでしょうか?
>220たん>221とは言ったものの一応自分流に書き直して書いときます。 #include <stdio.h> int main(void){ int a; char buf[256]; while( fgets(buf, sizeof(buf), stdin) != EOF && sscanf(buf, "%d", &a) != EOF ){ if (a == 0) return 0; } return 0; }
229 :
デフォルトの名無しさん :03/05/26 19:51
>>228 fgets()はNULLと比較するべき。
sscanf()は変換できた個数を返すので、0と比較するか1と比較するか。
>>231 サソ
ってことはぁ??
memcpy()もダメで、代入も不確か!?
じゃあどのようにすればよろしいのでしょうかぁ〜。。。
>>227 つーか、何をやりたいのか書かないと誰も妥当な解答ができないってば。
memcpy()が駄目なんて誰も言ってないし(やめた方がいいけど)、
>>225 は一般論。
charにintを代入したいとかいうやつに限って、実は charな値ではなく、文字列がほしいという罠
>>235 ソソ
スイマセンデスタ
デスティネーション側のunsigned char hoge;の
先頭2バイトにshort piyo;の内容を
写したいのです。
charとshortじゃ型が違うので
キレイに収まるのかが心配です。
それで皆様にお伺いをたてている次第であります。
警告を黙らせたいのだったら wk = (char)val; だが、このようなコードを書かないようにするのが正道。
>>237 そのような話題はこのスレの範疇ではないのだが…
規格外の話なんでな。先頭2バイトってことなら、
memcpy(&hoge, &piyo, 2);
なんだが、なぜそのようなことをやりたいのか…
CPUや処理系によってはやりたいこととかけ離れたコードである
可能性があることは考えておかんと。
ていうか、hogeの型はunsigned charじゃないか。 そこに2バイトもコピーしたら領域を破壊するぞ。
>230>232>233 寝ぼけてました。逝ってきます。
みなさんありがとうございます。 このunsigned char hogeは ほかの関数から貰う 可変長のデータの先頭アドレスでして。。。 それの先頭2バイトにshort piyoをコピーしたいのです。
破壊っすか!???
ってことは・・・
>>243 に書いたように
渡されるデータ長さは
最大4Kを超えるんですが
unsigned charで受けるのは
間違いっすか!?????
なんだ、さっきの構造体を拡張したやつか。 そんなイリーガルなプログラムを 捨 て て し ま え。
(´Д` )ウワァァン
>>243 なら、
unsigned char* hoge だろ
それなら、
memcpy(hoge, &piyo, sizeof piyo);
>>247 サソ
(´Д` )ウワァァンアリガd!!!!
ヤッテミマスー!
そもそも無闇に可変長構造体を使うのはどうなんだろう。 ポインタをメンバに作って malloc するんではなく、 可変長構造体にする理由っていうと、 その構造体をそのままファイルに読み書きしたいとか、 そういう特殊な事情がある場合だけっしょ? 本当にその手の事情はあるの?
>>249 ファイルに読み書きする場合でも、必ずしも必要ない。
つーか、可変長構造体なんて危なっかしい実装するよりも
手堅く書いた方がメンテナンス性は上がる。
ということで、227にはデータ構造を見直すことを強く勧める。
或いは、そう言うデータが必要かどうか、プログラムの設計を見なおしてもいいね。
>>249 サソ
ファイルに書きこむとか言う事情はないです。。。
>ポインタをメンバに作って malloc するんではなく
・・・なんかより良い方法があるのでしょうか??
252 :
動画直リン :03/05/26 21:13
なんだか
>>247 は日本語の勉強も必要な気がした。
>251 ポインタと malloc 知らずに どうやって可変長構造体を確保してるの? と思ったが、そういや static tbl piyo; とか書いてたな。 これじゃダメ。 ポインタ、malloc、可変長構造体の何たるかをよーく勉強しよう。
255 :
デフォルトの名無しさん :03/05/26 21:29
Linuxでコンパイラはgccを使ってるんですが、 IPアドレスのようなドット区切りの数字を配列に入れる方法がわかりません。 カンマや/でなら入れられるんですが・・・
258 :
デフォルトの名無しさん :03/05/26 22:11
>>255 カンマやスラッシュ、ドットかの違いだけで何故できない?
ソース上の区切り文字を ',' や '/' から '.' に変えるだけだろう。
strtok()使えば簡単だ。
※参照
<string.h>
char* strtok( char*, const char* );
259 :
デフォルトの名無しさん :03/05/26 22:12
#include <stdio.h> #include <stdio.h> int main(int argc,char **argv) { int i,j; int x; unsigned ad[10]; unsigned ip1=0,mask1=0xffffffff; unsigned ip2=0,mask2=0xffffffff; unsigned char *a1=(char*)&ip1; unsigned char *m1=(char*)&mask1; unsigned char *a2=(char*)&ip2; unsigned char *m2=(char*)&mask2; scanf("%d,%d,%d,%d/%d",&a1[0],&a1[1],&a1[2],&a1[3],&a1[4]); printf("%d.%d.%d.%d/%d\n",a1[0],a1[1],a1[2],a1[3],a1[4]); for(i=0;i<=3;i++) ip1=(ip1<<8)+a1[i]; printf("%d.%d.%d.%d\t\t",a1[0],a1[1],a1[2],a1[3]; mask1<<=(32-a1[4]); ip1 &=mask1; } 構成中なのですが、IPアドレスを引数とし入力してネットワークアドレスを算出したいのですが ドット区切りでの配列への代入がわかりません。 なのでscanfで読み込んでしまっています。
261 :
デフォルトの名無しさん :03/05/26 22:23
C言語を始めようと思うんですけど、 いまはDOSで何か表示させたりってのができるようになりたいんですが、 Winアプリ作るのとどこの部分が違うんですか? ソースコードが丸ごと違うのでしょうか?それとも、コンパイラの違い? WinアプリをCで作るとき、ボタンのサイズとかを全部手動で指定できるのですか? それはフリーコンパイラでも可能でしょうか? 質問攻めですみません。一応、検索しました
>>260 確認事項
1.入力は32ビット整数値ですか??それとも10進文字列ですか?
2.出力は3文字表記できる4つの配列でいいんでか?
(例) 192.168.0.1 の場合、配列をstr[4][4]として
str[0]・・・"192"
str[1]・・・"168"
str[2]・・・"0"
str[3]・・・"1"
と格納されればよいのか?
>>262 1.32ビット整数値です。
2.配列を数字として格納できたらいいです。
お邪魔します、スレッドを荒らして申し訳ありません。
このレスはカキコしたとしても1スレに1回ですのでご許しください。
現在、
Linny開発プロジェクト
ttp://pc.2ch.net/test/read.cgi/linux/1053087824/ にて、第四世代(Winnyの次)となるファイル共有ソフトを開発しています。
Winnyとの最大の違いは一人の開発者が作るのではなく、
オープンソースプロジェクトとして複数の開発者が作るところです。
プロジェクトの発端となる最初の発言者(535氏)が全く使い物にならないため
神の出現を待っております。コーディングができなくても提案などして頂くだけでも結構です。
sourceforge.jpにより開発環境は揃ってますのでだれでも参加可能です。
ちなみに自分はDQNなので全くコードは書けません。
神の出現待っています。お邪魔しました。
ttp://sourceforge.jp/projects/linny/
>>264 間違えました…10進文字列です…
テンキーで実行時に./a.out 192.168.0.1
として実行してます。
出力は例の通りでできるといいです。
#define IPADDR_SIZE 4 typedef struct ___tag_ipaddr_t { /* IP アドレス */ unsigned char addr[IPADDR_SIZE]; unsigned char mask; } ipaddr_t; typedef enum ___tag_BOOL { /* 論理型 */ FALSE, TRUE } BOOL; /* buf は破壊されます */ BOOL str_to_ipaddr(char *buf, ipaddr_t *ip) { const char mask_sep[] = "/"; /* マスクとアドレスのセパレータ */ const char ip_sep[] = "."; /* IP アドレスの桁のセパレータ */ char *ipstr; const char *maskstr; const char *token; int i; /* xxx.xxx.xxx.xxx/yyy の分離 */ if(ipstr = strtok(buf, mask_sep), ipstr == NULL) return false; if(maskstr = strtok(NULL, ""), maskstr == NULL) return false; ip->mask = atoi(maskstr); /* aaa.bbb.ccc.ddd の分離 */ for(i = 0, token = strtok(ipstr, ip_sep); i < IPADDR_SIZE; ++i, token = strtok(NULL, ip_sep)) { if(token == NULL) return FALSE; ip->addr[i] = atoi(token); } return TRUE; }
Cmachineってコンパイラとbcpad231ってのどっちがいいと思いますか? Cmachineのほうが使いやすいんですが、なんかCの処理には向いてないとか・・・。 どっちがいいんですか?
>>266 // サンプルプログラム
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
const char sep[] = ".";
char addr[4][4];
// コマンドライン文字列からピリオドを区切り文字として切り出して
// addrへ格納する。
//
// サンプルプログラムなのでエラーチェック省略です。
// コマンドライン引数必須かつ文字数制限厳守!
strcpy( addr[0], strtok( argv[1], sep ) );
strcpy( addr[1], strtok( NULL, sep ) );
strcpy( addr[2], strtok( NULL, sep ) );
strcpy( addr[3], strtok( NULL, sep ) );
///////// 検証のためのデバッグプリント
int i;
for ( i = 0; i < 4; i++ )
printf( "addr[%d] = \"%s\"\n", i, addr[i] );
}
とりあえず机上だけで作成しました。ノーテストでスマソ。
271 :
bloom :03/05/26 23:13
環境依存だけど、inet_addr() はダメなの ?
273 :
デフォルトの名無しさん :03/05/26 23:18
#include <stdio.h> main() { int a; printf("テスト何点でしたか?\n"); scanf("%d",a); if(a==100){ printf("お疲れ様。"); } else{ printf("しっかりしろ!まだ頑張れる。"); } } 何がおかしいのか分からない罠。 正しく動作しないんだよな。これが
274 :
デフォルトの名無しさん :03/05/26 23:19
26才人妻です。ダンナがかまってくれないので、いつも一人でオナってます。
でも、けっこうオカズに困るんですよね。そんな時見つけたのがYUIS!!
安いし、安心して買えるしなかなかいいですよ!いつもバイブ物買ってます!
http://www.dvd-yuis.com/
276 :
デフォルトの名無しさん :03/05/26 23:23
>>267 >>269 ありがとうございました。
これから解読して理解してみます。
また分からない事があったらよろしくおねがいします・・・
>>186 mainの引数がvoidなのは別に突っ込まれるようなことじゃないぞ
戻り値がvoidならともかく
280 :
デフォルトの名無しさん :03/05/27 00:06
最近疑問に思ったんですが、質問してもよろしいでしょうか。 CではWinアプリを作ることができるといいますが、DOSで入力 するのと作成法においてどんな違いがあるのでしょうか?DOS で扱うにはボタンなどは必要ありませんが、Winアプリにはも ちろんフォーム、ボタンなどいろいろなものが必要になります よね?それをCでいちいちサイズなどを指定しないとWinアプリ は作れないんですか?VB.NETみたいにボタンをマウスを使って 設置できるといいますが、それはCなのですか?C++との作成面での違いは? 文がぐちゃぐちゃですみません。意味不明な文ですが答えれるところがあれば、答えていただきたいです。お願いします
284 :
デフォルトの名無しさん :03/05/27 01:11
http://www.asahi-net.or.jp/~yf8k-kbys/ckadai5.html の1. ユーザに入力してもらった数だけ、あなたが好きな言葉を繰り返すプログラムを書いてください。
/* kurikaeshi.c */
#include <stdio.h>
int main()
{
int x;
int a;
printf("好きな整数入力して。");
scanf("%d",&a);
for(x=0;x<a;x++){
printf("あいうえお\n");
}
}
で合ってますか?
>>284 未完成のサイトで勉強するのはやめましょう
>>280 DOS(コンソール)アプリとWinアプリではウインドウを作るだけでも大変さが全然違う。
コンソールは
#include <stdio.h>
int main(void){return 0;getchar();}
で出来るが、Winアプリは30行ぐらい必要になる。それを知りたいなら
http://www.kumei.ne.jp/c_lang/ のWindowsSDK編第一部の1~5章ぐらいを
見ると勉強できます。もし30行書くのが面倒なら、MFCという方法でも作れる。
僕はその方法はあまり知らないが、VBとSDKの間と考えると良い。
ボタンを作ると成ると、もっと大変。VBではなくCで作る利点は、基本的に作りやすい
(個人の意見)、必要なものだけ使うから速い、一度作ってしまうと(関数、クラス)
使い勝手が良い等。作るスピードでも最初はVBの方がかなり速いが、プログラム
サイズが大きくなるとVBを追い抜く。Cができるなら、VBではなくCでWinアプリを
作るのを進める。がんばれ!
>>287 途中からCとC++とが区別できなくなったようだ。
290 :
デフォルトの名無しさん :03/05/27 05:46
C言語+SDKだけで開発してる香具師ってまだ居るの? 漏れは3.1以来やってないが…
>>290 普通わざわざCじゃやらねぇべさ。
尤も、C++と言ってもC++らしい使い方できない香具師が多いのだが。
>>288 間違えていたことを教えたならスマソ。
>>289 いや、書き忘れです。でも、本当に区別できてないかも。
>>290 僕がその香具師です。ボタンとかもリソース系を一切使わずに、コードのみ
で。昔、将棋もそれで作りました。
>>291 多分僕がそう。違うだろうけどCはコンソールC++はウインアプリとその違い
だけで区別しています。
よく分かっていないのなら、こんな所で回答しない方が良いのでは :)
>>293 あちらこちらで同じような質問がおっぱおあったので。
>>292 オブジェクト思考ができずに使うC++はC+お仕着せのクラスだけの代物。
C++を使うと言うからには、(クラスを設計するだけが全てではないが)
データのカプセル化、処理の抽象化ができなければ意味がない。
具体例を挙げるわけにはいかないので曖昧な表現で申し訳ないが、
例えば
>>286 に挙げられているC++の講座などは勘違いの代表例かと。
確かにGUIはクラス化すると継承させて綺麗に実装できるように見えるのは事実。
しかし、C++の本領は寧ろ、GUIとは切り離された、アルゴリズムの実現で
発揮されるものだと思う。
なので、C++(≠VC++)を使いこなそうと思うなら、例えば日付でもいい、
例えば座標空間でもいい、そうしたものを巧く抽象化したクラスを実装してみてはどうだろう。
と、これだけだとC++スレに行けと言われそうなのでCのフォローも。
C++を完全に使いこなすことは難しい(と言うか多分無理)だが、
Cならライブラリも含めて多いに使いこなせると思う。
そのためにも、既存の入門書の嘘に振り回されずに
自分でマニュアルを見、テストコードを書き、
ansiなどの仕様を確認する能力を養うべきだろう。
その技術はC++でも立派に役に立つ。
#結局C++かい>自分
C >>>>>>>>>>>>>>>>>>>>>>> C++
C++というかOO関係のスレへ逝けや
C++相談室に来られては困るから、OO厨房は戦場では必要なしスレでどうぞ。
私はオブジェクト思考に拘っているわけじゃないんで念の為。 長年構造化に拘ってきた結果として、クラスという データのカプセル化(など)に着目しているだけだ。 まぁ、構造化プログラミングができない奴から見れば オブジェクト思考との区別がつかないのも仕方ないとは思うが。
「オブジェクト“思考”ができずに使うC++〜」と言いだしたのは誰なのかと これだからOO厨は
#include <stdio.h> int main( void ) { while( 1 ) { printf( "ぬるぽ" ); } return 0; }
#include <stdio.h>
int main()
{
for(; ;)
{
printf("ガッ
>>302 ");
}
return 0;
}
pascalの型定義をC風に書くにはどうすればいいんでしょうか? pascalだと type line = packed array[1..10] of char; var x = line; な感じです。
それはいったい何をしたいコードなのか書けよ。 それともpascalも知らない厨房には聞いていないということか?
>>306 typedef char line[10];
line x;
C では添字が 0 から始まる点に注意ナ。
struct person{ char name[10]; char address[20]; char age[3]; }p; 構造体のメンバを参照するとき,p.nameのようなメンバ名ではなく 「上からi番目のメンバ」のように指定することはできないでしょうか? どなたか教えてください。
packedってなに?
312 :
デフォルトの名無しさん :03/05/27 16:42
>>310 enum person_index_t
{
PERSON_NAME, PERSON_ADDRESS, PERSON_AGE
};
char* person_entry(struct person* p, enum person_index_t i)
{
switch(i)
{
case PERSON_NAME: return p->name;
case PERSON_ADDRESS: return p->address;
case PERSON_AGE: return p->age;
default: assert(0);
}
}
生の値で指定するのは超絶危険行為。
列挙子を使う事。
>>313 > 生の値で指定するのは超絶危険行為。
どういうこと?
enum person_index_tを配列の添え字にしてはいけないんだろうか。
お返事ありがとうございます。 何とかループで上のメンバから順番に処理したいのですが・・・ やはり312さんの言うとおり配列に1つ1つ入れるしかないのでしょうか
ループ使わなければならないほどメンバーが多いのか? 俺ならひとつずつ処理するが。
>>307 型をそう定義するというだけで特に何をしたいというわけではありません。
「型定義」といって同じようにCで通じるのかと思い書いてみました。
pascalしか知らない日本語の不自由な厨房でごめんなさい。
>>308 サンクスコ、やってみます。
>>309 了解
>>311 配列の各要素のメモリ領域を小さめに確保するみたいです。
実行結果に変わりは無いはずです。
>>319 型定義はわかるが、packedなんて知らないし。
調べてみたが、pascalって配列にも詰め物がつく場合があるのか・・・・
教訓:プログラマ界での通用度 C>日本語>英語>その他>>>>>pascal
>>322 実際には多くメモリを確保しても、sizeofの結果にその部分が反映されることはないだろ?
>>320 あるだろね。というかpaddingは言語に関係なく必要だったりする。
それをプログラマに意識させるかどうかは別として。
奇数番地から始まるint(16bitとか32bit整数)を参照したら、
bus errorとかの例外が発生するプロセッサがあるしね(68kなど)。
x86でもそういう参照の仕方をしたら例外が発生しないまでも、
性能が大幅に落ちるし。
>>314 person(&p, 0); とか、生の値でやるのが危険だということ。
仕様変更に弱いし、読みにくいし。
>>317 enum person_index_t
{
PERSON_NAME, PERSON_ADDRESS, PERSON_AGE,
PERSON_NUM /* ← これを追加 */
};
にして、
int i;
struct person p;
for(i = 0; i < PERSON_NUM; ++i)
{
char* entry = person_entry(&p, (person_index_t)i);
/* entry を使ってほにゃらら */
}
とすれば可能。
一応ね。
ただ、保守はしにくくなると思われ。
>>325 あ、やっぱりマジックナンバーのことか。
Perlだとやっちゃう人多いかも(モードの指定とか)
>>310 つーか、何がやりたいのさ。
>>323 sizeofに反映されなかったらmalloc()できませんが。
>>327 え!? じゃあchar a[23];と定義した場合、sizeof s==23になるとは限らないの!?
もしそうならsizeof s/sizeof s[0]で要素数を得るというポピュラーな方法が使えなくなるけど。
sizeof aだ(鬱)
>>328 sizeof に反映されるからこそ、その方法が使えるのでは?
単体の sizeof でも padding を含めたサイズを返す、
ということを「反映される」と表現してるんじゃない?
331 :
デフォルトの名無しさん :03/05/27 18:54
hBitmap = LoadBitmap(hInst, "IDB_BITMAP1"); ビットマップのハンドルを取得するのはこれではいけないんでしょうか? どうしてもビットマップの表示がうまくいかず、ここに原因があることは分かったんですが……
332 :
デフォルトの名無しさん :03/05/27 18:56
……
何の話?
>>331 環境依存ならその環境のスレに行ってください。
>>331 来ると思ったぜ、おまえ絶対1読んでないだろ。
教えてもいいが示しが付かんのでとりあえずWin32APIスレに行け。
>>331 じゃ、このスレ的な解答。
・コンパイラからは警告が出なかったか。
・関数の仕様(マニュアル)はよく読んだか。
・変数の型は合っているか、引き数の型は合っているか。
以上チェックするように。
良回答者だ。
API質問スレなんてあったんですね…… 大変失礼いたしましたm(_ _)m
>336 どうもありがとうございます。 それで解決しないようでしたらAPI質問スレの方に行かせていただきます。
340 :
bloom :03/05/27 19:13
341 :
デフォルトの名無しさん :03/05/27 20:03
>>317 1つずつ入れて行けばいいのですよ。
何を困っているのか解りませんが・・・。
>>318 配列から配列へ、互いに添え字やポインタのインクリメントが
使える代入の繰り返し処理でしかループは使わないよな。
データファイルを出力する関数は何ですか? for(i=0;i<=n;i++){ printf("%d,%f\n",i,A[i]); } 画面に表示される数字の羅列をテキストファイルに出力して 後からエクセルなんかにテキストファイルから値を インポートしてグラフを書きたいのです。 助けて下さい。
アゲー 環境はリナックスです。おながいします。
fprintfとか使えばいいけど、 面倒ならリダイレクトしとけばいいんじゃね?
>>344 ありがとうございます!
試して見ます!
346 :
デフォルトの名無しさん :03/05/27 21:11
>>342 プログラム無改造で、 ./a.out > hoge.txt
347 :
動画直リン :03/05/27 21:13
348 :
デフォルトの名無しさん :03/05/27 21:19
ポインタについて質問です。 10分ほど本を読んだら理解したつもりになりました。確認させてください。 ポインタとは、 変数のアドレスを格納するアドレス。変数の先頭アドレスそのものではなく、 先頭アドレスという値を格納した別の場所であることに注意。ポインタ自身は 何のポインタであろうが32ビットのlong型変数。 なぜポインタを利用するかは、 第1の利点は、関数が実行されるとき、実際にはPC内で引数の変数を新たに コピーして作成している。なので変数によっては(文字列や構造体や浮動小数点) メモリを大きく消費する。ポインタにしておけばどんな変数でも32ビットですむ。 そう考えれば逆に、intなどの大してメモリを消費しない変数ではポインタを 使用しない場合が多い。 第2の利点は、外部からポインタの実体を変更したらそれが反映する。 関数だと戻り値は1つしか作れないが、ポインタならばいくつでも外部から 変更が可能。 以上です。間違ってたら指摘してください。 あと、ポインタのポインタとは具体的にどのようなケースで使用するのか教えてください。
ポインタのポインタ例文 char *aho="aho"; char *baka="baka"; char *manuke="manuke"; char *text[] = {aho,baka,manuke,aho}; void hoge(int n) { printf("%s\n", *(text+n)); // text(=&text[0])がポインタのポインタ }
解釈はちょっと変。 第1の利点は今時利点じゃないね。 第2の利点は説明が変だけどそう言うこと。 ポインタのポインタは、ポインタの値を関数で変更したいときに使える。 即ち、整数を関数で変更するときに整数のポインタを渡すが如く ポインタを関数で変更するときにポインタのポインタを渡すわけだ。
>>348 > 変数のアドレスを
NG: 変数とは限らない。(関数へのポインタ、文字列定数へのポインタなどもある。)
> 格納するアドレス。変数の先頭アドレスそのものではなく、
> 先頭アドレスという値を格納した別の場所であることに注意。
意味不明。
> ポインタ自身は何のポインタであろうが32ビットのlong型変数。
NG: そもそも long 型が 32bit とは限らんし。
> 第1の利点は、...
NG: 今時メモリーなんか気にするな。
気にするのは、配列や配列を含んだ構造体軟化の時だけだ。
そう言う風にポインタ使うと遅いし、コードがでかくなることが多い。
> 第2の利点は、...
OK: 日本語がが変だけど、関数内で複数の値を戻せると言うなら OK と見なす。
> あと、ポインタのポインタとは具体的にどのようなケースで使用するのか教えてください。
10年早いと思う。
>>348 ポインタのポインタの使い道がわからないっていうやつ結構多いけど、
intのポインタを使うのと同じ理由でポインタのポインタが使えるだろ。
関数に渡してポインタの指す先を変更してもらいたいなんてのも一つの例だし。
複数の場所で一つのポインタを共有したいときなんかも。
かぶった。 逝ってくる・・・。
>>346 さん!
本当に有難うございます!
助かりました!
y(^v^)y
y(^v^)y
>>349 あんまり例がよくないような。textそのものはポインタの配列だし。
確かに、*(text+n)を評価するときにtextはポインタに縮退するけど。
357 :
デフォルトの名無しさん :03/05/27 22:22
ポインタのポインタ関連の話なのですが、2次元配列のmallocの仕方を教えてください。 具体的にはchar型でn*mの2次元配列をmallocしたいのです。 char *b; char **p; b=(char *)malloc(n*m*sizeof(char)); p=(char)malloc(m*sizeof(char)); p=b; でだめでした・・・。
358 :
デフォルトの名無しさん :03/05/27 22:24
ミス p=(char)malloc(m*sizeof(char)); 訂正 p=(char *)malloc(m*sizeof(char));
>>358 2次元配列分の一次元配列を確保し、利用方法で逃げるのが常道。
char *pArray = (char *) malloc(n * m * sizeof(char));
for (im = 0; im < m; im++) {
for (in = 0; in < n; in++) {
pArray[in + im * n] = 0;
}
}
C++では、単行変換されたあと算術変換されますが、 Cではどのような順序で変換が行われるのでしょうか?
例えば、 char char_dt; float float_dt1,float_dt2; long long_dt; double double_dt; float_dt2 = char_dt * long_dt +float_dt1 / double_dt; のような式の場合、 char_dtとlomg_dtの計算のときは、いっきにlongに変換されるのでしょうか?
一気にの意味がわからん 途中があるのか?
>>364 c++では、charがintになったあとlongになってるらしいんで
367 :
デフォルトの名無しさん :03/05/27 23:00
毎日毎日時間が空いてて暇をもてあましている通信高校生ですが、 日々ネトゲと2chしかやらないのもどうかと、何かしらの勉強でもしてみようかと思い立ちました。 それなりに難しくても実用的なものは無いかなーと思ってたんですが・・・ その中で見つけた候補の一つがC言語です。 C言語は知っていると何が出来ますか? C++等似通ったものも幾つかあるようですが、その違いは? 何というか本当に何も知らない状態なんで的をいてなくて曖昧で阿呆な質問、 その上微妙にすれ違いだと思うんですが他に該当スレが見当たらないもので。 暇な人、居たら教えてくれると幸いです。良さそうなら明日あたり書店にでも出向いてみようと思います
>>367 まずlinux導入してみたらどうよ?
C言語は元々unixから生まれたもんだよ。
「Windowsなんて糞。」
なんて事を回りに言えるようになりますよ。
それ言うだけでコイツlinux使えるのかよって一般人はビビルよ。
で
>>346 これがリダイレクトするっつう事ですかね。
>>348 誰も突っ込まないので突っ込んでおく。
>ポインタとは、変数のアドレスを格納するアドレス。
「アドレスを格納するアドレス」って言うのはどういう事よ?(w
ポインタの前に「メモリ」と「アドレス」の勉強しる!
>>360 sizeof(char)なんてやめろYO!
372 :
デフォルトの名無しさん :03/05/28 00:49
>>360 ループで回さないでcalloc()使えyo!
>>371 おっといけない、元のコードに引き摺られた。
>>372 まぁ、ループの回し方のサンプルと言うことで。
>>368 >「Windowsなんて糞。」
漏れはLinuxは好きだけど、こういう低レベルなこと言うヤシを増やしてほしくないぞw
こんばんわ。 出力ファイル名をコマンドラインの第一引数で受け取るというプログラムを 作ってもらえませんか? 出力ファイル名は12文字以内のフリーフォーマットです。
376ですが、 C言語でお願いします。
こらー!宿題か!
376です。 はい、宿題です。 どうしてもわからないもので・・^^;
あ、はい。わかりました。 すみません。
文字列の配列の中身をかえる関数をかいたのですがうまくいきません。 関数内で暴走してしまいます。 main() { char str[20][20]; int i; ReadSttring(str); for(i=0 ; i<20 ;i++){ printf("%s", str[i]); } } void ReadString(char str[20][20]) { FILE *fp; 中略 for(i=0 ; i<20 ; i++){ fets(str[i], 20, fp): } }
383 :
カーニハン三世 :03/05/28 04:26
>>382 fets()関数はfgets()関数の間違いだと思いますが、
まずそのfgets()関数の戻り値のNULLチェックをしましょう。
多次元配列のアドレスを示すポインタをつくりたいのですが、今は単純に以下のように作っています。 ------------------------------------------------------ int dat0[5][3]; …… { int data; int *pDat; pDat = (int*)dat0; data = checkMatrix( pDat, 3, 2 ); // [3][2]の値を得る } // ノード [a][b] に アクセス する int checkMatrix( int *pMtx, int a, int b ) { return pMtx[a*3 + b]; } ------------------------------------------------------ しかし、次元は固定なのでもっとスマートにtypedef を 用いて作りたいのですが、 typedef int MDAT[5][3]; MDAT dat0; …… この時のMDAT型データへのポインタ pDatは MDAT *pDat; pDat = &dat0; でいいのでしょうか?また、ノードへのアクセス関数は // ノード [a][b] に アクセス する int checkMatrix( MDAT *pMtx, int a, int b ) { return pMtx[a][b]; // それとも return (*pMtx)[a][b]; か ? } でいいのでしょうか?どうか、ご教授お願いします。
int (*pDat)[3];
レジスタ変数使うと処理速度あがると教科書に書いてあったのに 実際使ってみると遅くなってるんですが 何故でしょうか? 僕の環境のせいでしょうか?
#include <stdio.h> #include <time.h> int main(void) { register unsigned int i_r, j_r; unsigned int i_a, j_a; unsigned long sum = 0; time_t time1,time2; /*レジスタ変数の場合*/ time(&time1); for(i_r = 0; i_r < 30000; i_r++){ for(j_r = 0; j_r < i_r; j_r++){ sum++; } } time(&time2); printf("sum = %lu , time = %f\n",sum,difftime(time2,time1));
sum = 0; /*レジスタ変数を使わないとき*/ time(&time1); for(i_a = 0; i_a < 30000; i_a++){ for(j_a = 0; j_a < i_a; j_a++){ sum++; } } time(&time2); printf("sum = %lu , time = %f\n",sum, difftime(time2,time1)); return 0; } こんな感じで実行したら sum = 449985000 , time = 3.000000 sum = 449985000 , time = 2.000000 こうなりました。
アセンブラを見て考えたら。
いまどきのコンパイラならregister修飾なんか黙殺だろ。
黙殺ならまだいいがかえって足引っ張ってるんじゃないか?
何にせよtimeではねぇ。精度1秒では何とも言い難い。
i_a,j_aにvolatile付けたら
sum = 449985000 , time = 3.000000
sum = 449985000 , time = 7.000000
こうなりました。
コンパイラで最適化されてたと言う事でしょうか?
余計な修飾子つけるよりコンパイラに任せた方がイイというわけですか・・・
ちなみにBorland C++ Compiler 5.5使いました。
レジスタより早くなるってのはどういう原理で早くなってるのだろう・・・
>>392 もっと精度を高くするには自分で関数つくらないとダメなんでしょうか?
>>393 clockを使う。
time1 = clock();
for(i_r = 0; i_r < 30000; i_r++){
for(j_r = 0; j_r < i_r; j_r++){
sum++;
}
}
time2 = clock();
printf("sum = %lu , time = %f\n",sum, (double)(time2 - time1) / CLOCKS_PER_SEC);
で↓にgcc -Sで吐かせたもののclock〜clockまでを貼り付けておく。
ほとんど変わらなかった。
レジスタ変数の場合 call _clock movl %eax,%esi xorl %edx,%edx .align 4 L14: xorl %eax,%eax leal 1(%edx),%ecx cmpl %edx,%eax jae L13 .align 4 L18: incl %ebx incl %eax cmpl %edx,%eax jb L18 L13: movl %ecx,%edx cmpl $29999,%edx jbe L14 call _clock
レジスタ変数を使わないとき call _clock movl %eax,%esi xorl %edx,%edx addl $16,%esp .align 4 L24: xorl %eax,%eax leal 1(%edx),%ecx cmpl %edx,%eax jae L23 .align 4 L28: incl %ebx incl %eax cmpl %edx,%eax jb L28 L23: movl %ecx,%edx cmpl $29999,%edx jbe L24 call _clock
>>394 × gcc -S
○ gcc -O2 -S
>>395 ,396って意味不明。
いちいちコンパイルしなくても実行結果がわかるって事です?
もしそれなら便利な機能だけど・・・どこをどうみたらいいのやら
コンパイラのマニュアル見てみるか・・
>>398 > いちいちコンパイルしなくても
いやコンパイルした結果だ。機械語を見てもいいけど、それじゃなおさら分かりにくいだろ。
borlandC++ではコンパイルしてもそんなの出てこないです。
とりあえずgccってのでやってみよう。
分かる人には
>>395 、396を見ただけで結果が理解できるのでしょうか?
>>400 eax、edx、ebxとかがレジスタ。
レジスタ変数にすると、このレジスタに優先的に割り付けられる。
しかし両者を比較しても、ラベル名が違うのとaddl $16,%espが
追加されているくらいで、レジスタへの割り付けられ方は同じ。
registerの指定が効いていないってこと。
ちなみにi_r、i_aがedxにj_r、j_aがeaxにsumがebxに割り付けられている。
bccでも似たようなものを吐かせることができるはずなので
試してみてください。(オプションは違いますが)
コンパイラによって多少差がありますので。
実行時間じゃなくてメモリへの割り当て具合が分かると言うことでしょうか? 奥が深い。 理解できるようにがんばるっす!
>>385 すいません。まだよく判らないので教えてください。
typedef int MDAT[5][3];
MDAT dat0;
……
int (*pDat)[3];
pDat = &dat0;
ということなんでしょうか?
また、その時のCheckMatrix関数の引数はどのように記述すればいいのでしょうか?
int (*pDat)[3];
こういう記述は初めてなので、私はげしく勘違いしてるかもしれませんが
よろしくお願いします。
>>403 要素数3のint配列を指すポインタ 括弧をつけないとint *の配列になってしまうからつけた。
int dat0[5][3];
int (*pDAT)[3]=dat0;
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
406 :
デフォルトの名無しさん :03/05/28 13:31
書籍の専門スレって何処ですか?
癇にさわる書き込みだな。
408 :
デフォルトの名無しさん :03/05/28 13:35
1に書籍は専門の別スレがあるとあったので・・・ 書籍、で検索して出てこなかったのでここで質問してみました。 関連スレのリンクも張ってあると良いかなーとか思ったりして
関連ではないけどね これを関連といってしまうと、他の言語も関連だと思うし
412 :
デフォルトの名無しさん :03/05/28 13:55
VCなんですが、あるWindowsで動いてるプロセスの指定したメモリアドレスの値を取得したい場合は どうしたらいいのでしょうか? たとえば起動しているaaa.exeのメモリ0x41000の値を10進数で表示したいという感じです
わざわざ「ここ注目」と書き加えたのに。
>>412 ReadProcessMemoryだが、スレ違い。
初心者には標準Cでできるかどうか判断する力はない罠
ごめんなさい、探してきます
>>415 取っ掛かりが分かった気がします
ありがとうございました。
まだ不明な点はのこっていますが移動先で聞いてみます
16桁の2進数の変数aを10進数に変換したいのですが どうすれば良いですか?
strtolしたあとにsprintf
switch文で、 選んで入力してください 1.・・・ 2.・・・ 3.・・・ =>[3] というものを作っているのですが、たとえば「3」を入力するとプログラムを終了させるようにするには どのようにすればいいのでしょうか?
exit(1); を実行する 一応検索して調べといてくれ exitについて
あ、 #include <stdlib.h> をインクルードしておいてくれ ん? この文だと二重インクルードになって舞うか? この関数は、プログラムを終了させてくれる関数です 引数に1を渡すと、異常終了だったっな・・・
お手数かけました。早速調べてみたら。ありました。 ほんとにありがとうございました
abort(); イキナイ
>>424 exit をしなくても、プログラムが終わるようにプログラムすればそれで良い。
int main() {
printf("Hello, world!¥n");
return 0;
}
には exit はないが、プログラムは終わる。
main にまで戻って return すればプログラムは終わるのだ。
>>423 二重インクルード防止コードは全ての標準ヘッダファイルに書かれている。
そのような心配はする必要ない。
>>419 「進数」という概念は値自身の持ってる属性ではない。
値を表示しようとした場合に生じてくる属性である。
例えば、
a = 0x20;
と
a = 32;
は人間が読む分には違いがあるが、値は全く同じである。
また、a の内容を全く変える事なく
printf("0x%02X¥n", a);
は 0x20 を表示するし、
printf("%d¥n", a);
は 32 を表示する。
exit使ってmain以外でプログラムを終了させることは構造化を乱すことになるとか。 うーん?
>>427 > #include <stdlib.h>
> をインクルード
という文章が2重インクルードになってるという意味だと思われ。
>>428 main内でもexitはいやんだろ。本当は関数途中でのreturnもうれしくない。
もしかしたら関数の最後にクリーンアップ処理が書いてあるかもしれない。
プログラムの終了コードはぬるぽに統一しよう!!
int型変数の各桁の値を取り出す方法はありますか? 例えば変数に1234という値が入っていて、10の位を取り出す場合 3という値を得たいのです。よろしくお願いします。
10で割り、その値を10で割った余りを求める。
>>431 int a = 123;
printf("%d\n", a / 10 % 10);
あ、そうか…ありがとうございます
switch(n){ case 1: while( ( c = getchar() ) !=EOF) putchar( test1(c) ); break; case 2: while( ( c = getchar() ) !=EOF) putchar( test2(c) ); break; ・ ・ ・ } という風に作ったのですが、入力→出力→入力→出力→・・・ となってしまいmainに戻れません。 break;の使い方が違うのでしょうか。 どうすればいいんでしょうか。どなたかお願いいたします。
>>385 >>404 ありがとうございました。
ステップアップ目指してぜひ習得したいと思いますが、
すいません、もう2点質問いいでしょうか?
int dat0[5][3];
int (*pDAT)[3]=dat0;
1)
このポインタを用いての要素へのアクセスは
pDat[a][b] でいいんでしょうか?
2)
pDAT = (キャスト?)0x80000;
の場合のキャスト書式はどのようになるのでしょうか?
よろしくお願いします。
すいません、戻るではなく終了でした。戻るってのは前にwhile(1)使ってたからでして・・
またまたすいません、自己解決しました。
C言語って何が出来るの? 興味持ったから少し検索して初心者向けのページとか見たりしてみたんだけど、 何処も「機械に命令を出す事が出来る」程度にしか書いてないんだよね。 それを使って何が出来るのかが知りたいのだけれど・・・ 例えばランチャー等のアプリとかもC言語で作れるんですか? ゲームなんかもC言語で作られてるものが多いと聞いた記憶があるんですが、 要するに何でも作れるって事なんでしょうか。
441 :
デフォルトの名無しさん :03/05/28 22:30
431でも出てた任意の整数の任意の桁の数値を抽出するソース教えてください。 例)1234と言う数字から10の位の3と言う数字を抽出する
443 :
デフォルトの名無しさん :03/05/28 22:39
>>440 心配するな、お前には何も作れないから。
>>441 int extract(int n, int k)
{
switch(k){
case 4:
return n / 1000 % 10;
case 3:
return n / 100 % 10;
case 2:
return n / 10 % 10;
case 1:
return n / 1 % 10;
default:
fprintf(stderr, "対応してね−よ。\n");
return 0;
}
}
最近C言語初めてばかりのものですが自分も441の方法知りませんので知りたいです。
上の433に書いてる>>431って432の書き間違いですよね^^;
>>443 441のソースてか命令文って学校の宿題にでるぐらい簡単なことなのですか?
446 :
デフォルトの名無しさん :03/05/28 22:45
選択ソートのプログラムで標準入力から最大100個までの配列データを 読み込んで小さい順にソートし、結果を出力するプログラムを作る。 作ってはみたんですが、例えば50個のデータをソートすることが出来ませ ん。どうすればいいんですか?ちなみに最初に要素の個数を指定することはできません。
>>445 10の位はその数字を10で割ったものを10で割ったあまりだということくらい理解できませんか?
451 :
デフォルトの名無しさん :03/05/28 22:52
>>449 おお そういうことだったのか^^;
頭の回転悪くて理解できなかったw
>>448 わかってるよ。
あんたは直後のレスで理解したんだろ?
問題はそれで理解できずにさらに聞くやつら。
ってゆーかもしかして同じ学校?
455 :
デフォルトの名無しさん :03/05/28 23:08
>>455 あれだけの情報でまともな答が返ってくると思ってんの?
つーか、宿題スレにカエレ
457 :
bloom :03/05/28 23:13
458 :
デフォルトの名無しさん :03/05/28 23:19
リダイレクトって何ですか?
とりあえずググれ
460 :
デフォルトの名無しさん :03/05/28 23:44
>>446 #include<stdio.h>
#define N 100
main(){
int i,j,min,x[N];
for(i=0;i<N;i++)
scanf("%d",&x[i]);
for(i=0;i<N-1;i++){
for(j=i+1;j<N;j++){
if(x[i]>x[j]){
min=x[i];
x[i]=x[j];
x[j]=min;
}
}
}
for(i=0;i<N;i++)
printf(" %d ",x[i]);
printf("\n");
}
これを改良してデータ数が100未満でも動くようにして下さい。
宿題スレに行け しかもまだ情報不足
462 :
デフォルトの名無しさん :03/05/28 23:52
質問させてくださいっ。 unsigned longに4294967295(0xffffffff)を入れて printf()しようとしたところ"%d"では上手く表示できませんでした。 (2147483647:0x7fffffff)までは上手く表示できることを確認。 で、ネットで4294967295をprintf()で表示させる方法を探したところ "%lu"、"%u"を発見。やってみたところ上手くいったんですが、 この"%lu"、"%u"って一般的に使用しますか? 既出だったらすみませんがよろしくおねがいしますm(__)m
>444 そんなみ身も蓋も無い事言わないで教えて下さいよ つД`) それともその返答の中にはお前以外なら作れる、つまりC言語でアプリとか作れる・・・という意味が込められてるんでしょか
464 :
デフォルトの名無しさん :03/05/29 00:13
>>462 一般的に、printfのフォーマットは引数の型に合わせて使います。
%luでも%uでもうまくいったのは、longとintのサイズがたまたま同じだったからでしょう。
int main(void){ return 0; printf("hello, world\n"); } こういう書き方するとhello,worldが出力されませんよね。 関数内でreturnのあとの文を実行させる方法ってありますか?
goto
int *a; a = (int *)malloc(sizseof(int)*5); これで要素5つの領域がaに確保されることを教わったのですが、 mallocの前の(int *)は何を意味していて何故必要なのでしょうか?
469 :
カーニハン三世 :03/05/29 02:44
>>468 malloc() が void* 型だからです。 a に代入するため
int* 型でキャストします。
以上
>>468 mallocの戻り値をint *へキャスト。
stdlib.hさえインクルードしていれば必要ないよ。もっとも、C++としてコンパイルするのなら必要だけど。
>>469 そういう理由じゃないと思う。
>>466 何のために?
return は関数を終わらせるために書くものなのに、
何でその後を実行する必要があるんだ?
void*からint*に暗黙に変換できることを知らない人が一人紛れ込んでるようですね
voidがなかったころにchar *で代用していたからキャストしていたんじゃないの?
移植しやすいようにするためじゃあ?
意味するところと必要性を問われて、理由を勝手に推測するスレはここですか?
名前欄に「山崎渉」って書けないんだけど、なんで?
ほんとに?
意味するところと必要性を問われて、理由を勝手に推測するスレはここですか?
int foo: char buf[256]; fgets(buf, sizeof(buf), stdin); sscanf(buf, "%d", &foo); とあった場合、 buf を "%d" でパースして int 型に変換して、それを foo に入れる、 という理解で会ってますか?
C FAQ すらも読まずに質問に答えるスレはここですね?
括弧の連続は4つが許せる限界。
>>483 誤爆?
複雑な場合は括弧が連続しないように書けばいい。
485 :
デフォルトの名無しさん :03/05/29 19:40
perlみたいなかんじで !open(...) || exit(-1); とかやったら コンパイルエラー
486 :
デフォルトの名無しさん :03/05/29 19:42
>>485 当たり前だ。exitは戻り値なし(void)だからだ。
>>485 openできたら終了しちゃうのか?
open(...) ? (void)0 : exit(-1)
stdlib.hをインクルードしなければエラーにならないかもな。
489 :
たまちゃん :03/05/29 19:47
今、会社で初めてC言語を勉強し始めたのですがif文や配列、関数、ポインタなど 理解が出来なく困っています。そこで、本当に初心者でも理解ができ、 社会で使えるくらいの知識がつけられる参考書を教えてほしいのですが?
そもそもexit()に-1を渡すのはやめれ。
そのopenがUNIXのopenなら、!をつけるのはやめろ。
495 :
デフォルトの名無しさん :03/05/29 20:58
この問題が解ける人はソースを載せてください。 結構難しいと思います。挑戦待ってます。C言語の問題です。 氏名と5科目の点数を標準入力から読み込み、ファイル「gakusei.dat」に保存するプログラムkakikomiを作成せよ。但し、氏名は最大20文字とし、「Q」を入力した時点で終了するものとする。また、学生のデータは構造体を用いて管理せよ。
497 :
デフォルトの名無しさん :03/05/29 21:01
498 :
デフォルトの名無しさん :03/05/29 21:03
>>463 必要な情報を提示して質問できない奴はプログラマになれない。
ただそれだけ。
>499 必要な情報って? 自分の質問読み返しても別にそんな情報が要るような質問じゃないと思うのだけれど・・・
>>473 あー、たぶんあれだ。
内部処理の終了を待たずにリターンしたいんだろね。
スレッドという言葉を466に教えるといいことありそうだ。
>>440 > 要するに何でも作れるって事なんでしょうか。
ほとんどなんでも出来ることは確かだが、それを楽に実現できるかどうかは別問題。
Cに限らずなんでもやってみないことには始まらない。
503 :
デフォルトの名無しさん :03/05/29 21:52
お聞きしたいのですがwhile文の結果を使ってさらにwhile文を実行できないのでしょうか? したのソースはコンパイルは問題なく出来たのですが下半分が機能してくれません 原因を教えてください /*入力した任意の数値の桁数を調べるソース*/ #include<stdio.h> #include<math.h> main() { int a,b,c,i; scanf("%d",&a); i=0; while(i>=0) { c=pow(10,i); b=a%c; if(a==b) break; i++; } printf("%d",i); /*これ以降は任意の数字のそれぞれの桁の数字を抽出するソースであり上のところで調べた桁数だけループする*/ int d,e; int j; j=0; while(j==i) { e=pow(10,j); d=a/e%10; j++; printf("%d桁目の数値は%dです",j,d); } }
while (j == i) は while (j != i) じゃないか
>>503
>>503 ブロックの先頭以外で
int d,e;
int j;
は宣言できるか?
それと、この場合whileよりforの方が適当だとは思わないか
>>504 ホントだ継続条件間違ってました^^
言われたとおり==を!=に変えたら機能しました
どうもありがとうございます
>>505 ブロックの先頭以外でも宣言はできました。 あとお聞きしたいのですが自分はまだC勉強し始めたばかりなのですが forとwhileの使い分けについてまったく分かりません自分にはまったく同じ物にしか思えなくて^^; 使い分けについて簡単に教えていただけないでしょうか
判定式とインクリメントをまとめるのと continueしたときは動作が違う。
>>507 > ブロックの先頭以外でも宣言はできました。
多分 C++ を C のように使っている状態だと思います。
> forとwhileの使い分け
基本的に for 文はループが進むごとに何かを次に進める時に使います。
510 :
デフォルトの名無しさん :03/05/29 22:25
>>508 ,509
ありがとうございます勉強になりました
趣味でプログラミング始めてみたんですがマルチモニタ環境じゃないと非常に作業しづらいですね
へえ。そうですか。
>>511 参考書によっては書いてあるかもしれないが、
for と while は基本的に同じものだ。
for(A;B;C)D; <=> A;while(B){D;C;}
>>515 注釈は合っているが、
そういう宣言の仕方は(可読性が)良ろしくない。
x と、y の要素の型を確実に同じにできるので、
その事に意味があれば多少保守性は上がるけどね。
>>517 ではfloat x,yのxはどういう意味なんでしょうか?
float x,y[] = { 1.1,2.8,6.5 }; /* yをfloat型3個の配列で宣言後、初期化 */ の注釈間違ってますよね? ↑ここはyだけになってますが、「xとy」ですよね?
>>518 float x,y[] = { 1.1, 2.8, 6.5 };
は
float x;
float y[] = { 1.1, 2.8, 6.5 };
と同じ。
x は float 型の変数。
>>520 そうですか!
勘違いしてたみたいです。
>>500 要は、お前は「車ってどこへ行けるの ?」って聞いてるのと同じだよ。
あるいは、「車でディズニーランド行ける ?」って聞いてるのと同じ。
ディズニーランドが1つじゃないように、ランチャーだっていろいろある。
そもそも環境もわからんし、環境を書いて聞くスレじゃないし。
>>500 その質問は FAQ なので、みんな嫌気が差してる。
回答は「その気になりゃ大抵の事はできる」だ。
あとはやる気の問題。
524 :
初心者プログラマー :03/05/30 00:52
527 :
デフォルトの名無しさん :03/05/30 04:54
PocketCってC言語の勉強にも利用できますか?
>>521 ついでに言うと、float *x,y;としたとき、ポインタになるのはxだけ。
>>527 PocketCがAnsiCとどれだけ違うか把握してからなら兎も角、
AnsiCに慣れていないのなら激しくお勧めしません。
void Count(char *cnt) { intCNT; CNT = 1; CNT ++; cnt = (char *)&CNT; } こんな関数があったとして main側でcntを受け取ったときに cnt = 2;と認識できますか?
できない
無茶苦茶だな
まじすか・・・ どうやったらできるんでしょうか。。。
539 :
デフォルトの名無しさん :03/05/30 15:28
void Count(char *cnt) { int CNT; CNT = 1; CNT ++; *cnt = (char)CNT; }
>>535 CNTのアドレスが渡ってるだけ??
ですか?
*cnt = CNT;
543 :
デフォルトの名無しさん :03/05/30 17:54
文字列リテラルに特定の文字をいれると(為替など)コンパイル時に 警告:不適切なエスケープ:\<0x91> と出ます。 実行すると文字化けしてしまいます。 UNIXなんですが、どなたか対策しりませんか?
544 :
デフォルトの名無しさん :03/05/30 18:00
【緊急】ちょっと現調いってきてください!
名前: 頭脳土方
E-mail:
[email protected] 内容:
現調にいってくれるひと募集。
5月31〜6月1日 宿泊費、交通費、でます。
もちろん、現調なのでお金払います。(値段は相談)
C++が分かる人。開発室と電話連絡しながら、
コンパイルしたりテストしたり、してください。
メール
[email protected] もまいら、よろしくおねがいします。
>>543 Shift-JISで一部の文字が\とかぶるものがあったとおもうけど、それか?
548 :
カーニハン三世 :03/05/30 20:28
>>540 CNTはCount()関数内だけの一時変数です。つまりCount()関数が
実行中の時だけスタックに存在する変数です。
ですからCNTのアドレスを上位関数へ渡しても、Count()関数を
抜けたらお仕舞い。
上で*cntを参照すれば、Unix/Linuxなら Segmentetion Fault、
Win32なら アプリケーションエラー だぞ。(偶然落ちないこともあるが)
アドレス(ポインタ値)を返せるのはstatic変数だけ。(例:strtok()関数など)
>>548 それ以前に返してないってば。代入しているのは仮引き数のみ。
>>543 ソースをこういうのに通せ
#include <stdio.h>
#define iskanji(c) ((0x81 <= (c) && (c) <= 0x9f) || (0xe0 <= (c) && (c) <= 0xfc))
#define ESC '\\'
int main(void)
{
int in_string = 0, kanji1 = 0;
int before = 0, c;
while ((c = getchar()) != EOF) {
if (in_string) {
if (kanji1) {
if (c == ESC)
putchar(ESC);
kanji1 = 0;
}
else if (!kanji1 && iskanji(c))
kanji1 = 1;
else if (before != ESC && c == '\"')
in_string = 0;
}
else if (before != ESC && c == '\"')
in_string = 1;
before = c;
putchar(c);
}
return 0;
}
コテって無能が多いね。
>>549 >>551 あ、・・・・
よく見たらスタック上の引数のコピーに代入してるだけじゃん(撃)
俺のレスまで無意味だった。 激しく逝って来る・・・
553 :
デフォルトの名無しさん :03/05/31 02:40
Visual C++じゃなくてBoriand C++を今買って学習するのは無謀でしょうか。
>>553 かわずとも・・・cygwinとかWideStudioとかLinuxとかBSDにあんだろ。
>>553 BCCなら只だから
その分、書籍に金をまわせるが
>>553 Borland C++の方が簡単にアプリが組めるという点ではよい。
ただ、それで勉強しなくなるなら結果的によかったのかわからないけどね。
あれ、C++Builderでなくタダのほうのことだったか 逝って来よう・・・・
C++ Builder簡単に組める=馬鹿でも組めるからダメだろ(w
>>558 実際にVisual C++買って難しくて挫折する人は多いと思うよ。
それならC++Builderで何かしら作れたほうがいいとも言える。
誰にでも組めるっていうのもいいものだよ。
とりあえずちょっとしたもの1つ組めれば次に進む気になるからね。
560 :
デフォルトの名無しさん :03/05/31 04:11
ホントにC言語を勉強したいなら、GNUが使えるLinuxなんかを ダウンロードしてCD-Rに焼いてインスコすれば、安上がりだし WindowsでもフリーなBorland BC++5.5がある。 C言語でWinアプリを組めばメッセージ駆動の勉強にもなっちゃうよ。 独力で .rcの記述をしながら、WinMain()、WinProc() のデザインから 始めるのも良いかも。
時は金なりだからね。何が安いかわからないよ。 フリーのCコンパイラで勉強して、それではWinのアプリが簡単には組めないことがわかって結果的にCはやめてVBにいったりする。 C++Builder1万円って社会人にはそんなに高くないんじゃないの。 これで何か作れる喜びを味わえるなら安いくらいかも。
#include <stdio.h> void main(void){ int n[3],i; for(i=0;i<3;i++){ printf("n[%d]=",i+1); scanf("%d",&n[i]);} for(i=0;i<2;i++){ if(n[3]>n[i]){ printf("rejected\n");}} for(i=0;i<2;i++){ if(n[3]<=n[i]){ printf("approved\n");}}} これを「n[1],n[2]のどちらかがn[3]より小さいならrejectedを出力し、 n[1],n[2]の両方ががn[3]以上ならapprovedを出力する」ソースにしたいです そのままではapprovedが2回出るだけなので、 どうしてそうなるのか非常に悩んでいます
n[1],n[2],n[3]がどんな値でも実行したらapprovedが 2回出ることを追加しておきます
>>562 int n[3]と宣言して n[3]と比較するのは
これいかに。いやどうかと。
n[3]と宣言した場合使えるのはn[0]〜n[2]まで。
565 :
デフォルトの名無しさん :03/05/31 07:34
口から悪魔が出てきますな.
567 :
デフォルトの名無しさん :03/05/31 09:17
Cって日本語が使えないんですか?
569 :
デフォルトの名無しさん :03/05/31 15:45
#include <stdio.h> #define MAX 5 main() { int i, point[MAX], total=0, avr; for(i=0; i<MAX; i++){ printf("%d人目の点数は? ", i+1); scanf("%d", &point[i]); } for(i=0; i<MAX; i++){ printf("%d人目 = %d\n", i+1, point[i]); total += point[i]; } avr = total / MAX; printf("平均点 = %d\n", avr); } のtotal += point[i];ってところがわかりません。 どういう意味なのでしょうか?
文法なら本をみようよ。 a+=bはa=a+(b)
>>570 ありがとうございます。あいにく貸しているんで・・
572 :
デフォルトの名無しさん :03/05/31 15:59
>>570 (b)はbでいいだろ。
(b)でも問題ないが
>>572 bが先に評価されるという意味で括弧でくくった。
>>572 + より優先順位の低い二項の演算子なんていくらでもあるぞ。
>>573 カッコは評価順序とは関係ない。優先順位を変えるだけ。
577 :
デフォルトの名無しさん :03/05/31 18:06
C言語を家で勉強したいと思うんだけど どのソフトを買えばいいでしょうか? やっぱり Visual C++.NETかな
純粋なC言語だったら、linux+gcc Windows上で動かしたいなら、VC 安く済ませたいなら、BCC きわどく行きたいなら、cygwinのgcc(素人にはお勧めできない) 例えば、学校でlinux+gccとかsun+gccとかだったら、 cygwinのgccでもまあ、がまんできる。無料だし。 いじゃう。っていうか同じような質問多すぎ。逝ってくれ。
FAQスレ立てた方がよさげ。
580 :
デフォルトの名無しさん :03/05/31 18:22
C言語ってどんなソフトを作れるんですか?
>>580 基本的に何でも。
OS書いているソフトだからな。
ただし生産性は高いとはいえない。
582 :
デフォルトの名無しさん :03/05/31 18:37
>>580 はっきり言ってCは
1.ソースが混乱する。
2.膨大になる。
が問題。
583 :
デフォルトの名無しさん :03/05/31 19:35
char str[100]; fgets(str, sizeof(str), stdin); というように標準入力から文字列(アルファベット)を受け取る際に、100文字 を超えたら改行まで読み続けないで、1回で処理を打ち切るようにしたいのですが、 どのようにしたら良いのでしょうか?フラグなどを立てておく以外でお願いします。
なんの処理を一回でうち切りたいのか知らないけど、入力処理のことならfgetsを一度だけ呼べば一回でうち切られる。
>>582 ほほぉ。
それではソースが混乱しないで膨大にならない言語は何ですか?
#スレ違いって誤魔化して答えないと思うけど一応聞いてやる。
>>583 残りの入力を放置していいなら
>>584 の言うとおり。
入力を破棄してしまいたいならもう一度(必要なら複数回)呼んで
改行まで読み捨てる必要がある。
586 :
デフォルトの名無しさん :03/05/31 20:11
>>584 ,585
ありがとうございます。
ループ内でfgetsをやっていたので、文字のあふれた分が続けて読み込まれていました。
もう一つ質問ですが、標準入力から文字列を読み込んだときに、格納する配列から
あふれたかどうかを判断する術はありますか?
fgets()は、まさしく溢れさせないように作られている。 例えば、 char buf[100]; としたなら fgets(buf, sizeof(buf), fp); とすれば溢れることは有り得ない。 尚、行の最後まで呼んだかそれとも行の途中かを知りたければ、 if (buf[0] != '\0' && strrchr(buf, '\n') != buf[strlen(buf) - 1]) { /* 行の途中 */ } とでもすればよい。
>>587 fgets(buf, sizeof(buf), fp) && strchr(buf, '\n')
だろフツー。
>>585 そんな都合のいいものはないが
相対的に見れば
CよりC++という考え方になる。
表現方法が悪かったのはスマン。
590 :
デフォルトの名無しさん :03/05/31 22:18
#include <stdio.h> main() { int a[4]; a[0] = 1; a[1] = 2; a[2] = 3; a[3] = 4; a[4] = 5; printf("%d\n%d\n%d\n%d\n%d\n",a[0],a[1],a[2],a[3],a[4],a[5]); } コードが汚いし、誤作動するし。どうなってんだーーーーーーー
int a[4]だとa[0]〜a[3]でつ
int a[4]は、int型の配列が入るメモリを4個確保して、 その先頭の場所に「a」という名前付ける、って意味。 配列は0から数えるので、0,1,2,3までしか使えない。 ついでに、for文覚えてとけ。役に立つぞ。
あと、main関数は基本的にint型の戻り値でおながいします(にやっ
役に立つというか、必須では。
>>595 >>590 はint型になっているけど。
ただしreturn 0;を書いていないのは(ry
int i = 2; int n = 3; printf("%d\n", i +++ n ); printf("%d,%d\n", i, n ); 出力結果を妄想しなさぁい
>>598 $ ./a.out >/dev/null
$
実数を読み込みたいのですが下のコードで読み込めません。 どこかまずいでしょうか double v; sscanf("7.295760E+0", "%e", &v); printf("%f\n", v);
>>600 マニュアルを見ないところが拙い。
scanf()系のフォーマットがprintf()系と互換性があると思っている時点でダメダメ。
%le
603 :
デフォルトの名無しさん :03/05/31 23:02
>>600 sscanfが変。
第一引数はメモリ上に配置された
char型へのポインタだぞ。
他、指数の表示も%fじゃなく、%eだ。
doubleをfloatにする。じゃだめ?
>>603 文字列定数が返すのはchar *じゃないのか?
%e → %leで読み込めました。 変数のフォーマット指定をおろそかにするといけないのですね
>>608 floatはdoubleに変換されるからprintfの時はどちらもlをつけないが、
scanfの場合はポインタを渡すから、、、ええと、うまく説明できないな(汗
同様に%dに対してchar*やshort*などを渡すのもまずい。
>>600 "%e" に対応するのは、float 型。
一部の処理系で、"%le" で double に対応しているものがある。
使ってる処理系のヘルプを見るべし。
だからさ、規格を調べずに嘘を書くのはやめようや。
念のため、floatがdoubleに・・・というのは可変個の引数の話なんで。
>>609 嘘を書いているのは610。
自信がないならちゃんと調べよう。
>一部の処理系で、"%le" で double に対応しているものがある。 このあたりでは? つまり、一部処理系独自の拡張みたいに云うな、と。
なんかこのスレ、fjみたいになってきたな。
In article
>>617 , デフォルトの名無しさん/sage/617 wrote:
>なんかこのスレ、fjみたいになってきたな。
と思いたいのですね? :p
(,,゚Д゚)∩先生質問です 構造体のメンバにconstを付けた場合 どうやって初期化すればいいんでしょうか
>>619 通常のconst変数同様に初期化すればいい。
const int cOneConst = 3;
struct SomeStruct {
const int anyMember;
double otherMember;
} myStruct = {3, 3.14};
621 :
デフォルトの名無しさん :03/06/01 10:17
>>619 わざわざ、定数を構造体に入れるとは
どういうソースだ?
利用法がわからん。
>>621 利用法は考えてなかったけど出来るのかなーって思って
>>621 テーブルを作るときに使います。
配列になるけど。
構造体の中にテーブル!?
テーブルならstruct X const table[]だろ。
参考書を読み漁り、 ポインタ本やらK&R本やら基礎は頭の中に入ったと思うんです。 が、ここからどうしていいかわからない。 今まで学習した内容では何も出来やしないような気がして。 API叩きまくればできる、とかそういうんじゃなくて・・・。 とにかく、暗礁に乗り上げています。 どうか我が行く道を照らしてください・・・センセー。
>>626 何か作ればいいじゃん。
何作ればいいかとかは自分で考えてね(w
>>616 ん ? "%le" って ANSI で規定されてるのか ?
C99 では規定されてるみたいだけど。
629 :
デフォルトの名無しさん :03/06/01 13:07
なかったらfloat*しか受け取れなくなるYO!
>>626 これからが本番なんだyo
言語を一通り理解するのは土俵に立つ程度のことっス
632 :
デフォルトの名無しさん :03/06/01 13:36
Cでウィルスとか作れるんでちか?
VBSがいいよ
634 :
デフォルトの名無しさん :03/06/01 13:38
>>632 てーか、程度の低いウィルスなら、
簡単。
程度が低くなくても簡単。
>>629 K&R には、"%le" なんかありませんでしたが、何か ?
>>635 > 程度が低くなくても簡単。
こう言う奴は、大体何もできない奴。
638 :
デフォルトの名無しさん :03/06/01 15:42
ところで 2chはどこまで ウィルスの話OKなの? てか、一応禁止だし。
禁止なんだろ。
641 :
デフォルトの名無しさん :03/06/01 16:02
void op(void){ int fd1; char buffer[1000]; fd1 = open("data.c", O_RDONLY); read(fd1, buffer, 1000); puts(buffer); close(fd1); } 関数opを実行するとdata.cのなかの一部分しか表示されません。 全部表示するにはどうしたらよいでしょうか?
>>641 バッファをもっと多くとる。data.cに'\0'を含まないようにする。
ところで、(UNIXの)readは末尾に'\0'を付加したりしないよ。
643 :
デフォルトの名無しさん :03/06/01 16:08
>>641 てーか、
readで読み込むのに賛成しない。
while(fguts(buffer,1000,fd1)!=NULL)
fputs(buffer,fd1);
なら大丈夫。
というか、fd1から読み出してfd1に書き出しちゃだめだろ。
while(fgets(buffer,sizeof buffer,fd1)) fputs(buffer,stdout);
皆さん、レスありがとうございます!
課題があってreadを使わないといけないんです。
>>642 文字数は少ないので、バッファはこれで十分だと思います。
data.cに\0を含まないようにするには
どうしたらいいのですか?
使ってはいけない関数とかありますか?
int n; if ((n = read(fd1, buffer, 1000)) > 0) { write(1, buffer, n); }
微妙にスレ違いですけど、バッファのスペルを buf と書いてあるのを C のソースでよく見かけるのですが、なにか歴史的な理由でもあるのですか? 自分は buff とか buffer と書いてきたので。
K&Rでそう書いてあったから。
651 :
デフォルトの名無しさん :03/06/01 16:56
以下のプログラムをコンパイルするとscanf("%c",b); の所でWarning: 'b' used before setと出ます。 どうしたら正常にコンパイルできますか? #include <stdio.h> static int a; static int sum; int plus(void); int minus(void); int kakeru(void); int waru(void); main(){ char b; puts("数字を入力"); scanf("%d",&a); puts("演算子を入力"); scanf("%c",b); 以下略
&b
>>650 > K&Rでそう書いてあったから。
そうなのか。
creat 見たいなもんかな(微妙に違うか、、、
>>651 どうでもいいけど関数のネーミングセンスどうにかせーよ。
あと、aとかsumは本当にグローバルじゃないとだめなのか。
>>652 .653
ありがとうございました。
以下のプログラム(
>>651 の続きです)のコンパイルはできたのですが、
実行したとき演算子入力の所で、
入力できずに終わってしまいます。
どうすれば自分が意図したとおりになりますか?
main(){
char b;
puts("数字を入力");
scanf("%d",&a);
puts("演算子を入力");
scanf("%c",&b);
if(b == '+')
{plus();}
else if(b == '-')
{minus();}
else if(b == '*')
{kakeru();}
else if(b == '/')
{waru();}
else if(b == '=')
{printf("%d", &sum);}
}
657 :
動画直リン :03/06/01 17:13
>>655 英語苦手なので、単語が思いつきません。
一応、aもsumもグローバルでないとだめなようなプログラム
を作ったつもりです。
数字に続けて演算子も入力してからEnter
660 :
くりえいとりす :03/06/01 17:26
fopen("a.txt", "w"); みたいなやつで、低水準のフォルダ作成関数をキボヌン。
>>658 > 英語苦手なので、単語が思いつきません。
mult(), divide()
> 一応、aもsumもグローバルでないとだめなようなプログラム
> を作ったつもりです。
んなわきゃーない。
663 :
くりえいとりす :03/06/01 17:30
さんくすこ
664 :
デフォルトの名無しさん :03/06/01 17:34
低水準の文字列比較関数をキボヌン。
>>659 やってみたら今度は演算子のところでとまってしまいました。
>>661 英語サンクスです。
でも、グローバルでも作れますよね?
>>665 > でも、グローバルでも作れますよね?
できるからやりゃあいいってもんじゃない。
まともなプログラム作りたかったら、グローバル変数を濫用するな。
CString ss("123.45"); float f; こんなコードがあったとして、文字列ssを変数に変換して fに代入することは出来ますか? 関数でスマートにやる方法があったらぜひ教えて下さい。
>>667 f = atof("123.45");
スレ違い。
>>648 ファイルを正常に開けたならば
バッファを標準出力に書き込むって意味ですか?
それをすることとによって何がどうなるのですか?
>>669 read()のマニュアルなりヘルプなり読め。
>>640 何の話 ? 特定環境のヘルプ示されても困るんだが。
>>641 そもそも read() で読んで、puts() するのが不自然。
read() は、基本的にはバイナリを相手にしてるから、それをそのまま出力したいなら、write() にすべし。
と言うことを
>>648 は言いたいんだと思う。
ただ、
>>669 の
> バッファを標準出力に書き込むって意味ですか?
の発言が、非常に不安。アンタ puts() の仕様わかってんの ?
一つ目はともかく、二つ目も特定の環境のヘルプか(藁
2つ目はISO Cの文章そのままだな。 自分の知らないものは環境依存と決め付けるとは救いがたいアホだ
JISで閲覧できるPDFには次のように書かれているよ。確かにANSIから引っ張ってきたものじゃないけど。 「変換指定子e,f及びgに対応する実引数が、float型へのポインタではなくdouble型へのポインタであるときにはlを」 K&Rの中で明確にそんなものはないと書かれているならまだしも、あれはあくまでも教本なんだから規格を何から何まで網羅しているとは思えないよ。
>>637 > こう言う奴は、大体何もできない奴。
こう言う奴は、大体何もできない奴。
煽りあい貶しあいは2ちゃんの華
677 :
名無しさん@Emacs :03/06/01 23:17
プロトタイプ宣言でよくでてくる、 int foo _((int arg)); のように _()で囲むのはどういう意味ですか?
>>677 _ が何かのマクロになってんじゃないの?
標準ヘッダの中では使われてる事はあっても、
そんなもん自分のプログラム内で使っちゃダメよ。
680 :
デフォルトの名無しさん :03/06/01 23:48
乱数作るのは次の段階でいい。rndをaと比較使用とすると無限ループ化してしまう。何故? #include <stdio.h> main(){ int a,rnd=6; while(){ printf("数を当てたまえ。"); scanf("%d,&a"); if(a<rnd){printf("もっと大きい\n");continue;} if(a>rnd){printf("もっと小さい\n");continue;} if(a==rnd){break;} } printf("正解!"); }
whileの条件式って空にできたんだ。forならできるけど。
>>678 /usr/include 以下をgrepしてみて見付けられませんでした。
find /usr/include -type f | xargs grep ' _('
どのヘッダで定義されてるのですか?
&aを外に出せ
できねーじゃねーか!
>>682 んなもん知らん。
こっちの GCC ではそんなマクロ使われてないし。
#ifdef PROTOTYPES
# define _(Args) Args
#else
# define _(Args) ()
#endif
>>686 すいません。標準ヘッダではなく普通に定義されてました。
>>677 そうみたいですね。
688 :
デフォルトの名無しさん :03/06/02 02:23
#include <stdio.h> struct Num{int iti[10];}zyuu[10]; int main(void) { int i,n; for(i=0;i<=9;i++)for(n=0;n<=9;n++)zyuu[i].iti[n]=i*10+n; for(i=0;i<=9;i++)for(n=0;n<=9;n++)printf("%4d",zyuu[i].iti[n]); getchar();return 0; } 上プログラムの構造体を struct Num2{int zero,int one,int two int three int four int five,int six,int seven,int eight,int nine}zyuu[10]; とした時、同じ値をスムーズに与えるにはどうすればよいのでしょう。 下の構造体にしたい理由は、配列番号だと、メンバのどこにどれが入っているか 分からなくなる時があるからです。enumとかありますが、じかに出来ればいいなと。
>>688 あんまりきれいな方法はないかなあ。
struct Num tmp = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for (i = 0; i < 10; i++) {
zyuu[i] = tmp;
}
てなかんじかね。
スーパーハカーを目指している青少年ですが linuxを勉強するのが先でしょうか?それともパイソン?C? 最短でハカーになりたいので、迅速な回答お願いします。 (ネットワークは無駄だと最近気づいたので)
>>690 マジレスしてみると、最短なんてものはない。
ハカーに王道なし。ただソースと戯れ、たくさんプログラムを書き、
他人の技術を盗み、精進するのみ。
とか書くといかにも求道者風で苦痛の道のりみたいに見えるけど、
ハカーと呼ばれる人たちはそれが楽しいからやってるだけだ。
「最短コース? なんでいろいろ寄り道して楽しまないんだ? もったいないしつまらんじゃないか」
何をやればいいか? などと楽する道を人に聞いてるようじゃハカーには向いてないよ。
ハカーになるべくしてなるやつはそんなこと考えずにどんどん技術を身につけていくものだ。
レス有難う御座います
>最短コース?
高校生のハカーとかかっこいいじゃないですか。。。
日本の餓鬼なんかに負けるかゴルァ!!って気持ちがどうも働くんですよね。
いや、もちろん私も日本人なんですが。
>何をやればいいか? などと楽する道を人に聞いてるようじゃハカーには向いてないよ。
そうですよね・・・ベクトルがhack=カッコイイ→若いともっとカッコイイからきてるのです。
ハカーになる目標を5年後から7年後に移動します。
7分で書いた
>>691 さんに感謝です。
>>692 おいおい、青少年っつーか少年じゃないか。
だったら若さを活かして他人のプログラムを読み捲くれ。
その中から自分に合ったものを見つけて、自分流に何度も書いてみろ。
それからいろんな知識を身につけろ。数学は勿論、どんな知識でもいい。
プログラミング技術と知識を味方につければハッカーも夢じゃないぞ。
#そしてそれらはハッカーにならなくても役に立つしな。
>>692 ついでに一般常識も勉強するように。
ハカーじゃなくてクラカーになっちゃ駄目よ。
>696 Q: Windows ソフトのことで困っています。助けてもらえますか? はい。DOS プロンプトにいって、「format c:」とタイプしましょう。ものの数分で、困っておいでの各種問題は消滅することでしょう。 こういうのってどうなんだろ(´∀`;) もしも知らない人がこれで助かると思って実行したら
> しかし HTML は十分なプログラミング言語ではありません。 この時点でネタ決定 「十分な」がなければいいんだが。
>>698 同意。マークアップ言語はプログラミング言語ではないからね。
オーバーフローについて long min = LONG_MIN; long max = LONG_MAX; long tmp = min - max; としたときのtmpの値は? 1.シラネーヨ(不定) 2.そもそもそんな計算すんじゃねぇゴルァ!
>>690 英語も勉強シル!
何か Unix/Linux 系の手頃なソフトを決めて、ソースを完全解読。
dev 向けのメーリングリストに入る。
パッチを投げる。
スーパーハカーへの第一歩。
>>694 実はエンジニアの底辺を支えてる人だったりするのだ。
勉強する順序みたいのが知りたかったのです。
Python→linux→Perl→C→他の言語 の順番で覚えようかと思います。
>>696 ありがとうです。そことwww.hackerslab.orgはお気に入りに入ってたりします。
スレ違いスイマセンでした(^^
>>701 その通り!英語大事あるよ。
英語やっときゃよかったと後悔することしかり。RFC くらい辞書なしで読んでみたい(恥。
>>701 言語が全くできないんですよ。
わけもわからずMLに入ってきますw
>>672-674 ぐちゃぐちゃ言ってるけど、ANSI で定義されてんの ?
定義されてるなら、ソース出してくれ。
それとも、C99 って話か ?
>>637 =
>>675 か ? つまんね。
JISってANSIそのままじゃ・・・
Webで公開されていない以上、
>>705 が規格書を買うしかないのでは?
引用したところで疑うだけだろうし。
708 :
デフォルトの名無しさん :03/06/02 22:07
long intって64bitなの? sizeofで測ったら4バイトだったけど
>>708 何バイトかは処理系依存 ただしintより小さくなることはない
で、32bit以上はかならずある。
> で、32bit以上はかならずある。 ANSIで決まってたか?
またアメリカマンセー主義者か
>>710 ANSI規格で決まった。
それ以前の処理系については保証はない。
>>708 1バイトが16ビットの環境だったら4バイトで64ビットじゃん。
とか言ってみる。
>>706 アフォですか ?
>>707 結局ソースはだせないのか ?
章 - 節 ぐらい書けるだろ。
>>715 おい、アフォ。
JISのCもISOのCもANSIそのまんまだぞ。
717 :
デフォルトの名無しさん :03/06/02 23:15
C++もmain関数から始まるの?
719 :
デフォルトの名無しさん :03/06/02 23:22
じゃあCは?mainから始まるの?
>>719 何か「C言語でもmainから始まらない場合もある」とかいう話でも
聞いたのか?
Cの例文が沢山あって、単語(例えばgetsとか)で検索出来るサイトを教えて下さい
MSDN
VC6ですが、組み込み型memsetって、データが4バイトアラインメントされてないと遅いんですね。 #pragmanko function(memset) と書くと上記の場合でも速くなる。 って事にさっき気付いた。 気にする程の事ではないが・・・
725 :
デフォルトの名無しさん :03/06/02 23:44
「組み込み型memset」ってなんすか?
726 :
デフォルトの名無しさん :03/06/02 23:46
>>724 おれは「データが4バイトアラインメントされてないと」の中の「データ」とは
何をさしているのかが知りたい。
インライン展開されたmemsetの事。
pragmankoって言いたかっただけ?
>726 第一引数のアドレス値です。スマソ
731 :
デフォルトの名無しさん :03/06/03 01:39
wavファイルの音程を上げ下げするには、どうすれば良いでしょうか?
サンプラーを使う
734 :
デフォルトの名無しさん :03/06/03 02:15
あるファイルで HOGEHOGE とだけ書いたときに、 マクロ定義によって、実際の値を変更したくて下記のように書いたのですが 思ったとおりにいきません #define HOGE(a) tenkaigo_##a #define AHYA ahyahya #define HOGEHOGE HOGE(AHYA) 定義されてほしいのは tenkaigo_ahyahya 実際には引数は展開されず tenkaigo_AHYA が定義されます 下記は確認のソース #include <stdio.h> int main() { int HOGEHOGE; // printf("%d", tenkaigo_ahyahya); // printf("%d", tenkaigo_AHYA); // } 実際には値じゃなくて予約語をマクロ展開で置き換えたいので、#if などで使えるマクロじゃなきゃだめなのです (代行手段は他にありません) 何かうまい方法はありますか?
予約語をマクロ展開で置き換えたい?
>>735 はい、内容が C 部分だけなのでこちらで質問させていただきましたが、
実際には C++ で
#if -ライブラリのヘッダを読み込み中なら TRUE -
#define INTERNAL private
#else
#define INTERNAL public
#endif
としたいのです。で、ヘッダもソースも書き換えずに
ライブラリのヘッダをインクルードしているのか、
今コンパイル中のソースに関連深いヘッダをインクルードしているのかを
マクロでうまいこと定義したいんです。
>>736 それは設計を見直したほうがいいんじゃないのか?
739 :
デフォルトの名無しさん :03/06/03 04:19
乱数を使ったシミュレーションをしているのですが たまに結果が-1.#INDOO となってしまいます。これはどういう意味なんですか? 是非教えてください。よろしくお願いします
どういうコード書いたの?
struct hoge { int value; struct hoge* next; }; ってのは出来るけど typedef struct { int value; hoge* next; } hoge; っていうのはできません。 リスト要素の構造体を typedef で作るにはどうしたらよいのですか?
742 :
デフォルトの名無しさん :03/06/03 04:28
>>740 ボックスミュラーで乱数を正規乱数にして
いろいろ演算しました。した演算は正規乱数をa,bとして
log(exp(a)/exp(b))をとってその平均分散を計算しただ
けなんですけど・・・
何がまずいんですかねえ・・・
いつも-1.#INDOO ってでるわけじゃないんですけど。
#include <stdio.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <io.h> #include <string.h> #include <stdlib.h> int main(){ int pid; int rtc; int i; int h = 1; int status; while(h){ printf("何をしますか?\n"); printf("1:アドレスブック、2:四則演算、3:終了"); scanf("%d",&i); if(i == 0){ h = 0; continue; }
pid = fork(); switch(pid){ case 0: if(i == 1){ rtc = execl("assressbook",NULL); exit(0x00ff); break; } else if(i == 2){ rtc = execl("calc",NULL); exit(0x00f); break; } case -1: printf("fork error"); break; default: wait(&status); printf("status : %d\n", status); break; } } return 0; }
forkについていまいちよくわからないので質問させてください。 以下の部分は子プロセスといわれると思うのですが、 どういう意味で「子」なのですか? case 0: if(i == 1){ rtc = execl("assressbook",NULL); exit(0x00ff); break; } else if(i == 2){ rtc = execl("calc",NULL); exit(0x00f); break; }
また以下の部分は親プロセスと言われると思うのですが、 どういう意味で「親」なのですか? case -1: printf("fork error"); break;
またこのプログラムではforkを使っているわけですが、 なぜforkを使う必要があるのかがわかりません。 forkを使うことによってどういった利点があるのでしょうか?
また具体的にどういったときに -1、子プロセスのプロセスIDが返されるのですか? いろいろ質問して申し訳ありませんが、 ぜひ教えていただきたいと思います。 よろしくお願いいたします。
パーマンのコピーロボットと同じだ。プロセスが分裂するのだ。 ・fork()→鼻を押す ・自分の鼻が丸ければ0が返る。 ・本物にはコピーロボットのIDが返る ・コピーロボットがニセモノだったらfork失敗で-1が返る で、親は本物のミツ夫。
750 :
デフォルトの名無しさん :03/06/03 05:51
>>741 しばらくタグ名付きの定義使ってないので怪しいけどこんな感じで…
typedef struct _tag_hoge{
int value;
_tag_hoge* next;
} hoge;
751 :
デフォルトの名無しさん :03/06/03 05:55
>>746 親は default のブロックだよん。
>>747 親は子の終了を待ってるから system() でも良いような…
fork() の例題作りたかったんじゃない?
>>740 よくわからんが、-1.#INDOO になったときの a, b の値を見てみ。
>>750 これだと next の型が hoge* ではなく struct _tag_hoge*になってしまうです。
これでいいんかいな。 typedef struct _hoge hoge; struct _hoge { int value; hoge* next; };
>>755 タグに違う名前を付ける必要は無いですよね?
たぶん必要ないと思われ。ていうか、それぐらい試しておくれよん。
>>757 コンパイルとおるのは知ってます。
タグ名を区別する理由を知らないので、聞いてみたのです。
759 :
デフォルトの名無しさん :03/06/03 10:02
typedef struct hoge{ int value; struct hoge *next; } hoge; これでできなかったっけ?
760 :
デフォルトの名無しさん :03/06/03 10:04
>>754 struct _tag_hoge*になったら何か問題があるのかと小一時間問いつめたい。
俺はこんなのふうに書いてます
>>755 とどっちが見やすいかなぁ?
typedef struct _hoge {
int value;
struct _hoge* next;
} hoge;
一文字目がアンダーバーってのはまずいんじゃなかった? 二文字目が大文字でなければいいんだっけ?
>>762 ボーランドのコンパイラ使ってるけど
警告された事も無いと思う
2文字目大文字にしても同じだった
てっかウィンドウズ関係のヘッダ見てたら
typedef struct _AAA {
int bbb;
} AAA, *AAA;
見たいな書き方たくさんあったよ
まずいですよ。
__[[:alnum:]_]* と _[A-Z][[:alnum:]_]* は reserved だから使っちゃダメだよん(C99)。
(´-`).。oO(windows.hが使えなくなる)
というか、それとかぶらないようにユーザー定義時には禁止しているってだけ。
s/処理系依存/処理系定義/
>>763 ,766
C99 ってわざわざ書いてくれてるんだから、仕様書読めよ。
構造体タグ名とtypedef型名は名前空間が違うから同じでも構わないよね。 C++を睨んで変えてるんじゃないの?
>>741 void * にしちゃダメなのか?
/* 注:全角空白あるからそのままコピペするなよ! */
typedef struct
{
int value;
void *next;
} hoge;
>>771 C++だって問題なし。
typedef struct hoge hoge;
があればtypedefされたhogeが優先されるけど、
なければstructを省略したhogeが使われる。
>>772 そりゃだめだろ…
nextを参照するときにいちいちキャストすんのか?
hogeって何?
一方向連結リストをあるメンバでソートするのに効率的な方法はないでしょうか? 1回の走査であるメンバが最も小さい(大きい)構造体を見つけてmallocして… というバブルソート的なものしか思いつかないのですが。
781 :
デフォルトの名無しさん :03/06/03 17:55
c言語を独習しようと思ってフリーソフトのlsic330試食版を ダウンロードしたのですが、それからどうすればいいのか わかりません。誰か教えてください。
782 :
デフォルトの名無しさん :03/06/03 17:57
インストール
>>781 パッケージに含まれるドキュメントを読め。
それからぐーぐるにきけ。
話はそれからだ。
>>781 330?
CPadも一緒にDLして、CPadから起動すると結構自動的にやってくれる感じで楽ではあるよ
C言語で、XMLのデータを抜き出す作業について詳しい人いますか?
>c言語を独習しようと思ってフリーソフトのlsic330試食版を >ダウンロードしたのですが、それからどうすればいいのか >わかりません。誰か教えてください。 素人なら、まずLinuxをこんぴうたにインストールしろ。 そうするとgccが使えるようになる。 ... まあ、Windowsが使えなくなることもたまにあるが、 CD boot linuxでgo.
787 :
デフォルトの名無しさん :03/06/03 19:22
>>785 漏れとしては、perlで作った方が作業効率は早そうに100XML。
正規表現とかに強いし、何なら連想配列もある。
まあ、phpで組めばもっとえげつないものもできるけどな。
Ruby がいいよ。
>>782 783 784 786
どうもありがとうございました。
791 :
デフォルトの名無しさん :03/06/03 19:45
グローバル変数とgotoはタブーなんでしょうか・・・
>>787 の「まあ、phpで組めばもっとえげつないものもできるけどな。」にワロタ
PHPって直接タグ抜く関数もあったね。
>>791 使い方の問題。
タブーではない。
gotoの扱いは注意すべきです。
gotoを初心者(無知な人間)が使うと大変です。
gotoは初心者は使っては逝けません。
gotoは使っては逝けません。
となっているだけ。
名前が後藤だと、この業界への就職が極端に不利です 残念でしたね
>>794 漏れがことごとく就職に失敗したのはそのせいだったのか…
名前が須藤だと、ネットワーク管理者の採用に不利です 可哀相に
あのーくだらないこと聞いてすみませんが、ユーザの入力を求めて 入力が正しくない場合は再度入力を求める処理は以下で間違っているでしょうか? 何も入力しなくても文字数の限度を超えてもスルーされてしまうのですが… printf("項目「ID」の値を入力してください。\n"); while(fgets(p->ID, 5, stdin) == NULL) printf("入力が不正です。もう一度入力してください。\n");
>>797 間違っている。
何も文字を入力しない場合でも改行を入力するので、
p->ID に "\n" が入れられて fgets 成功。
文字数の限度を超えても fgets は失敗しない
(残りは次の fgets の時に得られる)ので、fgets 成功。
よってどちらの場合においても NULL は返ってこない。
入力された文字をチェック汁。
分かりました。ありがとうございます
800 :
デフォルトの名無しさん :03/06/03 22:25
800get
XMLから データの抜き出す作業なんですが 今、 データがいくつかあるかわからないので リスト構造体 typedef struct node{ xmlChar *agent_name; struct node *next; };NODE って作りました。
int parse_parties(xmlDocPtr doc, xmlNodePtr cur, node NODE) { NODE *head; NODE *p; *head = NULL; 子ノードへ移る作業を行い while(cur != NULL){ cur = cur -> xmlChildrenNode; if(!xmlStrcmp(cur->name,(const xmlChar *) "name" )){ p=malloc(sizeof(NODE)); if(!p){ エラー処理 p ->agent_name=xmlNodeListGetString(doc, cur->xmlChildrenNode,1) p -> next = head; next = p; } cur = cur -> next; } } return 0; } と作ったのですが、 おかしいとこありますか?
803 :
デフォルトの名無しさん :03/06/04 00:04
C言語をおもしろおかしく学びたいです。こつを教えてください。
804 :
デフォルトの名無しさん :03/06/04 00:06
>>802 > *head = NULL;
間接参照していいのか?
>>802 > };NODE
セミコロンの場所が
>>802 > , node NODE)
おいおい
あ };NODEは ミスです^^;
やっぱ 引数かぁ・・・ 引数がわからん・・
微妙です。 型って int とか charとかですよね?
便乗質問ですが、
>>797 のような場合入力値チェックするとき
何百文字入力されようとfgetsが成功してしまうのなら
入力された値が4文字以内かどうかをチェックするには
どうすればいいんでしょうか??
if文を使ってそのプログラムを また最初からはじめるプログラムを書きたいのですが goto文以外のやり方がわかりません 教えてください
どんなプログラムか知らないけど、gotoで実現できるなら それでいいんじゃないの?}
>>812 fgetsは
・指定されたサイズに達した
・\nが現れた
・EOFに達した
のどれかまで読んでreturnする。
だから、規定の文字より一文字多く読んで
・EOFに達した(fgetsの値がNULLだった)場合
・文字列の末尾が\nだったら、規定の文字数である
・そうでない場合、strlenで規定の文字数以下であるか判定する
・EOFでなかった場合、文字列の末尾が\nだったら規定の文字数である
というふうに判定するかな。文字列の末尾が\nだったら、は文字列に\nが含まれていたら、でもいい。
816 :
デフォルトの名無しさん :03/06/04 03:32
素数を発見するためにエラトステネスのふるいを用いて、素数発見を 行おうと思うのですが、配列を用意してもフラグにしか使わないので 1ビットずつ使いたいんです。そこで調べてみたら、ビットフィールドとか なんたらをマスクして、とかあったんですけど、いまいちよく分かりませ ん。要するに、中身がそれぞれ1ビットずつの配列を作るにはどうすれ ばいいのか教えてください。できれば、ソース付で・・・・
>>816 struct で unsigned で ビットとかにできるけど、
ビット演算するなら、そのまま ビット演算し使った方が早いよ。
818 :
デフォルトの名無しさん :03/06/04 04:03
fgets(buf , c , stdin)があっても入力を受け付けずに 素通りしてしまうことがあるのはなぜなんでしょうか? fgets(); fgets(); ・・・ と5つくらい入力を続けるのですが、一番上のfgetsだけ素通り、 2つ目からは正常に入力受付のカーソルが出ます。 こんなことってありますか?
cが0なんじゃないの
1もダメだ
済みません、書き方が悪かったですね・・ どれも最低でも5以上です。いろんな箇所でfgetsを並べて使ってますが、 どれも一番上や単独使用の場合は素通りされて、2つ目以降は入力を求められます。
ていうか、俺のVCおかしい…? if(・・・) ・・・ else ・・・ でifの処理が実行された後にelseが実行されたりするし…どーなってんだ もう何がなんだか・・・
ソース晒せ。
謎は解けた…下のようなことやってるんですが、fgetsで入力した後 error2が出た(文字数制限を越えた)場合、ループの最初に戻って またfgetsに来るんですが、ここで勝手に値が入力されて先に進んでるようなのです。 溢れた分が勝手に入力されてるんでしょうか?これを防ぐ手段はないでしょうか? printf("値を入力してください。(最大3桁)\n"); while(1){ if(fgets(buf, 7, stdin) == NULL) printf("error!もう一度入力してください。(1)\n"); else{ if((np = strchr(buf, '\n')) == NULL){ printf("error!もう一度入力してください。(2)\n"); } else{ *np = '\0'; /* '\n'を'\0'に置き換える */ break; } } }
826 :
デフォルトの名無しさん :03/06/04 05:48
#include<stdio.h> main() { int x; printf("Are you 2chner? Yes:1 No:2\n"); scanf("%d",&x); switch(x){ case 1: printf("You are 2chner!\n"); break; case 2: printf("You are'nt 2chner\n"); break; return(0); } }
>>818 戦略ミス。
fgets()で読めなかった文はバッファに残るので、読み捨てる必要がある。
なので、いっそ丸々読みこんでから判断する方がいい。
>>827 どうもです。バッファに残った分は次にユーザ入力を求める場合に
勝手にそれを入力としてしまうということですか。
しかしプログラムで最初にfgets()が呼ばれた時にスルーされてしまうのは
何故なんでしょう・・・その前にはscanf()による整数の入力しか行ってないんですが。
丸々読むにしても、読み込む配列に制限があるので
出来ればバッファを読み捨てる方法を教えていただけないでしょうか。
>>818 だからscanf()は使うなとあれほど・・・
scanf()使わずにどうやって数値をint型変数に入力するんですか??
strtol() をおすすめします。
835 :
デフォルトの名無しさん :03/06/04 12:37
p->nというのがあったんですけど、この->はどういう意味なんですか?
->は、ポインタ演算子というものです。 検索してくり。
(*p).n
>>816 #include <limits.h>
void set_bit(unsigned char *buf, int index, int value) {
unsigned char *p = &buf[index / CHAR_BIT];
if (value)
*p |= (1 << index % CHAR_BIT);
else
*p &= ~(1 << index % CHAR_BIT);
}
int get_bit(unsigned char *buf, int index) {
return buf[index / CHAR_BIT] & (1 << index % CHAR_BIT);
}
こんな感じかな。テストしてないよ。
>>839 補足。配列のサイズ(保持するbitの数)をNとすると、
確保すべきunsigned charの配列aのサイズは、
unsigned char a[N / CHAR_BIT + 1];
ね。
>>839 即レスまじ感謝です。そこで、申し訳ないんですが使い方を教えていた
だけるとうれしい次第であります。なにぶんCは初めてでして
>>841 そんなに難しくはないと思うんだが、使い方がないとやっぱりよくわからんかw
まず、情報を保持するバッファを用意する。これはunsigned charの配列でとる。
大きさは
>>840 参照。
んで、インデックスiのビットを1にしたいときはset_bit(a, i, 1);ってやる。aはバッファね。
同様にビットを0にしたいときはset_bit(a, i, 0);ってやる。
インデックスiのビットがセットされてるかどうかをチェックしたいときは、
get_bit(a, i);ってやる。0が反ってきたらセットされてない、それ以外のときはセットされてる(1でないことに注意)。
使用例
#define N 100 /* 保持するbitの数 */
void print_bit(unsigned char *buf, int index) {
printf("index %d: ", index);
if (get_bit(buf, index))
printf("on\n");
else
printf("off\n");
}
int main(void) {
static unsigned char a[N / CHAR_BIT + 1];
set_bit(a, 5, 1); /* 5番目のbitをon */
print_bit(a, 5); /* どうなってるか出力 */
set_bit(a, 5, 1); /* 5番目のbitをoff */
print_bit(a, 5); /* どうなってるか出力 */
return 0;
}
未だに解らない・・・ scanf()でintに小さな整数を入力するだけならオーバーフローは 起こらないはずですよね?なのに何故かその後特定の箇所で 入力受付(fgets、scanf)がスルーされます。 (正常に入力を受け付ける箇所もある) しつこくて済みませんがこの原因をどなたか教えてください。 C言語始めたばかりの頃演習やらでscanf使いまくりだったけど こんなことに一度も出くわしたことないんですが・・
h抜くな
ハァ?
>>843 だから scanf() は使うなよ。
代わりに fgets() と sscanf() 使え。
どうせ、"\n" がバッファに残ってるってことだと思う。
インクリメント デクリメントの詳しい説明してるサイトが見つからない 本当は1を足したり引いたりするためのものじゃないと聞いたのだが
849 :
デフォルトの名無しさん :03/06/04 19:58
850 :
デフォルトの名無しさん :03/06/04 19:58
>>848 1足したり引いたりするためのものです。
もちろん、++や--のことだよね?
はいa++とか
++a と a++ の違いはあまり気にするな。 それを活用すると、最悪、最適化を阻害することもある。 まぁ、C++ を使う事があるなら、 演算子のオーバーロードする時は ++a の方が実装しやすいということだけは言っておく。
854 :
デフォルトの名無しさん :03/06/04 21:16
13とか1以外が足されたりすることがあるらしいんですが
typedef unsigned char uchar3[3] これってどういう意味かわかりますか?
>>848 ポインタのことを言ってるような気がするが、それならば気にする必要はない。
858 :
デフォルトの名無しさん :03/06/04 22:24
オブジェクトによって使わないメンバもいくつか持つ構造体を1つ作るのと 必要なメンバだけを持った似たような構造体を複数作るのどっちがいいと思う? 要はC++で言う継承をスマートな形でCで実現したいのだが。。。
char line[100], *p; ・ ・ fgets(line, sizeof(line), stdin); ・ ・ for(p = line; *p; p++); printf("Line size = %d\n", p-line); ・ ・ というソースで、 for(p = line; *p; p++) のところがよくわかりません。*pというのが範囲なんでしょうか? どなたかお教えください。
860 :
デフォルトの名無しさん :03/06/04 22:28
>>858 >オブジェクトによって使わないメンバもいくつか持つ構造体を1つ作るのと
>必要なメンバだけを持った似たような構造体を複数作るのどっちがいい
継承自体わかってないんじゃないかという気がする。
*pは*p != '\0'
863 :
デフォルトの名無しさん :03/06/04 22:30
>>859 配列lineの内容が文字列だとしたら、最後に'¥0'(=0)があるわな。
for文の第2式が偽(=0)になればループが止まるから、そいつを利用
してるんだよ。日本語下手ですまん。
865 :
デフォルトの名無しさん :03/06/04 22:51
ただバイナリにしたいだけなんですが シェルスクリプトと同等のCのプログラムを作るにはどうしたらいいですか? mkdirとかcdとかわかりません
866 :
デフォルトの名無しさん :03/06/04 22:57
unixコマンドのソースを教えてください てことです
なんでそれがシェルスクリプトと同等なんだろう。
/* false.c */ #include <stdlib.h> int main() { return EXIT_FAILURE; }
ぼうやだからさ
シェルスクリプトでかいたのをCで書きたかっただけです 意味不明ですみません
>>860 継承自体わかってない>それはない
お前の読解力か俺の文章化能力が足りないだけ
具体的に言うと3Dゲームで3Dモデルとビルボードが混在している
こんなとき両方とも描画オブジェクトの
派生クラスとしていっしょに管理したいだろ?
これをCでやるとき構造体を1つにまとめるのか?個別にしてをキャストで使い分けるのか?
お前等ならどうする?
>>877 素直にC++使う。
つうかCでやるなら基底クラスに相当する構造体を
派生クラスの構造体のメンバーに持たせちゃうかなあ。
typedef struct {
int boke;
char *vaka;
} base_class;
typedef struct {
base_class base;
long mona;
} delivered_class;
Cでは継承なんてあんまり考えんでプログラム組むからのう…
880 :
デフォルトの名無しさん :03/06/05 00:52
makeでターゲットディレクトリをビルドしたいときコマンドラインでどのよ うに記述したらいいですか? コンパイラはBorlandのフリーのbcc5.5です。
>>865 >unixコマンドのソースを教えてください
マジで ?
>>869 BSDやらLinux系ディストリは全部ソースがありますが?
それを全部ここに出力せいと?
884 :
デフォルトの名無しさん :03/06/05 01:08
gets() と scanf() は何が違うのでしょうか?
>>883 よし、俺がやってやろう。
次スレの用意も頼む。
>>884 標準入力から読み込むこと以外、共通点はないよ・・・・
887 :
動画直リン :03/06/05 01:13
888 :
デフォルトの名無しさん :03/06/05 01:16
すいません! 1〜10まで順番に足していくプログラムが解りません! ソースお願いしますm(__)m
int n = 10, sum; sum = n * (n + 1) / 2;
890 :
デフォルトの名無しさん :03/06/05 01:20
888です! すいません! コンパイラはcygwinです! m(__)m
>>889 仕様を満たしていないから駄目。
1〜10までを足した値を得るのではなく、1〜10までを順番に足すプログラムでなければならない。
main() { 1+2+3+4+5+6+7+8+9+10; }
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
マケタ
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> void main(void) { char moji; /* 文字列の一時的な格納領域 */ int len; int number; /* 変換後の数値 */ while(1) { printf("数値を6桁以内に入力して=>"); rewind(stdin); scanf("%s",&moji); len=strlen(moji); if (len>=7) { printf("7桁以上です。\n"); } if (!isdigit(moji)) { printf("数値じゃありません。\n"); }
number=atoi(moji); if(number>0) { printf("プラスです。\n"); } else if(number==0) { printf("ゼロです。\n"); } else { printf("マイナスです。\n"); } } } エラーが error C2664: 'strlen' : 1 番目の引数を 'char' から 'const char *' に変換できません。 (新しい機能 ; ヘルプを参照) 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。 error C2664: 'atoi' : 1 番目の引数を 'char' から 'const char *' に変換できません。 (新しい機能 ; ヘルプを参照) 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。 cl.exe の実行エラー と出るんですけど分かりません
898 :
デフォルトの名無しさん :03/06/05 01:28
>892 間違った! GNU Cコンパイラだ! 1+2+3+4… ちがーう!(゚А゚)
moji[]でいいの?
あげ
さげてた。逝ってきまつ
さげてた。逝ってきまつ
int val, ans = 0; for ( val=1; val<11; val++) { ans += val; }
#include <stdio.h> main() { int n,mushi; printf("1から10までの整数を加算するプログラム\n"); for(n=1;n<=10;n++){ do{ printf("%d",n); printf("を入力してください。数字以外の入力は動作を保証しません。\n"); scanf("%d",&mushi); }while(n!=mushi); }; printf("答は55です。"); }
>>906 少なくともコンパイル通る様にしろよ。
一目で分るぞ。
for(;;){};←なんだ?
>907 >909 寝言はコンパイルしてから言え。
911 :
デフォルトの名無しさん :03/06/05 04:11
>>910 頼むからこうしてくれ。
#include <stdio.h>
main()
{
int n,mushi;
printf("1から10までの整数を加算するプログラム\n");
for(n=1;n<=10;n++){
do{
printf("%d",n);
printf("を入力してください。数字以外の入力は動作を保証しません。\n");
scanf("%d",&mushi);
}while(n!=mushi);
}
;
printf("答は55です。");
}
分からない。誰か訂正したプログラムキボンヌ!! スマソ。
空文(「;」のみからなる文)
>>912 char moji; → char moji[774];
scanf("%s",&moji); → scanf("%s",moji);
その位置に;がついていたとしても、 コンパイルは無事にとおるだろうし意図したとおりに動作はするだろう。 しかし通常そのような余計な;はつけないな。
918 :
デフォルトの名無しさん :03/06/05 06:15
整数の場合、++を繰り返すといつかオーバーフローしますが、 不動小数点数の場合はオーバーフローしないのですか? 寝る前に作ったfloat型の変数をインクリメントし続けて、 インクリメント前の値と比較するテストプログラムが いまだにCPUフル稼働で動きつづけてます。 ログを見ると274877906945.000000まで逝ってます。
void StringCopy(char *s1, const char *s2) { while (*s1++ = *s2++) ; } これってs2がヌルぽになったら偽になるらしいですが何故???
*s1もぬるぽになるから
922 :
デフォルトの名無しさん :03/06/05 07:29
#include<stdio.h> int main() { int d,k,l,num[100][100],dan[100],sum,sumt,m,n,po; /*d:段数 k:きざみ若しくは現在の段 num:データ配列 dan:各段の現在のポインタ*/ /*sum:合計 sumt:最大合計 m,n:予備 po:ポインタ位置修正用変数*/ -------------------------------中略--------------------------- /*以下、計算処理*/ for(k = 1;k <= d;k++){dan[k] = 1;} for(l = 1;l <= 100;l++){ sum = num[1][1]; for(k = 1;k <= d;k++){sum = sum + num[k][dan[k]];} for(k = 1;k <= d;k++){printf("%d",num[k][dan[k]]);} printf("=%d",sum); if(sum > sumt){sumt = sum;}/*ここまで正常*/ for(po = d;po >= 2;po--){ if(dan[po] = dan[po-1]){ /*異常*/ for(m = po;m <= d;m++){dan[m] = dan[m] + (po - m + 1);} po = 1; } } printf("\n"); } printf("biggest = %d\n",sumt); return 0; } d段のピラミッド上に並んだ数を右・左に一個ずつ移動しながら降りていき、 その道筋の合計値が一番高い物を求め、出力するプログラムなのですが・・・ 異常と示してある部分で、if分に入る際にどうやらdan配列の中身が全て1に 戻ってしまうようなのです。(前後で出力して確認しました)これはどのような原因なのでしょうか・・・?
>>922 適当にこたえるけど
>if(dan[po] = dan[po-1]){ /*異常*/
= じゃダメでしょ。
*s1に*s2を代入できないから偽ってことです?? 意味わからん!
>while (*s1++ = *s2++); do { *s1 = *s2; s1++; s2++; }while(*s1) コウナル
,l' ::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::. | はめはめ〜 l ::::::::::::::::::::;;;;;;i;;;;;;;;;;;;;;;;;;;;:::::::::::::::::::: i i i, ..::::: ○:::::::;;;;/;;;;;;;;;;;;;;;;;;;;:::::::::::::::::: ! / i ..::::::::::::::::::::::;;;/;;;;;;;;;;;;;;;;;;;;;;:::::::::○:: i' / 'l, ..:::::::::::::::::::::::::::/|、;;;;;;;;;;;;;;;;;/::::::::::::::::: ,i' / i, .::::::::::::::::::::::::::/::| ~"''''"/::::::::::::::::::: / / ' ., :::::::::::::::::::::::/:::::|'⌒`ヽ,/;:::::::::::::::::: / / `・、., ::::::::::::::/;::::::,人,__,/;;;;;::::::::::::::// ~--‐ ' -''"_/
>>925 はwhileの継続条件の*s1がぬる文字だから偽になるのです?
ぬる文字だったら偽になるのでしょうか?
0だからね
え?
>>925 ってミスなの?
せっかくとりあえずだけど納得できたのに・・・
どこがミスなのでしょうか?
>while (*s1++ = *s2++); do { *s1 = *s2; s1++; s2++; }while(*s2) こうかな?
敢えて展開するなら do { c = *s1 = *s2; s1++; s2++; }while(c); s1++されるのは条件判定後である点に注意
>>917 同意。そんなソースで作りつづけていたら、そのソースを見た人間が
for(〜;〜;〜){
};
を正式な構文として誤認識する恐れがある。
普通、コメントとかは別だが、動作に無関係なものは入れないように配慮する。
っていうか、いったいどうやったらそんなコード書くようになることやら...
漏れは要らない{〜}とか(〜)とか結構付けているからなぁ
よくmain(int argc, char *argv[]) ってみるけどこの引数って何すか? どんな意味が?
プログラムをコンパイルするとき、gccなら gcc test.c -o test -O3 とかってやるよな?これはgccに色々パラメータを与えてるんだ。 プログラムを実行するときに、与えられたパラメータを読み込むのに使う。 argcは何個パラメータがあるか、char *argv[]はその内容だ。 以下を試してみてくれ。 #include <stdio.h> int main(int argc,char *argv[]){ int i; for(i=0;i<argc;i++){ printf("[%5d] - %s \n",i,argv[i]); } return 0; } $ ./a This is a pen. [ 0] - ./a [ 1] - This [ 2] - is [ 3] - a [ 4] - pen.
>>漏れは要らない{〜}とか(〜)とか結構付けているからなぁ 考えようだが、基本的に if(a==0)a=10; というような書き方してると、elseとの対応がわからなくなる可能性もあるので、 if(a==0){ a=10; } という書き方の方が望ましいかと。どうせコンパイルした結果は変わらないだろうし。
>>940 追加する時もうっかりミスが減るしね。
()は優先度をわかりやすくするときにも使うかな。
if ((a >= 0) && (a <= 10))とか。
for(i=0;i<100;i++){ int a=10; if(a*i == 1) printf("%d\n",a); } というようなfor文の中に、変数宣言をした時は 毎回変数の領域を確保するのか それともコンパイラが最適化してくれるのかどっちなんでしょうか?
>>942 その場合、レジスタに直接割り当てられる「可能性」もある
945 :
デフォルトの名無しさん :03/06/05 14:58
printf("%e",…… と書くと 8.000000e+001と出力されます 001の方の桁数を変更することはできないのですか? ちなみに8.000000の桁数の変更はわかります
946 :
デフォルトの名無しさん :03/06/05 14:58
printf("%e",…… と書くと 8.000000e+001と出力されます 001の方の桁数を変更することはできないのですか? ちなみに8.000000の桁数の変更はわかります
>>946 指数部の桁数は処理系依存じゃなかったかな。
数字反転のプログラムで 12345 → 54321 12300 → 321 0 → 0 という風に作りたいのですが、0の場所をどうすればいいかどうしても分かりません。 どなたか教えてくれませんでしょうか?
オーバーフロウしない範囲なら数値にした後、数字列に戻す。
>>948 1.変換したい数値を文字列に変換
2.変換した文字列を反転
3.反転した文字列を数値に変換
これで OK
952 :
デフォルトの名無しさん :03/06/05 22:08
関数が暗記できません!!!!!
>>948 反転したあと文字列の先頭から'0'判定して、
'0'の数だけmemmoveでもいんじゃない?
これなら何桁でもオーバフローしない。
あるいは、反転する前に1の位から上位に
判定していって、'0'以外の数字が見つかった
ところから処理をはじめるとか。
>952 暗記じゃない。理解汁
テストプログラム動かしっぱなしで家を出て、 帰って来て見たけど、まだ動きつづけてる。 ログによると、2199023255553.000000を超えているらしい。 インクリメントでfloatをオーバーフローさせるのは相当遠いらしい。 もぅやーめた。
つーか、そのうち精度をオーバーして空回りするよ。
957 :
デフォルトの名無しさん :03/06/05 23:49
FLT_MAXを入れて1.0を足してみればいいのに。
float x = 0; for(;;) { float y = x; ++x; if( !( x > y ) ) { // このときの x の値を調べたかったのです } }
960 :
デフォルトの名無しさん :03/06/06 00:35
>>955 浮動小数点数で遊ぶときは、ちゃんと例外処理を入れといた方がいいよ。
#include <stdio> main() { float f; for (f=1.0 ; f+1>f ;f=f*2); ; printf ("%e\n",f); for(f=1.0 ; f+1>f ; f=f*2+1); ; printf ("%e",f); }
#include <stdio> main() { float f; for (f=1.0 ; f+1>f ;f=f*2); ; printf ("%f\n",f); printf ("%f\n",f-1); printf ("%f\n",f-10); printf ("%f\n",f-1000); printf ("%f\n",f-10000); }
二分探索で見つけた値をいじってみたんだけど、 ++とか--でこっそり数億かわってる・・・。 あぶねぇ。・・・アァ、アノコードシュウセイシナキャ・・・
>>918 浮動小数点数は一度に数桁しか表現できないから、
数が大きくなってくると 1 足しても何も起こらなくなっちゃうよ。
なんでfgetsは読み込む文字数を制限できるのに、getsはできないようにしたんでしょうね。
歴史的に順番が逆なんでねえの? gets が読み込む文字数を制限できなかったから fgets で読み込む文字数を制限できるようにした、と。 よく知らないけど。
967 :
デフォルトの名無しさん :03/06/06 07:10
プログラムの終了時にexit,returnを入れると思うのですが、 その2つの違いがよくわかりません。 どのように違うか、わかりやすく教えてください。 よろしくお願いします。
>>967 return → 関数の処理を終了する
exit() → プロセスの処理を終了する
アホ丸出しの質問で悪いんだが
>>2 のリンクにあるホームページでgccって
どこでダウンロードすればいいんだ?
教えて君でスマソ。
良く読んだら言葉足らずだな… gccのHPのどこで、どのコンパイラをダウンロード すれば一番良いのかと、聞きたかったんでつ…・゚・(ノД`)・゚・
>>972 OSによってちがう。
windows ならCygwin かMinGW。
>>973 thx。
windows使ってるんでそれでやってみるYO!
昨日から勉強始めました。C machineてソフトを使って、教本に載ってる例を参考にしながら自分で書いて動作確かめながらやってるんですが、同じように書いたと思うんですがエラーが起きます。 何度も見直したんですが解らないので・・・凄い単純な見落としがあるかも知れないんですが。 /*if文と等価/関係演算子*/ #include <stdio.h> main() { int a,s; printf("整数を二つ入力して下さい\n"); printf("それらが満たす関係を示します: "); scanf("%d %d",&a,&s); if (a==s) printf("%dは%dと等しい\n",a,s); if (a!=s) printf("%dは%dと等しくない\n",a,s); if (a<s) printf("%dは%dよりも小さい\n",a,s); if (a>s) printf("%dは%dよりも大きい\n",a,s); if (a>=) printf("%dは%d以上である\n",a,s); if (a<=s) printf("%dは%d以下である\n",a,s); return 0; }
>>975 エラーが出ますとだけ書いて、エラーの内容を書かないやつは
聞く気がないんですよね。
あとCmachineとかいうのは使っちゃいかんとあれほど… あれはC処理系じゃないのでこのスレで質問するのはスレ違い。 出てるのは文法エラーとかsyntax errorとかだろう。 下から2番目のifの条件式が変だぞ。
このプログラムの出力結果の説明をお願いします。 1.〜 2.〜 という感じで。 #include<stdio.h> main() { char a[10]; int n,k,i,j,l,m,h,g; scanf("%d %d",&n,&k); for(i=0;i<n+1;i++) if(i%2==1) a[i]='*'; else a[i]=' '; g=0; if(n%2==0) g=1; for(i=0+g;i<n+g;i++) for(l=0;l<k;l++) { h=0; if(i%2==0) h=1; for(j=0+h;j<n+h;j++) for(m=0;m<k;m++) printf("%c",a[j]); printf("\n"); } } おかしな出力結果になったら教えて下さい。ではお願いします。
意味がよく分からない。宿題?
とりあえず次スレ先頭に「C machineはCに非ず」を書くこと求む。
>>979 レポートを提出しなければいけないので。
>>981 宿題スレがあるのに、なんでわざわざここで?
次スレ立てないの?
イラネ。
どうして、 ・0 && 1 || 1 : 真 ・0 && (1 || 1) : 偽 ・1 || 1 : 真 なんでしょうか。 どうにも理解できませんです。
1 > || 1 これだけで真 2 > 0 && これだけで偽 3 おいおい。
0が偽、非0が真ということを知らないのかな?
申し訳ない…今気づきました。 ただそれだけのことだったのね。 ホンマすいません。
>>987 おいおい1と2の説明を合わせたら、1がわからなくなるだろ。
名前書き忘れ、989=986でした。 こんなあほらしいこと聞いちゃってホントすいません。。。
! 0 && (1 || 1) これは?
1
新スr(PAM!
>>980 > とりあえず次スレ先頭に「C machineはCに非ず」を書くこと求む。
テンプレ追加
1000
いーつーもーかがやいていたね!!
--- 僕の前に1000はない。 --- 僕の後ろに1001はできる。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。