952 :
935:2006/12/13(水) 01:40:29
>>937-938 レスありがとうございます。
>>941 >>943 レスありがとうございます。
メモリの動的確保って言ってもデータを入れるためのメモリとアドレスを
入れるためのメモリの違いってことだったのですか。
詳しい解説ありがとうございました。
>>948 staticなオブジェクトが0初期化されるのは立派にC言語の仕様であり
保障されているから心配無用。
どーしてもautoにしたいんなら
char *ppArea[MAX_LINE] = { 0 } ;
でよい。
NULL == 0 ではないが、0はNULLという仕様
callocなら領域確保と同時にゼロクリアされる。
JIS のページ探すの面倒くさい。
でも多数決で 0x00 は環境依存じゃないということで...
第一 static で取れば下品なコードじゃなくなるな。
>>952 ちゅことで
>>938 でOK。だけど freeArea() の一行削除は忘れるな。
>>950 ポインタ変数を全て 0 で埋めてそれが NULL にならないと言うことは...NULL って何?
\0でNULLになるんじゃないの?
959 :
952:2006/12/13(水) 02:04:44
>>956 はい、分かりました。
色々とありがとうございました。
>>956 (void *)0はNULLだけど、NULLが全ビット0とは限らない。
961 :
デフォルトの名無しさん:2006/12/13(水) 02:08:12
↑へ?どんな処理系?
>>945 #include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
class symdata
{
public:
string name;
int cnt;
int len;
symdata() { cnt = 0; len = 0; }
symdata(const string& s, int n)
{ name = s; cnt = n; len = s.length(); }
};
bool cmp(symdata *a, symdata *b)
{
return (a->len > b->len);
}
>>962のつづき。
main()
{
string s;
map<string, symdata> table;
vector<symdata*> v;
while (cin >> s) {
if (table.find(s) == table.end()) {
table[s] = symdata(s, 1);
v.push_back(&table[s]);
} else {
++table[s].cnt;
}
}
sort(v.begin(), v.end(), cmp);
for (vector<symdata*>::iterator i = v.begin(); i != v.end(); ++i)
cout << (*i)->name << ":" << (*i)->cnt << endl;
}
3vs3で開始する
966 :
デフォルトの名無しさん:2006/12/13(水) 02:13:40
>>959 教えていて気持ちがいいね。
熱心だしすぐ理解してくれるし。
でも毎回名前の番号が変わるからちょっと認識しにくかった。
まぁどうでもいいけど。
>>956 0をポインタに変換したらNULLに変換されるし
(NULLの内部表現が0でない環境ではコンパイラが変換コードを生成する必要がある)
NULL==0は NULL==(void *)0 と解釈されて1を返すけど
memsetはvoid *sの引数を*(unsigned char *)s=0見たいな感じで埋められるから
そこをchar *の値として参照してもNULLじゃないかもしれない
Randomized quick sortまで実装したけどあってるかどうかの判別がつかない・・・ orz
純粋に規格的な話だと、staticオブジェクトの初期化は大丈夫。
memset()はNGかな。
まぁ、NULLのビット表現が0でない処理系なんて、intが16bitだったり
文字セットがEBCDICだったりするような処理系より全然レアっつか
俺は見たことないし、ぶっちゃけ気にする必要はないけどな。
んな処理系で動かしたら、多分他の部分で問題山積みだぞw
>>967 signed bit の話なら立ってれば補数なので 0 なら立たないよ。
いや、俺が君の話を理解できないだけなんだけど。
まぁ疑問なら試せば良いと思う。
>>971 >>967が言ってるのは全然そういう話ではない。
memset()は「ビット的に」ゼロにしてしまう。
だから、NULLが「ビット的に」ゼロで無い実装では、それを
「ポインタとして」解釈するとnull pointerではないということになる。
一方、ポインタへのゼロの代入は、たとえNULLが「ビット的に」ゼロでない
実装でも、いつでもnull pointerとして扱われる。
そうした実装の場合、staticなpointerオブジェクトに対しては、
null pointerをあらわすビット値が、おそらくCランタイムの
スタートアップコードによって書き込まれるはずだ。
規格に準拠するならば。
↑なるほど、言いたいことは理解した。
けど、不毛だよ。
>>956 で俺が書いた
> ポインタ変数を全て 0 で埋めてそれが NULL にならないと言うことは...NULL って何?
は『ビット的にゼロじゃないNULL』なんか無いだろって事。
君らは『ビット的に非ゼロなNULL』が存在しても良いって前提で話をしてるでしょ。
これは原理主義者と現実主義者の議論でしかないから....
俺はずっと memset() でポインタ初期化を続けるよ、まぁこれも memset() が個別代入より
早いっていう原理主義なんだけどね。
>>973 単に「規格的はどうか」という議論をしているのに「俺様脳内方針」を
ブチ挙げる君も、随分空気読めてない人だな。
勝手にすれば?としか。
ま、実際問題としてはそれでOKであることは否定しないだろ、誰も。
まぁまぁ。お二人とも。
宿題なんだから提出して採点者の前で動けばいいのだ。
じゃだめ?
今はそんな話ではない。黙ってろ。
じゃあ、俺はもう寝る
つうかstaticオブジェクトの初期化についても知らないわ
サイズ固定の配列をわざわざmalloc()で確保するわ
null pointerに関する規格上の定義も知らないわ
しまいには俺は何がなんでもmemset()で初期化するんだとか逆切れか
なんか面白いもん見せてもらったわw
↑お前バカ?
俺が書いたのは話が噛み合わない理由が
・俺は現実的な話をしてる
・俺以外は規格上の話をしてる
事を認めた上で不毛と書いただろ。
噛み合わない話を続けた非は認めるけどな。
なるほど、規格も知らないで
「現実的な話」かwwwww
981 :
979:2006/12/13(水) 03:01:41
983 :
982:2006/12/13(水) 03:48:18
命令実行回数とか数え間違えてるかもしれないからチェックがんばって orz なんかもう眠い
984 :
982:2006/12/13(水) 03:55:50
あとSelection sortは教科書見て書き直さないとバレると思うぞ
連投スマソ
>>985 どうせWikiに各種ソートのプログラム置かなきゃいけないからついでだと思って。
地味に面倒だったけどやり始めたら止まらなくなった。
あとグローバル変数の宣言がおかしいところを発見したけど修正は自分でやってくれ
というかなんでこれコンパイルエラーにならないんだろ・・・
>932
void shuffle(int *arr, int n)
{
int r, t;
arr[n-1] = n - 1;
if(n==1) return;
else {
shuffle(arr, n-1);
r = rand() % n;
t = arr[n-1];
arr[n-1] = arr[r];
arr[r] = t;
}
}
988 :
デフォルトの名無しさん:2006/12/13(水) 07:20:24
[1] 授業単元:Cプログラミング
[2] 問題文:
BCDコードに変換する関数を作成しなさい。
IN :ASCIIコード(NULLストップ)
OUT:BCDコード、桁数
[3] 環境
[3.1] OS: (Windows)
[3.2] bcc
[3.3] C言語
[4] 期限: 無期限
[5] その他の制限:
宜しくお願い致します。
>>988 BCDコードなんだから入力される文字列は0〜9で考えていいんだよな?
あと変換されたBCDコードはどうやって出力すりゃいいんだ?
@printfで出力?(画面に変換結果表示するだけ)
A戻り値をchar*にして返す?(受け取った方は不要になったらfreeする必要がある)
Bそれとも既に確保されてるメモリのポインタを受け取って
そっちに出力?(確保領域が溢れる場合が有る)
とりあえず簡単な@で書いとく。
#define B(c,n) (((c-0x30)>>n)&0x01)
void strtobcd(char* str)
{
printf("before:\n%s\n",str);
int i=0;
printf("after :\n");
while(str[i]){
if(str[i]<'0' || str[i]>'9'){printf("decode error\n");break;}
printf("%d%d%d%d ",B(str[i],3),B(str[i],2),B(str[i],1),B(str[i],0));
i++;
}
}
>>848 上2つのテキスト、内容まったく同じじゃね?
991 :
長岡:2006/12/13(水) 10:16:17
長岡係数を求めるプログラムを早急に作成してください。。
お願いします
>>991 >>1を読んでテンプレ守って書き直してね。
長岡係数って何?
その辺の説明も書こうね。
993 :
長岡:2006/12/13(水) 10:23:54
自分もよくその辺もわからないんでそれも説明していただくとありがたいです。図々しくてすみません。。。
ABのスレできいてるやつか
ここはBASICのスレじゃねえぞ
>>1を読んで理解できないのなら日本語を勉強してくださいとしか…
998 :
長岡:2006/12/13(水) 10:29:06
>>996 ググって出てくるくらいの情報はいいです
書けないんなら黙っていてください
999 :
992:2006/12/13(水) 10:29:13
>>993 長岡係数とやらを理解して説明できるようになったらまたおいで。
プログラムの部分しか請け負わないよ。
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。