C言語のことは漏れらに聞け!!<サンキュー>

このエントリーをはてなブックマークに追加
1前スレ949
前スレのコピペだモルァ

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART6
http://pc3.2ch.net/test/read.cgi/tech/1033207156/

・前スレ <38>
http://pc3.2ch.net/test/read.cgi/tech/1035729526/

コンパイラ、過去ログなどのリンクは>>2-5 あたり
2デフォルトの名無しさん:02/11/04 20:30
そし
3前スレ949:02/11/04 20:32
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html

さらにコピペ
>>950の策略にはまりスレを立てる羽目になった>>949が立てたスレはここですか?
5前スレ949:02/11/04 20:33
そです
6前スレ955:02/11/04 20:40
1000行くぞゴルァ。
ああ、タイトルとともにまたレベルが下がるのか。
ああ・・
ここはObjective-Cの話題を持ってきてもいいんですか?
>>8
いや、ダメすぎ。
10955:02/11/04 20:45
マ板の語尾にゴラァ!を付けるスレッドもよろしく
宣伝スマソ
level=level--; /* levelが1下がる */
>>11
無駄の多い処理ですな。
13デフォルトの名無しさん:02/11/04 20:52
CとC# の違いを教えてください。
>>13
適当なソースコード探してきて比較して見な。全然違う。
1513:02/11/04 20:54
>>14
VC++.NETとVC#.NETのパッケージのソースコードの写真でわかりますた。
ご迷惑かけますた。
16デフォルトの名無しさん:02/11/04 20:55
最初<サンキュー> って見たとき何を感謝しているんだ?とマジで思った・・・
鬱だ・・・
>>15
今どこにいるんだと小一時間・・・
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
何故って…型が違うだろ?
ポインタと配列は違うからデス。
>>21
下はポインタのサイズ(きっと4バイトだろ?)
上は配列のサイズ(512バイト)
25デフォルトの名無しさん:02/11/04 21:25
var_end(ap);で何かやってる処理系ってありますか?
何もしないのも多いと思いますし、必要ないともおもえるんですが...
26デフォルトの名無しさん:02/11/04 21:31
CとC++ の違いを教えてください。
2721:02/11/04 21:31
ありがとうございます。>>21の状況で
spからsのサイズを出すことはできないのでしょうか?
>>27
できない。
だから一部の標準関数はサイズを引数として渡す。
2921:02/11/04 21:36
>>28
ありがとうございました。
30デフォルトの名無しさん:02/11/04 21:37
関数をポインタで使う方法について教えてください。出来れば例をのせていただけると助かるのですが。
お願いいたします。
>>30
夕方あたりにちゃんと書いたのに無視なんですか?
悲しいです。
>>30
本に載っていないのかな・・・

#include <stdio.h>

int main()
{
int (*myputs)(const char *);

myputs=puts;
myputs("putsと同じように使える。");

return 0;
}
3332:02/11/04 21:41
もちろんこのコードにはなんの意味もないから。
実際は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バイト。
>>35
MS-DOSとか使ってる?
きっと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 *)だ。
>>44
Arigatou
がんばります。
50デフォルトの名無しさん:02/11/04 22:15
すみませんが教えてください。
C言語をはじめた3ヶ月、ほぼマスターしました。
ただまだGUIを使ったPGが作れません。何からはじめたらいいでしょうか?
>>50
環境は?
>>46
signalは標準
>>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
マルチポストってなんでしょうか?
マルチスレッドとは違うスレッドでも同じことを書き込むことですよね?
6150:02/11/04 22:28
環境はWindows2000です。使用しているコンパイラはBorlandC++です。
何からはじめたらいいでせうか?
>>61
PC窓から投げ捨てる。
>>60
キミセンスアルヨ
>>54
その通り。君の処理系だとポインタサイズは2バイトだったな。
だとすると、こんな感じ。

前橋のポインタ本を持ってるようだから、
(実はおれも持ってる。知り合いなので、ご祝儀に買った(w)
205ページのFig.3-19ポインタの配列を見てくれ。
このようなイメージで格納されている。
配列color_nameの要素はあくまでポインタだ。
配列にはポインタがずらずらと格納されてる。

だから、ポインタのサイズが2のとき、
要素が一つ増えると、アドレスは2増えることになる。

>>61
他の開発環境使った方が楽では?
>>61
こんなところからはじめてみては?

猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/ 
C言語で始めるWindowsプログラミング
http://web.kyoto-inet.or.jp/people/ysskondo/
>>64
知り合いなんですか???
やっぱり前橋さんは凄腕PGなのでしょうか?

いや、知ってるけどたいしたこと無いよ。
6964:02/11/04 22:44
>>67
んなこたあスレ違いだ(w
残念ながら一緒に仕事したことはないが、
おれよりははるかに優秀なプログラマだと思うよ。
>>68
むしろ自分の方が凄腕だと。(w
7150:02/11/04 22:45
>>66
ありがとうございます。試してみます。
極めたらまたきます。
72HP電卓、■に何が入るのかが分かんない: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();
ってなってて引数ないじゃん?
これいいの?
75Zetton:02/11/04 23:16
>>74
間違ってると思います。
正誤表はこちら
http://member.nifty.ne.jp/maebashi/seiha/seigo.html
>>74
いいよ
>>74君氏んで良いよ…。
>>72
つかCじゃ無いじゃん…。
>>46

初めて見たとき、シグナルを送るだけなのになんで関数ポインタが必要なんだ?と思ったよ。
シグナルを送るのはraiseだよな(w
>>78
パッと見Cに見えるけど何なの?
>>78
うーん?
Cの範囲で書いていると思うけど?
なんか見落としているかな・・・
C99とかJISでしょうか?
83もまずにパピコ:02/11/04 23:26
>>81
head=new list
8481:02/11/04 23:27
>>83
おお!まじだ!
85デフォルトの名無しさん:02/11/04 23:28
>>75
サンクス!
それにしてもとんでもなく多かった・・・。
果たしてこの本使えるのか?
っていうかなんか前橋ってむかつくな
>>73
前スレでも似たような事があったな。
87デフォルトの名無しさん:02/11/04 23:39
>>77
なんで?
>>87
前スレの>>905
ポインターのサイズオフ
ターボシーは2だったよ
>>89
サイズオブ・・・・・どうでもいいけど
>>89
へぇ、俺にTurboC++5.0Jは4バイトだが。
92デフォルトの名無しさん:02/11/05 00:21
near,far
>>73
遅レスだが、ここは宿題すれじゃないから、
そもそも課題をここに投げちゃいかんと思う。
94デフォルトの名無しさん:02/11/05 00:23
以降


   あまりに環境依存・コンパイラ依存の話題禁止

 
95コンパイラ:02/11/05 00:23
今度の中間テストはポインタと構造体なんです。
全然わかりません(泣)
>>74
俺その本の第五刷持ってるよ!
23:va_end(ap);に直ってるよ。

>>91
ふ〜ん・・・買って来よ(以下略
つーかプログラミングって学校で学ぶようなものなのか?
>>97
俺は中学生なのですべて独学だ
俺は医学を専攻していたがなぜかプログラマだ。
スーパープログラマーKを目指している。
いつかあの鍛え上げられた肉体を手に入れ、
「なぜプログラマがそんな筋肉を……」の問いに
「必要だからだ!!」と答えるのが夢だ。
……問題は、なぜ必要なのかが分からないことだ……
エネルギーを必要な時に必要なだけ供給できるように
体を鍛えておく必要がある。
とでも言っておけば?
四則演算もわざわざ学校で習うようなことじゃないよな。
学校で学ぶべきものなんて何一つないだろ。
>>97-102
ここはC言語のすれなのだが・・・
以降


    レ  ス  禁  止
>>102そんな奴らがロクに人間関係も作れないようなプログ(略
人とのつきあい方くらい独学で身につけられるだろ
Cスレだっつの
108デフォルトの名無しさん:02/11/05 01:41
C で例外を実装する方法ってありますか?
特に 0 除算とかセグメンテーションフォールトとか・・・。
>>108
処理系によってはシグナルが飛んでくるかもしれない。
110108:02/11/05 01:46
やっぱり処理系依存なんですね。
ありがとうございました。

# C++ の例外の実装ってどうなってるんだろう・・・。
>>108
signal()
>>110
C++の例外はハードエラーは補足できないよ。
setjmpとlongjmpに近いと思われ。
>>108
0除算はSIGFPE、セグメンテーションフォールトはSIGSEGV
を処理すればできそう
__try{}__except{}__finally{}__leave
115デフォルトの名無しさん:02/11/05 02:07
スタックの基本的な問題で入力した文字を覚えていく問題に
PushDown関数に戻り値(スタックオーバーフローに検出を行い、
エラーの場合エラーコードを戻り値にして返すようになっているか)
という条件がついているのですが意味がよくわかりません。
解説してもらえませんか?
>>115
質問の意味がわかりません
117デフォルトの名無しさん:02/11/05 02:09
>>115
用意されたスタック(まあこの場合は配列か何かだろ)以上にデータを積もうとしたらエラーコードを返すってことでしょ。
118117:02/11/05 02:13
s/スタック/スタックのサイズ/

まあ分かると思うが
最近は助詞もまともに使えない奴がいるのか…。
プログラム言語の前に日本語勉強してくれよと言いたくなる。
>>119
2ちゃんねるでわざわざ誤植を指摘すんなよ。
121ねみー:02/11/05 04:19
コマンドライン引数ってよくわかりませーん。
何がわからないのかって?
独習Cで「main()関数の引数を指定する」という項目で、コマンド(略)の事が書いてるんですけど
まったく同じコーティングしてビルドしても何もなりません。
VC++を使っております。atoi関数などももう少し詳しく教えて欲しいです
122デフォルトの名無しさん:02/11/05 07:58
コーディングガオカシインダロ
>>121
おう、基礎だから勝手に学べ。
124俺、超初心者:02/11/05 14:34
分割コンパイルについて質問です。
AというファイルとBというファイルがあります。
Aというファイルで作成した構造体やクラスのオブジェクトと
ファイルBで扱いたいのですが、ヨクワカリマセン!!
HELP!
125訂正:02/11/05 14:41
分割コンパイルについて質問です。
AとBの2つのファイルをコンパイスしようと思います。
そこでAというファイルで作成した構造体やクラスのオブジェクトを
ファイルBで扱いたいのですが、ヨクワカリマセン!!
HELP!
>>124
「Aというファイルで作成した構造体」をヘッダファイルで定義しろ
AとBの2つのファイルにそのヘッダファイルをincludeしろ
「コンパイス」のやり方は俺は知らん。googleに聞いても分からなかった。
127デフォルトの名無しさん:02/11/05 14:50
>>125
とりあえずincludeしなさい。
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を付けると見つかるけど何か?
137134:02/11/05 17:13
if (i == 0 || i == (n-1) || j == 0 || j == (n-1))

このへんがおかしいッポイです。
でもこれの何処がおかしいのかわかりません。

>>134
%sを%cにするといいかも
139134:02/11/05 17:15
>>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言語で言うところの)”文字列”の違いって分かるですか?

142Zetton:02/11/05 17:39
>>141
スタック取りすぎじゃないか?
143134:02/11/05 17:43

>>138
ちゃんと動作しました。

>>140
そうでした。

>>char gazo[1000][1000];
>>n = 5;
>↑
>なぜ#defineしないですか。
デバッグまがいのことしてるうちにこうなってしまいました。
原因がわかったので直します。
144134:02/11/05 17:43
>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型、つまり整数なんて与えたら変なところにアクセスしてしまって・・・
146134:02/11/05 17:48
>>145
不正な処理になってしまったわけですね。
プログラミングは実際に打たないと成長しませんね。
>>146
一文字表示させるだけならputchar(gazo[i][j]);でいいんじゃない?
148未亡人 ◆gLo7a3IgfY :02/11/05 18:06
自称、脱初心者のオレに
適当な問題きぼんぬ
>>148
ここはそういうスレではありません。
Web で検索してください。

1 よ、何故諸注意を書かなかった・・・?
テトリス作れ。
ルールを拡張しろ。
ハイスコア機能をつけろ。
ネットランキング機能をつけろ。
ネット対戦機能をつけろ。
>>148
問題

   自由研究
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を押せば終わるかも。
155154:02/11/05 18:21
>>153
そのプログラムまずいんじゃないか?
reallocで得た新しい領域の先頭が以前と同じだとは限らないはず。
156154:02/11/05 18:24
あ・・・ちゃんと戻り値を受けていた。ごめん。見間違った
戻り値チェックはしようね。
157153:02/11/05 18:27
>>154
なぜか終わらない・・・。DOS窓からやらんとあかんのかな。
NULLって定数の0にみたいなもんでしょ?それとも^cなん?
>>155
マジ!?これ本に載ってるソースなんだけど。
てかmallocとreallocの違いが良くわからん。
mallocは領域を与えたいとこに対して一回だけ使うんだよね?
reallocはその後ろに伸ばしていくんでないの?
158153:02/11/05 18:28
>>156
すまそ。戻り値チェックってwhileの条件式内のやつでないの?
159Zetton:02/11/05 18:29
>>ALL
確認:返り値と戻り値って同じ意だよね?
160154:02/11/05 18:29
>>157
見間違ったんだってば。本ということは戻り値チェックは省略か。

fgetsはEOFを検出するとNULLを返すから、DOS窓・・・windowsならCtrl+Zで終わると思うよ。
本当に終わらない?
161153:02/11/05 18:30
やべ。>>157
終わらないんでなくて、printf文が実行されん。
162154:02/11/05 18:30
>>158
reallocの戻り値チェックのこと。
malloc同様、必ずしも成功するとは限らないから。
本のサンプルなら問題に焦点を当てるために省略していると思うけど。
163154:02/11/05 18:32
>>161
なんだあれか。
Windows9XのDOSプロンプトだとなぜかそうなる。
stdinからじゃなくてファイルから読みとってみれば?
164153:02/11/05 18:32
>>160
わり。レス書いてるうちに更新されたみたい。

で、^Cやってみたけど、終了はするんだけどさ
その後printf文で、格納した要素を出力してんじゃん?
そこが何も起きないんだ。
あと>>158マジでわからん。
^Cは強制終了。
^ZはEOF入力。
だったはず。
>>164
^Cは強制終了。もっともWin9Xなら^Zでも思い通りに動かないけど
167153:02/11/05 18:34
>>163
XPでも一緒か。NTカーネル?だっけ?あれ系?
OSの問題なら、コンパイラがどうこうとかでないのね。
結局malloc使えとな。でもrealloc使った方が見栄えいいよね。
mallocだったらサイズいるもん。

>>162
ごめんだけど、例えばどんな感じ?
168153:02/11/05 18:36
>>165>>166
あり。でけました。
でもオレは確か^C=EOFって習った気が・・・
あぁ復習しないと。
169153:02/11/05 18:39
>>168
はい、オレの勘違いだったぁぁ!!!
鬱だ・・・。母さん、死んでいいですか?
170デフォルトの名無しさん:02/11/05 18:47
全角とハンカクを区別する関数ってある?
171デフォルトの名無しさん:02/11/05 18:47

 |  さいたまさいたまさいたま!をやっていいですか?
 \____  ________________/
    /||ミ  V
   / ::::||
 /:::::::::::||____
 |:::::::::::::::||       ||
 |:::::::::::::::||│ /  ||
 |:::::::::::::::|| ̄\   ガチャッ
 |:::::::::::::::||゚ ∀゚)   ||
 |:::::::::::::::||_/    ||
 |:::::::::::::::||│ \   ||
 |:::::::::::::::||∧ ∧∩ ..||
 |:::::::::::::::|| ゚∀゚)/  .||
 |:::::::::::::::||∧ ∧∩ ..||
 |:::::::::::::::|| ゚∀゚)/ ..||
(・∀・)カエレ!!
173デフォルトの名無しさん:02/11/05 18:49
ファイルの入出力で高水準と低水準って
どんな時に使い分けるんですか?
>>173
楽したい時と格好つけたいとき。
175( ○ ´ ー ` ○ ):02/11/05 18:54
 線形リストの先頭ノードと末尾ノードにわける理由を教えてください。
   本の内容を、目で追っていたのですが・・・。
  難しく考えるばかりで、進展がない。
176デフォルトの名無しさん:02/11/05 18:56
>>175
日本語がおかしい。
推測で答えると、末尾に追加したいときには
最後のノードへのポインタを保持しておくと便利だ。
177Zetton:02/11/05 18:58
モジュールとサブルーチンの違いを教えて下さい。
178デフォルトの名無しさん:02/11/05 19:07

             ∩
                 | |
                 | |
        ∧_∧   | |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ( ;´Д`)//  < 先生!素人以下の知識しかないプロが居まつ!
      /       /     \___________________
     / /|    /
  __| | .|    |
  \   ̄ ̄ ̄ ̄ ̄ ̄ ̄\
  ||\             \
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
  ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     .||              ||
モジュールはフランス語。
サブルーチンは英語。
以下


    禁  止

>>179
そうかい?英語にもモジュールという単語あるぞ。
>>181
ネタにマジレス…
ボンジュールと掛けたんじゃないの?
184デフォルトの名無しさん:02/11/05 22:01
誰か前橋の「C言語ポインタ完全制覇」持ってる人いない?
いたらさ、P218のソースにmain関数ないんだけども、どういうこと?
185前橋 ◆81oseo2HKE :02/11/05 22:05
前橋ですが、何か?
186デフォルトの名無しさん:02/11/05 22:05
質問があります。
今、C言語で画像処理プログラムを組んでいるのですが、
既製のUSBカメラから画像データを引っ張るにはどのようにすれば
よいのでしょうか?
( ;´Д`)そんなこと言われても・・
>>186
C は USB をはじめとするデバイスを定義していません。
従って環境依存です。
このスレは純粋に C を扱っているスレなのでスレ違いです。

実際の方法は、カメラのメーカーに問い合わせてください。
189184:02/11/05 22:16
>>185
あ、前橋だ。
何か?じゃなくてよ、>>184見ろよw
>>188
いや、普通にありですが。
>>188からスレ違いになったのですか?
なかなか、タイムリーですね。
>>188
じゃあCで出来ることはコンソールに文字出して遊ぶくらいですね。
192前橋 ◆81oseo2HKE :02/11/05 22:19
実はあの本友達に書いてもらったんだ・・・。
193デフォルトの名無しさん:02/11/05 22:23
>>192
騙りは犯罪です。通報しました。
#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は可変引数で、これをレジスタに割り付けるような
処理系はちょっと考えられないから、まあ、メモリ上にも
存在するといってもいいかもしれない。
実体としては即値で終わり。

 し か し 腐 っ た コ ー ド だ な
>>198
あり
今日
#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));

と書いたほうが判り易いから糞コードと言っていると思われ。
(慣れだけかもしれんが)  
>>213
愛が足りないのですか?
216209:02/11/05 23:03
>>207
そうする理由はちゃんと書いたんだが、その上で不要と言ってるのか?

> で、マクロを関数っぽく扱えるようにするのは、その実装がマクロなのか関数
> なのかを使用者に意識させないために必要。
217216:02/11/05 23:04
レス番号が逆ダターヨ・・・
>>214
&hoge[0]がhogeのシンタックスシュガーだと分からない人がいると
思って展開して書いたんだけど、絶対いないですよねそんな人。
219デフォルトの名無しさん:02/11/05 23:06
>>216
そういきりたつなよ。のんびりいこうぜ。
swapをマクロにするとforの初期化や条件式、後処理で使えないよ。
221デフォルトの名無しさん:02/11/05 23:09
2chのCGIってCで組んであるって本当ですか?
>>221
嘘です。
223デフォルトの名無しさん:02/11/05 23:10
>>221
Rubyだよ
>>221
BrainFuck!!!!!!!
>> おそらく「最適化の結果」即値になると言っていると思われ。

ごめん。まだ意味がわからん。
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
ああそうか。仮引数のポインタを[]と書くのも構文糖だね。
ポインタを受ける時は配列を受ける時が多いから。
>>241
K&R厨が出てくるぞ。
243225:02/11/05 23:27
>>234
> 問題にしているのは、「&hoge[0]」(ポインタ)に付いてではないのか?
> いつから、hoge(配列)の話になったんだ?

多分お前は話を理解できてないな。
その &hoge[0] が即値とどう関係してくるのかという疑問なんだが。
244デフォルトの名無しさん:02/11/05 23:29
>>231
結局好みでしょ?
オレもこの手の問題は通りぬけたけど
マクロなんか全然使わない。
関数書くのが楽しいからw
考えてみたら、&hoge[0] は即値になりようが無いな。
実行するまで、hoge が決まらない。
実際、コンパイラは lea を吐くと思う。
つーか漏れはマクロで複文なら do { ... } while(0) だが、実際マクロ関数を
最近全然書いてない。
SWAP() 程度の処理なら直書きしてる。型もまちまちだし。
247231:02/11/05 23:37
>>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;・・・と書けば型によらないで使えるけど
251247:02/11/05 23:40
型もまちまちってことはさ、なんらかの統一処理って事ジャン?
いちいち関数つくるよりは、直書きの法がいいけどん、
そんな時くらいしかマクロは使えましぇん!
252最後に質問:02/11/05 23:41
#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)だぜ。
>>252

>>1のリンク先にあるC FAQを読んだ方がいい。
int a[]={1,2,3,4,5};
にして置いたら?
紛れが少なくなる。
256デフォルトの名無しさん:02/11/05 23:46
ソース中では配列はポインタに読み替えられる。
宣言の時以外に使われる[]、つまり添字演算子は*と書いてもほとんど同じだ。
この辺の話は、もうちょい後でじっくり学べ!
今はとりあえず、配列の名前(この場合だとa)を単独で使うと
それは配列の先頭要素へのポインタ(つまりaは*a[0]ってこと)になる。
ただし、これは嘘だ。でも今はこう覚えといて問題なし。
実際オレもそうだったから。安心しろ
257デフォルトの名無しさん:02/11/05 23:47
>>256
aは*a[0]じゃなくて&a[0]
258256:02/11/05 23:49
オレ、死んでいいですか?
>>258
もちろん
260デフォルトの名無しさん:02/11/05 23:50
>>258
死ぬべき立場なら潔く割腹。
261デフォルトの名無しさん:02/11/05 23:54
sizeof(a),sizeof(&a[0])を見てみると分かり易いね。
>>248
それだけを見るとナイスアイディアに見えるが、その調子で作ったマクロが
ずら〜っと並んでいると読む気がしなくなる罠。
漏れは素直に !*str の方が好き。
この程度、読むのに詰まる事も無いだろうし。
256 よりも、255 の方が何を言っているのかわからないぞ。
264256:02/11/05 23:56
遺書

僕は調子に乗りました。初心者の僕でもわかりそうな質問だったので
がんばってレスを打ちました。そしたら257にやられました。
向こうは3人がかりで僕を攻めました。お父さん、お母さん、
今までありがとう・・・・



これは自殺じゃない!他殺だ!(某あほな自殺者の迷言)
>>262
同感。逆のケースだと特にね。
if(*str) {}
if(!isnullstr(str)) {}
前者の方が断然読みやすく書きやすいと思う。
266256:02/11/05 23:58
ほとんとだ。新たないじめられっこハケーン

でもマギレって?
マグレか?
だとしたらなんの?
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
どこを指しているのか分からないってのは、初期化していない(自動変数の)ポインタだろ?
275256:02/11/06 00:05
>>269
だから、配列はポインタに変わっちゃうんだってば。
知ってるのにわからないんだったら才能ないんでない?
やめた方がいいと思うよ。
オレは0.2秒で理解した
276デフォルトの名無しさん:02/11/06 00:06
>>273
わかりました・・・
今まで書いたソースを修正するのは面倒だからそれはそのままにして、今後は禁じ手にするか。。
277265:02/11/06 00:07
>>268
あくまで俺個人の見解だからあまり気にしないで。

ただ、Cを使ってる人間であれば !*str という式が
どういう意味かはパッと見てわかるんじゃないかな?
>>276
マジレスシル!!正しこれが最後。

まずADSLでネット始めた方が安全だよ。それで電気店に行って対策ソフト
購入シル!店員に説明聞くか説明書読めば大概分かる。次ぎにセキュリティを
「高」にする。さらに心配なら「串」を刺すって方法もある。
サイトはトレンドマイクロを参考にした方がいいな。
メールはフリーで行い自分の活動的な事はネットカフェから作業するベシ!
他の奴の言う事は聞かなくてヨロシイ。

この書き込みに「自演」とか「お前は回線切って死ね」とか色々あると
思うけど素人はその程度なんで。
あっ、お前も分からなければ市ね!さっきは 書き込む所間違えてスマソ(W
>>277

> Cを使ってる人間であれば !*str という式が

そうだね。それくらい分かるよね(^_^;)

>>278
Σ( ̄□ ̄;)!!
>>278
明後日の方向にレスなさってますか?
>>278
ワラタ
>>278
> 書き込む所間違えてスマソ
今も間違えてるし。
283256:02/11/06 00:12
>>278
村上ショージ氏でつか?
このシュールさは彼としか思えない・・・
>>278
ちょっとワロタ。けど
お前は回線切って氏ね!
285デフォルトの名無しさん:02/11/06 00:15
つーかc言語なんかヤッテルヤシは

パソオタ(デブ・メガネ)ということで

ファイナル・アンサー
ハンカクチュウ ハ ホウチ。
287256:02/11/06 00:18
>>285
オレは武田真治似で、彼女はhiro似で
大学で仕方なく学んで、楽しいなとか思ってる香具師ですが何か?
>>285
まあ、キミはデブでもなければヲタでもないけど、
プログラムもできない椰子だけどね。
C が主に PC で使われていると思い込んでいるらしい DQN な 285 がいるスレは
ここですか?
c言語は神の為の言語。
選ばれし者しか使えない。
容姿等を問題にする愚者には一笑分からない。
>>285
パソヲタ&デブ&メガネですが何か?
292256:02/11/06 00:21
PS
>>290
> 愚者には一笑
ワラタ
294デフォルトの名無しさん:02/11/06 00:22
C言語出来ないキムタク>>>>>>>>>>>>>>>>>>>>>>>プログラム完璧なココの住人

↓死ね
>>286-291
それはさておき。
しかしファイナルアンサーってのも古いな
デブだがパソヲタと呼べるほど知識はない。
298デフォルトの名無しさん:02/11/06 00:23

日 本 人 同 士 醜 い 争 い を し て い る の は コ コ で す か
            ☆ クールダウン中・・・ ☆
┌──────────────────────―─┐
│                                    |
│                                    |
│                /■\                    |
│               (´∀`∩)                   |
│               (つ  丿                |
│                ( ヽノ                    |
│                し(_)                |
│                                    |
│             Now Onigiring. ...               |
│                                    |
│                                    |
│         しばらくおにぎりでお待ちください。        |
│                                    |
└───────────────────────―┘
     クールダウンの途中でエラーが発生した場合は、
      「無視(I)」 を選択して続行してください。
放置しとけよお前ら。レベル低いぞ。
301デフォルトの名無しさん:02/11/06 00:25
プログラム完璧なココの住人はキモイです


>>300
299 コピペで使ってね。
            >>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ができる奴は本当にいない。
人のコードにゴチャゴチャ言ってくる奴は腐るほどいるが。
意外と真理かもしれん。
312256:02/11/06 00:36
おいお前ら、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
勘違いじゃないのか?
324もまずにパピコ:02/11/06 00:57
>>322
バッファにたまってるのかな。知らんけど。fflush(stdout)するか。
いきなり複数レスに渡ってソースを書くのは荒らしに近い
326323:02/11/06 00:58
>>324
もしたまっていたとしても、printfは実行されない?
327326:02/11/06 00:58
バッファってstdoutのバッファか・・・スマソ
328デフォルトの名無しさん:02/11/06 01:03
>>325
ごめんなさい。でも、長かったんで。こういうときは、前もって複数レスしますっていったほうがいいんですか?
>>326
printf実行されます。
すみません、当方、今までプログラムを組んだことが一度もなく、
これからプログラムを学ぼうかと思っているのですが、
初めて学ぶ言語としてC言語はどうでしょうか?
一応、WindowsマシンとボーランドCの無料版はすでに入手してあります。
>>320
scanf() はもっと丁寧に扱え。

×: scanf("%d ",&yosou);
○: scanf("%d",&yosou);
331326:02/11/06 01:08
>>330
よくみつけたなー。なるほど。全然わからんかった。

あと、kekkaってブロックの先頭でないところで宣言しているね。
>>329
C はそれなりに汎用性があり、大抵の処理が書けるので悪くは無い。
ただ、プログラムミスをした時に助けてれる機構がほとんど無いから
つまづく事があるかも知れない。
時間をかける覚悟があるなら習得は可能。
333デフォルトの名無しさん:02/11/06 01:10
>>329
javaの方が良いよ。
334デフォルトの名無しさん:02/11/06 01:10
>>330
おお。直りました。ありがとうございます。一時間ぐらいここでずーッと悩んでました。

デモ、どうして、スペースがあっただけで、始めに実行されちゃうんですか?
>>334
数字列とスペース一個にひっかかるからだろ。
336330:02/11/06 01:12
>>325
この場合は素直に全部書いてくれてて良かったが。
これがコマ切れ情報だったら、解決に 50 レスはかかっていたと思うぞ。
C→C++→Java
で。
338330:02/11/06 01:13
>>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 になってるだろ。
348329:02/11/06 01:26
>>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
早ければ、深く読めるのです。すなわち、強くなるのです。
将棋のひとはとりあえずこっちイってね。そして読んでね。
http://pc3.2ch.net/test/read.cgi/tech/1004395614/l50
必死にアセンブラで組んだってどうせ2〜3ヶ月とか半年とかでPC性能あ〜っぷ。
バグ取とかでひ〜ひ〜行って強いプログラムが作れないなら高級言語でもい〜のでは?
>>349
いくらアセンブラで枝葉部分をチューニングしてもアルゴリズムがダメダメ
だったら全く意味なし。それに、コンパイラの方がヘタなアセンブラより速い
コード吐くしな。
>>353
高級言語+ライブラリのサポートのもと、複数のCPUで分散処理させた
ほうがいいと思われ。
bccはちゃんとヘルプファイルも付いてるのに使い方がわからないってのは何故なんだ?
以前はヘルプが付いてないかったらしいけど
359デフォルトの名無しさん:02/11/06 01:41
>>354
ありがとう。こんなスレがまさかあるとは思っていませんでした。
将棋板で探したんですが、なかったんで、あきらめてしまいました。
>>355
>>356
ですね。PC性能UPで、アセンブリングも変わるんですか。じゃ、厳しそうですね。
360329:02/11/06 01:45
>>358

お恥ずかしい限りです。
コマンドラインやエディタは大学でUnix使ってるので大丈夫なのですが、
どうもライブラリの場所?やインクルードの場所?をうまく指定できてないみたいです(?)。
明日知り合いに教えてもらって、がんばります。
361デフォルトの名無しさん:02/11/06 01:47
>>360
それは設定ファイルを作成していないからでしょう。
readmeをみた?
363デフォルトの名無しさん:02/11/06 01:54
今思いっきり酔っていますが、答えられる範囲で答えます。

(*^o^*)
364329:02/11/06 02:04
>>361 >>362 >>363

皆さんレスありがとうございます。
とりあえず原因は使っているエディタがEUCで保存していたため、
文字の出力がぐちゃぐちゃになっていたと判明しました。
(「これはテストです」などと表示しようとしていました)
"Hello World”なら正しく表示されました。しばし感動……。
これからも精進します。
EUC でも ASCII コードセット部分は SJIS と互換だからインクルードや
リンクが失敗する原因とは考えられないのだが・・・いいのか?
366デフォルトの名無しさん:02/11/06 02:16
>>365
多分インクルードやリンクが失敗したと思いこんだんだと思う。

(*^o^*)
367329:02/11/06 02:25
>>365

えっと、まずEUCのまま動かしたところ、ぐちゃぐちゃなものが出力されました。
それをメールで知り合いに内容ごと送りましたら、この内容なら動くはず、
(学校からフロッピー7枚で必死に持ってきたので)ライブラリが壊れている(?)か
違うのを指してる(?)かも、みたいなことを言われまして、
必死にあがいていたのです……
368デフォルトの名無しさん:02/11/06 02:45
>>367
動いた時点でライブラリやヘッダーのパスは間違っていない。

(*^o^*)
古いのを混ぜ込んでしまって、動くけど
なんかおかしい、てな場合もあるはず
370:02/11/06 03:36
#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;
}
371:02/11/06 03:37
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がないと指摘しようがないよ。
373:02/11/06 03:46
すんません

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, ...};
みたいにするとか。
378376:02/11/06 09:23
>>377
なんで0xAAなのれすか?

意味がないから意味があるんだろーが
ほぅ
381デフォルトの名無しさん:02/11/06 09:55
前レスも全部読めばC言語の何割、極めたことになるんだ。
自分でプログラム書かなきゃ1割も極めたことにはならない
>>381
> 前レスも全部読めばC言語の何割、極めたことになるんだ。
日本語の本を何冊読めば日本語の何割、極めたことになるんだ?

プログラムを「極めた」と思い込んだ瞬間にお前の成長は終わる。
プログラミングには頂点など存在しない、だがそれがいい。
>>383
Cで満足しないことだな(稿
>>376
> 英数字10文字からなる文字列を、バイナリをダンプされても容易には
> 見えないような形でCのソースコードに埋め込みたいのですが、どのよう
> にするのが一般的な手法でしょうか?
cryptでgoogleしろ。2chのトリップはその方法で暗号化してる
386l:02/11/06 11:06
今、ポインタについて学習しています。そこで質問。
LPDIRECT3D8ってのはIDirect3D8インターフェースへのポインタを指す
構造体なんだけど、たとえば

LPDIRECT3D8 a,b;
a=Direct3DCreate8(D3D_SDK_VERSION);

とした後、

b=a;

とするとbにはaの内容がコピーされるんじゃなく、aのアドレスが渡される
んですよね?
387376:02/11/06 11:07
>>385
阿呆? cryptは可逆じゃねーよ。
>>386
LPDIRECT3D8が構造体ならば、aの内容「だけ」がコピーされます。
LPDIRECT3D8のメンバにポインタが存在した場合には注意が必要です。

LPDIRECT3D8がポインタならばaのアドレスが代入されます。
389386:02/11/06 11:17
説明不足でした。
LPDIRECT3D8はこのような構造体です。
typedef struct IDirect3D8 *LPDIRECT3D8, *PDIRECT3D8;

>LPDIRECT3D8がポインタならばaのアドレスが代入されます。
ということは386の内容であっているというわけですね。
ありがとうございました。

390385:02/11/06 11:17
>>387
おそらくレジストキーか何かを暗号化して容易に推測させないことを
目的としてると思ったんだが。

プログラム中にcryptした結果を埋め込んでおき
レジストキーの入力結果をcryptして一致すればレジスト解除すれば
いいんじゃないかと思ったんだが、どういう目的で暗号化したいんだい?
ちなみに crypt() は不可逆だけど crypt() が使っている
des アルゴリズム自体は可逆です。
392376:02/11/06 11:33
>>390
可逆でないと困る、としか言えない。
>>391
DESなり3DESなりで暗号化したものを埋めると、>>377 ほどメンテナンス性が
よくない他、復号するための鍵をどう埋めるかという問題で循環して
しまうような。

厨房対策ってだけなので、>>377でいいですわ。ありがとう。
377がもっと可読性の高いマクロかなんかにできるなら嬉しい
んだけどむりっぽ。

393デフォルトの名無しさん:02/11/06 11:51
お前らいい加減にしろよ・・・。
純粋な C に関するもので無い限り、質問は受け付けるな。
MFC も DirectX も別スレがある。
それとも、問題の切り分けができない輩をはびこらせて、教えたがりクン気取って
楽しいのか?
それとも、「ここは 2 ちゃんねるだから」 スレの内容が整然としていなくても
どうでもいいか?
>>393 はい、さっさと氏んでね。
>>393
はて、>>374はさくっと無視されてるし、>>386はポインタの質問であって
そのポインタがたまたまDirectXで使われてるだけで、
回答も一般的なポインタの回答しかしていない。

君もそういうスレ違いの内容を誘導もせずに風紀委員を気取って楽しいのか?
>>393
じゃあ、話降ってくれよ。
>>393
Cに関係ない。別スレへどうぞ。
前スレがマジレスで終わってる・・・
>>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バイトになって、死んでいるんだろうな。
>>401 (・∀・)イイ!!
nkfが改行コードの変換もやってくれるじゃん
struct 童貞 {
25歳無職;
アニオタ;
デブ;
体臭;
};

童貞 >>393;
>>404 Not Found
>>404
393 が痛いのは分かったからスレ汚すのはやめてくれ。
407374:02/11/06 15:21
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
レスありがとうございます。

ネットワーク側とホスト側のバイトオーダが同じかどうかというのは
誰がいつどうやって調べてるのでしょうか?
417414:02/11/06 16:11

× >>414
>>415
>>416
まぁ、OS依存でしょう。
>>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
>>424
型def
>>426
defも訳してやれやw

型てい
428426:02/11/06 16:26
>>427
スマソ&&フォローサンクスコ
429416:02/11/06 16:35
>>423
>ネットワークバイトオーダはリトルエンディアンであることがRFCで決まっています。

どこかのサイトでも見たよう気がします。
でもよく意味がよくわかりませんでした・・・。

バイトオーダってのはCPUで決まるんですよね?
通信先は無条件でリトルエンディアンだ!! って決められても、
その通信先のマシンのCPUがビッグエンディアンを採用してたら
ホストがリトルエンディアンだからといって
何も変換しないで通信しようとするとおかしくなりませんか??
>>429
ネットワーク上では、必ずリトルエンディアンで送受信するって決まってるの。
通信先がビッグエンディアンだとしても、そっちの方でちゃんと受理してるから
おかしくならないの。
わかれ。
>>429
なぜに?向こうが変換すればいい話。
飛んでくるデータのエンディアンはあらかじめわかっているわけで。
>>429
その場合は通信先のマシンがntohl等を利用してビッグエンディアンに
変換する。
433416:02/11/06 16:43
あ、ようやく分かりました。
受け取り側も変換すれば解決するんですね。

なぜに気づかなかったのか・・・。

お騒がせ致しました。
>>429
ネットワークに流す時はビッグエンディアンってことに決めとけば、
読む時はビッグエンディアンから自分のバイトオーダに変換すればいいだろ。
ちなみにネットワークバイトオーダーがリトルエンディアンっていうのはネタかDQN。
>>434
回答も煽りもスピードが命。
>>429
> ホストがリトルエンディアンだからといって
> 何も変換しないで通信しようとするとおかしくなりませんか??
おかしくなります。だからRFCで規定しています。
よって、ネットワーク上にビッグエンディアンの
データを流さないようにしなければなりません。
>>439
ネットワークバイトオーダーに変換する関数が用意されているんだっけ?
438437:02/11/06 17:15
ああ、上の方にかいてあったか・・・
しかもレス先間違えているし。。
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;
がどう解釈されるか考えてみよう。
443439:02/11/06 20:58
ほえ?

どっちも同じじゃないの?

#defineの場合
 char *a, b;
と置換されて

typedefの場合
 char *a, b;
と判断される。

うー Webで調べても具体例みつからねぇ〜
>>443
おいおい
typedefの場合、
char *a,*b;
だろ・・・。
というか、実際にコンパイルして、sizeofででも表示してみろよ、、、
ほえ〜?
これはエキスパートCプログラミングの100ページの話ですか。
とういかよ、#defineとtypedefの違いなんて延々と説明して、
スレを消費すんなよ。
質問してる奴って、本買う金がもったいないからHP教えてくださいとか
質問してるような奴なんじゃねーの?
ほえぇぇぇ〜。
>>448
初心者には、ちょい、分かりにくいんでないの?
#defineとtypdefの違い。
>>447
俺も今まさに確認したところだ。
この本からと思われる話題多いね。
関数へのポインタ使ったら怒られた。
関数へのポインタの配列作ったら誰も理解できなかった。
・・・・・・こんな会社、もう辞めたい・・・・・・
>>452
どこもそんなレベルです。
>>452
スレ違い。つーか板違い。マ板逝って。
C++なら極めて分かりやすいんだがな

namespace foo{
#define T1 char
typedef char T2;
}

namespace bar{
class T1; // NG
class T2; // OK
}
おまえら、defineの代わりにenum,typedef使えと。
>>459
enumの使い方を知ってる人はごく少数です。
45822歳女:02/11/06 21:30
できる限りtypdefは使わないでほすぃ
459458:02/11/06 21:31
s/typedef/typedef/
460458:02/11/06 21:31
・・・・・。
あのー文字列定数ってどうしてますか。

#define TEXT_SAGE "sage"
const char *TEXT_SAGE = "sage";
const char TEXT_SAGE[] = "sage";
>>455
わかりやすいか??
463458:02/11/06 21:33
>>461

"文字列定数"
>>460
おっちょこちょいなところに惹かれました。あなたのことが好きです。
>>463
でも、そんなふうにプログラム中にいきなり定数を書くところは嫌いです。
>>465
この人はなんでもかんでも文字列定数をマクロにするのかな・・・
関数へのポインタはtypedefするのが定番だと思うのですがどうですか。
>>463
それは定数じゃなくてリテラル。
定数と呼ぶなら const を付けるのが正しい。
461 の 2 つめと 3 つめのどちらでもいいんじゃないか?
>>467
賛同。
470デフォルトの名無しさん:02/11/06 21:46
>>468をさらしあげ
例えばWindowsアプリでGet/WritePrivateProfile系APIを対で使うとき、
セクション名やキー名をグローバルに#defineしてるんだけど・・・変? 俺、変態?
1; /* constついていないけど定数だよね?(ワラ */
C言語のソースを見てみたらマクロばっかで超読みにくいんです
簡単だからって何でもかんでもdefineしてんじゃねーよ、ボケが。
よーし、パパuchar定義しちゃうぞとか言ってるの。もう見てらんない。
お前らな、glibcやるからdefine除けと。

でやっと除けたかと思ったら他のプログラマーがswapマクロとか書いてるんです。
そこでまたぶち切れですよ。
略)おまえdo{}while(0)しただけちゃうんかと。
エキスパートcプログラマの俺から言わせてもらえば今、プログラマの間での最新
流行はやっぱりinline修飾、これだね。
更にインラインアセンブラ。これ最強。
処理系依存と言う危険も伴う、両刃の剣。
まぁお前らド素人は、javaでも使ってなさいってこった。


       ま  た  C  99  か 

>>468のような人の事を「杓子定規な人」と言います。
>>472
即値と定数の区別もつかないのか?
477デフォルトの名無しさん:02/11/06 21:53
>>473
素人の匂いがぷんぷんするぞ
>>471
最適化オプションによっては、同じ内容のリテラルでも別々の文字列として格納
されてしまう場合があるから気をつけろ!
C言語の範囲で即値なんて言葉はあったか?
>>479
定数=コンスタント
即値=リテラル
K&R第二版 p236 A2.6 文字列リテラル より
> 文字列定数とも呼ばれる文字列リテラルは、"..."のように2重引用符で囲まれた文字列である。
>>478
がーん、どう気をつければ・・・
googleで「C言語 文字列定数」をキーワードに検索したところ、どこも"〜〜"を文字列定数と呼んでいるんだが・・・
484483:02/11/06 22:00
ちょっと語弊があるな。
文字列定数はどこも"〜〜"のことを指している
リテラル=定数
486デフォルトの名無しさん:02/11/06 22:01
>>468

訳語の話をしてるんであって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
あー・・・
じゃあ準定数(←勝手に作った言葉)
即値の人、どっか行っちゃったね
お前らはあるある話で盛り上がる中学生ですか?
500即値の人:02/11/06 22:26
なんだ、思ったより釣れなかった。つまらん。
間違ったらネタにしたがるモノホンの中学生発見
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で改行を読んでいるとか?
新手の荒らしですか?
509506:02/11/06 22:40
>>508
俺もそう思たが・・・
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;
}
>>510
とりあえず、なんか本買え。
すいません、>>506はミス入力です。
>>507二回目?>>504>>505のnum2=getchar();
は同じものです。

>>508荒らしではないですが、
板を見にくくしてしまって申し訳ありません。
もしかして私のことを他人からみたら厨ですか?
厨は大っ嫌いなのに・・・
>>506
なぜコピペするのかわからん。

>>510
"%s\n"
>>512

たとえばnを入力し、つづいてEnterキーを押す。
そうするとnはgetchar()で読まれるが、Enterキーを押すことで入力された改行文字はバッファに残る。
次にgetchar()が呼ばれるとその改行文字を読むから入力待ちにならない。
515506:02/11/06 22:48
>>510
限りなく危険だが、これで動くことは動く。
>>511に同意でなんか本を買え

#include <stdio.h>

int main(int argv , char **argc)
{
char *hello_world = "hello world!";

printf("%s\n" , hello_world);

return 0;
}
おとなしくscanfでもつかっとけ。
>>515
なぜ危険なんだ?
>>515
何が危険なの?
519518:02/11/06 22:51
かぶった (;´Д`)
520512:02/11/06 22:51
>>514氏、じゃあどうすればよいのですか?
scanfで数字入力にするようですか?
521デフォルトの名無しさん:02/11/06 22:52
>>515
まさか仮引数名が一般とは逆になっているとかそういうことじゃないよね?
522506:02/11/06 22:52
>>517
俺は確保されていないメモリに文字列を突っ込むのは怖いので。
523デフォルトの名無しさん:02/11/06 22:53
>>522

文字列定数は自動的にどこかに領域が取られるんじゃなかったのか?(^_^;)
>>522
良かったなここで恥かいといて。
525デフォルトの名無しさん:02/11/06 22:56
>>506
君の知識のほうが危険な気がする
526506:02/11/06 22:57
>>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
528506:02/11/06 22:58
>>522
>>523
529523:02/11/06 22:59
>>526
じゃあなんだ、printf("Hello,world!\n");これも危険だってか?
530510:02/11/06 22:59
>>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に確保されるが変更可能かどうかは不明。
536506:02/11/06 23:03
>>529
printfは知らんが、sprintfは危険なのは知っている。

>>531
バグが潜む可能性があると提示したまでです。
537506 :02/11/06 23:03
>>535うう、よく分かりません・・・。
やっぱりif else文を覚えたてでは無理ですか?
今はやさしいCっていう麻奈本で学んでるんですけど・・・。
538523:02/11/06 23:05
>>536
char *str="abcdef";

この文は、char型へのポインタstrを宣言して、それを文字列定数"abcdef"の先頭アドレスで初期化しているということは理解しているよね?
             ,ィミ,        ,ィミ,               フ
              彡 ミ        彡 ミ,            ヤ |
           ,,彡   ミ、、、、、、、、彡  ミ,     (⌒)    レ  |  まあ落ち着けや
          彡;:;:             ミ,    (  ヽ   ヤ
       〜三;:;:::::              彡〜  ノ  ノ   レ
       ~~三:;:;:;:::::  -=・=-   -=・=- 三~~ ヽ (    :     ;;
       ~~彡::;:;:;:;:::..     ___     ,三~~ ( ノ ,,,,,  :      ;;
        ~~彡;:;:;:;:;:;:;:.    |┴┴|    ,ミ~~ ノノ ;'" ,,ノ―、     ,;'
        ~~彡:;:;:;:;:;:;:;:;.  ノ――| ---==ニノ ,;'′ >=ニ(二二二()
   ,...-''''""~~,::;:;::;::;::;::;'            ミ,,  ,;'′  ゝ--〈
__,;";;:;;;;;;;;;;;;;;;;;;;;;:;:;:;:;:;:;:;            i! ミ,,,,;'′   `ー‐'
         ::::ミミミ:;:;:;:           ミ::      ,;' ̄ ̄ ̄ ̄|  \___/
          :::::ミミミ:;:;:           ミ:::,   ,;::''′        |.    \/
          ::::ミミミ:;:;::       ,;+''"~~゙+、~'''''~          |     |
           ::::ミミミ:;:;:;:     ,+'"     ミ:::::           |   ━┷━━━┳━━━━━
             :::::ミミミ:;:;:;:;:  >':;:       ミ::              |             ┃
           ::::::ミミミ:;:;:;:;:;../;:;:;:       ;:"             |             ┃
            ::::::::ミミミミ:;:/;:;:;:;:    ,.+'"''-、________|__         ┃
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄;':;:;:;:   ,.+'"    ミ、             l          ┃
>>536
発生しうるバグは
> 俺は確保されていないメモリに文字列を突っ込むのは怖いので。
で言い表されるのとは違うと思うのだが。
>>537
scanfでいいんじゃないの?
>>536
じゃあどう危険なのか教えて欲しい。
543506 :02/11/06 23:10
>>541じゃあ
scanfでYESは1、NOは2ということでやってみます。
544そくちのひと:02/11/06 23:12
最初ここに来たときは傲慢な口調の奴ばかりで
「こいつら相当プログラムできるんだろうな」と思っていたが、
見てる内に大半はハターリで無能な奴ほど増長すると言う事が分かりました。
545536:02/11/06 23:12
>>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";
>>550
ネタですか?
わかったから
"Welcome Hell World"
にしときなさい。おまへら。
552=550?
551 は文字列の内容を指摘してるんじゃないと思うけど。
helloworldも書けない奴がしたり顔でc言語を教えているスレはここですか?
506が二人いるように見えるんだが、、、
"Naruhodo the World"希望
557536:02/11/06 23:25
>>548
これはC++になるが、文字操作クラスのメソッドを作るときに
最終的には文字をポインタで操作するような事だ。

話がそれるが、俺はバグをなるだけ抑えるようなコードを書くために
慎重さを優先させてきたつもりだ。
>>547の言うようにそんなに知識は無いがなるだけエラーを起こさない様に
努力しているつもりだが何が悪い?
>>549
なら、始めっからそう書くと思うんだよなぁ。
const付けるだけで「限りなく危険」なことが回避できるのなら。
"Hello World"が嫌な椰子は
http://pc.2ch.net/test/read.cgi/prog/1035134087/l50
へ逝ってください。
560デフォルトの名無しさん:02/11/06 23:29
プログラムを作る上で知識が無いのは致命的な欠点だと思うよ。
知らなかった、じゃあ済まされないからね。
>>543 は 536 とは別の人?
>>557
なぜここで(必要も無い)C++を持ち出す?
563デフォルトの名無しさん:02/11/06 23:33
>>522
こう言っておいて>>545はねーだろ
564548:02/11/06 23:33
>>557
あなたは超能力者ですか?
悪いとは一言も言っていない、何を言っているのかわからないって言ったんだ
けど・・・。
しかも、相変わらず理解できないよ。

> これはC++になるが、文字操作クラスのメソッドを作るときに
> 最終的には文字をポインタで操作するような事だ。
いきなり C++ かい、というツッコミは置いといて、主語が無いよ。
何を述べているのか全然わからない。
こんなに日本語ダメダメで、本当に本職さんなの?
>>536=506
ちょっと痛すぎだよ。
素直に謝りを認めればいいものを...
566デフォルトの名無しさん:02/11/06 23:34
>>506はif-elseの人なの?文字列の人なの?
どっちなんだYO!
567565:02/11/06 23:35
誤字訂正。 ×謝り→ ○誤り
素直に誤りを認めとこう。
>>567
ワラタ
>>566
唐突に関係の無い話を持ち出さない事。
570536:02/11/06 23:36
>>564
どうしてそんなに頭がわるい?
文字列操作のクラスを自作してポインタを直接扱わなくてもいいようにしたんだ。
画期的だろ?
>>570
ネタはもうちょっとひねって書き込みましょう。
>>570
画期的だが、さっきからの話題とどう関係あるんだ?
573564:02/11/06 23:38
Nooooooooo!!!

>>570
> どうしてそんなに頭がわるい?

> 文字列操作のクラスを自作してポインタを直接扱わなくてもいいようにしたんだ。
> 画期的だろ?
が全然繋がってないYO!!!
getch()でも、どうぞ
>>564
お前が理解しろ。
570 は騙りじゃないのか?
プログラマーって536みたいな人多いの?なんか開き直ってるし…。
しかしネタが無いからちょっと変な事言う奴を見つけると総出で叩かれるな。
つまり、
「文字列をポインタで持つのは、バグの元だからステ。
 やっぱりC++でstringクラスでしょう」と570は、
このCスレで主張した、と、こいうことか?
579564:02/11/06 23:41
>>575
あんたにわかると言うなら、もったいぶらずに解釈を書きなさい。
>>578
なるほど。
でもさっきからの話題とのつながりがよくわからないYO・・・
581580:02/11/06 23:43
話題をそらそうとしただけかしら。。。
582557:02/11/06 23:43
C++は例えばの話なのだが。
>>563
そうだったな、悪い。あれは俺の間違いだ。
>>564
例えは悪いが、良くあるサンプルで
int型nとiがメモリ上で並んでいたとしてiが何かの拍子でオーバーフローした結果、
nにも(不本意にも)影響が出てしまう。
つまり、いちいちポインタ云々で文字列操作をするとバグが出る可能性がある
と言いたかった。(扱う場合にはエラーが出ないよう慎重にコーディングする)
583386:02/11/06 23:44
どいつもこいつも頭の悪いヤツばかりだな。
584550:02/11/06 23:44
>>553
何言ってんだか…、やれやれアホにはついていけませんな。
585386:02/11/06 23:46
int型のnをオーバーフローすると別のメモリに書き込みが行われるのか。
勉強になるな、うん。
>>580
>>548が本物だとしたら、「C++出せば納得してもらえるだろう。どうせC++
わかんねーだろうし」ってとこじゃないか?
>>582
オーバーフロウってバッファオーバーフロウを指しているの?
じゃないとnに影響を与えることなんてないんじゃないか?
>>584
アフォですか?
const char const * p = "hello japan";
これ
const char * p = "hello japan";
とどう違うの?
589582:02/11/06 23:48
ちなみに>>570は俺じゃない。
画期的かかは別問題として、ポインタを直接操作するのは
極力しないように勤めるのが、バグ減らしに有効だと思う。
桁あふれってCPU上で起こるんだからメモリーには影響を与えないような気が・・・
>>589
とりあえず、名前は固定しといてくれ。
バグの元だ。
番号だらけだな
亀レスですが私>>543>>536とは別人です。
>>590
386 は全部ネタだから無視して (・∀・)イイ!! よ。
>>593
だよな(笑)
>>504>>506ならただのミスだけど、そうでないのなら、>>504をコピペする意図がさっぱりわからん。
>>594
言ったのは386じゃねーだろ(ワラ
もうグダグダだな。
598386:02/11/06 23:52
>>589
unsinged int n = 0xffffffff;
n++;

うあっ、強制終了させられた!!(window2000)
599594:02/11/06 23:53
>>596
う、今読み直して気付いた。逝ってくる・・・。
>>589
つまり、Hello, WorldでもC++のstringのようなものを実装してそれ使えと。
余計バグ増やしそうな気がするのは俺だけか?
601582:02/11/06 23:53
>>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 で転送されるので、元のメモリの
別の変数領域が破壊される事は無い。
613582:02/11/07 00:03
>>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 本職がいるスレはここですか?
>>621
そんな気がしないでもない。
>>617
「未定義」 だったような気がしないでもない。
>>623
というか、定義するまでもない。
             ∧         ∧              ###
            / ヽ        ./ .∧           /#####ヽ
           /   `、     /   .∧         /  ##### \
          /       ̄ ̄ ̄    ヽ        /   #####  ヽ
          l:::::::::              .l      /    #####   ヽ
         |::::::::::  -==・-    -==・-  |      |          ::::::::: :::::::|
         .|:::::::::::::::::   \___/    |      |  -・==-   -・==- :::::::::|
          ヽ:::::::::::::::::::  \/     丿      |    \___/  :: :::::::|
          ヽ:::::::::::::::::        /       ヽ      \/    ::::::::::|
     ____>:::::::::::::::::       <_        ヽ        ::::;;;::::::::丿
    /:::::::::::::::::::::::: :::::::::          /⌒ヽ⌒、⌒、⌒、      ::::::::: :<___
    |::::::::::::;;;;;;;;;;;;;:::::::::::::::        / /ヽノヽノヽノヽノ       :::::::::::::  :::::::: :::ヽ
   |::::::::::::::::::::::::            /  /:::::::: :::::::::::::::::::::           ::::::::
          「未定義」論争いこうか?             いいねぇ〜
なんで>>510のしょうもない質問からこんなに発展するんだ?
>>510もネタくさいし・・・・
> 510もネタくさいし・・・・
同意・・・
>>510はネタでは無いと思うが。
多少なりともcをかじってる奴はprintfのformat部をあんな風にすると言う発想が
そもそも無いと思う。作為的なものは感じられない。
  |         |  |
  |         |  |_____
  |         |  | ̄ ̄ ̄ /|
  |         |  |   / /|
  |        /\ |  /|/|/|
  |      /  / |// / /|
  |   /  / |_|/|/|/|/|
  |  /  /  |文|/ // /     ∧∧
  |/  /.  _.| ̄|/|/|/      /⌒ヽ)
/|\/  / /  |/ /       [ 祭 _]    ∧∧
/|    / /  /ヽ         三____|∪   /⌒ヽ)
  |   | ̄|  | |ヽ/l         (/~ ∪    [ 祭 _]
  |   |  |/| |__|/       三三      三___|∪
  |   |/|  |/         三三       (/~∪
  |   |  |/         三三      三三
  |   |/                    三三
  |  /                    三三
  |/                    三三

>>628
フォーマット文字列をあんなにする奴がmainの引数を書くとはおもえん・・・しかも通常とは逆だし。
あと>>530
兎も角だおまいら
未定義で不定なんだよ
>>613
> 実際扱うのは関数ポインタなんだが。

新たなネタですか?
633age:02/11/07 00:45
age
ここはグダグダなインターネトですne
635 には脱帽。
ポインタがおかしくなゆので危険というのはこのスレのことだったのか。
Cスレにしては信じられない静けさ
639デフォルトの名無しさん:02/11/07 03:58
この問題教えてください。
明日までの課題なんです。

「文字列配列を2つ渡すと、その2つの文字列を連結する関数を作成せよ。
ただし、関数は次の機能を持つ。

・2つの文字列配列はポインタで受け取る
・文字列配列の操作はポインタの増加で行う。str[i]という操作は使わない。
・結果は関数内で動的メモリ確保を行いそのポインタを返す。 」

神降臨キボンヌ。
>>639
宿題はスレ違いだバカ野郎。
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;
}
645644:02/11/07 05:21
仮引数は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;
}
647639:02/11/07 06:02
>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
>>647
適当な言葉がみつからなかったから単にpとした

>>648
高橋麻奈タンのやさしいC
K&R 読むのは大変だがこれ一冊で十分。
652649:02/11/07 06:05
こっちがマジレス。
#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;
}
656649:02/11/07 06:13
>>653
速度を考慮してあえてmemcpyを使ったんだが。
657639:02/11/07 06:16
やったー、みなさんのおかげでできました。

ぼくにとっては一大事だったのでたすかりました。

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;
}
659649:02/11/07 06:16
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
664649:02/11/07 06:31
すまぁとの基準による。
俺的には俺の649。
665デフォルトの名無しさん:02/11/07 06:32
一番だめだめ〜なのは?
666649:02/11/07 06:33
660もいいね。
649よりは658
668649:02/11/07 06:34
だめだめ〜の基準による。
俺的には俺の652と661。
669649:02/11/07 06:34
>>658
速度を考えないならそれでいい。
memcpy と strcpy ってそんなに差がある?
671649:02/11/07 06:45
処理系(ライブラリ)依存の話になるけど、一般的には
あらかじめ長さがわかっている文字列をコピーするなら
strcpyよりmemcpyの方が有利。実装を考えてみるといい。
ただ、可読性ではstrcpyの方がすっきりするね。
strcpyは0の検出処理をし、memcpyは指定されたバイト数に達したかどうかを検出する。
大差ないだろ。
長さがわかってるんならcharごとじゃなくて
ある程度の大きさづつコピーできるな。
674デフォルトの名無しさん:02/11/07 06:52
>>673
それがmemcpyじゃないか?
675649:02/11/07 06:55
>>672
ライブラリ関数のソースでも読んでみればいい。
まあコンパイラによってはインライン展開するものもあるから
アセンブルリストを出力させる必要があるかもしれんが。
676デフォルトの名無しさん:02/11/07 07:01
RtlMoveMemory( dst, src, count );

VC++6.0

なんだこの関数は?
677649:02/11/07 07:02
>>676
memmoveで#defineされてない?
>>672
大違い
679677:02/11/07 07:04
あ、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でもやったよ。結果は変わらないけど
>>683
どうやって速度をはかった?
685684:02/11/07 07:23
VC++6.0のclock程度じゃそこまで精密にはかれない。
>>684
(゚Д゚)ファア?
ループで繰り返したに決まってんじゃん
くだんねぇこと聞くなや。ハグェが
>>686
ならなぜ素直にもっと巨大な配列を使わないんだ?
688デフォルトの名無しさん:02/11/07 07:32
http://shopping.yahoo.co.jp/shop?d=jb&id=30884785
確認ですが、これはVineLinuxでemacsでC言語を勉強する人向けのもので入門から脱初心者までの本ですか?
Windows向けのものではありませんよね。
689687:02/11/07 07:34
で、巨大な配列をつくってやってた。
一桁ずつ増やし、1千万文字にしてやっと差が出たよ・・・・
確かにmemcpyの方が速かった。でも問題になるようなものじゃないと思う。
690689:02/11/07 07:34
「つくってやってた」じゃなくて「つくってやってみた」
>>687
大きい配列だと確実に strcpy 不利だと思ったんだけど違うかな?
ちなみに 1,000,000でもやってみたけど strcpy の方が2倍近くかかる
>>691
(CPUの計算速度によるが)そこまで大きな配列を使うか、よほどループさせなければ問題になるほどじゃないだろ?
693692:02/11/07 07:40
元々時間のかかる処理じゃないから例え二倍でも大差ないと言いたいだけ。
694649:02/11/07 07:47
俺もVC++5.0でループを使って計測してみた。平均して
100文字で約5倍、1000文字で約11倍程度の速度差だった。

まあそれでもstrcpyを使うのは勝手だが、俺ならmemcpyだな。
>>692
strcpy や memcpy みたいな関数はプログラム内で何万回も呼ばれたり
することだってあるわけだから十分問題だと思うんだけどなぁ...
696デフォルトの名無しさん:02/11/07 07:53
memcpyを自分で書けと言われたらどう書く?
697649:02/11/07 07:59
用途次第だな。
毎回書くようなソースならともかく、
一度作っておけば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
>>700-701

mallocでコピーする領域を得る時に長さをはかるでしょ・・・・
704699:02/11/07 08:09
(;´Д`)いきなり間違ってたスマソ
for ( i = 0; i < y; i++ ) *dc++ = *dl++; → for ( i = 0; i < y; i++ ) *dc++ = *sc++;
やっぱダメだ忘れてください......
705703:02/11/07 08:10
第一、さっきの文字列連結関数もそういう理由でmemcpyをつかったんでしょ!?
706699:02/11/07 08:10
>>702
え......なんスか?バスエラーって?
なんかマズいことしてます?(;´Д`)
strcpyとmemcpyの速度の差ってstrcpyが関数内でコピーサイズを調べるからでしょ。
memcpyは関数外でコピーサイズを調べなきゃいけないから、結局変わらない。
>>699
そのままでは、ワードデータのアライメントを要求するCPU(680x0とか)では
ちょっとまずい。与えるアドレスが奇数だとaddress errorになる。
x86でも、エラーにはならないが遅くなったりする。

でも、基本的な考え方(できるだけ大きな単位でデータを移動)はいいのでは?
ライブラリのmemcpy()のソースも、アセンブラで書いてあったり、キャッシュ
を考慮して命令の配列に気を配ったりしているけど、基本的にはそんな感じ。
>>707
strcpy()は'\0'が来るまでコピーという仕様だから、1バイトずつコピーする
以外に実装のしようがない。
memcpy()はあらかじめデータサイズが分かっているので、>>699のように
サイズが4の倍数だったらlong単位でコピーする、などの高速化が図れる。
710699:02/11/07 08:23
>>708
なるほど.....正直CPUの動作のこと全然知らなかったです。サンクス
711独り言モード:02/11/07 08:24
昔、アセンブラで組んだときに、少しでも速くコピーするために
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
アフォですか?
723715:02/11/07 08:38
>>718
> そっちの方が速いならそう書けば良い。
あほですか?
4の倍数じゃなかったら数倍遅くなるわけだが。
724デフォルトの名無しさん:02/11/07 08:38
memsetも複数バイトごとに書き込んでいたりする?
725デフォルトの名無しさん:02/11/07 08:39
>>720
strcpyの方がわかりやすいから。
>>720
文字列のコピーはサイズがあらかじめわからないのでmemcpyだけじゃできませんよ。
727デフォルトの名無しさん:02/11/07 08:40
>>721
必要だけど、それはmallocで使ったりするんじゃない?
>>725
どこらへんが?
>>726
日本語読めませんか?
729デフォルトの名無しさん:02/11/07 08:40
>>728
strcpyなら文字列を丸ごとコピーしているとすぐに分かるだろ。
>>723
そうだね。memcpyも4の倍数じゃなかったら数倍遅くなるね。
731729:02/11/07 08:41
memcpyだとコメントでもないかぎり、なぜmemcpyなんだ!?と思う。
>>729
コメントつけるなりしてください。そんなところで可読性気にするより
733649:02/11/07 08:41
なんか勘違いしてる奴がいるようだが、俺がstrcpyよりmemcpy
の方が有利と書いたのは、長さがわかってる場合という前提だからな。
671で書いてるが。
>>733
VC++6.0のstrdupのソース見てみた。文字列の長さがコピー時には分かっているのにstrcpyを使っているね。
このソース糞だね。
>>734
糞です。いますぐ窓から投げ捨ててください(w
>>730
お前ほんとに短絡思考だな。ここまで来るとネタとしか思えん。
memcpyって文字列以外の配列のコピーのためにあるんだと思っていた・・・
確かに文字列のコピーに使えないことはないけど。
738649:02/11/07 08:45
>>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
本当に糞だな。
>>739
それ書いたやつはきっと過労で疲れてたんだよ、きっと
742649:02/11/07 08:55
んで、結局彼は何が言いたいんだろう。
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);
}
745744:02/11/07 08:58
おっと、一行目は無視してくれ
>>709
俺の記憶が正しければ、VC++のstrcpy()はワード境界からずれた
先頭と末尾以外はワード単位で転送してたように思う。
NUL文字の検出はなかなか思いつかなそうな方法使ってたよ。
747デフォルトの名無しさん:02/11/07 10:50
半角って1バイト?漢字が2バイト?
>>747
昔はな。とか言ってみる。
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
>>688

答えてください。
>>756
>確認ですが、これはVineLinuxでemacsでC言語を勉強する人向けのもので入門から脱初心者までの本ですか?
>Windows向けのものではありませんよね。

プラットホームは特定してません。
内容は基礎を一通り。



>>688
それがわからないようなレベルであれば買っといて損は無い。
759709:02/11/07 12:49
>>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での開発環境の勉強をしたかったら
別に本を買う必要があるよ。
>>756
Vine-usersに帰れよひかる
764デフォルトの名無しさん:02/11/07 14:16
つまりそれはC言語に特定しないLinuxの勉強本が他にいるということですか。
Windows用のを買ってしまって大変後悔しているのです。emacsでC言語をやりたいと言えば、やはりお勧めは前述の本が妥当なのですね?
>>761
emacsのマニュアルならそこらに転がってるぞ
英語 :http://www.delorie.com/gnu/docs/emacs/emacs_toc.html
日本語:http://flex.ee.uec.ac.jp/texi/emacs-jp/emacs-jp_toc.html
V-U MLから遂に駆逐されたの?>>763
>>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で宣言されてます」
といわれてエラーになるんですが
コンパイラが壊れてるんですか?
>>774
ネタはケッコウです。
sage
776デフォルトの名無しさん:02/11/07 14:57
>>775
あの真剣に分からないのですが
軽めに説明してくれませんか?
777
>>776
void の意味をわかれ。調べれ。以上。
>>774
>void a;

この行にコメントを付けるとすればアナタはどんなことを書きますか?
/* 型がきまってません */
とか?
ですか?
void a; /*voidにする*/


だろ
こういう明らかに入門書の一冊でも読んでないようなヤツは、無視して欲しいというのが正直なところ。
>>779
780 と 781 はものすごく正しいから、もうちょっと考えてから書いてくれ。
784783:02/11/07 15:07
いや、違う。
780 は間違ってるぞ。
>>774
何をするつもりで void a; と書いたわけ?
786774:02/11/07 15:15
voidの大きさなどが仮にでも決められてるとしたら
どんなもんだろうと思いまして
>>782ここまで怒られるとは思いませんでした
ショボン。。
>>786
気持ちもわからんでもないが、妄想から書いたコードをコンパイルできなくて
「コンパイラが壊れてるんですか?」 とかほざいてたら放置したくもなるだろう。
>>786
だったら「コンパイラが壊れてる」なんてふざけたことを書かないで、
こういう動機でこのコードを書いて、こういう結果がでたので、こう考
察しましたとか、まじめに書けや、
>>774
void の意味を英和時点で牽いておけ。
790789:02/11/07 15:23
> 時点

          アヒャーー
      ∧∧
     (゚∀゚ )⌒ヽ ≡≡ = = -
    ,.、,,U‐U^(,,⊃_       /i ≡≡≡ = = -
   ;'゚∀゚ 、、:、.:、:, :,.: ::`゙:.:゙:`''':,'.´ -‐i = ≡≡≡ = = -
    '、;: ...: ,:. :.、.:',.: .:: _;.;;..; :..‐'゙  ̄  ̄
     `" ◎ ''`゙ ◎ ´´   - = ≡ = = -
void *aの間違いでしょ。

>>759
じゃあstrcpyで問題ないじゃん。
>>791
786 で言っている事の何が void* なんだ?
793デフォルトの名無しさん:02/11/07 15:41
http://shopping.yahoo.co.jp/shop?d=jb&id=30552298

emacsについてはこの本でいいでしょうか?やすいので。。。。。。。
デクリメントですむ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についてはおれ、よーわからんわ。
本当にこれで判定できるのか。あとでじっくり考えてみよう。
803799:02/11/07 15:56
>>802
まあ遅い・・・だろうな。
判定のために関数を呼ぶみたいだし。

でもそれほど遅くなるのかなあ?
804799:02/11/07 15:59
ふと思ったんだけど、ワード単位でコピーしていってその中に0があるかどうか判断する方法って
場合によってはアクセスしてはならないところにアクセスすることにならない?

memcpyならコピーする大きさが決まっているからできるかぎりワード単位でコピーして、
残りは1バイトずつコピーするので問題ないけど。
VC6で計ったら、strcpy()のほうがだいぶ早かった。
806802=797:02/11/07 15:59
>>803
うん。速度の差があったとしても問題になることはまずないだろう。
だから何やってるか一目わかるしパラメータが一つ少なくて済む
strcpyを普通は使うと思う。少なくともおれはそう。
807804:02/11/07 16:00
あ、そんなことないか。
調べる時は1バイトずつやるんだもんな(^_^;)
>>802
printf("%p\n", &n);
printf("%p\n", &*pt);
とでもしてみたら。
809808:02/11/07 16:11
× >>802
>>801
; 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);
}
817805:02/11/07 16:21
>>805はミスだった。
やっぱりmemcpyのほうが速い。
そういえば 810 のコード、759 がかけらも見当たらないね。
1 ワードずつ判定していくより、先に長さを測ってストリング命令
かました方が速いのか。
819デフォルトの名無しさん:02/11/07 16:29
void *やconst voidがヘルプ見るとやたら出てくるんだが
わかりやすく説明してもらえないでしょうか
>>819
何がわからないのか分からないんだが
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);
824746:02/11/07 16:42
>>799
判定の条件が増えるわけだから当然多少は遅くなる。

実際のソースじゃ判定を関数なんかに分けてないよ。
そんなことしたら1バイトずつ調べた方が速くなる。

strdup()でstrcpy()を使うメリットはない。malloc()する前に文字列長を
調べてあるわけだから、終了判定が単純なmemcpy()の方が速いはず。

とはいっても、短めの文字列だったら数クロックの差くらいしかない。
malloc()にかかる時間の方がけた違いに大きいから、差はないも同然。

>>804
文字列の終端を調べる時にワード単位で読み込んでも問題ない。

数バイト多めに読み込んでも、その内容を書き換えるわけじゃない。
ワード境界に沿ったワード読み込みの場合はページ境界をまたがないから、
ワードの先頭バイトを読み込める状況ではAccess Violationも起こりえない。
825デフォルトの名無しさん:02/11/07 16:44
>>822
産休。わかりやした
826746:02/11/07 16:49
>>818
あれは関数としてリンクする場合のstrcpy()のコードだよ。
>>810のは最適化で組み込み関数を展開した場合のコード。

毎回展開するからサイズを大きくするわけにいかないのと、
関数呼び出しのコストがかからないから、それでも十分に速い。
>>826
そうなのか。
ところで VC6 の CRT の strcpr() のソースが見当たらないのだが
828827:02/11/07 16:54
> strcpr()
   ∧∧
   /⌒ヽ)
  i三 ∪
 ○三 |
  (/~∪
  三三
 三三
三三
strcpyはmemcpyに勝てないのか!?
strcpy = strlen + memcpy と思って間違いないと。
どうでもいいことで熱くなれるC老子

832800:02/11/07 17:09
>>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);
}
834833:02/11/07 17:23
このソースの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
>>833
stdlib.hをインクルードしろ
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
>>839
丸投げは添削スレに逝ってくれ。
http://pc3.2ch.net/test/read.cgi/tech/1021881540/l50
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は・・・。
857853:02/11/07 18:01
>>856

   い い ん だ よ
>>853
そのソースを見た方が( ○ ´ ー ` ○ )の説明を見るよりもよくわかる・・・・(w
要はcの部分まで切りつめてくっつけるってことか。
859858:02/11/07 18:03
あ、後方でしかも大文字小文字区別なしか。
じゃあ>>853はだめじゃん。
>>857
861858:02/11/07 18:06
↓大文字小文字区別なしに後方探索する関数をかいてみた。テストしていないけど(^_^;)

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 のが速いかもな
872861:02/11/07 18:33
>>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);
}
883882:02/11/07 19:32
あり?Mozilla 1.0では&piがπに見える...
Mozillaのバグか?
あーあ、せっかくレジスタに割り当てようと思ったのに。
885初心者&rlo;者心始:02/11/07 20:45
確認しておきたんですが、
コンパイルを実行した時の流れを大まかに書くと

プリプロセッサ #を展開

コンパイラ objファイルを作る

リンカ objファイル、標準ライブラリを利用してexeファイルを作る。
ですよね?

ということは、
モジュール化してないCファイルがobjファイルを
作らないのはかなり矛盾していませんか?

どういうことなんでしょうか?教えて下さい。

objファイルがないとリンカがexeファイルを作れないと思うんですが。
>モジュール化してないCファイルがobjファイルを作らない
どういう意味?
>>885
なんか勘違いしてない?
javaみたいなもんを想像してるんでは?

クラス -> .obj -> .exe

みたいな。

Cはクラスノ概念がないからモジュール化なんて出来ないじゃないか!みたいな。
(まぁ、この時点で間違ってるんだが)
注意:objファイルは、オブジェクト指向とは何ら関係ありません
890885&rlo;588:02/11/07 21:05

>モジュール化してない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
>>896
サンクス
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のはたらきするってか
912908:02/11/07 21:25
多分、/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ディレクトリ。
>>919
さっきからネタばっか。やめれ
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"
>>927
invalid macro name
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ってどういう意味?
辞書にものってない・・・
>>937
allocate
allocate
all oK(OKのKはCorrectの綴り間違いから来た)
941936:02/11/07 21:46
ごめん!
a.hはインクルードファイルにいれたけど
a.cもインクルードに入れるの?
かまって君と教え魔、ウザイよ。
>>941
ネタマジウザイ
おもんない
氏ね
漏れにはスレ立てられなかった。誰かよろしく。
次スレテンプレート
====================================
C 言語ならオレに訊け。

C 言語じゃないなら訊くな。
問題をちゃんと切り分けて、C の話かそうでないか洗ってから質問してくれ。

つーか訊く前に Web で検索しろ。

コンパイラ探してるなら >>2 を見れ。

GUI とか、C 標準でできない事の質問は使ってる開発環境のスレに逝ってくれ。
ソース丸投は別スレがあるから他に逝ってくれ。
宿題は別スレがあるから他に逝ってくれ。
書籍については別スレがあるから他に逝ってくれ。

・前スレ <39>
http://pc3.2ch.net/test/read.cgi/tech/1036409391/

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART6
http://pc3.2ch.net/test/read.cgi/tech/1033207156/
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
>>941
君の肛門からインクルードできるよ。
947デフォルトの名無しさん:02/11/07 21:49
>>944
やってみる
948936: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ビューア使え。

が精一杯だが。
952936:02/11/07 21:53
>>950
コンパイラが使える場所ってよくわからんけど
一応includeに入れておくよ!
っていうかヘッダの数半端じゃないね!!
いったいいつ使うんだろう・・・
953デフォルトの名無しさん:02/11/07 21:53
そのincludeにいれるんだったら
#include <a.h>
いれんほうがいいと思うが。
954947:02/11/07 21:54
無理だった。他の人頼むぅ
955936:02/11/07 21:55
>>953
なんで?呼び出すときは#include <a.h>でしょ?
ヘッダファイルはIncludeに入れるよね?
で、ソースファイルはどこに・・・?
956デフォルトの名無しさん:02/11/07 21:55
>>952
自分でつくったものをincludeディレクトリに入れるのはまずいんじゃないか?
特につくったものをソースごと配布するときなんかは。
C言語のことは漏れらに聞け!!<40>
http://pc3.2ch.net/test/read.cgi/tech/1036673739/l50
つーかよう、ネタに決まってんだから他のやつらも反応すんなや
                              γ      γ
       ∧_∧                           γ
       (::::::::::: )  次スレが立てられないなんて・・・  ......................................
      .(○::::::: )                      .::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::........
     ~"''"""゛"゛""''・、                   ...:::::;;;''        ';;;:::::.......
 "”゛""''""“”゛゛""''' "j'                 ...::::;;;''            '';;;::::::.........
 :::::ヘ :::::....ヽ :::;;;ノ  ::(                ....::::::;;              '';;;::::::::::.......
 ::  ゝ  :::::......ノ:;;../  ~~^^ ~~~~~^^^~ ~~^^ ~~^^ ~~~~~^^^~  ~~^^~~~^
960936:02/11/07 21:57
>>956
じゃあどこに入れればいいんですか?
例えばa.hを読み出すソースを保存してるふぉるだと
同じとこ?
961デフォルトの名無しさん:02/11/07 21:58
>>960
だから、呼び出すソースファイルと同じところだってば(笑)
a.cから呼び出すならa.cと同じディレクトリ(フォルダ)
936 は、同じ話題なら次スレに移すな。
963936:02/11/07 22:00
>>961
わかりました!ありです!
ソースファイルもヘッダファイルも一緒でつよね?
>>960
今までの煽りをリセットして聞いてくれ。

自分の、作業用のディレクトリを作って、そこに a.c と a.h を置け。
a.c からの a.h の呼び出しは、#include <a.h> ではなく
#include "a.h" にしろ。
あとは a.c をコンパイラにかければ OK だ。
965936:02/11/07 22:02
>>964
#include <>だと、Icludeフォルダからって事で
#include " "だと、同じフォルダって事すか?
>>965
やっと理解したか。
そういうこと。
stdio.hなんかはincludeディレクトリに入っているから<>でやるの。
そうだ。わかったらこのスレあげずに寝ろ。
これだ。
ヘッダー(#include)ファイルを探すのに、どこを探しにいくのか。
http://www.catnet.ne.jp/kouno/c_faq/c10.html#8
969936:02/11/07 22:05
ほんとありがとう!!
この知識を明日ひけらかすYO!
「なあなあ、お前ら知ってる?
#includeの<>はさあ、(以下略
はい、ネタ終了〜。乙!! >>969
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
???
980936:02/11/07 22:13
>>975
catはUnixのコードと思われ(勘
>>978
自作自演カコワルイ
982小人:02/11/07 22:13
ダレモイナイ1000getスルナラ…
983小人:02/11/07 22:14
イマノウチ…
984小人:02/11/07 22:14
ランタンタン♪
>>982 ミタヨー (゚∀┃
今日からお前の名前は1000だ!
987小人:02/11/07 22:15
ランタンタンタン♪
988936:02/11/07 22:16
キタ━(・∀・)━!
989小人:02/11/07 22:16
>>985
Σ(゚Д゚)ガーン…

でも(゚ε゚)キニシナイ!!
ではここらでジョークを一つ。

先日、友人二人と僕の三人でドライブへ行ったのさ。
その日はとてもいい天気でね。
それで
みんな何故Cを始めた?
漏れはなんとなくプログラムという言葉に憧れて
何も知らずにこの世界に入った。
992小人:02/11/07 22:17
今だ!901番ゲットォォォォ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄       (´´
                  ∧∧       (´⌒(´
            ⊂(゚Д゚ )≡≡≡(´⌒;;;≡≡≡
        ⊆⊂´ ̄ ⊂ソ  (´⌒(´⌒;;
           ̄ ̄ ̄   ズザーーーーーッ
993デフォルトの名無しさん:02/11/07 22:17
1000間近
今だ!993番ゲットォォォォ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄       (´´
                  ∧∧       (´⌒(´
            ⊂(゚Д゚ )≡≡≡(´⌒;;;≡≡≡
        ⊆⊂´ ̄ ⊂ソ  (´⌒(´⌒;;
           ̄ ̄ ̄   ズザーーーーーッ
 ∧||∧
(  ⌒ ヽ トゥトゥトゥマシェーリー
 ∪ 。ノ    トゥトゥトゥマシェーリー
  ∪∪
それで
海にでも行こうかってことになって友人の一人が運転して僕は助手席、もう一人の友人は
後ろの席に乗っていくことになったんだ。
すると途中で
もうちょい
   ∧∧
   /⌒ヽ)
  i三 ∪
 ○三 |
  (/~∪
  三三
 三三
三三
1000
1000ゲット
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。