スレ立ててやるからPart87には構わないでくれ
これはもうだめかもわからんね
またネタスレが立ったのか
6 :
デフォルトの名無しさん :04/11/20 21:05:34
%pってポインタの中身を見る時に使うのかい?
それはIntel64bitアーキテクチャで推奨された書き方やね
>>7-8 ANSI/ISOでポインタ値の表示と決められている。
>>8-9 int x;
printf("%p", &x);
これでxのアドレスが表示されてるっぽいんだけど、
%pはポインタ限定ってわけではない?
xの前に&をつけてるからokって事になってるの?
ここんとこがよく理解できないんで助けてー
int -> int 型 int* -> (int への)ポインタ型
ポインタ以外入れても動くんだけどね
書式とパラメータの整合性なんて見てないからな そういう意味では >>%pはポインタ限定ってわけではない? は正しい でもそういう使い方や理解はするな
wp = (unt *)calloc(YOUSOSUU, sizeof(unt)); if(wp == NULL){ printf("メモリ借りれませんでした。 けちんぼ!1\n"); exit(1); } wp_adr = wp; こんなコードがとある関数に書いてあります。 この関数を何回か呼び出すと segmentation faultと出て異常終了します。 原因として考えれることを紹介しているサイトはありますか? または、ぐぐ語を教えてもらえませんか?
最後に wp=wp_adr; free(wp); この二文が抜けてました。 すいませんでした。
たびたび何度もすいません。 puts("koko0"); wp = (unt *)calloc(YOUSOSUU, sizeof(unt)); puts("koko1"); こんな風に書いてて koko0は表示されてその後に segmentation fault と出るのです。
untとYOUSOSUUを晒せ
typedef unsigned int unt; define YOUSOSUU 8; YOUSOSUUというのは unt ary[YOUSOSUU]; という風に unsigned int型の配列をいくつ用意するかを指定しています。
malloc系で鼻から悪魔が出るケースは、 まず間違いなく、ポインタ絡みのエラー。 特に、 ・mallocした以外の領域をfreeしていないか ・確保したサイズ以上の領域を書き換えていないか を確認すべし。
>>14 calloc を malloc に変えろ
callocしたポインタとfreeするポインタは等しいのかしら
wp = (unt *)calloc(YOUSOSUU, sizeof(unt)); if(wp == NULL){ printf("メモリ借りれませんでした。 けちんぼ!1\n"); exit(1); } wp_adr = wp; ・・・処理・・・ wp=wp_adr; free(wp); こんな風に書いているので callocする場所とfreeする場所は等しいと思いますが・・・ 処理中にwp_adrは使っていません。
wpでなんか壊してるな
とにかく、callocで落ちるなら、>19に書いた通り ヒープの管理ブロックを壊してるのは間違いないと思う。 callocの呼び出し前と呼び出し後にprintfでも入れて確かめる。 で、callocで得たアドレスとfreeしているアドレスが同じかも確かめる。 それでもおかしいなら、領域オーバーを疑う。
26 :
デフォルトの名無しさん :04/11/21 00:16:44
こんばんは。基本的なことで恐縮なんですが、 このようにプログラムを書いて #include <stdio.h> main( ){ int* x; int* y; scanf("%d %d",x,y); printf("%d %d\n",*x,*y); } %./a.out 1 2 と入力すると、 1 2 セグメンテーション違反です と表示される理由がわかりません。 一体なんのせいでセグメンテーション違反と怒られてるのでしょうか。
メモリをちゃんと確保してないから
28 :
デフォルトの名無しさん :04/11/21 00:21:46
>>26 アクセス権が無いところにアクセスしようとしたから。
初めint x;って書いてたけどコンパイラに「int*じゃ( ゚Д゚)ゴルァ!!」と怒られて 変数宣言を書き換えたに一票
int x[1]; int y[1]; で全て解決、万々歳。 ・・・・本人の理解が進まない点を除いて。
int x; int y; scanf("%d",&x,&y); にしましょう。 int *x; int *y; では、ポインタを格納する変数があるだけです。 イメージ的には(※理解するだけにとどめて、これで覚えないで下さい) [ ] [ ] とアドレス(住所)を書ける欄(変数)が2つあります。これは使い回されるものとします。 [東京都品川区〜〜〜〜] [東京都新宿区〜〜〜〜] と、前の人が書いたままなので、勝手に何か使えば問題が発生します。 [神奈川県横浜市〜〜〜] [千葉県千葉市〜〜〜〜] と、自分で正しいアドレス(住所)に書き換えてあげなければなりません。 あるいは、紙(変数)に書いたりせずに口頭(&x,&y)でアドレス(住所)を教えてあげなければなりません。 これを見て将来ダメになっても私は知りません
俺の経験上、居丈高に教えてるのは初心者に2,3本毛が生えたやつらだよ。 多少分かるようになった初心者は、お前こんなのも分からないのかよと馬鹿にしつつ自分の知識をひけらかしたくなる。 もう少しすると興味が無くなるのでROMるかスレ自体からいったん離れる。 さらにもう少しすると煽りに徹するようになる。答えは書かない。ピンポイントでヒントだけ教えてやる。 安易に答えを教えてしまうと質問者のためにならないから。 さらにもう少しすると再びROMる。 すっかり古参と化した彼らはスレと住人たちのの成長を生温かく見守るようになる。
そんな気持ち悪いのになりたくないです
34 :
デフォルトの名無しさん :04/11/21 00:53:10
>>32 で 943 さんよ、934 は何のアドレスを返しているんだい?
誤爆?
934 :デフォルトの名無しさん :04/11/20 11:55:31
>>933 スレ違い
struct string{ char mojiretu[256]; };
struct string fusianasan(void)
{
struct string kusosure = { "sine" };
return kusosure;
}
941 :デフォルトの名無しさん :04/11/20 15:22:04
ローカル変数を(ry
Cで文字列を返したいときに
初心者が陥りやすい例を示しているのかと思ってスルーしてたんだが。
942 :デフォルトの名無しさん :04/11/20 15:54:17
>>941 ry しないで続きをどうぞ
何が起こると言い出すか見物の悪寒
943 :デフォルトの名無しさん :04/11/20 16:24:12
>>942 「ローカル変数だ」と言えばこれ以上のくだくだしい説明はいらんと思うが。
こんな当然のことで高みの見物を決め込んでるとすれば、
それがおまえの技量ということだな。 プッ
では わかっていないリアル厨房のおまえのために書いてやろう。
~~~~~~~~~~~~~~~~~~
ローカル変数のアドレスを返しているが、関数から出てしまえばその領域は破棄される。
したがって親ルーチンがそれを受け取っても、この領域へのアクセスは違法となる。
ただし、偶然にも文字列が残ったままになっている可能性もあるので、
結果だけを見れば正常に動作することもある。が、違法行為だ。
わかったか、坊や。
教えたがりにロクな香具師はいないという好例だな
俺は 友達とか相手の場合はヒント程度にとどめる(その瞬間だけ解っても意味無いし) 赤の他人(こういうとこ)には完全に教える(別に相手はどうでもいいし)
俺は 適度に煽りつつ新しいネタを見つけるのが楽しいんじゃないかと。。
ちょっとお聞きしたいのですが、 木構造において子の数が一定ではない場合のデータ定義はどのようにすればいいのでしょうか? 2分木であれば struct node { int data; struct node *left; struct node *right; } 上のように、左の子と右の子、2つへのポインタを定義するのですが、ここで不定数の子へのポインタを定義したいのです。 struct node { int data; struct node *leaf[100]; }; このようにポインタ配列を使うことを考えたのですが、これでは子の数が制限されてしまいます。 可能であれば、その時における子の数だけのポインタを確保したいのですが、 なにか良い方法があるようでしたら教えていただけないでしょうか?
ポインタのポインタを使ってポインタ配列を動的確保する って安直な案はだめですか
struct node { int data; struct node *child; /* 一番左の子ノード */ struct node *brother; /* 兄弟(右のノード) */ }; とか?
>>43 ありがとうございます。
struct node {
int data;
struct node **leaf;
};
このように定義して、状況に応じてポインタ配列を動的確保することでうまくできました。
実は一度 struct node *leaf; と定義し、leaf にポインタ配列の動的確保を試みたのですが、
失敗したため、この方法は敬遠していました。 ですが、考えてみればうまくいかないのは至極当然の事ですね。
手を掛けていただき、ありがとうございました。
struct node { int data; struct node *leaf[]; }; mallocで確保するときにサイズ調節
48 :
デフォルトの名無しさん :04/11/21 09:46:54
おはようございます。
>>26 です。
みなさんのアドバイスを参考に考えてみたんですが、よくわかりませんでした。
どこがわからないのかと言いいますと、*演算子と&演算子の違いがわかりません。
みなさんの御指摘もその周辺についてで、
>>31 さんは特にそこを指摘していると思うのですが、
もう少しアドバイスを頂けないでしょうか。
自分の理解では次のようにプログラムを書けば動くはずと考えていましたが
実際にはコンパイル出来ません。
#include <stdio.h>
int main(void){
int* x;
int y;
*x = 10;
&y = x;
printf("%d\n",y);
return 0;
}
&y=x がおかしいとコンパイラにはねられるわけなんですが、
これはどうしてダメなんでしょうか。
int *x と int y の宣言はどのように処理されているのでしょうか。
よろしくお願いします。
>&y=x がおかしいとコンパイラにはねられるわけなんですが、 >これはどうしてダメなんでしょうか。 と思うのは >どこがわからないのかと言いいますと、*演算子と&演算子の違いがわかりません。 というより、そもそも左辺値と右辺値がわかっていないと思われる。 あと、 &y=x;じゃなくて、x=&y;がやりたいことじゃない?
>>49 >&y=x;じゃなくて、x=&y;がやりたいことじゃない?
レスありがとうございます。
この場合は &y=x がやりたいことで、
なぜこれだとコンパイルに失敗するかがわからないのです。
*xのアドレスxを、yのアドレス&yに入れてやれば
&yは"10"の入っているアドレスを指すことになるはずだと考えて
このように書いているのですが、どうしてダメなのかがわからないのです。
>>50 &yに代入することはできないから。
int a = 3;
50 = a;
がコンパイルできないのと同じ。
>というより、そもそも左辺値と右辺値がわかっていないと思われる。
と答が書いてあるのに
>>50 は馬鹿か?
>>52 だから左辺値と右辺値がわかってないんだって。
こっちがネタスレか?(゚д゚ ≡ ゚д゚)
55 :
デフォルトの名無しさん :04/11/21 10:44:20
行末の改行コードを削除する関数にかっこいい名前を 付けてやってください。ちなみに私のださいセンスだと void Chomp(char *szTarget); Perlか!!
56 :
デフォルトの名無しさん :04/11/21 10:45:32
TrimReturnCodeとか
>>55 そういうのは大抵stripと命名してる。
void Kiri!(char *szTarget);
左辺値と右辺値について調べてみました。 どこがいけなかったか理解できました。 scanfの疑問も解けました。 どうもありがとうございました。
const char *argv[] と char *const argv[] の違いってなんですか?
62 :
デフォルトの名無しさん :04/11/21 12:23:00
知鷹X42
26のやりたい事はyのアドレスにxの内容を書き込みたい、ということだよな。 &yには代入できない。&yはたとえば「10000」とかいうアドレスを表す「値」であって、 値に代入は出来ない。10 = aできないのと同じ。 ただし当然ながら、別の方法でアドレスに値を書き込むことはできる。
64 :
デフォルトの名無しさん :04/11/21 15:06:53
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
ここは削除依頼出てます
**************** 糸冬 了 ****************
**************** 糸冬 了 ****************
**************** 糸冬 了 ****************
**************** 糸冬 了 ****************
本スレ誘導
C言語なら俺に聞け! Part 95
http://pc5.2ch.net/test/read.cgi/tech/1100956766/
66 :
デフォルトの名無しさん :04/11/21 18:30:36
てすと
67 :
デフォルトの名無しさん :04/11/21 22:37:49
こっちが本スレだろ?
68 :
デフォルトの名無しさん :04/11/21 22:39:57
そう思いたいのですか?
69 :
デフォルトの名無しさん :04/11/21 22:42:28
voidごっこはあっち逝け
70 :
デフォルトの名無しさん :04/11/21 23:03:12
ほんものかもよ!
71 :
デフォルトの名無しさん :04/11/21 23:05:05
ほんものはもっと慇懃御無礼
72 :
デフォルトの名無しさん :04/11/22 02:40:23
void情報があるときいて見に来たんですがー どこ?
劣化コピーもしくは耄碌した本人ならこのスレのクローンにいるようです
74 :
デフォルトの名無しさん :04/11/22 10:04:33
こっちが削除?
>>76 あそこの空気も、あれはあれで生きてていいんじゃないかね。
79 :
デフォルトの名無しさん :04/11/22 21:49:30
age
80 :
デフォルトの名無しさん :04/11/22 21:50:34
ママに聞けってのもあるよな。
81 :
デフォルトの名無しさん :04/11/22 22:44:42
> こっちが削除? そそ。こっちが削除されます。
なんでそう消したがるの?
は?何言ってんだ?
85 :
デフォルトの名無しさん :04/11/22 22:47:57
まあ、こっちは内容なかったもんな。 ちょうどいいのでは?
あっちの自演厨に負けたな
87 :
デフォルトの名無しさん :04/11/22 22:56:43
ということにしたいのですね? (負け惜しみすぎー)
負けを認めてるのは負け惜しみとは言わんが?
89 :
デフォルトの名無しさん :04/11/22 23:03:22
ということにしたいのですね? ヘ_ヘ ミ ・ ・ ミ ( ° )〜
ヘ_ ヘ ミ `∀´,ミ ( ° )〜
91 :
_∧______ :04/11/22 23:33:10
ということにしたいのてすにだー
92 :
デフォルトの名無しさん :04/11/22 23:41:59
向こうで日下部ごっこがはじまってるよ
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
ここは削除依頼出てます
**************** 糸冬 了 ****************
**************** 糸冬 了 ****************
**************** 糸冬 了 ****************
**************** 糸冬 了 ****************
本スレ誘導
C言語なら俺に聞け! Part 95
http://pc5.2ch.net/test/read.cgi/tech/1100956766/
94 :
デフォルトの名無しさん :04/11/23 13:38:05
Test
文字列コピーをしようと思ったんですが、うまくいきません。 どうすればうまくいきますか? char *copy(char *dest, char *src) { char *tmp; tmp = dst; while ((*src++ = *dst++ ) != NULL); return tmp; } ...'dst' (さらにsrcとdstを逆に扱っていると思われ)
教えてください。 標準入力からテキストファイルを読み込み、 行を短い順に出力しなさい。 但し、行は 最大 80 文字とし、 80 文字以上の行は先 頭 80 文字だけの行として取扱い 出力し、 空行は出力しないで下さい。 また、同じ 長さの行は入力した順番に出しなさい。 なお、取り扱える行数は実行時のコン ピュータのメモリーのサイズのみに依 存 しなければなりません。 勝手な上 限を設けてはいけません。
宿題スレへ
とは言ったものの、簡単なのでパッパと済ますか。簡単な方法は以下の2つ。 1) 構造体を作って各行の文字数を予め構造体内に書き込んでおき、全行を読み終わった時点で 文字数をキーにしてqsort()に放り込む 2) 各行をとにかく配列に取り込み、全行を読み終わったら以下のような比較関数をqsort()に適用する sort_func(char* c_1, char* c_2) { return strlen(c_1) - strlen(c_2); } 2)ではstrlen()の呼び出し回数が増えるので速度は低下するが、より単純である。 1)のほうがスマート。
っと、そう単純じゃなかった。
> 空行は出力しないで下さい。 また、同じ
> 長さの行は入力した順番に出しなさい。
これを忘れてたorz
空行無視は、最終表示部分でstrcmp(target, "\0")とやってふるい落とすか、
もしくは入力時点で判定して配列に代入しない。
同じ長さの行を入力順に出力するには、第2キーによるソートをする必要がある。
よって、
>>98 の1)の構造体を使った方法を取る事になる。
更に、
> なお、取り扱える行数は実行時のコン
> ピュータのメモリーのサイズのみに依
> 存 しなければなりません。 勝手な上
> 限を設けてはいけません。
この条件はリスト構造の使用を示唆している。
typedef struct s_in_str {
char str[81],
short len,
unsigned index,
struct s_in_str next
} in_str;
ここまで書いて非配列なリストをどうやってqsort()に渡すかという所で詰まったのでgive up(´∀`;)
realloc()で誤魔化すか?
- struct s_in_str next + struct s_in_str* next
101 :
sammy :04/11/23 15:32:50
<<99 詳しく書くとどのようなプログラムになりますか?
102 :
デフォルトの名無しさん :04/11/23 15:43:47
>>96 マルチ、繰り返し、いい加減にしろ
答える奴はぼけ
103 :
デフォルトの名無しさん :04/11/23 16:13:30
教えてください。 標準入力からテキストファイルを読み込み、 行を短い順に出力しなさい。 但し、行は 最大 80 文字とし、 80 文字以上の行は先 頭 80 文字だけの行として取扱い 出力し、 空行は出力しないで下さい。 また、同じ 長さの行は入力した順番に出しなさい。 なお、取り扱える行数は実行時のコン ピュータのメモリーのサイズのみに依 存 しなければなりません。 勝手な上 限を設けてはいけません。
104 :
デフォルトの名無しさん :04/11/23 16:21:41
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。
なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』
CとC++のどちらでも構いません。よろしくお願いします。
105 :
デフォルトの名無しさん :04/11/23 16:22:21
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。
なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』
CとC++のどちらでも構いません。よろしくお願いします。
106 :
デフォルトの名無しさん :04/11/23 16:24:23
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。
なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』
CとC++のどちらでも構いません。よろしくお願いします。
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。
なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』
CとC++のどちらでも構いません。よろしくお願いします。
できれば、夜の7時までにお願いします。その後遊びに行きたいので。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>99 非配列なリスト用のqsort書けばいいだけ
109 :
デフォルトの名無しさん :04/11/23 16:54:31
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。
なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』
CとC++のどちらでも構いません。よろしくお願いします。
できれば、夜の7時までにお願いします。その後遊びに行きたいので。
関数で関数名の前に戻り値以外に何か書いている場合それは何ですか? 私は出会ったことが無いのですが、他のスレッドで、見ました。
呼び出し形式(例えばfastcall)を指示してたりとか。コンパイラ依存
112 :
デフォルトの名無しさん :04/11/23 18:03:35
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。
なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』
CとC++のどちらでも構いません。よろしくお願いします。
夜の7時までにお願いします。今コンパ中なんで、帰ったらできてるようにな。
113 :
デフォルトの名無しさん :04/11/23 18:30:11
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。
なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』
CとC++のどちらでも構いません。よろしくお願いします。
夜の7時までにお願いします。あと30分だ。怠けているんじゃないぞ。
>標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。 ・行番号と文字列長、標準入力のファイルポインタ、をテーブルとしてメモリに展開。 ・テーブルを文字列長→行番号でソート。 ・標準入力をfseek()で先頭に。 ・標準入力をテーブルのファイルポインタへfseek()して表示。 文字列長が0になるかテーブル最後まで繰り返し。 って漢字仮名。
>関数で関数名の前に戻り値以外に何か書いている場合それは何ですか? static とか?
116 :
デフォルトの名無しさん :04/11/23 18:37:28
>>99 >非配列なリストをどうやってqsort()に渡すかという
リストからもう一つ配列に作り直せばよかろうに...
文字数を順に格納する場所を示すポインターでも持って、 また、何文字の行があるのか0と1で表す配列でも持って(領域80個)、 1文字のときから追って、行数の少ないところから、ファイルの最初から、 順に該当するものを出力するだけ?
119 :
デフォルトの名無しさん :04/11/23 18:42:12
課題
『標準入力からストファイルを読み込み、順に出しなさい。
但し、行は最大 8番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/ihtml のホームページのソースをた果を頭 5 、
最後行を示しない。
なお、取り扱える行数は実行時のコンピュータのメモリーのサイズ
>>117 そうすると巨大ファイルを食わされてメモリ不足に陥ったら何も出来ずにメモリ確保エラーで止まるかと。
なんでqsortにこだわるんだよ。 自力でマージソートしろ。
何でもかんでも自力実装って、本人は満足するだろうけど周りから見ると見苦しいだけじゃん
>120 どのみち >実行時のコンピュータのメモリーのサイズのみに依存
>>122 見苦しいのはリンクリストを無理やりqsortする馬鹿だろ
ソート部分にまでバグ混入の余地を増やすよりはマシ
リンクリストくらいテンプレート使えよ。
Cしか分からない低脳にテンプレートなどという高度なものを期待するのは愚かしい
129 :
デフォルトの名無しさん :04/11/23 18:51:35
>>120 実行時のコンピュータのメモリーのサイズには依存していいんじゃなかったのか?
>>129 リンクリスト作成が終わった後で必要数の配列メモリを確保する方式だと、リンクリスト作成時点で
メモリ割り当てが限界まで来てる場合に身動きが取れず、結果としてソートも出力も出来ないってことです。
とにかく巨大なメモリを確保して 「このプログラムは実行するコンピュータのメモリサイズの制限により動作しません」 と言い張れば解決だな。
>131 それだ!
133 :
デフォルトの名無しさん :04/11/23 18:59:39
>>130 そのリンクリストには処理すべきデータは洩れなく入っているのか?
つまり最後のデータを入力し終えた時点でメモリをちょうどぴったり使い切った状態とどうして言えるのかって意味だ。
奇跡に近い確率だぞ。
テンプレートって何か説明しろ。
>>133 いえ。処理すべきデータが収まりきらなかった場合を考えてます。
例えば5GBのテキストを食わされて処理していったものの、3.8GBを処理した時点でメモリ割り当て限界に
達したとか。その場合、リンクリストの配列化に必要な更なるメモリを割り当てることが出来ませんよね。
3.8GBのテキストならば配列化にも数十MBのメモリが必要でしょう。
地球は地殻と地表のプレートからなっているのは知っているか? 10枚のプレートだよ。
>137 マンヘル...マントルが抜けてたOTZ
>136 >リンクリストの配列化に必要な更なるメモリを割り当てることが出来ません この後、どうしろと言うのだ?
>>136 何が何でもオンメモリで処理しないといけないのか?
5GBとか言ってる時点で32bitOSでは処理しきれないぞ。
引用が不適切だったな >5GBのテキストを食わされて処理していったものの、3.8GBを処理した時点で >メモリ割り当て限界に達したとか。その場合、 その場合どうしろと?
>>142 その場合はハードディスクをフォーマットして、初めから何もなかった事に
して構いません。
>>140 だから、リンクリストの配列化は大変だー、という話をしてるんです。
解法としては、いくつかの行の処理を諦め、配列化に必要なメモリを
割り当てられるまで最終行から順番に領域を開放していくことでしょうかね。
または、配列化用のインデックスをファイル読み取り時点で100個ぐらいずつ
確保し、reallocで配列を広げていくことでしょうか。
>143 了解した。
146 :
デフォルトの名無しさん :04/11/23 19:13:57
>>144 >いくつかの行の処理を諦め
次のルールに抵触
>勝手な上限を設けてはいけません。
データこぼすのは単なる制限より悪質だぞ
>>146 何も出力されないよりはマシかと。この対策は"勝手な上限を設けるもの"ではなく、
"メモリサイズのみに依存"でしょう。
頑迷で無知で馬鹿な人間は救いがないな。
149 :
デフォルトの名無しさん :04/11/23 19:17:30
「シーケンスAの要素を整列せよ」という要求に対して、 「シーケンスBという部分集合を勝手に定義して整列しました」と納品に行ったら がくがくぶるぶる
150 :
デフォルトの名無しさん :04/11/23 19:18:08
>146 でたらめな出力するくらいなら、何もしないのが常識だぞ(w
失礼、 147 宛てね。
>>149 うーん、フェイルセーフは考えないのが普通なんでしょうか?
仕様書が与えられているならまだしも、「こんな感じで作って〜」と
言われたら細かい仕様は作る側に任されると思うんですが。
この課題の場合、"勝手な上限を設けるもの"というのは、
#define MAX_NUM 100000
struct s_table str_table[MAX_NUM];
といった上限決め打ちを規制するものだと思いましたが。
>「シーケンスBという部分集合を勝手に定義して整列しました」 「えぇ、もちろんバグでは有りません。仕様です。」
>フェイルセーフ もまい、もう一回学習しなおせ(w
156 :
デフォルトの名無しさん :04/11/23 19:23:27
>>153 誰も要求してないことをしてるだけ
マシもへったくれもねえんだよ
>>151 を500回、声に出して朗読しろ
>146 >146 >146 :
>>155 あー、フェイルソフトですね。すいません。
>>156 全てを読みきれなかったら何もしないんですか?
読みきれた分までで処理というのはおかしい?
>158 あのね、読みきれなかった文が短かったら出てこないでしょ? それは、 154 :デフォルトの名無しさん :04/11/23 19:21:09 >「シーケンスBという部分集合を勝手に定義して整列しました」 「えぇ、もちろんバグでは有りません。仕様です。」 って事なんだよ、わかる?
まずいですか?まずいんですね。すいません。
>>160 アンマン買ってきてと言われて売り切れていたから手ぶらで買えるというのは正しくないですよね。
そこで肉まんを買って最大限要求を満たすのが正しいとお思いますが違いますか?
163 :
デフォルトの名無しさん :04/11/23 19:36:02
>>158 >全てを読みきれなかったら何もしないんですか?
だから、そうだよ。くどい。
>読みきれた分までで処理というのはおかしい?
処理そのものじゃない。
注文どおりならおかしくない。
注文と違うことを勝手に(←ここ重要)やることが
技術以前のところで間違ってるといっているんだ。
あんたのコードの出力が何に使われるのかも勝手に決めてるよな。
技術以前のところで間違ってるぞ。
>>162 アンマンを10個買ってきてと言われたけど7個しか無かった、というのがこの場合の例だと思うんですが
もしそうなら当然7個買って帰るから反例として都合が悪いんでしょうか(笑)
>アンマン買ってきてと言われて売り切れていたから手ぶらで買えるというのは正しくないですよね。 >そこで肉まんを買って最大限要求を満たすのが正しいとお思いますが違いますか? しゅーきょー上の理由により、肉まんが食えんのだよ。よって最低最悪。金返せ(w
>164 ちょっと違うだろ。 買えなかった3個は買えた7個と違わないから、10個→7個でもOK。 10人がバラバラの要求で、7人分しか買って帰らなかった、問題だろ?
手ぶらで帰るよりは問題じゃないでしょう
>手ぶらで帰る 争いがなければ、ね。
169 :
デフォルトの名無しさん :04/11/23 19:43:44
>>167 「手ぶらで帰る」←これも要求にない
自分の責任範囲にない障害で要求を完了できないとき、
要求元への相談がないことが問題。これは技術以前。
つーわけで質問者は出題者を問い詰めて来い
>170 131 :デフォルトの名無しさん :04/11/23 18:54:37 とにかく巨大なメモリを確保して 「このプログラムは実行するコンピュータのメモリサイズの制限により動作しません」 と言い張れば解決だな。
>>169 引きこもり2ちゃんねらは知らないかもしれないけれど
そういうのは一般社会では融通のきかないおばかさんと蔑まれます。
173 :
デフォルトの名無しさん :04/11/23 19:46:37
>>170 腐ってもここはム板
「要求元への相談」がプログラムで言うと何かがわからない者ば黙ってろ
仕様で「途中まででも処理する」と決まってればそうする。 決まってなければ、処理未完了は仕様を満たさないから、何もしない。 でいいだろうが
>>173 コマンドライン引数でも勝手に増やすか?
>172 一般社会では、融通をきかせたつもりの「余計なお世話」がまかり通るのか(w
177 :
デフォルトの名無しさん :04/11/23 19:49:48
>>172 引きこもりはお前らしいな。
3つ足りないことの影響範囲に責任を負わない者が判断すべきことではない。
責任範囲の感覚が備わっておらず大変な決断を勝手にやってのけた人は「おばかさん」程度では済まされないよ。
あんまんの買出しに出かけたアルバイトのお茶くみに ずいぶん大きな責任が負わされてるんだなw
まぁ、一般では目的のものが買えなかった場合の代替品を 頼む側、頼まれる側が考慮するけどね。 プログラムでは要求に無いものは作ってはダメだよ。 それこそ、 >ハードディスクをフォーマットして、初めから何もなかった事に してもOKと言い出しかねん(w
エラー処理とあんまんのお使いでは喩えとして不釣合いだろう。
>あんまんのお使い ぢゃ、アンパンマンのお使い
正しいアプリケーションとは(上にあるものほど優先順位が高い) 1. 有限時間内に終わること 2. 正しく処理を行うこと 3. 2.が不可能な場合、処理を中断し不可能だと通知すること 4. それなりにスケーラブルであること(なるべくソフトには制限を設けず、OSやPCの限界に依存) 5. それなりに効率的であること(高速に動作し、メモリを使いすぎない)
183 :
デフォルトの名無しさん :04/11/23 20:02:08
>正しいアプリ >正しく処理を行うこと プ
185 :
デフォルトの名無しさん :04/11/23 20:06:58
>>178 そのバイトの勝手な判断が、接客中の失礼につながり、
億単位の取引を逃したら、アルバイト君は身銭でも切れるんだろうか。
ここで「接客」を持ち出したのは私だが、あなたもそれを否定できない。
自分の仕事の成果が何に使われるのかは、あなたの責任範囲ではないからだ。
取引先との交渉を持ち直させるのに必要な技能も資源も持たないよな。
それを責任と権限がないというんだよ。
wとか書いているが、本気でわからないとしたら笑い事じゃないぞ
そうか、最近の企業は取引相手をアンマンで接待するのか。メモっとこう。
ぢゃ、アンパンマン
くだらない話はもうやめ。
189 :
デフォルトの名無しさん :04/11/23 20:12:18
>>186 お前、何の話がしたいんだ?
障害に対する処理のあり方の話はもうしたくなくなったのかw
>億単位の取引を逃したら、アルバイト君は身銭でも切れるんだろうか。 そいういうのは法律で禁じられてるわけだが。
くだらない話はもうやめ。
192 :
デフォルトの名無しさん :04/11/23 20:15:01
>>180 いや、こいつの場合はあんまんのお使いまで戻って話す必要がある。
責任範囲に対する考え方が、ふざけているのではなく大真面目で間違っている。
最近クリマンっていうのがコンビニで売っているね。
問題の核心はあんまんの代替としてにくまんが許容されるか否かということだろう。
>障害に対する処理のあり方 だから、間違ったことするくらいなら何もしない方がマシだって 余計なことするなって 下手な考え休むに似たり、って昔からいうだろ(w
いやそうじゃない。企業の接待としてアンパンとカレーパンのどちらが伝統的かどうかだ。
197 :
デフォルトの名無しさん :04/11/23 20:17:11
>>190 会社の金を無断で流用することも禁じられている
お前、何の話がしたいんだ?
障害に対する処理のあり方の話はもうしたくなくなったのか?
198 :
デフォルトの名無しさん :04/11/23 20:17:56
むしろ、障害時における小泉首相の対応が一国の首相としてふさわしいものであったかどうかだ。
200 :
デフォルトの名無しさん :04/11/23 20:19:01
話そらすのに必死だな (プ
くだらない話に必死だな (オナラプー
202 :
デフォルトの名無しさん :04/11/23 20:21:19
くだらなくねえよ、メモリ枯渇の話はな
とりあえず今日はそこまでにしたら? 荒れてるわけだし。
何気ない引き篭もりの一言でここまでスレ荒らさなくてもいいのにな。
メモリが無い時に、おまえらがいくらがんばっても意味ねーよ
だな。喧嘩両成敗だ。
Ruby!!!!!!!!!!>>>>>>>>>>>>>>>>>>>>
つか「入力ファイルの大きさは1GBまで(ただし100万行以内)」とか 仕様上に上限を設けるのがふつう。 それ以上超えた使いかたしたら、何起こってもしらね。
>取り扱える行数は実行時のコンピュータのメモリーのサイズのみに >依存 しなければなりません。 勝手な上限を設けてはいけません。
>>209 そんな仕様を受け入れるプログラマは馬鹿だということだ。
211 :
デフォルトの名無しさん :04/11/23 20:31:05
この親にしてこの子あり 男児の人格障害はほとんどの症例で母親に問題がある
Rubyしあこうこう!!!!!!!!! Ribuy!!!!!!!!!!!!んむhっばにRubytukaouy!!!!!!!
Rubynotmaetnarashimeru!!!!!!!!!!!!!!
RRRRRRRRRRUYBBBBBBBBYYYYYYYYYYYYYYYY 意s難波rおね!
Rubyhasauikougenngo!
undefinedなのかunspecifiedなのかをはっきりしろ。
Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!! Ruby!!!!!!!!!!!!!!!!!!!!!!!!
くだらないことで喧嘩するから
>>217 みたいなのが発生してしまったではないk
>>281111111111111855 Rubyyyyyyyyyyyyyyyyyyyy!!!!!!!!!!!!!!!!!!!WE}っdq3t
Rbuyodasiakpoyui!!!!!!!!!RRRRRRRRRRRいう゛っypd@sdp
Rviupsdoufo;q2k,e4k,qd
Ryuby8o2i40w9dpfispw
このスレからまた一人発狂者が生まれました。ザーメン。
221 :
デフォルトの名無しさん :04/11/23 21:10:15
Ruby is nanbar one! Ruby is the most best better good language than any other languages. Enjoy Ruby!
>118 ちょと解読&考えてみた。 ・作業用に最大80個のファイルを作成する ・文字の数によって、1〜80の作業ファイルのいずれかに追記する。 何文字の行があるのか0と1で表す配列で持つ(領域80個) ・行数の少ないところから、作業用ファイルの最初から、順に出力する これ、メモリほとんど使わないYo!
小さいテキストのとき無駄だから却下
>>222 フェイールソォフトの問題点はそこじゃあない。
それでも1000テラバイトのファイルを入力したら
空き容量が足りなくて失敗することもあるだろう。
つまりディスク容量が足りなくなったらプログラムが自動的に
ショップまでハードディスクを買出してくるように作るべきだと。
ひどい状況だな(w
>>224 予算が足りなかったら自動的にアイフルと契約してお金を借りるように
なってるとなおいいね。w
>>224 その前には、容量が逼迫してきたら自動的にアップローダーを起動して、画像ファイルに変換にしたものをネットにアップロードするとかか?
マジレスするとそれは運用レベルの話。
>>227 それともzipの蓮に「萌え」と入れてうpするか?
230 :
デフォルトの名無しさん :04/11/24 22:24:44
>222 ちょと解読&考えてみた。 ・何文字の行があるのか0と1で表す配列exist[]で持つ(領域80個) ・for(i=1; i<=80; ++i){ if(exist[i]) 入力の先頭からi文字に一致する行を表示 } これ、メモリほとんど使わないYo!
231 :
デフォルトの名無しさん :04/11/24 22:32:51
関数へのアドレス渡しなんですが構造体などを関数で飛ばしたい場合 アドレスにすればより効率よく早いと思いますが それはint型やfloat型にもいえることなんでしょうか?
232 :
デフォルトの名無しさん :04/11/24 22:34:05
>>231 100バイトの構造体を飛ばす代わりに4バイトのポインタ渡すのは効率的だけど
intもfloatも4バイトだから効果なし(サイズは一例)。
それどころかデリファレンスでむしろ遅くなる。
235 :
デフォルトの名無しさん :04/11/24 23:14:43
定数を渡せないしな。
236 :
デフォルトの名無しさん :04/11/24 23:17:47
>>231 実測せずに効率を語ろうとする怠け者に話すことはない
237 :
デフォルトの名無しさん :04/11/24 23:20:14
>>236 お前には聞いてません。黙っててください。
238 :
デフォルトの名無しさん :04/11/24 23:25:36
実測より理屈が先だろ
仕様できちんと決められているならば理屈も出せるんだがな
数値計算をしていて、構造体の配列が非常に大きいのが必要になりmallocなどを用いることで 解決しました。 なぜ、ふつうに配列を定義したときにはある程度の配列数しか定義できなくて mallocなどで動的にメモリを確保すると、より多くの配列を定義できるようになるのでしょうか。 (ポインター型のサイズなどと関係があるのでしょうか?) どういう仕組みでなっているのか興味を持ち質問しました。 すいませんが教えてください。
通常の配列は領域をスタックに確保するから
一般に ヒープの領域のサイズ>>>>>>>>>>>>>>スタックのサイズ だから
>>241 ざっくり言うと、普通に配列を定義しようとするとスタック領域というメモリ領域にそれを作ろうとする。
このスタックにはサイズの制限があることがあって、制限がある場合は、それ以下の大きさのものしか作れない。
(そのサイズって64KBとかそんな感じ)
このサイズを超えるような操作をしてしまうと「スタックオーバーフロー」とかいうエラーになったりする。
一方、mallocはヒープ領域というメモリ領域にそれを作ろうとして、まぁ大体は、実メモリ一杯まで取れたり
するので、巨大な配列でも作れる。
詳しくは、スタック領域、ヒープ領域、mallocでググれ。
VCだとデフォルトでスタック領域は1MB、ヒープ領域は4GB弱。実メモリを超えても使えるよ。
32bit環境では、リニアに使えるのが4GBまでってだけでOSさえちゃんと対応していて メモリ量が十分(物理・仮想あわせて)だったら1GBのメモリを10個確保することも可能。
どうもありがとうございます。 ヒントをいただいたので、そこからググってみます。 (グーグルで調べろってことですよね?)
ほむほむ。
249 :
デフォルトの名無しさん :04/11/25 00:40:11
double MIN = 0.0; double MAX = 10.0; double dt = 0.01; euler(MIN, MAX, dt) //積分結果の最後の値を返す 0から10.0まで積分計算をし、積分結果の最後の値を返す関数eulerがあるのですが、 途中の計算過程も出力するようにするにはどうすればいいのですか?
ここは親切なインターネッツですね。
>>249 printf("%f\n", euler(MIN, 0.01, dt));
printf("%f\n", euler(MIN, 0.02, dt));
...
241,247です。 ヒープ領域とはスタック領域とは基本的に全然違うのですね。 ヒープ領域は関数の外側にあるという感覚でいいのでしょうか? となると、ヒープ領域にあるデータを参照するのには、関数の内部にある スタック領域のポインターのようなものを用いてヒープ領域のデータを 読み取ってそれをスタック領域に持ってきて計算する、というようなことを 行っていると考えていいでしょうか? こうやって考えてみると、ヒープ領域のデータを参照することと スタック領域のデータを参照するときとやること自体は変わらず、 計算時間としては変わりないと考えればいいのでしょうか? それともデータ構造を調整(すいません、どのように表現すればいいのか わかりませんでした。)することがヒープ領域を参照するには余分に必要で、 計算時間はより長くかかると考えてよいのでしょうか?
【えっと・・・】ググれ。
255 :
デフォルトの名無しさん :04/11/25 01:13:16
>>253 スタック領域も関数の外側にあるわけだが・・・
だから間接的な再帰ができる
>>253 プロセスの空間はOSによって割り当てられます。コードはこのへん、スタックはこのへん、ヒープはこのへん、というように
領域ごとに役割が与えられます。で、プロセスから見ると
って、説明難!勉強が足りないな。
プロセスから見たメモリ空間と実際のメモリ空間は違うもの、と認識しとけばいいかな。
はじめて読む486とか読めば結構詳しく書いてある。
>>245 32ビット Windows でのユーザプロセス空間は最大2GBですよ?
(とある設定変更しても3GBまで)
スタック…LIFOのデータ構造を持つ自動変数用、関数呼び出し用領域。 ヒープ…sbrkなどのシステムコールによってメモリの一部が割り当てられ、 クライアントにポインタを返す。サーバアプリケーションなどの 場合、確保したメモリはちゃんと解放してやらないとメモリが 枯渇し、新たなメモリを確保することができなくなり、最悪 サーバが落ちる。これをメモリリークと言う。
>> 255 あ、そうでした。スタック領域も関数の外側でしたね。すいません。 じゃあ、やること自体は一緒で実行速度も一緒ですね。 (registerとかは関係なしで) うーんと関数って呼び出すたびに、関数内で定義した変数のために スタック領域をいじくると考えるとすごく計算時間がそんな感じがしました。 単にデータを参照するという計算時間時間だけでなく、このようなところにも 関数を使うことで計算時間が長くなってしまうのですね。 (すいません、間違ってたら教えてください) やっぱ、プロファイラを使うとき意外はインライン展開するようにしたほうが いいな、と思いました。 もうちょっとググってみます。
>> 256 どうもありがとうございます。 "はじめて読む486"、読みます^^。
261 :
デフォルトの名無しさん :04/11/25 01:26:31
>>259 そろそろ寝るぞ
スタック領域をいじくらない関数つーとレジスタでも使うってことか
そのレジスタの中身はどこにバックアップされると思う
それとプロファイラを使うときだけインラインを抑止したら意味ねえぞ
>>253 今は
・ローカル変数はスタックに取られるからサイズに注意しないといけない
・それより大きな変数を使いたければ、mallocを使う。んで、それはヒープという所に取られる
・static変数、グローバル変数は、それらとはまた別の場所に取られる
・それらは、場所が違うだけで、使う方法は一緒だし、計算時間もほぼ一緒
と思っておけばいいよ。
どうもありがとうございます。 そのレジスタの中身はどこにバックアップされると思う レジスターの中身のバックアップを取っているとは知りませんでした。 うーんと、スタックでしょうか? "エキスパートCプログラミング―知られざるCの深層" これも読んでみます。
>>263 の本は読んでないけどかなり評判いいな。
Cの下でどんな事が起きてるのかを理解するにはアセンブラに触れる必要があるからね。
レジスタの中身はスタックにバックアップされる。コンパイラは、それによる
スタックポインタ位置移動も計算してローカル変数の偏移値を求め、
辻褄を合わせてアセンブルする。コンパイラのソースを読め、なんて無茶な人も居るけど、
そんなのムリムリカタツm(ry
> それとプロファイラを使うときだけインラインを抑止したら意味ねえぞ てっきり、プロファイラーを使うときにはインラインしたらだめだと思っていました。 今、やってみて気づきました。すいません、どうもありがとうございました。
釣りなのか それとも マジで低レベルの話なのか
double MIN = 0.0; double MAX = 10.0; double dt = 0.01; euler(MIN, MAX, dt) //積分結果の最後の値を返す 0から10.0まで積分計算をし、積分結果の最後の値を返す関数eulerがあるが、 途中の計算過程も出力しろや!!
269 :
デフォルトの名無しさん :04/11/25 20:27:53
>>265 あんまし、勉強にはならないと思うよ ・・・面白いけど
271 :
デフォルトの名無しさん :04/11/26 18:01:11
今まで、利用していただけだから気づかなかったけど、 FFFTPの作者って、ソースを見る限り 凄いプログラマーなんだな〜っと思ったよ。
コピペばかりだけどな
すごい数のグローバル変数だな。
有り得ないよな。ハンドルすらロクに使ってないからな
FFFTPなんて使えないソフトの代表例
最高ソフトFTP!!!!!!! FFFTP>>>>>>>>>>>>>>>>>>>>>C
↓RubyとFFFTPの比較
>>278 C++のストリームに見えてしまう…orz
たわし > お前ら
281 :
デフォルトの名無しさん :04/11/27 00:10:20
たわしは海外旅行。
282 :
デフォルトの名無しさん :04/11/27 00:13:07
なんだ、女の三助さんかと思った
やっぱりその……FFFTPのコードはある意味凄いって事でいいの? 漏れ、あのコードはなかなか読めなくて……。 自信なくしてんだ……。
284 :
デフォルトの名無しさん :04/11/27 00:18:07
う〜ん・・・いわゆる「駄目」なプログラムの代表例ですね。
これくらい読めないと、仕事でプログラム読むのは無理だろ。
まあ、たしかに。仕事なら酷いプログラムなんていくらでも 読まなくちゃならんし。
どこにそーすあんの?
290 :
デフォルトの名無しさん :04/11/27 05:00:20
全部読み込んだあとキャッシュフォルダからコピー
>>290 ダメでした。
「文書のプロパティ」を見る限り
コピーできないセキュリティになってるから
Adobe Reader がそれを許さないみたい
292 :
デフォルトの名無しさん :04/11/27 05:39:23
>>291 うちはAdobe Readerをインストールしていないから閲覧ページを開くと自動的にダウンロードのダイアログが出る。
もしかしたらAdobe Readerを一度アンインストールすればダウンロードできるかも。
>>292 6.0.1でブラウザのアドオンリストから削除したらできました。
thxです。
でも6.0.2ではそれもAdobe Readerが
許さないようなのでバグかと
httpリクエストをプログラムから発行するくらい君らには簡単でしょ?
295 :
デフォルトの名無しさん :04/11/27 11:08:10
va_list に対して規格が要求している意味づけが理解できていません。 va_list は、使用前に va_start() 、使用後に va_end() を呼ぶ決まりになっていますが、 その使用中に、対象となる va_list の複写が行われ、その後 各々の va_list に対して別々の va_arg() が呼ばれた場合、 複写元の va_list についてだけ va_end() を呼べばよいのでしょうか? それとも複写先の va_list についても va_end を 呼ばなくてはならないのでしょうか? それとも va_list は、そのような使用法を認めていないのでしょうか?
296 :
デフォルトの名無しさん :04/11/27 11:18:15
>>295 いっぺん void* で書いてみればわかるよ
>>296 処理系依存の話ではなく、
「規格が要求している意味」の話です。
処理系によっては va_end() は、何も動作しないという
定義がされていることもあります。
>>295 後者。
va_start()とva_copy()を呼び出したらそれに対応するように同じ関数内でva_end()を呼び出さなければならないと書いてある。
>>298 ああ、C99 で va_copy() なんてものが出来たんですね。
ありがとう。
でも、それ以前はこの手の問題は曖昧だったのかな?
それと、vprintf 等の関数の引数として"複写"された va_list も
同じように(vprintf 内の終了処理として)va_end() を
呼ばなくてはいけないとか?
ますます訳が分からなくなってきたかも。
char str[256]; のように、サイズを 2 のべきにするのには何か理由があるのでしょうか?
>>300 ただ単に2進数にすると256は100000000、その他2のべき数はいずれも2進数にするとキリがいいように見える。
>300 2のべきというより、アドレスビット幅でないの? 32bit=8バイトのxx倍
>>300 アラインメントの関係でプロセッサのビット幅に合わせた方が
無駄が出ない可能性が高いから。
すいません 質問させていただきます ./a.out 256 等と 引き数?をとっているんですが これを 数字(10進)かどうか判断するのはどうすればいいのでしょうか? 今は、頭から1つずつ数字を取っていき それが0以上9以下ならと言う理由で 全ての桁をチェックしています それと、11-22等のように記号付で取ったさいにその記号までをコピーするとか 言うのは どのようにできるのでしょうか? すいませんが教えてくださいお願いします
>>310 > 今は、頭から1つずつ数字を取っていき それが0以上9以下ならと言う理由で
> 全ての桁をチェックしています
isdisitでチェックしたほうが効率がいいだろう。
> それと、11-22等のように記号付で取ったさいにその記号までをコピーするとか
記号が現れたところまでをこぴーすればいい。
>0以上9以下 が 1つの条件で判断できるから
なんだ、ソース上の効率か。
>>311 記号が現れたところまでこぴーとはどうやるんですか?
>>314 バイナリ上でも一回の条件判断である可能性は高いけど。
>ソース上の効率 プ
>>315 記号が現れたところで処理を中断すればいい。
>見た目だけ pu
isdigit系がどう実装されてると思ってるんだろう?
一般的なライブラリではテーブルを使って1度判定するだけ
>>311 ありがとうございます
isdisitと言うものを検索して見たのですが出ませんでした
すいませんが どのようなものか説明していただけないでしょうか?
すいませんがお願いします
>記号が現れたところまでをこぴーすればいい。
と なると私はこれも頭から1文字ずつ読んでいき記号が出るまでと言う風に
してしまうのですが こういう風なことを言っていられるのでしょうか?
すいませんが教えてください
>>323 な、なんだってぇぇ
いわゆる全角も対応しているやつも考えたらすごいテーブルだ
>>324 isdigit()
'0'から'9'までなら1、そうでなければ0を返す
>>325 これって、判定する文字はunsigned charかEOFでなければならないらしいけど、
どうやって全角に対応しているんだろう。
#define isdigit(c) ((unsigned)((unsigned char)(c) - '0') < 9) こうすりゃテーブル不要。
>328 ヴァカハケーン 符号なしはマイナスにはなりませーんw
>329 ...かわいそうに
ありがとうございました if(!(isdigit(c))) { exit(1);} で 今までと同じことができました でも今までの方が自分なりにわかりやすかったかも・・
>>328 ヴァカでした。OTL
#define isdigit(c) ((unsigned)((unsigned char)(c) - '0') < 10)
333 :
デフォルトの名無しさん :04/11/27 15:21:16
isdigitってアスキーコードで計算すんの?
文字コードが連続しているからいいんだけどね。。。
>>331 strtolなんかも使ってみたらどう?
>>333 わかんないです
今までは(c > '9')とかでやっていたのでそれの代替になったということは
そうなっているのではないでしょうか?
すいません わからないです わかるかたいましたらすいませんがお願いします
>>336 すいません プログラムをはじめたばかりなので全然わからないんですよ
できれば それも説明していただければ嬉しいです
>>335 それ以外にも、効率的に条件判断二回とほぼ同等になっちゃいそうだ。
>>337 char *hoge;
long n = strtol("16-256", &hoge, 0);
とするとnには16、hogeには"-256"が入っている。
long int strtol(const char *nptr, char **endptr, int base); 説明 strtol() 関数は nptr の文字列の最初の部分を、 base を基数としてlong int に変換する。 この base は 2 から 36 までの値あるいは特別な意味を持つ値 0 (後述)でなければならない。 文字列の先頭には、任意の数の空白があってもよく、また数字の直前には `+' か `-' があってもよい。 base が 0 または 16 の場合には、 `0x' ではじまる文字列は 16 進数として扱われる。 これ以外の文字列に対して base が 0 の場合は、 `0' で始まる文字列は 8 進数として、それ以外の文字列は 10 進数として扱われる。 数字を表す文字列は long int に変換されるが、基数に対して有効でない数字が現れた時点で変換は終了する。 (11 進数以上では `A' は大文字・小文字に関わらず 10 を表し、 `B' は 11 を表現し、以下同様に、 `Z' は 35 を表す。) endptr がヌル値 (NULL) でない場合は、最初に現れた不正な文字が strtol() によって *endptr に保存されている。 文字列に有効な数字がひとつもなければ、 strtol() は nptr の元の値を *endptr に代入する(そして 0 を返す)。 特に、*nptr が `\0' 以外で、戻された **endptr が `\0' ならば、文字列全体が有効だったことになる。
342 :
デフォルトの名無しさん :04/11/27 15:51:35
int *p;とやった場合はアドレスを入れる宣言になって 式中に*pと出てきた場合はなにになるんでしたっけ?
>>343 どういういみでしょうか?
私が読んでる本に書いてあった気がするんですが朝から探しているのですが
見つけられませんでした
確かその本には 全然意味が違うみたいなことを書いてあったんですが
int n=100; int *p=&n; *p は int の 100
俺もポインタの事で質問だが int *pの pと&pはどう違うの?
int *p の &p は int **
ああ、スマソ。見つけられないて書いてあるなw
>>345 すいません ちょっと意味がわからないです
>>346 C言語によるプログラミング」って本です
>すいません ちょっと意味がわからないです int n=100; int *p=&n; printf("n は int の %d\n", n); printf("*p は int の %d\n", *p);
int *p; という変数の宣言は式の中で*pと書くとint型の値を得られるということ。
atoiしたものをsprintfしてstrcmpすればいい
int i = xxx("16-256"); これで i が -240 になるような関数xxxはありますか?
>>356 作ればあるだろうけど、標準にはない。
Perl とか Python なら eval でできるんだろうけど。
>>357 単に引いてそれが0より小さかったら符号消したら言いだけじゃね?
次の方 実際にCで書いてください
↓
360 :
デフォルトの名無しさん :04/11/27 20:25:12
define xxx("16-256"); -240
ごめん 俺読み間違えてた
んなもん 普通に引いてもなるじゃん
364 :
デフォルトの名無しさん :04/11/27 20:38:04
int xxx(const char* str) { return -240; }
>>356 1番近いのはstrtolを繰り返し呼ぶことだな。
char *p;
int i = strtol("16-256", &p, 10);
int j = strtol(p, NULL, 10);
i += j;
>>356 int xxx(const char * str)
{
FILE *fp;
char buf[200];
sprintf(buf, "awk 'END {print %.170s;}' /dev/null", str);
fp = popen(buf, "r");
fgets(buf, sizeof(buf), fp);
return atoi(buf);
}
>366ならawkで許される演算なら何でもOK。 ex.: xxx("1+2*3/6");
368 :
デフォルトの名無しさん :04/11/27 21:36:47
まじめにやるならパーサ作るだな
Ruby>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>C
RubyがCに進化する
Cで複素数の計算をしたいのですが、どういう方法でするのが一般的ですか?
375 :
デフォルトの名無しさん :04/11/28 00:14:02
とりあえずコンドームしろ
complex
>>374 実部と虚部にわけて計算すればよい。
たとえば、(2+3i)+(3+4i)という計算は、
実部として2+3の計算結果と
虚部として3+4の計算結果を別々に保存すれば良い。
それをわかりやすくするには構造体として
struct complex {
double re;
double im;
};
のようなものを定義しておけばよい。
激しくスレ違いだが、C++なら標準で複素数クラスがある。一応。
C99で複素数型ってのが追加になったんでなかったっけ? 記憶違いならスマソ
なってる。_Complexとかcomplexとか。
>>381 e^iはそのままe^iというものを定義して扱う。
それって分解できないでしょ。
383 :
デフォルトの名無しさん :04/11/28 01:01:46
xor
384 :
デフォルトの名無しさん :04/11/28 01:03:05
nor
385 :
デフォルトの名無しさん :04/11/28 01:37:54
すいません、全部のソースはのせられないのですが、 ファイルに計算した数値を書きこむプログラムを作っているのですが、 printf("%f",S); strcpy( aa , "文字・・・" ); strcpy( bbb , "文字・・・" ); fprintf( fp , "%s\n" , aa ); fprintf( fp , "%f %f %f",x,y,z); fprintf( fp , "%s\n" , bbb ); fprintf( fp , "%f\n" ,S); printf("%f",S); printf("書き込みました。\n"); fclose(fp); return 0; としたときに、初めのSとあとのSの値が変わってしまうのですが、どうしてでしょうか?
aa か bbb がバッファオーバーランして S に上書き
387 :
デフォルトの名無しさん :04/11/28 01:41:06
具体的にはどうすればいいのでしょうか?
aa と bbb の定義部分を載せる
389 :
デフォルトの名無しさん :04/11/28 01:46:08
>>388 とりあえず解決しました。ありがとうございました。
391 :
デフォルトの名無しさん :04/11/28 02:25:47
392 :
デフォルトの名無しさん :04/11/28 03:20:57
mallocでメモリを確保するの意味が分かりません。 char t[5]; と char *t=malloc(5*sizeof(char)); はいったいどういう違いがあるんでしょうか。
393 :
デフォルトの名無しさん :04/11/28 03:24:40
マルチすんなボケカス
394 :
デフォルトの名無しさん :04/11/28 03:35:26
マルチですか、すいません。 もしご存じでしたら私と同じ質問に対する回答へのリンクを貼ってください。
>>392 ANSI Cでは配列のサイズは定数でなければならないことになってる。
配列のサイズが初めからわかっているのならそれでいいが、
必要なサイズがわからない場合は動的確保せざるをえまい。
C99はできますね。
398 :
デフォルトの名無しさん :04/11/28 04:20:15
isspaceとisblank(どちらも標準)の違いを説明できるやつは ここにはいなさそうだな。
↑ぷRuby!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>398 isspaceは改行文字に対して真を返すが、isblankでは偽を返す。
>>392 char t[5];
関数から出たら解放される。
char *t=malloc(5*sizeof(char));
関数から出ても解放されない。
>mallocでメモリを確保する ・でかい領域を確保したいとき ・あとからサイズを拡張とかしたいとき
403 :
デフォルトの名無しさん :04/11/28 09:41:52
それはわかるんですけど、 char t[5]; をグローバル変数としてしまえば プログラムを終了するまで保持するわけですよね? で、関数から出ても解放されないと言うことは 解放しなければ恒久的にそのアドレスのデータは残るというわけですよね? と言うことはそのアドレスをテキストに落として 別のプログラムからそのアドレスにアクセスするという事も可能なのでしょうか?
405 :
デフォルトの名無しさん :04/11/28 09:44:51
Winは出来るの?
407 :
デフォルトの名無しさん :04/11/28 09:46:10
WinXPは出来るの?
>>403 int main() {
char *p = hoge("foo");
char *q = hoge("bar");
puts(p);
puts(q);
return 0;
}
上のようなときにグローバル変数を使うか動的に確保するかで挙動が違う。
char t[5];
char *hoge(char *p) {
return strcpy(t, p);
}
char *hoge(char *p) {
char *q = malloc(strlen(p) + 1);
return strcpy(q, p);
}
やだ
C99って仕様変更多すぎでコンパイラベンダにスルーされそうな予感。 C++との互換性もなくなっちゃったわけで、C++への対応度が高まってきている 昨今、各コンパイラベンダがわざわざC99用のコンパイラを整備するだろうか。
// stdint stdboolだけあれば十分
415 :
デフォルトの名無しさん :04/11/28 12:22:33
> 昨今、各コンパイラベンダがわざわざC99用のコンパイラを整備するだろうか。 こいつぼけ。逆だろ? 今後でてくるCのコンパイラーがあったら、C99に対応していない やつはあり得ない。
416 :
デフォルトの名無しさん :04/11/28 12:23:55
> gccはするに違いない gccはむしろC99寄り。現状でC99のほとんどの機能満たしているんだし、 わざわざへそまがりなことはしない。
VS.NETは普通に対応してないだろ。
Win3.1はできそうだな
この板のコテハンとか口調に特徴もたせる奴って馬鹿ばっか
ということにしたいのですね? (負け惜しみすぎー)
>>410 このスレを消費する速度より遥かに速い速度でそっちを埋めてしまえばいい
423 :
デフォルトの名無しさん :04/11/28 14:23:22
まだVC vs gccを続けるんですか?
>>418 いいかげん、組み込み至上主義は捨てろよ。
組み込みとそれ以外でどっちが特殊なのか考えてみろ
425 :
デフォルトの名無しさん :04/11/28 14:26:27
前スレの末路を見ると、キチガイが3人居ればスレなんかいとも簡単に埋まるということを実感するな。
日曜日は基地外もひまなんだな
キチガイは void 一人だけだろ?
ということにしたいのですね?
本人は絶対に全角"?"とか使わない品
上げ厨は2人と見た
>>420 そんなこといわないでよー にゃんにゃん
434 :
デフォルトの名無しさん :04/11/28 14:50:08
age
435 :
デフォルトの名無しさん :04/11/28 14:52:05
indentコマンドは-gnuで使ってますか? それとも-kr? うちの会社は8割ぐらいが-kr派なんですが、 残り2割りに6通りぐらいの小さい派閥があって まとまらない。
bsd
まとまらないってまとめるなら派閥の意見聞いたってしょうがないだろ。
438 :
デフォルトの名無しさん :04/11/28 15:12:26
ある問題集で 「符号ありの整数型データをシフトするときは 常に算術シフトであると見なされるため、 符号ビットは不変である」 の答えが「×」なんです。 「○」になるものだとばかり思っていたのですが、 こういうものなのでしょうか
>>438 補足です
記述が正しいものには「○」、
正しくないものには「×」をつけろ
という問題でした。
そういうものです
>>438 そういうもんです。論理シフトとはビット列を何も考えずにシフトするため符号付整数型のデータは
思い通りにシフトできません。簡単のために8bitで説明すると、こうなります。
00010000(10進値: 16)を右に2ビット論理シフトすると
00000100(10進値: 4)となり、4で割った状態となります。しかし
11110000(10進値: -16)を右に2ビット論理シフトすると
00111100(10進値: 60)となり、これは整数値に対する演算として望む結果ではないでしょう。算術シフトすると
11111100(10進値: 4)となり、-16に4をかけたものとなります。
そもそも、符号ビットなんて存在するの?
>>441 こいつぼけ。
> -16に4をかけたものとなります。
-16を4で割ったものとなります。
自虐的です
>>440-443 ありがとうございます.
>>441 > 11110000(10進値: -16)を右に2ビット論理シフトすると
> 00111100(10進値: 60)となり、これは整数値に対する演算として望む結果ではないでしょう。算術シフトすると
> 11111100(10進値: -4)となり、-16を4で割ったものとなります。
こうなるんですよね? これは私が期待していた結果です.
なので問題の記述
> 「符号ありの整数型データをシフトするときは
> 常に算術シフトであると見なされるため、
> 符号ビットは不変である」
^^^^^^^^^^^^^^^^
は正しいと思うのですが
もしかして「常に算術シフトになる,とは限らない」ので「×」なんでしょうか?
>>444 >もしかして「常に算術シフトになる,とは限らない」ので「×」なんでしょうか?
そうですね。
左シフト
絶対ググったほうが圧倒的に早いのになんでググらねぇの? 謎だ
>>447 すみません。でも、私の代わりに調べたりしてくれるから、便利だなーって・・・
>>447 誰?
>>446 tnx.
理解できました.
#include <stdio.h>
#include <stdint.h>
int
main(void)
{
signed int i = INT32_MAX;
printf("INT32_MAX = %d\n", i);
printf("INT32_MAX << 1 = %d\n", i << 1);
return 0;
}
450 :
デフォルトの名無しさん :04/11/28 15:38:09
01000000 <<1はどうなる?
三重婚ぐらいか
>もしかして「常に算術シフトになる,とは限らない」ので「×」なんでしょうか? 「算術シフトするとは、言語の規格で決められていない」ので「×」
分かったつもりで分からなくなった… #include <stdio.h> #include <stdint.h> int main(void) { signed int i; i = INT32_MAX; printf("%x\n", i); i = i >> 1; printf("%x\n", i); i = i << 1; printf("%x\n", i); i = i << 1; printf("%x\n", i); i = i >> 1; printf("%x\n", i); return 0; } 実行結果は 7fffffff 3fffffff 7ffffffe fffffffc fffffffe 右シフトは算術シフトで左シフトは論理シフト?
左シフトに算術も論理もない。あるのはオーバーフローを考慮しないでシフトすると言う事実だけ。
>>457 こんなこと書いてる奴のサイトなんか参考にするなよ
>小数点以下を取り扱わないのですから当然の結果ですね。
>難しいことは分かりませんが、普通のシフト演算は整数の
>範囲ということになりそうです。
>勿論、コンピュータはこのシフト演算で計算をしているの
>ですから、少数点以下も取り使えるはずですが、今はよく
>わかりません。
スパイラルしてきた… #include <stdio.h> #include <stdint.h> int main(void) { unsigned int i; i = 0x10000000; printf("%08x : %d\n", i, i); i = i << 1; printf("%08x : %d\n", i, i); i = i << 1; printf("%08x : %d\n", i, i); i = i << 1; printf("%08x : %d\n", i, i); i = i >> 1; printf("%08x : %d\n", i, i); i = i >> 1; printf("%08x : %d\n", i, i); i = i >> 1; printf("%08x : %d\n", i, i); return 0; } 実行結果 10000000 : 268435456 20000000 : 536870912 40000000 : 1073741824 80000000 : -2147483648 40000000 : 1073741824 20000000 : 536870912 10000000 : 268435456 unsigned int なのに負? ヤバい, 分からん….
>>459 printfにunsignedであることを教えてやらなきゃ
こういうのは本読めば書いてあるだろ 考えることじゃない 仕様を調べるだけだ
>>460 ,
>>461 > d,i int 引数を符号付き 10 進表記に変換する。
か….
ちゃんとした本買わんといかんな….
すまんかったです….
そしてありがとうございました.
↑ブラクラ
465 :
デフォルトの名無しさん :04/11/28 17:23:12
>>457 そのページだけでも間違いがいくつもある。
記憶違いに基づくものはまだしも、そのページ内に書かれている情報だけでも矛盾が発生している。
467 :
デフォルトの名無しさん :04/11/28 23:45:57
(・∀・)
Part 96 がバトル状態です。
なんつーかあれだな。 開発がHEADでどんどん進んでたまにstableにマージされるような感じだな。 Debianで言えば 87: woody 95: sarge 96: sid こんな感じか。
こっちはマターリいきましょう。
>>470 デビーンキタ━━━━━━(゚∀゚)━━━━━━ !!!!!
長寿スレの割に結構人がいなくてマターリなのに、いきなり勃発して 数分の内にすさまじい量のレスがつくんだよな。 同じ内容で煽りあう上にぜんぶageだし。不思議不思議。
分散するとログとるのが('A`)マンドクセ
475 :
デフォルトの名無しさん :04/11/29 00:27:06
こっちは削除だろ
おまいら!96に抜かれるぞ
96は、とっとと世界の果ての断崖絶壁から落ちてしまえ
読むのめんどくせえから、しばらく読むのよすよ。 何度もああいうの現れたけど、その度にこれで自衛してきた。 あんなのでスレ消費されてつきあってる暇なんかねえよ。
>>478 どうせ自演なんだから、あっちは隔離スレでこっちが本物でOK
480 :
デフォルトの名無しさん :04/11/29 02:47:57
> あっちは隔離スレでこっちが本物でOK いっしょうけんめいそうおもいこみたがってますね? ;-)
482 :
デフォルトの名無しさん :04/11/29 03:08:18
って、おれはこっちしか書いてないぞ。
483 :
デフォルトの名無しさん :04/11/29 04:13:57
学校の授業課題でCとJavaの文法上の違いと意味上の違いを書けという 課題が出たんですが教えて下さい。紛らわしいガセネタは勘弁願います。
484 :
483 :04/11/29 04:30:43
ちなみに 1. C→手続き型 Java→オブジェクト指向 2.Javaにはポインタがない。(ホントはある) 上記以外のことでお願いします。 あと、意味上の違いとは記述内容は同じでも実行内容が違うという意味です。
485 :
デフォルトの名無しさん :04/11/29 04:41:59
>>2 > ソース丸投げ、「宿題」、書籍 は専門の別スレがあるのでそこへさようなら。
>>484 >1. C→手続き型 Java→オブジェクト指向
>2.Javaにはポインタがない。(ホントはある)
これ、2つともガセネタだろ?
それと 文法⊃意味 だろ。 「構文上の違いと意味上の違い」なら、話の筋が通るけど。
寝ろよぼけ
つーか、Javaと比較させるならC++が普通なのに わざわざCと比較させてるあたりJava厨丸出しですね
いまいち問題が不明瞭だな
unsigned char を scanf で入力するときって どうかけばいいんですか? scanf("%c", uc); でも大丈夫?
ダメダメ
>>491 文字を入力したいのか数値を入力したいのかはっきり汁。
じゃなくて &uc の間違いでした。 書式変換はどうしていすればいいのでしょうか? ググってもでてこないんですが… %cu とかでしょうか?
498 :
デフォルトの名無しさん :04/11/29 13:37:33
int型の変数aに (19786^2)%30000 を代入してはいけないのですか? コンパイルは出来るのですが、結果がおかしなことになりました。
>>498 まさか、(19786 * 19786) % 30000 と同じ結果になるなんて思ってないよね?
>>498 別にいけないことはないっすけど、やりたいことと書いたことが一致してます?
その式って、
19786と2のxorをとって、それを30000で割った余りを求めてることになりますが。
>>497 アスキーコードは正だから "c"でオケーかとおもう。
502 :
デフォルトの名無しさん :04/11/29 13:52:08
503 :
デフォルトの名無しさん :04/11/29 13:53:37
Basicあがり?
>>501 おいおい、文字じゃなく数字だといってるじゃないか。
>>491 int(or short)で入力してからcastして切り詰めるしかないと思われ。
つーか、やりたいことをもう少し詳しくかけないか?
>>504 0-255までの整数を入力して欲しいんです
(;´Д`)
unsigned int で値を受け取っといてから 0x000000ffで論理積とれ
509 :
デフォルトの名無しさん :04/11/29 16:53:00
int* とか、char* って何型なんですか? int 型や char 型ではないことは分かるんですが… ポインタ型とでもいうのでしょうか…?
そう。 ポインタ型というやつ。
>>508 ありがとうございます。
おとなしくそうすることにするです。。
514 :
デフォルトの名無しさん :04/11/29 17:14:23
IPv4用の、マスク幅を指定するとマスクビットを作ってくれる かっこいいトリッキーなマクロありますか? 「24ビット」と指定すると 0xFFFFFF00 を吐いてくれるような。
515 :
デフォルトの名無しさん :04/11/29 17:18:03
Cでプログラミングしてるとき、「あー、アルゴリズムの意味的にはdo-whileかなぁ。。」 と一瞬匂っても、まいいかとforで書いてしまいます。 やっぱり、使い分けた方がいいですか? 僕は、プログラマでもなく、趣味でC言語をやっているわけでもないです。 数値計算に使うだけの、単純なのCユーザーです。 今のところ自分のコードは自分しか見ませんが、将来他人と共有する可能性もあります。 僕自身は読むときに違和感ありませんが、一般的な読む側の意見はどうなんでしょうか?
unsigned ipmask(unsigned addr, int num) { return addr & (~0 << (32 - num)); } result = ipmask(0x10203040U, 24); こんな感じでいい?
>>515 直感的に意味がわかりやすい方を使うのがベストです。
そうでない場合は使用する構文に一貫性を持たせるのが良いでしょう。
あくまでマスクが欲しいんだね、それじゃ #define ipmask(num) (~0 << (32 - num)) でどう?
>>518 トリッキーなのが欲しいって言ってるんだから、
そういう正攻法なのはどうなんだろう。
520 :
デフォルトの名無しさん :04/11/29 17:37:10
>>517 慣れるまではバグを覚悟し、使うように心がけます。
良いソースコードをネットで手に入れることは簡単で、なるべく読むように心がけているのですが、
達者な人に自分のコードを見られたことが無いというのはだめですね。。。。orz
(でも僕的には研究機密だったり)
ありがとうございました。
あんまり大丈夫じゃないです
大丈夫であることが保証されている。 ISO/IEC 9899:1999 5.1.2.2.1 Program startup -2 The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination. 要は、argvによって指されている文字列はプログラムから変更可能でなければならない。
全然大丈夫 constついてないんだから
>>523-5524 ありがとうございます!!!
にしても規格から持ってくるなんて凄いですね。自分も次から見習います
526 :
デフォルトの名無しさん :04/11/29 19:35:40
#include<time.h>を宣言して現在時刻を ファイルに記録したいのですがどうしたら良いでしょうか? 現在時刻の表示だけなら出来るのですが、 ファイルへ書き込みが出来なくて困ってます。 どなたかご教授ください。
strftime
表示ができて書き込みができないって、どういうこった
>>526 もしかして、ファイルに書き込み許可を与えていないという落ちではありません?
ファイルに読み込み許可しかないファイルを扱おうとしていません?
良く調べて。
もしかしてprintfは知ってるのにfprintfは知りませんという落ちだったりして
大原ゆきが言うと、説得力がー10000マンコ
533 :
デフォルトの名無しさん :04/11/29 20:34:17
>>526 です。
えっとsystimeを文中に記述して、年月日・時分秒をDOS画面にprintfで表示しました。
この表示した年月日・時分秒を.txtや.datに、書き出したいと思っているのですが…。
>>527 さんが教えてくれた「strftime」で書式化して.txtや.datに書き込む文を書けば良いでしょうか?
fprintfは知ってますが、最適なものを探してまして。説明不足ですみませんorz
スレ違いだったらすみません。 音声処理で、ある音声データから特定の単語を認識したい(ワードスポッティングしたい)場合についてなんですが、DPマッチングはともかくとして連続DPマッチングがよくわからないです|||orz 出来ればプログラム例などをのせていただければ幸いですが、よければどんなアルゴリズムかだけでも教えてほしいです;
このスレのレベルを考えて質問しなよ
どっちみち、ここがアルゴリズムを聞く場じゃないことも分からない奴に出来るようには思えないな
自作自演がバレバレだよ。
李 晃伸 (り あきのぶ) こいつか。在日、京大だめだな
もしやそれが大原?
>>512 おお、偶然当たった
なんか手持ちの本でint*をint型のポインタってかいてあるのが
あるんですけど、これって誤りですよね?
>>541 間違っていない。
無理やり誤りを挙げるとしたら「int型のポインタ」より「int型へのポインタ」と呼ぶ人の方が多いという程度。
間違えた。「int(型)へのポインタ型」だ。どうでもいいことだけど。
>>536 レスありがとうございます^^
Juliusのソースが参考できるのか。。。Julius = HMM の認識が強く、音響モデルをいじったりするときにしか使えないと思っていました。
さっそくみてみます。
C++ だとNULLを使わずに0を使うのが普通なんですが、これはCにもあてはまるんでしょうか?
ぬるぽ
32ビットの整数のなかに何個のビットが立ってるか 調べるマクロって無かったっけ?
>>548 ループ回さんといかんから単純なマクロじゃできねぇべ。
素直に関数作った方がいいんでない?
#いや、マクロでもいいけど。
>548 つーか、使用目的が思い浮かばん。 それは本当に必要なの?
トリッキースレで見つけた ありがとう ループは好きじゃないし
>>550 Java のクラス BitSet の中に cardinality() という
メソッドがある。
必要だと思ったから作ったんだろう。
#define COUNT_BIT(v) ((v)==0? 0: "いくつか")
554 :
デフォルトの名無しさん :04/12/01 07:40:50
>>548 x ^= -x & x
でリセットしていくのがかっこいい。
555 :
デフォルトの名無しさん :04/12/01 15:33:28
質問させてください。 些細なことなのですが、 関数中に複数の return を使うのと、 あくまで return は一箇所に集めるのとでは 具体的にはどのような違いが出てくるのですか? 僕自身はなんとなく、関数を追うのが楽な気がして できるだけ複数の return は使わないようにしているのですが・・・ よろしくお願いします。
>>555 リソースの開放が絡むなら一箇所にまとめた方が重複コードを省けるし
特にそれがないならその場でreturnした方がすっきりする。
基本的に
>>557 の言うとおり。よくあるパターンとしてはこんなのがある。
if(init1()){
if(init2()){
if(init3()){
...
exit3();
}
exit2();
}
exit1();
}
return;
if(!init1()) return;
if(!init2()) { exit1(); return;}
if(!init3()) { exit2(); exit1(); return; }
...
exit3(); exit2(); exit1();
return;
if(!init()) goto err1;
if(!init2()) goto err2;
if(!init3()) goto err3;
...
err3: exit2();
err2: exit1();
err1:
return;
int hoge() …(a) { hogefunc1(); hogefunc2(); } と、 int hoge() …(b) { hogefunc1(); hogefunc2(); } のどちらが見やすいと思いますか? hoge() が hogefunc1() しか呼ばないんだったら(a)の方が縦長くならないので 大体は(a)のようにしてるんですが、二個以上命令があるなら(b)のように 書いた方が見やすいですかね?
>>559 下のほう。初期化を1行に連ねるならまだ許せるけど、関数呼び出しを1行に複数置かれたくない
引数を取る場合が多いから普段から複数行に分けるため、たまに(a)のような書き方をされると気持ち悪い
構造化を0初期化するにはメンバを1つずつ0初期化するしか方法はないでしょうか? 例えば、 struct s { int a; int b; }; 普通はこのように0初期化しますが、 struct s a = { 0,0 }; struct s a = (struct s)0; こんなかんじでまとめて0にできないでしょうか? 定義時に初期化したいので、memsetなどは使えません。
無理
>>561 struct s a = {0};
これで省略されたメンバは全て0で初期化される。
>>564 ありがとうございます。
gccの-Wで警告が出ますが、気にしないことにします。
566 :
デフォルトの名無しさん :04/12/01 21:58:57
argv[1] = "/a/b/c/d/"; argv[2] = "dir/"; char *p1, *p2; if ((p1 = (char *) malloc(strlen(argv[1]) + 1)) == NULL) exit(1); if ((p2 = (char *) malloc(strlen(argv[2]) + 1)) == NULL) exit(1); strcpy(p1, argv[1]);strcpy(p2, argv[2]); if (realloc(p1, strlen(p1) + strlen(p2) + 2) == NULL) exit(1); strcat(p1, p2); 相対アドレスから絶対アドレスを作るプログラムの中に 上記のようなソースがあってp1が/a/b/d/dir/とならずにdir/になることがあります。 それでreallocの後に for (i=0; i<20; i++) p1[i] == '\0' ? printf("\\0") : printf("%c", p1[i]); といれると $ ./a.out /a/b/c/d/ dir/ \0\0\0\0/c/d/\0\0\0\0\0\0dir/ dir/ $ ./a.out /a/b/c/d/ a/ /a/b/c/d/\0\0\0\0\0\0a/\0\0 /a/b/c/d/a/ $ ./a.out /a/b/c/d/ aa/ \0\0\0\0/c/d/\0\0\0\0\0\0aa/\0 aa/ $ ./a.out /a/b/c/d/ aaa/ \0\0\0\0/c/d/\0\0\0\0\0\0aa/\0 aaa/ とp2が2文字を越えるとreallocでp1ぐちゃぐちゃになるんです。 何がおかしいんでしょうか?
お尋ねしたいんですが、このプログラムを実行するとstrの代入した値が使われていない と出ます。 どうしたらいいのか教えてください? #include <stdio.h> main() { char *str[] = {"a", "b", "c"}; int e; printf("選択 \n"); printf(" 1;a 2;b 3;c"); scanf("%d", &e); printf("%s, str[e]"); return 0; }
>>567 使ってないから使ってないって出るだけだ。
そのソースは書いた通りに正しく動くはず。
>>566 realloc()したら、その戻り値を使わないといけない。引き数として渡したp1は最早、使ってはいけない。
570 :
デフォルトの名無しさん :04/12/01 22:12:07
>>567 最後のprintf()を正しく書けば、未使用警告も綺麗に消えるぞ。
はい、動くことは動くんですが数字を押しても反応がないんです
エンター押せよ
ここが新しいネタスレですよね?
>>559 >二個以上命令があるなら
>命令があるなら
>命令
>命令
( ´_ゝ`)ブーン
>566、>567はどうしたんだろうw
週末の人がなんとかしてくれるんじゃない?
580 :
デフォルトの名無しさん :04/12/02 18:46:55
週末までにこのスレ無くなる悪寒
こうなったら大原ゆきに頼むしかないな
582 :
デフォルトの名無しさん :04/12/02 20:42:52
#include <stdio.h> void main() { int *a,*b; *b = 1; *a = *b; printf("a = %p,b = %p",a, b); } これを実行したら、不正な処理で終了してしまうんですが、 一体何が悪いのでしょうか?
583 :
デフォルトの名無しさん :04/12/02 20:45:20
>>582 a と b の領域がとられているだけで
*a と *b の領域はとられていない
aかbのどちらかもしくは両方が不正である可能性が高い。
void main() この辺に原因がある可能性もあるな。
>>583 本当だ・・・orz
知らなかったよ。int型の領域取られてるものだと思ってた。
a = malloc(sizeof(int)); b = malloc(sizeof(int));
を追加したら、きちんと動くようになった。thanx.
不正な処理ってなんだ?
よくあるWindowsのダイアログ
590 :
デフォルトの名無しさん :04/12/03 00:05:00
初めてC言語やります 猫でも分かるWindowsプログラミングというものをかってみました P10くらいにある以下のようなものをやりました(長いので略) #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); リンク中... libc.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です Release/123.exe : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー たぶん最初の設定の問題だと思うのです。どうしたらよいのでしょうか
コンソールの設定になってる。
つーか基礎を飛ばすにもほどがあるな
C言語なら俺に聞け! Part 96
http://pc5.2ch.net/test/read.cgi/tech/1101615970/503 503 名前:デフォルトの名無しさん[sage 2日目] 投稿日:04/12/02(木) 18:19:44
#include "resource.h"
これがあるときどう実行するんですか
LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/memo01.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー
-W-
(-W-)zZ乙・・・ Σ (0w0) ンドゥル!?
598 :
デフォルトの名無しさん :04/12/03 01:16:49
アホかw
素の突っ込みに新鮮味を覚えた
601 :
ほんたま :04/12/03 07:03:35
プログラマーのみなさん、教えてください。 ひとつのオブジェクトを2つに分裂させるコードを書きたいのですが、どう書けばいいのですか? 擬似的に2つに分裂したように見えるのではなくて、実際に2つに分裂するコードを書きたいのです。 つまり1つから2つのオブジェクトが同時に発生し、2つのオブジェクトの発生にはほんの少しの時間差もないという、事実上の分裂を書きたいのですが…
602 :
デフォルトの名無しさん :04/12/03 07:06:21
CPUを二個載せる。
時間止めればいいじゃん。
604 :
デフォルトの名無しさん :04/12/03 10:26:57
ザ・ワールド
なるほど
allocでメモリ確保した後、 freeで解放しなきゃならんのはわかっているのだが エラー時にある人は 「そのプロセスが途中で落ちた時にエラーコードを実行しない場合がある為、 メモリリークやポートを掴んで離さない事がある。 危険だ。」 と言い、またある人は 「そんな事は無い。エラーコードを実行する。」 と言っている。 危惧しているエラーは 「途中で電源を無理矢理落とした時」等です どっちが本当なんだよ先輩ドモ! どう作ればいいんだ_| ̄|○
対象OSのACPI仕様見ろよ
>>606 エラーコードてのはプロセス異常終了前のコード?
どんな場合でも必ず実行される訳ではないでしょ。
> メモリリークやポートを掴んで離さない事がある。
> 危険だ。」
メモリやポートをまともに管理できない OS を使うのなら
どの道、常に危険と隣り合わせの日々よ。
>「そんな事は無い。エラーコードを実行する。」 そんな事は無い。
>>607 >>608 >>609 レスありがd
まとめると、
・対象OSによっては異常終了側のコードが走ってfreeされる
・走るかどうかは対象OSのACPI仕様参照
・走らない場合は「危険と隣り合わせの日々」
こんな感じでしょか?
ACPI仕様って始めて聞いた言葉なのでググってみるッス
〜誰も頼りに出来ない新米PGより〜
誰もお前のことは頼りにしてないから安心しる
612 :
openGL初心者 :04/12/03 17:31:17
openGLを使ったプログラム作成を助けてください。Visual Cプログラムの関数void 図形(void)の部分なのですが、問題は以下の通りです。 「表面の座標(x,y,z)が下の左式、その点における法線nが下の右式で表される立体を描け。 ここで、θおよびφはそれぞれ0<=θ<=2πおよび-π/2<=φ<=π/2の範囲をとる媒介変数であって、定数hは0<=θ<πにおいて0.3、π<=θ<=2πにおいて2とする。 なお、法線ベクトルnは正規化されてないことに注意せよ。」という問題です。また描画要素としてGL_QUADS_STRIP(隣接四辺形)を使うことが条件です。 どなたか教えてくださいお願いします。尚、初心者なのでコードの説明をしていただけると幸いです。
614 :
デフォルトの名無しさん :04/12/03 19:33:21
>>612 マルチは別に構わんが
代行なら宿題スレで頼んでみたら?
このスレでは質問点を明確にしないと場違いだよ
615 :
デフォルトの名無しさん :04/12/03 19:35:59
614 の続き 「構わん」て、俺べつに許可/禁止の権利があって言ってるわけじゃないからね あなたの例えば聞き込み調査のような行動についてストーカーしてるほどヒマじゃないし だいいち動機がそもそもないよってだけさ
616 :
デフォルトの名無しさん :04/12/03 21:04:21
BolandC++でコンパイルしよとしたら、 Fatal:ファイルHELLO.OBJが開けません と、でました。 他のプログラムはちゃんとできたのにこれだけできません。 なにが原因なのでしょうか?
617 :
デフォルトの名無しさん :04/12/03 21:15:00
C言語で、EUC→Sift JISの文字コード変換のやり方教えてください。
ウソ教えるなw 変換ライブラリを拾ってきて文字列を突っ込めば出来るよ
>>617 マザーボードが対応していないと無理です。
>>606 他のリソースはともかくメモリはプログラム終了時に全部解放される。
>>622 とは限らないんだって、何度言ったらわかるんだ。
過去ログ読め。
どうもです。ICUってライブラリがあるとわかったので使い方教えてください。 EUC→Sift JISだけでいいので。
>>624 ICU 使うにはデュアルCPU が必須です。
「途中で電源を無理矢理落とした時」には、メモリとかポートは解放されると見なして いいんじゃないかなぁ。
>「途中で電源を無理矢理落とした時」等です 「等」が気になる。 「飲みかけのコーヒーをマザーボードにこぼした時」とか 「ゴジラにマシンごと踏み潰された時」とかだろうか?
その無理矢理って表現は、 コンセントからプラグ引っこ抜くようなことをイメージしてしまうんだけど違うよね? 電源ボタン長押しとかでACPIに管理任せる的なことを指してるんだよね?
Sift JISってtypoじゃなくて本気で書いてるんだ。 「円周率はおよそ3」になるわけだ。
>>627 その例のときは気にしても意味がないんじゃないのか?
「途中で電源を無理矢理落とした時」はポートが開いたままになるので 外付けのハードが壊れる時がある
はぁ?
633 :
デフォルトの名無しさん :04/12/03 23:04:06
ど
635 :
デフォルトの名無しさん :04/12/03 23:06:29
2つの論理式が同じ値をもつかどうかを調べるにはどうしたらよいでしょうか? ↓こういう方法しかないですか? bool x, y; bool z = (x && y) || (! x && ! y);
636 :
デフォルトの名無しさん :04/12/03 23:07:15
#include<stdio.h> int main(void){ char *str[5]; for(int i = 0; i < 5; i++){ printf("input : \n"); gets(str[i]); } } これを実行したら、3つ目の文字列を入力したときに、終了してしまうのですが 5つ全部入力するにはどうしたらよいのでしょうか。
bool z = !(!x ^ !y)
641 :
デフォルトの名無しさん :04/12/03 23:13:38
>>639 main()
{
char *str;
gets(str);
}
↑
こーやってるのと同じ
>>639 str[0]からstr[4]の指してる先は確保してるかい? ブラザー
644 :
デフォルトの名無しさん :04/12/03 23:23:57
char buf1[20] , buf2[20]; があったとして、buf1に改行コードが入ってるの。 これをbuf2にコピーしたいんだけど、改行コードは除去したいのよ。 なんか簡単な方法ない?
int i, j = 0; for (i = 0; i < 20; i++) if (buf1[i] != '\n') buf2[j++] = buf1[i];
int i, j = 0; for (i = 0; i < 20; i++) if (buf1[i] != 0x0D && buf1[i] != 0x0A) buf2[j++] = buf1[i];
はじめまして,Linux初心者です.タコなので何も分かりません. X−Windowsがうごきません.この前,某雑誌の付録CD−ROMで,Linuxをインストールして, X−Windowsをうごかそうと,いろいろやってから,startxをしたんですけど,フォントが ないって怒られてだめでした. タコなので,分かりやすく教えて下さい.
どっかのコピペか?
652 :
デフォルトの名無しさん :04/12/04 17:32:22
バッファの先頭から12ビット連続1かどうか調べるのに if(*(unsigned short *)buf & 0xf0ff != 0xf0ff) return 0; を unsigned short us = (buf[0]<<8) + buf[1]; if((us & 0xfff0) != 0xfff0) return 0; に書きか変えると異常終了してしまうのですが 下は何所が変でしょうか?
655 :
デフォルトの名無しさん :04/12/04 17:36:33
分かっているくせに
656 :
652 :04/12/04 17:37:00
unsigned char *にするとか?
660 :
デフォルトの名無しさん :04/12/04 17:56:39
>>546 > C++ だとNULLを使わずに0を使うのが普通なんですが
C++のコードあまり呼んだことが無いのですが、それは本当?
> これはCにもあてはまるんでしょうか?
0とNULLを同一視することがよくあるんでしょうか、という質問なら、
if(!p) // pはポインタ型
とか書くのは普通なので、Cでも当てはまる、のかな。
(自分は上の書き方好きじゃないけど。)
662 :
デフォルトの名無しさん :04/12/04 18:31:20
>>661 そもそも
>>546 はC言語の仕様を聞いているのではないでしょう。
少なくとも漏れは
int *n = 0;
なんてやってる奴見たらぬっころしますし、
そもそもCでは普通ではないと思います。
C++ではこれが普通だと言うのであれば、Cには当てはまらないです。
>>546
663 :
デフォルトの名無しさん :04/12/04 18:39:01
> 少なくとも漏れは > int *n = 0; > なんてやってる奴見たらぬっころしますし、 こいつぼけ。協調性のかけらも無い
>if(!p) // pはポインタ型 好きです。
666 :
デフォルトの名無しさん :04/12/04 18:53:26
C FAQ がある限り存在意義のない厨が粘着しているようだな
C++相談室 part37から引っ張り出してみる >216 名前:デフォルトの名無しさん[sage] 投稿日:04/11/03 15:23:38 >漏れの手元の本には >プラットフォームに応じてNULLの定義方法が異なっていたことにより >プログラムが暴走する危険があった、と書かれてる > >例えば >#define NULL ((char *)0) >#define NULL ((void *)0) >など。で、これを代入するとエラーがでる可能性がある >C *cp = NULL; //エラー? >ちなみにC++では数値の0は任意の型のポインタ値に変換できることが保証されている >よって、0が一般的に使われている > >けど、現在のC++の標準には(void *)0のような定義は許可されていないので >その標準にのっとった環境であればNULLを使用しても問題ない > >ただ、やっぱり今のC++プログラマはNULLではなく、0を利用するのが一般的、らしい あとC++の関数などへ渡す引数のあいまい性を (char *)0, (void *)0 とかで解決できなかった「過去」があったからってのもある んで現在は習慣に乗っ取り、理由も知らずに NULL ではなく 0 を使うC++ユーザーが増えたわけだ
>>662 NULLが定義されない場合を考えとけ。
そんな環境捨てちまえ
プリプロセッサ+キャストなんて気持ちわるくて使ってられん Cでも0でいいだろ
ちょっと試してみた。 int func(){ int* n = NULL; return 0; } $ gcc -Wall -C null.c null.c: In function `func': null.c:2: `NULL' undeclared (first use in this function) つまり、gccは捨てろということだ。
谷の嫁w
674 :
662 :04/12/04 19:16:45
>>665 いや、私は別にQuestionを投げているわけではないので…
で、CでもNULLを使わずに0を使うのが普通なの?
>>663-665
わざわざNULLと書く意味がわからない。
そりゃぬるぽであることを"人間に"わかりやすく示すためでしょ
>>674 NULLを使う人の方が多い(と俺は思っている)。
但し、0を使っても規格上は問題ない。
それにif (p)やif (!p)の書き方も(俺含め)それなりに使われている。
>>667 なるほど。C++にはそんな歴史があったのですね。
勉強になりました。
>>675 ハンガリアンさんならそういう主張もありでしょうね。
680 :
デフォルトの名無しさん :04/12/04 19:22:57
零の表記法 int なら 0 float なら 0.f double なら 0. char* なら NULL では int* は? void* は?? const int * volatile * volatile const は??? ・・・つまり char* の時点で間違えていた char* なら (char*)0 int * なら (int*)0 void* なら (void*)0 const int * volatile * volatile const なら (const int * volatile *)0
NULLはマクロなんだから標準ヘッダを一つもインクルードしないと エラーになるわけか。
>676 ガッ
> ・・・つまり char* の時点で間違えていた どっちかというと0 == NULLとした時点かと。
ていうかポインタ変数がnullかどうかのテストで、if (p)とかif (!p)と 書くのは全然普通だと思ってたが違うの?
>>684 ANSI-Cで保障されているから普通でしょう
ハンガリアンも今や絶滅種だし、これからは0で決まりだね
言語仕様策定時にnullを予約語にするって解もあっただろうが、 現状はそうはなってないな。
688 :
デフォルトの名無しさん :04/12/04 19:38:28
いまどきANSI...
>>684 そういう書き方以外で0とNULLを同一視するところってあまり無いですよね?
たとえば、
>>662 に書いてある
int *p=0;
は
int *p=NULL;
って書くし、if文も
if(p!=0)
じゃなくて
if(p!=NULL)
って書かれるのが普通かと思ってるのですが
(規格上では問題ないのは知っていたとしても)。
Cと言うよりUNIXなのですが、 よろしいでしょうか。 dup2(fd, STDIN_FILENO); dup2(fd, STDOUT_FILENO); close(fd); execlp("cat", "cat", NULL); としたのですが、 fdに何か書き込んでも、 fdから何も出てきません。 何がいけないんでしょうか。
>>689 たしかにそうだが、
>>681 の問題もある。
俺なら、Cの場合NULLを使い、C++の場合0を使う。
>>691 いやいや、
if(!p) と if(p!=NULL) のどっちが普通か、という話ではなく、
if(!p) っていう書き方以外では、あまりNULLと0を同一視しないですよね、
ということを言いたかったわけなんです。
漏れは NULLを使う 比較や代入などをみて、 その変数がポインタ型であることがわかりやすい他者(自身を含む)への考慮 0を使う (作成時の)自分がわかればそれで良し って解釈。文句は受け付けません。
どうしてもポインタに0をつかってはいけないという風潮を作りたいらしい。
まあ、0の代入先がポインタ変数であることぐらいプログラマは よく知ってるんだろうから、わざわざNULLを使う必要はないな。 アドレス即値をポインタ変数に代入することなんてほとんどないんだし。
ちょっと疑問に思ったんだけど、 int i = NULL; ってOKなんだっけ?
>694 ありがとうございます。
>>698 > アドレス即値をポインタ変数に代入することなんてほとんどないんだし。
じゃあ0のときもNULLでいいじゃん、と思えるのだが…
漏れは
>>696 の意見にほぼ同意だが、必ず自分しか使用しない、ということが
分かってるプログラムを書くことが無いので、
事実上NULLしか使わない。
NULL使うにはヘッダをインクルードしなきゃいけないし。 ポインタを対象としていることを分かりやすくするためなんて良く聞くけど、 ハンガリー記法と同じでそんなの全然訳に立たない気がする
>>687 > 言語仕様策定時にnullを予約語にするって解もあっただろうが、
> 現状はそうはなってないな。
初版でそうしなかったからもう歯止めが利かないんだろうね。
現状、NULL(null)を勝手に#defineし直してるソースもよく見るから、そういうソースが軒並み通らなくなっちゃう
>>704 なるほど。つまり、
コードを書く際には
馬鹿な奴のために、ポインタにはNULLを代入し、
コードを読む際には、NULLに頼らず判定を行うべきである、と。
>>703 > 全然訳に立たない気がする
まあ、平常時に役に立たないのは同意。仕様上全く問題ないコードだし。
NULLに頼って判定する馬鹿がいるのか?
708 :
デフォルトの名無しさん :04/12/04 20:08:28
>>706 事実上役に立たないけれど書いとくと理解の助けになるという点では
冗長な括弧追加とさほど変わらないね。読む人のことを考える、と。
if(!strcmp("nullpo", "ぬるぽ")){ ... } このとき strcmp() == NULL を期待する?
0 にすらならない
はい次の方〜。
NULLでも0でも良いって言っている奴は存在意義無いね。 そんなことコンパイラでも分かるし。 他人が読んだり編集したりするときのことも考えなきゃ。
他人が読むときのこと考えてるならその話はもうやめれ
>>717 どちらでもいいと言っているのは、多分他人に読まれる事のない
汚いソースでもおおかた書いている香具師だろう。
綺麗な日本語書けよ。
声に出して読みたいソースコード
ようするにNULLってのは if ((a == 0) || (a == 1)) の冗長な括弧のようにプログラムを分かりやすくはするが、 そのかわりに見やすさを多少犠牲にし、マクロと キャストによりほんのわずかながら危険性がうpし、 ヘッダをインクルードしなきゃ使えないのでウザイってこと
>>721 > 見やすさを多少犠牲にし、
逆。可読性を向上させるために用いる。
> マクロとキャストによりほんのわずかながら危険性がうpし、
するわけない、と思っているが、どんな危険性が?
学校ではSunOSでvi使ってプログラミングしているのですが、自分のPCはWinXPなので viとかないわけですが、Windowsで使えるvi互換エディタを教えてください。
724 :
デフォルトの名無しさん :04/12/04 21:22:02
725 :
デフォルトの名無しさん :04/12/04 21:23:14
めどー
>>724 軽く調べて見たのですが、Dos窓でUNIXコマンドが使えるようになるんですか?
コマンドってもcpとかrm、lsくらいしか知りませんが・・・
728 :
デフォルトの名無しさん :04/12/04 21:27:03
めどーはEmacs互換か(^o^;)
grepとか使えるとプログラミングにも役立つかと
1個1個コンパイルしてパス通せば何とか
731 :
デフォルトの名無しさん :04/12/04 21:35:20
>>727 そんくらいなら使える
つーても、あくまで「UNIXごっこ」には違いないからな・・・
本当にUNIX系のOSをちゃんと憶えるつもりなら
エミュじゃないUNIX系OSしかないと思う
おまえさんの経済状況を知らんのだが
本音を言わせてもらうと、もう1台Linux機を用意して
LANでゲイツ機とつなぐのがベストと考える
VMwareの中にLinux入れてしまえば良い
>>731 そうですか。まあ実際にUNIX使ってても、まだ「ごっこレベル」なんで一応それでOKですね。
やっぱりLinux機あったほうがいいですか・・・勉強で組む程度のプログラムならマシンパワーも
いらないですよね。安い中古ノートでも探すかな・・・
734 :
助けてください :04/12/04 21:39:00
エラー文で jikken.c:150: error: parse error before ';' token jikken.c:150: error: parse error before ')' token って出るんですが・・・。tokenのないエラー文なら対処できるんですけど これって何を意味してるんでしょうか?? ちなみに150行目前後は 148|} 149|else{ 150|if(j=0;j<count2;j++){ 151|if(strcmp(keep,M1[j].tsuduri)==0){ ってカンジになってます
150はifじゃなくてforでは?
ほう。
737 :
助けてください :04/12/04 21:45:55
>>735 ・・・_| ̄|○・・・はうぅ・・
ほんとですね、2時間くらいなやんでました・・・
ありがとうございます
>>734 じゃないけど、俺の脳内コンパイル通ってたよ。
/*add.c*/ int add(int a, int b) { return a+b; } /*sub.c*/ int sub(int a, int b) { return a-b; } /*mul.c*/ int mul(int a, int b) { return a*b; } /*div.c*/ int div(int a, int b) { return a/b; } ヘッダファイルを使って この4つのファイルをリンクするにはどうしたらいいですか?
プロトタイプ宣言でぐぐる
>>739 意味がわからん。
4つをリンクしてどういう出力がほしいんだ?
743 :
デフォルトの名無しさん :04/12/04 22:06:23
==header.h== int add(int a, int b); int sub(int a, int b); int mul(int a, int b); int div(int a, int b); ==main.c== #include<stdio.h> #include"header.h" int main(void) { int i; i=add(1,1); printf("result = %d\n",i); return 0; }
744 :
デフォルトの名無しさん :04/12/04 22:11:04
warning: no newline at end of file ってエラーは何を意味するんでしょう?
>>744 ファイルの最後に改行がない
無視しても構わない
最終行で改行しよう。 …そのwarningって何を警戒するための警告なんだろう?
>>702 > じゃあ0のときもNULLでいいじゃん、と思えるのだが…
0はアドレスでなく、ヌルポインタであるという印のような
ものなので、わざわざNULLというマクロを使用するのは
冗長に思えるわけ。つまり0という定数でそのポインタが
ヌルポインタであることは明らかってこと。
748 :
デフォルトの名無しさん :04/12/04 22:16:01
>>745 問題はないんですね。ありがとうございます。
> ヌルポインタであるという印のようなもの ますますNULLの方がふさわしい気が… 上の方では 0だと定数なのかヌルポインタか一目で分からない、 (代入先の変数がポインタなのか違うのか分からない) って理由でNULLを使おう、と行っているように見えるのですが。 > そのポインタがヌルポインタであることは明らかってこと。 ポインタかどうかっていうのが一目で分からないよね、ということでは。 ポインタであると知ってれば、ヌルポインタであることは明らかだと 思いますが。
750 :
デフォルトの名無しさん :04/12/04 22:22:55
putcについて質問なんですが、 int c='a'; putc(c,fp); だったらちゃんとファイルにaが出力されますが int c=10; putc(c,fp); では10が出力されません。数字は出力できないのでしょうか?
putcのcはcharのc
>>746 改行までを1行としてパーズするヘボヘボコンパイラに当たったら
最終行がコンパイルされないという危惧からじゃないか?
int c='1'; putc(c,fp); c='0'; putc(c,fp);
756 :
デフォルトの名無しさん :04/12/04 22:25:45
だからfprintfがあるんじゃねーか。
UNIX系のアプリにはファイルの最後に改行があるものとして扱うものが 多いからね。
758 :
756 :04/12/04 22:26:26
>>750 fputc() は、キャラクタ c を unsigned char にキャストし、 stream に書き込む。
両方で
printf("%d\n",c);
をやってみると何かわかるかも。
763 :
デフォルトの名無しさん :04/12/04 22:30:05
>>761 そういう場合
>>744 のようなメッセージになるの?
warningでなくerrorになりそうだが。
766 :
744 :04/12/04 22:33:49
>>746 確かにソースファイルの最後を改行したら消えました
ありがとうございます
Mozillaのガイドラインにも最後は改行しろって書いてあったような。
Mozillaのガイドラインによると1行コメントは外道らしい
769 :
750 :04/12/04 22:50:35
>>756 fprintf使うとやりたいのがうまくいきそうです、ありがとうございます
Mozillaのコーディング規約は、いろんな環境で 開発されることを想定してるからねぇ。 古いCの仕様では 1行コメント駄目だし、 そういうコンパイラは今でもいっぱいあるのは確か。
GNUの規約によるとスペースでインデントをするのは外道らしい。TABを使え!だそうだ
772 :
デフォルトの名無しさん :04/12/04 22:58:59
C言語のソフトってどこで手に入れることができますか? 馬鹿みたいな質問すいません
Vectorに行ってください
gnuのコーディング規約って、 int func(i,j) int i,int j { ... } じゃ無かった? (使ったこと無いので↑で本当に正しいのか自信が無いが、こんな感じの奴) もしかしたらMozillaもそうだったかも。
GNUは2文字スペース字下げやってるのにTAB使えとはね。 字下げが8文字以上になったらTABに変換しろってことなんだろうけど。 実際Emacsもそのような挙動をするし。
ぶっちゃけGNUのコードフォーマットは 変態的。
返値の型と関数名の間に改行を入れろってのもある というかスレ違い
>>777 777を取っておきながらその発言! shame on you!!!
779 :
デフォルトの名無しさん :04/12/04 23:08:10
スタイルなんかは T-1000 のように変身潜行する能力がすべてさ
777なんて要らないから1024を目指そうぜ
781 :
デフォルトの名無しさん :04/12/04 23:50:11
int型をchar型に変換する関数ってあります?
782 :
デフォルトの名無しさん :04/12/04 23:51:37
にゃーがね
実際、LSI-Cはコンパイラオプションによっては最終行に改行がないと誤動作する。
>>781 32bit環境と仮定
typedef struct _int2char {
char c1;
char c2;
char c3;
char c4;
} int2char;
使い方は
int2char i2c;
忘れた。教えて偉い人
Ruby!!!!!!!!!!!!!!!!!!!!!!!!!!
union
788 :
781 :04/12/04 23:58:40
int c; c=getc(file); ↑のカンジで読み出したcをchar型の配列に1文字ずつ入れたいんですが 何か方法ありませんか?
>>788 castして代入。警告を恐れない猛者なら単に代入でもよい。
scあんf
791 :
デフォルトの名無しさん :04/12/05 00:04:29
>>788 そのまま代入でおk
ある特定の処理系で警告が出ないように書かなければならないとしたら世界中飛んで回らねばならない
そんなこと言ってる香具師で本当にやってる者は俺の知る限りいない
792 :
788 :04/12/05 00:07:15
>>791 そのまま代入するとSegmentation fault (core dumped)になるんで
gdbで調べるとその代入文がでてくるんで困ってるんです
fileはちゃんと開かれてるのか?
794 :
デフォルトの名無しさん :04/12/05 00:19:27
>>792 添え字に使ってる変数が不定または範囲外は?
795 :
792 :04/12/05 00:20:16
>>793 なぜか代入する配列の宣言を変えたら解決しました
ありがとうございました
796 :
デフォルトの名無しさん :04/12/05 00:23:45
>>795 char *unko;
↓
char *unko[300];
じゃねーだろなw
797 :
デフォルトの名無しさん :04/12/05 00:24:12
>>796 間違い
char unko[300];
(´・ω・`)・・・・
798 :
デフォルトの名無しさん :04/12/05 00:28:42
799 :
デフォルトの名無しさん :04/12/05 00:29:29
800 :
デフォルトの名無しさん :04/12/05 00:30:58
下劣な奴が本当に劣っている例だな
ポインタにcを代入したんだろうな。<Segmentation fault
802 :
デフォルトの名無しさん :04/12/05 01:19:04
803 :
デフォルトの名無しさん :04/12/05 01:20:31
804 :
デフォルトの名無しさん :04/12/05 01:24:48
>>802 791 だが、あるよ。
学生でも知っていそうな、そこいらへんのやつとか。
VCの病的なWallとか
806 :
デフォルトの名無しさん :04/12/05 01:54:54
>>804 どういう警告が?
getcて戻り値intだよなぁ…
intからcharに入れるんだから、警告出すコンパイラもありそうじゃない?
お前らアホ?馬鹿?Ruby?
mRuby(みさくらRuby)の実装を希望します
812 :
デフォルトの名無しさん :04/12/05 02:26:36
813 :
デフォルトの名無しさん :04/12/05 02:34:32
まRunaby
814 :
デフォルトの名無しさん :04/12/05 03:29:54
ちょっとお聞きしたいんですが、 void Hoge( void ) { : //(略 return ; } の return ; って必要ですか? 自分は書かないほうなんですけど、他人のソース見ててふと思ったので書き込みました。
書け
はい
818 :
デフォルトの名無しさん :04/12/05 04:13:25
>>815 可読性のために書いておけ。
そこでreturnしない変態的な関数
作る奴もいるしな。
819 :
デフォルトの名無しさん :04/12/05 04:22:16
処理のテーブル化、というのはどういうことでしょうか? 関数ポインタを配列に入れて、ループで処理すること、 と勝手に想像してみたのですが、あってます?
あってるよ
ループで処理、じゃなく 配列のindexで処理選択って感じかな。
BORLAND C++ COMPILER使ってるんですが、これって画像の取り込みなどは可能なのでしょうか? もしよろしかったら教えて下さいませm(_ _)m
>>822 画像の取り込みと言っても色々あるだろ
何がやりたいんだ
IDEの背景色変えたいだけじゃない?
googleの画像検索結果から画像を取り込んで ふたばに貼り付ける……とかをしたいのでは?
あんたがやりたいだけだろ
じゃあさ,じゃあさ, FAXからTIFF画像を取り込んで ある程度ノイズを消してから,任意のプリンタで出力したい ってのは?
かってにやってろよ
829 :
デフォルトの名無しさん :04/12/06 03:38:37
>822 可能です。 >827 可能です。 最近、師走ですえn。
830 :
デフォルトの名無しさん :04/12/06 09:45:07
Delphiじゃなきゃ無理だろ
fortranが熱い!
名前がカコいいふぉーみゅらとらんすれーしょん
833 :
デフォルトの名無しさん :04/12/06 21:21:12
コンパイルに成功してプログラムが実行できない場合、確認する方法はないですか? ちなみに実行すると何もでず、終了もしない状態になります
何も出ず、終了もしないことは確認できてるんじゃないのか?
835 :
833 :04/12/06 21:55:53
>>834 すみません、確認するっていうのはプログラムが終了しない原因を確認する方法です。
ソースのどこがおかしいのか・・・
デバッガも無いのか?
シングルモルトだな
838 :
833 :04/12/06 22:02:57
もう一度問う デバッガも無いのか?
プログラムが暴走するなんてよくあることだしな。 ループにprintfでも突っ込んどけば。 カウンタで何回かしたら強制的にループを終えるように してもいいし。
841 :
833 :04/12/06 22:12:46
使えよ
843 :
833 :04/12/06 22:18:02
>>842 gdbで走らせても走り続けて何も出ず、暴走するだけなんですが・・・
844 :
デフォルトの名無しさん :04/12/06 22:18:44
助けてください。 OSはUNIXでc言語でお願いします。期日は早めでお願いします。 1.c言語を用いてスロットマシーンをつくってください。 2.構造体利用を用いたプログラムをつくって下さい。 以上の二つです。
845 :
デフォルトの名無しさん :04/12/06 22:20:16
いわゆる周期境界条件の処理をしたいのですが、これをコンパイルすると エラーがでるのですが、どこがいけないのか教えていただけませんか? double isincell(double p) { if ( p > L ) { return p-L; } else if ( p < 0 ) { return p+L; } else { return p; } } Lはセルの1辺の長さで#defineで定義済み。コンパイラ(BCC)のエラーは エラー E2188 kadai.c 139: 式の構文エラー(関数 isincell ) 警告 W8070 kadai.c 146: 関数は値を返すべき(関数 isincell ) 警告 W8057 kadai.c 146: パラメータ 'p' は一度も使用されない(関数 isincell ) 139行目が最初のifの行です。 お願いします。
849 :
845 :04/12/06 22:27:13
>>846 >>847 申し訳ありません、
>>847 見て気づきました。
#define L (・・・空欄)
になってました・・・orz
どんな値入れればいいかわからんから空欄にしたままだった・・・
お騒がせしました。
>>844 include <stdio.h>
void main()
{
int i;
printf("スロットマシーン\n");
printf("コインを入れてください\n");
scanf("%d",&i);
printf("oxo\n");
printf("777\n");
printf("oox\n");
printf("おめでとう");
}
851 :
デフォルトの名無しさん :04/12/06 22:54:15
助けてください。 OSはUNIXでc言語でお願いします。期日は早めでお願いします。 1.c言語を用いてスロットマシーンをつくってください。 2.構造体利用を用いたプログラムをつくって下さい。 以上の二つです。
>>851 #include <stdio.h>
void main()
{
struct {
int i;
}slot;
printf("スロットマシーン\n");
printf("コインを入れてください\n");
scanf("%d",&slot.i);
printf("oxo\n");
printf("777\n");
printf("oox\n");
printf("おめでとう");
}
854 :
デフォルトの名無しさん :04/12/06 23:48:38
>>853 ダイレクトエックスを使ってお願いします
>>853 できれば効果音もつけて下さい。お願いします。
仕様にないのでついかりょうきんになります。 10年後ぐらいにたぶんできます。
>>853 できれば(;´Д`)ハァハァなおねーちゃんも表示して下さい。お願いします。
858 :
デフォルトの名無しさん :04/12/07 00:00:58
Cでこの課題のプログラム作ってください お願いしますm(__)m 英語の文章に出現する単語の中で、文字数が最も多い単語を出力して終了するプログラムを作成せよ。 入力データには英文字、スペースのみが含まれているものとし、単語とはスペースで区切られた連続する英文字の列とする。 文章の文字数は80文字以下で、一つの単語の文字数は32文字以下とする。 最長の文字数を持つ単語は文中にただ一つだけ存在するものとする。 よろしくお願いしますm(__)m
バニーガールどうぞ printf("∩_∩\n"); printf("(*^o^)<いらっしゃいませ"\n);
>>858 この板見てるとこういう宿題をよく見かけるが、データのフォーマットが不明なものが多いよな。
いきなり文字配列なのか、ファイルIOも視野に入れた課題なのか、とか。
>ファイルIOも視野に入れ そんな些細なことは気にするな(w >文章の文字数は80文字以下で、一つの単語の文字数は32文字以下 だぜ?
だいれくとえっくす使えにワロタ
ゲー専の課題なのか?
865 :
デフォルトの名無しさん :04/12/07 19:22:24
ここはゲームなインターネッコですね
MS Word からある文字列がある行を出力したいのですが、どうやればいいんでしょう? よろしくお願いします。
867 :
デフォルトの名無しさん :04/12/07 19:33:30
C言語は独学でも十分学べますか? あと他のプログラム全般についても独学でも学べるんでしょうか?
独学で学べないものを挙げてみよ
869 :
867 :04/12/07 19:40:19
セックスは独学では学べないと思います
アホだ。アホが居るよママ
はじめてのC
('A`*)
質問ですunsorted list(ソートされないリスト)で ┏━┳━┳━┳━┳━┳━┓ ┃10┃53┃24┃35┃ ┃ ┃ ┗━┻━┻━┻━┻━┻━┛ と配列が渡されたとき、「75」を挿入すると ┏━┳━┳━┳━┳━┳━┓ ┃10┃53┃24┃35┃75┃ ┃ ┗━┻━┻━┻━┻━┻━┛ となるので正しいですか?? また、 ┏━┳━┳━┳━┳━┳━┓ ┃10┃53┃24┃35┃ ┃ ┃ ┗━┻━┻━┻━┻━┻━┛ から53を削除した場合、リストはどの様に並びますか? よろしくおねがいしますm(_ _"m)
クズは放置
877 :
デフォルトの名無しさん :04/12/08 20:58:29
すいません C言語初心者ですが投稿させていただきます。 C言語で、ある処理でログ出力する際に同時刻に複数プロセスが出力すると、片方のプロセスがログ出力できないということがあるでしょうか?? もしある場合は、対処方法はありますか??
>>877 環境によっては複数のプロセスが同時にファイルを開くことができる。
ログ出力と言うと通常追加で開くと思うが、例えばこんな現象が生じる。
プロセスAがストリームポインタを末尾(仮に100行目)に移動する。
プロセスBが(以下略
プロセスAが(100行目に)ログ出力する。
プロセスBが(以下略
これにより、プロセスAが出力した内容は消えてしまう。
OSによってはansi標準関数を使わないでOSが用意した関数を使用することで
排他的にファイルを開くことができるので避けることができる。
そういった手段が用意されていない場合は、ファイルパーミッションを落とすか
ファイル名を変えてしまうことによって回避するように工夫することになる。
>>877 シェアードオープン
ミューテックスまたはセマフォ
このあたりを習得すれば、有る程度好きに出来る。
880 :
デフォルトの名無しさん :04/12/08 23:08:05
こんばんは。リナックスのC言語を使っているのですが、 立方体を描いてそれを回転させるようなアニメーションはどうしたら良いのでしょうか? 立方体を描くところまではできたのですが動かすことができません。 やりかたの方法、載ってるサイト。またはそのような書籍があればお教え下さい。 よろしくお願いします。
>>881 (多分)自前でレンダリングしてるんだろうから、それじゃスレ違い
883 :
880 :04/12/08 23:59:17
>>881 OpenGLってのでいけそうです。
ありがとうございました。
orz
LinuxnoCgengottenanndesuka?
887 :
880 :04/12/09 00:12:41
いえいえ 882さんもレスありがとうございました
強いシンボル、弱いシンボルというものはどういうものでしょうか? またそれらは実行時のパフォーマンスにどう影響するものでしょうか?
889 :
デフォルトの名無しさん :04/12/09 04:20:02
電卓プログラムを作ってください! 出だしは #include <stdio.h> main() { ではじまって、switch文、while文,if文、break文、for文のみを使って、 1 +3 と入力すると 4 続けて +sin30 と入力すると 4.5 と出て、 Q で終了できるようにお願いします!
スレ違いだしmain()が気にくわないし題意がわかんないしもうこんな時間だし
>>888 強い: シンボリクリスエス
弱い: ニッポージャガー
ミス、return 0; な
898 :
デフォルトの名無しさん :04/12/10 00:28:49
おまえら使えねーよ マジ死んでいいから^^
+sin30 が 4.5 になるところ以外はできた
あぁ, 1+3+sin30 で 4.5 ってコトか. ちょっと待っててね.
901 :
デフォルトの名無しさん :04/12/10 13:59:34
円の三点が分かっていて、そこから中心点(cx,cy)と半径(r)を求める計算のプログラムを作ってみたのですが、 簡単な計算はできるのですが、複雑になると-1.#IND000000000という文字が出てしまいます。複雑な計算でもできるようにするにはどこを改良すればよいかどなたか教えていただけないでしょうか? /* 始点 */ arcx[0] = arc[z][0].sx; arcy[0] = arc[z][0].sy; arcz[0] = arc[z][0].sz; /* 中間点 */ arcx[1] = arc[z][1].sx; arcy[1] = arc[z][1].sy; arcz[1] = arc[z][1].sz; /* 終点 */ arcx[2] = arc[z][2].sx; arcy[2] = arc[z][2].sy; arcz[2] = arc[z][2].sz; for(i=0; i<3; i++) { a[i][0] = arcx[i]; a[i][1] = arcy[i]; a[i][2] = 1.0; a[i][3] = (arcx[i]*arcx[i] + arcy[i]*arcy[i]); } for(i=0; i<3; i++) { tyu = a[i][i]; for(j=0; j<4; j++) { a[i][j] /= tyu; } for(k=0; k<3; k++) { erase=a[k][i]; for(j=i; j<4; j++){ if(k!=i) a[k][j] -= erase*a[i][j]; } } } for(i=0; i<3; i++){ cx = a[0][3]/2; cy = a[1][3]/2; r = sqrt((arcx[t]-cx)*(arcx[t]-cx)) + ((arcy[t]-cy)*(arcy[t]-cy)); }
strcpyはつかっちゃだめよ strcpyにつかっちゃうと、抜け出せなくなるから。
903 :
デフォルトの名無しさん :04/12/10 14:22:06
>902 strcpyって何ですか?
905 :
デフォルトの名無しさん :04/12/10 14:32:37
>>905 >902を無視してstrcpy()を注意深く使う。
間違ってもstrlcpy()にしただけで安心してはいけない。
また、文字列の加工はstrcpy()やstrcat()を駆使するよりも
sprintf()一発ですむことが多い。sprintf()の書式をよく調べてみるといい。
>>901 一見して何をしているプログラムか判らん。
最後のループは不要に見えるし、arcx[t]の tは何だ?
怪しいのは、
tyu = a[i][i];
for(j=0; j<4; j++) {
a[i][j] /= tyu;
の部分。a[i][i]が 0だとゼロ除算になってしまうし、極端に小さいと正しい
結果は出ない。「行列 ピポット 選択」でgoogleするとヒントが見つかると思う。
いちど手計算(電卓)で計算してみることを勧める。プログラムの中にprintf()を
入れて途中経過を表示するようにして、それが手計算と合っているか確認する
デバッグ手法が有効だ。
908 :
デフォルトの名無しさん :04/12/10 16:33:21
>>907 arcx[t]のtはiの書き間違いです。アドバイスありがとうございます。
ゴメン、typoした。 ×ピポット ○ピボット (pivot) //ピポットで検索しても結構ひっかかるようだがw
910 :
デフォルトの名無しさん :04/12/10 17:53:16
先生方お願いします。 ファイルサイズが500MB近くのファイルがあります。 この中からあるキーワードが含まれている行を抽出しなければなりません。 あるキーワードは複数存在します。 上記で私が考えたのは、 ファイルを1行ずつ読み込み、その1行の中にキーワードが存在するか 調べるかアルゴリズムを考えたのですが、これだと非常に遅いです。 もっと早く調べる方法はありますか? ファイルのバッファを全て落とし込むのはメモリ的に無理となっています。
while(gets(line)) for(i=0;i<word_count;i++) if(strstr(words[i], line) { 見つかった; break; } というようなコードをたぶん書いてるんだろうけど >while(gets(line)) の部分をある程度まとめた行を同時に読み込んで処理する。 改行に関係なく100kbまとめてとかね。 > for(i=0;i<word_count;i++) > if(strstr(words[i], line) の部分も高速化できるかもしれない if(multi_str_str(words, word_count, line) のように複数の単語を同時に検索するアルゴリズムを自分で実装する。 実際にやったことないからどの程度高速化するかは分からないけど。まあ腕次第。
単純に1つの単語を調べるなら、BM法にすればいいんだけど 複数だと工夫がいるね。 で、I/Oの最速はメモリマップドファイルだけど、OSに依存する。 それに、実際に遅いのは物理ディスクにアクセスする部分であって、 メモリ上のコピーはそれほどでもない場合も多いから stdioの関数を使って、setvbufするだけでも充分になる場合が多い。
キーワード検索に"foo|bar|baz"な正規表現使うのはどのくらい速いんだろう。 自前でやるのと比べるとあんま速くないかな。
時間制限みたいなのはあるんかい? ないとしたら、お前さんの希望する検索時間ってのは どれくらいなんだい?
そうそう。 正規表現みたいな状態遷移での決定を BM法みたいに末尾から行うのが 最速じゃないかと思うんだ。 (最大文字列長にあわせて、不足する末尾は?で埋めて) ただ、500Mともなると I/Oの割合の方が大きいんじゃないかと。
>ただ、500Mともなると >I/Oの割合の方が大きいんじゃないかと。 単に500Mのファイル読むだけならそんなに時間かからないからボトルネックは検索の方だよ。 CPUのキャッシュサイズに合わせて処理していくのがいいんじゃないの。
500Mのファイルって、最近のディスク使っていて、データが最外周部にあっても 全部読むのに10秒近くかかるよ。 力任せ法での検索(先頭文字の検索だけ工夫をして)が それ以上に時間がかかりそうなら、仕方ないけど。
CPUのキャッシュを意識しなきゃいけないのは 基本的に、オンメモリのデータを複数回処理する時だけだね。 外部からデータを読んで、 それを一回読むだけで次へ移るような、ストリーム系の使い方だと 「キャッシュに収まるサイズで」というのはあまり意味がない。
>>918 > for(i=0;i<word_count;i++)
> if(strstr(words[i], line)
ここで複数回処理してるわけで。
複数キーワード同時検索って結局インデックスも複数持たざるを得ないから効果は薄い気がする。
だからね、 先頭文字の一致だけ、ctype.hにあるようなテーブルを作って判定するのよ。 そして、 一致しなければ次の文字へ進む 一致したら(一回switchを挟んで)各文字列をmemcmpでチェック という形にするだけで 全体の内の殆どは1回スキャンするだけになるし 複数スキャンする部分は充分小さいから キャッシュサイズなんて意識する必要が無くなるの。 もちろん、OSのバッファ -> stdioのバッファ -> fgetsのバッファ へのコピーが発生するけど、これが ディスクへのアクセスと比べてどれほど実行時間を左右するのか、って話。
だからね、 >先頭文字の一致だけ、ctype.hにあるようなテーブルを作って判定するのよ。 >そして、 >一致しなければ次の文字へ進む >一致したら(一回switchを挟んで)各文字列をmemcmpでチェック なんてベタ検索で効果が出るのかって話をしてるんだけど。 まあ検証するつもりはないからこれ以上はやめとくけど。
922 :
デフォルトの名無しさん :04/12/10 19:50:28
最近C言語始めだしたて「C言語プログラミング検定3級」なるものを 受けようかと思っています。何かいい勉強方法などありましたらご教授 願えないでしょうか?宜しくお願いしますm(__)m
>なんてベタ検索で効果が出るのかって話をしてるんだけど。
あれ、「CPUのキャッシュ」の話じゃなかったの?
だったら、最初の方で書いたように
BM法を応用した末尾からの判定を、複数文字列に対応させたものを
メモリマップドファイルを用いて探索したものが最速だと、
俺は最初からずっと思っているよ。
そして、それはCPUのキャッシュサイズなんか関係ないし。
で、
>>920 程度ならすぐに実装できるけど
これ以上の工夫は結構手間がかかる。
そして、探索アルゴリズムの工夫による効果が
ディスクI/Oにかかる時間にと比べてどれほどの効果をもつのか
(実装にかかる手間が「充分意味のあるもの」と思えるほどなのか)
ディスクI/Oに比べてCPUのキャッシュの速度がどれほど実行時間に影響するのか
という話だと思ったんだけどね。
まぁ取り敢えずgrepで速度的に問題ないか確認するところからだな。 場合によっちゃ、自前で書くより速いかも知らん。
お前ら( ゚Д゚)⊃旦 チャノメヤ 質問者のレベルを・・・
一応、試してみたよ。
手元にあった19M程のテキストファイル(MSHTML_TLB.h)から、"foo","bar","zot"の3つを探索。
探索するだけで、「見つかったから何かする」というのは無し。
これを30回繰り返すけど、
サイズが小さいから、全てOSのキャッシュにのっているはず。
fopen()は、"rb"で。
bccだから、memcmpすらインライン展開はされてない。
ベタなfgets()+strstr()x3 およそ8.2秒
これにsetvbuf() およそ8.0秒
>>920 およそ3.0秒
もちろん、境界条件等は無視したから、実際にはもう少し変わってくるけど。
さて、これ以上のアルゴリズムの工夫で3.0秒がどの程度減らせるのか、
CPUのキャッシュやアセンブラを意識した最適化でどの程度になるのか。
実際に500Mのファイルから探索するなら、
ディスクからの読み込みで、約10秒かかる。
初心者です。 使用月と月々の諸料金を入力して、その合計と平均を出そうというプログラムを組みました。 #include <stdio.h> int main(void) { int i; int a[10],l,x,s; float avg; s=0; printf("使用何ヶ月目か入力>>\n"); scanf("%d\n",&l); printf("請求金額を入力>>\n"); for(i=0;i<=l-1;i++){ scanf("%d\n",&x); a[i]=x; s=a[i]+s; printf("合計 %d\n",s); } avg=0; avg=s/i; printf("月額平均 %f\n",avg); return 0; } しかし、一回目に0以外の数値を代入しても(例えば10)一番初めの合計が「合計 0」と表示されしまいます。 これを一回目の入力をiとしたら、一番初めの合計を「合計 i」と表示させるにはどうしたらいいんでしょうか? また、このプログラムを簡潔にするにはどこを改良すればよいかどなたか教えていただけないでしょうか? ちなみに環境はMicrosoft Visual C++ 5.0で、エラー・警告等はありません。
まず、 × scanf("%d\n",&l); ○ scanf("%d",&l); scanf("%d\n",&x);も同様。
scanfは面倒くさいからfgetsとatoi使え。 あとavg = 0;は直後でs/iを代入しているんだから無駄。 そのs/iはsもiも整数だから結果も整数になる。((double)s) / iにでもしろ。 どうせだからavgはdoubleにしろ。
931 :
デフォルトの名無しさん :04/12/10 22:40:28
>>929-930 ありがとうございます。
言われた通りに入力したらちゃんと実行出来ました。
scanfの代わりにfgetsとatoiですか。調べてみます。
ありがとうございました。
#include<stdio.h> int main(void){ int a; a = 1; printf("number%d\n , 0"); } return 0; 参考書見ずに書いてみました。もしかしたらどこか違うカモ… まず1歩目です!
934 :
デフォルトの名無しさん :04/12/10 23:05:12
936 :
デフォルトの名無しさん :04/12/10 23:48:19
938 :
デフォルトの名無しさん :04/12/10 23:51:58
________. | ・・・「からけ」? ||| | \____ __ ||| | )\ ∨ ||| 空 気. <⌒ヽ ヽ ||| \ ( ´ー`) ∧∧ |||_________V( 丿V^ ●Д゚,,) |,,| |,,| ヽ ( と ,) ノ ) | |〜 ∧ .し`J,,.  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄\
939 :
900 :04/12/11 00:45:24
>>933 int a;
a = 1;
は int a = 1;
とまとめられる。
のはいいんだがaは何に使ってるんだ?
>printf("number%d\n , 0"); そもそも number%d\n , 0 って表示させてどうするw
>%d ...何が表示されるんだろう
>>941 「returnの場所がおかしい」と、一番の餌で釣れない933て一体。。。
なるほど!おもろいな
946 :
デフォルトの名無しさん :04/12/11 21:12:10
そろそろ埋め立てる方針らしいのでなんか荒れるネタきぼんぬ。scanf類以外で
947 :
デフォルトの名無しさん :04/12/11 21:12:56
freeしろ。必ず。
948 :
デフォルトの名無しさん :04/12/11 21:13:32
初心者です。 参考書によって void main() と書いてあるものと int main() と書いてあるものの2種類ありますよね。 intにしてreturnしても、どこにも使われてないし プログラムも問題なく動くので 全部voidでいいと思うんですが。 voidにしてはいけない理由でもあるのでしょうか。
仕様でintにしろと決められてるから
mainの戻り値はシステムに使われてる品
>>949 例えば、このスクリプト内ではプログラムの返り値を使います。
#!/bin/sh
i=100
while [ $i -lt 253 ]
do
a=`ssh 192.168.0.$i who 2> /dev/null`
if [ $? == 0 ]
then
echo "192.168.0.$i" $a
fi
i=`expr $i + 1`
done
>>952 「このプログラムは返り値を提供しません。標準出力の結果を勝手に解析してください」
でもいい気がするんだけど。実際リターンコードは結構適当だし。
すみません。先輩から「最近のCの規格で、voidは大文字でも良くなったよ」と聞きました。 試しに int main(VOID) { printf("VOID(・∀・)\n"); return 0; } を実行してみると、ちゃんと動きました。 この規格は、いつ決まったのでしょうか? 参考になるURL等ありましたら教えてください。
>>953 返り値はUNIXツールの習慣なんだけど、実際返り値があるとシェルプログラムから
扱うときに非常に便利なんだ。
返り値にもメタファがあって、習慣どおりにしないと不便になる。
すみません。ちょっと間違えました。
957 :
デフォルトの名無しさん :04/12/11 21:56:44
>>951 その「システム」を ISO/IEC9899 は定義せずに shall とか言ってるわけだ
958 :
デフォルトの名無しさん :04/12/11 22:02:03
>>955 &&で繋いで処理する時なんかかな?
./configure && makeとか
960 :
デフォルトの名無しさん :04/12/11 22:03:33
962 :
デフォルトの名無しさん :04/12/11 22:12:23
>>960 よく読めよ
返却値の型が int の main を受理できなければならないだけで
それ以外を implementation-defined としているだろ
ちゃんと文書化してあれば合法なんだよ
>>954 windows.hなんかをインクルードするとそうなる。
windows.hの中でインクルードされているwindef.hかどっかに#define VOID voidと書かれているから。
DWORDとかVOIDとか、使いたくないんだけど。。
どうせならVoidやTrueも通るようにすればいいのに
HTMLを手書きしてる人で <Html> <Head><Title>hoge</Title> </Head> </Html> ってやってるのがいたな
>>963 windows.hなんて全然使ってません。
#includeしているのは、<stdio.h>だけです。
gccとbccとvctkの全てで動作を確認しました。
嘘だと思うなら、試してみてください。
970 :
デフォルトの名無しさん :04/12/11 22:28:46
>>962 「ちゃんと文書化してあれば」って何のことだ?
社内規定?
あと、 int main(Void) { ... } でも動きました。
972 :
デフォルトの名無しさん :04/12/11 22:29:09
教えてください。 入力した文字列を格納した配列のポインタを戻したいんですけど、警告がでました。 警告1:プロトタイプ宣言のない関数'input'の呼び出し。(関数 main) 警告2:コードは効果をもたない。(関数 main) 警告3:問題のあるポインタの変換。(関数 input) ソース↓ #include <stdio.h> #define MAX 256 char *input(); void main() { *input(); } char *input() { char s[MAX]; printf("COMMAND:"); scanf("%s", s); return s; }
973 :
デフォルトの名無しさん :04/12/11 22:30:58
>>972 char *input()はですねー、char*型の返り値を返す、inputという関数の定義なんですよー にゃんにゃん
976 :
デフォルトの名無しさん :04/12/11 22:32:39
977 :
973 :04/12/11 22:33:21
>>972 お前が言いたいだろうことを最大限考慮してやった↓。
これがしたいんだろ?
#include <stdio.h>
#define MAX 256
char *input();
void main()
{
char* p;
p = input();
printf("%s\n", p);
}
char *input()
{
static char s[MAX];
printf("COMMAND:");
scanf("%s", s);
return s;
}
979 :
デフォルトの名無しさん :04/12/11 22:34:49
バカって言われて悔しかったんだろ もうほっとけ
K&Rでvoid mainに関する記述があるのはどのあたり?
983 :
デフォルトの名無しさん :04/12/11 22:38:03
>>979 環境依存?覚えた言葉をすぐ使っちゃダメってママに言われたろ?
*char input() で駄目?
>>980 揚げ足を取っているわけではなくて、まれではないと思うよ。
986 :
デフォルトの名無しさん :04/12/11 22:38:58
>>983 ・・・しょぼい煽りだな。
狭い世界で生きててくださいねw
987 :
デフォルトの名無しさん :04/12/11 22:40:13
>>985 希ではないから良いコードだというわけではないだろう。
/■\ (´Д`iill) (⊃ ⊂) (⌒(⌒_.ノ
で、K&Rにvoid mainに関する記述はないの?
ごめん、誤爆。
991 :
デフォルトの名無しさん :04/12/11 22:41:46
>>987 良いか悪いかじゃない。規格に定まっているかのような嘘をつくな
>>949 はこれほど好意的に受け止めてもらったのに
>>954 の
int main(VOID, argv)
int VOID;
char **argv;
{ ... }
は相手にしてもらえませんでした。
ちょっと悲しいです。
でも、
>>946 さんなどには満足していただけたかと思います。
次はPart96だな
>>987 例えば、組み込み。
ヘッダは自分で書くことが非常に多い。
996 :
デフォルトの名無しさん :04/12/11 22:44:54
997 :
デフォルトの名無しさん :04/12/11 22:45:41
(・∀・)イイ!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。