C言語なら俺に聞け(入門篇) Part 31

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいならこちらへ。
 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
2デフォルトの名無しさん:2008/06/27(金) 21:32:42
3デフォルトの名無しさん:2008/06/27(金) 21:33:39
4デフォルトの名無しさん:2008/06/27(金) 21:57:13
>>997
どういうことですか?教えてくだあさい。
5デフォルトの名無しさん:2008/06/27(金) 22:12:01
型が未定の要素へのポインタの配列へのポインタを作りたいのですがvoid **pでいいですか?
6デフォルトの名無しさん:2008/06/27(金) 22:13:13
>>5
はい
7デフォルトの名無しさん:2008/06/27(金) 22:28:51
「ポインタの配列へのポインタ」
厳密には
「ポインタの配列の先頭要素へのポインタ」
それはつまり
「ポインタへのポインタ」
8デフォルトの名無しさん:2008/06/27(金) 22:29:14
>>前スレ971
rand()%900+100 ってのは具体的に言うと rand()%(1000-100)+100

rand()%(a-b)+b でb〜a未満の数値が出る
9デフォルトの名無しさん:2008/06/27(金) 22:38:51
ポインタの配列へのポインタ void *(*p)[]
10デフォルトの名無しさん:2008/06/27(金) 22:38:51
>>5
「『型が未定の要素』へのポインタの配列」を「void *の配列」として作るならそれで合ってる
「『型が未定の要素へのポインタ』の配列」を「char *かlong *か決まってないが、何かのポインタの配列」で作るならただのvoid *になる
11デフォルトの名無しさん:2008/06/27(金) 22:41:57
Q 6.13
配列へのポインタをどうやって宣言するのか。

A
たいていは、そんなポインタを宣言したいのではない。
なにげなく配列へのポインターというときは、
たいてい配列の最初の要素へのポインターのことをいっているのである。

配列へのポインタではなく、配列の要素へのポインターを使うことを考えること。
型Tの配列は型Tへのポインタに成り下がる。これは都合がよい。
なぜなら結果としてできるポインターを使って添字つきで参照したり、
整数を加えることで配列の各要素にアクセスしたりできる。

これに対して、本当の配列へのポインタは、
添字つきで参照したり整数を加えると、配列全体を飛び越してしまう。
これではせいぜい配列の配列を扱うときにしか役立たない。

本当に配列そのものへのポインターが必要な場合は「int (*ap)[N];」のような表現を使う。
ここでNは配列のサイズを表す。配列の大きさがわからない場合、Nを省略することができる。
しかし 結果として得られる「大きさが未知の配列へのポインタ」は役に立たない。
12デフォルトの名無しさん:2008/06/27(金) 22:57:02
char型へのポインタを < で比較するソースがあったのですがどういう意味なのでしょうか?
13デフォルトの名無しさん:2008/06/27(金) 23:00:06
ポインタの大小を比較してるんだろ
14デフォルトの名無しさん:2008/06/27(金) 23:00:20
きっと連続した領域に対してみてるんだと思うけど、
アドレスを比較してる。それ以上はちょっと見てみないと。
15デフォルトの名無しさん: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)になる
16デフォルトの名無しさん:2008/06/27(金) 23:25:51
Quiz:
16bitの頃のCコンパイラなら兎も角、32bitコンパイラにおいては、
switch文のコンパイルでジャンプテーブルを作成して、実行時に
それをスキャンし、ジャンプするような最適化は為されることは
余りない。何故か?
17デフォルトの名無しさん:2008/06/27(金) 23:38:45
18デフォルトの名無しさん:2008/06/27(金) 23:44:08
>>16
ちょっとした分岐程度なら
ジャンプテーブルのメモリアクセスのコストの方が高くなるから?
19デフォルトの名無しさん:2008/06/27(金) 23:47:40
clock_t初めて見ました
面白そう
20デフォルトの名無しさん:2008/06/27(金) 23:58:40
>>17
どんなコードが出てるか見てごらん
21デフォルトの名無しさん:2008/06/28(土) 00:00:05
40くらいまで増やしたら差が激しく。
/O2スイッチつけたら両方とも0msでオワタ。HAEEEEE(違
22デフォルトの名無しさん:2008/06/28(土) 00:01:07
ifはわざわざご丁寧に else 以下も条件判定をする
switchはcaseに該当がなければdefaultへ
そこが無駄の差
23デフォルトの名無しさん:2008/06/28(土) 00:02:13
>>17
そのコードだとswitch文のほうは実は最適化が施されて何もしてないんじゃねーの?
ifのほうはご丁寧に20回まるまるやってるとか
24デフォルトの名無しさん:2008/06/28(土) 00:02:35
っと、ちと補足。
ifはわざわざご丁寧に、21以上でも最初から順に else if 以下も条件判定をする
25デフォルトの名無しさん:2008/06/28(土) 00:03:17
>>23
だからそれが必要の無い条件判定による処理時間の差に出ているんじゃん
26デフォルトの名無しさん:2008/06/28(土) 00:03:35
ちとは意味のある命令をいれとかないと最適化抑制してもだめだめだな。
意味のない足し算でもさせるか。
VC++系なら cl /FAsc hoge.cpp で
27デフォルトの名無しさん:2008/06/28(土) 00:14:20
任意の論理式を扱う ifと列挙型(int)の値比較に限られるswitch分岐を
比較すること自体が無意味というオチでした。
論理式がint値の値比較であることがif文の最適化の際に判明したら、
比較に関してはswitchと同じようにレジスタに持っておいた値と
コード上の固定値の比較に置換するので処理速度差が無くなりました。
というだけね。
28デフォルトの名無しさん:2008/06/28(土) 00:24:34
char *a;
で宣言したaに、関数で文字列を入力したらエラーになるのですがなぜでしょうか?
29デフォルトの名無しさん:2008/06/28(土) 00:27:21
>>28
それはchar型のポインターだから。
30デフォルトの名無しさん:2008/06/28(土) 00:32:37
始めまして、C言語の勉強を始めて半年ほどの者です。
トランプやUNOの様なカードゲームを作りたいと思うのですが、そういった物の作り方を順番に解説してくれている様なサイト、
もしくは本などを知らないでしょうか?
31デフォルトの名無しさん:2008/06/28(土) 00:33:21
*aだけだと、aがどこを指しているのか不定だから
32デフォルトの名無しさん:2008/06/28(土) 00:33:26
文字列は先頭文字のアドレスを表すから、char型ポインタに代入できるのかなと思ったんですが・・・ダメなんですかね?
33デフォルトの名無しさん:2008/06/28(土) 00:34:55
文字列の先頭アドレスを*aに代入するなら問題ない。
そうしてないとは思うけど。
34デフォルトの名無しさん:2008/06/28(土) 00:36:00
>>30
他の言語でもいいならサイト巡れば載ってると思う
大体やってることは一緒だし挑戦してみたら?
35デフォルトの名無しさん:2008/06/28(土) 00:37:34
>>32
char型にしろint型にしろポインタ宣言しただけだとアドレスを格納する入れ物
ができただけで、中身は不定。
36デフォルトの名無しさん:2008/06/28(土) 00:42:21
>>34
ありがとうございます。
少し別の言語の物を探してみます。
37デフォルトの名無しさん:2008/06/28(土) 00:46:24
文字列はリテラルされる(アドレス固定)
そのアドレスが入っている入れ物(変数)の中身を別のアドレスに移動しようとしたから、
おまえ、システム領域弄るんじゃないよ!
とACCESSVIOLATIONで怒られる。
>>33の言ってる*aは数値だから構わない。(参照ではなく代入)
38デフォルトの名無しさん:2008/06/28(土) 01:11:16
>>28 で宣言したaに、関数で文字列を入力したらエラーになるのですがなぜでしょうか
入力とは何?
a = "hoge";
とかなら大丈夫だろうけど
strcpy(a, "hoge");
はだめだよ。

>>32文字列は先頭文字のアドレスを表すから、char型ポインタに代入できるのかなと思ったんですが・・・ダメなんですかね?
文字列の方はconst charの「配列」です。

3938:2008/06/28(土) 01:12:27
誤字だった。
文字列の『型』はconst charの「配列」です。
40デフォルトの名無しさん:2008/06/28(土) 01:33:34
誰も関数にポインタをそのまま渡してる可能性を指摘しない件
41デフォルトの名無しさん:2008/06/28(土) 01:36:03
>>29がしてるじゃん

アドレス入れる器に文字入れればそりゃエラー起こられる罠
42デフォルトの名無しさん:2008/06/28(土) 01:53:53
>>41
そーじゃなくて

main()
{
43デフォルトの名無しさん:2008/06/28(土) 01:54:54
ミス

main()
{
 char *a;
 hoge(a);



hoge(char *a)
{
 a="HOGE";
44デフォルトの名無しさん:2008/06/28(土) 02:02:29
28がどうやったのかはっきりしない限りどれも想像でしかないけどな。
45デフォルトの名無しさん:2008/06/28(土) 02:05:47
亀だが if switch 検証。
if (j <= 20 && 1 <= j)
{
if (j == 1)
...
if (j == 20)
}
else
{
}
としたところifの方が速くなりました。
んで、if (1 <= j && j <= 20)にしたら比較のコストが大きくなって
ifの方がやや遅くなりました。
46デフォルトの名無しさん:2008/06/28(土) 02:33:17
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7114.c
範囲を指定しないなら、やっぱり switch はえー
47デフォルトの名無しさん:2008/06/28(土) 02:38:57
>>46
なんか初めてハッシュを知った新入りのような喜びようだなw
ほほえましくてイイヨーイイヨー
48デフォルトの名無しさん:2008/06/28(土) 02:55:37
>>47 意味不明。自分の理論の穴を突かれて涙目なんだろ?w
>>45
49デフォルトの名無しさん:2008/06/28(土) 02:59:29
>>48
ちがうちがう。
状況によってはifを使う方が速いこともあるよっていいたかっただけだ。
ついでに、条件文の書き方でも十分代わりうるということをいいたかった。

適した場面に適したコードを書くのは当たり前で、
switch(str)
{
case "hoge":
}
ってかけなくてswitchざまあなんて言い回しと同じように、
switchを使う方が良い場面においてif遅いなどというのはおろかなこと。
50デフォルトの名無しさん:2008/06/28(土) 03:05:58
初心者の頃にnyを使い始めて、ハッシュを知ってはしゃいだことのある
>>47 が可愛いよ皮良いよ
51デフォルトの名無しさん:2008/06/28(土) 03:09:39
>>50
なぜny?ハッシュが何を指しているか理解してない、のか?
さすがにないと思いたいんだが。
しっかり勉強しろよ?
52デフォルトの名無しさん:2008/06/28(土) 03:27:59
>>47
なんか初めてハッシュを知ったny厨のような喜びようだなw
ほほえましくてイイヨーイイヨー
53デフォルトの名無しさん:2008/06/28(土) 04:02:02
以上、チンパンジーのアイちゃんの自演でした。
54デフォルトの名無しさん:2008/06/28(土) 04:11:30
>>47 論破されて涙目だなwwww
ハッシュなんて持ち出すなら、なおさら指定範囲内の
数値に対する話は論外になるな。無関係な話ではあるが。
55デフォルトの名無しさん:2008/06/28(土) 04:26:16
>>47
茶化したつもりがハッシュなんて持ち出すから、さぁ大変。
ny厨乙。お前がそれを知って喜んでいたことの自己紹介ですか?
にしても、switch はえーなぁー、をいっw
56デフォルトの名無しさん:2008/06/28(土) 04:51:02
ハッシュとny厨に何の関係があるんだろう
57デフォルトの名無しさん:2008/06/28(土) 07:38:10
switchが早いのでこれからは
if (a == b) {
 // 処理
}

switch (a == b) {
case 1:
 // 処理
}
と書くようにします!
58デフォルトの名無しさん:2008/06/28(土) 08:19:48
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7115.txt
最適化かけまくりだと0msなんで加算処理を加えてみた。

s w i t c h 蠅ー
59デフォルトの名無しさん:2008/06/28(土) 10:32:34
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7119.txt

このプログラムにおいて、最初のほうで
BSTREE_NODE *deleteMinNode(BSTREE_NODE *p, BSTREE_K_TYPE *min);
BSTREE_NODE *deleteRootNode(BSTREE_NODE *p, BSTREE_K_TYPE x);

と書かなければいけない理由ってなんなんでしょうか?
消すとエラーが出るのに、*pや*minなどの値は変更してもエラーがでないのも意味がわかりません・・
60デフォルトの名無しさん:2008/06/28(土) 10:35:18
色々なC言語のコンパイラがありますがおすすめとかありますか?
61デフォルトの名無しさん:2008/06/28(土) 10:38:36
>>59
プロトタイプ宣言かな?

コンピューターは先頭から後ろにかけて順次処理してくのは
得意ですが、人間のようにソースを見渡して関数の宣言場所
と利用箇所を眺めてちゃんと定義されてるという確認ができない
ある意味融通が利かない人なのです。

なので関数を使ってる箇所よりその関数が後ろに定義されてる場合
はソースの先頭付近に関数の頭の部分を定義してコンパイラに
こんな関数があるよと先に結論を教えてあげます。

プロトタイプ宣言がいやなら関数を使ってるところより
先に関数を配置すればOKです
62デフォルトの名無しさん:2008/06/28(土) 10:42:07
>>60
windowsPC持ってるならVC++かVC#でいいんじゃないの?
Cygwinとかって環境構築ではまりそうだしね

>>61の続き
プロトタイプ宣言をしたくない?ようなソースはmain関数が
ソースの一番最後にあって、main関数より呼ばれるその他
関数が上置くようになってます。
6359:2008/06/28(土) 10:57:36
>>61
>>62

なるほど、ありがとうございます。
この宣言において、*minなどを違う文字に変更してもエラーが出ないのはどうしてなんでしょうか?
例えば
BSTREE_NODE *deleteMinNode(BSTREE_NODE *p, BSTREE_K_TYPE *min);

BSTREE_NODE *deleteMinNode(BSTREE_NODE *a, BSTREE_K_TYPE *mn);

などに変更してもエラーは出ずに実行されるのですが・・
64デフォルトの名無しさん:2008/06/28(土) 11:04:44
プロトタイプ宣言は引数の数と型だけ見てるから。
6559:2008/06/28(土) 11:08:56
なるほど、わかりました。
ありがとうございました
66デフォルトの名無しさん:2008/06/28(土) 11:13:57
>>62
ありがとうございます。vc++ダウンロードしてきます。
67デフォルトの名無しさん: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
68デフォルトの名無しさん:2008/06/28(土) 16:47:57
改行と復帰というのがありますが、
改行が行を改めて、復帰が先頭に戻る、という認識で合ってますか?

もしそうなら、
Unixでは、改行LF
Windowsでは、改行LF+復帰CRが必要
という違いは、
Unixでは改行LFだけで、改行+復帰の機能を果たすってことなんでしょうか?
69デフォルトの名無しさん:2008/06/28(土) 17:14:36
typedef struct{
int x;
int y;
}XY;
XY a,b,c;
c = a+b; //エラー

こんな風に同じ型の構造体を演算したいのですが、関数を使うしか方法はありませんか?
70デフォルトの名無しさん:2008/06/28(土) 17:18:10
>>69
C言語の範囲だと関数を使うしかありません
C99 であれば complex 型のみできるようです

C++なら演算子のオーバーロードでできますがスレ違いです
7169:2008/06/28(土) 17:21:21
>>70
そうですか
ありがとうございました
72デフォルトの名無しさん:2008/06/28(土) 18:19:00
>>68
タイプライターが使われていたころは
改行: 次の行に移動(入力位置を横に移動せず下に1マス移動するだけ)
復帰: 行の頭に移動
のように両者は個別の機能を持っていたらしい
Windowsの改行がCR+LFなのはこれに基づいていると思われる

じゃあUnixのLFで改行できちゃうのはなぜってことになるんだが
一番大きい理由は改行に2バイトも費やすのが勿体無いからだろう


まあスレ違い
73デフォルトの名無しさん:2008/06/28(土) 18:27:12
>>72
プリンタの制御コードがまさにそれだな
0x0d CR キャリッジリターン
0x0a LF ラインフィード
74デフォルトの名無しさん:2008/06/28(土) 19:12:28
改行以外の標準の空白類文字を消してファイルを更新する関数です。

void 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
opqrstuvwxyz�vwxy z

z以下を消したいのですが、どうすれば良いでしょうか
75デフォルトの名無しさん:2008/06/28(土) 19:17:17
fprintfの書式は fprintf(fp, "%s", str); が正解だと思う
7674:2008/06/28(土) 19:24:04
>>75
何故ですか?
77デフォルトの名無しさん:2008/06/28(土) 19:25:55
#define EOF (-1) /*stdio.h*/
78デフォルトの名無しさん:2008/06/28(土) 19:27:20
>>74
文字列の最後には\0が必要

>>76
入力ファイルの中に%dって書いてみればわかる
79デフォルトの名無しさん:2008/06/28(土) 19:27:58
strに%が含まれていたらどうするんだ?
80デフォルトの名無しさん:2008/06/28(土) 19:30:10
>>77-78
str[i] = NULL; も試したのですが、変わりませんでした。
ファイルの最後はEOFだったかと思い、入れてみたのですがこちらもだめでした。

>>78
なるほど
8168:2008/06/28(土) 19:30:36
>>72
分かりやすい説明ありがとうございます。
改行という言葉が二つの意味を持ってるのが紛らわしいんですよね
82デフォルトの名無しさん:2008/06/28(土) 19:31:30
>>74
ファイルを開いてしまったあとで長さを短くするためには
truncateを使わなければね。
するとfopen+fprintfという関数でははく、open+write+truncateというシステムコールを
使った方がうまいことがわかる。
ただし上手に使わないと遅くなる。
8382:2008/06/28(土) 19:34:34
補足
一度ファイルを閉じて fopen(... , "w") で長さ0のファイルを作り直しても良い。
inodeが変わる可能性があるから、それが気にならないならこちらの方がスマート。
84デフォルトの名無しさん:2008/06/28(土) 19:35:28
>>81
翻訳者が悪い。
日本では、new line と line feed を同じ意味だと思われてるし。
85デフォルトの名無しさん:2008/06/28(土) 19:36:56
同じ意味だろ
8674:2008/06/28(土) 19:37:29
>>82-83
ありがとうございました
助かりました
87デフォルトの名無しさん:2008/06/28(土) 19:44:14
fprintf(fw, "%d", i);

fwにiの値を10進で書き込む
88デフォルトの名無しさん: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];
89デフォルトの名無しさん:2008/06/28(土) 22:25:40
while(!feof(from)){
if(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;
}
}
}
90デフォルトの名無しさん:2008/06/28(土) 22:26:02
if(fclose(from) < 0){
printf("%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;
}
91デフォルトの名無しさん:2008/06/28(土) 22:29:28
一瞬で解かれると思っていい。暗算レベル
92デフォルトの名無しさん:2008/06/28(土) 22:33:29
そんな・・・い、一瞬だと・・・?
93デフォルトの名無しさん:2008/06/28(土) 22:34:56
データの内容によると思うけど、もとがテキストなら比較的簡単に解けるんじゃないの
94デフォルトの名無しさん:2008/06/28(土) 22:36:25
>>91 がすごいハッカーだということは分かった。感動した!
95デフォルトの名無しさん:2008/06/28(土) 22:39:22
強制jmpで最後まで飛ばすレベル
96デフォルトの名無しさん:2008/06/28(土) 22:44:17
>>89
argv[3]で境界バグが出るんじゃないかそれ
97デフォルトの名無しさん:2008/06/28(土) 22:48:55
境界バグってなんですか?
98デフォルトの名無しさん:2008/06/28(土) 22:58:47
限界値で生じるバグみたいな?
99デフォルトの名無しさん:2008/06/28(土) 22:59:32
バグが生じるわけじゃないか。異常が生じる
100デフォルトの名無しさん:2008/06/28(土) 23:43:11
質問ですけど
struct 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];はちゃんとつながるんですか?

101デフォルトの名無しさん:2008/06/28(土) 23:46:41
気持ちとしては
10個の状態を2列用意して,
data2の3つ目とdata1の4つ目をつなぎたいって感じなんですけど
102デフォルトの名無しさん:2008/06/28(土) 23:49:13
自分の説明能力に自信があるのかもしれないけど、
stateというメンバについては書かれていないね
103デフォルトの名無しさん:2008/06/28(土) 23:49:13
難解だな
104デフォルトの名無しさん:2008/06/28(土) 23:53:26
>>88-89
> key = (char *) argv[3];

> ch = ch ^ *key++;

空文字列だと終端を飛び越えるね
105デフォルトの名無しさん:2008/06/28(土) 23:53:41
struct gstate{
int state;
};でお願いします。
まあ入門編できくべきではないかもしれませんけど
106デフォルトの名無しさん:2008/06/28(土) 23:55:47
>>105
> まあ入門編できくべきではないかもしれませんけど
そうだね
107デフォルトの名無しさん:2008/06/29(日) 00:00:50
よく分からないけど試せないの?
108デフォルトの名無しさん:2008/06/29(日) 00:08:27
G-tasteを思い出した
109デフォルトの名無しさん:2008/06/29(日) 00:14:31
>まあ入門編できくべきではないかもしれませんけど
自分が頭悪いのを棚にあげてこの台詞w
110デフォルトの名無しさん:2008/06/29(日) 00:28:59
>>81
復帰改行という言葉もあるデスヨ。
ちなみにOSによってはLFCRLFなんてのもあったり。
コンピュータの時代になって、改行をすれば復帰するのが当たり前となり、
じゃあ分けなくてもいいじゃんって言う流れがあったようです。
111デフォルトの名無しさん:2008/06/29(日) 01:56:29
最近やっとポインタを本当に理解できた
やっぱアセンブラまで掘らないと本質って見えてこない
しかし今度はアセンブラの命令の中身を知るために回路をいじりたくなってきた
組み込みって楽しそうだな
112デフォルトの名無しさん:2008/06/29(日) 01:57:52
>>109
分からないのが悔しいの?
113デフォルトの名無しさん:2008/06/29(日) 02:31:08
>>111
アセンブラで扱うデータはアドレスと即値データのみ
変数名をオペランドに記述でしたとしても、機械語ではアドレスになる
114デフォルトの名無しさん:2008/06/29(日) 03:22:15
ヒープについて質問なのですが、

プログラムA Bというのを自前で用意します。

それぞれ別のタスクとして起動します。

Aがmallocで確保したエリアをBに渡すことがあるのですが
この渡されたエリアをBの中でfreeして問題ないでしょうか?
それとも一旦Aに戻してAの内部でfree?
115デフォルトの名無しさん: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;


どうか?
116デフォルトの名無しさん:2008/06/29(日) 03:42:47
>>114
mallocで確保したメモリーが共有できない。
プログラムの論理アドレスと物理アドレスのマップはプロセスごとに異なるので
アドレスを渡したとしても、同じメモリーにアクセスするという保証はない。

共有メモリーがGlobalAlloc(WIndows)を使う。
117デフォルトの名無しさん:2008/06/29(日) 03:42:58
>>114
どうやって渡のかkwsk

なんにせよAでfreeすべきだろう・・・ AのヒープはAのモノだ
118デフォルトの名無しさん:2008/06/29(日) 03:47:08
116だけど
WindowsのGlobalAllocが使えるかどうかはよくわからない
基本は共有メモリー
119デフォルトの名無しさん:2008/06/29(日) 04:00:49
馬鹿の溜り場?
120デフォルトの名無しさん:2008/06/29(日) 04:04:09
>>114
UNIX 共有メモリー shmxx関数
Windows メモリマップドファイル CreateFileMapping関数

これらの共有オブジェクトは、内部で使用を宣言したプロセスの数を管理しており
すべてのプロセスがデタッチしたときにシステムから消去される仕組みになっている
121デフォルトの名無しさん:2008/06/29(日) 04:05:45
>>119 なにか知っていたら発言してください
122デフォルトの名無しさん:2008/06/29(日) 04:09:48
>>114
スレッドのことと混同してるのかもしれないが、
>プログラムA Bというのを自前で用意します。 
と書いてしまってるからな〜
とりあえずプロセス間通信で方法は共有メモリも含めていくつかある。
123デフォルトの名無しさん:2008/06/29(日) 04:15:12
>>119
お前基準のバカは当てにならないということだ。
124デフォルトの名無しさん:2008/06/29(日) 04:16:19
触るなキケン
125114:2008/06/29(日) 04:28:31
windowsやUNIXのようなOS環境下ではなくどっちかといえば組み込みに
近い形の環境なので若干違うんですかね^^;

126デフォルトの名無しさん:2008/06/29(日) 04:31:40
環境も明示せずに質問するなよ。阿呆すぎるだろ
127デフォルトの名無しさん:2008/06/29(日) 04:35:48
>>125
組み込みといってもいろいろ
まったくOSにないものから、「ちゃんとした」OSがあるものまで
128デフォルトの名無しさん:2008/06/29(日) 04:43:34
なんにせよ、0と1の組み合わせのデジタルデータの塊を
入れて処理して出して結果を出力、その基本部分は変わりは無い。
あとはOSや環境によって、使われているインターフェースや
表現力などに差はあるがな。インターフェースの便利さにも。
原始的なコマンドライン入力でもやれることは十分ある。
129114:2008/06/29(日) 05:32:18
あー環境ですか・・・

PSPの非公式開発でCygwin * toolchainなんですけどね・・・

windowsのDLLのようなライブラリを起動する際にヒープサイズの制御ができないというのが1つ。
あとはライブラリの中身を公開すれば最大ヒープサイズをコントロールできるんですができれば
非公開で行きたいというのが1つ。

そこで苦肉の策として関数で各ライブラリ間のデータの受け渡しが可能というのを利用して
最初に作ったライブラリ郡はヒープサイズをほとんど取らないように変更。
ヒープを総合管理するライブラリを別途設けてこいつの中でmallocだけしてアドレスを戻す関数(たとえばmymalloc)
を用意して他のライブラリから従来のmallocの代わりにmymalloを呼ぶ。

現状としてはmallocはできてるようでとりあえず動いてるようなんですが、freeのほうがうまく行かず
大きなプログラムでデータの読み込み破棄を繰り返すとメモリーリークを起してるようでいずれフリーズ
という感じなんです・・・
130デフォルトの名無しさん:2008/06/29(日) 07:52:55
フラットなメモリ空間に配置されたプロセスで相互にポインタを渡しあえる環境なわけか。
モバイル機器にありがちだね。Windows3xとかもそうだった。
その環境特有のノウハウがあるはずでC言語うんぬんの話じゃない。
一般論から言えば、allocしたランタイムでfreeするのが原則だがPSPはわからん。
131デフォルトの名無しさん:2008/06/29(日) 07:57:36
mallocで獲得する領域の管理はプロセスごとに行っているので、
mallocしたプロセスがfreeしないととんでもないことが起こる。

ということが回答なのかな?よくわからないけど・・・
132114:2008/06/29(日) 08:18:16
ところがfree関数のラッパー?をヒープ管理元に実装して
そこで開放するように処理を変更してもフリーズは起こるという
なんとも・・・
133デフォルトの名無しさん:2008/06/29(日) 08:25:38
こっちで聞いたほうがいいんじゃまいか
C言語一般の話でもないし入門でもないぞ

PSP自作ソフト開発スレ ver.8
http://game14.2ch.net/test/read.cgi/gameurawaza/1212946327/
134デフォルトの名無しさん:2008/06/29(日) 08:27:29
>>133
そこの住人です^^;
最近はあんまり活発な書き込み無いので・・・

まあ環境依存ぽいのでこれまでにします。
レスくれたかたありがとうございます。
135デフォルトの名無しさん:2008/06/29(日) 09:48:27
>>129
ライブラリ内でmallocした領域は、ライブラリ内でfreeしないとだめだゾ
136デフォルトの名無しさん:2008/06/29(日) 10:26:11
mallocとcallocはどう違うの?
137デフォルトの名無しさん:2008/06/29(日) 10:28:50
>>136
0クリアとアラインメント
138デフォルトの名無しさん:2008/06/29(日) 10:56:02
独学でプログラムの勉強始めたのですが、
ロジックよりもプログラム特有の言い回しがなかなか理解できません。

関数を宣言する
関数を定義する
変数を宣言する
変数を定義する

宣言と定義の意味の違いって何なんですか?
関数の場合は、宣言→戻り値と引数を定める。定義→中身の処理まで記述。ってことでしょうか?
だとしたら変数の定義って何だろう
139デフォルトの名無しさん:2008/06/29(日) 10:59:46
しらべたけど、アライメントがよくわからない・・・アドレスをきっちり隙間なく整頓して順番に埋めてくれるってこと?
140デフォルトの名無しさん:2008/06/29(日) 11:25:10
>>139
ちがう
それはパックだっけ?

アライメントっていうのは処理系(CPUなんか)が扱いやすいバイト単位にアドレスを確保すること。

141デフォルトの名無しさん:2008/06/29(日) 11:27:14
ものすごーく大雑把に言ってしまえば

8bitCPUだと1バイト単位で問題ない。
16bitCPU(8086)だと1バイト単位でもアクセスできるけど2バイト単位でないと速度が落ちる。
32bitCPUだと4バイト単位・・・
142デフォルトの名無しさん:2008/06/29(日) 11:31:09
数日前から苦CってとこでC言語勉強してるけど文字列を扱う方法あたりからわからなくなってきた。
誰かわかりやすく教えてください。
143デフォルトの名無しさん:2008/06/29(日) 11:52:22
>>141
うっわー、何その井の中の蛙発言。
世の中にはバイト単位アクセスできない16ビットCPUも沢山あれば、
1バイト単位アクセスでも速度が落ちない16ビットCPUもあるぞ。

で、誰かまともにmalloc()とcalloc()の違いの説明してくれない?
144デフォルトの名無しさん:2008/06/29(日) 11:53:06
>>142
あんなところで勉強してたような人に、どう説明すればいいのやら。
取り敢えず、何が判らないのか書いて味噌。
145デフォルトの名無しさん:2008/06/29(日) 11:56:44
>>138
メモリの領域確保をして名前と結びつけるのが定義
領域確保はせず、ただ名前を使うよと宣言するだけなのが宣言
厳密にはこのように宣言と定義をきっちり分ける
しかし両者をひっくるめて宣言と呼ぶこともきわめて一般的

例えば int a; とすれば、int を入れられるだけの領域を
変数としてメモリ上に確保するので定義
しかし extern int a; なら、どこか他で領域確保は済んでいる
ただ a を使うよと宣言するだけなので宣言

よくわかんなかったら無理せず先に進むこと
146デフォルトの名無しさん:2008/06/29(日) 11:58:17
>>143
ゼロクリアするか否かと、引数が違う
147デフォルトの名無しさん:2008/06/29(日) 12:00:20
つまり、アライメント云々はmalloc()でも保証されているということでいいのかな。
148デフォルトの名無しさん:2008/06/29(日) 12:03:18
>>147
あくまで処理系に最適な・・・は保証されるかもしれないけど
せいぜい4バイトとか8バイトじゃないかな?

デバイスによっては16バイトアライメントが必要な場合も
あったりするのでその場合は自前で調整しないとだめだし。
149デフォルトの名無しさん:2008/06/29(日) 12:03:34
>>144
じゃあどこで勉強すればいいですか。
150デフォルトの名無しさん:2008/06/29(日) 12:11:37
お好きなところでどうぞ。できれば、間違いの多いサイトは避けましょう。
151デフォルトの名無しさん:2008/06/29(日) 12:15:10
でも勉強中の人には、そのサイトが正しいか間違ってるかわからないんじゃない
152デフォルトの名無しさん:2008/06/29(日) 12:15:48
>>147
つい一昔前までは、mallocはバイトアライメントだったので、CPUによっては
>>141がいう「速度が落ちる」などではすまず、bus errorなどを引き起こしていた。
ごく最近になってから、mallocも任意のオブジェクトでクラッシュだけはしないように
なった。
153デフォルトの名無しさん:2008/06/29(日) 13:21:49
>>145
ありがとうございます!
ちゃんとした違いがあったんですね。よく分かりました。
154デフォルトの名無しさん:2008/06/29(日) 13:40:45
エラトステネスの篩の問題で、2以上で10000以下の自然数を入力し、2から入力した自然数以下の素数を全て表示する。
素数間にタブを入れ、3個区切りで表示せよ。*一次配列を使うこと。

という問題なのですが、分からないので質問しました。

ちにみに素数間にタブを入れというのは、
2 3 5
7 11 13
こんな感じに表示されるらしいです。

155デフォルトの名無しさん:2008/06/29(日) 13:43:57
オープンされてない質問への応答禁止
>>1
156デフォルトの名無しさん:2008/06/29(日) 13:51:53
>>142
とにかくわからないので教えてください、って
全然苦しんで学ぶ感じじゃないのはなぜだ
間違った勉強法に苦しむっていうことだろうか
157デフォルトの名無しさん:2008/06/29(日) 13:56:10
C "境界調整"
158デフォルトの名無しさん:2008/06/29(日) 13:56:22
>>155
マルチになったようだけど、答えてもよろしいでしょうか?
159デフォルトの名無しさん:2008/06/29(日) 13:56:44
適切なスレで適切な回答を
160デフォルトの名無しさん:2008/06/29(日) 14:00:04
>>154
エラトステネスの篩はぐぐれば必ず出てくる、
篩の問題を解く前にまず次の問題を解いてみそ

「0から1000までの数を順次表示する。
それまで表示した個数が3の倍数の時は後ろに改行記号を
3の倍数でない時は、後ろにタブを付けて表示しろ
(それまでの表示した個数を表す変数を宣言して使用して
良い)
すべての数の表示が終わってから改行記号を出力しろ。」
161デフォルトの名無しさん:2008/06/29(日) 14:01:44
ゆとりはまず人に聞くことを最初に教えられます
解決するまで粘るということは教わりません
そして最後まで自力で解決することを覚えません
162デフォルトの名無しさん:2008/06/29(日) 14:07:07
人に教えたくないならレスしなければいいだけ
質問に答えるスレで調べろってレスする人が理解できない
163デフォルトの名無しさん:2008/06/29(日) 14:08:46
質問したいんじゃない、答えを知りたいんだ
164デフォルトの名無しさん:2008/06/29(日) 14:15:10
放置か「調べろ」かといえば「調べろ」のほうがいいのでは
165デフォルトの名無しさん:2008/06/29(日) 14:27:33
ゆとりは、最後迄全部自力でやったという錯覚
に陥いつつ実は単にコンピュータにやらせている
だけの人から答えを聞くことを最初に覚えます。
166デフォルトの名無しさん:2008/06/29(日) 14:33:05
>>164
放置の方がいい。
質問に対して調べろ、と言うのは
お前はアホだから帰れと言っているのと同じで
大変失礼な行為。
167デフォルトの名無しさん:2008/06/29(日) 14:36:32
それは質問じゃなくて詰問
168デフォルトの名無しさん:2008/06/29(日) 14:51:37
>>166
お前はアホだから帰れ
169デフォルトの名無しさん:2008/06/29(日) 14:52:43
質問に答えないことを表明する自由ぐらいは認めてもいいだろう。
170デフォルトの名無しさん:2008/06/29(日) 14:53:35
「調べろ」というのは「ここで聞くより調べた方がマシ」という意見
171デフォルトの名無しさん:2008/06/29(日) 14:55:38
ぐぐって分かる人は対象外
172デフォルトの名無しさん:2008/06/29(日) 15:19:56
結局無償でやるには何事も限界があるのさ
分からないので教えてくださいというのは基本的にその限界を超えている
173デフォルトの名無しさん:2008/06/29(日) 15:24:44
教えることと煙にまくことの相違について
174デフォルトの名無しさん:2008/06/29(日) 15:29:05
教えることと、教えてあ・げ・る〓ことの相違について
175デフォルトの名無しさん:2008/06/29(日) 15:40:40
金とって教える程のことでもない件について
176デフォルトの名無しさん:2008/06/29(日) 15:42:52
それが故に、自分でやってみて分かるという経験を奪うことの罪悪感に
無感な奴が多い件について
177デフォルトの名無しさん:2008/06/29(日) 15:47:12
教えることの代価は、相手の成長だと思うんだな。
178デフォルトの名無しさん:2008/06/29(日) 15:48:59
お前らどうせ現実では人と話すのが苦手で会社で浮いてるタイプなんだろ
似たもの同士助け合えよ
179デフォルトの名無しさん:2008/06/29(日) 15:50:12
おまえもな
180デフォルトの名無しさん:2008/06/29(日) 15:50:18
ジュラシックパークツアーになるかどうか
181デフォルトの名無しさん:2008/06/29(日) 15:51:06
質問は具体的であればあるほどよい。
「C言語がわかりません。教えてください。」みたいな、質問になってないのは返答しようがない。
質問者に言いたいことは、以下の3点。

・何をしたいのか、まず「目的」を明確にしろ。(開発環境、実行環境を含む)
・考えていることと、試行結果を簡潔に書け。(試行しない人はプログラマに向いてない)
・要約する自信がないならソースを貼れ。恥ずかしいなどと考えるな。
182デフォルトの名無しさん:2008/06/29(日) 16:01:37
ソースを張るときは省略するな。
エラーメッセージも張れ。
も追加しといて。
183デフォルトの名無しさん:2008/06/29(日) 16:11:39
Javaでは int[] i; のように配列を宣言できますが、
Cで配列の大きさを決めないまま宣言することは可能ですか?
184デフォルトの名無しさん:2008/06/29(日) 16:12:50
>>184
おまえらウゼーンだよ。すれ違いのこと議論続けるならどっかいけ。
テンプレ読めとか過去スレ嫁とかどうでもいいんだよ。
どうせ馬鹿な奴は何も読まずに日本語になっていない質問をしてくる。
そんな奴には「ググレカス」と言って追い返せば、質問の仕方を考えるようになるよ。
185デフォルトの名無しさん:2008/06/29(日) 16:13:04
int* i;
186デフォルトの名無しさん:2008/06/29(日) 16:13:16
C言語がわかりません。教えてください。→初心者歓迎スレ
自分でもやってみる方針ですが、出来ないところがあります。→入門編スレ
酷い教師が、無理難題を言ってきます。助けて下さい。→宿題スレ
という分類でおk?
187デフォルトの名無しさん:2008/06/29(日) 16:21:37
>>185
純粋に配列として宣言することはできないのでしょうか?
188デフォルトの名無しさん:2008/06/29(日) 16:22:19
概ねOKかと。
自助努力をしないやつに教える必要はないよ。
189デフォルトの名無しさん:2008/06/29(日) 16:23:03
>>187
Cではできない。C++なら(構文は違うが)できなくはない。
190デフォルトの名無しさん:2008/06/29(日) 16:23:12
>>187
できません
191デフォルトの名無しさん:2008/06/29(日) 16:30:41
>>187
Javaでも、考えようによっては
int[] i;
で宣言されるのは純粋な配列ではなくて、Cでいう int *i;
みたいなものだよ。
何となれば、i = new int[100];
とかしないとぬるぽになるだろう。
これはCで i = calloc(100, sizeof *i);
としなければならないことと同じ。
192デフォルトの名無しさん:2008/06/29(日) 16:31:15
>>189
>>190
ありがごうございます。
配列のサイズ決めるのが難しそうですね。
Javaの生ぬるい仕様しか分からないへっぽこPGにはCは色々と難しい…。
193デフォルトの名無しさん:2008/06/29(日) 16:34:53
>>191
ありがとうございます。
実はまだポインタがよく分かってないので勉強してからもう一度レスを参考にさせてもらいます。
194デフォルトの名無しさん:2008/06/29(日) 16:37:51
勉強してから質問しろよカス
195デフォルトの名無しさん:2008/06/29(日) 16:39:09
>>194
exit
196デフォルトの名無しさん:2008/06/29(日) 16:39:38
偉そうにしてる奴は自分が出来なかった頃を思い出せ
197デフォルトの名無しさん:2008/06/29(日) 16:44:30
自分が出来なかった頃は一人でUnixいじって勉強してたな
数少ない文書を元に研究と試行錯誤の繰り返し
基本的にはすべて自己解決

最近のゆとりはネットに溢れる情報があるのにくだらない質問をしやがる
たまには何日もかけて自分で研究して解決してみろよ
198デフォルトの名無しさん:2008/06/29(日) 16:51:45
時代の流れに取り残された化石のような方ですね
199デフォルトの名無しさん:2008/06/29(日) 16:54:25
まあ下らない話をずるずる引き延ばして荒らすのがナウいわけですけどね
200デフォルトの名無しさん:2008/06/29(日) 16:55:54
先人たちの知恵があって初めて今の情報があふれた世の中があるということに対して
感謝を忘れてはならないと思う
201デフォルトの名無しさん:2008/06/29(日) 16:57:24
文書の数が少なかったからこそ自分でやれたという視点もちとは
頭に入れたほうがいい時代になってるね。
202デフォルトの名無しさん:2008/06/29(日) 17:03:48
一瞬「視点持ち」と読んでしまって思考が途切れるから「視点も、ちとは」にした方が読みやすいかも
203デフォルトの名無しさん:2008/06/29(日) 17:04:13
C言語なら俺に聞け(単位獲得篇) を立てるべき
これでだいぶすっきりするはずだよ
204デフォルトの名無しさん:2008/06/29(日) 17:19:15
>>197
こういう偉そうなことを言うヤツの本音は
「自分が苦労したから他人も同じだけ苦労するべき。
そうでなきゃ自分が可哀想」
これに尽きるんだよ。アホらしい。
自分で背負い込んだ苦労なら自分の中で消費しろ。
205デフォルトの名無しさん:2008/06/29(日) 17:21:11
数学でもなんでも公式だけ勉強していくと行き詰るだろ?
プログラムだって楽したら成長しないんだよ
長い目で見て、教えないのはむしろ善意
206デフォルトの名無しさん:2008/06/29(日) 17:21:27
>>203
宿題スレがあるんだからそれで我慢しる
207デフォルトの名無しさん:2008/06/29(日) 17:25:16
一概に言えない。これに尽きる。まず教える教わるの関係を明確に
する。そうなったらケースバイケース、ダイアログで対応していく
のが基本。
208デフォルトの名無しさん:2008/06/29(日) 17:29:58
とりあえず教える気のないやつがなんでこのスレにいるの?って思います
209デフォルトの名無しさん:2008/06/29(日) 17:36:04
「ぐぐれ」ならよく使うな
しかし検索すらしない人がどうやってスレに辿り着くんだろうな
210デフォルトの名無しさん:2008/06/29(日) 17:40:29
「ぐぐれ」は暗に「ぐぐったら見つかるよ」を意図してることがあり得るから、(そう邪推するとして)かなりの情報量をもっているよね。
だれも答えてくれず、「ぐぐれ」ともいってくれなかったら相当に難しい問題なのかもしれない。
211デフォルトの名無しさん:2008/06/29(日) 17:44:12
別に「ぐぐれ」とか「調べろ」といったら他の人が答えられなくなるわけじゃあるまいし、
くだらないと思うけどなw
212デフォルトの名無しさん:2008/06/29(日) 17:59:16
「お前が出来ないのはC言語だけじゃない」
その一言が言えなくて
213デフォルトの名無しさん:2008/06/29(日) 18:05:30
超初心者を小バカにして虚栄心を満たすぐらいの効果しかなさそうだが

まあ悩んで判らなければとりあえず聞いてみてもいいと思うよ
この流れで本当に悩んでる人が質問するのを躊躇してたら可哀想だ
214デフォルトの名無しさん:2008/06/29(日) 18:29:13
>>213
C言語がわかりません。
215デフォルトの名無しさん:2008/06/29(日) 18:31:23
C言語が途中からわからなくなりました。さて、何でしょう。
216デフォルトの名無しさん:2008/06/29(日) 18:48:55
はじめてのCを思い出すんだ。
217デフォルトの名無しさん:2008/06/29(日) 18:49:15
自己解決しました
ありがとうございました
218デフォルトの名無しさん:2008/06/29(日) 18:57:42
教えた方がいいと思うなら自信を持って教えればいいだけ
219デフォルトの名無しさん:2008/06/29(日) 19:03:07
道端であかの他人にレクチャー頼んでるようなもんだ
無理があるだろ
220デフォルトの名無しさん:2008/06/29(日) 19:05:58
それは違うだろ
221デフォルトの名無しさん:2008/06/29(日) 19:07:45
違わないね
222デフォルトの名無しさん:2008/06/29(日) 19:25:41
同じ道端でも多少Cに詳しそうな人が通ってると思われる道で聞いてるという違い
223デフォルトの名無しさん:2008/06/29(日) 19:29:14
道端を通りかかった人と、ある程度目的を持って一箇所に集まった人が同じなわけないだろ
224デフォルトの名無しさん:2008/06/29(日) 19:30:43
>>222
そんなことをすると、55%の...
225デフォルトの名無しさん:2008/06/29(日) 19:34:27
>>223
おまいさんはこのスレに常駐しているのか
ご苦労さんなこった
226デフォルトの名無しさん:2008/06/29(日) 19:34:33
道端は言い過ぎだと思うね

>>142
> 数日前から苦CってとこでC言語勉強してるけど文字列を扱う方法あたりからわからなくなってきた。
> 誰かわかりやすく教えてください。
>>144
>>142
> あんなところで勉強してたような人に、どう説明すればいいのやら。
> 取り敢えず、何が判らないのか書いて味噌。
>>149
>>144
> じゃあどこで勉強すればいいですか。

でもこれは無理だと思うよw
227デフォルトの名無しさん:2008/06/29(日) 19:38:13
同じ教えるってことでも
可愛い部下に対しては相手の将来を考えて付きっきりで教えてやる気にもなるけど
赤の他人に対しては所詮自分の自己満足でしかないなぁ
228デフォルトの名無しさん:2008/06/29(日) 19:43:24
>>227
あんたのような上司がいたら俺のような馬鹿でも苦労してないんだわ
まぁCを独学で少しかじった程度でこの業界に入ったのが人生最大の失敗だった
なぜかこのスレの流れ見ながらリアルで涙目
229デフォルトの名無しさん:2008/06/29(日) 19:58:43
191っが
230デフォルトの名無しさん:2008/06/29(日) 19:58:58
>>228
キミはバカなんじゃないと思うよ。向いてないだけだ。
向いてない、というのはバカにしてるわけじゃない。
論理的思考が得意な人と、ひらめきや直感で物事を進めるのが得意な人がいる。
「こうなったのは何故だ?それはここがこうだから。じゃあここはいつ決まったんだ?」
みたいに、順番に進めていくのが好きな人がプログラマに向いてる。
231デフォルトの名無しさん:2008/06/29(日) 20:09:05
同情誘ってる暇があるなら勉強しろカス
232デフォルトの名無しさん:2008/06/29(日) 20:09:08
苦Cっていうのは人気なの?
233デフォルトの名無しさん:2008/06/29(日) 20:10:58
少しは自分で調べろよカス
234デフォルトの名無しさん:2008/06/29(日) 20:30:00
ぬるぽいんた
235デフォルトの名無しさん:2008/06/29(日) 20:31:01
>>233
少しはお前が答えろよ神様
236デフォルトの名無しさん:2008/06/29(日) 20:32:35
職場での知の伝授=教育は基本的に安全じゃない
特に異性が混じる職場ではタブーに近い。これが基本。
だからネットはそれなりに貴重
237デフォルトの名無しさん:2008/06/29(日) 20:38:51
どう教えてもどうにもならなかった新人は何人もいた。
・何度教えても変数の概念さえ掴めなかった
・何度指摘しても同じミスを繰り返した
・何度ダメだと言っても他人の丸写ししかしなかった
まぁ、向いてないんだろうね。

>>236
そんな基本聞いたことがない
238デフォルトの名無しさん:2008/06/29(日) 20:41:12
職場色に染まらないと上司に怒られます
239デフォルトの名無しさん:2008/06/29(日) 20:41:20
>>234
ガッ
240デフォルトの名無しさん:2008/06/29(日) 20:42:43
俺の会社は男:女が5:5だけど先輩が休日出勤までして勉強に付き合ってくれるぞ
まぁ社員全員合わせても20人もいないんだけどね
241デフォルトの名無しさん:2008/06/29(日) 20:49:33
半分女だったら気が散って仕方ないな
会社は男だけの方が色々と楽だわ
女なんて会社の外でたくさん作ればいい
242デフォルトの名無しさん:2008/06/29(日) 20:53:15
会社から出られない場合はどうすればよいのでしょうか orz
243デフォルトの名無しさん:2008/06/29(日) 20:55:32
>>241
男女同権!
244デフォルトの名無しさん:2008/06/29(日) 21:10:32
>>242
2次元でどうぞ
245デフォルトの名無しさん:2008/06/29(日) 21:26:54
ほとんど回答出来ないけど、
質問と回答のやりとり見てると面白いから見てる

一人一人の考え方の違いが割と参考になる
246デフォルトの名無しさん:2008/06/29(日) 23:00:28
#define hoge(a.b.c.d)
struct 2ch a ## nyaa = {
b,
c,
d,
};
ってのがあるんですがこの##ってなんでしょうか?

247デフォルトの名無しさん:2008/06/29(日) 23:02:53
>>246
##の両側をくっつけるんだな。
248デフォルトの名無しさん:2008/06/29(日) 23:03:34
249デフォルトの名無しさん:2008/06/29(日) 23:19:24
すみません たいへんにわかりました。
素のページみたのにきずきませんでした。あほすぎ^^

250デフォルトの名無しさん:2008/06/29(日) 23:19:57
ありがとうございました。
251デフォルトの名無しさん:2008/06/29(日) 23:22:38
いい雰囲気
252デフォルトの名無しさん:2008/06/29(日) 23:23:39
TVとかでも雰囲気を「ふいんき」って読んでるひといるよな
253年ローと:2008/06/30(月) 01:08:12
教えて欲しいです。

Sjisのファイルを読み込みSjisからJisへ変換する処理を作りたいです。

SjisからJisへ変換する処理はわかっているのですが、

ファイルから変換処理へ文字を渡す個所がわかりません。

C1を第一バイト。C2を第二バイト。

if(C1>=0xe0){
C1=C2-0x40
}

と処理は進むのですが、例えば「ア」なら「8341」で値が来る事を前提としています。

しかし、ファイルから読み込んだ直後は「ア」と文字列できます。

どのようにして「ア」を「8341」と変換して渡せばよいでしょうか?

宜しくお願いします。
254デフォルトの名無しさん:2008/06/30(月) 01:17:15
>>253
質問の意味が分からないけど、変換は必要ないよ
#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;
}
255デフォルトの名無しさん:2008/06/30(月) 01:28:57
>>249
こわがりすぎー
256デフォルトの名無しさん:2008/06/30(月) 01:31:39
257年ローと:2008/06/30(月) 01:39:25
>>254
夜分、返信ありがとう御座います。

更に質問させてください。

@ファイルを読み込み、バッファへ入れ込む。
ファイルの中身を入れたバッファを変換処理にかけるで良いのでしょうか?

A「ア」を入れたバッファaを第一バイト、第二バイトに分けるにはどうしたらよいでしょうか?



258デフォルトの名無しさん:2008/06/30(月) 01:43:58
>A「ア」を入れたバッファaを第一バイト、第二バイトに分けるにはどうしたらよいでしょうか?
charの配列としてアクセスして1バイト単位で取り出せば勝手に第一第二になるよ。
でもリトルエンディアンとかビックエンディアンは気にしなくていいのかな?
259年ローと:2008/06/30(月) 01:55:33
皆さん、ありがとう御座います。

やりたいことは、

@SJisで保存したファイルを読み込み形式でオープン。

for(バッファの中身全て変換するまで){

Aそのファイルの中身を一文字ずつaバッファに入れる。
Bそのaバッファの中身をSjis→Jisへ変換をかける。
C変換した物をbバッファへ入れる。

終了です。

たちまち、リトルエンディアンとかビックエンディアンは気にしなくて良いです。
260デフォルトの名無しさん:2008/06/30(月) 01:55:45
叱ってやって下さい。
261デフォルトの名無しさん:2008/06/30(月) 02:01:23
>>259
文字列とは基本的に配列である、というのはわかるんだよね
何がわからないんだろう
262デフォルトの名無しさん:2008/06/30(月) 02:01:45
>>257
どこが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;
}
263デフォルトの名無しさん:2008/06/30(月) 02:02:53
文字コードの話
ttp://euc.jp/i18n/charcode.ja.html

JISの場合は、漢字開始位置と終了位置に開始/終了シーケンス
を書かなければならないとか色々あるみたい。
264デフォルトの名無しさん:2008/06/30(月) 02:08:59
>>257
まず、>>254の意味がわかったのかどうか答えた方がいいと思う
265年ローと:2008/06/30(月) 02:32:54
>>254はわかったような、わからんような。
迷ってるのは、バッファに取得したとき、
@a[0] = "ア"
Aa[0] = 8,a[1] = 3,a[2] = 4,a[3] = 1
Ba[0] = 83,a[1] = 41
どれで入ってくるかです。

266デフォルトの名無しさん:2008/06/30(月) 02:37:18
3番だろう。0xが抜けると意味が変わってくるけど。
267デフォルトの名無しさん:2008/06/30(月) 02:37:31
>Aa[0] = 8,a[1] = 3,a[2] = 4,a[3] = 1
これはありえないw

charどころか4bitで分解しちゃってるじゃん
268デフォルトの名無しさん:2008/06/30(月) 02:38:43
http://qpon.quu.cc/pc/sjis.htm
ここ見てみなよw
2バイトコードの構造とか良くわかるよ
269年ローと:2008/06/30(月) 02:44:44
みなさん、ありがとうございます。
モヤモヤが取れました。何がわかってないのかもわかってない状態でした。
すいませんでした。皆さんのおかげでハッキリしました。
270デフォルトの名無しさん:2008/06/30(月) 11:53:57
Linux環境なんですが、time関数よりちびっと精度の高い(ミリ秒単位)ってありませんか?
271270:2008/06/30(月) 11:56:18
一旦、この質問は、保留します

もうすこし自分で考えてみます
272デフォルトの名無しさん:2008/06/30(月) 12:44:35
この3分で何があったか知らないがおまいはすごく成長したと思う
273デフォルトの名無しさん:2008/06/30(月) 13:29:06
>>270
clock( )
274デフォルトの名無しさん:2008/06/30(月) 14:31:16
ロボットが前後(出来れば全方向)に動くプログラムを書きたいのですが、
どのようにすればC言語で書けますか?
参考になるサイトなど教えてもらえると幸いです
275デフォルトの名無しさん:2008/06/30(月) 14:37:04
>>274
プログラミング言語の前に"日本語"を復習されては?

ロボットと聞いて大きく二つのジャンルを思い浮かべてしまった。
しかもどちらのジャンルも開発環境なんかがかなり多岐にわたってて
そんな漠然とした質問では答えようがなかった。
276デフォルトの名無しさん:2008/06/30(月) 14:46:10
もちろんgoogleのロボット型検索のことを言っているのだと似非エスパー
277274:2008/06/30(月) 14:58:47
ロボコンなどでよくある、ライントレースロボットみたいな感じです。
それのラインが無い状態でも前後に動く奴は作れるのかな?と思ったので。
やっぱり質問が漠然としてましたねw
すいません
278デフォルトの名無しさん:2008/06/30(月) 15:01:28
>>277
そのロボットと3Dで表現するロボットじゃあ違うからねw

マイコン ロボット

とか

レゴ ロボット 

とか
調べてみるといいよ。

あとH8とかAVRとか
279デフォルトの名無しさん:2008/06/30(月) 15:02:06
そのロボットによるとしか言いようがない
280デフォルトの名無しさん:2008/06/30(月) 15:15:41
>>274
まず「制御」という言葉はわかる?
ロボット 制御 C言語
とかのキーワードで本もすぐ見つかるはず
281デフォルトの名無しさん:2008/06/30(月) 16:04:18
sin と cos の結果入れる0から359のテーブルをfloatで
実装してるんだけどそれを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してます。
282281: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;
}
283281:2008/06/30(月) 16:08:19
>これで実際に使うところでは1024倍で計算したあと >> 10で1/1024してます。
これも文章がおかしいですねorz

これで実際に使うところでは1024倍のままで計算したあと >> 10で1/1024してます。
284デフォルトの名無しさん:2008/06/30(月) 16:08:41
>>274
ロボットがC言語で開発可能なチップで制御されているのならできるでしょう
285デフォルトの名無しさん:2008/06/30(月) 16:09:10
どういうことだろう。
SinTablei[i] = sin(i*PI /180) * 1024;
とするのでは何か気に入らないってことかなあ。
doubleをfloatにキャストしてるのも何でだろう?
286281:2008/06/30(月) 16:13:49
>>285
最初はdoubleでやってたのですがそこまでの精度がいらないのと
速度が欲しいのでとりあえずfloatにしました。

でさらなる高速化のためにintにしてみようかと思ったのですが
うまくいかなかったので・・・

>SinTablei[i] = sin(i*PI /180) * 1024;
あーそうですね。

これでいけそうですね。
287デフォルトの名無しさん:2008/06/30(月) 16:15:11
>>282
SinTablei[i] = (int)SinTablef[i]*1024;
じゃなくて
SinTablei[i] = (int)(SinTablef[i]*1024);

SinTablei[i] = SinTablef[i]*1024;
288281:2008/06/30(月) 16:44:32
>>285>>287
ありがとうございます。
うまく行きました。
289285:2008/06/30(月) 17:46:01
>>288
どういたしまして。うまく行ったようでよかったですー
290デフォルトの名無しさん:2008/06/30(月) 18:45:28
C FAQにあったんだけど
struct name{
int namelen;
char name[1];
}

これってどんな使い方するの?
291デフォルトの名無しさん:2008/06/30(月) 19:12:59
>>290
http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
こんな感じで、name部分を可変長にしたいときに。
292デフォルトの名無しさん:2008/06/30(月) 19:55:18
d
293デフォルトの名無しさん:2008/06/30(月) 20:29:17
CFAQを読んでその疑問が出るっておかしくないか
294デフォルトの名無しさん:2008/06/30(月) 21:08:25
英語で書かれた部分が読めなかったんじゃないか?
(まさか日本語訳の方ってことはないよね。)
295デフォルトの名無しさん:2008/06/30(月) 21:09:21
いや、大体予測はできてたんだけどひょっとしたらと思って聞いたんよ
296デフォルトの名無しさん:2008/06/30(月) 21:16:12
単純に理解できなかったんでないの?
実装例見て、ああ、なるほど、的な。
297デフォルトの名無しさん:2008/06/30(月) 21:17:31
とっとこ主
298デフォルトの名無しさん:2008/06/30(月) 22:42:52
スレチかもしれないが
c++のソースファイル(.cpp)をcにしたら(.c)
error C2143: 構文エラー : ';' が 'type' の前に必要です。ってエラーが
山のように出てきたんだがどゆこと?

c++の時は問題なく動きました。
Microsoft Visual C++ 6.0 使ってます。
299デフォルトの名無しさん:2008/06/30(月) 22:50:39
>>298
C≠C++だから
300デフォルトの名無しさん:2008/06/30(月) 22:54:37
>>298
エラーだけじゃなくてソースも貼らないと
せめてエラーの行だけでも貼らないと
301デフォルトの名無しさん:2008/06/30(月) 23:05:43
>>298
>c++のソースファイル(.cpp)をcにしたら(.c)

なぜこういうことができると思ったか、を白状してみると面白くなる気がする
302デフォルトの名無しさん:2008/06/30(月) 23:09:00
>>298
cファイル内に i++; と記入されてたとする
それをcppでコンパイルすると ++ がry ってエラー吐くコンパイラもある
303デフォルトの名無しさん:2008/06/30(月) 23:32:29
構造体の配列で0番目から1番目に移りたいときって
文字列とかと同様にポインタに1足してあげればいいのですか?
304デフォルトの名無しさん:2008/06/30(月) 23:45:54
配列になってればね
305デフォルトの名無しさん:2008/07/01(火) 00:13:13
けどchar *だとだめだよ。構造体の型にあわせてね
306デフォルトの名無しさん:2008/07/01(火) 00:57:34
>>281
CPUによっては、三角関数を計算してしまう方がキャッシュを汚染しない分早かったりするから要注意。
まして整数でテーブル持つと、無茶苦茶遅い型変換を行なわなければならなくなるので……
特に、C99やC++ならfloat版の三角関数も使えるわけで、ますます工夫する甲斐がない罠。
307デフォルトの名無しさん:2008/07/01(火) 01:18:38
SinテーブルあったらCosテーブルいらないんじゃないか
308デフォルトの名無しさん:2008/07/01(火) 01:20:12
速度を速めるために必要なんだろ
309デフォルトの名無しさん:2008/07/01(火) 01:40:31
速度速めたいのならsinかcosを元にもう一方を算出した方がはやいしょ。
ついでに90度まででいいしね。
310デフォルトの名無しさん:2008/07/01(火) 01:44:17
それは扱っているデータがわからないとなんともいえないなあ
311デフォルトの名無しさん:2008/07/01(火) 05:10:55
>>306
ほんと?
そんなCPUと三角関数の計算式の例を教えてほしい。
312281:2008/07/01(火) 05:24:54
>>306
開発はC言語なんですよね。

一応ベンチマークぽいことはやってみて
1)sin cos そのまま計算(double)
2)sin cos floatテーブル化計算
3)sin cos intテーブル化計算

1<2≠3

ってところですかねえ・・・
これを適用してる部分は4ベクトルの同時回転なので
intで精度をある程度保った計算をしたあとシフト演算x4回
するより素直にfloat演算したほうが最近のCPUだとスマート
かなあという結論でした。
313デフォルトの名無しさん:2008/07/01(火) 05:25:07
A. 0-90度までの10度おきのsinの表(10エントリ)と
0-9度までの1度おきのsinの表(10エントリ)、合計20エントリを作っておく。

B. 加法公式をつかって、0-359度までの1どおきのsinおよびcosを、
0-90度までの10度おきのsinと0-9度までの1度おきのsinからなる式に分解する。
これをBで作った表を使って計算する。
314281:2008/07/01(火) 05:36:45
>>306
>三角関数を計算してしまう方がキャッシュを汚染しない分早かったりする
あーこれってもしかしてL1L2の話ですか?

sin cosの計算ロジックが占有するキャッシュ容量と
floatx360個が占有するキャッシュ容量の差ってことですかねえ。

でも片方は命令で片方はデータなので最終的には格納される
箇所が違いません?
315デフォルトの名無しさん:2008/07/01(火) 13:01:03
そもそも論で申し訳ないんだけど、その処理って複数回呼び出されないですよね?
なら、その処理がわずかに速くなっても、全体としてはあまり変わらない結果になりそうです。
勉強のためにこれを速くしてみたい、もしくは、もうここしかチューニングすべき点が
見当たらないのならやる価値はありますけどw
316デフォルトの名無しさん:2008/07/01(火) 13:04:35
doubleそのままよりもintの方が速いだろう、と思ってやってみたら遅かったので、という
ピンポイントの話だったのですね。
ごめんなさい><
317281:2008/07/01(火) 13:17:06
いえ複数回呼ばれますので速度は大事ですw

((1ベクトルの回転にsin x 2 cos x2) x 4ベクトル) x 約4000

これが1/30秒の間にこなさないといけないのでw

318デフォルトの名無しさん:2008/07/01(火) 13:19:51
そこまでいくと結局は言語云々じゃなくハードウェアの仕様の話になる
319デフォルトの名無しさん:2008/07/01(火) 13:31:17
>>317
それなら、複数回sin配列を作成しないような構成にすればよいのでは?
320デフォルトの名無しさん:2008/07/01(火) 13:33:34
>>319
>それなら、複数回sin配列を作成しないような
テーブル化といえばプログラム起動時に作っておくってことなので
あとは参照だけのような・・・
321デフォルトの名無しさん:2008/07/01(火) 13:34:41
>>320
ってもテーブルの初期化処理が複数回呼ばれると、主がいっている。
322デフォルトの名無しさん:2008/07/01(火) 13:35:57
話が食い違っていると思う
323デフォルトの名無しさん:2008/07/01(火) 13:40:57
その処理
1. テーブル作成処理
2. テーブルの値を参照する処理

俺は2だと思っていた
324デフォルトの名無しさん:2008/07/01(火) 13:41:23
食い違ってるな。
>>315が勘違い発言してるだけだろ。

普通テーブル作成を複数回呼ぶなんてありえんだろw
325:2008/07/01(火) 13:54:44
横からすいません。今、SJISからJISへの変換処理を作成してます。コード変換処理は出来てます。が変換前後の処理がわかりません。変換コード前後に何かコードを付け加えなければいけないのでしょうか?
326デフォルトの名無しさん:2008/07/01(火) 14:22:38
>>325
コード晒す気がないならもうカエレ
327:2008/07/01(火) 14:51:36
すいません。ネットにつなげのが携帯しかないので。出直します。
328デフォルトの名無しさん:2008/07/01(火) 15:19:08
SDやらに保存して携帯へ転送は?
329デフォルトの名無しさん:2008/07/01(火) 16:35:57
>>325
もう一回JISの記法を読み直せ
330デフォルトの名無しさん:2008/07/01(火) 16:42:27
>>325
漢字イン(旧JIS) 1B 24 40

漢字アウト(Roman set) 1B 28 4A

あとASCII 1B 28 42
新JIS 1B 24 42
331デフォルトの名無しさん:2008/07/01(火) 20:29:06
ポインタを宣言するとき、どうして
int* a;
ではなく
int *a;
と書くのが普通になっているのですか?
上のでも書けますけど、int* a, b, c;みたいなことはできませんし。
宣言しているのは「int型の値を指すアドレスを格納できる型」の変数なのに、
下のやつだとまるでint型の何かを宣言しているみたいじゃないですか。
332デフォルトの名無しさん:2008/07/01(火) 20:35:40
callocを使うと、確保された領域の全てのビットに0が入ります。
本などには、エラーチェックに「if(p == NULL) {エラー処理} 」と書いていますが、
成功した時、pには0が入っているのに、何故if文が実行されないのですか?
333デフォルトの名無しさん:2008/07/01(火) 20:38:42
0になってるのはpじゃなくて*pなんじゃないじゃない?
334デフォルトの名無しさん:2008/07/01(火) 20:40:01
>>333
盲点でした
ありがとうございました
335デフォルトの名無しさん:2008/07/01(火) 20:40:06
>>332
pに0が入ってるわけじゃない。
pの指すアドレスに格納されている値が0になっているだけで、pにはちゃんとアドレスが格納されている。
336デフォルトの名無しさん:2008/07/01(火) 20:42:16
>>331
いつも思うんだけど、そんなことどうでもいいじゃん。
スペースの位置が違うだけなのになんでそんな拘るの?
337デフォルトの名無しさん:2008/07/01(火) 20:45:59
>>336
スペースは重要でしょう。プログラミング言語の区切りはほとんどスペースじゃないですか。
宣言の標準的な形式は
型名 変数名
ですよね。だったら型名の次にスペースがあったら、それ以降は変数名とみなすべきです。
わざわざ特殊な例外を作って煩雑にする意味はなんなのですか?
338デフォルトの名無しさん:2008/07/01(火) 20:48:28
>>337
型名/**/変数名
でもいい。
トークン区切りがスペースである必要なんて無いのだ。
339デフォルトの名無しさん:2008/07/01(火) 20:48:36
↑×2
話を理解していない馬鹿
340デフォルトの名無しさん:2008/07/01(火) 20:49:40
>>339
安価つかえw
341デフォルトの名無しさん:2008/07/01(火) 20:50:42
>>337
この場合スペースがなくてもOKだよ。Cにとってはスペースはその程度の問題。
342デフォルトの名無しさん:2008/07/01(火) 20:50:59
>>337
関数ポインタ型の変数の宣言は
int(*f)(int, int);
だけど、これはどこにスペースを入れて型名と変数名に区切るの?
343デフォルトの名無しさん:2008/07/01(火) 20:53:26
>>337
極端な話
#include<stdio.h>
int main(void)
{
int
i
=
0
;
printf("%d",i);
return 0;
}

これでもいい
344デフォルトの名無しさん:2008/07/01(火) 20:55:41
>>337
コンパイラが無視するのなら何でもいいんだ
ただしキーワードや変数名を区切ったらエラー
345デフォルトの名無しさん:2008/07/01(火) 20:58:46
>>331
int* a, b, c;

これだとaだけがポインタになるから
346デフォルトの名無しさん:2008/07/01(火) 21:19:41
int* a,b,c = int *a, b, c ってこと

>>331は int* a, b, c = int *a, *b, *c って思ったんじゃね
347デフォルトの名無しさん:2008/07/01(火) 21:20:49
俺なら違う型は別の行で宣言するね
348デフォルトの名無しさん:2008/07/01(火) 21:30:44
いや、>>331
int* a,b,c;
と書くことで int * 型の変数 a,b,cができるならまだしも、そうはできないのが納得いかないんでしょ
型の後に名前を羅列したのに、実際は型が異なる変数が出来上がる。
逆に、int *aとかくのは、型名と変数名がくっついていてそれも他と統一されていなくて気持ち悪い、と。
349デフォルトの名無しさん:2008/07/01(火) 21:40:18
そこがC言語のクソなとこ
350デフォルトの名無しさん:2008/07/01(火) 21:42:23
型は型でポインタはポインタなんだよ
int型 の ポインタ 変数a
351デフォルトの名無しさん:2008/07/01(火) 21:44:11
なれるまでの辛抱というか、思想を理解すればすぐ苦じゃなくなるな。
クソと思う人はそう書くものなのだと覚えてるだけなんだろう。
352デフォルトの名無しさん:2008/07/01(火) 21:46:35
とは言っても後発の某言語では「修正」されてるしなぁ
353デフォルトの名無しさん:2008/07/01(火) 21:48:45
>>350
「int型」だったら整数を格納する4バイトの領域であるべきじゃね?
354デフォルトの名無しさん:2008/07/01(火) 21:50:52
>>351
思想って何だよ?w
355デフォルトの名無しさん:2008/07/01(火) 21:53:05
int i,*p,a[42],(*f)(int);
とかいっぺんに宣言できて便利じゃん。
356デフォルトの名無しさん:2008/07/01(火) 21:55:45
多少の便利さは犠牲にしても、言語仕様は論理的かつ簡潔であった方が美しいと思う
357デフォルトの名無しさん:2008/07/01(火) 21:57:06
簡潔かどうかはさておき、少なくとも論理的ではある。
358デフォルトの名無しさん:2008/07/01(火) 21:57:27
全然
359デフォルトの名無しさん:2008/07/01(火) 22:00:27
int a, b, *c
と宣言した場合に、aとbは整数を格納する領域なのに、cだけがアドレスを格納する領域となる。
型名は同じで、あとは変数名を並列しただけなのに意味上の差が出る。これがどう論理的なのさ?
360デフォルトの名無しさん:2008/07/01(火) 22:02:02
>>359
aとbはint型、cはint*型。
なんで型名が同じなの?
361デフォルトの名無しさん:2008/07/01(火) 22:03:48
>>359
わざわざcにだけ変なもんつけてんじゃんw
それで意味上の差が出ないほうが非論理的だよ
362デフォルトの名無しさん:2008/07/01(火) 22:04:59
#include <stdio.h>

typedef 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;
}

ピンとこない結果だよね。
363デフォルトの名無しさん:2008/07/01(火) 22:08:01
(コンパイル&実行中。しばらくお待ちください。)
364デフォルトの名無しさん:2008/07/01(火) 22:08:39
>>360
そう、実際は型名自体が変わってしまう。こんなことポインタだけの例外じゃん。
素直にintとint*で宣言を分割させれば、例外なんて作らずにより簡潔にできたってことだろ。

>>361
型の決定に加えて、何か更にオプション的な要素が追加されるってんなら話はわかる。
でも、*を付けただけで型自体が変わってるじゃん。これは非論理的だと思うが。
365デフォルトの名無しさん:2008/07/01(火) 22:11:31
>>354
煽り目的は目障り
366デフォルトの名無しさん:2008/07/01(火) 22:12:07
int 〜
という宣言文はint型の変数だけでなく、int派生型もすべて宣言できるように
したところに混乱の元があるような

typedefは特定の型のみを対象とするのでそのような挙動に
367デフォルトの名無しさん:2008/07/01(火) 22:12:15
>>365
思想とやらを説明してみろよ
368デフォルトの名無しさん:2008/07/01(火) 22:12:37
>>367
人違い
369デフォルトの名無しさん:2008/07/01(火) 22:13:23
>>364
> こんなことポインタだけの例外
配列型も関数型も関数ポインタ型も同様だよ。
370デフォルトの名無しさん:2008/07/01(火) 22:14:07
typedef char *pc
pc a, b =*(a,b)

こんな宣言ありえんが
371デフォルトの名無しさん:2008/07/01(火) 22:16:16
>>367
説明できないので逃げました
372デフォルトの名無しさん:2008/07/01(火) 22:16:53
>>367
int で始まる宣言がint型の宣言のみに使うのではないという考え。
373デフォルトの名無しさん:2008/07/01(火) 22:19:38
>>372
心許ないからアホは黙ってろ。
374デフォルトの名無しさん:2008/07/01(火) 22:19:54
>>352
C#?C++?
375デフォルトの名無しさん:2008/07/01(火) 22:20:47
>>372
それによって、宣言の先頭を見ただけでは型名が決定できないというデメリットが生じた。
それを補って余りあるメリットがあるの?
376デフォルトの名無しさん:2008/07/01(火) 22:23:15
>>375
intとintのポインタを同時に宣言するときにタイプ数が減るという素晴らしいメリットが生じた。
377デフォルトの名無しさん:2008/07/01(火) 22:23:29
>>375
int a, b[10];
と書かれた行を見て、bがint型ではないことに対しても不満ってことでよろしい?
378デフォルトの名無しさん:2008/07/01(火) 22:31:39
レスがつかないのがさみしい。
不満なのであれば、配列についてもこまめに
typedef int int_array_10[10];
int_array_10 a, b;
などとやっていただきたいし、
不満ではないのであれば、ポインタの宣言に対して目が慣れてないだけとしか。
379デフォルトの名無しさん:2008/07/01(火) 22:38:10
では要するに、論理的であることよりも、タイプ数を減らすことを重視したわけ?
380デフォルトの名無しさん:2008/07/01(火) 22:39:48
普通に論理的だよ。
論理的じゃないと思うのは理解力が足りないだけ
381デフォルトの名無しさん:2008/07/01(火) 22:40:40
という事にしたいのですね
382デフォルトの名無しさん:2008/07/01(火) 22:41:24
後付けの論理だろ。
タイプ数を減らしたいがための、いわばこじつけだろ。
383デフォルトの名無しさん:2008/07/01(火) 22:42:05
いいえ,事実です。
384デフォルトの名無しさん:2008/07/01(火) 22:45:09
*int って書き方できたらいいのに
*int a,b,c = int *a,*b,*c って意味で
385デフォルトの名無しさん:2008/07/01(火) 22:47:35
宣言時のint *aと、使用する時の*a = 100で、*の意味が変わってくるのも気に入らない
386デフォルトの名無しさん:2008/07/01(火) 22:49:20
タイプ数が少なくなるとかw
派生型を明示的なほかの型にしちゃうと型が掛け算で増えちゃって大変じゃん。
それをやったのがLPTSTRとかLPCTSTRとかなんだけどね。
387デフォルトの名無しさん:2008/07/01(火) 22:49:34
>>385
いや。全く変わっていない。
388デフォルトの名無しさん:2008/07/01(火) 22:49:57
そんなこといったら乗算演算子はどうすればいいんだ
389デフォルトの名無しさん:2008/07/01(火) 22:50:33
>>385
int*a;はデリファレンスしたものがintであるような型でaを宣言してるだけ。
390デフォルトの名無しさん:2008/07/01(火) 22:51:15
型が増えても別に大変じゃないと思うが。基本形から容易に予測できるなら問題無い。
391デフォルトの名無しさん:2008/07/01(火) 22:51:50
分かりにくいよ派が劣勢になってきたようです
392デフォルトの名無しさん:2008/07/01(火) 22:53:13
論理的であるとは一貫した法則があるということで、それはCの規格において厳密に定められている。
規格を読んだことがないのなら問題外であるし、もしその法則が性に合わないというなら、
今すぐCコンパイラをWindowから放り出すことをお勧めする。
393デフォルトの名無しさん:2008/07/01(火) 22:53:53
>>387
後者の*は、aの示すアドレスの中身を見るためのものだよな。
前者も同じだと言うの?宣言時に不明なaの中身を見てどうすんの?
394デフォルトの名無しさん:2008/07/01(火) 22:55:37
お前ら荒らし相手につきあいいいな
395デフォルトの名無しさん:2008/07/01(火) 22:56:22
レス乞食だから
396デフォルトの名無しさん:2008/07/01(火) 22:56:45
>392
うまいこと言ったつもりか!!
397デフォルトの名無しさん:2008/07/01(火) 22:57:33
>>373
アホじゃないあなたの口から!説明を!今から!
398デフォルトの名無しさん:2008/07/01(火) 22:58:48
>>393
int *a;

はaの中身を見たときにintであるようにaを宣言する。と読めばいい。
399デフォルトの名無しさん:2008/07/01(火) 23:00:57
を指すポインタ
と読めばよい
400デフォルトの名無しさん:2008/07/01(火) 23:04:39
>>398
なるほど。しかしその場合、a自体はどうなる?
aは自動的にポインタ型に定義されることになるの?
一つの宣言で二つのものが定義されるならばそれは例外的な処理じゃないか。
401デフォルトの名無しさん:2008/07/01(火) 23:05:35
のアドレスと読めばいい
402デフォルトの名無しさん:2008/07/01(火) 23:06:27
>>400
日本語の通じないかたはお帰りください
403デフォルトの名無しさん:2008/07/01(火) 23:09:21
俺らがどうこう言っても仕方ない
黙って従うしかない
404デフォルトの名無しさん:2008/07/01(火) 23:09:41
>>400
あたまわるいだろ
405デフォルトの名無しさん:2008/07/01(火) 23:09:54
int *a;
の場合には
*a と書くと int になる変数と考えればいいんじゃない?

int (*b)(int, int);
の場合には
(*b)(1, 2); // * は省略可能
と書くと int になるとか
406デフォルトの名無しさん:2008/07/01(火) 23:10:33
>>398は教え方としてはわかりやすい。
しかし今の論点は、intと型名を書いてるのに宣言されるものがint型ではないのがおかしい、ってことだろ。
Cの規則はこういうところで筋が通っていない。
407デフォルトの名無しさん:2008/07/01(火) 23:11:54
>>405
それならint *a = 100みたいな書き方もOKにすべき
408デフォルトの名無しさん:2008/07/01(火) 23:12:04
>>406
なんで「int」しか見ないの?
409デフォルトの名無しさん:2008/07/01(火) 23:14:37
>>408
なんで「int」以外も見なくちゃいけない仕様にしたの?
410デフォルトの名無しさん:2008/07/01(火) 23:15:42
宣言時の記述と、コード内で出現する記述をなるべくあわせたから、だったと思う。

int &a;
であった方が分かりやすかったということ?
411デフォルトの名無しさん:2008/07/01(火) 23:16:56
>>409
もう一度聞くが、
int a, b[10];
と書かれている場合、bの型を知るためにはintだけ見ていてはダメだよね。
それについても問題視しているの?
412デフォルトの名無しさん:2008/07/01(火) 23:17:55
およそ人間の作り出したどんなルールも、人間生来に身についているものではない。
これは、ルールを理解するということは、それだけでひとつのタスクであることを意味する。

あえて言い切ってしまえば、規格を理解するのはプログラマの能力であり義務である。
もし君がC規格を理解することができないなら、君にはCは使えない。
そしてよほど状況認識に問題のある人間でない限り、
使えないものを無理矢理使わせようとする者はいない。
こんなところで言いがかりめいた愚痴を垂れ流す暇があったら、
別な言語を勉強することに時間を割いたほうが、きっと有意義である。
413デフォルトの名無しさん:2008/07/01(火) 23:18:11
してるよ
414デフォルトの名無しさん:2008/07/01(火) 23:20:36
なんかもう釣りに見えてきた
釣りじゃなかったらよっぽど・・・
415デフォルトの名無しさん:2008/07/01(火) 23:21:54
そういう風に決まっているから
というのが正しい答えだと思う

気に入らなければC言語なんて使わずに自分で言語を作ればいい
416325: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);宜しくお願いします。
417デフォルトの名無しさん:2008/07/01(火) 23:22:12
>>413
では、配列はどのように宣言できればスマートだったであろうか?
int [10] a, b;であれば分かりやすい?
それとも、それでは要素数の異なる配列を宣言するのが困難であると、
int [] a 10, b 10;のような表記にしておけばよかった?
前者であれば要素数が異なる場合に不便であり、
後者であれば結局は要素数を知るために int [] のみを見ていてはだめということになる。

というか、対案だしてください。
418デフォルトの名無しさん:2008/07/01(火) 23:23:47
>>417
int[10] a;
int[20] b;でいいよ。
一文にまとめる必要が無い。
419デフォルトの名無しさん:2008/07/01(火) 23:24:59
>>410
&int a;
だね。
420デフォルトの名無しさん:2008/07/01(火) 23:25:59
結局、便利さを追求するために例外的なこじつけを作り出したってことだろ。認めろよ。
421デフォルトの名無しさん:2008/07/01(火) 23:26:14
>>417
自分でもわかってるじゃん。正解はないって
かまってちゃんにしか見えないお
422デフォルトの名無しさん:2008/07/01(火) 23:27:52
>>420
言語作成者が神です
その言語を使用する以上は神に従うしかありません
423デフォルトの名無しさん:2008/07/01(火) 23:28:07
>>416
君のやろうとしていることは、ただ単にSJISの2バイト表現をJISの2バイト表現に変更しているだけである。
実際にはSJISのコードは2バイト表現だけからなっているわけではないし、JISで2バイト表現を使うにはシフト処理が必要である。
もう一度それぞれの文字コード仕様を読み直すこと。
424デフォルトの名無しさん:2008/07/01(火) 23:28:07
>>417

var
a: array [0..9] of integer;
b: integer;
425デフォルトの名無しさん:2008/07/01(火) 23:28:59
>>417
同じものを複数宣言するなら一文でもいいが、違うものを宣言するなら複数の文。
俺のスタンスはずっとこうだよ。
426デフォルトの名無しさん:2008/07/01(火) 23:31:23
>>420
絶対に間違っている点がひとつ
それを認める権利ないし責任があるのは規格を制定した人間で、俺らではない
427デフォルトの名無しさん:2008/07/01(火) 23:31:50
>>424
カーニハンはツンデレだったのか!
428デフォルトの名無しさん:2008/07/01(火) 23:33:24
くっだらね
自分の頭の悪いのを言語のせいにするようなバカはとっとと寝ろ
429デフォルトの名無しさん:2008/07/01(火) 23:35:06
>>421
俺は今の仕様で何も問題ないと思ってるよ
430デフォルトの名無しさん:2008/07/01(火) 23:35:54
いつまで規格を読んだこともないようなやつの相手してるんだ
431デフォルトの名無しさん:2008/07/01(火) 23:36:54
ひ、百の嫌いな理由なんて、
432デフォルトの名無しさん:2008/07/01(火) 23:38:04
与えられたものを盲目的に受けることしかできない能無しは黙ってろ
433デフォルトの名無しさん:2008/07/01(火) 23:39:32
>>432
これが欲しいのか?
#define BEGIN {
#define END }
434デフォルトの名無しさん:2008/07/01(火) 23:42:20
(相手したくなければ静かに去ればいいのに。)
435デフォルトの名無しさん:2008/07/01(火) 23:44:44
>>420
少ないキー入力でプログラミングを打ち込むことができる
これがC言語開発者の考えのひとつなんだよ

したがって、ハショっているところはいくつかあるし
言語仕様として美しくないところもある
436デフォルトの名無しさん:2008/07/01(火) 23:47:06
何が嫌いでじゃなくて、何が好きかで自分を語れよ!!
437デフォルトの名無しさん:2008/07/01(火) 23:47:16
彼のいう例外的な部分が何を指してるのか分からないしなあ
438デフォルトの名無しさん:2008/07/01(火) 23:51:29
439ヒント:2008/07/01(火) 23:53:03
type

cell=^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個以上
名称の変更やエイリアスはコーディングルールで一切不可!

一度名前を自由に付けることが許され、その後それに修正を許さないような
特権を与えた場合、後々の人がそれによって、どのような苦労をさせられるかの例
440デフォルトの名無しさん:2008/07/02(水) 00:02:41
やべえ、ここまで普及するなら、もっとちゃんとした言語仕様にしとくんだった

そうカーニハンは悔やんでいるかもしれない

いくつかの規格の変遷を経て、仕様はかわってきているけどね

441デフォルトの名無しさん:2008/07/02(水) 00:07:18
一方、リッチーはcreatをcreateにしとくべきだったと悔やんだ。
442デフォルトの名無しさん:2008/07/02(水) 00:08:11
既にそういう発言してなかったっけ?
リーナスの方かもしれない
443デフォルトの名無しさん:2008/07/02(水) 00:12:27
HTMLの<>内を抽出した後、その中から属性名と属性値を取り出し、
属性名hrefがあれば、属性値をEditBoxに出力する、というプログラムを作っているのですが、
二次元配列に<>内の属性名と属性値を一括で抽出して一括でhrefであるか比較していき
hrefであれば、出力するか、
それとも<>内から一つずつ属性名と属性値を抽出し、その都度hrefかどうか比較して
hrefであれば出力するか
どちらが良いでしょうか?
それを選んだ理由も教えて下さい。
444デフォルトの名無しさん:2008/07/02(水) 00:17:49
一次元配列に属性名と属性値を順にいれておき、
インデクスを2づつすすめながら処理する。
<eXpat/>の仕様にあわせた。
445デフォルトの名無しさん:2008/07/02(水) 00:20:28
>>443
前者はソースコードを見たときに処理内容が把握しやすい
後者はエンドユーザが使いやすい

HTMLがローカルファイルであり、ファイルサイズが小さいならば前者
HTMLがWeb上のファイルであり、ファイルサイズが大きいならば後者
その他の場合は状況に応じて
446デフォルトの名無しさん:2008/07/02(水) 02:35:25
int *a, **b, c;
みたいに結果の型をそろえた書き方は、、
struct Node *head, **curr = &head;
こんなのしか思い浮かばぬ
447デフォルトの名無しさん:2008/07/02(水) 03:38:18
やりたくなければやらなければいいだけよ
448デフォルトの名無しさん:2008/07/02(水) 03:58:30
ポインタは特別なものではない。何の変哲もない変数であり、また、型と変数は別のものである。
int型へのポインタ、double型へのポインタ、構造体型へのポインタ、関数型へのポインタなど。
これらが存在し得るのは、型と変数が別々に存在するから。ポインタとは型ではなく、変数であることを理解すること。

言語仕様として「キーワードを区切らない形での空白」はどのように書いても許容される。
だからint* aでもint *aでも、書き方として許されている。あとはどちらが読み手に誤解を与えないかというだけ。
しかし認識として正しいのは、「intポインタ型の、変数a」ではなく、「int型の、ポインタ変数a」である。
449デフォルトの名無しさん:2008/07/02(水) 04:05:41
×int型の、ポインタ変数a
○int型への、ポインタ変数a
450デフォルトの名無しさん:2008/07/02(水) 07:54:33
>>416
新JIS 1B 24 42
ASCII 1B 28 42
451デフォルトの名無しさん:2008/07/02(水) 10:04:10
char型が9ビットの処理系もあると聞いたのですが、
どのような理由で9ビットなのですか?
452デフォルトの名無しさん:2008/07/02(水) 10:14:51
>>451
36bit word の内部を任意のフィールドに区切って使用可能
使用するchar codeにもよるが, 4 char から 6 char 格納可能
PDP 10 とか調べると幸せになれるかも...
453デフォルトの名無しさん:2008/07/02(水) 16:46:03
sizeofについての質問なんですが

char HOGENAME[] = "<HOGEHOGE>";
HOGERead(HOGENAME,sizeof(HOGENAME));

といった配列の長さをある関数に渡す際にsizeofが算出する文字数は純粋な文字数?
それとも文字数に終端コード分+1が正解?
454デフォルトの名無しさん:2008/07/02(水) 16:49:25
+1
455デフォルトの名無しさん:2008/07/02(水) 16:51:41
それくらい自分で試せば?

char str[] = "abc";
printf("%d", sizeof str);

とでもやればここで聞くより早いだろうに。
456453:2008/07/02(水) 16:52:34
レスありがとうございます。
457453:2008/07/02(水) 16:54:45
>>455
あ、一応自分で試したというか、構造体なんかと同じで+1されないつもりで
組んだプログラムが思ったように動かなくて調査してたらどうも+1されてそうな
感じなのでその認識が間違ってないかで質問させていただきました^^;

この辺の話ってCやってる人だと当たり前なのかぐぐっても
でてこなかったような感じだったので・・・
458デフォルトの名無しさん:2008/07/02(水) 17:01:30
>>457
C 文字列 サイズ
で, ぐぐると, こんなページが引っ掛かるわけだが…
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.7.4.html
459デフォルトの名無しさん:2008/07/02(水) 17:10:33
>>457
配列の大きさは記憶領域の大きさであって、
文字列の実質的な部分がどうたら、という内容には関係ないよ。
もし、記憶領域の大きさから文字列の長さを推定するような処理を書いているとしたら、
ビミョーではないかと思う。
460453:2008/07/02(水) 17:14:34
>>458
すみませんorz

>>459
この場合はstrlenで行かないとまずい感じですかね?
461デフォルトの名無しさん:2008/07/02(水) 17:26:58
>>460
配列の長さを渡したいんだったらstrlenは常にダメじゃないか?
462デフォルトの名無しさん:2008/07/02(水) 17:41:00
配列の長さなら+1しなくてもいいよ
463デフォルトの名無しさん:2008/07/02(水) 18:40:03
質問なんですが
#define MEM_FREE(x) do{ \
if(x != NULL){ \
free(x); \
x = NULL; \
} \
}while(0)
のバックスラッシュは何なのでしょうか
お願いします
464デフォルトの名無しさん:2008/07/02(水) 18:42:36
マクロを定義するときのお決まり?といったほうがいいのかな?

465デフォルトの名無しさん:2008/07/02(水) 18:43:03
行末の改行文字をエスケープしてるです
一行にずらーっと書いてるのと同じ
466デフォルトの名無しさん:2008/07/02(水) 18:44:36
>>464>>465
お早い返答ありがとうございます
やっと理解することができました
ありがとうございました
467デフォルトの名無しさん:2008/07/02(水) 18:47:08
>>465 じゃないけど補足
バックスラッシュの後ろに空白とかタブが入ってると素敵な体験ができます
納期間近でテンパッてるときなんか特にw
468デフォルトの名無しさん:2008/07/02(水) 18:47:26
>>463
#defineは2行以上にまたがる場合は後ろに\を付けるんだYO

#define M(s) printf("%s\n",\
s)
とかね。
ちなみにそのマクロなんだが、使用しないほうがいい。
p="freeしてはならない文字列ポインタ";
MEMFREE(p);
とかしがちなんで。
469デフォルトの名無しさん:2008/07/02(水) 18:51:59
>>463
っ「前処理指令 改行」
470デフォルトの名無しさん:2008/07/02(水) 19:01:21
マクロ関数はプリプロセッサに過ぎないので、行数を少なくする為だけの目的で使うのは本来的には邪道。
重大なバグの原因になる。
C99ではinlineとか出来てるらしいから、マクロではなくinline関数とか利用するほうが正統性が高いよ。
古いCの凝ったマクロは使わないほうが安全。
471デフォルトの名無しさん:2008/07/02(水) 19:19:51
>>463
#define は改行があるとそこで終了してしまう
改行をなかったことにするために\をつける
472デフォルトの名無しさん:2008/07/02(水) 19:37:52
C99に対応してれば、ね
473デフォルトの名無しさん:2008/07/02(水) 19:45:16
>>468
そんなもんマクロにくるまなくても同じだろう

そのマクロは、freeにヌルポインタを渡したときに
何もしないことが保証されていなかった古い実装のためのものだね
現在では最初のifの意味がない、が正しい
474デフォルトの名無しさん:2008/07/02(水) 20:01:03
>>470
行数を少なくすることはそれなりに重要なことである。なぜならそれは保守性に貢献するからである。
inline が使える環境が決して多数でない現状、もちろん関数を使ったほうがよい場合は多いけれど、
実行速度を重視してマクロを使用する選択肢は、決して邪道ではない。
475デフォルトの名無しさん:2008/07/02(水) 20:04:28
マクロは速度には効果があるけど、プロ向けではない。 オブジェクト指向にあってない。
変数もマクロで定義すると複雑になる。
476デフォルトの名無しさん:2008/07/02(水) 20:08:35
>プロ向けでない
んなアホな
プロこそ現実のどうしようもない制限の枠内で妥協を図るものだろう

そもそもCはオブジェクト指向言語じゃないし
477デフォルトの名無しさん:2008/07/02(水) 20:09:26
>>474
邪道だと思う。
実行速度云々の世界なら profile して呼び出しの多い関数への引き渡しを見直すとかそういうのがいいのでは?
マクロの多用はとにかくトラブルの元になりがち。
478デフォルトの名無しさん:2008/07/02(水) 20:09:35
仕方がないとはいえC++と話がまざるとどうしてもおかしくなるな
479デフォルトの名無しさん:2008/07/02(水) 20:11:52
>>474
マクロにするぐらいで速くなる場合ってそんなに多いかな?
480デフォルトの名無しさん:2008/07/02(水) 20:12:10
>477
そんなことはとっくにやった上での話だろう
トラブルを起こすのは大抵の場合マクロが悪いんじゃなくて使う奴が悪いし
マクロを使うことでなくせるトラブルもある
481デフォルトの名無しさん:2008/07/02(水) 20:13:37
>>479
違う
もともとベタで数行書いていた処理を
関数ではなくマクロにするから遅くならないという話
482デフォルトの名無しさん:2008/07/02(水) 20:18:29
決まりきった一連の処理が二箇所以上で必要なときマクロでまとめるのはよくあること

あとはC++でも特にGUIを使う場合には定型だがクソ長いメソッドをマクロにしてしまうのもよくあること
483デフォルトの名無しさん:2008/07/02(水) 20:23:27
>482
いやC++ならinline使えよ
484デフォルトの名無しさん:2008/07/02(水) 20:31:30
標準ライブラリにもマクロで実装されているものあるしなぁ
関数とマクロの区別がついていればトラブルは起こらないわけだし

でもまあ大抵は関数使ったほうがいいよね
485デフォルトの名無しさん:2008/07/02(水) 20:44:51
マクロの利用目的
推奨度

1位:複雑な式の間違いの無い展開
2位:冗長性の高い初期データ設定時の設定ミス防止
3位:保守工程における関数合成共通化作業時(グローバル名前空間を浪費する似たような関数は一箇所にまとめて
公開名称にして、旧関数使用箇所ではマクロでパラメータで切り分ける新関数コードに置換)

3位クラスになると、管理者クラスじゃないとやらしてはもらえないね。多くの開発現場じゃ。
それ以外の使用は関数テンプレートだろうな精々。それでも関数テンプレート禁止の開発現場もあるし。
Cじゃもといできないし...
486デフォルトの名無しさん:2008/07/02(水) 20:50:23
はstdinなどもマクロであることが許されているので、処理系によってはまさにマクロになっているときがある。これが原因で茶筅が修正なしで移植できないことがあったことは、遠い昔のできごと。
487デフォルトの名無しさん:2008/07/02(水) 21:07:21
今日はマクロの話ですか
488デフォルトの名無しさん:2008/07/02(水) 21:19:48
昨日の宣言に今日の関数マクロ
的確に秘孔を突いてくる奴は間違いなくプロ
489デフォルトの名無しさん:2008/07/02(水) 21:53:07
明日の話題を大胆予想
1. name space
2. reentrant
3. goto
4. trigraph
490デフォルトの名無しさん:2008/07/02(水) 21:57:12
gotoは結論が出てるから面白くない
491デフォルトの名無しさん:2008/07/02(水) 22:11:44
メルセンヌツイスタについて詳しく
492デフォルトの名無しさん:2008/07/02(水) 22:22:50
ググレカス
493デフォルトの名無しさん:2008/07/02(水) 22:23:29
そういや以前マクロの中での\の意味を知らなくてファビョってたヤツがいたなw
あいかわらず、このスレや宿題スレで基地外長文を連投しまくってるが。
494デフォルトの名無しさん:2008/07/02(水) 22:26:24
>>493
基地外だという自己紹介乙w
それ、お前だろ?白々しいw
495デフォルトの名無しさん:2008/07/02(水) 22:27:27
>>493
うわっ、まだそんなことを思い出して、わざわざ書き込むなんて
お前の方が人間性が腐ってね?お前みたいな言動をする奴って
結局引きこもりなんだろ?かなり性格が悪いぞ。
496デフォルトの名無しさん:2008/07/02(水) 22:32:41
相変わらず自分のことは棚に上げて言いたい放題だなw
497デフォルトの名無しさん:2008/07/02(水) 22:34:36
>>493
> あいかわらず、このスレや宿題スレで基地外長文を連投しまくってるが。
それがそいつだと言う証拠は?IDもなし、トリップ無しで、不特定多数の人が
来る場所で、まだいると思っている妄想乙。お前がそういうのに過剰反応しているだけだろ。
もっとも、ファビョっているのはお前のようだが・・・自己紹介乙。
マクロの中の \ を知らなかったんだろ、お・ま・え・が?w
蒸し返す奴ほど、頭がおかしい。そういう奴の方が、常駐している人からしてみりゃ
迷惑で鬱陶しい。
498デフォルトの名無しさん:2008/07/02(水) 22:36:50
お前のファビョり長文連投がわからないやつなんていねーよw
499デフォルトの名無しさん:2008/07/02(水) 22:38:30
>>497
ああ、やっぱりこのゴミまだ居るんだ。
500デフォルトの名無しさん:2008/07/03(木) 00:23:44
すいません
メモリ消費がパソコン資源を超えるプログラムを実行した場合の挙動について
聞きたいんですが、OSからエラー吐き出されたりしますかね?
現状では実行した瞬間に終了するという感じで、それがプログラムのエラーなのか
メモリ容量不足が問題なのか知りたいのですが。
501デフォルトの名無しさん:2008/07/03(木) 00:27:31
>>500
自分で作成したプログラムですか?
デバッグでmainまで飛んでこないとかですか?
502デフォルトの名無しさん:2008/07/03(木) 00:43:28
>>500
環境は?あと、どんなプログラム?
503デフォルトの名無しさん:2008/07/03(木) 00:54:36
>>500
C言語の範疇で答えられることは、

スタックや静的変数とかが足りなくなった場合にどういう挙動をするかは環境による
malloc系の関数でメモリが足りなかったときにはヌルポインタが返されるので、
それを無思慮に使ったらたぶんアクセスエラーかなんかが起きて落ちる

ただよっぽどのことでないかぎり、メモリが足りないということはない
(OSもがんばって捻出しようとするから)
普通はまずプログラム自体のバグを疑うべき
504デフォルトの名無しさん:2008/07/03(木) 00:58:13
>>501
>>502
winxpのメモリ512M、コンパイラはborland、エディタはC言語をはじめようってやつです。
自分で作った分子シミュレーションのプログラムです。
今までデバッグが必要なほど長いプログラムを書いた事がないので
よく分らないのですが、
main関数で変数定義の後に3MBほどの入力ファイルを読み込んで、
書き出し用ファイルを作ったところで
scanfでプログラムをとめようとしたんですが
前述の状況となりました。
書き出しファイルもできてませんでした。

ちなみに
doubleで要素数3万の配列を8つと
3次元配列[50][50][50]を二つ定義しています。
505デフォルトの名無しさん:2008/07/03(木) 01:03:21
borlandだとわかんないな。
VC++の場合は途中のバージョンからスタックオーバーフローが
何もメッセージを出さずに落ちてしまうようになったから困ってるのだが。
ところでそのプログラムはGUIそれともCUI?
それからその配列はスタックかヒープかstaticにとってるかとかわかる?
506デフォルトの名無しさん:2008/07/03(木) 01:03:30
そのよっぽどのことか……
配列で連続的に確保できるメモリってそう多くないのよ
507デフォルトの名無しさん:2008/07/03(木) 01:05:33
いくら大量にメモリを積んでいても、その空き容量をそのまま配列にできるわけじゃない
大抵の場合分断されてて、一つの空き領域のカタマリとしてあるわけじゃないから
508デフォルトの名無しさん:2008/07/03(木) 01:06:56
>>504
とりあえず、でかい領域の変数を外部変数にしてみるとかだな。
509デフォルトの名無しさん:2008/07/03(木) 01:08:23
200M越えの配列か
静的宣言でなんとかなるものかねぇ
510デフォルトの名無しさん:2008/07/03(木) 01:10:41
>>504
それはスタックメモリオーバーだろう。
ボーランドだとコンパイラオプション-lS
でメモリサイズ指定するんだっけ。
0x400000位あればOKか
511デフォルトの名無しさん:2008/07/03(木) 01:17:20
>>509
その数字はどうやって出したの?

>ちなみに
>doubleで要素数3万の配列を8つと
>3次元配列[50][50][50]を二つ定義しています。

これだけ見る限り、俺の計算ではdouble1つで8バイトだとしても、
何回計算しても4M弱になっちゃうんだけど...
512504:2008/07/03(木) 01:17:27
>>505
データは数字で出力してそれをAVSというソフトで可視化するという感じなので
CUIですかね、ちょっと用語の意味が分からず答える事ができないのですが(汗
不勉強で申し訳ありません。
>>506-510
返答ありがとうございました。
プログラムの勉強をして出直してきます。
どうもすいません。
513デフォルトの名無しさん:2008/07/03(木) 01:32:54
>>498
パブロフの犬のごとく反応しているよな、お前w
別人に噛み付いて、あっお前か?って揺さぶり、煽りだろ?
お決まりのパターンだな。。。だからねらーはキモイって言われるんだよw
514デフォルトの名無しさん:2008/07/03(木) 01:35:52
>511
壮絶な勘違いですた
死ね俺
515デフォルトの名無しさん:2008/07/03(木) 18:47:10
同じヘッダファイルを2回インクルードしても何も変わらない?
516デフォルトの名無しさん:2008/07/03(木) 18:55:47
多重読み込みを考慮してるかどうかで変わる
517デフォルトの名無しさん:2008/07/03(木) 20:30:54
>>515
厳密には、そのヘッダファイルの内容による
べき乗を考慮してないヘッダなら多重定義でエラーになるだろうし、
複数回読み込まれると何かの値が変化するように作ることも可能

一般的には、つまり普通のライブラリが用意しているヘッダなら、変わらない
518デフォルトの名無しさん:2008/07/03(木) 20:34:29
二次元配列を関数に渡す時に例えば、array[][2]と渡せば
2列目のポインタを渡した事になりますでしょうか?
519デフォルトの名無しさん:2008/07/03(木) 20:41:14
>>518
Cでは列単位で配列を切り分けることは不可能
処理の中で1列目を読み飛ばすしかない
520デフォルトの名無しさん:2008/07/03(木) 20:42:08
>>518
残念ながら無理です
521デフォルトの名無しさん:2008/07/03(木) 20:42:21
サイズが2である配列が格納されている配列のポインタが渡されることになる
具体的には、array[3][2]や、array[5][2]などを渡したいときにそのように書く
522デフォルトの名無しさん:2008/07/03(木) 20:44:03
なんかずれたことかいてしまた。
>>521は受け取る側の話なので無視してください
523デフォルトの名無しさん:2008/07/03(木) 20:45:37
>>519>>520>>521
そうですか、詳しい説明ありがとうございます。
524:2008/07/03(木) 21:24:24
教えてほしいです。
戻り値unsigned shortの関数があります。それを
unsigned charZ[32]で受け取りたいのですが、どのように行うのがよいでしょうか?
525デフォルトの名無しさん:2008/07/03(木) 21:40:30
>>524 うーむ、理解不能。もっと詳しく。
526デフォルトの名無しさん:2008/07/03(木) 22:09:59
>>524
残念ながら、Cではそれを簡単に行う方法はありません。
プログラムを見直して、どちらもintに統一するのがよいでしょう。
そうすればスマートかつ移植性の高いプログラムになります。
527デフォルトの名無しさん:2008/07/03(木) 22:15:54
sprintfが使えるか?
528デフォルトの名無しさん:2008/07/03(木) 22:20:48
>>524
関数の戻り値をunsigned char Z[32]の先頭で受け取ったとしたら
Z[0]とZ[1]に分けてアクセスしたいとかそういう話?
529デフォルトの名無しさん:2008/07/03(木) 22:21:57
共用体
530デフォルトの名無しさん:2008/07/03(木) 22:23:02
文字列に変換するか、バイトに分割して入れるかのどっちかだろうけど、>>524にもどっちかわからないんだろうなぁ。
531524:2008/07/03(木) 23:00:01
すいません。524です。
うまく伝えれませんでした。

【前提条件】
・unsigned shortの関数は外部提供関数です。
・unsigned charZ[32]はこちらで定義してるのですが変更できません。
・unsigned charZ[32]ですが、実際、使用するのは[0][1]の16ビットのみです。

@やりたいことは、unsigned shortの関数を発行する。
Aunsigned shortの戻り値を何らかの処理をしてunsigned charに変換する。
BAで変換した値を8ビットずつZ[0]、Z[1]に入れる。

という事を行いたいです。Aがわかりません。
なんかシフト演算を使用すればよい聞いています。
しかも、一行ですむとか。

ググル事もできないアホ女です。宜しくお願いします。
532デフォルトの名無しさん:2008/07/03(木) 23:03:47
ヒントは出てる
ググレメス
533デフォルトの名無しさん:2008/07/03(木) 23:23:37
>>531
一行ですむ&シフト演算 って難しいじゃないか
一行っていうとキャストしか思い浮かばない(バスエラー?99%大丈夫)
534デフォルトの名無しさん:2008/07/03(木) 23:31:09
memcpyで、と思ったけどエンディアンとか考えないと駄目なのか
535デフォルトの名無しさん:2008/07/03(木) 23:51:34
これを1行でやれってこと?

unsigned charZ[32];

unsigned short HogeA = hogehoge();

unsigned charZ[0] = (char)(HogeA >> 8);
unsigned charZ[1] = (char)(HogeA & 00FF);
536デフォルトの名無しさん:2008/07/03(木) 23:52:20
unsigned charZ[32];

unsigned short HogeA = hogehoge();

unsigned charZ[0] = (unsigned char)(HogeA >> 8);
unsigned charZ[1] = (unsigned char)(HogeA & 00FF);
537デフォルトの名無しさん:2008/07/03(木) 23:57:22
エンディアンの話もあるけれど。

unsigned 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]);
538デフォルトの名無しさん:2008/07/04(金) 00:06:20
そんなのはもう2行で書けよ。
539デフォルトの名無しさん:2008/07/04(金) 00:10:10
キャストなんていらなくね?

Z[0] = a >> 8, Z[1] = a;
printf("%d %d\n", Z[0], Z[1]);
540デフォルトの名無しさん:2008/07/04(金) 00:11:34
(Z[0] = a >> 8) && (Z[1] = a);
じゃあこう
541540:2008/07/04(金) 00:12:18
ごめんうそ。調子に乗った。
542デフォルトの名無しさん:2008/07/04(金) 00:12:23
>>540
それはまずいよw
543デフォルトの名無しさん:2008/07/04(金) 00:55:54
画像認識で自転車を認識したいのですが、どのように認識させていいのかわかり
ません。
今は自転車の簡単な特徴点をテンプレートととして用意してその点を認識させよ
うとしているのですが
なかなか認識させることができません。(テンプレートは自転車の車輪を想定し
て円状に点を6点取っています。

うまく自転車を認識させる方法がありましたら教えてください。

544デフォルトの名無しさん:2008/07/04(金) 01:02:22
>>537
http://codepad.org/hePKeIdy
%xで
----
aa bb
bb aa
----
どっちだろうな
WindowsSDKの上位・下位byteを取得するマクロは上と同じだったと思うが
545デフォルトの名無しさん:2008/07/04(金) 01:10:35
>>543
三輪車のテンプレートから車輪をひとつとる
546545:2008/07/04(金) 01:11:25
なーんてね。スレチだから画像認識関連のスレできいてね。
547デフォルトの名無しさん:2008/07/04(金) 01:14:14
スレ違いでしたか(汗
すいません
了解しました
548デフォルトの名無しさん:2008/07/04(金) 02:25:17
OpenCVのスレとかあったな
549デフォルトの名無しさん:2008/07/04(金) 07:29:52
よくtypedef int _int みたいなことしてるけど
なんでこんなことするんですか?
すごいわかりずらくなってるんですが?
550デフォルトの名無しさん:2008/07/04(金) 07:30:51
× わかりずらく
○ わかりづらく
551デフォルトの名無しさん:2008/07/04(金) 07:40:41
よくtypedef int _int みたいなことしてるけど
なんでこんなことするんですか?
すごいわかりづらくなってるんですが?
552デフォルトの名無しさん:2008/07/04(金) 07:45:22
>よくtypedef int _int みたいなことしてるけど
いったいどこの国でよくしてるのか詳しく
553デフォルトの名無しさん:2008/07/04(金) 08:01:34
どこの国がよくしてるかはわかりませんが
たしかにみたことはあるんです。
554デフォルトの名無しさん:2008/07/04(金) 08:10:06
そんな、_intみたいな、というおぼろ気な記憶じゃなくて
正確な記述を持って来たら説明してやるよ
555デフォルトの名無しさん:2008/07/04(金) 08:14:08
じゃあglibの gintとかでどうでしょうか。
556デフォルトの名無しさん:2008/07/04(金) 08:19:14
みたことがあるていどのものを
よくしてる
とはふつうひょうげんしませんよ
557デフォルトの名無しさん:2008/07/04(金) 08:26:06
そうでした。質問のしかたがわるかったです。すみません。

よくしてるかどうかわかりませんがtypedef int _int みたいなことしてるけど
なんでこんなことするんですか?
すごいわかりずらくなってるんですが?
改めておねがい致します
558デフォルトの名無しさん:2008/07/04(金) 08:27:52
やった人に聞いてください
559デフォルトの名無しさん:2008/07/04(金) 08:28:37
そんなもんそれを書いたやつに直接聞け
560デフォルトの名無しさん:2008/07/04(金) 08:29:59
>>557
判断材料が少なすぎてなんとも答えようがありません
該当のソースをまるごとアップロードするか
ソースの作成者本人に聞いてください
561デフォルトの名無しさん:2008/07/04(金) 08:30:01
直感的に表現方法を変えたかったとしか思えない
562デフォルトの名無しさん:2008/07/04(金) 08:36:33
glibのgintとかは全然わかりやすいのでおしゃれ的にはありだとおもうの
ですが たとえばカーネルソースとか明らかにわかりずらくなってて
おしゃれ的になしだとおもうのですが理由があるのかなあとおもったのですが
563デフォルトの名無しさん:2008/07/04(金) 08:37:02
環境によってサイズが変わる型だからでは
564デフォルトの名無しさん:2008/07/04(金) 08:37:32
× わかりずらく
○ わかりづらく
565デフォルトの名無しさん:2008/07/04(金) 08:39:06
移植性の高い方法で書こうと思ったけどやってみるとそうでもなかった
566デフォルトの名無しさん:2008/07/04(金) 08:39:23
おしゃれ的
おしゃれ的ってなんだ
567デフォルトの名無しさん:2008/07/04(金) 08:45:45
環境によってサイズが変わる型だからでは

そっかなんとなくわかるかもしれないです。
いまからよくかんがえてみます。
みなさま本当にありがとうございました。
568デフォルトの名無しさん:2008/07/04(金) 10:14:25
charやshortをBYTEやWORDに置き換える人?
569デフォルトの名無しさん:2008/07/04(金) 10:14:28
環境によってCのソースファイルのサフィックスが.cで無い場合ってありますか?
570デフォルトの名無しさん:2008/07/04(金) 12:56:06
別に.cである必要がないと思うけど
571:2008/07/04(金) 13:35:37
お願いします。教えてほしです。
@unsigned charM[2]の値を何らかの処理をしてunsigned Shortに変換する。
A@で変換した値をunsigned ShortN[2]にセットする。
この処理を行いたいです。
M[0]をシフト演算で左8ビット。
M[1]を(0X000FF&M[1])と操作しましたが上手くいきません。
572デフォルトの名無しさん:2008/07/04(金) 13:39:20
>>571
M[0]を8ビット左シフトしたら中身0だと思うよw
一旦
unsigned Short wm0 = (short)M[0];
unsigned Short wm1 = (short)M[1];
といったshortの器に入れて

(wm0 << 8 | (0x00FF & wm1))
とかね。

wm1はマスクいらないかな?
573デフォルトの名無しさん: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];
574デフォルトの名無しさん:2008/07/04(金) 13:43:21
>>566
ノールッキンバックさ
575デフォルトの名無しさん:2008/07/04(金) 13:43:28
あ、すまん

>unsigned ShortN[2]
これって2つあるってことはM[0] とM[1] をそれぞれ加工して別に入れるでいいのかな?

だったら>>572-573は合成しちゃってるのでだめだ
576575:2008/07/04(金) 13:46:17
ShortN[0] = (unsigned short)M[0];
ShortN[0] = ShortN[0] << 8;
ShortN[1] = (unsigned short)M[1];
577:2008/07/04(金) 13:48:13
ありがとうございます。
575さん。結局は一つにします。操作しやすいと思って配列にしてます。
578デフォルトの名無しさん:2008/07/04(金) 14:34:01
>>524の人?
まあ、誰かは関係なく、こちらもエンディアンを意識する必要があると思うがな
分割した方法によって結合する方法が変わる
579デフォルトの名無しさん:2008/07/04(金) 15:04:07
初心者質問ですみません。
下記のソースの違いについて教えてください。

1、*mjd[3]
2、(*mjd[3])
580たすけて:2008/07/04(金) 15:17:37
5次方程式 
  f(x)=x^5ー8x^4ー26x^3+56x^2+48xー1=0
の実根のひとつを小数点以下7位まで求めよ
581デフォルトの名無しさん:2008/07/04(金) 15:18:41
スレ違い&マルチすんなゴミ
582デフォルトの名無しさん:2008/07/04(金) 15:34:57
>>579
同じ。
聞きたいのは、(*mjd)[3] じゃないの?
583デフォルトの名無しさん:2008/07/04(金) 17:58:37 BE:730742764-2BP(300)
関数の引数に多次元配列の変数を指定することってできますか?
584デフォルトの名無しさん:2008/07/04(金) 18:00:35
>>583
できます
585デフォルトの名無しさん:2008/07/04(金) 18:01:21
>>583
アドレスを渡せば可能
586デフォルトの名無しさん:2008/07/04(金) 18:01:30 BE:2466256199-2BP(300)
>>584
どうやってするんですか?
587デフォルトの名無しさん:2008/07/04(金) 18:10:32 BE:974324148-2BP(300)
>>585
ありがとうございます
588デフォルトの名無しさん:2008/07/04(金) 18:14:41
というか1次配列のときもアドレスを渡してる
ポインタについて詳しく勉強することをオススメする
589デフォルトの名無しさん:2008/07/04(金) 18:37:23
>>583
できる。ただし、配列はすぐにポインタに成り下がるので、
引数に配列を指定したときに実際に関数に渡るものは
その配列の先頭要素へのポインタである。多次元配列の場合、
(一つ次数の低い)配列へのポインタが渡される。

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 演算子や & 演算子を作用させたときの挙動は異なる。
590デフォルトの名無しさん:2008/07/04(金) 18:41:25
>>589
array[][4][5]というふうに受け取る場合に、array[1][0][3]とアクセスできるようになるのは
何のおかげなんですか?
*arrayとして受け取るとサイズが分からないのでarray[1][0][3]のようなアクセスはできないですよね。
ポインタにはできないはずのことができているように見えるのに、やっぱりポインタなんでしょうか?
591デフォルトの名無しさん:2008/07/04(金) 18:59:46
int (*array)[4][5] というポインタ
592デフォルトの名無しさん:2008/07/04(金) 19:20:03
なるほど。。たとえば、[4][4][5]のサイズのメモリを確保したい場合に
以下のような記述はアリなんでしょうか?

int (*arr)[4][5];
arr = malloc(4 * sizeof(*arr));
593デフォルトの名無しさん:2008/07/04(金) 19:21:50
書いてから思ったのですが、たとえば2次元配列を動的に確保したい場合は
どのように記述するのが正しい(もしくは一般的)ですか?
594デフォルトの名無しさん:2008/07/04(金) 19:25:57
多次元配列 動的確保 でぐぐれ
595デフォルトの名無しさん:2008/07/04(金) 19:31:41
>>594
いろいろ出てきましたが、
多次元配列を動的に確保しつつ、それが連続した領域であり、添え字によるアクセスが可能な方法
について記述されたサイトはありますか?
596デフォルトの名無しさん:2008/07/04(金) 19:31:47
>sizeof(*arr)
sizeofに実体のない参照を渡すことできたっけ?
597デフォルトの名無しさん:2008/07/04(金) 19:33:02
>>595
見つからないなら、一般的でないということだ
598デフォルトの名無しさん:2008/07/04(金) 19:33:50
599デフォルトの名無しさん:2008/07/04(金) 19:35:11
>>595
??
一回自分でやってみなよ
全部満たしてるはずだけど
600デフォルトの名無しさん:2008/07/04(金) 19:36:04
配列を正しく表現できるポインタを宣言して、そこに必要なだけの領域数を計算して割り付ければいいだけ
601デフォルトの名無しさん:2008/07/04(金) 19:51:54
多次元配列を確保し、出力してみたのですが、連続領域ではないため2個目のアクセス方法だと出力がおかしくなります。
freeや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)); などとすると
添え字によるアクセスができなくなりますよね。

これらを解決できる方法について知りたいのですが。。
602デフォルトの名無しさん:2008/07/04(金) 19:55:33
>>601
なんで?
mallocの戻りアドレスはvoid*なのでキャストすればOKなんじゃ?
603デフォルトの名無しさん:2008/07/04(金) 19:57:57
せめて、C-FAQぐらい読んでみて。
604デフォルトの名無しさん:2008/07/04(金) 19:58:17
人を救うプログラムってありますか?
分散コンピューティング的なもので、
605デフォルトの名無しさん:2008/07/04(金) 19:58:41
>>602
int *arr;
arr = malloc(row_num * col_num * sizeof(int));
として、
arr[1][3] というアクセスは可能ですか?

>>595にも書いてありますが、動的に連続領域を確保しつつ添え字でアクセスできるのかどうかを知りたいんです。
連続領域でなければ、それはmemcpyなどにも使用できないということですよね?
606デフォルトの名無しさん:2008/07/04(金) 19:58:50
FAQってどうしてもファックユーって読んじゃう
607デフォルトの名無しさん:2008/07/04(金) 20:05:21
>>603
すみません、不勉強でした。
以前読んだものの、すっかり忘れていました。あらためて読み直そうと思います。
608デフォルトの名無しさん:2008/07/04(金) 20:06:10
>>605
領域が連続であることと、2次元以上の添字でアクセスできることとは別のこと。
mallocで確保した領域は連続
>>605の方法で確保した領域にarr[1][3]としてはアクセスできない。
RTFFAQ
609デフォルトの名無しさん:2008/07/04(金) 20:06:24
610デフォルトの名無しさん:2008/07/04(金) 20:12:06
>>608
はい。もっと理解して、次はちゃんとないものねだりできるようにしてきます。

>>609
不連続領域です。
611デフォルトの名無しさん:2008/07/04(金) 20:15:21
int (*a)[4];
a = malloc(2 * sizeof *a);
a[1][3] = 0;
612デフォルトの名無しさん:2008/07/04(金) 20:16:46
>>611
4が固定です。
というかFAQむしかえしてしまってほんとごめんなさい。
613デフォルトの名無しさん:2008/07/04(金) 20:18:52
ああ、つまり要素数が不定の多次元配列を作りたいのね。
むり。
614デフォルトの名無しさん:2008/07/04(金) 20:21:00
要素の数が決まっていないなら、連続した領域として、
つまり本来の意味での多次元配列として作成することはできなくなる。
ポインタの配列を用いて多次元配列をまねる方法を使うこと。
615デフォルトの名無しさん:2008/07/04(金) 20:22:47
どうしても連続領域でやりたいなら添字に頼らずに自分で場所を計算するか、C++を使うしかない
616デフォルトの名無しさん:2008/07/04(金) 20:26:27
かくしてC-FAQに戻りぬ
617デフォルトの名無しさん:2008/07/04(金) 20:26:47
>>613
だから、できるとFAQに
>>614>>615
はい。まさに、です。C99でも大丈夫ですかね。
618デフォルトの名無しさん:2008/07/04(金) 20:29:11
>>617
>>615がいっていることの意味が分かってるのか?
a[j][i]の代わりに、*(a + row_size * j + i)
と書くということだぞ。
619デフォルトの名無しさん:2008/07/04(金) 20:30:26
>>618
あれ?ほんとですね。
じゃあ、
>>617
そうではなくて、添え字でやれることを理解しました。
620デフォルトの名無しさん:2008/07/04(金) 20:30:32
思うんだがなんでそんなに多次元配列にこだわる?
621デフォルトの名無しさん:2008/07/04(金) 20:33:00
>>620
なんとなくです。では忍びないので
array[][4][5]
という表記をみて、各次元のサイズが不定な多次元配列を動的に確保するには
どうしたもんかと思ったからです。
で、思いついた方法では連続領域にならなかったのがなんだかつまらなかったからです。
622デフォルトの名無しさん:2008/07/04(金) 20:34:26
要するにやりたいことはこういうことだろう

連続領域として割り付けて、多次元配列をまねたポインタの配列の各要素を注意深くその領域の妥当な位置を指させる
623デフォルトの名無しさん: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;
}
624デフォルトの名無しさん:2008/07/04(金) 20:36:01
FAQと同じ手法ですね。
わざわざありがとうございます。
625デフォルトの名無しさん:2008/07/04(金) 20:36:43
>>621
>>622の方法を使う。
ただし関数の宣言はfunc(int ***arr)みたいになる
626デフォルトの名無しさん:2008/07/04(金) 20:37:37
>>621
あとは構造体を使って良いなら数が決まってる部分を構造体にしてみるとか
627デフォルトの名無しさん:2008/07/04(金) 20:40:12
>>621
コンパイラの気持ちになってみてよ。そしたらもっと気持ちよくなるから。
628デフォルトの名無しさん:2008/07/04(金) 22:42:27
将来医療に関わるプログラムを作っていたいのですが、
この中に医療に関わるプログラムを作っている人はいますか?
629デフォルトの名無しさん:2008/07/04(金) 22:48:51
医療に関わってればいいなら
作ってるよ
630デフォルトの名無しさん:2008/07/04(金) 22:53:03
医療関係のソフトウェアって特殊なするの?
他の電子機器の影響で誤動作する可能性に備えて
同じ計算を複数回行って多数決とるとか

それともECCメモリ使うだけとか
コンピュータを電磁波を通しにくい素材で覆うとかの
ハードウェアよりの対策のみなのか
631デフォルトの名無しさん:2008/07/04(金) 22:54:00
同じく、医療に関わるだけでいいならやってるよ
632デフォルトの名無しさん:2008/07/04(金) 22:54:47
ああ、けど、医療機器組込とかならやってない
633デフォルトの名無しさん:2008/07/04(金) 23:02:47
医療関係って言ってもかなり広いが組み込み系の話か?
現状はまだ、基本的にハードウェアで対策して
見るドクターが数字に誤差を加味してるのがほとんどだと思う
634デフォルトの名無しさん:2008/07/04(金) 23:04:16
コンピュータ自体が誤動作することはほとんどないよ
たいてい問題は計測データのノイズのほうだから
635デフォルトの名無しさん:2008/07/04(金) 23:16:58
最近RFIDで誤動作的なニュースがなかったっけ?
636デフォルトの名無しさん:2008/07/04(金) 23:40:05
Cプログラミングのフリーソフトをダウンロードしたいのですが、どこですれば良いですか。
637デフォルトの名無しさん:2008/07/04(金) 23:44:27
一年くらい、検体を管理したり測定機械と通信したりするシステムの部署で働いていたことがある。
ありえなくいらい質が低くて、そのシステムを導入してる病院にはいかないようにしてる。
638デフォルトの名無しさん:2008/07/04(金) 23:56:35
腰痛に悩んでるCプログラマは多いはずです
なにかいい対策はありませんか?
639デフォルトの名無しさん:2008/07/04(金) 23:58:19
#include<stdio.h>

int 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;
}

これって何で動かないんでしょうか?
640デフォルトの名無しさん:2008/07/04(金) 23:58:45
自腹も辞さない覚悟でいい椅子を導入する、かな
あとは適度な休憩およびストレッチ
641デフォルトの名無しさん:2008/07/04(金) 23:59:24
>>639
動くとは思うが、多分望んでいる動作にするには%sを%cにする
642デフォルトの名無しさん:2008/07/05(土) 00:04:24
%sの方が正しくて、x+0, x+1, x+2,……ってやるのが望んだ動作かもよ?
643デフォルトの名無しさん:2008/07/05(土) 00:05:00
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]);
644デフォルトの名無しさん:2008/07/05(土) 00:06:17
それぞれ1文字出力したいんじゃないのか?

645デフォルトの名無しさん:2008/07/05(土) 00:09:00
どっちが間違ってるのかは本人以外には確定できないからな。
%cの方が可能性は高いと思うがね。
646デフォルトの名無しさん:2008/07/05(土) 00:09:03
>>641->>644
ありがとうございます
%cにしたら解決しました
>>643をやってみたらなんか興味深い実行結果になりましたね
647デフォルトの名無しさん:2008/07/05(土) 00:09:25
>>645さんもありがとうございます
648デフォルトの名無しさん:2008/07/05(土) 00:30:51
まず質問を上手くできるようになろうな
649デフォルトの名無しさん:2008/07/05(土) 01:22:25
>>639
この俺様が猛烈に解説してやろう。
まず、
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の説明に移る。

続く
650デフォルトの名無しさん:2008/07/05(土) 01:23:37
printfには知っての通り、変数をある形に変換して出力する機能がある。
数を出力したかったら%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]までが順に表示される。
これで大体わかってもらえたと思う。わからなかったらもう一度聞いてくれれば誰かが答える。
651デフォルトの名無しさん:2008/07/05(土) 01:34:57
うそをかくな
うそを
652デフォルトの名無しさん:2008/07/05(土) 01:38:19
>>649-650
653デフォルトの名無しさん:2008/07/05(土) 01:44:16
細かい指摘は控える
654デフォルトの名無しさん:2008/07/05(土) 01:53:18
>つまりこれを付けることによってポインタを意味することとなるわけだ。
>よって
>char *x="123456789"
>と書き換えることができる。

これはひどい
655デフォルトの名無しさん:2008/07/05(土) 02:20:21
内容のモーレツさ加減にひっくりかえった
> わからなかったらもう一度聞いてくれれば誰かが答える。
これでさらにひっくりかえった

656デフォルトの名無しさん:2008/07/05(土) 02:27:34
後からじわじわ来た
657デフォルトの名無しさん:2008/07/05(土) 02:40:21
むしろ俺は>>655のモーレツに吹いた。
658デフォルトの名無しさん:2008/07/05(土) 02:50:00
mallocした領域で、プログラムの終了まで開放する必要のないものは、freeしなくても問題はありませんか?
659デフォルトの名無しさん:2008/07/05(土) 02:56:32
プログラム終了前にfreeする必要があるかどうかという質問?
660デフォルトの名無しさん:2008/07/05(土) 02:58:47
そうですね
何も問題が無いなら省こうと思って
661デフォルトの名無しさん:2008/07/05(土) 03:02:01
>>658

終了まで解放する必要が無い

終了までfreeする必要が無い

解放する=freeする
だから
終了までfreeする必要が無い変数を使って問題ありませんか?
という問いになると、一概に言えない。
OSを占有的に使うことが出来るプログラムならば、バンバン
使っても大丈夫だろうが、そうでない場合は、そうとも限らないことが
あるが、最近は、スタックの使い方のほうが影響が大きい。
662デフォルトの名無しさん:2008/07/05(土) 03:12:23
ええと・・・
ちょっと理解できないです。
プログラムの終了まで使う変数なので、終了時に自動的に解放してくれるならfreeを書く必要がないなと思っているのですが、
freeしないまま終了してしまうと何か影響がでるのかなと不安なので質問させてもらいました。
けど、やっぱり書けばいいだけなので書く事にしようと思います。
返答ありがとうございました。
663デフォルトの名無しさん:2008/07/05(土) 03:25:43
>>662
ちょいちょいそれは議論になるよ
個人的には実行時間がそれほど長くないアプリケーションであればOS任せでいいと思ってる。
対極にある常駐プロセスなんかはもちろん随時freeすべき
664デフォルトの名無しさん:2008/07/05(土) 03:35:16
>>662
殆どのOSの場合、mallocは自分のプロセスのメモリ空間に割り当てるものだから
プロセスが終了した時点で、freeしてなくとも、OSにメモリの所有権/使用権が戻される。
しかし環境によっては、共有領域からの割当を意味する場合もある。
その場合は、そのプロセスが終了しても、共有領域には、使用中という状態
のままになってしまうかも。オーナーのプロセスの存否を調べて、修復して
くれるようなメカニズムがそういう場合は用意されてはいるのだろうが、
あまり期待も出来ない。
C言語は一応、様々な環境を想定しているので、malloc,freeだから
一概に〜であるということは出来ない。
が、unix系OS(windowsも含む)なら、まずfreeしなくても大丈夫
malloc したらfreeをきちんと書けという言われる理由は、malloc/freeの
対応を取ることが難しくリークを起こすようなコードには変数の使い方が下手などの
問題があることが多いからであり、リファクタリングを促す意味であることが
多い。
>>663
freeをやたらと使うとヒープの断片化が発生しやすくパフォーマンス
に影響が出てくることがあると聞く。
freeが幾らきちんと出来ていても、瞬間的にでも凄い量のスタックを使ったり
すると、むしろそちらのほうがOSに影響が出やすい。
665デフォルトの名無しさん:2008/07/05(土) 03:39:40
プログラムがfreeしないまま終了した場合、OSがかわりにfreeしてくれるので
freeしなくて終了しても、動作にはなんら問題なないです。

だけど、自分でfreeすることを薦めます。
今後、途中でfreeする必要があるプログラムを作成することを考えて
自分で後始末をする習慣をつけておいたほうがよいからです。

ひとつだけなら簡単ですが、たくさんmallocしているプログラムでは
freeするのはやっかいですよ。安全なコードっを書くには、スキルと経験が要ります。
666デフォルトの名無しさん:2008/07/05(土) 04:26:44
freeしなくてもコンパイラが文句も吐かずに通ったのでいざ実行してみたら
終了時に「ま、mallocしてるんだからfreeしなさいよ!」と怒られてしまいました

これは警告ですか?脅迫ですか?それともツンデレとか言うやつですか?
667デフォルトの名無しさん:2008/07/05(土) 04:29:31
いや、つまんないから
668デフォルトの名無しさん:2008/07/05(土) 04:32:27
freeしてないプログラムを1週間くらい使い続けると、
いつの間にかフォーマットされて何も入ってないHDDがからから回し続けるようになる。
これだとヤンデレですか。
669デフォルトの名無しさん:2008/07/05(土) 04:37:05
>>665
>プログラムがfreeしないまま終了した場合、OSがかわりにfreeしてくれるので
OSがfree関数を呼び出してくれるようなことは無い。

Java仮想マシンでは、freeに相当する処理をしなくても、有効な変数にバインドされて
いないオブジェクトは自動的にfreeに相当する処理をしてもらえて、再利用される
ことは有名な話。

それと混同されたのかなと一瞬思った。
670デフォルトの名無しさん:2008/07/05(土) 04:40:23
うそをかくな
うそを
671デフォルトの名無しさん:2008/07/05(土) 05:06:46
>>669
共有メモリーならばOSはfreeするだろうけど、ヒープ領域はコードやスタック領域とおなじで
プロセスが死ねば自動的に消滅ってことか?
ヒープに対する特別な後処理はOSはしないということか。
なるほど。
672デフォルトの名無しさん:2008/07/05(土) 05:11:09
メモリをデバイスと考えるOSでは違ってはおかしくはない。
一般的にOSがプロセスのコードを勝手に呼び出すことは普通無い。
673デフォルトの名無しさん:2008/07/05(土) 09:50:54
malloc/freeを何度も実行する常駐プログラムを書いています。
みなさんはメモリのフラグメント化をどのように解消していますか?
674デフォルトの名無しさん:2008/07/05(土) 10:08:55
別に
675デフォルトの名無しさん:2008/07/05(土) 10:11:51
特にないです
676デフォルトの名無しさん:2008/07/05(土) 10:17:36
char buf[] = "akbh42";
int len = 512;
int done = len < sizeof(buf);
以下のコードがどのような処理をしているのかが分かりません。
int done = len < sizeof(buf);
677デフォルトの名無しさん:2008/07/05(土) 10:21:41
doneに len < sizeof(buf) を代入してる。
この場合 512 > sizeof(buf) だから doneには0が代入される。
678デフォルトの名無しさん:2008/07/05(土) 10:22:43
len がsizeof(buf) より小さければ
len < sizeof(buf) と言う式は1 を返す
そうでなければ0 を返す
その値でdone を初期化してる
679デフォルトの名無しさん:2008/07/05(土) 10:36:43
>>673
malloc/freeを何度も実行しない。
680デフォルトの名無しさん:2008/07/05(土) 11:16:00
freeとかdeleteで開放されたメモリって再利用されないの?
681デフォルトの名無しさん:2008/07/05(土) 11:22:02
>>680
フラグメント化により、利用できないことがある。
682デフォルトの名無しさん:2008/07/05(土) 11:23:42
>>680
疑問に思ったら自分で試してみるんだ
環境依存、実装依存だしな
#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;
}
683デフォルトの名無しさん:2008/07/05(土) 11:24:36
つーか多くのシステムはプロセスにある程度の大きさのヒープ割り当ててるので
malloc/freeはそこをちまちま使ってるだけでしょ?

ヒープサイズ超えるとまたOSに再要求して大きなヒープに変えるのかな?

mallocサイズが決まってるんであれば
リスト構造にでもして使用中リストと未使用リストでつなぎ変えだけするとか
684デフォルトの名無しさん:2008/07/05(土) 13:53:13
そんぐらいはOSがやってくれるんじゃない?
685デフォルトの名無しさん:2008/07/05(土) 14:14:06
ヒープの管理はランタイムライブラリがおこなう。
ヒープそのものの領域はOSからもらう。
686デフォルトの名無しさん:2008/07/05(土) 16:40:43
C++やらないでCだけのやつなんているの?
687デフォルトの名無しさん:2008/07/05(土) 16:45:39
いるよ。
688デフォルトの名無しさん:2008/07/05(土) 16:47:13
呼んだ?
689デフォルトの名無しさん:2008/07/05(土) 16:48:09
なんでCだけしかやらないの?
690デフォルトの名無しさん:2008/07/05(土) 16:49:19
仕事でいらないから
691デフォルトの名無しさん:2008/07/05(土) 17:02:33
とても明確な理由で逆に感心した
692デフォルトの名無しさん:2008/07/05(土) 17:03:22
なんでもっと楽で稼ぎのいい仕事しないの?
693デフォルトの名無しさん:2008/07/05(土) 17:12:25
余裕こいてる奴は実はラクでなく稼ぎも悪いw
694デフォルトの名無しさん:2008/07/05(土) 18:55:01
Cは学校の授業で習った後、趣味程度でやっているが
稼ぎでやるほど本格的にはやってない。稼ぐなら
もっと本格的にやるが、研究機関には敵わない。
むしろ、もっと稼ぎやすいもので稼いで、こういった分野も取り込んで
商売として雇った方が楽、自分が直接やるよりは。
世の中、そんなもん。
695デフォルトの名無しさん:2008/07/05(土) 18:57:41
プログラマとはプログラムを自動生成するプログラムのことです
696デフォルトの名無しさん:2008/07/05(土) 19:04:03
>>694
ある程度できるのなら外注に出すより安上がりだけどな
697デフォルトの名無しさん:2008/07/05(土) 19:07:44
きもかっこいい
698デフォルトの名無しさん:2008/07/05(土) 19:11:48
ポインタの参照先が動的に確保されたメモリかそうじゃないかを調べる方法はありませんか?
699デフォルトの名無しさん:2008/07/05(土) 19:13:44
>>698
freeしてみる。
700デフォルトの名無しさん:2008/07/05(土) 19:14:34
その程度なら趣味って程でもないな
701デフォルトの名無しさん:2008/07/05(土) 19:19:22
>>698
ランタイムライブラリのデバッグ関係ヒープ関数にあったと思う。俺も知りたいから解ったらレポートしてくれ。
702デフォルトの名無しさん:2008/07/05(土) 19:34:06
#include <stdio.h>
#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が代入されてるのはなぜでしょうか?
703デフォルトの名無しさん:2008/07/05(土) 19:46:10
実行環境が気になる木
704デフォルトの名無しさん:2008/07/05(土) 19:48:07
pとxが初期化されてないため、たまたま同じアドレスになってたんだろ。
705デフォルトの名無しさん:2008/07/05(土) 19:48:17
>>702
未初期化ポインタの指す先が偶然一緒だっただけ
やっちゃダメですw
706デフォルトの名無しさん:2008/07/05(土) 19:48:19
winXP
コンパイラはbccです
707デフォルトの名無しさん:2008/07/05(土) 19:49:32
>>704,705
わかりましたd
708デフォルトの名無しさん:2008/07/05(土) 20:36:53
変数は定義と同時に初期化すべきですか?
709デフォルトの名無しさん:2008/07/05(土) 20:40:14
それができる環境ならしたほうがいい
710デフォルトの名無しさん:2008/07/05(土) 20:55:50
int array_n[10] = {1};

と初期化値を指定した時
array_nの配列の内容がarray_n[0] == 1で、
初期化値の指定が無い残りが全て(array_n[1]〜array_n[9])が「0」で埋まるのはC言語の規格上そうなっているのですか?
それともコンパイラによっては[1]〜[9]は不定値のままだったりする?
711デフォルトの名無しさん:2008/07/05(土) 21:08:59
規格上そうなっている
712デフォルトの名無しさん:2008/07/05(土) 21:12:49
>>710
古いコンパイラなら不定値が入っている可能性が高い
713デフォルトの名無しさん:2008/07/05(土) 21:20:29
>>710
比較的新しい規格で決められた事なので
>>711>>712 も正しい
714デフォルトの名無しさん:2008/07/05(土) 21:27:59
比較的新しいって、どの規格で?
715デフォルトの名無しさん:2008/07/05(土) 21:36:02
配列の初期化の足らないのを0で埋めるって仕様がサポートされてないようなコンパイラなんてもうないだろ。
716デフォルトの名無しさん:2008/07/05(土) 21:58:06
KnRぐらいかな。
pccはどうだったんだろう?
717デフォルトの名無しさん:2008/07/05(土) 22:03:10
>>708
できるだけ使う直前で初期化した方がいい
718デフォルトの名無しさん:2008/07/05(土) 22:08:58
はいはい
釣りはいいから
719デフォルトの名無しさん:2008/07/05(土) 22:13:41
>>716
つか, static に取った奴は .bss に置かれるから, 処理系依存で 0 で埋められる

組み込みもんで boot が遅いってので .bss の初期化やめたシステムがあったが
逆に boot が遅くなったって笑い話がつい最近あった.
720デフォルトの名無しさん:2008/07/05(土) 22:14:16
ふつー使う直前だよな。
721デフォルトの名無しさん:2008/07/05(土) 22:18:10
俺もつい使う直前に初期化してしまう
722デフォルトの名無しさん:2008/07/05(土) 22:18:33
業務コードでは

変数宣言
情報セキュリティ対策の一括した初期化
(memset,ヌルクリア) コード上の分離された箇所での明確な処理が必要)
初期値設定
主処理コード

を取る形態が多いが、主処理コードの後にも、情報セキュリティコード(ヌルクリア)
も入れたほうが良い。(大抵の業務用コードではそれは入っていない)
呼び出し側のバグによって、作業データが漏洩する可能性があるから
723デフォルトの名無しさん:2008/07/05(土) 22:19:05
staticが0で初期化されるのは、処理系依存じゃないよ。
724デフォルトの名無しさん:2008/07/05(土) 22:22:01
されないのもあったぞ
725デフォルトの名無しさん:2008/07/05(土) 22:24:15
処理の内容と無関係に初期化(しかも0)は、よくない筋ですね。
そういうことをやってるところが多いかどうかはしらない。

コンパイラの機能として、自動で、使われなさそうな値で埋めてくれるのとかそういうのはいいと思う。
726デフォルトの名無しさん:2008/07/05(土) 22:24:41
>>723 すまん. OS とかの実行環境を含めての処理系だ
727デフォルトの名無しさん:2008/07/05(土) 22:26:11
実行時に必ず初期化されることが保証されているが
コンパイラが警告を出すときには変数宣言時に初期化してる
728デフォルトの名無しさん:2008/07/05(土) 22:26:58
>>724
でも処理系依存じゃないよ。
まともな処理系は0が入る。
729デフォルトの名無しさん:2008/07/05(土) 22:33:48
C99とかJavaみたいに、変数の宣言が自由にできる言語は、使う直前で宣言 & 初期化。
Cみたいにブロックの先頭でしか宣言できない言語は、使う直前で初期化。宣言と同時には初期化しない。
730デフォルトの名無しさん:2008/07/05(土) 22:43:10
宣言時以外は代入とか言ってみる。
731デフォルトの名無しさん:2008/07/05(土) 22:44:59
スタイルの問題は宗教論争になる
732デフォルトの名無しさん:2008/07/05(土) 22:48:06
俺は結論出てるから高みの見物
733デフォルトの名無しさん:2008/07/05(土) 22:49:50
>722の例にあるよーな効率の悪い現実の話は別として
とにかく値を使う前に正しく入ってればいい
大切なのはまちがいを減らすことで、
有効なのはどっちにするのかを決めておくこと
どっちが正しいのかということではない
734710:2008/07/05(土) 22:53:05
>>711-715
とりあえず、0で埋められる前提でコードを書いても大丈夫そうですね
ありがとうございました
735デフォルトの名無しさん:2008/07/05(土) 23:01:02
宗教論争つーか、世間でたかく評価されてるようなプロダクツで、(Cで)宣言と同時に初期化ってスタイルのってある?
736デフォルトの名無しさん:2008/07/05(土) 23:06:35
結論:
宣言同時初期化は、処理ロジックを誇張する傾向が高いが、全体から見てそのモジュールの
処理ロジック(役割)が堅くなりすぎる傾向があり、嫌う人も居る。

コード部冒頭の同時一括初期化コードは情報セキュリティー対策をソースコード上で明示的に行う
無駄なコード。関数のリターン前に不要な変数のクリアを同時に行わないと無意味
737デフォルトの名無しさん:2008/07/05(土) 23:07:42
C++で順列を出力する短いプログラム作ろうとしてるのですが誰か教えてください。
show(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); }
738デフォルトの名無しさん:2008/07/05(土) 23:17:07
>>737
まずスレタイを凝視する
739デフォルトの名無しさん:2008/07/05(土) 23:18:56
altu-!失礼しますた。別スレへ移動します
740デフォルトの名無しさん:2008/07/06(日) 00:40:45
html並に簡単なGUIライブラリはないのかよこのやろう
741デフォルトの名無しさん:2008/07/06(日) 00:46:03
HTAをもっと流行らせる計画
http://pc11.2ch.net/test/read.cgi/tech/1124559962/

細かいことは気にするな
742デフォルトの名無しさん:2008/07/06(日) 02:08:09
>>736
結論
モジュールの分化性が嫌であり、なおかつスタックやヒープに変数を割り付けることによる
情報漏洩が嫌いな奴はBASICでも使ってろ。
743デフォルトの名無しさん:2008/07/06(日) 02:37:04
>>740
htaもあるが、そもそもぺたぺた貼ってつくれるじゃん
744デフォルトの名無しさん:2008/07/06(日) 02:45:27
Delphiのこと、ときどきでいいから思い出してあげてください
745デフォルトの名無しさん:2008/07/06(日) 02:46:19
xmlでGUIをってな話はどうなったんだろ?
746デフォルトの名無しさん:2008/07/06(日) 02:49:15
WPF?
747デフォルトの名無しさん:2008/07/06(日) 02:52:36
>>746
キーワードをありがとう。XAMLでした。
748デフォルトの名無しさん:2008/07/06(日) 03:55:28
デラーズフリートのモビルスーツですね
749デフォルトの名無しさん:2008/07/06(日) 08:59:52
>>730
処理系はそうは思っていないようですよ。
宣言に現れる = は、配列を初期化する = を除いて、
その出現順を保ちながら宣言の直後に書かれているかのように扱われ。
750デフォルトの名無しさん:2008/07/06(日) 09:11:20
言葉の定義に処理系がどうとか意味わからん。
751デフォルトの名無しさん:2008/07/06(日) 09:14:55
原理原則と実装レベルあるいは運用の話をごちゃ混ぜにするのはイクナイ
752デフォルトの名無しさん:2008/07/06(日) 13:38:45
基本的にはC言語というくくりで話す場合は規格のことを言っているんだが
なぜか執拗に実装の話をしたがるのがいるな
753デフォルトの名無しさん:2008/07/06(日) 17:40:29
質問させてください。C言語初心者なのですが、仕事でC言語のバグ取りを命じられました。

typedef struct{
〜メンバ〜
}ABC;
ABC *abc;
char *str;
〜処理〜
abc = (ABC*)&str; //←これ
754デフォルトの名無しさん:2008/07/06(日) 17:42:05
まさか&が余分というオチじゃあないだろうな。
755753:2008/07/06(日) 17:44:34
あ、書き込みミスです。

↑のような処理があったのですが、コメントをつけてる部分がコンパイル時に警告が出ています。
この部分は何をしようとしているのでしょうか?

また、このようなコードを書くメリットやよくある使い方を知ってる方が居たら教えてください。
756デフォルトの名無しさん:2008/07/06(日) 17:44:38
>>753
質問をどうぞ
757デフォルトの名無しさん:2008/07/06(日) 17:45:43
int func(){
static char a='a';
static char z=a-'a'+'z';

多分これコンパイルとおらない。
宣言同時初期化は基本的にはサービスだと思ったほうがいいのかも知れない。
758753:2008/07/06(日) 17:47:24
>>754
&をつけるとポインタのアドレスって意味でしょうか?

また、書き忘れましたが
abc = (ABC*)&str[1];
というパターンもありました。[1]にする意味もご存知でしたら教えてください。
759デフォルトの名無しさん:2008/07/06(日) 17:47:27
>>753
それじゃあchar型のポインタ strのアドレスを本来はABCという構造体を
指すポインタabcに入れてるからじゃないの?

760デフォルトの名無しさん:2008/07/06(日) 17:49:08
static変数は、
761デフォルトの名無しさん:2008/07/06(日) 17:51:05
>>753は学生レベル。 今まで業務に支障でなかったか?  ポインタ使って書く方は悪いが
762デフォルトの名無しさん:2008/07/06(日) 17:52:04
>>761
どっちかというと新人研修用のお題にしか見えない
763デフォルトの名無しさん:2008/07/06(日) 17:52:57
そもそも、>>753
のコードで警告でる?
764デフォルトの名無しさん:2008/07/06(日) 17:53:31
>>753が経歴詐称してんのか、教育用の専用コードなのかわからんな。
765デフォルトの名無しさん:2008/07/06(日) 17:54:41
char *str; のとき 
str = &str[0] ですよ。 

あと strに"abcde\0"が入っているとして
printf("%s",str); はabcdeが出力され
printf("%s",&str[1]); はbcdeが出力される。
766753:2008/07/06(日) 17:55:02
すみません、3月まで学生で、C言語もほとんどやったことなかったのです。
ポインタもよく分かってません。

>>759
なぜstrは構造体ではなくchar型のポインタにする必要があったのでしょうか?
767759:2008/07/06(日) 17:57:11
さー作った人の考えはわからんけど

ABCという構造体でこちらは見たいんだけど
もらってくる際はchar型のアドレスの場合
はそうやるのかなあ?とか
768デフォルトの名無しさん:2008/07/06(日) 17:57:44
バグとりの前にC言語の入門書を読んで下さい。 
才能やセンスとか関係ない入門レベルの知識が不足しているようです。
769753:2008/07/06(日) 17:58:17
>>765
それは分かります。ですが、[1]と書いてあるんですよ。
770デフォルトの名無しさん:2008/07/06(日) 17:59:06
>>766
最近のCコンパイラは、それが宣言された時に指す「型」が異なるポインタ変数の
チェックを厳格にするようになり、「型」が異なるものには警告を出すように
なっている。良いか悪いかは分からないが、そのような場合を避けるようにコーディング
することは出来るし、実際それが避けられない場合は、コード設計に大きな問題が
あることが多い。
struct であるABCという型へのポインタと&strの型であるchar **は一般的には関連づけ
ることは考えにくい。
771デフォルトの名無しさん:2008/07/06(日) 17:59:29
>>769
アドレスを+1したかったんだろ
772デフォルトの名無しさん:2008/07/06(日) 18:00:44
なんかこんな手法って通信系とかマイコンとかのかなりレイヤーの低いところなのかな?
773デフォルトの名無しさん:2008/07/06(日) 18:01:19
構造体をfreadやfwriteでそのまま読み書きするのになんの疑問もたないたやつも多いんで、
char*にキャストするやつがいてもおかしくはない。
774デフォルトの名無しさん:2008/07/06(日) 18:02:39
>>773
じゃあ、構造体はどうやって読み書きするのが正しいの?
775デフォルトの名無しさん:2008/07/06(日) 18:05:35
typedef struct{
〜メンバ〜
}ABC;
ABC *abc;
char *str;
〜処理〜
abc = (ABC*)&str;

これってさ

strでもらってくるのってABC構造体を配列にした連続領域ってことじゃねーの?

[1]の付けるのがあるって段階でなんかそんなにおいがする
776デフォルトの名無しさん:2008/07/06(日) 18:05:44
freadはchar*型しか読み取れないのでは?
char*でよんでそのアドレス渡すとか、キャストして読み込むのでは?
777753:2008/07/06(日) 18:06:21
UNIXの通信系のプログラムのようですが、何百もソースがあって、
処理内容は全く把握してません。

やはり勉強不足のようです。もう少し勉強します。
778デフォルトの名無しさん:2008/07/06(日) 18:09:43
>>776
freadはvoid*だろ。
779デフォルトの名無しさん:2008/07/06(日) 18:09:49
まあabc も strもポインターなんだから
そのまま

abc = (ABC *)str;
として扱えばいいんじゃねーの?

でstr指す領域がABC構造体の配列であれば

abc[1]->xxxxとかでみればいいんだし
780デフォルトの名無しさん:2008/07/06(日) 18:10:22
>>778
そうだった
781779:2008/07/06(日) 18:11:39
でも通信系の怖いところはもらってくる領域の先頭数バイト捨てる・・・とか言い出しそうだしなw
782デフォルトの名無しさん:2008/07/06(日) 18:12:54
>>775
構造体の配列の可能性ですか・・・。
調べてみます。ありがとうございます。

>>779
すごく分かりやすい説明ありがとうございます。
やはりポインタの概念が理解不足でした。
783デフォルトの名無しさん:2008/07/06(日) 18:15:20
>>777
ちょっとまえにやってた仕事で、socketで通信するのに生のintを送ってて、
エンディアンの違う環境になったからバグったってのがあったな。
char[4]にコピーして、順序を入れ替えて、またintにコピーするって方法で回避してた。
このバグに対応するのに、1日かかったって言ってたし、これから先も、二つの
バージョンのソースを管理する必要があるし、通信の入門書の一冊でも読んでれば、
こんな無駄は回避できてるのになぁ。とオモタ。
784デフォルトの名無しさん:2008/07/06(日) 18:16:57
>>783
某金融機関でダウンしたのはそれかーーー

といってみるテスト


785デフォルトの名無しさん:2008/07/06(日) 18:29:41
>>783
何で htol()等々、を使わんの?
786デフォルトの名無しさん:2008/07/06(日) 18:33:04
>>785
入門書の一冊も読んでないからだろ。
787デフォルトの名無しさん:2008/07/06(日) 18:33:33
通信回線
Cコンパイラ
ハードウェア(メモリ)
それらの性質を良く調べないと、データ転送は成立しない。(w:
788デフォルトの名無しさん:2008/07/06(日) 18:35:19
通信のような異機種間の場合はエンディアンやアラインメント、文字コード、
実数や整数(これが違うことはまれだが)のフォーマットもあわせとかないと
いけないからいろいろ面倒。
新しいものほどキャラクターベースでやり取りするものが増えてる。
789デフォルトの名無しさん:2008/07/06(日) 18:40:18
最近は、確かXMLとかいう、恐ろしく効率の悪いものも使われていると聞く。
790デフォルトの名無しさん:2008/07/06(日) 18:45:56
XMLとか画像ファイルとか、なんにしても、最近はライブラリのコール一発で読み込めちゃって、
ファイルフォーマットを調べて自分で読み込むとかしないから、>>774みたいな疑問をもっちゃうんだろうね。
便利になってるんで、おれもその方向性でいいと思ってるけど。
791デフォルトの名無しさん:2008/07/06(日) 19:12:58
それが、本当にいいことなんだろうか。
792デフォルトの名無しさん:2008/07/06(日) 19:16:22
車輪の再発明をし続けるよりかは良いんだろうけども…
793デフォルトの名無しさん:2008/07/06(日) 19:20:08
書籍に残してくれればライブラリ一発ってのでもいいんだけど
日本では書籍の地位が低いのかなんだか知らないが消え行くばかり

まともな技術書は残すような政策がないものかな?
もちろん濫造入門書は対象外で
794デフォルトの名無しさん:2008/07/06(日) 19:22:08
>>790
構造体の読み書きをfreadとfwriteを使わないでどうやってやるの?
795デフォルトの名無しさん:2008/07/06(日) 19:35:52
790はそこんとこは言及してないと思うけど。
ちなみに、構造体の読み書きは read/write で簡単にできる。
796デフォルトの名無しさん:2008/07/06(日) 19:43:29
>>792
どっちかっていうと、車輪よりもコロの方が多いんだけど。
ほんとに車輪を作れるプログラマは数えるほどしかいない気がする。
797デフォルトの名無しさん:2008/07/06(日) 19:48:01
>>767
電文を構造体に詰めるときとか
798デフォルトの名無しさん:2008/07/06(日) 19:50:16
%d と %1d ってどういう違いがあるんですか?
799デフォルトの名無しさん:2008/07/06(日) 19:56:38
%d 渡された数字をそのまま表示
%1d 上記と同じだけど1桁だけ
800デフォルトの名無しさん:2008/07/06(日) 19:58:12
>>798
マルチ&意味不明
scanf
printf
その他

お前の考えてることなんて分からない
分かるように説明しろ
801デフォルトの名無しさん:2008/07/06(日) 20:00:41
>>799
理解しました!thx!!
802デフォルトの名無しさん:2008/07/06(日) 20:04:33
>>799
最小幅が1になるだけだから同じだと思うけどどうなんでしょ。
803デフォルトの名無しさん:2008/07/06(日) 20:05:07
それでも理解しました!って言ってるんだからそもそも試してすらなかったんだろうなー
804デフォルトの名無しさん:2008/07/06(日) 20:05:12
%1dでも桁全部表示するけどな
805デフォルトの名無しさん:2008/07/06(日) 20:06:50
質問です
学校でvisual studio2008というのを使ってC言語の勉強をしてるんですが
家でもちょっと練習できたらなーと思ったのですが
無料でC言語ができるソフトとかってあるんでしょうか?
うちのPCは一般的なXPのPCです。
お願いします
806デフォルトの名無しさん:2008/07/06(日) 20:08:06
Visual C++ 2008 Express Edition
807デフォルトの名無しさん:2008/07/06(日) 20:09:30
808デフォルトの名無しさん:2008/07/06(日) 20:13:31
visual studio2008
809デフォルトの名無しさん:2008/07/06(日) 20:23:04
>>806ー808
ありがとうございます!
さっそくインストールしてます!
MSから無料の物も出てるんですね〜!
810デフォルトの名無しさん:2008/07/06(日) 20:33:57
こうやって純真無垢な若者がM$に絡めとられてゆく。
811デフォルトの名無しさん:2008/07/06(日) 20:49:17
何ぃ!純真無垢で美しく気立てのよいうら若き乙女だと!
812デフォルトの名無しさん:2008/07/06(日) 21:12:28
もうわかったからM$動画でも見て萌えてなさい
ttp://jp.youtube.com/watch?v=I6TNMk_nq-8
813デフォルトの名無しさん:2008/07/06(日) 21:21:08
>>757
それが許されないのは静的変数が定数でしか初期化できないからで
宣言と同時の初期化が本来的ではないこととは関係ないだろ
814デフォルトの名無しさん:2008/07/06(日) 21:31:17
関係あるようなないようなあるような・・・
815デフォルトの名無しさん:2008/07/07(月) 00:11:35
C#>>C++>Cでおk?
816デフォルトの名無しさん:2008/07/07(月) 00:13:00
より高級って意味か?
817デフォルトの名無しさん:2008/07/07(月) 00:13:58
>>815
標準ライブラリの大きさ?
818デフォルトの名無しさん:2008/07/07(月) 00:50:58
作りやすさにしても処理時間にしてもそれぐらいかね
819デフォルトの名無しさん:2008/07/07(月) 00:57:11
>>818
CよりC++の方が遅いの?
820デフォルトの名無しさん:2008/07/07(月) 01:00:52
>>819
一般的に、高機能なものほど処理は遅くなる
821デフォルトの名無しさん:2008/07/07(月) 01:17:55
そうでもない
822デフォルトの名無しさん:2008/07/07(月) 01:51:56
一般論では赤ん坊とボケてない老人の比較まで対象にしなければならない場合すらある
823デフォルトの名無しさん:2008/07/07(月) 01:53:31
>>821
一概には言えないとは言え、ライブラリにおいても
高水準と低水準とでは、高水準の方が扱う変数が増えて
まぁほぼ一瞬で終わる処理とはいえ、必要の無いものまで
抱えている分、必要な領域、処理時間には差が出るもんさ。
824デフォルトの名無しさん:2008/07/07(月) 01:55:10
必要の無いものまで抱えるというのは、ちと間違い。
使用するに当たって、必要としない部分も含まれている
可能性がある、といった感じ。まぁ、すべて使うなら
それはそれで低水準では逆に手間や手順が増えてしまうがね。
825デフォルトの名無しさん:2008/07/07(月) 05:45:20
>>824
プログラマの腕次第で高水準のと同じになるだけじゃないか?
たいていのへぼプログラマでは、そうはいかないだけで。
826デフォルトの名無しさん:2008/07/07(月) 17:52:07
Cでdecimal実装したいんだけどどうすればいいの?
827デフォルトの名無しさん:2008/07/07(月) 18:01:59
Cで型を実装、もしくはまるで実装されているかのようにみせかけることは無理じゃないかな
828デフォルトの名無しさん:2008/07/07(月) 18:03:21
>>826
decimalとやらの仕様を入手し、アルゴリズムを検討して必要なライブラリなどを入手し、
然る後に徐に実装すれば宜しかろう。
829デフォルトの名無しさん:2008/07/07(月) 18:05:16
リトルエンディアンかどうかの判定って↓みたいなのでいいの?
if(0 == 1 >> 1) fprintf(stdout, "LE\n");
830デフォルトの名無しさん:2008/07/07(月) 18:15:06
不可能
831デフォルトの名無しさん:2008/07/07(月) 18:15:30
だめ。
ビッグエンディアンだろうがリトルエンディアンだろうが1は1だろ。
832デフォルトの名無しさん:2008/07/07(月) 18:18:09
いったん変数に入れてunionかキャストで任意のバイトを取り出せば判定可能
*(char*)&x とかね。
833デフォルトの名無しさん: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

ってことだと思ったんだけど・・・
834デフォルトの名無しさん:2008/07/07(月) 18:58:15
右シフトする場合はレジスタに取り出すので
ビックエンディアン

あくまでエンディアンが関係するのはメモリなんかに格納する場合の話
835デフォルトの名無しさん:2008/07/07(月) 18:58:45
>右シフトする場合はレジスタに取り出すので
シフトする場合はレジスタに取り出すので
836デフォルトの名無しさん:2008/07/07(月) 19:08:59
そういうことかーたぶん理解したd
837デフォルトの名無しさん:2008/07/07(月) 20:15:28
いくらなんでも、1>>1 が 32768 になるとかありえないだろw
838デフォルトの名無しさん:2008/07/07(月) 20:19:45
でも実はCPUのシフト命令によってはビットがループしたり
フラグ情報のビットが入り込んできたりするんだよね。
Cのシフトはあいたところは0埋めみたいだけど。
839デフォルトの名無しさん:2008/07/07(月) 20:27:19
>>838
> ビットがループした
一般にローテート命令と言う
あると暗号系のソフトの最適化がらくちん
840デフォルトの名無しさん:2008/07/07(月) 20:34:19
>>838
算術シフトか論理シフトかは処理系依存であってCだからどうだということではないよ
841デフォルトの名無しさん:2008/07/07(月) 20:36:28
おさらい

Cの右シフト演算は、符号なし値に対しては常に左から0を詰める
符号あり値に対して1を詰めるか0を詰めるかは処理系依存
842デフォルトの名無しさん:2008/07/07(月) 20:56:06
きれいにまとめてくれてありがとう
843デフォルトの名無しさん:2008/07/07(月) 21:03:43
処理系依存なのだけど
ほぼすべてがそういう実装になってて
そのうち後追いで規格化される
844デフォルトの名無しさん:2008/07/07(月) 21:04:21
1を詰める処理系と0を詰める処理系の例を教えて
845デフォルトの名無しさん:2008/07/07(月) 21:08:22
846デフォルトの名無しさん:2008/07/07(月) 21:19:05
符号あり値に対する右シフトで1を詰めない処理系ってあるのか?
847デフォルトの名無しさん:2008/07/08(火) 00:54:55
符号と絶対値を使っている処理系がある。
848デフォルトの名無しさん:2008/07/08(火) 01:02:02
といいますと?
849デフォルトの名無しさん:2008/07/08(火) 01:46:52
上位ビットとは別にあるということだろう
850デフォルトの名無しさん:2008/07/08(火) 01:48:42
多分具体例を欲しがってるんだと思う。
俺は具体例なんかどうでもよくて処理系依存にならない書き方するだけだけど
851デフォルトの名無しさん:2008/07/08(火) 02:11:46
SHシリーズ
ttp://japan.renesas.com/

記憶が不確かだったから確認したが、SHのコンパイラは「負の値を持つ符号付きスカラ型の右シフトの結果は符号ビットを保持」というのが仕様になってる
ってことで、こいつは算術シフト

でも、signedでシフトって怖いからunsignedでしか使ったことない
852デフォルトの名無しさん:2008/07/08(火) 09:39:21
教えてください

1. 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を参照。
853デフォルトの名無しさん:2008/07/08(火) 09:51:47
>>1を100回ほど見ればいいと思うよ
854852:2008/07/08(火) 10:13:16
>>853
すみません、そんなスレがあったんですね
ありがとうございました
助かります
855デフォルトの名無しさん:2008/07/08(火) 11:00:55
ファイル入出力で、標準入力で指定されたファイルを1文字づつ
別なファイル(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文に間違いがあるのだと思いますが、
どうすれば動くようになるのでしょうか?
856デフォルトの名無しさん:2008/07/08(火) 11:07:56
>>855
何がどう上手くいかないか言葉にしてみ。
自ずと分かるはず
857デフォルトの名無しさん:2008/07/08(火) 11:11:04
while((temp = getc(fp)) != NULL)

getc(fp) != NULL

ってやるより特定の記号タイプで終了にしたほうがいいんじゃね?
858デフォルトの名無しさん:2008/07/08(火) 11:51:44
Cの標準関数一覧が載ってた↓のサイトどこに行ったか知りませんか?
http://cham.ne.jp/piro/p_stdfunc.html

1ページにまとまってて,頭に目次,関数毎にプロトタイプと一行説明
がついてたとても使いやすいとこだったんだけど
859858:2008/07/08(火) 11:59:32
860デフォルトの名無しさん:2008/07/08(火) 13:12:18
>>855
もう一度、自分の書いたコードが何をやっているのかを注意深く読み直すこと。
やりたいことは、あるファイルから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) { ……
861デフォルトの名無しさん: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分を追加する等)変数のアドレスが変化するのですが、
それを変化させないようにするやりかたがあるそうなのですが、本当でしょうか
あればやり方を教えてください
意味がないかもしれませんが、私に課題として与えられていることなのです
862デフォルトの名無しさん:2008/07/08(火) 15:03:22
ほんっと意味ねーな……課題出した奴の頭を疑うわ
863デフォルトの名無しさん:2008/07/08(火) 15:06:43
windows上で動かすプログラムが毎回同じアドレスを使える確率って
どのくらいあるんだ?
864デフォルトの名無しさん:2008/07/08(火) 15:13:18
ちょっと答えは知りたい
865デフォルトの名無しさん:2008/07/08(火) 15:13:19
>>863
いや、この場合はプログラム内から見えるアドレスだからOSは関係ない
VCでどうやるか知らんけどコンパイラの設定である程度固定できるはず
ほとんど意味ないがな
866デフォルトの名無しさん:2008/07/08(火) 15:25:32
.data の固定のこと言ってんのかな?
printf追加したくらいじゃ動かんと思うけど、、、

メモリをファイルマッピングしてMapViewOfFileExでアドレス指定して
変数割り当てる、とか?
867デフォルトの名無しさん:2008/07/08(火) 15:29:33
>>866
>メモリをファイルマッピングしてMapViewOfFileExでアドレス指定して
>変数割り当てる、とか?
もうこんなことをしないといけない時点で教材用の題材じゃないことは明白だよな。

出題したやつ頭おかしいとしか思えん。
868デフォルトの名無しさん:2008/07/08(火) 15:36:12
学生の宿題ってわけじゃなかろ
共有メモリとかの話でもないのかなあ
869デフォルトの名無しさん:2008/07/08(火) 15:37:50
グローバル変数を全部structに置き換えて、mallocで確保したものにすると
多少はプログラムサイズ非依存性が高まる。
元のプログラムでも、順序関係とかはそんなに変わらない筈なんだが
コンパイラ/リンカの都合でこういうのは決定できる(静的データの先頭アドレスの決定権
=コンパイラ/リンカ)
他にも隠された静的データ沢山あるだろうしね。特にWin32では。
870デフォルトの名無しさん:2008/07/08(火) 15:53:31
>>861
ん、「bssを固定するリンカオプションを調べとけ」って事じゃないの。
871デフォルトの名無しさん:2008/07/08(火) 16:01:51
論理演算子の真偽表
p_______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ページより

上の表の意味がさっぱり分からないのですが、論理学か数学かに出てくるのでしょうか。
しばらくスルーしても大丈夫?
872871:2008/07/08(火) 16:02:33
すみません、ageてしまいました。
873デフォルトの名無しさん:2008/07/08(火) 16:20:23
p=0,q=0のとき、 p && q == 0、p || q == 0、 !p == 1
以下同様
874デフォルトの名無しさん:2008/07/08(火) 16:42:12
>>856,>>857,>>860
ありがとうございました。
875デフォルトの名無しさん:2008/07/08(火) 18:21:34
>>871
数Aとかで習ったような
AND演算とOR演算で調べてみな
876デフォルトの名無しさん:2008/07/08(火) 18:27:47
ビット演算と絡めた話なら分かるが、
論理演算子説明するのにこんな表使う意味あるのか。
877デフォルトの名無しさん:2008/07/08(火) 18:29:29
真理値表が大好きなんだよきっと
878デフォルトの名無しさん:2008/07/08(火) 19:12:14
strcat()などの命令をを使ってコピーしたときに
大きさを超えてしまったらなにがおきますか?
879デフォルトの名無しさん:2008/07/08(火) 19:12:46
やべageてた
880デフォルトの名無しさん:2008/07/08(火) 19:14:19
>>878
何が起きてもよいですが、何も起こらないかもしれません。
881デフォルトの名無しさん:2008/07/08(火) 19:18:48
機能
s2が指す文字列を、s1が指す配列の最後に連結する。戻り値は、s1の値である。
また、コピー先とコピー元が重なる場合の動作は未定義とする。

バッファオーバーラン
strcatは、s1の容量に就いては一切関知しない。よって、s1の指す配列の範囲を越
えて、s2が書き込まれてしまう恐れがある。これによって、メモリ破壊を引き起こしたり、
プログラムがクラッシュしてしまうことがある。バッファオーバーランを防ぐ方法の1つ
として、字数制限付き文字列連結関数であるstrncatを使う。
882デフォルトの名無しさん:2008/07/08(火) 19:23:39
>>880-881
ありがとうございます
883デフォルトの名無しさん: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]);
884デフォルトの名無しさん:2008/07/08(火) 19:55:01
int k;
double c[k];
この書き方がまず出来ない
配列を宣言する時は要素数を確定してなければならない
885871:2008/07/08(火) 19:55:23
>>873
>>875-877
ありがとうございます。
何となく分かったような気がします。
886デフォルトの名無しさん:2008/07/08(火) 20:05:20
>>881によると
>字数制限付き文字列連結関数であるstrncatを使う
strncat(char *s,const char *t,int length)

C2008では、この関数は非常にインテリジェントになっており、
sの後ろに何文字書き込めるか、知らない場合はプログラム作成者
の携帯にメールを出してチェックしてくれるそうです。
lengthがsの後の有効書き込み可能メモリのサイズを超えた値を指定してみて下さい。
tの有効読み込み可能メモリサイズを超えたときもメールを出してくれるそうです。
いい時代になったものです。
887デフォルトの名無しさん:2008/07/08(火) 20:20:15
簡易ボーカルキャンセラーをつくりました。

ステレオのwavの左チャンネルから右チャンネルを引いてモノラル化して
センターキャンセルするという単純なアルゴリズムです。

ただ減算しただけだと、出来上がったモノラルファイルを聞くと、たまにブチブチノイズが入ってしまいます。

ためしに減算した値に0.6を掛けてみたらノイズが消えました。

原因はオーバーフローでしょうか?0.6をかける処理っていうのは正しいことなんですか?

データの型はsigned shortです。
888デフォルトの名無しさん:2008/07/08(火) 20:23:33
#define M 7 //patternの長さ
char text[]="ababdeabababbabababab";
char pattern[]="abababa"; // 検索する文字列
int next[M]; // パターン検査用
検索する文字列の長さが不定だった場合、
現時点で自分は、nextをその都度検索する文字列の長さ分をmallocなりで確保しようと思っているのですが、
int next[M];はどのようにするのがベストですか?
889デフォルトの名無しさん:2008/07/08(火) 20:28:59
>>888
その質問の仕方じゃわからん
やり直し
890デフォルトの名無しさん:2008/07/08(火) 20:32:38
思うんだが検索する長さが不定ならば
最初っから微妙に配列作ってないで必要な分だけmallocすれば良いんじゃないのか?
891デフォルトの名無しさん:2008/07/08(火) 20:46:36
ごめんなさい、言い忘れてました。
KMP法による文字列検索です。
892デフォルトの名無しさん:2008/07/08(火) 21:48:35
一定サイズ確保してそれ以上の大きさの文字列は検索できませんよとするか
いちいちallocするかの二択
893デフォルトの名無しさん:2008/07/08(火) 23:15:19
500行くらいの難判定復号のプログラムなんですが、
質問させて頂いてもよろしいでしょうか?
894デフォルトの名無しさん:2008/07/08(火) 23:18:41
ソース上げれば暇な人が答えてくれるかも
895デフォルトの名無しさん:2008/07/08(火) 23:30:08
多分凄い初心者な質問だけど、コンパイラのバージョンってどうやって調べられるのか教えてください
GUI開発環境で、CPad for Borland C++Compiler ってのを使ってます。
それでコマンドプロンプトを起動しgcc -v と入力したら gcc version 4.3.0 20061021 というのが表示されるんですが、
これがコンパイラのバージョンを表してるんですか?
896デフォルトの名無しさん:2008/07/08(火) 23:36:16
ちがうだろ
897デフォルトの名無しさん:2008/07/09(水) 00:00:29
>>887
wavとか全然知らんくせにレスさせてもらうが

> 原因はオーバーフローでしょうか?
チェック文入れてみたらどうでしょう?
 abort(SHORT_MIN <= l - r || l - r <= SHORT_MAX);

> 0.6をかける処理っていうのは正しいことなんですか?
オーバーフローが無いことを保証するなら 0.5 をかけるべきなんじゃないかな

違ってたらゴメンね
898デフォルトの名無しさん: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のメンバに正しくアクセスできることは確約されていますか?

899デフォルトの名無しさん:2008/07/09(水) 00:48:13
>>897
やはりオーバーフローしてるところがあります。下にも上にもですね

short型にdouble掛けてもいいんでしょうか?
900デフォルトの名無しさん:2008/07/09(水) 01:07:11
>>898
できない。
そもそもキャストできない。
incC*とincX*の大きさが違う可能性がある。
901デフォルトの名無しさん:2008/07/09(水) 01:09:28
>>899
気持ち悪いなら/2でいいだろ。
902デフォルトの名無しさん:2008/07/09(水) 01:25:59
>>901
それでも小数点以下切捨てされちゃうのが・・・
いいのかな?と
903898:2008/07/09(水) 02:02:26
>900
レスありがとうございます。
大きさが違うとキャストできないってのがピンときません。
typedef struct {
int len;
char str[1];
} Str;
Str *str = (Str*)malloc(sizeof(Str) + ...);
はOKなのですよね・・・?
904デフォルトの名無しさん:2008/07/09(水) 02:07:31
>>886

本当か?w
すごいいい時代になったな。何故strcpyでそれもやってくれないんだ?多分それstrcpyでも
やってくれるよ。
905デフォルトの名無しさん:2008/07/09(水) 02:13:43
>>903
俺は保証されるように思う。あくまでも思うなので他の人のフォローに期待。
んで、キャストできないなんて事はないよ。
906デフォルトの名無しさん:2008/07/09(水) 02:15:19
構造体が違ってもキャストは出来るだろうな

正しくアクセス出来ることを確約はされていないだろうが
907デフォルトの名無しさん:2008/07/09(水) 02:20:01
あの構造なら、確約されると思うが。 確約されない理由ある?
908デフォルトの名無しさん:2008/07/09(水) 03:24:15
アライメントによってはずれるんじゃね
909デフォルトの名無しさん:2008/07/09(水) 03:31:15
アライのメットを装備すればおk?
910デフォルトの名無しさん:2008/07/09(水) 03:36:15
unionのメンバの大きさが不ぞろいなときに
最大のメンバの末尾に合わせてつめるような処理系とかあるのかな?
もしそうなら保証できないね

っていうか規格スレのほうが詳しいと思う
911デフォルトの名無しさん:2008/07/09(水) 07:45:48
関数について質問なのですが
2つの値を返す方法ってありますか?
int ○○(void)ではreturnで1つの値しか返せないと思うのですが
void ○○でできる方法があるのでしょうか?
912デフォルトの名無しさん:2008/07/09(水) 07:47:57
パラメーターの参照渡し
913デフォルトの名無しさん:2008/07/09(水) 07:52:41
引数にポインタを渡す
914デフォルトの名無しさん:2008/07/09(水) 07:59:27
#include <stdio.h>

void 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 ともに返せてることが分かると思う
915デフォルトの名無しさん:2008/07/09(水) 08:03:02
>>908,指定された構造ではアライメンとは関係ないね
>>910そんな処理系聞いた事無いけど、ある?
916デフォルトの名無しさん:2008/07/09(水) 08:05:43
待った。あの構造でも、下のstructとオプション指定によってはアライメンが関係する。
失礼した。
917デフォルトの名無しさん:2008/07/09(水) 09:05:03
アライメンって何。
918デフォルトの名無しさん:2008/07/09(水) 09:05:56
粗い麺
919デフォルトの名無しさん:2008/07/09(水) 09:07:31
マジレスすると荒井注のいとこ
920デフォルトの名無しさん:2008/07/09(水) 09:07:49
ショウエイでも可
921デフォルトの名無しさん:2008/07/09(水) 09:46:08
#define NENREI 25
struct 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("シコシコ…ああっ、いいお、いいお、足も胸もおなかもかわいいお…"\
"イッルたん最高だお…シコシコ…そろそろイクお……ウッ!");
}
922デフォルトの名無しさん:2008/07/09(水) 10:01:40
つまり誰でもオナニーするってことでよろしいか?
923デフォルトの名無しさん:2008/07/09(水) 10:02:31
あるあるあr
924デフォルトの名無しさん: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で確保しています。
925デフォルトの名無しさん:2008/07/09(水) 10:18:54
>>924
今までは切断する処理がたまたま動いていただけ、かな?
最小限の再現ソースを見せてってよくいうのはそういうことです。
926デフォルトの名無しさん:2008/07/09(水) 10:20:30
構造体書き換えたらフルコンパイルしているか?
927924: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関数でリスト化してます。
928デフォルトの名無しさん:2008/07/09(水) 10:34:16
>>926
そうしてます。
以前ちょっとはまった経緯があるのでmakeの最後にコンパイル時に生成したxxx.oなどは
削除するようにしてありますので常にフルコンパイル常態なんです。
929デフォルトの名無しさん:2008/07/09(水) 10:36:58
>構造体サイズxn malloc
これは

p=(HOGEHOGE *)malloc(sizeof(HOGEHOGE)*n);
Entry(p);
Entry(p+1);
Entry(p+2);
 :
Entry(p+n-1);

という意味?
930デフォルトの名無しさん:2008/07/09(水) 10:39:15
>>929
そうですね。
931デフォルトの名無しさん:2008/07/09(水) 10:39:48
フリーズするってのは無限ループだろう
932デフォルトの名無しさん:2008/07/09(水) 10:40:57
Del読んだ前後のループ部分貼れ
933デフォルトの名無しさん:2008/07/09(水) 10:42:12
if (fpEntTy == NULL) {

} else {
fpEntTyLast->nextdata = wfp;
wfp->prevdata = fpEntTyLast;

ここを見ると奇妙な事をしているな。 双方向リストの仕様は何だ?
934デフォルトの名無しさん:2008/07/09(水) 10:44:46
別に奇妙でも無いじゃん。
デバッガもしくはprintfで途中経過見てる?
935デフォルトの名無しさん:2008/07/09(水) 10:46:09
fpEntTyが先頭でfpEntTyLastが末尾なだけじゃないの?
んでもそれならDelの処理は
if (wfp == fpEntTy) fpEntTy = NULL;
if (wfp == fpEntTyLast) fpEntTyLast = NULL;
だけでもよさそうに思うし、別に今のでも大丈夫に見える
936デフォルトの名無しさん:2008/07/09(水) 10:47:22
>935
落ち着け
937デフォルトの名無しさん:2008/07/09(水) 10:47:34
>>933
fpEntTy側からのアクセスの場合、終端にはnextdataにNULLが入ります。
fpEntTyLast側からのアクセスの場合、終端にはprevdataにNULLが入ります。

Entry関数はもらった構造体を一番最後につけます。
938デフォルトの名無しさん:2008/07/09(水) 10:47:49
だけ、はまちがい。
if (wfp == fpEntTy) fpEntTy = wfp->nextdata;
if (wfp == fpEntTyLast) fpEntTyLast = wfp->prevdata;
が、
if (wfp == fpEntTy) fpEntTy = NULL;
if (wfp == fpEntTyLast) fpEntTyLast = NULL;
でよさそうなのに、ってことです。

ちなみにNULLはどのように定義されていますか?
939デフォルトの名無しさん:2008/07/09(水) 10:48:47
とりあえずフリーズの話をしようか
940デフォルトの名無しさん:2008/07/09(水) 10:49:40
>938
いいから落ち着け
まだ要素が残ってたらどうするんだ
941デフォルトの名無しさん:2008/07/09(水) 10:50:28
いいから早く全部貼れよ!
942デフォルトの名無しさん:2008/07/09(水) 10:50:46
そもそも>>924の情報だけで何とかしようと思うのが間違ってる。
デバッグしたことないのか?
943デフォルトの名無しさん:2008/07/09(水) 10:51:49
} else {
fpEntTyLast->nextdata = wfp;
wfp->prevdata = fpEntTyLast;
wfp->nextdata = NULL;
fpEntTyLast = wfp; // これなに?
}
944デフォルトの名無しさん:2008/07/09(水) 10:52:32
>>940
oops
ひどくつかれているようだorz
ほんと、ごめん。
945デフォルトの名無しさん:2008/07/09(水) 10:52:45
>>924>>927>>928>>930>>937は私です。

>>938
>if (wfp == fpEntTy) fpEntTy = NULL;
>if (wfp == fpEntTyLast) fpEntTyLast = NULL;

これをやってしまうと、要素が残ってるかもしれないのに
リストを切断してしまうのでダメです。

なので今のようなロジックにして、登録の際に両端の構造体にはNULLを入れることを
保証すればOKなんです。
946デフォルトの名無しさん:2008/07/09(水) 10:54:41
while(fpEntTyLast) Del(fpEntTyLast);
とかしてんのかな
947デフォルトの名無しさん:2008/07/09(水) 10:54:45
if (wfp == fpEntTy) {
fpEntTy = wfp->nextdata;
fpEntTy->prevdata = NULL;
}
if (wfp == fpEntTyLast) {
fpEntTyLast = wfp->prevdata;
fpEntTy->nextdata = NULL;
}
が要るんじゃないのか? バグ原因かも知れないがな。
948デフォルトの名無しさん:2008/07/09(水) 10:54:46
>>945
名前にレス番入れろ
949924:2008/07/09(水) 10:54:49
>>943
それは双方向リストのfpEntTy側から見た一番最後にくっつけるためです。

950デフォルトの名無しさん:2008/07/09(水) 10:55:58
とりあえずリストのポインタ操作に慣れてないやつは口開く前にもう一回確かめろ
951デフォルトの名無しさん:2008/07/09(水) 10:56:29
>>949
いや、ここだけに絞って欲しい
fpEntTyLast = wfp; // これなに?
952デフォルトの名無しさん:2008/07/09(水) 10:56:51
struct のメンバ順入れ替えで振る舞いが変る ってんなら
*prevdata, *nextdata が領域外アクセスして(されて) ポインタ値が壊れているんじゃないの?

int hogeint01 … ってあるけど、実は配列があって、範囲外書き込みしてるだけとかさ
953デフォルトの名無しさん:2008/07/09(水) 10:57:06
924はタコに応答してないでさっさと全ソースを貼れ
954デフォルトの名無しさん:2008/07/09(水) 10:57:51
>>951
最後の要素を指してるだけだからおちつけってw
955デフォルトの名無しさん:2008/07/09(水) 10:57:58
>>951
寝ろ
956>>924:2008/07/09(水) 10:59:44
>>951
いやだから・・・

fpEntTy側から見た最後が変わったのでfpEntTyLastも更新しないと・・・・
双方向リストをご存知?

>>952
中に配列はないです。
構造体サイズの調整用の予備charはありますが使ってません。
957デフォルトの名無しさん:2008/07/09(水) 11:01:13
正直、双方向リストのバグではなく、単に他のバグの可能性が大と思われ
958デフォルトの名無しさん:2008/07/09(水) 11:03:01
959デフォルトの名無しさん:2008/07/09(水) 11:04:51
>構造体サイズの調整用の予備char

あ や し い
960デフォルトの名無しさん:2008/07/09(水) 11:05:26
グダグダ言わずにソースを全部貼れ、な?
961デフォルトの名無しさん:2008/07/09(水) 11:10:00
>>947
fpEntTyLast = wfp->prevdata;
fpEntTyLast->nextdata = NULL;
かな
962デフォルトの名無しさん:2008/07/09(水) 11:10:38
>>959
アロケーション時 sizeof(HOGEHOGE) 使わずに 定数リテラル 使ってる悪寒

>>924
全ソース貼れorロダにあげろ
963デフォルトの名無しさん:2008/07/09(水) 11:12:45
>>961
ケアレスミス指摘あり
964デフォルトの名無しさん:2008/07/09(水) 11:13:16
>>961
fpEntTyLast->nextdata = NULL;はあってもなくても大丈夫に思うが、先頭削除時のはいるだろうね。
が、それが原因で永久ループになる事はなさそうに思うので、みんな言ってるように他の部分もうpするんだw
# 先頭のprevがNULLかどうか判定する事はないと思いたい
965デフォルトの名無しさん:2008/07/09(水) 11:15:02
とりあえず上の二つの関数に問題はない
突っこんでるやつは全員的外れ
966デフォルトの名無しさん:2008/07/09(水) 11:19:15
ある程度allocした領域をガチャガチャした後に、新しく使う領域を探すのはどうやってやってるのかな
中間削除も行えるようだし、気になります
967デフォルトの名無しさん:2008/07/09(水) 11:20:47
うp中かな。wktkwktk
968デフォルトの名無しさん:2008/07/09(水) 11:21:48
UP用に小さくしてたら、問題なく動いてしまった落ち。
969デフォルトの名無しさん:2008/07/09(水) 11:23:55
>>962
それはないですw

ちゃんとsizeof(HOGEHOGE)*nで確保してます。


いやちょっとうpするにはサイズが大きいのと元はちょっとそのままあげるのはできないものなので・・・
970デフォルトの名無しさん:2008/07/09(水) 11:24:59
まあとにかく、他の原因だと思ってデバック頑張れ。
971デフォルトの名無しさん:2008/07/09(水) 11:25:21
おかしくない部分だけ抜粋して原因は何が考えられますか?
は無いだろ・・・
972デフォルトの名無しさん:2008/07/09(水) 11:28:17
構造体のレイアウト変えたら動かなくなったので、構造体のレイアウトが
悪さをすることがあるか?って聞いただけじゃね?
どつぼにハマるとそういう考えになることもあるよ。コンパイラのバグじゃね??とかさ。
973デフォルトの名無しさん:2008/07/09(水) 11:29:27
void Del(HOGEHOGE* wfp)
{ printf("%p\n", wfp); /* ←追加 */


アロケーション時に
p=(HOGEHOGE *)malloc(sizeof(HOGEHOGE)*n);
for (i=0; i<n; i++) printf("%p\n", p+i); /* ←追加 */

Del() 呼び出し時の アドレス比較だな
アロケーション時のアドレス以外の値が来てるなら、何処かのコードが値をぶっ壊してる
974924 969:2008/07/09(水) 11:30:55
実はこれ以外に大きくまとめてHOGEHOGEを確保する分とHOGEHOGEを動的に細かく確保するというのが混在してて、
ある箇所でリストを開放する際にまとめて取った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;
        }
975924:2008/07/09(水) 11:37:41
>>974はいじってる過程のものなのでたぶんおかしいですw
976デフォルトの名無しさん:2008/07/09(水) 11:39:33
・削除するときに削除される要素のprev nextをちゃんとNULLにする
・先頭要素を削除したときは新しい先頭要素のprevをNULLにする

これやってもだめかな
977924:2008/07/09(水) 11:42:52
>>976
あーーーーそれぽいですね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;
        }
これが正解?
978デフォルトの名無しさん:2008/07/09(水) 11:43:22
しらねーよ
979デフォルトの名無しさん:2008/07/09(水) 11:45:45
>>976
それだと 『構造体のレイアウト変えたら動かなくなった』 の説明がつかないんじゃね?
元レイアウトであろうが、新レイアウトであろうが それが主因なら同じ挙動になると思うけど
980デフォルトの名無しさん:2008/07/09(水) 11:50:17
>>978に 一票
981デフォルトの名無しさん:2008/07/09(水) 11:54:54
>>977
何でDel関数じゃなくてそこなおすんだろ?
んで、case -2はますます関係ないんじゃないの?

>>979
同じデータ操作をしてない場合、たまたまうまく動く場合とそうではない場合があるんじゃないかな
982979:2008/07/09(水) 11:59:40
>>981
それは、、、、 問題の切り分けができていないパターンだな
主因は "とあるデータ操作順"であって "構造体のレイアウト変更"は無関係 ってやつか
983デフォルトの名無しさん:2008/07/09(水) 12:01:04
こうできないものか
        wfp = 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;
          }
        }
984デフォルトの名無しさん:2008/07/09(水) 12:02:32
ごめ、while 以降の wfp をすべて fpEntTy と読み替えてください
985924:2008/07/09(水) 12:05:41
>>983
実はfpEntTyは配列になってて0〜31で機能わけしてるんです。

本当は>>974のソースの外側で一段ループ処理が入ります。
986デフォルトの名無しさん:2008/07/09(水) 12:24:06
987924:2008/07/09(水) 12:26:38
>>974のcase -2:の中のfree(wfp)をやめたらフリーズが回避できました・・・
988デフォルトの名無しさん:2008/07/09(水) 12:28:14
>いじってる過程のものなのでたぶんおかしいです

ということでなくて、オリジナルもそうなってたのか?
989924:2008/07/09(水) 12:31:01
>>988
いえ、リスト用ポインタを構造体の最後に配置した場合は問題ありませんでした。
今回そのポインターを前に持ってきたので問題となったのでいろいろ試してる最中でして
990デフォルトの名無しさん:2008/07/09(水) 12:34:22
いや
 free(wfp);
 wfp = wfp2;
freeして書き込んでるじゃん。
991デフォルトの名無しさん:2008/07/09(水) 12:35:21
上書きしてるのにおかしくなってるってことは、どこかでこのアドレス使ってるんだろうな、と
992924:2008/07/09(水) 12:43:48
 //free(wfp);
 wfp = wfp2;

としたら想定の動きするんです・・・・

ポインターを先頭に持ってくるとまずいんですかね?
ネットなんかの双方向リストのサンプルも大体構造体の最後に配置してますし・・・
993デフォルトの名無しさん:2008/07/09(水) 12:45:13
リスト以前に基本的なことが分かってないんじゃないの
994デフォルトの名無しさん:2008/07/09(水) 12:48:03
free(wfp) の代わりに memset(wfp, 0xcc, sizeof(HOGEHOGE))
これでアレなら、開放されてるのに使ってる場所(or そこを参照するリンク) が残ってることになる
995デフォルトの名無しさん:2008/07/09(水) 12:53:38
リスト構成本体を構造体先頭にもってったらリスト操作で固まる
=リスト構成本体を構造体末尾にもってったら、先頭側メンバの値が(いつのまにか)狂ってる

どっちにしてもちゃんと動いていないコードだ
996デフォルトの名無しさん:2008/07/09(水) 12:57:42
デバッグの仕方を教育する場所になりそうだな。
997デフォルトの名無しさん:2008/07/09(水) 13:08:02
相談の仕方のほうだろ
表に出せないようなソースなら職場の人間に聞け
998デフォルトの名無しさん:2008/07/09(水) 13:08:33
バグったらまずはクマのお人形に相談する

ウメス
999デフォルトの名無しさん:2008/07/09(水) 13:25:19
マジレスするとそんなちまちま書き換えながら出されても
俺らエスパーでも予言者でもないんで何も判断できない
問題の起こるソースをそのまま見せられないなら自分でなんとかしろ
1000デフォルトの名無しさん:2008/07/09(水) 13:26:28
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。