C言語なら俺に聞け(入門篇) Part 31
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/06/27(金) 21:31:43教えて欲しいのではなく宿題を丸投げしたいならこちらへ。
C/C++の宿題を片付けます 110代目
http://pc11.2ch.net/test/read.cgi/tech/1213796455/
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 30
http://pc11.2ch.net/test/read.cgi/tech/1213367888/
過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
0002デフォルトの名無しさん
2008/06/27(金) 21:32:42Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/
Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/
Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/
Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/
Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/
0003デフォルトの名無しさん
2008/06/27(金) 21:33:39Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/
Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/
Part 19 ttp://pc11.2ch.net/test/read.cgi/tech/1190342593/
Part 20 ttp://pc11.2ch.net/test/read.cgi/tech/1192455273/
Part 21 ttp://pc11.2ch.net/test/read.cgi/tech/1194384258/
Part 22 ttp://pc11.2ch.net/test/read.cgi/tech/1196489491/
Part 23 ttp://pc11.2ch.net/test/read.cgi/tech/1198295362/
Part 24 ttp://pc11.2ch.net/test/read.cgi/tech/1201083176/
Part 25 ttp://pc11.2ch.net/test/read.cgi/tech/1203343907/
Part 26 ttp://pc11.2ch.net/test/read.cgi/tech/1206196600/
Part 27 ttp://pc11.2ch.net/test/read.cgi/tech/1209429897/
Part 28 ttp://pc11.2ch.net/test/read.cgi/tech/1211198816/
Part 29 ttp://pc11.2ch.net/test/read.cgi/tech/1212329099/
Part 30 ttp://pc11.2ch.net/test/read.cgi/tech/1213367888/
0004デフォルトの名無しさん
2008/06/27(金) 21:57:13どういうことですか?教えてくだあさい。
0005デフォルトの名無しさん
2008/06/27(金) 22:12:010006デフォルトの名無しさん
2008/06/27(金) 22:13:13はい
0007デフォルトの名無しさん
2008/06/27(金) 22:28:51厳密には
「ポインタの配列の先頭要素へのポインタ」
それはつまり
「ポインタへのポインタ」
0008デフォルトの名無しさん
2008/06/27(金) 22:29:14rand()%900+100 ってのは具体的に言うと rand()%(1000-100)+100
rand()%(a-b)+b でb〜a未満の数値が出る
0009デフォルトの名無しさん
2008/06/27(金) 22:38:510010デフォルトの名無しさん
2008/06/27(金) 22:38:51「『型が未定の要素』へのポインタの配列」を「void *の配列」として作るならそれで合ってる
「『型が未定の要素へのポインタ』の配列」を「char *かlong *か決まってないが、何かのポインタの配列」で作るならただのvoid *になる
0011デフォルトの名無しさん
2008/06/27(金) 22:41:57配列へのポインタをどうやって宣言するのか。
A
たいていは、そんなポインタを宣言したいのではない。
なにげなく配列へのポインターというときは、
たいてい配列の最初の要素へのポインターのことをいっているのである。
配列へのポインタではなく、配列の要素へのポインターを使うことを考えること。
型Tの配列は型Tへのポインタに成り下がる。これは都合がよい。
なぜなら結果としてできるポインターを使って添字つきで参照したり、
整数を加えることで配列の各要素にアクセスしたりできる。
これに対して、本当の配列へのポインタは、
添字つきで参照したり整数を加えると、配列全体を飛び越してしまう。
これではせいぜい配列の配列を扱うときにしか役立たない。
本当に配列そのものへのポインターが必要な場合は「int (*ap)[N];」のような表現を使う。
ここでNは配列のサイズを表す。配列の大きさがわからない場合、Nを省略することができる。
しかし 結果として得られる「大きさが未知の配列へのポインタ」は役に立たない。
0012デフォルトの名無しさん
2008/06/27(金) 22:57:020013デフォルトの名無しさん
2008/06/27(金) 23:00:060014デフォルトの名無しさん
2008/06/27(金) 23:00:20アドレスを比較してる。それ以上はちょっと見てみないと。
0015デフォルトの名無しさん
2008/06/27(金) 23:07:48たとえば
char str[4];
char *p1=&str[0], *p2=&str[3];
としたらp2-p1は3になる
だからif(p2-p1>0)なんて文も書くことができる
これを書き換えるとif(p2>p1)になる
0016デフォルトの名無しさん
2008/06/27(金) 23:25:5116bitの頃のCコンパイラなら兎も角、32bitコンパイラにおいては、
switch文のコンパイルでジャンプテーブルを作成して、実行時に
それをスキャンし、ジャンプするような最適化は為されることは
余りない。何故か?
0017デフォルトの名無しさん
2008/06/27(金) 23:38:45switch はえーー!
0018デフォルトの名無しさん
2008/06/27(金) 23:44:08ちょっとした分岐程度なら
ジャンプテーブルのメモリアクセスのコストの方が高くなるから?
0019デフォルトの名無しさん
2008/06/27(金) 23:47:40面白そう
0020デフォルトの名無しさん
2008/06/27(金) 23:58:40どんなコードが出てるか見てごらん
0021デフォルトの名無しさん
2008/06/28(土) 00:00:05/O2スイッチつけたら両方とも0msでオワタ。HAEEEEE(違
0022デフォルトの名無しさん
2008/06/28(土) 00:01:07switchはcaseに該当がなければdefaultへ
そこが無駄の差
0023デフォルトの名無しさん
2008/06/28(土) 00:02:13そのコードだとswitch文のほうは実は最適化が施されて何もしてないんじゃねーの?
ifのほうはご丁寧に20回まるまるやってるとか
0024デフォルトの名無しさん
2008/06/28(土) 00:02:35ifはわざわざご丁寧に、21以上でも最初から順に else if 以下も条件判定をする
0025デフォルトの名無しさん
2008/06/28(土) 00:03:17だからそれが必要の無い条件判定による処理時間の差に出ているんじゃん
0026デフォルトの名無しさん
2008/06/28(土) 00:03:35意味のない足し算でもさせるか。
VC++系なら cl /FAsc hoge.cpp で
0027デフォルトの名無しさん
2008/06/28(土) 00:14:20比較すること自体が無意味というオチでした。
論理式がint値の値比較であることがif文の最適化の際に判明したら、
比較に関してはswitchと同じようにレジスタに持っておいた値と
コード上の固定値の比較に置換するので処理速度差が無くなりました。
というだけね。
0028デフォルトの名無しさん
2008/06/28(土) 00:24:34で宣言したaに、関数で文字列を入力したらエラーになるのですがなぜでしょうか?
0029デフォルトの名無しさん
2008/06/28(土) 00:27:21それはchar型のポインターだから。
0030デフォルトの名無しさん
2008/06/28(土) 00:32:37トランプやUNOの様なカードゲームを作りたいと思うのですが、そういった物の作り方を順番に解説してくれている様なサイト、
もしくは本などを知らないでしょうか?
0031デフォルトの名無しさん
2008/06/28(土) 00:33:210032デフォルトの名無しさん
2008/06/28(土) 00:33:260033デフォルトの名無しさん
2008/06/28(土) 00:34:55そうしてないとは思うけど。
0034デフォルトの名無しさん
2008/06/28(土) 00:36:00他の言語でもいいならサイト巡れば載ってると思う
大体やってることは一緒だし挑戦してみたら?
0035デフォルトの名無しさん
2008/06/28(土) 00:37:34char型にしろint型にしろポインタ宣言しただけだとアドレスを格納する入れ物
ができただけで、中身は不定。
0036デフォルトの名無しさん
2008/06/28(土) 00:42:21ありがとうございます。
少し別の言語の物を探してみます。
0037デフォルトの名無しさん
2008/06/28(土) 00:46:24そのアドレスが入っている入れ物(変数)の中身を別のアドレスに移動しようとしたから、
おまえ、システム領域弄るんじゃないよ!
とACCESSVIOLATIONで怒られる。
>>33の言ってる*aは数値だから構わない。(参照ではなく代入)
0038デフォルトの名無しさん
2008/06/28(土) 01:11:16入力とは何?
a = "hoge";
とかなら大丈夫だろうけど
strcpy(a, "hoge");
はだめだよ。
>>32文字列は先頭文字のアドレスを表すから、char型ポインタに代入できるのかなと思ったんですが・・・ダメなんですかね?
文字列の方はconst charの「配列」です。
003938
2008/06/28(土) 01:12:27文字列の『型』はconst charの「配列」です。
0040デフォルトの名無しさん
2008/06/28(土) 01:33:340041デフォルトの名無しさん
2008/06/28(土) 01:36:03アドレス入れる器に文字入れればそりゃエラー起こられる罠
0042デフォルトの名無しさん
2008/06/28(土) 01:53:53そーじゃなくて
main()
{
0043デフォルトの名無しさん
2008/06/28(土) 01:54:54main()
{
char *a;
hoge(a);
hoge(char *a)
{
a="HOGE";
0044デフォルトの名無しさん
2008/06/28(土) 02:02:290045デフォルトの名無しさん
2008/06/28(土) 02:05:47if (j <= 20 && 1 <= j)
{
if (j == 1)
...
if (j == 20)
}
else
{
}
としたところifの方が速くなりました。
んで、if (1 <= j && j <= 20)にしたら比較のコストが大きくなって
ifの方がやや遅くなりました。
0046デフォルトの名無しさん
2008/06/28(土) 02:33:17範囲を指定しないなら、やっぱり switch はえー
0047デフォルトの名無しさん
2008/06/28(土) 02:38:57なんか初めてハッシュを知った新入りのような喜びようだなw
ほほえましくてイイヨーイイヨー
0048デフォルトの名無しさん
2008/06/28(土) 02:55:37>>45
0049デフォルトの名無しさん
2008/06/28(土) 02:59:29ちがうちがう。
状況によってはifを使う方が速いこともあるよっていいたかっただけだ。
ついでに、条件文の書き方でも十分代わりうるということをいいたかった。
適した場面に適したコードを書くのは当たり前で、
switch(str)
{
case "hoge":
}
ってかけなくてswitchざまあなんて言い回しと同じように、
switchを使う方が良い場面においてif遅いなどというのはおろかなこと。
0050デフォルトの名無しさん
2008/06/28(土) 03:05:58>>47 が可愛いよ皮良いよ
0051デフォルトの名無しさん
2008/06/28(土) 03:09:39なぜny?ハッシュが何を指しているか理解してない、のか?
さすがにないと思いたいんだが。
しっかり勉強しろよ?
0052デフォルトの名無しさん
2008/06/28(土) 03:27:59なんか初めてハッシュを知ったny厨のような喜びようだなw
ほほえましくてイイヨーイイヨー
0053デフォルトの名無しさん
2008/06/28(土) 04:02:020054デフォルトの名無しさん
2008/06/28(土) 04:11:30ハッシュなんて持ち出すなら、なおさら指定範囲内の
数値に対する話は論外になるな。無関係な話ではあるが。
0055デフォルトの名無しさん
2008/06/28(土) 04:26:16茶化したつもりがハッシュなんて持ち出すから、さぁ大変。
ny厨乙。お前がそれを知って喜んでいたことの自己紹介ですか?
にしても、switch はえーなぁー、をいっw
0056デフォルトの名無しさん
2008/06/28(土) 04:51:020057デフォルトの名無しさん
2008/06/28(土) 07:38:10if (a == b) {
// 処理
}
を
switch (a == b) {
case 1:
// 処理
}
と書くようにします!
0058デフォルトの名無しさん
2008/06/28(土) 08:19:48最適化かけまくりだと0msなんで加算処理を加えてみた。
s w i t c h 蠅ー
0059デフォルトの名無しさん
2008/06/28(土) 10:32:34このプログラムにおいて、最初のほうで
BSTREE_NODE *deleteMinNode(BSTREE_NODE *p, BSTREE_K_TYPE *min);
BSTREE_NODE *deleteRootNode(BSTREE_NODE *p, BSTREE_K_TYPE x);
と書かなければいけない理由ってなんなんでしょうか?
消すとエラーが出るのに、*pや*minなどの値は変更してもエラーがでないのも意味がわかりません・・
0060デフォルトの名無しさん
2008/06/28(土) 10:35:180061デフォルトの名無しさん
2008/06/28(土) 10:38:36プロトタイプ宣言かな?
コンピューターは先頭から後ろにかけて順次処理してくのは
得意ですが、人間のようにソースを見渡して関数の宣言場所
と利用箇所を眺めてちゃんと定義されてるという確認ができない
ある意味融通が利かない人なのです。
なので関数を使ってる箇所よりその関数が後ろに定義されてる場合
はソースの先頭付近に関数の頭の部分を定義してコンパイラに
こんな関数があるよと先に結論を教えてあげます。
プロトタイプ宣言がいやなら関数を使ってるところより
先に関数を配置すればOKです
0062デフォルトの名無しさん
2008/06/28(土) 10:42:07windowsPC持ってるならVC++かVC#でいいんじゃないの?
Cygwinとかって環境構築ではまりそうだしね
>>61の続き
プロトタイプ宣言をしたくない?ようなソースはmain関数が
ソースの一番最後にあって、main関数より呼ばれるその他
関数が上置くようになってます。
006359
2008/06/28(土) 10:57:36>>62
なるほど、ありがとうございます。
この宣言において、*minなどを違う文字に変更してもエラーが出ないのはどうしてなんでしょうか?
例えば
BSTREE_NODE *deleteMinNode(BSTREE_NODE *p, BSTREE_K_TYPE *min);
を
BSTREE_NODE *deleteMinNode(BSTREE_NODE *a, BSTREE_K_TYPE *mn);
などに変更してもエラーは出ずに実行されるのですが・・
0064デフォルトの名無しさん
2008/06/28(土) 11:04:44006559
2008/06/28(土) 11:08:56ありがとうございました
0066デフォルトの名無しさん
2008/06/28(土) 11:13:57ありがとうございます。vc++ダウンロードしてきます。
0067デフォルトの名無しさん
2008/06/28(土) 13:55:38・母親は受験勉強をする息子の学力向上のためにフェラチオをする
・日本人女性の55%は、出会ったその日に男と寝る
・ファストフードは女子高生たちを性的狂乱状態におとしいれる
・ティーンたちはバイアグラを使ってウサギのようにセックスをする
・女子高生は、刺激のためにノーブラ・ノーパンになる
・日本の最新の流行 : 70歳の売春婦
・老人の売春婦の人気にもかかわらず、日本では小学生の売春婦にも仕事がある
・日本の若い看護婦は売春婦に勝る
・24時間オルガズムが止まらない病気で苦しむ日本人女性の数が増えている
・15未満の子供を対象とした疑似ポルノが日本に蔓延している
・OLの72%が、セックスをより堪能するために何らかのトレーニングを受けている
・人妻は気分転換の目的で昔の恋人に抱かれに行く
・主婦は郊外のコイン・シャワーで売春をしている
・日本男子は柔道や空手の部活で男相手に童貞を捨てている
・ほとんどすべての漁師は海でマンタとSEXしている
・まだ10代の少年から退職した老人までみんな2980円の手コキを利用している
・六本木のあるレストランでは、食事の前にその材料となる動物と獣姦する
※同社が全年齢向けコーナーで七年以上にわたり世界に向けて配信していたものの一部です
※同社の行為は日本人への偏見や人種差別、婦女暴行、幼児虐待を助長するものです
◆毎日新聞の英語版サイトがひどすぎる まとめ@wiki
http://www9.atwiki.jp/mainichiwaiwai/
◆毎日新聞問題の情報集積wiki
http://www8.atwiki.jp/mainichi-matome/
つまり日本国民は
http://www.vipper.net/vip552788.jpg
0068デフォルトの名無しさん
2008/06/28(土) 16:47:57改行が行を改めて、復帰が先頭に戻る、という認識で合ってますか?
もしそうなら、
Unixでは、改行LF
Windowsでは、改行LF+復帰CRが必要
という違いは、
Unixでは改行LFだけで、改行+復帰の機能を果たすってことなんでしょうか?
0069デフォルトの名無しさん
2008/06/28(土) 17:14:36int x;
int y;
}XY;
XY a,b,c;
c = a+b; //エラー
こんな風に同じ型の構造体を演算したいのですが、関数を使うしか方法はありませんか?
0070デフォルトの名無しさん
2008/06/28(土) 17:18:10C言語の範囲だと関数を使うしかありません
C99 であれば complex 型のみできるようです
C++なら演算子のオーバーロードでできますがスレ違いです
0072デフォルトの名無しさん
2008/06/28(土) 18:19:00タイプライターが使われていたころは
改行: 次の行に移動(入力位置を横に移動せず下に1マス移動するだけ)
復帰: 行の頭に移動
のように両者は個別の機能を持っていたらしい
Windowsの改行がCR+LFなのはこれに基づいていると思われる
じゃあUnixのLFで改行できちゃうのはなぜってことになるんだが
一番大きい理由は改行に2バイトも費やすのが勿体無いからだろう
まあスレ違い
0073デフォルトの名無しさん
2008/06/28(土) 18:27:12プリンタの制御コードがまさにそれだな
0x0d CR キャリッジリターン
0x0a LF ラインフィード
0074デフォルトの名無しさん
2008/06/28(土) 19:12:28void SkipSpace(FILE *fp)
{
char str[4000] = { NULL };
int c, i = 0;
while((c = fgetc(fp)) != EOF){
if(!isspace(c) || c == '\n'){
str[i++] = c;
}
}
str[i] = EOF;
rewind(fp);
fprintf(fp, str);
}
結果がこれです
abcd efg hijk lmn
opqr stu vwxy z
↓
abcdefghijklmn
opqrstuvwxyzvwxy z
z以下を消したいのですが、どうすれば良いでしょうか
0075デフォルトの名無しさん
2008/06/28(土) 19:17:170077デフォルトの名無しさん
2008/06/28(土) 19:25:550078デフォルトの名無しさん
2008/06/28(土) 19:27:20文字列の最後には\0が必要
>>76
入力ファイルの中に%dって書いてみればわかる
0079デフォルトの名無しさん
2008/06/28(土) 19:27:580080デフォルトの名無しさん
2008/06/28(土) 19:30:10str[i] = NULL; も試したのですが、変わりませんでした。
ファイルの最後はEOFだったかと思い、入れてみたのですがこちらもだめでした。
>>78
なるほど
0082デフォルトの名無しさん
2008/06/28(土) 19:31:30ファイルを開いてしまったあとで長さを短くするためには
truncateを使わなければね。
するとfopen+fprintfという関数でははく、open+write+truncateというシステムコールを
使った方がうまいことがわかる。
ただし上手に使わないと遅くなる。
008382
2008/06/28(土) 19:34:34一度ファイルを閉じて fopen(... , "w") で長さ0のファイルを作り直しても良い。
inodeが変わる可能性があるから、それが気にならないならこちらの方がスマート。
0084デフォルトの名無しさん
2008/06/28(土) 19:35:28翻訳者が悪い。
日本では、new line と line feed を同じ意味だと思われてるし。
0085デフォルトの名無しさん
2008/06/28(土) 19:36:560087デフォルトの名無しさん
2008/06/28(土) 19:44:14fwにiの値を10進で書き込む
0088デフォルトの名無しさん
2008/06/28(土) 22:25:09#include <stdio.h>
int main(int argc, char *argv[]){
FILE *from, *to;
char *key;
char ch;
if(argc != 4){
puts("arg err");
return -1;
}
if((from = fopen(argv[1], "rb")) == NULL){
printf("%s ", argv[1]);
puts("open err");
return -1;
}
if((to = fopen(argv[2], "wb")) == NULL){
printf("%s ", argv[2]);
puts("open err");
return -1;
}
key = (char *) argv[3];
0089デフォルトの名無しさん
2008/06/28(土) 22:25:40if(fread(&ch, sizeof(char), 1, from) != 1 && ferror(from)){
printf("%s ", argv[1]);
puts("read err");
return -1;
}
ch = ch ^ *key++;
if(!*key) key = (char *) argv[3];
if(!feof(from)){
if(fwrite(&ch, sizeof(char), 1, to) != 1){
printf("%s ", argv[2]);
puts("write err");
return -1;
}
}
}
0090デフォルトの名無しさん
2008/06/28(土) 22:26:02printf("%s ", argv[1]);
puts("close err");
return -1;
}
if(fclose(to) < 0){
printf("%s ", argv[2]);
puts("close err");
return -1;
}
puts("successful");
return 0;
}
0091デフォルトの名無しさん
2008/06/28(土) 22:29:280092デフォルトの名無しさん
2008/06/28(土) 22:33:290093デフォルトの名無しさん
2008/06/28(土) 22:34:560094デフォルトの名無しさん
2008/06/28(土) 22:36:250095デフォルトの名無しさん
2008/06/28(土) 22:39:220096デフォルトの名無しさん
2008/06/28(土) 22:44:17argv[3]で境界バグが出るんじゃないかそれ
0097デフォルトの名無しさん
2008/06/28(土) 22:48:550098デフォルトの名無しさん
2008/06/28(土) 22:58:470099デフォルトの名無しさん
2008/06/28(土) 22:59:320100デフォルトの名無しさん
2008/06/28(土) 23:43:11struct tstate *list[20];
struct tstate data1[10];
struct tstate data2[10];と用意して
data1[i].stateに0から9までをいれて,data2[i].stateに同じく0から9をいれて
struct tstate{
struct gstate *next1;
struct gstate *next2;};
として
data2[2].next1=&data1[3];
という風に木をつなぎ
k=0;
for(i=0;i<10;i++){list[i]=&data1[k];k++}
k=0;
for(i=10;i<20;i++){list[i]=&data2[k];k++}
とするとdata2[2].next1=&data1[3];はちゃんとつながるんですか?
0101デフォルトの名無しさん
2008/06/28(土) 23:46:4110個の状態を2列用意して,
data2の3つ目とdata1の4つ目をつなぎたいって感じなんですけど
0102デフォルトの名無しさん
2008/06/28(土) 23:49:13stateというメンバについては書かれていないね
0103デフォルトの名無しさん
2008/06/28(土) 23:49:130104デフォルトの名無しさん
2008/06/28(土) 23:53:26> key = (char *) argv[3];
> ch = ch ^ *key++;
空文字列だと終端を飛び越えるね
0105デフォルトの名無しさん
2008/06/28(土) 23:53:41int state;
};でお願いします。
まあ入門編できくべきではないかもしれませんけど
0106デフォルトの名無しさん
2008/06/28(土) 23:55:47> まあ入門編できくべきではないかもしれませんけど
そうだね
0107デフォルトの名無しさん
2008/06/29(日) 00:00:500108デフォルトの名無しさん
2008/06/29(日) 00:08:270109デフォルトの名無しさん
2008/06/29(日) 00:14:31自分が頭悪いのを棚にあげてこの台詞w
0110デフォルトの名無しさん
2008/06/29(日) 00:28:59復帰改行という言葉もあるデスヨ。
ちなみにOSによってはLFCRLFなんてのもあったり。
コンピュータの時代になって、改行をすれば復帰するのが当たり前となり、
じゃあ分けなくてもいいじゃんって言う流れがあったようです。
0111デフォルトの名無しさん
2008/06/29(日) 01:56:29やっぱアセンブラまで掘らないと本質って見えてこない
しかし今度はアセンブラの命令の中身を知るために回路をいじりたくなってきた
組み込みって楽しそうだな
0112デフォルトの名無しさん
2008/06/29(日) 01:57:52分からないのが悔しいの?
0113デフォルトの名無しさん
2008/06/29(日) 02:31:08アセンブラで扱うデータはアドレスと即値データのみ
変数名をオペランドに記述でしたとしても、機械語ではアドレスになる
0114デフォルトの名無しさん
2008/06/29(日) 03:22:15プログラムA Bというのを自前で用意します。
それぞれ別のタスクとして起動します。
Aがmallocで確保したエリアをBに渡すことがあるのですが
この渡されたエリアをBの中でfreeして問題ないでしょうか?
それとも一旦Aに戻してAの内部でfree?
0115デフォルトの名無しさん
2008/06/29(日) 03:22:36>>100
ちょっと内容つかめてないが
ループでは list に値をセットしてるだけだから
data2[i].next1 には何もおこらない。
>data2[2].next1=&data1[3];
>という風に木をつなぎ
あらかじめつないであるのなら、つながってるのでしょう。
でも、data2のnext1にdata1をつなぐのなら
next1は tstate へのポインタであるべきでしょう。
「気持ち」を察するに、用件を満たすデータ構造は次のようなものでは?
struct tstate {
struct tstate *next1;
struct tstate *next2;
int state;
} tstate;
どうか?
0116デフォルトの名無しさん
2008/06/29(日) 03:42:47mallocで確保したメモリーが共有できない。
プログラムの論理アドレスと物理アドレスのマップはプロセスごとに異なるので
アドレスを渡したとしても、同じメモリーにアクセスするという保証はない。
共有メモリーがGlobalAlloc(WIndows)を使う。
0117デフォルトの名無しさん
2008/06/29(日) 03:42:58どうやって渡のかkwsk
なんにせよAでfreeすべきだろう・・・ AのヒープはAのモノだ
0118デフォルトの名無しさん
2008/06/29(日) 03:47:08WindowsのGlobalAllocが使えるかどうかはよくわからない
基本は共有メモリー
0119デフォルトの名無しさん
2008/06/29(日) 04:00:490120デフォルトの名無しさん
2008/06/29(日) 04:04:09UNIX 共有メモリー shmxx関数
Windows メモリマップドファイル CreateFileMapping関数
これらの共有オブジェクトは、内部で使用を宣言したプロセスの数を管理しており
すべてのプロセスがデタッチしたときにシステムから消去される仕組みになっている
0121デフォルトの名無しさん
2008/06/29(日) 04:05:450122デフォルトの名無しさん
2008/06/29(日) 04:09:48スレッドのことと混同してるのかもしれないが、
>プログラムA Bというのを自前で用意します。
と書いてしまってるからな〜
とりあえずプロセス間通信で方法は共有メモリも含めていくつかある。
0123デフォルトの名無しさん
2008/06/29(日) 04:15:12お前基準のバカは当てにならないということだ。
0124デフォルトの名無しさん
2008/06/29(日) 04:16:190125114
2008/06/29(日) 04:28:31近い形の環境なので若干違うんですかね^^;
0126デフォルトの名無しさん
2008/06/29(日) 04:31:400127デフォルトの名無しさん
2008/06/29(日) 04:35:48組み込みといってもいろいろ
まったくOSにないものから、「ちゃんとした」OSがあるものまで
0128デフォルトの名無しさん
2008/06/29(日) 04:43:34入れて処理して出して結果を出力、その基本部分は変わりは無い。
あとはOSや環境によって、使われているインターフェースや
表現力などに差はあるがな。インターフェースの便利さにも。
原始的なコマンドライン入力でもやれることは十分ある。
0129114
2008/06/29(日) 05:32:18PSPの非公式開発でCygwin * toolchainなんですけどね・・・
windowsのDLLのようなライブラリを起動する際にヒープサイズの制御ができないというのが1つ。
あとはライブラリの中身を公開すれば最大ヒープサイズをコントロールできるんですができれば
非公開で行きたいというのが1つ。
そこで苦肉の策として関数で各ライブラリ間のデータの受け渡しが可能というのを利用して
最初に作ったライブラリ郡はヒープサイズをほとんど取らないように変更。
ヒープを総合管理するライブラリを別途設けてこいつの中でmallocだけしてアドレスを戻す関数(たとえばmymalloc)
を用意して他のライブラリから従来のmallocの代わりにmymalloを呼ぶ。
現状としてはmallocはできてるようでとりあえず動いてるようなんですが、freeのほうがうまく行かず
大きなプログラムでデータの読み込み破棄を繰り返すとメモリーリークを起してるようでいずれフリーズ
という感じなんです・・・
0130デフォルトの名無しさん
2008/06/29(日) 07:52:55モバイル機器にありがちだね。Windows3xとかもそうだった。
その環境特有のノウハウがあるはずでC言語うんぬんの話じゃない。
一般論から言えば、allocしたランタイムでfreeするのが原則だがPSPはわからん。
0131デフォルトの名無しさん
2008/06/29(日) 07:57:36mallocしたプロセスがfreeしないととんでもないことが起こる。
ということが回答なのかな?よくわからないけど・・・
0132114
2008/06/29(日) 08:18:16そこで開放するように処理を変更してもフリーズは起こるという
なんとも・・・
0133デフォルトの名無しさん
2008/06/29(日) 08:25:38C言語一般の話でもないし入門でもないぞ
PSP自作ソフト開発スレ ver.8
http://game14.2ch.net/test/read.cgi/gameurawaza/1212946327/
0134デフォルトの名無しさん
2008/06/29(日) 08:27:29そこの住人です^^;
最近はあんまり活発な書き込み無いので・・・
まあ環境依存ぽいのでこれまでにします。
レスくれたかたありがとうございます。
0135デフォルトの名無しさん
2008/06/29(日) 09:48:27ライブラリ内でmallocした領域は、ライブラリ内でfreeしないとだめだゾ
0136デフォルトの名無しさん
2008/06/29(日) 10:26:110137デフォルトの名無しさん
2008/06/29(日) 10:28:500クリアとアラインメント
0138デフォルトの名無しさん
2008/06/29(日) 10:56:02ロジックよりもプログラム特有の言い回しがなかなか理解できません。
関数を宣言する
関数を定義する
変数を宣言する
変数を定義する
宣言と定義の意味の違いって何なんですか?
関数の場合は、宣言→戻り値と引数を定める。定義→中身の処理まで記述。ってことでしょうか?
だとしたら変数の定義って何だろう
0139デフォルトの名無しさん
2008/06/29(日) 10:59:460140デフォルトの名無しさん
2008/06/29(日) 11:25:10ちがう
それはパックだっけ?
アライメントっていうのは処理系(CPUなんか)が扱いやすいバイト単位にアドレスを確保すること。
0141デフォルトの名無しさん
2008/06/29(日) 11:27:148bitCPUだと1バイト単位で問題ない。
16bitCPU(8086)だと1バイト単位でもアクセスできるけど2バイト単位でないと速度が落ちる。
32bitCPUだと4バイト単位・・・
0142デフォルトの名無しさん
2008/06/29(日) 11:31:09誰かわかりやすく教えてください。
0143デフォルトの名無しさん
2008/06/29(日) 11:52:22うっわー、何その井の中の蛙発言。
世の中にはバイト単位アクセスできない16ビットCPUも沢山あれば、
1バイト単位アクセスでも速度が落ちない16ビットCPUもあるぞ。
で、誰かまともにmalloc()とcalloc()の違いの説明してくれない?
0144デフォルトの名無しさん
2008/06/29(日) 11:53:06あんなところで勉強してたような人に、どう説明すればいいのやら。
取り敢えず、何が判らないのか書いて味噌。
0145デフォルトの名無しさん
2008/06/29(日) 11:56:44メモリの領域確保をして名前と結びつけるのが定義
領域確保はせず、ただ名前を使うよと宣言するだけなのが宣言
厳密にはこのように宣言と定義をきっちり分ける
しかし両者をひっくるめて宣言と呼ぶこともきわめて一般的
例えば int a; とすれば、int を入れられるだけの領域を
変数としてメモリ上に確保するので定義
しかし extern int a; なら、どこか他で領域確保は済んでいる
ただ a を使うよと宣言するだけなので宣言
よくわかんなかったら無理せず先に進むこと
0146デフォルトの名無しさん
2008/06/29(日) 11:58:17ゼロクリアするか否かと、引数が違う
0147デフォルトの名無しさん
2008/06/29(日) 12:00:200148デフォルトの名無しさん
2008/06/29(日) 12:03:18あくまで処理系に最適な・・・は保証されるかもしれないけど
せいぜい4バイトとか8バイトじゃないかな?
デバイスによっては16バイトアライメントが必要な場合も
あったりするのでその場合は自前で調整しないとだめだし。
0149デフォルトの名無しさん
2008/06/29(日) 12:03:34じゃあどこで勉強すればいいですか。
0150デフォルトの名無しさん
2008/06/29(日) 12:11:370151デフォルトの名無しさん
2008/06/29(日) 12:15:100152デフォルトの名無しさん
2008/06/29(日) 12:15:48つい一昔前までは、mallocはバイトアライメントだったので、CPUによっては
>>141がいう「速度が落ちる」などではすまず、bus errorなどを引き起こしていた。
ごく最近になってから、mallocも任意のオブジェクトでクラッシュだけはしないように
なった。
0153デフォルトの名無しさん
2008/06/29(日) 13:21:49ありがとうございます!
ちゃんとした違いがあったんですね。よく分かりました。
0154デフォルトの名無しさん
2008/06/29(日) 13:40:45素数間にタブを入れ、3個区切りで表示せよ。*一次配列を使うこと。
という問題なのですが、分からないので質問しました。
ちにみに素数間にタブを入れというのは、
2 3 5
7 11 13
こんな感じに表示されるらしいです。
0155デフォルトの名無しさん
2008/06/29(日) 13:43:57>>1
0156デフォルトの名無しさん
2008/06/29(日) 13:51:53とにかくわからないので教えてください、って
全然苦しんで学ぶ感じじゃないのはなぜだ
間違った勉強法に苦しむっていうことだろうか
0157デフォルトの名無しさん
2008/06/29(日) 13:56:100158デフォルトの名無しさん
2008/06/29(日) 13:56:22マルチになったようだけど、答えてもよろしいでしょうか?
0159デフォルトの名無しさん
2008/06/29(日) 13:56:440160デフォルトの名無しさん
2008/06/29(日) 14:00:04エラトステネスの篩はぐぐれば必ず出てくる、
篩の問題を解く前にまず次の問題を解いてみそ
「0から1000までの数を順次表示する。
それまで表示した個数が3の倍数の時は後ろに改行記号を
3の倍数でない時は、後ろにタブを付けて表示しろ
(それまでの表示した個数を表す変数を宣言して使用して
良い)
すべての数の表示が終わってから改行記号を出力しろ。」
0161デフォルトの名無しさん
2008/06/29(日) 14:01:44解決するまで粘るということは教わりません
そして最後まで自力で解決することを覚えません
0162デフォルトの名無しさん
2008/06/29(日) 14:07:07質問に答えるスレで調べろってレスする人が理解できない
0163デフォルトの名無しさん
2008/06/29(日) 14:08:460164デフォルトの名無しさん
2008/06/29(日) 14:15:100165デフォルトの名無しさん
2008/06/29(日) 14:27:33に陥いつつ実は単にコンピュータにやらせている
だけの人から答えを聞くことを最初に覚えます。
0166デフォルトの名無しさん
2008/06/29(日) 14:33:05放置の方がいい。
質問に対して調べろ、と言うのは
お前はアホだから帰れと言っているのと同じで
大変失礼な行為。
0167デフォルトの名無しさん
2008/06/29(日) 14:36:320168デフォルトの名無しさん
2008/06/29(日) 14:51:37お前はアホだから帰れ
0169デフォルトの名無しさん
2008/06/29(日) 14:52:430170デフォルトの名無しさん
2008/06/29(日) 14:53:350171デフォルトの名無しさん
2008/06/29(日) 14:55:380172デフォルトの名無しさん
2008/06/29(日) 15:19:56分からないので教えてくださいというのは基本的にその限界を超えている
0173デフォルトの名無しさん
2008/06/29(日) 15:24:440174デフォルトの名無しさん
2008/06/29(日) 15:29:050175デフォルトの名無しさん
2008/06/29(日) 15:40:400176デフォルトの名無しさん
2008/06/29(日) 15:42:52無感な奴が多い件について
0177デフォルトの名無しさん
2008/06/29(日) 15:47:120178デフォルトの名無しさん
2008/06/29(日) 15:48:59似たもの同士助け合えよ
0179デフォルトの名無しさん
2008/06/29(日) 15:50:120180デフォルトの名無しさん
2008/06/29(日) 15:50:180181デフォルトの名無しさん
2008/06/29(日) 15:51:06「C言語がわかりません。教えてください。」みたいな、質問になってないのは返答しようがない。
質問者に言いたいことは、以下の3点。
・何をしたいのか、まず「目的」を明確にしろ。(開発環境、実行環境を含む)
・考えていることと、試行結果を簡潔に書け。(試行しない人はプログラマに向いてない)
・要約する自信がないならソースを貼れ。恥ずかしいなどと考えるな。
0182デフォルトの名無しさん
2008/06/29(日) 16:01:37エラーメッセージも張れ。
も追加しといて。
0183デフォルトの名無しさん
2008/06/29(日) 16:11:39Cで配列の大きさを決めないまま宣言することは可能ですか?
0184デフォルトの名無しさん
2008/06/29(日) 16:12:50おまえらウゼーンだよ。すれ違いのこと議論続けるならどっかいけ。
テンプレ読めとか過去スレ嫁とかどうでもいいんだよ。
どうせ馬鹿な奴は何も読まずに日本語になっていない質問をしてくる。
そんな奴には「ググレカス」と言って追い返せば、質問の仕方を考えるようになるよ。
0185デフォルトの名無しさん
2008/06/29(日) 16:13:040186デフォルトの名無しさん
2008/06/29(日) 16:13:16自分でもやってみる方針ですが、出来ないところがあります。→入門編スレ
酷い教師が、無理難題を言ってきます。助けて下さい。→宿題スレ
という分類でおk?
0187デフォルトの名無しさん
2008/06/29(日) 16:21:37純粋に配列として宣言することはできないのでしょうか?
0188デフォルトの名無しさん
2008/06/29(日) 16:22:19自助努力をしないやつに教える必要はないよ。
0189デフォルトの名無しさん
2008/06/29(日) 16:23:03Cではできない。C++なら(構文は違うが)できなくはない。
0190デフォルトの名無しさん
2008/06/29(日) 16:23:12できません
0191デフォルトの名無しさん
2008/06/29(日) 16:30:41Javaでも、考えようによっては
int[] i;
で宣言されるのは純粋な配列ではなくて、Cでいう int *i;
みたいなものだよ。
何となれば、i = new int[100];
とかしないとぬるぽになるだろう。
これはCで i = calloc(100, sizeof *i);
としなければならないことと同じ。
0192デフォルトの名無しさん
2008/06/29(日) 16:31:15>>190
ありがごうございます。
配列のサイズ決めるのが難しそうですね。
Javaの生ぬるい仕様しか分からないへっぽこPGにはCは色々と難しい…。
0193デフォルトの名無しさん
2008/06/29(日) 16:34:53ありがとうございます。
実はまだポインタがよく分かってないので勉強してからもう一度レスを参考にさせてもらいます。
0194デフォルトの名無しさん
2008/06/29(日) 16:37:510195デフォルトの名無しさん
2008/06/29(日) 16:39:09exit
0196デフォルトの名無しさん
2008/06/29(日) 16:39:380197デフォルトの名無しさん
2008/06/29(日) 16:44:30数少ない文書を元に研究と試行錯誤の繰り返し
基本的にはすべて自己解決
最近のゆとりはネットに溢れる情報があるのにくだらない質問をしやがる
たまには何日もかけて自分で研究して解決してみろよ
0198デフォルトの名無しさん
2008/06/29(日) 16:51:450199デフォルトの名無しさん
2008/06/29(日) 16:54:250200デフォルトの名無しさん
2008/06/29(日) 16:55:54感謝を忘れてはならないと思う
0201デフォルトの名無しさん
2008/06/29(日) 16:57:24頭に入れたほうがいい時代になってるね。
0202デフォルトの名無しさん
2008/06/29(日) 17:03:480203デフォルトの名無しさん
2008/06/29(日) 17:04:13これでだいぶすっきりするはずだよ
0204デフォルトの名無しさん
2008/06/29(日) 17:19:15こういう偉そうなことを言うヤツの本音は
「自分が苦労したから他人も同じだけ苦労するべき。
そうでなきゃ自分が可哀想」
これに尽きるんだよ。アホらしい。
自分で背負い込んだ苦労なら自分の中で消費しろ。
0205デフォルトの名無しさん
2008/06/29(日) 17:21:11プログラムだって楽したら成長しないんだよ
長い目で見て、教えないのはむしろ善意
0206デフォルトの名無しさん
2008/06/29(日) 17:21:27宿題スレがあるんだからそれで我慢しる
0207デフォルトの名無しさん
2008/06/29(日) 17:25:16する。そうなったらケースバイケース、ダイアログで対応していく
のが基本。
0208デフォルトの名無しさん
2008/06/29(日) 17:29:580209デフォルトの名無しさん
2008/06/29(日) 17:36:04しかし検索すらしない人がどうやってスレに辿り着くんだろうな
0210デフォルトの名無しさん
2008/06/29(日) 17:40:29だれも答えてくれず、「ぐぐれ」ともいってくれなかったら相当に難しい問題なのかもしれない。
0211デフォルトの名無しさん
2008/06/29(日) 17:44:12くだらないと思うけどなw
0212デフォルトの名無しさん
2008/06/29(日) 17:59:16その一言が言えなくて
0213デフォルトの名無しさん
2008/06/29(日) 18:05:30まあ悩んで判らなければとりあえず聞いてみてもいいと思うよ
この流れで本当に悩んでる人が質問するのを躊躇してたら可哀想だ
0214デフォルトの名無しさん
2008/06/29(日) 18:29:13C言語がわかりません。
0215デフォルトの名無しさん
2008/06/29(日) 18:31:230216デフォルトの名無しさん
2008/06/29(日) 18:48:550217デフォルトの名無しさん
2008/06/29(日) 18:49:15ありがとうございました
0218デフォルトの名無しさん
2008/06/29(日) 18:57:420219デフォルトの名無しさん
2008/06/29(日) 19:03:07無理があるだろ
0220デフォルトの名無しさん
2008/06/29(日) 19:05:580221デフォルトの名無しさん
2008/06/29(日) 19:07:450222デフォルトの名無しさん
2008/06/29(日) 19:25:410223デフォルトの名無しさん
2008/06/29(日) 19:29:140224デフォルトの名無しさん
2008/06/29(日) 19:30:43そんなことをすると、55%の...
0225デフォルトの名無しさん
2008/06/29(日) 19:34:27おまいさんはこのスレに常駐しているのか
ご苦労さんなこった
0226デフォルトの名無しさん
2008/06/29(日) 19:34:33>>142
> 数日前から苦CってとこでC言語勉強してるけど文字列を扱う方法あたりからわからなくなってきた。
> 誰かわかりやすく教えてください。
>>144
> >>142
> あんなところで勉強してたような人に、どう説明すればいいのやら。
> 取り敢えず、何が判らないのか書いて味噌。
>>149
> >>144
> じゃあどこで勉強すればいいですか。
でもこれは無理だと思うよw
0227デフォルトの名無しさん
2008/06/29(日) 19:38:13可愛い部下に対しては相手の将来を考えて付きっきりで教えてやる気にもなるけど
赤の他人に対しては所詮自分の自己満足でしかないなぁ
0228デフォルトの名無しさん
2008/06/29(日) 19:43:24あんたのような上司がいたら俺のような馬鹿でも苦労してないんだわ
まぁCを独学で少しかじった程度でこの業界に入ったのが人生最大の失敗だった
なぜかこのスレの流れ見ながらリアルで涙目
0229デフォルトの名無しさん
2008/06/29(日) 19:58:430230デフォルトの名無しさん
2008/06/29(日) 19:58:58キミはバカなんじゃないと思うよ。向いてないだけだ。
向いてない、というのはバカにしてるわけじゃない。
論理的思考が得意な人と、ひらめきや直感で物事を進めるのが得意な人がいる。
「こうなったのは何故だ?それはここがこうだから。じゃあここはいつ決まったんだ?」
みたいに、順番に進めていくのが好きな人がプログラマに向いてる。
0231デフォルトの名無しさん
2008/06/29(日) 20:09:050232デフォルトの名無しさん
2008/06/29(日) 20:09:080233デフォルトの名無しさん
2008/06/29(日) 20:10:580234デフォルトの名無しさん
2008/06/29(日) 20:30:000235デフォルトの名無しさん
2008/06/29(日) 20:31:01少しはお前が答えろよ神様
0236デフォルトの名無しさん
2008/06/29(日) 20:32:35特に異性が混じる職場ではタブーに近い。これが基本。
だからネットはそれなりに貴重
0237デフォルトの名無しさん
2008/06/29(日) 20:38:51・何度教えても変数の概念さえ掴めなかった
・何度指摘しても同じミスを繰り返した
・何度ダメだと言っても他人の丸写ししかしなかった
まぁ、向いてないんだろうね。
>>236
そんな基本聞いたことがない
0238デフォルトの名無しさん
2008/06/29(日) 20:41:120239デフォルトの名無しさん
2008/06/29(日) 20:41:20ガッ
0240デフォルトの名無しさん
2008/06/29(日) 20:42:43まぁ社員全員合わせても20人もいないんだけどね
0241デフォルトの名無しさん
2008/06/29(日) 20:49:33会社は男だけの方が色々と楽だわ
女なんて会社の外でたくさん作ればいい
0242デフォルトの名無しさん
2008/06/29(日) 20:53:150243デフォルトの名無しさん
2008/06/29(日) 20:55:32男女同権!
0244デフォルトの名無しさん
2008/06/29(日) 21:10:322次元でどうぞ
0245デフォルトの名無しさん
2008/06/29(日) 21:26:54質問と回答のやりとり見てると面白いから見てる
一人一人の考え方の違いが割と参考になる
0246デフォルトの名無しさん
2008/06/29(日) 23:00:28struct 2ch a ## nyaa = {
b,
c,
d,
};
ってのがあるんですがこの##ってなんでしょうか?
0247デフォルトの名無しさん
2008/06/29(日) 23:02:53##の両側をくっつけるんだな。
0248デフォルトの名無しさん
2008/06/29(日) 23:03:34ttp://www.cppll.jp/cppreference/preproc_details.html
0249デフォルトの名無しさん
2008/06/29(日) 23:19:24素のページみたのにきずきませんでした。あほすぎ^^
0250デフォルトの名無しさん
2008/06/29(日) 23:19:570251デフォルトの名無しさん
2008/06/29(日) 23:22:380252デフォルトの名無しさん
2008/06/29(日) 23:23:390253年ローと
2008/06/30(月) 01:08:12Sjisのファイルを読み込みSjisからJisへ変換する処理を作りたいです。
SjisからJisへ変換する処理はわかっているのですが、
ファイルから変換処理へ文字を渡す個所がわかりません。
C1を第一バイト。C2を第二バイト。
if(C1>=0xe0){
C1=C2-0x40
}
と処理は進むのですが、例えば「ア」なら「8341」で値が来る事を前提としています。
しかし、ファイルから読み込んだ直後は「ア」と文字列できます。
どのようにして「ア」を「8341」と変換して渡せばよいでしょうか?
宜しくお願いします。
0254デフォルトの名無しさん
2008/06/30(月) 01:17:15質問の意味が分からないけど、変換は必要ないよ
#include<stdio.h>
int main(void){
unsigned char sjis_str[]={0x83, 0x41};
printf("%c%c\n", sjis_str[0], sjis_str[1]);
printf("%02X%02X\n", sjis_str[0], sjis_str[1]);
return 0;
}
0255デフォルトの名無しさん
2008/06/30(月) 01:28:57こわがりすぎー
0256デフォルトの名無しさん
2008/06/30(月) 01:31:39http://www.kouno.jp/home/c_faq/c8.html#0
0257年ローと
2008/06/30(月) 01:39:25夜分、返信ありがとう御座います。
更に質問させてください。
�@ファイルを読み込み、バッファへ入れ込む。
ファイルの中身を入れたバッファを変換処理にかけるで良いのでしょうか?
�A「ア」を入れたバッファaを第一バイト、第二バイトに分けるにはどうしたらよいでしょうか?
0258デフォルトの名無しさん
2008/06/30(月) 01:43:58charの配列としてアクセスして1バイト単位で取り出せば勝手に第一第二になるよ。
でもリトルエンディアンとかビックエンディアンは気にしなくていいのかな?
0259年ローと
2008/06/30(月) 01:55:33やりたいことは、
�@SJisで保存したファイルを読み込み形式でオープン。
for(バッファの中身全て変換するまで){
�Aそのファイルの中身を一文字ずつaバッファに入れる。
�Bそのaバッファの中身をSjis→Jisへ変換をかける。
�C変換した物をbバッファへ入れる。
終了です。
たちまち、リトルエンディアンとかビックエンディアンは気にしなくて良いです。
0260デフォルトの名無しさん
2008/06/30(月) 01:55:450261デフォルトの名無しさん
2008/06/30(月) 02:01:23文字列とは基本的に配列である、というのはわかるんだよね
何がわからないんだろう
0262デフォルトの名無しさん
2008/06/30(月) 02:01:45どこがsjisの第一バイトかを判定したいなら
iskanji でググってみるといい
それ以前の問題なら下のコードを実行してみるとか
#include<stdio.h>
int main(void){
unsigned char buf[1024];
char filename[FILENAME_MAX];
int readsize, i;
FILE *fp;
printf("読み込むファイル名を入力してください : ");
gets(filename); // 終端処理をしたくないだけなので gets にはつっこまないように
fp=fopen(filename, "rb");
if(fp==NULL){
fprintf(stderr, "\nError : %s file cannot open.\n", filename);
return 1;
}
while((readsize=fread(buf, 1, sizeof(buf), fp))){
for(i=0;i<readsize;i++) printf(" %02X", buf[i]);
}
fclose(fp);
return 0;
}
0263デフォルトの名無しさん
2008/06/30(月) 02:02:53ttp://euc.jp/i18n/charcode.ja.html
JISの場合は、漢字開始位置と終了位置に開始/終了シーケンス
を書かなければならないとか色々あるみたい。
0264デフォルトの名無しさん
2008/06/30(月) 02:08:59まず、>>254の意味がわかったのかどうか答えた方がいいと思う
0265年ローと
2008/06/30(月) 02:32:54迷ってるのは、バッファに取得したとき、
�@a[0] = "ア"
�Aa[0] = 8,a[1] = 3,a[2] = 4,a[3] = 1
�Ba[0] = 83,a[1] = 41
どれで入ってくるかです。
0266デフォルトの名無しさん
2008/06/30(月) 02:37:180267デフォルトの名無しさん
2008/06/30(月) 02:37:31これはありえないw
charどころか4bitで分解しちゃってるじゃん
0268デフォルトの名無しさん
2008/06/30(月) 02:38:43ここ見てみなよw
2バイトコードの構造とか良くわかるよ
0269年ローと
2008/06/30(月) 02:44:44モヤモヤが取れました。何がわかってないのかもわかってない状態でした。
すいませんでした。皆さんのおかげでハッキリしました。
0270デフォルトの名無しさん
2008/06/30(月) 11:53:570271270
2008/06/30(月) 11:56:18もうすこし自分で考えてみます
0272デフォルトの名無しさん
2008/06/30(月) 12:44:350273デフォルトの名無しさん
2008/06/30(月) 13:29:06clock( )
0274デフォルトの名無しさん
2008/06/30(月) 14:31:16どのようにすればC言語で書けますか?
参考になるサイトなど教えてもらえると幸いです
0275デフォルトの名無しさん
2008/06/30(月) 14:37:04プログラミング言語の前に"日本語"を復習されては?
ロボットと聞いて大きく二つのジャンルを思い浮かべてしまった。
しかもどちらのジャンルも開発環境なんかがかなり多岐にわたってて
そんな漠然とした質問では答えようがなかった。
0276デフォルトの名無しさん
2008/06/30(月) 14:46:100277274
2008/06/30(月) 14:58:47それのラインが無い状態でも前後に動く奴は作れるのかな?と思ったので。
やっぱり質問が漠然としてましたねw
すいません
0278デフォルトの名無しさん
2008/06/30(月) 15:01:28そのロボットと3Dで表現するロボットじゃあ違うからねw
マイコン ロボット
とか
レゴ ロボット
とか
調べてみるといいよ。
あとH8とかAVRとか
0279デフォルトの名無しさん
2008/06/30(月) 15:02:060280デフォルトの名無しさん
2008/06/30(月) 15:15:41まず「制御」という言葉はわかる?
ロボット 制御 C言語
とかのキーワードで本もすぐ見つかるはず
0281デフォルトの名無しさん
2008/06/30(月) 16:04:18実装してるんだけどそれをintに置き換えて実装する場合
ってどうすれば最適になるでしょうか?
宣言部分
float SinTablef[360];
float CosTablef[360];
int SinTablei[360];
int CosTablei[360];
初期化部分
int i;
for (i=0;i<360;i++) {
SinTablef[i] = (float)sin(i*PI /180);
CosTablef[i] = (float)cos(i*PI /180);
SinTablef[i] = (int)SinTablef[i]*1024;
CosTablef[i] = (int)CosTablef[i]*1024;
}
これで実際に使うところでは1024倍で計算したあと >> 10で1/1024してます。
0282281
2008/06/30(月) 16:05:19こっちが正解
初期化部分
int i;
for (i=0;i<360;i++) {
SinTablef[i] = (float)sin(i*PI /180);
CosTablef[i] = (float)cos(i*PI /180);
SinTablei[i] = (int)SinTablef[i]*1024;
CosTablei[i] = (int)CosTablef[i]*1024;
}
0283281
2008/06/30(月) 16:08:19これも文章がおかしいですねorz
これで実際に使うところでは1024倍のままで計算したあと >> 10で1/1024してます。
0284デフォルトの名無しさん
2008/06/30(月) 16:08:41ロボットがC言語で開発可能なチップで制御されているのならできるでしょう
0285デフォルトの名無しさん
2008/06/30(月) 16:09:10SinTablei[i] = sin(i*PI /180) * 1024;
とするのでは何か気に入らないってことかなあ。
doubleをfloatにキャストしてるのも何でだろう?
0286281
2008/06/30(月) 16:13:49最初はdoubleでやってたのですがそこまでの精度がいらないのと
速度が欲しいのでとりあえずfloatにしました。
でさらなる高速化のためにintにしてみようかと思ったのですが
うまくいかなかったので・・・
>SinTablei[i] = sin(i*PI /180) * 1024;
あーそうですね。
これでいけそうですね。
0287デフォルトの名無しさん
2008/06/30(月) 16:15:11SinTablei[i] = (int)SinTablef[i]*1024;
じゃなくて
SinTablei[i] = (int)(SinTablef[i]*1024);
か
SinTablei[i] = SinTablef[i]*1024;
0290デフォルトの名無しさん
2008/06/30(月) 18:45:28struct name{
int namelen;
char name[1];
}
これってどんな使い方するの?
0291デフォルトの名無しさん
2008/06/30(月) 19:12:59http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
こんな感じで、name部分を可変長にしたいときに。
0292デフォルトの名無しさん
2008/06/30(月) 19:55:180293デフォルトの名無しさん
2008/06/30(月) 20:29:170294デフォルトの名無しさん
2008/06/30(月) 21:08:25(まさか日本語訳の方ってことはないよね。)
0295デフォルトの名無しさん
2008/06/30(月) 21:09:210296デフォルトの名無しさん
2008/06/30(月) 21:16:12実装例見て、ああ、なるほど、的な。
0297デフォルトの名無しさん
2008/06/30(月) 21:17:310298デフォルトの名無しさん
2008/06/30(月) 22:42:52c++のソースファイル(.cpp)をcにしたら(.c)
error C2143: 構文エラー : ';' が 'type' の前に必要です。ってエラーが
山のように出てきたんだがどゆこと?
c++の時は問題なく動きました。
Microsoft Visual C++ 6.0 使ってます。
0299デフォルトの名無しさん
2008/06/30(月) 22:50:39C≠C++だから
0300デフォルトの名無しさん
2008/06/30(月) 22:54:37エラーだけじゃなくてソースも貼らないと
せめてエラーの行だけでも貼らないと
0301デフォルトの名無しさん
2008/06/30(月) 23:05:43>c++のソースファイル(.cpp)をcにしたら(.c)
なぜこういうことができると思ったか、を白状してみると面白くなる気がする
0302デフォルトの名無しさん
2008/06/30(月) 23:09:00cファイル内に i++; と記入されてたとする
それをcppでコンパイルすると ++ がry ってエラー吐くコンパイラもある
0303デフォルトの名無しさん
2008/06/30(月) 23:32:29文字列とかと同様にポインタに1足してあげればいいのですか?
0304デフォルトの名無しさん
2008/06/30(月) 23:45:540305デフォルトの名無しさん
2008/07/01(火) 00:13:130306デフォルトの名無しさん
2008/07/01(火) 00:57:34CPUによっては、三角関数を計算してしまう方がキャッシュを汚染しない分早かったりするから要注意。
まして整数でテーブル持つと、無茶苦茶遅い型変換を行なわなければならなくなるので……
特に、C99やC++ならfloat版の三角関数も使えるわけで、ますます工夫する甲斐がない罠。
0307デフォルトの名無しさん
2008/07/01(火) 01:18:380308デフォルトの名無しさん
2008/07/01(火) 01:20:120309デフォルトの名無しさん
2008/07/01(火) 01:40:31ついでに90度まででいいしね。
0310デフォルトの名無しさん
2008/07/01(火) 01:44:170311デフォルトの名無しさん
2008/07/01(火) 05:10:55ほんと?
そんなCPUと三角関数の計算式の例を教えてほしい。
0312281
2008/07/01(火) 05:24:54開発はC言語なんですよね。
一応ベンチマークぽいことはやってみて
1)sin cos そのまま計算(double)
2)sin cos floatテーブル化計算
3)sin cos intテーブル化計算
1<2≠3
ってところですかねえ・・・
これを適用してる部分は4ベクトルの同時回転なので
intで精度をある程度保った計算をしたあとシフト演算x4回
するより素直にfloat演算したほうが最近のCPUだとスマート
かなあという結論でした。
0313デフォルトの名無しさん
2008/07/01(火) 05:25:070-9度までの1度おきのsinの表(10エントリ)、合計20エントリを作っておく。
B. 加法公式をつかって、0-359度までの1どおきのsinおよびcosを、
0-90度までの10度おきのsinと0-9度までの1度おきのsinからなる式に分解する。
これをBで作った表を使って計算する。
0314281
2008/07/01(火) 05:36:45>三角関数を計算してしまう方がキャッシュを汚染しない分早かったりする
あーこれってもしかしてL1L2の話ですか?
sin cosの計算ロジックが占有するキャッシュ容量と
floatx360個が占有するキャッシュ容量の差ってことですかねえ。
でも片方は命令で片方はデータなので最終的には格納される
箇所が違いません?
0315デフォルトの名無しさん
2008/07/01(火) 13:01:03なら、その処理がわずかに速くなっても、全体としてはあまり変わらない結果になりそうです。
勉強のためにこれを速くしてみたい、もしくは、もうここしかチューニングすべき点が
見当たらないのならやる価値はありますけどw
0316デフォルトの名無しさん
2008/07/01(火) 13:04:35ピンポイントの話だったのですね。
ごめんなさい><
0317281
2008/07/01(火) 13:17:06((1ベクトルの回転にsin x 2 cos x2) x 4ベクトル) x 約4000
これが1/30秒の間にこなさないといけないのでw
0318デフォルトの名無しさん
2008/07/01(火) 13:19:510319デフォルトの名無しさん
2008/07/01(火) 13:31:17それなら、複数回sin配列を作成しないような構成にすればよいのでは?
0320デフォルトの名無しさん
2008/07/01(火) 13:33:34>それなら、複数回sin配列を作成しないような
テーブル化といえばプログラム起動時に作っておくってことなので
あとは参照だけのような・・・
0321デフォルトの名無しさん
2008/07/01(火) 13:34:41ってもテーブルの初期化処理が複数回呼ばれると、主がいっている。
0322デフォルトの名無しさん
2008/07/01(火) 13:35:570323デフォルトの名無しさん
2008/07/01(火) 13:40:571. テーブル作成処理
2. テーブルの値を参照する処理
俺は2だと思っていた
0324デフォルトの名無しさん
2008/07/01(火) 13:41:23>>315が勘違い発言してるだけだろ。
普通テーブル作成を複数回呼ぶなんてありえんだろw
0325、
2008/07/01(火) 13:54:440326デフォルトの名無しさん
2008/07/01(火) 14:22:38コード晒す気がないならもうカエレ
0327、
2008/07/01(火) 14:51:360328デフォルトの名無しさん
2008/07/01(火) 15:19:080329デフォルトの名無しさん
2008/07/01(火) 16:35:57もう一回JISの記法を読み直せ
0330デフォルトの名無しさん
2008/07/01(火) 16:42:27漢字イン(旧JIS) 1B 24 40
と
漢字アウト(Roman set) 1B 28 4A
あとASCII 1B 28 42
新JIS 1B 24 42
0331デフォルトの名無しさん
2008/07/01(火) 20:29:06int* a;
ではなく
int *a;
と書くのが普通になっているのですか?
上のでも書けますけど、int* a, b, c;みたいなことはできませんし。
宣言しているのは「int型の値を指すアドレスを格納できる型」の変数なのに、
下のやつだとまるでint型の何かを宣言しているみたいじゃないですか。
0332デフォルトの名無しさん
2008/07/01(火) 20:35:40本などには、エラーチェックに「if(p == NULL) {エラー処理} 」と書いていますが、
成功した時、pには0が入っているのに、何故if文が実行されないのですか?
0333デフォルトの名無しさん
2008/07/01(火) 20:38:420334デフォルトの名無しさん
2008/07/01(火) 20:40:01盲点でした
ありがとうございました
0335デフォルトの名無しさん
2008/07/01(火) 20:40:06pに0が入ってるわけじゃない。
pの指すアドレスに格納されている値が0になっているだけで、pにはちゃんとアドレスが格納されている。
0336デフォルトの名無しさん
2008/07/01(火) 20:42:16いつも思うんだけど、そんなことどうでもいいじゃん。
スペースの位置が違うだけなのになんでそんな拘るの?
0337デフォルトの名無しさん
2008/07/01(火) 20:45:59スペースは重要でしょう。プログラミング言語の区切りはほとんどスペースじゃないですか。
宣言の標準的な形式は
型名 変数名
ですよね。だったら型名の次にスペースがあったら、それ以降は変数名とみなすべきです。
わざわざ特殊な例外を作って煩雑にする意味はなんなのですか?
0338デフォルトの名無しさん
2008/07/01(火) 20:48:28型名/**/変数名
でもいい。
トークン区切りがスペースである必要なんて無いのだ。
0339デフォルトの名無しさん
2008/07/01(火) 20:48:36話を理解していない馬鹿
0340デフォルトの名無しさん
2008/07/01(火) 20:49:40安価つかえw
0341デフォルトの名無しさん
2008/07/01(火) 20:50:42この場合スペースがなくてもOKだよ。Cにとってはスペースはその程度の問題。
0342デフォルトの名無しさん
2008/07/01(火) 20:50:59関数ポインタ型の変数の宣言は
int(*f)(int, int);
だけど、これはどこにスペースを入れて型名と変数名に区切るの?
0343デフォルトの名無しさん
2008/07/01(火) 20:53:26極端な話
#include<stdio.h>
int main(void)
{
int
i
=
0
;
printf("%d",i);
return 0;
}
これでもいい
0344デフォルトの名無しさん
2008/07/01(火) 20:55:41コンパイラが無視するのなら何でもいいんだ
ただしキーワードや変数名を区切ったらエラー
0345デフォルトの名無しさん
2008/07/01(火) 20:58:46int* a, b, c;
これだとaだけがポインタになるから
0346デフォルトの名無しさん
2008/07/01(火) 21:19:41>>331は int* a, b, c = int *a, *b, *c って思ったんじゃね
0347デフォルトの名無しさん
2008/07/01(火) 21:20:490348デフォルトの名無しさん
2008/07/01(火) 21:30:44int* a,b,c;
と書くことで int * 型の変数 a,b,cができるならまだしも、そうはできないのが納得いかないんでしょ
型の後に名前を羅列したのに、実際は型が異なる変数が出来上がる。
逆に、int *aとかくのは、型名と変数名がくっついていてそれも他と統一されていなくて気持ち悪い、と。
0349デフォルトの名無しさん
2008/07/01(火) 21:40:180350デフォルトの名無しさん
2008/07/01(火) 21:42:23int型 の ポインタ 変数a
0351デフォルトの名無しさん
2008/07/01(火) 21:44:11クソと思う人はそう書くものなのだと覚えてるだけなんだろう。
0352デフォルトの名無しさん
2008/07/01(火) 21:46:350353デフォルトの名無しさん
2008/07/01(火) 21:48:45「int型」だったら整数を格納する4バイトの領域であるべきじゃね?
0354デフォルトの名無しさん
2008/07/01(火) 21:50:52思想って何だよ?w
0355デフォルトの名無しさん
2008/07/01(火) 21:53:05とかいっぺんに宣言できて便利じゃん。
0356デフォルトの名無しさん
2008/07/01(火) 21:55:450357デフォルトの名無しさん
2008/07/01(火) 21:57:060358デフォルトの名無しさん
2008/07/01(火) 21:57:270359デフォルトの名無しさん
2008/07/01(火) 22:00:27と宣言した場合に、aとbは整数を格納する領域なのに、cだけがアドレスを格納する領域となる。
型名は同じで、あとは変数名を並列しただけなのに意味上の差が出る。これがどう論理的なのさ?
0360デフォルトの名無しさん
2008/07/01(火) 22:02:02aとbはint型、cはint*型。
なんで型名が同じなの?
0361デフォルトの名無しさん
2008/07/01(火) 22:03:48わざわざcにだけ変なもんつけてんじゃんw
それで意味上の差が出ないほうが非論理的だよ
0362デフォルトの名無しさん
2008/07/01(火) 22:04:59typedef char *pc;
int main()
{
pc a,b;
char *c,d;
printf("%d %d\n", sizeof(a), sizeof(b));
printf("%d %d\n", sizeof(c), sizeof(d));
return 0;
}
ピンとこない結果だよね。
0363デフォルトの名無しさん
2008/07/01(火) 22:08:010364デフォルトの名無しさん
2008/07/01(火) 22:08:39そう、実際は型名自体が変わってしまう。こんなことポインタだけの例外じゃん。
素直にintとint*で宣言を分割させれば、例外なんて作らずにより簡潔にできたってことだろ。
>>361
型の決定に加えて、何か更にオプション的な要素が追加されるってんなら話はわかる。
でも、*を付けただけで型自体が変わってるじゃん。これは非論理的だと思うが。
0365デフォルトの名無しさん
2008/07/01(火) 22:11:31煽り目的は目障り
0366デフォルトの名無しさん
2008/07/01(火) 22:12:07という宣言文はint型の変数だけでなく、int派生型もすべて宣言できるように
したところに混乱の元があるような
typedefは特定の型のみを対象とするのでそのような挙動に
0367デフォルトの名無しさん
2008/07/01(火) 22:12:15思想とやらを説明してみろよ
0368デフォルトの名無しさん
2008/07/01(火) 22:12:37人違い
0369デフォルトの名無しさん
2008/07/01(火) 22:13:23> こんなことポインタだけの例外
配列型も関数型も関数ポインタ型も同様だよ。
0370デフォルトの名無しさん
2008/07/01(火) 22:14:07pc a, b =*(a,b)
こんな宣言ありえんが
0371デフォルトの名無しさん
2008/07/01(火) 22:16:16説明できないので逃げました
0372デフォルトの名無しさん
2008/07/01(火) 22:16:53int で始まる宣言がint型の宣言のみに使うのではないという考え。
0373デフォルトの名無しさん
2008/07/01(火) 22:19:38心許ないからアホは黙ってろ。
0374デフォルトの名無しさん
2008/07/01(火) 22:19:54C#?C++?
0375デフォルトの名無しさん
2008/07/01(火) 22:20:47それによって、宣言の先頭を見ただけでは型名が決定できないというデメリットが生じた。
それを補って余りあるメリットがあるの?
0376デフォルトの名無しさん
2008/07/01(火) 22:23:15intとintのポインタを同時に宣言するときにタイプ数が減るという素晴らしいメリットが生じた。
0377デフォルトの名無しさん
2008/07/01(火) 22:23:29int a, b[10];
と書かれた行を見て、bがint型ではないことに対しても不満ってことでよろしい?
0378デフォルトの名無しさん
2008/07/01(火) 22:31:39不満なのであれば、配列についてもこまめに
typedef int int_array_10[10];
int_array_10 a, b;
などとやっていただきたいし、
不満ではないのであれば、ポインタの宣言に対して目が慣れてないだけとしか。
0379デフォルトの名無しさん
2008/07/01(火) 22:38:100380デフォルトの名無しさん
2008/07/01(火) 22:39:48論理的じゃないと思うのは理解力が足りないだけ
0381デフォルトの名無しさん
2008/07/01(火) 22:40:400382デフォルトの名無しさん
2008/07/01(火) 22:41:24タイプ数を減らしたいがための、いわばこじつけだろ。
0383デフォルトの名無しさん
2008/07/01(火) 22:42:050384デフォルトの名無しさん
2008/07/01(火) 22:45:09*int a,b,c = int *a,*b,*c って意味で
0385デフォルトの名無しさん
2008/07/01(火) 22:47:350386デフォルトの名無しさん
2008/07/01(火) 22:49:20派生型を明示的なほかの型にしちゃうと型が掛け算で増えちゃって大変じゃん。
それをやったのがLPTSTRとかLPCTSTRとかなんだけどね。
0387デフォルトの名無しさん
2008/07/01(火) 22:49:34いや。全く変わっていない。
0388デフォルトの名無しさん
2008/07/01(火) 22:49:570389デフォルトの名無しさん
2008/07/01(火) 22:50:33int*a;はデリファレンスしたものがintであるような型でaを宣言してるだけ。
0390デフォルトの名無しさん
2008/07/01(火) 22:51:150391デフォルトの名無しさん
2008/07/01(火) 22:51:500392デフォルトの名無しさん
2008/07/01(火) 22:53:13規格を読んだことがないのなら問題外であるし、もしその法則が性に合わないというなら、
今すぐCコンパイラをWindowから放り出すことをお勧めする。
0393デフォルトの名無しさん
2008/07/01(火) 22:53:53後者の*は、aの示すアドレスの中身を見るためのものだよな。
前者も同じだと言うの?宣言時に不明なaの中身を見てどうすんの?
0394デフォルトの名無しさん
2008/07/01(火) 22:55:370395デフォルトの名無しさん
2008/07/01(火) 22:56:220396デフォルトの名無しさん
2008/07/01(火) 22:56:45うまいこと言ったつもりか!!
0397デフォルトの名無しさん
2008/07/01(火) 22:57:33アホじゃないあなたの口から!説明を!今から!
0398デフォルトの名無しさん
2008/07/01(火) 22:58:48int *a;
はaの中身を見たときにintであるようにaを宣言する。と読めばいい。
0399デフォルトの名無しさん
2008/07/01(火) 23:00:57と読めばよい
0400デフォルトの名無しさん
2008/07/01(火) 23:04:39なるほど。しかしその場合、a自体はどうなる?
aは自動的にポインタ型に定義されることになるの?
一つの宣言で二つのものが定義されるならばそれは例外的な処理じゃないか。
0401デフォルトの名無しさん
2008/07/01(火) 23:05:350402デフォルトの名無しさん
2008/07/01(火) 23:06:27日本語の通じないかたはお帰りください
0403デフォルトの名無しさん
2008/07/01(火) 23:09:21黙って従うしかない
0404デフォルトの名無しさん
2008/07/01(火) 23:09:41あたまわるいだろ
0405デフォルトの名無しさん
2008/07/01(火) 23:09:54の場合には
*a と書くと int になる変数と考えればいいんじゃない?
int (*b)(int, int);
の場合には
(*b)(1, 2); // * は省略可能
と書くと int になるとか
0406デフォルトの名無しさん
2008/07/01(火) 23:10:33しかし今の論点は、intと型名を書いてるのに宣言されるものがint型ではないのがおかしい、ってことだろ。
Cの規則はこういうところで筋が通っていない。
0407デフォルトの名無しさん
2008/07/01(火) 23:11:54それならint *a = 100みたいな書き方もOKにすべき
0408デフォルトの名無しさん
2008/07/01(火) 23:12:04なんで「int」しか見ないの?
0409デフォルトの名無しさん
2008/07/01(火) 23:14:37なんで「int」以外も見なくちゃいけない仕様にしたの?
0410デフォルトの名無しさん
2008/07/01(火) 23:15:42int &a;
であった方が分かりやすかったということ?
0411デフォルトの名無しさん
2008/07/01(火) 23:16:56もう一度聞くが、
int a, b[10];
と書かれている場合、bの型を知るためにはintだけ見ていてはダメだよね。
それについても問題視しているの?
0412デフォルトの名無しさん
2008/07/01(火) 23:17:55これは、ルールを理解するということは、それだけでひとつのタスクであることを意味する。
あえて言い切ってしまえば、規格を理解するのはプログラマの能力であり義務である。
もし君がC規格を理解することができないなら、君にはCは使えない。
そしてよほど状況認識に問題のある人間でない限り、
使えないものを無理矢理使わせようとする者はいない。
こんなところで言いがかりめいた愚痴を垂れ流す暇があったら、
別な言語を勉強することに時間を割いたほうが、きっと有意義である。
0413デフォルトの名無しさん
2008/07/01(火) 23:18:110414デフォルトの名無しさん
2008/07/01(火) 23:20:36釣りじゃなかったらよっぽど・・・
0415デフォルトの名無しさん
2008/07/01(火) 23:21:54というのが正しい答えだと思う
気に入らなければC言語なんて使わずに自分で言語を作ればいい
0416325
2008/07/01(火) 23:22:02今、SJISからJISへの変換処理を作成してます。コード変換処理は出来てます。が変換前後の処理がわかりません。変換コード前後に何かコードを付け加えなければいけないのでしょうか?
unsigned char cSJbuff [256];
unsigned char cJbuff [256];
unsigned int i = 0;
unsigned int iLen = 0;
memset(cSJbuff,0,256);
memset(cJbuff,0,256);
iLen = strlen((const char*)cSJbuff0);
for(i = 0; i<iLen; i+=2){
if(cSJbuff[i] >= 0xE0){
cSJbuff[i]=cSJbuff[i]-0x40;
}
if(cSJbuff[i] >= 0x80){
cSJbuff[i+1]=cSJbuff[i+1]-1;
}
if(cSJbuff[i+1] >= 0x9E){
cSJbuff[i]=(cSJbuff[i+1]-0x70)*2;
cSJbuff[i+1]=(cSJbuff[i+1]-0x70;
}else{
cSJbuff[i]=((cSJbuff[i+1]-0x70)*2)-1;
cSJbuff[i+1]=cSJbuff[i+1]-0x1F;
}
}
memcpy(cJbuff,cSJbuff,iLen);宜しくお願いします。
0417デフォルトの名無しさん
2008/07/01(火) 23:22:12では、配列はどのように宣言できればスマートだったであろうか?
int [10] a, b;であれば分かりやすい?
それとも、それでは要素数の異なる配列を宣言するのが困難であると、
int [] a 10, b 10;のような表記にしておけばよかった?
前者であれば要素数が異なる場合に不便であり、
後者であれば結局は要素数を知るために int [] のみを見ていてはだめということになる。
というか、対案だしてください。
0418デフォルトの名無しさん
2008/07/01(火) 23:23:47int[10] a;
int[20] b;でいいよ。
一文にまとめる必要が無い。
0419デフォルトの名無しさん
2008/07/01(火) 23:24:59&int a;
だね。
0420デフォルトの名無しさん
2008/07/01(火) 23:25:590421デフォルトの名無しさん
2008/07/01(火) 23:26:14自分でもわかってるじゃん。正解はないって
かまってちゃんにしか見えないお
0422デフォルトの名無しさん
2008/07/01(火) 23:27:52言語作成者が神です
その言語を使用する以上は神に従うしかありません
0423デフォルトの名無しさん
2008/07/01(火) 23:28:07君のやろうとしていることは、ただ単にSJISの2バイト表現をJISの2バイト表現に変更しているだけである。
実際にはSJISのコードは2バイト表現だけからなっているわけではないし、JISで2バイト表現を使うにはシフト処理が必要である。
もう一度それぞれの文字コード仕様を読み直すこと。
0424デフォルトの名無しさん
2008/07/01(火) 23:28:07var
a: array [0..9] of integer;
b: integer;
0425デフォルトの名無しさん
2008/07/01(火) 23:28:59同じものを複数宣言するなら一文でもいいが、違うものを宣言するなら複数の文。
俺のスタンスはずっとこうだよ。
0426デフォルトの名無しさん
2008/07/01(火) 23:31:23絶対に間違っている点がひとつ
それを認める権利ないし責任があるのは規格を制定した人間で、俺らではない
0427デフォルトの名無しさん
2008/07/01(火) 23:31:50カーニハンはツンデレだったのか!
0428デフォルトの名無しさん
2008/07/01(火) 23:33:24自分の頭の悪いのを言語のせいにするようなバカはとっとと寝ろ
0429デフォルトの名無しさん
2008/07/01(火) 23:35:06俺は今の仕様で何も問題ないと思ってるよ
0430デフォルトの名無しさん
2008/07/01(火) 23:35:540431デフォルトの名無しさん
2008/07/01(火) 23:36:540432デフォルトの名無しさん
2008/07/01(火) 23:38:040433デフォルトの名無しさん
2008/07/01(火) 23:39:32これが欲しいのか?
#define BEGIN {
#define END }
0434デフォルトの名無しさん
2008/07/01(火) 23:42:200435デフォルトの名無しさん
2008/07/01(火) 23:44:44少ないキー入力でプログラミングを打ち込むことができる
これがC言語開発者の考えのひとつなんだよ
したがって、ハショっているところはいくつかあるし
言語仕様として美しくないところもある
0436デフォルトの名無しさん
2008/07/01(火) 23:47:060437デフォルトの名無しさん
2008/07/01(火) 23:47:160438デフォルトの名無しさん
2008/07/01(火) 23:51:290439ヒント
2008/07/01(火) 23:53:03cell=^integer;
celler=array[1..100] of cell;
organet=^celler;
organizy=array[1..1000000]of organet;
unit=^organizy;
units=array[1..1000]of unit;
unity=array[1..1000]of organizy;
unitaly=array[1..100]of unit;
unipotent=array[1..100]of unity;
...こーゆーのが1000個以上
名称の変更やエイリアスはコーディングルールで一切不可!
一度名前を自由に付けることが許され、その後それに修正を許さないような
特権を与えた場合、後々の人がそれによって、どのような苦労をさせられるかの例
0440デフォルトの名無しさん
2008/07/02(水) 00:02:41そうカーニハンは悔やんでいるかもしれない
いくつかの規格の変遷を経て、仕様はかわってきているけどね
0441デフォルトの名無しさん
2008/07/02(水) 00:07:180442デフォルトの名無しさん
2008/07/02(水) 00:08:11リーナスの方かもしれない
0443デフォルトの名無しさん
2008/07/02(水) 00:12:27属性名hrefがあれば、属性値をEditBoxに出力する、というプログラムを作っているのですが、
二次元配列に<>内の属性名と属性値を一括で抽出して一括でhrefであるか比較していき
hrefであれば、出力するか、
それとも<>内から一つずつ属性名と属性値を抽出し、その都度hrefかどうか比較して
hrefであれば出力するか
どちらが良いでしょうか?
それを選んだ理由も教えて下さい。
0444デフォルトの名無しさん
2008/07/02(水) 00:17:49インデクスを2づつすすめながら処理する。
<eXpat/>の仕様にあわせた。
0445デフォルトの名無しさん
2008/07/02(水) 00:20:28前者はソースコードを見たときに処理内容が把握しやすい
後者はエンドユーザが使いやすい
HTMLがローカルファイルであり、ファイルサイズが小さいならば前者
HTMLがWeb上のファイルであり、ファイルサイズが大きいならば後者
その他の場合は状況に応じて
0446デフォルトの名無しさん
2008/07/02(水) 02:35:25みたいに結果の型をそろえた書き方は、、
struct Node *head, **curr = &head;
こんなのしか思い浮かばぬ
0447デフォルトの名無しさん
2008/07/02(水) 03:38:180448デフォルトの名無しさん
2008/07/02(水) 03:58:30int型へのポインタ、double型へのポインタ、構造体型へのポインタ、関数型へのポインタなど。
これらが存在し得るのは、型と変数が別々に存在するから。ポインタとは型ではなく、変数であることを理解すること。
言語仕様として「キーワードを区切らない形での空白」はどのように書いても許容される。
だからint* aでもint *aでも、書き方として許されている。あとはどちらが読み手に誤解を与えないかというだけ。
しかし認識として正しいのは、「intポインタ型の、変数a」ではなく、「int型の、ポインタ変数a」である。
0449デフォルトの名無しさん
2008/07/02(水) 04:05:41○int型への、ポインタ変数a
0450デフォルトの名無しさん
2008/07/02(水) 07:54:33新JIS 1B 24 42
ASCII 1B 28 42
0451デフォルトの名無しさん
2008/07/02(水) 10:04:10どのような理由で9ビットなのですか?
0452デフォルトの名無しさん
2008/07/02(水) 10:14:5136bit word の内部を任意のフィールドに区切って使用可能
使用するchar codeにもよるが, 4 char から 6 char 格納可能
PDP 10 とか調べると幸せになれるかも...
0453デフォルトの名無しさん
2008/07/02(水) 16:46:03char HOGENAME[] = "<HOGEHOGE>";
HOGERead(HOGENAME,sizeof(HOGENAME));
といった配列の長さをある関数に渡す際にsizeofが算出する文字数は純粋な文字数?
それとも文字数に終端コード分+1が正解?
0454デフォルトの名無しさん
2008/07/02(水) 16:49:250455デフォルトの名無しさん
2008/07/02(水) 16:51:41char str[] = "abc";
printf("%d", sizeof str);
とでもやればここで聞くより早いだろうに。
0456453
2008/07/02(水) 16:52:340457453
2008/07/02(水) 16:54:45あ、一応自分で試したというか、構造体なんかと同じで+1されないつもりで
組んだプログラムが思ったように動かなくて調査してたらどうも+1されてそうな
感じなのでその認識が間違ってないかで質問させていただきました^^;
この辺の話ってCやってる人だと当たり前なのかぐぐっても
でてこなかったような感じだったので・・・
0458デフォルトの名無しさん
2008/07/02(水) 17:01:30C 文字列 サイズ
で, ぐぐると, こんなページが引っ掛かるわけだが…
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.7.4.html
0459デフォルトの名無しさん
2008/07/02(水) 17:10:33配列の大きさは記憶領域の大きさであって、
文字列の実質的な部分がどうたら、という内容には関係ないよ。
もし、記憶領域の大きさから文字列の長さを推定するような処理を書いているとしたら、
ビミョーではないかと思う。
0461デフォルトの名無しさん
2008/07/02(水) 17:26:58配列の長さを渡したいんだったらstrlenは常にダメじゃないか?
0462デフォルトの名無しさん
2008/07/02(水) 17:41:000463デフォルトの名無しさん
2008/07/02(水) 18:40:03#define MEM_FREE(x) do{ \
if(x != NULL){ \
free(x); \
x = NULL; \
} \
}while(0)
のバックスラッシュは何なのでしょうか
お願いします
0464デフォルトの名無しさん
2008/07/02(水) 18:42:360465デフォルトの名無しさん
2008/07/02(水) 18:43:03一行にずらーっと書いてるのと同じ
0466デフォルトの名無しさん
2008/07/02(水) 18:44:36お早い返答ありがとうございます
やっと理解することができました
ありがとうございました
0467デフォルトの名無しさん
2008/07/02(水) 18:47:08バックスラッシュの後ろに空白とかタブが入ってると素敵な体験ができます
納期間近でテンパッてるときなんか特にw
0468デフォルトの名無しさん
2008/07/02(水) 18:47:26#defineは2行以上にまたがる場合は後ろに\を付けるんだYO
#define M(s) printf("%s\n",\
s)
とかね。
ちなみにそのマクロなんだが、使用しないほうがいい。
p="freeしてはならない文字列ポインタ";
MEMFREE(p);
とかしがちなんで。
0469デフォルトの名無しさん
2008/07/02(水) 18:51:59っ「前処理指令 改行」
0470デフォルトの名無しさん
2008/07/02(水) 19:01:21重大なバグの原因になる。
C99ではinlineとか出来てるらしいから、マクロではなくinline関数とか利用するほうが正統性が高いよ。
古いCの凝ったマクロは使わないほうが安全。
0471デフォルトの名無しさん
2008/07/02(水) 19:19:51#define は改行があるとそこで終了してしまう
改行をなかったことにするために\をつける
0472デフォルトの名無しさん
2008/07/02(水) 19:37:520473デフォルトの名無しさん
2008/07/02(水) 19:45:16そんなもんマクロにくるまなくても同じだろう
そのマクロは、freeにヌルポインタを渡したときに
何もしないことが保証されていなかった古い実装のためのものだね
現在では最初のifの意味がない、が正しい
0474デフォルトの名無しさん
2008/07/02(水) 20:01:03行数を少なくすることはそれなりに重要なことである。なぜならそれは保守性に貢献するからである。
inline が使える環境が決して多数でない現状、もちろん関数を使ったほうがよい場合は多いけれど、
実行速度を重視してマクロを使用する選択肢は、決して邪道ではない。
0475デフォルトの名無しさん
2008/07/02(水) 20:04:28変数もマクロで定義すると複雑になる。
0476デフォルトの名無しさん
2008/07/02(水) 20:08:35んなアホな
プロこそ現実のどうしようもない制限の枠内で妥協を図るものだろう
そもそもCはオブジェクト指向言語じゃないし
0477デフォルトの名無しさん
2008/07/02(水) 20:09:26邪道だと思う。
実行速度云々の世界なら profile して呼び出しの多い関数への引き渡しを見直すとかそういうのがいいのでは?
マクロの多用はとにかくトラブルの元になりがち。
0478デフォルトの名無しさん
2008/07/02(水) 20:09:350479デフォルトの名無しさん
2008/07/02(水) 20:11:52マクロにするぐらいで速くなる場合ってそんなに多いかな?
0480デフォルトの名無しさん
2008/07/02(水) 20:12:10そんなことはとっくにやった上での話だろう
トラブルを起こすのは大抵の場合マクロが悪いんじゃなくて使う奴が悪いし
マクロを使うことでなくせるトラブルもある
0481デフォルトの名無しさん
2008/07/02(水) 20:13:37違う
もともとベタで数行書いていた処理を
関数ではなくマクロにするから遅くならないという話
0482デフォルトの名無しさん
2008/07/02(水) 20:18:29あとはC++でも特にGUIを使う場合には定型だがクソ長いメソッドをマクロにしてしまうのもよくあること
0483デフォルトの名無しさん
2008/07/02(水) 20:23:27いやC++ならinline使えよ
0484デフォルトの名無しさん
2008/07/02(水) 20:31:30関数とマクロの区別がついていればトラブルは起こらないわけだし
でもまあ大抵は関数使ったほうがいいよね
0485デフォルトの名無しさん
2008/07/02(水) 20:44:51推奨度
1位:複雑な式の間違いの無い展開
2位:冗長性の高い初期データ設定時の設定ミス防止
3位:保守工程における関数合成共通化作業時(グローバル名前空間を浪費する似たような関数は一箇所にまとめて
公開名称にして、旧関数使用箇所ではマクロでパラメータで切り分ける新関数コードに置換)
3位クラスになると、管理者クラスじゃないとやらしてはもらえないね。多くの開発現場じゃ。
それ以外の使用は関数テンプレートだろうな精々。それでも関数テンプレート禁止の開発現場もあるし。
Cじゃもといできないし...
0486デフォルトの名無しさん
2008/07/02(水) 20:50:230487デフォルトの名無しさん
2008/07/02(水) 21:07:210488デフォルトの名無しさん
2008/07/02(水) 21:19:48的確に秘孔を突いてくる奴は間違いなくプロ
0489デフォルトの名無しさん
2008/07/02(水) 21:53:071. name space
2. reentrant
3. goto
4. trigraph
0490デフォルトの名無しさん
2008/07/02(水) 21:57:120491デフォルトの名無しさん
2008/07/02(水) 22:11:440492デフォルトの名無しさん
2008/07/02(水) 22:22:500493デフォルトの名無しさん
2008/07/02(水) 22:23:29あいかわらず、このスレや宿題スレで基地外長文を連投しまくってるが。
0494デフォルトの名無しさん
2008/07/02(水) 22:26:24基地外だという自己紹介乙w
それ、お前だろ?白々しいw
0495デフォルトの名無しさん
2008/07/02(水) 22:27:27うわっ、まだそんなことを思い出して、わざわざ書き込むなんて
お前の方が人間性が腐ってね?お前みたいな言動をする奴って
結局引きこもりなんだろ?かなり性格が悪いぞ。
0496デフォルトの名無しさん
2008/07/02(水) 22:32:410497デフォルトの名無しさん
2008/07/02(水) 22:34:36> あいかわらず、このスレや宿題スレで基地外長文を連投しまくってるが。
それがそいつだと言う証拠は?IDもなし、トリップ無しで、不特定多数の人が
来る場所で、まだいると思っている妄想乙。お前がそういうのに過剰反応しているだけだろ。
もっとも、ファビョっているのはお前のようだが・・・自己紹介乙。
マクロの中の \ を知らなかったんだろ、お・ま・え・が?w
蒸し返す奴ほど、頭がおかしい。そういう奴の方が、常駐している人からしてみりゃ
迷惑で鬱陶しい。
0498デフォルトの名無しさん
2008/07/02(水) 22:36:500499デフォルトの名無しさん
2008/07/02(水) 22:38:30ああ、やっぱりこのゴミまだ居るんだ。
0500デフォルトの名無しさん
2008/07/03(木) 00:23:44メモリ消費がパソコン資源を超えるプログラムを実行した場合の挙動について
聞きたいんですが、OSからエラー吐き出されたりしますかね?
現状では実行した瞬間に終了するという感じで、それがプログラムのエラーなのか
メモリ容量不足が問題なのか知りたいのですが。
0501デフォルトの名無しさん
2008/07/03(木) 00:27:31自分で作成したプログラムですか?
デバッグでmainまで飛んでこないとかですか?
0502デフォルトの名無しさん
2008/07/03(木) 00:43:28環境は?あと、どんなプログラム?
0503デフォルトの名無しさん
2008/07/03(木) 00:54:36C言語の範疇で答えられることは、
スタックや静的変数とかが足りなくなった場合にどういう挙動をするかは環境による
malloc系の関数でメモリが足りなかったときにはヌルポインタが返されるので、
それを無思慮に使ったらたぶんアクセスエラーかなんかが起きて落ちる
ただよっぽどのことでないかぎり、メモリが足りないということはない
(OSもがんばって捻出しようとするから)
普通はまずプログラム自体のバグを疑うべき
0504デフォルトの名無しさん
2008/07/03(木) 00:58:13>>502
winxpのメモリ512M、コンパイラはborland、エディタはC言語をはじめようってやつです。
自分で作った分子シミュレーションのプログラムです。
今までデバッグが必要なほど長いプログラムを書いた事がないので
よく分らないのですが、
main関数で変数定義の後に3MBほどの入力ファイルを読み込んで、
書き出し用ファイルを作ったところで
scanfでプログラムをとめようとしたんですが
前述の状況となりました。
書き出しファイルもできてませんでした。
ちなみに
doubleで要素数3万の配列を8つと
3次元配列[50][50][50]を二つ定義しています。
0505デフォルトの名無しさん
2008/07/03(木) 01:03:21VC++の場合は途中のバージョンからスタックオーバーフローが
何もメッセージを出さずに落ちてしまうようになったから困ってるのだが。
ところでそのプログラムはGUIそれともCUI?
それからその配列はスタックかヒープかstaticにとってるかとかわかる?
0506デフォルトの名無しさん
2008/07/03(木) 01:03:30配列で連続的に確保できるメモリってそう多くないのよ
0507デフォルトの名無しさん
2008/07/03(木) 01:05:33大抵の場合分断されてて、一つの空き領域のカタマリとしてあるわけじゃないから
0508デフォルトの名無しさん
2008/07/03(木) 01:06:56とりあえず、でかい領域の変数を外部変数にしてみるとかだな。
0509デフォルトの名無しさん
2008/07/03(木) 01:08:23静的宣言でなんとかなるものかねぇ
0510デフォルトの名無しさん
2008/07/03(木) 01:10:41それはスタックメモリオーバーだろう。
ボーランドだとコンパイラオプション-lS
でメモリサイズ指定するんだっけ。
0x400000位あればOKか
0511デフォルトの名無しさん
2008/07/03(木) 01:17:20その数字はどうやって出したの?
>ちなみに
>doubleで要素数3万の配列を8つと
>3次元配列[50][50][50]を二つ定義しています。
これだけ見る限り、俺の計算ではdouble1つで8バイトだとしても、
何回計算しても4M弱になっちゃうんだけど...
0512504
2008/07/03(木) 01:17:27データは数字で出力してそれをAVSというソフトで可視化するという感じなので
CUIですかね、ちょっと用語の意味が分からず答える事ができないのですが(汗
不勉強で申し訳ありません。
>>506-510
返答ありがとうございました。
プログラムの勉強をして出直してきます。
どうもすいません。
0513デフォルトの名無しさん
2008/07/03(木) 01:32:54パブロフの犬のごとく反応しているよな、お前w
別人に噛み付いて、あっお前か?って揺さぶり、煽りだろ?
お決まりのパターンだな。。。だからねらーはキモイって言われるんだよw
0514デフォルトの名無しさん
2008/07/03(木) 01:35:52壮絶な勘違いですた
死ね俺
0515デフォルトの名無しさん
2008/07/03(木) 18:47:100516デフォルトの名無しさん
2008/07/03(木) 18:55:470517デフォルトの名無しさん
2008/07/03(木) 20:30:54厳密には、そのヘッダファイルの内容による
べき乗を考慮してないヘッダなら多重定義でエラーになるだろうし、
複数回読み込まれると何かの値が変化するように作ることも可能
一般的には、つまり普通のライブラリが用意しているヘッダなら、変わらない
0518デフォルトの名無しさん
2008/07/03(木) 20:34:292列目のポインタを渡した事になりますでしょうか?
0519デフォルトの名無しさん
2008/07/03(木) 20:41:14Cでは列単位で配列を切り分けることは不可能
処理の中で1列目を読み飛ばすしかない
0520デフォルトの名無しさん
2008/07/03(木) 20:42:08残念ながら無理です
0521デフォルトの名無しさん
2008/07/03(木) 20:42:21具体的には、array[3][2]や、array[5][2]などを渡したいときにそのように書く
0522デフォルトの名無しさん
2008/07/03(木) 20:44:03>>521は受け取る側の話なので無視してください
0523デフォルトの名無しさん
2008/07/03(木) 20:45:37そうですか、詳しい説明ありがとうございます。
0524、
2008/07/03(木) 21:24:24戻り値unsigned shortの関数があります。それを
unsigned charZ[32]で受け取りたいのですが、どのように行うのがよいでしょうか?
0525デフォルトの名無しさん
2008/07/03(木) 21:40:300526デフォルトの名無しさん
2008/07/03(木) 22:09:59残念ながら、Cではそれを簡単に行う方法はありません。
プログラムを見直して、どちらもintに統一するのがよいでしょう。
そうすればスマートかつ移植性の高いプログラムになります。
0527デフォルトの名無しさん
2008/07/03(木) 22:15:540528デフォルトの名無しさん
2008/07/03(木) 22:20:48関数の戻り値をunsigned char Z[32]の先頭で受け取ったとしたら
Z[0]とZ[1]に分けてアクセスしたいとかそういう話?
0529デフォルトの名無しさん
2008/07/03(木) 22:21:570530デフォルトの名無しさん
2008/07/03(木) 22:23:020531524
2008/07/03(木) 23:00:01うまく伝えれませんでした。
【前提条件】
・unsigned shortの関数は外部提供関数です。
・unsigned charZ[32]はこちらで定義してるのですが変更できません。
・unsigned charZ[32]ですが、実際、使用するのは[0][1]の16ビットのみです。
�@やりたいことは、unsigned shortの関数を発行する。
�Aunsigned shortの戻り値を何らかの処理をしてunsigned charに変換する。
�B�Aで変換した値を8ビットずつZ[0]、Z[1]に入れる。
という事を行いたいです。�Aがわかりません。
なんかシフト演算を使用すればよい聞いています。
しかも、一行ですむとか。
ググル事もできないアホ女です。宜しくお願いします。
0532デフォルトの名無しさん
2008/07/03(木) 23:03:47ググレメス
0533デフォルトの名無しさん
2008/07/03(木) 23:23:37一行ですむ&シフト演算 って難しいじゃないか
一行っていうとキャストしか思い浮かばない(バスエラー?99%大丈夫)
0534デフォルトの名無しさん
2008/07/03(木) 23:31:090535デフォルトの名無しさん
2008/07/03(木) 23:51:34unsigned charZ[32];
unsigned short HogeA = hogehoge();
unsigned charZ[0] = (char)(HogeA >> 8);
unsigned charZ[1] = (char)(HogeA & 00FF);
0536デフォルトの名無しさん
2008/07/03(木) 23:52:20unsigned short HogeA = hogehoge();
unsigned charZ[0] = (unsigned char)(HogeA >> 8);
unsigned charZ[1] = (unsigned char)(HogeA & 00FF);
0537デフォルトの名無しさん
2008/07/03(木) 23:57:22unsigned short a = 0xaabb;
unsigned char Z[32];
Z[0] = (unsigned char)(a >> 8), Z[1] = (unsigned char)(a & 0x00ff);
printf("%d %d\n", Z[0], Z[1]);
memcpy(Z, &a, sizeof(unsigned short));
printf("%d %d\n", Z[0], Z[1]);
0538デフォルトの名無しさん
2008/07/04(金) 00:06:200539デフォルトの名無しさん
2008/07/04(金) 00:10:10Z[0] = a >> 8, Z[1] = a;
printf("%d %d\n", Z[0], Z[1]);
0540デフォルトの名無しさん
2008/07/04(金) 00:11:34じゃあこう
0541540
2008/07/04(金) 00:12:180542デフォルトの名無しさん
2008/07/04(金) 00:12:23それはまずいよw
0543デフォルトの名無しさん
2008/07/04(金) 00:55:54ません。
今は自転車の簡単な特徴点をテンプレートととして用意してその点を認識させよ
うとしているのですが
なかなか認識させることができません。(テンプレートは自転車の車輪を想定し
て円状に点を6点取っています。
うまく自転車を認識させる方法がありましたら教えてください。
0544デフォルトの名無しさん
2008/07/04(金) 01:02:22http://codepad.org/hePKeIdy
%xで
----
aa bb
bb aa
----
どっちだろうな
WindowsSDKの上位・下位byteを取得するマクロは上と同じだったと思うが
0545デフォルトの名無しさん
2008/07/04(金) 01:10:35三輪車のテンプレートから車輪をひとつとる
0546545
2008/07/04(金) 01:11:250547デフォルトの名無しさん
2008/07/04(金) 01:14:14すいません
了解しました
0548デフォルトの名無しさん
2008/07/04(金) 02:25:170549デフォルトの名無しさん
2008/07/04(金) 07:29:52なんでこんなことするんですか?
すごいわかりずらくなってるんですが?
0550デフォルトの名無しさん
2008/07/04(金) 07:30:51○ わかりづらく
0551デフォルトの名無しさん
2008/07/04(金) 07:40:41なんでこんなことするんですか?
すごいわかりづらくなってるんですが?
0552デフォルトの名無しさん
2008/07/04(金) 07:45:22いったいどこの国でよくしてるのか詳しく
0553デフォルトの名無しさん
2008/07/04(金) 08:01:34たしかにみたことはあるんです。
0554デフォルトの名無しさん
2008/07/04(金) 08:10:06正確な記述を持って来たら説明してやるよ
0555デフォルトの名無しさん
2008/07/04(金) 08:14:080556デフォルトの名無しさん
2008/07/04(金) 08:19:14よくしてる
とはふつうひょうげんしませんよ
0557デフォルトの名無しさん
2008/07/04(金) 08:26:06よくしてるかどうかわかりませんがtypedef int _int みたいなことしてるけど
なんでこんなことするんですか?
すごいわかりずらくなってるんですが?
改めておねがい致します
0558デフォルトの名無しさん
2008/07/04(金) 08:27:520559デフォルトの名無しさん
2008/07/04(金) 08:28:370560デフォルトの名無しさん
2008/07/04(金) 08:29:59判断材料が少なすぎてなんとも答えようがありません
該当のソースをまるごとアップロードするか
ソースの作成者本人に聞いてください
0561デフォルトの名無しさん
2008/07/04(金) 08:30:010562デフォルトの名無しさん
2008/07/04(金) 08:36:33ですが たとえばカーネルソースとか明らかにわかりずらくなってて
おしゃれ的になしだとおもうのですが理由があるのかなあとおもったのですが
0563デフォルトの名無しさん
2008/07/04(金) 08:37:020564デフォルトの名無しさん
2008/07/04(金) 08:37:32○ わかりづらく
0565デフォルトの名無しさん
2008/07/04(金) 08:39:060566デフォルトの名無しさん
2008/07/04(金) 08:39:23おしゃれ的ってなんだ
0567デフォルトの名無しさん
2008/07/04(金) 08:45:45そっかなんとなくわかるかもしれないです。
いまからよくかんがえてみます。
みなさま本当にありがとうございました。
0568デフォルトの名無しさん
2008/07/04(金) 10:14:250569デフォルトの名無しさん
2008/07/04(金) 10:14:280570デフォルトの名無しさん
2008/07/04(金) 12:56:060571、
2008/07/04(金) 13:35:37�@unsigned charM[2]の値を何らかの処理をしてunsigned Shortに変換する。
�A�@で変換した値をunsigned ShortN[2]にセットする。
この処理を行いたいです。
M[0]をシフト演算で左8ビット。
M[1]を(0X000FF&M[1])と操作しましたが上手くいきません。
0572デフォルトの名無しさん
2008/07/04(金) 13:39:20M[0]を8ビット左シフトしたら中身0だと思うよw
一旦
unsigned Short wm0 = (short)M[0];
unsigned Short wm1 = (short)M[1];
といったshortの器に入れて
(wm0 << 8 | (0x00FF & wm1))
とかね。
wm1はマスクいらないかな?
0573デフォルトの名無しさん
2008/07/04(金) 13:41:35>unsigned short wm0 = (short)M[0];
>unsigned short wm1 = (short)M[1];
unsigned short wm0 = (unsigned short)M[0];
unsigned short wm1 = (unsigned short)M[1];
0574デフォルトの名無しさん
2008/07/04(金) 13:43:21ノールッキンバックさ
0575デフォルトの名無しさん
2008/07/04(金) 13:43:28>unsigned ShortN[2]
これって2つあるってことはM[0] とM[1] をそれぞれ加工して別に入れるでいいのかな?
だったら>>572-573は合成しちゃってるのでだめだ
0576575
2008/07/04(金) 13:46:17ShortN[0] = ShortN[0] << 8;
ShortN[1] = (unsigned short)M[1];
0577、
2008/07/04(金) 13:48:13575さん。結局は一つにします。操作しやすいと思って配列にしてます。
0578デフォルトの名無しさん
2008/07/04(金) 14:34:01まあ、誰かは関係なく、こちらもエンディアンを意識する必要があると思うがな
分割した方法によって結合する方法が変わる
0579デフォルトの名無しさん
2008/07/04(金) 15:04:07下記のソースの違いについて教えてください。
1、*mjd[3]
2、(*mjd[3])
0580たすけて
2008/07/04(金) 15:17:37f(x)=x^5ー8x^4ー26x^3+56x^2+48xー1=0
の実根のひとつを小数点以下7位まで求めよ
0581デフォルトの名無しさん
2008/07/04(金) 15:18:410582デフォルトの名無しさん
2008/07/04(金) 15:34:57同じ。
聞きたいのは、(*mjd)[3] じゃないの?
0584デフォルトの名無しさん
2008/07/04(金) 18:00:35できます
0585デフォルトの名無しさん
2008/07/04(金) 18:01:21アドレスを渡せば可能
ありがとうございます
0588デフォルトの名無しさん
2008/07/04(金) 18:14:41ポインタについて詳しく勉強することをオススメする
0589デフォルトの名無しさん
2008/07/04(金) 18:37:23できる。ただし、配列はすぐにポインタに成り下がるので、
引数に配列を指定したときに実際に関数に渡るものは
その配列の先頭要素へのポインタである。多次元配列の場合、
(一つ次数の低い)配列へのポインタが渡される。
func(int array[2][4][5]) という宣言は int の3次元配列を
受け取ることを期待しているが、実際に渡されるのは
その先頭の要素つまり int [4][5] へのポインタである。
最初の array[2] の部分は常に *array と書いたのと
同じように処理される。[] の中の数字は関係ない。
array[][4][5] と書いても同じである。
そしてこの array を使って、もとの配列の各要素に
array[1] のようにしてアクセスすることができる。つまり、
さらに下位の配列要素に対しても array[1][0][3] のように
アクセスすることができる。
ただし、ここで array はポインタであって配列ではないので、
sizeof 演算子や & 演算子を作用させたときの挙動は異なる。
0590デフォルトの名無しさん
2008/07/04(金) 18:41:25array[][4][5]というふうに受け取る場合に、array[1][0][3]とアクセスできるようになるのは
何のおかげなんですか?
*arrayとして受け取るとサイズが分からないのでarray[1][0][3]のようなアクセスはできないですよね。
ポインタにはできないはずのことができているように見えるのに、やっぱりポインタなんでしょうか?
0591デフォルトの名無しさん
2008/07/04(金) 18:59:460592デフォルトの名無しさん
2008/07/04(金) 19:20:03以下のような記述はアリなんでしょうか?
int (*arr)[4][5];
arr = malloc(4 * sizeof(*arr));
0593デフォルトの名無しさん
2008/07/04(金) 19:21:50どのように記述するのが正しい(もしくは一般的)ですか?
0594デフォルトの名無しさん
2008/07/04(金) 19:25:570595デフォルトの名無しさん
2008/07/04(金) 19:31:41いろいろ出てきましたが、
多次元配列を動的に確保しつつ、それが連続した領域であり、添え字によるアクセスが可能な方法
について記述されたサイトはありますか?
0596デフォルトの名無しさん
2008/07/04(金) 19:31:47sizeofに実体のない参照を渡すことできたっけ?
0597デフォルトの名無しさん
2008/07/04(金) 19:33:02見つからないなら、一般的でないということだ
0598デフォルトの名無しさん
2008/07/04(金) 19:33:500599デフォルトの名無しさん
2008/07/04(金) 19:35:11??
一回自分でやってみなよ
全部満たしてるはずだけど
0600デフォルトの名無しさん
2008/07/04(金) 19:36:040601デフォルトの名無しさん
2008/07/04(金) 19:51:54freeやallocエラーについては省いてあります。
int **arr;
int row_num = 7, col_num = 8;
int i, j;
arr = malloc(row_num * sizeof(int *));
for (i=0; i<row_num; i++) {
arr[i] = malloc(col_num * sizeof(int));
for (j=0; j<col_num; j++) {
arr[i][j] = i * col_num + j;
}
}
for (i=0; i<row_num; i++) {
for (j=0; j<col_num; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
for (i=0; i<row_num * col_num; i++) {
printf("%d ", *(arr[0] + i));
if (i % col_num == col_num - 1) {
printf("\n");
}
}
逆に、連続領域を確保するために malloc(row_num * col_num * sizeof(int)); などとすると
添え字によるアクセスができなくなりますよね。
これらを解決できる方法について知りたいのですが。。
0602デフォルトの名無しさん
2008/07/04(金) 19:55:33なんで?
mallocの戻りアドレスはvoid*なのでキャストすればOKなんじゃ?
0603デフォルトの名無しさん
2008/07/04(金) 19:57:570604デフォルトの名無しさん
2008/07/04(金) 19:58:17分散コンピューティング的なもので、
0605デフォルトの名無しさん
2008/07/04(金) 19:58:41int *arr;
arr = malloc(row_num * col_num * sizeof(int));
として、
arr[1][3] というアクセスは可能ですか?
>>595にも書いてありますが、動的に連続領域を確保しつつ添え字でアクセスできるのかどうかを知りたいんです。
連続領域でなければ、それはmemcpyなどにも使用できないということですよね?
0606デフォルトの名無しさん
2008/07/04(金) 19:58:500607デフォルトの名無しさん
2008/07/04(金) 20:05:21すみません、不勉強でした。
以前読んだものの、すっかり忘れていました。あらためて読み直そうと思います。
0608デフォルトの名無しさん
2008/07/04(金) 20:06:10領域が連続であることと、2次元以上の添字でアクセスできることとは別のこと。
mallocで確保した領域は連続
>>605の方法で確保した領域にarr[1][3]としてはアクセスできない。
RTFFAQ
0609デフォルトの名無しさん
2008/07/04(金) 20:06:240610デフォルトの名無しさん
2008/07/04(金) 20:12:06はい。もっと理解して、次はちゃんとないものねだりできるようにしてきます。
>>609
不連続領域です。
0611デフォルトの名無しさん
2008/07/04(金) 20:15:21a = malloc(2 * sizeof *a);
a[1][3] = 0;
0612デフォルトの名無しさん
2008/07/04(金) 20:16:464が固定です。
というかFAQむしかえしてしまってほんとごめんなさい。
0613デフォルトの名無しさん
2008/07/04(金) 20:18:52むり。
0614デフォルトの名無しさん
2008/07/04(金) 20:21:00つまり本来の意味での多次元配列として作成することはできなくなる。
ポインタの配列を用いて多次元配列をまねる方法を使うこと。
0615デフォルトの名無しさん
2008/07/04(金) 20:22:470616デフォルトの名無しさん
2008/07/04(金) 20:26:270617デフォルトの名無しさん
2008/07/04(金) 20:26:47だから、できるとFAQに
>>614>>615
はい。まさに、です。C99でも大丈夫ですかね。
0618デフォルトの名無しさん
2008/07/04(金) 20:29:11>>615がいっていることの意味が分かってるのか?
a[j][i]の代わりに、*(a + row_size * j + i)
と書くということだぞ。
0619デフォルトの名無しさん
2008/07/04(金) 20:30:26あれ?ほんとですね。
じゃあ、
>>617
そうではなくて、添え字でやれることを理解しました。
0620デフォルトの名無しさん
2008/07/04(金) 20:30:320621デフォルトの名無しさん
2008/07/04(金) 20:33:00なんとなくです。では忍びないので
array[][4][5]
という表記をみて、各次元のサイズが不定な多次元配列を動的に確保するには
どうしたもんかと思ったからです。
で、思いついた方法では連続領域にならなかったのがなんだかつまらなかったからです。
0622デフォルトの名無しさん
2008/07/04(金) 20:34:26連続領域として割り付けて、多次元配列をまねたポインタの配列の各要素を注意深くその領域の妥当な位置を指させる
0623デフォルトの名無しさん
2008/07/04(金) 20:34:54#include<stdio.h>
#include<stdlib.h>
#define ROW 10
#define COLUMN 5
int main(void){
int **data, *data_area;
int i;
data_area=malloc(sizeof(*data_area)*ROW*COLUMN);
data=malloc(sizeof(*data)*COLUMN);
for(i=0;i<COLUMN;i++) data[i]=&data_area[i*ROW];
printf("%d\n", data[2][3]);
free(data[0]);
free(data);
return 0;
}
0624デフォルトの名無しさん
2008/07/04(金) 20:36:01わざわざありがとうございます。
0625デフォルトの名無しさん
2008/07/04(金) 20:36:43>>622の方法を使う。
ただし関数の宣言はfunc(int ***arr)みたいになる
0626デフォルトの名無しさん
2008/07/04(金) 20:37:37あとは構造体を使って良いなら数が決まってる部分を構造体にしてみるとか
0627デフォルトの名無しさん
2008/07/04(金) 20:40:12コンパイラの気持ちになってみてよ。そしたらもっと気持ちよくなるから。
0628デフォルトの名無しさん
2008/07/04(金) 22:42:27この中に医療に関わるプログラムを作っている人はいますか?
0629デフォルトの名無しさん
2008/07/04(金) 22:48:51作ってるよ
0630デフォルトの名無しさん
2008/07/04(金) 22:53:03他の電子機器の影響で誤動作する可能性に備えて
同じ計算を複数回行って多数決とるとか
それともECCメモリ使うだけとか
コンピュータを電磁波を通しにくい素材で覆うとかの
ハードウェアよりの対策のみなのか
0631デフォルトの名無しさん
2008/07/04(金) 22:54:000632デフォルトの名無しさん
2008/07/04(金) 22:54:470633デフォルトの名無しさん
2008/07/04(金) 23:02:47現状はまだ、基本的にハードウェアで対策して
見るドクターが数字に誤差を加味してるのがほとんどだと思う
0634デフォルトの名無しさん
2008/07/04(金) 23:04:16たいてい問題は計測データのノイズのほうだから
0635デフォルトの名無しさん
2008/07/04(金) 23:16:580636デフォルトの名無しさん
2008/07/04(金) 23:40:050637デフォルトの名無しさん
2008/07/04(金) 23:44:27ありえなくいらい質が低くて、そのシステムを導入してる病院にはいかないようにしてる。
0638デフォルトの名無しさん
2008/07/04(金) 23:56:35なにかいい対策はありませんか?
0639デフォルトの名無しさん
2008/07/04(金) 23:58:19int main(void){
char x[]="123456789";
printf("%s %s %s %s %s %s %s %s %s\n"
,x[0],x[1],x[2],x[3],x[4]
,x[5],x[6],x[7],x[8]);
return 0;
}
これって何で動かないんでしょうか?
0640デフォルトの名無しさん
2008/07/04(金) 23:58:45あとは適度な休憩およびストレッチ
0641デフォルトの名無しさん
2008/07/04(金) 23:59:24動くとは思うが、多分望んでいる動作にするには%sを%cにする
0642デフォルトの名無しさん
2008/07/05(土) 00:04:240643デフォルトの名無しさん
2008/07/05(土) 00:05:000644デフォルトの名無しさん
2008/07/05(土) 00:06:170645デフォルトの名無しさん
2008/07/05(土) 00:09:00%cの方が可能性は高いと思うがね。
0646デフォルトの名無しさん
2008/07/05(土) 00:09:03ありがとうございます
%cにしたら解決しました
>>643をやってみたらなんか興味深い実行結果になりましたね
0647デフォルトの名無しさん
2008/07/05(土) 00:09:250648デフォルトの名無しさん
2008/07/05(土) 00:30:510649デフォルトの名無しさん
2008/07/05(土) 01:22:25この俺様が猛烈に解説してやろう。
まず、
char x[]="123456789";
この文で行っていることを分解して考えてみる。
[]とは添字演算子であって、例えばx[5]と書くと、*(x+5)と同じ意味になるといったものだ。
つまりこれを付けることによってポインタを意味することとなるわけだ。
よって
char *x="123456789"
と書き換えることができる。ここでxはポインタ、つまりアドレスを格納する変数であり、
そのアドレスの中身がchar型だということになる。
次に"123456789"は""で囲まれているために文字列リテラルと呼ばれ、その名の通り文字の列である。
文字列には、その終端に\0というヌル文字というものが必要であり、
文字列を操作する関数はこのヌル文字を発見すると文字列がそこで終了するのだと認識できる。
一見すると、上記の宣言においてヌル文字はどこにも見当たらない。
しかし「文字列リテラル」として""で囲っているために、自動的に付加されたのだ。
つまり実際にはx[0]=1, x[1]=2, ... ,x[7]=8, x[8]=9, x[9]=\0という値が代入されていることになる。
ここで一つ気になることがあるかもしれない。
どうしてxにはアドレスが格納されるべきなのに、まるで文字列が格納されているように見えるのか。
これは"123456789"という表記の実際の意味に関係してくる。
文字列リテラルとして""で囲って書いた場合は、メモリのどこかにデータとしてその文字列が書き込まれ、
その先頭アドレスが返される。つまり「"123456789"」というものは、文字列123456789が書き込まれた場所の
先頭アドレスを意味しているのだ。だからポインタ型であるxに直接代入できる。
これでこの行の説明は終わり。printfの説明に移る。
続く
0650デフォルトの名無しさん
2008/07/05(土) 01:23:37数を出力したかったら%d、文字を出力したかったら%c、といったもので、これらは変換指定子と呼ばれる。
さて、ではここで使われている変換指定子の一種である%sとは一体どのようなものか。
%sは、与えられた変数の値をアドレスだと認識して、
そこに格納されている文字から始まる文字列を表示するものである。
このプログラムでは、例えば%sに対してx[0]を対応させている。しかしx[0]は'1'という値であり、アドレスではない。
printf("%s",x[0]);としてしまうと、x[0]の値を無理矢理アドレスとして読み込んでしまうので、
結局無意味な場所を読み込んでいることになるので、思った通りの動作にはならない。
ここで>>643を見てみると、x[0]に&が付いて、&x[0]となっている。
これは何を意味するか。これは、x[0]が存在する場所のアドレスを示している。
%sにはアドレスを渡すべきなので、このようにするとうまく動作する。
しかしまだ気がかりなことがあると思う。どうして一文字ずつ表示されるのではなく、連続して数字が表示されるのか。
その答えは、%sがどういった動作をするものかをよく考えてみればわかってくるだろう。
%sは渡されたアドレスから始まる「文字列」を表示させるものだった。そして文字列とは、先も述べた通り\0で終わるものだ。
printf("%s",&x[0])とした時に何が起こっているかというと、x[0]、つまり1から始めて\0までを連続して表示させている。
決してx[0]の一つだけを表示させるものではない。そういう役割は%cが担っている。
ここで\0はx[9]に格納されているわけだから、結果的にx[0]からx[9]までを順に表示させていることになる。
あとは同じように考えればわかるはず。例えばprintf("%s",&x[5]);ならば、x[5]から始まり\0のx[9]までが順に表示される。
これで大体わかってもらえたと思う。わからなかったらもう一度聞いてくれれば誰かが答える。
0651デフォルトの名無しさん
2008/07/05(土) 01:34:57うそを
0652デフォルトの名無しさん
2008/07/05(土) 01:38:19乙
0653デフォルトの名無しさん
2008/07/05(土) 01:44:16乙
0654デフォルトの名無しさん
2008/07/05(土) 01:53:18>よって
>char *x="123456789"
>と書き換えることができる。
これはひどい
0655デフォルトの名無しさん
2008/07/05(土) 02:20:21> わからなかったらもう一度聞いてくれれば誰かが答える。
これでさらにひっくりかえった
乙
0656デフォルトの名無しさん
2008/07/05(土) 02:27:340657デフォルトの名無しさん
2008/07/05(土) 02:40:210658デフォルトの名無しさん
2008/07/05(土) 02:50:000659デフォルトの名無しさん
2008/07/05(土) 02:56:320660デフォルトの名無しさん
2008/07/05(土) 02:58:47何も問題が無いなら省こうと思って
0661デフォルトの名無しさん
2008/07/05(土) 03:02:01終了まで解放する必要が無い
=
終了までfreeする必要が無い
解放する=freeする
だから
終了までfreeする必要が無い変数を使って問題ありませんか?
という問いになると、一概に言えない。
OSを占有的に使うことが出来るプログラムならば、バンバン
使っても大丈夫だろうが、そうでない場合は、そうとも限らないことが
あるが、最近は、スタックの使い方のほうが影響が大きい。
0662デフォルトの名無しさん
2008/07/05(土) 03:12:23ちょっと理解できないです。
プログラムの終了まで使う変数なので、終了時に自動的に解放してくれるならfreeを書く必要がないなと思っているのですが、
freeしないまま終了してしまうと何か影響がでるのかなと不安なので質問させてもらいました。
けど、やっぱり書けばいいだけなので書く事にしようと思います。
返答ありがとうございました。
0663デフォルトの名無しさん
2008/07/05(土) 03:25:43ちょいちょいそれは議論になるよ
個人的には実行時間がそれほど長くないアプリケーションであればOS任せでいいと思ってる。
対極にある常駐プロセスなんかはもちろん随時freeすべき
0664デフォルトの名無しさん
2008/07/05(土) 03:35:16殆どのOSの場合、mallocは自分のプロセスのメモリ空間に割り当てるものだから
プロセスが終了した時点で、freeしてなくとも、OSにメモリの所有権/使用権が戻される。
しかし環境によっては、共有領域からの割当を意味する場合もある。
その場合は、そのプロセスが終了しても、共有領域には、使用中という状態
のままになってしまうかも。オーナーのプロセスの存否を調べて、修復して
くれるようなメカニズムがそういう場合は用意されてはいるのだろうが、
あまり期待も出来ない。
C言語は一応、様々な環境を想定しているので、malloc,freeだから
一概に〜であるということは出来ない。
が、unix系OS(windowsも含む)なら、まずfreeしなくても大丈夫
malloc したらfreeをきちんと書けという言われる理由は、malloc/freeの
対応を取ることが難しくリークを起こすようなコードには変数の使い方が下手などの
問題があることが多いからであり、リファクタリングを促す意味であることが
多い。
>>663
freeをやたらと使うとヒープの断片化が発生しやすくパフォーマンス
に影響が出てくることがあると聞く。
freeが幾らきちんと出来ていても、瞬間的にでも凄い量のスタックを使ったり
すると、むしろそちらのほうがOSに影響が出やすい。
0665デフォルトの名無しさん
2008/07/05(土) 03:39:40freeしなくて終了しても、動作にはなんら問題なないです。
だけど、自分でfreeすることを薦めます。
今後、途中でfreeする必要があるプログラムを作成することを考えて
自分で後始末をする習慣をつけておいたほうがよいからです。
ひとつだけなら簡単ですが、たくさんmallocしているプログラムでは
freeするのはやっかいですよ。安全なコードっを書くには、スキルと経験が要ります。
0666デフォルトの名無しさん
2008/07/05(土) 04:26:44終了時に「ま、mallocしてるんだからfreeしなさいよ!」と怒られてしまいました
これは警告ですか?脅迫ですか?それともツンデレとか言うやつですか?
0667デフォルトの名無しさん
2008/07/05(土) 04:29:310668デフォルトの名無しさん
2008/07/05(土) 04:32:27いつの間にかフォーマットされて何も入ってないHDDがからから回し続けるようになる。
これだとヤンデレですか。
0669デフォルトの名無しさん
2008/07/05(土) 04:37:05>プログラムがfreeしないまま終了した場合、OSがかわりにfreeしてくれるので
OSがfree関数を呼び出してくれるようなことは無い。
Java仮想マシンでは、freeに相当する処理をしなくても、有効な変数にバインドされて
いないオブジェクトは自動的にfreeに相当する処理をしてもらえて、再利用される
ことは有名な話。
それと混同されたのかなと一瞬思った。
0670デフォルトの名無しさん
2008/07/05(土) 04:40:23うそを
0671デフォルトの名無しさん
2008/07/05(土) 05:06:46共有メモリーならばOSはfreeするだろうけど、ヒープ領域はコードやスタック領域とおなじで
プロセスが死ねば自動的に消滅ってことか?
ヒープに対する特別な後処理はOSはしないということか。
なるほど。
0672デフォルトの名無しさん
2008/07/05(土) 05:11:09一般的にOSがプロセスのコードを勝手に呼び出すことは普通無い。
0673デフォルトの名無しさん
2008/07/05(土) 09:50:54みなさんはメモリのフラグメント化をどのように解消していますか?
0674デフォルトの名無しさん
2008/07/05(土) 10:08:550675デフォルトの名無しさん
2008/07/05(土) 10:11:510676デフォルトの名無しさん
2008/07/05(土) 10:17:36int len = 512;
int done = len < sizeof(buf);
以下のコードがどのような処理をしているのかが分かりません。
int done = len < sizeof(buf);
0677デフォルトの名無しさん
2008/07/05(土) 10:21:41この場合 512 > sizeof(buf) だから doneには0が代入される。
0678デフォルトの名無しさん
2008/07/05(土) 10:22:43len < sizeof(buf) と言う式は1 を返す
そうでなければ0 を返す
その値でdone を初期化してる
0679デフォルトの名無しさん
2008/07/05(土) 10:36:43malloc/freeを何度も実行しない。
0680デフォルトの名無しさん
2008/07/05(土) 11:16:000681デフォルトの名無しさん
2008/07/05(土) 11:22:02フラグメント化により、利用できないことがある。
0682デフォルトの名無しさん
2008/07/05(土) 11:23:42疑問に思ったら自分で試してみるんだ
環境依存、実装依存だしな
#include<stdio.h>
#include<stdlib.h>
int main(void){
char *p;
int i;
for(i=10;i<(1<<20);i*=2){
p=malloc(i);
printf("%d %p", i, p);
free(p);
p=malloc(i);
printf(" %p\n", p);
free(p);
}
return 0;
}
0683デフォルトの名無しさん
2008/07/05(土) 11:24:36malloc/freeはそこをちまちま使ってるだけでしょ?
ヒープサイズ超えるとまたOSに再要求して大きなヒープに変えるのかな?
mallocサイズが決まってるんであれば
リスト構造にでもして使用中リストと未使用リストでつなぎ変えだけするとか
0684デフォルトの名無しさん
2008/07/05(土) 13:53:130685デフォルトの名無しさん
2008/07/05(土) 14:14:06ヒープそのものの領域はOSからもらう。
0686デフォルトの名無しさん
2008/07/05(土) 16:40:430687デフォルトの名無しさん
2008/07/05(土) 16:45:390688デフォルトの名無しさん
2008/07/05(土) 16:47:130689デフォルトの名無しさん
2008/07/05(土) 16:48:090690デフォルトの名無しさん
2008/07/05(土) 16:49:190691デフォルトの名無しさん
2008/07/05(土) 17:02:330692デフォルトの名無しさん
2008/07/05(土) 17:03:220693デフォルトの名無しさん
2008/07/05(土) 17:12:250694デフォルトの名無しさん
2008/07/05(土) 18:55:01稼ぎでやるほど本格的にはやってない。稼ぐなら
もっと本格的にやるが、研究機関には敵わない。
むしろ、もっと稼ぎやすいもので稼いで、こういった分野も取り込んで
商売として雇った方が楽、自分が直接やるよりは。
世の中、そんなもん。
0695デフォルトの名無しさん
2008/07/05(土) 18:57:410696デフォルトの名無しさん
2008/07/05(土) 19:04:03ある程度できるのなら外注に出すより安上がりだけどな
0697デフォルトの名無しさん
2008/07/05(土) 19:07:440698デフォルトの名無しさん
2008/07/05(土) 19:11:480699デフォルトの名無しさん
2008/07/05(土) 19:13:44freeしてみる。
0700デフォルトの名無しさん
2008/07/05(土) 19:14:340701デフォルトの名無しさん
2008/07/05(土) 19:19:22ランタイムライブラリのデバッグ関係ヒープ関数にあったと思う。俺も知りたいから解ったらレポートしてくれ。
0702デフォルトの名無しさん
2008/07/05(土) 19:34:06#include <stdlib.h>
int *test(void){
int *p;
*p = 100;
fprintf(stdout, "2 %d\n", *p);
return p;
};
int main(void){
int *x;
*x = 0;
fprintf(stdout, "1 %d\n", *x);
test();
fprintf(stdout, "3 %d\n", *x);
return 0;
}
実行結果が下のようになりました
1 0
2 100
3 100
test()ではxを使ってないのに、*xに100が代入されてるのはなぜでしょうか?
0703デフォルトの名無しさん
2008/07/05(土) 19:46:100704デフォルトの名無しさん
2008/07/05(土) 19:48:070705デフォルトの名無しさん
2008/07/05(土) 19:48:17未初期化ポインタの指す先が偶然一緒だっただけ
やっちゃダメですw
0706デフォルトの名無しさん
2008/07/05(土) 19:48:19コンパイラはbccです
0707デフォルトの名無しさん
2008/07/05(土) 19:49:32わかりました�d
0708デフォルトの名無しさん
2008/07/05(土) 20:36:530709デフォルトの名無しさん
2008/07/05(土) 20:40:140710デフォルトの名無しさん
2008/07/05(土) 20:55:50と初期化値を指定した時
array_nの配列の内容がarray_n[0] == 1で、
初期化値の指定が無い残りが全て(array_n[1]〜array_n[9])が「0」で埋まるのはC言語の規格上そうなっているのですか?
それともコンパイラによっては[1]〜[9]は不定値のままだったりする?
0711デフォルトの名無しさん
2008/07/05(土) 21:08:590712デフォルトの名無しさん
2008/07/05(土) 21:12:49古いコンパイラなら不定値が入っている可能性が高い
0713デフォルトの名無しさん
2008/07/05(土) 21:20:29比較的新しい規格で決められた事なので
>>711 も >>712 も正しい
0714デフォルトの名無しさん
2008/07/05(土) 21:27:590715デフォルトの名無しさん
2008/07/05(土) 21:36:020716デフォルトの名無しさん
2008/07/05(土) 21:58:06pccはどうだったんだろう?
0717デフォルトの名無しさん
2008/07/05(土) 22:03:10できるだけ使う直前で初期化した方がいい
0718デフォルトの名無しさん
2008/07/05(土) 22:08:58釣りはいいから
0719デフォルトの名無しさん
2008/07/05(土) 22:13:41つか, static に取った奴は .bss に置かれるから, 処理系依存で 0 で埋められる
組み込みもんで boot が遅いってので .bss の初期化やめたシステムがあったが
逆に boot が遅くなったって笑い話がつい最近あった.
0720デフォルトの名無しさん
2008/07/05(土) 22:14:160721デフォルトの名無しさん
2008/07/05(土) 22:18:100722デフォルトの名無しさん
2008/07/05(土) 22:18:33変数宣言
情報セキュリティ対策の一括した初期化
(memset,ヌルクリア) コード上の分離された箇所での明確な処理が必要)
初期値設定
主処理コード
を取る形態が多いが、主処理コードの後にも、情報セキュリティコード(ヌルクリア)
も入れたほうが良い。(大抵の業務用コードではそれは入っていない)
呼び出し側のバグによって、作業データが漏洩する可能性があるから
0723デフォルトの名無しさん
2008/07/05(土) 22:19:050724デフォルトの名無しさん
2008/07/05(土) 22:22:010725デフォルトの名無しさん
2008/07/05(土) 22:24:15そういうことをやってるところが多いかどうかはしらない。
コンパイラの機能として、自動で、使われなさそうな値で埋めてくれるのとかそういうのはいいと思う。
0726デフォルトの名無しさん
2008/07/05(土) 22:24:410727デフォルトの名無しさん
2008/07/05(土) 22:26:11コンパイラが警告を出すときには変数宣言時に初期化してる
0728デフォルトの名無しさん
2008/07/05(土) 22:26:58でも処理系依存じゃないよ。
まともな処理系は0が入る。
0729デフォルトの名無しさん
2008/07/05(土) 22:33:48Cみたいにブロックの先頭でしか宣言できない言語は、使う直前で初期化。宣言と同時には初期化しない。
0730デフォルトの名無しさん
2008/07/05(土) 22:43:100731デフォルトの名無しさん
2008/07/05(土) 22:44:590732デフォルトの名無しさん
2008/07/05(土) 22:48:060733デフォルトの名無しさん
2008/07/05(土) 22:49:50とにかく値を使う前に正しく入ってればいい
大切なのはまちがいを減らすことで、
有効なのはどっちにするのかを決めておくこと
どっちが正しいのかということではない
0735デフォルトの名無しさん
2008/07/05(土) 23:01:020736デフォルトの名無しさん
2008/07/05(土) 23:06:35宣言同時初期化は、処理ロジックを誇張する傾向が高いが、全体から見てそのモジュールの
処理ロジック(役割)が堅くなりすぎる傾向があり、嫌う人も居る。
コード部冒頭の同時一括初期化コードは情報セキュリティー対策をソースコード上で明示的に行う
無駄なコード。関数のリターン前に不要な変数のクリアを同時に行わないと無意味
0737デフォルトの名無しさん
2008/07/05(土) 23:07:42show(string &s,int n)が文字列sの位置nより右の組み合わせを表すとして
forと再帰でバックトラックさせようと考えてます
↓このプログラムだとabcの順列6個のうちcabだけ表示できないのですが
最後の詰めがうまくいきません。
どのようにすれば良いでしょうか
void show(string& s,int n){
if(s.size()-1==n){cout << s << endl;}
for(int i=n;i<s.size();++i){
if(i==n){ show(s,n+1);}
else{swap(s[n],s[i]);show(s,i);swap(s[n],s[i]);}
}
}
int main(){ string v="abc";show(v,0); }
0738デフォルトの名無しさん
2008/07/05(土) 23:17:07まずスレタイを凝視する
0739デフォルトの名無しさん
2008/07/05(土) 23:18:560740デフォルトの名無しさん
2008/07/06(日) 00:40:450741デフォルトの名無しさん
2008/07/06(日) 00:46:03http://pc11.2ch.net/test/read.cgi/tech/1124559962/
細かいことは気にするな
0742デフォルトの名無しさん
2008/07/06(日) 02:08:09結論
モジュールの分化性が嫌であり、なおかつスタックやヒープに変数を割り付けることによる
情報漏洩が嫌いな奴はBASICでも使ってろ。
0743デフォルトの名無しさん
2008/07/06(日) 02:37:04htaもあるが、そもそもぺたぺた貼ってつくれるじゃん
0744デフォルトの名無しさん
2008/07/06(日) 02:45:270745デフォルトの名無しさん
2008/07/06(日) 02:46:190746デフォルトの名無しさん
2008/07/06(日) 02:49:150747デフォルトの名無しさん
2008/07/06(日) 02:52:36キーワードをありがとう。XAMLでした。
0748デフォルトの名無しさん
2008/07/06(日) 03:55:280749デフォルトの名無しさん
2008/07/06(日) 08:59:52処理系はそうは思っていないようですよ。
宣言に現れる = は、配列を初期化する = を除いて、
その出現順を保ちながら宣言の直後に書かれているかのように扱われ。
0750デフォルトの名無しさん
2008/07/06(日) 09:11:200751デフォルトの名無しさん
2008/07/06(日) 09:14:550752デフォルトの名無しさん
2008/07/06(日) 13:38:45なぜか執拗に実装の話をしたがるのがいるな
0753デフォルトの名無しさん
2008/07/06(日) 17:40:29typedef struct{
〜メンバ〜
}ABC;
ABC *abc;
char *str;
〜処理〜
abc = (ABC*)&str; //←これ
0754デフォルトの名無しさん
2008/07/06(日) 17:42:050755753
2008/07/06(日) 17:44:34↑のような処理があったのですが、コメントをつけてる部分がコンパイル時に警告が出ています。
この部分は何をしようとしているのでしょうか?
また、このようなコードを書くメリットやよくある使い方を知ってる方が居たら教えてください。
0756デフォルトの名無しさん
2008/07/06(日) 17:44:38質問をどうぞ
0757デフォルトの名無しさん
2008/07/06(日) 17:45:43static char a='a';
static char z=a-'a'+'z';
多分これコンパイルとおらない。
宣言同時初期化は基本的にはサービスだと思ったほうがいいのかも知れない。
0758753
2008/07/06(日) 17:47:24&をつけるとポインタのアドレスって意味でしょうか?
また、書き忘れましたが
abc = (ABC*)&str[1];
というパターンもありました。[1]にする意味もご存知でしたら教えてください。
0759デフォルトの名無しさん
2008/07/06(日) 17:47:27それじゃあchar型のポインタ strのアドレスを本来はABCという構造体を
指すポインタabcに入れてるからじゃないの?
0760デフォルトの名無しさん
2008/07/06(日) 17:49:080761デフォルトの名無しさん
2008/07/06(日) 17:51:050762デフォルトの名無しさん
2008/07/06(日) 17:52:04どっちかというと新人研修用のお題にしか見えない
0763デフォルトの名無しさん
2008/07/06(日) 17:52:57のコードで警告でる?
0764デフォルトの名無しさん
2008/07/06(日) 17:53:310765デフォルトの名無しさん
2008/07/06(日) 17:54:41str = &str[0] ですよ。
あと strに"abcde\0"が入っているとして
printf("%s",str); はabcdeが出力され
printf("%s",&str[1]); はbcdeが出力される。
0766753
2008/07/06(日) 17:55:02ポインタもよく分かってません。
>>759
なぜstrは構造体ではなくchar型のポインタにする必要があったのでしょうか?
0767759
2008/07/06(日) 17:57:11ABCという構造体でこちらは見たいんだけど
もらってくる際はchar型のアドレスの場合
はそうやるのかなあ?とか
0768デフォルトの名無しさん
2008/07/06(日) 17:57:44才能やセンスとか関係ない入門レベルの知識が不足しているようです。
0770デフォルトの名無しさん
2008/07/06(日) 17:59:06最近のCコンパイラは、それが宣言された時に指す「型」が異なるポインタ変数の
チェックを厳格にするようになり、「型」が異なるものには警告を出すように
なっている。良いか悪いかは分からないが、そのような場合を避けるようにコーディング
することは出来るし、実際それが避けられない場合は、コード設計に大きな問題が
あることが多い。
struct であるABCという型へのポインタと&strの型であるchar **は一般的には関連づけ
ることは考えにくい。
0771デフォルトの名無しさん
2008/07/06(日) 17:59:29アドレスを+1したかったんだろ
0772デフォルトの名無しさん
2008/07/06(日) 18:00:440773デフォルトの名無しさん
2008/07/06(日) 18:01:19char*にキャストするやつがいてもおかしくはない。
0774デフォルトの名無しさん
2008/07/06(日) 18:02:39じゃあ、構造体はどうやって読み書きするのが正しいの?
0775デフォルトの名無しさん
2008/07/06(日) 18:05:35〜メンバ〜
}ABC;
ABC *abc;
char *str;
〜処理〜
abc = (ABC*)&str;
これってさ
strでもらってくるのってABC構造体を配列にした連続領域ってことじゃねーの?
[1]の付けるのがあるって段階でなんかそんなにおいがする
0776デフォルトの名無しさん
2008/07/06(日) 18:05:44char*でよんでそのアドレス渡すとか、キャストして読み込むのでは?
0777753
2008/07/06(日) 18:06:21処理内容は全く把握してません。
やはり勉強不足のようです。もう少し勉強します。
0778デフォルトの名無しさん
2008/07/06(日) 18:09:43freadはvoid*だろ。
0779デフォルトの名無しさん
2008/07/06(日) 18:09:49そのまま
abc = (ABC *)str;
として扱えばいいんじゃねーの?
でstr指す領域がABC構造体の配列であれば
abc[1]->xxxxとかでみればいいんだし
0780デフォルトの名無しさん
2008/07/06(日) 18:10:22そうだった
0781779
2008/07/06(日) 18:11:390782デフォルトの名無しさん
2008/07/06(日) 18:12:54構造体の配列の可能性ですか・・・。
調べてみます。ありがとうございます。
>>779
すごく分かりやすい説明ありがとうございます。
やはりポインタの概念が理解不足でした。
0783デフォルトの名無しさん
2008/07/06(日) 18:15:20ちょっとまえにやってた仕事で、socketで通信するのに生のintを送ってて、
エンディアンの違う環境になったからバグったってのがあったな。
char[4]にコピーして、順序を入れ替えて、またintにコピーするって方法で回避してた。
このバグに対応するのに、1日かかったって言ってたし、これから先も、二つの
バージョンのソースを管理する必要があるし、通信の入門書の一冊でも読んでれば、
こんな無駄は回避できてるのになぁ。とオモタ。
0784デフォルトの名無しさん
2008/07/06(日) 18:16:57某金融機関でダウンしたのはそれかーーー
といってみるテスト
0785デフォルトの名無しさん
2008/07/06(日) 18:29:41何で htol()等々、を使わんの?
0786デフォルトの名無しさん
2008/07/06(日) 18:33:04入門書の一冊も読んでないからだろ。
0787デフォルトの名無しさん
2008/07/06(日) 18:33:33Cコンパイラ
ハードウェア(メモリ)
それらの性質を良く調べないと、データ転送は成立しない。(w:
0788デフォルトの名無しさん
2008/07/06(日) 18:35:19実数や整数(これが違うことはまれだが)のフォーマットもあわせとかないと
いけないからいろいろ面倒。
新しいものほどキャラクターベースでやり取りするものが増えてる。
0789デフォルトの名無しさん
2008/07/06(日) 18:40:180790デフォルトの名無しさん
2008/07/06(日) 18:45:56ファイルフォーマットを調べて自分で読み込むとかしないから、>>774みたいな疑問をもっちゃうんだろうね。
便利になってるんで、おれもその方向性でいいと思ってるけど。
0791デフォルトの名無しさん
2008/07/06(日) 19:12:580792デフォルトの名無しさん
2008/07/06(日) 19:16:220793デフォルトの名無しさん
2008/07/06(日) 19:20:08日本では書籍の地位が低いのかなんだか知らないが消え行くばかり
まともな技術書は残すような政策がないものかな?
もちろん濫造入門書は対象外で
0794デフォルトの名無しさん
2008/07/06(日) 19:22:08構造体の読み書きをfreadとfwriteを使わないでどうやってやるの?
0795デフォルトの名無しさん
2008/07/06(日) 19:35:52ちなみに、構造体の読み書きは read/write で簡単にできる。
0796デフォルトの名無しさん
2008/07/06(日) 19:43:29どっちかっていうと、車輪よりもコロの方が多いんだけど。
ほんとに車輪を作れるプログラマは数えるほどしかいない気がする。
0797デフォルトの名無しさん
2008/07/06(日) 19:48:01電文を構造体に詰めるときとか
0798デフォルトの名無しさん
2008/07/06(日) 19:50:160799デフォルトの名無しさん
2008/07/06(日) 19:56:38%1d 上記と同じだけど1桁だけ
0800デフォルトの名無しさん
2008/07/06(日) 19:58:12マルチ&意味不明
scanf
printf
その他
お前の考えてることなんて分からない
分かるように説明しろ
0801デフォルトの名無しさん
2008/07/06(日) 20:00:41理解しました!thx!!
0802デフォルトの名無しさん
2008/07/06(日) 20:04:33最小幅が1になるだけだから同じだと思うけどどうなんでしょ。
0803デフォルトの名無しさん
2008/07/06(日) 20:05:070804デフォルトの名無しさん
2008/07/06(日) 20:05:120805デフォルトの名無しさん
2008/07/06(日) 20:06:50学校でvisual studio2008というのを使ってC言語の勉強をしてるんですが
家でもちょっと練習できたらなーと思ったのですが
無料でC言語ができるソフトとかってあるんでしょうか?
うちのPCは一般的なXPのPCです。
お願いします
0806デフォルトの名無しさん
2008/07/06(日) 20:08:060807デフォルトの名無しさん
2008/07/06(日) 20:09:30ttp://www.microsoft.com/japan/msdn/vstudio/Express/
ttp://www.mingw.org/
0808デフォルトの名無しさん
2008/07/06(日) 20:13:310809デフォルトの名無しさん
2008/07/06(日) 20:23:04ありがとうございます!
さっそくインストールしてます!
MSから無料の物も出てるんですね〜!
0810デフォルトの名無しさん
2008/07/06(日) 20:33:570811デフォルトの名無しさん
2008/07/06(日) 20:49:170812デフォルトの名無しさん
2008/07/06(日) 21:12:28ttp://jp.youtube.com/watch?v=I6TNMk_nq-8
0813デフォルトの名無しさん
2008/07/06(日) 21:21:08それが許されないのは静的変数が定数でしか初期化できないからで
宣言と同時の初期化が本来的ではないこととは関係ないだろ
0814デフォルトの名無しさん
2008/07/06(日) 21:31:170815デフォルトの名無しさん
2008/07/07(月) 00:11:350816デフォルトの名無しさん
2008/07/07(月) 00:13:000817デフォルトの名無しさん
2008/07/07(月) 00:13:58標準ライブラリの大きさ?
0818デフォルトの名無しさん
2008/07/07(月) 00:50:580819デフォルトの名無しさん
2008/07/07(月) 00:57:11CよりC++の方が遅いの?
0820デフォルトの名無しさん
2008/07/07(月) 01:00:52一般的に、高機能なものほど処理は遅くなる
0821デフォルトの名無しさん
2008/07/07(月) 01:17:550822デフォルトの名無しさん
2008/07/07(月) 01:51:560823デフォルトの名無しさん
2008/07/07(月) 01:53:31一概には言えないとは言え、ライブラリにおいても
高水準と低水準とでは、高水準の方が扱う変数が増えて
まぁほぼ一瞬で終わる処理とはいえ、必要の無いものまで
抱えている分、必要な領域、処理時間には差が出るもんさ。
0824デフォルトの名無しさん
2008/07/07(月) 01:55:10使用するに当たって、必要としない部分も含まれている
可能性がある、といった感じ。まぁ、すべて使うなら
それはそれで低水準では逆に手間や手順が増えてしまうがね。
0825デフォルトの名無しさん
2008/07/07(月) 05:45:20プログラマの腕次第で高水準のと同じになるだけじゃないか?
たいていのへぼプログラマでは、そうはいかないだけで。
0826デフォルトの名無しさん
2008/07/07(月) 17:52:070827デフォルトの名無しさん
2008/07/07(月) 18:01:590828デフォルトの名無しさん
2008/07/07(月) 18:03:21decimalとやらの仕様を入手し、アルゴリズムを検討して必要なライブラリなどを入手し、
然る後に徐に実装すれば宜しかろう。
0829デフォルトの名無しさん
2008/07/07(月) 18:05:16if(0 == 1 >> 1) fprintf(stdout, "LE\n");
0830デフォルトの名無しさん
2008/07/07(月) 18:15:060831デフォルトの名無しさん
2008/07/07(月) 18:15:30ビッグエンディアンだろうがリトルエンディアンだろうが1は1だろ。
0832デフォルトの名無しさん
2008/07/07(月) 18:18:09*(char*)&x とかね。
0833デフォルトの名無しさん
2008/07/07(月) 18:53:23リトルエンディアンだと1は
00000000 00000000 00000000 00000001
右シフトして
00000000 00000000 00000000 00000000 = 0
ビッグエンディアンだと
00000001 00000000 00000000 00000000
右シフトして
00000000 10000000 00000000 00000000 ≠ 0
ってことだと思ったんだけど・・・
0834デフォルトの名無しさん
2008/07/07(月) 18:58:15ビックエンディアン
あくまでエンディアンが関係するのはメモリなんかに格納する場合の話
0835デフォルトの名無しさん
2008/07/07(月) 18:58:45シフトする場合はレジスタに取り出すので
0836デフォルトの名無しさん
2008/07/07(月) 19:08:590837デフォルトの名無しさん
2008/07/07(月) 20:15:280838デフォルトの名無しさん
2008/07/07(月) 20:19:45フラグ情報のビットが入り込んできたりするんだよね。
Cのシフトはあいたところは0埋めみたいだけど。
0839デフォルトの名無しさん
2008/07/07(月) 20:27:19> ビットがループした
一般にローテート命令と言う
あると暗号系のソフトの最適化がらくちん
0840デフォルトの名無しさん
2008/07/07(月) 20:34:19算術シフトか論理シフトかは処理系依存であってCだからどうだということではないよ
0841デフォルトの名無しさん
2008/07/07(月) 20:36:28Cの右シフト演算は、符号なし値に対しては常に左から0を詰める
符号あり値に対して1を詰めるか0を詰めるかは処理系依存
0842デフォルトの名無しさん
2008/07/07(月) 20:56:060843デフォルトの名無しさん
2008/07/07(月) 21:03:43ほぼすべてがそういう実装になってて
そのうち後追いで規格化される
0844デフォルトの名無しさん
2008/07/07(月) 21:04:210845デフォルトの名無しさん
2008/07/07(月) 21:08:22http://aitech.ac.jp/~koikelab/webp/prog/prog3/prog2005/prog3-07_a03.html
Z80
http://www.systemax.jp/doc/Z80_inst.html
代表的なCPUのリンクだけ
0846デフォルトの名無しさん
2008/07/07(月) 21:19:050847デフォルトの名無しさん
2008/07/08(火) 00:54:550848デフォルトの名無しさん
2008/07/08(火) 01:02:020849デフォルトの名無しさん
2008/07/08(火) 01:46:520850デフォルトの名無しさん
2008/07/08(火) 01:48:42俺は具体例なんかどうでもよくて処理系依存にならない書き方するだけだけど
0851デフォルトの名無しさん
2008/07/08(火) 02:11:46ttp://japan.renesas.com/
記憶が不確かだったから確認したが、SHのコンパイラは「負の値を持つ符号付きスカラ型の右シフトの結果は符号ビットを保持」というのが仕様になってる
ってことで、こいつは算術シフト
でも、signedでシフトって怖いからunsignedでしか使ったことない
0852デフォルトの名無しさん
2008/07/08(火) 09:39:211. For 文を使って、次の図形を表示しなさい。
*
***
*****
*******
*********
***********
*************
2. scanf 文を使ってキーボードから10人の得点データを入力し、11番目のデータはー999とする。そして、while 文を使って、この10人の得点の平均点を求めよ。
3. 2次元配列を使って、6人の身長と体重をstatic データで入力し、それぞれの平均を求め、次のような表をつくれ。P75参照。
平均
身長 165 156 173 163 159 168
体重 45 48 54 56 49 55
4.ピタゴラスの定理を満たす1から100までの整数のうち、3つともが偶数になるものを出力せよ。for文とif文を使う。
5.自分の生まれた月の今年のカレンダーを作れ。printf文と改行の使い方。P55を参照。
0853デフォルトの名無しさん
2008/07/08(火) 09:51:470855デフォルトの名無しさん
2008/07/08(火) 11:00:55別なファイル(ab.c)に書き込むプログラムを作りたいのですが、
どうもうまくいきません。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
char temp;
fp = fopen("ab.c", "w");
while((temp = getc(fp)) != NULL) { putc(temp , fp); }
fclose(fp);
}
ab.cが作成されているので、while文に間違いがあるのだと思いますが、
どうすれば動くようになるのでしょうか?
0856デフォルトの名無しさん
2008/07/08(火) 11:07:56何がどう上手くいかないか言葉にしてみ。
自ずと分かるはず
0857デフォルトの名無しさん
2008/07/08(火) 11:11:04getc(fp) != NULL
ってやるより特定の記号タイプで終了にしたほうがいいんじゃね?
0858デフォルトの名無しさん
2008/07/08(火) 11:51:44http://cham.ne.jp/piro/p_stdfunc.html
1ページにまとまってて,頭に目次,関数毎にプロトタイプと一行説明
がついてたとても使いやすいとこだったんだけど
0859858
2008/07/08(火) 11:59:32自レス
http://web.archive.org/web/*/http://cham.ne.jp/piro/p_stdfunc.html
0860デフォルトの名無しさん
2008/07/08(火) 13:12:18もう一度、自分の書いたコードが何をやっているのかを注意深く読み直すこと。
やりたいことは、あるファイルから1文字ずつ読み取って別のファイルに1文字ずつ書き出すことである。
そのコードは、ファイル ab.c を「書き出し」モード "w" でオープンし、そこから1文字ずつ「読み取り」、
さらにそこへ1文字ずつ書き出そうとしている。これは何かの間違いでしか上手くいかない。
なお、while((temp = getc(fp)) != NULL) も間違いである。
getc(FILE *stream) は stream から1文字ずつ読み取って値を int 型にして返し、
stream の終わりに達したときやエラーが発生したときに EOF を返す。
だから通常は EOF を検出して入力の終了とするが、この EOF は、
通常読み取られる文字( unsigned char )の範囲に含まれない場合があり、
これをすぐ char に代入してしまったら、EOF ではない何か別の値になってしまうかもしれない。
そうなると終わりを検出することができなくなって無限ループとなる危険性がある。
正しいコードは以下のようになる。
int temp;
while((temp = getc(fp)) != EOF) { ……
0861デフォルトの名無しさん
2008/07/08(火) 14:14:38まず、環境は コンパイラは VC6.0 OSはXP です
以下のコードを見てください(コメントは気にしないでください)
#include <stdio.h>
/* 外部変数として変数を宣言 */
long di; /* long型 */
char ch; /* char型 */
int i[3]; /* int型の配列 */
char *p; /* char型のポインタ */
int *ip; /* int型のポインタ */
int main()
{
/* 各変数のアドレスとサイズの表の表示 */
printf("┃変数(配列要素)| アドレス | サイズ ┃\n");
printf("┃ di | %p | %3d ┃\n", &di, sizeof(di)); /* long型変数のアドレスとサイズを表示 */
printf("┃ ch | %p | %3d ┃\n", &ch, sizeof(ch)); /* char型変数のアドレスとサイズを表示 */
printf("┃ i | %p | %3d ┃\n", i, sizeof(i)); /* int型配列の要素全体のアドレスとサイズを表示 */
printf("┃ p | %p | %3d ┃\n", &p, sizeof(p)); /* char型のポインタ変数のアドレスとサイズを表示 */
printf("┃ ip | %p | %3d ┃\n", &ip, sizeof(ip)); /* intr型のポインタ変数のアドレスとサイズを表示 */
printf("\n");
return 0;
}
このようにすると、プログラムを弄る度に(printf分を追加する等)変数のアドレスが変化するのですが、
それを変化させないようにするやりかたがあるそうなのですが、本当でしょうか
あればやり方を教えてください
意味がないかもしれませんが、私に課題として与えられていることなのです
0862デフォルトの名無しさん
2008/07/08(火) 15:03:220863デフォルトの名無しさん
2008/07/08(火) 15:06:43どのくらいあるんだ?
0864デフォルトの名無しさん
2008/07/08(火) 15:13:180865デフォルトの名無しさん
2008/07/08(火) 15:13:19いや、この場合はプログラム内から見えるアドレスだからOSは関係ない
VCでどうやるか知らんけどコンパイラの設定である程度固定できるはず
ほとんど意味ないがな
0866デフォルトの名無しさん
2008/07/08(火) 15:25:32printf追加したくらいじゃ動かんと思うけど、、、
メモリをファイルマッピングしてMapViewOfFileExでアドレス指定して
変数割り当てる、とか?
0867デフォルトの名無しさん
2008/07/08(火) 15:29:33>メモリをファイルマッピングしてMapViewOfFileExでアドレス指定して
>変数割り当てる、とか?
もうこんなことをしないといけない時点で教材用の題材じゃないことは明白だよな。
出題したやつ頭おかしいとしか思えん。
0868デフォルトの名無しさん
2008/07/08(火) 15:36:12共有メモリとかの話でもないのかなあ
0869デフォルトの名無しさん
2008/07/08(火) 15:37:50多少はプログラムサイズ非依存性が高まる。
元のプログラムでも、順序関係とかはそんなに変わらない筈なんだが
コンパイラ/リンカの都合でこういうのは決定できる(静的データの先頭アドレスの決定権
=コンパイラ/リンカ)
他にも隠された静的データ沢山あるだろうしね。特にWin32では。
0870デフォルトの名無しさん
2008/07/08(火) 15:53:31ん、「bssを固定するリンカオプションを調べとけ」って事じゃないの。
0871デフォルトの名無しさん
2008/07/08(火) 16:01:51p_______q______p&&q______p||q______ !p
0_______0________0__________0_________1
0_______1________0__________1_________1
0_______1________0__________1_________1
1_______1________1__________1_________0
1_______0________0__________1_________0
ハーバード・シルト著/トップスタジオ訳/柏原正三監修 『独習C 第4版』 翔泳社 57ページより
上の表の意味がさっぱり分からないのですが、論理学か数学かに出てくるのでしょうか。
しばらくスルーしても大丈夫?
0872871
2008/07/08(火) 16:02:330873デフォルトの名無しさん
2008/07/08(火) 16:20:23以下同様
0874デフォルトの名無しさん
2008/07/08(火) 16:42:12ありがとうございました。
0875デフォルトの名無しさん
2008/07/08(火) 18:21:34数Aとかで習ったような
AND演算とOR演算で調べてみな
0876デフォルトの名無しさん
2008/07/08(火) 18:27:47論理演算子説明するのにこんな表使う意味あるのか。
0877デフォルトの名無しさん
2008/07/08(火) 18:29:290878デフォルトの名無しさん
2008/07/08(火) 19:12:14大きさを超えてしまったらなにがおきますか?
0879デフォルトの名無しさん
2008/07/08(火) 19:12:460880デフォルトの名無しさん
2008/07/08(火) 19:14:19何が起きてもよいですが、何も起こらないかもしれません。
0881デフォルトの名無しさん
2008/07/08(火) 19:18:48s2が指す文字列を、s1が指す配列の最後に連結する。戻り値は、s1の値である。
また、コピー先とコピー元が重なる場合の動作は未定義とする。
バッファオーバーラン
strcatは、s1の容量に就いては一切関知しない。よって、s1の指す配列の範囲を越
えて、s2が書き込まれてしまう恐れがある。これによって、メモリ破壊を引き起こしたり、
プログラムがクラッシュしてしまうことがある。バッファオーバーランを防ぐ方法の1つ
として、字数制限付き文字列連結関数であるstrncatを使う。
0882デフォルトの名無しさん
2008/07/08(火) 19:23:39ありがとうございます
0883デフォルトの名無しさん
2008/07/08(火) 19:49:37配列c[k]の成分を全て書き出すようなプログラムなんですが
以下ではどうもうまくいきません!
どこが違うのでしょうか・・・
int i,k;
double x,c[k];
for(i=0;i<=100000;i++)
{
x=0.3;
x=4*x*(x-1);
for(k=0;k<=999;k++)
{
if(0.001*k<x && x<0.001*(k+1))
{
c[k]++;
printf("%lf",c[k]);
0884デフォルトの名無しさん
2008/07/08(火) 19:55:01double c[k];
この書き方がまず出来ない
配列を宣言する時は要素数を確定してなければならない
0886デフォルトの名無しさん
2008/07/08(火) 20:05:20>字数制限付き文字列連結関数であるstrncatを使う
strncat(char *s,const char *t,int length)
C2008では、この関数は非常にインテリジェントになっており、
sの後ろに何文字書き込めるか、知らない場合はプログラム作成者
の携帯にメールを出してチェックしてくれるそうです。
lengthがsの後の有効書き込み可能メモリのサイズを超えた値を指定してみて下さい。
tの有効読み込み可能メモリサイズを超えたときもメールを出してくれるそうです。
いい時代になったものです。
0887デフォルトの名無しさん
2008/07/08(火) 20:20:15ステレオのwavの左チャンネルから右チャンネルを引いてモノラル化して
センターキャンセルするという単純なアルゴリズムです。
ただ減算しただけだと、出来上がったモノラルファイルを聞くと、たまにブチブチノイズが入ってしまいます。
ためしに減算した値に0.6を掛けてみたらノイズが消えました。
原因はオーバーフローでしょうか?0.6をかける処理っていうのは正しいことなんですか?
データの型はsigned shortです。
0888デフォルトの名無しさん
2008/07/08(火) 20:23:33char text[]="ababdeabababbabababab";
char pattern[]="abababa"; // 検索する文字列
int next[M]; // パターン検査用
検索する文字列の長さが不定だった場合、
現時点で自分は、nextをその都度検索する文字列の長さ分をmallocなりで確保しようと思っているのですが、
int next[M];はどのようにするのがベストですか?
0889デフォルトの名無しさん
2008/07/08(火) 20:28:59その質問の仕方じゃわからん
やり直し
0890デフォルトの名無しさん
2008/07/08(火) 20:32:38最初っから微妙に配列作ってないで必要な分だけmallocすれば良いんじゃないのか?
0891デフォルトの名無しさん
2008/07/08(火) 20:46:36KMP法による文字列検索です。
0892デフォルトの名無しさん
2008/07/08(火) 21:48:35いちいちallocするかの二択
0893デフォルトの名無しさん
2008/07/08(火) 23:15:19質問させて頂いてもよろしいでしょうか?
0894デフォルトの名無しさん
2008/07/08(火) 23:18:410895デフォルトの名無しさん
2008/07/08(火) 23:30:08GUI開発環境で、CPad for Borland C++Compiler ってのを使ってます。
それでコマンドプロンプトを起動しgcc -v と入力したら gcc version 4.3.0 20061021 というのが表示されるんですが、
これがコンパイラのバージョンを表してるんですか?
0896デフォルトの名無しさん
2008/07/08(火) 23:36:160897デフォルトの名無しさん
2008/07/09(水) 00:00:29wavとか全然知らんくせにレスさせてもらうが
> 原因はオーバーフローでしょうか?
チェック文入れてみたらどうでしょう?
abort(SHORT_MIN <= l - r || l - r <= SHORT_MAX);
> 0.6をかける処理っていうのは正しいことなんですか?
オーバーフローが無いことを保証するなら 0.5 をかけるべきなんじゃないかな
違ってたらゴメンね
0898デフォルトの名無しさん
2008/07/09(水) 00:17:25以下、typeA,typeBは任意の型とします。
typedef struct {
typeA a;
typeB b;
structC c;
} incC;
typedef struct {
typeA a;
typeB b;
structD d;
} incD;
typedef struct {
typeA a;
typeB b;
union {
structC c;
structD d;
} x;
} incX;
と定義したとします。
このとき、incCへのポインタ を incX へのポインタ(pX)にキャストしたら
pX->x.c.membern
で incCのcのメンバに正しくアクセスできることは確約されていますか?
0899デフォルトの名無しさん
2008/07/09(水) 00:48:13やはりオーバーフローしてるところがあります。下にも上にもですね
short型にdouble掛けてもいいんでしょうか?
0900デフォルトの名無しさん
2008/07/09(水) 01:07:11できない。
そもそもキャストできない。
incC*とincX*の大きさが違う可能性がある。
0901デフォルトの名無しさん
2008/07/09(水) 01:09:28気持ち悪いなら/2でいいだろ。
0902デフォルトの名無しさん
2008/07/09(水) 01:25:59それでも小数点以下切捨てされちゃうのが・・・
いいのかな?と
0903898
2008/07/09(水) 02:02:26レスありがとうございます。
大きさが違うとキャストできないってのがピンときません。
typedef struct {
int len;
char str[1];
} Str;
Str *str = (Str*)malloc(sizeof(Str) + ...);
はOKなのですよね・・・?
0904デフォルトの名無しさん
2008/07/09(水) 02:07:31本当か?w
すごいいい時代になったな。何故strcpyでそれもやってくれないんだ?多分それstrcpyでも
やってくれるよ。
0905デフォルトの名無しさん
2008/07/09(水) 02:13:43俺は保証されるように思う。あくまでも思うなので他の人のフォローに期待。
んで、キャストできないなんて事はないよ。
0906デフォルトの名無しさん
2008/07/09(水) 02:15:19正しくアクセス出来ることを確約はされていないだろうが
0907デフォルトの名無しさん
2008/07/09(水) 02:20:010908デフォルトの名無しさん
2008/07/09(水) 03:24:150909デフォルトの名無しさん
2008/07/09(水) 03:31:150910デフォルトの名無しさん
2008/07/09(水) 03:36:15最大のメンバの末尾に合わせてつめるような処理系とかあるのかな?
もしそうなら保証できないね
っていうか規格スレのほうが詳しいと思う
0911デフォルトの名無しさん
2008/07/09(水) 07:45:482つの値を返す方法ってありますか?
int ○○(void)ではreturnで1つの値しか返せないと思うのですが
void ○○でできる方法があるのでしょうか?
0912デフォルトの名無しさん
2008/07/09(水) 07:47:570913デフォルトの名無しさん
2008/07/09(水) 07:52:410914デフォルトの名無しさん
2008/07/09(水) 07:59:27void func(int *a, int *b)
{
printf("関数に入りました\n");
*a = *a + 1;
*b = *b + 3;
}
int main()
{
int x = 0, y = 0;
printf("x = %d y = %d\n", x, y);
func(&x, &y);
printf("x = %d y = %d\n", x, y);
return 0;
}
とでも書けば結果を x, y ともに返せてることが分かると思う
0915デフォルトの名無しさん
2008/07/09(水) 08:03:02>>910そんな処理系聞いた事無いけど、ある?
0916デフォルトの名無しさん
2008/07/09(水) 08:05:43失礼した。
0917デフォルトの名無しさん
2008/07/09(水) 09:05:030918デフォルトの名無しさん
2008/07/09(水) 09:05:560919デフォルトの名無しさん
2008/07/09(水) 09:07:310920デフォルトの名無しさん
2008/07/09(水) 09:07:490921デフォルトの名無しさん
2008/07/09(水) 09:46:08struct ID
{
int Mushoku;
int Doutei;
int Hikikomori;
int KanojoInaiReki;
};
void func(ID *id)
{
id->Mushoku = TRUE;
id->Doutei = TRUE;
id->Hikikomori = TRUE;
id->KanojoInaiReki = NENREI;
}
int main()
{
ID id;
func(&id);
printf("シコシコ…ああっ、いいお、いいお、足も胸もおなかもかわいいお…"\
"イッルたん最高だお…シコシコ…そろそろイクお……ウッ!");
}
0922デフォルトの名無しさん
2008/07/09(水) 10:01:400923デフォルトの名無しさん
2008/07/09(水) 10:02:310924デフォルトの名無しさん
2008/07/09(水) 10:14:26現在の双方向リスト用ポインターの配置
typedef struct hogehoge HOGEHOGE;
struct hogehoge
{
int hogeint01;
〜
int hogeint02;
struct hogehoge *prevdata;
struct hogehoge *nextdata;
}
こちらに変更するとリストから切断する際に失敗してるようでフリーズします。
typedef struct hogehoge HOGEHOGE;
struct hogehoge
{
struct hogehoge *prevdata;
struct hogehoge *nextdata;
int hogeint01;
〜
int hogeint02;
}
どういう原因が考えられるでしょうか?
領域の確保はプログラム起動時に構造体サイズxn mallocで確保しています。
0925デフォルトの名無しさん
2008/07/09(水) 10:18:54今までは切断する処理がたまたま動いていただけ、かな?
最小限の再現ソースを見せてってよくいうのはそういうことです。
0926デフォルトの名無しさん
2008/07/09(水) 10:20:300927924
2008/07/09(水) 10:32:05まず登録切断部分
void Entry(HOGEHOGE* wfp)
{
if (fpEntTy == NULL) {
fpEntTy = wfp;
wfp->prevdata = NULL;
wfp->nextdata = NULL;
fpEntTyLast = wfp;
} else {
fpEntTyLast->nextdata = wfp;
wfp->prevdata = fpEntTyLast;
wfp->nextdata = NULL;
fpEntTyLast = wfp;
}
EntTyCout++;
return;
}
void Del(HOGEHOGE* wfp)
{
if (wfp == fpEntTy) fpEntTy = wfp->nextdata;
if (wfp == fpEntTyLast) fpEntTyLast = wfp->prevdata;
if (wfp->prevdata) wfp->prevdata->nextdata = wfp->nextdata;
if (wfp->nextdata) wfp->nextdata->prevdata = wfp->prevdata;
EntTyCout--;
return;
}
起動時に構造体サイズxn mallocしたあとn回Entry関数でリスト化してます。
0928デフォルトの名無しさん
2008/07/09(水) 10:34:16そうしてます。
以前ちょっとはまった経緯があるのでmakeの最後にコンパイル時に生成したxxx.oなどは
削除するようにしてありますので常にフルコンパイル常態なんです。
0929デフォルトの名無しさん
2008/07/09(水) 10:36:58これは
p=(HOGEHOGE *)malloc(sizeof(HOGEHOGE)*n);
Entry(p);
Entry(p+1);
Entry(p+2);
:
Entry(p+n-1);
という意味?
0930デフォルトの名無しさん
2008/07/09(水) 10:39:15そうですね。
0931デフォルトの名無しさん
2008/07/09(水) 10:39:480932デフォルトの名無しさん
2008/07/09(水) 10:40:570933デフォルトの名無しさん
2008/07/09(水) 10:42:12:
} else {
fpEntTyLast->nextdata = wfp;
wfp->prevdata = fpEntTyLast;
ここを見ると奇妙な事をしているな。 双方向リストの仕様は何だ?
0934デフォルトの名無しさん
2008/07/09(水) 10:44:46デバッガもしくはprintfで途中経過見てる?
0935デフォルトの名無しさん
2008/07/09(水) 10:46:09んでもそれならDelの処理は
if (wfp == fpEntTy) fpEntTy = NULL;
if (wfp == fpEntTyLast) fpEntTyLast = NULL;
だけでもよさそうに思うし、別に今のでも大丈夫に見える
0936デフォルトの名無しさん
2008/07/09(水) 10:47:22落ち着け
0937デフォルトの名無しさん
2008/07/09(水) 10:47:34fpEntTy側からのアクセスの場合、終端にはnextdataにNULLが入ります。
fpEntTyLast側からのアクセスの場合、終端にはprevdataにNULLが入ります。
Entry関数はもらった構造体を一番最後につけます。
0938デフォルトの名無しさん
2008/07/09(水) 10:47:49if (wfp == fpEntTy) fpEntTy = wfp->nextdata;
if (wfp == fpEntTyLast) fpEntTyLast = wfp->prevdata;
が、
if (wfp == fpEntTy) fpEntTy = NULL;
if (wfp == fpEntTyLast) fpEntTyLast = NULL;
でよさそうなのに、ってことです。
ちなみにNULLはどのように定義されていますか?
0939デフォルトの名無しさん
2008/07/09(水) 10:48:470940デフォルトの名無しさん
2008/07/09(水) 10:49:40いいから落ち着け
まだ要素が残ってたらどうするんだ
0941デフォルトの名無しさん
2008/07/09(水) 10:50:280942デフォルトの名無しさん
2008/07/09(水) 10:50:46デバッグしたことないのか?
0943デフォルトの名無しさん
2008/07/09(水) 10:51:49fpEntTyLast->nextdata = wfp;
wfp->prevdata = fpEntTyLast;
wfp->nextdata = NULL;
fpEntTyLast = wfp; // これなに?
}
0944デフォルトの名無しさん
2008/07/09(水) 10:52:32oops
ひどくつかれているようだorz
ほんと、ごめん。
0945デフォルトの名無しさん
2008/07/09(水) 10:52:45>>938
>if (wfp == fpEntTy) fpEntTy = NULL;
>if (wfp == fpEntTyLast) fpEntTyLast = NULL;
これをやってしまうと、要素が残ってるかもしれないのに
リストを切断してしまうのでダメです。
なので今のようなロジックにして、登録の際に両端の構造体にはNULLを入れることを
保証すればOKなんです。
0946デフォルトの名無しさん
2008/07/09(水) 10:54:41とかしてんのかな
0947デフォルトの名無しさん
2008/07/09(水) 10:54:45fpEntTy = wfp->nextdata;
fpEntTy->prevdata = NULL;
}
if (wfp == fpEntTyLast) {
fpEntTyLast = wfp->prevdata;
fpEntTy->nextdata = NULL;
}
が要るんじゃないのか? バグ原因かも知れないがな。
0948デフォルトの名無しさん
2008/07/09(水) 10:54:46名前にレス番入れろ
0950デフォルトの名無しさん
2008/07/09(水) 10:55:580951デフォルトの名無しさん
2008/07/09(水) 10:56:29いや、ここだけに絞って欲しい
fpEntTyLast = wfp; // これなに?
0952デフォルトの名無しさん
2008/07/09(水) 10:56:51*prevdata, *nextdata が領域外アクセスして(されて) ポインタ値が壊れているんじゃないの?
int hogeint01 … ってあるけど、実は配列があって、範囲外書き込みしてるだけとかさ
0953デフォルトの名無しさん
2008/07/09(水) 10:57:060954デフォルトの名無しさん
2008/07/09(水) 10:57:51最後の要素を指してるだけだからおちつけってw
0955デフォルトの名無しさん
2008/07/09(水) 10:57:58寝ろ
0956>>924
2008/07/09(水) 10:59:44いやだから・・・
fpEntTy側から見た最後が変わったのでfpEntTyLastも更新しないと・・・・
双方向リストをご存知?
>>952
中に配列はないです。
構造体サイズの調整用の予備charはありますが使ってません。
0957デフォルトの名無しさん
2008/07/09(水) 11:01:130958デフォルトの名無しさん
2008/07/09(水) 11:03:01http://pc11.2ch.net/test/read.cgi/tech/1215568848/
0959デフォルトの名無しさん
2008/07/09(水) 11:04:51あ や し い
0960デフォルトの名無しさん
2008/07/09(水) 11:05:260961デフォルトの名無しさん
2008/07/09(水) 11:10:00fpEntTyLast = wfp->prevdata;
fpEntTyLast->nextdata = NULL;
かな
0962デフォルトの名無しさん
2008/07/09(水) 11:10:38アロケーション時 sizeof(HOGEHOGE) 使わずに 定数リテラル 使ってる悪寒
>>924
全ソース貼れorロダにあげろ
0963デフォルトの名無しさん
2008/07/09(水) 11:12:45ケアレスミス指摘あり
0964デフォルトの名無しさん
2008/07/09(水) 11:13:16fpEntTyLast->nextdata = NULL;はあってもなくても大丈夫に思うが、先頭削除時のはいるだろうね。
が、それが原因で永久ループになる事はなさそうに思うので、みんな言ってるように他の部分もうpするんだw
# 先頭のprevがNULLかどうか判定する事はないと思いたい
0965デフォルトの名無しさん
2008/07/09(水) 11:15:02突っこんでるやつは全員的外れ
0966デフォルトの名無しさん
2008/07/09(水) 11:19:15中間削除も行えるようだし、気になります
0967デフォルトの名無しさん
2008/07/09(水) 11:20:470968デフォルトの名無しさん
2008/07/09(水) 11:21:480969デフォルトの名無しさん
2008/07/09(水) 11:23:55それはないですw
ちゃんとsizeof(HOGEHOGE)*nで確保してます。
いやちょっとうpするにはサイズが大きいのと元はちょっとそのままあげるのはできないものなので・・・
0970デフォルトの名無しさん
2008/07/09(水) 11:24:590971デフォルトの名無しさん
2008/07/09(水) 11:25:21は無いだろ・・・
0972デフォルトの名無しさん
2008/07/09(水) 11:28:17悪さをすることがあるか?って聞いただけじゃね?
どつぼにハマるとそういう考えになることもあるよ。コンパイラのバグじゃね??とかさ。
0973デフォルトの名無しさん
2008/07/09(水) 11:29:27{ printf("%p\n", wfp); /* ←追加 */
と
アロケーション時に
p=(HOGEHOGE *)malloc(sizeof(HOGEHOGE)*n);
for (i=0; i<n; i++) printf("%p\n", p+i); /* ←追加 */
Del() 呼び出し時の アドレス比較だな
アロケーション時のアドレス以外の値が来てるなら、何処かのコードが値をぶっ壊してる
0974924 969
2008/07/09(水) 11:30:55ある箇所でリストを開放する際にまとめて取ったHOGEHOGEか1個単位でとったHOGEHOGEで扱いが違ってます。
そこが原因かなあ・・・とか思ってたりもします。
wfp = fpEntTy;
while(wfp) {
switch(HOGESwitch[wfp->Type](i,wfp)) {
case -1 :
if (wfp->prevdata == NULL) {
wfp2 = fpEntTy;
} else {
wfp2 = wfp->prevdata;
}
Del(i,wfp);
wfp = wfp2;
break;
case -2 :
if (wfp->prevdata == NULL) {
wfp2 = fpEntTy;
} else {
wfp2 = wfp->prevdata;
}
Del(i,wfp);
free(wfp);
wfp = wfp2;
break;
default :
break;
}
wfp = (HOGEHOGE*)wfp->nextdata;
}
0976デフォルトの名無しさん
2008/07/09(水) 11:39:33・先頭要素を削除したときは新しい先頭要素のprevをNULLにする
これやってもだめかな
0977924
2008/07/09(水) 11:42:52あーーーーそれぽいですねorz
wfp = fpEntTy;
while(wfp) {
switch(HOGESwitch[wfp->Type](i,wfp)) {
case -1 :
if (wfp->prevdata == NULL) {
wfp2 = fpEntTy;
wfp2->prevdata = NULL;
} else {
wfp2 = wfp->prevdata;
}
Del(i,wfp);
wfp = wfp2;
break;
case -2 :
if (wfp->prevdata == NULL) {
wfp2 = fpEntTy;
wfp2->prevdata = NULL;
} else {
wfp2 = wfp->prevdata;
}
Del(i,wfp);
free(wfp);
wfp = wfp2;
break;
default :
break;
}
wfp = (HOGEHOGE*)wfp->nextdata;
}
これが正解?
0978デフォルトの名無しさん
2008/07/09(水) 11:43:220979デフォルトの名無しさん
2008/07/09(水) 11:45:45それだと 『構造体のレイアウト変えたら動かなくなった』 の説明がつかないんじゃね?
元レイアウトであろうが、新レイアウトであろうが それが主因なら同じ挙動になると思うけど
0980デフォルトの名無しさん
2008/07/09(水) 11:50:170981デフォルトの名無しさん
2008/07/09(水) 11:54:54何でDel関数じゃなくてそこなおすんだろ?
んで、case -2はますます関係ないんじゃないの?
>>979
同じデータ操作をしてない場合、たまたまうまく動く場合とそうではない場合があるんじゃないかな
0982979
2008/07/09(水) 11:59:40それは、、、、 問題の切り分けができていないパターンだな
主因は "とあるデータ操作順"であって "構造体のレイアウト変更"は無関係 ってやつか
0983デフォルトの名無しさん
2008/07/09(水) 12:01:04wfp = fpEntTy;
while(wfp) {
switch(HOGESwitch[wfp->Type](i,wfp)) {
case -1 :
Del(i,wfp); // なんかiが増えてんね
break;
case -2 :
Del(i,wfp);
free(wfp);
break;
default :
break;
}
}
0984デフォルトの名無しさん
2008/07/09(水) 12:02:320986デフォルトの名無しさん
2008/07/09(水) 12:24:060988デフォルトの名無しさん
2008/07/09(水) 12:28:14ということでなくて、オリジナルもそうなってたのか?
0989924
2008/07/09(水) 12:31:01いえ、リスト用ポインタを構造体の最後に配置した場合は問題ありませんでした。
今回そのポインターを前に持ってきたので問題となったのでいろいろ試してる最中でして
0990デフォルトの名無しさん
2008/07/09(水) 12:34:22free(wfp);
wfp = wfp2;
freeして書き込んでるじゃん。
0991デフォルトの名無しさん
2008/07/09(水) 12:35:210992924
2008/07/09(水) 12:43:48wfp = wfp2;
としたら想定の動きするんです・・・・
ポインターを先頭に持ってくるとまずいんですかね?
ネットなんかの双方向リストのサンプルも大体構造体の最後に配置してますし・・・
0993デフォルトの名無しさん
2008/07/09(水) 12:45:130994デフォルトの名無しさん
2008/07/09(水) 12:48:03これでアレなら、開放されてるのに使ってる場所(or そこを参照するリンク) が残ってることになる
0995デフォルトの名無しさん
2008/07/09(水) 12:53:38=リスト構成本体を構造体末尾にもってったら、先頭側メンバの値が(いつのまにか)狂ってる
どっちにしてもちゃんと動いていないコードだ
0996デフォルトの名無しさん
2008/07/09(水) 12:57:420997デフォルトの名無しさん
2008/07/09(水) 13:08:02表に出せないようなソースなら職場の人間に聞け
0998デフォルトの名無しさん
2008/07/09(水) 13:08:33ウメス
0999デフォルトの名無しさん
2008/07/09(水) 13:25:19俺らエスパーでも予言者でもないんで何も判断できない
問題の起こるソースをそのまま見せられないなら自分でなんとかしろ
1000デフォルトの名無しさん
2008/07/09(水) 13:26:28http://pc11.2ch.net/test/read.cgi/tech/1215568848/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。