2 :
デフォルトの名無しさん :02/11/04 20:30
そし
そです
1000行くぞゴルァ。
ああ、タイトルとともにまたレベルが下がるのか。 ああ・・
ここはObjective-Cの話題を持ってきてもいいんですか?
マ板の語尾にゴラァ!を付けるスレッドもよろしく 宣伝スマソ
level=level--; /* levelが1下がる */
13 :
デフォルトの名無しさん :02/11/04 20:52
CとC# の違いを教えてください。
>>13 適当なソースコード探してきて比較して見な。全然違う。
>>14 VC++.NETとVC#.NETのパッケージのソースコードの写真でわかりますた。
ご迷惑かけますた。
16 :
デフォルトの名無しさん :02/11/04 20:55
最初<サンキュー> って見たとき何を感謝しているんだ?とマジで思った・・・ 鬱だ・・・
18 :
デフォルトの名無しさん :02/11/04 21:01
math.hでa^bという計算をしたいのですがどうすればいいでしょうか?
>>18 a^bはビットごとのXORですが。
べき乗(だっけ?)ならpow()で。
20 :
デフォルトの名無しさん :02/11/04 21:02
>>18 pow(a,b);
でいいんじゃなかったっけ?
違かったらスマソ。
char s[512]; char *sp; sp = s; printf("s = %d\n", sizeof(s)); printf("sp = %d\n", sizeof(sp)); これが同じにならないのは何故ですか?
ポインタと配列は違うからデス。
>>21 下はポインタのサイズ(きっと4バイトだろ?)
上は配列のサイズ(512バイト)
25 :
デフォルトの名無しさん :02/11/04 21:25
var_end(ap);で何かやってる処理系ってありますか? 何もしないのも多いと思いますし、必要ないともおもえるんですが...
26 :
デフォルトの名無しさん :02/11/04 21:31
CとC++ の違いを教えてください。
ありがとうございます。
>>21 の状況で
spからsのサイズを出すことはできないのでしょうか?
>>27 できない。
だから一部の標準関数はサイズを引数として渡す。
30 :
デフォルトの名無しさん :02/11/04 21:37
関数をポインタで使う方法について教えてください。出来れば例をのせていただけると助かるのですが。 お願いいたします。
>>30 夕方あたりにちゃんと書いたのに無視なんですか?
悲しいです。
>>30 本に載っていないのかな・・・
#include <stdio.h>
int main()
{
int (*myputs)(const char *);
myputs=puts;
myputs("putsと同じように使える。");
return 0;
}
もちろんこのコードにはなんの意味もないから。 実際はqsortライブラリ関数なんかでうまく使われているよ
そもそも関数へのポインタを使わなければならないのはどんな状況かお分かり? それが分かってれば、前スレの終わりには関数へのポインタを使ったのがいくつかあったと思うが。
>>24 疑問なんだが、なぜ4バイトだと思う??
2バイトじゃないのか?
#include<stdio.h>
main()
{
int* a;
long* b;
char* c;
double* d;
puts("int* a");
puts("long* b");
puts("char* c");
puts("double* d");
printf("\n");
printf("sizeof a...%d\n",sizeof a);
printf("sizeof b...%d\n",sizeof b);
printf("sizeof c...%d\n",sizeof c);
printf("sizeof d...%d",sizeof d);
}ちなみに漏れのポインタ変数の確保するサイズは2バイト。
きっとCPUが286なのれす。
ドス窓のことか? OSはWindowzeだけど。
>>37 どういうことですか?
詳しく聞きたいです。
>>35 「きっと」4バイト、と書いてある。
無論ポインタのサイズなどは処理系によって違う。
今ポピュラーな環境だとポインタサイズは大抵4バイトといっても
強ち間違いじゃないと思う。
ポインタサイズが2バイトの処理系というと、MS-DOSのsmall modelやら、
com (tiny) modelなんだろう。処理系で言うとLSI-C 86あたりか。
LSI-C 86の試食版でもfarポインタは扱えたと思うんで、
ポインタをfar修飾すればサイズは4バイトになる。
重ねて言うが、処理系によってこの辺は違う。
>>39 CPUがどんな感じにメモリを管理しているかの問題。
>>40 >>41 ありがとうございました。
>>40 かなりの知識の持ち主ですね。
前橋のポインタ完全制覇とか余裕そうです。
ちなみに、LSI-C(試食版)を使っております。
>>42 ここにいる奴の半分以上は余裕だと思われ。
複雑なようでわかれば簡単と。
>42 仕事にするなら完全制覇した上で就くのが当然。 それもやらんとゴミプログラマ雇ってる奴らが(以下略) 勉強がんばり〜。
>>43 もっと勉強します。
あと多少マルチスレッドになるんですが、
#include<stdio.h>
main()
{
char* color_name[]=
{
"hoge",
"piyo",
"hoge_p"
};
printf("%d\n",color_name); /*?*/
printf("%d\n",color_name+1); /*?+2*/
printf("%d\n",color_name+2); /*?+4*/
/*これは何故2バイトずつ進むのでしょうか?
char配列を指しているので、1バイトずつ進むと思うんですが*/
puts("");
printf("%s","aiueo");
}/*お願いします。*/
>>33 他にもatexitとかな。標準関数じゃないけどsignalとか。
signalのプロトタイプを初めて見たときは頭が真っ白になったよ(w
C FAQによるとsprintfって安全じゃないとのことですが snprintfが使えない人たちってどうやって回避してるのですか? やっぱC FAQの例みたいにファイルに書いたりしてるのでしょうか?
>>45 color_nameはcharの配列ではない。charのポインタの配列だ。
配列に入っているのは(char *)だ。
50 :
デフォルトの名無しさん :02/11/04 22:15
すみませんが教えてください。 C言語をはじめた3ヶ月、ほぼマスターしました。 ただまだGUIを使ったPGが作れません。何からはじめたらいいでしょうか?
>>47 堅牢性が最重要のプログラムで、
printfに渡すパラメータが信用できないときは
ファイルに一度書くだろうな。
そうでないときは、えいやってやっちゃうこともある(w
ま、大抵snprintfが使えるのでそっちを使っちゃうけど。
>>48 メモリの中では
color[0]つまり*(color_name) には hogeの先頭アドレスが、
colo [1]つまり*(color_name+2)には piyoの先頭のアドレスが、
color[2]つまり*(color_name+3)には hoge_pの先頭のアドレスが、
入っているんじゃないんでしょうか?
具体的に教えていただけると助かります。
訂正
>>48 メモリの中では
color_name[0]つまりcolor_nameにはhogeの先頭アドレスが、
colo_name[1]つまりcolor_name+2にはpiyoの先頭のアドレスが、
color_name[2]つまりcolor_name+3にはhoge_pの先頭のアドレスが、
入っているんじゃないんでしょうか?
具体的に教えていただけると助かります。
>>55 その通り。で、その先頭アドレスが君のLSI-C試食版だと2バイトなのよ。
マルチスレッドじゃなくてマルチポストだった
>>53 レスありがとうございます。
幸いsnprintfが使えるようですので、これを使います。
>colo_name[1]つまりcolor_name+2 ここ、激しく間違いネ。まだ54の方が間違いが少ないネ
>>57 マルチポストってなんでしょうか?
マルチスレッドとは違うスレッドでも同じことを書き込むことですよね?
環境はWindows2000です。使用しているコンパイラはBorlandC++です。 何からはじめたらいいでせうか?
>>54 その通り。君の処理系だとポインタサイズは2バイトだったな。
だとすると、こんな感じ。
前橋のポインタ本を持ってるようだから、
(実はおれも持ってる。知り合いなので、ご祝儀に買った(w)
205ページのFig.3-19ポインタの配列を見てくれ。
このようなイメージで格納されている。
配列color_nameの要素はあくまでポインタだ。
配列にはポインタがずらずらと格納されてる。
だから、ポインタのサイズが2のとき、
要素が一つ増えると、アドレスは2増えることになる。
>>64 知り合いなんですか???
やっぱり前橋さんは凄腕PGなのでしょうか?
いや、知ってるけどたいしたこと無いよ。
>>67 んなこたあスレ違いだ(w
残念ながら一緒に仕事したことはないが、
おれよりははるかに優秀なプログラマだと思うよ。
>>66 ありがとうございます。試してみます。
極めたらまたきます。
72 :
HP電卓、■に何が入るのかが分かんない :02/11/04 23:03
#include<stdio.h> #include<stdlib.h> struct list{ int data; struct list *next;}; void push(int y); int pop(); void print_stack() struct list *head=NULL; void push(int y){ struct list *p; p=head; head=new list; if(head==NULL){ printf("Stack overflow.\n"); exit(1);} head->data=■; head->data=■;} int pop(){ int y; if(head==NULL){printf("Stack underflow.\n");exit(1);} y=■;head=head->next;return y;} void print_stack(){ struct list *p; p=head; while(p !=NULL){ printf("%d",■); p=p->■;} printf("\n");} int main(){ int x,y,z; char s[10],c; while(1){ scanf("%s",s); c=s[0]; switch(c){ case'+':x=pop()+pop(); printf("%d\n",x); push(x); print_stack(); break; case'-':x=pop(); y=pop(); z=y-x; printf("%d\n",z); push(z); print_stack(); break; case'*':x=pop()*pop(); printf("%d\n",x); push(x); print_stack(); break; case'/':x=pop(); y=pop(); z=y/x; printf("%d\n",z); push(z); print_stack(); break; case'q':case'Q':exit(1); default:push(atoi(s)); print_stack();}} return 0;}
うう、出掛けててネット触れなかった間に次スレ立ってた・・・。 しかし、1 は何故 「課題丸投げ禁止」 を書いてくれなかったの? 関連リンクは 2 以降にして、1 は諸注意でかためて欲しかった。
74 :
デフォルトの名無しさん :02/11/04 23:14
前橋の本にあるさ、P104のソースで va_end(); ってなってて引数ないじゃん? これいいの?
>>46 初めて見たとき、シグナルを送るだけなのになんで関数ポインタが必要なんだ?と思ったよ。
シグナルを送るのはraiseだよな(w
>>78 うーん?
Cの範囲で書いていると思うけど?
なんか見落としているかな・・・
C99とかJISでしょうか?
85 :
デフォルトの名無しさん :02/11/04 23:28
>>75 サンクス!
それにしてもとんでもなく多かった・・・。
果たしてこの本使えるのか?
っていうかなんか前橋ってむかつくな
87 :
デフォルトの名無しさん :02/11/04 23:39
ポインターのサイズオフ ターボシーは2だったよ
>>89 へぇ、俺にTurboC++5.0Jは4バイトだが。
92 :
デフォルトの名無しさん :02/11/05 00:21
near,far
>>73 遅レスだが、ここは宿題すれじゃないから、
そもそも課題をここに投げちゃいかんと思う。
94 :
デフォルトの名無しさん :02/11/05 00:23
以降 あまりに環境依存・コンパイラ依存の話題禁止
今度の中間テストはポインタと構造体なんです。 全然わかりません(泣)
>>74 俺その本の第五刷持ってるよ!
23:va_end(ap);に直ってるよ。
>>91 ふ〜ん・・・買って来よ(以下略
つーかプログラミングって学校で学ぶようなものなのか?
俺は医学を専攻していたがなぜかプログラマだ。 スーパープログラマーKを目指している。 いつかあの鍛え上げられた肉体を手に入れ、 「なぜプログラマがそんな筋肉を……」の問いに 「必要だからだ!!」と答えるのが夢だ。 ……問題は、なぜ必要なのかが分からないことだ……
エネルギーを必要な時に必要なだけ供給できるように 体を鍛えておく必要がある。 とでも言っておけば?
四則演算もわざわざ学校で習うようなことじゃないよな。
学校で学ぶべきものなんて何一つないだろ。
以降 レ ス 禁 止
>>102 そんな奴らがロクに人間関係も作れないようなプログ(略
人とのつきあい方くらい独学で身につけられるだろ
Cスレだっつの
108 :
デフォルトの名無しさん :02/11/05 01:41
C で例外を実装する方法ってありますか? 特に 0 除算とかセグメンテーションフォールトとか・・・。
>>108 処理系によってはシグナルが飛んでくるかもしれない。
やっぱり処理系依存なんですね。 ありがとうございました。 # C++ の例外の実装ってどうなってるんだろう・・・。
>>110 C++の例外はハードエラーは補足できないよ。
setjmpとlongjmpに近いと思われ。
>>108 0除算はSIGFPE、セグメンテーションフォールトはSIGSEGV
を処理すればできそう
__try{}__except{}__finally{}__leave
115 :
デフォルトの名無しさん :02/11/05 02:07
スタックの基本的な問題で入力した文字を覚えていく問題に PushDown関数に戻り値(スタックオーバーフローに検出を行い、 エラーの場合エラーコードを戻り値にして返すようになっているか) という条件がついているのですが意味がよくわかりません。 解説してもらえませんか?
117 :
デフォルトの名無しさん :02/11/05 02:09
>>115 用意されたスタック(まあこの場合は配列か何かだろ)以上にデータを積もうとしたらエラーコードを返すってことでしょ。
s/スタック/スタックのサイズ/ まあ分かると思うが
最近は助詞もまともに使えない奴がいるのか…。 プログラム言語の前に日本語勉強してくれよと言いたくなる。
>>119 2ちゃんねるでわざわざ誤植を指摘すんなよ。
コマンドライン引数ってよくわかりませーん。 何がわからないのかって? 独習Cで「main()関数の引数を指定する」という項目で、コマンド(略)の事が書いてるんですけど まったく同じコーティングしてビルドしても何もなりません。 VC++を使っております。atoi関数などももう少し詳しく教えて欲しいです
122 :
デフォルトの名無しさん :02/11/05 07:58
コーディングガオカシインダロ
分割コンパイルについて質問です。 AというファイルとBというファイルがあります。 Aというファイルで作成した構造体やクラスのオブジェクトと ファイルBで扱いたいのですが、ヨクワカリマセン!! HELP!
分割コンパイルについて質問です。 AとBの2つのファイルをコンパイスしようと思います。 そこでAというファイルで作成した構造体やクラスのオブジェクトを ファイルBで扱いたいのですが、ヨクワカリマセン!! HELP!
>>124 「Aというファイルで作成した構造体」をヘッダファイルで定義しろ
AとBの2つのファイルにそのヘッダファイルをincludeしろ
「コンパイス」のやり方は俺は知らん。googleに聞いても分からなかった。
127 :
デフォルトの名無しさん :02/11/05 14:50
128 :
デフォルトの名無しさん :02/11/05 15:20
staticを付けたら、ソース内で同一アドレスにあるってことはさ 例えばforで繰り返し処理してインクリメントしまくったあと その複文を抜けても、値を維持してるって事? あとstaticを付けたら、0で初期化されるってマジ?
>>128 > 例えばforで繰り返し処理してインクリメントしまくったあと
> その複文を抜けても、値を維持してるって事?
試 し て み ろ 。 す ぐ 分 か る
> staticを付けたら、0で初期化されるってマジ?
マジです。浮動小数点なら0.0、ポインタならNULLで初期化される
ことがANSI-Cでは保証されてます
130 :
デフォルトの名無しさん :02/11/05 16:11
>>129 試しますた。分かりますた。
でもメモリ管理とかまだよく分かってないんで、
いろいろ勉強するYO!
待ってろビルゲイツ。
130 は何を企んでいるのか (((( ;゚Д゚))) ガクガクブルブル
Cファイルが拡張し付いてない状態の時のアイコンなんですけど、 どうしたらCファイル専用のアイコン(Cとだけ書かれたシンプルなアイコン) になるんでしょうか?
>>132 初心者板にでも行ってファイルの関連付けについてでも教えてもらってください。
スレ違い。
134 :
デフォルトの名無しさん :02/11/05 17:03
#include <stdio.h> int main() { int n, i, j; char gazo[1000][1000]; n = 5; for (i = 0; i <= (n-1); i++) { for (j = 0; j <= (n-1); j++){ if (i == 0 || i == (n-1) || j == 0 || j == (n-1)) gazo[i][j] = '*'; else gazo[i][j] = ' '; } } for (i = 0; i <= (n-1); i++) { for (j = 0; j <= (n-1); j++){ printf("%s", gazo[i][j]); } printf("\n"); } return 0; } なんで動かないんだーーー
>>134 デバッガでトレースしてください。
わからなければ printf() デバッグしてください。
その苦労をサボりたいならすれ違いなので添削スレに逝ってください。
>>134 gccだったら-Wallを付けると見つかるけど何か?
if (i == 0 || i == (n-1) || j == 0 || j == (n-1)) このへんがおかしいッポイです。 でもこれの何処がおかしいのかわかりません。
>>136 すみません、gccじゃないのでよく分からないです。
ごめんなさい。
>>137 そこはおそらく君の思ったとおりの動作です。
core dumpする原因はgcc -Wallだと
warning: format argument is not a pointer (arg 2)
とかいうメッセージが出てきます。
141 :
ななしさん :02/11/05 17:21
>char gazo[1000][1000];
>n = 5;
↑
なぜ#defineしないですか。
for (i = 0; i <= (n-1); i++) {
for (j = 0; j <= (n-1); j++){
↑
なぜ素直に i < n で判断しないですか。
>if (i == 0 || i == (n-1) || j == 0 || j == (n-1))
>gazo[i][j] = '*';
>else
>gazo[i][j] = ' ';
↑
なぜわざわざ複雑な条件で'*'や' 'を代入するですか。
もっと簡単に方法があると思うです。
>printf("%s", gazo[i][j]);
↑
>>135 さんの言うとおり、printf()を調べるです。
"文字"と(C言語で言うところの)”文字列”の違いって分かるですか?
>>138 ちゃんと動作しました。
>>140 そうでした。
>>char gazo[1000][1000];
>>n = 5;
>↑
>なぜ#defineしないですか。
デバッグまがいのことしてるうちにこうなってしまいました。
原因がわかったので直します。
>for (i = 0; i <= (n-1); i++) {
>for (j = 0; j <= (n-1); j++){
>↑
>なぜ素直に i < n で判断しないですか。
まったくもって自分はバカでした。
>>if (i == 0 || i == (n-1) || j == 0 || j == (n-1))
>>gazo[i][j] = '*';
>>else
>>gazo[i][j] = ' ';
>↑
>なぜわざわざ複雑な条件で'*'や' 'を代入するですか。
>もっと簡単に方法があると思うです。
ちょっと思いつきませんでした。
>>printf("%s", gazo[i][j]);
>↑
>
>>135 さんの言うとおり、printf()を調べるです。
>"文字"と(C言語で言うところの)”文字列”の違いって分かるですか?
理解はしてましたが実際使ってみたら忘れてました。
%sは\0で終わる文字列を指すポインタを期待しているんだぜ。 char型、つまり整数なんて与えたら変なところにアクセスしてしまって・・・
>>145 不正な処理になってしまったわけですね。
プログラミングは実際に打たないと成長しませんね。
>>146 一文字表示させるだけならputchar(gazo[i][j]);でいいんじゃない?
148 :
未亡人 ◆gLo7a3IgfY :02/11/05 18:06
自称、脱初心者のオレに 適当な問題きぼんぬ
>>148 ここはそういうスレではありません。
Web で検索してください。
1 よ、何故諸注意を書かなかった・・・?
テトリス作れ。 ルールを拡張しろ。 ハイスコア機能をつけろ。 ネットランキング機能をつけろ。 ネット対戦機能をつけろ。
152 :
未亡人 ◆gLo7a3IgfY :02/11/05 18:13
>>149 じゃあどういうスレなんでつか?
■▲▼
【1:151】C言語のことは漏れらに聞け!!
C言語の事ですが何か?
153 :
デフォルトの名無しさん :02/11/05 18:16
#include <stdio.h> #include <stdlib.h> int main(void) { int *variable_array=NULL; int size=0; char buf[256]; int i; while(fgets(buf,256,stdin)!=NULL) { size++; variable_array=realloc(variable_array,sizeof(int)*size); sscanf(buf,"%d",&variable_array[size-1]); } for(i=0;i<size;i++) printf("V_A[%d]...%d\n",i,variable_array[i]); return(0); } このプログラムはどうやったら終わるの?
154 :
デフォルトの名無しさん :02/11/05 18:18
>>153 Ctrl+DかCtrl+Zを押せば終わるかも。
>>153 そのプログラムまずいんじゃないか?
reallocで得た新しい領域の先頭が以前と同じだとは限らないはず。
あ・・・ちゃんと戻り値を受けていた。ごめん。見間違った 戻り値チェックはしようね。
>>154 なぜか終わらない・・・。DOS窓からやらんとあかんのかな。
NULLって定数の0にみたいなもんでしょ?それとも^cなん?
>>155 マジ!?これ本に載ってるソースなんだけど。
てかmallocとreallocの違いが良くわからん。
mallocは領域を与えたいとこに対して一回だけ使うんだよね?
reallocはその後ろに伸ばしていくんでないの?
>>156 すまそ。戻り値チェックってwhileの条件式内のやつでないの?
>>ALL 確認:返り値と戻り値って同じ意だよね?
>>157 見間違ったんだってば。本ということは戻り値チェックは省略か。
fgetsはEOFを検出するとNULLを返すから、DOS窓・・・windowsならCtrl+Zで終わると思うよ。
本当に終わらない?
やべ。
>>157 終わらないんでなくて、printf文が実行されん。
>>158 reallocの戻り値チェックのこと。
malloc同様、必ずしも成功するとは限らないから。
本のサンプルなら問題に焦点を当てるために省略していると思うけど。
>>161 なんだあれか。
Windows9XのDOSプロンプトだとなぜかそうなる。
stdinからじゃなくてファイルから読みとってみれば?
>>160 わり。レス書いてるうちに更新されたみたい。
で、^Cやってみたけど、終了はするんだけどさ
その後printf文で、格納した要素を出力してんじゃん?
そこが何も起きないんだ。
あと
>>158 マジでわからん。
^Cは強制終了。 ^ZはEOF入力。 だったはず。
>>164 ^Cは強制終了。もっともWin9Xなら^Zでも思い通りに動かないけど
>>163 XPでも一緒か。NTカーネル?だっけ?あれ系?
OSの問題なら、コンパイラがどうこうとかでないのね。
結局malloc使えとな。でもrealloc使った方が見栄えいいよね。
mallocだったらサイズいるもん。
>>162 ごめんだけど、例えばどんな感じ?
>>165 >>166 あり。でけました。
でもオレは確か^C=EOFって習った気が・・・
あぁ復習しないと。
>>168 はい、オレの勘違いだったぁぁ!!!
鬱だ・・・。母さん、死んでいいですか?
170 :
デフォルトの名無しさん :02/11/05 18:47
全角とハンカクを区別する関数ってある?
171 :
デフォルトの名無しさん :02/11/05 18:47
| さいたまさいたまさいたま!をやっていいですか? \____ ________________/ /||ミ V / ::::|| /:::::::::::||____ |:::::::::::::::|| || |:::::::::::::::||│ / || |:::::::::::::::|| ̄\ ガチャッ |:::::::::::::::||゚ ∀゚) || |:::::::::::::::||_/ || |:::::::::::::::||│ \ || |:::::::::::::::||∧ ∧∩ ..|| |:::::::::::::::|| ゚∀゚)/ .|| |:::::::::::::::||∧ ∧∩ ..|| |:::::::::::::::|| ゚∀゚)/ ..||
(・∀・)カエレ!!
173 :
デフォルトの名無しさん :02/11/05 18:49
ファイルの入出力で高水準と低水準って どんな時に使い分けるんですか?
175 :
( ○ ´ ー ` ○ ) :02/11/05 18:54
線形リストの先頭ノードと末尾ノードにわける理由を教えてください。 本の内容を、目で追っていたのですが・・・。 難しく考えるばかりで、進展がない。
176 :
デフォルトの名無しさん :02/11/05 18:56
>>175 日本語がおかしい。
推測で答えると、末尾に追加したいときには
最後のノードへのポインタを保持しておくと便利だ。
モジュールとサブルーチンの違いを教えて下さい。
178 :
デフォルトの名無しさん :02/11/05 19:07
∩ | | | | ∧_∧ | | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ;´Д`)// < 先生!素人以下の知識しかないプロが居まつ! / / \___________________ / /| / __| | .| | \  ̄ ̄ ̄ ̄ ̄ ̄ ̄\ ||\ \ ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄ || || ̄ ̄ ̄ ̄ ̄ ̄ ̄|| .|| ||
モジュールはフランス語。 サブルーチンは英語。
以下 禁 止
>>179 そうかい?英語にもモジュールという単語あるぞ。
ボンジュールと掛けたんじゃないの?
184 :
デフォルトの名無しさん :02/11/05 22:01
誰か前橋の「C言語ポインタ完全制覇」持ってる人いない? いたらさ、P218のソースにmain関数ないんだけども、どういうこと?
前橋ですが、何か?
186 :
デフォルトの名無しさん :02/11/05 22:05
質問があります。 今、C言語で画像処理プログラムを組んでいるのですが、 既製のUSBカメラから画像データを引っ張るにはどのようにすれば よいのでしょうか?
( ;´Д`)そんなこと言われても・・
>>186 C は USB をはじめとするデバイスを定義していません。
従って環境依存です。
このスレは純粋に C を扱っているスレなのでスレ違いです。
実際の方法は、カメラのメーカーに問い合わせてください。
>>188 いや、普通にありですが。
>>188 からスレ違いになったのですか?
なかなか、タイムリーですね。
>>188 じゃあCで出来ることはコンソールに文字出して遊ぶくらいですね。
実はあの本友達に書いてもらったんだ・・・。
193 :
デフォルトの名無しさん :02/11/05 22:23
#include<stdio.h> int main(void) { int hoge[]={1,2,3}; printf("%d ",&hoge[0]); /**/ printf("%d ",&hoge[0]+1); /**/ printf("%d",*(&hoge[0]+2)); /**/ この時、&hoge[0]はメモリ上に確保されるの? return 0; }
>>186 1. 使用しているチップを特定する。
2. チップのマニュアルを調べる。
3. ドライバを書く。
>>193 さすがにトリップ付けたのはやりすぎた。
ゴメソ本物の前橋
197 :
デフォルトの名無しさん :02/11/05 22:30
>>194 コンパイルできない!!なんでだああ!!!
198 :
デフォルトの名無しさん :02/11/05 22:31
printf("%d ",&hoge[0]+1); /**/ この実引数あり?
>194 printfは可変引数で、これをレジスタに割り付けるような 処理系はちょっと考えられないから、まあ、メモリ上にも 存在するといってもいいかもしれない。 実体としては即値で終わり。 し か し 腐 っ た コ ー ド だ な
今日 #define SWAP(X,Y) do{int W; W=X; X=Y; Y=W;}while(0) とやったらループは無駄だといわれたんだけど、そう?
SWAP(X, Y);
間接参照演算子は変数を指していなくても、使えますよね?
204 :
ななしさん :02/11/05 22:49
>>186 OSはWindows? Linux? MS-DOS?
それで扱いは変わってくるんだが。
まあ、Windowsだとすると、TWAINドライバを経由して
データを取り込むはずだから、その辺調べてみたらどうよ。
>>199 > 実体としては即値で終わり。
この意味がわからん。なんで即値?
>>201 普通に{}でかこっただけじゃ駄目なの?
>>201 その人に、「最適化って知ってますか?」 と突っ込んでください。
第一 while(0) の何がループなのかと。
do 〜 while(0) は、マクロを関数っぽく記述するのに絶対必要。
if(cond1)
SWAP(a, b);
else if(cond2)
SWAP(b, c);
else
SWAP(c, a);
とか書かれたら、do 〜 while(0) 以外で書いたマクロは対応できない。
で、マクロを関数っぽく扱えるようにするのは、その実装がマクロなのか関数
なのかを使用者に意識させないために必要。
>>204 Video for Windowsご存じない?
>>207 >do 〜 while(0) は、マクロを関数っぽく記述するのに絶対必要。
そんなトリッキーなコード書く人間はイランがね。
>>205 コンパイルの段階で数値が特定できる場合は、最適化によって即値に変換される。
最適化 OFF だったらどうだか知らない。
>>201 どうしてdoを使ってるか説明もできないのに使ってるのかよ…
>>209 getchar() マクロは不要だとでも?
213 :
デフォルトの名無しさん :02/11/05 22:59
,ィミ, ,ィミ, フ 彡 ミ 彡 ミ, ヤ | ,,彡 ミ、、、、、、、、彡 ミ, (⌒) レ | それでも人は生きるんだよ 彡;:;: ミ, ( ヽ ヤ 〜三;:;::::: 彡〜 ノ ノ レ ~~三:;:;:;::::: -=・=- -=・=- 三~~ ヽ ( : ;; ~~彡::;:;:;:;:::.. ___ ,三~~ ( ノ ,,,,, : ;; ~~彡;:;:;:;:;:;:;:. |┴┴| ,ミ~~ ノノ ;'" ,,ノ―、 ,;' ~~彡:;:;:;:;:;:;:;:;. ノ――| ---==ニノ ,;'′ >=ニ(二二二() ,...-''''""~~,::;:;::;::;::;::;' ミ,, ,;'′ ゝ--〈 __,;";;:;;;;;;;;;;;;;;;;;;;;;:;:;:;:;:;:;:; i! ミ,,,,;'′ `ー‐' ::::ミミミ:;:;:;: ミ:: ,;' ̄ ̄ ̄ ̄| \___/ :::::ミミミ:;:;: ミ:::, ,;::''′ |. \/ ::::ミミミ:;:;:: ,;+''"~~゙+、~'''''~ | | ::::ミミミ:;:;:;: ,+'" ミ::::: | ━┷━━━┳━━━━━ :::::ミミミ:;:;:;:;: >':;: ミ:: | ┃ ::::::ミミミ:;:;:;:;:;../;:;:;: ;:" | ┃ ::::::::ミミミミ:;:/;:;:;:;: ,.+'"''-、________|__ ┃  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄;':;:;:;: ,.+'" ミ、 l ┃
214 :
ななしさん :02/11/05 23:01
>>199 は、おそらく「最適化の結果」即値になると言っていると思われ。
ついでに、
printf("%d ",&hoge[0]);
printf("%d ",&hoge[0]+1);
printf("%d",*(&hoge[0]+2));
と書くよりは、
printf("%d ",hoge);
printf("%d ",hoge + 1);
printf("%d",*(hoge + 2));
と書いたほうが判り易いから糞コードと言っていると思われ。
(慣れだけかもしれんが)
>>207 そうする理由はちゃんと書いたんだが、その上で不要と言ってるのか?
> で、マクロを関数っぽく扱えるようにするのは、その実装がマクロなのか関数
> なのかを使用者に意識させないために必要。
レス番号が逆ダターヨ・・・
>>214 &hoge[0]がhogeのシンタックスシュガーだと分からない人がいると
思って展開して書いたんだけど、絶対いないですよねそんな人。
219 :
デフォルトの名無しさん :02/11/05 23:06
>>216 そういきりたつなよ。のんびりいこうぜ。
swapをマクロにするとforの初期化や条件式、後処理で使えないよ。
221 :
デフォルトの名無しさん :02/11/05 23:09
2chのCGIってCで組んであるって本当ですか?
223 :
デフォルトの名無しさん :02/11/05 23:10
>> おそらく「最適化の結果」即値になると言っていると思われ。 ごめん。まだ意味がわからん。 hogeがスタック上にあれば即値は無理だと思うのだが。 それともhoge[]のインデックス部分のことを言ってるのかな。
226 :
デフォルトの名無しさん :02/11/05 23:11
マクロは痴漢のみでいいよ
read.cgi は C だろ。 どっかにスレなかったか?
犯人はパールのようなものでこじつけたと見られています。
>>212 > getchar() マクロは不要だとでも?
俺のコンパイラは getcharで do{}while なんか使ってないな。
>>229 コンパイラじゃなくてライブラリって言えよ。
231 :
デフォルトの名無しさん :02/11/05 23:16
>>229 どっちにしてもdo{}while;は定石
役に立つ
立たないのはお前のアルゴリズムが最適でないから
勉強しろよ
>>218 なぜ&hoge[0]がhogeのシンタックスシュガーになるんだ?
マクロを関数のように使うなら、せめて関数が使えるところではどこでもそのマクロを使えないとねぇ・・・
>224 問題にしているのは、「&hoge[0]」(ポインタ)に付いてではないのか? いつから、hoge(配列)の話になったんだ?
Cで構文糖といったら、char s[]="abc"とかアロー演算子くらいな気がする。。。 他にもあるかな?
プリプロセッサは排除の方向で世の中進んでるのに・・・もう定年する覚悟ですか?
>>229 単文だからでは?
このスレの半分以上は前スレの話題を引き継ぐな。
c faq読めよ…。
forだけでなく、コンマ演算子もつかえねーじゃん。 話にならねー。
>>231 たかがelseの前で構文エラーになるかならんかの違いだろ。
個々のコーディングスタイルに依存する話を、
誰でも役に立つと決め付けんな。
むしろ邪魔になることもある。
そういう俺は個人的には使ってるけどな。
>>235 int main(int argc, char **argv);
int main(int argc, char *argv[]);
>>240 ああそうか。仮引数のポインタを[]と書くのも構文糖だね。
ポインタを受ける時は配列を受ける時が多いから。
>>234 > 問題にしているのは、「&hoge[0]」(ポインタ)に付いてではないのか?
> いつから、hoge(配列)の話になったんだ?
多分お前は話を理解できてないな。
その &hoge[0] が即値とどう関係してくるのかという疑問なんだが。
244 :
デフォルトの名無しさん :02/11/05 23:29
>>231 結局好みでしょ?
オレもこの手の問題は通りぬけたけど
マクロなんか全然使わない。
関数書くのが楽しいからw
考えてみたら、&hoge[0] は即値になりようが無いな。 実行するまで、hoge が決まらない。 実際、コンパイラは lea を吐くと思う。
つーか漏れはマクロで複文なら do { ... } while(0) だが、実際マクロ関数を 最近全然書いてない。 SWAP() 程度の処理なら直書きしてる。型もまちまちだし。
>>246 >型もまちまちだし
マクロは型に依存しないんだよ?
俺も滅多に書かないけど、↓最近書いた奴 #define isnullstr(str) (!*(str)) /* 空文字列かどうかを判断 */ strlen(str)==0の代わりに*str==0と書いていたけど、分かりにくいんでマクロにした。
>>247 おかげでしょうもないバグが起こる可能性がある。
250 :
デフォルトの名無しさん :02/11/05 23:39
>>247 あのマクロの中で定義している変数はなんだ?(^_^;)
#define SWAP(x,y,type) do{type W;・・・と書けば型によらないで使えるけど
型もまちまちってことはさ、なんらかの統一処理って事ジャン? いちいち関数つくるよりは、直書きの法がいいけどん、 そんな時くらいしかマクロは使えましぇん!
#include<stdio.h> int main(void) { int a[]={0,1,2,3,4}; printf("%d",*a); /*出力結果 0*/ return 0; }/*なぜアドレスをポインタ変数に代入してないのに、 間接参照演算子、以下(*)が使えるのでしょうか? *が使えるのはポインタ変数(ポインタ配列)にアドレスが 代入されていて、その変数を指している時にしか 使えないと思うんですが・・・*/
253 :
デフォルトの名無しさん :02/11/05 23:43
>>252 そもそも、a[n]って*(a+n)だぜ。
int a[]={1,2,3,4,5}; にして置いたら? 紛れが少なくなる。
256 :
デフォルトの名無しさん :02/11/05 23:46
ソース中では配列はポインタに読み替えられる。 宣言の時以外に使われる[]、つまり添字演算子は*と書いてもほとんど同じだ。 この辺の話は、もうちょい後でじっくり学べ! 今はとりあえず、配列の名前(この場合だとa)を単独で使うと それは配列の先頭要素へのポインタ(つまりaは*a[0]ってこと)になる。 ただし、これは嘘だ。でも今はこう覚えといて問題なし。 実際オレもそうだったから。安心しろ
257 :
デフォルトの名無しさん :02/11/05 23:47
オレ、死んでいいですか?
260 :
デフォルトの名無しさん :02/11/05 23:50
261 :
デフォルトの名無しさん :02/11/05 23:54
sizeof(a),sizeof(&a[0])を見てみると分かり易いね。
>>248 それだけを見るとナイスアイディアに見えるが、その調子で作ったマクロが
ずら〜っと並んでいると読む気がしなくなる罠。
漏れは素直に !*str の方が好き。
この程度、読むのに詰まる事も無いだろうし。
256 よりも、255 の方が何を言っているのかわからないぞ。
遺書 僕は調子に乗りました。初心者の僕でもわかりそうな質問だったので がんばってレスを打ちました。そしたら257にやられました。 向こうは3人がかりで僕を攻めました。お父さん、お母さん、 今までありがとう・・・・ これは自殺じゃない!他殺だ!(某あほな自殺者の迷言)
>>262 同感。逆のケースだと特にね。
if(*str) {}
if(!isnullstr(str)) {}
前者の方が断然読みやすく書きやすいと思う。
ほとんとだ。新たないじめられっこハケーン でもマギレって? マグレか? だとしたらなんの?
267 :
デフォルトの名無しさん :02/11/05 23:58
,.-ー''"~"'i, /~ ..:::::::!.,___ ,,..、-、, / .::::::::::::::`::::::~~""''''ー-,/~:::::::::.`i, / .:::::::::::::::::::::;;;;;;;;;;;;;;;;;;;::::::::::::::::::::::: i / .:::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::.. | ,/ :::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::::. i ,l' ::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::. | l ::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::::::: i 生きるって辛いよな・・・ i, ..:::::●:::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::::: ! _,,.i ..::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::●:: i' /~ 'l, ..:::::::::::::::::::::::::::|、;;;;;;;;;;;;;;;;;/::::::::::::::::: ,i' /~\ /,.、-ー 、;i, .::::::::::::::::::::::::::::::| ~"''''"/::::::::::::::::::: /~\ / i.,_ /'/ ..::::::::|::' ., :::::::::::::::::::::::::::::::|'⌒`ヽ,/;:::::::::::::::::: /:::::::.. \ ,i .::.. \ / i' .::::::::::/:::::::`・、., :::::::::::::::::::::::,人,__,/;;;;;::::::::::::::::/;;;;;;:;:::::.. ヘ / .::::....::::::::. `., ,i/( .::::::::::::i,::::::::::::;;;;;;~;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::-''";;;;;;;;;;;;;;;:::::.. \ / .:::::::::::):::::::::.. ヘ
268 :
デフォルトの名無しさん :02/11/06 00:00
。・°°・(>_<)・°°・。 ウエーン
何やっているのかわかりやすくするためにマクロにしたんだが、駄目か・・・
>>265 空文字列でない(文字列の終わりでない)という条件式は俺も上の方法でやっています。for(;*str;str++);って感じで。
>>253 〜
>>260 全て知ってます。
聞きたいことが伝わらないですかね?
たとえば、
int a=10;
int *p;
p=&a; /*アドレスを代入し、pがaを指す*/
ココ!
>>256 のソースは変数を指していない。
printf("%d",*p);
ココ!指しているから*が使える。
>>256 のソースではどこも指していないのに
*が使えるのはなぜですか?と聞いています。
>>264 い`・・・
 ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧ ∧
( ,,)
./ |
(___/
/
271 :
デフォルトの名無しさん :02/11/06 00:02
>>269 配列を確保した時点でアドレスは決まると思うが・・・
>>269 > 全て知ってます。
> 聞きたいことが伝わらないですかね?
はあ?
配列がポインタに成り下がることを知っていたら
そんなアホな疑問は出てこないはずだが?
>>268 それでいいじゃん。
マクロは、定数以外には基本的に使わないのが鉄則。
デバッガで追うのも面倒になるし。
274 :
デフォルトの名無しさん :02/11/06 00:05
どこを指しているのか分からないってのは、初期化していない(自動変数の)ポインタだろ?
>>269 だから、配列はポインタに変わっちゃうんだってば。
知ってるのにわからないんだったら才能ないんでない?
やめた方がいいと思うよ。
オレは0.2秒で理解した
276 :
デフォルトの名無しさん :02/11/06 00:06
>>273 わかりました・・・
今まで書いたソースを修正するのは面倒だからそれはそのままにして、今後は禁じ手にするか。。
>>268 あくまで俺個人の見解だからあまり気にしないで。
ただ、Cを使ってる人間であれば !*str という式が
どういう意味かはパッと見てわかるんじゃないかな?
>>276 マジレスシル!!正しこれが最後。
まずADSLでネット始めた方が安全だよ。それで電気店に行って対策ソフト
購入シル!店員に説明聞くか説明書読めば大概分かる。次ぎにセキュリティを
「高」にする。さらに心配なら「串」を刺すって方法もある。
サイトはトレンドマイクロを参考にした方がいいな。
メールはフリーで行い自分の活動的な事はネットカフェから作業するベシ!
他の奴の言う事は聞かなくてヨロシイ。
この書き込みに「自演」とか「お前は回線切って死ね」とか色々あると
思うけど素人はその程度なんで。
あっ、お前も分からなければ市ね!さっきは 書き込む所間違えてスマソ(W
>>277 > Cを使ってる人間であれば !*str という式が
そうだね。それくらい分かるよね(^_^;)
>>278 Σ( ̄□ ̄;)!!
>>278 > 書き込む所間違えてスマソ
今も間違えてるし。
>>278 村上ショージ氏でつか?
このシュールさは彼としか思えない・・・
>>278 ちょっとワロタ。けど
お前は回線切って氏ね!
285 :
デフォルトの名無しさん :02/11/06 00:15
つーかc言語なんかヤッテルヤシは パソオタ(デブ・メガネ)ということで ファイナル・アンサー
ハンカクチュウ ハ ホウチ。
>>285 オレは武田真治似で、彼女はhiro似で
大学で仕方なく学んで、楽しいなとか思ってる香具師ですが何か?
>>285 まあ、キミはデブでもなければヲタでもないけど、
プログラムもできない椰子だけどね。
C が主に PC で使われていると思い込んでいるらしい DQN な 285 がいるスレは ここですか?
c言語は神の為の言語。 選ばれし者しか使えない。 容姿等を問題にする愚者には一笑分からない。
PS
294 :
デフォルトの名無しさん :02/11/06 00:22
C言語出来ないキムタク>>>>>>>>>>>>>>>>>>>>>>>プログラム完璧なココの住人 ↓死ね
しかしファイナルアンサーってのも古いな
デブだがパソヲタと呼べるほど知識はない。
298 :
デフォルトの名無しさん :02/11/06 00:23
日 本 人 同 士 醜 い 争 い を し て い る の は コ コ で す か
☆ クールダウン中・・・ ☆ ┌──────────────────────―─┐ │ | │ | │ /■\ | │ (´∀`∩) | │ (つ 丿 | │ ( ヽノ | │ し(_) | │ | │ Now Onigiring. ... | │ | │ | │ しばらくおにぎりでお待ちください。 | │ | └───────────────────────―┘ クールダウンの途中でエラーが発生した場合は、 「無視(I)」 を選択して続行してください。
放置しとけよお前ら。レベル低いぞ。
301 :
デフォルトの名無しさん :02/11/06 00:25
プログラム完璧なココの住人はキモイです
>>285 ↓ _人
∩ ∧_∧ ノ⌒ 丿
\ヽ_( ) _/ ::(
\_ ノ / :::::::\
∩_ _/ / ( :::::::;;;;;;;)
L_ `ー / / / \_―― ̄ ̄::::::::::\
ヽ | |__/ | ノ ̄ ::::::::::::::::::::::)
| ̄ ̄ ̄\ ノ お前は ( ::::::::::::::;;;;;;;;;;;;ノ
| | ̄「~| ̄( 、 A , )クソでも / ̄――――― ̄ ̄::::::::\
| | | | ∨ ̄∨ ( :::::::::::::::::::::::::::::::::)
し' し' \__::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;ノ
__
>>285 l ̄/. ___
↓ / /. / ___ノ
__/ /_/ /
喰っとけウラー! Y人, ' ',人⌒ヽ、, '
Y⌒ヽ)⌒ヽ、 人,ヽ)人'、, '
へ, --- 、 ノ ̄ ::::::::::::::::::::::)
/ ̄ ̄ ̄ 、____\ ( ::::::::::::::;;;;;;;;;;;;ノ
/ _/ ̄「~|\ __ \ / ̄――――― ̄ ̄::::::::\
| | | | ( 、 A , \ミソ ( :::::::::::::::::::::::::::::::::)
し' し' と∨ ̄∨ \__::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;ノ
304 :
デフォルトの名無しさん :02/11/06 00:29
というより・・・・ 2chラーが キ モ イ ↓お前、女いねーだろ・・・そして死ね
それはさておき。
306 :
デフォルトの名無しさん :02/11/06 00:30
はっきりいって一般的にいうパソヲタ(デブメガネアニオタ)にはC言語できないと思われ。 (漏れの周りは死にそうにやせたヤシばっかりだ。。)
307 :
デフォルトの名無しさん :02/11/06 00:32
イッパイ ツレタ プッ
充分楽しんだので放置すっか。
こういうのは950超えてからやれよ
310 :
デフォルトの名無しさん :02/11/06 00:34
スマ
しかし俺の周りではデブでCができる奴は本当にいない。 人のコードにゴチャゴチャ言ってくる奴は腐るほどいるが。 意外と真理かもしれん。
おいお前ら、Cを始めたきっかけ何ですか?
c言語極めてるここの住人ってオレから見れば プロジェクトxに出てる技術者の爺さん達並みに かっこいいと思うけど。
会社で使ってるからだ。
きっかけは学校の授業
上司は言った。 「キミ、JavaできるならCもできるよね?」 ……それはない。 「キミ、CできるならJavaもできるよね?」 ……それもない。
>>313 中学生が英語の勉強をしてるのを見た小学生が「英語できるんだ、すごい!」
と言ってるようなもの。
>>317 間違いなく理解してくれる対象(マシン&コンパイラ、クソなのは除く)があって、
業務ロジックを規格に沿って記述(コーディング)するだけだからねぇ。
キーボード打つのと同じで、慣れでしょ。
まるでそうするのが当然のように C を覚えました。
320 :
デフォルトの名無しさん :02/11/06 00:54
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <process.h> #include <conio.h> void saikoro(int*,int*); void hangei(void); int kakekin, motikin=1000,me1,me2; void main(void) { int tyouhan,yosou; printf("持ち金%d円です。\n",motikin); while(1) { printf("丁か半か予想して、丁なら0、半なら1を入力してください.やめるときは2を入力してください.\n"); scanf("%d ",&yosou); if(yosou==2) { exit(0); } printf("掛け金を決めてください.\n"); scanf("%d",&kakekin); printf("掛け金は、%dです。",kakekin); getch();
321 :
デフォルトの名無しさん :02/11/06 00:54
saikoro(&me1,&me2); int kekka=(me1+me2) %2; if(kekka =0) { printf("丁です."); tyouhan=0; } else { printf("半です."); tyouhan=1; } if(yosou==tyouhan) { printf("予想的中です.掛け金分お金が増えます!"); motikin=kakekin+motikin; } else { printf("はずれです.掛け金没収!"); motikin=motikin-kakekin; }
322 :
デフォルトの名無しさん :02/11/06 00:54
break; } return; } void saikoro(int *c,int *d) { srand((unsigned)time(NULL));//rand()だけではいつも同じになる *c=rand()%6+1; *d=rand()%6+1; printf("%dと%dです。",*c,*d); return; } で、掛け金を決めてくださいと言う前に、scanf("%d",&kakekin);が動作してしまうのですが、なぜですか?
>>322 バッファにたまってるのかな。知らんけど。fflush(stdout)するか。
いきなり複数レスに渡ってソースを書くのは荒らしに近い
>>324 もしたまっていたとしても、printfは実行されない?
バッファってstdoutのバッファか・・・スマソ
328 :
デフォルトの名無しさん :02/11/06 01:03
>>325 ごめんなさい。でも、長かったんで。こういうときは、前もって複数レスしますっていったほうがいいんですか?
>>326 printf実行されます。
すみません、当方、今までプログラムを組んだことが一度もなく、 これからプログラムを学ぼうかと思っているのですが、 初めて学ぶ言語としてC言語はどうでしょうか? 一応、WindowsマシンとボーランドCの無料版はすでに入手してあります。
>>320 scanf() はもっと丁寧に扱え。
×: scanf("%d ",&yosou);
○: scanf("%d",&yosou);
>>330 よくみつけたなー。なるほど。全然わからんかった。
あと、kekkaってブロックの先頭でないところで宣言しているね。
>>329 C はそれなりに汎用性があり、大抵の処理が書けるので悪くは無い。
ただ、プログラムミスをした時に助けてれる機構がほとんど無いから
つまづく事があるかも知れない。
時間をかける覚悟があるなら習得は可能。
333 :
デフォルトの名無しさん :02/11/06 01:10
334 :
デフォルトの名無しさん :02/11/06 01:10
>>330 おお。直りました。ありがとうございます。一時間ぐらいここでずーッと悩んでました。
デモ、どうして、スペースがあっただけで、始めに実行されちゃうんですか?
>>334 数字列とスペース一個にひっかかるからだろ。
>>325 この場合は素直に全部書いてくれてて良かったが。
これがコマ切れ情報だったら、解決に 50 レスはかかっていたと思うぞ。
C→C++→Java で。
>>334 "%d " というようにスペースを書くと、入力のホワイトスペースを要求する
ようになる。
つまり、最初の scanf() が終わってないだけで、次の scanf() が実行され
てる訳ではない。
339 :
デフォルトの名無しさん :02/11/06 01:15
>>331 >あと、kekkaってブロックの先頭でないところで宣言しているね。
なんかまずいですか?
>>339 Cならまずい。最新の規格ではどうだかしらんが。
もうちょっとだけ続くんじゃ。
>>332 >>333 >>337 レスありがとうございます。
初めてというのもあり、とりあえず無料で始められる奴……となると、
JavaかCかC++(これはCの後かな?)ですよねぇ。
友達はC#だ〜とか言ってるのですが、これは無料じゃない……ですよね?
JDKというのもダウンロードしておいたのですが、
とりあえずCで行ってみようと思います。
343 :
デフォルトの名無しさん :02/11/06 01:19
>>340 ま、とりあえずC++なんで、大丈夫だった見たいですね。
ところで、将棋プログラム作ろうと思ってるんですが、一番強いのが作れるプログラミング言語は何ですか?
>>343 > とりあえずC++なんで、
> 一番強いのが作れるプログラミング言語は何ですか?
ここで聞くな。
>343 一番強いのが作れる言語は何かと問う時点でカス。 プログラミングの本質が分かっておらん。貴様は一生COBOLやってろ。
>>342 C#も無料よ。.NetFrameworkSDKをダウンすればいい。でかいけど。
>>339 ファイルの拡張子が c じゃなくて cpp になってるだろ。
>>346 おお、そうなのですか。さっそく明日学校でダウンロードしてきます。
しかしボーランドC、入れたはいいけど全然動かし方分からないですね。
JDKはSDKという奴を落とすべきがEEという奴を落としたらしい?のでこれもダメっぽいし。
知り合いに詳しい友人がいるのですが、早くそいつみたいになりたいものです。
349 :
デフォルトの名無しさん :02/11/06 01:28
>>345 多分、一番低級なレベルで作れるのが一番早いから、アセンブラなんだろうけど、それだとむずかしいからといって、もう少し高級言語に
すると、遅くなって、弱くなる。だから、早いのを作るのと、簡単に作るのは、矛盾することなのだと理解しているのですが。
>>348 .NETのSDKってコマンドラインツールなんじゃないかなぁ?
Borlandのフリーコンパイラが使えないならそれも使えないかと・・・
とりあえず、
>>348 にWelcome, Hell World!と表示させてやれ。
お前ら。
>>349 将棋 AI の強さに、速さは関係無いだろ。
・・・と一瞬思ったが、指し時間まで考慮するなら確かに速い方がいいな。
353 :
デフォルトの名無しさん :02/11/06 01:31
>>352 早ければ、深く読めるのです。すなわち、強くなるのです。
必死にアセンブラで組んだってどうせ2〜3ヶ月とか半年とかでPC性能あ〜っぷ。 バグ取とかでひ〜ひ〜行って強いプログラムが作れないなら高級言語でもい〜のでは?
>>349 いくらアセンブラで枝葉部分をチューニングしてもアルゴリズムがダメダメ
だったら全く意味なし。それに、コンパイラの方がヘタなアセンブラより速い
コード吐くしな。
>>353 高級言語+ライブラリのサポートのもと、複数のCPUで分散処理させた
ほうがいいと思われ。
bccはちゃんとヘルプファイルも付いてるのに使い方がわからないってのは何故なんだ? 以前はヘルプが付いてないかったらしいけど
359 :
デフォルトの名無しさん :02/11/06 01:41
>>354 ありがとう。こんなスレがまさかあるとは思っていませんでした。
将棋板で探したんですが、なかったんで、あきらめてしまいました。
>>355 >>356 ですね。PC性能UPで、アセンブリングも変わるんですか。じゃ、厳しそうですね。
>>358 お恥ずかしい限りです。
コマンドラインやエディタは大学でUnix使ってるので大丈夫なのですが、
どうもライブラリの場所?やインクルードの場所?をうまく指定できてないみたいです(?)。
明日知り合いに教えてもらって、がんばります。
361 :
デフォルトの名無しさん :02/11/06 01:47
>>360 それは設定ファイルを作成していないからでしょう。
readmeをみた?
363 :
デフォルトの名無しさん :02/11/06 01:54
今思いっきり酔っていますが、答えられる範囲で答えます。 (*^o^*)
>>361 >>362 >>363 皆さんレスありがとうございます。
とりあえず原因は使っているエディタがEUCで保存していたため、
文字の出力がぐちゃぐちゃになっていたと判明しました。
(「これはテストです」などと表示しようとしていました)
"Hello World”なら正しく表示されました。しばし感動……。
これからも精進します。
EUC でも ASCII コードセット部分は SJIS と互換だからインクルードや リンクが失敗する原因とは考えられないのだが・・・いいのか?
366 :
デフォルトの名無しさん :02/11/06 02:16
>>365 多分インクルードやリンクが失敗したと思いこんだんだと思う。
(*^o^*)
>>365 えっと、まずEUCのまま動かしたところ、ぐちゃぐちゃなものが出力されました。
それをメールで知り合いに内容ごと送りましたら、この内容なら動くはず、
(学校からフロッピー7枚で必死に持ってきたので)ライブラリが壊れている(?)か
違うのを指してる(?)かも、みたいなことを言われまして、
必死にあがいていたのです……
368 :
デフォルトの名無しさん :02/11/06 02:45
>>367 動いた時点でライブラリやヘッダーのパスは間違っていない。
(*^o^*)
古いのを混ぜ込んでしまって、動くけど なんかおかしい、てな場合もあるはず
#include <stdlib.h> #include <stdio.h> #include "RPN.h" binode tree_reduction(binode tree); int main() { int b; binode node; binode tree = tree_example3(); b = tree_reduction(tree); printf("Built a tree\n"); tree_reduction(tree); printf("%d\n",b); return 0; } binode tree_reduction(binode tree) { int a; if(binode_is_operator(binode_lchild(tree)) == 0 && binode_is_operator(binode_rchild(tree)) == 0) { switch(binode_value(pos_pop())) { case OP_PLUS: a=binode_get_int(binode_lchild(tree)) + binode_get_int(binode_rchild(tree)); case OP_MINUS: a=binode_get_int(binode_lchild(tree)) - binode_get_int(binode_rchild(tree)); case OP_MULTI: a=binode_get_int(binode_lchild(tree)) * binode_get_int(binode_rchild(tree)); } value_push(a); return 0; }
else if(binode_is_operator(binode_lchild(tree)) == 1 && binode_is_operator(binode_rchild(tree)) == 0) { value_push(binode_rchild(tree)); tree_reduction(a,binode_lchild(tree)); } else if(binode_is_operator(binode_lchild(tree)) == 0 && binode_is_operator(binode_rchild(tree)) == 1) { value_push(binode_rchild(tree)); tree_reduction(a,binode_rchild(tree)); } else { tree_reduction(a,binode_lchild(tree)); tree_reduction(a,binode_rchild(tree)); } } このプログラムの文法的におかしいところおしえてください
>>371 rpn.hがないと指摘しようがないよ。
すんません
374 :
デフォルトの名無しさん :02/11/06 03:48
MFC関係でもいいですか? MFCのCHttpを使用してサーバにファイルをアップロードしたいんですけど データ自体は転送されるのですが サーバ側のcgiでformをうまく解析できず ファイルの転送が完了しません ちなみにindex.htmlでformを書いてcgiを動かせば正常に作動します 以下のデータは全て直接(CString strData, CHttpFile *pFile) pFile->WriteString( strData )で書き込んでいます msize= 230653 ----------------------------- Content-Disposition: form-data; name="author" who ----------------------------- Content-Disposition: form-data; name="fname"; filename="C:\0.ppm" Content-Type: text/plain P6 320 240 255 :JF:JF8LG9MH<LH<LH@LE?KDBJGBJGFKEHMGKKJKKJHMGIN HSFDQGCPFGPIGPIEQJFRKCUJEWLGSLGSLJSLLUNOULMSJL ...続く
int a[]={0,1,2,3,4}; ポインターじゃなくて配列って言った方が良いじゃん!
376 :
デフォルトの名無しさん :02/11/06 09:01
英数字10文字からなる文字列を、バイナリをダンプされても容易には 見えないような形でCのソースコードに埋め込みたいのですが、どのよう にするのが一般的な手法でしょうか?
377 :
デフォルトの名無しさん :02/11/06 09:04
>>376 char *s = {'A'^0xAA, 'B'^0xAA, ...};
みたいにするとか。
意味がないから意味があるんだろーが
ほぅ
381 :
デフォルトの名無しさん :02/11/06 09:55
前レスも全部読めばC言語の何割、極めたことになるんだ。
自分でプログラム書かなきゃ1割も極めたことにはならない
>>381 > 前レスも全部読めばC言語の何割、極めたことになるんだ。
日本語の本を何冊読めば日本語の何割、極めたことになるんだ?
プログラムを「極めた」と思い込んだ瞬間にお前の成長は終わる。
プログラミングには頂点など存在しない、だがそれがいい。
>>376 > 英数字10文字からなる文字列を、バイナリをダンプされても容易には
> 見えないような形でCのソースコードに埋め込みたいのですが、どのよう
> にするのが一般的な手法でしょうか?
cryptでgoogleしろ。2chのトリップはその方法で暗号化してる
今、ポインタについて学習しています。そこで質問。 LPDIRECT3D8ってのはIDirect3D8インターフェースへのポインタを指す 構造体なんだけど、たとえば LPDIRECT3D8 a,b; a=Direct3DCreate8(D3D_SDK_VERSION); とした後、 b=a; とするとbにはaの内容がコピーされるんじゃなく、aのアドレスが渡される んですよね?
>>386 LPDIRECT3D8が構造体ならば、aの内容「だけ」がコピーされます。
LPDIRECT3D8のメンバにポインタが存在した場合には注意が必要です。
LPDIRECT3D8がポインタならばaのアドレスが代入されます。
説明不足でした。 LPDIRECT3D8はこのような構造体です。 typedef struct IDirect3D8 *LPDIRECT3D8, *PDIRECT3D8; >LPDIRECT3D8がポインタならばaのアドレスが代入されます。 ということは386の内容であっているというわけですね。 ありがとうございました。
>>387 おそらくレジストキーか何かを暗号化して容易に推測させないことを
目的としてると思ったんだが。
プログラム中にcryptした結果を埋め込んでおき
レジストキーの入力結果をcryptして一致すればレジスト解除すれば
いいんじゃないかと思ったんだが、どういう目的で暗号化したいんだい?
ちなみに crypt() は不可逆だけど crypt() が使っている des アルゴリズム自体は可逆です。
>>390 可逆でないと困る、としか言えない。
>>391 DESなり3DESなりで暗号化したものを埋めると、
>>377 ほどメンテナンス性が
よくない他、復号するための鍵をどう埋めるかという問題で循環して
しまうような。
厨房対策ってだけなので、
>>377 でいいですわ。ありがとう。
377がもっと可読性の高いマクロかなんかにできるなら嬉しい
んだけどむりっぽ。
393 :
デフォルトの名無しさん :02/11/06 11:51
お前らいい加減にしろよ・・・。 純粋な C に関するもので無い限り、質問は受け付けるな。 MFC も DirectX も別スレがある。 それとも、問題の切り分けができない輩をはびこらせて、教えたがりクン気取って 楽しいのか? それとも、「ここは 2 ちゃんねるだから」 スレの内容が整然としていなくても どうでもいいか?
>>393 はて、
>>374 はさくっと無視されてるし、
>>386 はポインタの質問であって
そのポインタがたまたまDirectXで使われてるだけで、
回答も一般的なポインタの回答しかしていない。
君もそういうスレ違いの内容を誘導もせずに風紀委員を気取って楽しいのか?
前スレがマジレスで終わってる・・・
>>398 俺は綺麗にこのスレへのリンクを貼って終わらせたかったのだが...
今 一 歩 及 ば な か っ た
>>399 ,. -───-: 、
/::::::::::::::::::::::::::::::::\
/ '':::::::::::::::::::::::::::::::''''' ヽ
!::::::::::ィ::ハ:::;::::::::::::::::::::::::::!
i::|:::i::/l/ i;::ト、:、:::i:::::::::::::::i
|::i/レ'-i'' 'ヽi-ヾ,ヽ!:::::::::::::l
|::ハ -‐- -─- i::::::::::::::l
|::::::l| | | | |::::::::::::::!
|::::::ヽ | r---、! l,.!::::::::::::::l
l::::::::::::`;'-'=,‐,='r''i~!:::::::::::::::|
!:::::::l、::r'"´'. ' l ' i::::::::iヽ:::l
i:l、:::|./、_____,l::::;l:/‐'ヽ!
'!ヽ;i'>l____,.//-‐'''"ヽ
!/ |.VVVVVVVV.lV\!. i
| | | l
前スレの質問者は、 wkが上書きされて0バイトになって、死んでいるんだろうな。
nkfが改行コードの変換もやってくれるじゃん
struct 童貞 {
25歳無職;
アニオタ;
デブ;
体臭;
};
童貞
>>393 ;
>>404 393 が痛いのは分かったからスレ汚すのはやめてくれ。
Visual C+(MFC限定)スレで質問しなおしました ご迷惑をおかけしました
408 :
コンパイラ :02/11/06 15:26
C言語では本当の意味で参照渡しはできないって どういう意味ですか?C++ではできるらしいのですが・・
>>408 例えば
void hoge(int *a)
aを変更すると引数で与えた変数にその変更が反映される点では参照渡しに非常に似ているが、
それはアドレスという参照用の情報を値渡ししているにすぎない。
func(&value); // Cにおける偽参照渡し==ポインタ渡し。 C++だと、参照渡し(値で関数を呼ぶと、値のポインタが渡される) を明示して関数プロトタイプを関数を宣言できる。↓ void func(int &value);
411 :
コンパイラ :02/11/06 15:33
ではなぜこれを参照渡しと言ってしまうのですか?
>>411 機能的にはほぼ同一だからです。
まぁ、間違って覚えてるアフォも少なからずいるようですが。
413 :
コンパイラ :02/11/06 15:37
そうですか。ありがとうございました。
414 :
デフォルトの名無しさん :02/11/06 15:42
バイトオーダを変える htonl() を調べると、 ホストバイトオーダをネットワークバイトオーダに変えると よく書いてあるのを見かけますが、 実際動かしてみると、 リトルエンディアンをビッグエンディアンに、 ビッグエンディアンをリトルエンディアンに変えてるような気がするのですが、 この認識は間違いですか??
>>414 ネットワークバイトオーダとホストバイトオーダが同じならば
変えない。はず。
416 :
デフォルトの名無しさん :02/11/06 16:08
>>414 レスありがとうございます。
ネットワーク側とホスト側のバイトオーダが同じかどうかというのは
誰がいつどうやって調べてるのでしょうか?
>>416 ライブラリをビルドするときにでも調べるのでは。htonl呼び出し時に
チェックコード実行して判断してるのかも知れないけど。
いずれにせよ知る必要は無いし、それに依存したコードを書くべきで
もない。
>>416 > 誰が
コンパイラないしライブラリの製作者
> いつ
コンパイラないしライブラリを制作する時
> どうやって
2 バイト以上のデータがメモリにどう格納されるかを調べて
>414 間違ってはいないが、よく考えろ。 ネットワークバイトオーダ<->ホストバイトオーダは どちら向きにも同じ処理だろ? ということではないのか?
>>416 例えばC FAQに載ってるのはこう
int x = 1;
if(*(char *)&x == 1)
printf("little-endian\n");
else printf("big-endian\n");
大抵はプログラムをコンパイルする前に調べておいて条件コンパイルする。
>>416 調べる必要などありません
ネットワークバイトオーダはリトルエンディアンであることがRFCで決まっています。
# どのRFCに書かれてるか忘れた
自分のアーキテクチャがリトルエンディアンの場合→何もしない
自分のアーキテクチャがビッグエンディアンの場合→変換
これだけです。
424 :
デフォルトの名無しさん :02/11/06 16:21
typedef をわかりやすく言うとどういう事なんですか?
425 :
デフォルトの名無しさん :02/11/06 16:21
うまうま
426 :
デフォルトの名無しさん :02/11/06 16:22
>>423 >ネットワークバイトオーダはリトルエンディアンであることがRFCで決まっています。
どこかのサイトでも見たよう気がします。
でもよく意味がよくわかりませんでした・・・。
バイトオーダってのはCPUで決まるんですよね?
通信先は無条件でリトルエンディアンだ!! って決められても、
その通信先のマシンのCPUがビッグエンディアンを採用してたら
ホストがリトルエンディアンだからといって
何も変換しないで通信しようとするとおかしくなりませんか??
>>429 ネットワーク上では、必ずリトルエンディアンで送受信するって決まってるの。
通信先がビッグエンディアンだとしても、そっちの方でちゃんと受理してるから
おかしくならないの。
わかれ。
>>429 なぜに?向こうが変換すればいい話。
飛んでくるデータのエンディアンはあらかじめわかっているわけで。
>>429 その場合は通信先のマシンがntohl等を利用してビッグエンディアンに
変換する。
あ、ようやく分かりました。 受け取り側も変換すれば解決するんですね。 なぜに気づかなかったのか・・・。 お騒がせ致しました。
>>429 ネットワークに流す時はビッグエンディアンってことに決めとけば、
読む時はビッグエンディアンから自分のバイトオーダに変換すればいいだろ。
ちなみにネットワークバイトオーダーがリトルエンディアンっていうのはネタかDQN。
>>429 > ホストがリトルエンディアンだからといって
> 何も変換しないで通信しようとするとおかしくなりませんか??
おかしくなります。だからRFCで規定しています。
よって、ネットワーク上にビッグエンディアンの
データを流さないようにしなければなりません。
>>439 ネットワークバイトオーダーに変換する関数が用意されているんだっけ?
ああ、上の方にかいてあったか・・・ しかもレス先間違えているし。。
439 :
デフォルトの名無しさん :02/11/06 20:42
#define UCHAR unsigned char も typedef unsigned char UCHAR; も同じ意味だよね? 使い分ける必要ってあるのかいな。 コンパイル時に意味がかわるのはわかるけど、、、使い分けなんて必要ないよね? 趣味のレベルだよね? これって。
>>439 > 使い分けなんて必要ないよね?
ある
UCHAR a, b, c;
と書いたときのことを考えろ。
441 :
デフォルトの名無しさん :02/11/06 20:53
>>440 何ら違いは見いだせないが。
言いたい事はわかるけど。
>>439 #define LPSTR char *
と
typedef char * LPSTR
で、
LPSTR a, b;
がどう解釈されるか考えてみよう。
ほえ? どっちも同じじゃないの? #defineの場合 char *a, b; と置換されて typedefの場合 char *a, b; と判断される。 うー Webで調べても具体例みつからねぇ〜
>>443 おいおい
typedefの場合、
char *a,*b;
だろ・・・。
というか、実際にコンパイルして、sizeofででも表示してみろよ、、、
ほえ〜?
これはエキスパートCプログラミングの100ページの話ですか。
とういかよ、#defineとtypedefの違いなんて延々と説明して、 スレを消費すんなよ。 質問してる奴って、本買う金がもったいないからHP教えてくださいとか 質問してるような奴なんじゃねーの?
ほえぇぇぇ〜。
>>448 初心者には、ちょい、分かりにくいんでないの?
#defineとtypdefの違い。
>>447 俺も今まさに確認したところだ。
この本からと思われる話題多いね。
関数へのポインタ使ったら怒られた。 関数へのポインタの配列作ったら誰も理解できなかった。 ・・・・・・こんな会社、もう辞めたい・・・・・・
C++なら極めて分かりやすいんだがな namespace foo{ #define T1 char typedef char T2; } namespace bar{ class T1; // NG class T2; // OK }
おまえら、defineの代わりにenum,typedef使えと。
>>459 enumの使い方を知ってる人はごく少数です。
できる限りtypdefは使わないでほすぃ
s/typedef/typedef/
・・・・・。
あのー文字列定数ってどうしてますか。 #define TEXT_SAGE "sage" const char *TEXT_SAGE = "sage"; const char TEXT_SAGE[] = "sage";
>>460 おっちょこちょいなところに惹かれました。あなたのことが好きです。
>>463 でも、そんなふうにプログラム中にいきなり定数を書くところは嫌いです。
>>465 この人はなんでもかんでも文字列定数をマクロにするのかな・・・
関数へのポインタはtypedefするのが定番だと思うのですがどうですか。
>>463 それは定数じゃなくてリテラル。
定数と呼ぶなら const を付けるのが正しい。
461 の 2 つめと 3 つめのどちらでもいいんじゃないか?
470 :
デフォルトの名無しさん :02/11/06 21:46
例えばWindowsアプリでGet/WritePrivateProfile系APIを対で使うとき、 セクション名やキー名をグローバルに#defineしてるんだけど・・・変? 俺、変態?
1; /* constついていないけど定数だよね?(ワラ */
C言語のソースを見てみたらマクロばっかで超読みにくいんです 簡単だからって何でもかんでもdefineしてんじゃねーよ、ボケが。 よーし、パパuchar定義しちゃうぞとか言ってるの。もう見てらんない。 お前らな、glibcやるからdefine除けと。 でやっと除けたかと思ったら他のプログラマーがswapマクロとか書いてるんです。 そこでまたぶち切れですよ。 略)おまえdo{}while(0)しただけちゃうんかと。 エキスパートcプログラマの俺から言わせてもらえば今、プログラマの間での最新 流行はやっぱりinline修飾、これだね。 更にインラインアセンブラ。これ最強。 処理系依存と言う危険も伴う、両刃の剣。 まぁお前らド素人は、javaでも使ってなさいってこった。
ま た C 99 か
>>468 のような人の事を「杓子定規な人」と言います。
477 :
デフォルトの名無しさん :02/11/06 21:53
>>471 最適化オプションによっては、同じ内容のリテラルでも別々の文字列として格納
されてしまう場合があるから気をつけろ!
C言語の範囲で即値なんて言葉はあったか?
K&R第二版 p236 A2.6 文字列リテラル より > 文字列定数とも呼ばれる文字列リテラルは、"..."のように2重引用符で囲まれた文字列である。
googleで「C言語 文字列定数」をキーワードに検索したところ、どこも"〜〜"を文字列定数と呼んでいるんだが・・・
ちょっと語弊があるな。 文字列定数はどこも"〜〜"のことを指している
リテラル=定数
486 :
デフォルトの名無しさん :02/11/06 22:01
訳語の話をしてるんであってCの話とは関係ないってオチじゃ
488 :
デフォルトの名無しさん :02/11/06 22:02
literalよりimmediateじゃない?<即値
でもconstつけても定数にはならないんだよね?ReadOnlyなだけであって。
>>489 ReadOnlyだから定数と見ていいんじゃない?
constは定数のことだし
>>482 普通はそれでも困るほど膨れることはないから無視していい。
気になるなら、素直に const char * 使えばいい。
それよりみんなどうしてるの。#define TEXT "sage" はやらないものなんか。 使う場所でいきなり書いちゃう?
>>492 一度しか使わないものをいちいちマクロにしたりはしない。
何度も使うならマクロにする。
494 :
デフォルトの名無しさん :02/11/06 22:08
プログラム名とかバージョン名に使ったりする<define VERSION "1.2.3"
>>490 それだと定番の
const int MAX =10;
char ss[MAX];
トークに。
>>494 そうそう。
あとログファイルとか設定ファイルの場所とかも。
>>495 あー・・・
じゃあ準定数(←勝手に作った言葉)
即値の人、どっか行っちゃったね
お前らはあるある話で盛り上がる中学生ですか?
なんだ、思ったより釣れなかった。つまらん。
間違ったらネタにしたがるモノホンの中学生発見
502 :
デフォルトの名無しさん :02/11/06 22:33
私はついこの前Cを始めたばかりでここの方達に質問するのも 悪い気がするのですが、聞いてください。 えっと、if〜elseの使い方を覚えたので、少年マガジンにあった GetBackersの「君が戦う相手は誰だ!」 というYES、NOでどんどん選んでいって 最終的になんらかの結果が出るというものを作ろうとしてるのですが どうもうまくいきません。 ソースコードを出すんで、どこがおかしいかみていただけないでしょうか?
>>500 こういうやつってアホとしか思えん。
どうせ匿名なんだから、へたなごまかしなんかしないで、
そのまま逃げればいいのに。
504 :
デフォルトの名無しさん :02/11/06 22:35
#include <stdio.h> int main(void) { char num,num2; printf("START!\n"); printf("「YES」か「NO」で答えてください。\n「YES」の場合はY、NOの場合はNを押してください。\n"); printf("「GetBackers」は毎週欠かさず読んでる?\n"); num=getchar(); if(num=='N'||num=='n') { printf("GAMEOVER"); } else if(num=='Y'||num=='y') { printf("今、付き合ってる人がいる?\n"); num2=getchar();
505 :
デフォルトの名無しさん :02/11/06 22:36
num2=getchar(); if(num2=='Y'||num2=='y') { printf("実験なので終了\n"); } else if(num2=='N'||num2=='n') { printf("実験なので終了\n"); } } return 0; } のprintf("今、付き合ってる人がいる?\n");で処理が終わってしまい、 num2=getchar();が処理されないのですがどうしてでしょうか? 分かる方いたら教えてください。お願いします。
#include <stdio.h> int main(void) { char num,num2; printf("START!\n"); printf("「YES」か「NO」で答えてください。\n「YES」の場合はY、NOの場合はNを押してください。\n"); printf("「GetBackers」は毎週欠かさず読んでる?\n"); num=getchar(); if(num=='N'||num=='n') { printf("GAMEOVER"); } else if(num=='Y'||num=='y') { printf("今、付き合ってる人がいる?\n"); num2=getchar(); } return 0; }
507 :
デフォルトの名無しさん :02/11/06 22:38
>>504 二回目のgetcharで改行を読んでいるとか?
新手の荒らしですか?
510 :
デフォルトの名無しさん :02/11/06 22:42
すみません。ただのハローワールドなのですがコンパイルエラーとなります。どこが悪いのでしょうか? #include <stdio.h> int main(int argv , char **argc) { char *hello_world = "hello world!"; printf(%s\n , hello_world); return 0; }
すいません、
>>506 はミス入力です。
>>507 二回目?
>>504 と
>>505 のnum2=getchar();
は同じものです。
>>508 荒らしではないですが、
板を見にくくしてしまって申し訳ありません。
もしかして私のことを他人からみたら厨ですか?
厨は大っ嫌いなのに・・・
>>512 たとえばnを入力し、つづいてEnterキーを押す。
そうするとnはgetchar()で読まれるが、Enterキーを押すことで入力された改行文字はバッファに残る。
次にgetchar()が呼ばれるとその改行文字を読むから入力待ちにならない。
>>510 限りなく危険だが、これで動くことは動く。
>>511 に同意でなんか本を買え
#include <stdio.h>
int main(int argv , char **argc)
{
char *hello_world = "hello world!";
printf("%s\n" , hello_world);
return 0;
}
おとなしくscanfでもつかっとけ。
かぶった (;´Д`)
>>514 氏、じゃあどうすればよいのですか?
scanfで数字入力にするようですか?
521 :
デフォルトの名無しさん :02/11/06 22:52
>>515 まさか仮引数名が一般とは逆になっているとかそういうことじゃないよね?
>>517 俺は確保されていないメモリに文字列を突っ込むのは怖いので。
523 :
デフォルトの名無しさん :02/11/06 22:53
>>522 文字列定数は自動的にどこかに領域が取られるんじゃなかったのか?(^_^;)
525 :
デフォルトの名無しさん :02/11/06 22:56
>>522 それもコンパイラの設定次第だったりする・・・だったと思う(汗)
>>522 ,. -───-: 、
/::::::::::::::::::::::::::::::::\
/ '':::::::::::::::::::::::::::::::''''' ヽ
!::::::::::ィ::ハ:::;::::::::::::::::::::::::::!
i::|:::i::/l/ i;::ト、:、:::i:::::::::::::::i
|::i/レ'-i'' 'ヽi-ヾ,ヽ!:::::::::::::l
|::ハ -‐- -─- i::::::::::::::l
|::::::l| | | | |::::::::::::::!
|::::::ヽ | r---、! l,.!::::::::::::::l
l::::::::::::`;'-'=,‐,='r''i~!:::::::::::::::|
!:::::::l、::r'"´'. ' l ' i::::::::iヽ:::l
i:l、:::|./、_____,l::::;l:/‐'ヽ!
'!ヽ;i'>l____,.//-‐'''"ヽ
!/ |.VVVVVVVV.lV\!. i
| | | l
>>526 じゃあなんだ、printf("Hello,world!\n");これも危険だってか?
>>506 勉強しなおしてください。引っかかる人がいるとは思いませんでした。
>>522 もしかして、
char *hello_world = "hello world!";
でメモリを明示的に確保する必要があると思ってる?
532 :
デフォルトの名無しさん :02/11/06 23:01
,.-ー''"~"'i, /~ ..:::::::!.,___ ,,..、-、, / .::::::::::::::`::::::~~""''''ー-,/~:::::::::.`i, / .:::::::::::::::::::::;;;;;;;;;;;;;;;;;;;::::::::::::::::::::::: i / .:::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::.. | ,/ :::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::::. i ,l' ::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::. | l ::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::::::: i おいおい、お前ら落ち着けよ・・・ i, ..:::::●:::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::::: ! _,,.i ..::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::●:: i' /~ 'l, ..:::::::::::::::::::::::::::|、;;;;;;;;;;;;;;;;;/::::::::::::::::: ,i' /~\ /,.、-ー 、;i, .::::::::::::::::::::::::::::::| ~"''''"/::::::::::::::::::: /~\ / i.,_ /'/ ..::::::::|::' ., :::::::::::::::::::::::::::::::|'⌒`ヽ,/;:::::::::::::::::: /:::::::.. \ ,i .::.. \ / i' .::::::::::/:::::::`・、., :::::::::::::::::::::::,人,__,/;;;;;::::::::::::::::/;;;;;;:;:::::.. ヘ / .::::....::::::::. `., ,i/( .::::::::::::i,::::::::::::;;;;;;~;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::-''";;;;;;;;;;;;;;;:::::.. \ / .:::::::::::):::::::::.. ヘ
>>526 もう一度C-FAQを読み直してきなさい。
>>506 はc faqの文字列の所を読んだ方が良いな。
文字列リテラルは名無しのstaticに確保されるが変更可能かどうかは不明。
>>529 printfは知らんが、sprintfは危険なのは知っている。
>>531 バグが潜む可能性があると提示したまでです。
>>535 うう、よく分かりません・・・。
やっぱりif else文を覚えたてでは無理ですか?
今はやさしいCっていう麻奈本で学んでるんですけど・・・。
>>536 char *str="abcdef";
この文は、char型へのポインタstrを宣言して、それを文字列定数"abcdef"の先頭アドレスで初期化しているということは理解しているよね?
,ィミ, ,ィミ, フ 彡 ミ 彡 ミ, ヤ | ,,彡 ミ、、、、、、、、彡 ミ, (⌒) レ | まあ落ち着けや 彡;:;: ミ, ( ヽ ヤ 〜三;:;::::: 彡〜 ノ ノ レ ~~三:;:;:;::::: -=・=- -=・=- 三~~ ヽ ( : ;; ~~彡::;:;:;:;:::.. ___ ,三~~ ( ノ ,,,,, : ;; ~~彡;:;:;:;:;:;:;:. |┴┴| ,ミ~~ ノノ ;'" ,,ノ―、 ,;' ~~彡:;:;:;:;:;:;:;:;. ノ――| ---==ニノ ,;'′ >=ニ(二二二() ,...-''''""~~,::;:;::;::;::;::;' ミ,, ,;'′ ゝ--〈 __,;";;:;;;;;;;;;;;;;;;;;;;;;:;:;:;:;:;:;:; i! ミ,,,,;'′ `ー‐' ::::ミミミ:;:;:;: ミ:: ,;' ̄ ̄ ̄ ̄| \___/ :::::ミミミ:;:;: ミ:::, ,;::''′ |. \/ ::::ミミミ:;:;:: ,;+''"~~゙+、~'''''~ | | ::::ミミミ:;:;:;: ,+'" ミ::::: | ━┷━━━┳━━━━━ :::::ミミミ:;:;:;:;: >':;: ミ:: | ┃ ::::::ミミミ:;:;:;:;:;../;:;:;: ;:" | ┃ ::::::::ミミミミ:;:/;:;:;:;: ,.+'"''-、________|__ ┃  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄;':;:;:;: ,.+'" ミ、 l ┃
>>536 発生しうるバグは
> 俺は確保されていないメモリに文字列を突っ込むのは怖いので。
で言い表されるのとは違うと思うのだが。
>>541 じゃあ
scanfでYESは1、NOは2ということでやってみます。
最初ここに来たときは傲慢な口調の奴ばかりで 「こいつら相当プログラムできるんだろうな」と思っていたが、 見てる内に大半はハターリで無能な奴ほど増長すると言う事が分かりました。
>>538 一応本職なので。
>>540 その回答には誤りがあった。認める。
俺が言いたかったのは明示的に変更を加えるような
ソースでない限り、変更が加えられるような恐れの
あるコーディングは危険だ、と言うことだ。
>>545 > 一応本職なので。
,. -───-: 、
/::::::::::::::::::::::::::::::::\
/ '':::::::::::::::::::::::::::::::''''' ヽ
!::::::::::ィ::ハ:::;::::::::::::::::::::::::::!
i::|:::i::/l/ i;::ト、:、:::i:::::::::::::::i
|::i/レ'-i'' 'ヽi-ヾ,ヽ!:::::::::::::l
|::ハ -‐- -─- i::::::::::::::l
|::::::l| | | | |::::::::::::::!
|::::::ヽ | r---、! l,.!::::::::::::::l
l::::::::::::`;'-'=,‐,='r''i~!:::::::::::::::|
!:::::::l、::r'"´'. ' l ' i::::::::iヽ:::l
i:l、:::|./、_____,l::::;l:/‐'ヽ!
'!ヽ;i'>l____,.//-‐'''"ヽ
!/ |.VVVVVVVV.lV\!. i
| | | l
547 :
デフォルトの名無しさん :02/11/06 23:15
>>536 本職とは思えないほどの知識の無さ。お願いだからC言語入門からやり直してください。
>>546 何言いたいか分からないよ。
> 明示的に変更を加えるような
何が何にどう変更を加えるの?
549 :
デフォルトの名無しさん :02/11/06 23:19
>>548 要するに
const char *hello_world = "hello world!!!!";
にしとけってことでは?
550 :
デフォルトの名無しさん :02/11/06 23:20
const char const * p = "hello japan";
わかったから "Welcome Hell World" にしときなさい。おまへら。
552=550? 551 は文字列の内容を指摘してるんじゃないと思うけど。
helloworldも書けない奴がしたり顔でc言語を教えているスレはここですか?
506が二人いるように見えるんだが、、、
"Naruhodo the World"希望
>>548 これはC++になるが、文字操作クラスのメソッドを作るときに
最終的には文字をポインタで操作するような事だ。
話がそれるが、俺はバグをなるだけ抑えるようなコードを書くために
慎重さを優先させてきたつもりだ。
>>547 の言うようにそんなに知識は無いがなるだけエラーを起こさない様に
努力しているつもりだが何が悪い?
>>549 なら、始めっからそう書くと思うんだよなぁ。
const付けるだけで「限りなく危険」なことが回避できるのなら。
560 :
デフォルトの名無しさん :02/11/06 23:29
プログラムを作る上で知識が無いのは致命的な欠点だと思うよ。 知らなかった、じゃあ済まされないからね。
>>557 なぜここで(必要も無い)C++を持ち出す?
563 :
デフォルトの名無しさん :02/11/06 23:33
>>557 あなたは超能力者ですか?
悪いとは一言も言っていない、何を言っているのかわからないって言ったんだ
けど・・・。
しかも、相変わらず理解できないよ。
> これはC++になるが、文字操作クラスのメソッドを作るときに
> 最終的には文字をポインタで操作するような事だ。
いきなり C++ かい、というツッコミは置いといて、主語が無いよ。
何を述べているのか全然わからない。
こんなに日本語ダメダメで、本当に本職さんなの?
>>536 =506
ちょっと痛すぎだよ。
素直に謝りを認めればいいものを...
566 :
デフォルトの名無しさん :02/11/06 23:34
>>506 はif-elseの人なの?文字列の人なの?
どっちなんだYO!
誤字訂正。 ×謝り→ ○誤り 素直に誤りを認めとこう。
>>564 どうしてそんなに頭がわるい?
文字列操作のクラスを自作してポインタを直接扱わなくてもいいようにしたんだ。
画期的だろ?
>>570 ネタはもうちょっとひねって書き込みましょう。
>>570 画期的だが、さっきからの話題とどう関係あるんだ?
Nooooooooo!!!
>>570 > どうしてそんなに頭がわるい?
と
> 文字列操作のクラスを自作してポインタを直接扱わなくてもいいようにしたんだ。
> 画期的だろ?
が全然繋がってないYO!!!
getch()でも、どうぞ
570 は騙りじゃないのか?
プログラマーって536みたいな人多いの?なんか開き直ってるし…。 しかしネタが無いからちょっと変な事言う奴を見つけると総出で叩かれるな。
つまり、 「文字列をポインタで持つのは、バグの元だからステ。 やっぱりC++でstringクラスでしょう」と570は、 このCスレで主張した、と、こいうことか?
>>575 あんたにわかると言うなら、もったいぶらずに解釈を書きなさい。
>>578 なるほど。
でもさっきからの話題とのつながりがよくわからないYO・・・
話題をそらそうとしただけかしら。。。
C++は例えばの話なのだが。
>>563 そうだったな、悪い。あれは俺の間違いだ。
>>564 例えは悪いが、良くあるサンプルで
int型nとiがメモリ上で並んでいたとしてiが何かの拍子でオーバーフローした結果、
nにも(不本意にも)影響が出てしまう。
つまり、いちいちポインタ云々で文字列操作をするとバグが出る可能性がある
と言いたかった。(扱う場合にはエラーが出ないよう慎重にコーディングする)
どいつもこいつも頭の悪いヤツばかりだな。
>>553 何言ってんだか…、やれやれアホにはついていけませんな。
int型のnをオーバーフローすると別のメモリに書き込みが行われるのか。 勉強になるな、うん。
>>580 >>548 が本物だとしたら、「C++出せば納得してもらえるだろう。どうせC++
わかんねーだろうし」ってとこじゃないか?
>>582 オーバーフロウってバッファオーバーフロウを指しているの?
じゃないとnに影響を与えることなんてないんじゃないか?
>>584 アフォですか?
const char const * p = "hello japan";
これ
const char * p = "hello japan";
とどう違うの?
ちなみに
>>570 は俺じゃない。
画期的かかは別問題として、ポインタを直接操作するのは
極力しないように勤めるのが、バグ減らしに有効だと思う。
桁あふれってCPU上で起こるんだからメモリーには影響を与えないような気が・・・
>>589 とりあえず、名前は固定しといてくれ。
バグの元だ。
番号だらけだな
>>590 386 は全部ネタだから無視して (・∀・)イイ!! よ。
もうグダグダだな。
>>589 unsinged int n = 0xffffffff;
n++;
うあっ、強制終了させられた!!(window2000)
>>596 う、今読み直して気付いた。逝ってくる・・・。
>>589 つまり、Hello, WorldでもC++のstringのようなものを実装してそれ使えと。
余計バグ増やしそうな気がするのは俺だけか?
>>590 そんな事初めて聞きましたが。俺の知識不足か!?
>>591 ああ、バグの元だ。済まない。
結局のところ、
>>506 の
> 限りなく危険だが、
は、Cの仕様を理解していなかったので 危険だという妄想を抱いた
ということでよろしいいか。
>>598 せめて(藁くらいつけろ。でないとお前がマジで言っているみたいだぞ。
unsinged ??
506 は C も会話もボロボロという事でよろしいか?
>>601 え?だって演算はCPU上で行うものだとばかり・・・
違うの?(ToT)
test.c:6: unsinged undeclaredまぁ確かに強制終了と言えなくも無いがww
>>606 自信持て。508 が電波キタ─wwヘ√レvv~(゚∀゚)─wwヘ√レvv~─ !! なだけだ。
508って誰だよ(藁
610 :
デフォルトの名無しさん :02/11/07 00:00
\ │ / \ │ / / ̄\ / ̄\ ─( ゚ ∀ ゚ )─ ─( ゚ ∀ ゚ )─ \_/ \_/ / │ \ / │ \ ∩ ∧ ∧∩ .∩ ∧ ∧∩ ∩ ∧ ∧ \( ゚∀゚) / ∩ ∧ ∧ \( ゚∀゚) / ( ゚∀゚ )/ | / . ( ゚∀゚ )/ | / | 〈 | | | 〈 | | / /\_」 / /\」 / /\_」 / /\」  ̄ / /  ̄ / /
611 :
デフォルトの名無しさん :02/11/07 00:00
オーバーフローが他のメモリを汚すなら、シフト演算なんて怖くてできないぜ。
>>606 メモリは計算器を持っていない。
だから一見メモリに対する演算でも、一旦 CPU にデータをフェッチして、演算後、
値を書き戻している。
この際、データ転送は変数の大きさ単位に行われる。
例えば符号無し 32bit 整数なら 32bit で。
計算結果が 33bit 目以降に起こっても 32bit で転送されるので、元のメモリの
別の変数領域が破壊される事は無い。
>>611 それを応用するとウイルスが出来る。
実際扱うのは関数ポインタなんだが。
>>608 >>612 ですよね。。。
常識のつもりでいたことが間違っているのかとおもって焦りました。。
>>609 名前の番号をころころ変えて周りを惑わしてる香具師。
616 :
デフォルトの名無しさん :02/11/07 00:03
>>613 あのさー、桁あふれとバッファオーバーフローを取り違えていない?
整数のオーバーフロー時に、隣のメモリを汚すのは ANSIの規定の許容範囲なのだろうか。
>>613 > それを応用するとウイルスが出来る。
本気で大丈夫ですか?
今度はオーバーフローですか?
620 :
デフォルトの名無しさん :02/11/07 00:07
| | | ________________________________________________ | | |_____ΦΦΦΦΦΦΦΦΦΦΦ||ΦΦΦ | | | ̄ ̄ ̄ /| || | | | / /|TTTTTT TTTTTTTTTT||TTTTT | /\ | /|/|/|^^^^^^ |三三| ^^^^^^^^^^^||^^^^^^^ | / / |// / /| | / / |_|/|/|/|/| | / / |文|/ // / |/ /. _.| ̄|/|/|/ ∧_∧ /|\/ / / |/ / (___) /| / / /ヽ /〔 祭 〕〕つ | | ̄| | |ヽ/l `/二二ヽ | | |/| |__|/ ∧_∧ / /(_) | |/| |/ ( ´∀`) (_) ∧_∧ | | |/ // / ^ ̄]゚ (` ) | |/ ゚/ ̄ ̄_ヽ ⊂〔〔 祭 〕 | / /_ノ(_) ┌|___| |/ (__) (_ノ ヽ ヽ / (_)
>>612 データ転送の単位は変数ではなくてアーキテクチャに依存すると思うんだが。
622 :
デフォルトの名無しさん :02/11/07 00:08
適当に法螺吹いて悦に浸っている DQN 本職がいるスレはここですか?
∧ ∧ ### / ヽ ./ .∧ /#####ヽ / `、 / .∧ / ##### \ /  ̄ ̄ ̄ ヽ / ##### ヽ l::::::::: .l / ##### ヽ |:::::::::: -==・- -==・- | | ::::::::: :::::::| .|::::::::::::::::: \___/ | | -・==- -・==- :::::::::| ヽ::::::::::::::::::: \/ 丿 | \___/ :: :::::::| ヽ::::::::::::::::: / ヽ \/ ::::::::::| ____>::::::::::::::::: <_ ヽ ::::;;;::::::::丿 /:::::::::::::::::::::::: ::::::::: /⌒ヽ⌒、⌒、⌒、 ::::::::: :<___ |::::::::::::;;;;;;;;;;;;;::::::::::::::: / /ヽノヽノヽノヽノ ::::::::::::: :::::::: :::ヽ |:::::::::::::::::::::::: / /:::::::: ::::::::::::::::::::: :::::::: 「未定義」論争いこうか? いいねぇ〜
> 510もネタくさいし・・・・ 同意・・・
>>510 はネタでは無いと思うが。
多少なりともcをかじってる奴はprintfのformat部をあんな風にすると言う発想が
そもそも無いと思う。作為的なものは感じられない。
| | | | | |_____ | | | ̄ ̄ ̄ /| | | | / /| | /\ | /|/|/| | / / |// / /| | / / |_|/|/|/|/| | / / |文|/ // / ∧∧ |/ /. _.| ̄|/|/|/ /⌒ヽ) /|\/ / / |/ / [ 祭 _] ∧∧ /| / / /ヽ 三____|∪ /⌒ヽ) | | ̄| | |ヽ/l (/~ ∪ [ 祭 _] | | |/| |__|/ 三三 三___|∪ | |/| |/ 三三 (/~∪ | | |/ 三三 三三 | |/ 三三 | / 三三 |/ 三三
>>628 フォーマット文字列をあんなにする奴がmainの引数を書くとはおもえん・・・しかも通常とは逆だし。
あと
>>530
兎も角だおまいら 未定義で不定なんだよ
>>613 > 実際扱うのは関数ポインタなんだが。
新たなネタですか?
age
ここはグダグダなインターネトですne
635 には脱帽。
ポインタがおかしくなゆので危険というのはこのスレのことだったのか。
Cスレにしては信じられない静けさ
639 :
デフォルトの名無しさん :02/11/07 03:58
この問題教えてください。 明日までの課題なんです。 「文字列配列を2つ渡すと、その2つの文字列を連結する関数を作成せよ。 ただし、関数は次の機能を持つ。 ・2つの文字列配列はポインタで受け取る ・文字列配列の操作はポインタの増加で行う。str[i]という操作は使わない。 ・結果は関数内で動的メモリ確保を行いそのポインタを返す。 」 神降臨キボンヌ。
641 :
デフォルトの名無しさん :02/11/07 04:07
そうっすね、スマソ
>>639 プログラムに疲れたのでその問題を激しく解いてマターリしたいんだが、
宿題スレでは聞いてくれないのか?
643 :
デフォルトの名無しさん :02/11/07 05:05
お(^о^〃)や(^О^〃)しゅ(^。^〃)みぃ(^-^〃)♪
char *futatsunomojiretsuworenketsusuru(char *mojiretsu1,char *mojiretsu2) { char *renketsushitamojiretsu,*p; renketsushitamojiretsu=p=(char *)malloc(strlen(mojiretsu1)+strlen(mojiretsu2)+1); if(renketsushitamojiretsu){ for(;*mojiretsu1;mojiretsu1++,renketsushitamojiretsu++) *renketsushitamojiretsu=*mojiretsu1; for(;*mojiretsu2;mojiretsu2++,renketsushitamojiretsu++) *renketsushitamojiretsu=*mojiretsu2; *renketsushitamojiretsu='\0'; } return p; }
仮引数はconst char *にすべきか・・・
char *strcat(char *s, char *t) { char *p, *q; q = malloc(strlen(s)+strlen(t)+1); for (p=q;*p++ = *s++;); for (p--; *p++ = *t++;); return q; }
>644 ありがたいです。 なんとかできそうですけど、pの意味って何ですか?
648 :
デフォルトの名無しさん :02/11/07 06:04
初心者です。C言語をVine Linuxのemacsでやっていきたいと思っています。 お勧めの本を教えてください。入門者から脱初心者へ行ける本がいいです。 住所が田舎でコンピューター関連の本が売っていません。ネットショッピングで買おうと思っていますが、内容がわかりません。 僕にぴったりの本を教えてください。
ライブラリ関数使っとけ。 char *func(const char *str1, const char *str2) { size_t size1 = strlen(str1); size_t size2 = strlen(str2) + 1; char *p = malloc(size1 + size2); if(p) { if(size1) memcpy(p, str1, size1); memcpy(p + size1, str2, size2); } return p; }
650 :
デフォルトの名無しさん :02/11/07 06:05
K&R 読むのは大変だがこれ一冊で十分。
こっちがマジレス。 #include <stdlib.h> char *func(const char *str1, const char *str2) { const char *pp; char *p; size_t len; for(pp = str1; *pp; ) pp++; len = pp - str1; for(pp = str2; *pp; ) pp++; len += pp - str2; pp = p = malloc(len + 1); if(pp) { while(*str1) *p++ = *str1++; while(*str2) *p++ = *str2++; *p = '\0'; } return (char *)pp; }
chr *func(const char *str1, const char *str2) { char *p = malloc(strlen(str1)+strlen(str2)+1); *p = '\0'; strcat(p, str1); strcat(p, str2); return p; }
654 :
デフォルトの名無しさん :02/11/07 06:10
>>653 mallocがNULLを返したらどうする?
chr *func(const char *str1, const char *str2) { char *p = malloc(strlen(str1)+strlen(str2)+1); if (p){ *p = '\0'; strcat(p, str1); strcat(p, str2); } return p; }
>>653 速度を考慮してあえてmemcpyを使ったんだが。
やったー、みなさんのおかげでできました。 ぼくにとっては一大事だったのでたすかりました。 MY HEROたちに感謝します。
char *func(const char *str1, const char *str2) { int i = strlen(str1); char *p = malloc(i+strlen(str2)+1); if (p){ strcpy(p, str1); strcpy(p+i, str2); } return p; }
char *func(const char *str1, const char *str2) { char *p=malloc(strlen(str1)+strlen(str2)+1); if(p)strcat(strcpy(p,str1),str2); return p; }
char *func(const char *str1, const char *str2) { char *p=malloc(strlen(str1)+strlen(str2)+1); if(p) sprintf(p, "%s%s", str1,str2); return p; }
char *func(const char *str1, const char *str2) { char *p=malloc(strlen(str1)+strlen(str2)+1); if(p) strcpy(p+sprintf(p,"%s",str1),str2); return p; }
662 :
デフォルトの名無しさん :02/11/07 06:29
で、どの方法が一番すまぁとなの?
660
すまぁとの基準による。 俺的には俺の649。
665 :
デフォルトの名無しさん :02/11/07 06:32
一番だめだめ〜なのは?
660もいいね。
649よりは658
だめだめ〜の基準による。 俺的には俺の652と661。
memcpy と strcpy ってそんなに差がある?
処理系(ライブラリ)依存の話になるけど、一般的には あらかじめ長さがわかっている文字列をコピーするなら strcpyよりmemcpyの方が有利。実装を考えてみるといい。 ただ、可読性ではstrcpyの方がすっきりするね。
strcpyは0の検出処理をし、memcpyは指定されたバイト数に達したかどうかを検出する。 大差ないだろ。
長さがわかってるんならcharごとじゃなくて ある程度の大きさづつコピーできるな。
674 :
デフォルトの名無しさん :02/11/07 06:52
>>672 ライブラリ関数のソースでも読んでみればいい。
まあコンパイラによってはインライン展開するものもあるから
アセンブルリストを出力させる必要があるかもしれんが。
676 :
デフォルトの名無しさん :02/11/07 07:01
RtlMoveMemory( dst, src, count ); VC++6.0 なんだこの関数は?
>>676 memmoveで#defineされてない?
あ、MoveMemoryの話と間違えた。
void *memcpy(void *dest,const void *src,size_t n) { unsigned char *destp=(unsigned char *)dest; const unsigned char *srcp=(const unsigned char *)src; for(;n--;destp++,srcp++) *destp=*srcp; return dest; } 昔書いた奴。 環境に依存する形でかけばもっと効率がよくなるのかな・・・
長さ100の配列で試してみたら memcpy の方が圧倒的に速かった
たった100でよくわかったな・・・
短かい方が strcpy に有利だと思ったけど? 長さ10000でもやったよ。結果は変わらないけど
VC++6.0のclock程度じゃそこまで精密にはかれない。
>>684 (゚Д゚)ファア?
ループで繰り返したに決まってんじゃん
くだんねぇこと聞くなや。ハグェが
>>686 ならなぜ素直にもっと巨大な配列を使わないんだ?
688 :
デフォルトの名無しさん :02/11/07 07:32
で、巨大な配列をつくってやってた。 一桁ずつ増やし、1千万文字にしてやっと差が出たよ・・・・ 確かにmemcpyの方が速かった。でも問題になるようなものじゃないと思う。
「つくってやってた」じゃなくて「つくってやってみた」
>>687 大きい配列だと確実に strcpy 不利だと思ったんだけど違うかな?
ちなみに 1,000,000でもやってみたけど strcpy の方が2倍近くかかる
>>691 (CPUの計算速度によるが)そこまで大きな配列を使うか、よほどループさせなければ問題になるほどじゃないだろ?
元々時間のかかる処理じゃないから例え二倍でも大差ないと言いたいだけ。
俺もVC++5.0でループを使って計測してみた。平均して 100文字で約5倍、1000文字で約11倍程度の速度差だった。 まあそれでもstrcpyを使うのは勝手だが、俺ならmemcpyだな。
>>692 strcpy や memcpy みたいな関数はプログラム内で何万回も呼ばれたり
することだってあるわけだから十分問題だと思うんだけどなぁ...
696 :
デフォルトの名無しさん :02/11/07 07:53
memcpyを自分で書けと言われたらどう書く?
用途次第だな。 毎回書くようなソースならともかく、 一度作っておけばOKな使い回しのきく関数であれば memcpyで書いておいて損はないと思うが。 というか、strcpyにこだわってる奴は1人だけか?
長さの分かっている文字列のコピーといえばstrdupがあるけど、これもmemcpyで書くのが一般的?
>>696 こんなことしたら速くなったり......しないよね
そのまえにまともに動作しないかも
できるだけ long 型でコピーできる分は long でやるようにしてみたつもりなんだけど
void *memcpy( void *dest, const void *src, size_t n ) {
size_t x = n / sizeof(long), y = n % sizeof(long);
size_t i;
long *dl = dest; const long *sl = src;
char *dc; const char *sc;
for ( i = 0; i < x; i++ ) *dl++ = *sl++;
dc = (char *)dl; sc = (const char *)sl;
for ( i = 0; i < y; i++ ) *dc++ = *dl++;
return dc;
}
上、意味不明ナリ strdupはstrcpyとおなじくらい長さは分かってないけど。
>>698 マテ。
strdup()の仕様をもいっぺん読み直した方がいい。
>699 bus error.
703 :
デフォルトの名無しさん :02/11/07 08:09
(;´Д`)いきなり間違ってたスマソ for ( i = 0; i < y; i++ ) *dc++ = *dl++; → for ( i = 0; i < y; i++ ) *dc++ = *sc++; やっぱダメだ忘れてください......
第一、さっきの文字列連結関数もそういう理由でmemcpyをつかったんでしょ!?
>>702 え......なんスか?バスエラーって?
なんかマズいことしてます?(;´Д`)
strcpyとmemcpyの速度の差ってstrcpyが関数内でコピーサイズを調べるからでしょ。 memcpyは関数外でコピーサイズを調べなきゃいけないから、結局変わらない。
>>699 そのままでは、ワードデータのアライメントを要求するCPU(680x0とか)では
ちょっとまずい。与えるアドレスが奇数だとaddress errorになる。
x86でも、エラーにはならないが遅くなったりする。
でも、基本的な考え方(できるだけ大きな単位でデータを移動)はいいのでは?
ライブラリのmemcpy()のソースも、アセンブラで書いてあったり、キャッシュ
を考慮して命令の配列に気を配ったりしているけど、基本的にはそんな感じ。
>>707 strcpy()は'\0'が来るまでコピーという仕様だから、1バイトずつコピーする
以外に実装のしようがない。
memcpy()はあらかじめデータサイズが分かっているので、
>>699 のように
サイズが4の倍数だったらlong単位でコピーする、などの高速化が図れる。
>>708 なるほど.....正直CPUの動作のこと全然知らなかったです。サンクス
昔、アセンブラで組んだときに、少しでも速くコピーするために push、popを使ってメモリの転送したなー。
そこまで速度を気にするなら、もちろんprintf("Hello,world");なんてやっていないよな?
>>709 strcpyでも'\0'が来るまでのサイズを調べてから4の倍数だったら
long単位でコピーすれば良い。
今は MMX の 64bit 転送しか使ってないな
>>713 わざわざstrcpy内部であらかじめstrlenを取得するのか?
>>713 もあほらしいが、速度に過敏なmemcpy厨もあほらしいな。
>>713 そこまでするなら素直にstrcpy内からmemcpy呼べ、と
>>715 そっちの方が速いならそう書けば良い。
strcpyってstrlen+memcpyという実装でもいいわけだろ。
>>718 strlen による速度低下のほうが烈しくないか?
てかstrcpy厨に質問ですが、なんでmemcpyで済むところに わざわざstrcpyを使おうとするの?
>>719 memcpyでやる場合も関数外でやるだけであってstrlenが必要。
>>718 > そっちの方が速いならそう書けば良い。
あほですか?
4の倍数じゃなかったら数倍遅くなるわけだが。
724 :
デフォルトの名無しさん :02/11/07 08:38
memsetも複数バイトごとに書き込んでいたりする?
725 :
デフォルトの名無しさん :02/11/07 08:39
>>720 文字列のコピーはサイズがあらかじめわからないのでmemcpyだけじゃできませんよ。
727 :
デフォルトの名無しさん :02/11/07 08:40
>>721 必要だけど、それはmallocで使ったりするんじゃない?
729 :
デフォルトの名無しさん :02/11/07 08:40
>>728 strcpyなら文字列を丸ごとコピーしているとすぐに分かるだろ。
>>723 そうだね。memcpyも4の倍数じゃなかったら数倍遅くなるね。
memcpyだとコメントでもないかぎり、なぜmemcpyなんだ!?と思う。
>>729 コメントつけるなりしてください。そんなところで可読性気にするより
なんか勘違いしてる奴がいるようだが、俺がstrcpyよりmemcpy の方が有利と書いたのは、長さがわかってる場合という前提だからな。 671で書いてるが。
>>733 VC++6.0のstrdupのソース見てみた。文字列の長さがコピー時には分かっているのにstrcpyを使っているね。
このソース糞だね。
>>734 糞です。いますぐ窓から投げ捨ててください(w
>>730 お前ほんとに短絡思考だな。ここまで来るとネタとしか思えん。
memcpyって文字列以外の配列のコピーのためにあるんだと思っていた・・・ 確かに文字列のコピーに使えないことはないけど。
>>734 そりゃ確かに糞だな。
CStringなんかは全部memcpyなのにな。
739 :
デフォルトの名無しさん :02/11/07 08:46
↓これ。 char * __cdecl _strdup ( const char * string ) { char *memory; if (!string) return(NULL); if (memory = malloc(strlen(string) + 1)) return(strcpy(memory,string)); return(NULL); }
>>739 それ書いたやつはきっと過労で疲れてたんだよ、きっと
んで、結局彼は何が言いたいんだろう。 strdupがstrcpyを使ってるからstrcpyを使いましょうってか? まさかこのケースでもstrcpyの方が速いとか思ってないよな。
std::stringが最強です。
744 :
デフォルトの名無しさん :02/11/07 08:57
char * glibcはmemcpyか。結構メジャーな方法なのか? ところで、C++のソースとしてコンパイルするとエラーになるな(ワラ char * __strdup (const char *s) { size_t len = strlen (s) + 1; void *new = malloc (len); if (new == NULL) return NULL; return (char *) memcpy (new, s, len); }
おっと、一行目は無視してくれ
>>709 俺の記憶が正しければ、VC++のstrcpy()はワード境界からずれた
先頭と末尾以外はワード単位で転送してたように思う。
NUL文字の検出はなかなか思いつかなそうな方法使ってたよ。
747 :
デフォルトの名無しさん :02/11/07 10:50
半角って1バイト?漢字が2バイト?
2バイト半角文字を知らんのか?
750 :
デフォルトの名無しさん :02/11/07 11:03
マンコプログラム
>>750 関係ないけど、あなたの言葉はあまり良くないよ。
もう少し何とかならないのかね。
いくら匿名掲示板だからといって軽率すぎますよ。
2バイトのかなや数字も知らないようです。
753 :
デフォルトの名無しさん :02/11/07 11:10
ircのようなチャットサーバを作りたいのですが、 なにか参考になるソフトウェアとかはないでしょうか?
>>753 IRCチャットサーバー参考にすればいい。
>>753 socketについて調べて見な。
IRCはチャットの一言では片づけられないシステムだよ。
756 :
デフォルトの名無しさん :02/11/07 12:05
>>756 >確認ですが、これはVineLinuxでemacsでC言語を勉強する人向けのもので入門から脱初心者までの本ですか?
>Windows向けのものではありませんよね。
プラットホームは特定してません。
内容は基礎を一通り。
>>688 それがわからないようなレベルであれば買っといて損は無い。
>>746 glibcのソースを見てみたら、同様に可能な限りワード単位で転送していた。
というわけで、
>>709 は撤回。
NUL文字の検出はすごいねえ。元のソースはアセンブラで書いてあったが、
Cに直してみるとこんな感じ。
/* unsigned longの4バイトのうち1バイトでも0x00があったらTRUE */
int isnul(unsigned long a)
{
unsigned long b = a + 0xfefefeff;
return (a <= b) || (((~a ^ b) & 0x01010100) != 0);
}
ぱっと見では何やってるのかさっぱり分からん。
760 :
デフォルトの名無しさん :02/11/07 13:55
>>757 >>758 いや、C言語の入門書は一冊もっているのです。しかし、Windows用なのでLinux emacs用のがほしいのです。
761 :
デフォルトの名無しさん :02/11/07 14:01
キャンセルは今日中なので教えてください。もう注文してしまったのです。emacsでやってる本がほしいです。
>>760 その本はWinとかUnixとか、環境に関係なくCを解説してるよ。
エディタとかデバッガとかLinuxでの開発環境の勉強をしたかったら
別に本を買う必要があるよ。
764 :
デフォルトの名無しさん :02/11/07 14:16
つまりそれはC言語に特定しないLinuxの勉強本が他にいるということですか。 Windows用のを買ってしまって大変後悔しているのです。emacsでC言語をやりたいと言えば、やはりお勧めは前述の本が妥当なのですね?
>>764 太い回線と検索能力と何時間でもモニタを見ていられる視力があれば
大概の情報はweb上に存在するので本など買わなくてもいい。
# 嘘情報、古い情報も大量にあるけど
>>767 どうやって嘘情報を見破ればいいですか?
>>768 ん?学校で習わなかったか?
三つ以上の情報を見て、正しそうなのを信じるのさ。
>>768 プログラムの経験がある程度あるなら、もっと
Linuxよりの解説書を薦めるけど、経験無しなら
その本とEmacsの解説書を買えばいいよ。
771 :
デフォルトの名無しさん :02/11/07 14:28
void *v; int a=5;(別になんでもいいけど) *(int*)v=a; っていうのは可能ですか? wgetのソース見てたらこういうのがあったんですが 手元でやってみたら segmentaionfaultです。 なんでかな
772 :
デフォルトの名無しさん :02/11/07 14:29
vに何も入っていない。
773 :
デフォルトの名無しさん :02/11/07 14:34
あ すまんです
774 :
デフォルトの名無しさん :02/11/07 14:54
int main(void) { void a; } というのを書いてみたら コンパイラに「voidで宣言されてます」 といわれてエラーになるんですが コンパイラが壊れてるんですか?
776 :
デフォルトの名無しさん :02/11/07 14:57
>>775 あの真剣に分からないのですが
軽めに説明してくれませんか?
777
>>776 void の意味をわかれ。調べれ。以上。
>>774 >void a;
この行にコメントを付けるとすればアナタはどんなことを書きますか?
/* 型がきまってません */ とか? ですか?
void a; /*voidにする*/ だろ
こういう明らかに入門書の一冊でも読んでないようなヤツは、無視して欲しいというのが正直なところ。
>>779 780 と 781 はものすごく正しいから、もうちょっと考えてから書いてくれ。
いや、違う。 780 は間違ってるぞ。
>>774 何をするつもりで void a; と書いたわけ?
voidの大きさなどが仮にでも決められてるとしたら
どんなもんだろうと思いまして
>>782 ここまで怒られるとは思いませんでした
ショボン。。
>>786 気持ちもわからんでもないが、妄想から書いたコードをコンパイルできなくて
「コンパイラが壊れてるんですか?」 とかほざいてたら放置したくもなるだろう。
>>786 だったら「コンパイラが壊れてる」なんてふざけたことを書かないで、
こういう動機でこのコードを書いて、こういう結果がでたので、こう考
察しましたとか、まじめに書けや、
>>774 void の意味を英和時点で牽いておけ。
> 時点 アヒャーー ∧∧ (゚∀゚ )⌒ヽ ≡≡ = = - ,.、,,U‐U^(,,⊃_ /i ≡≡≡ = = - ;'゚∀゚ 、、:、.:、:, :,.: ::`゙:.:゙:`''':,'.´ -‐i = ≡≡≡ = = - '、;: ...: ,:. :.、.:',.: .:: _;.;;..; :..‐'゙  ̄  ̄ `" ◎ ''`゙ ◎ ´´ - = ≡ = = -
void *aの間違いでしょ。
>>759 じゃあstrcpyで問題ないじゃん。
>>791 786 で言っている事の何が void* なんだ?
793 :
デフォルトの名無しさん :02/11/07 15:41
デクリメントですむmemcpyと違って strcpyの\0判定はもっと手間がかかっているでしょ。
関数が載っているだけの薄い本じゃない?
>>792 きちんと見ないでレスしてしまった(^_^;)
スマソ
>>791 問題をきちんと理解しとかなきゃ。
・前もって文字列の長さがわかってるとき
・そうじゃないとき
の二通りがあって、memcpy使ったほうがいいといってるのは
前者の場合だ。発端となった
>>639 の問題の場合、
mallocするために文字列の長さを得る必要があった。
その後コピーするわけだが、その場合文字列の長さがわかってる以上、
strcpyよりもmemcpyするほうが速いという議論だったのだ。
んで、おれの意見を書くと、速度についてはそうなることが期待できるから同意はする。
ただ速度が重要な部分以外ではそんなことやらない。strcpyを使う。
>>793 スレ違い。とりあえずC-h Tやっとけや。入門はこれで十分。
>>797 strcpyは一文字ずつ、memcpyは通常ワード単位でコピーするから速いってことじゃなかったのか?
strcpyもワード単位ならstrcpyでいいじゃん。
ところで、VC++6.0にSTRCPY.Cがないんだが、strcpyのソースはどこにあるんだろう・・・ まさか削除してしまったのか。。
int n=100; int *p; p=&n; この場合,*ptは100(n)を指しますよね(100というかnのアドレスの中身ですよね?)。 &*ptの場合は,nのアドレスを指している事になるのでしょうか?
>>799 本当にそうか?
memcpyの整数をデクリメントしていって、0かどうかを比べるのと、
strcpyの
>>759 のような複雑な判定するのとどっちが速い?
もっとも、
>>759 についてはおれ、よーわからんわ。
本当にこれで判定できるのか。あとでじっくり考えてみよう。
>>802 まあ遅い・・・だろうな。
判定のために関数を呼ぶみたいだし。
でもそれほど遅くなるのかなあ?
ふと思ったんだけど、ワード単位でコピーしていってその中に0があるかどうか判断する方法って 場合によってはアクセスしてはならないところにアクセスすることにならない? memcpyならコピーする大きさが決まっているからできるかぎりワード単位でコピーして、 残りは1バイトずつコピーするので問題ないけど。
VC6で計ったら、strcpy()のほうがだいぶ早かった。
>>803 うん。速度の差があったとしても問題になることはまずないだろう。
だから何やってるか一目わかるしパラメータが一つ少なくて済む
strcpyを普通は使うと思う。少なくともおれはそう。
あ、そんなことないか。 調べる時は1バイトずつやるんだもんな(^_^;)
>>802 printf("%p\n", &n);
printf("%p\n", &*pt);
とでもしてみたら。
; strcpy(d, s); push esi push edi mov edi, DWORD PTR _s$[esp+4] or ecx, -1 xor eax, eax repne scasb not ecx sub edi, ecx mov eax, ecx mov esi, edi mov edi, DWORD PTR _d$[esp+4] shr ecx, 2 rep movsd mov ecx, eax and ecx, 3 rep movsb pop edi pop esi
; memcpy(d, s, n); mov ecx, DWORD PTR _n$[esp-4] push esi mov esi, DWORD PTR _s$[esp] mov eax, ecx push edi mov edi, DWORD PTR _d$[esp+4] shr ecx, 2 rep movsd mov ecx, eax and ecx, 3 rep movsb pop edi pop esi
812 :
デフォルトの名無しさん :02/11/07 16:12
strcpyを使うときには文字列の大きさがわかってないと ちゃんと使えんでしょう。 で、大きさが分かってるとmemcpy使えるんですよ。
VC6SP5。 ストリング命令が 3 つの strcpy() より 2 つの memcpy() の方が絶対速い。 805 は一体どんなテストをしたんだ?
810 のコードは、どうも strlen() + memcpy() に見えるな。 だったら、長さがあらかじめ分かっている場合に限って、memcpy() 単体 の方がいいような。
>>808 してアドレスが同じだったので,自分の考え方が正しかったか聞きたいのです
816 :
デフォルトの名無しさん :02/11/07 16:21
strcpyとたいして変わらんかった。 void mystrcpy(char *s, const char *t) { memcpy(s, t, strlen(t)+1); }
>>805 はミスだった。
やっぱりmemcpyのほうが速い。
そういえば 810 のコード、759 がかけらも見当たらないね。 1 ワードずつ判定していくより、先に長さを測ってストリング命令 かました方が速いのか。
819 :
デフォルトの名無しさん :02/11/07 16:29
void *やconst voidがヘルプ見るとやたら出てくるんだが わかりやすく説明してもらえないでしょうか
821 :
デフォルトの名無しさん :02/11/07 16:39
>>820 スマソ
関数の説明で
void func(void *a)
とあった場合何を引数で渡していいかわからんのです。
>>821 ポインタなら何でもいい。
全てのポインタはキャスト無しに void* へ暗黙変換できる。以上。
823 :
デフォルトの名無しさん :02/11/07 16:41
hoge i, p[], *q; func(&i); func(p); func(q);
>>799 判定の条件が増えるわけだから当然多少は遅くなる。
実際のソースじゃ判定を関数なんかに分けてないよ。
そんなことしたら1バイトずつ調べた方が速くなる。
strdup()でstrcpy()を使うメリットはない。malloc()する前に文字列長を
調べてあるわけだから、終了判定が単純なmemcpy()の方が速いはず。
とはいっても、短めの文字列だったら数クロックの差くらいしかない。
malloc()にかかる時間の方がけた違いに大きいから、差はないも同然。
>>804 文字列の終端を調べる時にワード単位で読み込んでも問題ない。
数バイト多めに読み込んでも、その内容を書き換えるわけじゃない。
ワード境界に沿ったワード読み込みの場合はページ境界をまたがないから、
ワードの先頭バイトを読み込める状況ではAccess Violationも起こりえない。
825 :
デフォルトの名無しさん :02/11/07 16:44
>>818 あれは関数としてリンクする場合のstrcpy()のコードだよ。
>>810 のは最適化で組み込み関数を展開した場合のコード。
毎回展開するからサイズを大きくするわけにいかないのと、
関数呼び出しのコストがかからないから、それでも十分に速い。
>>826 そうなのか。
ところで VC6 の CRT の strcpr() のソースが見当たらないのだが
> strcpr() ∧∧ /⌒ヽ) i三 ∪ ○三 | (/~∪ 三三 三三 三三
strcpyはmemcpyに勝てないのか!?
strcpy = strlen + memcpy と思って間違いないと。
どうでもいいことで熱くなれるC老子
>>827 あ、あなたもないの?
じゃあやっぱり誤って削除したんじゃなくて元々なかったのか・・・
833 :
デフォルトの名無しさん :02/11/07 17:22
/* 可変長配列 */ #include <stdio.h> int main(void) { char buf[256]; int size; int *vc; int i; puts("■可変長配列■"); printf("作成する配列のサイズを入力してください:"); fgets(buf,256,stdin); sscanf(buf,"%d",&size); vc=malloc(sizeof(int)*size); for(i=0;i<size;i++) { vc[i]=i; printf("vc[%d] = %d\n",i,vc[i]); } return(0); }
このソースのmalloc部分で警告が出るんですが、何でですか? 警告文は以下のようです。 test1.c: In function `main': test1.c:19: warning: assignment makes pointer from integer without a cast こんぱいらはGCCです。
835 :
デフォルトの名無しさん :02/11/07 17:25
#include <stdlib.h>
836 :
デフォルトの名無しさん :02/11/07 17:25
837 :
デフォルトの名無しさん :02/11/07 17:29
宣言してないと int malloc(); と解釈される。
>800,827 crt\src\intel\strcat.asm をよくみろ。
839 :
( ○ ´ ー ` ○ ) :02/11/07 17:40
だれか、このグチャグチャな自作関数を修正してやってください。 内容は、char *s1,char *s2後方検索して 後方検索したものを、語尾にくっつけあうというものです。 どんな修正方法でもかまいません。 char *str_cat_chr(char *s1,char *s2,int c) { char *p1=NULL; char *p2=NULL; char *r1=s1; char *r2=s2; char *temp1=s1; c=(char)c; while(1){ if(*r1=='\0') break; if(*r1==c) p1=r1; r1++; } while(1){ if(*r2=='\0') break; if(*r2==toupper(c)) p2=r2; r2++; } *p1='\0'; *p2='\0';
840 :
( ○ ´ ー ` ○ ) :02/11/07 17:41
while(*s1) s1++; while(p1&&p2){ if(!(*s1++=*s2++)) break; } *s1='\0'; return temp1; }
>>838 サンクス。
しかし、strcat() とコピールーチンが共通だとは思わなかった。
strcpy() を使うと、strcat() も問答無用でリンクされるのか。
肝の部分。glibcのとほぼおなじだな。 main_loop: ; edx contains first dword of sorc string mov [edi],edx ; store one more dword add edi,4 ; kick dest pointer main_loop_entrance: mov edx,7efefeffh mov eax,dword ptr [ecx] ; read 4 bytes add edx,eax xor eax,-1 xor eax,edx mov edx,[ecx] ; it's in cache now add ecx,4 ; kick dest pointer test eax,81010100h je short main_loop
844 :
デフォルトの名無しさん :02/11/07 17:43
>語尾にくっつけあうというものです。 語尾にくっつけあるというのはいったいどういうことを指すの?
845 :
( ○ ´ ー ` ○ ) :02/11/07 17:43
これは、string.hの後方検索とstrcat()のようです。 宿題○投げとはいいません。
>>845 宿題であろうがなかろうが添削は添削だ。とっとと逝け。
>>845 843 は 「宿題」 とは一言も言っていない。丸投げは丸投げ。
848 :
( ○ ´ ー ` ○ ) :02/11/07 17:49
ちょっと、日本語がおかしかったね。 ある文字nを、大文字小文字 の区別なしにs1、s2を後方検索により二つの文字のNULLの位置をわりだす。 お互いのNULLの位置を、認知してs1の語尾にくっつける。 なんでも、結構です。 これに、対する指摘をお願いします。
>二つの文字のNULLの位置をわりだす。 なんのこっちゃ。
850 :
( ○ ´ ー ` ○ ) :02/11/07 17:52
NULL文字のことです。(¥0)
strcat使え。あと添削スレへ行け。
852 :
( ○ ´ ー ` ○ ) :02/11/07 17:56
俺は、荒らしか・・・・age
>>848 s1、s2 が長さ 0だった場合に、*p1='\0'; *p2='\0'; がコケる。
つーか、スピードが問題で無いなら素直にライブラリ関数使い倒せ。
char *str_cat_chr(char *s1,char *s2,int c)
{
char *p1 = strchr(s1, c);
char *p2 = strchr(s2, c);
if(p1) *p1 = '\0';
if(p2) *p2 = '\0';
return strcat(s1, s2);
}
>>852 もしかして自覚無いの?
スレ違いの事書いたら普通は、つもりがあろうが無かろうが荒らしなんだけど。
文字のNULLをわりだすってんだからさ、 N,U,L,L の連続4文字を探すんじゃないの?
856 :
デフォルトの名無しさん :02/11/07 18:00
後方検索で大文字小文字区別しないんだからstrchrは・・・。
>>853 そのソースを見た方が( ○ ´ ー ` ○ )の説明を見るよりもよくわかる・・・・(w
要はcの部分まで切りつめてくっつけるってことか。
あ、後方でしかも大文字小文字区別なしか。
じゃあ
>>853 はだめじゃん。
↓大文字小文字区別なしに後方探索する関数をかいてみた。テストしていないけど(^_^;) char *strcaserchr(const char *s,int c) { const char *endp=s; for(s+=strlen(s);s>=endp;s--) if(toupper(*s)==toupper((char)c)) return (char *)s; return NULL; }
char *str_cat_chr(char *s1,char *s2,int c) { char *p1=NULL; char *p2=NULL; char *r1=s1; char *r2=s2; c=(char)c; for (;*r1; r1++) if(*r1==tolower(c) || *r1==toupper(c)) p1=r1; for (;*r2; r2++) if(*r2==tolower(c) || *r2==toupper(c)) p2=r2; if (p1) *p1='\0'; if (p2) *p2='\0'; return strcat(s1, s2); }
c=toupper((char)c); if(toupper(*r1)==c)
char *strcaserchr(char *s, int c) { char *p = NULL; for(c = toupper(c); *s; s++) if(toupper(*s) == c) p = s; retrun p; } strlen() が余計。 toupper() への引数を (char) にキャストする必要は無い。
予期せぬ燃料だった
/* 何でこの程度の問題があんなに長くなるんだろう? */ char *str_cat_chr(char *s1,const char *s2) { char *p1; for (p1 = s1 + strlen(s1) - 1; *s2 != '\0'; p1++, s2++) *p1 = toupper(*s2); return s1; }
char *str_cat_chr(char *s1,char *s2,int c) { char *p; if (p=strcaserchr(s1,c)) *p='\0'; if (p=strcaserchr(s2,c)) *p='\0'; return strcat(s1, s2); }
864 + 867 が最適解かな。 866 は仕様が読めないアフォ
>>864 あれ?strchr系ってcharにキャストしなければならないんじゃなかった?
>>869 toupper() を通過しているから問題無い。
と思ったが、違かったようだ。すまん。
861 + 863 のが速いかもな
>>871 何人かが書いてきづいたいけど、
for(s+=strlen(s),c=toupper((char)c);s>=endp;s--)
if(toupper(*s)==c)
とやらないと無駄な処理をするね。
以前かいたstrrchrをほとんどそのまま流用したのが悪かった(^_^;)
873 :
デフォルトの名無しさん :02/11/07 18:43
グローバル変数とローカルな静的変数はスコープが違うだけで領域はおなじところを使うことが多いですか?
こんなんどうだろ。 char *strcaserchr(char *s, int c) { char *p=strrchr(s, toupper(c)); char *q=strrchr(s, tolower(c)); retrun (p-q > 0) ? p : q; }
>>873 何を言っているか分からない。
格納されている領域が同じなら、どうしようと言うわけ?
格納されている領域が違ければ、どうしようと言うわけ?
これもありだな。 char *strcaserchr(char *s, int c) { char *p = NULL, low=tolower(c); for(c = toupper(c); *s; s++) if(*s == c || *s == low) p = s; retrun p; }
どうしようと言うわけ?
>>874 2 回も走査するのは遅くないか?
あと今気付いたが、名前、struncaserchr() のが良くないか?
strrchr_uncase
>>875 (感覚的だが)近くに配置される、って事じゃあないかな。
>>880 いや、そんな事はわかってる。
事実、VC6 では同一 DATA セグメントに詰め込まれるし。
漏れの言いたいのは、スコープが違うというだけで充分区別つけられるのに、
どうして処理系依存の、格納される領域の事なんか訊ねるんだという事。
>>873 コンパイラに聞け
#include <stdio.h>
int gi;
static int mi;
static void hoge(int pi);
int main(void)
{
int li;
static int lmi;
hoge(li);
printf("%p %p %p %p\n", &gi, &mi, &li, &lmi);
return 0;
}
static void hoge(int pi)
{
static int lmi;
int li;
printf("%p %p %p\n", &pi, &li, &lmi);
}
あり?Mozilla 1.0では&piがπに見える... Mozillaのバグか?
あーあ、せっかくレジスタに割り当てようと思ったのに。
確認しておきたんですが、 コンパイルを実行した時の流れを大まかに書くと プリプロセッサ #を展開 ↓ コンパイラ objファイルを作る ↓ リンカ objファイル、標準ライブラリを利用してexeファイルを作る。 ですよね? ということは、 モジュール化してないCファイルがobjファイルを 作らないのはかなり矛盾していませんか? どういうことなんでしょうか?教えて下さい。 objファイルがないとリンカがexeファイルを作れないと思うんですが。
>モジュール化してないCファイルがobjファイルを作らない どういう意味?
javaみたいなもんを想像してるんでは? クラス -> .obj -> .exe みたいな。 Cはクラスノ概念がないからモジュール化なんて出来ないじゃないか!みたいな。 (まぁ、この時点で間違ってるんだが)
注意:objファイルは、オブジェクト指向とは何ら関係ありません
↑ >モジュール化してないCファイルがobjファイルを作らない つまり、リンクしていない単独のCファイルのことを言っていたのです。
891 :
デフォルトの名無しさん :02/11/07 21:06
コンパイラがリンカも呼び出してる。
objをオブジェクト指向と関連付けて考えてるのかー。 すげー。
893 :
デフォルトの名無しさん :02/11/07 21:09
まあ、無名のobjファイルを作ってリンクしたあとに消してると思えば。
894 :
デフォルトの名無しさん :02/11/07 21:16
お前ら、C言語でGUIやるにはどうしたらいいんですか?
885 は何か勘違いしてないか? .c をコンパイルすれば必ず .o なり .obj なりができる。 単に、.obj ファイルを残さないオプションでコンパイルしてるんじゃないか? (「.obj ファイルを残さない」 → 891 + 893)
>>894 C で GUI はできません。
プラットフォームに頼る事になるので、それにふさわしいスレで訊いてください。
897 :
デフォルトの名無しさん :02/11/07 21:20
gccは-oしないと作んないよね。
898 :
デフォルトの名無しさん :02/11/07 21:20
VBとJavaをやっていたものです。 これからCに移ろうと考えております。 一応CやC++の文法や概念は一通り理解しているつもりですが、 Cのコンパイラがどこにあるのかわかりません。 DOSとコンパイラのみで練習したいのですが、フリーのものどこかにないでしょうか? あとできれば教養程度にどんな企業が出しているかとか種類とかいろいろ詳しく教えてくれるとありがたいです。
899 :
デフォルトの名無しさん :02/11/07 21:21
今サンプルソースを見てたんだけど、 mallocを使うときは int *vc; って宣言してるのに reallocを使うソースだと int *vc=NULLって宣言してるんだよね。 なんでヌルポインタで初期化する必要があるん?
>>897 -oは実行ファイルにつける名前を指定するだけだよね?
901 :
デフォルトの名無しさん :02/11/07 21:22
902 :
デフォルトの名無しさん :02/11/07 21:22
ボーランドがフリーのだしてる。
>>895 やはり、LSI(試食版)ってデフォではリンクしていないCファイルは
objファイルを残さないんでしょうか?
↑例外として、リンクするとobjファイルができます。
>>899 reallocの仕様を調べてくださいです。
905 :
デフォルトの名無しさん :02/11/07 21:22
>>899 reallocの第一引数にNULLを与えるとmallocと同じ動作をするから。
ちなみに第二引数に0を与えるとfreeと同じ働きをする。
906 :
デフォルトの名無しさん :02/11/07 21:22
それにしてもこのスレは早いね。 そろそろ次スレの準備をだれかああ
gcc -c hoge.c -o hoge.o ってやるんじゃなかった?
>>903 gccも残さないよ。
gcc test.cってやるとtest.cをコンパイル&リンクしてa.outが出来るだけ。
gcc -c hoge.c で十分です
>>908 サンクス。
あと拡張子のoutって何ですか?あとext
911 :
デフォルトの名無しさん :02/11/07 21:25
>>905 なるほど!最初だけmallocと同じで、
その後いったん領域あげたらreallocのはたらきするってか
多分、/tmpにつくっているんじゃないかなぁ? 最後に消すと思うけど
913 :
デフォルトの名無しさん :02/11/07 21:25
-cで作るのか。
914 :
デフォルトの名無しさん :02/11/07 21:26
>>898 はスレの 1 をちっとも確認しない人間である事がわかりました。
>>910 UNIXは拡張子なんて概念はないからね。a.outはgccがデフォルトでつける実行ファイルの名前。
-oで名前を指定しないとtestとか名前をつけてくれない。。。
916 :
デフォルトの名無しさん :02/11/07 21:27
fgetsとかでさ、入力した文字列から\n削除するしょ? で、printfするときに\nつけてたら意味なくない?
>>916 \nがついていても問題がないなら消さなければいい。
918 :
デフォルトの名無しさん :02/11/07 21:28
puts使え。
919 :
デフォルトの名無しさん :02/11/07 21:28
ヘッダファイルを作るときってさ、 a.cとかとa.hがいるしょ? どこに保存しといたらいいの?
920 :
デフォルトの名無しさん :02/11/07 21:29
fgetsは消さない。getsは消す。
>>920 多分、入力したあとに自分で消すという意味だと思う。
Perlのchompみたいな関数を使って。
922 :
デフォルトの名無しさん :02/11/07 21:30
おなじディレクトリまたはおまえのincludeディレクトリ。
924 :
デフォルトの名無しさん :02/11/07 21:30
gcc 使ってる人は、 int dummy(); int main() { return dummy(); } を通してみなさい。
925 :
デフォルトの名無しさん :02/11/07 21:32
リンクしてくれるのか?
dummyという関数がライブラリにあるとか?
927 :
デフォルトの名無しさん :02/11/07 21:35
#define ; {return 0;}
/tmp/ccqpnZ6n.o: In function `main': /tmp/ccqpnZ6n.o(.text+0x7): undefined reference to `dummy' collect2: ld returned 1 exit status
929 :
デフォルトの名無しさん :02/11/07 21:36
>>923 ネタじゃないよ!マジだよ!
マジで何処に入れればいいかわかんないんだよ!
ほんとに教えて!
930 :
デフォルトの名無しさん :02/11/07 21:37
同じディレクトリに置いて #include "a.h"
932 :
デフォルトの名無しさん :02/11/07 21:38
>>929 は途中の有用なレス (例えば 922) を全く見ず、煽りだけに反応して
しまう可哀想な人間である事がわかりました。
ネタニマジレス(・∀・)カコイイ!!
>>924 #define dummy() dummy=0
935 :
デフォルトの名無しさん :02/11/07 21:43
わかった。 #define main() dummy(){return 0;}int main()
936 :
デフォルトの名無しさん :02/11/07 21:44
>>932 ああ、見落とした・・・
お前の言うとおりだよ!
でも言い訳させて!
最初に見たとこだったらさ、レスが10個くらいしか表示されないじゃん?
たぶんそこみて見逃したと思うよ
>>922 >>930 マジサンクス!!
937 :
デフォルトの名無しさん :02/11/07 21:45
どうでもいいけどさ、 mallocとかreallocとかの allocってどういう意味? 辞書にものってない・・・
allocate
all oK(OKのKはCorrectの綴り間違いから来た)
ごめん! a.hはインクルードファイルにいれたけど a.cもインクルードに入れるの?
かまって君と教え魔、ウザイよ。
947 :
デフォルトの名無しさん :02/11/07 21:49
マジで教えてくれー わかんねーんだよー たのむよー
949 :
デフォルトの名無しさん :02/11/07 21:51
hoge/a.h hoge/a.c a.cに #include "a.h"
>>948 コンパイラが使える場所なら、.c ファイルはどこでもいい。以上。
>>932 ああ、見落とした・・・
お前の言うとおりだよ!
でも言い訳させて!
最初に見たとこだったらさ、レスが10個くらいしか表示されないじゃん?
たぶんそこみて見逃したと思うよ
>>922 >>930 マジサンクス!!
に対して何を答えろと?
>最初に見たとこだったらさ、レスが10個くらいしか表示されないじゃん?
2chビューア使え。
が精一杯だが。
>>950 コンパイラが使える場所ってよくわからんけど
一応includeに入れておくよ!
っていうかヘッダの数半端じゃないね!!
いったいいつ使うんだろう・・・
953 :
デフォルトの名無しさん :02/11/07 21:53
そのincludeにいれるんだったら #include <a.h> いれんほうがいいと思うが。
無理だった。他の人頼むぅ
>>953 なんで?呼び出すときは#include <a.h>でしょ?
ヘッダファイルはIncludeに入れるよね?
で、ソースファイルはどこに・・・?
956 :
デフォルトの名無しさん :02/11/07 21:55
>>952 自分でつくったものをincludeディレクトリに入れるのはまずいんじゃないか?
特につくったものをソースごと配布するときなんかは。
つーかよう、ネタに決まってんだから他のやつらも反応すんなや
γ γ ∧_∧ γ (::::::::::: ) 次スレが立てられないなんて・・・ ...................................... .(○::::::: ) .::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::........ ~"''"""゛"゛""''・、 ...:::::;;;'' ';;;:::::....... "”゛""''""“”゛゛""''' "j' ...::::;;;'' '';;;::::::......... :::::ヘ :::::....ヽ :::;;;ノ ::( ....::::::;; '';;;::::::::::....... :: ゝ :::::......ノ:;;../ ~~^^ ~~~~~^^^~ ~~^^ ~~^^ ~~~~~^^^~ ~~^^~~~^
>>956 じゃあどこに入れればいいんですか?
例えばa.hを読み出すソースを保存してるふぉるだと
同じとこ?
961 :
デフォルトの名無しさん :02/11/07 21:58
>>960 だから、呼び出すソースファイルと同じところだってば(笑)
a.cから呼び出すならa.cと同じディレクトリ(フォルダ)
936 は、同じ話題なら次スレに移すな。
>>961 わかりました!ありです!
ソースファイルもヘッダファイルも一緒でつよね?
>>960 今までの煽りをリセットして聞いてくれ。
自分の、作業用のディレクトリを作って、そこに a.c と a.h を置け。
a.c からの a.h の呼び出しは、#include <a.h> ではなく
#include "a.h" にしろ。
あとは a.c をコンパイラにかければ OK だ。
>>964 #include <>だと、Icludeフォルダからって事で
#include " "だと、同じフォルダって事すか?
>>965 やっと理解したか。
そういうこと。
stdio.hなんかはincludeディレクトリに入っているから<>でやるの。
そうだ。わかったらこのスレあげずに寝ろ。
ほんとありがとう!! この知識を明日ひけらかすYO! 「なあなあ、お前ら知ってる? #includeの<>はさあ、(以下略
936、森へおかえり。 ここはおまえの住むところじゃないの。
まもなくここは 乂1000取り合戦場乂 となります。
\∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!! ,,、,、,,,
/三√ ゚Д゚) / \____________ ,,、,、,,,
/三/| ゚U゚|\ ,,、,、,,, ,,、,、,,,
,,、,、,,, U (:::::::::::) ,,、,、,,, \オーーーーーーーッ!!/
//三/|三|\ ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
∪ ∪ ( ) ( ) ( ) )
,,、,、,,, ,,、,、,,, ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
,,、,、,,, ( ) ( ) ( ) ( )
http://big.freett.com/scheme_a/num1000.swf
ナウシカキタ━━━━(゚∀゚)━━━━ !!!
まだ1000には気が早いかな
strcat の cat てなに? strdup の dup てなに? strchr の chr てなに? strpbrk の pbrk てなに?
マニュアル読め。
ユパ様!1000をいただいてもよろしいですか!?
>>976 書いてねーよ。バーカバーカ。
分かんねぇんならすっこんでろ!
concatenation duplication(スペリングが違うかも) character ???
ダレモイナイ1000getスルナラ…
イマノウチ…
ランタンタン♪
今日からお前の名前は1000だ!
ランタンタンタン♪
キタ━(・∀・)━!
>>985 Σ(゚Д゚)ガーン…
でも(゚ε゚)キニシナイ!!
ではここらでジョークを一つ。 先日、友人二人と僕の三人でドライブへ行ったのさ。 その日はとてもいい天気でね。 それで
みんな何故Cを始めた? 漏れはなんとなくプログラムという言葉に憧れて 何も知らずにこの世界に入った。
今だ!901番ゲットォォォォ!!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∧∧ (´⌒(´ ⊂(゚Д゚ )≡≡≡(´⌒;;;≡≡≡ ⊆⊂´ ̄ ⊂ソ (´⌒(´⌒;;  ̄ ̄ ̄ ズザーーーーーッ
993 :
デフォルトの名無しさん :02/11/07 22:17
1000間近
今だ!993番ゲットォォォォ!!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∧∧ (´⌒(´ ⊂(゚Д゚ )≡≡≡(´⌒;;;≡≡≡ ⊆⊂´ ̄ ⊂ソ (´⌒(´⌒;;  ̄ ̄ ̄ ズザーーーーーッ
∧||∧ ( ⌒ ヽ トゥトゥトゥマシェーリー ∪ 。ノ トゥトゥトゥマシェーリー ∪∪
それで 海にでも行こうかってことになって友人の一人が運転して僕は助手席、もう一人の友人は 後ろの席に乗っていくことになったんだ。 すると途中で
もうちょい
∧∧ /⌒ヽ) i三 ∪ ○三 | (/~∪ 三三 三三 三三
1000
1000ゲット
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。