2 :
デフォルトの名無しさん :02/04/11 00:48
2
delete this;
長い。
6 :
緑茶。 p0086-ip01kagawa.kagawa.ocn.ne.jp :02/04/11 00:51
うんこ
8 :
緑茶。 p0086-ip01kagawa.kagawa.ocn.ne.jp :02/04/11 00:57
しょうもないことで いちいちぴりぴりしてちゃ この先生きていけんぞ
どの先生がなんだって?アフォ
10 :
緑茶。 p0086-ip01kagawa.kagawa.ocn.ne.jp :02/04/11 01:01
あぁ、世知辛い世の中
香川県のOCNに通報しました。
12 :
デフォルトの名無しさん :02/04/11 02:19
system("age");
13 :
デフォルトの名無しさん :02/04/11 07:47
pid=fork(); if(pid==0) execl("age","age",NULL); else wait(pid); ...?
>>13 いや、子プロセス作るのは勝手だけどさ・・・。
ファイル file.in をプログラム prog に読みこませ、 ファイル file.out に出力したいんですが。 つまり次のような感じです。 $./prog < file.in > file.out で、次のようなプログラムを書きました。 #include <stdio.h> int main(void){ FILE *fpin, *fpout, *fpprog; int c; fpin = fopen("file.in", "r"); fpout = freopen("file.out", "w", stdout); fpprog = popen("./prog", "w"); while((c = fgetc(fpin)) != EOF){ fputc(c, fpprog); } fclose(fpin); fclose(fpout); pclose(fpprog); return 0; } プログラム prog は標準入出力を使う前堤で作ってます。 一応目的は達成できてるんですが、何か ダサダサ な気がするので、 もうちょっとスマートなやり方はないでしょうか ?
15はホントに「標準入出力」の意味をわかっているのかと、 ついでに、そのfpprogは一体なんだと、小一時間(略)
>>18 まず、
$rm file.out
$./prog
$ls file.out
実行。
・・・っていうかそれ正常に動くのか????
思いっきり自分自身を書き変えようとしてるが・・・。
>>15 while(scanf("%c",&a) != EOF)
printf("%c",a);
>>15 標準入出力のFILE構造体へのポインタはstdin、stdoutだろ。
わざわざfopenする必要はない。
>>19 一回出力ファイル(file.out)消してやってみましたが、
やっぱりちゃんと作られます。
実際のコードと書き込んだコードが違わないか
今から確認してみます。
>>21 linux 使ってますが、getch は無いような・・・。
>>15 「標準入出力を使って動作するプログラムがすでにあったとして、こいつに特定の
ファイルを食わせて特定のファイルに吐き出させるプログラムを作りたい」ってこと
だよね?
system("./prog < file.in > file.out") が一番スマートな気がするけど…
>>22 > 標準入出力のFILE構造体へのポインタはstdin、stdoutだろ。
わかります。
> わざわざfopenする必要はない。
これもわかります。
ですが、
> 15に対して、
> 標準入出力のFILE構造体へのポインタはstdin、stdoutだろ。
> わざわざfopenする必要はない。
こうなるとわからない。
>>15 のどこかで stdin, stdout を開いているということですか?
それとも内部的にそうなるとか、そういうことでしょうか?
標準ライブラリが main()を呼ぶ前に stdin, stdout, stderrを開いている (内部的にfopenを同等の動作) で、通常はstdin, stdout, stderrはわざわざ閉じる必要はない。 とりあえずそういうもんだと思え。
>>24 > 「標準入出力を使って動作するプログラムがすでにあったとして、こいつに特定の
> ファイルを食わせて特定のファイルに吐き出させるプログラムを作りたい」ってこと
> だよね?
そのとおりです。
そしてそう書いたつもりだったんですが、15 の説明がわかりにくかったようです。
考えすぎました。
> system("./prog < file.in > file.out") が一番スマートな気がするけど…
確かにそうです。納得。system() を調べてみます。
実際には入力ファイルも出力ファイルも複数あるので、
ファイル名が固定だと後で困りそうです。
>>19 コードは間違っていないようです。
>>26 > 標準ライブラリが main()を呼ぶ前に stdin, stdout, stderrを開いている
> (内部的にfopenを同等の動作)
わかります。
> 通常はstdin, stdout, stderrはわざわざ閉じる必要はない。
この文自体もわかります。
ですが、「15 のコードに対して言う」ところがわからない。
15 のコードのどこかで stdin, stdout, stderr のどれかを閉じているということでしょうか?
または結果的にそういうことになっている、と言うことでしょうか?
なにか話が噛み合っていない気が・・・むぅ。
30 :
デフォルトの名無しさん :02/04/11 11:26
>>27 sprintf(cmd, "%s < %s > %s", prog, file_in, file_out);
system(cmd);
>>28 お前のアフォさ加減にかなりゲンナリだが… それとも新手の荒らしか?(藁
入力するファイルと出力するファイルをリダイレクトしてる
わけだからソース中ではファイルのオープンをせずに
標準入出力のライブラリ関数を使えばいいだけだろう。
printfでもgetcでも好きなの使え。
>>28 > 15 のコードのどこかで stdin, stdout, stderr のどれかを閉じているということでしょうか?
> または結果的にそういうことになっている、と言うことでしょうか?
freopenしたときに元のストリームは閉じられる…けど、そういうことじゃないな。
progの話とprogを呼び出すプログラムの話が混ざっているから混乱すると思われ。
>>15 で書いたコードは「progを呼び出すプログラム」のものだけど、説明が悪いので
progのコードだと誤解しちゃっている人がいるんだと思う。
>>32 なんだそういうことか… 笑うしかないな(藁
プログラムを組む上で最も大切なものは、論理的な思考 | 正確な日本語 だと思います。
>>34 &じゃなくて|を使うところがプログラマらしくてよろしい。
37 :
デフォルトの名無しさん :02/04/11 12:56
文字列をC言語の式として評価して 値を求めるコードを書きたいのですが、どうしたらいいでしょうか? 例> char tmp[]="12>=24 && 23*5>4*29"; tmpをある関数に渡すと、FALSEが返る。
>>34-35 論理的な思考ができれば、正確な日本語は必要ないってことか・・・
>>37 そいつあ、難しい。
なんかのインタプリタから、式評価関数をパクってきたほが
早いかも。
int c; while(c=getchar(),c != EOF) putchar(c);
>>38 || じゃなくて | です。1からやり直しましょう。
>>37 まず数字と演算子に分解。
#if 式を後で使うかも(インタプリタ作るとか)
演算子の優先順位を基準にツリー化(低い=ルートより、高い先っぽ)
ツリーの先っぽから計算
#else
優先順位の高い演算子から逐次計算・置き換えしていく
#endif
後者ならちょちょっとできるよ。
ただC言語の式=関数呼び出しも含める、だとちょと無理。
43 :
デフォルトの名無しさん :02/04/11 13:25
Linuxのmcontext_t構造体が /usr/include/sys/ucontext.hにおいて宣言されています。 そのメンバとしてレジスタ退避用のint[19]を確保しています。 配列の要素にレジスタを割り当てるために、 無名列挙体のオートナンバリング機能を使って enum { REG_GS = 0, #define REG_GS REG_GS REG_FS, #define REG_FS REG_FS REG_ES, #define REG_ES REG_ES ・・・ }; としているのですが、ここで疑問があります。(前置き長くてスマソ) 宣言したすぐそばから#undefしてしまっているように見えるのですが これはどうしてなんでしょうか?
>>37 対象システムでgccが使えるなら。
#define TEMPSOURCE "/tmp/eval_tmp.c"
#define TEMPOBJECT "/tmp/eval_tmp"
int evaluate(const char *exp) {
FILE *fp;
fp = fopen(TEMPSOURCE, "w");
fprintf(fp, "int main() {return (int)(%s);}", exp);
fclose(fp);
system("gcc -o " TEMPOBJECT " " TEMPSOURCE);
return system(TEMPOBJECT);
}
>>30 > sprintf(cmd, "%s < %s > %s", prog, file_in, file_out);
> system(cmd);
むぅ、これはいいですね。早速使ってみます。
>>31 あなたがどれ程できるのか私には サパーリ わかりませんが、
私にもあなたが何が言いたいのかさっぱりわかりません。
アフォ からの忠告ですが、理解できない相手を非難するより、
どうすれば相手に理解してもらえるのかを考えた方が
ご自身の能力は高まると思いますよ。
>>32 freopen で stdout を閉じてるのはわかっていますが、
閉じる必要はないなどと書いてあったので私としては ハァ? な状態になってしまいました。
閉じて繋ぎ直さなきゃ、どうすればいいのかと。
> progの話とprogを呼び出すプログラムの話が混ざっているから混乱すると思われ。
>
>>15 で書いたコードは「progを呼び出すプログラム」のものだけど、説明が悪いので
> progのコードだと誤解しちゃっている人がいるんだと思う。
なるほど、
>>31 は
>>15 で何が書いてあるかわかっていなかったと。
噛み合わないはずですね。
説明は確かに自分で読んでも分かりにくいです。
日本語勉強し直します。
勉強になりました。 >> ALL
43です。寝ぼけてました。なかったことにして下さい。
48 :
デフォルトの名無しさん :02/04/11 18:24
a ab abc abcd ↑のようにzまでにコンソールに出力したいんですができません 誰か助けて〜
>>45 スマソスマソ。こっちの誤解だった。でもまあ、
>>31 の下の文章の日本語は
わかりにくいか?この例の話の筋とは違うが。
ほんとお願いしますよ〜 できないと明日先生に怒られるんですよ〜 配列を使えと言われたんですが私にはわかんなかったです
わかった。 無知な人に聞いても無駄だよね。ごめんね
無知な人は聞いても無駄だよね。ごめんね
48は荒らし
char ch, str[30]; char *p = str; for( ch = 'a'; ch <= 'z'; ch++){ p[0] = ch, p[1]='\0';p++; printf("%s\n", str ); }
>>57 もっとも、このソースを見ても理解不能という
>>48 に誂え向きの罠。
>58 しまった。その観点から言えば、wide系の関数を使えばよかった(笑)
#include <stdio.h> void main(int n) { int c = 'a'; static int e = 'z'; if (n == 1){ main(e); }else if(n >= c){ main(--e); while(c <= n){ putchar(c++); } putchar('\n'); } }
wide系の関数って何?
wchar_t ch, str[30]; wchar_t *p = str; for( ch = L'a'; ch <= L'z'; ch++){ p[0] = ch, p[1] = L'\0'; p++; wprintf(L"%s\n", str ); } って事。
あんま遊ぶなよ(;´ー`) #include <stdio.h> void main(int ch) { while( putchar( '`'+ch++ )!='z' ); }
A=-5; としますよね。 このAがマイナスだということを判定(判別)するにはどうしたらいいんでしょうか?
65 :
デフォルトの名無しさん :02/04/11 22:43
ここの人ってなんでこんなにレベル低いの?
if
もしもしー?
ごめん、わかった。 if(a > 0) だね なんか特別な関数いるのかと思った
∧ ∧ ( ,,) ・・・ ./ | (___ノ / ∧ ∧ (´ー`) ・・・・ ./ | (___ノ /
ネタになると思ってるところが、アフォですね。
もしかして俺はネタに吊られたのか?
今暇なんよ。 俺と一緒にうだうだしようZE!(o^-')b
/_________ヽ | ΛΛマジ? ガラッ!!|| 三 || ̄ ̄ ̄ || |(;゚Д゚) || エーッ!三|| / || |'と |⌒) ΛΛナニッ!? || ΛΛΞ|| // || || | ノ (;゚Д゚)ミ || (;゚Д゚) ||// || |ι ' ~ ⊆ ̄ιノυ ||ι ⊃||/ || |  ̄ ̄| ̄ ̄| ̄| || | | ||___ || |  ̄| ̄ ̄| ̄ ̄|ΛΛホントカヨ… | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| ____  ̄ ̄| ̄ ̄| ̄|;゚Д゚)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ /\____  ̄| ̄ ̄| ̄ ̄| /U ズボッ!ΛΛウッソーン!? /ΛΛ\___  ̄ ̄| ̄ ̄| ̄| | || (;゚Д゚) || |(;゚Д゚) |  ̄ ̄  ̄| ̄ ̄| ̄ ̄|∪ ||ヾ||,,'|| п。。。|゚ι、| |オイオイ…! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ほんとばかばっか。
ごめんなさいできました char s[30]; int i; for(i = 0;i < 26;i++){ s[i] = 'a'+i; s[i+1] = '\0'; puts(s); }
48はネタだった、に5票。
じゃぁ漏れは問題の意味を間違ってた漏れはアフォだった、に1票入れておくよ(;´ー`)
84 :
デフォルトの名無しさん :02/04/12 06:08
#else if みたいなことってできないですか? 今は #if defined(__XXX__) ・・・ #endif #if defined(__YYY__) ・・・ #endif みたいな感じにやっているんですが、なんかかっこ悪いです。
#elif
>>85 ありがとうござます。
お礼にフェラさせて下さい!
88 :
デフォルトの名無しさん :02/04/12 07:37
Cの言語仕様(名前空間とか構文形式とか)を調べたいんだけど、 良いサイトor本ある? サイトを検索してみてyaccの構文規則 なら見つけたんだが、解説がないと意味わからんわ。 なるべく新しいのでおながいします。
gccのサイト経由で使えそうな文書見つかりました。
ありがと
>>89-90
>>88 yacc の構文規則、なのか?
BNF 見れ。
BMP画像を右か左に90度回転させて表示ってのができません。 メモリとってグラフィックデータを回転後の位置で並べ替えてコピーし表示、 こういう流れでやりたいのですが、どこをどうすればいいやら・・・ 何か助言お願いします
94 :
デフォルトの名無しさん :02/04/12 16:46
96 :
デフォルトの名無しさん :02/04/12 16:49
dest[x][y] = src[y][width-x-1] いじょ。
96さんのをちょい改良したらできました。ありがとう!!
いや論理はできたんですが型がわからず挫折。 destとsrcの型って何なんでしょうか?
>>98 たぶん君はここでヒントもらって何とかなるってレベルじゃないと思うよ。
まるまるコードを書いてくれる親切な人をがんばってさがすしかないと思う。
>>98 まぁ、一応教えてあげると、
色深度が24〜31ビットなら、unsigned longだね。
同じく16bitならunsigned short、256色ならunsigned charでまにあう。
もちょっとスマートにするなら、構造体を定義するか、定義されてる
もの(Colorとかなかったけ?)を使おう。
> destとsrcの型って何なんでしょうか? とか聞いてるのがすごく心配だ・・・ その式は座標の変換を表してるだけでそのままじゃ使えないぞ?
⊂(`Д´⊂ )⊃== あげちゃうぞフォルァ!
104 :
ポインタで… :02/04/13 00:01
#include <stdio.h> int main(void){ char temp[32][32]; scanf("%s", temp[0]); printf("%s",*temp[0]); return 0; } いろいろ考えてみたけど、scanf,printfの引数がどれが合っているかさっぱりわからん。 temp[0]="abc",temp[1]="bcd" という配列を出力したいんですが…どうすればよいですか? 二重配列について詳しく教えてください(涙)
105 :
デフォルトの名無しさん :02/04/13 00:04
Windows2000でエスケープシーケンス使えないらしいけど、 DOSで位置を指定して文字を出力させたい場合どうすればいいですか? 過去のスレ探したけど同じ内容が見当たらなかったのでお願いします
106 :
デフォルトの名無しさん :02/04/13 00:07
>>104 *temp[0]はtemp[0][0]と同じ意味になるので注意。(char型を指す)
scanfの引数としてtemp[0]、&temp[0]どちらでもいい。普通は&を省略。
temp[1]にbcdを読み込ませる事。
temp → temp+1 ↓ ↓ |1|2|3|4| .. |29|30|31|32|
108 :
デフォルトの名無しさん :02/04/13 00:12
>>105 なぜwin2000でDOS(コマンドプロンプトってことだよね?)使うの?
そんな非効率なことさっさと辞めて、rubyでも覚えたほうがいいよ。
109 :
ポインタで… :02/04/13 00:13
>>106 よく考えたら*temp[0]はtemp[0][0]と同じ意味ですね。
temp[0]にしたらうまく動きました。
でもscanfでtemp[0]と&temp[0]が同じ意味になるのはなぜですか?
&がつくとアドレスを得られるから、アドレスのアドレスという不可解な意味に
なってしまう気がするのですが…。
>>108 いや、超初心者にCを教える環境がWindows2000なんだよ。
だから、非効率でも良いから教えてください。お願いします。
char temp[32]; &temp; (char**)temp; 互換性
>>110 日本語頑張ります。
char temp[32][32];
という二重配列を宣言して、temp[0]="abc", temp[1]="bcd", … みたいに文字列を代入しました。
strcpyみたいなchar *型を引数として要求される関数を使用するとき、引数の指定の方法が
分からなかったのです。(*temp[0]とか、**tempとか)
…意味わかりますか?説明不足でごめんなさい。
> temp[0]="abc", temp[1]="bcd", … みたいに文字列を代入しました。 できたのかよ!(三村流
115 :
デフォルトの名無しさん :02/04/13 00:32
>>111 > 具体的に申しますと、VC++6.0で
> printf("\x1b[31m文字の色は赤\n")
> という内容のCソース作成し実行すると、
> Window98では文字の色が赤くのなるのですが、
> Windows2000では文字の色は変化しませんでした。
> そこでWindowsNTの過去ログを参照したところ、
> "device=%SystemRoot%\system32\ANSI.SYS"
> をCONFIG.NTに追加すると、エスケープシーケンスが使える
> とあったので、試しましたがやはり何の変化もありませんでした。
私のWWWの検索エンジンで調べた限り
・そもそも Windows2000 では対応していないという記述が散見される。
ANSI.SYS も有効でないという記述も見られました。
# ゴトウさんも確認しているので確度は高いですね。
・Windows2000 では コンソール用の API を使う。
適当に以下のキーワード(適当に抽出)で MSDNなりWWWなり
検索してくれ。サンプルくらいは見つかるはずさ。
GetStdHandle
GetConsoleScreenBufferInfo
SetConsoleTextAttribute
--------------------------------------------------
らしいよ。
win2000でDOSなんか使うなってことだ。
char temp[32][32];
これは1回tempに対して配列要素参照演算子を使うと
それがchar型配列と同じだということ。
strcpyに
char arrya[256];
strcpy(array,"いやんもう♪");
と使えるように
cgar temp[32][32];
strcpy(temp[0],"
>>1 さん大好き★"); //temp[0]に文字列をコピー
というように使えるわけわかるでしょ?
2回適用するとそれがそれがchar型だということ。
教える人が出来もしないのに、初心者に教えるだなんて・・・ 残念だったが、よく有る事だ。強くイキロよ>初心者
>>115 私も検索をかけたところ同じように対応してないか、
エスケープシーケンスが無い様な内容だったので・・・
ありがとう、でも使えないのはイタイ
>>117 >>105 が初心者に教えるのはCなんだから、
Win2Kのコマンドプロンプトのこと知らなくてもいいんじゃねぇーの?
120 :
デフォルトの名無しさん :02/04/13 00:41
>>111 エスケープシーケンス互換のGDI用ライブラリ作って、それをWindowsで使用したら?
エスケープシーケンスなぞなくてもCは教えられると思うが・・・ # いまだかつて一度も使ったこと無いし漏れ。
>>114 いや、strcpy使ってました…なんでそんなふうに書いたんだろ、俺?
>>116 なんとなくわかります。
125 :
ポインタで… :02/04/13 00:53
先ほどのプログラムを発展させてこんなプログラムを作ってみました。 #include <stdio.h> #include <string.h> typedef struct aa{ char name[32]; }SMP; void main(void){ char temp[32][32]; SMP *foo; strcpy(temp[0], "Ichiro Suzuki"); strcpy(foo->name,temp[1]); puts(foo->name); } でもfoo->nameがchar型だからうまくstrcpyできないようです。 かといって*(foo->name)にしてもできませんでした。 どうすればfoo->nameがchar *型になりますか?
間違えた。 temp[1]はtemp[0]のつもりでした。
>>125 アフォ
fooは何やねん。
配列に手つける前にポインタもっかい勉強しなおせ。
temp[0] temp[1] そりゃそうだろね。
その前に foo を…
SMP smp; SMT *foo = &smp;
> でもfoo->nameがchar型だから・・・ この発想がどこから来たのかぜひ教えてほしい。 エラーメッセージ読んでる?
132 :
デフォルトの名無しさん :02/04/13 01:00
あんまり初心者に厳しくすんなよ。
>>127 このプログラムがポインタの練習のつもりでした。
もう一度はじめからポインタを勉強しなおします。
>>131 エラー食らわないんです。bccとCpadでやっているんですが。
>>125 はCのコードを書く前に日本語とK&Rを死ぬまで読みましょう。
BCCって未割り当てのポインタにエラー吐かないの? 警告レベル変えられる?
strcpyの型エラーは出ると思うんだが・・・
137 :
デフォルトの名無しさん :02/04/13 01:10
SMP *foo = (SMP*)malloc(sizeof(SMP)); ・・・ free(foo);
foo->nameは構造体の中で定義されているchar name[32]と同義ではないですか?
直接C言語とは関係ないのですが、 printf( "hoge" ); とかやった場合の内部の処理が知りたくてたまりません。 ブロッキングとかノンブロッキング(名前しか知らない)とか メモリ関係の知識を深めたいんですけど、良本orURL教えてください
>>133 練習ならもっと単純なものからやりなさいな。
int i,*p; //pの指しているものはぁゃιぃオブジェクトを指している
p = &i; //pはこれでiを指すようになる
*p = 10; //わーいo(^-^)oi = 10;と同じだよ
ヽ( ゚д゚)ノ ワーイ -=≡ ( )へ >
少しレベルアップ struct { int i; } s, *p;//pの指しているものはぁゃιぃオブジェクトを指している p = &s; //pはこれでsを指すようになる p->i = 10; //わーいo(^-^)o s.i = 10;と同じだよ
X pの指しているものはぁゃιぃオブジェクトを指している ○ pの指しているものはぁゃιぃオブジェクト
つーか ×pの指しているものはぁゃιぃオブジェクトを指している ○pはぁゃιぃオブジェクトを指している
ワーイ ヽ(゚д゚ )ノ へ( ) ≡=- く
うぉ! ダブった上に直し方がちょと違う(w
>139 CRTのソース嫁。 それ以上は、OSのソース嫁。 それ以上は、半導体デバイスの勉強しる。 それ以上は、量子論を勉強しる。
148 :
デフォルトの名無しさん :02/04/13 01:22
>>125 void main(void)
は、やめれ・・・せめて
int main(void)
main(void)
にしたほうがいいよ。Cの仕様上ね
型はあってるからコンパイルは通るでしょう
>>132 Cな人が割当ててないバッファのアクセスと
strとmemの使い方間違いとメモリ解放忘れと二重解放に
厳しいのは当然と思います。
忘れてるかもしれないけどみんな通ってきた
>>142 >>125 のfooはポインタのまだ何も指していない状態
(ごみが入っている)ということですか?
ということは
*fooがポインタだから何か指さなくちゃいけない?
でもfoo->nameだから構造体の中のchar name[32]を指していると思うんですけど。違うのかな…。
>>147 メモリそのものの動きまでやるか・・・
それなら「やさしいコンピュータ科学」一冊で概要はわかる。
これで扱ってる言語はPascalだけど。
スレ違いだなこりゃ。
>>150 ->は矢印だけど、指すんじゃなくて抽出すんの。
foo->nameはfooがnameを指すんじゃなくて、
fooが指してる構造体変数内のnameを取得するってこと。
(*foo).name のほうがわかりやすい?
153 :
デフォルトの名無しさん :02/04/13 01:30
>>150 そのfooの実体が存在せんのだ。よって中身も無い。
幽霊に内臓が無いのと同じだYO!(ワラ
>>152 *fooはポインタで実体じゃないからまだ構造体は生成されていないんですね?
だからfoo->nameなんてものはまだ存在してないということですか?
>>150 レス読むときはゆっくり読みなよ。
人間話すより読むほうが速いから、
読む速度で行くと理解できなくなることもある。
ゆっくりじっくり、しゃべるのより遅いくらいの速さで読んでみそ。
>>150 ブロック内の未代入の変数、ポインタ変数の値は未定義です。
fooはメモリ上の正しいインスタンスのアドレスを保持しなければ
foo->nameをしても、もうヴァカかとアフォかとという状態になります。
あとねfoo->nameの演算子は(*foo).nameと同じです。
>>154 ポインタなのは*fooじゃなくてfooだけど・・・
それ以外はそんな感じでいいYO!
ウホかぶってた・・・鬱(-_-)
typedef struct aa{
char name[32];
}SMP;
は型の宣言で定義ではないからメモリの割当ては行われない。
SMP *foo
の宣言(これは定義でもある)はポインタ分のメモリ割り当てしかしない
バイトアドレスが4バイトの処理系なら4バイト割当てられる。
自動変数だから初期値はゴミ
fooの参照先は
>>137 のように明示的にメモリ割当てを行わなければならない。
160 :
デフォルトの名無しさん :02/04/13 01:38
うわかぶってる 逝ってくる
162 :
デフォルトの名無しさん :02/04/13 01:41
わからん。
163 :
デフォルトの名無しさん :02/04/13 01:41
ところで、文字列だけでEOFってむり?ですか? ねぇ?
怪談でもしようか・・・ ある日某専門学生のゲーム作品を見ていて、一つふに落ち着かないことがあった。 それは、彼らが作品を起動し終了をさせるたびに再起動し、また作品を起動させるのであった。 あまりに気になったので彼らに何故そんなことしているのかと問い掛けた。 そしたら、重くなって起動できなくなるらしい。 ソースを見せてくれないか?と問い掛けたら、彼らは気兼ねなくそのソースを見せてくれた。 私は絶句した・・・DirctXを使ったゲームのプログラムだったのだが、 全ての終了コードにはこう打たれていた・・・ exit(1); と、彼らに未来はあるのだろうか? 全てノンフィクションでおおくりしました・・・
165 :
デフォルトの名無しさん :02/04/13 01:44
...DOSでEXITしてもむりっすよ。文字列だけだとEOFにならん。無限ループになる。CTRL+Cでとめるしかないんすか?
166 :
デフォルトの名無しさん :02/04/13 01:44
>>164 オブジェクトリリースがされて無かったってこと?
167 :
デフォルトの名無しさん :02/04/13 01:45
typedef int* pint; pint a = pint(); if ( a==NULL ) print( "あひゃ(・∀・)"; これ、typedef使わずにやるにはどうすればよかと?
ぐふ、そのまま実行すんなよ、printなんて関数はない上に)が抜けてる。
170 :
デフォルトの名無しさん :02/04/13 01:48
入力された文字を検索かけてるけど、WHLIE文でEOFにすると無限ループになるんです。 EOFはファイルじゃないと使えなかった?
171 :
デフォルトの名無しさん :02/04/13 01:51
>>170 文字列なら、\0とかでいいんじゃないの?
>>166 メモリから何から何まで開放せず強制終了させていた・・・
ガタガタブルブル
UNIXのEOFはCtrl-Dだったと思うがDOSは知らん。 文字列じゃなくて標準入力からEOFは打てないのかという質問ではないですか?
#define EOF (-1) 南無・・・
176 :
デフォルトの名無しさん :02/04/13 01:54
>>170 ダメ。 入力されて判断してるから、無限になっちまうす
>>173 サーフェイスいじくってると面白いように落ちる(←アフォ)けど、
やっぱあれはDirectDraw残ってるのかなぁ。
ウィンドウが消滅した時点で自滅してくれるとうれしいんだけどなぁ。
178 :
デフォルトの名無しさん :02/04/13 01:56
DOSはCrl+Zだったと思う。 つか、どういうコード?
>>165 ごめんちゃんと読んでなかった 今度こそほんとに逝ってきます
180 :
デフォルトの名無しさん :02/04/13 01:59
181 :
デフォルトの名無しさん :02/04/13 02:00
文字入力して、それ以降に何回その文字が入力されたかカウントするこーど
すまん、誰か
>>181 の逝ってることをうまく翻訳してくれ。
183 :
デフォルトの名無しさん :02/04/13 02:04
>>170 入力をchar型で受けてない?
K&R開いてgetchar()とかの帰値の型を空の穴くまでみれ。
作ったものは開放しないとメモリに残るよ。 勝手に開放されるのもうれしいけど、それだと逆に怖いよ
gets(str); while(*(str++) != '\0'){ ・・・ } というでわないのか?
188 :
デフォルトの名無しさん :02/04/13 02:13
>>186 違うみたい。でも、入力をCHARで受けてる。
進行はやっ
(゚д゚) ・・・
こんな感じ char c; while((c = getchar()) == EOF) { my_count(c); } my_print(); これなら少なくとも cがintでないと無限ループになるよ
?マーク忘れた
>>191 そうなら、
((c = getchar()) != '\n'
とかで改行終了とか
((c = getchar()) != 0x1b
ESC終了とかでいいでしょ。
>191 char がsignedなら、終わる。
getchar() のプロトタイプは int getchar(void) です。
つまり、
>>191 は char c; でなく int c; とすべきです。
198 :
デフォルトの名無しさん :02/04/13 02:54
LSICのまぬあるより 【解説】 getc(), fgetc()はファイルポインタfpで示されるファイルから1文字を入力 します。 getchar(), fgetchar()は標準入力(stdin)から1文字入力します。 getc(), getchar()はマクロとして定義されています。 これらはcharではなくint型の値を返すことに注意してください。 【リターン値】 入力した1文字を返します。ファイルの終りに到達した時には、値EOFを返し ます。エラーを検出した場合にもEOFを返しますので、EOFかエラーかの判定 はfeof(3), ferror(3)を使ってください。
199 :
デフォルトの名無しさん :02/04/13 03:00
>>191 は質問者じゃないよね?
質問者は寝たか。
200 :
デフォルトの名無しさん :02/04/13 03:06
RS232Cに見えてくるデータを読み出し、ファイルに落としたいんですが どんな感じにコードかけば良いでしょうか?どこかにサンプルコードとか おちてないでしょうか?
202 :
デフォルトの名無しさん :02/04/13 06:13
ゲーム製作では、javaよりCが使われているのは本当でしょうか? スピードの問題ならアセンブラもゲームでは有効だということなんですか?
>>202 上のはホントです。
下のは一部のライブラリにおいてホントです。
このスレの人達はなんだかんだ言って優しいと、
>>125 からのやりとりを見て心底思った。
205 :
デフォルトの名無しさん :02/04/13 07:52
>>203 ということは、cを中途半端な状態でjavaに行くよりしっかりとcを極めたほうが
言いということでしょうか?それとアセンブラもわかってないと困ることに
なるんでしょうか?
よろしくお願いします。
cは概要だけでいい。 できればいきなりjavaに行くのがいいと思うが・・・ cにどっぷりつかっちゃうと、javaのスタイルになれるのに時間がかかる
>>205 自分が何をやりたいのかはっきりさせること。
これが一番大事。動機付けて勉強できるという意味じゃ
他の分野の勉強するよりもプログラミングってのはいい位置にある。
目的がはっきりすれば自ずとどんな知識が必要になるのか分かるってもんだ。
208 :
デフォルトの名無しさん :02/04/13 08:33
>>205 基本的に
>>206 に同意する。
つまり、Javaのスタイルに慣れておけば、Cでも、見通しや保守性の良い
スタイルでプログラミングできるようになると思う。
あと、アセンブラを勉強しておくと、実行効率の良いプログラムが
書けるようになるはず。
ちなみに、アセンブラはCやJavaに比べると単純な言語なので、
覚えるのは簡単。ただ単に、書く量と手間がかかるだけだよん。
>>209 俺はアセンブラをRISCの様な言語だど言ったらモルァ!すれでゴルァ!された。
>>210 CやJavaをCISCとするなら、たしかにアセンブラはRISCのような
言語に思えるけど・・・ゴルァ!されちゃったですかー。
javaに慣れてどうするの?とは思うが。
>>206 205じゃないですが、なるほど。
一通りCを勉強したらJavaもやってみますわ。
>>209 > ただ単に、書く量と手間がかかるだけだよん。
これがやっかいなんだが・・・
>>207 禿ドウ
言語やライブラリの知識があっても何も作らない人もいる。
それはそれで別にいいんだけど、そういうやつに限って
人に知識を自慢してきてウザかったりすることが多い
やっぱプログラマたるものなんか作ってナンボだよな
言語オタは逝ってよし
217 :
デフォルトの名無しさん :02/04/13 14:21
atan2をテーブル化したいんだけど どうすればいいですか?
218 :
デフォルトの名無しさん :02/04/13 15:31
結局のところ、ポインタを極めてからjavaに行くか、ある程度のところ(入門書程度) で切り上げてjavaに行くかで悩んでるのですが、そのあたりはどうなんでしょうか?
ゲーム製作が目的ならJavaじゃなくてC++に行くべきでは? 市販のゲームはほとんど全部C/C++製だろ?
220 :
デフォルトの名無しさん :02/04/13 16:56
>>217 単純にプログラム起動時に一度だけテーブルを作成すればいいんじゃない?
>>218 ポインタ知らないとバカにされます。
一生JavaやC#の様な過保護箱庭言語だけ使うつもりなら止めませんが。
223 :
デフォルトの名無しさん :02/04/13 17:59
組込みや制御、もしくは OS、 OS に近い部分をちゃんと理解したいなら、
ポインタの理解は必須です。つまり、こんぷーたを本当に理解したいか否かです。
アセンブラもやった方がいいに越したことはないですが、
C のポインタを構造体、共用体を絡めてきちんと理解できていれば十分でしょう。
まぁ、これを理解するのもアセンブラをやったほうがハヤーイかも知れません。
アプリケーションだけを作っているつもりなら、
C をやらずにいきなり Java などの方が良いかもしれません。
その方がおぶじぇくとシコウをすんなり受け入れられるでしょう。
(この辺は
>>206 にはげどうです。)
224 :
デフォルトの名無しさん :02/04/13 18:02
>>221 それは絶対にいやなんですけど。
やっぱポインタを極めてからjavaに移行するほうが身のためでしょうか?
でもあんまりCにはまるとjava理解するのに時間がかかるという方が多いので、
jabvaがわからなくて大規模プロジェクトに参加できないのではと不安になって
しまいます。ちなみにポインタを極めるのには思いっきりやっても自分の場合、
半年から1年はかかりそうなんですが。
>220 それはそうなんですけど atan2ってy/xから角度出すじゃないですか どうやってテーブルを作成すればいいのかな、と思いまして・・・ うう、能力不足
>>224 ポインタは、確かにひっかかりやすいところもあるけど、
まず本読んで、自分で書いてみないことにははじまらない。
わかんなくなったらまた聞きに来なさい。
>>225 atan_array[y][x]
みたいなのに入れとけばいんじゃない?
atan_array[y/x]ってやるのは得策じゃないと思う。
コンピュータアーキテクチャとOS(といまだとネットワーク)の理解がないと、 どこでどの仕事しようがタダの*兵隊*にしかなれん。 Cをある程度やれば、OSと、その背景にあるコンピュータそのものの理解が 必須になってくるが、Javaから入ると、VMの理解だけにとどまってしまう 可能性がある。ガベコレがどーのとかあおってる連中とかが陥ってる罠だな。 視野狭窄だ。 ポインタを覚えるのが重要なのではなくて、もっと、アプリケーションを支える 環境(OS, ハードウェア)がどうなっているのか、ということに留意すること。
>>224 何でもCでできるんだ!っていうC厨にならなければいい(すべての言語に言えるけどね)。
ポインタを知っておけば参照とかオブジェクトとインスタンスの関係などがイメージしやすいかなと思います。
なんでも知っている分には損はない。
不便な環境を知らないと、便利な環境を便利とは感じない。 一度便利な環境に触れてしまうと不便な環境には戻れない。
やっぱプログラマなら組み込みだよね。 あこがれるけどなりたくはないな。
いきなりCから始めてもなんとかなりますか?
>>232 なんとかなります。
>>228 の意見にはよく耳を傾けておくこと。
そしてPC-UNIX、(以下略
>227 どうもありがとう なるほど、分けて考えればよかったか ただ配列がでかくなりそうだ・・・ 大丈夫かな
>>232 C++は分からないけど、Cなら大丈夫でしょう。
ポインタだって通常の変数と同じようなものだと考えれば引っかかることはないし。
>>234 ゲーム等に使うなら、256x256くらいの分解能があればだいじょぶかも。
atan_array の型をsigned shortにして、整数部 9bit(符号付) + 小数部 7bitの
固定小数として扱えば、±180度カバーできて、1要素2バイトなので、
デーブルサイズは128KBでいけるかな。
>>235 参照時の動作が異様に普通の変数と違いますが・・・。
>>234 ごめん。よく考えたら、2次元配列にするひつようなかった。
xとyの絶対値が大きいほうが256とか1024になるように正規化
(xがデカい場合は、y = 1024*y/x; x = 1024; みたいな)すれば、
degree = atan_array[xかyの絶対値が小さいほう];
ってな感じで、1次元配列でOKでした。
皆さんどうもありがとうございます。 それと、アセンブラなどの知識はどの程度もっていたらいいでしょうか? やっぱりゲームとかやりたいなら、結構やっておいたほうがいいでしょうか? それと、ゲームではどの程度アセンブラが使われているのでしょうか?
>>239 世に出てるゲームで、VB製がどれだけあるか考えてみろ
VBでインラインアセンブラが使えるか考えてみろ
VBは確かに糞ゲーが多いが、そんなことを質問している時点では
その糞ゲーすら作れないから安心してできる事からやれ。
そもそも3Dのゲームでも現在はアセンブラを使うのはごく一部。
最適化ヲタでもない限り、わざわざアセンブラを使う野郎は少数派
241 :
デフォルトの名無しさん :02/04/13 20:08
おまえらな、いつまでも古い言語つかってんじゃねーよ これからはPERLだよ、PERL。わかったか、ヴォケ
>>241 Ver 6まで行こうとしてる言語が新言語か?
243 :
デフォルトの名無しさん :02/04/13 20:15
>239 =
>>224 おそらくまだかなり若いのでしょうけど、はっきりいって、プログラミングに向いてないと思います。
プログラミングは自分で体を動かさないと身につきませんよ。
>238 そっちのほうがよさそうですね 使わさせてもらいます
245 :
デフォルトの名無しさん :02/04/13 21:24
246 :
デフォルトの名無しさん :02/04/13 22:11
Cの勉強を始めたのですが Web上では捜し物をするとあまりにいろいろなモノがヒットしてしまい 探しにくいのですが 「ここが総本山」的な日本語C言語解説サイトとかリンク集ってありますか?
ねこでも
猫とCFAQ
>>246 つぅかネットなんかで基礎勉強しようとするな。
善し悪しがわからんうちは本読んでろ。 ダメ本も数多いが、webの解説のほうがクズ率高い。
>>246 とりあえず本は2冊以上買え。Cの入門書は比較的ハズレが多いから
1冊だけ買った本が糞だと自分も糞プルグラマーになるぞ。
253 :
デフォルトの名無しさん :02/04/14 00:39
あした本屋さん逝きますよ。
とりあえずK&R買え。 K&Rより安い入門書は全部糞。 入門と書いてある本も糞。 K&Rおいてない本屋は行く価値無し。
はじめての時は、できるだけ、安くて薄い本がいい。 もちろん、それ以外に辞書(?)としてK&Rを買うのは忘れずに。
だから未経験で心配なら結城せ、せんせぇを追加しておけばなんの問題も無い と前から言ってるでしょーが!
257 :
デフォルトの名無しさん :02/04/14 01:05
漏れはI/Oで覚えましたが、なにか?
もれはもれもれです
オレ、Microsoft C ver.3.0 とかいう技評かどっかの本だったような 気がするけど、既にその本無くしちゃったので詳細不明。 なんとかしてもう一度手に入れたい。
っていうかアヒル本読めや。
一冊だけ初心者向けの本持ってますが、 アセンブラー&マシン語でのプログラミングにくらべると わかりやすいですね、C言語って。 MSXでアセンブラ使ってたころが懐かしいです。
262 :
デフォルトの名無しさん :02/04/14 02:49
このスレ殆ど学生しかいないのか?
264 :
デフォルトの名無しさん :02/04/14 03:13
CでDOS窓で動くインベーダゲームは作れますか?
265 :
デフォルトの名無しさん :02/04/14 03:17
できるよ
266 :
デフォルトの名無しさん :02/04/14 03:21
>>261 いきなりC言語に入った人と、一度でもアセンブラを経験した人とでは、C言語に
対する基本的な知識の習得の度合いが違うようです。
それはポインタの学習時に顕著に現れるように思います。アドレッシングモード
の言葉の意味がわからない人は、特にポインタを気持ち悪がって使わない傾向
があります。すぐ暴走したり、原因不明の動作をしたりするからです。
C言語をどのように使うかは全く自由ですが、せっかくですからポインタを自由
自在に扱いたいですね。
Ultra-Cってソフトあったんですけど、これだけでC勉強する には、十分ですか?
269 :
デフォルトの名無しさん :02/04/14 04:47
充分
>>268 Cのインタプリタ? 入門にはいいんじゃないかな。使った事無いけど。
これから買う事はお薦めしないけど、持ってるなら有効に活用すべし。
但し、勉強に十分とは言えないかと。
せめてCの基本的な文法とか覚えたら、さっさとbc++やgccに移行して
コンパイラに慣れておく事をお薦めする。
コンパイルエラーが一番の先生だと思わないか?
273 :
デフォルトの名無しさん :02/04/14 05:27
>>273 カコイイかもしれないけど、Cだとコンパイラのエラーメッセージで学習は無理だろ・・・
gccの-Wallで警告無しでも、気休めにしかならないのがC言語なんだから。
o = --o - o--; これで必ずoには-1が入るとかアフォなこと言ってた人がいたよぉ ママーン
これほどまでに、Cのソースが書き込まれずに、スレが進行するのも珍しいな。
277 :
デフォルトの名無しさん :02/04/14 10:53
達人の方々、ご教授お願います。 unsigned short x; で、1byte目と2バイト目を入れ替える時、 x = ((char*)x)[0] * 0x100 + ((char*)x)[1] & 0x00ff; と x = x >> 8 + x << 8; と書く場合とでは、とちらが処理速度が速くまた美しいのでしょうか?
どちらか速いか:たぶんレジスタ上で処理を終えられるかもしれない下の方が、必ずメモリアクセスを発生する上の方より、速いんじゃないかなぁ。 どちらが美しいか:そりゃ下の方だろう。上の方が美しいとか思うか?
下のじゃ正しく変換できないがな
280 :
デフォルトの名無しさん :02/04/14 11:05
関数ポインタですが、あれはどういうときに使うのでしょうか? アドレスを持った関数、(ポインタ変数の関数版?)ということだと思うのですがいまいち使い方が思いつきません。 用のないときは使わない、ということでよいのかもしれませんが、気になってます。 どういう場合なら使えるのでしょうか? 使用上、効果的な具体的な事例はあるのでしょうか? 環境はWINDOWSXPにVC++6(.NETも一応あります)です。
関数ポインタは関数へのポインタ。
282 :
デフォルトの名無しさん :02/04/14 11:08
関数のアドレスを持つポインタ、ということですか?
です。関数に関数を渡すときに使います。 K&R の quick sort のとこに確かありました。
少し前からCの勉強はじめたんですが、本のなかに 123を表示するとき printf("%d\n",123); と、書いてあるのですがどうして printf("123"); と、直接書いてはいけないんですか?
いけないことはない。
>>286 ありがと。これから123と普通に書く事にします。
>>284 入れ替えるだけならエンディアソは関係ないと思ふ。
レスありがとうございます。
>>279 正しく変換できないとは?
当方素人です。ご教授願います。
C言語(C++,VCは抜く)だけだと、どの程度のゲームが作れますか? 画像をある程度使ったものなども作れるのでしょうか?
ANSI C には、画像を扱うライブラリは規定されていませn。残念です。
>>293 なるほど。
ではVC++までいかないと無理ですか?
UNIXでCプログラミングを始めたいのですが、 Linux、FreeBSD、NetBSDのどれにしたらいいと思いますか?
どれでも。
>>294 標準として規定されてない(つまり、全てのOSで共通に使える画像ライブラリは
無い)けど、特定のOS用の画像ライブラリはくさるほどあるから、
心配すんな。
どの程度のゲームが作れるかについては、君が見たことのある
全てのゲームは、どうにかして作れるから安心したまい。
>>295 どれでもいんだけど、あえてオレらに決めてほしいのなら、
NetBSDにしとけ。
無難なところでFreeBSDだろ。 ミーハーで派手好きならLinuxでもいいかもしれんが。
>>295 つーことで、サイコロ持ってる?無かったら鉛筆でもいんだけど・・・
>>292 うろ覚えでコードを書いていました。
上:x = (((char*)&x)[0] * 0x100) + (((char*)&x)[1] & 0x00ff);
下:x = (x >> 8) + (x << 8);
下のほうが処理速度及び美しさで勝る、と言うことで宜しいでしょうか?
>エンディアン
ご教授ありがとうございます。
エンディアンの変換でこの処理が必要になりました。
>>297 ありがとうございます。
ソフトによってOSが決まってたりするのはそういうことなんですね
>>301 面倒だから、htons/ntohsで変換しちまえ
>>280 本質的には、コールバック関数の登録のためどうしても必要だぁね。
デバイスドライバのソースの、エントリポイントのテーブルあたりを見ると、
「ほへぇ、なるへそ」と思えるかも。
static struct cdevsw tst_cdevsw = {
tstopen, tstclose, tstread, nowrite,
noioctl, nostop, noreset, nodevtotty,
seltrue, nommap, nostrategy, "tst", NULL, -1
};
こんなん。上のtstopenとかが関数のアドレス。tsopen()の定義は
static int
tstopen(dev_t dev, int oflags, int devtype, struct proc *p) {
return 0;
}
こんな感じ。
美しいつーか見易さだろ 高級言語は
アヒル本ってどうなの?わかりやすい?
311 :
デフォルトの名無しさん :02/04/14 16:24
Cの標準関数のstrstrってありますよね? 文字列から指定文字列を見つけるアレです。 もしアレをオリジナルの関数で作るとしたら どうなるでしょうか? string.hの中身見てもさっぱりで… どなたか作れる人いたら教えて
K&R読めば作り方分かる。
効率のことさえ考えなければ、こんな感じ? char* mystrstr(char* a, char* b) { while(*a){ if(strcmp(a, b) == 0){ return a; } ++a; } return NULL; }
constくらいつけろよ...
ごめんなさい。 ポインタ使ってます。 char strstr(char *str,char *search) { int i=0,k,i2=0,work; while(*(search+i) != '\0'){ i++; } while(*(str+i2) != '\0'){ if(*(str+i2) == *search){ for(k=1;k<i;k++){ if(*(str+i2+k) != *(search+k)){ return NULL; } } return *(str+i2); } i2++; } return NULL; } これで上手く行かないんです。 どうしてもstring.hはincludeしないで 作業進めたいんですけど、どうにもならなくて、 訂正箇所あったら教えてください。
今自分で関数を作ってるんですけど、仮引数って何個までいいんでしょうか? 現在仮引数が11個でVC6.0を使ってるんですけど仮引数が多すぎるって警告でるんですけど問題ないですかね?
>>317 いや、関数によって決まってるんだろうが…
あんまり引き渡しても
引渡し側が使えないぞ?
普通警告じゃなくてエラーが出るような・・・ 仮引数→引数、なら理解できるが・・。
プロトタイプと引数の数が合ってないだけじゃないのか?
>>317 引数が多くて警告なんかされたことないから
わからんな…
なんか関数I/Fの設計がまずい気もするけども。
構造体を利用するのも一つの手だな。
一つの関数で一つ以上のことはするな、と お父さんかお母さんに教わらなかったのか?
>>316 まず返却値の型が違うな。char *で返してやらないとどこでマッチ
したのかわからないじゃない。それから12行目のreturn NULLが
おかしいな。ここはbreakでforループを抜けるんじゃないか?
他にも問い詰めたい部分はあるが、こんだけ直せば動くんじゃない?
>>316 変数名をもうちこっと何とかしてホスィ・・・。
>>317 実引数の間違いじゃないのか? そうじゃないなら警告コードをさらせ。
char* strstr_(char *s,char* p) { int i,n,l = strlen(p); for(i = 0;s[i];i++){ for(n = 0;s[i+n] && s[i+n] == p[n];n++); if(l == n && s[i+n-1] == p[n-1]) return s + i; } return NULL; } なんか違ったらスマソ
>>326 string.h をインクルードしたくないって言ってるんだから、
strlen()も使えないんじゃない?
char* str_str(const char* base, const char* part) { int i; unsigned long h1 = 0, h2 = 0; size_t len1 = strlen(base), len2 = strlen(part); char *p1 = base, *p2 = part, *l = base + len2, *end = base + len1; if (len1 < len2) return NULL; for (i = 0; i < len2; i++) { h1 += base[i]; h2 += part[i]; } for (; h1 != h2 || strcmp(p1, p2); ++p1, ++l) { if (l == end) return NULL; h1 -= *p1; h1 += *p1; } return p1; }
コッチだ、スマソ char* str_str(const char* base, const char* part) { int i; unsigned long h1 = 0, h2 = 0; size_t len1 = strlen(base), len2 = strlen(part); char *p1 = base, *p2 = part, *l = base + len2, *end = base + len1; if (len1 < len2) return NULL; for (i = 0; i < len2; i++) { h1 += base[i]; h2 += part[i]; } for (; h1 != h2 || strcmp(p1, p2); ++p1, ++l) { if (l == end) return NULL; h1 -= *p1; h1 += *l; } return p1; }
━(゚Д゚;)━> グサッ マアイイヤソノクライ
strlen って思う存分 string.h を必要とするやんかー。 char *mystrstr(const char *str, const char *search) { const char *p1, *p2; while (1) { p1 = str; p2 = search; while (*p2 && (*p1 == *p2)) { ++p1; ++p2; } if (! *p2) return (char *)str; if (! *p1) return NULL; ++str; } return NULL; /* tricking compiler */ } 私ならこう書くっす。 (char *) ってキャストしてるけど,C++ なら const_cast 使うべきっすね。
>>329 なるほろ!
毎回比較する必要はないのか!
>>326 のstrstrの前に
int strlen(char *p){int l;for(l = 0;p[l];l++) return l;}
>>329 のソースは比較対照が十分長くないと逆に遅くないか?
>>329 うわ,なるほど,一種のハッシュみたいな感じかー。
実はたった今,マッチング処理の速度向上に苦しんでたんスよー。
>>336 最初のstrlenの長さで処理を振り分ければいいかな。
文字列の比較は多バイト一度にできるビッグエンディアンのほうが効率的?
専用の命令のあるx86 CPUが効率的 >REPE CMPSB
>>314 strncmp(a,b,strlen(b)) == 0
>>332 サン
有難うございます!!
自分ではナニブン思いつかないものでして
かなり困っておりました。
おかげで先に進む事が出来ました。
本当にに有難うございました!!
344 :
デフォルトの名無しさん :02/04/14 23:33
今、C言語アルゴリズム+徹底入門で 双方向リスト構造について勉強しているのですが、 下のサンプルプログラム(番号を入力する毎に構造体を生成して 昇順に挿入していく)なんですが、2番目に入力した番号が 絶対に先頭に挿入してしまうのです。 先頭に挿入する場合の条件式がおかしいのだと思っていろいろ いじってみたのですが、うまくいかず・・・。 すみませんがよろしくお願いします。
345 :
デフォルトの名無しさん :02/04/14 23:35
☆☆Sample09_02☆☆ #include <stdio.h> #include <stdlib.h> /* list構造体とLISTを定義する */ typedef struct list { int data; struct list *prev; struct list *next; } LIST; /* リストに新しい要素を挿入する */ LIST *InsertItem(LIST *lp, int x) { LIST *lpnew, *lptemp; /* 新しいリスト要素を生成する */ lpnew = (LIST *)malloc(sizeof *lpnew); if (lpnew == NULL) { /* stderrにエラー文字列を出力する */ fprintf(stderr, "メモリーエラー\n"); /* exit()関数を使って実行を終了する */ exit(1); } /* 新しい要素に値を代入する */ lpnew->data = x; /* 初回のケース */ if (lp == NULL) { /* 初回は自分自身を指しておく */ lpnew->prev = lpnew->next = lpnew; /* 新しい先頭を返す */ return lpnew; } lptemp = lp; /* 挿入位置を求めてリストを前進する */ while (lptemp->data < x && lptemp->next != lptemp) lptemp = lptemp->next;
346 :
デフォルトの名無しさん :02/04/14 23:36
/* 先頭挿入のケース */ if (lptemp->prev == lptemp) { lpnew->prev = lpnew; lptemp->prev = lpnew; lpnew->next = lptemp; /* 新しい先頭を返す */ return lpnew; } /* 末尾挿入のケース */ if (lptemp->data < x && lptemp->next == lptemp) { lpnew->next = lpnew; lpnew->prev = lptemp; lptemp->next = lpnew; /* もとの先頭を返す */ return lp; } /* その他のケース */ else { /* 1つ前の要素に戻す */ lptemp = lptemp->prev; lpnew->next = lptemp->next; lpnew->prev = lptemp; lptemp->next->prev = lpnew; lptemp->next = lpnew; /* もとの先頭を返す */ return lp; } }
もしCの文法がわかってて、それくらい自力で解決できないなら、 プログラマになるのはやめておいたほうがいいと思われ。
348 :
デフォルトの名無しさん :02/04/14 23:44
main() { /* 空のlpheadを宣言する */ LIST *lphead = NULL; /* リストに要素を挿入する */ lphead = InsertItem(lphead, 20); return 0; }
いや、誰でも通ってきた道なんでないの? 理解しようと努力してるだけ、ましだと思う。 とりあえずどういうデータを入力したのかも書け。
350 :
デフォルトの名無しさん :02/04/14 23:54
とりあえずサンプルではこんな風に入力してた。 2番目を1番目より低い値を入れてるところが なんかバグを隠そうという意思がみられるのですが・・・。 技術評論社いってプログラム修正してないか見にいったけど 直ってなかったよ。 lphead = InsertItem(lphead, 20); lphead = InsertItem(lphead, 10); lphead = InsertItem(lphead, 15); lphead = InsertItem(lphead, 20); lphead = InsertItem(lphead, 14); lphead = InsertItem(lphead, 9); lphead = InsertItem(lphead, 22); lphead = InsertItem(lphead, 9); lphead = InsertItem(lphead, 14);
352 :
デフォルトの名無しさん :02/04/14 23:56
例えば、 1,2,3,4,5,6,7,8 と入力すると 2,1,3,4,5,6,7,8 ってなる。
これさ、双方向リストなの? なんかかなり間違ってる気がするんだけどもよ。
354 :
デフォルトの名無しさん :02/04/14 23:58
>>351 マジ?
コピペして実行したんだが・・・。
>>354 ごめん。1〜8だと確かにそうなる。
while()で挿入位置を決めてるところが不完全だーね。
ちと修正中。
while()のとこはどうしようもなかったので、先頭挿入時の条件追加でかんべん。 /* 先頭挿入のケース */ if (lptemp->prev == lptemp && lptemp->data >= x)
誤爆鬱ハンギングマイネック
359 :
デフォルトの名無しさん :02/04/15 00:08
>>356 サンクス!
今、リスト構造使って住所録作ってるんだけど
別に双方向であるひつようないな・・・。
もうちと勉強しなおしてキマス・・・。
先頭だろうが末尾だろうが、 場合分けしてるあたりで三流コーディングの気配。
361 :
デフォルトの名無しさん :02/04/15 00:11
>>360 漏れもそう思った。
でも、先頭と末尾にダミーがないから、しょうがなかった。
えーん。
>>361 俺的には独習Cの評価はかなり下。
素人に分からせるためにわざとダメコードを書いてる節が見える。
赤ん坊にあかちゃん言葉教えてしまうと まともな言葉を覚えるのが遅れるってやつか
柏原正三の本、いちども読んだことないな。 例外かもしらんが、K&R以外の入門書はどれみても あらばかり見えてまともに読んだことない。 ASCIIのC言語入門三部作よりはましだったように思えるが...
367 :
デフォルトの名無しさん :02/04/15 00:42
リスト構造が環状になっていて扱いにくいので、先頭と末尾はNULLにしました。 /* リストに新しい要素を挿入する */ LIST *InsertItem(LIST *lp, int x) { LIST *lpnew, *lptemp, *lptemp2; /* 新しいリスト要素を生成する */ lpnew = (LIST *)malloc(sizeof *lpnew); if (lpnew == NULL) { /* stderrにエラー文字列を出力する */ fprintf(stderr, "メモリーエラー\n"); /* exit()関数を使って実行を終了する */ exit(1); } /* 新しい要素に値を代入する */ lpnew->data = x; /* 初回のケース */ if (lp == NULL) { lpnew->prev = lpnew->next = NULL; /* 新しい先頭を返す */ return lpnew; } lptemp = lp; /* 挿入位置を求めてリストを前進する */ while (lptemp && lptemp->data < x) { lptemp2 = lptemp; lptemp = lptemp->next; }
368 :
デフォルトの名無しさん :02/04/15 00:42
if (!lptemp) { /* 後尾挿入の場合 */ lptemp = lptemp2; lptemp->next = lpnew; lpnew->prev = lptemp; lpnew->next = NULL; return lp; } else if (lptemp->prev == NULL) { /* 先頭挿入の場合 */ lptemp->prev = lpnew; lpnew->prev = NULL; lpnew->next = lptemp; return lpnew; } else { lptemp2 = lptemp; lptemp = lptemp->prev; lptemp->next = lpnew; lpnew->prev = lptemp; lpnew->next = lptemp2; lptemp2->prev = lpnew; return lp; } }
>>367 漏れもNULL大好き。ぬるぬる。はふぅ。
370 :
デフォルトの名無しさん :02/04/15 00:51
>>369 うん。さっきの環状のリストの修正だけど、まだおかしい所があるよ。
同じ値を2回以上入れるとリスト構造が壊れてしまう。
371 :
デフォルトの名無しさん :02/04/15 00:51
>>お前だめだよそんなことしちゃ...
NULL NULLに挿入・・・(;´Д`)…ハァハァ
373 :
デフォルトの名無しさん :02/04/15 02:23
int a = ( 1, 2, 3 ); という文でaに3が代入されるのですが、なぜそうなるのか、なぜコンパイルエラーにならないのか教えてください。
>>373 そういう文法だからだYO!
,演算子調べる!
375 :
デフォルトの名無しさん :02/04/15 02:27
>>373 ','で区切られた式の評価は左から右へ。
よって、(1,2,3)は3に等しい。
そう、そして式としての値は左オペランドのものだから。
>>373 多分最適化によって1と2は無視されるケースが多いと思われ。
右だった(;´-`) お箸持つほうが値になるの,わかったわね
380 :
デフォルトの名無しさん :02/04/15 05:26
>>329 printf("%s\n",str_str("mystrstr","str"));とやったら、strstrと表示されるはずだよね?
(null)って表示されるんだけど(Linux+gcc)。
何やってもNULLが返るんじゃないの?
コンパイルできないから全角スペースは半角スペースに置き換えたけど、それ以外はいじっていない。
>>380 作ってもらって感じ悪いね。
うごかなけりゃ修正すればいい。
骨組みも方針もある。
382 :
デフォルトの名無しさん :02/04/15 07:17
>>381 つくってもらって?
俺は質問者じゃないけど。
というか作ったんじゃなくてコピペしただけでしょ。
384 :
名無しかも :02/04/15 08:21
配列を使うときは、 要素型名 変数名[要素数] で使うわけですが、 その格納するための要素数が大きすぎてわからなかったりする場合、 要素数をどう決めたらいいのでしょう?
要素型名 *変数名; にして、 変数名 = (要素型名 *)malloc(sizeof(要素型名) * 個数); 使い終わったら free(変数名); しなさい。
>>380 どうぞ。
コンパイルしてなかったんで、動作確認してなかったよ。
char* str_str(const char* base, const char* part)
{
int i;
unsigned long h1 = 0, h2 = 0;
size_t len1 = strlen(base), len2 = strlen(part);
const char *p1 = base, *p2 = part, *l = base + len2, *end = base + len1;
if (len1 < len2)
return NULL;
for (i = 0; i < len2; i++) {
h1 += base[i];
h2 += part[i];
}
for (; h1 != h2 || strncmp(p1, p2, len2); ++p1, ++l) {
if (l == end)
return NULL;
h1 -= *p1;
h1 += *l;
}
return (char*)p1;
}
早いレスありがとうございました♪
>>159 ていうか、あからさまにキーワード「typedef」が使われる由。
Type を define してるんだヨって、思いっきり言ってやりたいよね。
やっぱ、エラー等のメッセージも
>>133 は無視してるんだろね。
>>385 見て思ったんだけど
#include <stdlib.h>
すれば
malloc()
はキャストしなくてもいいんでしょ?だめ?
391 :
名無しさん@お腹いっぱい。 :02/04/15 11:54
ファイルを読んだり書いたりするのは fprintfとかfwrite,freadでやっているのですが、 ファイルの消去はどうすれば良いのでしょう? 今は system("/bin/rm -f hoge"); ってやっているのですが、これだとrmコマンドが/bin の下に無い場合エラーが出てしまいますし・・・
remove
393 :
デフォルトの名無しさん :02/04/15 11:58
unlink()
stdio.h に int remove( const char* filename ) ってないか? ANSIのはずだけど。
unlinkはunixだろ
>>398 いろんな環境でコンパイルできるようにするには、キャストしといたほうが
いいかも。なんとなく。
>>392-396 ありがとうございます。
remove はstdio.h 、unlink はunistd.hでした。
Linux上でmanを見ると
>removeはファイルシステムからファイル名を削除する。ファイルに対しては unlink を、ディレクトリに対しては rmdir を呼び出す。
と書いてありましたので、remove を使えば問題ないですね。
>>230 まぁ、一般論としては、そうだけどさ。
「〜知らないと〜」の件は、想像力の問題。
「〜触れてしまうと」の辺りは、真剣さの問題。
ともに、本人の能力と環境に依存。
403 :
デフォルトの名無しさん :02/04/15 14:09
#include <stdio.h> int main() { int num; char c; scanf("%d", &num); scanf("%c", &c); printf("整数データ = %d\n", num); printf("文字データ = %c\n", c); return 0; } このサンプルをコンパイルして実行して Z 12345 と入力しました。 本の見本では 整数データ = -1073744244 文字データ = Z と出ています。 しかし自分の環境(FreeBSD x86 gcc2.95.3)では 整数データ = 671396813 文字データ = Z と表示されます。 これは何故でしょうか?
404 :
デフォルトの名無しさん :02/04/15 14:24
>>403 numにはゴミが入っているからだ。
例えば
int num;
を
int num = 0;
としてやってみろ。
scanfの戻り値を見ていないので、それが失敗していることが分からない。 失敗した結果numに何も書き込まれないので、それ以前にnumに入っていた値 (初期値を指定していないため、不定値)のままということでんな。
> 本の見本では
何の説明もなくそんなサンプルと実行結果を挙げているなら、その本がタコ。
「このような結果になるのでscanf()の戻り値チェックを忘れるな」という
説明が付いていてそれを見落としていたなら、
>>403 がタコ。
407 :
デフォルトの名無しさん :02/04/15 16:41
タコ本は焼き捨てろ。
見本にわざわざ値がでてるのはやっぱり 「こんなぐちゃぐちゃなことになるぞ」って例じゃないかと推測。 それなのに「ぐちゃぐちゃ」部分が一致しないって騒いでるんじゃないのか?
409 :
デフォルトの名無しさん :02/04/15 16:52
ハァハァ(゚з゚)
その本の「自動変数」のページよんでないだろ
自分がアポだったようです。 お騒がせしまし
>>311 *.h の中身見て
処理のアルゴリズムが分かると思ってるのかyp!
実はインライン関数かも知れん(違
414 :
デフォルトの名無しさん :02/04/15 18:47
Winmain()から、Dialogを作成するじゃないですか。 そのダイアログにリソース上のBitmapを描画するにはどうすればいいですか?
415 :
デフォルトの名無しさん :02/04/15 19:34
いま望洋さんの本で勉強しているのですが、基本型って難しいですね。 C言語はポインタの理解でつまずきやすいと聞いていたのですが、 その前に挫折しそうです。
いま出回ってる「Cの絵本」って なかなかわかりやすくて良かったですよ。 ただこの本のほかに辞書的な本は絶対に必要ですけど。
419 :
デフォルトの名無しさん :02/04/15 21:15
414です。 あっと、リソース上というのはリソースエディタで書いたもののことです。 ぺけっと…といわれてもいまいち解らないのですが教えていただけますか?
>>417 標準のstrstrはものすごく非効率だったりするから、
場合によっては作った方がいい
>>421 そういうときは、効率がいいものをパクろう。
423 :
デフォルトの名無しさん :02/04/16 08:04
ボトルネックだったら改良すれってことでしょ?
426 :
デフォルトの名無しさん :02/04/16 10:50
void debug_print(const char *format, ...); #ifndef DEBUG #define debug_print if(0) debug_print #endif この書き方ってありですか? リリース時にdebug_print()が無駄にリンクされてしまうのと debug_print(...), foo()とやるとおかしくなるという以外に 何か問題ありますか?
常にdebug_print()がリンクされるのがなんかやだなあ。 #ifdef DEBUG #define dprint(x) debug_print x #else #define dprint(x) #endif とやって、debug_printは直接呼ばずにdprintを必ず dprint(("msg")); の ように括弧を二重に付けて呼ぶようにするとか。 あと、gcc拡張だと思うけどプリプロセッサの可変引数を使って、 #ifndef DEBUG #define debug_print(fmt, args...) #endif こういう手も。gcc限定で良ければこっちの方が綺麗か。
428 :
名無しかも :02/04/16 14:08
forとwhileのメリット、デメリットって何ですか?
430 :
デフォルトの名無しさん :02/04/16 15:16
whileの方が可読性が高い
>>428 メリット・デメリットと言われると違和感があるが、
while: どんな繰り返し処理も記述できる汎用的な方法。
for: ある種の繰り返し処理を分かり易く記述できる。
という違いはあるわな。for文でうまく記述できる処理は
for文で書いた方がすっきりするんでない?
そっかぁ・・・・。 なるほど、わかりました。サンクス
for(;;) と while(1) のどっちがいいか、っていう話かと思った。
>>434 無条件ループならfor(;;)のほうが条件がない感じがはっきりしてていいなあ。
while(1)って、定数条件によってループするってのが気持ち悪いの(if(1)も同じ)と
なぜ「1」なのか(2でも3でも良いし、結局捨てられる)という点も気持ち悪い。
C99 or C++なら、while(true)にすることで印象は改善するが…。
forにするかwhileにするかはかなり好みの問題である。 forは明らかに、一つの単純な初期化 およびインクレメントのあるときに最も有利である。 ↑これが全て。
>>435 一応、真偽を返す標準関数は真の場合1を返すことに決められてるけど。
だめ?
is_*系の判別するのは標準関数やないの?
>>435 while (1e-99) のように、浮動小数点でも無視されるようですね。結局
非0でなければ何でもよいのか。
そらそうでしょ
そらそうじゃないや(w
>>441 そうであります。「非0でなければ」ではなく、「非0であれば」ですよね。
>>438 例外もあったと思う。差を返すstrcmpとか。
あと、ANSI C言語辞典には、
論理演算(ビット演算ではない)は、真の時1
と書いてあった。
1は真だが真は1じゃない。
>>444 必要条件を満たしているが十分条件ではない。
9割9分あり得ないとは思うが、将来的に1が真でなくなる時も来る可能性はある。 実際C#では(以下略)
>>444 もちろん、判定の時は非0が真、真は非0なんだけど、
式の評価値や関数の戻り値としては、「真なら1を返す」ってのが決まってるものも
あるんだよ。
for(ex1;ex2;ex3)はcontinueしるとex3が忘れずに実行できて便利。
450 :
デフォルトの名無しさん :02/04/16 20:54
Cを勉強しようと思っています。 手本になるものを見ながら覚える方がよいと考えているのですが 良いサンプルになる素材というのはあるのでしょうか? それとも、皆さんは一から書き始めたのでしょうか? アフォな質問で申し訳ありません。
>>450 文法知らずに文章書くのって無理です。読むのもママなりません。
452 :
デフォルトの名無しさん :02/04/16 21:00
#ifdef DEBUG #define debug_print printf #else #define debug_print 1 ? 0 : printf #endif
454 :
デフォルトの名無しさん :02/04/16 21:39
case VK_SPACE とかくといまくいきますよね。 キーボードのボタンの場合、 case A としてもうまくいきません。 どうすればいいのでしょうか?
455 :
デフォルトの名無しさん :02/04/16 21:50
>>416 414
う〜ん。いやコントロールは…というのは場合によって
描画座標や横幅を変えたいのですが…。
それで詰まっているのです。たびたび申し訳ないです。
>>456 ありがとうございました
みごとに解決しました
いくらなんでもちょっとヒドすぎる質問が多いような気が…
460 :
デフォルトの名無しさん :02/04/16 22:54
461 :
デフォルトの名無しさん :02/04/16 22:56
SDKでするのと、MFCどっちが良いんだろう・・・ ミニゲーム作るとしたら
462 :
デフォルトの名無しさん :02/04/16 22:57
#include <iostream> using namespace std; int main() { cout << "Hello,C!" << endl; } でコンパイルすると エラー E2209 hello.cpp 1: インクルードファイル 'iostream' をオープンできない エラー E2282 hello.cpp 2: 名前空間名が必要 エラー E2451 hello.cpp 6: 未定義のシンボル cout(関数 main() ) エラー E2451 hello.cpp 6: 未定義のシンボル endl(関数 main() ) と表示されます。なにが悪いんでしょうか?
>>462 コンパイラは何ですか?古いC++だと、<iostream>のようなstd名前空間の
インクルードが使えないことがある。その場合は<iostream.h>とすればよい。
もしくは、コンパイラの設定で、インクルードファイルへのパスが通ってない
とか。これはよくある間違いなのでもう一度よく設定を見直すこと。
>>461 ここはCスレなので、もちろんSDK。
でもあくまでCスレなので、SDK特有の質問されても困っちゃう。
できました。後者が原因でした。ありがとうございます。 ちなみにコンパイラはBorlandC++Compilerでした。 スレ違いの質問してしまったようですね。すみませんでした。
int main(int argc, char **argv) int main(int argc, char *argv[]) どっちが正しいの?
470 :
デフォルトの名無しさん :02/04/17 01:13
Cにおいて関数仮引数の
char *p
char p[]
は全く同じ。
したがって
>>468 のは両方同じ
俺はchar**派
もうしわけありません 初歩的すぎてもしかしたら怒られるかも知れないのですが、質問させてください スレ違いでしたら申し訳ありません Windows、VCでエディットボックスを扱っているのですが、 大量に書きこむと表示がバグってしまいます でもエディットボックスの中身をファイルに出力すると正常です hEdit = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | WS_HSCROLL, 0, 0, rc.right, rc.bottom, hWnd, (HMENU)ID_EDITBOX, Inst, NULL ); SendMessage(hEdit, EM_SETLIMITTEXT, (WPARAM)(1024*64), 0); 見た目の症状としては、エディットボックスのスクロールバーが一番下までいきません それ以上に文章があるはずなのに、スクロールバーはすでに一番下でこれ以上下にいかない。となります もしよろしければ回避法など教えていただけると幸いです
Windowsの制限では? スレ違いだが。
473 :
デフォルトの名無しさん :02/04/17 01:50
>>471 Winのエディットボックスは64kbまでだと思うたが。(違ってたらスマシ)
それ以上書き込んでるってこと?
制限があるのは9x系のみ。 スクロールについては、推測だが スクロールバーの解像度以上の行数を流し込むと当然1pxごとに 2行以上スクロールすることになり、位置とスクロールバーの(見た目)位置が同じでも 実際には幅があるってことじゃないか?
>>469 >>470 ありがと。
ポインタへのポインタだから一緒だよねぇ…
教授に注意されてチョト自信なかったから聞いてみたのです。
intの最上位ビットが立っているかを調べるのに if( i < 0 ) とやるのはOKなんでしょうか?環境依存なく
477 :
デフォルトの名無しさん :02/04/17 02:22
ダメだろ。
>476 規定外だと思うので、厳密には環境依存するんではないかと。 俺は見た事無いけど。
(INT_MAX + 1) >> 1
480 :
デフォルトの名無しさん :02/04/17 02:29
( ΘρΘ) <私のならいつでも勃ったるが・・・ ( ) | つ | ( _)_)
>476
unsigned intでなければOKなんじゃない?明示的にキャストしておくとか。
それとも、素直に((i<<1)
>>1 == i)で調べるか。
>>472 スレ違いでしたか。もうしわけございません
>>473 57KBくらいで変になってしまうのです
64ならなっとくなのですが、どうも中途半端で??です
>>474 なるほど
しかしちょっといじってみたところ
・一番下までスクロール(バーは一番下だが文章はもっと続いてるはずなのに)
・改行する
とやると、一番下までちゃんと表示(バーも正常になる)のです
Windowsの制限でしょうか…
アドバイスありがとうございます
>>476 最上位ビットを調べるのに0より小さいかみるのは正直お勧めしない。
ビット演算子使うべき。
環境依存なし=int幅が不定 という状況で、ビット演算子をどう使う?
485 :
デフォルトの名無しさん :02/04/17 03:34
環境依存なし という状況で、最上位ビットを何に使う?
signedならば負かどうか、unsignedなら
>>481 で桶では?
signedでもunsignedでも、キャストしちまえば片方で済ませられるな。ヤター
念の為、
>>481 にvolatileつけとけば確実かな。環境によっては最適化間違えるかも。
>>488 intからほかの型に仕様変更されたら(以下略
どちらにせよ最上位ビットってのは汎用性が無いよな。
何番目のビットか明示的に示すべきなのに。
条件演算子?:でしかできたいことってありますか?
>>491 ?:は右辺値になれます。
if();else;は値を持ちません。
>>434 while("無限ループだよ")
これが一番わかりやすい。メモリの無駄遣い?
495 :
デフォルトの名無しさん :02/04/17 06:06
ありがとうage
>>484 intの幅なら CHAR_BIT * sizeof(int) で出んか?
魔法のiらんどでつくったHP不正に改ざんされてパスワード変えられた。 誰か不正アクセスの仕方とか教えてください。お願いします。
499 :
デフォルトの名無しさん :02/04/17 08:57
イイカ? w
500 :
デフォルトの名無しさん :02/04/17 08:58
500get!
>>496 intのビット数はCHAR_BITの整数倍とはかぎらないというワナ
>>501 整数倍だが?
いや、正確にはsize_t倍か。
size_tって実数でもいいんだっけ?
おい!お前ら! プログラミング言語C(K&R)なんてどこにも売ってないじゃないか! 古臭い本紹介しやがって、だましたな!1は謝罪しる! # 漏れは某アンチK&Rスレの1ではありませんが、 # 今までいくつかの本屋を回ったがマジでK&Rはどこにも売ってねぇ。 # ネットで買うのもいいかもしれんが、そんなマイナーな本には期待できねーな。
読んでもお前にはわからんから安心しろ。
K&Rをマイナー呼ばわりするヤツ初めて見た。 どこを突っ込んでいいのかわからん。
ケツに突っ込め!
> 古臭い本紹介しやがって、だましたな!1は謝罪しる! ごめんなさい。 作ってわかるCプログラミングのほうをどうぞ。
>>476 これじゃだめ?
#include <stdio.h>
int wordlength(void);
int main(){
int int_len;
int i;
int_len = wordlength();
if(0 < (i >> (int_len - 1))){
printf("(゚∀゚)!!\n");
}else{
printf("(´・ω・`)\n");
}
return 0;
}
int wordlength(void){
int i;
unsigned int v;
v = (unsigned int)~0;
for(i = 1; 0 < (v = v >> 1); ++i){
;
}
return i;
}
511 :
デフォルトの名無しさん :02/04/17 12:37
アヒル本マンセー
512 :
デフォルトの名無しさん :02/04/17 12:45
K&Rをクソと認めない老人ホーム集団のスレはここですか?
K&Rを読めないからやつあたりしちゃってる厨房がまぎれこんだというスレは ここですか?
>>512 訳に関してなら言いたいことは沢山あるが、
内容に関しては年代など関係なくスバラシイ。
>>512 カーニハンとリッチーには足を向けて寝れませんが何か?
アオラーは相手にしないように。
>>504 > プログラミング言語C(K&R)なんてどこにも売ってないじゃないか!
確かに1版はどこにも売ってないね。(緑色の表紙の奴)
古臭い本だからね。
518 :
デフォルトの名無しさん :02/04/17 13:08
K&Rも英語で読めないアフォがあつまるスレはここですか?
般若心経2002の校訂作業をしているスレはここですか?
520 :
デフォルトの名無しさん :02/04/17 13:55
はい、ここです。
>>521 言われてみれば12ビットってのはおかしいな。
31ビットとか半端なintもありえるってことだな。
CHAR_BITが9で、intが32ビットとかもありそう。
そういうイビツな処理系にお目にかかりたい。 最近はWintelマシンばっかいぢってる。
int i,j; for(i=0; i<5; i++){ for(j=0; j<3; j++){ printf("iは%d:jは%d\n",i,j);} } return 0; ↑の説明で外側のループを1回処理する事に、内側のループは3回 処理されています。、と、書かれていたんですがなぜ外が1回しか 処理されてないのに、内側は3回も処理されるんでしょうか?
>>517 第1版の表紙は緑じゃなくて白だよ。
ANSI C規格が出来る前なので、内容的には相当古いですな。
コンピュータ関連書籍の中でも異例なほどのロングセラーで、確か
第100刷以上行ってたはず。これの初版第1刷とか持ってたら自慢できるかも。
register 変数にmemsetで値を書こうとすると警告が出るのだが・・・ レジスタのアドレスは取得できません だってさ。 一応実行ファイルはできてるようだが怖い。 これって大丈夫なのか? ちなみにSolaris7&Sunのccコンパイラです。
>>525 内側は最終的に5×3=15回処理されます。
>>527 いや、そりゃそうだろ・・・・C++じゃないんだから。
>>528 でした。スマソ。
C言語ではregister変数のアドレスは取れないよ。C++ならOKだが。
>>528 指定通りにレジスターにおかれたらまずいんじゃない?
よくわからないけど。
しかし配列をレジスターにおくのはいかがなものかと・・・
533 :
デフォルトの名無しさん :02/04/17 15:33
>>531 C++ではregisterをつけてもアドレスを取ろうした場合は必ずメモリー上にデータが配置されるの?
>>524 全て32bitって処理系をやっています CHAR さえも
>>534 1byte=32bitなの?
charが大文字なのが気になるけど・・・
>>531 必ずというか、register指定が無視される。
>>526 外のforの処理をしたら、内のforの処理が起きますよね。
そうした場合jの値が増えてjが2の時、処理が終わると思うんですが
外のforの2回目の処理の時もまた、内側のforも処理され始めたんで
す。1回目でjの値は2になったのに、何でまたj=0の状態から始まるの
かがわかんなかったんです。
説明下手ですいません。
>>533 アドレスを取る所ではメモリ上から取るが、最適化によってレジスタ変数
が使われる場合もある。
>>535 メモリアドレス単位が32bitなので char も32bitです
>>537 jが3の時、処理が終わる。なぜまたj=0から始まるかというと、
for(j=0; j<3; j++){
~~~~
ここでjに0を代入しているから。
541 :
デフォルトの名無しさん :02/04/17 15:43
>>537 jが3の時に処理が終わる。内側のループを抜けるからプリントはされないが。
CHAR_BIT == 32 sizeof int == 1
>>537 デバッガの使い方おぼえて、変数の内容を確認しながらステップ実行してみ
なされ。
>>540 >>541 なるほど、わかりました。jが2になった時点でj=2が
記憶されるものだと思ってました。
>>537 > 何でまたj=0の状態から始まるのかがわかんなかったんです。
そういう処理を書いているから
多分、for(j=0; j<3; j++){
をfor(; j<3; j++){
に変えたら君の期待した動作になるはず。
>>537 int i,j=0;
for(i=0; i<5; i++){
for(; j<3; j++){
printf("iは%d:jは%d\n",i,j);}
}
return 0;
これでやればきっと思い通りになる。
>>543 デバッガですね。まだ、C初めて3日目なんでこれから
覚えようと思います。有り難うございます。
548 :
デフォルトの名無しさん :02/04/17 15:49
そうか、register変数のメモリは取得できんのか… thx memsetをやっちゃった場合には処理系依存になるのかしらん。 普通の自動変数に変更されてるのかなぁ? このへんの動作をprintfで吐かせるにはどんなコード書けばいいのか?
>>549 きっとコンパイラに「警告:初期化されていない変数jを参照しようとしました。」と言われるな。
今時registerなんて書かないもんだ。
>>550 register変数というか、レジスタにアドレスがないから取得できないんじゃないの?registerをつけたからといって必ずしもレジスタに置かれるというわけではないけど。
>>548 floatもdoubleも32bitです。 レジスタ内では実数部32bitの40bitあるんですけどね。
>>553 >>552 それは理解できてますよ。
ただ、古いコードをお守りしてる都合上、どうしてもregister変数に
memsetをしてる場合の動作を知りたいんですよ。
>>555 エラーにならずに警告にとどまっているなら、register指定は無視され、
メモリに割り当てられているんでしょう。
>>551 > きっとコンパイラに「警告:初期化されていない変数jを参照しようとしました。」と言われるな。
なぜ?jは定義したときに初期化されているように見えるが?
556に1票。 警告が気になるなら #define register とでもしる。
register てつけることは、コンパイラに対して 「気が向いたらレジスタに割り当ててほしいなあ」 とこちらの意向をお伝えしているにすぎないのでぷ。 何かを保証するようなキーワードではありませんでぷ。 コンパイラはそんなことはまったく無視するかもしれないし、 (可能なら)親切にもそうしてくれるかもしれないし。
>>560 そうなのだが、register変数のアドレスを取ろうとすると、
「さっきレジスタに割り当てて欲しいと言ったのに、なぜアドレスを今更
取ろうとするの?(゚Д゚)ハァ?」というようにコンパイラがだだを捏ねます。
C++なら、「さっきはregisterと言ったけど、アドレスを取りましたね。
ではregister指定は無視しましょう。」となります。
0ページをレジスタ変数に使っているという罠
>>562 CPUは65xxxですか?
というか、0ページも所詮はアドレッシングモードの一つに過ぎないしなあ。
レジスタの極端に少ないCPUでregister指定をしても意味がないかも。
x86もレジスタは少ない方だが、レジスタリネーミングのお陰で結構効果
があがる。
>>561 それは、あなたのコンパイラがそういう仕様なのであって、
全部のコンパイラがそうなのとは違いまぷね。
警告レベルのようなオプションの設定によっても
やかましさは違うでしょうし。
>>562 つまらないでぷ。
>>564 ANSI-Cでregisterと宣言された変数のアドレスは明示的にも暗黙的にも
取れないと、K&R第2版A8.1に書いてありまぷね。
だからなに?
>>566 コンパイラによって、registerのアドレスを取ろうとした時、
エラーにならない処理系は標準ではないのかと小一時間。
>>565 そのようですが、現実のところは処理系依存ですね。
SunOS4.1.1のccだと通してしまってるみたい。
>>565 ANSI Cも所詮は規格のひとつにすぎない。
すべてのコンパイラがANSI C準拠だと思うな。
>568 古っ
規格の関係で間違い指摘されると、 規格外のコンパイラもあるって言い出すやつが必ずいるな。 そんなこと言ってたら規格の話題は全部無意味になるよ。
>>571 > 規格の話題は全部無意味になるよ。
そんなことないだろ。
>>565 はANSI-Cが全てだというような書き方をしているのが悪いんだ。
573 :
デフォルトの名無しさん :02/04/17 18:45
今さらって感じですが明解C言語_入門編を購入したのですが そこでどうでもいい疑問があるので質問させて頂きます。 いままで"return 0;"としてmain関数を締めてたのですが この本では"return (0);"となっています。 結論としてはどちらでも良いのでしょうが 微妙な違いみたいなものってあるのでしょうか?
return(0)は、retrun(0)のとき(特にCで) かな〜りしぬるので、おすすめできない。
a = 0; と a = (0); がどちらでもいいのと同じくらいどちらでもいい。 returnに括弧を付けると関数呼び出しっぽく見えてしまうので、個人的には 付けない方が好みだな。
576 :
デフォルトの名無しさん :02/04/17 18:50
>>573 某書籍には括弧はつけてもつけなくてもよいと書かれています。
577 :
デフォルトの名無しさん :02/04/17 18:50
> ANSI-Cが全てだというような書き方をしているのが悪いんだ。 そんな書き方はしてないだろ。 規格外のコンパイラの話をするんなら、そういう前提でやってくれよ。
文字列を入力して文字列を逆にする関数の作り方を教えてください。 例)ABCD→DCBA char *strrev(*char *str) char *str 対象となる文字列。 リターン値 文字列の先頭ポインタ。 こんな感じでどなたか教えてください。
>>577 つまり多くのコンパイラはC99はサポートしていないので
「規定外のコンパイラ」と一々付けなければいけないのですね?
>>578 char *strrev(char *str)
{
int i=0,j;
char t;
j=strlen(str)-1;
for(;i<j;i++,j--){
t=str[i];
str[i]=str[j];
str[j]=t;
}
return str;
}
intじゃなくてsize_tの方がよかったか。どうでもいいが。
>>580 int main(void)
{
printf("%s\n", strrev("ABCD"));
return 0;
}
あり、core dumpするぞ?
# こんな使い方する方が悪い?
584 :
デフォルトの名無しさん :02/04/17 19:08
>>574 ,575,576
レスありがとう。
結論としてはどちらでも良いが、括弧で括らない方が
一般的なのですね。
これからは今まで通り括弧付けずに逝きます。
>583 strcat("abc", "def");と同程度には。
>>583 あれ?なんか間違った?(汗
# 文字列リテラルを書き換えようとしているからじゃないよね?
>>586 文字列リテラルを書き換えようとしてるじゃん
>>583 あなた、
int *a = 32;
とかして平気な人?
>586 VC6だが"ABCD"はwrittenになれんそうです。 "0x00401086"の命令が"0x00420020"のメモリを参照しました。 メモリが"written"になることができませんでした。
592 :
デフォルトの名無しさん :02/04/17 19:40
数値を入力して16進文字列を作成したいんっす。 でも%xは使用禁止なんですよ(涙 アドバイスください。 おながい
ハッキリ言ってインターフェースが悪い。 char *strrev(char *str); ではなく char *strrev(const char *rev, char *str); とすべきと言ってみるテスト
>>593 嘘
×:char *strrev(const char *rev, char *str);
○:char *strrev(char *rev, const char *str);
>>592 65536でわる256で割る16で割る。
>>592 //テーブル。頑張って作ってね。
char s[][]=("1","2","3",......,"FE","FF".....);
int main(int argc,char **argv)
{
int input;
scand("%d",&input);
printf("%s",s[12]);
}
>>592 > 数値を入力して16進文字列を作成したいんっす。
テーブル作れ
char *hextbl[9] = { "0", "1", "2", "3", "4", "5", "6", "7", "8",
"9", "A", "B", "C", "D", "E", "F", "10", "11", "12", ...
:
:
"FFFFFFFC", "FFFFFFFD", "FFFFFFFE", "FFFFFFFF" };
使い方:
int dec = 1234;
printf("dec:%d hex:%s\n", i, hextbl[i]);
ただし、プログラムサイズがやたらでかくなる諸刃の剣
正直、599がchar *s[]ではなく、char s[][]で、しかも("","")という 珍妙なる初期化を行うのはなぜだろうか、と疑問に思う。
600には、 >char *hextbl[9] をもう一度よく考え直していただきたい。
テーブルを手で入力してると打ち間違いが起きるから、プログラムに作らせようよ。 int main() { int i; printf("char *hextbl[] = {\n"); for (i = 0; i <= 0xffffffff; i++) printf("\t\"%X\", \n", i); printf("};\n"); return 0; } これをコンパイル、実行した結果をファイルにリダイレクトしてプログラムに 組み込めばばっちり。 > ただし、プログラムサイズがやたらでかくなる諸刃の剣 それどころか、間違いなくメモリに入りきれませんが…。
亀レスになりますが・・・・・
>>569 > ANSI Cも所詮は規格のひとつにすぎない。
> すべてのコンパイラがANSI C準拠だと思うな。
ANSI-Cが規格化された経緯は、結局文法がバラバラになってしまい、
一つの辞書のような規格を作ろうとしたからだと思います。
だからANSI-Cが絶対正しいというわけではないですが、文法の相違
の話になると、今の所ANSI-Cにはこう書いてあったよ、という話にな
ると思います。
なぜコンパイルが通らないのか、なぜ警告がでるのか?と一人で悩む
ぐらいなら、ああ、これは標準とは違うんだ、で納得できれば、時間も
気苦労も少なくて済みますよね。
>604 ホントに実行してみた? そのループ、回らなはずだけど‥‥
あ、すまん。int i;じゃなくてunsigned int i;じゃないと。
>>606 ホントに実行してみた?
そのループ、回るけど止まらないんだけど・・・
unsigned intは32bit どの環境でも?
ううむ。0xffffffff -> UINT_MAX ですか。
char format= "%%"; format[1]='X'; printf(format,i); 激しくつまらないな‥‥ >604 "FFFFFFFE", "FFFFFFFF", //←コンパイルエラー };
>>613 最後のカンマが余計なのはエラーにならないんじゃなかったっけ?
シマッタ、それが有効なのはenumだけだとオモテタ‥‥
C99とC++ではエラーにならないけど。
よし、ここは、569の例に倣って、 「エラーになる俺様コンパイラがある」ってあたりで(自爆)。
つぅかあんたらいい加減にテーブル引きとかバカなこと言わず(発端は俺だが。)。
>>619 馬鹿なことじゃないぞ。
16進数化程度では確かにくだらないが、汎用性を考えると(以下略
いややはり、事実上コンパイルできないのは大きいから、 DBなり、固定長のファイルレコードなりに納めるのが 実用的だと(以下略)
確かに、この程度の処理で巨大なテーブルを引くのはよくないな。 こうしよう。 int dec2hex(int x) { FILE *fp = popen("bc", "w"); fprintf(fp, "obase=16\n%d\n", x); pclose(fp); }
int -> void
>>622 これがCじゃなくてシェルスクリプトだったらUNIX的なすばらしい解決法だね。
s[i++] = (t=n%16)>9 ? t-10+'A' : t+'0' ; 前後を組み立ててloop!!
626 :
デフォルトの名無しさん :02/04/17 21:48
制御文字ってどんなのですか?
>>625 コードがEBCDICでも大丈夫かな?あれはA-KとL-Zが分かれていただけ
でしたっけ。
629 :
デフォルトの名無しさん :02/04/17 22:03
アスキーコードの奴だったんですかどもありがとうございます
>>628
630 :
デフォルトの名無しさん :02/04/17 22:43
なんかスレ違いかもしれませんが、 フリーウェアでおすすめのCコンパイラを教えてください ちなみにwindowsMEでも動くやつをお願いします
>>630 borland。C++だけど。それかgcc。C++だけど。
634 :
デフォルトの名無しさん :02/04/17 22:58
>>631-633 レスありがとうございます。
グーグルで検索したときに出てきたLSI-cとかいうのはMEでも動くのでしょうか?
95と98としか書いていなかったので。
>>634 うごくよ。でもLSI-C試食版はおすすめせん。制限が大きすぎるし、ANSIから
外れている点が多過ぎる。(wchar_tに対応してないなど)
636 :
デフォルトの名無しさん :02/04/17 23:11
>>635 丁寧に教えていただきありがとうございます。
LSI-cはおすすめではないのですか。う〜ん
ちなみに私は今C言語の猛特訓中でありまして、
コンパイラ使うのもポインタとか構造体とかのそこら辺の部分を実際に
動くところを確認したかっただけなんです。
もうちょっと色々調べてみます。
何かスレ汚してすみませんでした。
637 :
デフォルトの名無しさん :02/04/17 23:11
男は黙ってCygwin + GCC = (・∀・)イイ
>>636 だったらなおさらLSI-C試食版はやめた方がいいぞ。
構造体を正しく返せないなどのバグがあるから。
LSI-C試食版にはお世話になったが、今では論外。 GCCかBORLANDにしとけ。楽だし。
LSICのマニュアルは持ってて損はないけどな
>>633 のは初めて知ったけどどうなの?
使ってるひといるのかな。
642 :
デフォルトの名無しさん :02/04/17 23:43
円の書き方教えて
ドラえもんに聞け
printf("円");
printf("\\");
gccやBorland-C++でも、正しく書いたCプログラムならコンパイルできるぞよ。
printf("○");
>>642 奥村晴彦氏のアルゴリズム本より。
http://www.matsusaka-u.ac.jp/~okumura/algo/ void gr_circle(int xc, int yc, int r, int color)
{
int x, y;
x = r; y = 0;
while (x >= y) {
gr_dot(xc + x, yc + y, color);
gr_dot(xc + x, yc - y, color);
gr_dot(xc - x, yc + y, color);
gr_dot(xc - x, yc - y, color);
gr_dot(xc + y, yc + x, color);
gr_dot(xc + y, yc - x, color);
gr_dot(xc - y, yc + x, color);
gr_dot(xc - y, yc - x, color);
if ((r -= (y++ << 1) - 1) < 0)
r += (x-- - 1) << 1;
}
}
649 :
デフォルトの名無しさん :02/04/17 23:55
マイクソソフトのVC++6.0使ってCのプログラミングするときどうやるの?
650 :
デフォルトの名無しさん :02/04/17 23:56
Cの文法って、lexerが型名と識別子を区別してやらないと LALR(1)にならないんでしょうか?
>>649 >マイクソソフト
質問してるやつが2ちゃん言葉使ってるとむかつくから教えない。
>>649 ファイルの拡張子を".C"にするとか言ってみるテスト。
654 :
デフォルトの名無しさん :02/04/18 05:00
う〜ん ポインタと配列で質問なんですが。 char a[] = "hogehoge"; char *b = "hogehoge"; a[0] = 'z'; b[0] = 'z';//これを書くと例外で落ちます。 この差がわかりません。 ポインタの初期化ではメモリを確保したことにならないんでしょうか?
>>654 b[0]='z'は文字列リテラルそのものを書き換えようとしているからエラーになる。
a[0]='z'は文字列リテラルを使って初期化した配列の要素を変更しようとしているだけだから問題ない。
657 :
デフォルトの名無しさん :02/04/18 08:11
656の説明でわかるかな? 文字列リテラルは文字が配列として並んでいる定数でそういう意味では5, 'a' などと同じ。 int x = 5; char ch = 'a';に対して x = 10; ch = 'b';なんてやるのは全然問題ないけど 5 = 10 ; 'a' = 'b'なんてやるのはエラーになって当然。 しかし世の中には定数を読み書き可能領域に割り当てたりするコンパイラもあるので 654のコードがエラーにならない場合もあるらしい。
>>657 constで宣言した変数と似た様な扱いなのね。
>>654 (3番煎じ(?)だけど、せっかく書いたのでカキコんどきます)
例外で落ちるとは、すばらしいね。
OSとコンパイラによっては、無視してそのまま実行され、
両者の違いに気付かないまま先に進んじゃってたかも。
char *b = "hogehoge";
の場合、「hogehoge」という文字は、自動変数を確保するスタックとも、
malloc()したときに使われるヒープとも違う、読み出し専用メモリ領域に
埋めこまれています。なので、書き換えるとメモリアクセス違反になります。
これに対し、
char a[] = "hogehoge";
は、疑似的に書き直すなら
char *hogehoge_ptr = "hogehoge"; /* これは上の b の例と同じ場所を差している */
char a[strlen(hogehoge_ptr)+1]; /* スタック上にhogehoge(8文字) + '\0'(1文字) の配列確保 */
strcpy(a,hogehoge_ptr); /* 配列にコピー */
となり、a はスタック領域を指しているので、書き換えOKです。
「セグメント 文字列リテラル」で検索したよさげなページを貼っときます。
http://www.mars.dti.ne.jp/~torao/program/general/memory.html
>>654 char b[]="hogehoge";
は
char b[]={'h','o','g','e','h','o','g','e','\0'};
と完全に同値な不規則な構文。このとき"hogehoge"は
文字列リテラルでは全くない。
661 :
デフォルトの名無しさん :02/04/18 11:00
円のプログラム教えて
>>661 お前、↑で書いてくれた奴に土下座して謝れ。
関数の修飾子にpascalをつけるとどーなるんですか?
>>663 8086の時代にはちょっとだけ効率がよくなった。
最近のヤツはしらん。
>663 引数を左から順にスタックつんだはず。 可変長引数のprintfとかの動作は知らん。 >664 win16の時代には… では?
>>665 > win16の時代には… では?
win16も俺にとっては最近。
>663 #include <stdio.h> void write( char * str ) { printf(str); } pascal program main(); begin write('Hello Pascal!'); end. を期待してた? >666 ...
>>665 加えて、pascal呼び出しは、パラメータをスタックに積んだ場合、呼び出し先
で元に戻す。C呼び出しは、呼び出し元で元に戻す。
RISCなどのレジスタにパラメータを持って呼び出す場合はそんなに変わらない。
pascal呼び出しは、スタックの調整のコードが呼び出し側から無くなるぶん、 コードサイズが小さくなるってこった。
pascal の方がサイズは増える気が。
671 :
デフォルトの名無しさん :02/04/18 17:51
Winmain()からDialogBox()を呼び出してリソースエディタで作ったダイアログボックスを表示 するのですが、表示座標を決めたいです。(左上に表示されてしまう) どうにか方法はありませんか?
673 :
デフォルトの名無しさん :02/04/18 18:00
char str[] = "あ"; //"あ"のシフトJISでのコードは 0x82a0 USHORT code = (str[0] << 8) + str[1]; //値は33184 = 0x81a0 なんで値が違っちゃうんですか??
>>673 char が符号付きの環境の場合、str[1] == 0xa0 はマイナスの数として
扱われて、結果 USHORT( 0xffff8200 + (-0x60) ) == 0x81a0 に。
+0xa0 として使いたいなら unsigned char にするなり &0xff するなり。
>>676 WindowsだったらMAKEWORD()ってマクロがあるから
それ使ったほうがスマート。
(UCHAR)MAKEWORD();
679 :
デフォルトの名無しさん :02/04/18 18:26
Timerの識別ってどうするんですか。
>>679 つーか全然Cと関係ないしAPIすれ逝けと小一時間(以下略)
>>681 確かに、最近純API系の質問多いね。
今後は放置の方向で。どうしてもかわいそうなら誘導でよろ。
683 :
デフォルトの名無しさん :02/04/19 02:01
いろいろな言語を見てきてたどり着いた結論なんですけど、 Cはただのマクロに過ぎないという考えであってるでしょうか。 C++などに比べるとあまりにしょぼいですが、 こう割り切ってしまうとだいぶ開発が楽になります。
すみません、初心者なんですが、 double a = 0; double b = 0.0; これって違いがあるんですか?
685 :
デフォルトの名無しさん :02/04/19 02:08
>>683 マクロを拡大解釈していけばあらゆる言語がマクロに見えるだろうね
687 :
デフォルトの名無しさん :02/04/19 02:20
>>685 ちょっとしたプログラムを書くのには悪くないって感じです。
少し大きめの物を作るのには使いたくありませんけど。
>>686 非OOPLはすでにみんなマクロに見えてます。
>>687 JAVAはやりません。遅いから。
684です。
>>687 どうもです。PascalやってたんでどうもCの実数と整数の扱いにしっくりきません。
int i = 5/3;
とかできるあたりとか…。
691 :
デフォルトの名無しさん :02/04/19 02:29
>>688 >使いたくありませんけど
Cを使いこなせないってことね(プ
692 :
デフォルトの名無しさん :02/04/19 02:32
>>689 はOOPLにとり憑かれています
さっさと病院に逝きましょう
693 :
デフォルトの名無しさん :02/04/19 02:36
というか、Cがわかってねぇんだろ。 VCのウイザードが生成したプログラム見て、OOPすげぇー、とか逝ってるだけ。
>>689 が言うJavaが遅いというのは、
1 ゲームや数値計算など、処理速度が重要なソフトを開発している
2 Javaが遅いと思いこんでいる
3 頭がどうかしていて、糞遅いコードしか書けない
上記のうちどれでしょう?
言語を並べてガタガタぬかすのがそもそも(以下略)
ここはCしかわからない老人のスレですか?違いますよね。 Cを理解し、C++を理解していれば、Cの生産性がC++に比べてはるかに低いことは認識できると思いますけど? もちろん、C++を使いこなせないプログラマの場合この限りではありませんが。
漏れの場合は、大部分のOOPLの方がマクロに見えるけどな、
というか、書いていて生成されるアセンブリコードが想像できない言語は全部。
つか、
>>689 が言うマクロって何だろう。
>>696 生産性の定義を述べてみ。
またCとC++の生産性をどうやって測定したのかも述べてみ。
それぞれ幅広い分野での実装例について比較可能な形で調べにゃならんわな。
まさか、定義も測定もなしに生産性がどうたら言うてるんじゃあるまいね?
まして、自分ひとりの経験でどうたら言うてるんじゃあるまいね?
700 :
デフォルトの名無しさん :02/04/19 02:55
>>696 だからと言ってC = マクロということにはなりません
ちゃんとC/C++理解してんの?あんた
>>689 が使ってる言語って何だ?
非OOPLがマクロに見える(ほめ言葉じゃないわな)って言うぐらいだから、
よっぽどOOPにこだわりがあるようだが、C++みたいなOOPLとしては
おもちゃ以下のものしか使ってないって事はないよな。
EiffelとかSmalltalkでもつかってんのか?
702 :
デフォルトの名無しさん :02/04/19 03:01
すげーカメラ目線だ
つーかここは C のスレであって C++ やら OOPL やらのスレじゃないんだが。
∧_∧
( ´Д` ) Σ スマソ
>>702 は誤爆・・・
/, /
(ぃ9 |
>>697 一連の作業をあらかじめ一つにまとめて自動で実行するためのもの、
という意味で使用しています。
拡大解釈すれば、当然すべてのプログラムはマクロと取れます。
>>698 この話はすでに他のスレで何度もされているようですが。
この場合は同様のものを実装するのにかかる時間、
といったところでしょうか。
判断基準はいろいろあるでしょうが、
重要なことは、C++はCのほぼスーパーセットとなっているので
適切に判断すればどのような基準においてもCに劣ることはありません。
>>701 メインはC++です。
C++はOOPLとしては問題も多く含みますが、
そのC++ですら、非OOPLに比べたらだいぶましです。
706 :
デフォルトの名無しさん :02/04/19 03:18
C++はいいと思うが、Cをマクロといってるお前の頭の構造が(以下略
>>705 >重要なことは、C++はCのほぼスーパーセットとなっているので
>適切に判断すればどのような基準においてもCに劣ることはありません。
別の観点から言えばC/C++の何れかで書かれたコードは
どちらもC++のコードだと言ってるように見えるが気のせいか。
∧_∧
( ゚Д゚ ) <
>>705 いい加減にしろよ貴様
/, /
(ぃ9 |
>>707 拡張子で(以下略
もちろんそうなるでしょう。
その場合はC++で書かれた一部のスタイルのプログラムはマクロのようだ、
ともいえるでしょう。
マクロのように見えるかどうかは言語そのもので決まるのではなくてプログラミングスタイルですから。
Cで書かれたプログラムでもマクロに見えないようなのはごまんとありますし、でもそういうプログラムをCで書きたいとは思いません。
>>709 いや、そうじゃなくて。
C++で書かれたコードしか存在しないって主張の中で
CよりC++だって言うのはトートロジーチックじゃあるまいか。
そりゃ詭弁じゃないか。
とこのように言っているのだよ。
大体C++で追加されたフィーチャーの生産性への寄与については
何も具体的な言及をしとらんじゃないか。
あ、クラスの効用とかなら言わんでいいよ。
理論的に優れている、というのはどんな言語にだって言えることなんだから。
あくまでも現実のソフト屋業界における生産性を聞いておるのだ。
実証もなしに見てきたようなことばっかり言ってたら脳味噌腐るぞ?
Smalltalk >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++ > C
マクロ >>>>>>>>>>>>>>>>>>>>>>>>>>>>> C > C++
・・・いつ Ruby が出てくるのかなと期待しているのは漏れだけではないはずだ(藁
C > OOPL >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>713 >
>>683
チンコ -> Rubyist
717 :
デフォルトの名無しさん :02/04/19 03:45
HSP>>>>>>>>>ラディソ>>>>>>Ruby>>>>>>>C++
>>716 それはおかしい
Rubyist => チンコ
「Rubyistはチンコに評価される」
pc.2ch.net >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> このスレの住人
宗男 >>>>>>>>>>>>>>>>>>> このスレの住人 <<<<<<<<<<<<<<<<< 真紀子
1000!
722 :
デフォルトの名無しさん :02/04/19 03:53
俺 >>>>
>>1 >>>>>>>>>>lisp>>>>HSP>>>>>>>>>>>>>>>>
>>715
723 :
デフォルトの名無しさん :02/04/19 03:54
>>710 実際に完成されたプロジェクトとしてその効果を客観的に判断するのはほぼ不可能でしょうね。
でもごく小さな範囲でなら可能です。
C++でSTLを使用すれば容易に線形リストを実装し検索・分類などの操作も可能です。
Cではその場合に応じて書かなければいけません。
たったこれだけのことですが、少なくとも他のすべてでC<=C++なので、C<C++は証明できます。
>証明できます じゃぁ、証明してくれ。 少なくとも俺にはC<C++の`証明'をすることは不可能だ
Lisp >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>722 > 神 >
>>1
>>745 724で証明されていますが、ご不満でも?
>>725 文系君にとって`証明'とはいくつかの事例を集めることなんでしょ。
>>724 >C++でSTLを使用すれば容易に線形リストを実装し検索・分類などの操作も可能です。
>Cではその場合に応じて書かなければいけません。
こういうのを、
>理論的に優れている、というのはどんな言語にだって言えることなんだから。
と言って釘をさして、
>あくまでも現実のソフト屋業界における生産性を聞いておるのだ。
こう聞いたんだが、言葉の順序を変えれば詭弁も通ると思っておるんかいな?
言語の話をしているのにSTLを持ち出すのもおかしな話だと思うがね。
標準ライブラリも含めてC++だと言い張るんなら結構なことだが。
>>724 >実際に完成されたプロジェクトとしてその効果を客観的に判断するのはほぼ不可能でしょうね。
>でもごく小さな範囲でなら可能です。
これも凄いこと言っとるよなぁ。
個人的な経験で語るなとも言ったのに読めておらんのかいな。
これじゃ、「世間じゃ知りませんがボクの知ってる範囲内じゃC++は凄いんです!」と言っとるようなもんだ。
CよりC++のほうが、一人で1ヶ月くらいで書けるプログラムの生産性が高いのは、俺の実感。 ところが、人数の多いプロジェクトで、人海戦術に近くなると、Cの方が生産性高くなるんだ。 Cの方が理解してなくちゃいけないことが少ないからだろうな。
生産性なんて個別的なもんだからね。 仕様、納期、人員、環境、どれが変わっても左右される。 生産性ってキーワードで物事を一括りにするのは駄目コンサルだけにして欲しいよ。
通は道具を愛でるがプロは道具を選ぶ。そういうこった。
>>727 の脳味噌はピンポン球くらいの大きさであることを証明しました。
>>728 帰納法をご存じない?
>>729 >あくまでも現実のソフト屋業界における生産性を聞いておるのだ。
その主張はよく非OO信者が持ち出しますが、1行目で書いているように完成されたプロジェクトで判断することはほぼ不可能です。
そもそも同一仕様のある程度のプロジェクトを非OOとOOのそれぞれで実装したという話しは聞きませんし、したとしてそれが必ずしも客観的な判断基準とはいえないでしょう。
ついでに言えば、非OO信者は決して、これを根拠に非OOがOOよりも優れていることを証明したがりませんね、できないことがわかっているからですが。
> 言語の話をしているのにSTLを持ち出すのもおかしな話だと思うがね。
> 標準ライブラリも含めてC++だと言い張るんなら結構なことだが。
当然です。STLはCでは実装できません。
STLはすべての状況に対応できるわけではありませんが、CよりもC++のほうが再利用性の高いことを示す1つの例とはなりうるでしょう。
Cで同様に優れたライブラリを作成したところで、それはC++でも同じように使用できるのでC固有の優れた機能とはいえません。
738 :
デフォルトの名無しさん :02/04/19 04:24
OOが悪いとは言わん、またC++のほうが当然Cより便利だろう。 だが、Cはマクロ、といってる根拠がわからん。 単にCを貶めたいだけか?
>>735 人の発言はよく読んだ方がいいと思うなぁ。
もし私が「C > C++」と言いたがっていると思うんなら根拠を出して欲しいね。
で、結局、実世界に即した客観的評価は自分には持ち出せないので
理論的なトピックを通じてC++はCより優れていると評価するってことでいいんかね?
>Cで同様に優れたライブラリを作成したところで、
>それはC++でも同じように使用できるのでC固有の優れた機能とはいえません。
これはC++とCを入れ替えても同じ言い方ができるね。
こういうのを詭弁と言うんじゃないかねぇ?
彼は屁理屈こき麻呂。
>>736 違う違う(藁
漏れアンタに同意してるの(藁
>>735 > 帰納法をご存じない?
知ってますよ。というか
> いくつかの事例を集めること
は正当な`証明'であると言いたいわけですか?
もしかして文系君のいう帰納法と数学的帰納法の違いをご存じない?
>>739 > >Cで同様に優れたライブラリを作成したところで、
> >それはC++でも同じように使用できるのでC固有の優れた機能とはいえません。
> これはC++とCを入れ替えても同じ言い方ができるね。
> こういうのを詭弁と言うんじゃないかねぇ?
どこがでしょう?
入れ替えてみましょうか?
C++で同様に優れたライブラリを作成したところで、
それはCでも同じように使用できるのでC++固有の優れた機能とはいえません。
STLはどうなりましたか?
>>743 「同じように使用できる」を記法として同等にの意と言いたい訳かい?
だったら、C++の記法が優れていることを示してもらいたいねぇ。
それとも、C++はCのスーパーセットだからと言うのなら
そういう言い方自体が詭弁ではないのかというところに答えて欲しいねぇ。
それより、↓の方に答えてもらいたいんだがね(藁
もし私が「C > C++」と言いたがっていると思うんなら根拠を出して欲しいね。
で、結局、実世界に即した客観的評価は自分には持ち出せないので
理論的なトピックを通じてC++はCより優れていると評価するってことでいいんかね?
枝葉末節を斬り返していけばどうにかなると思っとらんか?
>>746 > 理論的なトピックを通じてC++はCより優れていると評価するってことでいいんかね?
いいですよ。
私には、おそらく私以外のすべての人にも、あなたの言う「実世界に即した客観的な評価」は出せませんから。
>>747 >私には、おそらく私以外のすべての人にも、あなたの言う「実世界に即した客観的な評価」は出せませんから。
おお。やっとまともな台詞が聞けたよ。
私もそう思ってるよ。だから、
>ここはCしかわからない老人のスレですか?違いますよね。
>Cを理解し、C++を理解していれば、Cの生産性がC++に比べてはるかに低いことは認識できると思いますけど?
>もちろん、C++を使いこなせないプログラマの場合この限りではありませんが。
これは侮辱と言うんじゃないかね、と、これが私の一番言いたいところだ。
これが自分の主観であることに異はないと思うが、
なぜそんなものを根拠にして見ず知らずの住人を老人呼ばわりするのか、
説明して欲しいねぇ。
749 :
デフォルトの名無しさん :02/04/19 04:45
生産性か。。。。 言語知らない新入社員に「Cで組め」「C++で組め」って言った時は Cの方が覚えるの簡単なんで生産性たかいとおもうが。。。
>>741 あ、そか、ども。
なんつか、2ちゃんって、素直に読めないクセがついちゃうからさ(^^;
>>748 私の持つ根拠とあなたの欲している根拠が異なる点に基づいているだけですが?
私にとっての(あなた風に言えば理論的な?)根拠はあなたにとって根拠とは呼べないのでしょうし、
あなたにとっての(実践的な?)根拠は私にとっては根拠とは呼べない。
それだけのことです。
> これは侮辱と言うんじゃないかね、と、これが私の一番言いたいところだ。
もちろんです。
ちなみに老人呼ばわりしたのは、
C++を知らずにCとC++の比較を非難する人たちであり、
もしいるとすれば私にとっては十分に侮辱の対象になりえます。
あえて言うなら
>>691-693 あたりを想定していますが、
その人たちがC++を使えているなら問題ありませんし、
そもそも先に侮辱しているのはあちらです。
C++を理解したうえで、CがC++よりも生産性が低くないと主張するならば、そう根拠を持って主張すれば言いだけのことです。
私はそれらの人に対してなんら侮辱するつもりはありません。
752 :
デフォルトの名無しさん :02/04/19 05:05
>そもそも先に侮辱しているのはあちらです。 始めにおまえがCをマクロなどと言わなければこんなレスはつかない。
753 :
デフォルトの名無しさん :02/04/19 05:06
ヘッダーファイルに関数を書くのは基本的にはやらないほうが いいんですよね?
>>751 >私の持つ根拠とあなたの欲している根拠が異なる点に基づいているだけですが?
>私にとっての(あなた風に言えば理論的な?)根拠はあなたにとって根拠とは呼べないのでしょうし、
>あなたにとっての(実践的な?)根拠は私にとっては根拠とは呼べない。
つまり君は君以外の人間に話が通じるとは端から期待してないわけだ。
だとしたらなんでわざわざ喧嘩しにくるのか、愉快犯かと疑ってしまう。
>あえて言うなら
>>691-693 あたりを想定していますが、
の割にはまるでスレの住人を一括りにしたような言い方だよ、あれじゃ。
もうちょっと言葉づかいぐらい考えてもらいたいねぇ(ニガワラ
>その人たちがC++を使えているなら問題ありませんし、
これも人を侮りすぎだと思うねぇ。
君の言う「C++が使えない」人間は多いだろうが
君がここで言葉を交わすプログラマもそうであるという保証はどこにあるね?
>C++を理解したうえで、CがC++よりも生産性が低くないと主張するならば、そう根拠を持って主張すれば言いだけのことです。
CはC++に常に劣るわけではない、という証明がここでは重要だと言うのかね?
だとしたらそれは、君の思い上がりだ。
誰もそんな話をここでしたいとは思っておらんよ。
ここはCの話をするスレだ。違うかね?
知らないやつをバカにするのは好きじゃないけど、 知らないことを自覚してないやつは、おおいに侮辱するべき。
756 :
デフォルトの名無しさん :02/04/19 05:09
753が微妙にカワ(・∀・)イイ!
>>753 ヘッダーはインターフェースと実装の分離のために使うのが基本だからね。
ヘッダーに実装を書いてしまうと実装の変更の度に不要であるはずのコンパイルが発生してしまう。
うぃ〜す。アホはぼちぼち寝ますわ(藁
ん?またC叩き祭りがはじまったの?
Linuxのソースコードにはide.hなんかに関数が書いてあったりして ちょっとCプログラミングの(自分の考えていた)常識を覆されました。 もっと勉強します。
762 :
デフォルトの名無しさん :02/04/19 06:08
>>762 2.5系のには入ってるんですよ。
いづれ取り除かれるのかもしれないですが。
お前の意見だとノイマンコンピュータはマクロだな。と遅レス。
>>763 ソースの記述に拘るなら*BSDをどうぞ。
Linuxはそういうもんだと思って付き合うのがよろし。
766 :
デフォルトの名無しさん :02/04/19 07:19
>>765 どこで落とせるんですか?
ファイルに直リンクでお願いします。
ハァ??
768 :
デフォルトの名無しさん :02/04/19 07:32
ハァ???
>>767 bz2とかになってると勘違いしてる人っぽいですな。
>>769 bz2とかになっていないと勘違いしてる人っぽいですな。
C++のクラスやらテンプレートやらの記法は結局のところCに変換されるマクロですとか逝ってみるテスト
たまにカーネルMLにもC++房が出現するよなw
元気ですかー! 元気があればなんでもできる、、
>>705 JIS X 0015 でも読んでおけ厨!
778 :
デフォルトの名無しさん :02/04/19 11:42
ttp://hp.vector.co.jp/authors/VA000092/jokes/strup.html 一応こういうページをリンクしてみよう。
もちろんこの文章はジョークだけどC++にはこういう一面があると言うことはC、C++
両方をかじってみて自分でも実感したことでもある。
ただしCとC++とどちらが優れているかなんて言う議論はナンセンスだと思うよ。
CにはCの良さがあるしC++はそれで優れた点もある。しかし両者とも欠点はある。
いつも言われることだが銀の矢は存在しない。優れたプログラマはどちらでもそつなく
仕事をこなすがヘボはどっちでもヘボ。
たまに、っつーかよくいるんだよね。 XはYより優れているということをYしかしらない君たち原始人に教えてやろうって態度の奴。 インドに「近代的教育」を施したイギリス人の再来かと見紛える(ワラ しかもまた習いたての若いのに多いのが頭の痛い話で・・・。
780 :
デフォルトの名無しさん :02/04/19 12:58
整数から文字列に変換する関数ないですか?
>>780 ちょい訂正。
sprintf じゃ駄目?
783 :
デフォルトの名無しさん :02/04/19 13:02
>>780 sprintfを使おう
char hoge[128];
int num = 123;
sprintf(hoge,"%d",num);
みたいに
785 :
デフォルトの名無しさん :02/04/19 13:03
787 :
デフォルトの名無しさん :02/04/19 13:04
788 :
デフォルトの名無しさん :02/04/19 13:12
#include<stdio.h> void main(void){ FILE *fp; int num=1; int input; int i; char h[4]; scanf("%d",&input); fp=fopen("t.txt","w"); for(i=0;i<=input;i++){ if(i%25==0){ fputs("\n",fp); } fputs(">>",fp); sprintf(h,"%d",i); fputs(h,fp); } fclose(fp); } 直してくれちょ
/*int num=1;*/と
/*char h[4];*/と
>>786 以上
790 :
デフォルトの名無しさん :02/04/19 14:05
788 何をどう直せと。 void main(void) => int main(void) で最後にreturn 0;というわけでもあるまい。
>fputs(">>",fp); >sprintf(h,"%d",i); >fputs(h,fp); fprintf(fp, ">>%d", i)
792 :
デフォルトの名無しさん :02/04/19 14:45
>>788 余裕があったらエラーチェックも入れてください。
>>788 > for(i=0;i<=input;i++){
仕様が良くわからないのだが
input = 10の場合、11回繰り返したいのか?
795 :
デフォルトの名無しさん :02/04/19 14:55
printf の桁指定のところを可変にできませんか? 例えば、 int keta = 5; float num = 1.0; printf("%.7f", num); とあった時に 7 の所を 変数 ketaで指定し、 結果の表示が 5 桁になるように、とか。
できます。
798じゃないけどヒント。 char* s = "%.7F"; printf(s, num);
おいおい、こうだろ?(w printf("%.*f", keta, num);
おおー、そうなんか。すまん。俺も知らんかった(藁 いや、勉強になった。さんくすこ。
出来ました。(^-^ K&R の精度指定のところ(p305)ばっかり見てたんですが、 ちょこっと後 (p306) に書いてありましたね。 全然気がつかなかった。 サンクス。
804 :
デフォルトの名無しさん :02/04/19 20:24
Cマンセage
805 :
クレジャパン :02/04/19 20:45
つまらない事をお聞きしますがC言語ってなんですか?
グーグルの予感・・・。
荒れる予感。
811 :
デフォルトの名無しさん :02/04/19 23:14
標準関数のソースって手に入れられますか?
812 :
名無しかも :02/04/19 23:31
関数の外に変数の宣言をおくと、どこの関数からも参照できる変数になり便利ですが、なるべく使わないほうがいいのはどうしてですか?
813 :
デフォルトの名無しさん :02/04/19 23:33
手に入るよ 俺が書いたやつなら/cygdrive/d/prog/library/standard_library/ にstring.hとctype.hがあるから持ってげ
親の通帳とハンコをリビングに置いておくと、家族誰でもお金を引き出せることができ便利ですが、なるべく隠しておくほうがいいのはどうしてですか?
816 :
デフォルトの名無しさん :02/04/19 23:35
メモリーの無駄使いになるから
817 :
デフォルトの名無しさん :02/04/19 23:38
>815 貧乏になるから
>>641 遅レス
DOS時代は、最速コードを吐くと言われたコンパイラ。ちょっと前からFreeに。
Win版の性能はわからない。多分悪くないんじゃない?
el のコンパイルウィンドウfにメニューバーって付けれます?
820 :
デフォルトの名無しさん :02/04/20 00:23
膨大な要素を持つ配列の上位数個を取り出してソートしたい時、 例えば、トップ10を抽出したいとき、全要素をソートして上位を 取り出すのは効率が悪いですよね。 void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); に習い、 void topsort(void *base, size_t nmemb, size_t top, size_t size, int (*compar)(const void *, const void *)); ※ただし、top は抽出したい要素の個数とする という関数を(考えうる最高の実行速度になるように)書いてください。
821 :
デフォルトの名無しさん :02/04/20 00:25
∧__∧ ( ・∀・)<「書いてください」 (u u)
822 :
やっぱり既出? :02/04/20 00:40
板違いもしくはスレ違いかも知れませんが・・・ UNIXのCと普通の(林晴比古とかが解説してる)Cって どう違うのでしょう。 何か「機械系のCとUNIXのCは全然違う」とか言われたんですけど、 どこが違うのか全然わからないのです。 どなたか教えていただけないでしょうか・・・。
∧_∧ ( ´Д` ) 書いてください。(しかも考えうる最高の実行速度で) /, / (ぃ9 |
>>820 上位n個を取り出すなら「ヒープソートを途中まで」というのが
とりあえず基本かと。もっと高速な方法もたぶんあるだろうけど。
つーわけで頑張って(考えうる最高の実行速度になるように)書け。
>>822 Cという言語自体は基本的に全然変わらん。
OSとかシステムに依存するライブラリの部分は色々と違うだろう。
825 :
デフォルトの名無しさん :02/04/20 00:59
(;´-`).。oO(
>>820 こいつはヲレに対して挑戦してきてるのか・・・?)
(;;´-`).。oO(どう答えてやるか・・・・・)
(;;;´-`;;).。oO(クイックソートかよ・・・不慣れなやつじゃん・・・)
(;゚-゚).。oO(.......)
(;つДT) <
>>820 は逝ってよし!
>>820 結果は base[0] から base[size*top-1] までに上書きしていいのか?
>>820 CやめてC++のpartial_sortでも使え!プログラムせんでええぞ。
>>820 それ、宿題の問題文を敬語で書き直しただけちゃうんか
>>822 機械系(組み込み系)とUNIXのCの違いは、824が書いた通り、言語としては同じ。
組み込みだと、標準ライブラリが有っても使えない事も多い。
メモリ消費量や、実行速度、あるいは割り込みの関係上ね。
組み込みは、コンパイルされたコードが正しく実行されるとも限らない。
データバス、もしくはアドレスバスが切れている、又はブリッジしている状況も
想定出来ないと、初めて出来上がったハードの最初のプログラマにはなれない。
OS込みなら普通テスト済みのハードだから、おかしければエラーで済む所だけど。
>830 初めての男になれるわけですねハァハァ
>>820 その課題、結構面白いね。
>>824 確かに、それがよさそうだね。
1.トップ要素が最低値になるようなヒープを保持しておく
2.ヒープにつっこむ最大要素数を抽出したい要素数とする
3.ソートしたい配列を走査していって、ヒープのトップ
より大きな値が来たら、ヒープのトップ要素と交換して、木を再構成。
最後に取り出す時は、ヒープに使ってた配列をクイックソートってのが
効率いいのかな?
833 :
デフォルトの名無しさん :02/04/20 07:59
>>820 quicksortはO(logN*N)に比例するけど
Top10なら10個の要素のみ記憶して,バイナリサーチで探して挿入するのが
いいんじゃないかのん。計算量がlog2_10*Nに収まるからこっちのほうが
速いのではないかと思われ。
835 :
名無しかも :02/04/20 11:35
fopenは必ず fclose しないといけないんですか? fp == NULL の場合も fclose しないといけないんですか?
オープンに失敗したら閉じなくてもいいだろ。
NULLの場合はfcloseしてはいけません
>>838 例えば、FreeBSDの man fclose によると、
fclose() does not handle NULL arguments; they will result in a segmentation violation.
だそうです。
840 :
835じゃないけど :02/04/20 12:33
実行時の効率を最優先するCのライブラリはそういったNULLの 確認を基本的にはやってくれないんですよね?
Cはコードに書いていないことは基本的に何もやってくれません。 すべてプログラマの責任です。
/* 2行目なんか変だけどまあいいや */
>>840 ごめん、
>>839 だけでは情報不足でした。
fclose() does not handle NULL arguments; they will result in a segmenta-
tion violation. This is intentional - it makes it easier to make sure
programs written under FreeBSD are bug free. This behaviour is an imple-
mentation detail, and programs should not rely upon it.
fclose()は、NULLが渡されても無視します。だって、NULLにアクセスしようとすると
セグメンテーション違反になるんだもん。ちなみに、これはワザとやってることで、
FreeBSDで動くプログラムでセグメンテーション違反を発生させにくくするためなのよ。
このfclose()の動作はおまけ機能みたいなもんなので、これに頼らないこと。
なので、FreeBSDは一応fclose()がNULLチェックしてくれるみたい。
double freeと似た様な状態になるのね。
845 :
デフォルトの名無しさん :02/04/20 13:03
自作ヘッダファイルの使い方が良くわかりません。 関数宣言をぶち込めば良いんですか?
>>845 本読んだり、人のソース読んだりしてみてください。
オブジェクトファイルに含まれない全ての情報をぶち込んでください
>>845 おれは、他のファイル(*.c,*.h)から参照される可能性がある
・プロトタイプ宣言
・定数定義
・構造体定義
などをぶちこむようにしてる。
>>845 関数と変数宣言以外は皆書けってことだな。
850 :
デフォルトの名無しさん :02/04/20 14:02
extern "C"
>>851 文字列をコピーするのに使える。
もしくは終端がNULLで終わっているものなら何でも。
>>851 while (a++ = b++); の間違いじゃないか?
>>851 a と bが同じ型だったら、無限ループになるような。。。
どっかで止まるんじゃない? 文字列だったら '\0' を通りすぎた後とか。
while (a++ = b++); だと non-lvalue in assignment で コンパイルできねっす(gcc)。
while(*a++ = *b++); の間違いでは?
>>858 なるほど、ようやく意味がわかりました。
元URLはコレの間違いなんですかねえ。
>>858 それの間違い以外にちょっと考えられないけど、
アスタリスクの抜けに、代入と比較の取り違えの
2個所も間違ってると、なにかあるんじゃないかとかんぐってしまう…
良くわからんが、 「非0→真」「0→偽」 というのを暗黙的に使うなと言う説明のために 適当に書いた、特に意味の無いコードなのかもしれん。
>>858 こういうのは?
int strcmp(char *s, char *t){
while(*s++ == *t++);
return *s - *t;
}
元記事はC++らしいね。 省略なしで書くと↓ってなってる。 while(true == (a++ == b++)){ /* do nothing */ }
こんなんでいいですか? void eztopsort(void *base, size_t nmemb, size_t tnum, size_t size, int(*compar)(const void *, const void *)){ int i, j, mi; char *bp, *tmp; bp = base; tmp = ezmalloc(size); for(i = 0; i < nmemb * size && i < tnum * size; i += size){ for(mi = j = i; j < nmemb * size; j += size){ if(compar(bp + mi, bp + j) > 0) mi = j; } memcpy(tmp, bp + i, size); memcpy(bp + i, bp + mi, size); memcpy(bp + mi, tmp, size); } free(tmp); }
866 :
デフォルトの名無しさん :02/04/20 16:33
>>861 でもcoooolってかいてあるしなぁ。。
ezmallocは、確実にメモリを確保できると仮定したmalloc
>>864 言われてみればそういう気もするが、
なぜかうちの gcc(2.91) では s と t が同じでも動く。
何故だ。
>>868 同じ時の戻り値は?
変数の外側のメモリにまでどんどんアクセスしてってそのうち一致しただけじゃないの?
870 :
デフォルトの名無しさん :02/04/20 16:43
>>868 segvらないでどうにか動くのは まぁ ともかく、それで結果(戻りのint)も正しいのかい?
>>868 書き込みしてないから一応動くんじゃない?
↓ここを変更すると正しく動くと思うけど。
return *(s-1) - *(t-1);
872 :
デフォルトの名無しさん :02/04/20 16:44
ime.nu 経由じゃこのスレ見ないだろうから、だれか本人にメールできいてみてくれw 関連記事はなかなか素晴らしいし、きっとデキる人なんだろうと思う。
下二行は間違い。
874 :
デフォルトの名無しさん :02/04/20 16:45
>>871 > 書き込みしてないから一応動くんじゃない?
んなーこたないだろ
中身が同じだと最低確保した1バイト先までアクセスする部分に目をつぶったとしても、 中身が同じでも0が返らないから使い物にならない。
>>869 >>870 戻り値はちゃんと 0 になる。
何で動いてるのかわからん、暴走するはずだよな。
つうーかお前らもコンパイルして下さいよ。(W
/* 中身が違う場合だけ使って下さい 中身が同じ場合の結果は不定です。 */ int strcmp(char *s, char *t){ while(*s++ == *t++); return *(s-1) - *(t-1); } これでよし。
879 :
デフォルトの名無しさん :02/04/20 16:57
>>878 関数名はstrcmp_にすべきだ。
で、
#define STRCMP(s1,s2) ((!strcmp(s1,s2)) ? (strcmp(s1,s2)) : (strcmp_(s1,s2)))
これでよし。安全。
868 は標準関数と名前がかぶってるので実際は変えてあります。 一応直しとく。 int strcmp(char *s, char *t){ while(*s != '\0' && *t != '\0' && *s++ == *t++); return *s -*t; } 直ってなかったら誰か直して(他力本願モード)。
881 :
デフォルトの名無しさん :02/04/20 17:07
もういいよ。ネタはだしっぱで放置しようやw
>>880
何か本題とエラくはずれてしまった。
>>885 *s++ == *t++がfalseでwhile抜けた時は、return *(s-1) - *(t-1);
887 :
デフォルトの名無しさん :02/04/20 17:20
intをcharに変換する標準関数ってありますか? (atoiの逆)
itoa,sprintf
itoaは標準じゃないかも。
890 :
デフォルトの名無しさん :02/04/20 17:22
snprintfは新しいコンパイラにしか入ってないかも。
892 :
デフォルトの名無しさん :02/04/20 17:26
sprintfは危険かも。DQNかも。
みなさんお答えありがとうございます。 早速試してみようと思います。
895 :
デフォルトの名無しさん :02/04/20 21:32
CString::Format
CStringは標準じゃないかも。
897 :
デフォルトの名無しさん :02/04/20 22:07
std::stringstream::operator<<(int) と std::stringstream::str()
898 :
デフォルトの名無しさん :02/04/20 22:12
まああれだな、 %d とかの書式で出力すること自体時代遅れだしな。
∧_∧ ( ´Д`) <はぁー・・・ / \ _ | | | |_..∬ |\ ̄ ̄ ̄ ̄ ̄ ̄ 旦.\ ./..\\ \ / \|=================| \ ノ 900 \
901 :
デフォルトの名無しさん :02/04/21 02:38
>>887 char a;
int n;
a = (char)n;
902 :
デフォルトの名無しさん :02/04/21 02:38
ちょうどいい話題なんで便乗質問。 intの値を引数として渡すと、文字列に変換して返す関数ってC(もしくはC++)にはないのかな? 結構調べてもみつからなかったんで。 ないとしても、どうしてないのかな?
しいてあげるなら _itoa() だがこいつはANSIじゃないからな。 つーわけでない。自分で作るよろし。
俺が作った符号無し整数をb進文字列にするitobならあるが
>>902 1. sprintfが有るから。
2. 標準になくても、多くの処理系に入ってるから。
3. このくらい誰でも作れるから。
>>903 レスありがとう。
マニュアル見ました。
javaでいう String.valueOf(int) みたいな簡単なのってないのね。
でもなんで標準でないんだろう??
そっちのほうが気になる。
必要なものは自分で作る これCの常識
>>902 4. C++だったら演算子のオーバーロードが有るから。cout << 774 とか。
あー、なんとなくわかってきた。 たとえば char* IntToStr(int i)という関数をつくったとして、 その中でとったchar*の領域は誰が開放するの? って理由からなのかな?ぜんぜん違う?
>>910 そういう関数の主な実装で例を挙げると、
printf("%s,%s\n",intToStr(1),intToStr(2));
の結果が保証されない。
vc++のitoaで同じ事やると、1,1が表示されます。
これを回避する為に毎回mallocすると、楽しい事になります。
素直に void IntToStr(int i,char *p, int max_len) みたいな形で作るのがよいかと。
>>912 それじゃあsprintf使えばいいじゃん。
>>911 うーん、よくわからないです。
なぜ保証されないのでしょう?
>これを回避する為に毎回mallocすると、楽しい事になります。
メモリリークするってことですよね?
char *str;
str = intToStr(1);
free((void *)str); //書き方まったく自信なし
こういうようにしなければいけないから標準ライブラリ(っていうのかな?)
にはないのかなと思って。
>>913 うん(w
915 :
デフォルトの名無しさん :02/04/21 04:16
C++でいいならstd::stringで返せばいいし、前にちろっと書かれた stringstreamを使っても良い。スレ違いになるけどな。
>>914 保証されないのは
sprintf(str,"%s %s\n",_itoa( a, buf, 10),_itoa( b, buf, 10) );
とかした場合かな?
関数の呼ばれる順序が規定されていない?のと、
両方とも同じポインタを返すために後者の結果のみが反映されるせいでしょ。
sprintf(str,"%s %s\n",_itoa( a, buf1, 10),_itoa( b, buf2, 10) );
なら問題ないかも。
なんでitoaが標準ライブラリにないかは分からんなぁ。K&Rにでも聞いてくれ。
917 :
デフォルトの名無しさん :02/04/21 06:44
itoaをつくるとltoaやftoaも作らなければならなくなるからじゃん。 sprintfならそれら全てをこなしてくれるのに。
>>917 テンプレートの偉大さを痛感するとき・・・ってテンプレートじゃ対応しきれないなw。
919 :
デフォルトの名無しさん :02/04/21 11:12
>>918 できますよ。一例をだすなら boost::lexical_cast<T>(num);
数値->文字列なんて、まともな設計をしとけば UIでデータを出力する部分にしか使わないでしょ。 (ほとんどの場合ね) プログラムのうち、最後の方でチョビット呼び出せばいいだけなんだから sprintf系の関数で十分。 加工もしやすいし、それほど動作も遅くない。 それ以外で、どうしても全体の速度に影響するような場面でitoaみたいの を使いたいときは、高速なitoaを自分で実装しよう。 桁数に応じて動的にメモリを拡張するお気楽 itoa(でも遅い。解放が面倒) 桁数は固定だけど激速のitoa(桁あふれのチェックをはずすとメモリ破壊の気可能性) 桁数を指定して固定長バッファに書き込むitoa(桁数をスタックに積んだり桁数チェック する分若干の速度低下) 要求される速度、安全性に応じて、いろんなバージョンが考えられるから やっぱすきなの作れ。
>>916 sprintf使うならはじめっからそこで書式指定しろよ...
俺も基本的には sprintf だな。 1文字とか2文字に限定される場合は、'0'を 足したりするかも。 x &= 0xf; ( x > 9 ) ? x + 'a' - 10 : x + '0'
924 :
デフォルトの名無しさん :02/04/21 15:34
新スレきぼーん。 俺が立ててもよいが、名前が思い浮かばん。 ただ"日下部陽一"とかくだけではだめなんだよな?
金融プログラマー日下部陽一 うーん、ちと長い?
intに、カンマをつけた文字列に直す関数、てのが結構欲しいんだが そういうのってない? 9654403 を 9,654,403 に変換するやつ。sprintf()では無理だし。
自分で書くよろし。
>>928 sprintfで文字列に直してからカンマを挿入すればすごく簡単じゃない?
>>851 858 の指摘が正しいです。ごめんなさい
sprintfがバグります。 同じソースをUNIXのgccでコンパイル→UNIXで実行すると動くのに、 Borland C++でコンパイル→WIN98で実行すると その後の入力が全部壊れてしまいます。 これってプログラムが間違ってるってことでしょうか?
>>932 >これってプログラムが間違ってるってことでしょうか?
そうです(断言)。
fwrite関数で,構造体を保存して,fread関数で読みこもうとしたんですが, ソースファイルの検索 CRT0.Cのパスを入力してください とでます。 保存したファイル名は,name.datなんですが。
>>936 すごいことになってるなぁ。
とりあえず解決できそうにないけど、OSとコンパイラ何?
OSはWindows98で、 コンパイラは,VC++6.0です。 ファイル軽いから,UPしたほうが早いですかね?
>>938 そのエラー、ビルド時に出るんじゃなくて、実行時にでるの?
なぜだーーー
まぁ、短いならUPしてちょ。
つか、デバッガのステップ実行でおこってるような‥‥
あのー
943 :
デフォルトの名無しさん :02/04/23 23:54
やっぱりスレの1は日下部先生じゃないとビシッとしないな。 次スレの1でD.リッチーとかやるなよ。スレがダレルからな。
>>940 ほんとだ。こんなの出るのか。
とりあえず、
printf("sizeof(Kou)=%d\n",sizeof(Kou));
printf("sizeof(struct tag)=%d\n",sizeof(struct tag));
printf("sizeof(Kou[0])=%d\n",sizeof(Kou[0]));
これ入れて、結果を吟味するべし。
>>938
俺だけのエラーじゃなかったか。 どこか問題ありますかね? 上の3行を入力してみましたが、どう吟味すればいいんでしょうか? とりあえず、疲れたんで今日は寝ます
946 :
デフォルトの名無しさん :02/04/24 00:21
fwrite(&Kou,sizeof(Kou),3,fp); fread(&Kou,sizeof(Kou),3,fp); &Kou → Kouでなくて?
>>946 一応、そこは特例で大丈夫。個人的には気持ち悪いけどね。
printf("Kou = %p\n",Kou);
printf("&Kou = %p\n",&Kou);
>>945 その3行が何をしているのかと、結果がどうなったのかを吟味する。
949 :
デフォルトの名無しさん :02/04/24 02:53
C言語における、「再利用性」とは何かのべれ
950 :
デフォルトの名無しさん :02/04/24 03:12
>>949 コピーペーストをすることで、ある機能を簡単に別の処理で
再利用できる。
…でも、そんなことしちゃだめ。
>>949 Cなら機能(関数)をライブラリとして再利用できる。ってとこか。
今じゃ普通の機能だが、当時は画期的だった。
>>937 朝起きてから,よーく考えて,苦手なCreateFile関数,WriteFile関数を勉強して,
なんとかちゃんといくようになりました。
宿題手伝ってるっぽいな
CreateFile関数とWriteFile関数を使って,バイナリデータとしてじゃなく、 ファイルに直接書きこむ事はできるのでしょうか?
>>954 はぁ?
ファイルの概念に対する理解が根本的に違うっぽいぞ
WriteFileは改行の変換などはやってくれないので、 そこは自分で配慮する必要がある。 なお、「ファイルに直接書きこむ」はやや意味不明瞭なので、 この「直接」の意味がはっきりするまでは何ともいえない
すんませんでした。 テキストファイルとして,書きこめるのでしょうか?
>>955 まるで COBOLer さんのようだよね
pPD=(struct daaaa *)malloc(sizeof(struct daaaa)*iLine); こんな感じでmallocしたのですが、n番目の構造体にアクセス するにはどうすればよいでしょうか。
pPD[n-1]
あぁっ!レスありがとうございます。早速試してみます
保全
ESCコードを使ってコマンドプロンプト上に 色つきの文字を出力したいんです。ただし OSはWindowsXP,コンパイラはLSI-C86(試食)。 (Win98の方は確認済) 実際にやってみると printf("\x1b[34m hoge"); /* blue */ printf("\x1b[2J"); /* clear */ ESCの部分が改行記号(半角)になって しまいますが、やはり不可でしょうか? (どれかのWin Ver. 以降, DOSが変わったと 聞いたことがあるんですが。) よろしくお願いします。
>>964 Win2kのpromptコマンドで実験。やはりESCは改行に。
DOSとコンソールは違うと言う意味を理解した瞬間でした。
>>965 (´ヘ`;)ハァ?
ANSI エスケープシーケンスを使いたいなら、
COMMAND.COM の上でも、ANSI.SYS を事前にロードしておくことが
必須だよ。
(;´д`).。oO( ていうか、イタチ飼い )
967 :
デフォルトの名無しさん :02/05/12 20:37
保全age
969 :
デフォルトの名無しさん :02/05/12 21:30
getchで文字列取りたいんだけど 文字以外のキー無効にするのはどうすればいいの? 例えばDelとか。
うめうめ
前スレ 15 は埋めたが、もう20も逝ってるからな。 早く埋め立てよう。
ネタは無いけど埋め。
お手伝い
お手伝いその2
∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ピュ.ー ( ・∀・)< お待たせ〜♪ =〔~∪ ̄ ̄〕 \______ = ◎――◎
, -=〜=―- 、 ミ ヽ 二 ノ ( i 三 ⌒ へ /` | 二 _ _ | 三 ┰ ┰ | l^ ( } ! ヽ / {\ ノ l i ( 、 , ) { ∪、 j | / ̄ ̄ ̄ ̄ ̄ | ‐――――┴、 < sageだこりゃ |  ̄`ー―ァ'′ \_____ \______)
981
982
Σ(゚Д゚;)
∧ ∧ / ・ / ';, / '; / '; 1000 ワショーイ… / ;______/ ; / \ / / \ \ /´ ( ) |____| ( ) | | ///// ( | :| ) ///// | | ( ) :| | ( ( | | ) ( | | ) ) | | ( ) '; / ( ( / \ ) ( \/ ) ) ../ ヽ ........:::
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。