姉です。30年プログラムを作りつづけて嫁に行きそびれてしまいました。 でもC言語の腕には自身があるので何でも聞いてね。 PS 関連擦れは面倒なのでほかの人に任せます。ウフッ
無責任一代女かYO!
7 :
デフォルトの名無しさん :02/09/21 20:11
うお、カブッタ。。鬱
12 :
デフォルトの名無しさん :02/09/21 20:21
13 :
デフォルトの名無しさん :02/09/21 20:21
<33> だと かちゅ〜しゃ で化けることがあるからなのか? subject.txt取得後だと問題ないんだけど。
だんだんこのスレの
>>1 は面白みに欠けてきてる・・・
質問です 配列を宣言と同時に初期化する際、 array[] = "ABCDEFG"; とするような感じで、文字列ではなく 数字を入れる方法がありましたら教えてください。
17 :
打・サイタマ@受信料未払い :02/09/22 00:51
>>16 array[] = {1,2,3,4,5,.......};
じゃダメなん?
>>16 int n[]={4,12,76,3,0,65};
大事なことを書き忘れました。 関数の引数として func("ABCDEFG"); のように使える関数をつくりたいのです。 で、文字列だと上記のように渡せるのに、数字だと""で囲めない?ので 困っています。 型は、char型を考えています。
22 :
打・サイタマ@受信料未払い :02/09/22 00:59
>>21 もう一回文字列リテラルのこと調べなおすべし!
>>24 難しい質問だから聞いているんです。
もう少し考えてください。お願いします。
違ってるかもしれんが、 func("\x01\x02\x03"); という意味なのか? 渡されるのがポインタだということは わかってるんだよな?ボケナス。
27 :
デフォルトの名無しさん :02/09/22 01:05
>>27 何がわからないのかがわかりません。
わからないことを書いていただかないと質問に答えられません。
配列に入れて渡すのはダメなの?
脱いでもすごいです。
ネタかこいつ。面白くないから無視。
>>28 何がと言うか、ぜんぜんわかりません。
初歩的なことですみませんが、はじめから教えてもらえませんか?
いいかげんウザイ
ε=ε=ε=ε=ヾ(;@×@)ノ
あの、23、25、28、30は偽者です 面白ければ放置しようとおもっていたのですが。。。 いま、実験しています
いつのまにか偽者がたくさん。だから2ちゃんは...
37 :
打・サイタマ@受信料未払い :02/09/22 01:15
>>23 すまん、煽りじゃないんだよ。
func()内で中身を入れ替えたりするなら気をつけよう。
....ところで、ポインタって知ってるかい?
関数に直接配列か、それは無理だった気が。 C99ではできるんだっけ?
誰に口聞いてんだ貴様ら
>>39 ( ´,_ゝ`) プッ
そこまでやるか普通?
プログラムやるやつは糞だと聞いていましたが、 ホントだったようですね。 失望しました。
>41 あのさ、とりあえず俺は真面目にあんたの 質問聞いてやってるつもりだよ。 その言い方はないんじゃない? はっきり言ってあんたの質問の意味がわからん。 関数作りたいなら void Test(char* s); じゃだめなのか? なんでこれが駄目なのかよくわからん。
全員16を名乗るスレはここですか?
44 :
打・サイタマ@受信料未払い :02/09/22 01:22
やれやれ、まだ夏厨の残党が いたのか・・・。荒ちまったな。申し訳ない。
16ウイルス、自己増殖中・・・。
最近涼しくなったよねー。
>>42 偽物だと気付けよ。
本物は mailto: が全角の空白1文字になってる。
これより上のカキコだけはな。
そろそろオレも「C++なら全手俺に聞け」というスレでも立てるか・・・。
♪人生1616〜
>>偽者
痛いところを疲れて完全にキレられたようですね
>>26 ポインタはわかっています
\xというのは使ったこと無いのでよくわかりませんでした。
>>37 もちろん、入れ替えたりしません。
>>22 文字列リテラルに数値をもぐりこませることは出来ないと言う意味でしょうか
本物は 16,21,35,50 だけ。 残りは2人の低能な偽物による荒らし。
それと、
>>29 配列に入れないといけないようでは使い勝手が落ちると思い、
このような質問をすることになりました。
相変わらず16のしたいことがわからないんだが func( int[]{ 0, 10, 20 } ); 風にしたいってことですか?
使い勝手って何?
55 :
打・サイタマ@受信料未払い :02/09/22 01:39
>>50 文字列って言っても、要はキャラクターコードが入ってる配列のポインタを関数に渡しているってことだから、渡したいchar型数値に該当するキャラクターコードを突っ込んだ文字列リテラル作って渡すこと可能だよ。
array[] = "abc" なら array[]={ 0x41,0x42,0x43} と同じものが入っていると考えてもいける。
でも、素直に
char array[] = {1,2,3};
func(array,sizeof(array));
とかしたほうが良さそうだけど・・・。
>>53 文字列だと
char array[] = "ABCDEFG";
func(array);
を
func("ABCDEFG");
にできるのに、
数字だと
char array[] = {0, 10, 20};
func(array);
を
func({0, 10, 20});
みたいにできればメモリ領域の節約にもなるし
関数としては使い勝手がいいとおもうのです。
57 :
打・サイタマ@受信料未払い :02/09/22 01:41
あ、array[]={ 0x41,0x42,0x43}なら "ABC"だな・・・鬱だ。
58 :
デフォルトの名無しさん :02/09/22 01:42
>>57 それよりももっと重要な'\0'を付加することを忘れているぞ。
今日は電波強いね
ようやく16のやりたいことが見えてきた。
>>59 俺のこと?
もしかして間違っている?(^_^;)
62 :
打・サイタマ@受信料未払い :02/09/22 01:47
>>57 ああ、やってしもうた・・・。出直してきます。
63 :
デフォルトの名無しさん :02/09/22 01:47
そんで、結局のところC99で型安全かつ可変の引数を受け取る関数は書けるようになったの?
>>61 間違ってないぞボケナス。
でもこれは揚げ足とも言う。
>>63 ...の部分の引数の型がチェックされるということ?
16にはC#をお勧めしたい
>>55 逆に、
{0x41,0x42,0x43}を渡したいのであれば、
"ABC"を渡すことで可能ですが、その方法だと
{0x01,0x02,0x03}を渡したいときに
対応するASCII文字が無く、不可能になってしまいます。
また、
char array[] = {0, 10, 20};
func(array);
な方法だと配列の宣言&初期化とfunc()が離れてしまって見づらく
なりますし、初期化をfunc()の直前でやるのもあほらしいなと。
#defineじゃ・・・
71 :
デフォルトの名無しさん :02/09/22 01:52
>>69 "\x01\x02\x03"
これってできなかったかな。
72 :
打・サイタマ@受信料未払い :02/09/22 01:52
あああ!
>>58 と間違えたぁ!
あかん、残業しすぎや・・・。
>26 これは?
よく見たら間違ってた "\01\02\03"
[\x1b2J]は(・O・)イイ!
>>56 > メモリ領域の節約にもなるし
リテラル文字列であっても静的なメモリ領域に
置かれることには違いない。
まあ、autoな記憶クラスの配列よりはスタックを
節約できると思うが。
#define するのが一番素直か
エスケープシーケンスでできました。みなさんありがとうございました。 勉強になりました
毎回エスケープシーケンス使うほうが直前に変数に入れるよりもさらに面倒だと思うが・・・
16がスタック消費をそんなに気にするなら extern const int table[] = { ... }; function( table); にしたらいいんでないの まあどうでもいいことだけどね…。
ところでなんで16は「関数の直前で初期化できる配列
>>69 」を
関数に渡そうとするんだ?
そんなもん関数内でローカルに扱えと思うのは漏れだけか?
漏れもそうおもふ.
87 :
打・サイタマ@受信料未払い :02/09/22 02:25
中身を触らず、かつfunc()内でしか使わないなら、 func()内にstatic const で持つのもいいかなとか思いますです。
>>84 そんなことが出来るんですか。
配列の中身を静的領域に置くテクニックですか。
でも外部変数は使わない方針なんです。
>>85-87 関数としての汎用性がおちる気がして。。
メモリを気にしてるんだったらスコープつければ? { char bbb[]={1,2,3,4}; Saru(bbb); }
90 :
デフォルトの名無しさん :02/09/22 02:46
スコープ抜けたときに変数のスタック領域って開放されるんじゃないの? { char A[]={1,2}; Func(A); } と Func("\x01\x02"); でメモリの使われ方に違いが有るの?
>>89 その場合メモリは関係ないですよ( ´,_ゝ`)
94 :
デフォルトの名無しさん :02/09/22 02:56
例えば関数printfの実物をみてみよう ということで stdio.hをみてみたのですが プロトタイプの宣言はあるものの それらしきものが見当たらない気がするのですが 気のせいですか?
>91 立派なブロックスコープでつがなにか?
>>95 >>91 はそれがメモリの節約と何か関係あるのか?と言っているんだと思うぞ。
97 :
デフォルトの名無しさん :02/09/22 03:00
>>94 そりゃhファイルだからねぇ…
\Program Files\Microsoft Visual Studio\VC98\CRT\SRC
あたりにあるCファイルにないか?
# CRTって何? C Run timeってことかな?
実装レベルで即座に解放されるかは知らんが、 変数が有効でなくなる立派なスコープだわな。
>>98 C Run Timeか・・・俺もわからんかった。
コンパイル済みのライブラリなら、\Program Files\Microsoft Visual Studio\VC98\Bin\LIBC.LIBの中にあるね。
実際のところ
>>92 のほうはどうなのよ?
最適化も何もしない素コンパイラだったら節約になりそうな気はする。
>>101 解放されてもメモリーを消費することにはかわらんだろ。
使っている時間の長さが違うだけで。
それとも、
void func()
{
int a,b;
}
と、
void func()
{
{int a;}
{int b;}
}
で違うと言いたいのか?
>>103 むしろスタック分だけ余計にメモリ使いそうな気がする
スタックは関数から返れば、解放されるから節約しても無駄。 ブロックスコープ変数は、ほとんどのコンパイラで関数突入時に確保される。
関数内のブロックスコープって人間様のためじゃなかったのか…
下記ならメモリの使用量としては変わらないね。 Func("\x01\x02"); ->2Byte分の領域が確保され、関数を抜けたときに開放される。 { char A[]={1,2}; Func(A); } ->2Byte分の領域が確保され、スコープを抜けたときに開放される。
>>107 前者が解放されるのってプログラム終了時じゃないの?
"\x01\x02"へのポインタが解放されるのは関数を抜けたときだけど。
>108 それなら後者の方が得ということになるの?
コンパイラスレになってきました
>105 速度で見ればローカル変数使うだけ当然遅くなる。 あと、関数呼び出しも戻りのアドレスをスタックに待避する処理や引数を 渡す処理が入るので当然遅くなる。
後者だと、A[]={1,2};でメモリコピーが走らない? 前者の利点が見えないんだけど
たかだか数バイトけちんなよ。
要するに、↓のコードの前者と後者でメモリ使用量が違うか? ということだな。 hoge() { { char A1[]={1,2}; Func(A1); } { char A2[]={1,2}; Func(A2); } { char A3[]={1,2}; Func(A3); } } hoge() { char A1[]={1,2}; char A2[]={1,2}; char A3[]={1,2}; Func(A1); Func(A2); Func(A3); } ソースに記述したブロックの通りにスタックを確保すれば、 後者より前者の方がスタック使用量を節約できるわけで。 ただ、実際にはソースと同じような確保はしてくれない と思った方がいいだろうな。
>>112 すみません言ってることの意味が分かりません。
>>103 は処理が違うということでしょうか?
>>116 しかも前者は読みづらいね。
あまり現実的じゃないよね。
119 :
デフォルトの名無しさん :02/09/22 03:22
>>119 俺も知らんよ。(再帰関数でもない限り)
最初に書いた奴はこういうことが言いたかったんだろ?
と書いただけ。
>>116 仮にブロックスコープで確保解放が行われるとして、スタック操作に掛かる
コストのほうが、スタック消費量を抑えることより問題だと思われ
for(int i=0; i<10000; i++ )
{
int n;
...
}
とかやると、大変なことに。。。
124 :
デフォルトの名無しさん :02/09/22 03:24
>>1 スレタイトルの番号を囲んでいる括弧が、左は半角で右は全角なのが気になる。
ぐは、またやっちまった 技術板でこのスレだけ進行早すぎ それと、10000くらいなら全然平気でした
>>123 16以外はみなそう思っていると思うぞ(笑)
でもC++だとfor(int i=0;i<100000;i++)とかやるんだよな・・・あれもスタックに取ると思うんだけど。
おっと、スタックに確保する操作はforにはいったときの一回か。
話を元に戻すと まず16さんが下記の記述はいやだと、 char[] A = {1,2}; Func(A); 理由、メモリを無駄にしたくないから。 よって Func("\x01\x02"); ではどうだと、、、 それよりも { char[] A = {1,2}; Func(A); } こうすれば、同じことだしFunc("\x01\x02")より分かりやすいんでは? という流れ。
>>123 俺もそう思うよ。
ただ、スタック操作だけならx86ではespを加算と減算だけだわな。
初期化が問題だな。
>112 スレを前から読んでないのでよく解らんが 要するにスピードを重視するのか容量を重視するのかというわけで そのトレードオフによって決めるべきかと。
132 :
デフォルトの名無しさん :02/09/22 03:35
話かわるけど、VC++のqsortって関数の再帰呼び出しは使っていないみたいだね。 これはスタックオーバーフロウが起らないようにしているのかな? それともやっぱりパフォーマンスを向上させるためかな。
パフォーマンスに一票
でもスタックオーバーフローの可能性があるqsortなんかいやだな。 最近のコンパイラでもあるのかな?
>>128 本題じゃないが、
数字をcharの配列で渡そうとしているあたりに16の徹底ぶりがうかがえる(w
>>135 なるほど。気づかなかった。
きっとそうなんだろうな。
intは(例えば)4バイトも消費するからもったいないです!!ってか?(w
じゃあfloatでいいところでもdouble使っている俺はやばいな(鬱 実際それはまずいんだろうけど。なんとなくfloatは嫌い。
>>137 それはそれですごいなw
0〜255(-128〜127)の値しかとらないことが分かっているのかな?
エスケープシーケンス使うってことは初期化に変数使えないんじゃ・・・
> intは(例えば)4バイト > 0〜255(-128〜127) この辺にもツッコミ禁止の徹底ぶりがうかがえる。 ネタですた。謝ります。スマソ。
>>141 だってここの人怖いもん(;_;)
おかげで注意深くなれたけど(w
MinGWで -------------------------------- main () { void *pa, *pb; { int a; pa = &a; } { int b; pb = &b; } printf ("&a = %p\n", pa); printf ("&b = %p\n", pb); } -------------------------------- &a = 0073FDDC &b = 0073FDD8 --------------------------------
・・・荒れてる(?)っぽいけど、質問して良いかな? 2次元配列へのポインタってどうやって記述すればいいんですか? 手元にある参考書には配列へのポインタは書いてあるんだけど 2次元配列へのポインタについては全く書いてないんで。
>>144 もしブロック終わったら解放するってんなら、a と b は同じ領域を
共有するかもしれないって思ったわけだが、違うらしいなって事
>>116 の話題ね
>>145 ポインタと配列の関係については、ここをひととおり目を通すといい
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html 「配列へのポインタ」というのはまー慣用的な表現で、
実際には配列の先頭へのポインタの意味する事が多い。
char a[3]; char *p = a;
で、この例の先頭がさらに配列(char[5])だった場合を考えてみればいい
char b[3][5]; char (*q)[5] = b;
これとは別に、(別途確保した)配列(の先頭)をさすポインタの配列、
というものを使うことも多い
>>146 そんなもんコンパイラはもとよりコンパイルオプションによって変わるぞ。
VC++6 なら、Debug なら共有しないが、Release なら共有する。
何で実装依存なのに、一つの結果見ただけで「違うらしいな」なんて結論付ける
かなぁ...。
>>148 馬鹿ですか?「MinGWで」って書いてるのに
>>149 アフォですか ? 「コンパイルオプションによって変わる」と書いてあるのに
> 「違うらしいな」なんて結論付ける プ
152 :
デフォルトの名無しさん :02/09/22 08:41
逆コンパイルするツール何か教えれ。
忘れていたが、はるか昔、俺も16と同じこと考えたことあった。 いまとなってはなんでそんな事考えたのかも思い出せないけど。 メモリの節約しようって発想はなかったけど、使い勝手から結局va_list使った。パスカル文字列風に先頭はデータ数入れて。でも、va_listで自動キャストされる規則をわすれたりして型を間違えると誤動作する。
154 :
名無しさん@Emacs :02/09/22 09:02
3D ライブラリが無い環境 (Palm 等) で 3D グラフィックを表示する アプリケーションを作りたいのですが、参考になりそうなソースコード がありましたら教えて下さい。 今は cbzone のソースを読んでいます。
もう156.早い.
聞け!
158 :
デフォルトの名無しさん :02/09/22 16:14
VC買うのと無料のBCCつかうのって、どっちがいい?
>>158 売ってるティッシュ買うのと街頭で配ってるティッシュ使うのって、どっちがいい?
160 :
デフォルトの名無しさん :02/09/22 16:32
ケツの拭き心地が違うということ
162 :
デフォルトの名無しさん :02/09/22 16:38
>>161 ケツの拭きごこちってどう言う意味?
作業のしやすさ?
>>162 配ってるティッシュ使ってみて不満があるなら売ってるの買えや
164 :
デフォルトの名無しさん :02/09/22 16:42
>>163 わかりました。
ありがとうございました。
165 :
デフォルトの名無しさん :02/09/22 16:42
>>163 僕は意味を聞いているのですが!
ケツの拭きごこちとプログラムを作るのと何の関係があるの?
あおりはやめてください。
なんでこれぐらいの事で怒るのか。
168 :
デフォルトの名無しさん :02/09/22 16:50
BCCでCのソースをコンパイルするとき拡張子を必ず.cにしないと いけないと聞きました。Cのソースを.cppでコンパイルしたらどんな 不都合があるのですか。「倉薫」の入門本にもそんなくだりがあったが 理由がわかりません。
ケ ツ 拭 い て み り ゃ あ わ か る だ ろ う が !
うっ・・・
171 :
デフォルトの名無しさん :02/09/22 16:54
>>168 明らかだろ。オマエがそうやって人に聞いてるの見てると、
もう(。A。)(.Λ.)(:>)(゚∀゚)(<:)(.Λ.)(。A。)って感じだな。
172 :
デフォルトの名無しさん :02/09/22 16:55
173 :
デフォルトの名無しさん :02/09/22 16:57
>>171 いっている意味がわかりません。Hello,World程度の簡単なソースを
拡張子.cにしようが.cppにしようがコンパイル結果に関係ないと思うのですが。
>>168 > BCCでCのソースをコンパイルするとき拡張子を必ず.cにしないと
> いけないと聞きました。Cのソースを.cppでコンパイルしたらどんな
> 不都合があるのですか。「倉薫」の入門本にもそんなくだりがあったが
> 理由がわかりません。
C と C++ で一部非互換のところがあるからだよ。BCC は、使ったこと無いからわからんけど、VC++ では xxx.c なら sizeof 'a' == 4 となるが、xxx.cpp なら sizeof 'a' == 1 となる。
CとC++ではNULLの意味が異なります。
177 :
168,172,173 :02/09/22 17:05
C++ってCのスーパーセットだから、CのソースをC++コンパイラでコンパイルすると エラーはでないけど、実行時エラーがでる場合があるということですか?
まぁまぁ。
>>173 は未だにトランスレータ式のC++コンパイラ使ってるんだよ。
なのに次からBCC使わなきゃなんなくなって、不安でしょうがないんだよ。
179 :
裕美子 ◆lIp1b.Ek :02/09/22 17:09
会話についていけないからもう質問はやめにします。すみませんでした。 参考までに、使用コンパイラは 試食版とBCCです。
char *c = malloc(128); C++ではエラー出ます。
183 :
デフォルトの名無しさん :02/09/22 17:15
かといって char* c = static_cast<char*>(malloc(128)); にするとCでコンパイルできなくなる罠
Cのソースを*.cppでコンパイル必要があるのかと問い詰(ry
186 :
デフォルトの名無しさん :02/09/22 17:36
まあ、まあ、これでも見て落ち着けよ /:::|:::::::|:::::::::::::/::::::/::::::::::::::/:::::::/`\_ / ̄\::::::|:::::/:::......-―――--..........__/:::::::::::::::\ ┌ー ̄::::::::::::ヽ::|:::..-^ ̄ ^ ヽ、:::::::::\ ヽ::::::::::::::::::::::::::::/ \::::::::ヽ ヽ:::::::::::::::::::::::/ :::: \:::::ヽ ヽ::::::::::::::::::/ :::::::: \::::|_ ):::::::::::::::| ::::*::::: ヽ:|::::ヽ /::::::::::::::::| ::;;;;: l::::::::ヽ /::::::::::::::::::| ノ::ii:ヽ:: l::::::::::| |::::::::::::::::::::| /::::;リ:::l:::: |::::::::::::| |:::::::::::::::::::::l ...l::::;リ:::/:: /:::::::::::::| .|::::::::::::::::::::::l . /:ア/::: /:::::::::::::::i l:::::::::::::::::::::::::l ./::`^::::: /:::::::::::::::::/ ヽ::::::::::::::::::::::::l /:::::::::: /:::::::::::::::::::/ /:::::::::::::::::::::::l /::::::::::::: /::::::::::::::::::::::/ /::::::::::::::::::::::::i __-ー--=;;;:::::::::::::: ....::::/:::::::::::::::::::::::/
裕美子脱ぐなよ汚ネェ
charはなんと読むの?
190 :
デフォルトの名無しさん :02/09/22 20:33
sageちまった
>>189 > charはなんと読むの?
もうこの話題はいいよ、「キャー」でも「シャー」でも何でもいいよ。
茶
193 :
デフォルトの名無しさん :02/09/22 20:56
>>191 ぷっ、
シャーだって
ぷぷぷぷぷぷぷ
くっくっくっ
194 :
デフォルトの名無しさん :02/09/22 20:57
勝俣
>>189 友人の飼っていた犬が「ちゃる」だったので、
charも「ちゃる」になりますた。
キャッだろ。 キャラクターの略だからな。 キャルかなぁ。
友人の飼っていた子が「ゆみ」だったので、 charも「ちゃー」になりますた。
ちょっと気になったのですが、
>>70 と
>>81 で出てるdefineではどうやってやるのでしょうか
199 :
デフォルトの名無しさん :02/09/22 21:19
200get
とっとと答えんかいっ!!! 糞どもがーーーーっ!!
#define UZEE 16
#define 16 メモリケチケチ厨
#define _16 -1
#define ANSWER "これ以上メモリ節約なんて考えるなタコ"
warning C4305: 'argument' : 'const int' から 'char' へ切り詰めます。 #define FLG_AGE 1 void a( char b ); a( FLG_aGE ); どうすればいいんでしょうか? キャスト?
#define 206 16
#define FLG_AGE '\1'
>>208 間違い
#define FLG_aGE '\1'
放置?
別にキャストでいいんじゃないの a( (char)FLG_AGE );
FLG_AGEを常にcharにしたい(理由はあえて聞かない)なら、 #define FLG_AGE ((char)1) あと、C FAQに 文字リテラル('\1'とか)は実はint型な罠 ってのがあったような気がするのだが、どうか。(C++ではcharだという話も)
>>213 間違い
#define FLG_aGE ((char)1)
>>214 いや
>>206 の聞いてる人が既にミスしてるからw
>>#define FLG_AGE 1
>>void a( char b );
>>a( FLG_aGE );
↑ここねw
楽しそうですね
217 :
デフォルトの名無しさん :02/09/23 01:35
>>206 void a(char b);をvoid a(int b);にする。char型の引数ってあまりみないな。
>>217 charにしても別にメモリの節約にはならないし(w
220 :
デフォルトの名無しさん :02/09/23 02:56
unsigned char 型の定数を32ビット右シフトすると、 元の値とまったく同じになるんだけど、何故?環境はVC++6.0SP5
ちなみに31ビット右シフトすると0になります。 もうわけ分かりません。
っていうかなんで 8bitの unsigned char 型のデータを 32bit右シフトしてるの?
全然シフトについての構造とかは知らないけれど、 隣との、xorを取るようなことを繰り返して、 シフトをしているのであれば戻るのかもね。
全然的外れな事書いていたらご免ね。
225 :
デフォルトの名無しさん :02/09/23 03:25
数の決まっていない数値データの文字列からタブなどを判別してdouble型の配列に値を代入するにはどうしたらよいのですか?
ま た 未 定(略
数の決まっていない数値データの文字列からタブなどを判別してdouble型の配列に値を代入すればいいです。
228 :
デフォルトの名無しさん :02/09/23 03:32
ヒントだけでも教えていただけないでしょうか?
strtokですか?
分かるとこから書いていけばいいです。 それでも詰まったらコードを晒す。
さて今日もいってみようか
>>231 それは処理系依存ではなく未定義です
>>231 これ試してみたら多分、まずunsigned charをシフトするときでも
32bitレジスタに値を入れてそれをシフトする命令を出してるらしい。
で、それをシフトするとき何ビットシフトするかを入れるレジスタ
の値が31以上だったとき下位5bitだけ使うっぽい。
だから33bitシフトとすると1bitシフトする。
ちょっと脱線。 x86形の話だけど、コンパイラはシフトをアセンブラレベルの シフト命令(shr/sar)に展開するのね。 で、8086の頃は、シフト命令は1ビットだけシフトする命令か、 CLレジスタに数値を入れてシフトさせるしかなかったのね。 で、ハードウェア的には、本当に繰り返しで処理してたのね。 80186(かな?)以降は、直接nビットシフトする命令が出来たんだけど、 これもハードウェア的には(マイクロコードで)繰り返し処理してたのね。 で、386になってから、多ビットシフトのハードウェアが導入されて、 ようやくシフトが"軽い"命令になったわけ。 で、たしか、386からだと思うけど、clレジスタに32以上の数値を指定しても、 下位ビットだけがマスクされて、実際には31ビット以下のシフトしか 行われないようになったわけ。 だから、16bitコンパイラを使って、32bit以上のシフト命令を使ったプログラムを作ると、 むかーしのCPUと今のCPUで結果が異なるわけ。 この結果を、CPU種別の判別なんかに使ってたりしたんだな。 コンパイラは、CPUの判別なんかしない(実行環境は別だし、以降に生まれたCPUにも対応できない)から、 効率重視のC言語において結果が異なる(未定義になる)のは ある意味仕方がないとも言えるんだろうね。
>>234 私、初発言の初心者ですが、
>>234 さんの説明は目から鱗でした。
なるほど、機種依存ってのはここに根本原因があったのですね。
ありがとうございました。久しぶりに濃い文章だっだなぁ。
>>233-234 235氏と同じく目から鱗でした。
アセンブリ言語の知識はZ80〜8086時代で止まってるからなぁ。
まさに、内部でシフト演算をn回ループしてるものだと思ってたよ。
double i=0; for(i=0;i<10;i+=0.1){ printf("%1.1f ",i); } 表示するとなぜか最後に10.0が入るのはどうしてなんですか。
ま た 浮 動 小 数 点 か ( 藁 って、昨日見たのはJavaスレだったか。
二進数の世界だから、0.1はあらわせなく、誤差が生じて 判定されてしまうって言うのが一般的な回答なのでは? for(int i=0;i<100;i+=1){ //i++で充分 printf("%1.1f ",i/10.0); } こういうふうにしなさいと言うのもあると思う。 違ってたらご免。
>>233 2^5(2進5bit)で割った余りか。なるほど。
>>237 10.0?なんかソースのコピペミスってないか?
最後だけじゃなく、途中経過も書いてみな。
>>241 ウチだと10.0も出た。たぶん
0.1が0.09999..とかで、
10.0も9.99999...なんだと思われ
9.99999999999998050000
>>241 > 10.0?なんかソースのコピペミスってないか?
既に、
>>239 で答えでてるよ。初心者が良く陥りやすい罠のひとつ。
0.1 って言うのが本当の 0.1 じゃないから10回めのループの判定の時に i が 10.0... にならなくて、9.9... とかなっているため、もう一回余分に回るだけ。解決策は、
>>239 のようにやるのが普通。
ちなみに、最後に i が 10.0... になって無いのに表示が 10.0 となるのは、出力時に四捨五入しているから。
(0.1)10 = (0.00011001100110011〜〜)2 2進表現内での循環小数になる。=>まぁこれが誤差などの原因かな
#include <stdio.h> void main() { printf( "%f\n", 1 ); } 表示するとなぜかアプリケーションがクラッシュするのですがどうしてなんですか。
http://www.catnet.ne.jp/kouno/c_faq/c15.html#3 15.3:
解けなくてイライラしていた問題が実は、
printf("%d", n);
で起きていることがわかった。ANSIの関数プロトタイプは上のような 引数の型
の不一致から守ってくれると思っていたのだが。
A:
関数が可変数個の引数を取るとき、プロトタイプは可変数個の引数の 数やその
データ型についての情報を与えない(そもそも出来ない)。よっ て通常の保護の
仕組みは、可変数個の引数リストの可変長の部分には あてはまらない。コンパ
イラは暗黙の変換も(通常の)データ型の不 一致も警告もできない。
質問5.2, 11.3, 12.9, 15.2も参照のこと。
>>247 main()の型がvoidだからです。
標準Cではmain()の型はintと決まっています。
>>249 ネタにマジレスするが
そんなOS依存環境依存なことをどうどうと正論ぶるのはやめにしませんか?
>>248 レスありがとうございます。
しかし、浮動少数点が正しく表示されないのならば
まだ分かるのですが、なぜクラッシュするのでしょうか?
>>249 int main() にしてもダメでした。
>>251 sizeof( double )!=sizeof( int )だからでないの?
253 :
デフォルトの名無しさん :02/09/23 15:22
>>247 環境も書いてないし、クラッシュしたとは具体的にどうなったのかも
提示されていない。
void なら return ; int なら return 0; を入れなさいという事では?(コンパイラの要求)
>>247 printf( "%f\n", 1.0 );
intとdoubleの大きさの違いを思い知れ スッタコ
あと頓珍漢な回答してた
>>253 も氏ね アホボケ
>>250 > ネタにマジレスするが
メールアドレス見た ?
>>251 呼び出し側がスタックに投げ入れるデータの量と、
呼び出された関数がスタックから取り出すデータの量が食い違えば、
スタックポインタがずれて、まともに動作できなくなる。
とゆーシナリオを想像するんだけど、事実は知らん
そして事実がどうであれ、保証を失う事をしておいて「なぜ?」と問う
自分のセンスを疑ったほうがいいのではないか。
「やっぱり」と思ってほしいぞ
だって引数いっこだし、sp弄らないはずだよねえ? とおもったけど、リターンアドレスもスタックに積んでるか。
うーん、3時間半で11レスか 思ったより釣れたな 一応用意していた回答は 「printfは引数の型チェックを行えないので 浮動小数点を使う場合は、明示的に使ってやらないと CPUが浮動小数点ユニットを切り離してしまうから クラッシュする」でした。 ちなみに環境はVC6ですが、インテル系のCPU使っていれば大体どんな コンパイラ使ってもクラッシュすると思う。 #include <stdio.h> double d; // <-- 追加 void main() { printf( "%f\n", 1 ); } コレなら表示はおかしいけど死にはしない。
>>257 もちろん実装によるけど...
> 呼び出し側がスタックに投げ入れるデータの量と、
> 呼び出された関数がスタックから取り出すデータの量が食い違えば、
> スタックポインタがずれて、まともに動作できなくなる。
なんてことは、普通起こらない。スタックポインタの操作は呼び出し側の仕事だから、呼び出され側がスタックから一つも読まなくても、ポインタがずれたりはしない。
つーか、printf() なんかだといくつ積まれて呼び出されるかわからないから、呼び出され側でスタックポインタの操作をしようが無い。
> とゆーシナリオを想像するんだけど、事実は知らん
今回の件は、多分 (int)1 の値とその後ろのスタックの内容を (double) として見た時に浮動小数点じゃねーぞって言って怒られたんだと思う。
> そして事実がどうであれ、保証を失う事をしておいて「なぜ?」と問う
> 自分のセンスを疑ったほうがいいのではないか。
> 「やっぱり」と思ってほしいぞ
ここは、同意。「何で、これぐらいうまくやってくんねーんだよ。」とか思う奴は、C なんか使っちゃいかん。
>260 あー俺FPU意識しなきゃいけない石使ったことなかったよ
263 :
デフォルトの名無しさん :02/09/23 16:21
ドキュソ質問で申し訳ないですが、、、 int buff; (char)buff; と書いてあればbuffをchar型にキャストせよと言う事ですが (char*)buff; ならばどーゆー意味でしょう?buffをchar型のポインタ型とせよ、ってことであってます?
bccだとクラッシュしなかった・・・(0.000000と表示された)
>>260 > 「printfは引数の型チェックを行えないので
> 浮動小数点を使う場合は、明示的に使ってやらないと
> CPUが浮動小数点ユニットを切り離してしまうから
> クラッシュする」でした。
やっぱりただのアフォだったか...。printf() 使ってる時点で、浮動小数点ルーチンは組込まれるよ。うそだと思うなら、printf() のソース見てみ。(VC++ なら、output.c だよ。)
> コレなら表示はおかしいけど死にはしない。
たまたまだ。最適化オプションちょっと変えるだけで、クラッシュしたりしなかったりするよ。
>>260 ちょっとまった。それでクラッシュしないのと
浮動小数点ユニットを切り離してしまうのとは
まったく別次元なんだけど、そこは認識してる?
つーか、
>>260 の回答は間違っている。
>>263 > (char*)buff; ならばどーゆー意味でしょう?buffをchar型のポインタ型とせよ、ってことであってます?
まあ、あってる。多分 int のビット幅と char へのポインタのビット幅が同じ (か、int の方が広い) なんだろうな。
デバッガなんかを作っていて、アドレス値を整数 (多分 16進数から変換して) で入力させて、そのアドレスからデータを引き出すとかやる時に使ったりする。
>>268 でも
int a = 10;
char b = (char)a;
printf("%c\n" , b);
で10と表示されませんが。
>>260 それでしなないのは、それこそ「たまたま」じゃん。
スタックが増えたからでしょ。 dになんか入れれば表示も変化するよ。
FPU切り離しって何言ってんだかわかんない。
もし万が一そうだとしてもprintf使ってりゃありえんことを理解してよ。
>>269 a=65を突っ込んで、もう一度報告してみろ
俺は int a = 'A'; をお薦めする
>269 ネタだよね?
274 :
デフォルトの名無しさん :02/09/23 17:12
>>269 %cなんだから10になるわけないのでは?
VC++で、各標準関数に対応するソースファイルはどうやったらわかりますか?
真実は知らんがどうせなら __int64 を使って欲しかった。
>>275 VC++だとFloating pointがロードされていないとでるかな。
ちょっとやってみよう。
やってみた void f(){double d=0.0; }があると出ないのか・・・
>>257 なるほどな。可変個の引数ゆえにか。
double型の引数を取ると分かっていればintを渡してもdoubleに変換されるんだろうけどね。
printf側でスタックに積んだ量よりも多く読もうとしてアクセス違反が起きたということはないの? 数バイトで起るとは思えないけど。
>>282 printf( "%08x %08x\n", 1 );
をリリースモードで実行したところ
00000001 00401145
↑mainのアドレス
と表示されますので、アクセス違反は起きていないと思います。
>>283 5年くらい前に、学校の授業ではまったバグです。
ネタのつもりで書き込んだのですが、場が荒れてしまい
申し訳ありませんでした。
C言語での未定義の振る舞いの原因を 議論すること自体がナンセンス。 たとえ外科医を雇って鼻を解剖したとしても 原因の確証はつかめないだろう。
と、アメリカンを気取ってみた。
287 :
デフォルトの名無しさん :02/09/23 19:35
>>285 でもバグの原因追求するときには必要な知識なんだよ。
とくに、クライアントが「結果」しか教えてくれないときとか。
>>285 > C言語での未定義の振る舞いの原因を
> 議論すること自体がナンセンス。
まあ、たまには処理系べったりの議論も悪くないさ。ここだとちょっとスレ違いかもしれないけどね。久々に output.c のソースなんかも見たしね。
(でも、結局誰が 変換ルーチンのテーブルセットしてるか良くわかんなかったけと。)
289 :
デフォルトの名無しさん :02/09/23 20:59
C言語なら私に聞け
>>289 質問!
Cで、mallocされたあとに使われてなくなった(参照の無くなった)メモリを
ガーベッジコレクトしてくれるような仕掛けをどうにか作りたいと考えてるんだけど
どうしたらいいかな?
今考え中なのはmallocで返却されるポインタをすべてライブラリで一元管理して
ポインタへのポインタを持ち歩いてもらうことでリソースの利用状況を監視できる
ようなものを考えたんだけどスコープの外れたスタック変数なんかは
どうしても監視しようが無くて困ってまぅ
よし!次!
>>290 > Cで、mallocされたあとに使われてなくなった(参照の無くなった)メモリを
> ガーベッジコレクトしてくれるような仕掛けをどうにか作りたいと考えてるんだけど
> どうしたらいいかな?
基本的に C でやるのは難しいし、あまり益が無い。そう言うのを作るのが楽しいと言うのでなければ、Java とかにした方がいい。
> 今考え中なのはmallocで返却されるポインタをすべてライブラリで一元管理して
> ポインタへのポインタを持ち歩いてもらうことでリソースの利用状況を監視できる
> ようなものを考えたんだけどスコープの外れたスタック変数なんかは
> どうしても監視しようが無くて困ってまぅ
基本的に C にはその手の監視機能が無いから、プログラマーに関数から抜ける時は ○○の関数を呼んでね、としておいてその関数が頑張ってスコープの外れたポインタを知るようにするしかないと思う。
ソース自体に書くのはあまりにも面倒だから、プリプロセサに手を入れるとかする必要があると思う...、とか考えるとせめて C++ にした方がいい。
293 :
デフォルトの名無しさん :02/09/23 21:42
DLLをつかってプログラムを作りたいのですが DLLに処理を渡すときはどういう風にするのですか?
295 :
デフォルトの名無しさん :02/09/23 21:43
さっき友達から電話かかってきて、質問受けたけど コンパイル時に「Sample.obj(Sample):Undefined symbol:_power_」などと表示され、プログラムを実行したときに途中で止まってしまうらしい なんか心当たりはある?
>>294 わーお!
これナイスだな。 GCのタイミングは良くわかんないけど。
そうか、スタックもヒープも全部検査するか、そうきたか。
遅いかなーと思って敬遠気味だったけどそれが楽だしな。
>>296 これナイスってアンタ、死ぬほど有名だぞ………
Boehm GCって速度的にはどうなんだろう。
調べろよ厨
>>297 > これナイスってアンタ、死ぬほど有名だぞ………
使ってんの見たことないけど...。
305 :
デフォルトの名無しさん :02/09/23 22:07
今日大学の授業で課題がでました。 課題の内容がWindowsのコマンドプロンプトで動作するアドレス帖です。 そんなプロでも作れるかどうかわからないものを学生に作れという教授に問題がある、という皆さんの意見はわかりますが僕は何とか作って提出したいと思っています。 そこで皆さんにお願いがあります。 作って!!
>>305 そんなプロでも作れるかどうかわからないものを学生に作れという教授に問題がある。
>>305 そんなプロでも作れるかどうかわからないものを学生に作れという教授がいる大学に入る
>>305 に問題がある。
アドレス帖って、住所の一覧表示するだけ?
>>305 了解!
#include <stdio.h>
int main(void)
{
printf("漏れのアドレスは%p\n", (void*)main);
return 0;
}
>>305 何も制限無いんだったら、適当に作ってアドレス長帳だと言い張れば?
>>305 「アドレス帖」 というのが何かのソフトウェアだと仮定しよう。
それがどういう動作をするものなのか教えてくれないかな?
たとえば、実行したら Hello,wolrd! と出力する、という仕様なら
それはプロでなくてもできるレベルだよね。
>>311 すみません。アフォの相手をするつもりはありません。
あおりは別スレにいってください。つーか氏ね。
今度は305祭りか、、
このスレでの 305の将来が決定いたしました!!
>>312 てゆーか、仕様書けよ、と言ってるんだけど。
オフィスやアウトルックにあるような他アプリ連動型とかいきなり作るわけでもないっしょ
>>312 は偽者ですので無視してください。ということで、
作って!!
つーか、宿題やってってとこだろ
C言語初心者で、問題を沢山こなしたいんですが 〜を作れ!という初級問題があるサイト無いでしょうか?
>>316 309が丁寧に作ってくれたじゃないか。
ということで君の問題は解決済みと判断する。
>>318 どこか寂れた誰も使ってないスレッドに誘導してくれれば
sage進行でオレがみっちり鍛えてやるよ。
[Q1]渡した文字列を反転して返す関数fugaを作れモルァ
{Q2]メモリを確保する関数hogeを作れ
- 内部でmallocを使ってよい
- そのmallocがNULLを返したらabortする
- hogeの戻りはvoid。引数は好きにしな
>>318
風呂に入ってくるのでその間に回答ヨロシク
…もっと勉強して出直してきます。ありがとうございました。(;´д⊂)
#include <string.h> unsigned int hh(const char *s) { const char *p; unsigned int n = 0; if(s) { p = s + strlen(s); while(--p >= s) n = (n<<1) + *p; } return n; } 上の関数を作って実行したところ、愛しいあの子にコクられました。 何がよかったんでしょうか?
char *fuga(char *s) { int len; char *p; len = strlen(s); p = (char*)malloc(len); strcpy(p , len); for(i = 0;i < len ; i++) s[i] = p[len - i - 1]; free(p); return s; }
char *fuga(char *s) { for(i = 0;i < strlen(s) ; i++) s[i] = ~s[i]; return s; }
文字列AとBを比較して Aの中にBの文字列が含まれているかどうかを 調べる標準関数ってありませんか? 一文字ずつ自分でif文で比較していくのがいいのでしょうか? いい方法あれば教えてください。
>>330 エレガントに書け!
while(*s=~*s++);
strstrのこと?
>331 あ、漏れもそういうコードよく見るよ。
ありがとうございます。 やってみます。
>>341 おれも書いた瞬間に感じたよ。 やっちゃったって感じさ。
漏れの質問は放置かゴルア!
>>345 かっこつけずに手続きをきちんと書き直してみなよ
>>225 面白そうなのでちょっとやってみたっす。それ以前に、まだ、このスレみてますか?
struct suji {
char tmpbox[512]; double suji[64];
} box={ {0x00}, {0} };
int dblsave( struct suji *TpData, const unsigned char *rec, const char *kugiri )
{
int i, s, c;
for( i=s=c=0; *(rec+i)!=0x00; ){
if( 0x30<=(int)*(rec+i)&&(int)*(rec+i)<=0x39 )
*(TpData->tmpbox+s++)=*(rec+i++);
else if( memcmp("0", rec+i, 2)<=0 && memcmp(rec+i, "9", 2)<=0 ){
*(TpData->tmpbox+s++)=*(rec+i+1)-0x1f; i+=2;
}
else if( !memcmp(rec+i, kugiri, strlen(kugiri))){
TpData->suji[c]=atof(TpData->tmpbox); c++; s=0; i+=strlen(kugiri);
memset(TpData->tmpbox, '\0', sizeof(TpData->tmpbox));
}
else return (-1);
}
if( !*(TpData->tmpbox) ) c--;
else TpData->suji[c]=atof(TpData->tmpbox);
return (c);
}
void main( void )
{
int i,c; char test[256]={"123|123|"}; /* 7c を tab に変換してテストしてチョ */
if(-1==(i=dblsave( &box, test, "|" ))) exit(1); /* "|" を "\t" に変更 */
for( c=0; c<=i; c++ ) printf( "%lf\n", box.suji[c] );
}
>>349 きちんと分解してロジックを見直せばわかるよ、ということ。
練習だと思ってやってごらん
351 :
デフォルトの名無しさん :02/09/23 23:20
C言語ってポインタが使えるからいいなあ。
352 :
デフォルトの名無しさん :02/09/23 23:25
printfで、 \ から始まる特殊文字の一覧ってどこにあるんすか?
>>350 うむむ。分解するとますます分からなくなりますた。
if(s) {
p = s + strlen(s);
p--;
while(p >= s) {
n <<= 1;
n += *p;
p--;
}
}
>>352 > printfで、 \ から始まる特殊文字
??
あまり詳しくなくてよくわからんのですが、
>>334 は
int i = 0;
while(~(TempString[i] = ~TempString[i++]));
TempString[i] = '\0';
return TempString;
こんな感じならいいの?
>>356 n=n++; がおもっくそ未定義だったんだよウワァン
あ、いや俺の勘違いか。スマソ。
334の俺の解釈は下記ですがOK? ・ポインタが進んでしまう ・'\0'が反転されてwhileの判定がおかしくなる ・最後の'\0'が0xFFになってしまう
>>362 ということは359もダメということですね。
>>355 その辺の文字はprintfにおいて特別な意味はありません。
>>361 25点
・ポインタが進んでしまうのは間違いじゃない
・\0が反転されておかしくなる
・だから、上のと同じことだ
あとは後方演算子++の挙動がこの場合未定義だっつーことで
>>364 言い方が悪かった。
といってもなんと言えばいいかうまく言えないけど
\r とか
>>363 訂正
ということは356もダメということですね
> ということは356もダメということですね だね。
一応、356を修正しておきます。 int i = 0; while(~(TempString[i] = ~TempString[i])) i++; TempString[i] = '\0'; return TempString;
渡した文字列を反転って、ビット反転じゃなくて順番を入れ替えろってことじゃなかろうか。 0xFF が 0 になっちまうし
そりゃそうだろ
>>369 fuge(char *s){
char *d=s;
while(*s){*s=~*s;s++;}
return d;
}
こうしなきゃならんかったわけだね
プログラム中でLinuxのコマンド(cpとかrouteとか)を呼び出したいのですが、 どうしたらいいのでしょうか?
>>374 たしか、参照型とポインタ型で、この char *d を省くことができたような。
よく覚えてないから誰かフォローして
378 :
デフォルトの名無しさん :02/09/23 23:54
000 001 ・ ・ 100 という風にファイルに3桁の番号を順番に書き込みたいのですが fprintf(fp,"%3d\n",i); では上の桁の0が追加されません どうすれば上のように3桁で書けますか?
>>375 呼ぶな || perl使え || system(3) || popen(3) || die
%03d
*s=~*s; と *s^=0xFF; ってどっちが速そう?
できました。ありがとうございました。 ここのスレってsage推奨のようですね・・あげてしまってすみませんでした。
>>382 出来の悪いコンパイラでなければどっちも同じになる。
>>382 fuge(char *s){
char *d=s;
while(~(*s++^=~0));
return d;
}
って感じ? 動くんかな
>>376 そんなもの省いてもメリットなし。
値を返さない関数にしてもいいわけだし。
>>386 一応、お題的にポインタをそのまま返して欲しそうだったから。
388 :
デフォルトの名無しさん :02/09/24 00:03
>>382 同じくなるのか・・・コンパイラの最適化ってすごいな。
390 :
デフォルトの名無しさん :02/09/24 00:07
なんで&&と||はあるのに^^はないの?
391 :
デフォルトの名無しさん :02/09/24 00:08
>>390 ^ひとつで十分だからじゃない?
(a=b)^(c=d)
394 :
デフォルトの名無しさん :02/09/24 00:10
>>392 >>390 の言う^^って、多分どちらかの式が真のときのみ真となる演算子という意味だと思うぞ。
^^ は !!(a) ^ !!(b) という意味だと思う 滅多に使わないが、有っても良かったかな
>>387 だったら少なくとも変数(仮引数含む)が2つは必要だね。
>>323 [Q1]ならできそうなのでやってみたっす。
[Q2]はちょっと... 一応2byte文字対策も前提で作成してみました。
文字列の反転 EX)あいうえお -> おえういあ みたいな感じでいいのですか?
void *fuga( void *buf, const void *rec )
{
int i;
int c;
int l=strlen((char *)rec);
*((char *)buf+l)=0x00;
for( i=c=0; *((char *)rec+i)!=0x00; i+=c,l-=c )
{
if((0x81<=(int)*((unsigned char *)rec+i)&&(int)*((unsigned char *)rec+i)<=0x9f)
|| (0xe0<=(int)*((unsigned char *)rec+i)&&(int)*((unsigned char *)rec+i)<=0xfc))
c=2;
else c=1;
memcpy( (char *)buf+l-c, (char *)rec+i, c );
}
return ((char *)buf);
}
void厨ウザイ
>>398 ナイスボケ!
あとはいいツッコミ役を探さなくては・・・
>>398 呼ばれたので
"あaいbうcえdおe"こんなのは?
もんだに前提が無いのでEUCとか全ての文字コードに対応しよう。
というネタだったんだろな。
もしマルチバイト文字に対応するなら、wchar_t型の文字列に変換できる
エンコーディングのみに対応でいいよ。
>>398 #と、難しくしてみるテスト
Shift_JISなら if ( ch^0x20-0xA1&0xFF<0x3C ) でマルチバイトらしい
407 :
名無し募集中。。。 :02/09/24 00:39
>>323 の問題ってどちらもK&Rに載ってる香具師だな
あ、そうなん? 即席なんだけど。
327のしたいことがよくわからないのです
被K&R洗脳厨ウザイ
演算子の優先順位考慮すんの忘れてた・・・まあいいか
>>409 いや、だから未定義の箇所を探せっていう
ネタじゃないの?
マルチするなよ〜〜(違っ)
俺には未定義が見つけられない(´д`;)
未定義箇所は未定義です
>>415 ,416
この部分 ↓
> while(--p >= s)
だめなん?なんでだめなん?
>>420 へえ
勉強になりますた。
それで暴走する処理系があったら紹介きぼん。遣って見たい
しまった、気づかなかった p が s の前に行った瞬間に未定義か・・・
>>418 そこゼンゼン問題ないよ。
p >= s の評価前に p をデクリメントするから。
ちなみに、もし仮にここが
p-- >= s であったとしても未定義ではない。(ロジックはでたらめになるけど)
なぜなら、デクリメントはwhileの式評価のあとに直ちに行われるから
( {}のあととか、そういうことは決してない。 for文の挙動を思い出そう )
やっぱり駄目だな、C言語は。 という結論。
>>422 問題ないよ
アドレスの比較であってアドレスの指し示す中身を取り出してるわけじゃないしね
アドレスの比較すら駄目な罠
フレームになる前にさっさと誰か規格の英文引用汁!
アドレスの比較=単なる数値比較 だけど それでもダメな理由はなんだろう・・・
>429 駄目になっても文句が言えないだけで駄目な処理系なんてないだろ
アドレスが連続しているとは限らない
アドレスが単なる直列な数値とは限らないからでわ
>>430 >駄目になっても文句が言えない
ここがおかしいと思う。「文句が言えない」という理由がないよね。
C++だとどうなんだろう。ポインタ演算なんてまずしないけど ちょっと気になるな。同じくIS引用希望。
>>423 > p >= s の評価前に p をデクリメントするから。
そうなの?
評価前にデクリメントするから問題なんじゃないの?
ループを終了するには p < s になる必要があるよね。
sより小さくなったpを比較に使った時点でアウトなんじゃない?
>>431 ああ、そういうこと言いたかったのね。
しかし、この場合はそれでも問題ないと思うよ。
>>437 >しかし、この場合はそれでも問題ないと思うよ
何故?小一時間。
sのアドレスが0x0でかつNULLとは!=であったならどうだろうか? と言ってみるテスト
アドレスが連続空間にないという前提だと、 char *t=hoge[256]; このtをインクリメントしていったときにもtは不連続に変化する、ということにならない? 配列でとった部分は連続なんだっけ? --t は、やっぱり t-sizeof(char) にならない?
愛しいあの子にコクられる処理系なら漏れも使ってみたい
>>441 char (*t)[256]; のtなら256バイト毎に変化するかも。
>>440 あーそれかー。 それなら、えーと
(--p >= s) じゃあなくて (--p-s>=0) であれば問題ないね。
>>432 この理由なら
下記がいいという説明がつかない。
while (head + 1 < tail) { /* +1は、なくても動作する */
一応、ルーチンの先頭で型定義してるので、
連続して無くても問題ないのでは?
未定義なのは別の理由じゃないかな?
未定義厨ウザイ
>>446 C言語なんてもはや頭の体操にしか使えないんだから微笑ましいじゃねえか。
黙って見守れ。
わたくし、間違っておりました! --p>=s はダメですね。 配列のアドレスで許容されているポインタ(アドレス)の可動範囲は hoge[HOGE]なら hoge〜hoge+HOGEまででした! (hoge〜hoge+HOGE-1ではない) どーもすみませんでした
>>447 sが0x7FFFFF(32Bitアドレスとして)の場合は?
駄目だね。ごめんよ。
いや、とにかくポインタってのは規格の上では 整数値と同等に考えちゃだめなのよ。 char *p; この pが有効なオブジェクトの範囲を指していない場合は p++; を実行した後のpの値は予測できない ってことでどうよ?
>>444 同一の配列を指していないポインタ同士の減算は未定義なので、
結局同じこと。
>>452 それはOKだって。
なんでそういう規格にしたんだろう?ってのが話題。
たとえば処理系によってはポインタの上位16バイトでさしている配列のID 下位16バイトで配列内でのオフセット とかなってるかもしれない ptr<Tail は仕様によって保障されているから、内部表現に関わらずOKだけど ptr>=Head はこういう処理系では誤作動するよね
>>452 規約では+1までは移動だけは許可されておりますです!
さらにそのポインタの指すものも取り出せるであります!
しかし、そのときの取り出したもの(*p)の中身はぐちゃぐちゃであります!
457 :
デフォルトの名無しさん :02/09/24 01:37
なぜ > (hoge〜hoge+HOGE-1ではない) なんだろう。
>>454 カニチャーハンにその辺ちょっぴり載ってた。
C-FAQにも出てたよ
>カニチャーハン 微藁
>>454 典型的な例がx86のfarポインタ。
規格を決めた当時、最も使われていたアーキテクチャを無視することは
できなかったのでは?
465 :
デフォルトの名無しさん :02/09/24 01:40
>>420 どうでもいいことなんだけど、そのint len;ってなんのために定義しているんだろう。
>>464 感動した!!
>>457 char s[100];
char *end = &s[100];
while ( p != end ) ++p ;
を動かすためだろ、C++やるとこんなのがそこら中で出てくる。
C++でも一緒ですか?
>>456 いや、ちょっと待った。
俺が
> 有効なオブジェクトの範囲
と書いたのはそのことだよ。
>>467 出てくるがそれはraw pointerではなくてiteratorなわけで、
同じ枠内で議論するには無理があるのでは..?
char *strrev(char *str) { char *head,*tail; int c; head=str; tail=s+strlen(str)-1; for(;head<tail;head++,tail--) c=*head,*head=*tail,*tail=c; return str; } これならOK? 俺ならこう書くけど。
すみません p 宣言するの忘れました。 オマエラいい加減寝ろよ、明日から仕事あるんだろ。 漏れはもう寝る。 乙〜
>>470 禿同
実際には
>>467 みたいなのは出てこなくて
std::vector<char>::const_iterator p = v.begin();
while( p != v.end() ) { /* hoge */ p++; }
なわけだが。
>>470 一応、ポインタもお終いの一個先まで保証されている。
それと、vector のイテレータは殆どの実装で生ポインタの
typedef だからそんなに的外れという訳じゃないと思うが、
>>474 またMSだが、VS7のSTLはちゃうね。
任意の型のポインタはランダムアクセスイテレータに分類されまする と手元の STL 本にはあります だから桶でしょう
すれ違い
>>468 ISO/IEC 14882 によれば、
> If both the pointer operand and the result point to elements of the
> same array object, or one past the element of the array object, the
> evaluation shall not produce an overflow; otherwise, the behavior
> is undefined.
らしいので、一緒のようだ。
じゃぁやめとこう。そして寝よう。
>>480 あ、、、そこだけ修正し忘れました。sはstrです。
手元で書いた時はsにしたんで。
結論はネタがみんなの役に立ちましたと。 好きなあの娘にコクられまくってましたと。 アホかと。
>>482 ようは
char* str="";
のときに、str+1は比較に使ってもよいが、
str-1は比較に使ってはだめだということ。
だと思う、、、、
>>484 あーなるほど。
それでメモリーが連続しているとは限らないと誰かが言っていたのか。
ありがと
ん?まてよ・・・そうすると
>>471 でもまずいような気が・・・・
↓こうするか・・・
char *strrev(char *str)
{
char *head,*tail;
int c;
size_t len;
len=strlen(str);
if(len<=1)
return str;
head=str;
tail=str+len-1;
for(;head<tail;head++,tail--)
c=*head,*head=*tail,*tail=c;
return str;
}
490 :
デフォルトの名無しさん :02/09/24 02:41
printf等でよく使う、\r とか\nとかの 完全な一覧表ってどこかにあるんでしょうか?
エスケープ厨ウザイ
>>490 ま た お な じ し つ も ん か 。
ウザイ厨ウザイ
>>494 不完全なのしか載ってないんだ
\0と\nくらいしかない
>>492 流されちゃったからね
490=82=16 と推測しますた。
>>496 立ち読みしてから載ってるのを買ってくればいいじゃん。
>>490 > printf等でよく使う
とか言ってる段階では、完全なものは必要ないのでは?
>>501 完全な一覧表だが、見て分からないのか?
じゃあ何読んでも分からないな
>>490 「エスケープシーケンス」で検索した?
4,000件以上ヒットするよ。
わかんなかった
二次元配列をポインタに代入したいのですが,うまくできません。 char L_box[20][30]; char *P_box[20][30]; P_box=L_box; どのようにすればいいのでしょうか?
いったい何がやりたいんだ? まずそれを明確にしろ。
L_Boxをポインタ変数に代入して使いたいんです
FAQですよ>2次元配列とポインタ
わからなかったです void func(char a[][30]); のように関数に渡すのはわかるんですが, 同関数ないで, 2次元配列を宣言 @ポインタ変数を宣言 Aポインタ変数にアドレスを渡す の@の宣言の仕方がよくわかりません。 Aの右辺と左辺,両方の形もよくわかりません
>もし2次元配列を以下の関数に渡すと >int array[NROWS][NCOLUMNS]; f(array); >関数の宣言は以下のどちらかでないといけない。 >f(int a[][NCOLUMNS]) { ... } >あるいは >f(int (*ap)[NCOLUMNS]) /* apは配列へのポインター */ { ... }
char L_box[68][51]; char *box[51]; box = &L_box[51]; error C2440: '=' : 'char (*)[51]' から 'char *[51]' に変換することはできません。 どうすれば・・・?
char (*box)[51];
できました
>>515 まじでありがとう
お詫びに今日ごみ一個拾うことにするよ
>>505 正確には「エスケープシーケンス」という呼称はあてはまらないんですよね。
一文字では「シーケンス」ではないからな
・エスケープシーケンス \a BEL: ベル \\ \: バックスラッシュ \b BS: バックスペース \? ?: 疑問符 \f FF: 改頁 \' ': 単一引用符 \n LF: 改行 \" ": 二重引用符 \r CR: 復帰 \t HT: 水平タブ \ooo 8 進数(o=[0-7]) \v VT: 垂直タブ \xhh 16 進数(h=[0-9a-fA-F]) ・演算子の優先順位と結合規則 本文長すぎの為省略
0.0fや0L(ゼロ、エル)はわかるんですが 0U(ゼロ、ユー)は何ですか? あと、他にも直打ち数値のサフィックスってあるんでしょうか?
>523 \o=ママ バックドロップ
見える見える
>>519 エスケープシーケンスでいい。
コンソールを制御する記号列もまた、エスケープシーケンス。
区別したければ「Cの」とか「ANSI端末の」とかつけれ
>>527 > 区別したければ「Cの」とか「ANSI端末の」とかつけれ
「プリンタの」も忘れないでね。
529 :
デフォルトの名無しさん :02/09/24 23:41
char *a="こんにちわ",*b; scanf("%s",&b); if(a==b) printf("正解です\n"); else printf("違います\n"); } エラーは出ないけどできません・・・ なぜですか?
>>529 入力された文字列が何処へ格納されるか考えてみたかい?
・bが未初期化でメモリが割り当てられてない。 ・比較の方法
>>529 > エラーは出ないけどできません・・・
> なぜですか?
間違ってるからです。strcmp() あたりを調べるがよろし。
あと、scanfのパラメータが・・・
>>533 > あと、scanfのパラメータが・・・
それ以前に、b の初期値が...。
524 にでてるんだけど, 0.0f や 0L のようにサフィックスを 付けなければいけない状況ってどんなときですか ?
直打ち小数演算はdoubleとして扱われるので float a = 1.0f/0.3f; とか
float a = (float)1.0/0.3;
>>538 > float a = (float)1.0/0.3;
>>537 でいいんだから、キャストはやめようよ。
あれ ?, 537 と 538 って同じなんだ. 勉強不足だ, 俺 ...
流れ読めてねーよ
float a = 1/0.3; じゃダメなの?
543 :
デフォルトの名無しさん :02/09/25 01:10
で、>524がわかる方はいらっしゃいませんのでしょうか?
U:Unsignedでいかんか?
>>524 標準だと他にLLがある。VCの拡張ならi64というのも。
>546 すいません、おっしゃっている意味が全くわかりません 0U(ゼロ、ユー)がコンパイラ(あるいはプリプロセッサ)に どう解釈されるのか知りたいだけなのですが? そもそもキャストとかいうC言語の汚点を隠すために サフィックスが使われているんじゃないんですか?
>>547 > そもそもキャストとかいうC言語の汚点を隠すために
> サフィックスが使われているんじゃないんですか?
んじゃ、((void*)0) を数値定数で表現してみろ
550 :
デフォルトの名無しさん :02/09/25 02:32
先生!スレタイトルの(33)ってのは年齢のことですか?
>549 キャストを使うなって言ってるんじゃなくて 使わなくて良い所で不用意に使うなって意味なんですが・・・ これだから年寄りは・・・
552 :
デフォルトの名無しさん :02/09/25 02:38
−−−−−−−−−−−−−−−−−−−−−−−−−− 俺様用しおり \ │ / / ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ─( ゚ ∀ ゚ )< 読んだ読んだ読んだ! \_/ \_________ / │ \ ∩ ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< 読んだ読んだ読んだ読んだ! 読んだ〜〜〜〜! >( ゚∀゚ )/ | / \____________ ________/ | 〈 | | / /\_」 / /\」  ̄ / /  ̄ −−−−−−−−−−−−−−−−−−−−−−−−−−
何だ、ただの釣り師かよ・・ツマラン
>>先生!スレタイトルの(33)ってのは年齢のことですか? スレが33枚目(32000以上レスがついた)ってこと。
>>551 > キャストを使うなって言ってるんじゃなくて
勝手に勘違いすんな。
> キャストとかいうC言語の汚点を隠すために
> サフィックスが使われている
と言うのならなんでポインタ等のサフィックスが無いのか?
という意味なんだが。
検索エンジンで探すことすらしない厨房の頭じゃ理解不能か。
あ、555ごっと!
524=490=352 =スレ立てるまでもない質問スレの820 と断定しますた。
だいたい、ポインタに即値を代入するのは ほとんどがヌルポインタだけだと思うが、、、
検索しなかったのは悪いと思うし 後半のレスが無意味だった事も認めるけど 「0Uってどう解釈されるの?他にもサフィックスてあるの?」って問いに いきなり「キャスト使え」って答えられても困ります 「普通に数値書いただけだと警告がでてしまうので云々」て質問に対してならわかるけど
561 :
デフォルトの名無しさん :02/09/25 03:02
>>554 ありがとうございます!!
漏れの脳内では33歳の女性教師が眼鏡とストッキングを着用の上教えてくれるスレ
だとばかり思い込んでしまっていたので真実が知れて胸をなでおろしています
これからはマジメにC言語にハァハァしますので今後ともお見捨てなきようおながいします
>557 ちがいます てか、490=352=スレ立てるまでもない質問スレの820 まではあってると思うけど
>>560 それは俺に対して言ってんのか?
>>546 に言えよ。
答えは上で出てるけど、
数値の型を表すためにサフィックスで使われる文字は
L long (or long double)
U unsigned
F float
合わせ技もあり。
あとはそれぞれの処理系定義かな。あまり自信はないけど。
↑C99ではどうなのか知らんよ。
>>560 > いきなり「キャスト使え」って答えられても困ります
いきなり検索等もせずに質問して、しかも回答されてるのを
無視してたヤツに言う権利はない。キャストでも使っとけ。
たまに
>>560 みたいな勘違い坊やが出てくるけど
まあ生暖かく見守ってやろうぜ。
毎スレ 毎スレ スレ立て人の歳が違うじゃないか! 男か女か! 自分の歳も性別もわからんのか このぼけどもが!!!
ランダムな数値の入っている配列全てに、 1度に定数を加えるってことは可能?(int型です) n[]={5,9,4,7,22,6,10}; *n+=20; これで出来ないような気がするのです。 結果25,29,24,27,42,26,30になるような。
>>568 > ランダムな数値の入っている配列全てに、
> 1度に定数を加えるってことは可能?
無理です、そういう関数を作るかループを使ってください。
> *n += 20;
先頭の要素だけが加算され、残りはそのままです。
結果25,9,4,7,22,6,10};
570 :
デフォルトの名無しさん :02/09/25 13:24
16進数を10進数に変換するにはどうしたらいいでしょうか?
16進数の各桁に、16のn乗を掛け加えて行く。
>>568 char にして MMX で一気に処理しる
>>570 質問の意味がわからないが
16進数文字列を数値に変換する関数ならsscanfという関数がある。
>>572 16のE乗とかってあるのですか?
>>574 調べてみます。
あと逆の変換の仕方もわかるかたいますか?
手順としては、A〜Fを10進数に直してから。
>>575 > あと逆の変換の仕方もわかるかたいますか?
やっぱり質問の意味が良くわからないのだが、
数値を10進数文字列に変換する関数ならsprintfという関数がある。
「進数変換」で検索したら? 10進数を16で割っていき、余りを逆順にならべるで出来なかった?
えっと、printfやscanfを使わずに変換する方法を知りたいのですが、 質問の意味わかっていただけましたか?
わかるやつはサイコメトラー
>>578 15を16で割ったらあまり15ですけど・・・
582 :
うんっちっち君 :02/09/25 14:11
プログラマ(SE?)で内定ということで いままで独学で無茶苦茶やってきたプログラムを正しく勉強しなおしているのですが、 まあいままではVCでゲーム作ってばっかりだったので じつは基本のCが理解できてなかったりします。とくに演算系。 で知らないものがいくつかでてきました。 printf("ああ\n")=puts("ああ") scanfのかわりのgets、これはもう絶滅した使わないものととらえていいのでしょうか。 if文と同じ処理なんだけど a?b:c ってやつです。 これら3つって使うことあるのでしょうか? ぜんぶprinf,scanf,ifで済ましたほうが文面的には長くなるけど のちのち解読しやすいと思うのですが。 しかもコンパイルした時点でどうせおなじ処理なので重さとか処理速度には 関係しませんよね。?
>>579 > 質問の意味わかっていただけましたか?
わからない。
>16進数を10進数に変換するにはどうしたらいいでしょうか?
16進数とは「数値」なのか?「文字」なのか?
10進数とは「数値」なのか?「文字」なのか?
数値→数値は意味がないし、
文字→数値ならばsscanfがあるし、
数値→文字ならばsprintfがあるし、
文字→文字ならばCでは非常に面倒で私には答えかねる
>>582 仕事として やってくならば、リストの解読のしやすさに
重点を置いたほうがいいな。
自分が作ったソースを 他人が 見て修正するなんてことは しょっちゅうだからな。
0xFBA = 15 * 16^2 + 11 * 16^1 + 10 * 16^0
>>582 > scanfのかわりのgets、これはもう絶滅した使わないものととらえていいのでしょうか。
使うならfgetsを使え
> if文と同じ処理なんだけど a?b:c ってやつです。
> これら3つって使うことあるのでしょうか?
プログラムを書くためには必要ないかもしれんが、
プログラムを読むためには必要なものだ。
他人のソースを読んでメンテするのもプログラマの仕事の1つだ。
>582 てか、三項演算は使うぞ 1ステートメントしか入れられない場所で どうしても条件分岐が必要な事はある
>>582 printf("ああ\n") と puts("ああ") とでは前者の方が遅いぞ。
といってもこの程度だと大した差ではないが。
「printf("ああ\n");」VS「printf("%s", "ああ\n");」だとどうなるのか? と言ってみるテスト
後者が遅い のか?
>>588 printf("iは%sの数です。\n",i<0?"負":"正");
こんなのとか?
printf("iは%sの数です。\n",&"負\0正"[(i<0)*3]); トリッキースレ逝きだな、、、
>>594 printf("iは%sの数です。\n","負\0正"+((i<0)*3));
せめてこう書こうよ(笑)
printf("iは%sの数です。\n","正\0負"+((i<0)*3)); こうだな。間違った。
いや、こうしようよ。 printf("iは%sの数です。\n",&(sgn(i)*3["負\0正"])); むかついて会社辞めるときはこんな感じのソース残して辞めると吉。
速度なんか大して変わらないからいいんじゃないか? printf(引数で受け取ったポインタ)とかにさえしてなきゃ。
>>599 理解を深める
これ大事
アスパラ アスパラ
不法滞在
これは禁止
601 :
デフォルトの名無しさん :02/09/25 20:21
柴田望洋の本は読みにくくて学習に時間がかかる。
602 :
デフォルトの名無しさん :02/09/25 20:28
ぼーよーの標準関数一覧は便利だったけど、今はlinux.or.jpのJM使っているからいらない。
>>603 うえの方に
#define sgn(x) ((x)>=0)
と書かれています。
605 :
デフォルトの名無しさん :02/09/25 21:09
const char *s[] = { "aa", "bb", "cc" }; const char *s2[] = { "AA", "BB", "CC", "DD" }; const char *s3[] = { s, s2 }; これでエラーがでるんですけど...どうしてですか?
606 :
デフォルトの名無しさん :02/09/25 21:10
引数で渡した文字列を十六進数で ファイルに書きこみたいんですけど どーすれば(・∀・)イイ?
const char **s3[] = { s, s2 }; 型が違うから
配列の配列だからね
>>606 さっきから何を言っているのかサパーリ。
16進数の文字列でファイルに書きたいの?
10進とか16進とか言ってるヤツはネタだろ。
612 :
デフォルトの名無しさん :02/09/25 23:01
ビット演算子と代入演算子だけでCプログラミングは出来ますか? 一度やってみたことはやったのですが構造化で挫折しますた
>>612 よく意味がわからんが、ビット演算と代入演算以外の演算子の使用を禁じるってこと?
というか先生! += は代入演算子に入りますか?
614 :
デフォルトの名無しさん :02/09/25 23:17
>>613 +とかついてたらだめです。使っていいのは(&|~^=)
で、漏れは関数呼び出し、条件制御が出来なくて挫折しますた
つーか、できたのは足し算関数(論理回路で言う加算器)ぐらいだけど
>>615 ・デバッガでステップ実行して標準関数の中に入り込む
・grep (VC++なら[ファイルから検索...]とかいうメニュー)
新卒採用で,externとかたくさん使っていたら落ちますか?
全てのソースファイルにインクルードするヘッダファイルで外部変数全部extern汁
>>606 たとえば「2ch」とか放り込んだのが変換されて、
「0x32 0x63 0x68」になればいいってことなのかしらん?
>>619 できたのは自然数の足し算なんですよ
符号ビット調べての足し算もやりましたが所々にバグがちりばめられてます
乗除算はシフト使いたくなりますが・・・
>>570 =
>>579 =
>>606 全て同一人物とみなしていいのかなぁ?
だとすれば「 "a = 10;" と "a = 0x0A" とは全く同じコードだよ」
とかそういうことが分からないんだろうか?
>>621 俺も自然数のつもりだった。
自然数の足し算ができたとのことなので、
a - b = a + ~(b) + 1
を使えば自然数の引き算は簡単じゃないかという突っ込み。
BCD演算のことを言っているのか?
大丈夫みたいね
>>606 void hoge(char *p)
{
・・・
for(;*p!='\0';p++)
fprintf(fp,"%x",*p);
・・・
}
こういうことですか?
>>624 BCD(Binary Coded Decimal,2進化10進数)のこと?
いやそういうわけじゃないけど、、
>>623 2の補数を使うと加算が2回出るじゃないですか
それなら最初からと思うのですが
速度気にするくらいなら普通にしろよ(ワラ
>>628 それでは、、、、
足し算はレスを見る限り
i1(入力1),i2(入力2),ic(キャリー入力)と
o(出力),oc(キャリー出力)のフルアダーを各ビットごとに
構成して実現したんだよね?
同じように減算回路をソースに落とせば?
>>629 例えば5+(−8)とか0をまたぐときにバグバグなんです
条件分岐とかはプログラムカウンタいじらないと無理ですか?
>>630 足し算を629のように作れば5+(-8)も上手くいくはずだよ。
(&|~^=)しか使ちゃだめなら条件分岐に関しては見当もつかない。
おいお前ら、ここ何のスレだ? いいかげんウザイ。
>>631 そうですかでなおしてきます
れすありがとうございました
>>632 すまん。C言語よりもむしろハードに近い内容になってしまった。
いや半分ネタだから気にすんな。言い過ぎたよ。
ミナサソ 混乱させてしまい大変申し訳ございませぬ。 ワタクシは>570でも>579でもございません。 ワタクシがやろうとしておりますのは fprintf ( fp , "%x",argv [2] ); ってことでして。。。 これじゃーargv [2]の先頭アドレスを 16進数でfpに書き込むだけなんですよね? そこで代替案っちゅーか、なんちゅーか。 とにかく $hoge.c smp.txt 34567 と、したときにsmp.txtに"34567"が16進数で 書き込まれるプログラムをつくりたいんのです。 ほんと糞厨でごめんなさい。
(´Д` )ウワァァン 636禿げしくマチガテルヨ!! $a.out smp.txt 34567 デスタ・・・ スミマセソ
argv[]をatoiで整数に変換してからfprintf
>>638 の argv[] は argv[2] に訂正すます
>>622 ×"a = 0x0A"
○"a = \x0A"
>>636 それじゃ16進なんか関係ないじゃん。
「10進数の文字列を数値にしたいんですけど」って聞いとけや
片思いの彼女に16進数で告白したいのですが どうすればいいですか?
>>642 コネクションをはってプロトコルを合わせ、文字コードを聞き出したら、喋れ。
内容についてはご自由に。
>>641 ばかだなあ。ネタに決まってんじゃんプププ
・・・
645 :
デフォルトの名無しさん :02/09/26 04:22
どなたか教えてください。Rt-Linuxでロボットの制御をしているのですが、ある間隔でサンプリングしてくるデータをリアルタイムにプロットするにはどうしたらよいのでしょうか?どこかこういうことが説明してあるURLでも構いませんので教えていただけないでしょうか? よろしくお願いします。
gnuplotとかのプロッタにパイプで流し込むとか、 Xで書くとかしか思い浮かばないけど
>>646 プログラムも初心者でgnuplotも今日初めて使い出したばかりなので詳しいことがわからないのですが、
今gunuplotを使ってロボットが動いている間中、手動でプロットのコマンドを打っています。シェルを使って自動的に打たせたいとは思っているのですが、gnuplot上のシェルでFor文かWhile文のようなものが記述できるのでしょうか?
んー詳しくないけど、「gnuplot パイプ」「gnuplot 標準入力」とかを 検索するとヒントになるかも
649 :
デフォルトの名無しさん :02/09/26 05:08
>>612 無理。
他のすべてを禁止するということは関数の使用も禁止するんだろ?
無理だね。
ありがとうございます。ではちょっと調べてみます。 助かりました。
>>652 わかんない。
ぱっとやってみた幹事ひととおり出来てるけど
抜けがあるかもしれない
#include <stdio.h> typedef void (*callback_t)(); int callback(void) { printf("test\n"); return 1; } void func(void (*callback)(void)) { callback(); } int main(void) { func((callback_t)callback); return 0; } コールバックの型が違うのにエラーが出ません。 どうしてなんでしょう?
>>636 > ワタクシがやろうとしておりますのは
> fprintf ( fp , "%x",argv [2] );
> ってことでして。。。
> これじゃーargv [2]の先頭アドレスを
> 16進数でfpに書き込むだけなんですよね?
文字列の終わりまで繰り返せばいいだけ
char *p;
for(p = argv[2]; *p = '\0', p++)
fprintf(fp, "%x", *p);
または
int i;
for(i = 0; i < strlen(argv[2]); i++)
fprintf(fp, "%x", argv[2][i]);
好きな方を使え
ループの中で strlen を使うのは止めてホスィ(´Д` )
>>654 引数が空とvoidの違いのことを言ってるのかな?
処理系依存だろうけど、関数の引数が空とvoidでは
普通は全く同じコードが生成されるんで問題なし。
func((callback_t)callback)でキャストしてるから警告も消える。
>>654 Cでは引数の省略と引数voidは関数定義以外では違うんだってば・・・・
660 :
デフォルトの名無しさん :02/09/26 21:59
変数の例などで hoge と使ったのは誰が最初ですか?
661 :
デフォルトの名無しさん :02/09/26 21:59
時代遅れでも私は使い続けます。 C++に負けるな! VIVA C言語!
662 :
デフォルトの名無しさん :02/09/26 21:59
663 :
デフォルトの名無しさん :02/09/26 22:00
22:00げと
揚げ
おかしい、age入れたつもりだったのに・・・ ・・・666get
667 :
デフォルトの名無しさん :02/09/26 23:12
おめーん 666 ゲット
取られてた・・・(鬱)
お前ら質問しる
float = 0xXXXX; てな感じで、代入したいんすけど、 上記のXXXXの部分をユーザ側からもらうには、どうすりゃいいん でしょうか?思いつかんので、俺に教えてくらはい!
int main(int argc, char **argv)
scanf ?
673 :
デフォルトの名無しさん :02/09/27 00:47
>>657 ,658
そうでは無くてcallback_tの戻り値をvoidにしていて、
callbackの戻り値をintにしてる所です。
ところで、654は文法エラーのことを言っているのか、 それとも実行時のエラーのことを言っているのか。
質問です FILE構造体が利用するバッファ(ストリーム)はどの関数がどのメモリ領域に確保しているのでしょうか
>>676 どのメモリ領域って何よ?
それと、処理系依存の話なら処理系が何かを書け。
処理系は特に考えてないですが、メモリというのはスタックとか、そういうやつです。
スタックは無理じゃねーか?
>>676 printf()やscanf()等が関数の静的変数として確保しています
>>678 処理系が指定されていなければ答えは出せないな。
一般的な話で言えば、ヒープ領域に確保されるだろうね。
でも自分でsetvbuf等を使ってスタックとかstatic領域を
割り当てることもできるわけだし。
どの関数かは完全に処理系依存。
俺の使っているVC++では_getbufあたりかな。
これをfreadやfgetc等の関数が内部で呼び出している。
>>678 Linuxの場合はマニュアルによるとデフォルトではmallocを呼び出して確保するみたいだね。とするとヒープか。
プログラマがsetvbufなどで割り当てなければスタックはないと思う。
なるほど。つまり、free()はfclose()がfree(fp->base)な感じで 行っていることになりますか?
686 :
デフォルトの名無しさん :02/09/27 02:26
>>675 両方ともエラーは出ません。
処理系はgcc(version2.95.4)です。
>>686 そういう意味ではなくて、
エラーにならないのがおかしいと思うのは、どっちのエラーのことか?
言い換えると、文法エラーにならないのは当たり前なんだけど
それはわかっているのか?
>>686 callbackの戻り値がintだろうがなんだろうがそれを無理やりcallback_tにキャストしてんだからエラーはでないでしょ
実行時にどうなるかは知ったこっちゃないけど
689 :
デフォルトの名無しさん :02/09/27 02:40
恐らくincompatibleなポインタ型を指摘するメッセージが出ると思う。 エラーと言うかワーニングメッセージ #include <stdio.h> typedef void (*func_t)(); int func2(void){return 1;} int main(void) { func_t func; func = func2; func(); } これは出た。
691 :
デフォルトの名無しさん :02/09/27 02:42
チンコウィルスがさ
>>673 多くの処理系では(少なくともIA-32では)longくらいまでの戻り値は
レジスタ経由で返されるから呼び出し側に影響はない。
コンパイル時にエラーにならないのはキャストしてるから。
以上。
> 多くの処理系では(少なくともIA-32では) IA32では戻り値に必ずレジスタを使わないといけない という規約があるとでも言うのだろうか。 そういう俺もレジスタで返す処理系しか知らないのだが。
>>694 Intelが作った呼び出し規約の資料はあるのか知らないけど、
Visual C++やx86版のSoralisでは決まっているから、
それらのプラットフォームではその規約に従う必要がある。
>>695 Visual C++がEAXレジスタで戻り値を返すからといって、
他のコンパイラまでその規約に従う必要はないはず。
API等の外部関数とのやりとりだけを、それ専用の
呼び出し規約で対応してもいいわけだし。
慣習としてこの方式が使われているのは事実だけど、
絶対的な規則ではない気がする。 (間違ってたらごめんよ)
教えてください char ch[32] = "utudashinou"; と文字列を作ります。この文字列の末尾を指すようにポインタを使うと char *p; p = str1 + strlen(str1) - 1;となると本に書いてあるんですが ↑このポインタがどういったアドレス(?)を保持しているのか解らないです ついでに、 char ch[32] = "utudashinou";←日本語文字だといけないっていうのは解ります 日本語は第1バイト、2バイトで一組で、1バイト目と2バイト目を逆にすると文字にならない ってことですよね?・・・
あれ、ミスがある・・・ 5行目のp = str1 + strlen(str1) - 1 は、p = ch + strlen(ch) - 1 です
p = ch; str1の先頭要素のアドレス p = ch + 1; その次の要素のアドレス p = ch + 2; その次の次の要素のアドレス p = ch + 3; その次の次の次の要素のアドレス p = ch + strlen(ch); 終端NULL文字のアドレス p = ch + strlen(ch) - 1; 最後の文字(終端NULL文字の1つ前)のアドレス > 日本語は第1バイト、2バイトで一組で、1バイト目と2バイト目を逆にすると文字にならない > ってことですよね?・・・ はい。 逆にすると文字にならないというより、おかしなことになるのでやめろ。
訂正。700げと。 × p = ch; str1の先頭要素のアドレス ○ p = ch; chの先頭要素のアドレス
701 :
デフォルトの名無しさん :02/09/27 16:12
素人です ポインタ型変数の宣言の時 int *pnt; int pnt*; どちらでもよいの?
ありがとうございました!
>>699 さん
もう一つよろしいですか?
なんとなくわかるんですが、
char str[][32];
char *p;
として、多重配列になった場合
p = (char *)str;
と、キャストしないといけないのはなぜですか?
704 :
デフォルトの名無しさん :02/09/27 16:21
fscanf(fp,"%8d %2d %2d\n",&a,&b,&c); としたときのフォーマット指定部分の最後の \n は付けると付けないとでどう違うのか分からないのですが 違いはあるんでしょうか?
>>703 次元が違うじゃん。配列strに適合するポインタは
char (*)p[32] = str; /* 32要素のchar配列(strの先頭要素に相当)へのポインタ */
>>705 さんありがとー
次元か。そっかそか
たびたびごめんなさい。がんばってきます
>>705 char (*p)[32] = str;
>>701 多分、
int *pnt;
int* pnt;
の間違いだと思うけど。基本的には好みの問題なのでどっちでもよい。
>>704 付けても付けなくても動作は同じ。
fscanf()のフォーマット文字列のスペース、タブ、改行はどれも、
「スペース、タブ、改行のどれかがあったらなくなるまで読み飛ばす」
という意味。
あ、後にfscanf()が続く場合に動作が変わるかも。スマソ。 >fscanf()のフォーマット文字列のスペース、タブ、改行はどれも、 >「スペース、タブ、改行のどれかがあったらなくなるまで読み飛ばす」 >という意味。 の説明は合ってるはず。
712 :
デフォルトの名無しさん :02/09/27 17:57
void hoge(char str[])と void hage(char *str)は 関数内部に実体を持つか持たないかの差ですか? hogeにポインタで渡すと配列サイズが分からない気がしますが・・・ やっぱり等価かなぁ
同じ。
>>712 つーかやってみろよ。sizeof(str)とか
文字列だったら '\0' で終端がわかるだろ
よく分かりました ありがとうございます
void hoge(char str[]) ↑これって関数がポインタを受け取るときは(間接的に)配列を受け取る場合が多いから、わかりやすく書けるようにしただけだよね? 構文糖というかどうかは分からないけど。
718 :
デフォルトの名無しさん :02/09/27 18:37
void **p; これ、どうやってつかうんですか?
ごめん嘘だvoid **pだったね CoCreateInstance()とか1つの関数でいろいろな型(クラス)を 作って渡すのに使うのだと思う 例えば簡単に書くと void hoge(int n,void **p) { switch(n){ case 0: *p=(char *)new char; return; case 1: *p=(float *)new float; return; ・・・ default: *p=(int *)new int; return; } ・・・これも嘘かも new使ってるのがスレ違いとか言わないで
721 :
デフォルトの名無しさん :02/09/27 21:28
キャスト(void *)の間違い鬱だ
何を言っておる。 void *a[N]; void **p = a; って使えるじゃん。ポインタ配列に適合するポインタでもいいんだよ? それと、配列の生成は new char[n]
>>722 voidのポインタ配列を参照するときにキャストするのならば
最初からキャストする型で宣言した方がいいのでは?と思い直したんですよ
hogeで作るオブジェクトは配列でなくて
1個のインスタンス生成を想定してましたが、
ただC++ならテンプレート使えば済む話ですが
あーそーか勘違いした>配列
726 :
デフォルトの名無しさん :02/09/27 23:47
forループの中で,インクリメントされた値を異なる変数名に 順次代入したい場合ってどうしたらいいの?
なにそれ。こんなのしかイメージできないぞ↓ int a, b, c; int *vars[] = { &a, &b, &c }; int i; for (i = 0; i < 3; i++) *vars[i] = i;
728 :
デフォルトの名無しさん :02/09/27 23:52
すべての車バイクが電気で動くようになったら暴走族の被害がかなりへるかと
違法改造で放電しまくってうるさいかもしれない 一体何の関係が
730 :
デフォルトの名無しさん :02/09/28 01:06
ループ(for、while等)の中で一回だけ実行するにはどうしたらいい? 例えば、 for(i=0; i<3; i++) { printf("%d\n", i) } において、一回だけprintfを実行させたい場合。
/* for(i=0; i<3; i++) { */ printf("%d\n", i) /* } */
for(i=0; i<3; i++) { if(i==0)printf("%d\n", i); }
ループの外に出すわけにはいかんのだろうか?
>>720 単純に「void*へのポインタを使いたい時」でいいんじゃない?
たとえば
void free_mem(void **p)
{
free(*p);
*p = NULL;
}
でもいいんだし。
735 :
デフォルトの名無しさん :02/09/28 01:22
今日、初めてC言語のソースを書きました。 本当に感激しました。 よーし、この調子で明日は少し進むぞ〜
736 :
デフォルトの名無しさん :02/09/28 01:24
んじゃ、無限ループのなかにおいてはどう?
>>736 for(;;) {
static int only_one=1;
if ( only_one ) {printf("hoge\n"); only_one=0;}
}
>>734 #define SAFE_DELETES(o) if(o){delete[] o;o=NULL;}
との違いは?
void*使ってたら型安全性もくそもないし
Cスレなのでdelete[] o;が嫌でしたらfree(o);と読んで下さい
739 :
デフォルトの名無しさん :02/09/28 01:35
>>737 それメインループの中で初期化するときによくやってる
オーバーヘッドがある分関数が不利?
>>741 速度を取るかバイナリのサイズを取るかだね。
ただし、free自体にかかるコストがかなり大きいので、
場合によっては全体のコードサイズの関係でマクロの方が
遅くなるケースも考えられる。
↑ アプリケーション全体を考えた時の話ね。
いや、この程度ならマクロでもサイズはほとんど同じかも。 度々スマソ。
745 :
デフォルトの名無しさん :02/09/28 03:13
>>730 for(i=0; i<3; i++)
{
printf("%d\n", i);
break;
}
746 :
デフォルトの名無しさん :02/09/28 03:50
画像処理でBitmapの読み込み、書き込みに苦労してます。 助けてください。読み込んだあとにHough変換するのですが、 よくわかりません
マルチウザイ
>>730 sw=0;
for(i=0; i<3; i++)
{
if(sw==0){printf("%d\n", i);sw=1;}
}
//printf(--) <= ;付けとけよ!
749 :
デフォルトの名無しさん :02/09/28 11:14
ポインタのソートの仕方が分かりません。 誰か教えてください。
qsort関数でも見てみる?
751 :
デフォルトの名無しさん :02/09/28 11:19
>>750 学校の課題で出されているんですがqsort関数は使用不可なんです。
ポインタの位置を入れ替えてしないといけないみたいので。
753 :
デフォルトの名無しさん :02/09/28 11:26
Base64 エンコードやりたいのですが、 6ビットごとの操作ってところで詰まっています どっかにサンプルってないでしょうか?
>>749 if(a<b)
swap(&a,&b);
〜〜〜〜〜〜〜〜〜〜
swap(*aa,*bb){
int *cc;
*cc=*aa;
*aa=*bb;
*bb=*cc;
}
こんな奴かな?
755 :
デフォルトの名無しさん :02/09/28 11:47
>>754 構造体のソートなんです。
なんとかんらないでしょか?
ポインタに構造体の先頭アドレス放り込んだらいいんでないの? struct tbl tb1, tb2; struct tbl *ptb1, *ptb2; ptb1 = &tb1; ptb2 = &tb2; こんな感じで
757 :
デフォルトの名無しさん :02/09/28 11:59
>>756 もう少し詳しく教えてもらえないでしょうか?
ソートはどうやっておこなうのですか?
>>749 > ポインタのソートの仕方が分かりません。
>>755 > 構造体のソートなんです。
結局何がしたいのよ ? 構造体を指すポインタの配列があって、それをソートしたいの ? つまり...
struct _s {
/* ... */
} s[100];
struct _s p[100];
for(i = 0; i < sizeof(p)/sizeof(p[0]); i++){
p[i] = &s[i];
}
となってて、p[] をソートしたいのか ?
>>753 > Base64 エンコードやりたいのですが、
> 6ビットごとの操作ってところで詰まっています
> どっかにサンプルってないでしょうか?
「base64 サンプル ソース」 あたりでググレばいっぱいあるぞ。
でも、何故に「6ビットごとの操作ってところで詰まっています」なの ?
unsigned char in[3];
unsigned char out[4];
out[0] = in[0] >> 2;
out[1] = ((in[0] & 0x03) << 4) | (in[1] >> 4);
out[2] = ((in[1] & 0x0f) <<2) | (in[2]
>>6 );
out[3] = in[2] & 0x3f;
でいいと思うけど...。(適当に書いてるから、バグってたらごめんね。)
64bit機ではintの大きさは8バイト?
すいません・・・ オプションって何でしょう?
1バイト三千五百円です・・・・・・・・・・・日給かよっ!安いよっ!
>>762 自機の後ろについてくるまるくてフワフワした憎いヤツ。
オプションイーターに喰われてスゲー泣ける
765 :
デフォルトの名無しさん :02/09/28 12:54
最初にdoubleで宣言してある配列に、 いろいろな小数が入っています。 この配列のそれぞれ整数部分だけを取り出すにはどうしたらいいですか?
それhグラディウス
>>761 > オプション次第
つーか処理系 (コンパイラ他) 次第。
おお、なるほど 激しく感謝
>>765 > 最初にdoubleで宣言してある配列に、
> いろいろな小数が入っています。
> この配列のそれぞれ整数部分だけを取り出すにはどうしたらいいですか?
int で宣言してある配列に代入しろ。
キャストじゃダメなのかな?
758のソースも何やってるのかわからんのだが。 * の書き忘れかな?
>>771 > 758のソースも何やってるのかわからんのだが。
> * の書き忘れかな?
もう少し、頑張りましょう。
>>765 なんならfloor、ceil 調べたら?
>769 なるほど、ありがとうございます。 >770 キャストって何ですか?
>>772 頑張ってみたがダメだったよ。
あんた以外の人間にもわかるように
あのソースが正しいことを説明してみてくれないか。
> 771 まずやりたいことを詳細に書いたら? あの内容じゃワケワカラン
>>776 マジなのか ?
どこらあたりがわからんの ?
特に、どこに * を書き忘れたと思うの ?
はあ? おまえら全員でネタ披露してんの? > p[i] = &s[i]; 構造体へ構造体ポインタを代入できるの? > 特に、どこに * を書き忘れたと思うの ? struct _s p[100]; ↓ struct _s *p[100];
>>779 おおなるほど、間違いだ。で、それが「何やってるのかわからんのだが。」ともったいぶって言うことか ?
単に、「間違ってるぞ、ヴォケ !!」ですむ話だと思うが。
みんな! もちつけ! /\⌒ヽペタン / /⌒)ノ ペタン ∧_∧ \ (( ∧_∧ (; ´Д`))' ))(・∀・ ;) / ⌒ノ ( ⌒ヽ⊂⌒ヽ .(O ノ ) ̄ ̄ ̄()__ ) )_)_) (;;;;;;;;;;;;;;;;;;;)(_(
>>780 ごめん、悪気はなかったんだよ。
*の書き忘れなのか、それとも &が余計なのか、
それとも他の意図があったのかわからんかった。
>>774 #include <stdio.h>
main(){
double d=5.239;
d=(int)d;//(int)<=intへのcast
printf("%f",d);
return 0;
}
//こんなプログラムでわかるかな?なんとなくだよ
↑ の名前は758でなはないです。 771の間違いですだ。
772が全部悪いということで
while(*p && *p!=' ') この条件判定はどういう意味ですか?
>>786 *p かつ *p が ' ' でないなら
です
>>786 while(*p=0 && *p!=' ')
間違えた while(*p==0 && *p!=' ')
*p!=0だべ
間違えた while(*p!=0 && *p!=' ')
空白文字で無くポインターの最後まで行っていない間ってところか?
間違えた while(*p==0 && *p!======' ')
> 772が全部悪いということで
まあ、心配するな、元を間違った俺が一番悪いのは当然だ、すまん。コンパイルして見りゃ良かったんだけどな。
>>786 p の指す先が文字列の終端でなくてかつ空白でない間...
797 :
デフォルトの名無しさん :02/09/28 13:51
海外の比較的マイナーな文学作品を翻訳出版する 小さな出版社がある。そして文学ファンはこういった出版社を 潰さないため、今後も翻訳を続けてもらうために 1人で同じ本を2・3冊買うことが良くある。 我々もこういう時だからこそDelphi7を買って ボーランドを支えるべきなんじゃないだろうか。 Delphi7の売り上げはDelphi8以降の開発資金となるし、 ボーランドジャパンの今後に大きな影響をもたらすだろう。 Delphi7の出来のみを云々するのは あまりにも近視眼的ではないだろうか?
つまり文字列が終了するか空白が現れるまでループってことで。
>>793 ありがとーベリーマッチ
んじゃ、whlie(*p)っていうのは、ポインターが最後まで行ってない間でFA?
初心者質問でスマソ みんなありがとね!
>>799 > んじゃ、whlie(*p)っていうのは、ポインターが最後まで行ってない間でFA?
Yes, 俺は、while(*p != '\0') と書くけどね。
>>799 注意。
”文字列を格納した”ポインターだけだよ。
マジありがと! 大体わかってきたけど、まだポインタを使う意図が理解していません・・・ 勉強してるうちにわかってくるもんなのかな?
>>803 たとえば関数に配列(文字列含む)を渡す時は
ポインタで渡すのが一般的です。
ふむふむ まだ多重間接参照とかポインタを仮引数として使った奴とか勉強してないから 修行してきます(・.・;)
#include <stdio.h> #define N 1500 #define XSIZE 320 #define YSIZE 240 main() { int x,y; int count; int image1[N][N],image2[N][N]; printf("OK1"); for(y=0;y<N;y++){ count=0; for(x=0;x<N;x++){ image1[y][x]=count; count++; } } printf("OK2\n"); for(y=0;y<YSIZE;y++){ for(x=0;x<XSIZE*3;x=x+3){ image2[y][x/3]=image1[YSIZE-1-y][x/3]; printf("x=%d,y=%d, 中身%d\n",x,y,image2[y][x]); } } } が動きません。理由を教えてください
int を450万単位確保できるの? Nで指定した数値を少なくして実行してみて。
>>806 >理由を教えてください
オーバーフローが原因ではないかと。。。
対策としては、
static int image1[N][N],image2[N][N];
~~~~~~
みたいにしてスタック領域に確保してみては。
811 :
デフォルトの名無しさん :02/09/28 16:25
>807 どのくらい小さくしたらいいと思いますか?
>810 すみません。スタックではなく、静的でした。。。(--;
スタックではなくスタティックだったというギャグだな
staticを付けたら動くようになりました。 しかし配列のなかにcountの値が格納されません。 どうしてですか?
815 :
デフォルトの名無しさん :02/09/28 17:08
if(経験人数==0) goto 820
>>814 教えてください.countはきちんと表示されるのに実際
image2の中を見ると0ばかりです
>しかし配列のなかにcountの値が格納されません。 格納されていますよ。出力画面で[中身]の値が0でそう思っているのでしたら printf("x=%d,y=%d, 中身%d\n",x,y,image2[y][x/3]); にかえてみては。 ~~~~~ >814がどのような結果を求めているのかはわかりませんが。。。 それにしても、日本語 C が普及しなくてよかったと思った今日この頃っす。
ハァー。また、やってしまった。。。~の位置は気にしないで下さい。(_ _) ついでに逝ってきます。;y=-( ゚д゚)・∵・ターン
819 :
デフォルトの名無しさん :02/09/28 17:48
#include <stdio.h> main() { char name[50]; printf("名前を入力してください\n"); scanf("%s",name); printf("%sですね\n",name); return 0; } 漢字で入力したいのですがどうすればできますか?
日本語入力モードにする
821 :
デフォルトの名無しさん :02/09/28 17:53
alt+半角な
822 :
デフォルトの名無しさん :02/09/28 18:00
823 :
デフォルトの名無しさん :02/09/28 18:02
できたけど・・・
824 :
デフォルトの名無しさん :02/09/28 18:04
>>819 漢字で入力できないのはそのプログラムのせいではないと思うぞ(^_^;)
ところで、
>>819 を書いたときはなんで入力できたの?
単に文字列を入力するだけなのにscanfを使うのもどうかしている。
826 :
デフォルトの名無しさん :02/09/28 18:07
>>824 ??
scanfで入力するときできないんですが
scanfのせいだとは思えないけどな。
829 :
デフォルトの名無しさん :02/09/28 18:34
質問の時間がやってまいりました。 System::TextとどっかのライブラリのText定義が 曖昧ですよエラーが発生します(´д`;) 簡単に解決するにはどうしたらいいのでしょか。 どっかのライブラリの方は弄りたくないらしい ですが・・・
言語を明確にして他スレに書く。
>>829 C#かな。よー分からんけど、クラス名を明示的に指定してみたら?例えば、
Text var;
↓
System::Text var;
たぶん、Textってクラスが名前空間に2つあるから、コンパイラが混乱してるんだと思う。
しまった…ここC言語スレだったんだ…。逝ってくる。
833 :
デフォルトの名無しさん :02/09/28 18:53
逝って来るといいつつ滞在する
言語はC++(BCB)らしいです。 使いたい方のライブラリのクラス名が不明なので もいっかい探してみます・・。
バ、バレてる…(;´Д`)。
836 :
デフォルトの名無しさん :02/09/28 19:03
質問です。。 自分のPCだと printf("\033[%d;%dH",x,y); の実行結果が [x;yH となってしまうのですが・・・(ι ´ェ`) どうすれば正しくエスケープコードを 認識してくれるようになるでしょうか・・・? 知り合いのPCだと正常に動作したソースを使ってます。 環境はペンティアム3の1.6Gでosはxpです。 他に記載すべき点があれば言ってください・・・。 よろしくお願いします。
追記 [x;yHの前にエンターの記号みたいなのが表示されます(ι ´ェ`)
>>836 NT系のOSでは、Win32プログラムはエスケープシーケンスは使えない。
Win9xを使うか、16bitコンパイラを使うか、Console APIを使って書き換える必要あり。
>>838 レスありがとうございます。
使えないんですか・・・
そしたら32bitコンパイラでは、
カーソルの位置を指定する方法はないのでしょか?
840 :
デフォルトの名無しさん :02/09/28 19:17
標準ライブラリの strstr の実装例のソースってどこかに落ちてませんか?
#include <stdio.h> #include <string.h> int main(){ char *str1 = "Borland International", *str2 = "atio", *ptr; ptr = strstr(str1, str2); printf("The substring is %s\n", ptr); return 0; } //これで充分か?
838じゃないんだけど
>>839 > Console APIを使って書き換える必要あり
読めないのですか?
>>841 いや、strstr の使い方じゃなくて、strstr のソースが欲しいのです。
libcのソースってどこにあるんすか?
リロードはきちんとしましょう。
strstr.c でググれ。
849 :
デフォルトの名無しさん :02/09/28 19:29
オリバーのソースってどこにあるんすか?
strstrの中でstrncmpを使うのは反則? strncmpを使うとすっきりとかけるんだけど。
>>842 意味がつかめなかったので、読み流してました。
やり方わからないですが、試してみます。
ありがとうございました。
852 :
デフォルトの名無しさん :02/09/28 20:00
\x1b[1;31m←これで赤字で出力されます どなたか解説お願いします
>>852 エスケープシーケンスについて調べてみれ
>>853 感謝感謝!!
エスケープシーケンスって言葉で検索するだけで情報がいっぱい得られました
ありがとうございました
質問ですが、 Cを大体マスターしたのですが、あまりにも生産性が低いため次の言語へ いきたいと思います。 C#なんかよさそうだと思ったのですが、C++を1秒もやらずにC#を習得することは 現実的でしょうか。 C#はC++を改良したものだそうなので、どうしてもC++をやるのが無駄に見えてしまうのですが、 C++をやっておいたほうがよいのでしょうか。それとも、まったくの無駄足になるのでしょうか。
>>855 C# と C++ は別物。つか、なんでそんな事いちいち人に訊くわけ?
10個の数を入力して 順位を求めるプログラム作ってくださいな #include <stdio.h> main() { int dd[10],jun[10]; int jj,kk; for(jj=0;jj<10;++jj) jun[jj]=1; printf("10個の数字を入力\n"); for(jj=0;jj<10;++jj) scanf("%d",&dd[jj]); for(jj=0;jj<10;++jj){ for(kk=0;kk<10;++kk){ if(dd[jj]<dd[kk]) jun[jj]=jun[kk]; } } for(jj=0;jj<10;++jj) printf("%4d",dd[jj]); printf("\n"); for(jj=0;jj<10;++jj) printf("%4d",jun[jj]); return 0; } こんな感じで
並び替えなくても良いのか?
>>857 >if(dd[jj]<dd[kk])
>jun[jj]=jun[kk];
if(dd[jj]<dd[kk])
jun[jj]++;
にしてみれば?
それで出来るでしょう。
>>857 =806
宿題代行してもらいたいならインデントくらいきちんとしろ。
読みづらいので放置。
並び替えのプログラムと順位求めるプログラムって 考え方違う?よくわからんのだけど
>>863 順位だと、タイ(同着)があるからちょっぴりだけロジック増える とか
>>861 どういうことかはわからないけどできたよ
ありがとう
>>864 ロジック?聞いたことないw
100回も比較する必要はないと思うのだが。 for(jj=0;jj<9;++jj) for(kk=jj+1;kk<10;++kk) if(dd[jj]>dd[kk]) jun[jj]++; else if(dd[jj]<dd[kk]) jun[kk]++;
>>865 ほら、順位もついでに表示させたいとか、とういいうことdhじゃろp
あ、インクリメントする添字が逆になってるわ。 if(dd[jj]>dd[kk]) jun[kk]++; else if(dd[jj]<dd[kk]) jun[jj]++;
このプログラムの意味がわからない 特にインクリメントのところが
>>864 そんなロジックいらないでしょ。結果的に。
つかqsort()使えよ。
教師の出題意図を出し抜くくらいでないと大物になれないぞ。
クイックソートって難しそう・・
>>865 > どういうことかはわからないけどできたよ
できたのか ? じゃいいな。とりあえず qsort 使う版作ったけど、必要ないってことで...。
873 :
デフォルトの名無しさん :02/09/29 00:24
=と++じゃ++の方が演算子の順位が高いのに、どうして a = b++;は a = b; b = b + 1; になるんですか?
ネタデスカ?
a=b++;とa=++b;の違いを考えて下さい
あれだ、マジレスすると「ツレター!!!」とか言って大喜びする手合いだ。
877 :
デフォルトの名無しさん :02/09/29 00:33
>>873 コンパイラのバグですね。何を使っているんですか?
879 :
デフォルトの名無しさん :02/09/29 00:34
o= --o - o--;
882 :
デフォルトの名無しさん :02/09/29 00:46
たいよう と 太陽 そら と 空 などの文字列を比較したときに同じ意味だと判定するロジック、ライブラリ、サンプルソースなどはありませんか? あったら教えてください.
883 :
デフォルトの名無しさん :02/09/29 00:58
マジなのに・・・
884 :
デフォルトの名無しさん :02/09/29 00:58
↑873です
886 :
デフォルトの名無しさん :02/09/29 01:12
>>883 コンパイラのバグだっていってるだろ。
マジなのに・・・
>>882 ほら...
#include <stdio.h>
#include <string.h>
struct Dictionary_t{
char *Text;
char *Reading;
} Dictionary[] = {
{"空", "そら"}, {"太陽", "たいよう"}
};
int main(int argc, char* argv[])
{
struct Dictionary_t *p;
if(argc != 3){
printf("Usage: %s word1 word2\n", argv[0]);
return 2;
}
for(p = Dictionary; p < &Dictionary[sizeof Dictionary / sizeof Dictionary[0]]; p++){
if((strcmp(argv[1], p->Text) == 0 && strcmp(argv[2], p->Reading) == 0) ||
(strcmp(argv[2], p->Text) == 0 && strcmp(argv[1], p->Reading) == 0)){
printf("%s と %s は同じだよ。", argv[1], argv[2]);
return 0;
}
}
printf("%s と %s は違うよ。", argv[1], argv[2]);
return 1;
}
後は、辞書をひたすら入力しろ。
VC++6.0は,遅くていらいらしてきたんですが, win98で他に使えるコンパイラってありますか? 動作がなるべく軽いものがいいんですが。
889 :
デフォルトの名無しさん :02/09/29 01:20
コンパイラのバグじゃないってば。 b = a++; と b = ++a; の違いも知ってる。 ただ、本みたら= より ++の演算子の方が順位高かったから あれ?なんでだろ?って疑問に思っただけ。 やっぱそういう仕様だからなのかな。
>>873 マジレスだけど、演算子の優先順位と、
b++ が加算前の値を返すこととは別の話。
まずは優先順位の意味について調べてみた方がいいと思う。
891 :
デフォルトの名無しさん :02/09/29 01:25
では,皆さんは何を使っていますか? おすすめは?
VC++
896 :
デフォルトの名無しさん :02/09/29 01:36
VC++ gcc
秋月のオマケ
gccって英語みたいなんですけど,大丈夫ですかね? DirectX使えますか?
>>889 > ただ、本みたら= より ++の演算子の方が順位高かったから
= より ++の方が優先順位が高いというのは、たとえば
b = a++; という式なら、
b = (a++); と等価であって、
(b = a)++; ではないということ。
(後者は実際には文法エラーだけどね)
要するに式内の各演算子の結び付く強さという感じ。
901 :
デフォルトの名無しさん :02/09/29 01:54
>>893 こういうこというやつって友達いねぇんだろうな・・・・
>
>>888 VCのコマンドラインコンパイラとか。
903 :
デフォルトの名無しさん :02/09/29 02:01
++ のような単項演算子では優先順位云々とかないだろう。 右から左に解釈されるだけでは?
>>898 gcc は日本語化するとエラーメッセージがわけ分からなくなるので
英語のまま使え。
コンパイラなりの返すエラーメッセージとかってそんなに難しいか?
先にするのは構文解析だっけ?
906=903だと信じたい。
>>910 いや、孤独な俺と友達になってもらえるかと。
>>911 成人式までに職を見つけなければ,友を失う事になるでしょう
来年で良ければ
構造体の全部のメンバの初期化って, memset( &Kouzoutai ,0 ,sizeof( DOUZO ) * DOUZO_MAX ); とかでいいんでしょうか? それとも構造体のメンバ1個1個初期化していくんでしょうか?
構造体の配列の話? それとも memset(&Kouzoutai ,0 ,sizeof(Kouzoutai)); の書き間違い?
あ,ミスりました 構造体のメンバが配列で, 構造体は,ひとつです
NULLポインタの実際の(実装上の)値がゼロ以外の処理系 があったとすれば、 構造体のメンバにポインタが含まれている場合に memsetではNULLが入らないね。 それ以外だったらmemsetでいいんじゃない? または、変数を定義する時に struct hoge Kouzoutai ={0,}; という感じで初期化してもいい。
>>913 メンバーにひとつひとつ値を入れていった方がよいぞ。
doubleの場合、すべてのビットが0が0.0と同じになるとはかぎらないらしいし。
double型とポインタ型とかくせのあるものは,今回は使わないので,memsetを使うことにします
>>916 >>917 あとあと知っておいて役に立つ事なので,ありがとうです
>>913 どうしてもメンバごとの代入がいやなら、
初期状態の構造体をひとつ作っておいて、丸ごと代入。
(初期化したい構造体) = (初期状態の構造体);
>>919 なるほど。
ANSIできちんと保証されているしな。
姫宮ANSI
>>919 画期的
盲点をつかれました
これで,明日はドライブシュートが打てそうな気がします
923 :
デフォルトの名無しさん :02/09/29 02:58
Sleep関数の引数って定数でないとダメなの? つまり、Sleep(1000+x);ってのはダメ?xに数字を代入して。
つーことは, void a() { KOU Kou; Kouzou=Kou; //memcpyの方がいいか? } ではだめで,外部変数で用意しなきゃだめってことですよね? それかa関数の中にstaticで用意するか
>>923 なんかサイレントヒルの裏世界に迷い込むぐらいの疲労を覚えたよ。
>>889 > b = a++; と b = ++a; の違いも知ってる。
> ただ、本みたら= より ++の演算子の方が順位高かったから
> あれ?なんでだろ?って疑問に思っただけ。
> やっぱそういう仕様だからなのかな。
ちょっとマジレス。
a++ は、(temp = a, a = a+1, temp) と言う形に展開される。
だから、b = a++; は、
(1) temp = a;
(2) a = a + 1;
(3) b = temp;
となる。ただし、(1) → (2), (1) → (3) の順序は、保証されてるけど、(2) と (3) の順序は保証されていない。((1) → (3) → (2) もありえるし、システムによっては (2) と (3) が同時に実行されるかもしれない。)
だから、a = a++; は、結果が保証されない。
923や929見て思ったんだけど、ここってそういうスレなの?
mov ax,a inc ax mov b,ax
>>924 そんな面倒なことしないでも定義時に初期化すればいいじゃん。
それとも一旦何かに使った構造体を再初期化したいの?
>>934 1回構造体のメンバに例えばカウントを取る変数とかがあって,毎回0に初期化しないといけないんです
あとは,毎回座標を入れていったり
>>936 意味がわからん。
スコープ内で同じ構造体を二回以上初期化する必要があるということ?
もしそうならいいんだけど。
c=10; c%50 は,0.5とかになるはずなんですが,なぜに10が返ってきますか?
>>939 > c=10;
> c%50
> は,0.5とかになるはず
なんて知識をどっから仕入れた ?
どーいう演算をしたら10と50から0.5がでてくるんだろう?
加算とインクリメントの区別ができない人間の集まるスレ。
>>937 結論以外全部ってのはダメかな。
主に↓の辺り。
> a++ は、(temp = a, a = a+1, temp) と言う形に展開される。
>>929 は(2)と(3)が入れ替わってもbには加算される前のaが代入されるという罠
>>944 順序が入れ替わるかもしれないと本人も書いてるじゃん。
a++;ってその戻り値(?)を受け取らなければ最適化で++a;と同じコードが吐き出されることが多い?
>>946 a++ も ++a も a+=1 も a = a+1 も (temp=a,a=a+1,temp) も同じと思われ
だから
>>929 の論理だと、入れ替わってもbの値は変わらないんだって
>>947 さんきゅ。
じゃあ今までどおりforの中などではa++を使うわ。++aってなんか格好悪くて嫌い。
>>950 いや、俺もまちがってたw
>>929 の最後は"a=a++"の結果は保証されないって書いてあるので
953 :
デフォルトの名無しさん :02/09/29 04:02
新スレたてるよ。
一年間に40スレ消費される勢いですね
>>958 あ、どうもすみません。よろしくお願いします。
さっきブックマークを整理していたら、 偶然SHOW-Aのライブカメラのページが出てきた。 彼は変わりないようで、ちょっとさびしくマターリ
>>961 どうもおつかれです。過去ログは追加しました。
>>948 > だから
>>929 の論理だと、入れ替わってもbの値は変わらないんだって
お前、アホだろ。
b = a++; は、入れ替わろうが変わんないのは当たり前。
入れ替わって困るのは、a = a++; の時。(と書いてあるだろ。)
で、
>>929 のどこがでまかせなんだ ?
評価の順序とかの話ではなく、 単にa=a++の結果は未定義なのでは? aがどんな値でもa=a++を実行すると100になるような処理系 もつくることは可能で、当然それはANSIに準拠している。 (そんなことする奴はいないだろうが・・・)
>>964 > 後で訂正してるYO!
ん ? どこで訂正してんのかよくわからんけど、
>>929 は、正しいと言うことでいいのか ?
負け犬が遠吠えしているスレはここでつか?
968 :
デフォルトの名無しさん :02/09/29 05:37
こういう議論をみるたびに思うんだよな。 おまえら、本当にCが好きだな。と。
( ´,_ゝ`) プッ 今頃。
粘着厨ウザイ
,. ''"´ ` ` 、 ;' ':.. ;' === ==== / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ./ ● ● < ウタちゃんですが、何か? ./ ⌒ ▼⌒': \________ __ ./ 彡 ∵人∵ノミ___  ̄ ./ _ ミ ノ"ミ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄━━ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄━━━ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
結論:まあ、厨はインクリメント/デクリメント演算子は使うなってこった。
box[50][60]; char (*lpbox)[60]; lpbox=&box[60]; これでやると,おかしくなるんですが,どう直せばいいんでしょうか? lpbox=&box[50]; でもおかしかったです
976 :
デフォルトの名無しさん :02/09/29 07:18
lpbox=box; こうだろ?
>>975 新スレの方で質問した方がいいよ。
このスレには粘着厨と煽りしか残ってないもよう。
>>975 &box[60]はboxの60番目の要素(先頭を0番目とする)のアドレスだぜ。つまりbox+60。
>>975 は質問する以前のレベル。
最初からポインタと配列を勉強しなおせ。
やっとうまくいきました ありがとう
1000!
うめうめ。
ume
書けませんよ。。。( ̄ー ̄)ニヤリッ
書けませすよ。。。( ̄ー ̄)ニヤリッ
うめやふやせや
987
書けるかもねぇ。。。( ̄ー ̄)ニヤリッ
ダレモイナイ…
(~_~)
久しぶりに1000げっちゅ
え〜んやこ〜ら
NULL
1000ぽ
さてと。
∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´∀`)/ < 先生!横から1000取ってもいいですか? __ / / \___________ \⊂ノ ̄ ̄ ̄\ ||ヽ|| ̄ ̄ ̄ ̄ ̄|| ...|| ̄ ̄ ̄ ̄ ̄||
1000げっちゅ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。