2 :
デフォルトの名無しさん :02/06/02 22:34
3 :
デフォルトの名無しさん :02/06/02 22:34
4 :
デフォルトの名無しさん :02/06/02 22:34
1コンピュータの操作法 2Cの文法の基礎知識 3簡単な各種アルゴリズム 4デバッグ手法(スナップショット、デバッガの使い方) 5さまざまなトラブルの対処法(文法ミス、アルゴリズムのミス、勘違い) 6大きなプログラムの作成法(モジュール化) 7アルゴリズムの最適化 8システム分析法 9データ構造論 10さまざまなトラブルの対処法(メモリの管理(ポインタ)、環境の違い、境界条件) 11オペレーティングシステムの違い(移植性)
for(i=0;i<n;i++) for(j=0;j=m;j++) で,nとmが20の時は,400回ですが nとmが35の時は,1225回ループします。 どのくらいの時間差があるのでしょうか? for分の中は,if(Kou1[i] == Kou2[j]) のような感じです
for(i=0;i<n;i++) for(j=0;j<m;j++) で,nとmが20の時は,400回ですが nとmが35の時は,1225回ループします。 どのくらいの時間差があるのでしょうか? for分の中は,if(Kou1[i] == Kou2[j]) のような感じです
実行して計測すれば?
スタンダードだから無理
フリーのコンパイラ使えば?
スタンダードだから無理? 最適化が効かないからって事?
12 :
デフォルトの名無しさん :02/06/02 22:49
実行して計測ってどうやるの?
>>12 わからなきゃストップウォッチでも持って測れ
14 :
デフォルトの名無しさん :02/06/02 22:50
15 :
デフォルトの名無しさん :02/06/02 22:50
18 :
デフォルトの名無しさん :02/06/02 22:52
いぢわる。
鬱だ...
マヂレス そのプログラムを100万回ループした実行時間をストップウォッチで計って100万で割れ
23 :
デフォルトの名無しさん :02/06/02 23:02
まずそれから作れ
>>23 system()で100万回呼び出して、その開始時間と終了時間をclock()で得ればいいだろ。
clockは禁句だったのに…
じゃあgettimeofday
>>27 あれって使っちゃいけない関数だったの?(汗
平気で使っていたんだけど(汗
>>29 clock教えたら面白くないから禁句なんだろ。
31 :
デフォルトの名無しさん :02/06/02 23:15
>>30 そういういぢわるやめてまともにおしえてほすぃ・・・。
32 :
デフォルトの名無しさん :02/06/02 23:19
最適化かけても消えてしまわないビジーループを作るには ちょっとしたコツがいります。
volatile使うか#pragmaすればいいんでないの?
34 :
デフォルトの名無しさん :02/06/02 23:21
>33 volatileが一番楽。pragmaは素人にはおししめできない
K&RのANSI対応版見たんだけど、 signedだと保証されてるのは整数型の中ではint型だけみたい。
>>35 整数型はintとcharだけでしょ?
longやshortはそれぞれlong int,short intという意味だし。
37 :
デフォルトの名無しさん :02/06/02 23:28
strの中身の文字列で、スペース10個目より後ろの値を得たいので (下記プログラムだと「ab0523092616p」の部分)、以下のプログラムを 書いてみましたが、states_mesに上手く格納できません。 どうもstrcatの2番目の引数がよろしくないみたいですが・・・ perlの経験は有りますが、変数の型に甘い言語に慣れてしまっていまして 対処方法がいまいちわかりません。 最終的にstates_mes内に「ab0523092616p」を格納出来るようにするには どうしたらよろしいでしょうか? #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LENGTH 1024 main(){ char str[MAX_LENGTH] = "d k 1022174 10311 102590 759 uuune rejp 27354 1010 ab0523092616p"; int i; int spc_check = 0; char states_mes[MAX_LENGTH]; for(i=0;i<MAX_LENGTH;i++){ if(spc_check==10){ if(str[i]==NULL){ break; }else{ strcat(states_mes , str[i]); } }else{ if(str[i]==' '){ spc_check++; } } } printf("%s\n",states_mes); }
恐怖! (char)255 って -1 になるのは負の表現が2の補数なCPUだけじゃん かと思いきや・・・
39 :
デフォルトの名無しさん :02/06/02 23:30
for ( here ; i<=10 ; i++){ ↑のhereの場所に i=1とかだけじゃなくて x=d , i=1 とかなんか別の式を一緒に書いてあることあるけど x=d はforループにはいる前、例えばその上とかに 書いた場合と違いはあるんですか?
>>38 思わせぶりしないで続きを書いてYO(´д`;
>>39 ない。なんつーか、コード上の表現として
「このループの先頭であーして欲しいこーして欲しい」
というのをすっげー強調したいときに使うやり方。
言葉の通じない外人といっしょのチームになったとき
コードだけで会話してたの・・・。
43 :
デフォルトの名無しさん :02/06/02 23:37
for(space = 10, i = 0;str[i] && (str[i] == ' '?--space:1);i++); strcpy(buffer, str+i+1); スペースが10個入ってることが確実ならこれでどーよ!(´д`;)
46 :
デフォルトの名無しさん :02/06/02 23:48
>>37 strcatはポインタを求める気がする。
頭に&をかぶれ。
47 :
デフォルトの名無しさん :02/06/02 23:50
strcat(states_mes , &str[i]);
47 ケコーン。この場合は違うか・・・ 45は39への絡みもあるのか。トリツキな感じだ。
みなさんありがとうございます。 無事思い通りのことができました。 拙い説明の仕方で済みませんでした。 C言語の勉強、もっと精進いたします。
struct{ int num[200]; POINT Pos[200]; }KOU; KOU Kou; と struct{ int num; POINT pos; }KOU; KOU Kou[200]; どっちがいいですか?
用途による。
#define 50 (´д`)
>>50 それ通らないでしょ?それともC++ですか?
>>50 書くとしたら typedef を struct の前につけれ。紛らわしくていかん。
#define _50 (´д`)
そんな明日もありません
そんな今日も
もっこりますか?
このスレ何日で消費する?
63 :
デフォルトの名無しさん :02/06/03 01:11
@ 一週間 A 3日 B 6日 C 日下部陽ちゃん♥
Cに√2票
せっかくだから、本日8:00までに使い切らないか?
66 :
デフォルトの名無しさん :02/06/03 02:05
基本的な質問していい? ++i と i++ってどう違うんだっけ?
>>66 実行してみそ。
int i = 0, j;
j = i++;
int i = 0, j;
j = ++i;
のそれぞれの j の値を見れば意味がわかる。
68 :
デフォルトの名無しさん :02/06/03 02:17
>>67 0と1になったよ
なんでか全然わからん・・
>>68 その結果見てもわからんか・・・・
++iは、iを先にインクリメントしてからの値を返す。
i++は、iの値を先に評価してから返し、その後インクリメントする。
i++はインクリメントを行う前のiの値(左辺値になれない)を返す。 ++iはインクリメント後のi(左辺値になれる)を返す。
>>69-70 副作用と式の値の区別がつかないといくら説明しても無駄。
>>70 いいこと聞いた。
++i = 0; とかできるんだね。あまり意味ないけど。
>>68 j=++i;
これは
i=i+1;
j=i;
と同じ。
j=i++;
これは
j=i;
i=i+1;
と同じ。
厳密に言うと少し違うんだが。
>>All 非常によくわかった。 さんきゅ〜
>>76 ん?悪名高いVC++6.0Proだと通らなかったぞ。
int main() { int i=44; ++i=0; return 0; } cl test.c test.c test.c(4) : error C2106: '=' : 左のオペランドが、左辺値になっていません。 VC++6.0Proでこう出た。
>>79 こちらでは、gcc3.1でコンパイルしてみたら通った。
LSI-C86試食版では「左辺値が必要」と出た。
処理系依存なのだろうか?
うちのBCCは通らない
>>81 変ですね。なぜ同じBCCなのに結果が違うのか。
ちなみにTurbo Debuggerで中身を見てみたら、ご丁寧にも
一度incrementしてから0を転送していたよ。
++ と = の優先順位の差異かと思ったけど これって環境依存関係なく規定されてたよな? あれか? 例によって未定義とかそーゆーの?
>>82 CPPファイルをコンパイルしていないだろうか。(CPPは通る)
そーゆーのだ。 そもそも++した時点でその式は左辺値ではなくなる。 左辺値でないものに代入はできない。 できたとしたら、コンパイラのバグか、規格外の拡張機能だ。
86 :
デフォルトの名無しさん :02/06/03 03:00
>>84 拡張子を.cppにして、C++のソースファイルとしてコンパイルしたらVC++6.0でも通った。
>>83 私にはわからないです。専門家の登場を待つとしますか。
Cは駄目、C++ならOKか。
>>84 その通りです。CPPをコンパイルしていました。
>>88 そうなんでしょうか?もう一度C++第3版を穴が開くほど
読み直してみるとします。
うぉ C++としてコンパイルすると確かに通る。
Cの場合は
>>85 のとおり、値に値を代入する形になるのでエラーになるが・・・
またまた質問です。 配列で a[i] と b[j][k] を作ったのですが その時、a を渡すと a[0] のポインタとして処理しますが b を渡すとポインタとして認識せず、*b で渡さないとダメなようです。 なぜなんですか? どこか間違っていますか?
92 :
デフォルトの名無しさん :02/06/03 03:33
C++ の場合、++i は i=i+1 と等価らしいね。 よって、 i=i+1=0; よって 0 らしいです。 ちなみに i++=0; はエラーだった。 恐らく i+(+=0); って感じか?・・・ワカラン 適当にコンパイルしてみた結果なので理論とか定義とかは無視してます。 うそついてたらゴメンヨ
>>91 間違っていません。ただし、*bの意味は、pointer to array[k] なので、
(*b)[x]のように使う必要があります。*b[x]やb[x]と書くと、意味が違って
しまうので注意です。
bが1増えると、b[j][k]のjが1増えたのと同じ意味になります。
>>91 もちろん、b[j][k]のような書き方もOKです。このb[j]の部分が*bに
化けていると思っていただいて差し支えありません。
>>92 C++は演算子の多重定義機能があるので、Cとは演算子の解釈の
仕方が異なるのでしょうね。
>>93 レスありがとう。
なんか凄く重要そうなこと言ってる気がするけど
よくわかりません。
a ではそのままポインタをさすのにbではなぜささないのでしょうか?
あと(*b)[x]とかの意味が全然わからないっす。。
>>93 *b[x]やb[x] はどう違うのですか?
98 :
デフォルトの名無しさん :02/06/03 04:01
>91 a[i] の a は &a == &a[0] だし b[j][k] の b は &b == &b[0] == &b[0][0] だよ。 で、だ。 *a == a[0] だけど、 *b == b[0] であって、 *b != b[0][0] だよもん。 ここを乗り越えればポインタ博士へ一歩前進だ。がんがれ
>>94 じっくり考えたらなんとなくわかってきました。
a[i]というのはaがポインタでa[0]のアドレスを指し、
例えばa[2]とかがa[0]の場所から2つめの場所にある値ってことですか?
>>98 a[i]と宣言した場合
a==&a[0]ではないのですか?
すいません。今日からはじめてC言語を勉強し始めたので。
一日ずっとやってこのざまです。
>>97 >>98 Cではポインタは基本的に一次元配列しか指すことができません。
だから、bは array[k]という一次元配列を指すようにしているわけです。
(*b)[x]は、b[0][x]と同じ意味です。(b[0])[x]と考えて下さい。
*b[x]は、*(b[x])となってしまうので、b[x][0]と等価になってしまいます。
b[x]は、同じ理由から、b[x][0]へのポインタとなります。
>>100 そうですね。a == &a[0]です。&a != &a[0]です。
bをインクリメントすると、sizeof b[k] だけ増えます。 もしc[i][j][k]という配列があったとして、cをインクリメントすると、 sizeof c[j][k] だけ増えます。 ここで誤解のないように書いておきますが、cは定数ですので、 直接インクリメントできないので、例えば int c[1][2][3], (*d)[2][3]; のように定義しておき、d = c; とすれば、dをインクリメントしたり デクリメントしたりできます。
>>102 今いろいろためしていたら
&a != &a[0]
となったのですが、これはなぜでしょう??
例題が悪かったのでしょうか?
こうなる場合もあるということでしょうか?
間違えました &a == &a[0] です
申し訳ない。間違いがありました。 sizeof b[k] -> sizeof(type[k]) sizeof c[j][k] -> sizeof(type[j][k])
ええと、&a == &a[0] となるのは、値が同じになるということですが、 Cの文法上から言えば、意味が違います。 aはaddress of array[0]で、a[0]はvalue of array[0]です。偶然に 値が同じになることがあるかもしれませんが、何の意味もありません。 例えば、aが0x1000で、a[0]に0x1000が入っていたら、&a = &a[0] と なることでしょう。これが同じでも意味がないことはわかりますね?
>108 意味は違うが値はいっしょ 値がいっしょになるのは保証されてる
>>108 間違いでした。スマソ。&aと&a[0]の値はいつも同じになりますが、
&aはaddress of array[i]、&a[0]はaddress of typeとなり、意味が
違います。
typeとは、intとかdoubleとか、あるいはstructなどの型のことです。
>>108 は、*aと*a[0]を比較してました。ごめんなさい。
112 :
デフォルトの名無しさん :02/06/03 04:39
\ │ ハァ? .| ./ /(゚Д゚)ハァ? (゚Д゚)ハァ? (゚Д゚)ハァ?/ ___ ___ .\ | |/ /(゚Д゚)ハァ? (゚Д゚)ハァ? (゚Д゚)ハァ?/ / |ハァ?| |ハァ?| \.└――──―──/ /(゚Д゚)ハァ? (゚Д゚)ハァ? (゚Д゚)ハァ?/ /  ̄∩( ゚Д゚ ) 〃 ̄∩( ゚Д゚ )\ ヽ(゚Д゚ )ノ ./ /(゚Д゚)ハァ? (゚Д゚)ハァ? (゚Д゚)ハァ?/ / ヾ. ) ヾ. ) \∧∧∧∧∧/ /(゚Д゚)ハァ? (゚Д゚)ハァ? (゚Д゚)ハァ?/ / | | | │ │ | .< 激 >.| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| / (__)_) (__)_) < ハ し >.| (゚Д゚)ハァ? 最 中 .| ./ ────────────< な ァ く >──────────────── |o ゝ○ノ| ::/^'ヽヽ:::::::< 予 ? > / ○ _ ○\ / .ヽ( )_,,ノ |ゝ○_ノ o|:::::< 感 >( ││ )< / \ ア ? ^'' `‐' ヽ..,,_( )ノ ::l< !! > \ 丿 | / \ ~~ ( / ̄ ̄ヽ -‐‐‐--l-∨∨∨∨∨. /  ̄ ̄ \ \____ ,,,, | |||!|||i|||!| | ~^'‐..,,_/ /. ____.\( ) (:::::}| :| |ll ll !! !.| | ,,,, イ ~''/ Ю)__) \ / . ~~ | :|!! || ll|| !!:| | {:::::) ::l ./ | ゚Д゚.| ハァ? . \ | |(゚Д゚) ハァ? . | | ! | l ~~ l / ^^^^^ \. \ \⊂) `ー--― 'ノ / \. ) ) |
\ │ ハァ? .| ./ /(゚Д゚)ハァ? (゚Д゚)ハァ? (゚Д゚)ハァ?/ ___ ___ .\ | |/ /(゚Д゚)ハァ? (゚Д゚)ハァ? (゚Д゚)ハァ?/ / |ハァ?| |ハァ?| \.└――──―──/ /(゚Д゚)ハァ? (゚Д゚)ハァ? (゚Д゚)ハァ?/ /  ̄∩( ゚Д゚ ) 〃 ̄∩( ゚Д゚ )\ ヽ(゚Д゚ )ノ ./ /(゚Д゚)ハァ? (゚Д゚)ハァ? (゚Д゚)ハァ?/ / ヾ. ) ヾ. ) \∧∧∧∧∧/ /(゚Д゚)ハァ? (゚Д゚)ハァ? (゚Д゚)ハァ?/ / | | | │ │ | .< 激 >.| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| / (__)_) (__)_) < ハ し >.| (゚Д゚)ハァ? 最 中 .| ./ ────────────< な ァ く >──────────────── |o ゝ○ノ| ::/^'ヽヽ:::::::< 予 ? > / ○ _ ○\ / .ヽ( )_,,ノ |ゝ○_ノ o|:::::< 感 >( ││ )< / \ ア ? ^'' `‐' ヽ..,,_( )ノ ::l< !! > \ 丿 | / \ ~~ ( / ̄ ̄ヽ -‐‐‐--l-∨∨∨∨∨. /  ̄ ̄ \ \____ ,,,, | |||!|||i|||!| | ~^'‐..,,_/ /. ____.\( ) (:::::}| :| |ll ll !! !.| | ,,,, イ ~''/ Ю)__) \ / . ~~ | :|!! || ll|| !!:| | {:::::) ::l ./ | ゚Д゚.| ハァ? . \ | |(゚Д゚) ハァ? . | | ! | l ~~ l / ^^^^^ \. \ \⊂) `ー--― 'ノ / \. ) ) |
>>112 そう非難しないでくれよ。2chは間違えに気づいても、削除できない
んだから。
>>108 確かにa[0]を参照するならそのとおりだと思います。
aがaddress of array[0]なら
&aはいったい何を示しているのでしょう?
プログラムでは&aもまたaddress of array[0]となったのですが。。
>>115 Cの文法上、この場合は、ただのaも&aも、同じ意味になります。
aが定数だからです。
>>116 なるほど、わかってきました。
ではb[i][j]の場合はどうなるのですか?
(*b)[x] ←この表記が理解できないです
>>118 配列演算子はすべて優先順位が等しいので、左から右に解釈されます。
つまり、b[i][j]は、(b[i])[j]と同じです。
b[0]と*bは等しいので、b[0][j] == (*b)[j]となります。
*b[j]と書いたら、*(b[j])となり、b[j][0]になってしまいます。
これは、*演算子が[]演算子より優先順位が低いためです。
>>119 なるほど。非常に良く分かりました。
これを踏まえて今までのログをもう一度読んで見ます
>>120 途中間違いがあって非常にすみませんでした。もう少しよく考えて
書けばよかったのですが、チャット形式になると、どうしても間違い
が顔を覗かせます。
ちなみに、int **a; なんて形式もすぐに出てきますので、わからな
くなったらまた書き込みしてみて下さい。誰かが答えてくれるはず
です(他力本願)。
>>121 とんでもないです。
いろいろ教えてくださってありがとうございました。
おかげでかなり理解できました。
123 :
デフォルトの名無しさん :02/06/03 12:45
>わからなくなったらまた書き込みしてみて下さい。誰かが答えてくれるはず >です(他力本願)。 余計な事書くなって・・・
124 :
デフォルトの名無しさん :02/06/03 13:13
∧ ∧ カタ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ (,,゚Д゚),____カタ__< みなさんさようなら…と、 / つ._.|| ̄ ̄ ̄ ̄ ̄ ̄| \__________ (, |\.|| Upple iBook | \,,|============|
125 :
デフォルトの名無しさん :02/06/03 14:47
読み込むファイルをランダムに変更したいのですが どのようにすればいいのでしょうか? fopen()は文字列しか引数として受け取ってくれないと聞きました。 fopen(rand()%X,"r"); ということは出来ないのでしょうか?
文字列に変更すれば良いじゃん
>>125 *Filename[]={"file1.aaa","file2.aaa"};
みたいにファイル名のリストつくっといて、
fopen(Filename[rand()%X],"r");
、とか
128 :
デフォルトの名無しさん :02/06/03 15:01
確かに b[i][j]と宣言して b==b[0]==*b となって b[0][0]==(*b)[0] となるのに 式を見ればあたりまえだが b[0] != b[0][0] となるのはなぜなんだろう?
>>125 char buf[128];
sprintf(buf, "%d", rand() % X);
fopen(buf, "r");
>>128 b[0]はポインタ(b[0][0]のアドレス)。b[0][0]は値。
b[0] == &b[0][0]
132 :
デフォルトの名無しさん :02/06/03 15:06
>>130 そうだけどさ
b==b[0] となってるから両辺の右側に
[0]をつけるとおかしくなるって変じゃない?
b が値を持つことが変だと思うんだけど
ありがとうございました。 無事、解決しました。
134 :
デフォルトの名無しさん :02/06/03 15:13
for文で ++i とする場合は どんな用途で使われるのですか?
135 :
デフォルトの名無しさん :02/06/03 15:21
printfのfって何の意味ですか?? ファイルとかフィールドとか?
137 :
デフォルトの名無しさん :02/06/03 15:29
好きなMusicianは誰ですか?
加藤茶
140 :
デフォルトの名無しさん :02/06/03 16:03
>>139 >あんたの頭がおかしいだけ。
一言多いアフォだな
>>140 まぁ、値を持たない変数とか言ってる時点である程度の寝たレスは覚悟した方がいいと思われ。
142 :
デフォルトの名無しさん :02/06/03 16:07
ある値を持つb 自体はどういう意味があるの?
>>131 は理解できるけど
143 :
デフォルトの名無しさん :02/06/03 16:10
>>141 int i;
printf("%d ",i);
するとなんか大きい数が表示されるけど
これはなんか意味あるの?
とりあえずはiを格納するメモリ領域が
決まって、iに値を入れる前はその領域に
以前に書かれたデータがそのまま表示されてるだけだと思うけど
>>143 それとあれとの関係は?
わからなかったっす。
146 :
デフォルトの名無しさん :02/06/03 16:14
141==144==145 ( ´,_ゝ`) プッ
150 :
馬鹿☆栗子 :02/06/03 20:28
void mul(const int ma[2][3],const int mb[3][2],int mc[2][2]) っていう mc=ma+mbのような配列を作りたいんですけど だれか 教えて
意味側下欄
>配列を作りたいんですけど int ma[2][3]={ {0,1,2}, {3,4,5} }; int mb[3][2] = { {0,1}, {2,3}, {4,5} }; int mc [2][2]; mul( ma, mb, mc);
char *a[]とはどういうこととなのか教えていただきたいですわ。
>>154 char型へのポインタの配列a。
もう逝ってよし!
char *とintを引数に取りchar *を返す関数へのポインタを返す関数funcのプロトタイプを書け。(15点)
char* iya_n(char *cp, int *ip);
Σ(゚Д゚;)しまった罠か
>>156 char *(*func())(char *, int);
char (*)(char *,int) これを返す関数か・・・わからん
>>161 それだとfuncの引数がchar *とintにならない?
とすると、char *(*func(char *, int))(void);
こうなるんだろうか。
>>163 それだとfuncの引数がchar *, intになってしまうよ。
typedef char* iya_n(char *cp, int *ip); iya_n func( ... );
>>163 はchar *型を返す関数へのポインタを返す、char *, intを引数に取る関数func。
iya_n *func( ... ); ダナ
そうなのか・・・
じゃあfuncがintを引数に取るとすると、
>>161 はどんな感じになるの?
>>169 char *(*func(int))(char *, int);
>>169 char *(*func(int))(char *, int);
配列を宣言する時 n=5; a[n]としたいんですがどうすればいいでしょう?? defineはなしで。 nが変数なので
>>173 C99対応コンパイラでそのままコンパイルできる。
175 :
デフォルトの名無しさん :02/06/03 21:59
>>173 できません。
C99ではできるらしいけど。
179 :
こまった君 :02/06/03 22:10
double **ps; double ps_dammy[30]; for(i = 0; i<30; i++ ) { 〜〜〜中略〜〜〜 ps_dammy[ i ] = psbuff; } ps = &ps_dammy[0] for (j=0; j<20; j++){ printf (" ps[ %d ] = %f \n ", j , ps[j]); } これで、0ばかり表示されます。うまくはいっていないようです。 ちなみに中略の部分の問題ではないです。(∵一次元の配列ポインタならうまくいくので。。) 僕的には、 ps = &ps_dammy[0]; とすると、下記の二次元配列の■の部分に格納されると、認識しているのですが、違うのでしょうか? j→ ■■■■‥■■ i : ↓□□□□‥□□ □□□□‥□□ 要は、上記のような■の行にps_dammy[30]という配列を入れたいんですが。。 -------------------------------- または下記のような列にいれたい。。。けど、 下記のような列だと、メモリ内のアドレスは、とびとびですよね? j→ ■□□□‥□□ i : ↓■□□□‥□□ ■□□□‥□□
さてここで問題
そんな困惑中の
>>173 さんが次にとる方法は?
A #defineを使う B malloc/free
C Cがイヤになって逃亡 D
>>174 と
>>175 の仲人をつとめる
181 :
こまった君 :02/06/03 22:13
182 :
デフォルトの名無しさん :02/06/03 22:15
C でファイナルロリータ
俺はロリコン
psは二次元配列とちゃいまっせ。
int float_to_int_cast(float n) { const int bias = 1258291200; n += *(float*)&bias; return *(int*)&n - bias; } float>intへのキャストに上の関数を使うと良いらしいんですが、 負数の時におかしい値が返ってきます。 負数に対応してないならunsignedにすると思うのですが、 そうなっていないので、コードのバグでしょうか?
>>179 何をしたいのかよくわからんが、
double *pp[30];
for (j = 0; j < 30; j++) pp[j] = &ps_dammy[j];
ps = pp;
で、ps[j][0] としてアクセスすれば目的は達成される。
>>186 ダメダメ。アドレスをキャストしても、肝心の値のキャストがされていない。
>>186 おいおい、なんでそんなtrick code使うんだね?
ってのはともかく。
biasの値の意味を正確に説明してみ? それができたら答えも分かるっしょ。
>>186 IEEEの定義を読まないと答えられない問題だわね。
bias の値は ((23 + 127) << 23) らしいっす。 んでもって、何かの本に書いてある高速キャストのテクニックだとか。
>>187 レスどもです。
アドレスをキャストして、int値を(int値のメモリイメージのまま)floatとして使うらしいです。
>>191 その23, 127, 23はどこからきているのか、だよ。
>>193 IEEE754の定義によると、floatは、
・符号1ビット
・指数部8ビット
・仮数部23ビット
で出来ている。
正規化バイアスは0x7f(127)である。
>>194 正規化バイアスは、指数部の正規化のためのものです。
>>193 わかんないです。
分かれば自分で結論が出せるんでしょうが…
負数に対応していそうなんだけど、実際どうなんだろう?
って事です。
ソースコピペで自前のライブラリに組み込む時に、
unsignedに直すべきか否かで迷っていたりするので。
>>196 たとえunsignedにしても、nが負だったときにはやっぱりおかしくなるっしょ。意味ない。
>>196 先頭の1ビットを見て、0と1の時で処理を分けたら?
>>197 それでも、戻り値がunsignedだったら負数には対応してない
という主張が多少でも読みとれるんじゃないかと。
>>198 それじゃ高速変換の意味が無いと思います
そこまでするならFLD、FISTを使ったほうがいい
この場合、単なるキャストのほうがマシでない?
fld/fistpを使った方が微妙に遅かったけど、負数も正確にキャストでけた。
1000万回のキャストループで
>>186 85ms
fld&fistp 123ms
(int) 931ms
となった
>>203 (int)を使うと、FLDCW命令が生成されるので、ストールが発生して
遅くなるんだろうね。
205 :
こまった君 :02/06/04 00:29
>>187 ということは、
>>179 のようなとき、次の認識はあっていますよね?
ps = &ps_dammy[0];
とすると、下記の二次元配列の■の部分に格納されると、認識しているのですが、違うのでしょうか?
j→
■■■■‥■■
i :
↓□□□□‥□□
□□□□‥□□
>>188 すでにある人の作った会席プログラムをいじって改造したいんですが,内部はいじれないので、
ps[i][j]という二次元配列になんとか格納して、送り出そうとしてるわけです。
ただ、今あるps_dammy[30]という配列を
ps2[i][0]に入れなければならないので、それには、
for文などで、一個一個いれなければならないのかな..と思って質問した次第です。
>>205 それだったら、
double **ps;
とせずに、
double (*ps)[30];
として、ps = ps_dammy; とすればよろしい。
ps[0][0]〜ps[0][29]まで使える。
double **psでどうしても使いたいなら、もう一つポインタ変数を用意して、
double *ps2 = ps_dammy;
ps = &ps2;
として使えばよいが、メモリを二回参照しなければならないので、遅くなり
非効率的。
207 :
こまった君 :02/06/04 00:44
>>206 さっそくのレス感謝いたします。
*psに添え字をつけるのは思いつきませんでした。。
ps[0][ i ]
ではなくて、
ps[ i ][0]のように簡単に入れるほうほうはありませんか?
ps[0][0]〜ps[29][0]のように使用したいのです。
つまり、下記のようにです。こんなのどっちでもいいと思われるかもしれませんが、入れる解析プログラムのほうが複雑なので、いじれないので、解析プログラムが必要なように用意してやらなけりゃいけないのです。
j→
■□□□‥□□
i :
↓■□□□‥□□
■□□□‥□□
これを**psで宣言すると、
■の部分は、メモリ内のアドレスがとびとびになりますよね?
ps = ps_dammy;
とすると、下記のようにはいっちゃいますよね?
j→
■■■■‥■■
i :
↓□□□□‥□□
□□□□‥□□
>>207 問題の要点がよくわかった。
そしたら、
double (*ps)[1]; として、
double (*ps)[1] = (double (*)[1])ps_dammy; とすれば、
ps[0][0]〜ps[29][0]まで使える。
>>207 ただし、ps[i][1]〜ps[i][29]までは使えない。
もしワークエリアとして上の変数を使いたいなら、やはりループで
代入するしかない。
210 :
こまった君 :02/06/04 01:07
>>208 ありがとうございます。
..二行目がよくわかりませんが、
代入の仕方をキャストして代入してるってとこでしょうか.
この方法について、まずは調べて見ます。
ありがとうございました。これでやってみます!
>>209 の意味は、ようするに、
こんどはps[0][〜]のほうがいっきに代入したりできなくなる。
諸刃の・・ってことで合ってますよね?
つまり、ps[0][〜]のほうに入れたければ、ループで入れろと。
ま、こちらのほうは、5列くらいしかないものですので、ループで回すなりなんなりします。
>>210 >>208 は、違う表現のポインタに変換するためにキャストは必須です。
ないと、エラーが出ます。
>>209 については、その認識であってます。無理矢理列が1の二次元
配列として認識させているためにこのようなことが起こります。
>>210 >>209 の意味は、ps[i][1]〜ps[i][29]は、ps[1][0]〜ps[29][0]と重なって
しまうという意味です。だから、ループで代入するには、
>>208 のような
方法は使えないということです。
213 :
こまった君 :02/06/04 01:31
>>212 アドレス上重なるということを理解するのが非常に難しいですね、
>>208 の方法だと、
double data[30];
double ps_dammy[30];
double (*ps)[5];
for(i=0; i<4; i++){
for(k=0; k<30; k++) ps_dammy[ k ] = data[ k+i ];//i によって一個ずれたps_dammy[0〜30]を作る
double (*ps)[i] = (double (*)[i])ps_dammy;
}
このようなことをすると、アドレスがかぶって上書きみたいになる(ようするにできない)ってことかな??
>>213 そのように書くと、ps[0][0]〜ps[0][4]にps_dammy[0]〜ps_dammy[4]
が入ってしまいます。
やはり素直に、
double ps[30][5];
for (i = 0; i < 30; i++) ps[i][0] = ps_dammy[i];
のように書いた方がよいですね。
215 :
こまった君 :02/06/04 01:46
>>214 なるほど。。
難しいところですね。
でわ。とりあえず、実践してみます。
ありがとうございました!
216 :
デフォルトの名無しさん :02/06/04 02:05
Algorithms in C セジウィック著の完全日本語略はないですか??
>>216 第1巻〜3巻まで持ってるよ。
近代科学社刊。
今ではAlgorithm in C++の方しか書店で見かけなくなったけど、
注文すれば手に入るはず。
>>216 第1巻:ISBN4−7649−0255−9 ¥2,800
第2巻:ISBN4−7649−0256−7 ¥3,200
第3巻:ISBN4−7649−0257−5 ¥3,300
各税別
219 :
デフォルトの名無しさん :02/06/04 02:27
>>217 ,218
ありがとうございます。探してみます。
a<i<b の条件を論理的に表したらどうなるのでしょう??
間違えました (a<i<b)の範囲ではないi はどのように表現すればいいのでしょう?
a<=i || i>=b
(i<=a)||(b<=i)
>>224 ありがとうございました。。
って222は俺がやってたミスと同じだ。
>>186 解説。
const int bias = ((23 + 127) << 23);
// biasは、IEEE 32bit float表現で +1.0E23。
n += *(float*)&bias;
// 仮数部は最上位に立ったbitのひとつ下から精度分が格納される。
// 1.0E23を加算することで、指数が23未満だったときに23に引き上げられ、かつ
// 仮数部に隠れた最上位ビットが1.0E23(今加算した値)となる。
// 指数が23(精度と同じ)ということは、仮数部がそのまま整数となる。
// なお指数部がもともと23以上だった場合はこの限りでない。
// また、負数で絶対値が1E23未満だった場合、この加算で
// 正数(絶対値を1E23から引いた値)になり、その最上位ビットが隠れ、指数が1減る。
return *(int*)&n - bias;
// 指数が23の場合、指数23のイメージを引くことで、整数部だけが残る。
// 23以外だったときは壊れる。
// 負数だった場合、指数が22のため、23を引いて-1(オール1)になる。
// 仮数部も補数になっているが、指数が1少なかったため、小数点の位置がひとつ低い。
// つまり結果として2倍の値が得られる。
227 :
デフォルトの名無しさん :02/06/04 10:33
WINDOWSでVC++を使っているのですがMFCやWIN32APIは理解したほうがよいのですか> 3ねんくらいC言語を使っているのですがいまだにHelloWorldしかできません。
MFCとかWin32APIの前にもう少しCを勉強汁。
>>227 3年で1週間レベルだから、100年ぐらいは頑張ってね。
>>229 HelloWorldなら1時間レベルでは
>>230 環境を整えたり、Cの概要を調べるだけで1時間以上かかると思われ。
じゃぁ中とって1日レベル。 3年で1日レベルか・・・・憐れだ。
233 :
デフォルトの名無しさん :02/06/04 12:34
227は今までgccとか使ってて、 Windows上だとHello Worldしかだせないと言ってるのでは?
だろうな
>>227 >WINDOWSでVC++を使っているのですがMFCやWIN32APIは理解したほうがよいのですか
理解しないと何もできません。
プログラムってやりたいことない人は上達するのですか? 教科書とか参考書って見ていてあまり面白くないですし…
>>236 コンピューターを自分の思うがままに操ることに快感を覚える
人は、プログラムの上達が人一倍早いです。
興味が沸かないなら、他の興味がある事を探した方が得策で
しょう。
>>237 ほかにない場合は…
ぜんぜん伸びないなぁ、と思う今日この頃。
本に頼るからだめなのでしょうか?
言語と全然関係ないじゃん。
本は頼るものじゃなくて利用するもの、と言ってみたり。 プログラム書いてて面白いと思えてればそのうち伸びるでしょ、思えていないなら早めにやめたほうがいいし。 参考書なんてどれもつまらないもの。 さっさと卒業して他のものに手だそう。 キタ━━━━(゚∀゚)━━━━!!と思える本に出会おう。
>>239 キタ━━━━(゚∀゚)━━━━!!
と思える本とは何ですか。
お勧め本見てもぱっとしない
Cマガ、Interface、or 洋書
>>240 スレ違いだけどModern C++ Designとか
C言語(結局VC++)使っているとしてPGから見るOSというのはAPIですよね。 WinならWin32API(MFCやATLはひとまず置いておいて)ですよね。 WinでのProgramを理解するならWin32を理解しろということですよね。 それを使ってC言語の予約語を使ってWindowsでプログラムするのがWindowsプログラムだと。 で、Win32をC++で使うときに一応使い易くするために作ったのがMFCなりOWCだと。 当たり前すぎて馬鹿らしいでしょうが、 これであってますよね。
もう15年前だが、俺も文法なんて1週間かからずに覚えたな。 勉強したって感じより、ゲーム感覚でのめり込んで遊んでるうちに 覚えてしまったって感じ。本なんてなんでもよかったよ。 でも、K&Rだけは読んでもわけわからんかったが(笑)。
245 :
デフォルトの名無しさん :02/06/04 16:45
getchar()などで入力を待っている状態に difftime( now,start )などで待ち時間を表示したいのですが どうすればいいのでしょうか?
selectするとか、thread使うとか。
>>241 洋書なら何でも良いのか?
Cマガと書いてるあたりネタとしか思えないが
248 :
デフォルトの名無しさん :02/06/04 17:06
float型の配列を0クリアするのにmemset()を使ってよいですか? 他に初期化するのに使える関数はありますか?
>>246 ?
select case()を使えってことでしょうか?
後、threadとは何でしょうか?
selectとswitchは違うぞ
252 :
デフォルトの名無しさん :02/06/04 17:20
253 :
デフォルトの名無しさん :02/06/04 19:24
この関数は GNU の拡張である。 っていう文字が見えませんでしたか?
255 :
デフォルトの名無しさん :02/06/04 19:58
ワラタ
258 :
デフォルトの名無しさん :02/06/04 20:08
size_t strnlen(s, n) char const *s; size_t n; { size_t i; for (i=0; i<n && *s; i++, s++) ; return i; }
259 :
デフォルトの名無しさん :02/06/04 20:30
size_t size = sizeof typeof(3.14 * gundam);
ただのCなんぞK&R1冊あれば十分。 C++なら色々買え。
CはK&RとエキスパートCプログラミングで十分。 それ以外は不要。
info/man 調べものはこれで十分
ふっふっふ
266 :
デフォルトの名無しさん :02/06/04 23:23
C/C++を独習し始めて何ヶ月くらいでVectorにフリーソフトを出せるくらいに なりますか?ソフトにもよると思いますがいちばん簡単なもので。
1日。Hello Worldプログラム(ソース付属)
packがほしいとか。 ってか、今もpackあるの?
pack最近(というかここ数年)届かねーぞゴルァ。 もう作ってないんだろうけど。
Vectorなんて自分で登録するんだからソフトの出来なんて関係ないよ
vectorに登録されるソフトって増える一方なんだろうか。
>>271 え、あれって自分で登録するもんだったの?
漏れんとこは登録させてくれって向こうから来たよ。
もうかなり昔だけど。
まだ登録ソフト数が少なくて数を増やしたかったんだろ
275 :
デフォルトの名無しさん :02/06/05 13:40
makefileで教えてください。 プログラム中の#defineを、代わりにmakefile中に記述できますか?
>>275 多分-D。
>>276 も言ってるように、makefileじゃなくコンパイラの問題だと思うがどうか。
278 :
デフォルトの名無しさん :02/06/05 13:57
279 :
デフォルトの名無しさん :02/06/05 15:16
Sun のCコンパイラなんですけど「機能」などの文字列定数がコンパイル時に 警告: 不適切なエスケープ: \<0xba> を出します。 どうしたものでしょう?
>>279 >\<0xba>
漢字コードじゃないの?
C言語をこれから学びたいと考えてますが、何分お金がないのでタダで学ぼうと 図書館に行ったんですが、どの本に付属しているCDROMがいいのかっていうのが 判りません。 cygwinを使えって言われたんですが、これはどこで手に入るんですか、また これと本を借りれば学べるんですかね?
>>279 [ュ],5cba,FAAD,3F
>>282 検索してからでも良いんじゃない?せっかくのインターネット。
いや、すみません。 早く知りたいもので。 以後気をつけます。
早く知りたきゃさっさと検索すれ。
ヽ(`Д´)ノウワァァァン!! どうすればいいのー?
printf("機能:%s", ss); とかやってますか?
>>288 ソースをshift jisで書いてるんじゃないの?
EUCとかで書けってことかと。
やってます。
マシンはShiftJISみたいなんです。あまりUNIX詳しくないんです。
0x5cがエスケープシーケンスとして見なされてるんじゃないの? "機能"→"機能\"にしてみれ
printf("%s%s", "機能:", ss); なんつって。
コンパイラがsjisのエスケープをしてなくて平気な環境ってことは sjisでは書くなという意思表示だと思うが。 それに「マシンがsjis」って何だよ(笑)文字コードはマシンには依存しないし。 エディタ次第でしょ。
>>293 Pro*Cかますんでそれだとまずいみたいなんです。
>>294 いっしょのような気が
>>295 んだば、秀丸で書いてFFFTPでEUCに変換してアップしてコンパイルすれば
いけるのかなー
やってみよう
>>295 >それに「マシンがsjis」って何だよ(笑)文字コードはマシンには依存しないし。
PC98x1
>>297 PC98x1のVRAMはJISで、SJISではないよな。
299 :
デフォルトの名無しさん :02/06/05 16:14
ストリームの概念がいまいち掴めません、教えて
279 コンパイラだますだけなら。 printf( "\x8B\x40\x94\x5c %s", s ); printf( "\x8B\x40能 %s", s );
staticな関数のプロトタイプをヘッダーファイルに書いているやつがいるんですが。
許してあげなさい。 生成されるバイナリが膨れるだけで実害はないから
うーん。こまった。
サイズは河原んだろ。意味ないだけで。
>>307 その代わり、同名で引数が違うstatic関数を別ファイルで定義できなく
なる。百害あって一利なし。
>>308 それが目的とか。メリットが想像もつかんけど(笑)
>>306 まだ困ってるの?
EUCに変換やってみようってのはどうなった?
EUCに変換したら表示される文字が化け化けになりました。 しかたないので機能という文字はすべて消しました。めでたしめでたしです。
"機能\"でもだめなのか
315 :
デフォルトの名無しさん :02/06/05 18:36
printf("unkounko")でコンソールにunkounkoと出力されますが、 コンソールじゃなくてファイルにunkounkoと出力する関数ってありますか?
fprintf();
318 :
名無し募集中。。。 :02/06/05 18:42
printf("うんこうんこ");
main() { freopen("test.txt", "w", stdout); printf("unkounko"); }
320 :
デフォルトの名無しさん :02/06/05 18:59
Void氏ね
>>312 SJISに設定したtelnetで化けたとかか。
sscanf(str,"%[^,],%[^,]",buf01, buf02); で、文字列strをカンマ区切りでbuf01/buf02に読み込めると どこかのスレで読んだのですが、 %[^,]の部分て、どのような規約によって決まっているのでしょうか? MSDN(VC++6付属)で「書式指定」で探してみたんですが いま一歩理解できなかったです。 何をキーワードにして検索すればよいでしょうか? それとも、自分みたいなアフォにもわかりやすく 説明しているようなページはありますでしょうか?
325 :
The 中村 :02/06/06 11:39
C言語で ファイルの削除の仕方を教えてください シェルでchmod→rmを行いsystemでそのシェルを呼び出す方法をしてますが これ以外で関数一発でファイル削除が出来るようなのってないでしょうか? サーチしても見つからず困ってます どうかご教授お願いします
remove unlink
327 :
The 中村 :02/06/06 11:53
326さん どうもありがとうございました
削除にchmodはイランだろ。それともディレクトリに対してchmodしてんのか。
329 :
デフォルトの名無しさん :02/06/07 04:19
コンソールから入力した10進数値の各桁の値を 配列に格納するにはどうしたらよいでしょうか? 文字列から数値変換するのはなしです。
-'0'
>>329 int i;
char str[20];
scanf("%d", &i);
sprintf(str, "%d", i);
>>329 数字 c ---> 数値 c - '0'
ASCII コード表を見ながら、 c に '1' から '9' までの
数字を実際に代入して確認してみてください。
>>329 捕捉。「数字」と「数値」の違いを調べてみて下さい。
本を買えよ
336 :
デフォルトの名無しさん :02/06/07 11:47
ソフトもかえよ
337 :
デフォルトの名無しさん :02/06/07 12:02
memcopyの使い方を教えてください。 コピーするのはわかるんやけど、 ヘルプを見ても意味がわからないのです。 memcopyで配列をコピーしたいのです。 例えばp[20][30]の配列をw[20][30]の配列へ・・・
memcopyって何ですか?
339 :
デフォルトの名無しさん :02/06/07 13:04
#include <mem.h> void *memcpy(void *dest, const void *src, size_t n); void *_wmemcpy(void *dest, const void *src, size_t n); 解説 n バイトのブロックをコピーします。 memcpy は,UNIX の System V で使用できます。 memcpy は,n バイトのブロックを src から dest にコピーします。src と dest が重複する場合の memcpy の動作は未定義です。 こう書いてるけど実際、どうやるのかがわからない。
int p[20][30]; int w[20][30]; memcpy((void*)w, (void*)p, sizeof w); (キャストはいらないかもしれない。)
342 :
デフォルトの名無しさん :02/06/07 13:23
C言語でこの意味がわかりません、教えてください #include <stdio.h> #include <stdlib.h> #include <time.h>
Cの2次元配列って隙間なくびっちりだっけ?
>340 憶測でものを言うな!
>343 多分。
>341 ヴォイドレス イラネ
>>343 もし隙間があったとしても、このばあい問題ないんじゃねーの?
>>343 配列の要素のアドレスを調べて確認しる。
そりゃそうだなヽ(´ー`)ノ
351 :
デフォルトの名無しさん :02/06/07 13:30
1 little 2 little 3 little indians, 4 little 5 little 6 little indians, 7 little 8 little 9 little indians, 10 little indian boys. プログラム中にlittle、indianは一回、数字は2と4から10は一回もでない 誰か教えてください!
>>351 が何を言ってるのかわかりません。
誰か教えてください!
このプログラムを作らなくてはいけません
ρ(´-`ρ) ★ゆんゆん★ (σ´ー`)σ
>>351 printf(
"1 little \n"
"2 little \n
"3 little indians, \n"
"4 little \n"
"5 little \n"
"6 little indians, \n"
"7 little \n"
"8 little \n"
"9 little indians, \n"
"10 little indian boys. \n"
);
>>356 プログラム中にlittle、indianは一回
>>351 プログラミングを勉強する前に日本語を勉強してください。
歌詞を表示するプログラムです
早く教えて
365 :
デフォルトの名無しさん :02/06/07 13:52
失せろ。
367 :
デフォルトの名無しさん :02/06/07 14:28
memcpy教えてくれてありがとう!!
cpyって何の略? capacity?
wavファイルを読み込んで音量を調節したものを出力するソフトを作っています 波形データを配列に格納するところまでは成功したので,とりあえず音量を半分にしてみようと思って for(DWORD i = 0; i < nSamples; i++) { lChannel[i] /= 2; rChannel[i] /= 2; } とやってみたのですが,どうにも上手くいきません.出力された波形を見ると, 真ん中で二つにパックリ割れてしまっているような感じになっています. 正しい処理の方法を教えてください
最強の言語はやっぱCですか
373 :
デフォルトの名無しさん :02/06/08 00:59
>>372 いや、オヤジギャグでしょう。
どんなにまじめな気分のときでも、どんなにやる気がみなぎっているときも、
一瞬にして皆を脱力させてしまう。
暴漢に襲われそうになったときは、まずオヤジギャグで相手の攻撃意欲を
打ち砕き、脱力しているすきに逃げ去る。
戦わずして勝つ方法。「孫子の兵法」にもこの手は載っていない。
最強の言語。
>>370 DBからAMPに変換した後1/2にして、その後またDBに変換
370 無圧縮PCM formatのデータはDWORD(unsigned long)はかったと思う。 たしか8bit符号なしか16bit符号つきのどちらかだったと思う。
376 :
デフォルトの名無しさん :02/06/08 01:10
ウィンドウに線を表示するにはどうしたらいいでしょうか
LineTo
378 :
デフォルトの名無しさん :02/06/08 01:14
for(i = 0 ; i < MAX_WIDTH ; ++i) { pset(i, 10); }
379 :
デフォルトの名無しさん :02/06/08 01:18
380 :
デフォルトの名無しさん :02/06/08 01:20
#include <windows>
>>376 > ウィンドウに線を表示するにはどうしたらいいでしょうか
OSくらい示せよ・・・それ以前にスレ違いだが。
>>324 おそレスすまんです。
かなり参考になりそうな気がしますです。
少なくとも、ただの文法書よりは100倍読む気になります。
1回読んでもわからないと思うので、がむばつてみます。
windowsプログラムですが(スレ違いかな?)、 const char型の戻り値を返す関数の戻り値を配列に格納したいのですが うまくいきません。配列中身が全て同じになってしまいます。
いまさらだけどInterfaceっていう雑誌の今月号おもしろい
387 :
こまった君 :02/06/08 21:25
--------------------------- dataは 230 231 229 231 229 243 229 243 221 : という風なタブ区切り,改行区切りファイルで、 一行づつ(例えば【230 231 229】)読み取って、文字列chaに収めたい。。。 もしも、 FILE *data; char cha[256]; なら、 data = fopen("test.txt","r"); while( ( fgets(cha , 256, data)) != NULL ) [ 〜作業〜 i++ } でOKなんですが、 ---------------------------- double data[100]; char cha[256]; の宣言で、 data[100]が data[0] = 230 231 229 data[1] = 231 229 243 data[2] = 229 243 221 : の場合、 上と同じように一行づつchaに入れるには、どのようにすればよかでしょうか? while( ( ??? != ??? ) [ 作業 i++ }
const char *str[128]; for(i=0;i<5;i++){ str[i] = xxx(); } xxx()関数の戻り値はPCSTR型です。 こんな感じです。配列strに文字列が入ると思うんですが、うまくいかない感じです。 PCSTR型ってconst char *型ですよね?違ったかな・・・
constjyなくstaticじゃねーの constって定数じゃなかったけ
>>388 LPCSTR str;
str = xxx();
ならポインタ変数strに文字列の先頭アドレスが入るとは思うが。
>>388 str[i] = xxx();
は、xxx()が既存のどこか別の場所に文字列を書き込み、その先頭アドレスを返すわけだな。
実行するごとに変わるのはその文字列の内容であって、アドレスは変わらない。
str[i] = xxx();の代入は、文字列の内容ではなくアドレスを保存しているため、
すべて同じアドレスしかなく、内容を参照すると最後の実行結果の文字列しか読めないわけね。
アドレスじゃなく内容をコピーしる!
>>388 単にxxxが同じバッファ再利用してるだけじゃねぇの?
適当なこと書くんじゃねーYO!
確かに
>>388 さんがおっしゃるように、内容を参照すると
最後に実行結果の文字列しか表示されません。
アドレスじゃなくて内容をコピーするのはどうすれば良いでしょう?
>387 君はまずデータ型と実データの関係をもっと勉強するべき。 「double data[100]」と宣言してるのに、 実データのイメージを「data[0] = 230 231 229」と書いている時点でかなりヤバイよ。
>>394 memcpy使え。
その前にxxxが返す文字列分のメモリをstr[i]に割り当てる必要はあるが
>>398 文字列なら strdup() かね。非標準だが、大抵の処理系にはあるし、なければ
簡単に自作できる。
>>399 strdup()でうまくいきました。ありがとうございますー。
文字列のコピーを考えたとき、strcpyとlstrcpyが頭に浮かんできたので
試してみたけどダメでした。コピーと言っても方法がいろいろあるのでしょうか。
良ければstrdup関数の自作方法を教えていただきたいのですが。
>>400 メモリ管理(malloc, free)について勉強しましょう。
>>401 了解しました。もう少しCの勉強をしておきます。
>>370 そんな感じのやり方で良いと思うが…。
処理後の波形でplayすると歪んだ音になるのか?
>真ん中で二つにパックリ割れてしまっているような感じ
どうゆう波形なのか今いち想像つかん(w
ファイルのサイズを、取得する方法をおしえて。
>>404 二種類ある。
1. ディレクトリ検索結果から得る方法。
2. ファイルを開き、末尾にseekして現在位置を得る方法。
あとは自分で調べて。
WindowsならGetFileAttributesExがいい
>>370 音量を半分にするなら
信号の振幅をdbmで半分にしないと
変わり種で、_stat
>403 unsignedとsignedを間違えて扱ったんじゃないか?
>>400 #include <string.h>
char *strdup(char *s){
char *p = NULL;
p = (char *)malloc(strlen(s) + 1);
if(p != NULL)
strcpy(p, s);
return p;
}
>>387 char cha[100][256];
int i = 0;
while(fgets(char[i], 256, data) != NULL && i < 100){
作業
++i;
}
412 :
デフォルトの名無しさん :02/06/09 06:28
すいません厨房です。 RGBで白の場合は(0xff,0xff,0xff)となるらしいですがその中の「0x」というのは 何ですか?
>>412 0xがわからないのに、ffは何か知ってるの?
何故本を読まないのですか|o|
415 :
デフォルトの名無しさん :02/06/09 08:50
>>412 Cの仕様でしょう。
変数名と区別するために、先頭に0をつけ次のxで(以下略
417 :
デフォルトの名無しさん :02/06/09 10:30
まだC++でもかんぜんにCを凌駕出来ないといわれますが C言語に出来てC++に出来ないことは何ですか?
はぢめて聞いた・・・まぢで?
C++はまだ完全にCを超えてないといいませんか? 確かそう聞いた。 2chでも見たような気がする。 それで何が違うのだろうと思ったのです。
>>419 > C++はまだ完全にCを超えてないといいませんか?
はつみみです。
422 :
デフォルトの名無しさん :02/06/09 12:56
配列を値で返すことはできるでしょうか。 できたら、どうすればいいか教えて下さい。お願いします。
423 :
御茶目菜子 :02/06/09 13:04
バカか いまごろCかよ。ふるいんだよ。おまえら死ね。 いまどきの言語はよ〜 ポケコンBASICだぜ!!
424 :
デフォルトの名無しさん :02/06/09 13:05
>配列を値で返す どういう意味?
>>422 配列自体はできないが、構造体は返せる。
これを利用して、構造体の中に配列を入れて返せばいいんでない?
426 :
デフォルトの名無しさん :02/06/09 13:59
配列の先頭へのポインタを返すんじゃないの?
> C言語に出来てC++に出来ないことは何ですか? void*から他のポインタ型への暗黙のキャスト
プロトタイプ宣言なしの未知関数呼び出し
>>411 x fgets(char[i], 256, data) != NULL && i < 100
o i < 100 && fgets(char[i], 256, data) != NULL
逆にC++にできてCに出来ないことの1つに ブロック中のどこでも変数が宣言できるってのがあるけど、 これってプログラムが見にくくならない? 俺はC++でも新しい変数使うときはブロックにしてるけど
>>431 当たり前。どうしても仕方ない時だけに使う。
あと演算子関数以外でリファレンスを使いまくって読みづらくするのはDQN
constじゃない&ね
構造体で, typedef struct{ int a; int b[30][30];//ここ }c; というふうにしてはいけないんですか?
>>434 いけなくないよ。
誰かがいけないなんていったのなら、そいつに問いただせ。
前々スレでいわれました 気になったんで聞きました
>>434 ここで聞かなくてもコンパイラが教えてくれると思うが・・・
コンパイラは,だめでもそのままってことあるっしょ じゃなきゃおちないじゃん
>>439 シンタックスエラーで落ちるってのは初耳
442 :
デフォルトの名無しさん :02/06/09 15:54
猫でも分かるプログラミングという有名ページがありますが あそこには長初心者用と書いてあります。 あれが理解できても初心者ですか? Windowsプログラミングに関してはかなりのものになると思うのですが 実際はまだまだなのでしょうか… 確かにあそこだけでは自分でオリジナルなものを作るのには 厳しいと思いますけどWindowsの仕組みを理解するには十分すぎる気もします。
>>432 程度問題だが、俺の判断基準だと
インスタンス構築にコストがかかる or コンストラクタに引数を渡す必要がある
場合には、ギリギリまで遅らせる意味がある。
ループカウンタ(イテレータ)は for の中で宣言。
ぐらいかな。もっとも C++ だとループも algorithm 使うことが多いけど。
(これ以上は C++ スレで聞いた方が良いと思うぞ)
>>444 初心者という言葉は知識をまったく規定しない。本人の意識の問題。
あのページを便利なリファレンス(あるいはコピペ元)として使ってる奴は たくさんいると思われ。
>>449 ああ、何でDelphiのスレ指してるのかと思った。そういうことね。
誘導有難うございます
452 :
デフォルトの名無しさん :02/06/09 17:36
ちゃんとファイルの先頭に#include <math.h>と書いてあるのに コンパイルすると次のようなエラーがでます。 /tmp/cc5Soiex.o: In function `main': /tmp/cc5Soiex.o(.text+0x144): undefined reference to `sqrt' /tmp/cc5Soiex.o(.text+0x152): undefined reference to `log' /tmp/cc5Soiex.o(.text+0x1f4): undefined reference to `getBf' /tmp/cc5Soiex.o: In function `dft': /tmp/cc5Soiex.o(.text+0x336): undefined reference to `cos' /tmp/cc5Soiex.o(.text+0x358): undefined reference to `sin' /tmp/cc5Soiex.o: In function `idft': /tmp/cc5Soiex.o(.text+0x3e1): undefined reference to `cos' /tmp/cc5Soiex.o(.text+0x403): undefined reference to `sin' collect2: ld returned 1 exit status アドバイスお願いします。
UNIX関係だね。 #include <math.h>で解決するのはコンパイル。 そのエラーはリンクエラーね。 gcc(cc)の引数に -lm を付けろってこと。-lはライブラリ指定で、mがmath用の名前。
ありがとうございました。
456 :
デフォルトの名無しさん :02/06/09 19:43
#include <stdio.h> #define N 4 int count, p[N]; void show(void) { int i; count++; printf("%5d: ", count); for (i = 0; i < N; i++) printf(" %d", p[i]); printf("\n"); } #define TRUE 1 #define FALSE 0 char ok[N + 1]; void put(int pos, int k) { int j; p[pos] = k; if (pos == N - 1) show(); else { ok[k] = FALSE; for (j = 1; j <= N; j++) if (ok[j]) put(pos + 1, j); ok[k] = TRUE; } } void genperm(void) { int k; count = 0; for (k = 1; k <= N; k++) ok[k] = TRUE; for (k = 1; k <= N; k++) put(0, k); } #include <stdlib.h> int main() { printf("順列\n"); genperm(); return EXIT_SUCCESS; }
456のプログラムで1〜4までの順列を辞書順に列挙できると思うんですが、これを改良して たとえば4個から2個を選んでその順列を辞書順に列挙するようにはできないでしょうか・・・
>>432 何でリファレンス使ったら読みづらくなんのよ?
DQN的質問、定期的に出るよなぁ。
463 :
ERROR:スレッド立てすぎです。。。 :02/06/09 22:56
みんなで力をあわせて、軽くてオープンソースなprintfを作りませんか? スタック消費量は とりあえずの目標値として100バイト以下って感じで。 浮動小数点とか、16進表示とか、いる機能いらない機能を 使う人が自由にカスタマイズできる、そんな自由なprintfを!
学生時代から現在にかけてC言語はいまだに分からん。全く理解できていない。 初心者と思ってくれて良い。この永久不明君に教えてくれ1よ。 社内でも、外注先でも、C言語が分かる人=Cマガ読者なんだよね。 そんないい加減な言語に対処するため、ANSI C言語辞典をかたわらに 今日も独学で頑張る俺。さて、俺がにらんだからには 一人で沢山カキコします。お付き合いください。
>>463 昔作った奴。
好きなように改造してくれ
int sprintf(char*b,char*f,...)
{
va_list v;
unsigned i,n;
char x,*o,*h=b,s[99];
va_start(v,f);
while(*f){
if(*f^37)
*b++=*f;
else{
o=s+97;s[98]=i=0;x=*++f;
x==37?*o=37:x==99?*o=va_arg(v,char):x=='s'?o=va_arg(v,char*):0;
if(i<9){
n=va_arg(v,int);
if(i>6)
if((int)n<0)*b++='-',n=~n+1;
i=i==5?16:i==6?8:10;
while(*o="0123456789abcdef"[n%i],n/=i)o--;
}
while(*b=*o++)b++;
}
f++;
}
va_end(v);
return b-h;
}
>465 ソースの汚さは別にして、オレはあんたを尊敬する。
確かに汚いソース(笑)
ゴメソ試したら動かなかったんで、作成中かその他のソースだったらしひ こっちが正しい奴みたい。 #include <stdarg.h> typedef char c; int sprintf(c*b,c*f,...) { va_list v; unsigned i,n; c x[9]="%csuxodi",*o,*h=b,s[99]; va_start(v,f); while(*f){ if(*f^37) *b++=*f; else{ o=s+97;s[98]=i=0;x[8]=*++f; while(x[i++]!=*f); if(i<3)*o=i==1?37:va_arg(v,c); else if(i<4)o=va_arg(v,c*); else if(i<9){ n=va_arg(v,int); if(i>6) if((int)n<0)*b++='-',n=~n+1; i=i==5?16:i==6?8:10; while(*o="0123456789abcdef"[n%i],n/=i)o--; } while(*b=*o++)b++; } f++; } va_end(v); return b-h; } #include <stdio.h> int main() { int i; char buf[512]; printf("\n%d:%s\n", i, buf); i = sprintf(buf, "%%%s%s%s %c %d %u %x %i %u %o", "test1 ", "test2 ", "test3", 'a', -123, 123, 0x123fe, -123, -123, 83); printf("\n%d:%s\n", i, buf); return 0; }
>>463 作るのはおもしろい、というか俺も昔作ったけど、当時は狭苦しいDOSとか用だったしなあ。
今はそういう要求は思いつかん。なんでスタック消費にこだわるの? それによるメリットは何?
組み込み系で使うのかな?
C言語は動作が仕様で決まってないなど、不明点が多いこと、
入門書しかない点だ。腹立つことが多いね。
例えば、
>>452 の質問だ。これあきらかに452の指導者がバカなわけでしょ。
452はどうせ高校か大学の情報処理の授業の宿題程度だろ。教官がバカだね。
あきらかにコンパイル、リンク、ヘッダファイル、ライブラリ、アーカイブ、
そういった基本的なことを理解してないことが集約されている質問。
ansi cとして提供(実装)されている関数の基本的な利用方法を教えていない。
cc,ar,nm(あるか?)とかの使いかたも当然、教えていないと思う。
*.o,*.so,*.aの違いを知らんと。
分割コンパイルをやったことも無いだろうし、makefileも作ったことないと思う。
推論規則、拡張子ルール、依存関係そんなものも分かっていないはず。
当然構文解析や、字句解析、コンパイラがどう実装されているかも知らんわな。
最適化だのインライナーだのアセンブラだの、処理系で違うだろうが、ccのオプション
でいろいろできることもしらんわな。
>>431 ,432も何いってんの。
変数使用する直前に変数宣言できるからいいんでしょ。
それで公共システム何個も動かしてて問題起きないよ。
C言語でやるときはしょうがないから、{}でブロック作るんでしょ。
>>474 カウンターなどの変数なら、関数の先頭で宣言を強制してもよいと
思うが、クラス変数や反復子までもが先頭での宣言を強要されると
ウザイよ。というか困るよ。
C++でのクラス変数の宣言は、文と同じくらいの意味を持っているか
らね。
470が超弩級のアフォだということはわかった
(´_ゝ`)ふーん
>>471 そうだね。
そして使わなくなった直後にスコープ外に出すことは出来ない(藁
これをするには結局{}で囲まなきゃ
>>475 「リソースの獲得は初期化」イディオムだな。
この場合、クラスのコンストラクト時にリソースの獲得を行うのが普通、と。
479 消し忘れ
481 :
デフォルトの名無しさん :02/06/10 01:03
>>470 > 例えば、
>>452 の質問だ。これあきらかに452の指導者がバカなわけでしょ。
独学だろ。
質問です。 関数で複数の返り値を返したい時はどうすればいいのでしょうか?
>>482 1)同じ型の値なら配列を返すことはできる。
2)異なる型のセットなら構造体で返すことができる。
3)自由に構成が変わるタプルの構成なら文法レベルでは無理。ライブラリを作って擬似的に対処する。
>482 4)とりあえずグローバル変数経由で返すのはやめとけ。
>>482 >>483 の3)に相当するのなら、unionで定義しておき、void *を返して
戻り先でキャスト汁!
5)返すわけではないが返してほしい値をセットするための変数を引数として渡す。一般的にはこれかな。scanf等がいい例。
>>482 方法は色々あるけど、ふつうは構造体へのポインタを渡して、そこに書き込ま
せるかな。構造体を作るまでもないデータなら、組込型へのポインタを渡して、
そこに書き込ませることもある。
void foo(int *np1, int *np2)
{
*np1 = 1;
*np2 = 2;
}
int main()
{
int m, n;
foo(&m, &n);
/* m に 1, n に 2 が書き込まれる */
...
return 0;
}
> 変数を引数として 変数のアドレスを引数として と言うべきだったな。
レスありがとうございます。 構造体はまだ使った事が無く分からないので 487さんの方法を試してみます
491 :
デフォルトの名無しさん :02/06/10 09:48
質問なのですが。。 構造体を関数に渡す場合、値で渡しちゃってもプログラムに悪影響は無いのでしょうか?
>>491 無いです。
でも、サイズが32ビット以上(ポインタのサイズ以上)の物を渡す場合は参照渡しよりメモリを食って処理時間も増えます。
そうですか、ありがとうございます。 あと一つ 前に #define LENGTH 255 char str[LENGTH]; str[LENGTH-1] = NULL; こんな感じのコードを見ました 間違った書き方ですよね?
>>493 エラーは出ないね。NULLが整数型なら(最近は全部(void *)か)。
どっちにしろその配列を何に使うかは激しく謎だけど。
>>493 間違ってはいないけど、NULLは'\0'にすべきだな(笑)
>>494 char str[LENGTH];とstr[LENGTH-1] = NULL;の間の処理は
>>493 が省略したんだろ。
>>496 もしかしたら、
「文字列用配列宣言したらその直後にNULLを入れましょう。」
と言う考え方を否定しているのかも。
まぁ、変だけど。
でも、文字列操作失敗しても確保したメモリ以上の参照が行われにくくなるという点では評価できないこともない。
>468 すぅばらしい。ムスカ君、キミは英雄だ! というわけでこれから検証してみます。
497は何か勘違いをしている
500 :
デフォルトの名無しさん :02/06/10 11:59
NULL == '\0' == 0
int* p = '\0'; VC++でコンパイル通った・・・(゜д゜;) C++では'\0'はchar型のはずなのに・・・
最小2乗法のプログラムを作り途中なのですが、 下のエラーのコメントをしている部分で、 どうしてもエラーが出て成功しません。 全くどこが悪いのかわかりません。 多次元配列のとり方がまちがってるのでしょうか? ご教授お願い致します。 #include <stdio.h> #include <stdlib.h> main() { int i,j,k,n,m,row,column,x,y; double t,u, det; double **a,*d; printf("データセットの数(何セット?)="); scanf("%d",&n); printf("1セットのデータ数(ターゲットデータは含まない。)="); scanf("%d",&m); /* start_データ入力用配列確保 */ d=(double *)calloc(m+1,sizeof(double)); if(d==NULL) printf("データ入力用配列の確保に失敗\n"); /* end_データ入力用配列確保 */ row=m+1; column=m+1; /*start_配列a[row][column]の確保*/ a=(double **)calloc(row,sizeof(double *)); /*行(row)の確保*/ for(i=0;i<row;i++) a[i]=(double *)calloc(column,sizeof(double)); /*列(column)の確保*/ /*end_配列a[row][column]の確保*/ for(i=0;i<n;i++) { for(j=0;j<m;j++) { printf("%dset_data%d=",i,j); scanf("%lf",&d[j]); } for(x=0;x<row;x++) { for(y=0;y<column;y++) { if(x=0 && y=0) a[x][y]=1; if(x=0 && y>=1) a[x][y]+=d[y-1]; /*←(エラー)左辺値が必要*/ if(x>=1 && y=0) a[x][y]+=d[y-1]; /*←(警告)不正な代入*/ if(x>=1 && y>=1) a[x][y]+=d[y-1]*d[x-1]; /*←(エラー)左辺値が必要*/ } } } free(d); for(i=0;i<row;i++) free(a[i]); free(a); return(0); }
>>503 charはintに暗黙変換するので通る。
>>505 じゃなくて 値0 は pointerとも暗黙変換するので、だった。見間違いすまん
504です。 すみません。 なんか括弧 { の位置が めちゃくちゃになって、 見にくくなっちゃいました。。
>>505 int *p = (char)0; // 通らない
>>504 ×if (x = 0 && y = 0)
○if (x == 0 && y == 0)
509さん。 ありがとうございます。 全く、基本的なとこで間違ってました。 はずかしっ。。。
復活
513 :
デフォルトの名無しさん :02/06/10 15:48
dj?
if(Flg==START) { if(i=1) p=Kou[0].a; if(i=2) p=Kou[0].b; if(i=3) p=Kou[0].c; if(i=4) p=Kou[0].d; Flg=end; } for(i=0;i<KouMax-1;i++) { if(p[i] < p[i+1]) temp=p[i]; p[i]=p[i+1]; p[i+1]=temp; p+=sizeof(Kou)/sizeof(Kou[0]); } こうやるのは可能ですか? 構造体のメンバをソートしたいのですが, 例えば値段順で並べるだけならいいのですが,項目が増えた場合は, 押された項目の番号(i)を使ってソートする内容を変えたいのですが.
>>514 不可能です
if(i=1)...のあたり
ソート関数の引数に「構造体を2つとって比較結果を返すような 関数へのポインタ」を渡す。 構造体をstruct Hogeとすると かりにa,b,c,dがすべて数値なら(文字列だったらstrcmp) int cmpA(struct Hoge *m, strcut Hoge *n) { return m->a - n->a } なのを cmpB, cmpC とか作ってソート関数を void sort(struct Hoge *hoge_array, int (*cmp)(struct Hoge *m, struct *n)) にして if(i == 1) sort(Kou, cmpA); else if ( i == 2) sort(Kou, cmpB); ・・・ などと呼び出す。
>struct *n strcut Hoge *n だった。
>strcut structね・・・欝。
>>514 あ、「構造体の配列をソート」じゃないのね。
私の書き込みは忘れてください・・・。
>>514 なんか激しく不自然なデータ構造のような。
とりあえずKouの定義と、どういう風にデータを入れるつもりなのかを説明してみ。
おそらく結局は
>>516-518 のようなことをやりたいんじゃないかと思うが。
522 :
初心者家労 :02/06/10 20:27
Cでアドレス帳が作れますか?
524 :
初心者家労 :02/06/10 20:29
やはり構造体を使ったほうが便利ですかな?
526 :
初心者家労 :02/06/10 20:33
ソート機能を作りたいのですが、2次元配列で比較することはできるかな
配列をなら #t 配列でなら #f
528 :
初心者家労 :02/06/10 20:42
漢字はソートしてくれますかな
529 :
初心者家労 :02/06/10 20:43
やっぱり#include <stdio.h>っていうのが何を意味しているのか ちゃんと知っておいたほうがいいのかな?
530 :
初心者家労 :02/06/10 20:44
ライブラリ関数を定義してるもの?
ライブラリ関数を宣言してるもの。
533 :
初心者家労 :02/06/10 20:48
文字列は文字列のまま比較しちゃっていいの?
/⌒ヽ / ´_ゝ`) 2ちゃんねるで聞いて損した。 | / かえろ! | /| | // | | U .U
>>533 == で比較しては行けない。strcmp() 使え。
536 :
初心者家労 :02/06/10 20:57
ファイル処理関数は何を使えばいいですか?
C言語の入門書をなんか読んでくれ(´д`;) > 初心者家労
538 :
初心者家労 :02/06/10 20:58
5/2を計算しても2.5にならないのはなんで?C言語壊れてるのかな?
541 :
初心者家労 :02/06/10 21:21
こんなにがんがっても逝かないのはなんで?嫁さん壊れてるのかな?
読めさん、炎症でヒリヒリするって、泣いてたよ
そういうときは口で優しく(以下略
typedef struct{ int nedan; int kosuu; int syurui; int uribi; }KOU; KOU Kou[10]; void sort( int num ){//numはソートしたい項目の番号 KOU *p; if(num==1) p=Kou[0].nedan; if(num==2) p=Kou[0].kosuu; if(num==3) p=Kou[0].syurui; if(num==4) p=Kou[0].uribi; for(i=0;i<KouMax-1;i++) { if(p[i] < p[i+1]) temp=p[i]; p[i]=p[i+1]; p[i+1]=temp; p+=sizeof(Kou)/sizeof(Kou[0]); } こうやるのは可能ですか? 構造体のメンバをソートしたいのですが, 例えば値段順で並べるだけならいいのですが,項目が増えた場合は, 押された項目の番号(i)を使ってソートする内容を変えたいのですが.
>>545 C++ スレで聞いてる以上、こう答えるけど。
o そもそも効率激悪いソートアルゴリズムを自前で実装せずに std::sort 使え。
o ソート条件を変えたければ 3 つの引数を取る sort に適当な述語を渡せば OK。
>>546 ライブラリ使わないと何も出来ない人ってかわいそうだと思います。
すまん、ここ C 言語スレだったか……。qsort() に比較関数へのポインタを 渡すけど、それを項目番号によって変えれば?
だめ。
>>516-518 を嫁。
ついでにpは何を指してるんだかよく考えろ。
適当に切り貼りするんじゃない。
sortを使えと?
こんなもんかね。 #include <stdio.h> #include <stdlib.h> typedef struct{ int nedan; int kosuu; int syurui; int uribi; } KOU; KOU kou[10]; #define NELEM(x) (sizeof(x) / sizeof(x[0])) #define CMP_FUNC(obj_) \ static int \ cmp_by_##obj_(const void *p1, const void *p2) \ { \ const KOU* q1 = p1; \ const KOU* q2 = p2; \ return q1->obj_ - q2->obj_; \ } CMP_FUNC(nedan) CMP_FUNC(kosuu) CMP_FUNC(syurui) CMP_FUNC(uribi) static int (*cmpfunc[])(const void *, const void *) = { cmp_by_nedan, cmp_by_kosuu, cmp_by_syurui, cmp_by_uribi, }; void kou_sort(int sorter) { qsort(kou, NELEM(kou), sizeof(kou[0]), cmpfunc[sorter]); }
555 :
デフォルトの名無しさん :02/06/10 23:03
>>554 > #define NELEM(x) (sizeof(x) / sizeof(x[0]))
(sizeof x/sizeof x[0])にしてくれ。
きったないコード 素直にC++でメンバポインタを使えばいいだろ
>>555 なぜ?
というかむしろ
#define NELEM(x) (sizeof(x) / sizeof(x)[0])
では。
リストを使おうと思っているのですが, 5番目の構造体とかって参照しずらいですか?
>>556 自分できれいなコード晒してから言えよ。他人におかしな所を指摘されるの怖くて出来ないか?
しかもCスレでC++とはおめでてーな。
>>558 sizeofで括弧で囲むのは型だけにすべき。
>>559 「しずらい」の意味にもよるが、そういう関数を作っとけばいい。
ただし、配列に比べて後ろのほうはアクセスが遅くなるのはしょうがない。
>>561 囲んでも問題ないし、それ以上に#defineの引数は括弧で囲まなければ危険。
>>563 > 囲まなければ危険
それはMACRO(i-3)とかやると危険だということでしょ。sizeof(i-3)なんてやるかしら?
#define NELEM(x) ((sizeof x)/(sizeof x[0])) これなら安全だろ。
>>566 sizeof(i-3)はべつに変じゃありませんが。
それと、MACROの引数がsizeofに渡るかどうかなんてMACROの利用者には知る必要のないこと。
>>568 マクロを関数のように使うのなら知るべきだと思うが・・
>>561 の理由がわからん。
余分な括弧があっても式は式だし、冗長という以上のものではないよな。
付けるべきでない、とまでいうのなら何か実際的な問題があるという主張なはずだ。
>>561 > sizeofで括弧で囲むのは型だけにすべき。
すべき理由を教えてクリ。
>>555 と
>>556 は
何 で も い い か ら 、 い ち ゃ も ん 付 け た か っ た だ け で す か
dj?
C の や り 方 教 え て く だ さ い まだ童貞なんです。。
>>578 ____ 、ミ川川川彡
/:::::::::::::::::::::::::""'''-ミ 彡
//, -‐―、:::::::::::::::::::::三 ギ そ 三
___ 巛/ \::::::::::::::::三. ャ れ 三
_-=三三三ミミ、.//! l、:::::::::::::三 グ は 三
==三= ̄ 《|ll|ニヽ l∠三,,`\\::三 で 三
/ |||"''》 ''"└┴‐` `ヽ三 言 ひ 三
! | / 三 っ ょ 三
|‐-、:::、∠三"` | ヽ= U 三. て っ 三
|"''》 ''"└┴` | ゝ―- 三 る と 三
| / ヽ "" ,. 三 の し 三
| ヽ= 、 U lヽ、___,,,...-‐''" 三 か て 三
. | ゝ―-'′ | |::::::::::::_,,,...-‐'"三 !? 三
ヽ "" ,. | | ̄ ̄ ̄ 彡 ミ
ヽ、___,,,...-‐''" ,,..-'''~ 彡川川川ミ
厂| 厂‐'''~ 〇
| ̄\| /
582 :
デフォルトの名無しさん :02/06/11 00:07
>>535 > == で比較しては行けない。strcmp() 使え。
ってなぜなんですか?
>>582 ==だとポインタ同士の比較になるから。
それが目的ならいいけど。
>>545 ((int*)&Kou[i])[num-1]
なんか荒れとるが、 - そもそも STL 使えと言ったヤツ - qsort() 使ったコードを晒したヤツ は同一人物(俺)だ。556 の C++ 厨は別人。 だいたい STL の std::sort 使うなら、メンバ関数ポインタではなく単なる関数 オブジェクトにすると思うが……。
586 :
デフォルトの名無しさん :02/06/11 00:19
文字列の配列でなんか作れって課題が出たのですが、 ネタがなくて困っています。 面白いソースがあったらパクらせてください。 パクるの駄目だったら、おすすめの入門書を教えてください。
>>585 > 556 の C++ 厨は別人。
実は人ではなく鳥類という罠。とか。
自力でなんとかします。 クソなこと言ってすいません。
∧_∧ (´Д` ) 切腹しますた / y/ ヽ Σ(m)二フ ⊂[_ノ (ノノノ | | | l )  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
591 :
デフォルトの名無しさん :02/06/11 00:39
>>586 おっ ちょーどいいや。 頼みがあるんだけど。
シフトJISの文字列を引数として、その文字列のうち
2バイト文字のみを全て %xx%xx にエンコードして、
同じく引数のバッファに格納する
そんな関数を作ってくれ。 8時間たったら取りにきます。
%が続いたら? とかそういう細かい条件は気にしなくていいです。 つまんない細かいところはこっちで修正して使います。
>>591 URLエンコードならつくったけど。
2バイト文字だけじゃなくURLに使えない文字はすべてエンコードするけどね。
>593 やったー。 ほしいです。 もちろんただでとは言いません。 2Dでも3Dでもお好きなエロ絵をプレゼントします。
>>586 文字列の配列って文字列を指すポインタの配列のこと?
>>591 char *url_encode(char *str)
{
char *tp1=str,*tp2,*buf;
char chtable[]={'_','-','.','*',' '};
int i;
if((buf=(char *)malloc(strlen(str)+1))==NULL)
return NULL;
strcpy(buf,str);
tp2=buf;
for(;*buf;buf++){
if(isalnum((unsigned char)*buf)){
*str=*buf;
str++;
goto loopend;
}
for(i=0;i<5;i++){
if((unsigned char)*buf==chtable[i]){
*str=*buf;
str++;
goto loopend;
}
}
sprintf(str,"%%%02X",(unsigned char)*buf);
str+=3;
loopend:
;
}
*str='\0';
free(tp2);
strcrep(tp1,' ','+');
return tp1;
}
goto使ったのはcontinueだとうまくゆかないから。
こいつも入れておかないと・・・ char *strcrep(char *str,int trgtc,int repc) { char *tp=str; for(;*tp;tp++) if(*tp==trgtc) *tp=repc; return str; }
strchr()使えばいいじゃん。つーかstrcrep()ってなんだ。 char *url_encode(char *str) { char *tp1=str,*tp2,*buf; unsigned char c; static const char chtable[]="_-.* "; int i; if((buf=(char *)malloc(strlen(str)+1))==NULL) return NULL; strcpy(buf,str); tp2=buf; for(;c = *buf;buf++){ if(isalnum(c) || strchr(chtable, c)){ *str++=*buf; } else { sprintf(str,"%%%02X",(unsigned char)*buf); str+=3; } } *str='\0'; free(tp2); strcrep(tp1,' ','+'); return tp1; }
>>598 strchrって文字列中からchrを見つける関数じゃなかった?
文字列中の' 'を全て'+'に置き換えたいんだけど・・・
そこじゃなかった。 そうか、forで回さずにstrchr使えばいいんだ(笑)
>>468 いやー便利っすよ!!
ちょっとスタック食ってたから削って、ついでに2進表示つけたりバグも直してみたり。
正確には測ってないけど、スタック消費量は多分2,30バイトくらいかな?
(引き数分はまあおいといて)
これってすごく文字数節約してるけど もとネタは7行系かなんかですか?
フィールド幅とかゼロパディングとか 暇な時につけてみようかな。
602 :
デフォルトの名無しさん :02/06/11 02:55
if( i<x && c[i++]>0 )hoge(); って書いたとき、式はちゃんと左側から順に評価されましたっけ? if( i<x ? c[i++]>0 : 0 )hoge(); きちんとこう書くべき?
>>602 評価されると思う。
第一式が成立しなかったら抜けるから。
ていうかこのぐらいならテストコードかいてみればいいじゃん。。。
左から評価されます。ただし i<x が偽のとき次の c[i++]>0 は 評価されません。
>603 テストコード書いて自分の環境では問題ないと確認してるんだけどね。 動けばいいってもんでもないかな、と。 やれ環境依存だとかやれ不定だとかあるじゃん。 C-FAQも量が多くて見きれなくてさ。
>>604 一般的には多分それでいいと思う。
けど、蟹炒飯によると、
「演算子の優先順位と結合規則は完全に指定されているが、
式の評価順序は、定義されていない」
とあるんだよね。
ヘソ曲がりなコンパイラや なんかすげー最適化がかかったりしたときには
式が左から右へ評価されてく保証がなくなるような、そんな悪寒がしたもので・・
>>606 C99 の規格書から
6.5.13 Logical AND operator
4 Unlike the bitwise binary & operator, the && operator guarantees left-to-right
evaluation; there is a sequence point after the evaluation of the first operand.
If the first operand compares equal to 0, the second operand is not evaluated.
ANSI から C99 の規格書 (PDF 版) 買っておけば? 目次がしっかりしてるし、
文字列検索もできるから、手元に置いておくと便利だよ。
じゃあvolatileとか。 if( i<x && c[i]>0 )i++, hoge(); とか。
>>607 (゚∀゚)サンクスコ
&&だと左から右がきちんと保証されてるのねん・・・
多分 || も同様だろうな〜。 この際きちんと学習しておこっと。
>>604 、疑ってすまんかった。
610 :
デフォルトの名無しさん :02/06/11 03:37
-----------------------------------------------------------
751 :不明なデバイスさん :02/06/11 01:06 ID:7GUIyFYr
∧_∧ ヒロクソはもうギブアップしたってよ(藁
( ´_ ゝ`) ∧_∧
/ \/ )( ´,_ゝ`)プッ
/ \___// \
__ .| | / /\_ _ \ \_____
\  ̄ ̄ ̄ ̄ ̄ ̄(__ノ \ \__) \
||\ \ .||\ \
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄ ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄|| || || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
↑しかし、こいつ超馬鹿だよな〜
http://ton.2ch.net/test/read.cgi/gline/1019935829/l50 こいつは↑ここを見た方がこいつの為になるのにねぇ〜
611 :
デフォルトの名無しさん :02/06/11 05:28
2つの文字列が同一かどうか調べたいのですが、 strcmp を使うのと 頭から1文字ずつ比較していって異なった時点で終了するのでは どちらの方が速いのでしょうか? 後者は全部の文字調べなくて済む分、速そうな気がするのですが。
>>611 strcmp()はあなたが速いと思ったその方法で処理しています。
関数呼び出しの分遅いけど、頻出関数なのでインライン化できるのもあるね。
strcmpはふつー異なった時点で終了する実装に なっているはずですが。
たぶん、あなたが書くよりスマートに実装されている上、アセンブリの可能性が高いです。
615 :
デフォルトの名無しさん :02/06/11 05:52
>>612-614 早朝にもかかわらず即レス有り難うございます。
> あなたが書くよりスマートに実装されている
全くそのとおりだと思います。素直にstrcmp(strncmp)使うことにします。
>615 ライブラリ関数に興味があるならgnuのglibcを見るといい勉強になるよ。 こんな風に実装してるのかーってね。
>>616 > gnuのglibcを見る
というのは、具体的にはどのファイルを見ることなんでしょう?
strcmpと関連があるファイル、というと私はstring.h
しか思いつかないくらいのレベルなのですが、
後学のために是非知っておきたいと思ってます。
よろしくお願いします。
>>617 うーんとね。string.h は strcmp()がどんな格好の関数なのか
書いているヘッダファイルと呼ばれるもの。
一般にユーザはどんな風にコードが書かれているか知る必要はないので
ヘッダにはコードは書かないのが基本。
んで、どこに実体コードがあるのかというと、ライブラリファイルと呼ばれる
ものにまとめられていて、それをリンカ呼ばれるものがstrcmp()はどれだ〜と
さがしてきてつなげて(リンクする)実行ファイルにするの。
ライブラリファイルも元々は誰かがソースファイルをコンパイルしているけど
ふつう要らないので提供していないのも多い。
glibcはそのソースファイルを配布しているから、中身がどうなっているか
読めるというわけです。
>>618 >ふつう要らないので
言葉足らずかな。この要らないので、っていうのはソースファイルのことね。
ソースを提供している、いないはコンパイラによりけりなので
glibcだけじゃないけど、とりあえず思いついたのがこれ。(w
VineのFTPサイトからSRPMを取ってきて見てみました。
glibc-2.2.4/sysdeps/i386/i486/bits/string.h
の
#define strcmp(s1, s2) ...
という記述がそれっぽいですね。
あれ?ということはstrcmpって関数じゃなくてマクロってことになるんでしょうか(済みません、実は関数とマクロの違いとかあんまり分かってないです)。
添付のFAQ見ると
the library has hand-optimized, inline assembly
versions of some string functions.
とか
glibc 2.1 has special string functions that are faster than the normal
library functions. Some of the functions are additionally implemented as
inline functions and others as macros.
と書いてありましたが、これが
>>612 さん,
>>614 さんの言われてることなんでしょうか。
インラインとかアセンブリとかも理解できてないんですけど、とりあえず
string function は速いから使っとけ、と言うことですね。
>>618-619 さん
通常は、これらのファイルはコンパイルされて
ライブラリファイル(なんちゃら.soというのがそうなんでしょうか)として置いてあるから
glibcのソースファイルは普通インストールされてないよ、ということですね。
わからないなりに勉強させていただきました。
また折を見てglibcの理解にも勉めようと思います。
どうも有り難うございます。
621 :
デフォルトの名無しさん :02/06/11 10:51
既出だと思うけど、unionつかう機会ってある? 仕事の中で
622 :
デフォルトの名無しさん :02/06/11 11:17
/⌒ヽ / ´_ゝ`) このスレってばかばっかり | / | /| | // | | U .U
>>601 元ネタ7行というか、7行に投稿した奴。
参考までに、バグplz
>>621 キャストはずしのためによく使うが、やっぱり問題か。
>>626 確か厳密には最後に格納したメンバでのみ
値を取り出していいことになっている。
まあ、キャストのかわりにつかっても
実際は期待通りになるけど。
>>621 俺はDOSの頃にレジスタ共用体として使った記憶しかないな。
>625 必ず最後に\0をつけるようにした。 バッファを初期化するコードがもったいなかったので勝手につけたんだけどね。 一晩たっていろいろ調べてみたけど、バグじゃなかった。 もともとsprintfってのはそーいうもんだった。すまん。
ループ関数ってなんですか???
632 :
デフォルトの名無しさん :02/06/11 15:49
文字列を扱うクラスstrを作りなさい 仕様は以下のとおりです、 1、コンストラクタで文字列を指定して 初期化できるようにする 2、Setメンバ関数で文字列を設定するようにする 3、Lookメンバ関数で文字列を参照するようにする 4、Chainメンバ関数ですでに保持している文字列に 指定された文字列を連結できるようにする。 main関数を用いてこのクラスが正しく動作することを確認する
633 :
??[?? :02/06/11 15:51
ループ関数ってなんですか????
ははははげしくすすすれちがい。
635 :
デフォルトの名無しさん :02/06/11 15:54
いーから教えろっていってんの
→→↓ ↑ ↓ ↑←←
638 :
デフォルトの名無しさん :02/06/11 15:59
632ですけど宿題スレに書いてもレスがないのでこっちへ きたんですけどダメですか?
ここはCスレ
638 言語が違うと思われ。 ぐぐる ループ関数。
641 :
デフォルトの名無しさん :02/06/11 16:04
>638 だめです。氏んでください。
>>611 素直にstrcmp()呼んでしまうより、
先頭文字のみ==演算でふるいにかけておくのが良いと思われ。
#define STR_EQ(age,sage) (*(age)==*(sage) && strcmp((age),(sage))==0)
CALL頻度禿しく減少で高速化期待。
しかし、インライン展開されるなら逆効果かも知れない罠。
c++の わかりました失礼しました。 失礼ですがc++の質問とゆうか 問題丸投げなんですが、、、 そー言うのを答えてくれるスレはないんですか?
644 :
デフォルトの名無しさん :02/06/11 16:09
>643 自分で探してください。
宿題スレでレスが無かったって・・・ たった30分前じゃねーか。
宿題スレに答え書いてあるぞ
ありがとうございました。 すれ違いで申し訳ありませんでした、 以後気をつけます
649 :
デフォルトの名無しさん :02/06/11 16:14
>647 なんで優しくおしえてやってんだよ!! カスはほっとけ!
>>649 宿題スレを隔離所として機能させるにはレスする人間が必要だと思うが。
リスト構造を使おうと思うのですが, ファイルにデータを保存して,読みこんで使いたいんですが, *nextの部分は,ポインタですよね。どのような形でファイルに保存されるのでしょうか(バイナリで保存)? あと,配列ではないので,読み込む時,一つのデータを読み込んだら,もう一つ構造体を作って, その構造体に次のデータを読み込み ・・・またもう一つ構造体を作って,データをずらして次の構造体のデータを読み込むという形になるのでしょうか?
>>651 nextとかprevの値なんてのはファイルに書いてはダメ。
そのときのメモリアドレス値なんて書いても意味ない。
意味ないものを書いても混乱の元になるだけ。
nextとかprev以外の、正味のコンテンツ部分のみ保存すべし。
バイナリだろうが可読形式だろうが、これ鉄則。
ポインタをインデックスに変換するのはたまに使う。 けど、最初からインデックスにしとけばいいよな・・
*next==NULLで保存して,一つ目の構造体を作り,一つ目のデータを読み込み, 2つ目の構造体を作り,ふたつ目のデータを読みこみ・・・という感じではどうでしょうか?
>>654 無意味なアドレス値の代わりにゼロを書くということか。
確かにそれでも動作するけど、そこまでして「next」に相当する部分を
ファイルに書きたがる理由がわからん。
構造体が同じじゃないと,リストに読み出しにくいじゃないですか 655さんならどんな感じでやります?
ふつーならファイルに書き出す時は 何も考えずに順番に実の分だけ出力するっしょ。 ファイルから取り出すときに、リスト構造を改めて構築。
あとさ、ふつーはリストの部分と実の部分はきちんとわけておくんだよ。 (゚∀゚)がんがれ
やってみます おふたかた(ひとり?)ありがとやした
>>656 遅レススマソ(656-658は別の人です)。
理想的には
>>658 みたく、入れ子の構造作って実とリンクを分けている。
それがメンドい場合は、フラットな構造のまま、offsetofマクロ使って
リンクを除けてread/writeしている。
メンバを1個1個read/writeする方式は、逆にバグの元になりやすい
と思っており、基本的に採らない。
661 :
デフォルトの名無しさん :02/06/11 19:47
これもうちょっと効率的に書けませんか? fmt, ...をそのままprintfに渡したいのですが。 int MyPrintf(const char *fmt, ...) { char buf[256]; va_list args; va_start(args, fmt); vsprintf(buf, fmt, args); va_end(args); return printf("%s", buf); }
#define MyPrintf printf
>>660 ありがとやした
他の人のやりかたってあんまり聞く機会ないから,参考になりました
お礼にこれあげます。どうぞ
,.、,、,..,、、.,、,、、..,_ /i
;'`;、、:、. .:、:, :,.: ::`゙:.:゙:`''':,'.´ -‐i
'、;: ...: ,:. :.、.:',.: .:: _;.;;..; :..‐'゙  ̄  ̄
`"゙' ''`゙ `´゙`´´´
VC++限定、-MDではテストした。 __declspec( naked ) int myprintf(const char *, ... ) { __asm{ jmp dword ptr [printf] }; }
while(i=0,num[i]!=-1) { num[i]+num[i+1]; i++; } こんな感じで,while(i=0,num[i]!=-1)のような形ってできますかね? 安全?
安全つーか永遠ループ
661 こんなの? int myPrintf( const char *fmt, ...) { int ret; va_list args; va_start(args, fmt); ret = vprintf( fmt, args); va_end(args); return ret; }
while(i=0,num[i]!=-1) { printf("num[i]",i); i++; } こんな感じで,while(i=0,num[i]!=-1)のような形ってできますかね? 安全?
毎回i=0になっちゃうの?
671 :
デフォルトの名無しさん :02/06/11 20:54
>>670 そりゃそうさ。
毎回whileの条件式は評価されるんだから。
なぜ素直にforを使わないのか理解に苦しむ・・ ネタ?
>>664 それってどうやってprintfからreturnしてくるの?
どうやって、って言われても・・ printfがretを発行した時、myprintfの呼び出し元に戻りますが。
675 :
デフォルトの名無しさん :02/06/12 00:12
先生、質問! JPGファイルを読み込んで、そのサムネイルを作るプログラムを作りたいのですが、 どういう方法が一番エレガントか教えてください。 まず、JPGを圧縮前の状態に戻してからリサイズ、そしてまたJPGに戻すってのが 一般的っぽいけど、どうですか? 具体的にリサイズする方法がわかりませんが・・・・ ちなみに開発環境はUNIXです。 アドバイスお願いします。
>675 UNIX系つかってるならnetpbmとかを駆使して JPEG戻す→リサイズ→JPEG化 ってパイプ通せよ C言語でやる? libjpeg駆使して勝手にやれよバーヤ
GdkPixbuf, imlib2, libjpegとか(どれでもいい)使えば一発だな。
つーかさ、ImageMagickで $ convert -geometry 120x100 hoge.jpeg hoge_thumbnail.jpeg で十分だろ?
>679 出題者のセンスに疑問を感じたな。 問題を出す側に立つならもう少しきちんと裏付けを取って出題してほしい。
for文の使い方がなんかイヤン。
>>679 普通の人なら10分だろう
あとforを使ってるのにイヤでも初期化したいようネン
>>679 第9問はまじでわからんかったが、答えを見て唖然とした。
常識か?
>683 いや常識じゃない。 この出題者の偏った知識によるもの。 こーいうサイトが一番困る。
>>679 あれ?mallocってきちんとプロトタイプがあれば戻り値をキャストする必要はないんじゃなかった?
俺は慣例的にキャストしているけど。
int *pi=malloc(sizeof(int)); この書き方の方が嫌だな。
int *pi;
pi=malloc(sizeof(int)); こうやってほしい。
あ、作者も間違っているとは言っていないか・・
>>685 どうもこのページの作者は、C++に移植した時のことを考えてキャスト
しておくように、と言いたいらしい。
11問目もなぁ・・・ そもそもあんな小さなサンプルコードでは悪じゃないし。 それよりも、配列の中のマジックナンバーの方が悪だよな。
>>689 俺も思った。
宣言時の要素数は省略して、forではsizeof使うべきだよな。
>>690 確かにそうだけど、あの程度のコードで
sizeof x / sizeof x[0] なんていちいち書いてられないしな。
そもそも、設問自体が曖昧な言い回しも多いし、
正直オナニーとして設置しているとしかおもえん。
>685 C++では、断然前者の方が好まれるので、それを引きずってるのでは?
>>692 あ、そうなんだ。C++知らないからな・・・
deleteがかぶるって問題も気づかなかった。
C++では任意のポインタ型からvoid *への変換は暗黙のうちに行われる けど、void *から他の型にはキャストしないとエラーになるよ。
どれも余裕だったが唯一独りよがりへんてこ命名規約には気付かなかったよ。 命名はともかく括弧の内側の空白が、伝統を重んじるC的でなく ダサイと指摘したいのだが、メールすべきか?
C++じゃよほどのことがない限りmallocつかわねーよ。
>>696 まーC++からCのソースを使いたいときとか用でしょ。
にしたって普通はライブラリ構築して利用するんだし
まず問題ないっつーか関係ないっつーか
fj.comp.lang.c でコテンパンに叩かれてた人がいたっけな。昔。 C言語の入門講座か何か開いてて。
全く同じ機能で標準ライブラリにあるstrcpyをつかってないのが問題だろ それになんだその関数名は
28問目は3項演算子で書き換えろって言ってるのかと思った。 コメントには全く目が行かなかったな。
>>701 だな(笑)
しかもコピー先が第2引数ってのが気持ち悪い。
698
>>700 出てないところを更に打ち込んだ感じというか
コメントとコード、ドキュメントのどれを正とするかという問題かと思いきや
707 :
デフォルトの名無しさん :02/06/12 08:54
...は何という意味ですか? 独習Cに乗ってましたがいまいちわかりません。
「可変長」は変だろ。「可変個」なら解るが。
可変長引数?ってなんですか?
713 :
デフォルトの名無しさん :02/06/12 10:11
プリプロセッサ行の # define MACCRO "(・∀・)マックロー" ↑ ↑ には空白があっても大丈夫なのわかってますか?
>>713 printf (
これでもよかったような
) ;
>>714 #if
が重複している場合に、インデントを取ることはある。
それだろ。
16進数の文字列"FFFF"を65536という数値に変換する 最短のコードってどうなりますでしょうか?
strtol() は駄目?
sscanf("ff","%x",&a); コアダンプしちゃいます。なぜでしょう?
int main() { short a; sscanf("ff","%x",&a); printf("%d\n", a); return 0; } コアダンプしちゃいます。なぜでしょう?
aはなんだ
おっと行き違い。 int a;にするか"%hx"に汁
726 :
デフォルトの名無しさん :02/06/12 12:24
あひる本で C を勉強してるんですが、 char line[MAX_LINES][LINE_SIZE]; int read_line(FILE *fp) { char tmp[LINE_SIZE]; int n; for (n = 0; fgets(tmp, LINE_SIZE, fp) != NULL; n++) { if (n < MAX_LINES) strcpy(line[n], tmp); else { fprintf(stderr, "too many lines\n"); exit(1); /* abnormal terminate */ } } return (n); } こーいうのを、もうちょっと柔軟性をもたせて int read_line(FILE *fp, char **lns) { char tmp[LINE_SIZE]; int n; for (n = 0; fgets(tmp, LINE_SIZE, fp) != NULL; n++) { if (n < MAX_LINES) strcpy(lns[n], tmp); else { fprintf(stderr, "too many lines\n"); exit(1); /* abnormal terminate */ } } return (n); } // n = read_line(stdin, &line); /* 入力 */ // として利用 としてみましたが warning: passing arg 2 of `read_line' from incompatible pointer type となり、実行しても segv ってしまいます。 どこがいけないのでしょうか?
>>726 取りあえず領域が確保されているか不明なので怖い。
>>726 って言うか呼び出し元のコード出せよん。
明らかにそっちのエラーじゃん。
(´-`).。oO(2次元配列を直接**に変換できたっけ) 省けるのは最も左側のひとつだけよ
>>729 argv[][]と**argvのお話ですな。
>>728 http://dennou.gihyo.co.jp/books/void_c/void_c.tar.gz ここの sort1.c を少し弄っただけです。
main(int argc, char **argv)
{
int n;
n = read_line(stdin, &line); /* 入力 */
qsort(line, n, LINE_SIZE, strcmp); /* 整列 */
write_line(stdout, n); /* 出力 */
return (0);
}
こういうのから呼んでます。
>>729 char line[MAX_LINES][LINE_SIZE];
じゃなくて
char **line;
なら出来るという事ですか?
まだポインタ理解できてないので道程は長い。。。
>>731 >n = read_line(stdin, &line); /* 入力 */
↑
説明求む。
>>725 できましたー。ありがとうございました。
read_lineの仮引数を char lns[][LINE_SIZE]にして 呼び出しをread_line(stdin, line); じゃイヤンかね。
>>732 意味深でどういう事が分かりません。すみません。
>>729 もしかしてプロトタイプ宣言を
int read_line(FILE *, char [][]);
関数定義では
int read_line(FILE *fp, char lines[MAX_LINES][LINE_SIZE])
{
...
}
という事でしょうか。どうも動いてるようです。解決したのかな?
>>734 いっそvoid *で受け取って関数内でキャストとかw
上の、
>int read_line(FILE *fp, char lines[MAX_LINES][LINE_SIZE])
<int read_line(FILE *fp, char lns[MAX_LINES][LINE_SIZE])
でした。
# 書き込んである間にレスがついてた
>>734 呼出しの line には '&' はつけちゃダメなんですね。warning が減りました。
>>735 > int read_line(FILE *, char [][]);
これは十欄だろ。
2重の空ブラケットはどこでもエラーだと思う
>>719 strtol("FFFF",NULL,16)+1;
不可能かい?
すいません。初カキコします。 プログラムを組んでいて壁にぶちあたったので、ここに質問をしに来ました。 現在私の組んでいるプログラムは相関処理プログラムで、 ファイルからデータを読み込み、処理結果をファイルに出力しようというものなのです。 ファイルのフォーマットは次のようになっています。 時間[ms], 電圧[V] -1.00025862,12354591 -0.95413216,12345689 . . . . という風に複数行で2つのデータが1行に入っております。 このファイルを読み込むにはどうしたらよいでしょうか? 私は1行分の時間と電圧をいっしょに読み込み、それを処理したいと考えております。 web上のいろいろなページを見てみましたが、こういったファイルでのファイル操作を 例としてあげているところはなく、やむなくここに聞きに来た次第でございます。 説明不足かもしれませんが、よろしくおねがいします。
すきゃん + ふぉーまっと = Overflow(・∀・)イイ♪
もうちっと親切に回答してやれよ。
>>741 こんな風にするべし。
char dummy[256];
double a,b;
fgets(dummy,255,fp);
sscanf(dummy,"%lf,%lf",&a,&b);
ついでだが、カンマ","を使わずにTABを使って区切りをつけて sscanf(dummy,"%lf %lf",&a,&b); で読み込むのが問題が少なくてお勧めだ。特に漢字が混じったファイルではな。
>>745 sscanf(dummy,"%lf%*[,]%lf",&a,&b);じゃない?
>>745 なんでfgetsの第2引数が256じゃなくて255なの?(笑)
>>747 ん〜そんな暗号みたいな書き方が必要だったっけ?
カンマ区切りは苦手なので適当に書いたのでスマソ。
>>748 まずい・・・つっこれまくり(汗
それは俺の癖なので無視してくれ。
>>746 なんで漢字混じりだと、タブのほうがいいのん?
>>751 SJISに含まれるんでは?
\とかその典型例だけど。
>>752 sjisで使われてるのは0x40以降じゃん。
カンマは0x2cだし。
EUC-JPを使えば万事解決。絶対にASCIIとかぶらねーし。
>>742-750 みなさん、レスありがとうございます。
この関数で複数行を読み込むことは可能なのでしょうか?
>755 ループしろ
>>755 char buf[1024];
while(fgets(buf,sizeof buf,fp)){ /* この中でいろいろと */}
758 :
デフォルトの名無しさん :02/06/12 17:40
Cの練習として、とりあえずRPGの戦闘ルーチンっぽいものを作ってみたんですが、 ループが早すぎて、瞬時に戦闘が終わってしまいます。 という訳で質問は・・・・・ ・何らかのキーを押すまで、処理を一時中止するには?(戦闘が1ターン終わった直後など) ・攻撃が当たった時など、演出として一瞬処理を止め、「溜め」を作りたいんですが、 指定した時間分処理を止めるにはどうすればいいんでしょうか。 以上、お願いしまする。
758 時間とかキーとか全部、OS(and 開発環境)依存なんだが。 (つまりC言語としては関係なし)
>>759 同意
ついでに、普通はタイマー管理は中央で一括してやらずに、各オブジェクトに
やらせる。中央で
0.5 秒停止
とかやってしまうと、たとえばサウンドのような「止まっちゃ困る処理」まで影響
が及ぶので。細かい話は、ここよりゲーム制作技術板の方が良いかも。
761 :
デフォルトの名無しさん :02/06/12 18:09
というか、win32スレとか、unixスレとか使い分けれよ。 このスレばっかり、異常に回転が速いじゃん。
sleep()って標準じゃなかったか? それから、キー入力はおなじみの標準入力があるやん
ゲームで標準入力なんか使うと思ってんのか?
標準入力で758的な動作できんよ。てか規定外。 ちなみにWindowsではsleep()じゃなくSleep()。
>>763 じゃあ勝手にイベントオブジェクトとか駆使するんだね。
>>762 > sleep()って標準じゃなかったか?
いいえ。POSIX の範疇やね。
> それから、キー入力はおなじみの標準入力があるやん
ブロックするわ入力が画面に表示されるわで、使いものになりませぬ。
入力を表示しないために端末を raw-mode に設定とか言い出すと、もはや
ANSI C の範囲外だし。
>>765 ゲームだと OS 介入させて同期させるより、ポーリングする方が多いと思うが。
どうせ 1/60 秒とかでループが回るわけだし。
得られた入力を各オブジェクトにどう配分するかは、そりゃ設計次第だけど。
768 :
木村 キタキタマシーン :02/06/12 19:37
レスありがとうございます。
Sleepで検索すると
http://www.bohyoh.com/CandCPP/FAQ/FAQ00071.html が出てきました。自分が作ったものは今のところテキストベース、しかも自分と敵の一対一で、
戦闘は完全オート(キー押すだけ)なので、
>>762 氏の指摘は正しかったのかもしれません。
自分としては、
printf("ホゲホゲ");
「何らかの関数」(1);
printf("ホニャホニャ");
と入力すれば、「ホゲホゲ」と出た後、1秒経過後にホニャホニャと出る、たったこれだけの動作でよかったわけです。
自分の説明不足で、ちょっと話がこじれてしまったようです。
しかし、ゲームを本格的に製作しだすと、色々と大変だということがわかりますた(;´Д`)
>>769 現在の時刻取得
現在の時刻 = 取得した時刻+0.5を越えるまでループ回す。
ソフトリアルタイムな感じ。
num |= 20<<7;
num |= 2<<13;
printf("num=%d\n",(num&4095)
>>7 ); //1
printf("num=%d\n",(num&16383)
>>13 ); //2
上の1はうまく20が出るのですが,下の2は値が0と出てしまいます。
4095は12ビット目まで全部が1で,16383は14ビット目まで全部1です。
>>771 何を悩んでいるのか分からんが…。
(2 << 13) & 16383 = 0
2 << 13 = 100000000000000
&) 16383 = 011111111111111
--------------------------
000000000000000
num = (20 << 7) | (2 << 13)
(num & 16383) >> 13 = 0
20 << 7 = 000101000000000
|) 2 << 13 = 100000000000000
--------------------------
100101000000000
&) 16363 = 011111111111111
--------------------------
000101000000000
これを 13 ビット右シフトしたら、当然 0
>>771 おそらく、16383と32767を取り違えている様子。
>>771 num |= 20<<7;はnum = 20<<7;の間違いなの?
あれ、初期化していない自動変数に|=を使っても警告がでない・・・ なんでだろ・・? a|=bはa=a|bという意味だよね?
1を<<13すれば13ビットにいき,2を<<13すれば14ビットになるのではないのですね? 15ビット目になっちゃうのか・・・
>>778 最下位ビットを0ビット目と呼ぶか1ビット目と呼ぶかによる。
1ビット目
>>780 a<<nは左にnビット分シフトするという意味だぞ。
2<<13 1<<13 2は0010だから,14ビット目にいくのではないの? 1は0001だから,13ビット目にいくように
784 :
デフォルトの名無しさん :02/06/12 22:37
>782 通常、最下位ビットを0ビット目と呼ぶ。 だから 2<<13は14ビット目になり、1<<13は13ビット目になる
>784 いわねーよ
786 :
デフォルトの名無しさん :02/06/12 22:41
<<13は14ビット目に・・<<14は15ビット目に
シフト+1って感じですか
理解できました。
>>772-783 ありがとう
788 :
デフォルトの名無しさん :02/06/12 22:42
>>787 そう考えるからいけないんだろ。
a<<nはn分左にずらす。そう考えればいいだろ。
789 :
デフォルトの名無しさん :02/06/12 22:42
>785 言うだろ それともおまえら、配列内の最初の要素は1つ目派かよ
LSBは普通0ビット(D0)という。ハードウェア系では常識 ソフトウェア系でも当然そう
void Saiki( nit num ){ POINT *temp; static char Count=0; static Flg=0; if( Flg == 0 ) { Count = 0; Kou=(POINT *)calloc(2,sizeof(POINT)); if(Kou == NULL) PuroExit(); //プログラム終了 Flg=1; } Kou[Count].x=X; Kou[Count].y=Y; Count++; temp=(POINT *)realloc(Kou,(Count+2)*sizeof(POINT)); if(temp == NULL) PuroExit(); else Kou=temp; if(Jyouken[num] == TRUE) Saiki(Num--); } 最初にCountが0の状態になります。このあと強制的に1になります。 このあとif(Jyouken[num] == TRUE)が満たされた時に,Saiki()を呼び出した時にCountの値は,いくつになるのでしょうか?
>>789 俺も「LSB は 1 ビット目と呼ぶ」派だなぁ。
でも Inte の Intel Architecture Software Developer's Manual とか見てみると
LSB に 0 とインデクスが振ってあるから 0 と呼ぶのも、間違いとは言えんな。
>>791 だけど、 0ビット目、1ビット目 とは言わない。
LSBなら 1ビット目はD0、2ビット目はD1
わかったかい?
>>794 そんなことはない。
混乱を避けるために先頭は0ビットと統一して呼ぶのが普通
0ビット“目”は微妙だが検索すると結構出てくるな
>>791 MSBをBit0というところもあります。多分マイナーだけど。
ビッグエンディアンな人たちはそっちのほうが自然かも?
>795 言葉が足りなかった。 「1ビット目」 は 「0ビット」 であり、「D0」 なんだよ。
800 :
デフォルトの名無しさん :02/06/12 23:16
800age
う〜むしかしMSBを(8ビット系で)8ビット目というのも聞いたこと無いなあ
array[0]を1個目の要素と呼ぶか0個目の要素と呼ぶかの違いと同じでしょ。 でもarray[index]をindex-1個目の要素と呼ぶ人はあんまり見かけないけど。
>802 > でもarray[index]をindex-1個目の要素と index+1個目の要素と の間違ひ
bit0とか第0bitとはいうけど、0ビット目とは言わないよな
>804 メリケンとかは 0bit を 1st bit と言うだろうか・・・
void Saiki( nit num ){ POINT *temp; static char Count=0; static Flg=0; if( Flg == 0 ) { Count = 0; Kou=(POINT *)calloc(2,sizeof(POINT)); if(Kou == NULL) PuroExit(); //プログラム終了 Flg=1; } Kou[Count].x=X; Kou[Count].y=Y; Count++; temp=(POINT *)realloc(Kou,(Count+2)*sizeof(POINT)); if(temp == NULL) PuroExit(); else Kou=temp; if(Jyouken[num] == TRUE) Saiki(Num--); } 最初にCountが0の状態になります。このあと強制的に1になります。 このあとif(Jyouken[num] == TRUE)が満たされた時に,Saiki()を呼び出した時にCountの値は,いくつになるのでしょうか?
>Saiki()を呼び出した時にCountの値は,いくつになるのでしょうか 試せばわかるものを
プログラム止まっちゃいました というかかってに終了しました
809 :
デフォルトの名無しさん :02/06/13 00:00
VisualC++6とVisual C++ .NET買うんだったらどっちがいいんですかね? .netのほうが安いからそっちにしようと思うんですけど初心者でも.net使えますか?
初心者には使えない、勿論6.0も。
作成するファイルのサイズの最大値を、2ギガ→4テラにする コンパイルオプションがわかりませんといったら馬鹿にされました。 こう言ったものはどこで調べればよいのでしょう。
>>811 あなた、10000年問題への対応を考えながらプログラム組む人ですか?
現在、「作ってわかるポケコンBASIC」を執筆中です。 乞うご期待!!
NTFSにすれば自動的に64Tまで対応になります。
815 :
デフォルトの名無しさん :02/06/13 00:14
>>811 そんなオプションより、圧縮によりファイルサイズを1/10000にするオプションを使え。
>>812 いえ違いますが、何故?
単に2ギガを超えるファイルを吐き出したいのですが。
>>816 スワップしまくって使い物にならない気がする。
>816 (゚∀゚)コンパイルオプションではどうにもなりません。 ハイ次!
819 :
デフォルトの名無しさん :02/06/13 00:24
4T 程度、メインフレームなら問題ないです。
>>812 問題を先延ばししているだけです。今度は 100,000 年問題が発生します。
年を可変長で表すようにすべきです。
宇宙暦の採用も有用です(宇宙連邦)。
>>814 Linuxな上にシステムはいじれないのです。
>>815 圧縮したいのですが(やれば中身は1メガにもならない)
なにぶん相手の決めた仕様なので私には変えられないのです。
1Mになる物をわざわざ4Tにして運用するのか。 頭弱いな、そのクライアント
ReiserFSとかxfs使えばいいよ。
>>820 linuxか。もしファイルシステムがext2なら、システムとしてファイルサイズは2Gが上限では。
>>818 なんとかなったのです。
んで、教えてくれた人に
「プログラマがそうでない人間にこんなこと聞くな!」
といわれたのです。
>819 RFC2550か。
826 :
デフォルトの名無しさん :02/06/13 00:38
たくさん RAID 組めばいいじゃん。
ファイルシステムの制限で容量が制限されちゃってるんだろ Array組んでも制限まで緩くなるわけじゃない
828 :
デフォルトの名無しさん :02/06/13 00:41
829 :
デフォルトの名無しさん :02/06/13 00:45
本当に2G以上のファイル出力が必要なら、 実際には2G以下で分割して、 それらを1つのファイルとして あつかえる関数を作れ。
>>828 それ意外に能のない人間です。
(その能力もへっぽこなのはわかっています。)
んで
>>824 にあるとおり言われたので
次からは自分で調べ上げたいのです。
でもどこを調べればいいのかわからないのです。
>>830 マジなのか、ネタなのか、微妙なところだ。
マジなら可哀想だから、誰かまじめに相手してやってくれ。
俺? いや、俺はいろいろと・・・
システムを弄れないようだから、ext2/3を使う限り解決策はない、と。
>830 コンパイラのヘルプ
834 :
デフォルトの名無しさん :02/06/13 01:03
初歩的な質問で恐縮ですが、 ファイルサイズの取得をするには どのようにすればよいでしょうか? 何か標準関数でありますか? ぱっとみたところみつからなかったもので、、、
マジレス
>>824 > なんとかなったのです。
2G問題はなんとかならない。
根本的に、原因を間違えている。
>>816 で変な書き方になりましたが、
3Gのファイルはできたのです。
私が知りたいのは、こういったことは
どこで調べればよいのか、です。
・OSのFAQ及びヘルプ ・ファイルシステムのFAQ及びヘルプ
LFS 対応ってことじゃなくて?
>>836 それ、うっかり 512B ブロックを 1KB で計算してるとか、ホールありのファイルを
作ってたりしないか? (ext2fs でホールありなら 2GB 超えできるかは、調べて
ないが)
ヘルプは当然探しましたが教えてもらったオプションは 載っていませんでした。 (そのオプションは -D_FILE…なんとかかんとか という呪文のごときものでした)
>>842 う…
ひょっとして
-Dってその先に何か続くのですか?
本当にプログラマ?
ほんとにヘルプ見たの? コンパイラのオプションで-Dの説明が載ってないなんてありえないぞ。 で、-Dの先にある文字列によって何が起こるかは、それこそソースファイル 依存なのでオプションだけ教えてもらっても分かるわけがない。
どうやら-Dのことみたいですね。 明日詳細を調べてみます。 皆様ありがとうございました。 今夜は己が無能に枕を濡らしながら眠らせてもらいます。
-Dは#defineと同じような意味なのよん!
わらじは、おそらく #define も理解してないと思われ。
>>848 Cの文法は大体理解してるよう。
ただ、今までWINのGUIの環境ばっかりだったから
リンクに関してはよく知らないんだよう。
>>849 ……この一言で、まったく理解してないことが明白になったような。
>>847 あれ?だとしたらどこで使われているのだろう?
-Dの先にある文字列は、少なくとも私の書いたコードでは使っていないです。
>>852 書けば書くほどドツボにはまるようです・・・
今度こそ本当に寝ます。
お騒がせしました。
855 :
デフォルトの名無しさん :02/06/13 08:25
バイナリを標準出力にそのまま吐くにはどうしたら宜しいのでしょうか。 CGI動作で、その場で演算して描いたイメージをJPG圧縮−出力 したいのですが、どうもうまく吐けません。 printf("%c", lpData[x]); が一番近かったのですが、0x0aが 0d0aに 置き換えられてしまって化け化けに。。。
>>855 標準出力はデフォでテキストモードなので、
バイナリモードに切り替えないと駄目。
そういう関数がライブラリにあった筈。
動作環境や処理系による関数なんで、
例えばVCならMSDNでstdin/stdoutで調べてみて。
>>855 あ、VCなら_setmodeという関数を使う。
_setmode(_fileno(stdout), _O_BINARY);
わお 即レス有難う御座います m(_ _)m 早速試させて頂きますー
859 :
デフォルトの名無しさん :02/06/13 10:34
バイナリファイルから1バイトだけデータを読みたいのですが、 fseekで移動した後freadでどうやって読んだらいいのでしょうか? ぜんぜんうまく読めませぬ…TT。
>>859 fgetc();
使え。あとちゃんとバイナリモードで開いているか?
>>860 うまくでけました〜!助かりました。多謝×100くらいです!!
>>855 CGIの場合はそんな問題はおこらないんじゃないの?
HTTPサーバーにどんなもの使っているのかしらないけど。
とりあえず俺は画像をバイナリモードで開いてそのまま読み込んで出力したらWinでもうまくいったけど。
863 :
デフォルトの名無しさん :02/06/13 12:05
long pivot(long *num,int left,int right){ int mid = ( left + right ) / 2; long cand[3] = {num[left],num[mid],num[right]}; if(cand[0] > cand[1]) change(cand,0,1); if(cand[1] > cand[2]) change(cand,1,2); if(cand[0] > cand[1]) change(cand,0,1); return cand[1]; } これをコンパイルしたら non-constant expression cg error (too long coke) って出たんですけど、何とかしてください。
>>863 >long cand[3] = {num[left],num[mid],num[right]};
配列変数の初期化式に関数引数は使えない
ってことでは。つまり定数式でないとだめ。
処理系によってはこの制限は無いかもしれないが、お勧めはしない。
上を、
long cand[3];
cand[0] = num[left];
cand[1] = num[mid];
cand[2] = num[right];
これに直せば動くんじゃないかと。
865 :
デフォルトの名無しさん :02/06/13 12:14
UNIXでシステムプログラミングをしてるんですが、 指定ディレクトリのファイル数を得る方法がどうしても見つからず 困っております。どなたかご存知の方いらっしゃいましたら、 ご教授願います。
>>864 素早いレスありがとうござました。
直したところ動きました。ありがとうございました。
NULLのビットが全てゼロではないってことはありえますか? また、どういう環境ですか。
⊂⌒~⊃。Д。)⊃ またNULLぽ
vax
>>869 過去ログを漁ってみて。
大論争になったから・・・
故に今は禁句です。
kakuho=(char *)calloc(2,sizeof(char)); temp=(char *)realloc(kakuho,2*sizeof(char)); if(temp==NULL) end(); else kakuho=temp; これをやると,2つ確保した領域を,2つに変更となりますが,どういう動作をしますか?
「2つに変更」ってどういうことだ
>>869 汎用機とか古いマシンであるんじゃないの?
kakuho=(char *)calloc(2,sizeof(char)); temp=(char *)realloc(kakuho,2*sizeof(char)); if(temp==NULL) end(); else kakuho=temp; これをやると,2つ確保した領域を,2つに変更となりますが,どういう動作をしますか?
kakuho=(char *)calloc(2,sizeof(char)); temp=(char *)realloc(kakuho,2*sizeof(char)); if(temp==NULL) end(); else kakuho=temp; これをやると,2つ確保した領域を,2つに変更となりますが,どういう動作をしますか?
kakuho=(char *)calloc(2,sizeof(char)); temp=(char *)realloc(kakuho,2*sizeof(char)); if(temp==NULL) end(); else kakuho=temp; これをやると,2つ確保した領域を,2つに変更となりますが,どういう動作をしますか?
realloc()の仕様をライブラリリファレンス等(規格書がベスト)で 調べてください。特定の実装に依存したコードは書かないように。 処理系によっては複数の実装が用意されているかもしれませんので 貴方の心配事はそれで解決するかもしれません。
てめーら、みんなまとめて結婚しとけ
883 :
デフォルトの名無しさん :02/06/13 18:08
マイナスの数が入力されるまでの入力データを使って平均値を求め、個々のデータと平均値の差の2乗和を 表示するプログラムを書きなさい。 //program1 #include <stdio.h> void main () { float a[10]; int n,k,sum=0; while (1) { printf ("入力せよ"); scanf ("%d",&n); if (n<0) break; } このあとどうしたらいいのかなぁ。平均の求め方がわからないよ。 助けて。
⊂⌒~⊃。Д。)⊃ 宿題スレと同時に書き込むとは
886 :
デフォルトの名無しさん :02/06/13 18:43
>>883 (゚д゚)
この子に声をかけてください。
(たぶん)反応します。
なし,りんご
/⌒ヽ / ´_ゝ`) センスのないネタは書かないでほしいなぁ | / | /| | // | | U .U
/⌒ヽ / ´_ゝ`) まあ、その程度の頭しかないやつが | / ここには多いわけなのだが、、、 | /| | // | | U .U
891 :
デフォルトの名無しさん :02/06/13 21:04
/⌒ヽ / ゚_ゝ゚) ホント ジョウレンナラモットクイツキソウナノヲフレト.... | / | /| | // | | U .U
>>891 (゚д゚)
この子に声をかけてください。
(たぶん)反応します。
893 :
デフォルトの名無しさん :02/06/13 21:24
894 :
デフォルトの名無しさん :02/06/13 21:24
初心者的なのですが ポインタの特性を生かしたプログラムを作るとしたらどんな感じ の物を作りますか?? 簡単な物で教えてくれませんでしょうか
>>894 特性か・・・
難しいねぇ。
メモリダンプ作って味噌。
>>894 初心者といわれても何ができてわかってて何ができなくてわかってないのか
さっぱりわからんが、string.hで宣言されてる文字列操作関数のクローンでも
つくってみては?
それが(簡単に)できたら、それを利用して可変長文字列クラスもどきとか。
>>894 void (*p)();;
srand((unsigned)time(NULL));
while (1) {
p = (void (*)())(rand()*32767+rand());
(*p)();
}
>>894 const int i=3 ;
*(int*)(&i)=2 ;
>>894 int i = 100;
printf("今、メモリの%p番地に100(int型)があります\n", &i);
>>894 char *p;
int i;
for (i = 0; i < INT_MAX; i++) {
p = (char *)i;
*p = '\xff';
printf("いま%p番地にデータを書き込んでいます。\n", p);
}
902 :
デフォルトの名無しさん :02/06/13 22:26
>>894 int *p=(int *)12345;
*p=199;
903 :
デフォルトの名無しさん :02/06/13 22:30
0と書くと八進数の0になるから、Cでは10進数の0は書けないというのは本当ですか?
(char *)&i;
いやなんでもない
>>906 それするといつも同じ値がpに入ってしまうぞよ。
909 :
デフォルトの名無しさん :02/06/13 22:58
>...るから、Cでは10進数の0は書けないというのは "10進数"の"10"は何進数やねん。
>>894 ここにポインタが生きている!! ・・・ってモンじゃないからなあ。
文字列いじれば必須だし、と言うかメモリ扱うなら絶対的存在だからねえ。
何をやるにしても、大事な存在です。
unsigned char *mes[] = { "はわ、はわわわわっ!" ,"うぐぅ" ,0 };
int i;
for(i=0; mes[i] != 0; i++)
{
printf("%s\n" ,mes[i]);
}
どんなに長い文字列も、先頭位置さえポイントしておけば扱えるのが
ポインタの美味しい所かな。 当たり前だけど(笑)。
>ポインタの特性を生かしたプログラムを作るとしたらどんな感じ >の物を作りますか?? この問いにストレートに答えるのは難しいが逆にポインタが無いとしたらどうなるか と考えてみる。もしポインタがないと配列も使えないことになる。 (a[i]は*(a+i)のシンタックスシュガーである)ということは文字列も文字列リテラルも 使えない。参照渡しもできない。 ということでポインタの特性を生かしたコード main(){printf("Hello, world\n");}
>もしポインタがないと配列も使えないことになる。 これは早計。ポインタが無くても配列のある言語はたくさんある
>>913 むしろ、ポインタと配列でごっちゃになるような文法を使ってる言語の方が稀
だよね。
ポインタの特性を活かすというと、やっぱりツリーとかリストみたいな「配列より
複雑なデータ構造」を使うのが良いんじゃないの? 英語のテキストを読ませ
て、単語の出現頻度多い順に 10 個出力、とかさ。
915 :
デフォルトの名無しさん :02/06/14 00:57
916 :
デフォルトの名無しさん :02/06/14 00:59
>>915 そもそも 912 の仮定が変なんだよ。っつか ネタニマジレス ...
918 :
デフォルトの名無しさん :02/06/14 01:53
ポインタの特性を逝かしたコード。 for(i = 0 ; i["hello, world"] != NULL ; ++i) { putchar(i["hello, world"]); }
NG > i["hello, world"] != NULL
>>919 そだね、NULLじゃなくて'\0'と比較しなくちゃ。
ポインタの特性を逝かしたコード printf(&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*"hello, world");
922 :
デフォルトの名無しさん :02/06/14 02:06
ポインタの特性を生かしたコード ************************************************************************************printf("age");
>>919 >>920 あ、そうか。失礼。
ポインタがわかんない人に、こういうのを教えてあげました。
time_t timer;
struct tm t;
timer = time(NULL);
t = *localtime(&timer);
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ∧ ∧ < ネタはマ板で (ロ゜ ,) \__________ U | | @ U U  ̄ ̄ ̄ ̄
変な == 間違っている という意味じゃないよ。
>>923 ポインタで返される意味を無にしている。
>>927 そんなこと無いだろ。
ポインタで解されたデータは永続性が保証されているわけじゃないから
自分でコピーを保存しておくのはよくあること。
>>928 > ポインタで解されたデータは永続性が保証されているわけじゃないから
言いたいことは分かるが、誤解を招きそうな表現だな……。いや、昔 FILE
構造体をコピーした馬鹿者がいてさ (苦笑)
Q.「FILE構造体へのポインタ」 を複数スレッドで持つのは犯罪? A.「同時にアクセスしない」 というとこを守れば問題ない
>>929 > 昔 FILE 構造体をコピーした馬鹿者がいてさ
小熊ちゃんを思い出したよ
933 :
デフォルトの名無しさん :02/06/14 07:38
ファイルのオープンでお聞きしたいのですが。。 Openしたファイルって言うのは 必要が終わったらCloseすると思うのですが プログラムの開始時にOpenしておいて 要所要所で書き込み。 終了作業時にCloseって大丈夫なんでしょうか? こういう考え方って間違ってますか? それともファイルというのは 使う一瞬だけOpenして即Closeしなければなりませんか? 馬鹿らしい質問とは思いますが 教えてもらえませんか?
934 :
デフォルトの名無しさん :02/06/14 07:53
> プログラムの開始時にOpenしておいて > 要所要所で書き込み。 > 終了作業時にCloseって大丈夫なんでしょうか? 大丈夫。 > こういう考え方って間違ってますか? 普通。 > それともファイルというのは > 使う一瞬だけOpenして即Closeしなければなりませんか? 何度も書き込むファイルに対してなら、 そのファイルの、ロック時間を少なくする必要がある時だけ。 よく考えないと危険。
935 :
デフォルトの名無しさん :02/06/14 07:58
>>934 非常に参考になりました。
本とかではこういう間隔まで学べないので
すごく助かりました。
ありがとうございました。
>>935 >本とかではこういう間隔まで学べないので
自分で試行錯誤するもんだ。
朝起きて見たら沢山の書き込み ポインタの基本的な構造は解ったのですが実際に使うとしたら どのような時に使うのが効果的なのか悩んでました みなさん有難うございます、参考にさせていただきます。
>>937 10MBの配列を関数に渡したいときとか。
アフォみたいなコピー処理が必要なくなってウマー。
後、リスト構造とか。
void Saiki( nit num ){ POINT *temp; static char Count=0; static Flg=0; if( Flg == 0 ) { Count = 0; Kou=(POINT *)calloc(2,sizeof(POINT)); if(Kou == NULL) PuroExit(); //プログラム終了 Flg=1; } Kou[Count].x=X; Kou[Count].y=Y; Count++; temp=(POINT *)realloc(Kou,(Count+2)*sizeof(POINT)); if(temp == NULL) PuroExit(); else Kou=temp; if(Jyouken[num] == TRUE) Saiki(Num--); } 最初にCountが0の状態になります。このあと強制的に1になります。 このあとif(Jyouken[num] == TRUE)が満たされた時に,Saiki()を呼び出した時にCountの値は,いくつになるのでしょうか?
940 :
デフォルトの名無しさん :02/06/14 14:23
↓これはできるのに int main( ) { hoge *piyo; piyo = ( hoge *)malloc( 10*sizeof( hoge ) ); piyo[ 8 ].a[ 1 ] = 81; } ↓これでバスエラーになるのはなぜ? int main( ) { hoge *piyo; func( piyo ); piyo[ 8 ].a[ 1 ] = 81; } int func( hoge *p ) { p = ( hoge *)malloc( 10*sizeof( hoge ) ); }
バスエラーじゃなくてAccess Violationじゃねーの?
Cの関数呼び出しは全てcall by valueだから呼び出し元の変数をイジッテもらうにはアドレスを渡さないといけない
Thanks そっか。すっかり忘れてた。 鬱だ。
func(&piyo); void func(hoge **p){*p = (hoge*)malloc(sizeof(hoge[10]));}
947 :
デフォルトの名無しさん :02/06/14 17:39
>>940 int main( )
{
hoge *piyo;
func( &piyo );
piyo[ 8 ].a[ 1 ] = 81;
}
int func( hoge **p )
{
*p = ( hoge *)malloc( 10*sizeof( hoge ) );
}
じゃねーの?
944で既に答えが出ている(汗
949 :
仕様書無しさん :02/06/14 17:47
関数ポインタの型キャストにはどう書いたらいいの?
(void (*hoge)(int))NULL==hogehoge ???
>>949 void (*foo)(int) = (void (*)(int))NULL;
サンクス!!
asctimeが返す文字列の末尾に\nが含まれるのはなぜ?
>953 (゚∀゚)そーゆー仕様だからだよ。イヤなら削れ。
953 削って使ってるんですが、なぜそんな仕様なのかなーと。
(゚∀゚)なんでだろうね。オレも知りたい。
そのまま表示させることしか考えてなかった
Winみたいに\r\nな環境だと(;´Д`)な気分。
fputsは改行しないのにputsは改行するってのも、 作ったのがそこらの新人だったらはっ倒されそうな仕様だよな。
gets は使われる事のない関数だし、使用から削除していいんじゃない
>961 使用 → 規格
>>961 そうもいかないのが、標準規格というもの…。
正直、getsとregisterはC99でObsoluteにしてほしかった。
obsoluteって何だよ。 obsolete
>965 まぁまぁ。964はobsolescentなんだよ。
Cの標準ライブラリ仕様よくわかんないというか糞なのがあるような気が
おめーら、きちんと埋めろや!! 開けたら閉めるって、おかーちゃんに習ったろうが。
埋めるとしばらく見れなくなるよ。 pcサーバは 600超えたら 500スレッドに圧縮実施中。。。 プログラム技術 live 526 wait 5 日に数スレしか立たないので圧縮まであと数週間持つ。
tab区切りのデータからstrtokでポインタいただきたいのですが、 strtokの2番目の引数に何を指定したらいいのでしょうか? \tでもtab生で打ちこんでもダメでした。 難解です…。
すみません、違うところ間違ってました。 汚してすみませんでした…。
972 :
デフォルトの名無しさん :02/06/23 13:37
1000まで書かないとなかなかDAT落ちしなくていいね。
>>972 1000までいかなくても、近いうちにdat落ちすると思われ。
976 :
3項演算子 :02/06/25 15:32
次のif文を3項演算子を用いて表せ if(a > b) x = a; else x = b; よそしくおねがいします。
変数のスコープってなんですか?
x = ( a > b ) ? a : b
x = IIf(a > b, a, b)
googleで検索したら スコープ=ある変数を参照可能なソースコード中の範囲のこと。 ってかいてあったんですが変数のスコープの意味が分かりません。 誰か教えてください
982 :
3項演算子 :02/06/25 16:02
>979 ありがとうございました。
983 :
デフォルトの名無しさん :02/06/25 16:23
>>981 変数(など)の有効範囲.簡単に言うと{}の中で宣言した変数は,
その中でだけ使えるというもの.
{
{
int a;
a++; /* aが使える */
}
a++; /* ここではaは使えないのでエラー */
}
これ以外に関数のスコープとかファイル単位のスコープとか,いろいろ
あるので調べてくれ.
この問題を教えてください 3×3行列Aに対し 1,Aを読み込みAの行列式を出力 2,Bを読み込みA×Bを出力 3,|A|≠0の時のA^-1を出力
986 :
デフォルトの名無しさん :02/06/25 17:04
986
987
988 :
デフォルトの名無しさん :02/06/25 17:27
988
989
990 :
デフォルトの名無しさん :02/06/25 17:33
ドメイン名からIPアドレスを引き出すプログラムって、nslookup実行した結果を ファイルに入れて参照するしかないですか??
991 :
Disca ◆NAfP6znE :02/06/25 17:37
992 :
デフォルトの名無しさん :02/06/25 17:53
993 :
デフォルトの名無しさん :02/06/25 17:54
スレ2お願いします。
996 :
デフォルトの名無しさん :02/06/25 18:27
997 :
デフォルトの名無しさん :02/06/25 18:30
Σ(゚Д゚)
998 :
デフォルトの名無しさん :02/06/25 18:30
Σc(゚Д゚c
999 :
デフォルトの名無しさん :02/06/25 18:31
Σ(゚Д゚ )y-~~
( ´_ゝ`)1000get
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。