1 :
鼻から悪魔でますた :
03/02/11 13:45
あら、 いつの間に、タイトルに< >使えなくなってたの 鬱
┏━━━ / |━━━━━┓ ┗┳┳━ |_| ━━━┳┳┛ ┃┃ / ヽ ┃┃ ┏┻┻ |======| ━━┻┻┓ ┗┳┳ ヽ__ _ ノ ━━┳┳┛ ┃┃ (/) ┃┃ ┃┃ (/) ┃┃ 凸┃┃ (/) ┃┃凸 Ш┃┃ (/) ┃┃Ш .|| ┃┃ (/) ┃┃.|| ∧_∧ (/) ∧_∧ ∧ ∧ ( ・∀・) (/)(´∀` ) (゚Д゚ ) Part50スレが他に立ちませんように (つ つミ (/)(⊃⊂ ) ⊂ ⊃ |_|_|_I(/)_|_|_|__| | /////ノ,,,,,,ヽ ////|| |〜 //////////// |∪∪ | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | | 奉 納 |
8 :
デフォルトの名無しさん :03/02/11 14:08
おとといK&Rを買いますた 引き続きがむばります
10 :
デフォルトの名無しさん :03/02/11 14:19
11 :
デフォルトの名無しさん :03/02/11 14:25
ネット上にある正誤表をね
14 :
デフォルトの名無しさん :03/02/11 14:33
皆さんはソースプログラム中にデバッグ用の文を組み込んだりしてますか? また、どんな方法を利用しているのでしょうか?
/* コノアタリガアヤシイ ダレカデバッグシロ */
極上のウイルスくれ!
誰だよ、スレタイに < > 使った香具師は・・・
先月デザインパターン改訂版を買いますた 引き続きがむばります
20 :
デフォルトの名無しさん :03/02/11 16:28
むしろ
>>1 以外に<>をスレタイに使うことが出来る奴がいたら、それは神です。
ひろゆきとか。
こないだ駅の階段で派手に転んだ人
24 :
デフォルトの名無しさん :03/02/11 16:52
生き別れの兄です。
25 :
デフォルトの名無しさん :03/02/11 17:39
今まで小さい練習用のプログラムを書いてたんですが、ちょっと大き目のものを 書くようになって気付いたことが。 一つのモジュール内で、やたらと深い&多数のループを回すプログラムを作るとき、 皆さんはループ用の変数をどう確保してるのか、ということです。 今のところint i, j, k, m, l ........てな感じでやってるんですが、なんか無駄が多いような・・・・・ それともこれが最善のやり方なんでしょうか。
for (int i = 0; for (int j = 0; for (int m = 0; for (int l = 0;
こないだ書いたプログラムでほとんどの関数に int i,j,k が必要だったんで グローバル変数で、i j k定義したよ。 //良い子は絶対真似しないこと。
>やたらと深い&多数のループを回すプログラムを作るとき できの悪いの自慢してどうする
>>25 ちゃんと変数名考えて定義しろよ。
それぞれのループごとに意味あるんだろ?
struct { int i:8; int j:8; int k:8; int l:8; } x; for (x.i=0; … for (x.j=0; … for (x.k=0; … for (x.l=0; …
なぜビットフィールドなんか使う・・・
31は貧乏
私の書くプログラムで、(特に)意味のないループ制御変数はicにしている。
iだとインクリメンタルサーチが面倒だと言うのが一番の理由。
で、二重ループは大抵意味があるのでその意味を反映させる。
例えば、ix, iy など。
一つの関数で三重以上のループになることは余りないかな?
その場合も二重ループと同様。
ちなみに、
>>31 のような書き方をすると処理速度はがた落ちになる罠。
>>35 スタックポインタ相対アドレッシングのないCPUでは、自動変数より
グローバル変数の方が処理速度もメモリ効率も上がるだろうね。
>>36 そこまで考えてないと思われ。単なる手抜きかと。
多くのプロセッサでは、自動変数でループカウンタとして使うなら
レジスタに割り当てられる事が多いし。
グローバル変数は、コンパイラの最適化を阻害するケースが多い。
名スレの予感 ∧∧ ミ _ ドスッ ( ,,)┌─┴┴─┐ / つ. 終 了 │ 〜′ /´ └─┬┬─┘ ∪ ∪ ││ _ε3 ゛゛'゛'゛
誤爆
C++のDLLからクラスを動的にインポートすることは出来ないのでしょうか? Loadlibraryでロードしても関数を呼び出す方法しか見当たらないのですが ヘッダもライブラリも無いので何とか動的にリンクしたいのですが
えーっとそれから 環境はVC++でwin32です
失礼しました
>>26 それは C++ だ!
>>28 int i;
void foo(int *array, int size) {
for(i = 0; i < size; ++i) {
printf("(%d\n", i);
bar(array[i], size);
printf("%d)\n", array[i]);
}
}
void bar(int elem, int size) {
for(i = size; i >= 2; --i) {
printf(" %d: %d\n", i, elem * i);
}
}
で、どうするよ。
>>29 行列とか扱ってるとどうしても深くなってしまうこともある。
>>25 でも、そういうのでなければ関数に分けたりして
ループを浅くするのがよい。
C99うぜーーーーーーーーー!!!!!!!!!! 配列の大きさの指定には変数は使え ないとかsnprintfは標準関数じゃないとかいうと厨房扱いされるんだぜ。 まじうぜーーー!! こんな時代遅れな言語は新たに規格を策定しなくてもよかったと思うんだけど。
変なところで改行しちまった
>>44 ==46?
C99が必要無いと思うのは勝手だけど
自分のミスを規格のせいにしてはアカンよ
>>48 「〜は使えない」→「C99ならデキルヨ!アナタシラナイノ?ぎゃは」
とかいう会話がまじうぜーーーのではないでしょうか?
>>46 いやまあ、現状C99を実装してる処理系ってほとんどないだろうし、
移植性を考えたらC99の機能はまだ使うべきではないだろう。
いまだに
void afo(mona)
int mona;
{
/* */
}
式の関数を定義する場合もあるわけで。
ただ、Cの機能じゃないと言い切っちゃうのは、さすがに嘘だと思ったんでな(w
>>50-51 いや、俺もC99の環境は持ってないし
多分、実装された環境を手に入れる事は暫く無いだろうなと思うし
たま〜に、ウザイと思う事はあるよ
でも、Cの規格にC99があるんだから、しょうがないじゃん
教える時や、間違えを指摘する時に
釣りでも無いのに、C99の規格の事を忘れてはアカンと思うのよ
まぁ、別に争う気は無いので、ここら辺で
でも、いかに C89 とかが obsolete だとしても、それと C99 とはあくまで 区別するのが今の風潮じゃないか?
カーニハンとリッチーはC99対応のプログラミング言語C第3版を出すつもりはないの?
>>51 あなた、
>>45 じゃないですか?
えーと、C99 でできるのは知ってましたが、
>>53 のようなスタンスで書いちゃいました。
C99 なんていらんわ! とかいうつもりはないです。
というか、むしろ普及してくれた方が嬉しいです。
でも、実際の現在の普及率を考えると、
「あー、そういうことできるんだ」と思って試した人が
「できねーじゃんかYO!」となるのは必至なので
別物扱いしておいた方が妥当なんでは、と。
質問スレではあげ足取りの定番になってる感もあるしなー
>>55-56 本当はC99スレを立てるのが良いと思うけど
ただでさえC関連スレは乱立してるから
反発の方が多そうなので現状維持で仕方ないかと…
「『ビル・ゲイツ』と『ビル・ジョイ』ってどっちが強いの?」
60 :
デフォルトの名無しさん :03/02/12 16:41
struct a{ char A1; char A2[3]; int A3; }A; struct b{ char B1; char B2[3]; int B3; }B; 上記のように複数個の構造体があったとして 同じファイルにバイナリでライトしたいのですが いかようにすればよろしいのでしょうか? 引数の記述方法がよくわからずコマっております。 御教授お願い致します。
メモリの内容なら"wb"付きfopenでオープンした ストリームにfwriteで書き込める。
C99が型チェックに厳しいなら使ってみたい気もする
>>61 サソ
アリガd
質問のしかたが悪かったでし、、、
構造体を丸ごとドカンと
書きこみたいのっす。
スイマソン
再度の御教授を〜
windowsXPでCやるのはどうやったらいいんでしょう? コンパイラは、gccっていうのをどうやって入手するか分かりません。 borlandのなんとか55っていうのはできたけど、.exeになったけど、 ひらくと、有効なwin32アプリケーションではないって言われて実行できません。
struct { char c; int i; } a; int main() { fwrite(&a, sizeof(a), stdout); return 0; }
66 :
デフォルトの名無しさん :03/02/12 17:56
C99って使っている人多いですかね?
67 :
デフォルトの名無しさん :03/02/12 17:57
>>64 ボーランドのなんとか55で
何をやったらそうなった?
69 :
デフォルトの名無しさん :03/02/12 18:05
Borland C++ Compiler 5.5
>>68 すみません。できました。意味も無くobjふぁいるにilink32施してました。
でもなんでobjとか出てくるんですか?
分割コンパイル
72 :
デフォルトの名無しさん :03/02/12 19:56
関数に渡す引数の型の種類によってその型を使用する処理を 行う関数を作りたいんですが、そんなことできますか?
template <typename T> void func(T& t) { //... } void func(wchar_t* pt) { //... }
>>72 C++で関数の多重定義を使え。
もしくはvoid *で渡しておき、パラメータで切り替える。
void func(void *p, int i)
{
double d;
switch (i) {
case 1:
d = *(double *)p;
break;
]
}
76 :
デフォルトの名無しさん :03/02/12 20:14
おーなるほど。 これ以外のうまい方法はないんでしょうか? あとC++はできないんで、Cでお願いします・・
ばーか!気合で何とかしろ
>>76 ないから関数名に型名を付加しろ。
C++の関数のオーバーロードも内部では同じようなことをしている。
79 :
デフォルトの名無しさん :03/02/12 20:21
>>79 > これ以外のうまい方法はないんでしょうか?
>>76 別にC++の全ての機能を使わなければならないというわけじゃないでしょ。
C++の機能はオーバーロードだけ使って、あとはCの機能だけで書けばいいでしょ。
それとも、C++コンパイラがないとか??
typedef enum { TYPE_CHAR., TYPE_INT, TYPE_LONG ... } VTYPE; void func(VTYPE vt, ...) { va_list arg; va_start(arg, vt); switch (vt) { case TYPE_CHAR.: ... } va_end(arg); }
ありがとうございます。 色々試してみます
84 :
デフォルトの名無しさん :03/02/12 21:05
悪いことはいわないから妙なことせずに 関数名の違う関数を用意しる。 #define で展開してもいいが。
85 :
デフォルトの名無しさん :03/02/12 22:35
int swap0(int *pa0,int *pb0){ int t; t=*pa0; *pa0=*pb0; *pb0=t; } すいません、これって何をしているのですか?
>>85 swap()の名前そのままの通りの事をしている。
*pa0と*pb0が指すintの値を交換している。
>>85 関数の方は void にすべきだと思う。
90 :
デフォルトの名無しさん :03/02/12 22:42
普通unionを使うものだと思ってたが。 typedef struct { enum {INT, FLOAT} type; union { int i; float f; } v; } giko_t; void sii(giko_t g) { switch (g.type) { case INT: :
>>88 それを言うなら「関数の型は」ではないかと。
#っていうか、関数の値って何さ。void型には値はないっしょや。
>>92 そうとも言う。
スマンそれが正解。どっから方が出てきたのか自分でも不思議だったんだが
型と変換しようとしてミスったんだな…。
94 :
デフォルトの名無しさん :03/02/13 01:38
void * 型ってどういうときに使うのかよくわかってないのですが、
>>74 みたいに使うのが普通の使い方なのでしょうか?
>>94 あくまでおれの考えだが、
>>74 みたいなコードはよくないと思う。
Cにはきっちりとunionという機能があるわけだから。
キャストで解決するのは最小限にすべきだとおれは考える。
んで、void *ってのは型はわからんがとにかくポインタを渡したいときに使う。
具体的にはmallocなんかいい例だ。mallocは言われたとおりの大きさのメモリを
確保してその先頭のポインタを返す関数だが、そのメモリの領域が何の型であるか
というのは事前に(malloc作成時に)は決められない。こういうときにvoid *を使う。
ほかにはmem系関数がよい例だね。 str系関数と違って渡すポインタがchar *とは限らないから、void *にしておかないと コンパイル時に警告が出てしまう。
>>95 >>74 そのままではないが、不特定の型を取り扱う場合
unionだとdoubleに合わせることになって困ることも多い。
なので、
>>74 は(そう言う場合には)妥当解だと思う。
それにしても、
void と void * は別の語にするべきだったんじゃないかと思うんだけどね。
>>97 うん、もちろん特別な場合というのももちろんあってそうする必然性があれば、
>>74 のように書くのも一向に構わないと思ってる。ああいう風にしか書けない
場合もあったりするしね。
>void と void * は別の語にするべきだったんじゃないかと思うんだけどね。
staticもそうだな。可視性と記憶クラスの指定には別の語を割り当てるべきだった。
voidはともかく、staticは変えるべきだったよな・・・ 書く場所によって全然効果が違うじゃないか。 片方はinternにすべきだったと思う。
void=型がない void *=指す型がない だからいいんじゃない?
すんごいショボイ話ですが stdio atdlib malloc extern strcomp これらをなんて読んでますか?俺は↓のように読んでますが・・・ stdio.h → ストゥディオエイチ stdlib.h → スタドリブエイチ malloc → マロック extern → イクスターン strcomp → ストルコンプ 間違ってると恥ずかしいのであまり他の人には言えません。
>>101 またクダラネーけど盛り上がりそうな話題を(w
stdio → えすてぃーでぃーあいおー or すたんだーどあいおー
stdlib → えすてぃでぃーりぶ or すたんだーどりぶ
malloc → えむあろっく
extern → えくすたーん
strcomp → すとらこんぷ or すとりんぐこんぷ
整合性まったくなし(w
103 :
デフォルトの名無しさん :03/02/13 04:56
>strcomp 脳内関数か
>>102 malloc以外は同じだな。
まろっく、きゃろっく、りあろっく
>>101 stdio.h → スタンダードアイオーエイチ
stdlib.h → スタンダードリブエイチ
malloc → エムアロック
extern → エクスターン
strcomp → ストアコンプ
strpbrk → ストアピーブレーク(breakかどうか知らんが…
>>103 脳内関数ですたw
みなさんとても参考になりました!ありがとうございます。
個人的に
>>105 のストアコンプがチトカコイイ
strspn これの読み方がわからん・・・ストリングスパンか?
>>107 man strspnしてみたら
NAME
strspn - span a string
とかいってるんで、それであってますな。
うち(Linux)のman 3 strspnには NAME strspn, strcspn - search a string for a set of characters と書いてある・・・(しょぼーん) 説明のどこにもspanなんて単語はないし。書けよヴォケ
ストリングのストリじゃなくストラとよぶ人が 多いのはなぜだろう。俺もなんだが。もっとも、相手により確実に 意味を通じさせることが必要な場合はエスティーアールと発音するけれども。 ちょとすれ違い気味だが、俺的に今思いついた気になるもの: Windows API: BitBlt びっとぶろっと?びっとぶりっと?びっとぶろっくとらんすふぁ? UNIX commands: sed せど?えすえど?えすいーでぃー?すとりーむえでぃた? ar あー?えーあーる?あーかいぶ? wc だぶるしー?わーどかうんと? tr てぃーあーる?とらんすりたれーと?とらんす? od おど?おーでぃ?おくたるだんぷ? rm あーるえむ?りむーぶ? mv えむぶい?むーぶ? chown ちょうん?ちぇんじおーなー? 等など。UNIXコマンドは類挙にいとまが無いな。いくらでも続けられる。
>>104 > まろっく、きゃろっく、りあろっく
なぜ「りーろっく」じゃない?
>>110 > BitBlt びっとぶろっと?びっとぶりっと?びっとぶろっくとらんすふぁ?
Windows APIというより画像処理用語だがビットブリットでいいはず。
mallocの読み方にこだわっても、ま、ろくな事は無いな。
( ´д)ヒソ(´д`)ヒソ(д` )
まぁ他の香具師とプログラム系の話ほとんどしない香具師なんで参考にならんと思うが。
>>101 stdio → すとぅどぅあいおー || すたんだーどあいおー
stdlib → すとぅどぅりぶ || すたんだーどりぶ
malloc → まろーく
extern → えくすたーん
strcmp → すぅとぅるこんぷ || えすてぃーあーるこんぷ
>>110 BitBlt → びっとぶると
sed → せっど
ar → えーあーる
wc → だぶりゅーしー
tr → てぃーあーる
od → おーでぃー
rm → りむーぶ || あーるえむ
mv → むーぶ || むぶ
chown → しーえいちおうん
117 :
デフォルトの名無しさん :03/02/13 15:44
質問っす。 fwrite()に関してなんすけど 形 式 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); この第3引数の"size_t nmemb"ってなんじゃーい? たとえば struct chinko { int a; char b; char c[9]; } HOGE; ってな構造体をfwrite()するには fwrite ( &HOGE, sizeof(HOGE), ??, fp); この第3引数は構造体のメンバの数、つまり"3"って 記述するの?
>>117 違うっす。書き込みたい構造体の数っす。
1つだけ書き込みたいなら1。
getcとputcで全て代用出来るジャン この2個で十分だZE!
ハハハ!!!
>>101 stdio → すたんだーどあいおー
stdlib →すたんだーどらいぶらりー
malloc → めもりーあろけいと
extern → えくすたーん
strcmp → すとりんぐこんぺあー
str-をストレングスとか言ったころが懐かしい。
>>117 number of memory blocks.
つまり、sizeバイトのメモリブロックを何個書くか。
正常に書きこめた場合、fwrite()の戻り値はnmembに等しくなる。
#けどバッファリングされるので、実際の書き出しは保留される可能性があるので注意。
fwriteの第二引数は1でいいよな
>>119 俺もgetc, putcが一番好きだな。。。そう効率が悪いものでもないし
stdioの関数およびマクロ群の中で、或る意味では一番問題が少ない。
# MultiThread環境では効率上大問題だが
fwrite/freadはwrite/readを元にしているのにインタフェース的に
より不格好になっているし、何回read/writeが実行されるかわからんとか
そういう所が好きじゃない。
while ((n = read(0, buff, sizeof(buff)) > 0)
write(1, buff, n);
は端末が標準入力である場合、適切に行単位の入力をこなしてくれるが
freadでは指定したバイト数を必ず読み込もうとしてしまう。
>>124 >俺もgetc, putcが一番好きだな
>freadでは指定したバイト数を必ず読み込もうとしてしまう。
素朴な疑問だけど、ストリーム系と低Lvを混在させるの?
それともgetcで全てを賄うの?
outb() inb()マクロ 使いなよ
127 :
デフォルトの名無しさん :03/02/13 18:23
BCDコード(2進化10進コード)を使いたいのですが。 どうすればよろしいでしょうか?
fread fwrite は ストリーム系ジャン
>>127 BCDコードライブラリをどこからか探してくる。
131 :
デフォルトの名無しさん :03/02/13 18:36
プログラム内で環境変数に値をセットして、呼び元で その環境変数の値を使用したいのですが、 どのようにしたら良いのでしょうか? このプログラムは、cshから実行し、 そのcshでその環境変数を使いたいのです。 よろしくお願いします。
>>131 Unixなどでは親プロセスの環境変数は換えられません。
そして擦れ違い。
>>130 レスありがとうございます。
しかし、どこにあるのでしょう・・・。
検索してみましたがひかかりません><
>>125 勿論「同一のファイルに対しては」混在させない。
getc/putc以外は「嫌いだ」と云ってるだけで、使わない訳ではないよ。
少なくとも*printfは、(Cでは)必要だろう。
printfこそCの関数の代表だ。
プリント腐
printfでは'\0'を出力できない。 よって fputc>>>fprintf
>>138 fprintf(f, "%c", 0);
>>138 出せますが。
printf("%c", 0);
printf("'\\0'");
Ruby>>>printf≧VB
143 :
デフォルトの名無しさん :03/02/13 21:07
配列の[ ]の中に変数を入れることは不可能なのですか?
という質問をしようとしてこのスレに来て、
>>1 のリンク先を読んでみたのですが、
>>配列の大きさはコンパイル時に定数でなければならない。
ここらへんですか〜。
初歩的で申し訳ないですが、アドバイスお願いします。
>>134 「同一のファイル」というのを勝手に「同一の(ソース)ファイル」
と脳内補完してしまって、一瞬(゚Д゚)ハァ?と思ったのはナイショだ(w
>>143 実行時に配列の大きさを決めたいってことか?
たとえば(これできないけど)
void func(size_t s) {
char a[s];
}
みたいなことやりたいとか?
だったらmalloc使いな。
>>145 どのように使えばいいのでしょうか?
初歩的で申し訳ないですが、アドバイスお願いします。
>>143 そんな貴方にalloca()
ご利用は計画的に
サンクスです♪
具体的には、
デバイスの数をまず調べ、その数だけ文字列を用意して、
ひとつずつデバイスの名前を入れていく感じにしたかったんです。
char device[デバイスの数][32文字];
みたいに。
リロードしてビックリ。
>>146 は誰?
まぁいいかー。
149 :
デフォルトの名無しさん :03/02/13 21:26
>>148 あなたこそ誰?
成りすましは勘弁して。
(笑 こんな初心者を騙って何のメリットあるんだ〜。
gt;gt;149のって何ですか??
( 笑 < リフレク! ポワン
どこかで数を取得し、その数だけ配列変数を用意するという場面は、 よくある気がするんですけどね〜。どうなんでしょうか? mallocも調べてみましたが、ちょっと難しそうです・・・。
じゃ、newでもしとけ
printf = プリン・豆腐
157 :
デフォルトの名無しさん :03/02/13 23:57
C99ならstaticで(ry
int func(int size) { int *a; a = malloc(sizeof(int) * size); /* 処理 */ free(a); return 0; } エラーチェック無しだけど基本はこんなでいいんだよね?
できれば a = (int *) malloc(sizeof(int) * size); だね。 後、私は癖で if (a) { free(a); a = NULL; } とするかな。
C++でもキャストしないといけないはず。 C++でmalloc使うのもどうかと思うけど
165 :
デフォルトの名無しさん :03/02/14 01:02
>> 101 亀ですみませぬ。 stdioすたんだーどあいおー atdlibすたんだーどりぶ mallocまろっく externえくすたーん strcompえすてぃーあーるこんぷ まんまですね(苦笑) 正しいのかは知らず。
>>164 こんな感じ。
int* a = new int[size];
// 処理
delete [] a;
vector <int> a(size); というのもある。 delete 書かなくていいんで楽。
malloc をエムアロック、 realloc をリアロックと読むのに、 calloc をコーロックと読んでしまう…
extern → えっくすタン
malloc マロック calloc カロック realloc リアロック
ありがとうございます♪ さっそく試してみますね。
>>159 free(NULL);は正常に動くぞー(つうか害は無いぞ)。
まあ癖ってんならしょうがないか。
stdio.h → エスティディアイオーヘッダ stdlib.h → エスティディライブヘッダ malloc → マロク calloc → カロク realloc → リアロク extern → エクステン strcmp → エスティアールコンプ
>>174 ライブってのは初めて聞いた
リブとかライブラリならよく聞くけど
2次元のcharを扱いたいのですが、 char moji[size1][size2]; そういう場合、intをcharに置き換えるだけではだめですよね。 応用力なくて申し訳ないです。
char **p;と宣言して、char *とcharの配列を動的につくる。 int i; p=malloc(sizeof(char *)*size1); for(i=0;i<size1;i++) p[i]=malloc(size2);
本気なのかネタなのか判断に迷うところだ…
もしくは、1次元配列を2次元配列かのように扱うか。 #define INDEX2(i, j, size) ((i) * (size) + (j)) #define MALLOC(type, size) (type*)malloc(sizeof (size) * (size)) p = malloc(sizeof (char) * size1 * size2); /* char p[size1][size2]; みたいなもの */ /* こんな感じで処理 p[INDEX2(i, j, size2)] = i * j; (p[i][j] = i * j; に相当) */ free(p);
いくらなんでもネタだろう。 ていうか、漏れは二次元以上の配列は使わないな。 全部一次元で代用。 楽だし…
MALLOC 消すの忘れてた。 しかも間違えてるし。 #define MALLOC(type, size) (type*)malloc(sizeof (type) * (size)) ~~~~~ だな。
ネタ? なんか間違っているかな(^_^;)
186 :
デフォルトの名無しさん :03/02/14 02:04
初心者なんですけど…わからないよ〜。簡単なコトらしいんだけど… どーかあたしに愛の手を。m(_ _)m #include<stdio.h> #define AST "********************" #ifdef NEW void main(void){ int i,j,k=1,n; printf(" n = "); scanf("%d",&n); for(i=1; i>=1 ; i+=k){ printf("%*.*s\n", n+1, i*2-1 , AST ); if(i == n) k= -k; } } #endif でビルドするとエラーが2個でます。 >LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です >Debug/rennsyu21.exe : fatal error LNK1120: 外部参照 1 が未解決です。 たぶんプリプロセッサあたりをなんかどーかするんでしょうけど、わかりません。 誰かよかったらお教えくださいませ。
187 :
デフォルトの名無しさん :03/02/14 02:06
calloc コーラック
>>178 まぁ、その配列をソートすることがある場合や
ジャグ配列を作りたい場合はそうするね。
そうでない場合は鬱陶しい上に解放が面倒なので
あまり使わないんじゃないかな。
使うときは便利なんだけどね。
>>186 NEW が定義されてないから
#ifdef から #endif までが無視されて、
main が無くなってエラー。
>>185 俺がネタと言われてるんじゃないですか〜。
嫌な思いをさせてしまって申し訳ないです。
はじめたばかりの初心者なので、ものすごいこと言ってるかもしれないです。
1次元で代用する方法を考えてみますね。
int mainじゃないと駄目って事かな?
>>187 calloc は 0 クリアを伴うから malloc とは別物ジャン。
>>186 ??=ifdef NEW
↑何の為にやってんの?
ここではじかれてるだけじゃん。
釣られた?
うおおお!ありがとうございます。試してみます>ALL
ちょっとこの場合では的外れだた(-_-;)
ちなみに void main は別に使って悪いものではない。 例えば、終わらないプログラムは void main で良い。
あ、そうか。size2の値が常に同じならば別に
>>178 のようにしなくてもいいのか。
>>190 はわわ〜。うぐぅ。
実は、NEWの定義の仕方がわかりません〜〜エーン
#ifdef NEW
のあと、どう記述すればいいんでしょうか?
ヘルプミ〜
>>198 もしかして、
??=ifndef NEW
??=define NEW
みたいに したいのか?
>>198 ネタですか?
#ifdef NEW
を書いたのは自分じゃないの?
用が無いなら消せばいいし、どーしてもつけておきたいならその前に
#define NEW
とか書いておけばいい。
>>199 ??= って一瞬何のことかと思ったぞ。
# が書けないキーボードを使っているのか?
例えば、VC++なら mainは mainCRTStartupから呼ばれるが、 voidだった場合はどうなるんだろう?
じつは〜、正直に言いますと、 私は学生で、学校から配布されたソースを書いてビルドしているだけです。 だから、もーわけがわからない状態でして…それでこのスレに逃げ込んできました。 少々、長くなりますが( 大体2スレ分くらい )そのソースを部分じゃなく、 全部をアプしてもかまわないでしょうか? 2スレ分を容量をとることになるのですが・・・ あつかましくってすみません・・・・
>>202 たまたま eax に入ってる値が返るんじゃない?
( ´д)ヒソ(´д`)ヒソ(д` )
2スレ分って! モノスゲェ量じゃねぇかよ! 1-1000までを2つ分!?
たのんます、相談にのってくださいまし〜〜〜〜m(_ _)m #include<stdio.h> #define AST "********************" #ifdef NEW void main(void){ int i,j,k=1,n; printf(" n = "); scanf("%d",&n); for(i=1; i>=1 ; i+=k){ printf("%*.*s\n", n+1, i*2-1 , AST ); if(i == n) k= -k; } } #endif /* つづきます */
extern "C" を使わずに C++とリンクするには どうしたらいいですかね? なるべく複雑でないやりかたで教えてください。
#ifdef OLD void main(void){ int i,j,k=1,n; printf(" n= "); scanf(" %d",&n); for (i=0 ; i>=0; i+=k){ for (j=0; j<2*n-1; j++){ if(j+1 < n-1 ll j-1 > n-1 ) printf(" ") else printf("*"); } if(i == n-1) k *= -1; } } #endif
#ifdef OLD2 void main(void){ int i,j,k=1,n; printf(" n = "); scanf(" %d ",&n); for (i= -n+1;i<= n-1;i++){ for(j=1; j<=2*n-1 ; j++){ printf( i / (( j<2*n-j)? j : 2*n-j)? " " : "*"); } printf("\n"); } } #endif 以上です。お願いいたします!どうかご教授くださいませ〜〜!m(_ _)m
>>209 素直に extern "C" 使いなされ。
こういう風にできるからさ。
extern "C" {
void foo();
void bar(int a);
int hogehoge(double a, int b);
}
>>208 >>210-211 どれをコンパイルしたいかによって
#define NEW
か
#define OLD
か
#define OLD2
かを、ファイルの先頭あたりで行えば良い。
あのね、今日テストなんだけど、この問題がビルドできなくって困っていたところなんでチュ。 たすけて〜
誰だよこんなソース書いた奴! こんなの参考にしない方が今後の為だゾ! ……。 cc -DNEW source.c とかかな?
#define NEW #define OLD #define OLD2 のどれか1つを #ifdef NEW の前の行に挿入する
>>211 #define AST "********************"
の下あたりに
#define NEW
を入れる、じゃあだめ?
>>208 == >186
先頭に以下の3つのうちどれか1つの行を入れれば動くと思われ。
#define NEW
#define OLD
#define OLD2
つーか「上の3つのうちどれを指定するか」で
「#ifdef〜#endifで囲まれた3つのうちどれを有効にするか」
を決めている訳だが。
乱交会場はここですか?
コンパイルオプションの学習じゃねえの?
おおおおっ!奇跡の予感!
#ifdefの意味知るだけで解決できる問題だと思うんだが。。。
>>212 おそらくC++からCをリンクするのではなく
CからC++をリンクしたいのだと思われ
テストがあるって事は、それに足る講義が行われたはずだよな? 何でコンパイルすらできないんだ?
どんなに複雑でもいいから extern "C" 以外でお願いできませんでしょうか?
な ぜ そ ん な に e x t e r n "C" を 拒 否 す る ?
やったー!!!(^−^)できました! #define OLD2 でできました! いや〜〜〜ありがとうございます!>ALL
>>224 ひょっとしてあれか?
ライブラリはあるが、その中身に手を加えられないってことか?
>>224 アセンブラに出力してシンボル名を書き直したら?
(^−^) 皆様、本当にありがとうございました!m(_ _)m それでは!
#ifndef ぬるぽ #define ぬるぽ 0 #endif
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>230
>>223 A.授業についていけない、おちこぼれだったからです。(^^;
>>232 でもコンパイル作業くらいはわかっただろ?
もしかしてプログラミングなのに実習がなかったのか?^^;
ぬるぽスレ開いてコピペしただけだよ(w リロードのタイミングがよかっただけかも(w
>>235 担当の先生が答えを教えてくれないんですよ…、
自分で勉強しろ、こんぐらい雑魚でもわかる筈だろ…って。
でも私はプログラミングの経験が足りないから、シンプルなところでつまづいて
しまって…、簡単なんだけど、なかなか気づかない、一言で言えば私の勉強不足なんです。
>>237 勉強に関しては自分で勉強するてのは原則ではあるんだが…
質問しにいって答えなかったとかならちと問題ありかも
>>238 先生と乖離している部分があって…先生は簡単なことだから説明を省略してしまったようです。
#defineなんて簡単なことだし。すばらしい先生なんですけど。
でも、確かに簡単なことなんだけどバカのボクにはわからなくって。
家に帰ってコンパイルしてみたらエラーでるし、今日試験だし・・・・
正直パニクッたからこのスレにきました。
先生を すばらしいと 言える あなたは すばらしい。
単発質問スレを立てずにここに来ただけで十分ましだな。
みんな「してやられたぜ!」な気分かな〜と思って。
>>224 何で extern "C" が必要かを知らないクチかな?
オーバーロード、名前空間という C++ の機能を考えれば
分かると思うよん。
VC++ なら次のコードをビルドしてみれ。
void foo() { }
void foo(int) { }
namespace hoge { void foo(); }
extern "C" void foo(int, int) { }
void main() { foo(); foo(0); hoge::foo(); foo(0, 0); }
多分こんなリンクエラーが出ると思う。
Test.obj : error LNK2019: 未解決の外部シンボル _foo が関数 _main で参照されました。
Test.obj : error LNK2019: 未解決の外部シンボル "void __cdecl hoge::foo(void)" (?foo@hoge@@YAXXZ) が関数 _main で参照されました。
Test.obj : error LNK2019: 未解決の外部シンボル "void __cdecl foo(int)" (?foo@@YAXH@Z) が関数 _main で参照されました。
Test.obj : error LNK2019: 未解決の外部シンボル "void __cdecl foo(void)" (?foo@@YAXXZ) が関数 _main で参照されました。
オブジェクトファイルとかの中では実際には
extern "C" foo → _foo
hoge::foo() → ?foo@hoge@@YAXXZ
foo() → ?foo@@YAXXZ
foo(int) → ?foo@@YAXH@Z
とか名前が変わってるわけ。(変わり方はコンパイラ依存)
extern "C" のある時(Cを使った時)とそうじゃないときじゃ
全然名前の変わり方が違うっしょ?
C++ だと引数の型や名前空間の情報も名前に含めるの。
これが同じ名前の関数を複数定義できる仕組みでもあるわけだけど。
extern "C" を使わないで何とかするんじゃなくて、
extern "C" を使って何とかする方向で考えるべきだと思われ。
↓わかったか!
これ C++ スレの話だよな。
>>245 勿論、解った上で聞いてるんだが…。
そうですか、無理ですか。
じゃあ、C++のライブラリをCで使う方法を教えて下さい。
無茶言うな
ユークリッドの互除法で最大公約数を求めるプログラムを作ってみたんですが、 これ以上に簡潔な書き方ってありますでしょうか??暇な人いたら見てやってください。 #include <stdio.h> int uclid(int,int); void main() { int a,b; while (1){ printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); if (a <= 0 || b <= 0) break; if (a >= b) printf("%d\n",uclid(a,b)); else printf("%d\n",uclid(b,a)); } } int uclid(int a,int b) { int n; while (a%b != 0){n=a; a=b; b=n%b;} return (b); }
void ?foo@hoge@@YAXXZ(void); とかやって使えばいいじゃん。 ? とか @ が識別子に使えないならコンパイラを改造してさ。
11.14: void main()と宣言してうまくいかないわけがないと思う。なぜなら main()から戻る代わりに、exit()を呼んでいるから。だいたい今使っ ているO/Sはプログラムのexit値/戻り値を無視する。 A: main()から戻ってくるかどうかは関係ないし、そのステータスを見る かどうかも関係ない。問題はmain()の宣言がおかしいと、呼び出し側 (実行時のスタートアップのコード)がmain()を正しく呼び出すことす らできないかもしれないことにある。 君が使っているO/Sは終了時のステータスを無視して、void main()で もうまく動くかもしれない。しかし、このやりかたは移植性が低いし、 正しくもない。ボク女(;´Д`)ハァハァ
>>253 ただ呼ぶだけじゃだめだな。
コンパイラがthisをどう渡すかとか、vtblの扱い方とか知らないと。
exit()で終了するのは綺麗ではないと思う。 たとえmainからでもちゃんとreturnしたいね。
カーネルのコードとか、void main 使ってるよね。確か。
mainはないよ
zoid main(zoid)
じゃ、デーモンだったかな?
漏れも exit() はキライ 構造化の基本を無視してる
exit嫌いはC使う資格なし
俺も嫌いだ。 が、面倒な時は使う。
bool 値返して全部ちゃんとエラー処理してる。
ああ、エラー時に即終了させるってのがいけないと言っているのか。
ていうか、むしろexit使う時なんてある? 使ったことないよ。
ちゃんとエラー処理してれば、自然に main に行き着くと思うのだが。
main内でreturnでなくあえてexitを使う意味とは? まさかvoid mainだから?
exitとかロングジャプンとか 一度は使ってみたいけど 機会がない
>>269 void usage()
{
fprintf(stderr, "cmd: [-H | -L ] [-Aoutd] [file...]\n");
exit(1);
}
などは典型的な例だが見たことないか?
mallocに失敗した場合にできることが殆どないプログラムの
場合は、単にエラーを吐いて死ぬようなmallocラッパーを使うことも
多いだろう。
>>272 なるほど、
でも、やっぱり使わないなぁ…
所詮は好みの問題か。
他にはcoolな使い方無いかな?
>>252 uclid()の仕様が……
大小判断くらい関数内でしてもいいんでないかい?
それと、私ならscanf()は使わない。
どうでもいいけど、
while (1)
と
return (b);
がもにょる。
私はexit()を使わない方。 int main(int argc, char **argv) { /* 処理 */ if (/* 条件 */) { usage(argv[0]); return EXIT_FAILURE; } return EXIT_SUCCESS; }
276 :
デフォルトの名無しさん :03/02/14 08:39
argv[0]を渡す意味がわからん。
漏れは return usage(/*argv[0]もあるかな*/); かな。 argv[0]はウィンドズだと変になるからねぇ。
>250 COMをまなびなはれ
>>276 main() 以外のいろんな箇所から、使用法を表示して直ちに終了という処理が
必要になるなら、プログラム設計をやり直した方がいい。
#include <stdio.h> int uclid(int a,int b){ int n; while(a%b){n=a; a=b; b=n%b;} return b; } void main(){ int a,b; while (1){ printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); if (a <= 0 || b <= 0) break; printf("%d\n",uclid( a<b?b:a, a<b?a:b)); }}
a,bにunsigned付けときゃ負の判定要らんか?
mallocって充分に速いのか? 予め多く確保しておいた方がいいのか?
284 :
デフォルトの名無しさん :03/02/14 11:18
ファンクションの定義というのはどうやったらいいのでしょうか? 関数の定義の仕方は解るのですが、同じような感じにやったらいいのでしょうか? 初心者な質問ですみません…
その前に関数とファンクションの違いを述べてくれ。
>>283 測定すればいい。それが「十分に早い」かどうかは、そのプログラムに対する
性能要求・環境・mallocの実装の質etc...に依存するので、一般的な回答は
有り得ない。
それでも敢えて云うならば、平均的なC++プログラムではそれこそ山のように
new/deleteが暗黙に使用される(自分で呼んだつもりはなくとも、stringや
vectorのような一般的な道具を使うたびに当然暗黙には使用される訳だ)
ことを考えれば、いわゆるHosted environmentにおいてCを使っている分には、
mallocの性能なんぞ気にする必要はなかろう。
287 :
デフォルトの名無しさん :03/02/14 11:47
今学校から携帯で書き込みです 五個の配列を合計して割って平均値を出したいのですがこのソースでできますか?今コンパイル環境がないのでよろしくお願いします int test[5]={100,90,80,70,60} int count,avg; avg = 0; for(count=0; count<=4; count++){ avg=avg+test[count];} printf(゙%d\n゙,avg/5);
ネタでないことを祈るが 1行目の;が(ry avg(ry)sum(ry ダブルコーテーションが(ry mai(ry
290 :
デフォルトの名無しさん :03/02/14 12:32
全角文字のA→Zまでを出力したいんだけど、 ○の部分にはなにをいれればいいです? 検索のキーワードのヒントだけでもいいです。 #include<stdio.h> int main() { unsigned int i; for(i = 'A'; i <= 'Z'; i++) { printf("%X, %○\n",i, i); } return 0; }
>>287 つまり、テスト中に携帯からカンニング中ということですか?
>>290 マック使いカコイイ!
それかX68kか?
''でASCII以外の文字囲めるの?
unsigned int i;
for(i='A'; i<='Z'; i++)
{
printf("%04xH, %c%c\n", i, i
>>1 , i&0xff);
}
マックだよね?
>>294 マックじゃねぇのかよ。
じゃあひっくり返したらいいよ
>>297 ひっくり返すってのは1バイト目と2バイト目をひっくり返すってこと?
>>295 も云ってるが、今どきの普通の計算機ではchar型=1byte=8bitであって、
少なくとも俺が知っている範疇のC言語ではシングルクオートによる
文字リテラルではchar型しか扱えないんだから、その中に
ワイド文字がブチこんである時点でよく分からない。
本当はL'A'
と書いてあったのか?
だとすると、エンディアン変換を適当に行って1バイトずつ出力しても
思ったとおりの結果にはならない可能性が高いよ。ワイド文字の
エンコーディング方式は規格上は何も定義されていないが、
多くの処理系はそれをUCS2/UCF16/UTF32などでエンコードするからね。
300 :
デフォルトの名無しさん :03/02/14 13:18
>UCS2/UCF16/UTF32 すまんUTF16の間違いね。もちろん。
>>299 少なくともSunOSでは扱える。
Versionが4の頃と5になってからではバイト順が変わってしまった気がするけど。
#include <stdio.h>
int main(){
unsigned int i, z, w;
i=*(unsigned int *)"A\0\0";
w=(i&0xff)<<8;
i=(i
>>8 )|w;
z=*(unsigned int *)"Z\0\0";
w=(z&0xff)<<8;
z=(z
>>8 )|w;
for(; i<=z; i++)
{
printf("%02x%02xH, %c%c\n", i
>>8 , i&0xff, i
>>8 , i&0xff);
}
}
携帯だから確認できん、だれか試して。
わざわざ引っくり返さなくてもprintf()で順番変えればいいじゃん。
どうせ実装依存なんだから、 i += 256; でいいと思ったり。
リッチなカニチャーハンの本の誤植?は改訂版でも修正されてないですか?
3連文字って誰が使うの? インド人? メヂャーな国で使うとこってあるの? スペーンとかフランスとか、、、
strdupってC999から標準になった? なったよね?
forkはC9999から標準になる予定
C9999なんて要らん。C9989で十分。
C99999から文字列型stringを標準サポート
その前にガベコレ
ぬ る ぽ
317 :
デフォルトの名無しさん :03/02/15 02:16
ここって初心者の質問でもOKでしょうか。 int hage[3000]; という配列の hage[1901]からhage[2030]までを値を代入して初期化したいのですが、 hage[]={ 1,2,3,4,5,6,7,8,9 ・・・・・}; みたいなふうにして、1901から値を代入することってできますか。 方法があれば教えてください。 今は、別配列にいったん入れてからコピーしています。
初心者の質問しか受け付けません
>>317 入れる値がばらばら(規則性がない)なら一つずつ入れるかあなたの言うようにmemcpyなどで別配列からコピーするしかない。
319 :
デフォルトの名無しさん :03/02/15 02:22
>>317 年を入れるつもりなのだな。
それなら、int hage[130]で宣言して、i+1901で参照すればいいのでは?
回答ありがとうございまふ
入れる値は規則性は、厳密に言えば無くはないんですが、複雑で別プログラムで計算したものを
代入しています。
やっぱり方法はないんですか。
配列は最終的には、3000全部使う予定なので
>>319 さんの方法ではだめなんです。
int hage[1900]=[1,2,3,4,5,6,・・・];
みたいに書くことができれば理想なんですが。
C言語は、どのくらいで習得できますか?
323 :
デフォルトの名無しさん :03/02/15 03:22
324 :
デフォルトの名無しさん :03/02/15 03:26
325 :
デフォルトの名無しさん :03/02/15 03:28
>>320 コンパイラが耐えられるのであれば、何らかのプログラムで
初期化する式(コード)を生成して、それをソースにするという手はある。
PerlとかRubyとかawkとかいったスクリプト言語系ならお手軽だろう。
327 :
デフォルトの名無しさん :03/02/15 03:55
union { int a[3000]; struct{ int b[1900]; int c[2100]={1,2,3,3,5,6}; }; }; ってのは無理なのですか?
>>329 問題はそこでなく、配列を途中から初期化することで、、
>>328 ・書式が間違っている。
・1900+2100は4000だろう。計算はできるだけ自分でするな。
・こうすりゃできるけどやっぱり面倒だぞ。
#define SEC1LEN 1900
#define SEC2LEN 1100
union {
struct {
int sec1[SEC1LEN];
int sec2[SEC2LEN];
} sec;
int all[SEC1LEN + SEC2LEN];
} data = {{{0,}, {1, 2, 3, 4, 5,}}};
まぁ、何にせよ memcpy か for かで代入するのが一番いいと思うが。
->これウザくない? strub point *p; p->x を p.x ってかけるようにしてくれよ。 構文上あいまいになることもなさそうだし。
p->xはたしか (*p).xって書くのがめんどいからあるんじゃなかったっけ
>>333 . と -> の優先度は同じだが?
巨大な構造体を関数に渡す時はポインタを使った方が効率が良いんじゃないか?
p->xとp.xは違うデアリマス。セグメンテーションフォールト起こしそうであります。
構造体の配列
プログラム談議に花を咲かせているところ申し訳ないが、 今日はどうしてもみんなに言っておかなければならないことがあるんだ。 そしてみんなも、この言葉を胸に深く刻み込んで、 これからの人生を力強く生きていって欲しい。 貧 乳 マ ン セ ー !
339 :
デフォルトの名無しさん :03/02/15 19:13
デバッグができません!!!!!!!! 助けてください!!!!!!!!!!!!!!
>>338 氏ね。
だが貧乳マンセーにはもげしく同意。
>>333 CではいいがC++がとんでもないことになるのでやめてくれ
なんでCではいいんだよ。
↑仮定の話だという事が理解できないヤシ
リトレンディアンと ビッゲンディアン どっちが好き? 漏れはリトレンディアンかな。 MIDIとかネットでメンドイけどね…
ポインタの場合は参照先を、 そうでない場合はそれ自身を使う、 という仕様で何か問題ある? ::, ., -> は全部 . に統一しる!
>>347 struct HOGEEE **pの場合はどうするんだろ。
二回間接参照するのか?
'.'と'->'を統一しろなんて言ってる香具師は、 きっと「漏れ2重ポインタも理解できます」なんて面接で言っちゃうんだろうなぁ。
>>348 Dでダブルポインタ使うメリットってあんまり無いぞ。
>>347 >>350 Dの話ならスレ立てて勝手にやってくれ。
>>349 この前「ダプルポインタは理解できますがトリプルポインタは自信がありません」と言った奴がいたよ。
じゃあ変数もvar型で統一して、整数も文字列も代入・演算できるようにすれば?
>>345 アロー演算子が嫌なら (*p).hoge とでもやっとけば?
トリプルポインタは 漏れもちょっと自身がないな。
そもそもポインタは一つだけにすべし。二回以上の参照は悪。 char *argv[] だ。
356 :
デフォルトの名無しさん :03/02/15 23:06
やさしいCのファイルに文字を出力するところでつまずいてるので、 助けていただけませんか? ファイルをオープンして、それに書き込むところの fputs("Hello!\n", fp); の処理なのですが、このfpはいったい何を指してるのでしょうか? なぜfpが必要なのでしょうか?教えていただけませんか? もし、全体のソースコードが必要なら載せます。 では、よろしくおねがいします。
ポインタ配列はどうなるんだ?
>358 読んでも、FILE *fpはファイルポインタ、ということしか書いてなく、 fputs("Hello!\n", fp);のfpの意味がわからないのです・・・。 どうか教えていただけませんか?
>>359 ならば聞こう。
fpを渡さずにどうやって書き出すファイルを識別するんだ?
>>356 FILE* fp = fopen("hogehoge", "w");
fp->fputs("hogehoge");
と言う事だ、わかったか?
>>362 > fp->fputs("hogehoge");
ちょっとまて。
ぬるぽ
あぁ、理解できました。その書き出すファイルを識別するためのものなのですね。 で、もうひとつ質問です。 私今自分が書いた文字をテキストに書き出そうとしてるのですが char memo[100]; scanf("%s",memo); でmemo[]に格納した文字があるとしますよね? そしたら、その文字をtxtファイルに書き出すときfputsで どのようにすればいいのでしょうか? 今までは printf("%s",memo); でできたのですがfputsでやる場合はどうすればいいのか・・・ fputs("%s",memo,fp); かなと思ってやってみたところできなく、fpとは何かの質問をしたわけです。 どうかよろしくお願いします。
ぶっぶー。 fputsのプロトタイプ int fputs(char * buf, FILE * fp);
おおっと、const忘れてたぜ。
fputs(memo,fp) ?
う〜ん、わかりません・・・。 char memo[100]; scanf("%s",memo); で入力した文字をテキストに書き出すのは fputs()でもできるんですよね?
>369 ありがとうございました。 その方法でできました。 どうもありがとうございました。
> char memo[100]; > scanf("%s",memo); うお!こっこれは、噂のノーガードパターン??
> 今までは > printf("%s",memo); > でできたのですがfputsでやる場合はどうすればいいのか・・・ この前提が間違っている。 fputs() と対であるのは printf() ではなく puts() だ。 printf() と対なのは fprintf()。
374 :
デフォルトの名無しさん :03/02/15 23:43
DOSで、ひらがなや漢字をキーボードから入力したいのですが それはどうやればいいのでしょうか? IMEが使えないし・・・ 教えていただけないでしょうか?
fopen成功したかチェックとfcloseも忘れるな
>>374 いまどきDOSなんか使わないでWindows使いなよ。
コマンドプロンプトもあるんだし。
本当にみなさんありがとうございました。
>>373 いえ、そういう相対的な意味ではなく、
「今まではDOS窓にprintf()でできた。ファイルに書き込むのはどうやるんだ?」
という意味です。まだ入門書レベルなのでfprintf()やputs()等は知りません。
>>375 それは大丈夫です。
しっかりとfclose(fp);をつけてますので。
いや、 char hoge[10]; gets(hoge); 等で文字を入力するとき、DOS窓から漢字などを入力したいのです。 どうか教えていただけませんか?
IMEが使えないなんてウソだろ。 C:\>dosime C:\>selkkc とか試したか?
何でどの参考書もわざわざクセのあるprintf scanf から教えるんだろう。 gets puts から始めりゃいいんじゃねぇの? getsの文句はとりあえずおいといて
メモ帳からコピペが簡単
>380 それはやってないですが、 char hoge[10]; gets(hoge); のようなばあい、それは使えませんよね? いきなり文字入力画面になるので。
だからWindowsでアプリ組めって
>>381 printf scanf はデバッグに便利
>>383 Alt + 半角/全角キー
押しても出てこないのか?
普段マウスでIME使う人?
>>386 374じゃないけど、Alt + 半角/全角で出たよ
普段は半角/全角だけでやってる
Alt + 半角/全角はWin95以来使ってない
>>378 fclose()のエラーチェックも忘れるなよ。
>384 Windowsの文字入力ダイアログのようなものを作れってことですか? それが一番やりたいんですけど、本にも載ってませんし 作り方がわからないんですよ。 Javaスクリプトなどなら簡単なのですが・・・。 Cでダイアログ形式はできないんです。
>>389 エラーチェックとは何をすればいいんですか?
main関数の最後にfclose(fp)をつけるだけじゃだめなのですか?
>>390 BCC DeveloperとBCCForm and BCCSkeltonを拾ってきなさい。
>>356 fclose()の戻り値をちゃんと確認すること。
勿論、fputs()の戻り値もちゃんと確認しろよ。
ちなみに、どっちも正常終了なら0だ。
>392 VisualStudio.NETではできないのですか? 同じようなことを。
>>394 VC++もってるならVC++のダイアログエディタを使いなさい。
VC++ならMFC使ってちょちょいのちょいで出来るでしょ?
>395 モニタ通して見るの疲れるんで、明日本買ってきます。 >396 わかりました。まだVisualStudio内のVisualC++で コンソールアプリの製作しかしたことないんで・・・。 ダイアログエディタ、使ってみます。 便乗質問ですが、VisualStudioの使い方覚えるのに VisualC++の本を買うのは正解でしょうか? やめといたほうがいいですか?
>398 わかりました。 というか・・・ ついさっきVisualStudio→新規プロジェクト→VC++→MFCアプリで やってみたのですが、ダイアログエディタなんて見当たらないのですが・・・。 ツールバー一式を見ても見当たらないし・・・ どこにあるんですか?
リソース
C言語に勉強にVisualStudioですか?んったくおめでてーなー。
リソースビューのことですか? それならMFCアプリではなくてもありますね。 でも・・・何もない・・・。 MFCアプリとして新規プロジェクトを作ったらリソースビューにも いろいろあってわかったのですがコンソールアプリとして作った場合、デフォルトでは 何もないんです。 やっぱり全然使いこなせてないなぁ。
すいません。 やっぱり、自分で手探りでやってみます。 わからなくても、それが自分のためになると思ったので。 今までの自分の書き込みを見たら教えて厨丸出しだったので。 どうもすいませんでした。
>>348 * か [ ] してから . だろうな。
>>404 KKCFUNC.SYS
COMMAND.COM
MSIME.SYS
MSIMED.SYS
MSIMEK.SYS
ADDDRV.EXE
MSIMEKEY.INI
MSIMER.DIC
MSIME.DIC
DOSIME.SYS
を用意してpathを通す。
//バッチファイルでDOSIME.SYSを組み込む
ADDDRV DOSIME.SYS
//DOSIME.SYSの記述
devicehigh=KKCFUNC.SYS
devicehigh=msimek.sys /A3 /SB32 /SD32
devicehigh=msime.sys /D*msimer.dic /C1 /N /A3 /Dmsime.dic
//スイッチはネット調べるよろし。
407 :
374=404 :03/02/16 18:19
>>406 入力用ダイアログ作るって事になったんだから、もう良いじゃんよ。
スレ違いも甚だしいな
今ダイアログエディタの使い方を覚えて、 文字の入力できるダイアログを作ろうとがんばってます。
超初心者の質問ですがすいません。 今、cygwinと言うソフトを使ってCの勉強を始めようと思ったのですが、 メモ帳で書き込んだファイルを読み取ってくれません。 (cygwinの表示画面にls、CATなどを打ちこむと、 NO SUCH FILEとか出てしまいます。) どうすれば良いか、わかる方いらっしゃいませんか? スレ汚しすいません。 sage
>>411 それはC以前の問題だ。
cygwinスレいけ(あるかどうかしらんが)
関係ないけど>404の行動ができるやつは 2chにどれくらいいるんだろう
>>412 むしろPC初心者板。
hello.c.txtなどというファイルを作ってるに5120ウォン
>413 >414 ありがとうございます。 >416 なんでですか?
で、できたの?
いえ、まだです。 ダイアログエディタで作ったダイアログを.rcファイルとどう絡ませればいいのか わからないんです。 作った.exeを起動したら、win文字入力ダイアログが出てきて、 文字を入力、保存。 すると保存した文字はmemo.txtに保存され、TClockのツールチップとして表示・・・。 こんなんを作りたいんですが・・・。 .cのソースはできたんですけど、DOSで開かないでWinで開くのにはどうしたらいいのか・・・
>>421 いえ、使い分けてません。
VisualStudioで、新規プロジェクト、VisualC++、コンソールアプリ、
の手順で作成しましたから。
そっちのスレにいって聞いたほうがいいですか?
質問する前に基本的なことぐらい勉強しとけ
VC++ なら Windows スレじゃなくて VC++ スレだろ
425 :
デフォルトの名無しさん :03/02/16 22:49
よっしゃ、教えてくれ! rubyはなぜ.でつなぐんだ?
>>425 まことに遺憾ながら、あなたの発言を原因に地球が滅ぼされる事が決定されました。
>>404 MFCはMFCのAppWizardで作れって。
愛子様のご成長を見守るスレ
しつもん。 char *p = "Hello, C"; printf("%s\n", p); この場合、 pの指す値("Hello, C")はどこにあるのですか。 そしてこいつの内容は"Hello, C"であるといつまで保証されていますか。 ぼくにはわかりません。
>>429 >どこにある
どこか。それはコンパイラが知っている。
>いつまで
必要なだけ。書き換えなければいつまでもそのままだろ。
わりとまじめに質問してるんですけど。 char *p = "Hello, C"; (何らかの処理) printf("%s\n", p); とした場合、 printfでpが参照されている時点では、pが指す値は"Hello, C"であると保証されているのですか?
>>432 =429
何らかの処理の間に書き換えてしまう可能性は常にある。
だから、誰も保証はしないだろ。
何らかの処理の間に書き換えてさえいなければ大丈夫だ。
文字列リテラルが書き換え可能である保証はない。 たぶん不可能な処理系の方が多いのでは。
FAQ だな。 C FAQ 読んできてよ。
>>433 あ、そらそうですよね。
たとえば、
void foo(){
char str[] = "Hello, C";
char *p = "Hello, C";
(何らかの処理。p,strの指す内容の書き換えは行わない)
printf("%s\n", str);
printf("%s\n", p);
}
という場合、配列strの内容については、
こちらが明示的に書き換える処理を行わない限り"Hello, C"
でありつづけることが保証されているように思えます。
といいつつ、本当はよく知りません。
pの指す内容については明示的に領域を確保していませんよね。
この場合、どのように扱われるのでしょうか。
一時的にメモリのどこかに確保されるとは思うのですが、
そこから先どういう扱われ方をするのかわかりません。
その内容はいつ破壊されていてもおかしくない。ということなのでしょうか。
>>434 仕様上は不可能。
constがついていないのは過去のソースとの互換性のためかと。
char *p="ぬるぽ"; これでいちいち警告を出されたらたまらん。
>>436 pの指す内容はコンパイラがどっかに確保してくれてる。
というか、文字列で明示的にどこかを指すように保証してるじゃないか。
んでも、厳密に文字列リテラルがどこにあるかを知ってるのは
コンパイラじゃなくてリンカだろうな。リンク時に確定するはず。
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>437
ぽ
pが指す"Hello, C"文字列の内容が書き換えられないことは仕様で決まっていても pがいつまでも"Hello, C"を指してる保証はまったくないわけだが
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>440
>>442 *p = 'a'; は出来ないが、p = NULL; は出来るって事だろ。
>>444 できるけど、誰も「できない」とは言っていないでしょ?
ひとりごと
>>436 "Hello, C" と "%s\n" はどっちもリテラル
だからこれは両方とも同じ結果になる
char *p = "Hello, C";
printf("%s\n", p);
char *p = "Hello, C\n";
printf(p);
void tst1(){ char *p= "Hello, C\n"; char a[] = "Hello, D\n"; p=a; *p='B'; printf(p); } void tst2(){ char *p = "Hello, C\n"; printf(p); } void tst3(){ char *p = "Hello, C\n"; *p='B'; printf(p); }
void test(){ char a[]; char *b; printf("%d %d %d\n", a[0], a, &a); printf("%d %d %d\n", *b, b, &b); } (´∀`)なんじゃこりゃ
>>446 >"Hello, C" と "%s\n" はどっちもリテラル
>だからこれは両方とも同じ結果になる
>char *p = "Hello, %C";
>printf("%s\n", p);
>char *p = "Hello, %C\n";
>printf(p);
違う結果だ。
\%C
%%%%C
perlを一通り勉強し終えたので 次にc/c++に移りたいと思っているのですが cを学習してからc++に移るべきか、それとも c++だけでcの学習は無くてもc++の内容を理解できるか、 どなたかお教えいただけませんか。
>>442 ,445
432が保証されてるかどうか聞いてるんだから保証されてないと答えるのは当然だと思うが。
それとも誰かが保証されてると答えてからでないと、保証されてないと答えてはいけないのか?
>>452 俺の経験から行くと、Cの仕様書を読んでからC++をはじめたほうがいい。
多言語経験があればC++から始めてもまったく問題なく使えるが、
一見C++とCの共通項に見えて実はCにしかできないこと、Cにはできないこと、などがあいまいになってしまう。
普通こういうコミュニティとかではCが共通語として使用されるので
Cで書いたつもりになってても、じつはC++にしかない機能を使ってたりなんてことがよくある。
未だに分からんのだけど、 仕様書と規格書の違いは何?
≫412≫415 遅れましたが、レスどうもです。 言われたとおり初心者板で聞いてみます。 でも、.txt なんて打ってないんですが…。 ありがとうございました!!!
ANSI規格・JIS規格・ISO規格・IEEE規格
>>454 レスどうもです。
背中を押して頂きました。
やはり横着をして楽をする訳には
いきませんね。
cから、学習を始めます。
浮動小数点がどのように表現されているか知りたくて Intel Pentium III Xeon , Debian GNU/Linux 3.0r1, GCC 2.95.2 で試してみました。 1)float に適当な浮動小数点を代入。 2)sizeof (float) によると4バイトらしい。 3)メモリに格納されている float をアドレスの小さい方から見てみる。 0.5 => 0,0,0,63 1.0 => 0,0,128,63 2.0 => 0,0,0,64 4.0 => 0,0,128,64 -0.1 => 0,0,128,191 む・・・・規則がわからん。
符号と仮数部と指数部
いや、それはわかるし、 IEEE 標準のフォーマットも知ってるんだけど、
なんでそれで
>>459 みたいな表現になるのかと・・・
0.5 と 1.0 の関係とか・・・
>>459 とりあえず IEEE754 か IEC559 嫁
>>461 そこまで分かってるなら…
x86はリトルエンディアンだから、アドレスの大きい方から逆順に見ないと
だめだし、10進数のままじゃ理解しにくいだろうから2進で表示したら?
俺のx86はビッグ円ディ案
>>462 単純に 32bit 上位から
符号 1 bit
指数 8 bit
仮数 23 bit
じゃない・・・・のか?
いまから IEEE 754 読む。
PS2ってビッグなのな。驚いた。
PS2 で動く Linux 持ってるのか・・・いいなぁ。 あれって、限定品なんだったっけ? なんか一時申し込みが殺到したよっていう記事を見た気がする。
すまん、 Linux 持ってるなんて書いてなかったな。
469 :
デフォルトの名無しさん :03/02/17 17:31
構造体のサイズを知りたいときは sizeof(kouzoutai)で測れますよね。 それでは、char buf[3000]; という配列をsizeofで計測すると 3000が返ってきますよね? このbufの中に例えば200バイトしか 入ってなかった場合、そのサイズを求めるには strlen()を使用するものなのでしょうか? スペースがbufの中に含まれているので 微妙です。 どなたか御教授お願いいたしますです。
>>467 違う。公開されている改造コードがそうなっていた。
PSはリトルなんだけど。
本来はビッゲンディアンの方が標準だろ? インテル系は昔の奴の互換するためになってるんだろ? 昔は16bitだったし…
>>470 Linux持ってるけどリトルエンディアンだったよ>PS2
>>469 入れた覚えがなくても、なにかしら入っている。
文字列の長さを知りたかったらstrlen
PDP11がCの最初だからいいのでは? ワードマシン?
昔は何で逆になるんだよ!とリトルエンディアンをキモがってたんだが、 一般に使われてる数字の表記法に問題があるだけだと気づいてからは 今は同じ理由でビッグエンディアンがキモイ。 まぁ、普段はどっちだろうと気にしないんだけどな、 クロスプラットフォームのデータは意識的にどっちかにあわせないといけないからめんどいな。
>>476 お前がいなくても世間は動いているけどな。
>>476 はっきりいってお前は、親から世間を
教えてもらえなかったのがまずかったのかな。
普通の日本人は理解しているぜ。
CORBA とか COM とかなら どっちかに決まってるんだったっけ?
ウチはミドルエンディアンやで。
volatileつけたらうまく動きました。 くだらないこと聞いてすみませんでした。。。
うちはナイスミドルエンディアンだが
1 little 2 little 3 little endian
ビッグエンディアン厨ウザイ
黙れRuby厨
Pearl>>>Ruby≧その他
>>479 決まってません。というか、どちらでも平気。
基本的に送信側が送ってきたバイトオーダーに従う。
そいやDCE RPCはPDPエンディアンの記述もあったな〜
>>488 コイツ は パール を 知らねぃのか? プ
Perlはその他の中に入っているもよう
真珠を買うお金もないのね。
真珠がなければるびぃを買えばよいのではなくって?
494 :
デフォルトの名無しさん :03/02/17 18:46
assertはリリース時には消す?NDEBUG定義してそのままにする?
Version Controlはあまり関係ない
#define printf(hoge)#define puts() int main() { printf("ぬる"); puts("ぽん"); return 0; } これでprintfとputsは中身まで含めてちゃんと消える? どっちかダメ?
498 :
デフォルトの名無しさん :03/02/17 19:45
文字列を入力させる時に、バグの温床になりやすいscanfを使わず、 sscanfとfgetsでチェックしながら入力させる・・・・・・ということを聞き、 早速、 char str[20]; char buf[20]; for (i = 0; i < MAX; i++){ while (1){ fgets(buf, MAX, stdin); if (sscanf(buf, "%s", str) == 1); break; printf("もう一度入力して下さい。\n"); } みたいな感じで実践してます。ここで疑問に思ったんですが、文字列だけでなく 数値を入力させる際にも気をつけておくべき「定石」みたいな方法があると思うんです。 こういったエラーを防ぐときに、みなさんが実務で使われている方法ってどんなものなんでしょうか? 上の改良すればいけるんじゃないかとは思ってるんですが・・・・
>>497 > #define printf(hoge)#define puts()
#define printf(hoge)
#define puts(hoge)
こうしないとエラーになる。
しかし、printf()は可変引数だから一般的にはこれだけじゃダメ
ちょっと追加です。 数値を入力する際の、型のサイズ越えとか、間違えて文字列を入力してまった、とか そういう部分でのエラー検出方法ですね。
おれはぬるぽエンディアン
int? if(BOOL b); if()の戻り値ってint型なの?
if*文*に戻り値などない
>>498 ・fgets()の使い方が変。
fgets()用バッファとサイズを揃えるのが一般的。
なので、
char buf[20];
fgets(buf, sizeof(buf), stdin);
とするか、
#define TMP_BUF_LEN 20
fgets(buf, TMP_BUF_LEN, stdin);
などとする。
・全体のロジックは不明だけど少なくとも{}がアンマッチ。
505 :
デフォルトの名無しさん :03/02/17 23:17
JISAKU(char *buf, char *buf2){ char hoge; sscan(buf,"%02x",buf2); hoge = *(int *)buf2; *str +=3; } 上記のような関数があってmain側で呼び出す際に char hogeを利用したのですが、いかようにすればよろしいの でしょうか?初心な質問で申し訳ございませんが 御教授お願い致します。
return hoge;
>>499 #define printf
#define puts
引数に副作用が無いならコレで OK
508 :
デフォルトの名無しさん :03/02/18 07:00
hoge1.txt, hoge2.txt, ... という複数のファイル編集を下のような方法で行っているのですが、 もっと標準的な方法はあるのでしょうか? char filename[12]; for(int i=1;i<=MaxNumberOfFiles;i++){ sprintf(filename,"hoge%d.txt",i); fp=fopen(filename,"w"); /* 編集 */ fclose(fp); }
509 :
デフォルトの名無しさん :03/02/18 07:06
510 :
デフォルトの名無しさん :03/02/18 07:08
朝からくだらない質問でスイマセン。 main(){ int i,a[10]={35,67,28,19,83,98,71,58,5,90} int max,min; max=a[0]; min=a[0]; for(i=1;i<10;i++){ if(max<a[i]) max=a[i]; if(min>a[i]) min=a[i]; }} このプログラムの中間コードと目的コードを教えて欲しいのです。 また、UNIXコマンドで生成できるのであればそのコマンドを 教えていただけませんでしょうか・・。m(__)m
>>508 標準的な方法は知らないが、すくなくともおれだったら
fopenからfcloseまでの部分を別の関数にまとめる。
>>510 質問の意味がよくわからない。中間コードとはなんだろう。
目的コードとは? UNIXコマンドで何を生成したいんだろう。
処理系がgccだとして、-save-tempsが求める答えなのかな。
>>514 AcrobatReader入っていないから読めないんだけど、なんて書いてある?
>>510 スレ違いじゃないか、とは思わないか?
コンパイラの本でも読めば?
>プログラムのアセンブリコードを最適化したのが中間コード はぁ? なんか、物凄く一般的でない話になってないか?
中間コードねえ。処理系によるけど構文木やPコードやバイトコードかね。 gcc の場合は gasm に落として最適化するから、 それが中間コードと言えなくもない。
うーん 確かにスレ違いっぽいですね。報告です。 今、なんとか中間コードを生成するコマンドを発見しました。 gcc -S test.c でアセンブリコード生成 gcc -O2 -S test.c 最適化されたコード(中間コード?)を生成 egcsをインストしてようやくできました。
中間コード オブジェクトファイルやらアセンブラコード等 Winなら *.obj *.s *.asm 等 目的コード ロードモジュール Winなら *.exe *.dll ↑なんじゃないの?
いろいろなところで見かける ASC2 ってなんのことですか?
>>525 > いろいろなところで見かける
ど こ だ ?
ASOUなら知ってるが
それは ASCII だ
>>522 おいおい…
>gcc -S test.c でアセンブリコード生成
>gcc -O2 -S test.c 最適化されたコード(中間コード?)を生成
-O2をつけると最適化はされるけど、吐き出すのはつけないとき同様アセンブリコードじゃないのか?
っていうか、それで違うものが吐き出されたら不気味だぞ。
>>521 gasmはアセンブラね。
上記-Sをつけたときに出力されたコードやプログラマが書いたコードをアセンブルするツールだ。
例外があることを承知で書けば、
cソース
↓cプリプロセッサ
↓パーサ
↓ジェネレータ
アセンブリコード
↓アセンブラ
オブジェクトモジュール
↓リンカ
ロードモジュール
って流れになる。
530 :
初心者(2日目) :03/02/18 11:23
ほんまに初歩的な質問です。 数字を表示するときに、1を01、というふうに2桁で表示されるには どうしたらいいいんでしょうか? 10は10でいいんです。 教えてください。
531 :
初心者(2日目) :03/02/18 11:25
(誤)で表示される (正)で表示させる です。
533 :
初心者(2日目) :03/02/18 11:31
>532 いや。。printfで、どのように。。。 小数点の桁合わせはWebページで見つけたんですが、 整数のほうがわからなくて。スミマセン
gcc -dr で中間言語をはく
Java仮想マシンをターゲットにできる C Compilerにはどのようなものがありますか?
537 :
初心者(2日目) :03/02/18 11:46
>>536 .NET環境をターゲットにできるCコンパイラならあるけど?
Java仮想マシンをターゲットにするならC言語やめてJavaにするしかないでしょ。
539 :
デフォルトの名無しさん :03/02/18 13:37
上のほうにも似た質問があるんですが、標準入力から文字列を入力する際、 入力された文字列が配列の範囲を越えてしまった時に、警告を出した上で もう一度入力させるにはどうすればいいでしょうか? void main(void){ int i, j; char str[5][20]; char buf[20]; for (i = 0; i < 5; i++){ while (1){ fflush(stdin); fgets(buf, sizeof(buf), stdin); if (sscanf(buf, "%s", str[i]) == 1) break; printf("もう一度入力して下さい。\n"); } } 今はこんな感じで作ってます。 空白だけを入れた場合の警告は出るようにしています。 しかし、配列の上限を越えた入力をチェックする方法が解からず、 しょうがないのでループの先頭でバッファに溜まった分を切り捨てるようにしています。 これを解決するスマートな方法ってないですかね。。。
>>539 そんな対話志向な設計、標準Cでできましたっけ?
>>539 bufを大きく取った上で、超えた分は捨てていいならfflush()は妥当じゃない?
私ならbufの最後に改行コードが入ってなければ読み捨てるようにするけど。
>>539 fflush()をstdinに対して実行した結果は、処理系依存です。
544 :
デフォルトの名無しさん :03/02/18 15:16
int WAKARAN(char *str,char *str2){ int piyo; char dmy[512]; printf(" str = %s\n", str); sscanf(str, "%02x",piyo); *str2 = piyo; return 0; } main(int ac, char *av[]){ FILE *ifp, char buf[512],tmp[512]; int x,res; if ((ifp = fopen(av[1], "r")) == NULL);exit(1); fgets(buf,512,ifp) !=NULL; for( x=0; x < 16; x++){ res = WAKARAN(s,hoge); if ( res != 0 ){ printf("Fmq_ipTRSF56:Error\n"); break; } DATA->usr[x] = *hoge; *hoge +=3; } printf("usr = %s\n",DATA->usr); こんなプログラムあるんですが、実行するとエラー(core)してしまいます。 構造体の存在は書ききれなかったので省略しています。 なぜウゴカナイのかご指導いただけると幸いです。お願い致します。
>>544 引数つけたか?
つければ即終了すると思うぞ。
>sscanf(str, "%02x",piyo); 間違い >} dmyが使われていない >main(int ac, char *av[]){ 戻り値の型がない >if ((ifp = fopen(av[1], "r")) == NULL);exit(1); パラメータがないときに異常終了しそう >fgets(buf,512,ifp) !=NULL; 条件判断の結果が捨てられている >res = WAKARAN(s,hoge); sもhogeも宣言されていない >DATA->usr[x] = *hoge; DATAが宣言されていない >printf("usr = %s\n",DATA->usr); main()が終了してない
>>546 実行できているんだから文法エラーになるようなことは指摘するなよ。
みなさん、ありがとうございます。
虫食いしてみたところ
>>546 さんのおっしゃる通り
sscanf()がぁtぃぃようです。。。
何がおかしいのでしょうか?
ご指摘頂けると幸いです。
お願いいたします。
>>548 それはscanfがして、だからだよ。
・書式の間違い ・引き数の間違い
551 :
デフォルトの名無しさん :03/02/18 17:02
関数の宣言についてですが、あれはソースを読みやすくするだけですか? それとも何か動作に影響があるのでしょうか? よろしくお願いします。
>>551 プロトタイプ宣言のことならコンパイル時の引数及び型チェックを厳密にするため。
天罰が下ります
>>551 宣言すると
>>552 の言うようにチェックを厳密にしてくれるだけでなく、
暗黙の型の格上げを行わなくなる場合もあるので要注意。
ありがとうございました。 普段は宣言しておいたほうがよさそうですね。
556 :
デフォルトの名無しさん :03/02/18 17:36
「プログラミングWindows第5版(上)」のP.53にこんな記述がありました。 配列が大域的であれば(つまり、関数の外で定義されていれば)、 文字列配列は次のような文で初期化できる。 char a[] = "Hello!"; この配列を関数の局所変数として定義する場合には、 次のようにstatic変数として定義しなければならない。 static char a[] = "Hello!"; なんでだー!! 関数が呼ばれるたびに、文字列が配列にコピーされるのを防ぐためですか? でも、「定義しなければならない」って……。
>>556 つまり、過去の文章を引き摺っているわけやね。
560 :
デフォルトの名無しさん :03/02/18 18:35
今C言語でプログラムを作っているのですが、 2次元配列のメモリを動的変数で確保するにはどうすればいいのですか? 調べたところ、for文を使って1次元配列みたいなものを繰り返し作成して 確保していたのですが、一般的にはどうするのですか? よろしくお願いします。
562 :
デフォルトの名無しさん :03/02/18 18:40
char piyo[512] こんな配列があって要素をひとつ ずらしたい場合ってどうすればよろしいのでしょうか? ポインタだったら、*p++って感じですよね? それが配列の場合はどうなるんでしょう、、、 御教授お願いイタします。
565 :
デフォルトの名無しさん :03/02/18 18:53
>>561 すいませでした。それとありがとうございました。
>>563 さそ
ありがとうございます。
memmoveを使用する。。。
ワタシの想像で
for ( i=0; i <32; i++){
.....HOGE->mona[i] = piyo[i];
こんな感じを想像していたのですが
memmoveで実現できるのでしょうか?
>>562 char base[10000];
char *piyo = base + 5000;
568 :
デフォルトの名無しさん :03/02/18 19:33
なんでみんな適当な変数名に「hoge」ってつけるんだろう・・・。 ホゲってなんだ?
>>568 fooとかbarの日本語版だと思われ。
適当な変数名 hoge geko ugo だんだん苦しそうになっていく…
かれこれ5年ぐらい前からhoge使ってるやついた
>>566 > for ( i=0; i <32; i++){
> .....HOGE->mona[i] = piyo[i];
そういうのは要素をずらすとは言わないと思うが、いったい何をやりたい?
>>573 サソ
31 32 33 34.....
こんなテキストファイルを読み込んで
sscanfで%02xでとり、構造体の配列に
ひとつづついれていきたいのです。。。
まじアタマから煙でそうっす。
御教授くだせぇぇぇ。。。
sscanf()のフォーマットに"%02x"は間違い。 1行に16進文字列が固定数入っているなら、寧ろstrtol()を使ったほうが楽かも。
576 :
デフォルトの名無しさん :03/02/18 21:21
Cで標準ライブラリだけを使って安全に文字列入力するにはどうしたらいいのでしょうか?
577 :
デフォルトの名無しさん :03/02/18 21:23
fread
getc 一択
>>578 fgetcを使わないでgetcを使うことのメリットは?
>>579 君はその2つの違いを理解しているのかね?
gets 以外は 正しく使えば安全だよ
>>580 getcはマクロかもしれないってだけじゃないの?
#define getc fgetc #define putc fputc
漏れはC言語が好きだが、 貧乳の方がもっと好きだ。
漏れはC言語が嫌いだが、 貧乳の方がもっと嫌いだ。
Ruby≧貧乳>>>Pearl>C>>>巨乳
>>575 サソ
ご指摘ありがdございますた!
ボキも貧乳好きだ。
589 :
デフォルトの名無しさん :03/02/18 22:14
実数の加減算を行うプログラムを作れ。 例123.45+67.89=191.34 ただし入力には、getchar()を使い、char型として1文字ずつ受け取る。 解釈できない文字が含まれた場合、それが入力された時点でそこまでの計算するものとする。 できなければエラーを表示して打ち切りでもよい。冒頭の0をゆるしてもよい。 scanfやatoi関数など既存の関数は使わないこと。 意味不明、焼肉定職
>>590 出題者に何でそんな無意味な制限を付けるのですかって文句を言えば良い。
kprintfって標準?
なんじゃそれ?
k = kernel
>>591 無意味じゃないだろ。
学習段階なら、atoi()などのライブラリ関数がどうやって
文字列から数値に変換しているかを一度は自分で試すべき。
>>590 宿題マル投げなら、専用のスレあるから。
そっち逝け。
argv を main 以外の場所で取得できる? もしできるなら方法を教えてください。
598 :
デフォルトの名無しさん :03/02/18 23:01
char hoge[128]; この配列を switch(なんでもいい){ case A: for ( i=0; i <16; i++){ hoge[15]までなんらかの処理} その次に同じように case B: for ( i =0; i <16; i++){ hoge[16]からhoge[31];まで処理する} こんな風にしたいんですが case Bのfor文の記述がわかりません。 case Aではhoge[0]からhoge[15] case Bではhoge[16]からhoge[31]という仕様にしたいと思っています。 ベタで書くことができないので、ウマイ処理がございましたら 御教授頂きたいです。おながいします。
>>597 VC++なら__argvで。
_argvじゃないよ。
二個ね
>>595 floatだのdoubleだのに直すのに標準ライブラリの
力を借りないと思いっきり移植性が…とか一瞬思ったんだが、
べつにそんなの使わなくても計算できることに気づいた。
いい問題かも、これ。
603 :
デフォルトの名無しさん :03/02/18 23:15
シングルトンクラスがあるじゃないか
605 :
デフォルトの名無しさん :03/02/18 23:26
数値の前を0で埋めたいのだが、その桁数を変える方法ってわかりますか? 具体的には、 char hoge[10]; int i; sprintf(hoge, "%03d", i); みたいなので、「3」を場合によっては4とか5とかにしたいのですが。。。
シングルトンクラス?
>>598 for (i = 16; i <= 31; i++) {
処理(hoge[i]);
}
か
for (i = 0; i < 16; i++) {
処理(hoge[i + 16]);
}
じゃダメなの?
>>603 グローバルに持たずにパラメータで渡せないの?
ex.)
void 下請け(char **argv);
int main(int argc, char **argv)
{
下請け(argv);
}
void 下請け(char **argv)
{
}
>>605 sprintf()のマニュアルをよく読もう。
sprintf(hoge, "%0*d", len, val);
609 :
デフォルトの名無しさん :03/02/18 23:35
2次元配列から片方の配列のみを取り出す方法ってありますか? つまり、配列 a[i][j] のjの部分のみを取り出したいんです。 また、その逆も行いたいんですがわかる方いたら教えていただけないでしょうか
>>605 char format[] = "%03d";
format[2] = digit - '0';
sprintf(hoge, format, i);
>>608 ネタより先に正しい答えを出しちゃイヤン
int n = 6, m = 2; char format[10]; char hoge[10]; sprintf( format, "%%0%dd", n ); sprintf( hoge, format, m );
>>609 二次元配列の片方って考え方が既に間違っている。
よく判っていないなら、配列の要素を一つずつコピーすべし。
>>611 =610
ごめん。たまたまリロードしたら見えたんで。
>>613 以下同文。
>>603 typedef struct {
int argc;
char ** argv;
} MAINARG;
MAINARG * get_mainarg() {
static MAINARG arg;
return &arg;
}
/* これをmainで呼ぶ */
void init_mainarg(int argc, char ** argv) {
MAINARG * arg = get_mainarg();
arg->argc = argc;
arg->argv = argv;
}
・・・素直にグローバルに置いた方が良いと思ふ。
だからwindows.hをインクルードすればはじめから __argv がグローバルにあるってば。
Win厨は消えてくれい
stdlib.hっしょ?
何でargvがグローバルだと嫌なの? グローバルで確保しても良い(問題無い)変数の1つだと思うけど?
>>607 サソ
アリガdであります。
char hoge[128]にどこまで入っているかは
わからない状態なんです。仕様記載漏れすみません。
んーどうしたもんなんでしょう、、、
>>620 訳が分からない
もっと分かり易く説明汁
622 :
デフォルトの名無しさん :03/02/19 02:46
x-0.2xからx+0.2x(xはfloat型の変数)までの範囲の乱数を 発生させる場合どうかけばいいのでしょうか? 例えばx=0.0000100なら0.0000080から0.0000120までの乱数です。
((0から0.4の乱数)+0.8)*xじゃだめなの?
>>623 ransu=(((float)rand%5*0.1)+0.8)*x
こんな感じでしょうか?間違ってたら訂正おねがいします・・・
ransu=((float)rand()/RAND_MAX*0.4+0.8)*x; でできました!スレ汚しすいませんです・・・
標準じゃないが get_commandline() とかそんなのが大概用意されてるだろ? それ使えよ。 どうせ(略)クソコードだろ
gcc-cygwinを最近つかいはじめた初心者です 疑問に思ったんですがそもそもコンパイラってDOSとかUnixと ペアで出来てる物なんですか? それともcygwinだけですか?
>>627 Cコンパイラ=C言語ソースプログラムを機械語へ翻訳する機械
歴史的にCコンパイラはunixという土壌でOSと共に発展してきた
経緯で強い影響を受けてはいるが、一般的にコンパイラと
OSには”ペアで出来ている”という関係はない。
世の中にはOSがないマイコン向けCコンパイラも、コンパイラの
動作OSとは違うマシンで動くコードを生成するコンパイラだってある。
書いてみたけど読めば読むほど
>>627 の意図がよくわからん。
見当違いっぽいな。すまそ。
>>628 ありがとうございます
ずうずうしくもう壱つ質問
catとかlsとかのコマンドは
一般的に何をみなさん使ってるんですかね?
やっぱDOSが多い…ですか?
>>630 いわれたことを全く理解してない香具師ハケーン
>>628 確かにコンパイラを作成する理論はOSとは独立だけど、
C言語の場合、Unixの開発ときっても切り離せない関係にあるのでは?
C言語でUnixを書き、そのUnixの上でC言語コンパイラとその改良
を行って、そのC言語で再び改良されたUnixを書く。この繰り返しが
初期のUnixの開発では良く行われた。
逆に言えば初期の言語がアセンブラ並にプリミティブじゃなきゃ
そのコンパイラを動かしてくれるOSなんて皆無だったし、コンパイラが
ある程度OSの機能を代替できなければ実装不能な机上のものだった。
コンパイラがOSと独立するようになったのは、もうコンパイラそのもの
の開発よりも、OSの洗練、アプリケーション管理とかライブラリ管理とか
が重要になった1970年代後半以降の話でしょう。
一般的に、と断った上で書いているようだが、さて
634 :
デフォルトの名無しさん :03/02/19 13:09
あるマシンで別のマシンのソフトの開発を行うことを 「クロス開発」といいます cat,lsはUNIXのコマンド dirはdos、UNIX両方にあるようですね。 Cygwinということは、WINDOW用のソフトですよね。 ゲームですか?
>>631 〜
>>634 テキスト系エディタ
↓
ソースプログラム
↓
コンパイル
↓
実行形式
↓
実行
この流れを
みなさんDOSを使って
やっているのかな?って思ったんですよ
それともなんですか?音声認識でやってるんですか?
実はマウス使うのがやっととか?
Unixとの関係が上がってますがそんなのCの参考書の
(はじめに)の所に書いてあってわかってます
…って言うか誰も聞いとらん
>>635 お前の質問のレベルがその程度ってことだよ
637 :
デフォルトの名無しさん :03/02/19 13:38
>>635 難しく考えすぎ
>>全
初心者にしては話がわかるな…
と思ったのは俺だけか?この初心者のレス開始から順に読んで
行けばわかりそうだけどな
638 :
デフォルトの名無しさん :03/02/19 13:43
若Verに カキミダサレださださ
>>635 もしかしてコマンドプロンプトのことをDOSと勘違いしている馬鹿?
>>635 とりあえず意味は分かるけど「DOS」というと普通はMSDOSを
指すんで紛らわしいから使わんほうがいいと思われ。
実際には「コマンドプロンプト」とか「コンソール」のつもりで
云ってるんだよね?
コンパイラ、リンカをどのように実行させるかは人による。
例えばVC++のような統合開発環境ではエディタ、コンパイラ、リンカ、
デバッガなどは全てGUIの統合開発環境上で実行できるので、そもそも
コンパイルのフェーズを意識する必要もあまりないが、別にcl.exeやlink.exe、
nmake.exeを直截実行しても構わないし、ソースコードは単なる
テキストファイルに過ぎないのだから、どのようなテキストエディタ
を用いても構わない。それどころか
C:\> type con >test.c
のような方法であってもさしあたりは構わない。
ただしnotepad.exeはファイル名の拡張子の
付け方について多少おせっかいなところがあるので止めた方がよい。
641 :
デフォルトの名無しさん :03/02/19 13:52
>>635 よくわからんが士ね。といいたくなった。
みなさんDOSを使って みなさんDOSを使って みなさんDOSを使って みなさんDOSを使って
>>639 ありえない
プログラム初心者=バカ 違う
>>640 ありがとうございます
Visual C++6.0SPは持ってるんでけどね
>全員
でも一つ分った事はプログラムが出来ないだけでみなさん
ものすごく卑下するんですね
感じ悪
(結果>cygwin は Unix コマンドだと何かと簡単だからと一言欲しかった)
>>643 なにが「ありえない」だか
ではどういう意図で「DOS」と書いたのか説明してみろ
それと「卑下」する、とは自分を低く扱う事
>>635 の
> それともなんですか?
以降のほうが感じ悪。
646 :
デフォルトの名無しさん :03/02/19 14:35
>>644 Windowが立ち上がる前のDOSで一連の流れを実行する事は可能
又低水準であるがゆえWindousをおっぴろげ無い方がより効率的に
処理速度をかせげるから?と言いたいんじゃないの?
卑下はヒゲって意味で言ったんじゃないの?
Cで質問なんですが、 -> ってどういう処理なんでしょうか? img1->data = (char *)pdata1; という処理で使われていて、 img1はX-windowのXImage pdata1は pdata1 = (unsigned short*)mmap(0, X_SIZE*Y_SIZE*2, PROT_READ|PROT_WRITE , MAP_SHARED, *video, 0); こんなかんじで処理されています。
648 :
デフォルトの名無しさん :03/02/19 14:38
>>647 マニュアル嫁、構造体や共用体のポインタからメンバを選択する演算子
650 :
デフォルトの名無しさん :03/02/19 14:48
char** get(){ char *a[] = { "age", "sage" }; return a; } ってなことやりたいんだけど、これだとローカルのアドレスだから static char *a[] = { "age", "sage" }; でOKなんだけど、実際はリテラルじゃない文字列の配列なので、 可変長の文字列の可変長の配列を作って返したいんですけど、 こういう場合ってどうしてます?? mallocの場合はどっかで開放が必要なんですよね。
>>650 別にmalloc使えばいいべ。freeを忘れなければよいし、すぐに終了する類の
プログラムであって、mallocの量がそれほどでもない場合は一切freeしない
という手も有る。
Bohem GCのようなGCライブラリ使うってのも手だが、それぐらいなら
C++使っちゃったほうがいいよな。。。
>>650 > 可変長の文字列の可変長の配列を作って返したい
どれがいいと思う?
・C++を使う。
・mallocを使う。
・C++のStirng, Vectorを真似て実装する。
653 :
デフォルトの名無しさん :03/02/19 15:26
strlen()でスペースと"#"を無視して レングスを測りたいんすけど、 いかようにすればよろしいでしょうか? ごきょうじゅお願いします。
>>653 > strlen()でスペースと"#"を無視して
strlen()じゃできないと思うが、全部無視したいのか?
> レングスを測りたいんすけど、
ところでなんでカタカナ?
>>653 spaceと#を取った文字列作るか、
その長さからspaceと#の数引けばいいんじゃない
656 :
デフォルトの名無しさん :03/02/19 15:37
レスありがd strlen()じゃできないっすかー。 どんなもの使うべきでしょうか? カタカナに特にいみはないっす。
自分で関数書く
658 :
デフォルトの名無しさん :03/02/19 16:40
659 :
デフォルトの名無しさん :03/02/19 16:41
例えば、『あああ』というキーワードで『あああいいうえ』をヒットさせたいのですが・・ トークン1つ1つ切るしかないのでしょうかね? わかる人書いてくれるとうれしいです。
strstr()で何か問題が?
ワイド文字で処理する
>>660 素朴なstrstr()ではいわゆる「Overlap」の問題が起きる。
1) マルチバイト文字の片割れと別の文字がマッチしてしまう
2) マルチバイト文字が二つ並んでいる状態で、1文字目の2バイト目と
2文字目の1バイト目の並びに別の文字がマッチしてしまう
UTF-8は1)2)が発生しないように設計されている。SJISやEUC-JP
では発生する。
>>658 別に詳しくは無いが...
見たところ素朴なcharのインクリメントやtolower()のようなものを
使っているようだが、通常そういう箇所は軒並み書き換える必要が有る。
エンコーディング方式がわからんが、内部コードをUTF-8にすることが
可能なら、↑に挙げた理由により、多少は楽になるよ。UTF-8であれば、
文字列中の任意のバイトについて、
・マルチバイト文字の片割れかどうかを判定する
・それがマルチバイト文字の先頭バイトか後続バイトかを判定する
・「前の文字」に移動する
・「次の文字」に移動する
といったことが極めて容易にできる。逆に、これらの道具(材料)があれば、
何をすればいいかは分かるだろう。
無論、ワイド文字を使えるのなら、その方が楽だが。
マルチバイト文字をマルチバイト文字で検索するのであればバッティングすることはない よって余計なことを考える必要はない
EUCだとバッティングする
665 :
デフォルトの名無しさん :03/02/19 18:23
なぁ、なんで引数をとらない関数の宣言or定義で func(void) と書かずに func() と書くの?
昔からの書き方
667 :
デフォルトの名無しさん :03/02/19 18:55
C言語からプログラミング始めてるんだけどCの本以外にアルゴリズムの本も必要ですか? 必要なら評調べて買うんで
何でCから始めるのかその理由を聞きたい。
CスレでCから始める奴を質問する理由を聞きたい。
670 :
デフォルトの名無しさん :03/02/19 19:04
Cは避けて通れないって本にかいてありました
671 :
デフォルトの名無しさん :03/02/19 19:05
アルゴリズムは文法みたいな物でCの本は単語みたいな物って書いてあったので 必要なのかなって
>>653 size_t strlen(const char *s)
{
size_t cnt = 0;
for(;*s != '\0'; s++)
if(*s != ' ' && *s != '#')
cnt++;
retrun cnt;
}
>>671 用もないのに読んでも実際使う頃には忘れてる
とりあえずどんなアルゴリズムがあるか
名前と概要だけ知ってればいい
674 :
デフォルトの名無しさん :03/02/19 19:17
reallocでアドレスが変わった場合も、中身はコピペされるんだよね?
うん。だから何?
される
677 :
デフォルトの名無しさん :03/02/19 19:19
>>666 標準委員会的にはどうなのよ。
int func(...)
を
func(...)
って書くのと同じくらいスッキリしないんだけど。
それとも、JAVAやC++のクラスメソッドでいうところの
暗黙の*thisの存在故にvoidとは書かない、てのが
Cでも何となく習慣化してるということ?
680 :
デフォルトの名無しさん :03/02/19 19:28
Cでは func() と func(void) は意味が違うくないか?
682 :
デフォルトの名無しさん :03/02/19 19:30
683 :
デフォルトの名無しさん :03/02/19 19:30
ある値より大きくて一番近い2のべき乗を返してくれる標準関数みたいなのありますか?
684 :
デフォルトの名無しさん :03/02/19 19:31
>>683 そんな使い道のなさそうな関数が標準関数にあるわけないだろ。
自分でかけ
知らない
686 :
デフォルトの名無しさん :03/02/19 19:39
あ、C言語ってべき乗も無かったんだけ。めんどう。 pascalなら ^ だYO!
687 :
デフォルトの名無しさん :03/02/19 19:40
じゃ、GNUなんかでべき乗なんかが入ってるソース希望。
powはpowerのことだけど、読み方はポウだよね。
690 :
デフォルトの名無しさん :03/02/19 19:44
powってdoubleっしょ。 組み込みにはきついな。
自分で ipow でも作れ 師ね
693 :
デフォルトの名無しさん :03/02/19 19:48
VB挫折したのでCに戻ってきました・・・・ またよろしくお願いします。
>>687 整数の(オーバーフローを無視した)べき乗なら、書くのは簡単だろ。
K&Rにも乗ってるが
int power(int base, int n)
{
int res = 1;
while (n-- > 0)
res *= base;
return res;
}
697 :
デフォルトの名無しさん :03/02/19 20:18
695のようなやつで、オーバーフローの把握が出来るものがあったらな...
static const unsigned short Pow[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768}; // assume 16bit short そんなことよりvoid引数の見解を述べてくれよ。
Cだけでオーバーフロウの検出ってどうやるの? 前回の結果よりも小さかったらオーバーフロウとか?
>>698 ANSI C以前はvoidがなかったから。
終了。
>>697 正確にはunsignedにするだけでオーバーフローは発生しないことになるが
多分そういうことを云いたいんじゃないよな。
多倍長計算ができるライブラリでも使ってみたら?
strtolはきちんとオーバーフローを発見するよね(^o^)
>>701 突然負の値になったりはしないけど、桁落ちはするからオーバーフローするっていわない??
オーバーフローってそういうものじゃないとか?
>>665 プロトタイプ宣言がANSIで導入された機能であることは知ってるんだよな。
K&R流の書き方では
定義:
double func(a, b)
int a;
double b;
{
:
}
宣言:
double func();
となるが、宣言が無い場合は戻り値はintと仮定されるから
intを戻す関数の宣言は省略可能で、事実省略されることが多かった。
ANSIの規格でK&R風の書き方を許しているのは単なる妥協の産物だろ。
ANSI Cで仮引数リストが書かれていない場合は、引数が空という意味ではなく
"引数は、なんでもよい(K&R風宣言と見なし、チェックしない)"
という意味だから、voidと同じではない。そういう意味ではANSI C
のプロトタイプ宣言の機能を利用するなら、voidは省略するべきではない。
>>703 本来は
>突然負の値になったり
することを云う。K&Rあたりにはunsigned演算ではオーバーフローは
発生しないとちゃんと書いて有るから、持ってるなら読んでみ。
機械のレベルではキャリーフラグが立ったりする訳で
asmならチェックするのも簡単だが、Cでは簡単・高速・移植性のたかい
方法でチェックする方法は存在しないだろう。
ダビスタ製作してるのですが馬生産部分のアルゴリズムを どうしていいか解りません。いい方法ありませんか?
>>704 サンクス。
ok、要するにC++(のメンバ関数)で仮引数リストを空のままにすることとは
意味が違うということだな。
これまで、Cのソースではvoid指定してきたから安心できたよ。
スレ違いだが、C++の場合はどうなのよ。
>>679 に書いた理由でvoid指定しないのがスタンダードなの?
それともみんな単に省略してるだけ?
プロ言C++に書いてないのか
禿はそんな細かいことまで書かない
>>708 C++ではK&R風の宣言は許していないし、引数リストを省略した場合の意味は
voidと同じになる。この点はC++とANSI Cの異なるところで、
引数リストを(K&R風の意味で)省略したCのソースをC++から使う場合は
注意が必要。
>>709 書いてない。
EC++, More EC++, Accelerated C++, その他の教本も当たり前のように
func()
だ。プライマーは見てない。
唯一のヒントは、虎本の
「引数を取らないメソッドは、voidを付けずに空の括弧だけで宣言するという点で、
JavaとCとは異なります(C++とは似ています)。」
という一節だが、理由までは言及していない。
じゃぁstaticメンバ関数とかグローバル関数はvoid付けるのかというと、
C++3版でも当たり前のように空括弧だ。
C++ではfunc() = func(void) 動的メンバも静的メンバもネームスペースレベルの関数も同じ thisは関係無いと思うが
C++で()か(void)は趣味の問題程度 あるいは、もしコーディング規約があるなら従うくらい
>>713 >>714 わかった。
大衆に迎合して、今まで通り空括弧でいくよ。
しかしint戻り値の省略の廃止やプロトタイプ宣言の厳格化など厳しくなったC++で
なんでこの点だけアバウトのままにしたかね。
パラメータ宣言の省略は禁止にすればよかったのに。互換性の問題か?
レスくれた方サンクス 非常に参考になりました。 ただ、自分にコードが書けるかどうか・・・(汗 とりあえず、今からぼちぼちやっていきます。
>>715 引数がないんだから、何も書かないのは当然。
にもかかわらず、引数に void が書けるのは C との互換性のため。
>>715 引数がないんだから、何も書かないのは当然。
にもかかわらず、引数に void が書けるのは日下部陽一のファンだから。
デコンストラクタのような元々引数を渡せない関数の場合は空括弧にして、 普通に引数は渡せるけど使わないときは(void)にしてる。
>>719 いい事を教えてやろう。
食パンににんにくを擦り付けてトーストにし、オリーブオイルを塗って醤油
をちょっとかけて食べると、うまい。
ところでデコンストラクタって何?
721 :
プログラムってなんじゃ(゚Д゚)ゴルァ :03/02/20 03:29
プログラム書いてる友人にC言語やりたいんだけどと、話したら 「( ゚Д゚)ハァ?、初心者はVisual Basicしとけ」といわれました。 プログラムについて何にも知らない香具師が C言語にチャレンジするのは無謀なんでしょうか・・・ スレ違いだったら吸いません
722 :
デフォルトの名無しさん :03/02/20 03:39
>>721 ( ゚Д゚)ハァ?と言い返しておきましょう。ていうか折れCしか知らんし。
>>721 Javaにしとけば?とCスレで言ってみるテスト。
ANSIでCの規格を策定する際、過去との互換性のためにかなり議論したそうじゃない。 リッチーもこんなに広く使われると予想したならば最初からもうちょっとましな仕様にしたのかな。
>>725 C++は過去との互換性を多少犠牲にして論理性を向上しているね。
でも元がCだけに文法的に相当無理をしていると感じられる部分が
たくさんあり、C++はとても文法が汚くなってしまったのではないか。
C99はCのマイナーチェンジだよね。根本的には何も変わっていない。
初心者にお勧めする言語 Scheme, Ruby, Python, Java 日本でコミュニティが一番大きいのはRubyかなあ… 別に上に挙げたのでなくてもいいけど、 きっちり使えるようになったら別の言語に手を染めてみるべし。 二番目に手を出すならCがお勧め。 Lisp系は一度やっとくといいと思うよ。
Lispは基本教養だからな
Cはunix系の鯖借りたりアカウント取ったとき便利だよ Cならデフォルトで使えると思っていい Cが使えないのは例外的な場合 マイナーな言語はインストールされてないんじゃないの? root権限なくてインストールできなくて使えない 使えない言語覚えてもしょうがない Lispは基本教養なの? Unixの入門書じゃ見かけないよ
プログラマとしての教養
教養ですか パソコンスクールとか英会話学校とか資格試験とか そういうのが好きならいいかもね
Lispなんざイラネ、emacs使いたきゃ覚えてろ
733 :
デフォルトの名無しさん :03/02/20 19:49
初心者君ですみませんが printf()等で %*s等の記述に用いられる *は何を意味するのでしょうか?
電脳クラブみたいな問題だしてるサイト、本、メルマガしらない?
>>733 マニュアル読もうよ。
一つだけ注意点。
一部の初心者向けの本で、
printf()系のフォーマットとscanf()系のフォーマットは「同じ」と
嘘を書いてある場合があるので要注意。
#そんな本なら捨ててしまえ。
>>733 iomanipのsetw()と似ている
739 :
デフォルトの名無しさん :03/02/21 00:33
教えて下さい。 ・サブネットアドレス(1〜32)を数値(例えば24なら0xFFFFFF00)に変換するような 効率の良いコーディング方法はありますか? ・あと、ある文字列に対し、ビット誤り率が与えられて(例えば0.008)文字列を ビット誤り(ランダム、バーストどっちでも良い)させてくれる効率の良い 方法はありますか? 二つもあつかましいですが、よろしくお願いします。
>>739 #define SUBNET(bit) (unsigned int)(((int)0x80000000)>>(bit-1))
こんなんでどうだ?
一応、漏れの書き方は処理系依存だと思うが。
後者はパス。酔ってっから。
>>740 ありがとうございます。
しかしこの方法では、例えばbit=2なら0x40000000となるんじゃないでしょうか??
>>741 処理系は?
一応gcc3.1(PPC)では、bit=2の時、0xc0000000になるよ。
その為に(int)して符号付きにしてっから。
って、答えを待たずに寝るんだけどね。 皆様、良い仮眠を。
>>740 あっ、gccっす。
私も明日試してみます。
おやすみなさい。。
#define SUBNET(bit) (0xFFFFFFFF&~(~0ul<<(32-(bit))))
#define SUBNET(bit) (0xFFFFFFFF&~(~0ul<<(( ;゚Д゚)))))) ガクガクブルブル
>>739 #define SUBNET(bit) (0xFFFFFFFF^(((unsigned)0xFFFFFFFF)>>bit))
sizeof(int)==32ならば、、、 #define SUBNET(bit) (((unsigned)~0)<<(32-(bit)))
>>749 256bit以上で256とは限らないけど(・∀・)イイ!!
>>748 ==750
>>749 は
(sizeof(int)==4&&CHAR_BIT==8)の間違いに対する突っ込み
おいおい、指摘されるまで気づかなかったぞ(恥恥恥
なにがsizeof(int)==32だ
(sizeof(int)*CHAR_BIT)==32だろ
>>749 >>752 サンクス
islowerは大抵マクロだけど、tolowerは関数なのか。
遅くなりましたが、レスして頂いた方々ありがとうございました。 非常に勉強になりました。皆さんのレスを参考に勉強してみようと思います。 皆さんのような初心者に助言出来る漢に早くなりたいです。 恥ずいので、sage(´Д`;)
サブネットアドレスで、/2なんてみたことねー
typedef struct HOGE hoge; struct HOGE{ int n; char buff[INT_MAX]; }; この順番でもいいの? 未定義の識別子とかエラーにならない?
FreeBSEとNetBSEではどちらがオススメですか?
759 :
デフォルトの名無しさん :03/02/21 15:42
私メル友がすっごくすっごく欲しくってー、\(⌒∇⌒)/
探してたら(◎_◎)なんとっ!☆彡(ノ^^)ノ☆彡ヘ(^^ヘ)☆彡(ノ^^)ノ☆彡
素敵な掲示板♪を発見!!!!(^o^)//""" パチパチパチ
あやしい所とか…{{ (>_<;) }} ブルブルすごい数の掲示板がありますけど、
これ全部1人の方が管理しているんですか?(@@;)すごすぎ …
てなわけで、ついつい書いちゃったのらー(o^v^o) エヘヘφ(`∇´)φカキコカキコ♪
メル友に、なってくれるよねっ。(*^-^*) お・ね・が・い♪(* ̄・ ̄)ちゅ♪ッ
アドレス
[email protected]
Free Bovine Spongiform Encephalopathyでしか?
>>757 typedefではstruct HOGEという型にhoge_tを割り当てるだけ。
struct HOGEをこの段階で参照しているわけではないので問題なし。
そうでないとこう言うことができない。
typedef struct HOGE hoge_t;
struct HOGE {
int n;
hoge_t *pNext;
};
それはいいけど、INT_MAX個の配列の方が(文法上問題なくても)無理っぽ。
762 :
デフォルトの名無しさん :03/02/21 16:40
int a=2; a *= 1.5; の結果ってコンパイラによって違うんですか? LSI-C86だと a == 2 LightCだと a == 3 になるんですが。
LSI-C86は、標準では整数型の範疇で処理しようとするので要注意。 普通のコンパイラなら、doubleの演算を行なうので3になるはず。
>>762 gccでオプティマイズしたら、
int a = 3;
と同じコードを出力してきた。
つられつられて、母を訪ねて三千里。 gcc,と,bcc,と,mscとか,あんしcを比べてみれば?
766 :
デフォルトの名無しさん :03/02/21 17:10
char s[512], hoge[512]; struct AHYA{ unsigned char piyo[2]; } printf( "s =%s\n", s); $3438 /* 文字列 */ sscanf( s, "%x", hoge ); printf( "hoge =%x\n", *(int *)hoge); $3438 /* "34""38"の2バイト */ このhogeの中身を AHYA.piyoに格納したいのですが どうにもいれることができません。 童貞だったときに、あせって尻の穴に ティンコを挿れようとし、怒られた気分です。 どなたか御教授くださいませ。 おながいします。。。
>>766 structの定義の仕方を勉強し直してらっしゃい。
>>763 ありがとうございます。
ちょっとLSI-Cのマニュアル見てみたんですけど、これに関する記述は見つからなかったです。
「標準」というのがどういう場合かわからなくて不安です。
>>767 サソ
スマソ・・・
変数定義し忘れておりますた。
スマタスマタ・・・(;´Д`) ハァハァハァハァハァハァハァ
struct AHYA{
} sumata;
ということで、再度御教授おながいいたします!!
質問の意味がわかりません。 他の人お願いします。
>>768 LSI-Cの代入演算子は、代入されるべき型へのキャスト後に演算を行なう仕様だったかと。
即ち、
int a = 2;
a *= 1.5;
は
通常のcが
a = (int) ((double) a * (double) 1.5);
と解釈してdoubleで乗算を行なうのに対してLSI-Cでは
a = a * (int) 1.5;
と解釈してintで乗算を行なう。
なので、代入演算子には注意が必要。
772 :
デフォルトの名無しさん :03/02/21 20:24
K&R読んでたんだが 添点の読みかた教えてください てんてん?そてん?
茶道だと、点前(てまえ)とかいうもんな。
野点(のだて)というのもある。
777 :
デフォルトの名無しさん :03/02/22 01:03
777
>>773 goo国語辞典でも出てこない罠。
つーかおまいら、ここはC言語スレですよ?
K&Rの何頁だい?
C言語は日本語の基礎を理解していないと習得できない。 1978,Brian W. Kernighan
K&Rは、日本語の基礎を理解していたのか・・・
782 :
デフォルトの名無しさん :03/02/22 02:02
>>781 日本語の勉強はしていたらしいとマゾレス
蟹飯って名前いいよね
>>782 K&R日本語第2版の訳者前書きにそういうエピソード出てくるよね。
785 :
デフォルトの名無しさん :03/02/22 05:28
ベテランはCの標準関数は全く使わないんだってね!!
そう。ベテランはクラスライブラリを利用する。
C言語スレで何言ってるの
ベテランはハンドコンパイルしてハンドリンクする。
789 :
デフォルトの名無しさん :03/02/22 12:50
本の話になるのですが 独習CとK&R、買うんだったらどっちがいいでしょうか? もしよければ、みなさんのオススメの本も教えてくらさい
プログラミング初心者なら独習 それ以外ならK&R
なるほど じゃあ自分は初心者だから独習かな 返答ありがとうございました
毒手C言語
それと、790さんの答えをいただいて もう1つ質問なのですが どんなことが出来れば上級者で どんなことが出来なければ初心者なのでしょうか? 愚問スマソ
定義が存在しない以上、そんなことを判断することは出来ない
事前の設計無しに無理なく10万行のコードを書き上げられること。
プログラミング技術とC言語利用術を区別できれば初心者脱出。
上級者とか言ってて恥ずかしくならないか? そんなに級がほしけりゃパソコン検定でも受けてろ
おれはPG初段だけどね
さーて、これから憂鬱本でも読むとするか。
>>795 まともに設計して 30K ステップ程度のものを
100K ステップ書いたのだとしたら相当無能ですが。
ANSI/ISO準拠のCのパーサを空で書ける奴は間違いなくCのベテラン。 コンパイラ書きでもなければ、Cという言語自体のベテランである必要はない。
>>795 > 事前の設計無しに
(・∀・)ニヤニヤ
( ´,_ゝ`)プッ
(゚Д゚)ハァ?
ステップって何? 行数との違いは?
>>805 正確な定義はしらん。というか多分無いだろう。
構文規則で云うところの「文(statement)」のような気もするが、
複文(compound-statement)のように、他のstatementを(再帰的に)含む
文の扱いが自明でないので、違う気もする。
現実的にはコメントや空白のみの行、空行等を除いた行数を「ステップ数」
と云っていることが多いと思われ。
808 :
デフォルトの名無しさん :03/02/22 21:08
独習って無駄なことがだらだら書かれてあんなに量が多くなってるんだと おもうけど それは間違い?
毒手って無駄などくがだらだら染みこんであんなに手が黒くなってるんだとおもうけど それは間違い?
黒人差別か
811 :
デフォルトの名無しさん :03/02/22 23:01
学校のほうでLinux上でC言語のプログラムを組んでるんですが Linuxでは動くプログラムがBorlndのコンパイラではコンパイルはできるのですが 実行ファイルが正常に動かないんです。何か解決方法あれば教えていただけないですか
それだけでわかるかよ。 リンクできたのならLinux独自の関数(各種システムコールとか)を使っているせいではないだろうし。
>>811 コードによってはコンパイラ毎に動作が異なることがあるし
バグがあった場合その症状が出たり出なかったりすることもある。
単純にバグだと思ってBorland Cでデバッグしなよ。
814 :
デフォルトの名無しさん :03/02/22 23:12
>>813 即レスありがとうございます.
やはり、コンパイラが異なるからからですか。とりあえずやってみます。
Linuxでは初回のmallocが0fillされてて初期化し忘れてもちゃんと動いて それをWinに移植するとちゃんとバグってくれる。フフフフフ
>>811 単に gcc 拡張を使っているんじゃないのか?
それか、もとのLinuxでも、警告が出ているのを無視しているとか。
他のコンパイラだと警告レベルのものを、Borlandだとエラーで止めることがある。
>>817 コンパイルもリンクもできたと言っているが。
同名関数の挙動の違いによるものに一票
不正な領域に書き込みしているに一票
UnitTestをしていないのが悪いに一票
エラーチェックしていないだけとか・・・
ぬるぽが悪いに一票
ファイルをfopen("/home/giko/mona.txt", "r")みたいに指定してるとか。
>>824 かつエラーチェックしていないってやつね。
1byte余計に書き込んでいるバグを2年も気づかず、ある日思い出したように (ソース変更してないのに)プログラムがクラッシュしだした。 Windowsでの実話。俺が悪いんだが、Windowsって不思議なOS。
環境かえるとバグを発見しやすいからgcc&linuxのプロジェクトでも いっつもVCでビルドとおるようにしてるよ。VSの方が使いやすいって事もあるけど。
どうせこんなの改行コードの違いとか程度のことじゃねーの?
p = malloc(0); ↑0バイトの領域確保しても問題ないですか? 常にNULLでぃすか?
>>830 0バイトでも問題無いんじゃねーの?
0バイトの時に、*pに大して全く参照も代入もしないんであれば。
但し常にNULLとも、NULLで無いとも言えない。
処理系に依存してたと思う。
心配なら、mallocする前に引数チェックしる。
え〜っと、自分の頭が悪いに一票
質問でございます。 どうあがいても、コンパイラにプロトタイプ宣言のない関数の呼び出しって 怒られます。すげーむかついてます。 なんででしょうね?不思議ですね。 考え得る原因はなんでしょうか。
>>833 本当に足掻いたか?
足掻いたソースを見せてみろ。
やっぱりそうきたかー なんか怒られつつも実行できたから、余計にむかついてるんです すざけんな!
836は
>>834 への返答です
足掻くというのはなんでしょうか?
何度もすみません。
あと”ふざけんな!”ってのは(すざけんなになってるけど 俺が使ってるボーランドのコンパイラに向けての叫びです。 何度もすみません。
>>833 int main()
{
func();
return 0;
}
こういうのがいけない。
funcの呼び出しの前にint func(void);など(もちろん実際の関数定義と同じもの)と書いておく。Cならエラーにならないけど、C++だとエラーになる。
ちなみに通常printfなどで警告がでないのは、それのプロトタイプがかかれたファイル(stdio.h)をインクルードしているから。
「足掻く」で「あがく」って読むんですね、、。 どうか見捨てないでください。ソース書きます。 #include<stdio.h> #include<stdlib.h> #include<time.h> /* 定数 */ #define GAME_COUNT 5 //ゲーム回数 #define INITIALIZE_POINT 10 //得点の初期値 #define NOT_USED 0 //未使用カード #define USED (-1) //使用済みカード /* グローバル変数 */ int computer_card[3]; int computer_point; int player_card[3]; int player_point; int card[4][13]; /* プロトタイプ宣言 */ void showpoint(); void shuffle(); int getcard(); void showcard(); void judge(); int main(){ て感じですが、、、
>>840 肝心の「プロトタイプ宣言のない関数の呼び出し」の部分を書かないとだめでしょ(^_^;)
多分stdio.h,stdlib.h,time.hにない関数を使っているんじゃないかなぁ。
はい。main関数の中で for(i = 0; i < GAME_COUNT; i++){ showpoint();//現在のプレイヤの得点を表示 shuffle();//カードを初期化 computer_card[0] = getcard();//コンピュータにカードを1枚配る player_card[0] = getcard(); player_card[1] = getcard();//プレイヤにカードを2枚配る showcard();//カードを表示 の部分のshowpoint(), shuffle, getcard()及びこのあとの関数全部に 警告が出ます。もちろんいっちゃん下のほうで全関数を定義してるんですけども うぅぅ、、、
悪いこと言わんからプロトタイプ宣言はやっとけ。 ちゃんと動いてるというのがたまたまちゃんと動いているように見えるだけかもしらんし。 プロトタイプ宣言があればそういう危険性はかなり減らせるぞ。 (あくまで減るだけな。なくせはしない)
mainを一番下に移動しろ
>>840 この問題とは関係ないけど、Cの場合、プロトタイプの引数リストの省略はやめた方がいい。voidならvoidとかく。
プロトタイプと関数の定義に食い違いがあるとか?
>>844-846 様方
>>845 様のいうようにmainを一番下に移動しても
警告が出て、きれました。
そこで、
>>846 様のいうように引数を全てvoidに書き換えた所、
問題なくコンパイルできました。
感動しました。
今後もこのプログラム技術板にくだらない質問を投げかける可能性があります。
そのときも、どうか今回のような暖かい対応をしてやってください。
まじでありがとうございました。
やっと寝れそうです。
警告メッセージを書いてくれるとよかったとおもいます
>>849 え?BCCってそういう挙動をするの?
gccじゃならないけど(^_^;) 多分VC++でも。
どちらが正しいんだろう。
>>850 はい。警告メッセージは、
警告 W8065 bj.c 162: プロトタイプ宣言のない関数
'showpoint' の呼び出し(関数 main)
でございました。
何度もすみません。
BCCは /* プロトタイプ宣言 */ void showpoint(); void shuffle(); int getcard(); void showcard(); void judge(); これらをどう見ているんだろう。
VC++6.0でもならなかった(もちろん/W4はつけた)。
/* プロトタイプ宣言 */ void showpoint(); どう解釈されるか、だな。 cの場合、()の場合は引き数の宣言の省略と見做される。 つまり、プロトタイプ宣言にさえなっていない。 c++の場合、()の場合はvoidの省略と見做される。 つまり、引き数がないことの宣言とか解釈される。 どっちみち、cなら(void)って書いておけ。
プロトタイプ宣言にはなってるだろ。 Cであれば、 void showpoint(); は void showpoint(...); と見倣される。
>>857 なってません。
任意の引数がOKというのと引数に関する情報がないというのは別。
そもそも...単独というのはCでは許されない。
これだからc++だけ齧ってc知らない奴は……
多分ボーランドのコンパイラのバグだと思うぞ
861 :
デフォルトの名無しさん :03/02/23 10:51
void main(void)の場合は正常、 main()の場合はエラー bccはこのようなことになるのに gccだとエラーがでないのは何故ですか? どちらが正常ですか?
void main じゃなくて int main が正解
少なくとも、エラーと警告の区別もつかない
>>861 以外。
>>861 お前のコーディングが間違っている
コンパイラがエラーに厳しいか甘いかの違い
void* main(void)
866 :
デフォルトの名無しさん :03/02/23 11:06
int mainだと警告になりましたbccでやると void mainだと正常 正解はint mainでしたか なかなか基本的な部分で違いがあるので混乱しますね レベルが低いということでしょうか この程度も統一できないということは
>>866 レベルが低いということでしょうか
この程度も理解できないということは
868 :
デフォルトの名無しさん :03/02/23 11:11
正常ならばいちいち警告を出す必要は無いと思うが、、、 cとc++の違いによるものですか?
main の return 忘れてるだろ
BCCはデフォルトでいろいろ警告がウザいのは事実ではあるが。
main() みたいに戻り値を省略したらintを返すと解釈される だからintを返さないとエラー
872 :
デフォルトの名無しさん :03/02/23 11:35
#include <stdio.h> int main(void) { printf("c\n"); return(0); } #include <stdio.h> void main(void) { printf("c\n"); } この二つはどちらが正常ですか それともどこが間違っていますか?
いや、 char * main(void) { printf("c\n"); return "successful"; } が正解だろ。
875 :
デフォルトの名無しさん :03/02/23 11:58
書籍を3冊見たら3冊とも違うパターンでした 872のような二つと単なる main() だけの記載のものと 三者三様でした
>>875 ↓これが正解
FILE *main(double argc,size_t *argv[])
11.15: 僕がいつも使っている『ほんとおの馬鹿向けのC』には、いつもvoid main()と書いてる。 A: たぶんその本の著者は自分も対象読者の一人に数えているのだろう。 不思議なことに、例題のコードでvoid main()と書いてる本は多い。 そういう本は間違っている。
>>859 いやー、ごめんね。普段Cなんていう化石使ってないから・・・
880 :
デフォルトの名無しさん :03/02/23 12:43
わかりました わかる人が誰もいないということですね
ANSI規格的には int main() が正しい
882 :
デフォルトの名無しさん :03/02/23 12:51
わかりました int main() でやります
MSDNライブラリのサンプルもvoid main()になっているよね。
mallocしたヒープ領域を明示的にfreeせずにmainを抜けた後に OSが自動的に開放してくれることを期待したコードを書いても大丈夫ですか? それとC言語のgotoってどのようなケースで使われるのでしょうか?
>>884 gotoはifと組み合わせてwhileのかわりに使う。
>>884 そのOSでfreeせずに抜けるコードを作ってためしゃいいのでは?
int mainの次はfreeかよ
freeの次はdeleteかよ
過去ログ検索って何ですか?
>>889 HANDLE FindPastLog(LPCTSTR lpszName, DWORD dwReserved);
892 :
デフォルトの名無しさん :03/02/23 13:48
残念ながら間に合いませんでした。
>>884 breakもreturnも、言ってみれば飛び先の確定しているgoto。
つまり、関数分けを使いたくないときに使われることがたまにある。
ex)
void func(void)
{
初期処理();
if (条件) {
goto end;
}
本処理();
end:
終了処理();
return;
}
この場合、条件判断を本処理に入れればgotoは不用になる。
或いは、次のように書いてもいい。
void func(void)
{
初期処理();
if (!条件) {
本処理();
}
終了処理();
return;
}
(・∀・)チンポ!! (・∀・)
(・∀・)ヌルポ!! (・∀・)
896 :
デフォルトの名無しさん :03/02/23 14:27
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >.__Λ∩
_/し' //. V・∀・)/
(_フ彡 / ←
>>895
897 :
デフォルトの名無しさん :03/02/23 14:38
int arr[3][3][3]; int *(*ptr)[3][3]; のとき、ptr が arr[1][1][1] を指すようにする方法を教えてください。
ptr = &arr[1][1][1];
訂正です。
誤 ) int *(*ptr)[3][3];
正 ) int (*ptr)[3][3];
>>898 それだと、int * から int (*)[3][3] に変換できない。といわれます。
>>897 その定義では ptr はサイズ[3][3]の int型へのポインタの配列を
指しているから、キャストするだけでは無理。
>>900 ptr = (int (*)[3][3])&arr[1][1][1];
>>901 期待する結果が出ました。ありがとうございました。
単にキャストするだけでよかったのですね。
ptr = arr + 1 + 3 + 9;
などとやっていました。
903 :
デフォルトの名無しさん :03/02/23 17:14
>>893 gccだとラベルのアドレス取得とポインタへのgoto使えるから、
関数内ジャンプテーブルなんてことも出来るんだけどね。
これってC99でも仕様に取り込まれてないよね?
変数a、bを入れ替える場合、こういうのでいいんですか? int a,b; int hoge; hoge = a+b; a = hoge-b; b = hoge; これでいいのでしょうか? もっとうまく、見やすくする方法とかないですか? 単純なことですがどうかよろしくお願いします。
int tmp=a; a=b; b=tmp;
908 :
デフォルトの名無しさん :03/02/23 20:15
int a, b; int tmp; tmp = a; a = b; a = tmp; ?
あぁ、そういうやり方がありましたか。 どっちも>906より見やすいですね。
910 :
621です :03/02/23 20:19
基本的なしつもんなのですが… C言語でファイルを読み込む際、途中から読み込むにはどうしたらいいのでしょうか? (例) test.txtに保存されてある情報 ----------------------------------------- name:takasi age:20 kao:c:\windows\デスクトップ\data\kao1.bmp name:taro age:22 kao:c:\windows\デスクトップ\data\kao2.bmp name:yasiro age:25 kao:c:\windows\デスクトップ\data\kao3.bmp ----------------------------------------- とあった場合、test.txtをopenした時、先頭の行から読み込むのではなく、「taro」だけの部 分を読み取りたいのですが… (具体的にはtaroとageの部分とkaoの部分を一緒にテキストファイルから取得したい) どういうふうにCにすればいいのかでまた困っている状態ですので教えてください
911 :
デフォルトの名無しさん :03/02/23 20:20
すいません、621ですという名前、間違いです。 ただの名無しなのでこのスレ中の621さん、スマソ つД;)
>>910 "name:taro" が出てくるまで普通に読め。
('A`)fseek
>>910 Windows 専用で良ければ、ファイルを以下のように直した後
-----------------------------------------
[takasi]
age=20
kao=c:\windows\デスクトップ\data\kao1.bmp
[taro]
age=22
kao=c:\windows\デスクトップ\data\kao2.bmp
[yasiro]
age=25
kao=c:\windows\デスクトップ\data\kao3.bmp
-----------------------------------------
const char *inifile = "test.txt";
const char *section = "taro";
int age;
char kao[MAX_PATH};
age = (int)GetPrivateProfileInt(*section, "age", 0, inifile);
GetPrivateProfileString(section, "kao", "NUL", kao, sizeof(kao), inifile);
>>913 どこにシークしろと
>>910 FILE *f = popen("sed -n '/^name:taro/,/^$/{//q;p;}' test.txt", "r");
fgets(name, sizeof name, f);
fgets(age, sizeof age, f);
fgets(kao, sizeof kao, f);
sedかっこいい。
fseek だと固定長にするしかないな。
> 基本的なしつもんなのですが 一体どういう意味でこれを書いたのか教えてもらいたい。
基本的なつけもんなのですが
根源的な質問なんですがどうしてC言語使いは性格の歪んだ人が多いのでしょうか? 初心者ですので懇切丁寧に教えてください。
> C言語使いは性格の歪んだ人が多いのでしょうか? その事をどうやって知り得ましたか?
>>920 頑固なジジイなんだからしょうがないじゃん。
公文的なポケモンですが・・・しまった、後が続かない。
>>910 typedef struct USER {
char name[20];
int age;
char kao[200];
} User_t;
とでもしておいて、
User_t *getUserData(FILE *fp);
んな関数作って、
User_t *pUser;
FILE *fp = fopen("test.txt", "r");
do {
pUser = getUserData(fp);
} while (strcmp(pUser->name, "taro") != 0);
fclose(fp);
printf("%s の年齢は %d、顔は %s を見ろ。\n", pUser->name, pUser->age, pUser->kao);
とでもすればいいんでないの?
925 :
デフォルトの名無しさん :03/02/24 00:30
教えて下さい。 #define MSG(p) ("test" + p + "\n") というようなマクロを作りたいのですが、 うまくいきません。 pには文字列を入れる場合と、数値の場合があるのですが、 それぞれどのようなマクロを作ればよいでしょうか?
文字列リテラル用 #define MSG(str) "test" str "\n" 定数用 #define MSGi_(n) MSG(#n) #define MSGi(n) MSGi_(n)
>>926 ありがとうございました。
定数用の#nはどのように使うのですか?
MSGi()は正確には定数用じゃなくてなんであろうと文字列化して"test"と"\n" と連結するマクロだが、MSGi_()はwork用のマクロなので直接使うものではない。
929 :
デフォルトの名無しさん :03/02/24 04:52
賢い人!教えてください。 int main() { FILE *fp; char c; fp = fopen("c:\\hoge.txt", "wb"); c='.'; fwrite(&c, 1, 1, fp); fwrite(&c, 1, 1, fp); ?? fclose(fp); return 0; } 2バイト目を削ってサイズが1バイトのファイルとしてクローズさせるには どんな関数を使えば良いのでしょう?
freopen()
931 :
デフォルトの名無しさん :03/02/24 04:59
>>929 ftruncate()とかchsize()
>>932 天才!まさに、これがやりたかったのです。
fseekじゃあ移動するだけでした。(汗
>>933 そんなもん使うなんて設計がおかしくねぇの?
flock使う時は必用になることがある
素直に必要な部分だけのファイルを作って renameがおすすめ。
/* ファイルを単純に切り詰める。 */ void truncFile(char const *file, size_t len) { FILE *fpOrg; FILE *fpTmp; char *pBuf; char const *pTemp; pBuf = malloc(len); fpOrg = fopen(file, "r"); fread(pBuf, 1, len, fpOrg); fclose(fpOrg); pTemp = tmpnam(NULL); fpTmp = fopen(pTemp, "w"); fwrite(pBuf, 1, len, fpTmp); fclose(fpTmp); rename(pTemp, file); free(pBuf); return; } /* きたねぇコードだ */
おっと忘れた。 len = fread(pBuf, 1, len, fpOrg); にすればlenがファイルより長くても安心だな。 勿論、malloc()、fopen()、fwrite()、(write後の)fclose()、rename()の 戻り値のチェックも忘れずに。
同名ファイルがあってもrenameできるのか?
最後の return; ってなんでしか
>>939 マニュアルページを見る限りできるように思う。
できなきゃremove()するまで。
>>940 真面目に戻り値を返す意図があった名残。
Cにtmpnam()というライブラリ関数があるので、テンポラリファイルには この関数を使って名前作成しよう。
int rename( const char *oldname, const char *newname ); 戻り値 成功すると 0 を返します。エラーが発生すると 0 以外の値を返し、 グローバル変数 errno に以下のどちらかの値を設定します。 EACCES newname で指定したファイルまたはディレクトリが既に存在するか、 パスが無効で作成できない。 あるいは、oldname がディレクトリであるのに、newname で別のパスを指定した。 ENOENT oldname で指定したファイルまたはパスを検出できない。 EINVAL 名前に無効な文字が使われている。
> マニュアルページを見る限りできるように思う。 どういう読みかたしたのか知らんが出来ない > できなきゃremove()するまで。 最初からそうしとけ
>>946 関数 必要なヘッダー 互換性
rename <io.h> または <stdio.h> ANSI, Win 95, Win NT
>>942 |説明
| tmpnam() 関数は、ファイル名に使える文字列へのポインタを返す。この名前を持つファイル
| は、ある時点では存在していなかった。従って幼稚なプログラマはこの文字列がテンポラ リ
| ファイルのファイル名として適していると考えるかもしれない。
それに同じファイルシステム上に作られるという保証はない。
>>945 ,947
一般的にUNIXでは可能。
renameなんて関数が標準ライブラリにあったんだな・・・
よく分からないんだけど tmpnam() は使わずに自作しろってこと?
てか問答無用で(removeして)renameするなら、 > fpTmp = fopen(pTemp, "w"); この時点で目的のファイル名にしておけば
ところで、UNIX上でrenameして 指定されたnewnameのファイル/ディレクトリが既に存在していた場合どうなるの? 既存の方は消される? あるファイル名を既存のディレクトリ名にrenameしたら、そのディレクトリは消える? Windowsだと同名のファイルとフォルダは共存出来ないけど…
unixでもディレクトリはアンリンクされませんよ。 ファイルはアンリンクされるけど、 他のプロセスがそのファイルをオープンしている限りディスク上からは消えない。
>>953 > 指定されたnewnameのファイル/ディレクトリが既に存在していた場合どうなるの?
> 既存の方は消される?
removeはターゲットがファイルの場合はunlink, ディレクトリの場合はrmdir
相当の処理を行う。よって
> あるファイル名を既存のディレクトリ名にrenameしたら、そのディレクトリは消える?
既存のディレクトリ配下にファイルやディレクトリが存在しない場合は消える。
存在する場合、rmdirも失敗するので、removeも失敗する。
> Windowsだと同名のファイルとフォルダは共存出来ないけど…
Unixでも同じ。
>>955 ディレクトリもひとつのファイルだしな。
>>954-955 なるほど、要するに既存の場合はremoveを試みてくれるわけね。
どうもありがとう。
tmpnam()を実行した時点ではそのファイル名が存在していなくても、 ファイルを作成しようとした時にそのファイル名が存在しない事は保証されない、 という事かな
>>959 tmpnamを呼んだ時点では存在しなくても、その後実際にファイルを作成しようと試みるまでに他のプロセスによって作成されてしまうかもしれない。
ということでしょ?
>>960-961 あーやっぱりそれかあ。どうもです。
mktemp()のほうには書いてあった。
>その名前がすでに存在しているかどうかテストして、そのファイルをオープンする間に競合がある事から
tmpnamって変な略し方
tmpnam() は TMP_MAX回を超えて呼び出すとNULLを返すように なり、はっきり言って全然実用的じゃない。俺は使わない。
965 :
デフォルトの名無しさん :03/02/24 22:14
C言語でエディタを作るとき、 while(fgets(buffer,BUFFERSIZE,fp)!=NULL){ } のBUFFERSIZEを#define BUFFERSIZE 4096 としてるんですが、4096を超えるファイルに対応するには どうしたらよいですか?
複数回に分けて読み込んでバッファ的に分かれているけど同一行フラグを立てるとか。
#define BUFFERSIZE 4294967296 にしろ。
どうでもいいがエディタを作ろうという奴が
>>965 のような質問を
すること自体が驚きだ。
内部構造はgapped bufferかlinked listなんでしょ?
同じように動的に行を読めばいいだけの話。
969 :
デフォルトの名無しさん :03/02/24 23:48
そういやエディタ作ってるやついたな 作りかけのやつうpして質問してた
970 :
デフォルトの名無しさん :03/02/25 00:10
>>968 gapped buffer、linked list
ってなんですか?
おいおい、そんなことも知らずにエディタ書こうとしているのか? 今時はソフトウェア作法も読まないのかねぇ。
972 :
デフォルトの名無しさん :03/02/25 00:24
while( !feof(fp) ){ fread(buffer,sizeof(char),BUFFERSIZE,fp); fwrite(buffer,sizeof(char),BUFFERSIZE,stdout); } こうやってあるバイナリファイルを画面出力するとBEEP音が2回くらい鳴るのですが どうして?
>>972 そのファイル中にベルコード(0x7)が含まれているからだろ。
>>739 でも質問しましたが、再度質問です。
・あと、ある文字列に対し、ビット誤り率が与えられて(例えば0.008)文字列を
ビット誤り(ランダム、バーストどっちでも良い)させてくれる効率の良い
方法はありますか?
どなたか良いコーディング方法がわかる方アドバイスください。
ある関数に引数で、バッファのポインタとバッファ長を渡し、
ビットエラーレート0.008がわかっていて、
ランダムで誤りを生成したいです。
よろしくお願いしますm(__)m
977 :
デフォルトの名無しさん :03/02/25 01:24
ある数字を有効数字3けたにかえるにはどうしたらいいでしょう
次スレ立ててもいい?
どうせFAQしかないから過去ログ検索だけで十分だろ。
ぬるぽ
>>977 文字列に直して先頭3文字以降を0にして戻すとか。整数の場合ね。
>1000 おつかれ
ミノガサナイゼ
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >.__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>983
988 :
デフォルトの名無しさん :03/02/25 04:02
ぬるっぽ
stricmpみたいに大文字小文字区別せず処理する標準関数は 他にありますか?
y y i、 __ _, --- 、_ _ r' `ヽ (ノ´ 二ニ二 て) / i、,〉'<入_li il_入>tイ、ノ
993 :
デフォルトの名無しさん :03/02/25 04:21
strcasecmp strncasecmp だろ
996 :
デフォルトの名無しさん :03/02/25 04:55
((((;゚Д゚))))ガクガクブルブル
998!!!
999 :
デフォルトの名無しさん :03/02/25 04:59
999!!!!!!!! !!!!!!!!!!
1000 :
デフォルトの名無しさん :03/02/25 04:59
| M ヽ |从 リ)〉 |゚ ヮ゚ノ| 1000 キタ… ⊂)} i ! |_/ヽ|」 |
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。