1 :
v(^o^i)d :
04/09/15 01:45:15
2 :
デフォルトの名無しさん :04/09/15 01:46:20
3 :
デフォルトの名無しさん :04/09/15 02:01:37
前スレの982-983が馬鹿すぎて哀れ
5 :
デフォルトの名無しさん :04/09/15 10:03:43
hosh
6 :
デフォルトの名無しさん :04/09/15 12:16:50
Linuxでシリアル制御のプログラムを作成してるのですが、CTS/ RTS制御について 確認したい事があるので教えて下さい。 RTS信号をON・OFFするにはioctlを使用すれば良いことは分かったのですが、 実際にRTS信号をON・OFFするタイミングはこちらがreadのときはOFF、受信を 止めて送信を開始したい場合はONにするという事でいいのでしょうか?
7 :
デフォルトの名無しさん :04/09/15 14:37:58
age
9 :
デフォルトの名無しさん :04/09/15 15:41:24
もう一個のスレに書き込んだけど, こっちが本スレ? Cでファイル入力を行うとき, 100,200,300 のような書式でデータが並んでいる場合fscanfを使えば fscanf(pFile,"%d,%d,%d",&data1,&data2,&data3); のように簡単に分割して取得できるのですが, char str[128]="100,200,300"の用に変数にデータが入っていた場合も 同様に簡単に分割して取得できないでしょうか?
>>9 sscanf(str,"%d,%d,%d",&data1,&data2,&data3);
マス.ヘッダってカタカナで書くとなんかエロいね。
>>16 プッわからないからってその手には乗らない
19 :
デフォルトの名無しさん :04/09/15 18:21:15
>>18 8はちゃんと質問に過不足無く答えてるようだが・・・
>>20 過不足無ないがその後のレスを見る限り性格は相当悪そうだな。
>>21 12がつっかかってるから売り言葉に買い言葉なんだろう
質問があります。よろしくお願いします。 VC++6.0で作っているのですが、2次元データを読み込む配列を作るために関数で、 data=(float**)malloc((N+1)*sizeof(float)); data+=1; data[0]=(float*)malloc((N*L+1)*sizeof(float)); data[0]+=1; for(i=0;i<N;i++) m[i]=m[i-1]+L; という方法で作っているのですが、sizeof(float)ではメモリを参照できないという エラーが出て、sizeof(double)で確保すると動きます。 読み込むデータはfloat型で充分ですし、確保する配列のデータ数も読み込むデータ数と 合っています。なぜfloat型でメモリを確保するとエラーが出るのか分かりません。 よろしくお願いします。
24 :
デフォルトの名無しさん :04/09/15 23:42:18
4 aaa 2 bbb 3 ccc 2 ddd という感じでランダムなインデックスの付いた膨大な配列をインデックスでソートしたいのですが、 このとき、同じインデックスが現れた場合、元の配列の後ろに位置しているデータを 優先として前の配列は削除するようにしたいのです。(配列も縮める) どのようなアルゴリズムがベストでしょうか? 一旦別の一意のインデックスを付けてクイックソートしてから削除した方が良い? どなたかアドバイスをお願い。
Printfを自作したいのですが、どうやればできますか。
>>25 そのPrintfはどんな機能なんですか。
28 :
デフォルトの名無しさん :04/09/16 00:17:05
数行かぁ
でけた? #define Printf(...) printf(__VA_ARGS__)
>>24 クイックソートできるってことはメモリに収まるってことだよね。
ソートしてから重複削除すれば?
>>30 メモリにはなんとか収まります。
やっぱりソート後の削除がベストですかね〜。。
32 :
デフォルトの名無しさん :04/09/16 00:32:48
>>24 大抵の場合は、一旦ソートしてから処理した方が速い。
ただ、クィックソートって安定じゃなかったような気が。
クイックソートは安定ではないので単純にやるのであれば 別の安定したソートアルゴリズムを。 実際に各要素をコピーしたりしないで、そのアドレスを配列にしたものを ソートしてみては?
>>32 何が安定じゃないのか言ってもらわないとな
はぁ…
36 :
デフォルトの名無しさん :04/09/16 00:37:36
あとは、挿入ソートしつつ重複キーがあったら削除とかかな。 ただ、要素数が多いのならソートの時間が支配的になるので 速くて安定したソートを選んだほうがいいと思う。
>>34 クイックソートは難しいけどデバッグしっかりやれば大丈夫だろ。
不安定=ソートキーの値が同じとき順序が特定出来ない
>>38 それは不安定じゃなくて仕様でしょう
クイックソートが悪いわけじゃない
41 :
デフォルトの名無しさん :04/09/16 00:42:01
へんなことを言う人ガイルなぁ
44 :
デフォルトの名無しさん :04/09/16 00:52:35
ちょっとテストするね☆
もう面白いことを逝ってくれるひとはいないのか?
46 :
デフォルトの名無しさん :04/09/16 00:53:37
>>40 単に、安定じゃないソート方法というだけ。
敢えて悪いか悪くないかを言うならば、安定かどうかも知らずに使う奴が悪い。
47 :
デフォルトの名無しさん :04/09/16 00:55:01
libcなどを使わず単体で実行できるputs文を作りたいんですけど どんな感じに書けばよいでしょうか?
48 :
デフォルトの名無しさん :04/09/16 00:56:27
"仕様"か…
アルゴリズムに仕様もへったくれもあるか! と、妹が言っております。
はい、そうです。
52 :
デフォルトの名無しさん :04/09/16 00:59:34
>>48 リアルモードx86のブート時を想定してます。
よろしくお願いいたしまんこ
配送です。
スレちがいなのでx86なら俺に聞けスレに逝って下さい。
55 :
デフォルトの名無しさん :04/09/16 01:02:01
>>52 BIOS経由でいけたような気もするし、VRAMに直接書いてた気もする。
いずれにしてもCとは関係ないので他の適切なスレへどうぞ。
そうさせて頂きます。 ありがとうございまんこ
参考になりました。 とりあえず、安定したソート(マージソート辺り)で 最後の結合でうまく重複しないようにしてみます。 どうもありがとうございます。
マジ?なんでマジソートをエラんだのか…
>>58 クイックソートだと最後にデータの重複チェックをするのですが、
データがでかいのでクイックソートの意味がないくらい時間がかかります。
マージソートで重複チェックしつつソートだけやった方が時間が短縮できそうな
気もしなくもないですが、値がランダムなので微妙です。
何がいいでしょうか。。
詳しいことはわからないけど、 安定したソートはだいたい線形的に要素をなめていくパターンになるので あんまり大差ないような...データの偏り方にもよるし。 1要素の大きさはどうなの? これもデータの特性(というかサイズ)次第だけど、 要素の内容を入れ替えするときのコストのほうが大きいのではないかと思っているんだけど。
クイックソートは本当にクイックかどうかわからないよ。 ワーストケースが酷い。
>>60 1要素はインデックス用の4バイトと200バイトのバッファの構造体です。
これが大体20万要素くらいあります。
>>61 ほぼランダムなので、正順列、逆順にはなりにくいので
クイックで割りと高速にソートします。
一般論だけど、おそらく各要素のアドレスの配列を作ったほうが良さそう。 ソート中に 4+200 バイトの要素の入れ替え→アドレス配列上でアドレスの入れ替えだけ になる差は大きいと思う。
>>64 そうですね。データのコピーはなくしてみます。
ありがとうございます。
66 :
デフォルトの名無しさん :04/09/16 02:06:22
ちょっとテストするね☆
さ、今日も一日がんばるぞ、っと。
>>26 出力機能て奴かなぁ。
>>27 ありがとうございます!
でも何かじっくりみないとよくわがんね〜です。
単に Printf("ああああ:%D%D%D",a,b,c)とかでどうやって値を渡しているのか気になったのと、
自作関数作成中でしてPrintfにどういう渡し方をすればいいのか分からなかった物で
自作したいと言うよりは解析したい、と言った感じでした。
Printfは("%D%D%D%D%D%D"a,b,c,d,e,f)等が出来て型にはまっていないので自作関数を作る際に苦労します。
69 :
デフォルトの名無しさん :04/09/16 18:47:47
1+(1+2)+(1+2+3).....(1+2+3+4+5+6+7+8+9+10)を計算するプログラムをお願いします。 テストで出たけど分からなかったorz
>69 氏ねクソマルチ野郎
>>69 >>1 に
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
と書いてあるのに。
>>69 #include<stdio.h>
int main(int argc, char** argv)
{
char str[100];
int n;
printf("n=");
fgets(str, 97, stdin);
n = atoi(str);
printf("%d\n", n*(n+1)*(n+2)/6);
return 0;
}
質問はしてませんが、このスレのおかげで問題が解決しました。 ありがとうございました。
>>74 改行コードが最長の場合で2バイト("\r\n")と、最後にヌル文字 '\0' が代入されるから。
76 :
デフォルトの名無しさん :04/09/16 22:10:49
モード変更が見当たらないが・・・
ハァ?
>>75 fgetsは改行文字を含めて(2番目の引数の値) - 1までしか読み込まない。
そして文字列の最後にナル文字をセットするのでfgets(str, sizeof str, stdin);で平気。
それとCでの改行文字は常に'\n'1文字。
79 :
デフォルトの名無しさん :04/09/16 22:49:08
75みたいなのがいるから前スレの982みたいなことをいわれるんだよ。
>>78 >fgetsは改行文字を含めて(2番目の引数の値) - 1までしか読み込まない。
>そして文字列の最後にナル文字をセットするのでfgets(str, sizeof str, stdin);で平気。
今実験してみたらその通りだった。スマソ。
>それとCでの改行文字は常に'\n'1文字。
Cで生成すれば普通は'\n'1文字になるが、ネットワークを通した場合や他の処理系で生成されたテキストデータの場合は、
必ずしも改行コードが '\n'='\x0a' で終わるとは限らない。
実際、"\r\n"の場合もあるし、それこそN88BASICで作られた(遺跡のような)データの場合は
改行コードが'\r'になっている。確か、VisualBasic も'\r'だった希ガス。
>>79 ハァ? 実際に改行コードが統一されていないために苦労したことがあるから慎重になっただけですが何か?
82 :
デフォルトの名無しさん :04/09/16 23:09:55
>>81 慎重になるのなら、まずfgetsの仕様調べたら?
83 :
デフォルトの名無しさん :04/09/16 23:13:47
「 !! 」って演算子はどういう意味?
85 :
デフォルトの名無しさん :04/09/16 23:15:29
>>82 高々3バイト程度だったら、余計にバイト数を取るに越したことは無い。
ヌル文字の分を fgets が自動で差し引いてくれる仕様だということを忘れても、
文字列領域を1バイト余計に確保してしまう以上の実害はない。
>>83 論理の2重否定=何も効果が無い
>>83 正確には、前置記法のみ許される演算子で、
論理式の前→効果なし
数値の前→0を int型の0に、非0を int 型の 1 に変換する。
88 :
デフォルトの名無しさん :04/09/16 23:22:11
ネタで言っていると信じたい
!!2 == !!3 てことじゃ
>>86 関数の仕様も確認せずに自己流の対応取るような奴はプログラマとして信用できない。
>>90 つまり0は1に、0以外の数値は1になるって事ですね?
まちがえた、0は0ですね。
#include <stdio.h> int main(void) { printf("!0 = %d, !!0 = %d\n", !0, !!0); printf("!1 = %d, !!1 = %d\n", !1, !!1); printf("!2 = %d, !!2 = %d\n", !2, !!2); return 0; } !0 = 1, !!0 = 0 !1 = 0, !!1 = 1 !2 = 0, !!2 = 1
95 :
デフォルトの名無しさん :04/09/16 23:35:44
>>86 書いてる本人が現状を把握してない →いま実害出てるかどうかは問題外
>>94 有難う。俺も試してみたかったんだけど自宅PCにコンパイラ
入ってなくて試せなかったんですよ。
97 :
デフォルトの名無しさん :04/09/16 23:48:38
>>91 全ての関数の仕様を完璧に把握しているプログラマの方がむしろ少数派だと思うのだが。
必要な時に必要なだけ掘り下げるのがプログラマとして正しい姿勢だと思うが?
IEEE の浮動小数点型の構造を、指数部と仮数部のビット数を1ビット違わず完璧に暗記していなくても、
普通の浮動小数点計算のプログラムを作る上では何の支障もない。
マシンイプシロンが問題になるような微妙なプログラムを作る段階になって始めてビット数の配分を調べればいい。
>>72 のプログラムは飽くまでも適当な長さの文字列を入力する意図でfgetsを使ったまでで、
1バイトが問題になるような微妙な問題など一切発生しない。
だから、厳密な仕様が分からなくても差し支えないような対応策を取っただけのこと。
ちょっと printf を使うのにわざわざ完全な仕様を調べる馬鹿がどこにいる。
>>95 少なくとも、引数に97を指定すれば高々100バイトまでしか読み込まないという現状を把握していて、
実際にその推論は正しかったわけだが?
>86みたいなのがいるからバグで列車が止まったりするんだろうな。 「高々3バイト」? 自分の無知、怠慢、頑迷を棚に上げてよく生き残ってこれたな。
100 :
デフォルトの名無しさん :04/09/16 23:51:57
char str[100];としてsizeof strとした場合、str[100]以降に書き込まれることはない。
101 :
100 :04/09/16 23:52:32
sizeof str ↓ fgets(str,sizeof str,stdin);
>>97 わかんなければ、調べればいいじゃん。
勝手に仕様を想像して作ってもしょうがないだろ。
103 :
デフォルトの名無しさん :04/09/16 23:54:00
>>98 「高々」という言葉を怠慢だと思う香具師は数学も知らないDQNプログラマ。
「高々〜」というのは「〜以下」と同じ意味。
文字列領域を 10^8 個くらい確保する必要があるプログラムとかだったら
1バイトの違いが命取りになる可能性もあるが、
>>72 のプログラムで3バイトが命取りになるとでも言うのか?
>>98 は中学校程度の英語の文を訳すのに学者でも滅多に使わない辞書を熟読する馬鹿と同じレベル。
>>72 のプログラムじゃ問題にならないけど、
「fgetsの仕様知らないんで、大丈夫だと思う方法で使いました」
は問題ありすぎ。
105 :
デフォルトの名無しさん :04/09/16 23:55:39
75がアホなことを言うからでは?
106 :
デフォルトの名無しさん :04/09/16 23:58:06
>>99 逆切れも何も、必要なときに必要な深さまで掘り下げるのが真のプログラマの素質だと主張しているのだが?
>>102 少なくとも
>>72 のようなプログラムを書いて困ったことは一度もない。
普段使うのに必要な程度の仕様は理解しているし、
間違っていても高々3バイト程度の誤差だし、原子炉を制御するような慎重さを要するプログラムを想定していない。
>>106 正しい使い方すれば無駄な苦労せずに済むのに?
108 :
デフォルトの名無しさん :04/09/17 00:01:01
>>104 知らないというより、最近使っていないから忘れていた。
一度だけちゃんとした仕様を見たような気がする。
>>108 そうだね。仕様忘れてたら問題ないもんね。
111 :
デフォルトの名無しさん :04/09/17 00:04:55
>>107 こういう場合と勘違いしていた。
名前のフィールドが100バイトの場合、一時的に読み込みに使用する文字列変数の長さは
何バイト必要か?
という問題。
さっき fgets を使ってみたら自動的に'\n'が削除されていたから、
コンソール入力の場合は 101 バイト、ファイルからの読み込みの場合でも 102 バイトというのが正解だが、
それを '\n' も入力されるものと勘違いして 103バイトと思っていた。
fgets()の第2パラメータはバッファサイズと同じでいいなんてことは、いろはのいのようなもの。 仮令忘れていようともマニュアルページを一瞬でも見れば思い出すような種類の内容だね。 つまり、「忘れるはずもないようなことも知らない」無知と「忘れているのに確認せずに使う」 怠慢と「指摘されても自分の非を認めない」頑迷さか。 しかも、未だ判っていないで御託並べてるよ。 その御託から察するに、実験的に仕様を確認する能力にも欠けている様子。 「正解」なんてわざわざ書かないでいればただのお馬鹿さんで済んだのにねぇ。
str+3のコーディングは問題ないけど、削除されたかどうかの方は重要じゃない?
97と112は同じ思想だね。
>>113 ぜんぜん重要じゃないよ。int上限超えてる事にくらべたら。
あとはケッペキさんたちがどう思うかでネタが続くか決まりそうだな 俺はどこまでいっても確証ってのはヒューリスティックなものに過ぎないと思うがね プログラマの資質論・道徳論じゃなくてもうちょっと現実的なとこで話そうぜ
117 :
デフォルトの名無しさん :04/09/17 00:16:29
>>109 >>112 だから、高が数値を入力するのにわざわざ仕様を調べる必要はなかったと言いたいのだが。
scanf を使うよりマシだと思って fgets を使ったに過ぎない。
別に、
(前略)
char str[100000];
(中略)
fgets(str, 100, str);
(以下略)
とかでも本質的には問題ない。
仕様の通りにしようというのは資質論・道徳論?!
>>115 削除されてなかったらそのまま残っちゃうんだよ?
int上限「超えてる」ってのが何の話かもよくわかんないんだけど。
>>118 費用対効果や個別ケースを想定せずに、常に完全を求めるのが徳論ってことじゃないのか?
121 :
デフォルトの名無しさん :04/09/17 00:19:33
>>113 削除されたかどうかを知らなくても、どちらでも差し支えないようなプログラムを書ければ問題は無い。
何らかの理由でバイナリモードで開く必要があった場合、'\n'は自動的には削除されない。
>>118 全ての関数の厳密な仕様を完璧に把握しようとすれば誰だってノイローゼになる。
普通は、必要なだけの深さまで掘り下げて理解する。
仏陀に聞いてみれば誰の考え方が正しいか分かるぜきっと。 ハイ、仏陀↓
123 :
デフォルトの名無しさん :04/09/17 00:20:38
hebi?
>scanf を使うよりマシだと思って fgets を使ったに過ぎない そもそもそんな思想の香具師にプログラムなんて書いて欲しくない。 あー、書くのは構わないな、他人の趣味までどうこうする気はないから。 他人の使うプログラムを書かず、無知を晒さず、引き篭もっててくれればいいよ。
125 :
デフォルトの名無しさん :04/09/17 00:21:20
質問です。 H8マイコンのLCDに表示についてです。 void lcdo4(unsigned char d) { d=d | E_SIG; P3DR=d; d=d & 0xdf; P3DR=d; wait() } なのですがお願いします。 なにぶん初心者なので・・・。
128 :
125 :04/09/17 00:26:13
なるほど。すいませんでした。
129 :
デフォルトの名無しさん :04/09/17 00:26:45
>>124 そもそも stdio.h の関数自体が欠陥だらけなのだが?
Windows などのプログラムを組むのに、わざわざそんなことを考える必要は無い。
ぶっちゃけた話、
>>74 の例では、数値が入力できれば何でもいいだろ。
130 :
デフォルトの名無しさん :04/09/17 00:27:31
使い方をまちがってますよと言っただけなのに、ここまで逆切れされるのもどうかと
>>129 リスク評価って言葉がそいつの辞書にはのってないんだよ。
>>133 潔癖な奴は潔癖だし、適当な奴は適当なままだからな。
で、二人が出会うと反発しあって二人とも自分の方の極へ猛ダッシュして
返ってこなくなっちゃう、と。
わざわざ仕様に沿わない使い方をする意味がないだろ 必死にこのケースは問題ないとか言ってるし 始めから仕様に沿った使い方してればそもそもケースを考慮する必要もないだろ
>>79 みたいな書き込みがなければ「スマソ」で終わっていたのに、
わざわざ神経を逆撫でする
>>79 以降の香具師が悪い。
>>135 同じことの反対の側面にあたる考え方だな
興味深い
>>136 いやさ、適当に構うとますます墓穴掘るから面白くてね。
>>135 少なくとも仕様に反した使い方をした覚えは無い。
140 :
デフォルトの名無しさん :04/09/17 00:40:47
>>138 問題を解決するという意味では何一つ間違っていないだろ。
どこが墓穴を掘っているのか説明してみろゴルァ
自作自演うぜえ
143 :
72 ◆opz3iyLiAc :04/09/17 00:42:46
>>141 少なくとも漏れは自作自演をした覚えはない。
ヒューリスティックな判断はマなら誰でもやることだろうけどさあ、 とりあえずsageない? part87のほうのレス数も無事追い抜いたことだし、、。
>>144 さして爆発力のあるフレームじゃないし、もう息切れじゃね?
146 :
デフォルトの名無しさん :04/09/17 00:48:11
このスレは常時ageだろ?
gcc TEKITOU.cpp -lstdc++ -lm のmakefileの作り方教えてください。 環境はwin2k、C:\MinGW\lib\gcc-lib\mingw32\3.2.3です。 TEKITOU.cppはmainが一つだけです。
149 :
デフォルトの名無しさん :04/09/17 01:15:29
>>117 その割には、わざわざ(あの例では大して意味の無い)改行を気にしてるあたりがねぇ。
細かなこだわりは通すけど、大局は見ないタイプだな。
>>149 不確実な知識の中で、安全かつ最小の数値を fgets の第二引数に指定したまでのこと。
最小? 整数値を入力するのに? 何ビットCPUを想定しているの? だから無知蒙昧を曝け出すだけだというのに……
152 :
デフォルトの名無しさん :04/09/17 01:31:35
ヒューリスティック的な捉え方すると、あれで100文字も入れる奴はいないし たとえバッファあふれしても大問題になる可能性はまず無いな。 scanfで十分なんじゃない?
>>150 知識も無いのに、安全で最小だということがわかるんだ。
atoi使うのに100文字だの安全だの言うかねぇ、、、
155 :
デフォルトの名無しさん :04/09/17 01:50:44
>>151 64ビットだとしても高々(十進法で)20桁、128ビットだとしても高々39桁しか必要としない。
だが、トリビアルなプログラムのためにわざわざ厳密な桁数を求める必要はない。
100桁とするのは適切な判断だと思うが?
>>152 scanfだと固まる可能性もあるし、あえてscanfを使う必要も無い。
>>153 バイト単位の厳密な部分を忘れていただけで、本質は把握していたわけだが?
行入力時に、改行がどう扱われるかってのは本質的な問題だろ。 本質的な問題を無視するのなら理解できるけど、間違っちゃたのを 「動けば良いじゃん」と開き直るのはかっこ悪いよ。
規格を読んでそれぞれが判断すればよいだろうに(反実仮想) 1. 概要 #include <stdio.h> char *fgets(char * restrict s, int n, FILE * restrict stream); 2. 解説 fgets関数は、nによって指定される文字数より高々1少ない文字数を、 streamによって指されるストリームから、sによって指される配列に 読み込む。改行文字の後(これは保持される)、またはEOFの後には 文字列は追加されない。最後の文字が読み込まれた直後には ヌル文字が書き込まれる。 (from ISO/IEC 9899:1999)
159 :
72 ◆opz3iyLiAc :04/09/17 02:26:23
>>156 3を引いても動きます。
>>157 void chomp(char* str)
{
while (*str) {
if (*str != '\r' && *str != '\n') {
*str = '\0';
break;
}
str++;
}
}
こういう関数でも作れば万事解決。
fgets で読み込んでから、chomp すればいい。
なんで27を引かなかったのかを知りたい。
言い訳する前に書いておくが、この程度のコードでTypoするようなら それを見つけられないという時点でやっぱり恥だ。
>>159 さすが、本質を理解してる人はすばらしいプログラムを書くね。
165 :
デフォルトの名無しさん :04/09/17 02:36:56
こんな時こそあの重複スレを使うといいかもな。
つーかお前らまとめて移動しろよ 延々と馬鹿かっつーの
168 :
デフォルトの名無しさん :04/09/17 17:21:59
jpegのファイルを配列に読み込みたいんですがfreadだと駄目でした。 fgetcでもやってみたのですが1バイト読み込んだところで feofで0以外の値が返ってきました。 どうやって読み込めば良いんですか?
"rb"で試して168の結果になりました。
そのファイルが1バイトだったとか。
JPEG(JFIF)のヘッダは FF D8 FF E0 00 10 4A 46 49 46 00 なんで、何か違うファイルか変な使い方をしていると思う。
ファイルはこれです
http://up.isp.2ch.net/up/d82cc8ea338b.jpg ヘッダは
>>172 のようになってました。
読み込む部分のソースです。
unsigned char *f(FILE *fp)
{
unsigned long size;
unsigned char *p;
if (fseek(fp, 0, SEEK_END))
return NULL;
if ((size = ftell(fp)) == -1)
return NULL;
if ((p = (unsigned char *)malloc(f_size)) == NULL)
return NULL;
memset(p, 0, size);
if (fread(p, size, 1, fp) != 1)
return NULL;
return p;
}
インデントが無くなってますが自分のソースではif (...) {...}となってます。
ファイルの最後まで移動しちゃ、当然それ以上は読めないわな。
if (fseek(fp, 0, SEEK_START)) あとmemsetはその後freadで上書きされるので要らない。
fgetcのソースです。 1バイト読んだところで終わるのは先頭にseekするのを忘れていたからでした。 修正して試しましたが、gdbですが $5 = (unsigned char *) 0xa0423a0 "�リ�・ で読み込めてませんでした。 unsigned char *f(FILE *fp) { unsigned long size; unsigned char *p; long long ll = 0; if (fseek(fp, 0, SEEK_END)) { return NULL; } size = ftell(fp); if ((p = (unsigned char *)malloc(size)) == NULL) { return NULL; } memset(p, 0, size); if (fseek(fp, 0, SEEK_SET)) { return NULL; } while (!feof(fp)) { p[ll] = fgetc(fp); if (ferror(fp)) { } ll++; } return p; } 173のソースはmalloc(size)です。
>>175 >>176 すれ違いってしまいましたが
>>177 の通りfreadの方でも先頭に戻しましまたが
(unsigned char *) 0xa0423a0 "�リ�・
という風に
>>177 と同じでした。
>>178 落ち着け、gdbで表示されているのはpのアドレスじゃないか?
pの中身は期待通りになってるのか確認してみろ。
>>177 $5って書かれても、gdbで何を表示したらそうなったのかわかんないんだけど。
そのまま他のファイルに書き込んでみたら、同じファイルができたので読み込めてました。
お騒がせしてすんませんでした。
gdbではある程度配列の中身が表示されて...とつくのに�リ�・だけだったのと、
%sで表示したときも�リ�・だけ表示されたので駄目だと思ってしまいました。
>>179 �リ�・はjpegファイルの先頭の部分でした。
>>180 p 引数 というコマンドで出てきました。
何なのか自分も解りませんでしたが
$の後の数字はどうやらpのコマンドを実行したの回数のようです。
下記のプログラムがどうも思い通りに動いてくれません -------- int a = NULL; do { if (a != NULL) { printf("入力された文字>> %c\n\n", a); } printf("キーを入力して下さい\n"); a = getchar(); } while (a != -1); --------------------- 最初の1回目は a = getchar(); この部分で入力待ちが起こるのですが、 2回目の a = getchar()の行ではそのまま素通りされているような実行結果が 出てしまいます。 ---------------------------- キーを入力して下さい a 入力された文字>> a キーを入力して下さい 入力された文字>> キーを入力して下さい -------------------------- このような結果になるのですが、2回目のa = getchar()では入力待ちで待機されないのでしょうか?ご指摘お願いします。
>>182 getcharの後にダミーのgetcharを置かないと連続した2回目のgetcharには
リターンが入ってしまいますよ
a\nがバッファに入力される。 バッファからaの一文字が変数aに書き込まれる。 2回目のgetcharでバッファに残ってる\nが変数aに書き込まれてる。
まぁ、fgets()でも使っとけってこった。
>>183-185 ありがとうございます。
なるほど、内部ではそうなっているんですか。
なんとなく、1回目の処理が終った後も、
ゴミみたいなのが残ってて2回目がおかしな処理になっているんだろうと思ったんですが
解決には至りませんでした。
fgetsで試してみます。ありがとうございました。
要は標準ライブラリの仕様がわからんという質問が多いな。
質問者はそんなもんだろう 解答者でそのレベルなら痛いがな
何をやろうとしているか、感じ取ってもらえるといいのですが、 下に書いたような処理をしようとしています。 hoge1を呼び出そうとしましたが当然エラーです。 #include<stdio.h> #define HOGE(item) hoge##item void hoge1(void) { printf("hoge1\n"); } void hoge2(void) { printf("hoge2\n"); } main() { int a='1'; HOGE(a)(); return 0; } 文字列連結の##ってやつ、どういった時に使うのかわかりません。 何の役に立つかもわかりません。 このような処理を実行させるのはCでは無理でしょうか?
hoge の定義はどこにあるの?
>189 HOME(1)(); HOME(2)(); と必要に応じて書く defineを解釈するのはプリプロセスの段階だということを意識できると いいんだが
HOMEと書いてしまったorz
関数ポインタ使えって感じだな
>>189 実行時に変数の内容で呼び出す関数を振り分けたいなら、
関数ポインタの配列を使いなさい。
void (*hoge[2])(void) = {hoge1, hoge2};
int a = 0;
hoge[a]();
197 :
デフォルトの名無しさん :04/09/18 16:45:27
初期化処理(環境設定ファイル読み込み処理) 環境設定処理を読み込み、環境設定情報を環境設定情報管理テーブルに 保持するってどーゆー意味ですか?
>>197 int main(int argc, char* argv[], char** envp)
というふうにmainの引数は3つあるわけなのですが、
envpは環境変数が書き込まれており、
それをテーブルに入れるって言うことなのかな?
「環境設定処理を読み込み」なんだから、スクリプトか動的ライブラリを 読み込んで実行して、環境設定情報を環境設定情報管理テーブルに書き込 むんじゃないの?
まぁ、仕事の悩みなら一番ましそうな先輩にでもするもんだ。 #どうせそのプロジェクト内でしか通じないローカル語だろ。
gnome-configみたいなやつのことを言っているのかな? それを自前で作っても知れているけど。
202 :
デフォルトの名無しさん :04/09/18 20:04:55
#defineOUTPUTSHELTER_1 #defineOUTLENSHELTER_2 #define OUT( x , y )\ for( short cnt=0 ; cnt < OUTLEN ; cnt ++ )\ printf( "%c" , *( OUTBUF + cnt ) ) #defineSHELTER_1OUTPUT #defineSHELTER_2OUTLEN こんな感じで、OUTの時だけ文字列置換を行いたいんですけど、 もっと他のうまいやり方ないですか? どなたかお手本お願いします。
203 :
197 :04/09/18 21:20:35
みなさんご回答ありがとうございます。 プログラムを作る実習で初期化設定のモジュール作成 の担当になったのですが、何を作ればいいのかわからず、 困っています。
204 :
デフォルトの名無しさん :04/09/18 21:26:46
>>203 初期設定というからには本番の処理で何が必要になるかがわかっていなければならない。
ファイルだのレジストリだの環境変数だのの手段よりもまず、要求定義しないと書きようがないのは当たり前。
>>203 設定ファイルを開いて、一行ずつ読み込んで、トークンに分けて、…
Cから派生した言語って どういうものがあるんですか?
>>208 レスありがとうございます
Cを覚えてからだと
それらの習得も効率が良かったりしますか?
211 :
デフォルトの名無しさん :04/09/18 21:46:16
>>209 やりたいのから逝け。
小さなメリット・デメリットより、本人のやる気が支配的な条件。
オーバーフローしたかどうかわかる関数ってありますか?
>>209 Cを覚えてからだとC++を理解するのは非常に楽。
だってCの拡張言語なんだもん
同じようにJavaもすぐに理解できるようになる。Javaは若干違うんだけどね。
>>211 他の言語に比べて
C言語が得意とする仕事や処理っていうのはどんな感じでしょうか
例えばBASICとかは
自分の中では、自然科学とかの分野で
グラフの演算とかのイメージが強いんですが・・
215 :
197 :04/09/18 21:52:06
>>212 そういうのは無いから、
オーバフロしないように論理的にプログラムしないとだめ。
もしくは、その型の最大値、最小値の間に収まっているか調べないとだめ。
>>214 >他の言語に比べて
>C言語が得意とする仕事や処理っていうのはどんな感じでしょうか
余り気にすることはない。そもそも、あんたの中のイメージが間違っているから。
すみません。途方もなく馬鹿な勘違いをしていました。 自己解決です。意味不明な事でスレ汚しすみません。
223 :
デフォルトの名無しさん :04/09/18 22:05:41
>>214 もともとOSを作るための言語だったのは知ってるか?
色んな分野あるけど、それも「やりたいのから逝け」。
俺なんぞ、モーターが動いたり光に反応したりと、そーゆーのが好きだが
おまえさんにはおまえさんの興味があるだろ。
Cの得意分野というより、Cは守備範囲の広さが売り。
224 :
デフォルトの名無しさん :04/09/18 22:07:53
>>217 ありがとうござます
そちらできいてみます
>216>220 ありがdございます。
226 :
デフォルトの名無しさん :04/09/18 23:50:30
ありがございます。
227 :
デフォルトの名無しさん :04/09/18 23:52:44
サンクス!
どもども^^
Thank goodness^^
230 :
デフォルトの名無しさん :04/09/19 10:44:17
i = i++; これがなぜいけないのか私には分かりません どなたか説明して頂けませんか?
展開しろよ
232 :
デフォルトの名無しさん :04/09/19 11:28:29
fwrite(list_inst, sizeof(char), sizeof(list_inst), stream);
in_buff = ((pattern_length<<24) & 0xff000000)|((pattern_length<<8) & 0xff0000)
|((pattern_length
>>8 ) & 0xff00)|((pattern_length
>>24 ) & 0xff);
fwrite(&in_buff, sizeof(int), 1, stream);
in_buff = ((list_count<<24) & 0xff000000)|((list_count<<8) & 0xff0000)
|((list_count
>>8 ) & 0xff00)|((list_count
>>24 ) & 0xff);
fwrite(&in_buff, sizeof(int), 1, stream);
in_buff = 0x1000000;
fwrite(&in_buff, sizeof(int), 1, stream);
in_buff = 0;
fwrite(&in_buff, 4, 1, stream);
fwrite(&in_buff, 1, 1, stream);
fwrite(list, sizeof(short), list_count, stream);
fclose( stream );
すいません、このコードの解説お願いできないでしょうか?辞書引いてもどうにもこうにも意味が
よく分かりませんです・・・
extern int a[]; extern unsigned int u[10]; unsigned short *s; int i, t = 0; s = (unsigned short *) u; for (i = 0; i < 20; i++) t += a[s[i]]; unsigned int *をunsigned short *にキャストしてますが これの結果は何が起こるか分からないとかいうものですか? それとも正しいコードですか?
>>233 そのコードだけではなんとも言えないが、正しく動く可能性は充分ある。
まぁ、sizeof(unsigned short) * 2 == sizeof(unsigned)という前提は必要だが。
>>232 ・list_instを書き出し
・4バイト整数値pattern_lengthをエンディアン変換して書き出し
・4バイト整数値list_countを…(以下同文
・4バイト整数値1を…(以下同文
・4バイト整数値0を書き出し
・1バイト0を書き出し
・listを書き出し
・書き出したstreamを閉じ
>>230 iのインクリメントと代入のタイミングが特定できない。
>>232 in_buff = ((pattern_length<<24) & 0xff000000)|((pattern_length<<8) & 0xff0000)
|((pattern_length
>>8 ) & 0xff00)|((pattern_length
>>24 ) & 0xff);
fwrite(&in_buff, sizeof(int), 1, stream);
pattern_length(おそらく4byte int)の
ビッグエイディアンをリトルエイディアンの配置(或いは逆)に置き換え、
in_buffに入れて出力している様です。
どうもint型におけるメモリ格納状況を見たい感じです。
>>233 sを初期化していないから何が起こるか分からない。
>235も>236もよく読んでから投稿汁
>>236 externだから、0に初期化されているんでは?
>>238 ローカル変数でしょ。
intはextern intの省略。
241 :
232 :04/09/19 12:39:15
>>234 マジありがとうございます!うーんそういうことだったのか・・・
もっと勉強しますね
>>238 もしそうだとしてもNullPointerException、誰かにガッされて終わる。
intはauto intの省略じゃないのか?
だからsはuで初期化されてるだろ。 uがどこなのかは兎も角。
で結局、 >intはextern intの省略 は intはauto intの省略の間違えって事でOK??
いいえ、間違いです。
どういう事なのですか?
>>239 さんの書き込みが私にはイマイチ理解できませんでした。
という事は、普通にintと宣言したらそれはextern auto int の省略なのですか?
検索してもなかなかわかりません。
それと、調べているうちもうひとつ疑問にぶつかりました。
http://www.komonet.ne.jp/~c/chap21.htm のページで
『2.関数プロトタイプと関数の引用記述で引数の数が不一致の場合は、文法エラーとなります。ただし、プロトタイプで数不定( ... )が指定してある場合は、数のチェックは行われません。』
>ただし、プロトタイプで数不定( ... )が指定してある場合
プログラムで書くならばどういう事でしょうか。
親切な方、解説キボソ
250 :
デフォルトの名無しさん :04/09/19 18:53:11
>>249 いや、extern の意味ぐらいわかりますが・・・
残念ながらそこには求める答えはないようです。
stdarg
>>251 さんの書き込みがヒントになったようで(?)、宣言の仕方はわかったけど、
こうする事のメリットがわからんー!。・゚・(ノД‘)・゚・。
#include<stdio.h>
void hoge(...)
{
printf("aaa") ;
}
int main(void)
{
int a = 5 ;
hoge() ;
return 0 ;
}
あ、数のチェックが行われないのか。これこそ書いてあった、失敬。
>>238-240 の人のやり取りがわかんないYO だれかHelp...
>>253 intがextern intの省略(書いても書かなくても同じ)というのは間違い。
だから気にしなくてもいい。
255 :
デフォルトの名無しさん :04/09/19 19:31:02
なんか様子がおかしかったのでこっちに書き込みます int a=1; int b=3; int c=a/b*b; これで実行するとcは0になってしまいます doubleやfloatを使わずにcを1にすることは可能でしょうか? c=a/b*bの式の変数の順番や演算子は変えずにお願いします
>>254 そ、そうですよね。。。なんか安心しました。
どうもです。
>>255 変数の順番や演算子を変えればいいじゃん。
何でそんなくだらないものにこだわるわけ?
>>255 プログラム的に様子はおかしくない。
お前の思考の様子がおかしいと言っておこう。
259 :
デフォルトの名無しさん :04/09/19 19:49:32
>>257-258 宿題なのですが…
ないなら問題にけちをつけようかと思っているのですが…
> ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。 と書いてるのが読めないのか。
>>255 宿題ぐらいの問題なら型キャスト使えばええんちゃうの?
int c=(int)((float)a/b*b);
>>263 使わずにと書いてるのが読めねえのかよぼけ
265 :
デフォルトの名無しさん :04/09/19 19:56:44
>>264 だから宿題ぐらいって書いてるじゃん
おめぇが読めねぇのか ぼけ
267 :
デフォルトの名無しさん :04/09/19 19:57:23
>>262 > ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
日本語としておかしいので、もっと厳密に書いて欲しい。
268 :
デフォルトの名無しさん :04/09/19 19:58:09
どいつもこいつも
269 :
デフォルトの名無しさん :04/09/19 19:58:14
ソース丸投げ、宿題、書籍に関しての話 は専門の別スレがあるのでそこへ。
>>261 たとえば、
printfも引数の数は可変だけど、第一引数の中で%dとか%sとかを書くので
引数の数と型は第一引数から判断がつくよね。
274 :
デフォルトの名無しさん :04/09/19 20:05:31
>>271 >
>>261 > たとえば、
> printfも引数の数は可変だけど、第一引数の中で%dとか%sとかを書くので
目から鱗です。
ありがとうございました。
277 :
265 :04/09/19 20:06:16
あたしは無視かい
278 :
デフォルトの名無しさん :04/09/19 20:07:26
279 :
デフォルトの名無しさん :04/09/19 20:08:08
>>277 =265
悪い。見落としてました。
ご助言感謝します。
282 :
デフォルトの名無しさん :04/09/19 20:25:30
>>261 第一引数が嫌だったら、最後の引数を特殊な数(例えば、-10000など)にする方法がある。
-10000になるまで大小比較を繰り返し、-10000になったら終了するようにする。
283 :
デフォルトの名無しさん :04/09/19 20:32:08
>>255 b=3; を b=1; に変更するよろし。
今更そんなレスかい
>>283 あ、それ正解っぽいぞ
出題ではaやbの値を変えたらだめって書いてないし。
>>282 今回期待しているものとはちょっと違うのです。
でも番兵の方がスマートなときもあると思うので、
そのときまた考えます。tnx.
;; 7 行で中置記法の四則演算ができないかと思案中です。
お聞きしたいのですが(初心者です)、 構造体の中に倍精度の変数6個とintが1個入っていて、 その構造体を a[1520][380] だけ定義して使っているのですが、どうやら多すぎるようなのです。 gcc 3.3.2を使っています。 どなたか、このようにたくさんのものを定義できるような方法をご存知の方が おられましたら、お教えください。
ヒープ使え
>>287 struct kouzoutai** a;
a=(kouzoutai**)malloc(1520*sizeof(kouzoutai*));
for(i=0;i<1520;i++)
a[i]=(kouzoutai*)malloc(380*sizeof(kouzoutai));
そして、aをもう使わないようになったら、 for(i=0;i<1520;i++) free(a[i]); free(a); をする。
>>287 別に多いとは思わないが、スタックに取ろうとしてるんじゃないのか?
294 :
デフォルトの名無しさん :04/09/20 00:14:03
ポインタを使う利点って何ですか?
関数渡しで内容書き換え
296 :
デフォルトの名無しさん :04/09/20 01:51:07
>>294 わざわざ他人に聞く必要などさらさらない
わかるまであらゆる処理をポインタなしで書いてみれ
297 :
デフォルトの名無しさん :04/09/20 02:37:53
>>296 ポインタ無しで書けないプログラムはありません。
298 :
デフォルトの名無しさん :04/09/20 02:46:25
299 :
デフォルトの名無しさん :04/09/20 02:52:51
>>298 最初から配列を確保すればそれで済みます。
それがmallocといえるのか?
301 :
デフォルトの名無しさん :04/09/20 03:06:18
302 :
デフォルトの名無しさん :04/09/20 03:29:52
>>301 型が分かっていれば、
Type array[10000];
糸冬 了
303 :
デフォルトの名無しさん :04/09/20 03:36:02
おまえの脳味噌の型がな・・・
でもやっぱりGCはあった方が便利だよ。 D言語では動的配列が普通に配列と同じように生成できるし、freeいらないし便利そう。
ポインタ無しじゃfopen使えないじゃん
printf, putsすら使えないじゃん
307 :
デフォルトの名無しさん :04/09/20 12:00:09
>>304 じゃ、作れよGC
そーゆーことのための道具だけ持ってて
結局なにも作んねーやつを bogus つーんだよ
308 :
デフォルトの名無しさん :04/09/20 12:11:25
EscとかShiftなどのキーが押下された事を検知するには 環境依存の方法しかないのでしょうか?
309 :
デフォルトの名無しさん :04/09/20 12:15:44
ポインタの話ってjavaへの誘導ですか?
Ruby >>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<C
>>307 なんで君が突っかかってくるのかよくわからないんだけど?
私が何も作ってないと言い切っているところが電波というかDQNというか…
Rubyで全て解決!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
314 :
デフォルトの名無しさん :04/09/20 12:53:34
304 名前:デフォルトの名無しさん[sage] 投稿日:04/09/20 03:48:13 でもやっぱりGCはあった方が便利だよ。 D言語では動的配列が普通に配列と同じように生成できるし、freeいらないし便利そう。
304 名前:デフォルトの名無しさん[sage] 投稿日:04/09/20 03:48:13 でもやっぱりGCはあった方が便利だよ。 Rubyでは動的配列が普通に配列と同じように生成できるし、freeいらないし便利そう。
317 :
デフォルトの名無しさん :04/09/20 13:13:18
318 :
いなむらきよし :04/09/20 13:26:47
奇形にもキケー!
>>302 なぜ 10000 で十分なんだ?
もっと必要なんだが(w
320 :
デフォルトの名無しさん :04/09/20 14:11:52
だまれ 小僧! 壷でマウスパッドがもらえると言ってるだろう(早い者勝ち) これで素敵な2ちゃんねるライフをすごせます。。。
321 :
デフォルトの名無しさん :04/09/20 16:22:43
>>319 状況によって違います。メモリが十分にあるんだったら、
#include <limits.h>
・・・
Type array[INT_MAX];
これでおk?
つまらん
323 :
デフォルトの名無しさん :04/09/20 16:54:06
FILE* fp;なんか使わなくても、open, close を使えばポインタなしでプログラムが書ける。 荒業だけど、文字列だって typedef struct { char s[1000]; } String; とかすればポインタを使う必要がない。
324 :
デフォルトの名無しさん :04/09/20 16:57:20
>>323 じゃ、それで環境費依存で汎用のソートマージ作ってみろ
# お前らさっきから口ばっかりで何も作ってない
何でこういう奴に限って例外なくageてるんだろ。不思議。
326 :
デフォルトの名無しさん :04/09/20 16:57:43
s/費/非/
327 :
デフォルトの名無しさん :04/09/20 16:58:06
>>323 そのopenでファイル名渡しに使うのはポインタなんですよ。
何を言っても無駄です。
>open, close を使えばポインタなしでプログラムが書ける。 ワラタw
cgiでフォームの各要素を時刻をファイル名に持つファイルに 書き込むことを考えています。 struct field{ char* name; char* value; } フォームをこのような構造体に分割し、 void make_file_name( char* file_name ) { time_t now; struct tm *tm_now; now = time(NULL) ・ ・ } こんな感じの関数でファイル名を作成します。 フォームを分割し、 make_file_nameを"呼ばずに"fieldの値を参照すると問題なく分割されているのですが 分割後、make_file_nameを呼んでからfieldの値を参照するとsegmentation fault が出てしまいます。どのような理由が考えられるでしょうか? どなたか回答お願いします。
>make_file_nameを"呼ばずに"fieldの値を参照すると問題なく分割されている >分割後、make_file_nameを呼んでからfieldの値を参照する ここのソースを晒せ
333 :
1/2 :04/09/20 17:45:11
>>324 typedef union {
char c;
int i;
float f;
double d;
/* とにかく、最初から実装されている型すべて */
} anytype;
typedef struct {
int len;
anytype array[100000];/* 十分な長さ */
} anyarray;
int cmp(anytype a, anytype b, int typecode)
{
switch (typecode) {
case 1: if (a.c < b.c) return -1; else if (a.c > b.c) return 1; else return 0;
/* この要領で全ての型について書く */
}
}
334 :
2/2 :04/09/20 17:46:24
anyarray margesort(anyarray a, int typecode) { anyarray b, c, r; int i, j, k=0; if (a.len == 1) { return a; } /* 分割 */ for (i=0; i<a.len/2; i++) b.array[i] = a.array[i]; b.len = a.len/2; for (j=0; i<a.len; i++, j++) c.array[j] = a.array[i]; c.len = a.len - a.len/2; b = margesort(b, typecode);/* 各々をマージソート */ c = margesort(c, typecode); /* マージ */ i=0; j=0; while (k<a.len) { if (cmp(b.array[i], c.array[j], typecode) < 0 || j==c.len) {r.array[k++] = b.array[i++];} else {r.array[k++] = c.array[j++];} } return r; }
>anytype array[100000];/* 十分な長さ */ なぜ十分だと分かる? もっと必要だろヴォケ!
array[i] は *(array+i) のシンタックシュガーです
なので i[array] でも同じです
338 :
デフォルトの名無しさん :04/09/20 18:25:42
>>333 マージソートとは別に言っていないが、それは置いといて・・・
>/* この要領で全ての型について書く */
数学的に破綻してるんだよアフォ
それと、ユーザにソースの修正を毎回させるんだな?
>>332 汚いですが・・・
void make_file_name( char* file_name )
{
char temp[5];
time_t now;
struct tm *tm_now;
now = time(NULL);
tm_now = localtime( &now );
sprintf( temp,"%d",tm_now[0].tm_year+1900 );
strcat( file_name, temp );
if( (tm_now[0].tm_mon + 1 ) < 10 )
strcat( file_name,"0" );
sprintf( temp,"%d",tm_now[0].tm_mon+1 );
strcat( file_name, temp );
if( tm_now[0].tm_mday < 10 )
strcat( file_name, "0" );
sprintf( temp, "%d",tm_now[0].tm_mday);
・
・
スンマセン、略します。この後tm_now[0].tm_secまで
文字列を連結します。
}
make_file_name単独ではきちんと日付を出してくれます。
この関数内でfield構造体に触れることはなく、
何が原因なのかさっぱりです。
340 :
デフォルトの名無しさん :04/09/20 18:35:40
>>335 だから、そんなに文句があるんだったら INT_MAX を使えばいい。
メモリを2GB積んでいるパソコンは今のところそんなに多くないから。
型の大きさが1MBくらいある場合も十分考えられる。
>>336-337 マジレスすると、
+:(char)×(char)→(char)
+:(unsigned char)×(unsigned char)→(unsigned char)
+:(int)×(int)→(int)
+:(unsigned int)×(unsigned int)→(unsigned int)
+:(long)×(long)→(long)
+:(unsigned long)×(unsigned long)→(unsigned long)
+:(long long)×(long long)→(long long)
+:(unsigned long long)×(unsigned long long)→(unsigned long long)
+:(float)×(float)→(float)
+:(double)×(double)→(double)
+:(long double)×(long double)→(long double)
+:(anytype*)×(int)→(anytype*)(char*, int* などについても同じ)
は定義されているが、
+:(int)×(anytype*)→
は定義されていない。
>だから、そんなに文句があるんだったら INT_MAX を使えばいい。 >メモリを2GB積んでいるパソコンは今のところそんなに多くないから。 面白い?笑えないんだけど
342 :
デフォルトの名無しさん :04/09/20 18:48:12
>>341 同感
ヤクでもキメてんじゃねえの、こいつ?
>339 ポインタ と ポインタが指している領域 と (ある領域に)格納されている値 について小一時間勉強しなさい。 たぶん make_file_name( ) を呼び出している所のパラメータに問題あり。
344 :
デフォルトの名無しさん :04/09/20 19:06:49
>>341 ハァ?一体どれだけ確保すれば納得するわけ?
100000じゃ少ないというから INT_MAX=2^31-1 を出したんだろ。
だったら、
(int)((100000LL+(long long)INT_MAX)/2LL)
個の要素を確保する。これで文句ないだろ。
まともな人間であれば、31回以内の質問で適切な数に収束する。
香ばしいですな 秋ですね
347 :
337 :04/09/20 19:08:49
348 :
デフォルトの名無しさん :04/09/20 19:08:53
>>344 そんないい加減な確保の仕方で起動できるソース書けるのか?
寝言は寝て言えよ
350 :
デフォルトの名無しさん :04/09/20 19:14:30
>>345 ,347
理解できないんだったら仕様書を小一時間嫁、ヴォケ
>>348 相手が満足する数。int型で表される正の整数の中に、十分でかつ過剰でないと感じる数が存在しなければ基地外。
>>349 だから、最初から定数を配列に書けばいい。
それに、文法が間違っていたり致命的なエラーを起こさない限り、
起動できないソースを書くほうが難しい。
>>344 もう一つ配列作りたいんですけど、どうしたらいいでしょうか。
ポインタ使ってんじゃん
353 :
デフォルトの名無しさん :04/09/20 19:16:14
>>350 汎用といったはず
多すぎても少なすぎてもダメ
ほんと、ばっかだなぁ・・・
355 :
デフォルトの名無しさん :04/09/20 19:23:24
>>351 開始する要素番号を保持する。
int start_of_1starray = 0;
int start_of_2ndarray;
start_of_2ndarray = sizeof(array)/(2*sizeof(anytype));
>>340 Segmentation faultと怒られました。
>>355 途中で配列の大きさを変えることはできないのですか?
358 :
デフォルトの名無しさん :04/09/20 19:27:22
>>353 だから、多すぎず少なすぎない数が少なくとも1つ存在するはず。
1だとどう考えても少ない。
INT_MAX だとどう考えても多い。
ということは、1<n<INT_MAX となる n の中に適切な数がある。
1<n≦(INT_MAX+1)/2 か、(INT_MAX+1)/2<n<INT_MAX のどちらかしかありえない。
そのように絞り込むと、必ず適切な n が現れる。
だから、(int)((100000LL+(long long)INT_MAX)/2LL)ではどうかと聞いた。
これが多いと答えるか、少ないと答えるかで次の質問が決まる。
>>358 そんな事を考えないでも使えるようにしろよ
>>343 すみません、”ある領域”とは?
ググるにしてもキーワードがさっぱり。
ポインタについては理解しているつもりです。
何か詳しいサイトなどありましたら
教えて欲しいです。
362 :
デフォルトの名無しさん :04/09/20 19:33:00
>>356 だったら、もっと少ない数を指定するか、プラグマを使って場合わけする。
>>355 start_of_2ndarray の値を変更する。
データが入っているときは、その都度移動する。
363 :
デフォルトの名無しさん :04/09/20 19:34:36
>>359 考える脳みそがないんだったらプログラムを組む必要はない。
>>358 その理由を聞きたい。
>>362 プログラムを、別のパソコンにコピーしたらいきなり落ちちゃいました。
うわぁ
いい加減に諦めて「ポインタ無しで書けないプログラムはありません」って発言撤回しろよ
ポインタが無い言語も内部的には使いまくりだからな
だからポインタ使ってるって。既に。
ポインタなんかいらね
この手の「ポインタ無くても工夫すれば他のもので代用可能」っていう奴は たまに出てくるけど、面白かった事など一度も無い。
このスレ始まって以来、面白かった事など一度も無い。
無くてもとは言ってない、すがるほどのものではないと言ってるだけ
375 :
デフォルトの名無しさん :04/09/20 19:56:06
ポインタなんていつ使ったよ?
悪いことは言わないからC++にしとけ
都合のいいときだけC++を使うのがベター
C言語スレで何言ってんだ?こいつら
380 :
デフォルトの名無しさん :04/09/20 20:05:53
>>375 Cは自己記述可能な言語だ
あんたがCを使ったことがあるなら
そこですでにポインタを使ってるんだよ
文句あるならポインタ抜きで
Cの翻訳処理系を作ってみろ
382 :
デフォルトの名無しさん :04/09/20 20:38:10
>>364 荒業だが、配列を関数内部に組み込む。
#define SIZE_OF_ARRAY 1000000 /* 気に入らなかったら他の数値に直す */
typedef union {
/*略*/
long double ld;
} anytype;
typedef struct {
int code;
anytype a;
} status;
status access_array(int n, int mode, anytype a)
{
static anytype arrray[SIZE_OF_ARRAY];
int i; status s;
if (n < 0 || n >= SIZE_OF_ARRAY) {s.code = -1; return s;}
s.code = 0;
switch (mode) {
case 0:
for (i=0; i<SIZE_OF_ARRAY; i++)
array[i].ld = 0;/* long double 型がanytypeのメンバ内で最も大きい場合、自動的に全てのビットが0にセットされる */
break;
case 1: s.a = array[n]; break;
case 2: array[n] = a; break;
}
return s;
}
383 :
デフォルトの名無しさん :04/09/20 20:48:36
>>364 main関数で残りメモリを参照して、少なかったら終了する。
残りメモリ参照にはポインタを使わない。
>>365 malloc と比べてそれほど多く考える必要はない。
>>367 二分法である必要はない。
>>383 初心者は、プログラムがmainからそのまま開始すると勘違いしてるんだよな。
>>383 自分で二分法出しといて二分法である必要ないと言われても。
386 :
デフォルトの名無しさん :04/09/20 21:40:14
>>384 どこからでもいいから、とにかく配列の定義がmainになくて、
関数を呼び出したときに初めて確保されるようになっていればいい。
処理系によっては WinMain から始まることもあるが、普通は main から始まる。
何段階呼び出した後でもかまわない。
そんなこといちいち断らなくても伝わると思ったからあえて言わなかっただけで、
そんなことは百も承知。
というか、本質的でないことにこだわり杉
>>385 二分法はあくまでも例。
最初の段階で、二分法あるいはニュートン法(この場合どうやって適用すればいいのか謎だが)、
もしくはその他の方法とか言ったら回りくどいから、二分法をひとつの例として出しただけ。
要は文句の出ない数値が一つ決まればいいだけで、その決め方は本質的ではない。
>>386 どうでもいいからmalloc作れ。話はそれからだ。できるまで来るな。
388 :
デフォルトの名無しさん :04/09/20 21:51:11
Ruby!!!! >>>>>>>>>>>>>>>>>>> ぽいんた
391 :
デフォルトの名無しさん :04/09/20 21:56:01
392 :
デフォルトの名無しさん :04/09/20 21:56:31
ウィルスきたわぁ
393 :
デフォルトの名無しさん :04/09/20 21:59:13
GCひとつ作れない超低脳ばっかり
なんでGCの話がでてくるんだ?
395 :
デフォルトの名無しさん :04/09/20 22:05:40
結論:ポインタは大いに使いましょう。
396 :
デフォルトの名無しさん :04/09/20 22:06:52
399 :
デフォルトの名無しさん :04/09/20 22:10:10
坊やだからさ!
400 :
デフォルトの名無しさん :04/09/20 22:12:45
ちんこだからさ!
401 :
デフォルトの名無しさん :04/09/20 22:17:05
>>401 もう一度聞く。
ポインタの話してるのになんでGCの話が出てくるんだ?
まったく、ばっかだなぁ・・・
404 :
デフォルトの名無しさん :04/09/20 22:23:32
本人は理由のつもりなんだろ
>>406 GCがあればポインタはすべて解決するんだよ、きっと。
408 :
デフォルトの名無しさん :04/09/20 22:28:47
どいつもこいつも
411 :
デフォルトの名無しさん :04/09/20 22:33:20
プログラムの引数を使いたいんだけど ポインタ使わずに
414 :
デフォルトの名無しさん :04/09/20 22:37:19
417 :
デフォルトの名無しさん :04/09/20 22:40:41
418 :
デフォルトの名無しさん :04/09/20 22:42:08
別に自分にできないことを人にやれと言っているわけではない こっちにはちゃんと答えがあって言っていることだ はやくやってみろ
>>418 ログ見るのが面倒だから見ないが
なにをやるんだ?
失礼いたす。拙者、暴君ハバネロと申す。質問は特に無い。続けくれ
Rubybyyyyyyyyyy
>>386 やっぱり、mainやWinMainの前のことは考えられないんだ。
スタックも知らないみたいだしネタを語るには力が足りないよ。
ところで、「本質的」という言葉を好む奴にろくな奴はいないな。
424 :
デフォルトの名無しさん :04/09/20 22:45:27
>>420 ポインタ抜きで malloc と GC 作って
ポインタが無用かどうか証明して見せろ
>>424 オレはそんな物つれないので、それが証明できる人に言ってくれ
426 :
デフォルトの名無しさん :04/09/20 22:47:36
>>425 これから日本語で話していただいて結構ですから
>>426 mallocがポインタ返すのにポインタが無用だって?なんだそりゃ
ポインタが有用とか無用とか、 お前ら本当に無駄な話し合いが好きだなw
ポインタ無くてもなんでも作れるとか言った馬鹿が一番わるいんだろうな
430 :
デフォルトの名無しさん :04/09/20 22:50:19
malloc_without_pointer でもいい、とにかく同等の機能を持つ関数を作ってみろ
431 :
デフォルトの名無しさん :04/09/20 22:51:31
>>428 まぁネタスレだし。
今回のネタはつまんないけど。
433 :
デフォルトの名無しさん :04/09/20 22:52:55
敗北宣言出たようだな
はいはい。参りました・・・と
436 :
デフォルトの名無しさん :04/09/20 22:54:14
早くトリップ付けろよ(藁
もう本人いないし、出てきても反論できないだろうし、 かわいそうだよ。 お前たち、おやめ!
443 :
デフォルトの名無しさん :04/09/20 23:33:26
とりあえず、全ての配列にanytype型を使い、複数の配列をハンドル番号で管理すれば、 ポインタを一切使う必要がない。実装は時間の問題。 デバッグの時間も考えて、明日までには完成する。 ポインタレスmallocが完成した時点で、ポインタの存在意義は消える。 極論を言えば、全ての関数をポインタレスmallocに対応させることで、 全ての関数からポインタを排除することが可能になる。
配列にどうやってアクセスすんの?
ひでぇ。 ポインタ=mallocが返すもの と勝手に定義されちゃってるし。
ただのポインタもどき
配列を関数に渡そうとするとポインタになるわけだが、それもハンドルにする気なのか? ポインタ排除=配列排除だよな。
単に独自のmallocを作るだけじゃん。
450 :
デフォルトの名無しさん :04/09/20 23:55:53
見落としていた。
>>423 だから、main 以外の関数内部にstaticで配列を確保すれば、
その関数funcを呼び出す以前の煩雑な処理は一切考える必要はない。
funcを呼び出す以前のことは、たとえmain関数のことであっても知る必要がない。
スタック領域が最初に確保されるのは、グローバル変数とmain関数内の変数のみ。
>>444 関数内部にstaticで保持し、引数によって読み書き出来るようにする。
451 :
デフォルトの名無しさん :04/09/20 23:57:51
>>448 1つの関数の内部に配列を保持し、引数を適当に与えることで自由にアクセスできるようにすれば、
配列の引渡しをする必要がない。
ひでぇ実装(ゲラ malloc使った方が、普通に便利だ
どなたか暇な人
>>361 回答お願いします。
空気読めなくてスマソ。
>>450 プログラム書いたこと無いのバレバレ。
それとも、具体的なプログラムは本質的ではないのかな?
455 :
デフォルトの名無しさん :04/09/21 00:10:59
>>452 C言語でありながらカプセル化が可能で、しかも常に引数チェックをするので
不正なメモリアクセスやメモリエラーを起こすことがない。
セキュリティーホールになりかねないmallocより数倍マシ。
456 :
デフォルトの名無しさん :04/09/21 00:11:21
457 :
デフォルトの名無しさん :04/09/21 00:14:09
>>454 C言語でちゃんと実務的なプログラムを書いたことがありますが何か?
で、まだ呼び出していない関数内部の配列の大きさが問題になるプログラムってどこにあるの?
意固地になってるだけだろ。 気の済むまで自分の世界の中でやってりゃ良い。
>>457 想像で語ってないで、実際に書いてみたら?
460 :
デフォルトの名無しさん :04/09/21 00:21:05
462 :
デフォルトの名無しさん :04/09/21 00:22:55
UNIXプログラミング質問すれ Part3で自作自演をしているのはここの住人だろ?
463 :
デフォルトの名無しさん :04/09/21 00:23:42
#include <stdio.h> #include <limits.h> void func(void) { static int array[INT_MAX]; array[0]=1; } int main(int argc, char** argv) { if (0) func(); printf("Hello, world.\n"); return 0; } さあ、問題を起こせるもんなら起こして下さい。
>>463 そもそもコンパイルできないけど、配列の大きさを小さくしても
Segmentation fault (core dumped)
だね。
array[i] これポインタと同義
無知は黙ってて下さい
469 :
デフォルトの名無しさん :04/09/21 00:40:29
>>464 配列の大きさを1にしてもエラーになるんだったら、コンパイラに欠陥があります。
最新版をインストールしましょう。
いつまでやってんだよマンチンカス
配列のとりうる最大のサイズってINT_MAXだっけ?
UINT_MAX
>453 343 :デフォルトの名無しさん :04/09/20 19:05:56 >339 ポインタ と ポインタが指している領域 と (ある領域に)格納されている値 について小一時間勉強しなさい。 たぶん make_file_name( ) を呼び出している所のパラメータに問題あり。
array[0] はデータが入ってる変数だよね? array[1] も変数だよね? じゃあ array は何?(´・ω・`)
配列の先頭
はあ? array は配列か配列の先頭へのポインタかどっちかだろ
>453 473(343)の"ある領域"って、ポインタが刺している領域の事なのでは?
>>477 ポインタは刺さない。今時刺すのはNEVADAくらいなもんで。
>>474 arrayは
>>463 の場合int[INT_MAX]型。
ただし、配列は知っての通り式の中ではポインタにされてint *型になる。
&arrayの結果の型はint (*)[INT_MAX]になるなど例外もあるが。
刺す刺す刺す刺す刺す いえ〜い
array[3] = *(array + 3) array[0] = *(array + 0) array = const ポインタ
&array[0] = &array =
484 :
デフォルトの名無しさん :04/09/21 09:23:13
array[i] も使ってはいけないんだったら、最後の手段として、 int func(int data, int n, int mode) { int a0, a1, a2, a3, a4, (ry if (mode == 1) { switch (n) { case 0: return a0; case 1: return a1; case 2: return a2; ・・・・・ } } else if (mode == 2) { switch (n) { case 0: a0 = data; break; case 1: a1 = data; break; case 2: a2 = data; break; ・・・・・ } } return 0; } とすればいい。
まだやってたw
486 :
デフォルトの名無しさん :04/09/21 13:20:12
if ( c == '#' )ってどういう意味ですか? #ってどんな効果かググっても見つかりませんでした
質問の意味がわかりません
>>486 cに#という文字が入ってるかどうかってだけ
489 :
デフォルトの名無しさん :04/09/21 13:35:08
#include<stdio.h> typedef struct _LIST{ struct _LIST* p_next; char data; }LIST; int main(void) { LIST hoge[3]; LIST* test_p; LIST* obj; test_p =& hoge[0]; hoge[0].p_next =& hoge[1]; hoge[1].p_next =& hoge[2]; hoge[0].data = 0; hoge[1].data = 1; hoge[2].data = 2; obj = (LIST*)(*test_p);//ここでエラーが発生 printf("%p\n",&hoge[0]); printf("%p\n",test_p); printf("%p\n",*test_p); return 0; } すみません、以上のようなプログラムがあった時、なんとかアロー演算子を使わずに hoge[0]->p_nextのアドレスを obj に入れる事は出来ないでしょうか? ご教授オネガイシマス。
環境は Visual C++ 6.0 です。 やはり無理でしょうか・・・
>>484 >int a0, a1, a2, a3, a4, (ry
は、
static int a0, a1, a2, a3, a4, (ry
の間違い。
>>489 ,490
obj = *(LIST**)(test_p);
494 :
489 :04/09/21 14:07:38
>>493 まじすごいっす!
漏れこれで昨日一日悩んでました。
ありがとうございます"(ノ_・、)
特定の演算子を使ってはいけないとか、演算順序を変更してはいけないとかいう 意味のない宿題が流行ってるのかねぇ。
あれ?うまくいった。make_file_name()は関係なく malloc()したfieldとfile_nameをfree()するときに 落ちているみたいでした。これってどういうことなんでしょう? ともあれ原因は特定できました。レス下さった方本当にありがとうございます。
C言語の本をにはたいていmallocしたメモリーをもう使わない なら放っておけば終了時に自動的に解放されるので明示的に freeしなくても良いと書いてあるのですが、先日ある雑誌を 見ると明示的にfreeしないとメモリーリークになると書かれ ていました。どちらが正しいのでしょうか。
>>497 過去ログを参照してください。語り尽くされていますから。
>>497 環境依存です。
開放するOSもあればメモリリークするOSもあります。
だから、環境依存しないコーディングをするのなら、きちんとfreeしないと
いけませんし、
たとえ、放っておいても開放してくれるとしても、freeするのはマナーです。
freeが面倒ならC言語に似ている言語であればD言語やJava言語のような
ガベジコレクション付きの言語を使えばよろしい。
オレの通ってるホールには小柄で目の大きい可愛い店員がいる。 その子は最初見た時は(少し遊んでるのかな?)って感じの子だったけど、 挨拶はしっかりしてて、客が呼び出しランプを付けるとすぐに駆けつけて 笑顔で接客する子だった。重そうなコインも頑張って運んで、たくさん出した 人には「おめでとうございます。たくさん出て、良かったですね。^^」って 言ってくれる子です。 オレが何度か通ううちに相手も覚えてくれたようで少しずつ話すようになり、 店でオレを見つけると「あっ」て感じの顔をして笑顔で会釈してくれるようになった。 コイン補給を頼む時や換金する時も、オレの時は必ずその子が来てくれて 「今日もたくさん出てますねっ。良いなぁ^^」って言ってくれて、明らかに他の客とは 違う態度で接してくれるようになった。オレもだんだんその子が気になるように なって、その子に会いたくてホールに通うようになった。
ある朝、開店直後に店に入るといつものように挨拶してきて、 「今日も来てくれたんですかぁ〜」って言ってきたので 「いや〜お姉さんに会いたかったから、来ちゃいました^^;」と冗談まじりで返した。 すると彼女は一瞬ビックリした顔をしたが、みるみる顔が赤くなっていき 「私も・・○○さん(オレの名)が来てくれると嬉しいですよっ」と照れながらも言ってくれた。 普段から気になってたオレは凄く嬉しくて舞い上がってしまった。 いつか絶対誘おうと思っていたのだが、気が弱いオレはそれを言い出せず、 ただそのホールに通う事しか出来ず、そんな状態がしばらく続いた。 ある日、オレがいつものように行くと、彼女の姿が無い。(いつもはこの時間は 必ず入っているはずなのにな・・・・何か用事かな?)と思っていたが、 次の日も、2日後にも彼女はいなかった。オレは気になって仕方なかったので、 他の店員に聞いてみると、「あ〜あの子なら先週やめましたよ」と返ってきた。
オレは呆然として、もうその日は打つ気力も無くなりトボトボと家に帰った。 なんだかもうその店に通う気力が無くなり、いつしか行かなくなってしまった。 そして一ヶ月後・・ドライブしてたオレは家の近くで偶然彼女を見つけた。 その子は歩道を歩いていて、コンビニに入っていった。「あの子だ!!」 オレは焦ってUターンしてそのコンビニに止めると、車の中から彼女の様子を うかがった。彼女は立ち読みをしている。オレは意を決して店に入り、 思い切って声を掛けてみた。「こんにちは。」 彼女は驚いてオレの方を見た。オレは(覚えていてくれなかったらどうしよう・・。) と声を掛けた後で後悔したが、彼女はオレの事を覚えていたらしく、すぐに 「あ〜っ、○○さん!!久しぶりです!」と言ってくれた。 良かった・・覚えていてくれた・・。 オレがホッとしていると、 「この近くに住んでたんですか?知らなかった〜。会えたら良いな〜って思ってたんですよ」 と彼女は言った。続けて、「今ヒマですか?良かったらちょっと遊びません?」 と言った。オレはこのおいしい展開にとまどいつつも、「じゃあオレんち来る?」と 聞いてみた。彼女は一瞬考えたような顔をしたが、照れながらも「はい・・。」 と答えた。
オレの家に着くと、彼女はオレの手に自分の手を乗せてきた。 オレはもう我慢できずに彼女を抱き寄せた。彼女は抵抗せず、オレに 体を預けた。「良い・・?」と聞くと彼女はオレの顔は見ずに黙ってうなずいた。 彼女の服をゆっくりと脱がし、彼女の胸にキスをすると、彼女は可愛い吐息を 上げてオレを挑発した。オレは野獣のように彼女の体を堪能し、 その日はずっと抱き合って寝た。 目が覚めると彼女は隣におらず、オレは夢だったのか?と思って一瞬落ち込んだ。 顔を洗おうと台所に行くと、彼女は・・・いた。「おはよう。ずい分寝てたね」と言い、 それを聞いたオレは(ああ・・夢じゃなかったんだ・・)となんだかとても嬉しかった。 彼女は、「これからも・・よろしくね・・」とはにかみながら言った。 そんなシチュエーションのAVはありますか?とオレがビデオ屋で聞くと、 無精髭を生やしたイカツイ店長は、にこやかにオレの肩に手を乗せ「帰れよ」と言った。
rubyオワッタナ
>>498 あなたの対処は正しいと言える。が、一方で
>>499 >たとえ、放っておいても開放してくれるとしても、freeするのはマナーです。
こういう俺マナーを押し付ける奴がいると
>>497 は過去ログなんか読まず信じちゃうんじゃないか、と危惧したりもする。
最近始めたのですが。 〜略〜 printf("%-6s",moji[10]) 〜略〜 の『-6』の意味を教えてください。
左詰め
ちゃんと検索して下さい
なるほど、数値の値だけ幅が与えられるわけか。 スマンカッタ、ありがとう。
1 12 123 1234 12345 123456 1234567
511 :
デフォルトの名無しさん :04/09/21 22:03:57
free しろ。ガタガタ言うな。それが情報隠蔽だ。
513 :
デフォルトの名無しさん :04/09/21 22:44:54
>>512 低脳のフリをするのが情報隠蔽だ。
それがわからん奴が真の低脳だ。
またか。
お前ら過去スレ全部読んでから言え。
そっか。 このスレだけでも10万近いレスを、みんなが集まって書いたんだなあ。 2ch全体だけでも、途方もない数の言葉が集まったんだろうな。 なあ、もし、漏れたちみんなで力を合わせたらさ、 ('A`)ノ なんでもない。
scanfとかfreeとか空白とか繰り返してたよね・・・
空白とかぼけは最近からのような気もするけど
520 :
デフォルトの名無しさん :04/09/22 13:16:46
それでもポインタは要らない。
printf("ポインタが要らないということは既に証明されただろ。\n");
free(
>>521 );
関数ポインタってありますよね。 あれと、普通の関数の違いがわかりません。 普通の関数 呼び出しと同時に スタックに領域作成 関数ポインタ 作成した瞬間に スタックに領域作成? こんなんでもう6年もコーダーやってます。 はぁ・・・
最後の二行にビックリですよ
fopen()で新規ファイルを作るときにNULLしか返してくれません。 何がおかしいんでしょうか?
>>523 関数ポインタ
関数のアドレスを入れる、ただの変数
>>525 NULLが帰ってきた後にperror実行してみたら?
>>527 perrorって初めて知りました。
こういうのがあるんですね。
早速やってみます。ありがとうございました。
ObjectiveCって何ですか?
どうも。 でしたら、アクセス?だけで 関数ポインタって利用されてるんですか? 利用の意義がまったく見出せません。 仕事向いてないのかな・・・ ハァ・・・
とりあえずqsort使っとけ。
あ、確かに関数ポインタ使ってますね。 これだけの為かorz
なんで?便利じゃん
コンパイル時じゃなくて実行時に呼ぶ関数を決めたい、っていうだけで すぞ>関数ぽいんた
dllみたいな事がしたいと?
いや、ポリモーフィズムだ。
同じシグネチャの関数であれば差し替えて処理できるので便利
コールバック関数とか使ったことないのか? 6年もやってて?マジで? ある意味すごいな
>>523 変数の内容によって、飛び先変えれるとか・・・
int FuncA(int n);
int FuncB(int n);
int FuncC(int n);
int main(void){
int (*hoge[3]) = {FuncA, FuncB, FuncC};
int a, b, n;
n = 0;
a = hoge[n](b); //FuncA
n = 2;
a = hoge[n](b); //FuncC
○ int (*hoge[3])(int) = {FuncA, FuncB, FuncC};
>>539 そういうのはあんまり本質的じゃないな。swich使ってもあまり変わらんし
542 :
デフォルトの名無しさん :04/09/22 17:55:01
#include<stdio.h> #include<stdlib.h> int main(void) { char *s; while(1){ s = malloc( sizeof(char)*20 ); if(s==NULL){ fprintf(stderr,"メモリ確保ミス\n"); exit(1); } printf("%d\n",sizeof(s)); fgets(s,sizeof(s),stdin); printf("%s\n",s); free (s); } return 0; } mallocをつかってずーっと文字を入力させていっては表示させるプログラムを作りたいのですが、 s = malloc( sizeof(char)*20 ); でs[20]みたいな感じにはならないのでしょうか? 3文字入力したら改行が施されてうまくいきません。 そこでsizeof(s)をみると4となることまでは確認できました。
>>541 switchと違って、関数を呼び出す側が詳細を知らなくてもいい
という点が大きく違うな。
>>542 sはポインタだ。
> そこでsizeof(s)をみると4となることまでは確認できました。
ポインタの大きさが4バイトということだろう。
ちょっと整理したいんですが、 私がお聞きたいのは関数ポインタの利点です。 特筆べき利点です。 >switchと違って、関数を呼び出す側が詳細を知らなくてもいい 通常の関数でも引数に△いれれば■が戻り値ですとコメント書いておけば 同じようなもんですよね? アクセスが早いとか、無駄な領域割かなくていいとかは ないんですか?
> アクセスが早いとか、無駄な領域割かなくていい 君のレベルでは、そのようなことを気にする必要はない。
>>546 ははは。ナイスレスですね。
でもしりてぇっす。
>>544 なるほどそうですね。
mallocは542のソースにあるような使い方はしないということでよろしいでしょうか?
>>545 ライブラリとして提供するとする。
それで利用者に関数を用意させる必要がある(qsortのように)とき
どうするんだ?
すいません 548のことはスルーしてください。
>>545 パフォーマンス上の利点はほとんど無いだろう。
タイトループの中での switchよりは速くなるかも知れないけど。
主な利点は、設計が楽になる可能性があること。
#include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { char *s,*t; while(1){ s = (char *)malloc( sizeof(char)*100 ); if(s==NULL){ fprintf(stderr,"メモリ確保ミス\n"); exit(1); } printf("%d\n",sizeof(s)); fgets(s,100,stdin); t = s; printf("%s\n",e); free (s); } return 0; } 動けばいいの? 解説いるの?
↑宣言していない変数が・・・(w 関数ポインタ場合により有用になるってことですか。 んむむむ
回答してるの?質問してるの?
>>545 int func_a(void) {
:
:
}
int func_b(void) {
:
:
}
だとして、
static int (*ftable[])(void) = {
func_a,
func_b,
func_b,
func_a,
};
int state, ret;
:
:
ret = ftable[state]();
とか。
542のが動けばいいのかと思ってソース書き直したけど 変な変数が存在してます。ごみんなさい。
実行効率は悪いけど、 static struct { char ch; int (*func)(void); } ctable[] = { {'*', func_a}, {'+', func_b}, }; #define numberof(v) (sizeof (v) / sizeof *(v)) char symbol; int ret; : : for (int i=0; i<numberof(ctable); i++) if (symbol == ctable[i].ch) ctable[i].func(); とか。
だからね、初めっからどんな関数があるのか分かってんだったら テーブルじゃなくても switch 文で実現できるから本質的でないん だって(保守性の問題とかはあるにしても)。 問題は汎用的なデータを扱うライブラリ(Hash Table とか)を作る とき。ライブラリ作る時点では、(ライブラリの)ユーザがどんなデータ を入れるか分からんから、データに依存する部分の処理はユーザ が自分で関数書いて渡せるようにするの。
561 :
デフォルトの名無しさん :04/09/22 20:19:53
>>523 sage() { }
main()
{
auto (*age)() = sage;
sage();
age();
printf("%u", sizeof sage);
printf("%u", sizeof age);
sage++;
age++;
}
1行ずつ、結果について考察してみれ。
562 :
デフォルトの名無しさん :04/09/22 20:37:57
質問です。 関数ポインタ(* increment)()をつくっといて object->increment(); みたいなことをしたらobject(構造体)の特定のレコードの値を変更させることはできますか? もしできるんならどう書けばいいんでしょう? object->increment(object); だったらできるんだけど、なんかカコワルイ。。
564 :
デフォルトの名無しさん :04/09/22 20:44:36
>>562 (関数ポインタで実行される)関数にレコードへのポインタが与えられていないので出来ません。
どうしてもやりたいのなら、レコードをグローバル変数にするか、C++を使いましょう。
565 :
デフォルトの名無しさん :04/09/22 21:19:36
static で構造体の二重配列を渡そうとしてるんですが、 受け側でうまく処理できません。 strudt A {....} struct A AST[10][10]; ここで sturuct A** として渡しますが 受け側では同じプロトタイプで受けてるにも関わらずArg[n]のアドレスが オカシイのです。
566 :
デフォルトの名無しさん :04/09/22 21:36:32
>>565 [] と * を同一視したがるパラダイムが見当違い
[10][10] を ** では受け取っても正しく処理できない
struct A a[10][10];
main()
{
f(a);
}
f(x)
struct A **x;
{
printf("%p", &a[0][0]);
printf("%p", &a[0][1]);
printf("%p", &a[1][0]);
printf("%p", &x[0][0]);
printf("%p", &x[0][1]);
printf("%p", &x[1][0]);
}
1行ずつ、結果について考察してみれ。
567 :
565 :04/09/22 21:56:54
>>566 まだ考察はしてませんが、コードには[ ]ばかりでなくキャストに
sizeof、考えられる手段を試してみましたがどうも腑に落ちません。
というのも、ある値が文脈でアドレスと見なされた場合、それに加算される
数値は(インクリメントは当然としてsizeofで計算した値も)正確な
アドレスとして評価される筈です。
568 :
デフォルトの名無しさん :04/09/22 21:58:23
>>567 その「正確なアドレス」を正確な日本語で言ってみろ
569 :
デフォルトの名無しさん :04/09/22 22:00:53
ちゃんと考察して、何が必要らしいかがわかってきたら、もっぺん聞くか自分で調べれ
570 :
565 :04/09/22 22:05:16
>>568 その「正確なアドレス」とは、「アドレスと見なされる値」からの
型として設定される値のオフセットで計算される、でよろしいですか。
>>564 やっぱり無理なんですね。
ありがとう。
572 :
デフォルトの名無しさん :04/09/22 22:08:03
>>570 値から型はとれない。ポインタには値しか格納できない。
だから x は 10 に従わない。
573 :
565 :04/09/22 22:13:57
>>572 わかるようなキモしますが、だからこそ、といか、そもそも型がわからない
コードはコンパイルを通らないですよね。そこで上位のアドレスを型変換
した場合にデフォで型を継承してもらわない事には話しにならないと思うのは
私だけでしょうか。
struct a[][10] として渡せ。
575 :
デフォルトの名無しさん :04/09/22 22:27:48
古めの人だからだろ。
void hoge(char *foo) { foo に文字列などを入れる処理 } main() { char buf[128]; hoge(buf); printf("%s", buf); } このようなコードでbufのサイズが50のときはうまく表示、100の時は変な文字記号がまじる、 200の時はうまく表示、1000の時は変な文字記号が・・・の様なことがおこります。 悩んだ末、ふと static char buf[128]; のようにしたところ常にうまく表示されるようになりました。 staticで確保しないとメモリがアヒャヒャなことになるという結論に達したのですが、どうもすっきりしません。 これってプログラムを書く上で当たり前のことなのでしょうか?どなたかバッサリヤってください。
578 :
デフォルトの名無しさん :04/09/22 22:56:29
>>577 マシンはちゃんとアヒャってるんだが
おまいもしっかりアヒャってるんで、気が付かない・・・
わかりる? この相対性理論
>なんでいまだに void で無問題な処理系だから
>これってプログラムを書く上で当たり前のことなのでしょうか? 常識
>>573 こいういのがお好き?
#include <stdio.h>
struct ABC{
int a;
int b;
};
void disp(void *s){
printf("%d \n", (*(ABC (*)[5][10])s)[4][5].b );
}
int main(void){
ABC s[5][10];
s[4][5].b = 3;
disp(s);
return 0;
}
583 :
デフォルトの名無しさん :04/09/22 23:18:54
585 :
デフォルトの名無しさん :04/09/23 00:10:09
全角英数字、半角英数字を使っている文字列がるとします。 文字は半角、全角まざっててもいいし、いろいろです。 こういった種類の文字列が複数あって ソートしたいとします。 qsortでソートしたかったのですが 比較関数でstrcmpを使うと、うまくソートできません 原因はstrcmpが半角にしか通用しないからです。 どのようにすればいいのでしょうか? 助言おねがいします。
587 :
デフォルトの名無しさん :04/09/23 00:17:14
>>585 どういう基準でソートしたいかによる。
文字コードで比較したいのなら strcmp で十分のはず。
ア→ア→イ→イ→・・・・
などの順序でソートしたいのなら、
>>586 にあるように比較関数を作るしかない。
そのためには、漢字コードの表などを使って、自分で比較関数を作るしかない。
64bit整数の加算やシフト演算を実行しているのですが、 単純な加算のループをそれぞれ実行してみると64bitの方が2倍近く遅くなっていました。 Pentium系列の32bitCPUだと64bitの演算は32bitの演算と比べると低速なんだと思いますが、 なんとか64bitの演算を高速(32bit演算並)に実行できないものでしょうか? VC++6.0 SP6でCPUはPen4を使っています。
インラインアセンブラでMMX使ってみたら
>>589 アセンブラの経験はないのですがこれを機に勉強してみます。
>>590 Cのコードを最適化している過程でこの問題にぶつかったので、
この板で質問してみたのですが、こういう話題はアセンブラの話になるのでしょうか・・・。
592 :
デフォルトの名無しさん :04/09/23 00:46:34
○ int a[4][5]; int (*p)[4][5]; p = &a; ×(コンパイルエラー) int a[4][5]; int (*p)[4][5]; p = a; ここまでは理解できるのですが、 ○ int a[4][5]; int (*p)[5]; p = a; ↑ これが通る理由が良く分かりません・・・
>>592 typedefでもして試せば一目瞭然の気もするが。
最後の例は、
aはintが5個の配列が4個並んだ配列で、
pはintが5個の配列へのポインタ。
言い換えれば、
aはある型のオブジェクトが4個並んだ配列で、
pはその型へのポインタ。
ある型が仮にcharなら、char a[4]; char *p; p = a; となり、
いくらなんでもこれはお馴染みだろう。
たまたま型が配列だっただけなのだよ。
595 :
デフォルトの名無しさん :04/09/23 01:40:08
プロのプログラマの方々にお聞きしたのですが、 ビットとかって、実際に仕事で頻繁に使うものなんでしょうか?? 使うとしたら、どういったところで使用するのでしょうか?? できれば、初心者にわかるような解説をお願いします。
>>595 画像処理とか音声処理とかセンサー読んだりフラグ入れたり色々。
597 :
デフォルトの名無しさん :04/09/23 01:49:46
>>596 なるほどなるほど。計算なんかで使用することってありますか?
>>597 ビットを操作する計算なら使用するだろ。
符号は最上位ビットを見るとかか?
600 :
デフォルトの名無しさん :04/09/23 04:24:58
>>598 お答え頂き、ありがとうございました☆
勉強になりました!
>>562 C++勉強しな。そういうこともできるぞ。
602 :
デフォルトの名無しさん :04/09/23 10:20:17
ほんと素人で申し訳ないんですが、 整数xを入力し、xを8倍するプログラムを乗用演算子を 用いずにつくる場合はどんな風にすればいいんですか?
<<3
604 :
デフォルトの名無しさん :04/09/23 10:23:56
>>603 やっぱりそれでいいんですね。10倍なら<<4
でいいんでしょうか?
605 :
デフォルトの名無しさん :04/09/23 10:24:01
606 :
デフォルトの名無しさん :04/09/23 10:25:30
>>604 いいかどうかは実際に確かめてみれば分かるだろ。
int func(int x){ for(int i=1;i<=8;i++) x +=x; return x; }
forループの中で足す
Ruby>>>>>>>>>>>>>>>>>>>>>>>>>整数
>>609 おまえはそんなにRubyの評価を落としたいのか?
611 :
デフォルトの名無しさん :04/09/23 10:30:53
10倍 x = x<<3 + x<<1
613 :
デフォルトの名無しさん :04/09/23 11:01:17
614 :
デフォルトの名無しさん :04/09/23 11:03:24
cout << 3 + x << 1;
char buf[16]; sprintf(buf, "%d0", x); x = atoi(buf);
strcat( char* hoge, char* foo ) をしたとき文字列の連結は成功するのですが fooの示す文字列が2バイト左にずれてしまいます。 foo自身の値がインクリメントされているわけでもないようです。 どなたか指導お願いします。
>>617 おお! すごい!!
どうもありがとうございます。
でもなんでだろう?
小一時間考えてきます。
char hoge[7] = "aiueo"; char foo[5] = "foo"; strcat(hoge, foo); メモリ上のイメージ(0…終端コード, ?…不定値) [a][i][u][e][o][0][?][t][e][s][t][0] ↓strcat [a][i][u][e][o][t][e][s][t][0][0][0] ↑hoge ↑foo
すまん、メモリ上のイメージの最後の[0][0][0]は[0][t][0]の間違いだ。
>>619 うおおぉぉ!感動!
なるほど、この場合hoge[]とhoo[]が
偶然近い位置に配置されていたということも
原因に挙げられますよね。
というか変数の宣言ではそのように配置されてしまうものなのかな?
ちょっと調べてきます。
本当にありがとうございます!
>>601 ありがとう。
オライリーから出てるC++プログラミング入門が良さそうなんで
それでも読んでみます。
623 :
デフォルトの名無しさん :04/09/23 22:10:26
クローンコードをなくしたいのですが、たとえば下記のようなコードって関数にするのがいいのですか? それとも関数マクロでしょうか? if(function(x)){ printf("Function is Success\n"); }else{ printf("Function is Failed\n"); function_error_process(); }
625 :
デフォルトの名無しさん :04/09/23 22:17:16
>>623 頻出なら関数、一度しか出てこないならそのまま。
関数マクロは副作用があるから使わない方が良い。
>>623 あまりに頻出で定型なら
functionとfunction_error_processのアドレスを受け取って処理するとか。
>>607 int main() {
for (int i=0; i<10; i++) puts("test");
return 0;
}
とすると
error: `for' loop initial declaration used outside C99 mode
なメッセージがでるよ??
#define PRINTMSG(dst) {if(dst){printf("Function is Success\n");}else{printf("Function is Failed\n");function_error_process();}} で十分だろ
C99でなければ for (int i=0; i<10; i++) ... ってできない
関数マクロの副作用?
>>629 __VA_ARGS_の機能使ったときはコンパイルで何も文句いわれなかったから
気づかなかったけど、C99使うときはgcc -std=c99 hoge.cなんてするんだな。
BOOL型のサフィックスのIsって何の略ですか?
632 is baka
昔ジャンプでやってたあれ
635 :
デフォルトの名無しさん :04/09/24 16:51:26
俺は今日初心者未経験やる気がある人を重視しますという広告につられ 面接にいった・・俺はCをたしなむんだが、普通に基礎をマスタしてるぐらいだが しかし、いきなり適正検査をしますと・・だされた問題はもろ昔の算数 Aさんは時速なんとかBさんはなんとか距離はいくらとか Aの濃度は%Bの濃度は%とか、こんな問題が延々と一時間やらされた はっきりいってまったくできなく残念ですが、Eです 今回は採用をみなおしますといわれた あ??やるき重視じゃねーのかボケ。。余計な時間とらせやがって 社長がまたいやな感じのやつでよ・・ほんとにあの適正検査ってやつは あてになるのか俺は理系じゃないが、時間をかけたらアルゴリズムとかも 理解できるとおもってる。。あ??? 理系のやつのみってかけやボケが・・・とメールでおくってやった
文系でもそれぐらい出来とけよ。
その程度の問題が解けないなら知障レベルだぞ
文系未満はどこにも就職できないよ。
理系も未満の使い方覚えないと就職できないよ。
それで文系名乗られると文系全体が可哀想だ
c言語↓
#include <stdio.h> int main() { puts("Hello, world!"); return 0; }
644 :
デフォルトの名無しさん :04/09/24 19:06:08
>>635 オマエは世間を知らなさ杉
母数をでかくするのは募集側が当然考えること
母数がでかければオマエより魅力的な奴もそれだけ増える
極めつけは試験の意図がオマエにはわからなかった
それで通ったら却って薄気味悪い
645 :
デフォルトの名無しさん :04/09/24 19:09:35
↓二進数
1
648 :
デフォルトの名無しさん :04/09/24 20:39:46
構文のチェックをするフリーのツールはありませんか? gccでsyntax error at end of inputだけが出るけど何所が間違っているかわからん。
google
いや言葉の意味はわかります。 具体的に何が間違っているのかがわからない。 ので、親切にどう間違っているのか教えてくれるツールがないかなと思ったしだいです。
そのまま入力の終わりに構文エラーだと思っています。 $ gcc a.c b.c -Wall a.c: In function `main': a.c:225: error: syntax error at end of input a.c 221 free(buf); 222 fclose(fp); 223 return EXIT_SUCCESS; 224 } 225 これで入力の終わりに構文エラーだと意味がわからないので 正確な意味を教えてください。
独習C読んでると、fopenのたびに if((fp=fopen("txt","w"))==NULL){… という風にエラーチェックしてるんですが、これって普通なんでしょうか?
>>653 ソースがそれだけでは解からないよ。
;の付け忘れとかよくあるけど…
>>654 エラーチェックしなかったらファイルオープンできたかどうか分からないじゃん。
>>654 エラーが考えられる場所ではエラーチェックするのが普通です。
たとえば、txtというファイルが無い場合はfpを使った処理がうまくいきません。
>>653 gcc は知らんが、{ と } の不整合とか?
>>653 lintとかあるけど、色表示してくれるエディタ使ったほうが早いと思うよ。
あとは変なところに全角スペースが入ってるとか。
>>655 ,659,660
{と}の不整合でした。
ありがとうございました。
括弧の対応を探すと最後の行までいかないといけないから最終行でエラーがになるのかな。
>>653 入力の終わりに構文エラーだからって、原因が入力の終わりにあるとは限らない。
エラーが露呈したのが入力の終わりなのであって、原因はもっと前にあることが多い。
生まれて初めてみたときは一瞬考えるよね、このエラー。 まあすぐに終わりにシンタクスエラーがあるんじゃなくて、 終わりでエラーになったと分かるけど。めったにないけど、 これがでるとifなんかを全部みなおさなきゃならんので ちょっといらっとくる。
最近C始めたばかりなんですが、少し疑問に思うことがあります。 変数って、プログラム書いてるうちに必要に応じて増やすもんなんですか? それとも、使う変数は最初から考えておくんですか?
>>664 そりゃもちろん必要に応じて使うものだが・・
>>664 Cはとくにだが、ブロックの頭でまとめて宣言することが多い。それだけ
>>668 つーかふつうブロックの先頭でしか宣言できんやろ。
670 :
デフォルトの名無しさん :04/09/24 22:25:00
ふつう # 含蓄あるな・・・
C99でなけりゃ常にブロックの先頭でしか宣言できんはずだが?
だから何?
初心者です。 教則本に則って、ギコ、モナー、ジエンの成績を入力し、合計と平(ry というプログラムを書いてみたのですが、while()だらけになっちゃいました。 これは格好悪いかな? 初歩はこんなもんかなのな?
>while()だらけになっちゃいました だからってfor()にすんなよ
>>674 処理毎にです。
配列使って、出来るだけ簡潔にしようとしたら大変なことに。
とにかくソースを晒してミンカイ
でわ後日ネカフェよりうpします。 そんときはよろしくお願いします。 一応仮のトリを
680 :
デフォルトの名無しさん :04/09/25 00:36:01
>>635 だが
はっきりいって、大学入試のほうが簡単だったぞ・・・
まじで・・・ちなみに俺のいってた大学は中の上の文学部だ
あんなのは解けん・・・
>文学部 文系の中でもド底辺じゃんw
682 :
デフォルトの名無しさん :04/09/25 00:45:41
>>680 算数じゃない数学力は超重要
大学出ててこれわかんねーやつ悲惨すぎ
文学部卒を大卒扱いしちゃダメだろ
問題を出す側から言わせて貰えば、 解けない問題に直面したときの対応の仕方を観察させてもらういいチャンスな訳です。 #こっちはお茶してられるしね。 解ける能力があるならよし。対処できる能力があるならそれはそれでよし。 #>635の件もそうなのかは知らんが。
学歴もEランク、適性試験もEランク、書き込み見る限りじゃ人間性もEランク ここまで徹底している奴も珍しいw
686 :
デフォルトの名無しさん :04/09/25 00:59:04
っていうかハジキの問題って一般教養じゃないの? 大卒って言ったら中学までのことは完璧に出来ないと「マジ?」って思われるよ。
CでRPG作りたいんですが、正直難しいと思います。 でもやりたいんです!!僕はHSPでブロック崩し(アルカノイド) ぐらいなら作ったことあります。 今のところ、オープニングまで作ったのですが、どなたか僕に Cの基礎からすべてを叩き込んでくれませんか?? お願いします。
女を連れてきてからだ。
C厨は全員道程
690 :
デフォルトの名無しさん :04/09/25 01:23:18
>>689 が何言ってるのかわかりません。
誰か訳して頂けないでしょうか?
ついでに池沼ってどういう意味ですか?
>>635 よくわからんけど、小学校からやり直したほうがいいのでは?
694 :
デフォルトの名無しさん :04/09/25 05:09:02
v(^o^i)d
695 :
デフォルトの名無しさん :04/09/25 05:10:43
未経験者OKなところなんてないよ。
業務経歴なんて誰も調べねえから適当に査証しとけ。
その代わり相応の実力がないと意味がない。
うちはマジで未経験者OKよん。 その代わり、1ヶ月社内で研修(≒放置)したあと 人月単価が低い案件に放り込むけど。
ないよりは良いと思って、今日もご飯を食べるのです。
700 :
デフォルトの名無しさん :04/09/25 08:11:20
コマンドラインプログラムでイベント工藤ってできるのでしょうか?
できるけど。
702 :
デフォルトの名無しさん :04/09/25 08:19:19
工藤か。マジで200勝で引退なんじゃないかと。
703 :
デフォルトの名無しさん :04/09/25 08:45:29
>>635 だが
文学部だが、一応国立なんだけどセンターで数1と数2も受けてきたんだけど
はっきりいって、まじ難しいんだって
センター試験を元に採用するわけじゃないからなぁ。
問題言ってみ。
706 :
デフォルトの名無しさん :04/09/25 09:09:32
俺が思うに微分積分の問題とかのほうがはるかに簡単だ まぁいまじゃそれも全く解けないが、ようは数学って公式とかだろ その問題も公式さえわかってれば解けるやつばかりなんだよ 俺はもうその手の問題やってないから解けなかったんだけど まぁはっきりいって、あそこの社長のいやがらせだな。 一緒にうけてたおっさんなんて途中でトイレいったままもどって こなかったぞ
ここで自分の惨めな体験を垂れ流す理由は何。
〜だが、〜だが、〜だけど、〜だけど 頭悪そう
スレ違いな話ばかりだな。
710 :
デフォルトの名無しさん :04/09/25 09:33:20
あの、C言語のソースを書いて、コンパイルしようと思って コマンドプロンプトを開いたんですけど、cd c:/←このスラッシュの左右逆向きが打てないんですけど どうやって打つんでしょうか?
スレ違い
>>710 どうやって打つんでしょうねぇ。
日本なら cd c:\でもできるよ。
716 :
デフォルトの名無しさん :04/09/25 09:45:25
どうもです。 \でもできるんですか。 ありがとうございました。
718 :
デフォルトの名無しさん :04/09/25 10:01:39
>>710 US.BAT
又は
CHCP 437
コマンドを使用する。
fclose()でsegmentation faultが起きます。 ファイルも存在していますし。fopen()の後 何も入出力をしなくても落ちます。何ででしょう?
FILE *fp; fopen("test", "r"); fclose(fp); と、予想してみる。
721 :
デフォルトの名無しさん :04/09/25 10:21:58
>>718 そんなために chcp するやつはアフォが伝染るからあっち池
fpがNULLになってないか確認しろ
こんな感じで開いています。 //---- ファイルを指定されたモードで開く関数 int open_file( FILE* fp, char* file_name, char* mode ) { fp = fopen( file_name, mode ); if( fp == NULL ) die_with_message("file open error"); // メッセージを出力して死ぬ lockf( fileno( fp ), F_LOCK, 0 ); return 0; } 入出力なんかも問題なくできます。 なんなんでしょう?
int open_file( FILE* fp, char* file_name, char* mode ) { fp = fopen( file_name, mode ); 何のためにfp渡してるの? 使ってないじゃん。 関数部 int open_file( FILE** fp, char* file_name, char* mode ) { *fp = fopen( file_name, mode ); /* 以下同様に *fp */ 呼び出し側 FILE *fp; open_file(&fp, ... こういう風にしたいの?
>>724 できました。なんか勘違いしてたみたいすね。
助かりました。ありがとうございます。
C言語の構造体のメンバはデフォルトではプライベートですか?
>>727 あえて言えば全てpublicで、面罵関数を持つことは出来ません。
>>731 構造体はあるが、メンバ関数なんて概念はないし必然的にprivateって概念もない。
remove( char* file )に失敗してしまいます。 とりあえず以下は確認しました。 fileの終端に\nがついていたので\0をつけました file はfopen()されていません。 file をファイル名に持つファイルは存在しています。 remove()の戻り値は-1です。 対象となるファイルのパーミッションは644。 ディレクトリのパーミッションは751。新規ファイルの作成はできます。 どのような原因が考えられるでしょうか?
>>733 perror()をつかってみたらどうなるの?
>>734 no such file of directry
とでました。うーん。
すみません、ファイルのパスではなく ファイル名だけでアクセスしていました。 しかもofじゃなくてorだし。 マジですみません。吊ってきます。
さらにスレ違い。
738 :
デフォルトの名無しさん :04/09/25 20:12:09
さて、どのスレor板が妥当か?
>>738 普通にウニ板だろうが、
犬板に隔離措置を希望。
741 :
いなむらきよし :04/09/25 21:14:43
どっちにしろ俺が奇形なのは変わりないキケー!
742 :
デフォルトの名無しさん :04/09/25 22:24:41
構造体について教えてください
>742 クラスからメンバ関数、アクセス指定子、継承などを取り除いたもの
>745 C++またはJavaスレで聞いてください
>>745 構造体にメンバ関数、アクセス指定子、継承などを加えたもの
>>744 と
>>748 をまとめると、構造体は
「構造体にメンバ関数、アクセス指定子、継承などを加えたものから
メンバ関数、アクセス指定子、継承などを取り除いたもの」
らしいw
ネタにいちいちマジ反応するなよ
構造体について知りたきゃ本やweb見ろよ。 その上でわからないことがあったら答えるから。
int hikaku(int a, int b) { int z; if(a>b)z=a; else z=b; return z; } int main(void) { int a, b, z; printf("aを入力してください\n"); scanf("%d", &a); printf("bを入力してください\n"); scanf("%d", &b); z=hikaku(a,b); printf("大きいほうは%dです\n", z); return 0; } こんなエラーが出ましたが、教えてください dim03.c 11: Warning: function 'printf' undefined -- assumed to be int dim03.c 12: Warning: function 'scanf' undefined -- assumed to be int
#include <stdio.h>
エラーと警告の区別もつか(略
>>753 初歩的なミスですね^^
ありがとうございました。
> function 'printf' undefined コンパイラが吐くメッセージにしてはいいかげんだな。
(´-`).。oO(“コンパイラが吐くメッセージにしては”?)
758 :
デフォルトの名無しさん :04/09/26 12:07:17
初心者な質問ですみません。基本情報の勉強しててわからなかったので どうか教えてくださいませ。 main() { char *days{}={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; int i; for(i=0;i<7;i++) printf("%d:%s\n",i,★); } SanからSatまで出力するプログラムなんですが、★にはいるのは days[i]か*(days+i)になるとのことですが、 %sで出力する場合は文字列の先頭アドレスを指定するんですよね?? それなのに何でdays+iではなく実体を表す*(days+i)になるんですか?
759 :
デフォルトの名無しさん :04/09/26 12:16:23
>>758 days は、文字列のポインタのポインタです。
days :文字列へのポインタのポインタ
*(days+i):i番目の文字列へのポインタ
*(*(days+i)+j):i番目の文字列の j 番目の文字
days[i]:i番目の文字列へのポインタ
days[i][j]:i番目の文字列の j 番目の文字
最初は混乱するかも知れません。
760 :
デフォルトの名無しさん :04/09/26 12:38:17
>>759 なるほど。ポインタを表すということですか!
*がつくから、*(days+i)はSunやMonなどの直接の
文字列を表すものだと思っていました。
そういうものなんだなぁと割り切って覚えることにします!ありがとうございます!
char *days[]; と宣言したなら、実体も同じ様に *days[]
762 :
デフォルトの名無しさん :04/09/26 12:41:25
>>757 define と declare の区別もつか (ry
763 :
デフォルトの名無しさん :04/09/26 12:46:27
764 :
デフォルトの名無しさん :04/09/26 12:53:08
>>758 どうでもいいがそれだとエラーでるぞ。 一応つっこみ
765 :
758 :04/09/26 13:14:55
>>764 ですねー。*days{}→*days[]でした。
ポインタ配列むずかしー
>>758 勉強中ということだが、
文字列リテラルは const であるという突っ込みは入れたほうがいいのだろうか?
767 :
デフォルトの名無しさん :04/09/26 13:23:50
>>766 758を見る限り traditional C を勉強中のようだが
769 :
デフォルトの名無しさん :04/09/26 22:32:49
言語仕様や『はじめてシリーズ』ではなく、 おすすめの C の問題集があれば教えてください。
#!/bin/cci #include <stdio.h> ... とかやっといてインタプリタで実行してくれる処理系ってないの?
るby!!!!!
772 :
デフォルトの名無しさん :04/09/26 23:42:36
パスが "c:\UNKO\CHINKO\12345678.txt" のテキスト名[12345678]だけを取り出したいの ですがそのような関数あるのでしょうか?なければどなたか教えてください。
後ろから '\'および'.'を探せ strrchr()
>772 MS系ならsplitpath()
775 :
デフォルトの名無しさん :04/09/27 01:46:08
数値をバイナリに変換したい場合どうすればいいんですかね
>>775 バイナリ形式でファイルに保存したいってこと?
777 :
775 :04/09/27 02:03:13
バイナリ形式というのか...例えば数字が1だったら31に変換して保存したいんですよね。
わけわかんね。 文字コード? "0123456789"[number] ってのが一般的だろうな(numberが一桁の場合) アスキーでいいなら number+30 で十分だろ(同上)
それはバイナリ化ではなく、文字コードの取得というのでは・・・
>>779 うむw
atoiとかstrtolとか使え。
781 :
デフォルトの名無しさん :04/09/27 05:31:49
C の初歩習ってるところなんですが、 繰り返しでfor文とwhile文ってありますよね for文でしかできないことってなんですか? よろしくお願いします
そんなものはない
ワナビーと言われてよっぽど悔しかったと見えるw
>>781 for (exp1; exp2; exp3) {
exp4;
}
はつねに
exp1;
while (exp2) {
exp4;
exp3;
}
と書き換えることができる。なのでforでできることはwhileでもできる。
>>781 int i;
for (i = 0; i < N; i++) {
〜
}
↓
int i = 0;
while (i < N) {
〜
i++;
}
こういう具合にforを使っているコードは全てwhileを使うコードに書き換えられる。逆も然り。
>>781 forは一定の回数繰り返す、whileは条件があっている間繰り返す と
言う感じに使い分けるといいよ。
for (i = 0; i < N; i++)
while (i < N)
の N がループ内で変化しないとき(外で変化するのはOK)はfor、変化するときはwhile。
言語によってはforだとNがキャッシュされてループ内で変更しても
最初のNを使用するのもあるし。
但し例外があって、 for (expr1; ; expr3) { expr; } は expr1; while () { expr; expr3; } とは書き換えられない。この場合は expr1; while (1) { expr; expr3; } などとする。
for (exp1; exp2; exp3) { exp4; } 上のコードを下のように書き換えることも。 exp1; Loop: if (exp2) { exp4; exp3; goto Loop; }
788 :
デフォルトの名無しさん :04/09/27 11:32:57
予約語たくさんあるHPあれば教えて下さい。(80ほど)
continental consaltant
>>790 consultantだろと小一時間(略
exeファイルをエジタに関連付けたら、 エクスプローラでダブルクリックしても プログラムが動かなくなってしまいました。 どうやって元に戻したら元通りになりますか?
エジタとは?
#include <stdio.h> #include <stdlib.h> #include <math.h> #define POW_OK 0 #define POW_NOTHING 1 int most_simple_algorism( unsigned long int x, unsigned long int y, unsigned long int * n) { unsigned long int i; double p; if (x == 0 && y == 0) return(POW_NOTHING); if (x < 2 && y > x) return(POW_NOTHING); for (i = 0; ; i++) { p = pow(x, i); if (p < y) continue; *n = i; break; } return(POW_OK); }
int main( int argc, char * argv[]) { int print, ret; unsigned long int x, y, xm, ym, n; if (argc < 3) { printf("usage: %s x y [print]\n", argv[0]); exit(0); } xm = atol(argv[1]); ym = atol(argv[2]); print = (argc > 3); for (x = 0; x <= xm; x++) { for (y = 0; y <= ym; y++) { ret = most_simple_algorism(x, y, &n); if (!print) continue; printf("%ld^n >= %ld ... n = ", x, y); if (ret == POW_OK) { printf("%ld\n", n); } else { printf("Nothing!\n"); } } } }
800 :
798 :04/09/27 22:40:52
800ゲトー。
高卒で数学の解法もよく分からないので教えていただきたいのですが、
x と y が与えられているときに、x^n <= y を満たす n を求めたいのです。
現時点では
>>798-799 の most_simple_algorism で実装している
超初歩的なアルゴリズムしか思いつきません。
for で n を一つずつ増やしていっているだけです。
このコードを Cygwin + Windows 2000 上で実行したところ、
$ gcc myalgo.c && time ./a.exe 100 100000
real 0m12.399s
user 0m12.108s
sys 0m0.015s
という結果になりました。
何かいいアルゴリズムがあれば教えてください。数学関係のキーワードでも構いません。
なにしろ全く想像もつかないので。。。
よろしくお願いします。
あ、あとできれば n と y が与えられているときに、x^n <= y を満たす x を求める方法 も分かればありがたいなぁ、と。 やりたいことは複数階層のディレクトリを作って 大量のファイルを散りばめたいといったことなんですが、 こういうアルゴリズムを使えれば面白いかな、と思ったわけです。
(int)(log(y)/log(x))
>>802 ありがとうございます。
それで求まるんですか?
ちょっとウェブで調査してから
コードをいじくってみます。
>>798-799 を
>>802 さんの log を使って書き換えてみました。
< for (i = 0; ; i++) {
< p = pow(x, i);
< if (p < y) continue;
< *n = i;
< break;
< }
---
> *n = (unsigned long int)(log(y)/log(x));
そしたらめちゃんこ早くはなったんですが、
$ time ./a.exe 100 100000
real 0m2.960s
user 0m2.796s
sys 0m0.015s
結果がちょっと変です。
$ ./a.exe 2 10 print
2^n >= 2 ... n = 1
2^n >= 3 ... n = 1 <--- 2 のはず
2^n >= 4 ... n = 2
2^n >= 5 ... n = 2 <--- 3 のはず
なぜでしょう? 私の組み入れ方が間違ってるんだと思いますが。。。
x^n=y n=log_x_y n=(log_e_y)/(log_e_x) n*log_e_x=log_e_y log_e_x=log_e_y^(1/n) x=y^(1/n) でねーのか? 高校の参考書引っぱり出して計算してみたんだが間違ってるかも。
x=y*e^(1/n)
>>805-806 こんなの高校で習うんでしたっけ。。。
えーと、具体的にどうコードに落とせばいいんでしょうか。
e って何ですか?
e=ネイピア数
>>812 >e=2.718281828459045...
>っていう定数なんですね。
…本当に高校出ているのかと。
>>806 見直してみたんだが
x^n<=y
となる最大のxは
x=y^(1/n)
で、eはいらないと思う。
>>814 x^n<=y
から
x<=y^(1/n)
を導くのにあれだけのステップを踏める(しかも結果が合ってる)君に感動した。
分かりました!
>>804 は切り上げればよかったみたいです。
< *n = (unsigned long int)(log(y)/log(x));
---
> l = log(y)/log(x);
> *n = (unsigned long int)l;
> if (l - *n > 0) *n += 1;
これで少なくとも x = 2, 0 <= y <= 10 まではうまくいきました。
>つか、n 乗根とれば一発な罠。 気づかなかったよ..orz つーかアホ棚俺。。
>>815 あれれ? どっちが正しいんだろう。。。
y が合計ディレクトリ数で、x が max_depth で、
n が max_branch だから、、、
max_dir = x^n になるわけで、max_dir >= total_dir
でなきゃいけないから、
・・・すみません。
「x^n <= y を満たす n」
は
「x^n >= y を満たす n」
の間違いでした。
yが正ならね。
n>=log_x_y
じゃあきっと
>>801 「n と y が与えられているときに、x^n >= y を満たす x を求める方法」
ってのも
x = (unsigned long int)pow(y, 1/n);
みたいな感じでうまくいくかもですね。
切り上げとか切り下げとかはやってみなきゃ分からないけど。
>>813 高校卒業したけどたぶんlogだのネイピア数だの習ってません。
高校二年のときは一学期100点で三学期0点でしたし、
三年のときはもう数学は捨てることにして、一番簡単な
医療・看護系受験対策用の数学しか選択しませんでしたから。
数学オンチのくせにプログラマ (普段は C++ しか触りませんが)
やってる高卒DQNのしょうもない質問にお答えいただきまして
本当にありがとうございました!
やってないから知らなくていいとか言う奴師ね
824 :
781 :04/09/28 01:37:34
遅くなりましたが、〜787までの方々ありがとぅございました 。
826 :
デフォルトの名無しさん :04/09/28 02:11:17
妄想癖キモいね
unsigned char *buf[] = { "\xFF\x00\xFF........................." "..............................................................." . . "...............................................................", "..............................................................." . . "................................................................", (中略 }; clコンパイラで /Zm2000 などを指定しても C1063エラー などになってコンパイルできません。 かなり巨大な文字列をコンパイルするにはどうすればよいのでしょうか? 細かくコンパイルしてリンク??
828 :
デフォルトの名無しさん :04/09/28 03:29:55
外部ファイルに出してリンク時にリンカでまとめるとか。 clコンパイラ知らないんで、できるかどうかわからないけど。
イッテキマス。
指定のディレクトリ以下のファイルを読み込む方法てありますか?
あるでしょうけどスレ違いですね
835 :
デフォルトの名無しさん :04/09/29 04:51:49
if(...){ aaa(); } を if(...) { aaa(); } に展開してくれるツールありませんか?
>>835 unix系ならindentってコマンドがあるはず。
他は知らん。
>>837 楽しそうだね。おれはRuby使うけど、君には使えそうもないね。
どこへでも出張してきて迷惑な話だ。
>>835 高度なオートインデント機能のあるエディタならマクロでも組んで自動化できそうだが。
#少なくともemacs系ならできる。
それはいいが、スレ違いだろう。
DLLの中に画像ファイルをいれることはできますか
REN *.bmp *.dll
>>841 ツールの使い方を知りたいのなら、そのツールのスレへ
C言語から入れる方法を知りたいのであれば、Win32 API スレなどへ
そーですか。
846 :
デフォルトの名無しさん :04/09/29 13:21:27
質問です。 #include <stdio.h> const char* komastr[2][8]={{ " ", "FU", "KY", "KE", "GI", "KI", "KA", "HI", "OU", "TO", "JU", "NK", "NG", "", "UM", "RY"}, {"", "fu", "ky", "ke", "gi", "ki", "ka", "hi", "ou", "to", "ju", "nk", "ng", "", "um", "ry"}}; int main(int argc, char** argv) { int i, j; for (i=0; i<2; i++) for (j=0; j<2; j++) printf("%s ", komastr[i][j]); return 0; } (エラーメッセージ) Error array2d.c: 5 too many initializers Error array2d.c: 7 too many initializers 2 errors, 0 warnings それほど多くの要素数でもないのに too many initializers なのは何故でしょうか?
>>846 2*8しか用意してないのに32個も入れるなよ
それをやるなら[2][16]
>>847 そうでしたorz ありがとうございますm(_ _)m
"ab"がchar[3]であることには誰も突っ込まないのか?
「const char*」、アンタバカデスカ
>>849 そこはおかしいとはいいきれない。
char [2] = "ab";
は正しいから。それが意図してる物かどうかは別として。
2文字分の場所が取られてaとbの文字が順番に入ってる配列が定義される。
それ以前にchar型へのconstポインタの二次元配列だから
853 :
デフォルトの名無しさん :04/09/29 15:39:35
#include<stdio.h> int main(void) { int min = 5 ; int max = 10 ; int input ; printf( "Plese input \"0\" or \"1\" ! \n" ); scanf("%d",&input) if( input ) #define CHANGE < else #define CHANGE > if( min CHANGE max ) printf("MAIN\n"); else printf("__NO__\n"); return 0; } もちろんエラーですが、こういう事をやりたいんです。 入力した数字によって、ある部分を置き換える処理… なんとかできませんでしょうか? どなたか知恵をお貸しください。 onegaisimasu
854 :
デフォルトの名無しさん :04/09/29 15:42:46
激しくネタっぽい
855 :
デフォルトの名無しさん :04/09/29 15:49:19
大真面目ですが… 当たり前の事で低級な質問だったとしても、 聞かなきゃわからないこともあると思うんです。
インタプリタなら出来る道もあるんかね まぁ、やりたい事は条件分岐で実現出来ないのかと疑問だがね
857 :
デフォルトの名無しさん :04/09/29 15:55:04
inputの値によってmaxとminを交換して<(か>)で比べればいい。
if ( (max-min)*(input*2-1)>0 ) printf("MAIN\n");
int cmpflg; int cmp(int n1, int n2) { return cmpflg ? n1 < n2 : n1 > n2; } inta main() { ... if( input ) cmpflg = 1; else cmpflg = 0; if(cmp(min, max)) printf("MAIN\n"); else printf("__no"); return 0; }
860 :
デフォルトの名無しさん :04/09/29 16:13:56
861 :
デフォルトの名無しさん :04/09/29 16:16:04
う〜ん、、、純粋な文字置換はやっぱ無理っぽいですね。 けど、こんな馬鹿な質問に答えていただきありがとうございました。 嬉しかったです。
> GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
863 :
デフォルトの名無しさん :04/09/29 16:44:30
864 :
hana :04/09/29 17:49:44
for(i=0;i<=X_NO;i++) for(j=0;j<=Y_NO;j++){ if( a > b) printf("big\n"); }else if ( b < a ){ printf("small\n"); } } このプログラムだと、for文が画像を一点ずつ読んでいるため SMALLがいくつも表示されてしまうのですが、 これを ひとつの表示にまとめたい場合 どうすればいいですか?
867 :
hana :04/09/29 18:05:02
すいませんでした移動しました すれ違いでしたか、、、
>>867 つまり君がその問題ごと悩んでいる点を全てさらけ出せって言ってるんだよ.
言ってる意味が分からんのだよ
870 :
860 :04/09/29 20:53:11
>869 fork()ですか・・・。もっと簡単に、関数の返値で受信サイズ調べられるとうれしいんですが・・・。 >862 逝ってきます。 ありがとうございました。
文字列変数に別の文字列変数から代入するにはどうすればよいのでしょうか? #include<stdio.h> void main() { char a[4][5]; char b[4][5]={"ぬる","ぽガ","っ!","!!"}; a[0] = b[0]; } とすると一番下の式の左辺に値が必要というエラーがでます。
>871 フツーにstrcpy()では? strcpy(a[0],b[0]);
for(i=0;i<4;i++)strcpy(a[i],b[i]);
874 :
デフォルトの名無しさん :04/09/29 21:37:50
お前らCで配列の代入が出来ない理由知ってるやついますか? サイズが同じ配列へなら代入してもかまわんと思うが。 関数から返せないのも痛すぎる。 構造体に入れれば出来るというのがわけわからん・・・。 今まで出来なかったことを出来るようにするだけだから仕様変更しても誰も困らんと思うし・・・。 実はC99では出来るようになってたりするのか?
877 :
デフォルトの名無しさん :04/09/29 23:58:20
ソフトしかわからん奴の限界
878 :
こちらへ誘導されたので :04/09/30 00:04:42
C言語初心者です。 すいませんどうか助けてください。 ファイルから読み込みそれを別にファイルに書き込む基本的なことしてるんですが、 条件がありまして、 @fgetc(fp)で順次読み込んだ文字がリターンキーなら次に文字を見る。 Aその文字が 0 〜 9 か 'ー' 〜 '九' ならファイルをcloseする。 という仕様なんですが文字列操作がうまくいきません。 かな文字や関数字の判定ができません。 イメージとしては while ((ch = fgetc(fp)) != EOF) { fputc(ch,fwp); if (ch == 13) ← リターンキーのasciicode { ch = fgetc(fp); ← これで次にすすめているのか怪しい 以下不明・・ } } すいませんが文字をすすめたり漢数字の'一'判定のために どのようなコードを書けばよいかわからないので どなたか教えてください・・
879 :
こちらへ誘導されたので :04/09/30 00:07:56
すいません 条件Aの修正。 Aその文字が 0 〜 9 か 'ー' 〜 '九' ならリターンキーに戻って fcloseです。
880 :
デフォルトの名無しさん :04/09/30 00:24:01
>>876 ポインタの代入ができなくなるからダメ。
881 :
デフォルトの名無しさん :04/09/30 00:25:48
>>860 ああ、おいらも同じ問題で困ってた。ちょっと調べたところ
CTS信号の状態をみればデータが来てるかどうか分かるらしいんだけど
CTSがHiになってるときにreadするようにすればいいんだろうか?
Bその文字が 0 〜 9 か 'ー' 〜 '九' でなかったらそのまま 読み進める、でいいの? だったら break を使えばいいのではないかな。思いつきだけど。 文字コードが数字であり、尚且つ連番になってることを利用する。 while ((ch = fgetc(fp)) != EOF) { //リターンキーの場合 if (ch == '\n') { ch = fgetc(ch, fwp); //次の文字を読む //終了条件チェック。真なら終了。 if ((ch >= '0' && ch <= '9') || (ch >= 'ー' && ch <= '九')) { break; //続く場合は処理続行 } else { fputc('\n', fwp); fputc(ch, fwp); } //リターンキーでない場合 } else { fputc(ch, fwp); } } fclose(fp); fclose(fwp);
ごめん、fgetc() の引数はファイルポインタだけだった(fgets() しか つかってないからつい)。 あと、終了のbreak;の前に fputc('\n', fp); で改行はしておかない といけないのかな。
884 :
デフォルトの名無しさん :04/09/30 00:34:57
>>882 > ch = fgetc(ch, fwp);
fgetcってこんな引数だったっけ?
> || (ch >= 'ー' && ch <= '九')) {
これって、成立することあるの?
>>884 漢数字の「一」(いち)じゃなくて音引きの「ー」でいいのかなあ…
いや、元の質問からそうなんだけど。
>>885 すいません、すれ違いだとは思ったんですが同じような疑問持った人のレス
があったもんで。ちなみにこの手の質問はどのスレが適当なんでしょうか?
>>888 Linux板はチェックしてたんですがUNIX板の方にプログラムスレがあったとは
気づきませんでした。有難うございます。
>>878 nkf -w を噛ませた上で
Javaを使う。
>890 残念、そこはム板のUNIXスレだ。
>>882 文字コードをそのままあつかわない方がよいよ
>>894 扱わないほうがいいとかいうレベルじゃなく
>(ch >= 'ー' && ch <= '九')
ぶっちゃけありえな〜い。
いや、ありうるだろ
897 :
デフォルトの名無しさん :04/09/30 13:10:46
一や九が2byteな環境なら、その式だけ抜き出せばアリかもしれんが、 getcでナニを受け取る気だという意味でアリエナーイ
べつにcharsetのいかんによっては、ありうるかもしれん ってことだろ
'九' の型が unsigned int になるなんて知らなかった…。 型は環境にもよるんでしょうけど。 というか、'' の中には 1バイト文字を1文字しか入れられなくて、 Cでは常にintで 文字コードが返されるもんだと思ってた。 1文字どころか 'ab'なんてのも許されるんですね。この場合エンディアンの 影響も受けるんですかね。''がよく分からなくなってきた。
901 :
デフォルトの名無しさん :04/09/30 15:18:20
>>900 一応、ANSI だと
・単純文字定数は int 型。
・1バイトを超えるときの値は、処理系定義。
因みに fgetc は
・ストリームから文字を unsigned char 型として取り出し
・int に変換して戻す。
fgetcたん萌え
VBとかにあるタイマーコントロールをCで実現するにはどうすりゃいいの?
905 :
デフォルトの名無しさん :04/09/30 22:10:16
fopenでweb上のファイルって開けますか?
>>906 やっぱできないですか。Cでweb上のファイルを開くやり方ってあるんでしょうか?
908 :
デフォルトの名無しさん :04/09/30 22:36:32
本当はSafeStrでも使えばいいんでしょうけど、 とりあえず社内で使うテストツールということで、 簡易的なチェックを入れることにしました。 あふれそうだったら不正な値なのでエラー終了決定です。 で、こんなの作ってみたんですけど・・・。 #define my_strcat(tgt_char, const_char, max_size) \ assert(strlen(const_char) <= max_size - strlen(tgt_char)); \ strncat(tgt_char, const_char, strlen(const_char)); #define my_strcpy(tgt_char, const_char, max_size) \ assert(strlen(const_char) <= max_size); \ strncpy(tgt_char, const_char, max_size); char foo_str[MAX_FOO]; char tmp[MAX_NUM]; /* あくまで例です */ snprintf(tmp, MAX_NUM, "%d", num); my_strcpy(foo_str, "test number=", MAX_FOO); my_strcat(foo_str, tmp, MAX_FOO); my_strcat(foo_str, "\n", MAX_FOO); こんな感じにしてるんですけど、変なところありますか? あと、あまり複雑or大規模にならずにもっとうまい方法があれば ご教示いただけますか? よろしくお願いします。
C言語なら(ちょっとは調べてから)俺に聞け! Part 91
>>906 出来ないとは限らないぞ。
出来る環境があるとは思えないが。
VBなら・・・
912 :
デフォルトの名無しさん :04/09/30 23:45:32
質問なんですが、VC++ってネットにつながないと使えないのですか?
>>908 そのマクロ、if や else の後ろで { } なしに使っちゃダメだぞ!
それと、戻り値を見てもいけない!お兄さんとの約束だ!
918 :
デフォルトの名無しさん :04/10/01 00:34:34
while((cGet = fgetc(fp)) != EOF) で、ファイルポインタであるfpのアドレスがずっと不変なのはなぜですか? 次々文字を読み込むからfpのアドレスが進んでいると思ったのに実際は違っていました。 ということはfpのなかにあるポインタらしきもののアドレスが動いているということなのかな? 教えて天才さん。
rruuuuuuuuuuuuuuuuuuuuuuuuuubjjjjjjjjjjjjjjjjidffffffffffuuuuuuuuuuuuuuuuuuuuddiiiyyyyyyyyyyyyyyyyyyy
>>918 ファイルポインタは何だか分かってますか
921 :
デフォルトの名無しさん :04/10/01 00:43:52
fopenしたファイルの中の文字列だとおもって早3年。 実際はどーゆーもんですか??
VCでは struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE; こんな感じ。
923 :
デフォルトの名無しさん :04/10/01 00:52:45
>>918 おまえが言っているファイルポインタはFILE型構造体へのポインタではないのかと
, ─ヽ ________ /,/\ヾ\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |__|__|__|_ __((´∀`\ )< 結局・・・わかりやすく説明してくれる神は現れなかったとさ。 |_|__|__|__ /ノへゝ/''' )ヽ \_____________________ ||__| | | \´-`) / 丿/ |_|_| 从.从从 | \__ ̄ ̄⊂|丿/ |__|| 从人人从. | /\__/::::::||| |_|_|///ヽヾ\ / ::::::::::::ゝ/|| ────────(~〜ヽ::::::::::::|/
独習Cで勉強してるんだけど、練習問題が面倒で解く気しない。 こんな場合、さっさと次の単元に進んじゃっていいのかな?
>>926 まあそういわずやってみれ。
その本は読んだことないから一般的なことしか言えんが、
そこでやったことを理解できてるかどうか計る目安になる。
読む速さを競ってるわけじゃないんだから一旦立ち止まってみれ。
「こんな問題簡単ジャーン、なんかやる気しねーなー、もう頭に答浮かんでるし」
と思って実際に解こうとしたら意外な伏線があったりしててこずったりするもんだ。
>>926 練習問題そのままは(たいがいつまらないから)やらなくていいと思うけど、
自分流にアレンジして見ると面白くなる。
萌オタなら萌える問題に勝手に書き換えてみ。
創造的な学習は上達も早い。
|<memory>
│
│ (1)確保 (2)確保
| FILE構造体の実体 読み込みbuffer
| fp ← fopen() ←┌───────┐ ┌→┏━━━━━━━━┓
| (4)返却 ├ ┤ │ ┃ ┃
| ├ (3)初期設定 ←┼─┘ ┃ ┃
| ├ 関連付け等 ┤ ┃ ┃
| ├ ┤ ┃ ┃
| └───────┘ . ┃ ┃
| ┃ ┃
| ┗━━━━━━━━┛
│
>>925 じゃ、大雑把に教えてヤル。イメージはこんな(↑)感じ。
fopen()を呼ぶと、メモリのどっかにFILE構造体の実体(細い□)と読み込みバッファ(太い□)を
確保して、FILE構造体にもろもろ情報をセットしてから、その先頭アドレスを返す。(1)〜(4)
んでfgetc()やfgets()などを呼ぶと、適宜ファイルの内容を読み込みバッファに読み込みつつ
そこから文字(列)を拾って、FILE構造体の中の変数を更新して返す。
ネ?fpに入れたポインタ、つまりFILE構造体の実体の先頭アドレスがコロコロ変わるハズが無いでしょ?
ヘッダ覗けば解る事を「教えて」とか言う人には 説明してもわからないでしょ。
非論理的。
>>902 なるほど、1バイト以上の文字を囲んだ場合は処理系定義
(implementation-defined?)なんですね。移植性は失われると
>>907 socketでソケットをオープンしてHTTPリクエストを送り、HTTPレスポンスヘッダを読み終えた直後で
fdopenするという方法は?
そもそも文字が1バイトかどうかが処理系定義じゃないか?
918の人じゃあないけど、お陰様で思わぬお勉強になりました。 自分はFILEポインタなんて弄くった事のない厨房です。今日初めて使ってみました。 で、ひとつちょっとした疑問が浮かんだんですけど、fscanf()呼ぶと\nとかの改行まで 読み込んでくれるんですか? レベルの低い質問ですみません。
そりゃ指定したフォーマットに従って読み込みますわな、 そういう関数なんだし。
なるほど。もう少し突っ込んだ質問をさせてください。 ちょっと迷惑ですが、ソースを投下します。 #include<stdio.h> void main( int argc ,char **argv ) { FILE *sfp ,*lfp ; char st[200] ; if( argc < -1 ) { printf( "ドラッグしな!" ) ; } else { sprintf( &st[0], "%s.bak" , *(argv+1) ) ; lfp = fopen( * ( argv+1 ) ,"r" ) ; sfp = fopen( &st[0], "w" ); while( fscanf( lfp, "%s" ,&st[0] ) != EOF ) { fprintf( sfp, "%s\n", &st[0] ) ; } fclose( sfp ) ; fclose( lfp ) ; } }
void main はちょっと恥ずかしいかもしんないけど。
で、
>>937 なんですけど、確か1年前学校で習いました。
作ったって言ってもそれ引っ張り出して、ちょっと改良しただけですけど、
学校ではこう習いました。
fscanf( lfp, "%s" ,&st[0] で、\0まで文字列を読み込んで、
fprintf( sfp, "%s\n", &st[0] で、●●.bak(ファイル名)に書き出す。
そんで、lfpが次の行に移動して、また\0まで読み込んで、を繰り返す。
けど、これでは明らかに説明の食い違いを感じましたのです。
918の人もきっと同じような解釈をしていたという事でしょうか。
結論として、lfpが次の行に移動するわけではなく、\nを読み込んで
次の行に行くって事で良いですか??
長文・・・どうか大目に見てください。
printf( "ドラッグしな!" ) ; ←自分用に作ったんでこうなってます(鬱 俺の解釈・・・間違ってますか? 先生に習った解釈をかえるのって結構不安なんですょ。 最後の頼りになるはみなさんの意見や指摘だけ。
それはストリームの概念が理解できていないのではないか? [00][01][02][03][04][05][06][07][08][09][10][11][12][13][14][15]... このような情報の「流れ」(まさに「ストリーム」)を考える。最初に[00]を読む。 一度[00]を読むと次は[01]の順番。[01]を読んだら次は[02]の順番。FILE 構造体にはこのような、次に読み取る位置の情報が記憶されていると思えば いい。(実際、手元の実装では、struct FILEにpositionというフィールドがある。) fscanfはこの読み取り位置を更新する。実際にファイルポインタのポインタと しての値を操作しているわけではない。だから*lfpは更新されているけれども lfpは変わらない。
if( argc < 2 )
>>937 > lfpが次の行に移動するわけではなく、\nを読み込んで
> 次の行に行くって事で良いですか??
まぁそう。
つか、マニュアルにどういう動きをするのかきちんと書いてある。
「先生に習った解釈では〜」とか言う前に、まずマニュアルを参照すること。
なるほど。おっしゃるとおりでストリームって概念が自分は理解できていなかったようで。。。
いま初めて聞きました。
読み込んだデータをズラーっと横に並べる感じかとイメージしている現在です。
ということは、読み込むbufferの領域は結構でかそうですね。
なにはともあれ、少々勉強不足の気がいたします。
貴重な解説ありがとうございました!
あと自分は環境を明示してなかったけど、VCです。インクルードファイル調べたら
>>922 と同じのがありました。
見てもあんまわからなかったけど、次に調べるべきキーワードとか発見できてよかったっす。m(._.)mペコ
>>942 そうですね、返す言葉もないっす。次から・・・というか、気をつけるようにはしています。
けどマニュアルってなんかわかりにくいです(;´Д`)
慣れるまで辛そうですが、頑張ってみます^^
お二方ともアリガトウです!!
>>943 ただ、インクルードファイルの内容を前提にプログラム組むなよ。
FILE構造体のメンバに直接アクセスしようとは思わないことだ。
mallocで取得したメモリー領域は4バイトアラインメントだと思っていたんですが、 ググってたら、 GNU libc のmalloc() は常に 8 バイトにアラインメントされたメモリアドレス を返すとありました。でも typedef struct { int a; int b; char c; } tmp_t; とやって printf("%d\n", sizeof(tmp_t)) とやると12バイトと表示されます。 8バイトアラインメントだとすると16バイトになる気が するのですが、これはやっぱり8バイトアラインなんでしょうか?
その構造体とmallocって関係あるの?
mallocが8バイトアラインメントの領域のアドレスを返すということと、 スタックに確保した自動変数領域がそのように確保されるかどうかと いうのは別の話なのでは?
>>946 mallocと全く関係ない。
> とやって printf("%d\n", sizeof(tmp_t))
> とやると12バイトと表示されます。
構造体のアライメントが4バイト単位だったということだろう。
>>947-948 ああ何か混乱して書いてました、すみません。
tmp_t*p = (tmp_t*)malloc(sizeof(tmp_t));
した時、 sizeof(tmp_t)で計算された12バイトという値がmalloc
に渡ったとします。その場合、malloc(12)は 16バイト分の
メモリ領域を取り、その先頭ポインタをpに返すという事になる
のでしょうか?
>>950 先頭アドレスが8で割り切れるように12バイト分のメモリ領域を取り、
そのアドレスを返す。13バイト目移行のアクセスによる影響は不定。
>>951 どうもありがとうございます。大変良く分かりました。
関数からの返り血を2つ3つに増やせませんか?
>>953 増やせません
引数をポインタで渡すか、グローバル変数を使うしかして
構造体じゃだめなん?
てかね、「関数」の定義って数学ではそういうもんですから。 その意味では関数、というかfunctionてネーミングはぴったし。
別に、一つの関数で二つ以上の値が決定してもいいんじゃ? 直積を考えれば一つになるけど。
>>953 仮にそのようなことが出来たとして、
x = f(a); /* f(a) は 2 と 3 を返す関数 */
って書いたとき、x には何が入れば気が済むの?
(しかし、世の中には2つや3つどころではなく、
無限の返り血を持つ関数を作る事が出来る言語が
あるのも事実だけどな)
(x, y) = f(a); きっとこんな感じ
Rbuby ,?>>>>>>>>>>>>>>>>>>>>>>>>>」Cghengpo えっっっっっっっっw Rbuy細工世婦!!!!!!!! Rubysaikyou !」 Rubyty!!!!!!!!
誇らしいですね。Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>Ruby .?????????>>>>>>>>>>>Ruby!
>>Ruby厨 作者が異常なまでにプライド持っている言語は ユーザまでその言語を崇拝しだすのか。
>>959 ではリストを一つ返せばいいのでは?
返り血一つで足りるだろ?
>>963 961=962=963
荒らしたいだけの無能
Rubyのためなら死ね
自分が何がわからないのかわかりません。 どうしたらいいですか?
究極の質問にこたえてくだちいこのボケども float a; float b; float c; と延々とかくのと float a,b,c,・・・; と書くのはどっちが良いのか教えてくれにょ どちらもかわらないのかにょー?
>>968 あんたはどっちがいいと思うんだ?
先ずはそれを聞かせてもらおうじゃないか。
時と場合に寄りますが何か?何か問題でも?
>>968 まとまりごとに書くのがよろしい。
ただし、ポインタは一行ごとに書くのがよろしい。
このようなコーディングルールは必ず定めるようにしましょう。
また、定められたコーディングルールには必ず従いましょう。
float count1, count2;
float a, b, c;
float tmp;
float x, y;
float* test1;
float* test2;
float* test3;
こういうのはやめて欲しい。 float count1, count2, a, b, c, tmp, x, y, *test1, *test2, *test3; #実際いるんだ。10年選手なんかで。
cで読み込める最大テキスト量って決まってるんですか?
>>973 止めて欲しいなら直接言えよ。
言えないのか?(w
>>977 >973ではコメントしなかったが、その10年選手には指摘したよ。
その他のごみためのようなコーディングスタイルと併せて。
LPFLOAT test1, test2, test3;
>>973 countをfloatで宣言してるのはどうかと思う。
982 :
デフォルトの名無しさん :04/10/02 14:52:06
983 :
デフォルトの名無しさん :04/10/02 16:54:07
>>971 >float* test1;
うわ、キモ!
ホントに居るんだ、こんな書き方するやつ。
わざわざ auto をつけてる人いますか?
* auto テレポーター *
いしのなかにいる
987 :
デフォルトの名無しさん :04/10/02 18:14:01
>968 WIZネタかよw
975,976ありがとうございます。 ショボノートPCで1GBほどよませるよていです。
990 :
デフォルトの名無しさん :04/10/02 18:21:39
#include<stdio.h> int main(void) { int *p,*q; int a,b,c; printf("数A:"); scanf("%d",&a); printf("数B:"); scanf("%d",&b); p=&a; q=&b; c=*p; *p=*q; *q=c; puts("2つの値を交換しました"); printf("数A:%d\n数B:%d",a,b); return(0); } ポインタを使って2つの数字を交換するCプログラムなんですけど、 これ以上工夫する事は出来ますか?教えてください。
int a, b, c; c = a; a = b; a = c;
しまった、見間違えた。 忘れてくれ。
>>989 お好きにどうぞ。
C言語では扱えるけど、君のマシンのメモリが足りない可能性はあるよね。
>>990 #include<stdio.h>
int main(void)
{
int *p,*q;
int a,b,c;
char s[]="数A:";
char t[]="数B:";
char u[]="2つの値を交換しました";
char v[]="%d";
char w[]="%s%s";
char x[]="\n";
char y[256];
char z[256];
printf(s);
scanf(v,&a);
printf(t);
scanf(v,&b);
p=&a;
q=&b;
c=*p;
*p=*q;
*q=c;
puts(u);
sprintf(y,w,w,x);
sprintf(z,w,y,w);
sprintf(y,z,s,v,t,v);
printf(y,a,b);
return(0);
}
#include<stdio.h> #define p printf #define s scanf main(){int a,b;char*x="数A:",*y="数B:";return p(x),s("%d",&a),p(y),s("%d",&b),p("2つの値を交換しました\n%s%d\n%s%d",x,b,y,a),0;}
996 :
ビル・ジョブス :04/10/02 19:40:16
#include<stdio.h> int main(void) { int a, b; int *pA = &a,*pB = &b; printf("数A:"); scanf("%d", pA); printf("数B:"); scanf("%d", pB); *pA ^= *pB; *pB ^= *pA; *pA ^= *pB; printf("2つの値を交換しました\n"); printf("数A:%d\n数B:%d\n", a, b); return 0; }
a,bがunsignedじゃないからダメダメですね。oO 逝ってきます。
んや。 問題になるのはマクロにしたときa,bが同じ変数の場合。
1000?
1000!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。