1 :デフォルトの名無しさん2011/03/09(水) 14:40:37.79
C言語の*入門者*向け解説スレッドです。

★前スレ
C言語なら俺に聞け(入門編)Part 79
http://hibari.2ch.net/test/read.cgi/tech/1297728426/
★過去スレ
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
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
  C/C++の宿題片付けます 146代目
  http://hibari.2ch.net/test/read.cgi/tech/1296387672/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
★ぬるぽ。
4 :デフォルトの名無しさん2011/03/09(水) 17:20:14.66
>>1乙スレ立て直せ
8 :デフォルトの名無しさん2011/03/09(水) 20:36:46.04
やっと勃った
9 :デフォルトの名無しさん2011/03/09(水) 20:38:27.05
>>8
そんなに渇望してるなら自分で立てろよw
11 :デフォルトの名無しさん2011/03/09(水) 20:59:16.83
最近C言語やりはじめたんですが、C++ってなんですか?参考書売場であったので、C言語とは関係ないんですか?
14 :デフォルトの名無しさん2011/03/09(水) 21:32:58.15
C++ == C + 1 だしなw
15 :デフォルトの名無しさん2011/03/09(水) 21:33:25.79
>>11
C を拡張した言語は沢山あって、C++ もそうだし、Objective-C とか D とか、
色んな言語が C を元にして生み出されてきました。C++ はそういった言語の
ひとつで、主に 1990 年代に隆盛した言語です。
16 :デフォルトの名無しさん2011/03/09(水) 21:50:35.17
>>14
志村〜、未定義未定義
19 :デフォルトの名無しさん2011/03/09(水) 22:34:17.72
C++ = C; // 副作用二回で未定義
C++ == C; // 左辺と右辺の評価順が不定
20 :デフォルトの名無しさん2011/03/09(水) 22:37:25.95
> C++ == C;
あれ?
左辺から右辺に評価かされるけど、左辺の副作の評価順が不定?
良く分からなくなってきた
22 :デフォルトの名無しさん2011/03/09(水) 23:05:07.06
どこまでが不定で、どこからが未定義か分からなくなってきた
K&RのころとC99で変わってる気もするから、今度確認しておこう…
23 :デフォルトの名無しさん2011/03/09(水) 23:08:02.17
とりあえず=と==では++使わない方がいいってことですね
25 :デフォルトの名無しさん2011/03/09(水) 23:11:28.37
>>19
ANSIから下も未定義じゃね?
C FAQに何か書いてあるっぽい。
26 :デフォルトの名無しさん2011/03/09(水) 23:11:55.24
C = C++ はうっかりするかもしれんけど、
C == C++ のほうはやりそうにないな。
27 :デフォルトの名無しさん2011/03/09(水) 23:15:12.00
>>23
違う
副作用がある演算を行った変数は、その前後の副作用完了点の間の他の場所では参照するなってこと

>>25
FAQの頃は、参照(比較)だけなら不定で、演算すると未定義だったはず
28 :デフォルトの名無しさん2011/03/09(水) 23:18:19.38
>>26
こんなことしないでくださいね

int i = ;
int *p = &i;
*p == i++;
30 :デフォルトの名無しさん2011/03/10(木) 01:43:11.96
int bitCount(unsigned int i) {
  i = i - ((i >>> 1) & 0x55555555);
  i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
  i = (i + (i >>> 4)) & 0x0f0f0f0f;
  i = i + (i >>> 8);
  i = i + (i >>> 16);

  return i & 0x3f;
}

ビットを数えていると思うんですが、動きがわかりません><
32 :デフォルトの名無しさん2011/03/10(木) 04:28:57.52
>>30
最初に2ビットずつ何ビットあるか計算して、
次に4ビットずつ何ビットあるか計算して、
更に8ビットずつ何ビットあるか計算して、
今度は16ビットずつ何ビットあるか計算して、
最後に32ビットに何ビットあるか計算しています。
33 :デフォルトの名無しさん2011/03/10(木) 06:35:06.98
>>30
i - ((i >> 1) & 0x55555555);
0x55555555ってのは0101010…以下略のビットが並んでる状態で
隣合う2ビット毎に、そこで立っているビット数を、その2ビット自身に格納
11 → 11 - 01 → 10
10 → 11 - 01 → 01
01 → 01 - 00 → 01
00 → 00 - 00 → 00

> (i & 0x33333333) + ((i >>> 2) & 0x33333333);
0x33333333ってのは00110011…以下略のビットが並んでる状態で
隣合う2ビット毎をペアにした計4ビット毎のビット数を、その4ビット自身に格納
xxyy → yy(下位2ビットのビット数) + xx(上位2ビットのビット数) → 0zzz(4ビットのビット数)

以降、同様に繰り返しているだけたが、最初のビットの数え方だけ違うのと
不要ビットの消し方も最適化してるから分かり辛いかも

以下、もともとの考え方
i = ((i & 0xaaaaaaaa) >> 1) + (i & 0x55555555);
i = ((i & 0xcccccccc) >> 2) + (i & 0x33333333);
i = ((i & 0xf0f0f0f0) >> 4) + (i & 0x0f0f0f0f);
i = ((i & 0xff00ff00) >> 8) + (i & 0x00ff00ff);
i = ((i & 0xffff0000) >> 16) + (i & 0x0000ffff);
return i;
で、これを最適化すると>>30になる
34 :デフォルトの名無しさん2011/03/10(木) 08:19:40.10
プログラム全体の時間量を計測して表示したいんですが
どうしたらいいですか?

#include<stdio.h>
int main(void)
{return(0);}

このプログラムならどうなりますか?
35 :デフォルトの名無しさん2011/03/10(木) 08:33:15.99
>>34
time コマンドとかプロファイラとか
37 :デフォルトの名無しさん2011/03/10(木) 08:34:41.00
並行処理(並列動作)するプログラム、すなわち、マルチスレッドプログラムのクリティカルなケースについて

前提:
    スレッドは2つ(スレッドA、スレッドB)
    A、B間で、データを受け渡しするために、共有メモリを使用する。(構造体M)

しばり:
    ソースを自由に変更できるのは、スレッドBのみ。(スレッドAのソースは現在の実装を変更できない、スレッドBのソースのみを変更して、B,M,A間のデータの整合性を実現させたい。)
38 :デフォルトの名無しさん2011/03/10(木) 08:36:19.58
構造体Mの内容:
    ・データを格納する配列 : int a[L]; // L=1<<13
    ・配列 a[] への、現在の書き込み先頭インデックス : int write_index;
    ・配列 a[] への、現在の読み込み先頭インデックス : int read_index;
    ・write_index 〜 read_index 間の距離(配列個数) : int count;
    ・Mの操作作法:
        write_index は 0 → L 方向に増加し、L 以上で 0 に戻り、循環する。 つまり、 write_index++ をする場合は、実際には
            write_index = (write_index+1) % L; もしくは(Lが(1<<x)の場合に限り)、 write_index = (write_index+1) & ~(L-1)
        read_index も write_index 同様。
        count は、循環を考慮して計算する必要がある。(つまり単純に write_index - read_index では不正)

Aの動作:
    まったく自由でランダムなタイミングで、a[read_index]からa[write_index]までのデータを参照する。 それに伴い、read_index と count の値も操作する。

Bの動作:
    まったく自由でランダムなタイミングで、a[write_index]にデータを書き込む。 それに伴い、write_index の値を操作する。

質問:
    B、M、Aの整合性を保つ方法。
    つまり具体的に、 B の write_index (int)への書き込みは、スレッドセーフだと想定して良いのかどうか。(intel core2以降のCPUの動作として)
    すなわち、仮に write_index が実際には struct write_index {int a, b;} だとすれば、 a, b への変更は、タイミングにズレが生じるので問題だが、
    (int)への書き込みの場合にも、このようなズレ(タイムラグ)は発生するのだろうか?
    つまりスレッドAが、(int)に0xFF を書く場合、スレッドA(CPU A)がLSB側3ビット目までしか書き終わってないタイミングで、 スレッドB(CPU B)がアクセスして、0x07として読み取る心配は不要なのかどうか。
41 :デフォルトの名無しさん2011/03/10(木) 20:20:42.41
>>38
質問の本質に対して話長杉w

現実世界でC言語で書かれた (write_index+1) % L や write_index = (write_index+1) & ~(L-1) が
アトミック性を持つ可能性はほぼ 0 なのでクリティカルセクションになる
42 :謙虚フロンティア戦士2011/03/10(木) 21:19:42.93
Bがcount操作しないのおかしくね?

書いてある前提が全て正しければ、整合性は取れる
45 :デフォルトの名無しさん2011/03/10(木) 22:20:02.42
>>38
volatileでコンパイラ最適化抑制をしておかないと場合によってはハマる予感
46 :デフォルトの名無しさん2011/03/10(木) 22:28:02.76
つかコンパイルエラーって役に立つんですか?for()内の;忘れただけで
他の行にも複数エラーありの表示が出るんですが・・・

ピンポイントでここが違うんじゃないかという予想のエラー表示を
して欲しいものです。
48 :デフォルトの名無しさん2011/03/10(木) 22:34:02.05
>>46
無いより有ったほうが良い 少なくともそれ以前はエラーじゃないことがわかる
50 :デフォルトの名無しさん2011/03/10(木) 23:33:21.61
>>46
ついでに予想して直してくれりゃ最高だなw
52 :デフォルトの名無しさん2011/03/11(金) 01:09:09.89
fgets関数を使った標準入力で、指定された範囲での入力を促す機能をつけよ
うとしているのですがエラーがでます。どこがマズイんでしょうか?
エラー E2034 0311.cpp 10: 'int' 型は 'char *' 型に変換できない(関数 main() )
エラー E2034 0311.cpp 10: 'int' 型は 'char *' 型に変換できない(関数 main() )

#include <stdio.h>

int main(void)
{
char y[10];

printf( "1〜9999の間数字を入力してください \n" );
fgets( y, 10, stdin ); /* 標準入力から入力 */

while (1>y || 9999<y)
{
printf("1〜9999の間で入力してください。\n");
fgets( y, 10, stdin );
}

puts(y); /* 入力された文字列を表示 */

return 0;
}
54 :デフォルトの名無しさん2011/03/11(金) 03:42:20.02
>>52
数字と配列を比較しているのがまずい。
GCCしか手元に無いので試せてなくて申し訳ないが、たぶんVC++とかでも動く……はず。

#include <stdio.h>
int main(void){
char y[10];
/* 1と入力してEnterキー押してみ。 */
fgets(y, 10, stdin);

/*「2673946」なり「1438764」なり、妙な数字が出ると思う。この数字は「メモリ上の番地」を指している。
yには確保したメモリ領域の先頭の番地(数字)が入っている。

char y[10]って書いたら「xxxxxx番地から10バイト(char10コ分)のメモリ領域を確保せよ」の意味。ちなみに
y[0] = 「メモリ上のxxxxxx番地に記載されたデータを出せ」の意味。
y[1] = 「メモリ上のxxxxxx番地から1バイト先に記載されたデータを出せ」の意味。*/
printf("y = %d\n", y);

if (y == 1) {
printf("%d = 1\n", y);
}
else {
printf("%d != 1\n", y);
}

/* オマケ。 文字列の"1"を数字に直すと49。数字の49を見たら"1"って文字に直しましょうという「ASCII」仕様に拠る。
ttp://e-words.jp/p/r-ascii.html を参照のこと*/
printf("%cって文字は数字の%d。\n", y[0], y[0]);
return 0;
}

試してみ。
55 :デフォルトの名無しさん2011/03/11(金) 03:51:28.01
>>46
一個のテキストファイルしか扱わないならピンポイントでもいいんだわ。

1000コの.cファイルを扱うようなとき、「エラー一個見つけたら止まる」だと
直してコンパイルして直してコンパイルして……ってことになる。
そりゃ開発者側からすれば面倒なわけ。複数個のエラーがあるなら全部直した上でコンパイルしたいし、
エラーの箇所は大体知っておきたい。
だから大体のコンパイラは「他にもエラーが無いか探して、分かりえる限り全部のエラーを
プログラマーに示そうとする」ような作りになってる。
初心者から上級者まで全部を満足させるのは難しいわけね。仕様と思ってあきらめて。

初心者レベルなら一番初めのエラーだけ見ておけば済むと思う。
57 :デフォルトの名無しさん2011/03/11(金) 06:15:28.07
>>38
>つまりスレッドAが、(int)に0xFF を書く場合、スレッドA(CPU A)がLSB側3ビット目までしか書き終わってないタイミングで、 スレッドB(CPU B)がアクセスして、0x07として読み取る心配は不要なのかどうか。
x86系なら、bit単位でスライスされるなんてことないから、心配無用
まぁ、他の系統でも、そんな動作聞いたことないから大丈夫だとは思うが…
但し、bit単位でNGはありえないが、バイト単位でのNGはあり得るので
心配であれば、スレッドAのread_indexへの書き込みが、intと同じ大きさで
一回の命令で書き込まれているかを確認する必要がある
※たとえば、スレッドAのread_indexへの書き込み部の実装が、
 1バイト単位でのコピーになってれば当然NG(普通はあり得ないが保障もない)
あとは、作った奴がアホで、スレッドAでread_indexやcountを変更後に
配列 a[]を読み込んでたり、スレッドbでread_index確認せずに、
スレッドAが参照する前に追い越したり(write_indexの書き換えタイミングも同様)
アホなことをしなければ大丈夫だと思われる。
58 :デフォルトの名無しさん2011/03/11(金) 06:36:53.44
>>46
ピンポイント予想が出来ないから、可能性のある場所全てが表示される
逆に考えれば、ピンポイント予想の一か所を外した場合、間違ってる箇所を探すのが大変
62 :謙虚フロンティア戦士2011/03/11(金) 13:33:19.03
>>57
もうすこし根は深いぞ

例えばスレッドAとBが同じint型変数を100回ずつインクリメントする
プログラムを実行したとして、必ずしも
変数の値が200増える保証はない
63 :デフォルトの名無しさん2011/03/11(金) 13:42:31.55
じゃエラー拾ったら雪崩れるかなって所の後ろにセミコロン連打しとけばいいじゃん。

怪しげコード;;;;;;;;;
64 :デフォルトの名無しさん2011/03/11(金) 14:41:45.20
構造体の宣言についての質問です。

typedef _tgaAAA{
...
};

typedef {
...
}AAA;

typedef _tgaAAA{
...
}AAA;

これらの違いをお教えいただけますでしょうか・・・。
65 :デフォルトの名無しさん2011/03/11(金) 15:07:23.93
>>64
構文エラーかどうか
66 :デフォルトの名無しさん2011/03/11(金) 16:54:10.55
>>65
すんません、structぬけてました。
67 :372011/03/11(金) 19:04:29.83
テストしてみたところ、たしかに変数への書き込みがビット単位で分解される心配はしなくてもよいみたいです(CORE2)

スレッドA、Bは並列動作

ケース1 : スレッドB は 0 と -1 を交互に、 write_index へ一度に書き込む場合
http://ideone.com/Dn5SW

ケース2 : スレッドB は 0 と -1 を交互に、 write_index へ複数ステップで書き込む場合
http://ideone.com/Tn0y1

ケース1と、ケース2では、スレッドBの動作が異なるだけで、あとはすべて同じです。
ケース1では、心配してたバイト単位での不整合は、起きないようです。(CORE2の場合)
ケース2では、書き込みが2回に分けて行われますが(上位16bit、下位16bit)、この場合、Aとの同期に失敗します。(Aは0か-1以外ならエラー表示)



ケース3 : ケース2の各スレッドの動作速度を下げた。(1マイクロ秒毎)
http://ideone.com/hA2tF

ケース3の場合、動作速度以外はケース2と同じコードであるにも関わらず、実質、エラーが現れなくなりました。
(注:消えたではなく)
これは、おどろくべき事だと感じます… というか、並列プログラムのデバッグ・バグ再現の難しさを象徴してると思いました。
68 :372011/03/11(金) 19:11:06.33
(write_index +1)%L のタイミングも、実際には a=write_index; (a+1)%L; write_index = a; とすれば、
ケース1のように個々のIOはアトミックなので問題は出ないと思いますが、ご指摘のとうり、やはり懸念材料は count です。(変数操作が2つ以上あるということ。ケース2の例に相当)
そのものズバリ、「スレッドAとBで100づつ増やしても200にならない」問題です。(スレッドAを変えられさえすれば…)

また、
スレッドAでは、a[read_index+1]; read_index++; ではなく、ご察しのとうり(懸念どうり)、 read_index++; a[read_index]; の順序だったりします。(もともとシングルスレッド前提に書かれたコードなので)
これは実質スレッドBの動作には直接影響は無いと考えられますが、やはりシングルスレッドの時には注意しなかった微妙な点までもが、プログラム中で意味を持つようになるのは厄介に感じますね…


ある方法を思いついたのですが、アトミックが保証される動作に限定することで、A、B間での共有変数Mの操作に、セマフォ等を用いなくても可能になるのではないか? と思いました。が、実際にコード書いて検証はしてませんが。
count、write_index、read_index が、もしも128bitの配列として定義されてるのであれば、
書き込み、読み込みのインターフェースを限定し、そのインターフェース内でsseのmovで実現すれば、count と write_index を同時に書くことも可能になるかもしれないといことです。
(sseのmovはアトミックが保証されるのだろうか?がまだ不明ですが、保証される前提で考えてます。)

しかし、実際、それにはスレッドAのMへのアクセスも、すべてインターフェース使用を前提として書き換える必要が出てくるので、やはり実際には無理です…
(というか、スレッドAを書き換えられるとしても、セマフォではなく、sseレジスター128bit単位の方式の方が、セマフォでやるよりも効率の点でも良いような気がしますが、
果たしてsseのmovはbit単位で安全なのだろうか?等の懸念)
70 :デフォルトの名無しさん2011/03/11(金) 20:51:27.56
あいうえおと言う文字列を
16進数化するにはどういう方法を使えばいいのでしょうか
72 :デフォルトの名無しさん2011/03/11(金) 23:12:55.40
>70
「16進数化」とは何?
そこから話が始まるぞ。
73 :デフォルトの名無しさん2011/03/12(土) 02:13:36.08
>>70
printfの%xとか、そういうレベル?
74 :デフォルトの名無しさん2011/03/12(土) 05:27:37.12
>>68
>そのものズバリ、「スレッドAとBで100づつ増やしても200にならない」問題です。(スレッドAを変えられさえすれば…)
そりゃ、両スレッドから同じ値をカウントアップすれば、吐かれるコードによってはそうなって当たり前。
今回の話では、スレッドBは共有のcountを更新する必要はない。
スレッドBでは、前回読み込み時のread_indexとcountはローカルのみで保存して
read_indexが前回の読み込み時と同じ場合のみ、ローカルのcountと共有メモリのcountを、比較すればOK
(もちろんcountの更新方法はスレッドAと同じ方法で実装すること→最適化に注意)
と言っても、read_index++; a[read_index]; の更新&読み込み順だと、何やっても無駄だけどね…
75 :デフォルトの名無しさん2011/03/12(土) 05:41:38.30
意味が分かり辛いため補足
>(もちろんcountの更新方法はスレッドAと同じ方法で実装すること→最適化に注意)
ローカルのcountの更新は「前回のread_index」>「今回のread_index」もしくは、
「前回のread_index」==「今回のread_index」&&「ローカルcount」!=「共有count」
このcountの更新タイミングをスレッドAと同じタイミングで実装
って、これも分かり辛いか…
まぁ、何となく分かってくれ
76 :デフォルトの名無しさん2011/03/12(土) 05:46:39.77
>>62
今回の話では、スレッドAが書いたものをスレッドBが読み込んで、
スレッドBが書いたものをスレッドAが読み込む仕様なので、そんな問題は起こらない。
77 :デフォルトの名無しさん2011/03/12(土) 06:07:38.05
>>68
あぁ、ゴメン。
何か変だと思ったら、countの仕様とか、read writeとか反対に考えてた
つー訳で色々と無理だから諦めろ
78 :デフォルトの名無しさん2011/03/12(土) 06:24:24.95
勘違いしてたお詫びに邪道だが、他の手を考えてみた
スレッドAの仕様にもよるが、読み込む時にcountをキーにしてる(count==0なら何もしない)
かつ、countが残っている限り、貪欲にデータを読み込む仕様であれば、
スレッドAをcount==0になるまで飢えさせて、データを渡す量を調整する手もある。
(countの確認→データの書き込み→write_index→countの更新順)
また、スレッドBが重い処理で、調整が難しいなら、
安全にデータを渡すためのスレッドCを作ってブリッジすればOK。
まぁ、いかにも継ぎはぎになってしまうけどね
79 :グループ2011/03/12(土) 06:46:24.85
皆さんは何歳の時からC言語をやっていましたか?
80 :デフォルトの名無しさん2011/03/12(土) 09:03:59.09
>>79
17 歳からです。結構としですね。
81 :謙虚フロンティア戦士2011/03/12(土) 11:32:12.13
>>75
複数スレッドから同じ変数を更新するなら、
全スレッドでアトミックなメモリ操作にしない限り
どんな小細工しても整合性を保つことは不可能。
82 : [―{}@{}@{}-] デフォルトの名無しさん2011/03/12(土) 11:55:44.27
すいません。全ての定数定義は#defineを使ったものよりconstを使ったものの方が良いんですか

#define XXX 10
static const int YYY = 20;

int main (void){
  #define XXX 1000
  printf("%d\n", XXX);
//  #undef XXX

  {
    static const int YYY = 2000;
    printf("%d\n", YYY);
  }

  printf("%d\n", XXX);
  printf("%d\n", YYY);

  return 0;
}
83 :デフォルトの名無しさん2011/03/12(土) 12:16:35.07
マクロとconstは別物
何が良いのか分からんが"定数定義"ってならconst
84 : ◆QZaw55cn4c 2011/03/12(土) 12:37:21.11
>>82
コンパイラの最適化の能力にもよるが、const int a = 123; とすると、実際に a を格納する領域を確保する場合がある。
定数にメモリを確保することが可能性としてあっていいのならば、int const a = 123; としていい。
定数のためにメモリを確保することを絶対に避けたいのであれば #define でマクロ置換とすればいい。

整数の定数宣言であれば enum を使う流儀も最近みかける。
85 :デフォルトの名無しさん2011/03/12(土) 12:58:29.19
>>84
これこれ、真っ赤な嘘を書かんようにな
86 :デフォルトの名無しさん2011/03/12(土) 12:59:19.13
真っ赤な誓いいいいいいいいいいいいいいいいいいいいいいいい
87 :デフォルトの名無しさん2011/03/12(土) 13:10:30.17
>>82
コンパイラの最適化の能力にもよるが、const int a = 123; とすると、実際に a を格納する領域を確保する場合がある。
定数にメモリを確保することが可能性としてあっていいのならば、int const a = 123; としていい。
定数のためにメモリを確保することを絶対に避けたいのであれば #define でマクロ置換とすればいい。

整数の定数宣言であれば enum を使う流儀も最近みかける。
88 :デフォルトの名無しさん2011/03/12(土) 13:17:34.78
>>87
#defineかconstかどっちがいいか聞いてるだけじゃね?
90 :デフォルトの名無しさん2011/03/12(土) 13:38:48.37
>>82
その「良い」ってのが、どういう様をいうのかによる

おまえさんが聞きたいのは2個目の XXX と YYY がどうなるかってことじゃないか?

その実験でわかったろうが #define には # で始まらない構文にくらべて
独特の扱いにくさがあるよな

誰とは言わんが即値になるか数値リテラルになるかの保証はそんなに甘くないぜ
91 :デフォルトの名無しさん2011/03/12(土) 13:44:40.84
>>90
>誰とは言わんが即値になるか数値リテラルになるかの保証はそんなに甘くないぜ
kwsk
#define でも即値にならない場合があるの?
92 :デフォルトの名無しさん2011/03/12(土) 13:46:53.38
>>91
あんた誰?
93 : [―{}@{}@{}-] デフォルトの名無しさん2011/03/12(土) 14:14:07.64
なるほどそれでは組み込み系などのリソースが貧弱な環境では#defineでやった方がよくてその他の潤沢な環境ならconstで定数定義した方がいいんすね
あと定義の場所ですがヘッダーとかに書くんじゃなくて使いたい場所の直前とかで定義するのが良いんですかね

void func(void)
{
  int unko_val;
  unko_val = get_unko();

  {
    static const int UNKO_MAX = 100;
    if(UNKO_MAX < unko_val){
      delete_mylife();
    } 
  }
96 :デフォルトの名無しさん2011/03/12(土) 14:43:35.75
>>92
QZaw55cn4c
97 :グループ2011/03/12(土) 14:52:02.00
>>80
17ですか〜
僕も頑張ろうかな
98 :デフォルトの名無しさん2011/03/12(土) 14:59:44.68
>>96
NGしてるから隠さないでちゃんと付けとけよ
99 : [―{}@{}@{}-] デフォルトの名無しさん2011/03/12(土) 17:58:02.46
つうかstaticなしだとスタックに領域確保する処理が無駄に走るからstaticつけるべきなんじゃないんすか
100 : ◆QZaw55cn4c 2011/03/12(土) 18:25:14.57
>>99
>スタックに領域確保する処理
というのは sp レジスタを定数分減らすことです。
これって一つでも他に auto 変数があれば不可避の動作ですから、static つけようとつけまいとほとんど差はありません。
101 :デフォルトの名無しさん2011/03/12(土) 21:10:32.31
>>99
COBOL あたりはそういう思想だね
102 :デフォルトの名無しさん2011/03/13(日) 02:14:08.76
>>81
readとwriteのスレッドに分かれてれば、両スレッドから同じ変数を更新する必要はない
ただし、>>37はスレッドAがcountを触ってしまってるため、その手が使えないって話が>>77
103 :デフォルトの名無しさん2011/03/13(日) 02:21:02.04
>>82
定数を定義して使うのであればconst
定数を定義しないで使うのであればマクロ
スタックだとか即値だとかは環境依存なので、
xxxの環境で即値にするためには、どうすれば良い?
って質問であれば答えられるかもしれんが、
C言語の規格だけで、答えられるものではない。
104 :デフォルトの名無しさん2011/03/13(日) 04:48:28.98
pngファイルをバイナリで読み込ませて
そのバイナリになったファイルをtxtで保存すると
すごく大きい容量になるのですが
これの解消法とかないですかね
105 :デフォルトの名無しさん2011/03/13(日) 05:49:41.33
>スタックに領域確保する処理が無駄に走るから
ド素人に考え方です。
106 : [―{}@{}@{}-] デフォルトの名無しさん2011/03/13(日) 10:05:57.27
じゃあstaticつけない場合のメリットを言ってください
107 : ◆QZaw55cn4c 2011/03/13(日) 10:59:10.40
>>106
static なしであれば、環境が許せば即値で定数が表現できる。
static をつけると、つねにそのためのメモリが確保される。
サイズ的にどうということがないという環境であれば、どちらでも問題はないが、
C プログラムについては、制限の多い環境で使われることも念頭において、人は評価する傾向にあるようです。
108 : [―{}@{}@{}-] デフォルトの名無しさん2011/03/13(日) 11:22:43.62
即値ってのがよく分かりませんが
const int XXX = 10;
と書くとスタックを消費せずにXXXの文字列が10に置き換わる動作をする
コンパイラもあるってことなんですか?
私の知識ではローカル変数はスタックにプッシュされるものだと思っていたんですが
そうではない環境もあるということですか?
それならスタック消費なしで型情報も持たせられるのでconstが最強ですね
109 :デフォルトの名無しさん2011/03/13(日) 11:28:27.32
#define XXX (int)10
110 : [―{}@{}@{}-] デフォルトの名無しさん2011/03/13(日) 11:32:45.54
ちょw>>109が最強じゃないすかw
112 :デフォルトの名無しさん2011/03/13(日) 11:52:10.43
System.Media.SoundPlayer startSoundPlayer = new System.Media.SoundPlayer(@"C:\Windows\Media\chord.wav");
というコードがあるんですが
この場合startSoundPlayerというメモリコンテナに該当サウンドを代入している
という認識でよろしいんですよね?
113 : ◆.AyXCIYSIKDi 2011/03/13(日) 12:14:30.44
>>109

プリプロセッサ処理なのにint???
114 :デフォルトの名無しさん2011/03/13(日) 12:15:35.09
>>113
よーく考えよー
115 : ◆.AyXCIYSIKDi 2011/03/13(日) 12:19:28.26
まさか関数定義マクロか?
116 :デフォルトの名無しさん2011/03/13(日) 13:20:36.02
enumの美しい使い方を教えれ
119 :デフォルトの名無しさん2011/03/13(日) 14:06:22.11
>>116 美しいをある程度は定義してくれ
120 :デフォルトの名無しさん2011/03/13(日) 15:57:40.97
>私の知識ではローカル変数はスタックにプッシュされるものだと思っていたんですが
私の知識がすでに時代遅れです。
121 :デフォルトの名無しさん2011/03/13(日) 16:12:24.01
>>108
規格には何て書いてあるか調べたのか?
そして、それが全てだ。
123 :デフォルトの名無しさん2011/03/13(日) 16:18:15.91
規格とか気にする前に、コンパイルした汗とか見てみたら
知識あれば、できるなら、誰も苦労しないだろうに
124 :デフォルトの名無しさん2011/03/13(日) 16:22:15.05
ぶっちゃけ千回計算させてどっちが速いか調べたほうがいいんじゃね
126 :デフォルトの名無しさん2011/03/13(日) 16:49:26.80
>>120
時代遅れって、何時のどんなC言語処理系で「ローカル変数はスタックにプッシュ」が使われていたんだ?
127 :デフォルトの名無しさん2011/03/13(日) 17:03:40.66
>>126
ターゲットが Forth な C コンパイラ
128 :デフォルトの名無しさん2011/03/13(日) 17:09:44.15
これは痛いね
話の流れに static がでてきてるのに時代だってお(バンバン
129 :デフォルトの名無しさん2011/03/13(日) 17:11:33.62
>>127
なるほど、ネイティブコードじゃなくて仮想マシンターゲットですか。
なら、CILあたりも似たようなことをやっているので時代遅れでは無いのでは?
実際にはCじゃなくてC++/CLIになるけどね
130 :デフォルトの名無しさん2011/03/13(日) 18:22:45.34
過去を懐かしむ人が多いからね
131 :デフォルトの名無しさん2011/03/13(日) 20:29:50.01
>>130
ごめんなさい。わたしのことです。技術は月進日歩だというのに。
http://toki.2ch.net/test/read.cgi/i4004/1295492625/324
132 :デフォルトの名無しさん2011/03/14(月) 17:44:58.85
クイックソートのプログラムソースのバリエーションと難しさは異常

while(t)
{
略;
t++;
略;}


while(t)
{
if(略){略;t++;}
if(略){t++;略;}
t++;
}

などでは、tは初期化されずに、常に新しい値が保存されては、
変化しますよね?

goto文や再帰関数などでも変数の値は、常に新しく保存されて、
処理によって変化されますか?


tが初期化されたり、保存が切れるような場合を教えてください・・・
133 :デフォルトの名無しさん2011/03/14(月) 17:50:17.13
>>132
頼むから日本語かC言語かのどちらかで質問してくれ
134 :デフォルトの名無しさん2011/03/14(月) 18:43:00.01
>>133
失礼しました・・

常に状況に応じて変化させなければいけない変数が多いというのに
whileやdo,for,ifなどの(){}などの関数構造がかなり複雑で、設定
が難しいなという事です。

どの段階で変数を設定したらいいのかなど良く分からないんです。
135 : ◆QZaw55cn4c 2011/03/14(月) 18:45:41.95
>>132
http://hibari.2ch.net/test/read.cgi/tech/1289715349/269
に、標準ライブラリの qsort() に沿った実装を書いてみました。
ご参考になればいいのですが。
136 :デフォルトの名無しさん2011/03/14(月) 18:47:17.91
>>135
実装とは何でしょうか?

137 :デフォルトの名無しさん2011/03/14(月) 18:59:50.26
部分的に理解したいのかいな?
一部分のコード晒されても答えられる人はいないだろうに
138 :デフォルトの名無しさん2011/03/14(月) 19:27:45.07
多次元配列のイメージがちょっと分からないんですけども
(3次元までは家イメージで分かるんですが)

こんなイメージでいいのですか。配列の配列の配列の配列の配列の配列の配列の配列って感じですが。

EightDemensionArray[][][][][][]

□□□□(1次元)


■△△△△△(3次元)
■  〇
■  〇×××××××(5次元)
■  〇        ★
■  (4次元)     ★@@@@@@@@@(7次元)
■           ★         ☆
■           (6次元)      ☆
(2次元)                  ☆
                      (8次元)
141 :デフォルトの名無しさん2011/03/14(月) 21:01:25.86
そういう多次元配列ってカプセル化の概念で考えてる
d1の中にはd2が複数個入ってる
d2の中にはd3が複数個入ってる
袋の中に吹く論が入ってるだけ
142 :デフォルトの名無しさん2011/03/14(月) 21:56:43.41
配列の配列とポインタの配列の区別をつきそこねそうな図だな
143 :デフォルトの名無しさん2011/03/14(月) 22:21:50.36
>>138
そのまえに次元とは何かを理解する必要がありそうだな
144 :デフォルトの名無しさん2011/03/14(月) 22:23:02.35
大輔だろ
147 :デフォルトの名無しさん2011/03/15(火) 00:48:30.30
思うんだが、このスレの人は自分で考えたアルゴリズムとかそういう
技術?っていうのかネタっていうのか知らないけど、持ってるんですか?
148 :デフォルトの名無しさん2011/03/15(火) 00:53:58.61
>>147
誰かが考えたアルゴリズムに到達するだけ
「俺様オリジナル」とか言ってるのはすでに誰かが考えてる
149 :デフォルトの名無しさん2011/03/15(火) 01:37:36.91
>>147
その場で間に合わせのために
適当なアルゴリズムを捻り出すことは無いわけじゃないだろうが
ほとんどの問題は、ソートとか基本的なアルゴリズムの組み合わせで解決できる

自前のライブラリを持っている人は多いだろうと思う
150 :デフォルトの名無しさん2011/03/15(火) 10:53:43.34
捻り出すことをしないのが今の人。
何も考えないでコピペして、はまりますって感じ?
151 :デフォルトの名無しさん2011/03/15(火) 10:56:08.15
float A , B , C
if( A == (B||C) )
で今A = Bがちゃんと入ってるのですがこのifを通りません。どうしてでしょうか?
152 :デフォルトの名無しさん2011/03/15(火) 11:14:25.35
Aと(B||C)が等しくないから
153 :デフォルトの名無しさん2011/03/15(火) 11:18:55.74
>>152
A=(BまたはC) じゃないんですか?
今A=Bなので
A=B=(BまたはC)って成立してるんじゃないんですか?
154 :デフォルトの名無しさん2011/03/15(火) 11:21:11.42
>>153
(B||C) は 1 または 0
156 :デフォルトの名無しさん2011/03/15(火) 11:33:19.00
>>154
どういうとき(B||C)が1になるのでしょうか?
157 :デフォルトの名無しさん2011/03/15(火) 11:39:20.44
>>156
B が 0 以外 または C が 0 以外であるとき
159 :デフォルトの名無しさん2011/03/15(火) 13:27:10.53
次はきっと、「a == bのはずなのに等しいと判断してくれません。」かな。
その場合はfabs(a - b) < 1e-10で比較するといいよ、と。
160 :デフォルトの名無しさん2011/03/15(火) 15:04:29.46
下記Q&Aの回答に配列int a[10]に対して、

関数への変数の受け渡しについて
http://oshiete.goo.ne.jp/qa/6431580.html

>int a[10];

>また「a」と「&a[0]」は「値は同じ」ですが「意味が違う」ので注意しましょう。
>例えば「a+1」と「(&a[0])+1」は「異なる値」になります。

との言及があります。
Borland C++ 5.5.1 for Win32で、「a+1」と「(&a[0])+1」の値を確かめたところ同じ値でした。
他のOSやコンパイラーでは異なる値になるのでしょうか?
161 :デフォルトの名無しさん2011/03/15(火) 15:06:19.38
>>160
意図は違うかもしれないけど、意味は同じです
162 :デフォルトの名無しさん2011/03/15(火) 15:22:04.12
a + 1と書いてしまうと、最早そのaはint *になってしまっているのでa + 1は正しく& a[1]と同じ値になります。
それは勿論、& a[0] + 1とも同じです。
163 :デフォルトの名無しさん2011/03/15(火) 16:57:55.77
>>161-162
ありがとうございます。
同じ値になるのが正しいのですね。
164 :デフォルトの名無しさん2011/03/15(火) 17:32:46.90
クイックソートについてなんですが、qsortとライブラリがありますよね?
ライブラリ使うのか、普通に配列とかスタックとか使ってクイックソート仕様
でやるのがいいのかどっちなんですか?
165 :デフォルトの名無しさん2011/03/15(火) 17:41:34.85
>>164
要求を満たすほうを使う
コード記述量が少なくなるほうを使う
信頼できるほうを使う
166 :デフォルトの名無しさん2011/03/15(火) 17:49:45.32
プログラム書くときに、printfとかscanfとか、わざわざ
printf,scanfとか書くのが面倒臭いので、printfの場合は
p("helloworld")とかscanfの場合はs("%d",&t)みたいに省略
したいんですができますか?
167 :デフォルトの名無しさん2011/03/15(火) 17:51:24.95
できます
168 :デフォルトの名無しさん2011/03/15(火) 17:55:37.40
>>167
ヘッダファイルにそういうライブラリを作るんでしょうか?
良く分かりません。

記述の省略化という観点から、こういう事してるプログラマーって
多いのでしょうか?皆さんどうですか?
169 :デフォルトの名無しさん2011/03/15(火) 18:00:06.28
>>168
そんな可読性を極端に落とすプログラマーなんて少ないはず
統合開発環境でも使って入力補完したほうがいい
170 :デフォルトの名無しさん2011/03/15(火) 18:00:12.34
そんな事したら見づらくなるからしないだろ
書くのは楽かもしれんけどな
171 :デフォルトの名無しさん2011/03/15(火) 18:04:21.73
>>169
printf("%d", x);→pdx
scanf("%d",&x);→sdx

みたいに省略化したいなと思ってましたw
やっぱり見づらくなるんですね。入力補完機能使ったほうがいいですよね。
172 :デフォルトの名無しさん2011/03/15(火) 18:08:46.35
>>168
C99なら
#define p(...) printf(__VA_ARGS__)
それより前なら
int p(const char *fmt, ...) {
va_list list;
int result;
va_start(list, fmt);
result = vprintf(fmt, list);
va_end(list);
return result;
}
173 :デフォルトの名無しさん2011/03/15(火) 18:11:27.72
>>164
qsortをクイックソートで実装しなさいという決まりはないので、もしかしたらクイックソートで
実装していないコンパイラがあるかもしれません。

なので、汎用性の高いコード+クイックソートでないと嫌という場合は自分で実装することになる
かもしれません。
174 :デフォルトの名無しさん2011/03/15(火) 18:12:39.43
>>172
あほなもん勧めるなよ
どうしてもやるなら
#define p printf
でいいだろ
175 :デフォルトの名無しさん2011/03/15(火) 18:17:15.16
>>164
関数ポインタの実行速度が気になるなら、自前でやるほうがいいよ
176 :デフォルトの名無しさん2011/03/15(火) 18:34:14.44
>>173
パラメータを調整したクイックソート&マージソートって実装はあるらしい
178 :デフォルトの名無しさん2011/03/15(火) 19:14:09.64
while(num){

num--;
}
※{}内省略

この文の継続条件式はnumとしか書いてないのですが、num==1とnumって同様の意味なのでしょうか?
num>10とか書いてあるなら分りますが、numだけとしか書いてないとどういう意味なのでしょうか?
181 :デフォルトの名無しさん2011/03/15(火) 19:36:56.15
>>178
while は条件式を評価した結果が 0 以外の場合にループする
あとはわかるな?
183 :デフォルトの名無しさん2011/03/16(水) 00:43:15.14
50パーセントの確率で成功するけど、めちゃくちゃ処理が早いとかいう
アルゴリズム存在しますか?
184 :デフォルトの名無しさん2011/03/16(水) 00:50:25.33
>>183
意味がわからないけどスレ違いだと思う
186 :デフォルトの名無しさん2011/03/16(水) 01:03:27.66
>>183
バブルソート (の変形版)
ならソート済みデータに一つ追加しただけのときは早い
188 :デフォルトの名無しさん2011/03/16(水) 01:28:21.77
>>183
奇数かどうかを判定するアルゴリズム

return i % 2; // 1回の計算を必要とする
return 0; // 1回も計算をする必要がない!高速!しかし成功率は50%
190 : ◆QZaw55cn4c 2011/03/16(水) 01:32:06.20
191 :デフォルトの名無しさん2011/03/16(水) 02:30:30.86
>>183
Bloom Filterのような確率的アルゴリズムは
アルゴリズムが満たすべき条件を緩める代わりに
他の性能が改善されていることが多い
192 :デフォルトの名無しさん2011/03/16(水) 03:06:35.27
>>188
めちゃくちゃ処理が早いと言うほどではない
まぁ、boolean返す関数で期待値として50%なら
それを決め打ちでtrueかfalseを返せば、めちゃめちゃ処理が早くなるかもしれない
193 :デフォルトの名無しさん2011/03/16(水) 03:57:52.25
>>183
素数判定にそういうのがある
194 :デフォルトの名無しさん2011/03/16(水) 06:05:01.41
ものすごく初歩的な質問で申し訳ないんですが、visual studio 2010 ExpressでCのプログラミングはできるのでしょうか?
もし設定の変更が必要ならその手順も教えていただけたらありがたいです。お願いします。
195 :デフォルトの名無しさん2011/03/16(水) 06:07:05.63
コンパイル出来なかったの?
196 :デフォルトの名無しさん2011/03/16(水) 06:07:26.73
>>194
★初心者にVisual C++を教えるスレ★ Part37
http://hibari.2ch.net/test/read.cgi/tech/1299982561/l50
197 :デフォルトの名無しさん2011/03/16(水) 06:24:49.13
>>195 Visual C++を使ってWin32(?)で簡単なやつ組んでデバッグすると

1>------ ビルド開始: プロジェクト: hello2, 構成: Debug Win32 ------
1> hello2.cpp
1>d:\mison.d\visual studio 2010\projects\hello2\hello2\hello2.cpp(5): fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "StdAfx.h"' をソースに追加しましたか?
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

学校でやったときは,VSではなかったのですができてたんです・・・


>>196 ありがとうございます!参考にさせていただきます。
198 :デフォルトの名無しさん2011/03/16(水) 07:35:29.34
Ubuntuのgcc 4.4.3 で以下の文を書くと警告が発生しまた。
Cygwinのgcc 4.3.4では警告は出ません。
実行ファイルは問題なく生成されましたが、この書き方は推奨されていないのでしょうか?

char *str = "test str";
printf(str); //strをそのまま渡すとUbuntuのgccでは警告が発生する
//警告文
//format not a string literal and no format arguments

printf("%s", str); //問題なし
puts(str); //問題なし
199 :デフォルトの名無しさん2011/03/16(水) 07:54:02.54
>>198
strが指す先に、例えば"Hello! %d"なんて文字列がいると破綻するから警告されているのです。
printf()系のフォーマット文字列に(文字列リテラルでない)生のポインタを渡すのは充分注意が必要です。
200 :デフォルトの名無しさん2011/03/16(水) 08:15:44.60
>>199
詳しい説明ありがとうございました。
次からは注意して使ってみます。
201 :デフォルトの名無しさん2011/03/16(水) 08:54:45.50
Hello Worldの次のステップは何がいいですか?
202 :デフォルトの名無しさん2011/03/16(水) 09:13:22.01
>>201
入門書の通りに進めればいい
203 :デフォルトの名無しさん2011/03/16(水) 09:57:19.05
>>194
たいていのコンパイラは拡張子を .c にするだけ
204 :デフォルトの名無しさん2011/03/16(水) 11:15:35.95
入門書を終えた後はどうすればいいんですか? 入門書:明解C
目標はギャルゲーを作ることです
205 :デフォルトの名無しさん2011/03/16(水) 12:34:35.94
なるほど!ダ・ワールドッ!!!

の表示を出した後に、処理を休止するソフトのほうがいい

ただしforループによる停止は不可とする。それは処理休止しているのではないからだ。
「forループが動いている事で操作を受け付けない」だけだから休止とは言わない。

206 :デフォルトの名無しさん2011/03/16(水) 12:35:19.61
>>204
絵の練習
シナリオの練習
207 :デフォルトの名無しさん2011/03/16(水) 14:09:51.29
最近、C言語を始めました。
C言語でスレッドを4つ作って、各スレッドからRS232CのCOMポートにアクセスすることは普通にできるのでしょうか?
すみません、お願いします。
209 :デフォルトの名無しさん2011/03/16(水) 14:35:43.35
>>207
Cではやったことはないが、できないということはないだろうな
ただ、1つのポートへ同時に複数スレッドの接続はできないだろうが
しかし、お前のレベルでマルチスレッドプログラミングはやめておけ
マルチスレッドはタイミング的な問題も発生しやすいからバグが見つけにくい
オブジェクトのきちんとした管理や場合によっては排他処理が必要になる
210 :2072011/03/16(水) 15:25:18.32
ありがとうございます。
スレッド1はCOM1、スレッド2はCOM2、スレッド3はCOM3というように、一つのCOMに複数スレッドでアクセスはしません。
各スレッドごとに、CreateFile、SetComm?、Write?、Read?という一連のよくあるサンプルのようにかいたらできるのかなと思いまして。
211 :デフォルトの名無しさん2011/03/16(水) 15:29:54.21
CやC++をつかってておもうんだけど、ヘッダファイルがどうにかならんものかね。
まあ新しい言語作れって話になっちゃうんだろうけどさ。
213 :デフォルトの名無しさん2011/03/16(水) 16:25:47.43
Cゲンギ学んでるくせに、

「WindowsAPIやLinuxAPIを使わずに」

「規定秒だけ処理を休止して復帰させるプログラミ」 作れないやつが多い。

嘆かわしい事である。

やれました!とか言うから見てみるとforだし

だからそれはfor動いている間、他の処理できてねえだろっていう。
あくまでマルチタスクOSのおかげで、他の処理ができているだけであって
「停止しているように見えてる間もCPUを使っている」のは間違いないのだ。

そういうのがダメ。
休止中はCPUを一切使わずに休止。
シングルタスクOSでも、休止中は他の事ができる。
そういうもの作れちゅうてんのに
214 :デフォルトの名無しさん2011/03/16(水) 16:29:38.82

CPUは動かないが

時間もしくはそれに相当するカウントを行う


最低でもそれができなきゃCを学ぶ意味はねえ----------------------------------------ッ



ここまでいうとピ-------------------------ンと来るやつもいようが

まさにそれである
それをするためのCだ
VBやJAVAではやれないだろ

215 :デフォルトの名無しさん2011/03/16(水) 16:29:42.52
>>213
C言語のみの範囲では無理だよ
216 :デフォルトの名無しさん2011/03/16(水) 16:35:52.75
ここで「?」ってなってるやつは
アプリ系だな

たわけども
217 :デフォルトの名無しさん2011/03/16(水) 16:38:33.30
>>213
ノンプリエンプティブなマルチタスクシステムをつくれとな?
まあCなら関数ポインタしってれば簡単につくれるとおもわれるが・・・。

これでよいのかい?

じぶんでおっきするのか、たにんにおっきさせてもらうかでちょいと違いがでるんだけど。
219 :デフォルトの名無しさん2011/03/16(水) 16:39:14.21
CPUじゃなくてAPICにカウントさせりゃいいだけやな
220 :デフォルトの名無しさん2011/03/16(水) 16:41:08.86
>>219
その割り込みベクタに割り当てられたコードを実行しているわけだから、
CPUが停止しているという縛りははたせていないような・・・。
221 :デフォルトの名無しさん2011/03/16(水) 16:41:13.64
APICがカウントする
アンダーフローしたら割り込みを発する
割り込み受け取ったCPUがおっきさせる

実に簡単なことだが、それをWindowsでやろうとするとカーネル側のドライバが要る。
222 :デフォルトの名無しさん2011/03/16(水) 16:43:08.32
>>220
どこまでも厳密に解釈すると、無理になるがのう
223 :デフォルトの名無しさん2011/03/16(水) 16:44:53.24
ゲンギとかプログラミとかが気になって「?」ってなってしまう
224 :デフォルトの名無しさん2011/03/16(水) 16:50:48.99
>>213
何を騒ぎたいのだ?

>休止中はCPUを一切使わずに休止。
>シングルタスクOSでも、休止中は他の事ができる。
休止っていうのはCPU使わないこと?
じゃ、他の事っていうのは誰がするの?
226 :デフォルトの名無しさん2011/03/16(水) 16:54:24.68
A起動
Aご就寝
B起動
A御起床 (とともにB死亡)
A処理再開

こんなであろうさ
227 :デフォルトの名無しさん2011/03/16(水) 16:56:47.97
forでループしてると、A様がご就寝してるようで起きてる状態だからBが起動できない。
228 :デフォルトの名無しさん2011/03/16(水) 17:07:33.74
何だ、くだらねえ話だったか
x86ならHLTしてinterrupt待ちってことね
なら純粋なCでは無理、HLT命令が発行できないから
229 :デフォルトの名無しさん2011/03/16(水) 17:15:14.21
>>228
アセンブラ直接世べべヴぇヴ
230 :デフォルトの名無しさん2011/03/16(水) 17:18:35.25
でもたまにゃやってみるのもいいやね

普段みんなCPUとメモリのことばかり気にするから、周辺チップ使おうって気にはならないよな。
あってもUSBかシリアルポートくらいなもの。

こういうとき、PowerPCだと超ラク。
231 :デフォルトの名無しさん2011/03/16(水) 17:20:40.22
ごめん揺れた

インラインアセンブラ使えば寝ることは出来るけど
起きるタイミングは設定できないからsleepの実装は無理だよね
あとOSが管理している以上、次のコンテキストに処理をゆずる
というのは絶対にAPI叩かないと実現不可能だよね
あってる?
232 :デフォルトの名無しさん2011/03/16(水) 17:22:24.67
>>229
何だ、>>213はアセンブラを学べと主張したかったのか
さすがにそこまでは行間を読めんかったw
234 :デフォルトの名無しさん2011/03/16(水) 17:31:54.61
>>231
x86だとring0にいなければHLT実行はできない
要はそのOS用のドライバーを書く必要がある
なのでAPI(Application Program Interface)は不要w
235 :デフォルトの名無しさん2011/03/16(水) 17:45:12.25
そもそもAPIってよ
ハッキリ言えば要らないものなんだぞ。
ラップしてあるだけ。

OSが提供する機能 -> それを隠蔽したいために別名にする
それがAPI。

例えば、printf()がCで提供されているが
これをラップして print_to()とか、そんな名前の関数を作る

それがAPIだ。直にprintf()やれば、APIなんか経由しなくてもいいのだが
どうもモダンなOSは互換の問題を気にしているのか、隠したいらしい。
236 :デフォルトの名無しさん2011/03/16(水) 17:51:36.18
>>235
そんな説明で大丈夫か?
240 :デフォルトの名無しさん2011/03/16(水) 17:58:53.11

ひでーのになるとネイティブ -> API -> 社で決めたローカルAPI -> プロジェクトで決めた超ローカルAPI -> プログラマ

なんてのもあるからな。
ここまで来ると、おまえどんだけオーバーヘッド好きやねん、って言わざるを得ない。
241 :デフォルトの名無しさん2011/03/16(水) 18:03:39.82
>>213
へー、おまえ作れるの?

上限と下限が両方ある時間的な保証はけっこう難問だぞ
CPU 使用権を明け渡すのではなく本当に CPU を休止状態にするウエイトもできるんだな?
242 :デフォルトの名無しさん2011/03/16(水) 18:06:27.23
ここまでトンチンカンな奴がいるなら、いくらラップしても足りないな
いないほうがマシ
243 :2072011/03/16(水) 18:09:53.77
すみません、初心者のプログラムでなく、スレ間違いかもしれませんでした。
244 :デフォルトの名無しさん2011/03/16(水) 18:51:59.69
>>243
まったく問題なく出来るから心配すんな
247 :デフォルトの名無しさん2011/03/17(木) 08:55:47.17
static void ttt(int x)

という感じで、関数の前にstaticをつける理由はなんですか?
どういう利点がありますか?
248 :デフォルトの名無しさん2011/03/17(木) 09:58:03.38
関数のスコープをコンパイル単位内に限定させます。
つまり、仮にソースファイル内でexit()なんて戯けた名前をつけていても
他のファイルの邪魔にはなりません。
また、gccなどではインライン展開を行なうためのヒントとしても使われます。
∵他所から呼ばれないことが判っている関数なら実体がなくても困らない。
249 :デフォルトの名無しさん2011/03/17(木) 10:02:51.36
>>248
申し訳ないが
意味分からんwww

exit()って名前は、exit1;みたいなのがあるから、混合しやすいってこと?



やっぱプログラミングの基礎は自分で理解するに限る。
251 :デフォルトの名無しさん2011/03/17(木) 10:13:58.68
他のファイルの邪魔にならないため>

2つのファイルで同じ名前の関数、ttt()が使われる時、それぞれのファイルで

static ttt()とすればいいんですね?
254 :デフォルトの名無しさん2011/03/17(木) 14:48:49.50
はじめまして
友人が書いたc言語のプログラムを手直しして
javaに変換している仕事を頼まれたのですが
コードが3,5kステップほどもあり非常に苦戦しています。
c言語で書かれたコードを解析しやすくするようなツールはありませんか?
255 :デフォルトの名無しさん2011/03/17(木) 15:26:37.51
>>254
プリンタ

ローテク侮りがたし
257 :デフォルトの名無しさん2011/03/17(木) 16:19:51.36
staticな関数はグローバルな関数とは違うってことじゃダメかいな?
258 :デフォルトの名無しさん2011/03/17(木) 17:11:32.81
印刷ですか…w
とりあえずなるべく早い段階で完成を目指してがんばりますw
259 :デフォルトの名無しさん2011/03/17(木) 17:37:59.51
情報系の学科の1回なんですが、アルゴリズムのチャート図や考え方を学んだ
だけでそのアルゴリズムをプログラムを組んで実現できるのは普通でしょうか?
本に乗ってるソートのプログラミングのサンプル例はどれも直線的な考えじゃ思い浮かばない
ような設定や、要領の良さがあります。

優秀な人で何も見ずに組んでる人はいますが、やはり本に載ってる例に比べたら
劣っています。そういうものでしょうか?

262 :デフォルトの名無しさん2011/03/17(木) 17:52:10.99
>>258
Doxygen。Graphvizもあれば関数ツリーもできるし、結構解析には有効よ。
詳しくは該当スレで。
264 :デフォルトの名無しさん2011/03/17(木) 18:01:35.63
へー手作業なんだー
そういうのってコンバーターがあるのかと思ってた
265 :デフォルトの名無しさん2011/03/17(木) 18:18:37.36
>>254
質問ページ
266 :デフォルトの名無しさん2011/03/17(木) 18:55:20.34
単純なアルゴリズムの組み合わせでプログラムは組めると、軽く言うけど
それが出来たら皆プログラマーになれるわけで。

C言語何て自由度高すぎて、初心者やプログラム例を初見じゃ理解すら、
出来ないと思うよ。


C言語の入門書は一週間で読めても、ソースを解読するのはかなり手こずる。
267 :デフォルトの名無しさん2011/03/17(木) 18:56:12.49
○ 初心者がプログラム例を初見しただけでは理解すら出来ないと思うよ。
268 :デフォルトの名無しさん2011/03/17(木) 18:57:19.11
1つのファイルの100行くらいのプログラムだと1時間で理解できたら
かなり優秀な方。
269 :デフォルトの名無しさん2011/03/17(木) 19:02:53.78
階層構造が複雑だと40行くらいのプログラムでも1時間じゃ厳しくないか?
271 :2582011/03/17(木) 19:44:48.02
>>262
ありがとうございます。試してみます
皆さん親切な方が多くて助かりました。
>>255-256>>265
本当にありがとうございました!
272 :デフォルトの名無しさん2011/03/17(木) 19:46:59.14
道具があれば、解決するって発想が...
273 :デフォルトの名無しさん2011/03/17(木) 19:50:56.93
>>272
道具があれば頼る。道具が無ければ買う。道具が売ってなければ作る。
これが健全で正しいやり方じゃないか。
274 :デフォルトの名無しさん2011/03/17(木) 19:59:23.30
それがわかってる人はいいんだけど、なんとなく甘く考えてるような感じが...
275 :デフォルトの名無しさん2011/03/17(木) 20:35:12.18
1000行以上のプログラムは書いた人しか分からないですか?
276 :謙虚フロンティア戦士2011/03/17(木) 20:52:37.39
>>275
普通に書いてあれば余裕で理解できる。

理解できないほどひどいのは書いた人も理解できない。
278 :デフォルトの名無しさん2011/03/17(木) 21:05:00.86
プログラマー以外でプログラミングで食っていける方法ってありますか?
プログラミング好きなんですが頭の回転遅いんでプログラマーは無理かと。
回答者の職業教えてください。
279 :デフォルトの名無しさん2011/03/17(木) 21:18:41.90
SEやってますがなにか。
281 :デフォルトの名無しさん2011/03/17(木) 21:22:29.45
>>279
年収いくら?
282 :デフォルトの名無しさん2011/03/17(木) 21:37:10.99
>>278
40万円の教材を作るから買ってくれるかい?
5万円分くらいの仕事を発注することは保証するから

っていう商売にひっかかるなよ
283 :2792011/03/17(木) 21:53:06.44
>>281
のんびりやってるから一千万はいかないよ。
284 :デフォルトの名無しさん2011/03/17(木) 22:00:16.58
>>266
自分がコンパイラになった気分でソースを個々に読み
自分がリンカーになった気分で全体を取り込んで、
最後に自分がCPUになった気分で実行状態を思い浮かべる。

これで10万行くらいのソースなら楽に解読出来る。




所詮人間の作ったモノだ。
285 :デフォルトの名無しさん2011/03/17(木) 22:17:01.11
>>283
高度なプログラム書いてるの?
287 :デフォルトの名無しさん2011/03/17(木) 22:24:50.86
>>284
へーすごいなー何時間ぐらいで出来るのー?
288 :デフォルトの名無しさん2011/03/17(木) 22:52:50.44
>>287
ざっと流れをつかむだけなら100時間もかからんのじゃね?
289 :デフォルトの名無しさん2011/03/17(木) 23:02:02.98
>>288
100時間とかなんだよそれ、それでも流れつかむだけだろ
全然楽じゃねーだろw一体何日かかるんだよ
291 :デフォルトの名無しさん2011/03/17(木) 23:15:31.46
何をしたくて解読してるかによって時間なんて全然違うだろうに
292 :デフォルトの名無しさん2011/03/18(金) 01:41:00.99
今スタックオーバーフローを利用した脆弱性攻撃のコード書いてるんだけど今ってどういう対策取られてんだろ?
戻りアドレスをニセのアドレスに書き換えるのがうまくいかん
293 :デフォルトの名無しさん2011/03/18(金) 01:43:27.06
>>292
うるせー馬鹿
294 :2792011/03/18(金) 10:14:35.00
>>285
真に高度なプログラムと誰でも書けるようなプログラムの中間辺りかな。ニッチよニッチw
295 :デフォルトの名無しさん2011/03/18(金) 12:23:02.03
>>291
その見極めをするのに2週間はかかるよね という話
296 :デフォルトの名無しさん2011/03/18(金) 13:51:18.29
>>293
わかんねーならだまっておけ!
297 :デフォルトの名無しさん2011/03/18(金) 14:37:26.17
スタックオーバーフローとスタックオーバーランを混同している悪寒
298 :デフォルトの名無しさん2011/03/18(金) 16:55:48.98
C言語の勉強を始めたいのですが、オススメのフリーソフトを
教えてもらえないでしょうか?
マイクロソフトのVisualなんとかは複雑すぎて、私には難しそうです。
入門以下ですいません…
300 :デフォルトの名無しさん2011/03/18(金) 17:31:33.05
■質問
「ローカル変数の型を引数から操作できないのか」という質問です。

これを
http://codepad.org/85ClCanP

こんな感じに
http://codepad.org/FPxdR45r

宣言も引数で操作できるのでしたら、
是非とも知識として知っておきたいと思います。
宜しくお願いします。
301 :デフォルトの名無しさん2011/03/18(金) 17:39:30.18
>>300
マクロを使うか
C++でテンプレートを使うか
302 :謙虚フロンティア戦士2011/03/18(金) 17:44:25.78
>>300
何がしたいかよくわからんけど共用体使えないの?
303 :デフォルトの名無しさん2011/03/18(金) 17:45:06.44
引数の型が違う同名の関数を作れたような……?
305 :デフォルトの名無しさん2011/03/18(金) 17:53:23.91
>>301
http://homepage2.nifty.com/well/Template.html
「C++テンプレート」で検索をかけると、
こちらのサイトがヒットし、
自分のやりたい事と同じ内容でした。

ありがとうございました。
308 :デフォルトの名無しさん2011/03/18(金) 18:58:15.54
http://homepage2.nifty.com/c_lang/cpp/cpp_38.htm

上記URLのプログラムをコピペしてそのままコンパイルしてみると
住所を書き込むたびに、データが上書きされてしまって
結局最後に入力したデータしか表示されません。
ソースコードを読んでると、ちゃんとデータが追加されるようになってるのに
上書きされるのは何でなんでしょうか


309 :デフォルトの名無しさん2011/03/18(金) 19:07:33.13
>>298
これが1番簡単じゃね?
http://www.vector.co.jp/soft/winnt/prog/se483520.html
311 :デフォルトの名無しさん2011/03/18(金) 21:07:41.63
appで開くとシークが不可能になって、先頭にデータの個数を
出力できないと思うのですが・・・
313 :デフォルトの名無しさん2011/03/18(金) 23:35:59.80
app は書き込みポインタを移動しても必ず最後に書き込まれるフラグですよね
でもそれじゃ困ります
ファイルをオープンした後、ファイルの一番最初にシークして
データの個数を書き込んでから、また最後にシークして新たなデータを追加しなければいけないので
具体的に説明すると、例えば一回目のデータを書き込むと


『追加データ1』

2回目は

2
『追加データ1』
『追加データ2』

って感じです
ただ単にデータを追加するのではなく、一番最初にデータの個数を書き込みます
データを表示させるときに、このデータの個数を読み込んで、個数分while文で表示するためです
だから僕はあえてateにしてるんだと解釈してるんですが、違うんでしょうか?


314 :デフォルトの名無しさん2011/03/18(金) 23:37:22.67
C言語スレで続けるなよw
315 :デフォルトの名無しさん2011/03/19(土) 00:31:35.56
>>313
確かにこのプログラムの作者はC++のオープンモードについてよく理解してないようです。
データが存在しない場合にデータ個数を0と書いてしまった方がすっきりします。
但し、というか元のプログラムもですが、no_of_dataを1桁と決め打ちしてしまっているので、
データが10個以上になると動作がおかしくなると思います。(nameを浸食します)

動くようにしたプロクラムを下に示します。

http://codepad.org/M26FrFlI

なお、>>314さんもおっしゃっておられますがこれはC++の話なので、スレを以下に移しましょう

スレ立てるまでもない質問はここで 110匹目
http://hibari.2ch.net/test/read.cgi/tech/1295800051/
317 :デフォルトの名無しさん2011/03/19(土) 01:08:16.69
C++で書かれたソースをCで書き直したいのですが、
ダブルコロンの置き換えがよく分かりません。

何の機能がCでは何に当たるのか、を調べる方法ありませんか。
319 :デフォルトの名無しさん2011/03/19(土) 01:40:18.03
>>317
当たるものはないよ
しいて言うなら命名規則で
アンダーバーやキャメル、プリフィックス、サフィックスなどで
工夫するぐらいしかない
CSTLなどありものの作法に倣うのが楽じゃないかな
322 :デフォルトの名無しさん2011/03/19(土) 10:14:30.74
>>309
298です。
2ちゃんねる使うの初めてだから、これでいいのだろうか。
レスありがとうございます。
ダウンロードしてみます
324 :デフォルトの名無しさん2011/03/19(土) 16:35:09.48
内部リンケージのグローバル変数を関数越しに値が変更できるのって変に思うんだけど普通?
327 :3132011/03/19(土) 17:16:03.23
313です
ちゃんと>>1を読んでいませんでした
本当に申し訳ないです
>>315さんの紹介してくださったスレで再度質問したいと思います
僕の質問に回答してくださった方、ありがとうございました
とても参考になりました
329 :デフォルトの名無しさん2011/03/20(日) 11:41:34.76
ポインタってどんなときでも
*があれば「そのアドレスにある値の操作」で
なければ「アドレスそのものに対する操作」を
意味するという理解でいいのですか。
330 :デフォルトの名無しさん2011/03/20(日) 13:31:13.40
>329
だいぶ用語が粗っぽくて、何も理解できていないのではないかと思う。

単に「ポインタ」といっても、型、変数、値があることを意識しなくてはならない。
しかし、普通は文脈で判る場合が多く、単に「ポインタ」と言われる。

前の文章を書き直すと

「ポインタの値」に対して「前置単項演算子*」を適用して評価すると、
評価結果はポインタが指すオブジェクトである。
331 :デフォルトの名無しさん2011/03/20(日) 13:36:32.96
相手に理解させる気のない知識の垂れ流しってただのオナニーだよね
332 :デフォルトの名無しさん2011/03/20(日) 14:18:11.86
>>329
「どんなときでも」ではないが、当初それでいい
あとで出てくる char **argv; などは * があってもアドレスだったりするし
void *ptr; は * で値にすることができない

誰とは言わんが
> 「ポインタの値」に対して「前置単項演算子*」を適用して評価すると、

前置でない単項はないから安心しろ
こいつ冗長な形容で小難しく書き直しているだけで
話がほとんどピーマンだよ
333 :Perl忍者lvl2(善) ◆M5ZWRnXOj6 2011/03/20(日) 14:27:42.06
ついにPerlのモジュールまとめ日本語でたぜ

遊べるぜ ネット系のモジュールとか


この本おすすめ
Perl CPANモジュールガイド 440ページ
http://www.amazon.co.jp/gp/product/486267108X/ref=as_li_ss_tl?ie=UTF8&tag=ele-22&linkCode=as2&camp=247&creative=7399&creativeASIN=486267108X

これよめば俺と互角にはりあえる   かもしれないぜ
336 :デフォルトの名無しさん2011/03/20(日) 15:45:13.95
消防レベルの自分にC言語がすごい分かりやすい
サイトなどを教えてください。
関数とかわけわかりませんw
337 :デフォルトの名無しさん2011/03/20(日) 15:48:39.36
関数ってのは計算をしてくれる機械
y=f(x) のfだね
338 :デフォルトの名無しさん2011/03/20(日) 15:56:20.93
339 :デフォルトの名無しさん2011/03/20(日) 16:10:00.12
>>337
>>338
ありがとうございます。m(__)m
341 :デフォルトの名無しさん2011/03/20(日) 22:17:45.98
ポインタでつまづいてる初学者なんですけど、
勉強しながらある程度少しは実用的なプログラム習得できる書籍かサイトご存じでしょうか?

AmazonのC言語関連書籍一通り見ましたが、しっくりくるのがなかったので。
仕事はプログラミング全く関係ないです。
342 :デフォルトの名無しさん2011/03/20(日) 22:42:16.28
ポインタの用法
第一ステップ:引数をポインタにして、関数で参照渡しに相当することが
出来るようになろう。
第二ステップ:malloc/freeで変数を動的に生成しよう。NULLの使い方も
学ぼう
第三ステップ:配列とポインタの意図的混同に関連する慣習を
学ぼう
第四ステップ:構造体のメンバにポインタを用いることにより
リストや木などの高度なデータ型を取り扱えるようになろう。
344 :3302011/03/21(月) 00:14:55.51
>331>332

たしかにいきなり小難しい説明をしてしまった。あとで読み返して、
まずったとおもった。申し訳ない。

しかし、正しい用語を使うことは正しい理解につながると思って、
あのような表現になっている。もう少し噛み砕くべきだった。

>329>332
>ポインタってどんなときでも*があれば
>前置でない単項はないから安心しろ
たしかに単行*は前置しか無いから冗長な表現だった。
しかし*は、(前置)単項演算子、二項演算子、ポインタ宣言子
として登場するので、意識してもらうために明示した。

>char **argv; などは * があってもアドレスだったりするし
char **argv;の場合、
argvはchar *を指すポインタ
それに間接演算子*を適用すると、評価結果は指している
オブジェクトとなるので、その型がchar *になるだけで、
全く話は同じ。

>void *ptr; は * で値にすることができない
void *のことは失念していた。指しているオブジェクトサイズが
不定である場合は演算子*,[]を適用できない。
345 : ◆QZaw55cn4c 2011/03/21(月) 00:15:22.37
×皆に嫌われ者になろう。
○皆に嫌われる者になろう。
346 :デフォルトの名無しさん2011/03/21(月) 00:26:34.17
>>345
馬鹿かお前?
347 : ◆QZaw55cn4c 2011/03/21(月) 00:27:56.28
>>346
joke もわからんとは。
349 :デフォルトの名無しさん2011/03/21(月) 03:34:31.18


メモリ管理って誰がやんの?
OS?
ほしたら何でCでmallocしたメモリはフラングメントすんの?
ガベージコレクションが必要な理由は?

言語?
言語は単にOSに頼んでメモリ割り当てしてもらっただけで
それもなんか違う気もする


350 :デフォルトの名無しさん2011/03/21(月) 04:07:05.89
ていうか誰がメモリの本当のサイズを知ってるんだろうか
確保と開放を繰り返すとフラグメントする、ということは
確保されたぶんがそっくりそのまま開放されるというわけではないわけだ
いくらか少ない量、ってことだろ

このサイズは誰が知ってんの
プログラマがmallocでサイズを数値で見れても信用ならないって事だろ
351 : ◆QZaw55cn4c 2011/03/21(月) 07:17:23.12
>>349
>メモリ管理って誰がやんの?
主に OS
ただし、malloc() に関してはリンクされたライブラリもかかわっている。

>ほしたら何でCでmallocしたメモリはフラングメントすんの?
malloc() したメモリは普通 OS には返さない。
そう仮定した場合、「malloc() したメモリがフラグメントを起こす」のなら、その原因は malloc() のアルゴリズム。

>言語は単にOSに頼んでメモリ割り当てしてもらっただけで
メモリは OS からもらうが、再利用は malloc() が管理する。
353 :デフォルトの名無しさん2011/03/21(月) 07:34:41.81
わりにこっちには、な〜〜〜んも教えてくれんよな
肝心なことなのに

どうすんのさ
354 :デフォルトの名無しさん2011/03/21(月) 07:36:54.78
自分でやれってちゅうのもいいが、WindowsやLinuxだとサンダースがやらしてくれんだろ
355 :デフォルトの名無しさん2011/03/21(月) 07:43:28.44
やっぱし何ちゅうの?
メモリは1ビットたりとも無駄にしたくないわけやん。
しないほうがよい。

「できないからやらない、知る必要がない」ではポロろgグラマー失格なわけやん。
こういうとき組み込みなら、iTronだなんだのメモリ管理には世話になっても
自分でできる下地があるわけで、軽減は出来る。
ならWindowsやその他でもそうすべきだ。
356 :デフォルトの名無しさん2011/03/21(月) 10:26:43.26
>>355
Windows はもともと、そういう思想だったんだよ
357 :デフォルトの名無しさん2011/03/21(月) 11:01:40.05
>>347
自分の頭が悪い点にズバリ切り込まれるとjokeって事にするのですね。
どこまで馬鹿なんだお前は
358 :デフォルトの名無しさん2011/03/21(月) 11:51:34.49
お前らみずほ銀行のくそシステム組やがってどうにかしやがれ!
359 :デフォルトの名無しさん2011/03/21(月) 12:20:43.86
再帰関数について質問です。
void merge(int first int last int *A)
{
if(){
center=(first+last)/2?
void merge(first center *A)?・・・前半起点マージ
?
void merge(center+1 last *A )?・・・後半起点マージ
}}
mainで呼び出した関数で中に二つの自分と同じ関数がある再帰構造を持ってます。
で良く分からないのですが
?のcenterは、?、?のcenterの値と一致するのでしょうか?(※まぁlastもなんですが置いときます。)
再帰関数だから?→□1→□2→・□n→・・→□2→□1→?と戻ってきて次に?の作業
をするので、?のcenterの値は□1の部分の作業で設定されたcenterの値じゃないんでしょうか?
そうなると帰納的にcenter=一定値になると思うのですが、何か違いますか?再帰関数がややこしくて仕方ありません・・・
360 :デフォルトの名無しさん2011/03/21(月) 12:21:20.74
>>358
少なくとも、俺は関わってない。
また、銀行系のシステムで、この手のトラブルの原因となるコードが
Cで実装されてることは、滅多にないと思われ。
361 :デフォルトの名無しさん2011/03/21(月) 12:25:20.51
>>359

良く分からんがC言語でOK
362 :デフォルトの名無しさん2011/03/21(月) 12:44:46.45
>>361
はいC言語です、お願いします。
マージソートのプログラムで、centerは真ん中の配列の添え字ですかね。
再帰関数によって分けて分けて、で作業の末端までいったら
今度はくっつけてくっつけて戻ってくるというプログラムです。たぶん・・
363 :デフォルトの名無しさん2011/03/21(月) 12:45:48.83
>>359
よくわからんが
>?のcenterは、?、?のcenterの値と一致するのでしょうか?(※まぁlastもなんですが置いときます。)
一致する
>?のcenterの値は□1の部分の作業で設定されたcenterの値じゃないんでしょうか?
merge が呼ばれるたびに新しく center が作られる
364 :デフォルトの名無しさん2011/03/21(月) 12:48:34.45
printf("%d %d %d\n", first, last, center);を追加してどういう順番で呼び出されてるか見ればいいだろ
365 :デフォルトの名無しさん2011/03/21(月) 13:08:49.26
>>359
間にprintfを挟んでみては?
366 :デフォルトの名無しさん2011/03/21(月) 13:10:32.08
368 :デフォルトの名無しさん2011/03/21(月) 13:55:29.16
>>359
void merge( int first, int last, int *A ) {
  if() {
    int center; // static int center; // ではない
    center = ( first + last ) / 2; // ?
    void merge( first, center, A ); // ?・・・前半起点マージ
    // ?
    void merge( center + 1, last, A ); // ?・・・後半起点マージ
  }
}
だと仮定して
>?のcenterは、?、?のcenterの値と一致するのでしょうか?(※まぁlastもなんですが置いときます。)
一致します
>再帰関数だから?→□1→□2→・□n→・・→□2→□1→?と戻ってきて次に?の作業
>をするので、?のcenterの値は□1の部分の作業で設定されたcenterの値じゃないんでしょうか?
centerの型がstaticの場合、再起先と呼出元のcenterの値の格納先が同じ場所となり、
あなたの予想通り、値を上書きしてしまいますが、
今回の場合、staticは使用しないと考えられるので、再起先のcenterの値の格納先と
呼出元のcenterの値の格納先は異なる場所となるため、?・?は?と一致します。
370 :デフォルトの名無しさん2011/03/21(月) 21:10:09.40
while (!feof(f1)) {
 ch = fgetc(f1);
 if (!feof(f1))
  fputc(ch, temp);
}

教本を読んでいてファイルの入出力の章でこのようなコードが出てきたのですが、
これだと例えば今f1はファイルの最後の文字の位置にあるとすると、
ch = fgetc(f1);でf1が示す位置が1つ先にずれEOFとなり、その後if(!feof(f1))でfputc(ch, temp);をするか判定しているので
最後の1文字がtempに出力されないで終わってしまう気がするのですがどうなんでしょうか。
実際コンパイルしてみると最後の文字までちゃんと出力されていたのですが……

全ソースはこちらに上げておきました tp://ideone.com/pVv1S
宜しくお願いします。
371 :デフォルトの名無しさん2011/03/21(月) 21:14:06.71
>>370
何が疑問なの?
372 :デフォルトの名無しさん2011/03/21(月) 21:33:24.36
>371
何故f1の全ての内容がtempに書きこまれるのかがわかりません。
>370にも書いたのですが、if(!feof(f1))があるとその前にfgetc(f1)でf1が示す位置が既に1つ先に進んでいるので、
if文の中のfputc(ch, temp)が実行される回数が1回足りないで処理が終了してしまう気がします。

自分がこの部分を書こうと思って以下のようなコードを書いたのですが(色々違うものが挟まってますが)、
これだとtempにf1の内容のあとFF 00 00 00....(tempのバイト数が4KBになるまで)まで出力してしまいました。
なぜfputc(ch, temp)を実行する前にif(!eof(f1))を判定しなければならないのか教えて頂ければと思います。

while (!feof(f1)) {
 ch = fgetc(f1);
 if(ferror(f1)) {
  puts("FILE1の読み込みエラー");
  exit(2);
 }
 fputc(ch, temp);
  if(ferror(temp)) {
   puts("tempファイルの書き込みエラー");
   exit(2);
  }
}
374 :デフォルトの名無しさん2011/03/21(月) 21:36:08.88
1> screensource00103.cpp
1>d:\ワークステーション\ゲーム開発プロジェクト\rxz project laboratory\programs\rxz_ver0.01\screensource00103.cpp(40): error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。


該当の場所




(40)void bg_ctrl(){
(41) DrawGraph( 0 , 0 , Stage_BG , FALSE ) ;
(42)} /* リファレンス注釈7参照 */
(43)


375 :デフォルトの名無しさん2011/03/21(月) 21:37:54.44
すいません。
誤爆です。すいません。

よく見てませんでしたすいません><;
376 :デフォルトの名無しさん2011/03/21(月) 21:47:04.64
feofは最後の一文字を読み込んだときじゃなくて、EOFを読み込んだときに1を返すから
377 :デフォルトの名無しさん2011/03/21(月) 21:47:23.67
>373
あー…これは読み込んでいるファイルの末端にEOFがないってことです…かね?
しかしEOFがないのにどうやってfeof()で判断してるんでしょうか、わけがわからなく…
378 :デフォルトの名無しさん2011/03/21(月) 21:55:58.48
>376
EOFはどんなファイルの最後にもあるという勘違いをしてたようです、ありがとうございます

改めて考え直したのですが、そうするとif文は
if (!feof(f1))ではなくif(!ferror(f1))ではないのでしょうか
こうすればファイルの末端を超えたときその前のch = fgetc(f1);でエラーがでているはずで、処理を止めることができるという感じに

これはまた違うのでしょうか、申し訳ないのですがが宜しくお願いします。
380 :デフォルトの名無しさん2011/03/21(月) 21:57:22.66
feofはファイルを最後まで読み込んだかを判定する、つまりEOFを読み込んだかどうかを判定する関数
fgetc()でchにEOFが入った後じゃないとfeofは1を返さない
381 :デフォルトの名無しさん2011/03/21(月) 22:11:14.18
>380
例えばテキストファイルで今末端の位置にいるとき、

<1回目>
while (!feof(f1)) { /* ファイルの末端での判定、当然実行される */
 ch = fgetc(f1); /* chにファイルの末端の文字を代入*/
 if (!feof(f1)) /* このときf1はファイルの末端の次にあるが、その読み出しはされていないのでfeof()は0を返す */
  fputc(ch, temp); /* fputc()は行われる */
}

<2回目>
while (!feof(f1)) { /* ファイルの末端の次での判定、しかし上記と同様にしてfeof()は0を返し実行される */
 ch = fgetc(f1); /* chにf1を代入しようとするが、末端を超えているので失敗し、EOF指示子がセットされる */
 if (!feof(f1)) /* ここでfeof()はEOF指示子があるので1を返し、fputc()はスキップされる */
  fputc(ch, temp);
}

<3回目>
上記と同様にして、while文は実行されず次の処理にうつる


こういうことでよろしいでしょうか……
382 :デフォルトの名無しさん2011/03/21(月) 22:19:09.25
>>370
while (1) {
 if (feof(f1))
  break;
 ch = fgetc(f1); 
 fputc(ch, temp);
}
383 :デフォルトの名無しさん2011/03/21(月) 22:35:57.51
>382
前の処理がファイルの末端の文字だったとして、いまf1、tempがファイルの末端の次の位置になっているとしますと、

<1回目>
while (1) {
 if (feof(f1)) /* EOF指定子がないのでfeof()は0を返し、実行されない */
  break;
 ch = fgetc(f1);
/* f1はファイルの末端の次なのでch = fgetc(f1)が実行されchにEOF(-1)が代入され(調べ直したら失敗するわけではないですね)、
EOF指定子がセットされる */
 fputc(ch, temp); /* fputc(ch, temp)は実行され、tempにEOFが書きこまれる */
}

<2回目>
if(feof(f1))で条件が真となり、while文を抜ける


この場合だと結果的に>370でできるファイルの末尾にEOFが付加された形になるんでしょうか、解釈があっていればよいのですが
384 :デフォルトの名無しさん2011/03/21(月) 22:50:55.03
>>383
規格書読んで分からないなら
1つの標準関数ごとにデバッガ使ってトレースして
振る舞いを確かめるといいよ
IDEをつかえばコマンド覚えることなく誰にでも簡単に扱えるから。
385 :デフォルトの名無しさん2011/03/21(月) 23:06:34.70
>384
なるほど、了解です
一度落ち着いて整理し直し、色々試してみることにします
386 : ◆QZaw55cn4c 2011/03/21(月) 23:36:17.60
>>382
これはまずいです。>>383 のような誤解を招きます。

for (;;) {
ch = fgetc(f1)
if (feof(f1))
break;
fputsc(ch, tmp);
}
とすべきです。読む→テストする→書く、というです。
387 :デフォルトの名無しさん2011/03/21(月) 23:52:09.72
>>386
等価
って知ってる?
388 :デフォルトの名無しさん2011/03/22(火) 00:38:22.63
C言語を始めたばかりの超初心者ですが、質問です。
strtokの返すアドレスというのは実質、文章の終わりまで置き換えが終わったかどうか確認するためだけに使うようなものなのでしょうか?
390 :デフォルトの名無しさん2011/03/22(火) 00:46:26.70
そうなんですか
区切った記号までの文字列の先頭アドレスを返すと聞いたのですが、
例えばどのようなときに使うのでしょうか?
よかったらお願いします
391 : ◆QZaw55cn4c 2011/03/22(火) 07:03:02.51
>>387
等価じゃないと思いますよ。

>>382
ビットパターン 0xff をディスクリプタ tmp に書いてしまいますよ。
ビットパターン0xff は EOF を示すascii 制御コードですらなく、
オリジナルのディスクリプタ f の指すファイルの内容とは、変わってしまいますよ。
392 : ◆QZaw55cn4c 2011/03/22(火) 07:17:57.58
>>381,383
その解釈であっています。

>>370 のリンク先は、致命的に間違っています。
char ch; ではなく int ch; が正しい。

あと while(!eof())うんぬんは、教科書によくあらわれる書き方です。(たとえば、ハーバードシルト先生は信念があるのかいつもこう書きます。)
while() を無理に使うとこう書かざるを得ないのですが、私見では、残念ながら eof() が重複してしまい無駄ですね。
393 :デフォルトの名無しさん2011/03/22(火) 08:41:48.74
てか、これってC言語の話題?
C言語の標準ライブラリの仕様の話しだが、
今時C標準ライブラリが外部言語処理系に非公開な
プラットフォームってまずない。
だからこれは微妙にこれはOSの標準ストリームの
仕様の話になりそうな件
395 :デフォルトの名無しさん2011/03/22(火) 10:34:57.88
>>383
EOFはファイルに書いてある値じゃないよ
既にファイルの最後まで読んでいるのになお更に読もうとした時にfgetc()が返してくる値
ファイルに書いてある値以外の値でEOFを表現しなければならないので、fgetc()の型はunsigned charじゃなくてint
ch = fgetc(f1);の次に即fputc(ch, temp);するのはまずい
396 :デフォルトの名無しさん2011/03/22(火) 11:21:56.20
>>395
アスキーコードのEOFにも対応しといてください。お願いします。
398 :デフォルトの名無しさん2011/03/22(火) 11:41:50.05
C言語において時間計算量について質問です。
マージソートの計算量は何故nlognなんですか?
例えば要素数16とします。

全て一つだけの配列に分けて、それを二つ配列にする比較回数が8回
二配列を四配列にする比較回数が3×4=12回
四配列を8配列 2×7=14回
最後8配列同士を比較して  15回
で合計49回ですよね?
n=16のとき
nlogn=1.2×16=19・・計算量19?

49とかけ離れてますよね?
399 :デフォルトの名無しさん2011/03/22(火) 12:02:53.78
>>391
それは370も同じでしょ
400 : ◆QZaw55cn4c 2011/03/22(火) 12:21:56.92
>>399
いいえ違います。

>>370 は読んだあと書き込む前にテストが入ります。だから正しい。
>>382 は読んだあとテストする前に書き込んでしまいます。これはバグっている。
したがって、>>370 と >>382 は等価ではありません。 >>382 はバグ入りのきわめてまずいコードです。
401 :デフォルトの名無しさん2011/03/22(火) 13:34:55.45
>>398
色々間違っている気がするけど、一番の間違いはlog(10)≒2.3を1.2で計算していることだな。
402 :デフォルトの名無しさん2011/03/22(火) 13:35:46.12
あー、数字がおかしいので書き直し。
>>398
色々間違っている気がするけど、一番の間違いはlog(16)≒2.8を1.2で計算していることだな。
403 :デフォルトの名無しさん2011/03/22(火) 14:17:19.10
>>398
最適化のため、比較の最後のを一回省略しているが、それは省略しない
>全て一つだけの配列に分けて、それを二つ配列にする比較回数が8回
一配列を二配列にする比較回数が16回
>二配列を四配列にする比較回数が3×4=12回
二配列を四配列にする比較回数が4×4=16回
>四配列を8配列 2×7=14回
四配列を八配列にする比較回数が2×8=16回
>最後8配列同士を比較して  15回
八配列を十六配列にする比較回数が16回
合計64回

>n=16のとき
>nlogn=1.2×16=19・・計算量19?
マージソートの実装は2分割で行うのでlog2で計算
16*log2(16) = 16 * 4 = 64回

ピッタリですね
404 :デフォルトの名無しさん2011/03/22(火) 14:20:12.27
捕捉するが、比較の回数と言うより、
置き換えた(実際に置き換えなくても置き換えたと考える)回数なので、
比較を省略できても、置き換えは省略できないため>>403の計算量になる
405 :デフォルトの名無しさん2011/03/22(火) 14:24:54.75
>>366のマージソートって、図は判りやすくていいんだが、サンプルコードが微妙だな
407 :デフォルトの名無しさん2011/03/22(火) 14:37:35.57
もう一回だけ書くが計算量Oは比較の回数ではなく置き換える回数

ソートの実装が2分割になってるから、
16 * log2(16) = 16 * 4 = 64
ソートの実装が4分割(もちろん比較回数は増える)であれば
16 * log4(16) = 16 * 2 = 32
ソートの実装が16分割であれば
16 * log16(16) = 16 * 1 = 16
408 :デフォルトの名無しさん2011/03/22(火) 17:21:05.21


「あることを行うためにかかる時間」はどうやって計測すればいいですか。

あることを行うためのプランが3つあるとして、その中でどれが一番ボンバーヘッドが少ないか知りたいのですが
どれも1秒未満で終わるので、時間の差を取得することでは精度のいい計測ができません。
410 :デフォルトの名無しさん2011/03/22(火) 17:36:28.69
>>408
もしかして オーバーヘッド

…は、ともかくとして
精度のいい計測がしたければ
きっちり同じ条件でテストする必要があるぞ

同じことを繰り返すと2回目以後はキャッシュが効いたりするし
ネットつないだままとかデフラグの時刻をまたいだりとか論外
411 :デフォルトの名無しさん2011/03/22(火) 18:15:37.59
つーか、大抵の環境でmsec単位のクロックが使えるだろ。
それがないなら、100万回でも1億回でも好きなだけ回せば充分精度は得られる。
後は、もし入力データが必要な場合にどういうデータにするかを検討しておくことだね。
412 :デフォルトの名無しさん2011/03/22(火) 21:51:40.62
質問です。

#include <stdio.h>

int main()
{
int x = 0;
while (x < 10) {
printf("%d\n", x);
x++;
}

int i;
for (i = 0; i < 10; i++) {
printf("%d\n", i);
}
return 0;
}
このプログラムで ';' が '型' の前にありません。 または'i' : 定義されていない識別子です。というエラーが表示されます。
int i;の位置を上に持っていったらエラーが消えるのですがC言語は変数を宣言する場所が決まっているのでしょうか?
Visual C++ 2010を使っています。よろしくお願いします。
413 :デフォルトの名無しさん2011/03/22(火) 21:56:57.34
>>412
決まってます
414 :デフォルトの名無しさん2011/03/22(火) 22:04:06.64
>>413
そうでしたか・・・
今まで一年間やってたのに知らなかったです。ありがとうございました。
415 :デフォルトの名無しさん2011/03/22(火) 22:06:30.99
>>414
C99では何処でも良いが、それ以前ではブロックの先頭
416 :デフォルトの名無しさん2011/03/22(火) 22:19:05.97
>>415
調べていたらそのようなことが書いていました。
今まで変数宣言の位置を気にせずプログラミング出来ていたため昔のバージョン?の設定になってしまったのかなと思っています。
C99に戻す方法がありましたら是非教えてください。
419 :デフォルトの名無しさん2011/03/23(水) 00:10:18.13
VCはC++ベースで書けるからね、いきなりエラーになったら、戸惑うかも...
420 :デフォルトの名無しさん2011/03/23(水) 00:19:02.87
>>416
うろ覚えだけど、プロジェクトの設定で Microsoft 言語拡張機能 だったかな
422 :デフォルトの名無しさん2011/03/23(水) 05:27:56.91
>>403
>>407
非常に良く分かりました。全て置き換えた場合を考えるってことは
最悪計算量を想定してるのですか?

後時間量(time)は計算量にだいたい比例するのでしょうか?

例えば計算量、3log3である二つのプログラムを実行した時
処理時間は一緒でしょうか?
423 :デフォルトの名無しさん2011/03/23(水) 05:33:13.79
User CPU、 System CPU、 Idle CPUの各値を取得する方法を教えてください
424 :デフォルトの名無しさん2011/03/23(水) 07:43:13.83
>>422
>非常に良く分かりました。全て置き換えた場合を考えるってことは
>最悪計算量を想定してるのですか?
マージソートのアルゴリズムとしては、
置き換えても置き換えなくても回数は同じ。
トランプとかを使って実際にマージソートと
クイックソートを比較してみれば意味が分かるはず。

>後時間量(time)は計算量にだいたい比例するのでしょうか?
実装では、比較などの演算時間は0でないし、
何らかの最適化が入るので、計算量とは一致しない。
もし、比較の演算時間が0で、最適化が全く入らなければ、ほぼ一致する。
※ある程度の目安にはなる

>例えば計算量、3log3である二つのプログラムを実行した時
>処理時間は一緒でしょうか?
最適化次第
425 :デフォルトの名無しさん2011/03/23(水) 07:46:25.29
>>423
細かい環境を書いて値の定義をするか、他のスレに行って下さい
426 :デフォルトの名無しさん2011/03/23(水) 16:53:55.27
ゲーム(ノベル)を作ってみたいのですが、初心者にお勧めの教科書を教えてください
427 :デフォルトの名無しさん2011/03/23(水) 17:22:46.07
>>426
まずprintfだけで絵無しのADVを作るところから始めるといいよ。
そこが出来ればあとはDirectXなりGDIで絵をだすだけだよ。

音楽は割りと簡単にWindowsAPとかでならせる。

ひとまず絵や音は後回しにして作ることが次の一歩につながるよ。
428 :デフォルトの名無しさん2011/03/23(水) 18:35:53.80
計算量を求める時って、何を単位にしたらいいんですか?
nlognとかO(1)とかよくわかりません。

431 :デフォルトの名無しさん2011/03/23(水) 19:47:53.99
>>428
>計算量を求める時って、何を単位にしたらいいんですか?
好きな単位にすれば?

>nlognとかO(1)とかよくわかりません。
Cの話題じゃない
数学板にでも行ってこい
432 :デフォルトの名無しさん2011/03/23(水) 20:08:15.01
>>431
いや違う違う、違います。

どんな単位で数えるじゃなくて、何を単位にするかです。

時間、作業量なのか、領域なのか。

作業量は、収納と判定がありますよね。
433 :デフォルトの名無しさん2011/03/23(水) 21:04:35.96
鍵ファイルにパスワードのハッシュ値の認証機能を付けて鍵に直接
アクセスできないようにしたいのですがうまくいきません。32バイト
のハッシュ値を先読みして、それから後続の16バイトの鍵を使おうと
思うのですが、ハッシュ値の認証で失敗したり、鍵生成が無限ループ
になったりします。何が原因か分かりません。どなたか教えてください。
よろしくお願いします。

http://codepad.org/nz55zSBj
434 :デフォルトの名無しさん2011/03/23(水) 21:11:36.98
>>432
>いや違う違う、違います。
何も違わない
>時間、作業量なのか、領域なのか。
だから時間でも作業量でもメモリでも好きな単位を使えば良い
何に対して何の為に計算量を求めるのかを知ってるのはお前さんだけ
お前さんが>>398ならソートの計算量の話だと考えるが別人だろ?
便乗なら、便乗と書け。
同一人物なら、何故上げる?
435 : ◆QZaw55cn4c 2011/03/23(水) 21:21:25.37
>>432
空間計算量と時間計算量とがあります。つhttp://ja.wikipedia.org/wiki/%E8%A8%88%E7%AE%97%E8%A4%87%E9%9B%91%E6%80%A7%E7%90%86%E8%AB%96

たとえば、時間計算量であれば、実質的に命令実行回数(ステップ数)が問題になります。
ここで細かいことをいうと、CPU が実行する命令数を調べることになるわけですが、環境によって CPU の命令構造も違います。
じゃ、なにで時間計算量を見当づけるか、については、お題とするアルゴリズムにより異なります。
ソーティングなら、「2つのデータの交換回数」を目安にしていろいろなソーティング手法を比較します。
FFT(離散フーリエ変換) なら、「掛け算」の回数になります。
436 :デフォルトの名無しさん2011/03/23(水) 21:30:06.57
>>433
>    while(a==0){
>      printf("lx=%u trace 0\n",x);
>      for(i=0;i<16;i++){
>        s[i]=c1.m[i];
>        s[i+16]=c2.m[i];
>      }
>      genkey(s,t);
>      lk(t);
>      fclose(fp);
>    }
何をしたいか、良く分からんが、
取りあえず、無限ループするのは仕様に見えるが?
438 :デフォルトの名無しさん2011/03/23(水) 22:12:47.27
genkey(s,t)は外部関数で、lk(t)は再帰呼び出しします。lk()から
genkey()は呼び出されます。再帰呼び出しのときに値を買えて計算
し直しているので全ての値に対してaが0でない関数がいつか見つか
るはずなのですがものすごく時間がかかります。また同じ値をハッシュ
関数に渡しているのに再帰呼び出しノアとに値が変わっているのは
なぜでしょうか?よろしくお願いします。
440 :デフォルトの名無しさん2011/03/23(水) 22:27:24.30
>>435
処理時間を見積もる場合は、
アルゴリズムを考える上では収束と発散(≒ステップ数)、
仕様(実装)の段階では時間だな
もちろん、アルゴリズムを考える上でCPUの命令構造なんて考えないし
仕様(実装)の段階で、実機を無視したステップ数を計算しても意味がない。
ソートについても、計算量=命令実行回数(ステップ数)で
計算量を出してるのは見たことがない
普通は計算量=発散(n、n log n、n^2など)であらわす。
441 :デフォルトの名無しさん2011/03/23(水) 22:35:27.52
>>438
再起先でaが0以外になろうが、呼出元のaは0だから終わる訳がない。
442 :デフォルトの名無しさん2011/03/23(水) 22:41:13.22
>>420
レスが遅くなりました
ありがとうございました。
443 :デフォルトの名無しさん2011/03/23(水) 22:43:33.90
>>424
ありがとうございます。
置き換えるというより64個の要素を64個の場所にしきつめる作業ということで
理解しました。

比較などの演算時間、ポインタや配列を使う事によって領域量や時間量は変わって
きますよね。
444 :デフォルトの名無しさん2011/03/23(水) 22:46:41.25
>>443
所要時間が n秒 だろうと 1000n秒 だろうと計算のオーダーは O(n) と表記することになってる
445 :デフォルトの名無しさん2011/03/23(水) 22:54:54.12
再帰先っていうのは、一度ループから抜けますよね。
その時aは再計算されて0かどうか比較されるのではないですか?
446 :デフォルトの名無しさん2011/03/23(水) 23:05:52.15
>>445
>再帰先っていうのは、一度ループから抜けますよね。
何を言いたいのか分からんが、呼出元の>>436でループではaは0のまま
再起先で変更したものを、呼出元で変更したければ、aの値を返して
aの値を変更するか、aをstaticにすれば良い。






って言うか、このコードで再起する意味が分からん。
447 :デフォルトの名無しさん2011/03/23(水) 23:05:56.07
>>445
そのあと帰ってきたときに0のままでしょ
448 :デフォルトの名無しさん2011/03/23(水) 23:32:50.39
>>443
>置き換えるというより64個の要素を64個の場所にしきつめる作業ということで
>理解しました。
大体そんな認識でOK
>比較などの演算時間、ポインタや配列を使う事によって領域量や時間量は変わって
>きますよね。
これも、大体そんな認識でOK
基本的にnがある程度の範囲に収まっていればnlognで計算した値に近いものになるが、
実際に処理に必要な時間を計算しようとすると、
キャッシュにのる量か否か、メモリにのるか量か否かなど、実機に大きく左右される。
と言う訳で、アルゴリズムで考える場合はnlognなと、
あるステップを、どの程度の回数繰り返すのか?ってことだけを表す。
449 :デフォルトの名無しさん2011/03/24(木) 00:05:40.07
>>448
とてもわかりやすいです、ありがとうございました^^

条件判定の作業量も、置き換える作業量とあんまり変わらないですよね。
加味しないんですね。
2nlognとnlognだと作業効率違いませんか。
450 :デフォルトの名無しさん2011/03/24(木) 00:11:48.08
ループを別関数にしてif(a==0)で分岐させ、再帰呼び出しを避けたら
なくなりましたが答えが不安です。そんなに一発で見つかるものなの
だろうかと。
for(x=0;x<256;x++){
a=f(x);
if(a==0){lkb(); break;}
}
見たいな感じです。
451 :デフォルトの名無しさん2011/03/24(木) 00:24:41.88
>>450
>>433が開かないから確認できないが、多分、そのforのbreakはおかしい。
そこでやるなら、returnのはず。
そもそも、考え方がおかしいので、落ち着いて1から考え直せ。
452 :デフォルトの名無しさん2011/03/24(木) 02:38:51.06
>>449
>2nlognとnlognだと作業効率違いませんか。
計算量Oはアルゴリズムとしての評価をするための記法。
各アルゴリズムや実装方法によって、計算の基準となる
O(1)(一回当たり)の期待値(クロックや時間など)が大きく異なり、
係数を持つことは、あまり意味を持たないから、
「2nlogn」も「nlogn」も同じ「nlogn」と表記する。
で、実機の負荷の概算は、計算量OにO(1)の期待値を掛けて、
必要であれば+αなどして出す。
ちなみに「nlogn+n」のような場合、nの値が大きくなると「n」は
無視できるほど小さくなるので、これも「nlogn」と表記する。
453 :デフォルトの名無しさん2011/03/24(木) 02:50:15.55
捕捉として
>で、実機の負荷の概算は、計算量OにO(1)の期待値を掛けて、
の「O(1)」は、元が2nlognなら、「2・O(1)」に相当する
※正確には、その「2・O(1)」が、そのアルゴリズムの「O(1)」の期待値となる
454 :デフォルトの名無しさん2011/03/24(木) 03:03:50.12
O記法には数学的な定義があるが、
あまり深く考えなくても実用できる
「大まかな振る舞い」を示すようなものだと思っておけば十分
455 :デフォルトの名無しさん2011/03/24(木) 03:38:45.76
>>452
夜分遅く
ありがとうございます。
非常に分かりやすいです。

でも計算の基準によって、nlognやn^nみたいに、全く次元の違う
計算量になったりすることはないんですか?

1000<n<3000まではnlogn
3000<n<10000まではn^3
100000<n<1000000でn^3×logn
10000000<n<1000000000でまたnlogn
みたいな。

456 :デフォルトの名無しさん2011/03/24(木) 03:43:40.00
すいません計算の基準や、nの大きさです。

457 :デフォルトの名無しさん2011/03/24(木) 06:26:44.45
>>455
ならない。
それはアルゴリズムとしておかしいか、条件によって、アルゴリズムを条件で使い分けてる場合のみ。
ちなみに、O(1)は定数なので、>>456にnやlognが出てくるのはありえない。(nの値によってOの表記の方が変わる)
458 :デフォルトの名無しさん2011/03/24(木) 19:53:14.24
関数のクローンを作りたいのですが、可能ですか?
func1()とfunc2()を同じ処理にしたいという感じです。
二つだと、同じ処理をコピペすればよいが、多数あるときはどうすればよいでしょうか?
459 :デフォルトの名無しさん2011/03/24(木) 19:57:12.32
>>458
#define func3 func1
460 :デフォルトの名無しさん2011/03/24(木) 19:58:34.10
>>459
数が未定なので、動的に関数のクローンを生成したいのです
461 :デフォルトの名無しさん2011/03/24(木) 20:00:25.64
>>460
関数ポインタ
462 :デフォルトの名無しさん2011/03/24(木) 20:01:48.75
>>461
関数ポインタでは困るので、クローンしたいのです。
メモリ上に同じ処理を複数作りたいのです。
463 :デフォルトの名無しさん2011/03/24(木) 20:07:03.86
>>462
関数ポインタで困るってことは静的な値を使ってたりして、
呼び出し元毎にユニークにしたいのか?
だとすると、無理。(環境依存なら出来るかも知れんが)
まぁ、実装の方を工夫するべき。
465 :デフォルトの名無しさん2011/03/24(木) 20:08:55.01
>>463
C++風なクラスの関数を作りたいのです。
関数ポインタだと同じ先を指すので、上手くいかないと思いまして…
(C++で実装されているものと、同じような機能をCで提供したい
466 :デフォルトの名無しさん2011/03/24(木) 20:10:42.24
>>458
動的(実行中)に関数(命令列)を作る(書き換える)ということか
単にイメージを複製しても位置独立でない可能性を C の範疇では否定できないので
やるならアセンブラだね
467 :デフォルトの名無しさん2011/03/24(木) 20:12:27.94
>>465
>C++風なクラスの関数を作りたいのです。
テンプレートみたいなもの?
それとも、継承みたいなもの?
前者なら無理。
後者なら同じ先を指して問題ないはず。
※静的な値を使ってなければ
468 :デフォルトの名無しさん2011/03/24(木) 20:14:59.23
>>467
後者です。

入門者ですみません。
同じアドレスの関数を実行して、
複数のプロセスやスレッドに実行された場合、正常に動作可能でしょうか?
469 :デフォルトの名無しさん2011/03/24(木) 20:16:01.14
>>465
C++ の関数オブジェクトに相当するものなら構造体で作れる
特に変わったテクニックは必要なく素直に作れる
470 :デフォルトの名無しさん2011/03/24(木) 20:17:34.39
>>469
単一のプロセスやスレッドならば、関数ポインタで大丈夫なのは理解しておりますが、
複数から呼ばれた場合、問題ないですか?
471 :デフォルトの名無しさん2011/03/24(木) 20:17:38.51
>>468
再入可能でぐぐれ
472 :デフォルトの名無しさん2011/03/24(木) 20:18:13.43
>>468
マルチスレッドはCで環境依存の問題。
基本的には、各環境でスレッドセーフに作れば、
同じ関数で、問題ない(何度も書くが静的変数を含まなければ)
473 :デフォルトの名無しさん2011/03/24(木) 20:21:09.91
スレッドとか、プロセスなど環境に関係なしに安全を保証する手立てとして
関数のクローンが作れたら良いと思ったのですが、話を聞いていると無理っぽいですね
474 :デフォルトの名無しさん2011/03/24(木) 20:22:35.86
>>471
入門編と言う事でお聞きしたのですが、再入可能って難しい概念ですね。。
475 :デフォルトの名無しさん2011/03/24(木) 20:23:58.17
>>470
そんならコード自体が別である必要はなさそうだな
データがアクションごとに用意されていればいいんじゃないか?
476 :デフォルトの名無しさん2011/03/24(木) 20:24:36.53
>>473
無理です。
実装の方で工夫して下さい。
478 :デフォルトの名無しさん2011/03/24(木) 20:27:49.36
>>474
そんなに難しくない。
自分が書いたプログラム内で、静的変数を使用しない。
後は、そのプログラムから呼び出している関数が、スレッドセーフである。
この2点のみ満たせばOK。
479 :デフォルトの名無しさん2011/03/24(木) 20:28:48.98
>>473
技術的に可能と能力的に可能は別物
JITとかの動的コード生成ができているので技術的には可能
480 :デフォルトの名無しさん2011/03/24(木) 20:31:10.78
>>479
ありがとう。
JITというものは知りませんでした。

可能なら、手だてを考えます
481 :デフォルトの名無しさん2011/03/24(木) 20:36:07.25
>>479
アホ言うな。
お前さんが言ってるのは、入門者に対して
新しいC言語作れって言ってるのに等しい。
482 :デフォルトの名無しさん2011/03/24(木) 20:39:31.40
>>481
だから最初に「技術的に可能と能力的に可能は別物」と書いてある。よく読めカス
483 :デフォルトの名無しさん2011/03/24(木) 20:39:49.25
>>478
>後は、そのプログラムから呼び出している関数が、スレッドセーフである。
スレッドセーフじゃなくて再入可能な
484 :デフォルトの名無しさん2011/03/24(木) 20:42:10.24
>>474
誰もが通る試練(大げさだが)だよ
クリアできるかどうかは
おまえさん次第だ
485 :デフォルトの名無しさん2011/03/24(木) 20:42:41.34
>>481-482
C言語的には無理という事ですね。
違った実装を考えます。
486 :デフォルトの名無しさん2011/03/24(木) 20:44:50.11
>>485
違う。C言語でも 技・術・的 には可能。でも 素・人 には無理
487 :デフォルトの名無しさん2011/03/24(木) 20:45:23.74
>>482
入門者に対してJITコンパイラ作れって言ってるお前さんほどじゃないよ

>>483
そうだね
何で間違えたんだろう…
488 :デフォルトの名無しさん2011/03/24(木) 20:47:30.46
>>486
今の俺のスキルでは到底無理な事という事ですね。
489 :デフォルトの名無しさん2011/03/24(木) 20:49:23.54
>>485
単純にC言語では無理。
環境依存であれば、環境次第。
環境に依存しないのであれば、仮想マシンをC言語で作って
さらに、その仮想マシン上で動いて、>>473を満たすCコンパイラを作ればOK。
490 :デフォルトの名無しさん2011/03/24(木) 20:52:47.84
>>489
ありがとう。
標準ライブラリのみのCで作るには、それなりの手腕が必要である事は理解できました。
491 :デフォルトの名無しさん2011/03/24(木) 20:54:13.33
>>490
>標準ライブラリのみのCで作るには、それなりの手腕が必要である事は理解できました。
どんな腕があろうと、環境依存しなきゃ無理。
492 : [―{}@{}@{}-] デフォルトの名無しさん2011/03/24(木) 21:27:29.25
関数名や変数名がそのままコメント代わりになっているようなプログラムをわたしは美しいとおもう
493 :デフォルトの名無しさん2011/03/24(木) 21:41:20.33
意味を重視すると長くなりやすいし、短さ優先するとわけわかんなくなるしでバランスとるのが難しい
494 :デフォルトの名無しさん2011/03/24(木) 21:43:34.05
本当に関数のクローンを必要としているわけではなくて、別に目的があってその手段が関数の複製しかないと思い込んでいるパターンだろ
495 :デフォルトの名無しさん2011/03/24(木) 21:50:42.26
>>494
途中でリエントラントの話に脱線してるが、
基本的には環境に依存しないスレッドセーフを提供するための手段らしい
496 :デフォルトの名無しさん2011/03/24(木) 22:11:08.16
ビジーループ回して良けりゃ適当な排他アルゴリズム使えばいけるか
497 :謙虚フロンティア戦士2011/03/24(木) 22:17:38.59
初期のC++コンパイラは一旦C言語ソースに変換してたらしいし、
C言語の範疇で原始的なC++的なことはできるだろJK
498 :デフォルトの名無しさん2011/03/25(金) 00:27:09.92
最近優しいC第3版を読みだして現在Lesson4まで終わって次からLesson5に入る所です。
ユーザーの入力した文字を受け取る関数としてgetchar()が書いていたのですが、文字列を受け取る方法が書かれていませんでした。
もしかしたらこの先に書かれているのかもしれませんが、自分的にはLEsson5から条件分岐や繰り返し処理にはいるそうで、その前に知っておきたいので、文字列を受け取る関数を教えていただけないでしょうか

まだ試してないと言うか、違うと思っているので試すつもりもないのですが、文字列と文字は違うと言う事なので、getchar()で文字列を受け取っても多分バグ?りますよね?
500 :デフォルトの名無しさん2011/03/25(金) 05:43:05.90
>>498
C言語では文字の配列が文字列だから配列を理解して処理すれば大丈夫
501 :デフォルトの名無しさん2011/03/25(金) 05:55:58.10
>>497
何に対して回答してるんだ?
502 :デフォルトの名無しさん2011/03/25(金) 12:09:14.87
>>500
なるほど
配列を見てみましたがLesson6でようやくでてくる単元のようです。
Lesson6まで楽しみにとっておこうとおもいます
回答ありがとうございました
503 :デフォルトの名無しさん2011/03/25(金) 16:20:33.43
sizeof演算子
http://www.kis-lab.com/serikashiki/C/C03.html

ここ↑に、int型のサイズを知る方法として、

int ans;
ans = (int)&(((int*)0)[1]);

というのが紹介されてますが、以下の方法だとまずいでしょうか?

ans = (int)((int*)0 + 1);
504 :デフォルトの名無しさん2011/03/25(金) 16:43:54.78
>>503
そのサイト主よりおまえさんのほうがきれいなコード書けてるが
ただしポインタを int に変換した結果は処理系定義なので
sizeof(int) を回避してまでそう書くことの優位性はない
506 :デフォルトの名無しさん2011/03/25(金) 19:20:35.48
秘密鍵に32バイトの認証ハッシュ値をつけて、アクセス時にパスワードで
認証する機能をつけたいのですがうまくいきません。秘密鍵の計算方法が
正しいかどうかもわからないので公開します。lkbを呼び出すとループの
値が0にリセットされて無限ループになります。機能は動いたはずなのに
今朝動かしたら動かなくなっていました。下にソースのアドレスを書きます。
わかる人がいたらよろしくお願いします。

http://codepad.org/55oSSY2H

508 :デフォルトの名無しさん2011/03/25(金) 20:03:02.20
こんな感じです。
//ファイルkey.binに秘密鍵を書き込む。
void genkey(unsigned char str[256],unsigned char tt[256]){
FILE *fp;
int i;
fp=fopen("key.bin","wb");
hash(str);
fwrite(c1.dd,1,16,fp);
fwrite(c2.dd,1,16,fp);
fclose(fp);
}

//関数の値が0だったらもう一度秘密鍵の計算をやり直す
void lkb(unsigned char t[256],int x){
unsigned char str[16],m[32],s[256];
int i,a;
FILE *fp;

flag=0;
for(i=0;i<16;i++){
s[i]=c1.m[i];
s[i+16]=c2.m[i];
}
genkey(s,t);
lk(t);
if(mode==2)
kk(t);
}
509 :デフォルトの名無しさん2011/03/25(金) 20:23:07.61
>>503
>ans = (int)&(((int*)0)[1]);
これは、Cを規格通り覚えたいなら、やっちゃ駄目な典型
どんな環境でも正しくサイズを取得する場合はsizeofを使う
510 :デフォルトの名無しさん2011/03/25(金) 20:31:55.75
>>506
またお前か
取りあえず、作り直した方が早いよ
考え方としては、キーを再生成する可能性があるなら、その部分は暗号化の前に終わらせておく。
その為に、暗号化の部分に入ってる、キー再生成の条件を出すコード(aの演算)は別関数にする。
それだけで、見通しが良くなって、何が悪いのかも分かりやすくなる。
511 :デフォルトの名無しさん2011/03/25(金) 20:55:47.71
どう作り直せばいいのかわかりません;;
512 :デフォルトの名無しさん2011/03/25(金) 21:02:03.36
>>511
取りあえず、他のスレに書いた質問を全て終わらせてこい
※前回の質問やりっ放しも含む
513 :デフォルトの名無しさん2011/03/25(金) 21:09:09.40
前回の質問の続きで、while文をifに変えて、別関数にしたら動いた
と思ったんですけど、今朝見たら動かなかったんです。
515 :デフォルトの名無しさん2011/03/25(金) 21:21:55.66
>>509
おまえ &*(int *)0 を「やっちゃ駄目」だと思ってるだろw
516 :Perl忍者lvl2 ◇M5ZWRnXOj62011/03/25(金) 22:18:19.41
Perl使えよお前ら!
Perlはハッカー御用達だぜ!?
517 : ◆QZaw55cn4c 2011/03/25(金) 22:23:15.02
>>516
ハッカー(爆笑)
518 :デフォルトの名無しさん2011/03/25(金) 22:26:24.13
クラッカー食べたいです
519 :デフォルトの名無しさん2011/03/25(金) 22:27:02.42
>>518
ガリでも食ってろ
520 :デフォルトの名無しさん2011/03/25(金) 22:28:12.43
>>515
お前が>>503の何が駄目なのか分かってないことは分かった
523 :デフォルトの名無しさん2011/03/26(土) 22:26:24.66



ビッツシフツ(複数形かつ動態形) ってなして嫌われるとですか?


524 :デフォルトの名無しさん2011/03/26(土) 23:13:00.07
質問。使用コンパイラVC++2010(C++独自のクラスとかは一切使ってない。C++とかはそもそもしらん)
コンパイルしたらなんか下記のエラー出る…
誰か助け・・・て・・・

error LNK2005: "int * Player1" (?Player1@@3PAHA) は既に functioncode00102.obj で定義されています。

int Player1はヘッダーの中で定義している変数名です。
ファイルは“algrithm.cpp”、“mainsource.cpp”、“functioncode.cpp”、“func_header.h”で
cppファイルはそれぞれ#include func_header.hでヘッダーファイル取り込み。
変数とか構造体の定義は全部ヘッダーファイル内で行っています。cppファイルでは一切定義しておりません。デバッグの事を考えて変数は全て1ファイルに収めた方がいいと考えたからです。

で、これで多重インクルードってのがあるんでしょ?
だから#ifndef定義とか使って対策した。

その他…ヘッダーの中にstaticはないです。

そしたら↑のエラーメッセージ吐いてきたんだが、もう対策方法がわからん。
そのエラーコードはググったんだけどよくわかんねw
同じ事を質問してる人いたけどよく分からん単語ばっかり言ってて参考にもならねぇわ…(´・ω・)
526 : [―{}@{}@{}-] デフォルトの名無しさん2011/03/26(土) 23:27:25.74
#include
ってのは単に指定したファイルの中身を書いた場所にぶちまけるだけ
int Player1をヘッダーに書いて複数ファイルからinclude すると
インクルードしただけint Player1が作られるということ
527 :デフォルトの名無しさん2011/03/26(土) 23:31:06.25
>>524
まずは宣言と定義の違いを理解しませう
528 :デフォルトの名無しさん2011/03/26(土) 23:41:44.58
>>レスさん
出来た…でもさ…

やっぱりcppに宣言かかないと無理なのか…?
529 :デフォルトの名無しさん2011/03/26(土) 23:50:49.67
>>528
.hに宣言、.cppに定義だっちゅうに
どうしても変数定義だけを別けたいならそれ専用の.cppを作れば
530 : [―{}@{}@{}-] デフォルトの名無しさん2011/03/26(土) 23:51:43.11
player.cにint Player1を書いてplayer.hにPlayer1の操作関数を書いて
Player1を使いたいcppでplayer.hをincludeして関数経由でint Player1を操作
531 :デフォルトの名無しさん2011/03/26(土) 23:57:28.42
>>529-530
OK。分かった。
どうもありがとう
532 :デフォルトの名無しさん2011/03/28(月) 02:16:29.33
プロトタイプをヘッダに書くかソースに書くかで揉めることも

しば
しば。

どーでもええがなンなもん
533 :デフォルトの名無しさん2011/03/28(月) 02:21:43.19
>>532
static(extern)の有無でいいんじゃないの?
534 :デフォルトの名無しさん2011/03/28(月) 02:26:27.93
C言語のファイルに関してのプログラムについて質問!
ファイルの中の文字列の置き換え
test.txtというテキストファイルの"dog"という文字列をすべて"rabbit"に変換し、
rabbit.txtという名前で保存するプログラムである。
http://codepad.org/IRMS82LF
●のところが文字列を置き換える処理らしいんだけど、
これ何?アドレスの足し算、引き算してんの?
教えてください。エロい人さん。
536 :デフォルトの名無しさん2011/03/28(月) 02:58:15.02
>>534
面倒だからちゃんとコンパイルできる形で登録しろよ。
で、問題の3行はこれと同じ。
sprintf(bufw, "%.*s%s%s", p - bufr, bufr, str2, p + strlen(str1));
どうでもいいけどそのプログラムは最後の行が重複するバグがあるぞ。
537 :デフォルトの名無しさん2011/03/28(月) 03:04:05.17
{...,'d','o','g','\0'}なときもバグるんじゃないのかな
540 :デフォルトの名無しさん2011/03/28(月) 11:07:19.92
Cって覚える事が少ないって聞いたことありますが本当にそうなんですか?
Windows APIとかたくさんありすぎて丸暗記できないのですが
541 :デフォルトの名無しさん2011/03/28(月) 11:24:28.65
APIとかは言語自体ではないから、Cの言語だけの話ならそうかもな
542 :デフォルトの名無しさん2011/03/28(月) 11:54:19.89
そういうことだったんですね
Cはやっぱり勉強して損はないですか?
あと初心者からCを覚えきるまで何時間掛かりますか?
秀丸エディタで勉強しても大丈夫ですか?
やっぱりVC++をインストールしないとダメですか?
いちおうBCCいれてます
543 :デフォルトの名無しさん2011/03/28(月) 12:26:06.04
おまえは自分の行動すらいちいちママにきいてんのか?
どこの首相だよ
544 :デフォルトの名無しさん2011/03/28(月) 12:30:35.60
損得は自分で判断したまえ
50時間ほどあればいいんじゃね
何エディタでもいいよ
もうBCC動いてるんなら面倒だろうしそれで問題ない
545 :デフォルトの名無しさん2011/03/28(月) 13:08:25.57
入門サイトは苦しんで覚えるC言語はいいですか?
547 :デフォルトの名無しさん2011/03/28(月) 13:42:24.13
入門書買ってやった方がいいと思う
俺も初心者だから偉そうなこと言えないけど
548 :デフォルトの名無しさん2011/03/28(月) 13:49:44.59
>>545
間違いがあるし、判り難い。文字通り苦しんで覚えたいなら止めないけれど。
549 :デフォルトの名無しさん2011/03/28(月) 14:23:24.45
苦しんで覚えた方が、いい場合もある。
たまに、「XXXX入門書終わりましたが、プログラムが作れません。」
と言う初心者が現れる。
おまえ、入門書を眺めて、サンプルCDから実行しただけじゃないかと小一時間突っ込みたい。
550 :デフォルトの名無しさん2011/03/28(月) 15:33:40.05
実際入門サイトで何か一つ選ぶなら何がいいんだろう
自分は「猫でも分かる」と「ゲームプログラミングの館」ってとこ使ってたけど、やっぱ入門書が一番だったな
もっといいところ無いんだろうか
551 :デフォルトの名無しさん2011/03/28(月) 15:48:19.40
一つを選ぶ、という発想が馬鹿だよね、そんな奴PGにむいてないよ
552 :デフォルトの名無しさん2011/03/28(月) 16:42:50.69
ttp://dixq.net/g/08.htmlのサンプルコードをtest.cって言うファイル名で保存して
このファイルだけをコンパイルしたら動くのですか?
インクルードするDxLib.hというファイルもtest.cと同じフォルダに入れておかないとダメなんですか?
553 :デフォルトの名無しさん2011/03/28(月) 16:49:32.57
>>552
そのサイトの手順を0からやってれば、そんな質問出ないはず。
仮に、0からやってて、その段階で、その質問が出てきたのなら、C言語あきらめた方が良い。
555 :デフォルトの名無しさん2011/03/28(月) 17:21:38.57
一貫して重宝するのは「正しい」標準ライブラリの解説やサンプルがあるところだな
解説や使い方が正しくないサイトは全てが疑わしくなる
筆者がC言語を理解できてないことの証明だから
556 :デフォルトの名無しさん2011/03/28(月) 17:29:53.74
過去スレに 副作用完了点の取り扱いが怪しいサンプルコードを載せてた書籍名があったような…
557 :デフォルトの名無しさん2011/03/28(月) 17:31:45.75
>>556
副作用完了点の取り扱いが間違ってるなら分かるけど怪しいって何?
559 :デフォルトの名無しさん2011/03/28(月) 17:34:57.61
>>557
間違いと正解の混在。 一番たちが悪い
560 :デフォルトの名無しさん2011/03/28(月) 17:37:41.81
この1冊またはこのサイトっていうのありませんか?
自薦自演OKです
ダメだったら袋叩きにします
562 : [―{}@{}@{}-] デフォルトの名無しさん2011/03/28(月) 18:47:28.28
C実践プログラミングでLinuxでターミナルでviでgccでa.outするのがベスト
564 :デフォルトの名無しさん2011/03/28(月) 19:38:31.53
C言語のポインタで躓いてしまいました。
http://codepad.org/gim0E9pN

このプログラムなのですが、
エラー E2342 11.c 18: パラメータ 'num1' は int * 型として定義されているので int は渡せない(関数 main )
エラー E2342 11.c 18: パラメータ 'num2' は int * 型として定義されているので int は渡せない(関数 main )
とエラーが出てしまいます。

どこがおかしいのでしょうか?

間接参照演算子をつけたポインタは変数の値・アドレスを参照するのではなくて、変数そのものを参照すると思っているのですが、間違えていますでしょうか?
565 :デフォルトの名無しさん2011/03/28(月) 19:41:24.14
add(x1,x2,a); じゃなくて add(&x1,&x2,a);


566 :デフォルトの名無しさん2011/03/28(月) 19:42:40.31
>>564
関数addの第一と第二引数はintのポインタなのでmain側ではint型変数のアドレスを渡す必要がある
具体的に言うと
add(x1,x2,a);

add(&x1,&x2,a);
に変える
567 :デフォルトの名無しさん2011/03/28(月) 19:43:28.83
>>564
addは引数に(int*型, int*型, int型)をとるようになってる

でも実際使ってるほうは
add(int,int,int)になってる。引数の型が違ったら使えないよ
568 :デフォルトの名無しさん2011/03/28(月) 19:44:49.64
>>565-566
addのreturnに対する突っ込みは無しでつか?
いや、構文としては間違ってないけどね…
570 :デフォルトの名無しさん2011/03/28(月) 19:47:13.83
現役はどこ叩いても皆死ぬほど忙しいっていうのに暇だねぇ
571 :デフォルトの名無しさん2011/03/28(月) 19:48:29.70
>>565-567
なるほど引数で&をつけてあげないといけなかったんですね
つけてなかったから型違いになってエラーと・・・
解決しました
ありがとうございますm(_ _)m

>>568
addのreturnは自分でも思っていたのですが、
num3も返してあげた方がいいんですかね?
自分的にはnum3は加算する点数ようの引数なので返す必要ないとおもって返してないのですが
574 :デフォルトの名無しさん2011/03/28(月) 19:53:15.85
>>571
C言語では引数は一つしか返せない
int add(); // returnされる値はint型
複数の値を返したければ、>>564のように参照を使って
引数が指している中身を変更するか構造体を使う
575 :デフォルトの名無しさん2011/03/28(月) 19:56:13.87
引数が一つしか返せないってアホだ俺…orz
返せないのは返値(戻値)ね
576 :デフォルトの名無しさん2011/03/28(月) 19:58:11.59
>>574
なるほど
今僕は「優しいC第3版」と云うのを見ながらやっているんですが、
return文のところで、「return 式」と書いていたので複数でも返せるものと思っていました。
構造体と云うものが何か分からなかったので今目次を見てみましたが、Lesson11でするようです。
(因みに自分はいまLesson9の最後の練習問題の所です)
577 :デフォルトの名無しさん2011/03/28(月) 19:59:33.12
>>576
途中で書き込み押してしまいました。
ミスです。

まあどうでもいい話ですが、構造体というものをするのが楽しみになってきました。
ありがとうございましたm(_ _)m
578 :デフォルトの名無しさん2011/03/28(月) 20:01:23.25
return *num1,*num2;
で実際に返してるのは*num2の値
579 :デフォルトの名無しさん2011/03/28(月) 20:06:53.98
>>578

returnで*num1指定してもその後に*num2と指定すると戻り値が上書きされてしまうということでしょうかね
今returnで戻り値を0にしてみても動きました。
正直予想外で、本当は動かないと思ったいました。
戻り値は理解してるつもりでしたが出来ていないような気がしてきましたので、今から戻り値の単元を再度読み返そうと思いますm(_ _)m
581 :デフォルトの名無しさん2011/03/28(月) 20:12:50.48
>>579
return a, b;
これは単純にコンマ演算子でaを評価したあとbを評価する。
その結果、aは捨てられてbを返す。

return 0;
これは0を返しているだけ。

意味が分からなければ、main()に int b;を用意して
b = add( &x1, &x2, a);
で、add()のreturn;を色々と変えてbの内容を確かめてみると良い
582 :5242011/03/28(月) 20:43:50.04
>>533

全て解決した。
俺が持ってる入門書にはstaticとかの記述は一つもなかった。
だから知らなかったよ


ごめんね(笑)
583 :デフォルトの名無しさん2011/03/28(月) 22:04:42.38
Windowsで正規表現が使いたいのですが、いいライブラリありますか?
584 :デフォルトの名無しさん2011/03/28(月) 22:28:04.50
BSDライセンスだけど鬼車とか
HPにサンプルも載っけてあるから見てみれば
585 :デフォルトの名無しさん2011/03/28(月) 22:33:59.96
>>583
hmjre.dll
587 :デフォルトの名無しさん2011/03/28(月) 22:58:32.26
>>584-546
ありがとう。
明日、それぞれを見比べてみます。
588 :デフォルトの名無しさん2011/03/28(月) 23:01:49.23
>>54
ありがとうございます
589 :デフォルトの名無しさん2011/03/28(月) 23:07:06.67
>>588
何この遅レスって思ったら11日か…
もしかして、やっと書き込めるようになったとか?
590 :デフォルトの名無しさん2011/03/28(月) 23:17:32.84
C解説サイトを立ち上げようとしたとき
タイトル名を「小手返し及びドラゴンスクリュー教えるツェー言語」にしようとしたことがある。

手取り・・・・手を取るのは小手返しである
足取り・・・・足を取るのはドラゴンスクリューである

よって、小手返し及びドラゴンスクリューで教えるとは
手取り足取り教えるということであるからウィットが効いておろう、
と思ったが長すぎるのでやめた。
591 :デフォルトの名無しさん2011/03/28(月) 23:22:08.49
誰か>>590の笑うポイントを教えてくれ
592 :デフォルトの名無しさん2011/03/28(月) 23:26:04.38
ここの先輩方なら初心者に正しい入門サイトを作れると思うのですが私は間違っていますか?
594 :デフォルトの名無しさん2011/03/28(月) 23:35:53.12
よく、長い変数名の記述を、簡略化するためにマクロを使ってる人がいますけど、
個人的にあのような記述方法は、厄介なコードへの近道だと思う。

たとえば
struct AAA {
    int a,b,c;
};

これのインスタンスを大域変数として struct AAA aaa; として宣言してあるとします。

この aaa を読んだり書いたりするには、たとえば
void f(void) {
    aaa.a = 1;
    aaa.b = 2;
    aaa.c = 3;
}

などとすれば、読んだり書いたりできますが、この aaa という長い名前を簡略化するために、マクロによって短い名前にしてる人が時々います。
つまり

#define w aaa
void f(void) {
    w.a = 1;
    w.b = 2;
    w.c = 3;
}
となって、タイピング量が減って楽になるという理由でしょうけど、個人的に、マクロによってタイピング量をラクする、こういうコードを好んで書く人は、
ちょっと思慮が浅いと思います。というか、センスが良くないと思います。
595 :5942011/03/28(月) 23:38:58.36
なぜなら、これは書いた本人にとっては、読みやすく、記述しやすい、簡略化されたコードなのでしょうけど、一方、
他人(もしくは数ヶ月後の自分)にとっては、読むにも、改変するにも、余計なワンクッションを思考に挟む必要のある、「無駄に読みづらくされたコード」として映ってしまうからです。

また、読みづらさだけならまだしも、これはマクロの罠を潜在的にコードに潜り込ませることになります。(バグの温床)
「マクロは、あくまでマクロでしかない」これはK&Rで戒められてることです。(うろおぼえ、いや、ストラウストラップの本の方だったかもしれない。)
つまりマクロはC言語を知らないんです。マクロはマクロでしかない。

たとえば、将来、別の誰か(もしくは数ヶ月後の自分)が、struct AAA にメンバー変数 w を追加するとしたら、どうなるでしょうか?
struct AAA {
    int a,b,c;
    int w;
};

#define w aaa
void f(void) {
    w.a = 1;
    w.b = 2;
    w.c = 3;
    w.w = 4;    // エラー。 マクロによって実際には aaa.aaa = 4; という文字列に置き換えられてしまう。
}

厄介なことが起こりました。
wという名前をメンバー変数に使うのを諦めるか、もしくは #define w aaa を別の名前に変えるか、いずれにしても『余計な問題』が発生してしまいます。
でも、これはまだコンパイル時にエラーが出るのでマシです。
596 :デフォルトの名無しさん2011/03/28(月) 23:42:18.66
一度覚えちゃうと初心者向けに系統立って解説するって普通の人にはかなり苦痛
きっと使えると説明できるって異なる能力なんだろうね
597 :5942011/03/28(月) 23:45:01.70
では、
もしも
struct AAA {
    int a,b,c;
    int w;
    int aaa;
};
だとしたら?

#define w aaa
void f(void)
{
    w.w = 4;    // マクロによって実際には aaa.aaa = 4; という文字列に置き換えられてしまう。 そう! なんとメンバー変数 w は不定のまま! しかしコンパイルは正常に通ってしまう。
    w.aaa = 5;
}

こういうコードを、「”ぱっ”と見せられて」、 w.w への代入が失敗してることに、つまり w.w にバグの原因があることに気づけますか? 少なくとも自分は、かなり気づきにくいと感じます。

(例では、#define w aaa がすぐ近くにあるけど、実際のコードでは数百行の彼方に記述されてるかもしれません。 それでも簡単に気づけますか?
こういう「コンパイル通る類のバグ」は本当に厄介だと思います。気づきづらい。
ましてや他人の書いた膨大なコード中だと、尚更気づきづらいでしょう。)
599 :5942011/03/28(月) 23:50:32.00
もう一個、バグの例、
まったく aaa 界隈とは無関係の処理で、同じソースファイル中に以下のようなコードを追加した場合、
struct BBB {
    int aaa;
    int w;
};

// ~~~

#define w aaa

// ~~~

void g(void)
{
    struct BBB bbb;
    bbb.aaa = 1;
    bbb.w = 2;    // マクロによって実際には bbb.aaa = 2; という文字列に置き換えられてしまう。(wは不定のまま。つまりバグ) しかし、コンパイルは正常に通ってしまう。
}

まったく struct AAA aaa; と関係無いような処理にまで、#define w aaa の魔の手が伸びてきます。
たとえばこのコードがバグを起こしたとして、はたして原因として、まったく数百行彼方の(しかも一見、まったく関係無い)#define w aaa が原因だなんて、
容易に連想できます? 少なくとも私は半日コードを凝視しつつ延々と悩みつづける自信があります…orz
こういうマクロ関連のバグって、ほんとに気づき難いものです。実際に起きたら。

では、じゃぁ、このバグの原因がマクロだということに気づけたとします。 では原因を発見できたとして、このバグをを回避するためにどうしますか? どこに手を付けますか?
やりようは、いくらでもありますが、しかし、それにしたって、余計な面倒が増えてしまうのです。

#define w aaa なんていうマクロのせいです。(もともとタイプ量をラクするためのものが、コードの成長とともに、いつのまにかコードの癌へと変化してしまってる様子です)
600 :デフォルトの名無しさん2011/03/28(月) 23:56:07.49
実は最近、某氏の書いたコード中で、文字どうり、こういう #defien の使われ方がされてて、かなり辟易としました。

そのコードでは、システムのワーキングメモリとして構造体のインスタンスを大域変数として宣言し、タイプ量を少なくするために #define で w という名前に置き換えられてました。 ・・・wですよ? もう、恐ろしいですよ、こういうコード・・・
だから、ワーキングメモリのメンバ変数には、その子世代にも続いてずっと、メンバ変数として w という変数名に(容易には)アクセスできませんし、ソースコード中に w という変数を作ることすら(ほぼ感覚的には)禁止されてしまってます。
たとえば、 int width; の意味で int w; というメンバー変数名を使うのはよくあることだと思いますが、この w という変数名が(事実上)禁じ手にされてしまってるのです。
(もちろん #undef など工夫すれば w という変数名にもアクセスできますが、はたして、これを本末転倒と言わずに、なんと言うのでしょうか? もともとタイプ量をラクするためのものだったのに。)

もしもマクロではなく、ポインターなど「C言語の記述として」 w を用意してれば、マクロの罠は起こりません。 なぜなら、当然ですが、C言語はC言語を知っているからです。
たとえば
struct AAA* w = &aaa;
void f(void) {
    w->w = 4;    // ちゃんと aaa.w へ代入される。
    w->aaa = 5;    // ちゃんと aaa.aaaへ代入される。
}

ただし、ポインターを用意する分だけ、マクロよりも処理速度もメモリー効率も落ちます。(最適化されない前提で考えれば)
でも、個人的には、それでも #define w aaa なんてマクロをコードに潜り込ませるよりは、遥にマシだと思います。

ようするに、何が言いたいって、マクロは注意深く使ったほうが(なるべく使用は控えた方が)良いんじゃないの? という個人的な感想ですw というか、保守する側の身にもなれや・・・的なグチですorz
「おおさまのみみはろばのみみ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜!!!!!!!!!!!!!!!!!!!!!!!!!!」

ああ、スッキリした・・・orz
601 :デフォルトの名無しさん2011/03/28(月) 23:57:04.99
はいはい。
型の名称を省略したい場合は、typedef使いましょうね。
あと、ソースは、ちゃんと分割して管理しまょうね。
最後に、依存関係は、ちゃんと管理しましょうね。
以上。
602 :デフォルトの名無しさん2011/03/29(火) 00:04:38.36
あっ、型名じゃなくて、変数名を省略したのか。
んじゃ、最初から、命名規則に則った短い名前を付けましょう。
以上
604 :デフォルトの名無しさん2011/03/29(火) 00:14:54.24
俺もそれなりのオチを期待してずっこかされた
こんにゃろう
605 :デフォルトの名無しさん2011/03/29(火) 00:57:40.57
Javaで質問なんでsが、System.out.println("変数aの値は" + a + "です。 ");
とあったのですが、+ a + とはどういう意味ですか?
607 :デフォルトの名無しさん2011/03/29(火) 01:09:42.19
C言語で記号の入力判定をしたいのですが、関数等は何を使えばいいのでしょうか。
試しにgetchar()、char testと定義してscanf("%c", &test);としても駄目だったもので。
608 : ◆QZaw55cn4c 2011/03/29(火) 01:12:11.98
>>607
>記号の入力判定
とは具体的になにをすればいいのでしょうか?例をあげてみてください。
609 :デフォルトの名無しさん2011/03/29(火) 01:19:00.90
>>608
すいません書き方が悪かったですね。
単にどうすれば記号をユーザーの入力から取得できるか知りたかったのです。

具体的に云うと、
if(test == '+'){
...
}else if(test == '-'){
...
}else if(test == '*'){
...
}else if(test == '/'){
...
}else if(test == '&'){
...
}else if(test == '%'){

....
以下省略のように、入力された記号に応じた処理をするプログラムを作りたいので。
610 : ◆QZaw55cn4c 2011/03/29(火) 01:28:47.36
>>609
http://codepad.org/5qJaWoGM
こんなのはどうでしょうか。
611 :デフォルトの名無しさん2011/03/29(火) 01:28:47.95
>>609
さっぱり分からないが
あなたが求めているのは
#include <conio.h>

getch() もしくは getche()
かもしれない
612 :デフォルトの名無しさん2011/03/29(火) 01:46:16.38
>>610
私が求めていたのは若干事なりましたが大体そんな感じなのでとても助かりました。
EOFという知らない単語もあり、検索をしてみたところ良い勉強になりました。
ありがとうございました。

>>611
getch(),getche()どちらも知らない関数でありましたので調べさせていただいたところ入出力関数のようですね。
自分にはまだまだscanf getcharなどとの使い分けが今いち分かりませんが、新しい関数をしれたという意味ではいい勉強になったのではないかなと思います。
ありがとうございました。
613 :デフォルトの名無しさん2011/03/29(火) 02:30:45.93
慣れてくると、if〜elseや、同様の働きをするswitch〜caseを使ってはいけないような気がし始める。

「キーボーから入力があったら通知あんねんから、それ直に捕まえて関数ポインタで飛ばしたったらええんや」
とか思い出せばしめたものである
614 :デフォルトの名無しさん2011/03/29(火) 05:32:15.91
switch caseとかほとんど(というか全く)使う機会ないな
if (A==B || A==C || A==D || A==E) {
} else if (A==F || A==G || A==H) {
}
みたいな場合分けぐらいじゃなかろうか>switchcaseを使う場面
619 :デフォルトの名無しさん2011/03/29(火) 09:26:16.63
>>613
キーボードからの入力を捕まえて関数ポインタで飛ばすって何?
620 :デフォルトの名無しさん2011/03/29(火) 10:36:33.19
iphoneのアプリを作る場合ってCとObjective-Cどちらから先に勉強したら後々楽ですか?
621 :デフォルトの名無しさん2011/03/29(火) 11:23:47.66
ガタガタ言ってねえで実際に作れよ
必要なものはその時わかる
622 :デフォルトの名無しさん2011/03/29(火) 11:27:58.32
>>620
目的がiPhoneアプリなのだから、独力で学習できるならObjectiveCだけでいい。
そうでないなら、情報量の多いCから入った方がいいかもしれない。
まぁ、そんな質問をしている段階でどうせ無理だと思うが。
623 :6072011/03/29(火) 11:46:47.01
>>610が書いたものを参考にプログラムを書いてみたのですがどうもうまくいきません。
http://codepad.org/DaZzmWhv

-が入力されたときは上手く処理をするので、-の所との違いをチェックしていきましたが、演算の違いだけで他に見当たりません。
また、エラーがでているわけでもありません。
どこがおかしいのでしょうか
624 :デフォルトの名無しさん2011/03/29(火) 11:53:04.31
mark = getchar()を先にすんのかな
625 :デフォルトの名無しさん2011/03/29(火) 11:56:38.47
>>623
mark = getchar() は最初の一回のみ
後は、markと記号の比較でOK
626 :6072011/03/29(火) 11:57:29.02
>>624
mark = getchar()を先にするのは昨日やってみました。
するとちゃんと+などを打っても、
else{
printf("対応してる計算式を入力してください。\n");
printf("もう一度始めからやり直してください。\n");
}
の部分へ行ってしまいます。

あ、それと何故かchar型のans2定義してますが意味ないです
627 :6072011/03/29(火) 11:58:18.92
>>625
ほんとうですか・・・
もう一回試してきてみます

>>626
定義じゃなくて宣言でしたorz
628 :6072011/03/29(火) 12:03:55.16
今やってみました。
http://gyazo.com/f9d1862e932d0d1c4fca6ae6f9d78386.png

+を入力しましたがやはりこんな感じになってしまいます。

発想を変えて条件分岐のmarkも文字が代入されてるので試しに'つけてみたら次はエラーがでましたorz
629 :デフォルトの名無しさん2011/03/29(火) 12:05:01.52
ああ別に先にしなくても最初のとこ以外markだけにしとけばいいのか
630 :デフォルトの名無しさん2011/03/29(火) 12:07:40.08
>>626
変な動きをする理由はscanfのあと入力バッファに改行が残るからです
例えば 1<改行>2<改行>+<改行> のように入力すると
最初の scanf("%d", &num1); は 1 を読み込みます
次の scanf("%d", &num2); は改行を読み飛ばして 2 を読み込みます
次の getchar() は改行を読み込みます
次の getchar() は + を読み込みます
次の getchar() は改行を読み込みます
解決方法は・・・マンドクセ('A`)
631 :6072011/03/29(火) 12:10:22.99
>>628
やってみましたが>>628と同じ処理になってしまいました。

>>630
なるほど
getcharで改行を読み込ませないか数字入力する時点で改行が無いようにしてあげればいいってことですかね
やってみます
633 :6072011/03/29(火) 12:25:39.34
できました!
getcharをscanfに変えて%*cで空白を読み飛ばしました。
入力バッファという言葉自体しらなかったのでggってみたらscanfの問題点というのがあってそこに空白の読み飛ばしと云うものがありました

やっぱプログラミングって難しいですね
何が原因とかわかってたら最初からggっていれば、これだってすぐ解決できるようなことだったのに
そういう言葉を知らないために検索のしようもないですからねー

でも難しいけどできた時が嬉しいので楽しいです

ありがとございました
635 :デフォルトの名無しさん2011/03/29(火) 16:52:50.78
1日から内定先で働くのに何にも打てねぇ
先輩に殺されるかも・・・・・・・・・・・・・・・・・・
637 :デフォルトの名無しさん2011/03/29(火) 18:31:44.07
すまん!教えてください!BCCとVC++ってどっちが使われてるんですか?
会社でよく使われてるほうのコンパイラを使って勉強したいです!
639 :デフォルトの名無しさん2011/03/29(火) 18:39:08.23
コンパイラなんかどうでもいいよ
HSCでもGCCでもBCCでもVCでもそれぞれクセがあって、結局書き直さないといけなくなる。


GCCは頑なにANSIで認められたものしか実装しようとせずstrnlengthとか使えなかったり
BCCはもう古くてlong long とか使えなかったりするし
VCはWindows専用でほかのシステムにまったく対応できないし
640 :デフォルトの名無しさん2011/03/29(火) 18:39:13.61
会社に入ってからC言語の教育してるところってあるけど何なの?

あえて一から教える事で飲み込み能力を見てるわけ?

C言語の飲み込み能力見るために、つまり天性的なものを見るために
あえてC言語経験者は取らない会社ってあるの?
641 :デフォルトの名無しさん2011/03/29(火) 18:51:55.20
>>639
GCCって変な拡張がいっぱいあるいようなイメージだけど。
642 :デフォルトの名無しさん2011/03/29(火) 19:01:50.00
>>637
「どっちが」という前提からもう違う(クロスを完全に考え落としている)
「よく使われてるほう」に山はっても容赦なく外れるが、どうする?

具体的な案件が決まらないうちに予習するなら
手当たり次第全部だよ
643 :デフォルトの名無しさん2011/03/29(火) 19:27:23.30
C言語出来たからってPHPでWEBサイト作れるってわけでもないんだな
Zend Frameworkでサイト作る事になったけどさっぱりわかんない
644 :デフォルトの名無しさん2011/03/29(火) 20:57:24.24
>>613
if文を使わずに条件分岐ってこと??

http://codepad.org/6MJDapYu
普通にswitchやifの方が読みやすくね?
645 : [―{}@{}@{}-] デフォルトの名無しさん2011/03/29(火) 21:11:28.21
関数ポインタ使いこなしてる俺様カッコイイと主張したいだけの厨ニ病患者
646 :デフォルトの名無しさん2011/03/29(火) 21:16:07.23
C言語の話しではないが
ifやswitchを使わないでクラスを継承してポリモーフィズムしてみる
みたいだな。
647 :デフォルトの名無しさん2011/03/29(火) 21:17:02.23
缶ススポインタでなくてもいいけど、直に捕まえるといつどんなときでも受け付けてくれてサイコー

極端に言えばOSが固まってても受け付けてくれる。
648 :デフォルトの名無しさん2011/03/29(火) 21:17:12.14
>>644
気にするな、getchar()からEOF返されて暴走するコードなんだからw
649 :デフォルトの名無しさん2011/03/29(火) 21:18:57.79
x86の割り込み処理ってのはめんどくさい。

ベクタがまずムカつく。

こういうときPowerPCなら、直接アドレスにスッ飛ばすからンなもんいらねえのに
652 :デフォルトの名無しさん2011/03/29(火) 21:25:43.41
俺は初心者にこそ、定数を使わないことをまず徹底して教えるべきだと思う

for(i=0; i < 6; i++){
 for(ii=0; ii < 12; ii++){
  for(iii=526309629; iii > 5555; iii--)

みたいなのは、例えば i の値を変えたくなったときに困る。
カウントに使うだけならまだしも、それに付随して何かさせたいとき
i の値が変わったらそれみんな設定しなおしになる。

配列要素数もそうだ
定数で決め打ちするから、それ変えたいときにみんな変える羽目になる。

653 :デフォルトの名無しさん2011/03/29(火) 21:33:45.19
> みたいなのは、例えば i の値を変えたくなったときに困る。
> カウントに使うだけならまだしも、それに付随して何かさせたいとき
> i の値が変わったらそれみんな設定しなおしになる。
iにconstつけとけよw
654 :デフォルトの名無しさん2011/03/29(火) 21:34:36.92
>>652

気持は伝わるんだが、いいたい事が分からん
655 :デフォルトの名無しさん2011/03/29(火) 21:36:03.21
>>646
関数ポインタ無しで if と switch だけでポリモフ機構の実装は…
ぱっと思い浮かばんね。

それ以外で関数ポインタ使うのって qsort や Windows APIのように
それを要求してるから仕方なしに渡してる って場合がほとんど
656 :デフォルトの名無しさん2011/03/29(火) 21:53:24.83
>>655
適当に型に対して番号振って、その番号で分岐すれば良いじゃん
657 :デフォルトの名無しさん2011/03/29(火) 21:59:36.86
最初は、ifififififififififiififififififififって重ねるのもいいが
実務ではそれは絶対に認められない。趣味でも効率が悪いだけだ。

if を重ねるのは3つまで。
3つで終わらないものは別の方法を考えたほうがいい。
658 :デフォルトの名無しさん2011/03/29(火) 22:22:11.75
>>655
WndProc なんか switch だけでポリモしてるじゃん
ぺぞるととか
659 :デフォルトの名無しさん2011/03/29(火) 23:56:10.43
constとstaticの違いが分かりません。
どちらも関数に渡しても中身を変えないって意味ですか?
660 :デフォルトの名無しさん2011/03/30(水) 00:20:34.12
constは何をやっても値を変えられないもの (キャストするなどやれば変えられるようになるが普通はやらない)

staticは値は変えられるがプログラムが終わるまで値を保持し続けるもの

グローバル変数もプログラムが終わるまでの寿命を持つが
グローバル変数はありとあらゆる関数や式で参照できるのに対し
staticは宣言した場所でしか参照できない
「与えたり計算して変更した値を死ぬまで持っているローカル変数」

「staticグローバル変数」というものもあり
これはそのソースファイル内だけ有効なグローバル変数
他のソースファイルからはexternを付けても見えなくなる
661 :デフォルトの名無しさん2011/03/30(水) 01:05:26.49
バッファ領域って何ですか?

バッファの意味が分かりません。

662 :デフォルトの名無しさん2011/03/30(水) 01:11:04.30
>>661
バッファはいろんな用途に使われるけど、例えばI/Oバッファ
I/OはCPUの速度に比べて圧倒的に遅いのが普通なので、入力もしくは
出力コマンドを送ってから作業が終了した事を割り込みでCPUに知らせる
その時にI/Oの回数を少しでも減らせばそれだけ速度が上がる
663 : ◆QZaw55cn4c 2011/03/30(水) 01:14:35.96
>>661
バッファ:緩衝装置→緩衝記憶領域・緩衝増幅器(アナログ/デジタル)・pH緩衝液
他になにかあったかなあ。
664 : ◆QZaw55cn4c 2011/03/30(水) 01:19:14.70
>>649
PowerPC 系って、CPU に割り込み信号が入った後、割り込みコントローラ(8259みたいな奴ね)はバスに物理アドレスを送るんですか?
じゃあ、割り込みコントローラにあらかじめアドレスを登録するとかするのですか?それは大変だ。
665 :デフォルトの名無しさん2011/03/30(水) 01:40:17.68
>>662
I/Oって何ですか?
さすがにググルのは面倒です。
どうせ調べても分からないし。
666 :デフォルトの名無しさん2011/03/30(水) 01:44:24.41
>>665
CPUが受け取ったり、出力したりする信号線。インアウトの略。
普通、CPUの速度よりも遙かに遅い。
667 :デフォルトの名無しさん2011/03/30(水) 01:55:02.06
>>665
例えばハードディスクへの読み込み、書き込みもI/O
バッファ領域を取っておけばI/O回数が減らせる
668 :デフォルトの名無しさん2011/03/30(水) 01:59:49.73
C言語で何か習作したいんですけど、習作するならこんなのいいよ!みたいなのってありますか?
CUIのみでWin32APIは使わない方向でお願いします。
669 : ◆QZaw55cn4c 2011/03/30(水) 02:01:41.81
>>668
では、最古のアルゴリズムである、ユークリッドの互除法はどうでしょうか。すでに体験ずみならごめんなさい。
670 :デフォルトの名無しさん2011/03/30(水) 02:05:17.57
>>669
今wikiみて来ました
楽しそうですね
やってみます
671 :デフォルトの名無しさん2011/03/30(水) 03:01:56.98
動画サイトで動画見てて、動画が止まったときバッファリングとか
出てきますよね?バッファ32%とか。

そのバッファですか?
672 :デフォルトの名無しさん2011/03/30(水) 03:06:50.38
バッファ=メモリということでOKですか?
673 :デフォルトの名無しさん2011/03/30(水) 03:08:14.53
>>671
それも一種のバッファですね

>>672
そうとも限らない
HDDやSSDがバッファになる事もある
675 :デフォルトの名無しさん2011/03/30(水) 03:13:45.94
>>673
HDDやSSDがバッファになる事もある

仮想メモリのことですか?
676 :デフォルトの名無しさん2011/03/30(水) 03:21:01.51
PowerPCは例外を受けたときに飛ばすアドレスが完璧に決まっているので
単純にテーブルを置いておけばよい。
678 :デフォルトの名無しさん2011/03/30(水) 04:03:59.61
CGIとC言語って何か密着した関係性ありますか?
CGIプログラムってなんでしょう?
C言語でも書けるんですか?どうやって実行するんでしょう?
679 :デフォルトの名無しさん2011/03/30(水) 05:15:53.59
>>678
こことか参考になると思う
http://goo.gl/MpMGF
680 :デフォルトの名無しさん2011/03/30(水) 07:29:03.95
>>678
CGIってのは何か物の名前じゃなくて、仕組みの名前だと思う。しらねーけど。

インターネットエクスプローラー6とかから、どっか別のパソコンの中にあるプログラムを、遠隔操作みたいな感じで実行して、
その実行結果の文字列とかを送り返してもらって、自分のとこのIE6とかで表示できる。 って感じだとおもってる。 たぶん。


。oO「○○ってプログラムを実行しろ」
自分のIE6    →    どっか別のパソコン


              。oO「は〜〜い。 ○○ってプログラムを実行しま〜〜す☆」
自分のIE6         どっか別のパソコン


              。oO「○○ってプログラムの出たやつです。おくりまーす」
自分のIE6    ←    どっか別のパソコン


。oO「キター♪」       。oO「よかったね(^_^/」
自分のIE6         どっかのパソコン


この○○ってプログラムには、実際のところ、パールをつかったり、ジャバーをつかったり、シーをつかったり、それは何を使ってもいいってことなのかもしれない。って思う。
よくしらねーけど。
683 :デフォルトの名無しさん2011/03/30(水) 11:42:31.88
ファイルからリダイレクトで変数に値を代入するときに、4番目だけ手入力
させたいのですが、できません。どうしたらいいか教えてください。
よろしくお願いします。

cin >> ax;
cin >> ay;
cin >> az;
 scanf("%s",&tt);
684 :デフォルトの名無しさん2011/03/30(水) 11:44:53.31
Cでmp3再生するフレームワークってありませんか?
自分で1からコード書くの難しくて
685 :デフォルトの名無しさん2011/03/30(水) 12:40:34.65
>>683
fgetpos
dup
freopen

dup2
close
clearerr
fsetpos
686 :デフォルトの名無しさん2011/03/30(水) 12:53:45.09
9時に音楽を鳴らす
12時に音楽を鳴らす
18時に音楽をならす
ただし土日は何もしない
パソコンを起動したらスタートアップに入れてプログラムを自動起動する
対象はXP〜だが.netフレームワークが導入されているとは限らない
この用途の場合は何の言語を用いるとよいですか?
687 :デフォルトの名無しさん2011/03/30(水) 12:59:59.13
>>686
タスクスケジューラを使う
688 :デフォルトの名無しさん2011/03/30(水) 14:21:58.69
char配列から signed int に型変換する。
char 2つで 一つのint値に対応している。
この変換は、以下のような認識であっていますでしょうか。

上位 char値(c1)がマイナス
int val = c1 * 256 - (unsigned の c2)

上位 char値(c1) がプラス
int val = c1 * 256 + (unsigned の c2)

よろしくお願いします。

689 :デフォルトの名無しさん2011/03/30(水) 14:49:00.67
>>687
実はttp://www.lancers.jp/work/detail/15544の仕事をやってみたいんです
690 :デフォルトの名無しさん2011/03/30(水) 15:01:21.55
>>685
何をしているのかわかりません。ファイルには書き込みません。
標準入力から入力するときは止まってくれるのに、ファイルを
リダイレクトすると入力すべきところをスルーしてしまいます。
止まって入力させることはできないのでしょうか?
691 :デフォルトの名無しさん2011/03/30(水) 15:14:50.44
>>690
環境を書いてくれ
692 :デフォルトの名無しさん2011/03/30(水) 15:42:38.72
C言語の質問と云わず全部の言語での質問になりそうなので此処で質問していいのか分からないのですが
計算問題が色々と置かれてあって、それをプログラムで書きましょうみたいなwikiがあるのですが、誰かご存知ありませんか?
ご存じある方が居ればURLを教えていただきたいのですが
693 :デフォルトの名無しさん2011/03/30(水) 15:46:04.13
>>690
標準入力は一つしかないからファイルからもコンソールからも入力したいと思ってもそう簡単ではない。
>685のように切り替えて使うか、
コンソール入力を別の手段で行なうか、
ファイル入力を自分でファイルを開くか、
どれかを選ぶしかない。
694 :デフォルトの名無しさん2011/03/30(水) 15:48:18.44
>>692
>C言語の質問と云わず全部の言語での質問になりそうなので此処で質問していいのか分からないのですが
ダメ。板のトップを見ましょう。
695 :デフォルトの名無しさん2011/03/30(水) 16:40:53.95
>>680
分かり安すぎワロタww
分かり安すぎて、これからC言語の勉強をする前に挫折しそう。
698 :デフォルトの名無しさん2011/03/30(水) 17:22:48.30
ありがとうございます
実験しましたが、駄目でした。

ooguma-katsuki-no-MacBook:programs 12we56ty$ gcc sample.c
ooguma-katsuki-no-MacBook:programs 12we56ty$

コンパイルをしてみました
ooguma-katsuki-no-MacBook:programs 12we56ty$ gcc -o sample.c
i686-apple-darwin10-gcc-4.2.1: no input files

駄目でした

どこの設定が、おかしいでしょう?



699 :デフォルトの名無しさん2011/03/30(水) 17:28:08.00
どのへんが駄目?
エラーメッセージが出なければ成功だと思うが
700 :デフォルトの名無しさん2011/03/30(水) 17:33:27.95
説明が足りないか
最初の gcc sample.c はエラーメッセージが出ていないので成功している
sample.c は正しくコンパイルされ、実行ファイルが生成されているはず
出力ファイル名は指定していないのでデフォルトの a.out のはず

次の gcc -o sample.c はオプションの使い方が間違っているからエラーメッセージが出た
-o は出力するファイル名を指定するオプションだが、同時に入力するファイル名も当然必要なので、
gcc sample.c -o sample
とか
gcc -o sample sample.c
のようにすると、 sample.c をコンパイルして sample ができる

マイクロソフト ワイヤレス ブルートラック マウス Arc Touch Mouse RVF-00006
マイクロソフト ワイヤレス ブルートラック マウス Arc Touch Mouse RVF-00006