C言語なら俺に聞け(入門編)Part 80

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
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++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
★ぬるぽ。
2デフォルトの名無しさん:2011/03/09(水) 15:47:19.01
がっ
3デフォルトの名無しさん:2011/03/09(水) 16:34:56.22
おつ
4デフォルトの名無しさん:2011/03/09(水) 17:20:14.66
>>1乙スレ立て直せ
5デフォルトの名無しさん:2011/03/09(水) 17:55:27.07
なななななんでや
6デフォルトの名無しさん:2011/03/09(水) 19:26:28.83
次はテンプレにcodepadのリンク入れよう
7デフォルトの名無しさん:2011/03/09(水) 20:06:31.86
2>>1
8デフォルトの名無しさん:2011/03/09(水) 20:36:46.04
やっと勃った
9デフォルトの名無しさん:2011/03/09(水) 20:38:27.05
>>8
そんなに渇望してるなら自分で立てろよw
10デフォルトの名無しさん:2011/03/09(水) 20:55:07.36
tes
11デフォルトの名無しさん:2011/03/09(水) 20:59:16.83
最近C言語やりはじめたんですが、C++ってなんですか?参考書売場であったので、C言語とは関係ないんですか?
12デフォルトの名無しさん:2011/03/09(水) 21:05:42.35
関係ある
13デフォルトの名無しさん:2011/03/09(水) 21:29:13.67
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
志村〜、未定義未定義
17デフォルトの名無しさん:2011/03/09(水) 22:08:32.62
>>16
不定じゃね?
18デフォルトの名無しさん:2011/03/09(水) 22:23:15.50
ん? C++ == C か?
19デフォルトの名無しさん:2011/03/09(水) 22:34:17.72
C++ = C; // 副作用二回で未定義
C++ == C; // 左辺と右辺の評価順が不定
20デフォルトの名無しさん:2011/03/09(水) 22:37:25.95
> C++ == C;
あれ?
左辺から右辺に評価かされるけど、左辺の副作の評価順が不定?
良く分からなくなってきた
21デフォルトの名無しさん:2011/03/09(水) 22:44:12.85
&& と || と , と:?だけが例外的に副作用完了点を持つ
22デフォルトの名無しさん:2011/03/09(水) 23:05:07.06
どこまでが不定で、どこからが未定義か分からなくなってきた
K&RのころとC99で変わってる気もするから、今度確認しておこう…
23デフォルトの名無しさん:2011/03/09(水) 23:08:02.17
とりあえず=と==では++使わない方がいいってことですね
24デフォルトの名無しさん:2011/03/09(水) 23:10:54.09
質問はcodepad使って欲しいね。
あっちのほうが見やすい
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++;
29デフォルトの名無しさん:2011/03/09(水) 23:46:17.28
>>27
副作用完了点をつければいいということは
この場合は

C++ , C=C;
C++ , C==C;

ということですね(`・ω・´)シャキーン
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;
}

ビットを数えていると思うんですが、動きがわかりません><
31デフォルトの名無しさん:2011/03/10(木) 01:44:25.72
oh...
>が三つになっているのはミスです
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 コマンドとかプロファイラとか
36デフォルトの名無しさん:2011/03/10(木) 08:33:19.48
つ[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として読み取る心配は不要なのかどうか。
39謙虚フロンティア戦士:2011/03/10(木) 11:34:12.61
謙虚きたよ^^
40デフォルトの名無しさん:2011/03/10(木) 13:06:34.16
NEET?
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操作しないのおかしくね?

書いてある前提が全て正しければ、整合性は取れる
43デフォルトの名無しさん:2011/03/10(木) 21:48:11.12
ちゃんと見てないけど、むしろcountがネックな気がした。
44謙虚フロンティア戦士:2011/03/10(木) 22:04:25.68
おちんちんびろーん
45デフォルトの名無しさん:2011/03/10(木) 22:20:02.42
>>38
volatileでコンパイラ最適化抑制をしておかないと場合によってはハマる予感
46デフォルトの名無しさん:2011/03/10(木) 22:28:02.76
つかコンパイルエラーって役に立つんですか?for()内の;忘れただけで
他の行にも複数エラーありの表示が出るんですが・・・

ピンポイントでここが違うんじゃないかという予想のエラー表示を
して欲しいものです。
47デフォルトの名無しさん:2011/03/10(木) 22:31:31.00
正 コンパイルエラーの通達表示

48デフォルトの名無しさん:2011/03/10(木) 22:34:02.05
>>46
無いより有ったほうが良い 少なくともそれ以前はエラーじゃないことがわかる
49デフォルトの名無しさん:2011/03/10(木) 22:45:48.90
エラー内容は役に立ちまくり。
50デフォルトの名無しさん:2011/03/10(木) 23:33:21.61
>>46
ついでに予想して直してくれりゃ最高だなw
51デフォルトの名無しさん:2011/03/11(金) 01:06:58.63
適切なエラーメッセージの表示は
非常に難しい分野
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;
}
53デフォルトの名無しさん:2011/03/11(金) 01:51:33.83
宿題は宿題スレへ
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ファイルを扱うようなとき、「エラー一個見つけたら止まる」だと
直してコンパイルして直してコンパイルして……ってことになる。
そりゃ開発者側からすれば面倒なわけ。複数個のエラーがあるなら全部直した上でコンパイルしたいし、
エラーの箇所は大体知っておきたい。
だから大体のコンパイラは「他にもエラーが無いか探して、分かりえる限り全部のエラーを
プログラマーに示そうとする」ような作りになってる。
初心者から上級者まで全部を満足させるのは難しいわけね。仕様と思ってあきらめて。

初心者レベルなら一番初めのエラーだけ見ておけば済むと思う。
56デフォルトの名無しさん:2011/03/11(金) 04:12:10.82
それなら、翻訳単位ごとに1個にしてださいよこの野郎
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
ピンポイント予想が出来ないから、可能性のある場所全てが表示される
逆に考えれば、ピンポイント予想の一か所を外した場合、間違ってる箇所を探すのが大変
59デフォルトの名無しさん:2011/03/11(金) 08:38:21.15
>>58
え?
60デフォルトの名無しさん:2011/03/11(金) 09:49:03.39
お!
61デフォルトの名無しさん:2011/03/11(金) 11:48:30.48
>>58
・・・・
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ぬけてました。
6737:2011/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と同じコードであるにも関わらず、実質、エラーが現れなくなりました。
(注:消えたではなく)
これは、おどろくべき事だと感じます… というか、並列プログラムのデバッグ・バグ再現の難しさを象徴してると思いました。
6837:2011/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単位で安全なのだろうか?等の懸念)
69デフォルトの名無しさん:2011/03/11(金) 19:13:25.07
話が長いな
70デフォルトの名無しさん:2011/03/11(金) 20:51:27.56
あいうえおと言う文字列を
16進数化するにはどういう方法を使えばいいのでしょうか
71デフォルトの名無しさん:2011/03/11(金) 22:30:48.51
2バイトづつ読みこめばいいんじゃね
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かどっちがいいか聞いてるだけじゃね?
89デフォルトの名無しさん:2011/03/12(土) 13:29:05.78
型情報が使えるから const でいいなら 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();
    } 
  }
94デフォルトの名無しさん:2011/03/12(土) 14:18:25.24
C99?
それってコンパイル通るんか
95デフォルトの名無しさん:2011/03/12(土) 14:31:02.67
なんか勘違いしてるね。
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
111デフォルトの名無しさん:2011/03/13(日) 11:43:21.98
マクロはファイルスコープ。enumの方が使いやすい。
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の美しい使い方を教えれ
117デフォルトの名無しさん:2011/03/13(日) 13:55:48.69
>>112 スレチ
118デフォルトの名無しさん:2011/03/13(日) 13:57:00.41
>>115 ハズレ
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
規格には何て書いてあるか調べたのか?
そして、それが全てだ。
122 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/13(日) 16:14:36.09
すいません企画のありかを教えてください
123デフォルトの名無しさん:2011/03/13(日) 16:18:15.91
規格とか気にする前に、コンパイルした汗とか見てみたら
知識あれば、できるなら、誰も苦労しないだろうに
124デフォルトの名無しさん:2011/03/13(日) 16:22:15.05
ぶっちゃけ千回計算させてどっちが速いか調べたほうがいいんじゃね
125デフォルトの名無しさん:2011/03/13(日) 16:33:31.57
外れた知識をどっから仕入れてるんだろうね?
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次元)
139デフォルトの名無しさん:2011/03/14(月) 19:34:56.00
妄想が貧弱だね
140デフォルトの名無しさん:2011/03/14(月) 20:53:08.89
大体あってる
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
大輔だろ
145デフォルトの名無しさん:2011/03/14(月) 22:54:42.94
>>144
次元大介
146デフォルトの名無しさん:2011/03/14(月) 22:57:11.38
大体あってる
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
155デフォルトの名無しさん:2011/03/15(火) 11:32:14.87
AがBもしくはCと等しい場合は、if(A == B || A == C)と書く
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 以外であるとき
158デフォルトの名無しさん:2011/03/15(火) 11:49:06.15
ありがとうございました
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
パラメータを調整したクイックソート&マージソートって実装はあるらしい
177デフォルトの名無しさん:2011/03/15(火) 18:39:52.51
あるらしね
178デフォルトの名無しさん:2011/03/15(火) 19:14:09.64
while(num){

num--;
}
※{}内省略

この文の継続条件式はnumとしか書いてないのですが、num==1とnumって同様の意味なのでしょうか?
num>10とか書いてあるなら分りますが、numだけとしか書いてないとどういう意味なのでしょうか?
179デフォルトの名無しさん:2011/03/15(火) 19:16:47.79
while(num){
while(num!=0){
180デフォルトの名無しさん:2011/03/15(火) 19:21:41.59
numが0になったら臨界です
181デフォルトの名無しさん:2011/03/15(火) 19:36:56.15
>>178
while は条件式を評価した結果が 0 以外の場合にループする
あとはわかるな?
182デフォルトの名無しさん:2011/03/15(火) 19:47:20.85
独学にしてはお粗末...
183デフォルトの名無しさん:2011/03/16(水) 00:43:15.14
50パーセントの確率で成功するけど、めちゃくちゃ処理が早いとかいう
アルゴリズム存在しますか?
184デフォルトの名無しさん:2011/03/16(水) 00:50:25.33
>>183
意味がわからないけどスレ違いだと思う
185デフォルトの名無しさん:2011/03/16(水) 01:01:59.64
シミュレーテッドアニーリングとか
186デフォルトの名無しさん:2011/03/16(水) 01:03:27.66
>>183
バブルソート (の変形版)
ならソート済みデータに一つ追加しただけのときは早い
187デフォルトの名無しさん:2011/03/16(水) 01:21:24.73
円周率を円に向かってランダムに点打って求める時とかw
188デフォルトの名無しさん:2011/03/16(水) 01:28:21.77
>>183
奇数かどうかを判定するアルゴリズム

return i % 2; // 1回の計算を必要とする
return 0; // 1回も計算をする必要がない!高速!しかし成功率は50%
189デフォルトの名無しさん:2011/03/16(水) 01:30:21.98
>>188
確かにwww
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ポートにアクセスすることは普通にできるのでしょうか?
すみません、お願いします。
208デフォルトの名無しさん:2011/03/16(水) 14:20:30.21
普通って?
209デフォルトの名無しさん:2011/03/16(水) 14:35:43.35
>>207
Cではやったことはないが、できないということはないだろうな
ただ、1つのポートへ同時に複数スレッドの接続はできないだろうが
しかし、お前のレベルでマルチスレッドプログラミングはやめておけ
マルチスレッドはタイミング的な問題も発生しやすいからバグが見つけにくい
オブジェクトのきちんとした管理や場合によっては排他処理が必要になる
210207:2011/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++をつかってておもうんだけど、ヘッダファイルがどうにかならんものかね。
まあ新しい言語作れって話になっちゃうんだろうけどさ。
212デフォルトの名無しさん:2011/03/16(水) 15:35:08.01
けどさ。
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なら関数ポインタしってれば簡単につくれるとおもわれるが・・・。

これでよいのかい?

じぶんでおっきするのか、たにんにおっきさせてもらうかでちょいと違いがでるんだけど。
218デフォルトの名無しさん:2011/03/16(水) 16:38:36.17
何言い出してんの?って意味で
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使わないこと?
じゃ、他の事っていうのは誰がするの?
225デフォルトの名無しさん:2011/03/16(水) 16:53:14.68
?そんなの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
233デフォルトの名無しさん:2011/03/16(水) 17:23:21.97
#pragmaで実装できる奴もあるぞ。
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
そんな説明で大丈夫か?
237デフォルトの名無しさん:2011/03/16(水) 17:52:53.82
どうぞ御自由にOSなし環境で動かしてください
238デフォルトの名無しさん:2011/03/16(水) 17:56:32.37

ザックリ言えばの話よ

239デフォルトの名無しさん:2011/03/16(水) 17:58:39.93
すごいでちゅねー
これが不遜メソッドでちゅかー
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
ここまでトンチンカンな奴がいるなら、いくらラップしても足りないな
いないほうがマシ
243207:2011/03/16(水) 18:09:53.77
すみません、初心者のプログラムでなく、スレ間違いかもしれませんでした。
244デフォルトの名無しさん:2011/03/16(水) 18:51:59.69
>>243
まったく問題なく出来るから心配すんな
245デフォルトの名無しさん:2011/03/17(木) 01:56:51.26
Sleep なり sleep なり以外で CPU を休める方法ってあるの?
246デフォルトの名無しさん:2011/03/17(木) 02:11:34.11
select とか poll とか
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;みたいなのがあるから、混合しやすいってこと?



やっぱプログラミングの基礎は自分で理解するに限る。
250デフォルトの名無しさん:2011/03/17(木) 10:05:30.27
インライン展開とか入門したての人は言われても分からん。
251デフォルトの名無しさん:2011/03/17(木) 10:13:58.68
他のファイルの邪魔にならないため>

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

static ttt()とすればいいんですね?
252デフォルトの名無しさん:2011/03/17(木) 10:55:08.67
>>251
そのとおりだ
253謙虚フロンティア戦士:2011/03/17(木) 11:27:26.55
名前空間が使えるシープラ最強ですね、わかります。
254デフォルトの名無しさん:2011/03/17(木) 14:48:49.50
はじめまして
友人が書いたc言語のプログラムを手直しして
javaに変換している仕事を頼まれたのですが
コードが3,5kステップほどもあり非常に苦戦しています。
c言語で書かれたコードを解析しやすくするようなツールはありませんか?
255デフォルトの名無しさん:2011/03/17(木) 15:26:37.51
>>254
プリンタ

ローテク侮りがたし
256デフォルトの名無しさん:2011/03/17(木) 15:56:19.95
>>254
lintかけて印刷
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回なんですが、アルゴリズムのチャート図や考え方を学んだ
だけでそのアルゴリズムをプログラムを組んで実現できるのは普通でしょうか?
本に乗ってるソートのプログラミングのサンプル例はどれも直線的な考えじゃ思い浮かばない
ような設定や、要領の良さがあります。

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

260デフォルトの名無しさん:2011/03/17(木) 17:39:38.41
書いてる人のレベルによるでしょ。
261デフォルトの名無しさん:2011/03/17(木) 17:43:12.68
mallocも変数
262デフォルトの名無しさん:2011/03/17(木) 17:52:10.99
>>258
Doxygen。Graphvizもあれば関数ツリーもできるし、結構解析には有効よ。
詳しくは該当スレで。
263デフォルトの名無しさん:2011/03/17(木) 17:53:12.77
解析するのに道具に頼るのはどうかと
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時間じゃ厳しくないか?
270デフォルトの名無しさん:2011/03/17(木) 19:20:37.38
見辛いのは書いた方にも問題があるかも知れない
271258:2011/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
普通に書いてあれば余裕で理解できる。

理解できないほどひどいのは書いた人も理解できない。
277デフォルトの名無しさん:2011/03/17(木) 20:55:12.08
自然に難読化した書き方してるみたいだよ
278デフォルトの名無しさん:2011/03/17(木) 21:05:00.86
プログラマー以外でプログラミングで食っていける方法ってありますか?
プログラミング好きなんですが頭の回転遅いんでプログラマーは無理かと。
回答者の職業教えてください。
279デフォルトの名無しさん:2011/03/17(木) 21:18:41.90
SEやってますがなにか。
280 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/17(木) 21:20:51.48
自作のアイポンアプリやAndroidアプリを売れば良いんじゃね
281デフォルトの名無しさん:2011/03/17(木) 21:22:29.45
>>279
年収いくら?
282デフォルトの名無しさん:2011/03/17(木) 21:37:10.99
>>278
40万円の教材を作るから買ってくれるかい?
5万円分くらいの仕事を発注することは保証するから

っていう商売にひっかかるなよ
283279:2011/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
高度なプログラム書いてるの?
286デフォルトの名無しさん:2011/03/17(木) 22:19:05.44
サーバー管理とかじゃねー
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一体何日かかるんだよ
290デフォルトの名無しさん:2011/03/17(木) 23:06:09.95
100時間って……一行あたり3秒もかけられ無いような
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
うるせー馬鹿
294279:2011/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なんとかは複雑すぎて、私には難しそうです。
入門以下ですいません…
299 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/18(金) 17:10:41.98
linux入れてターミナルでgccでa.outしとけ
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
引数の型が違う同名の関数を作れたような……?
304デフォルトの名無しさん:2011/03/18(金) 17:53:10.28
>>300
ヒント: printf
305デフォルトの名無しさん:2011/03/18(金) 17:53:23.91
>>301
http://homepage2.nifty.com/well/Template.html
「C++テンプレート」で検索をかけると、
こちらのサイトがヒットし、
自分のやりたい事と同じ内容でした。

ありがとうございました。
306謙虚フロンティア戦士:2011/03/18(金) 18:29:27.53
>>303
それシープラ
307デフォルトの名無しさん:2011/03/18(金) 18:34:31.62
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
310デフォルトの名無しさん:2011/03/18(金) 20:29:25.67
>>308
openモードが間違っている
ios::app で OR を取りましょう
311デフォルトの名無しさん:2011/03/18(金) 21:07:41.63
appで開くとシークが不可能になって、先頭にデータの個数を
出力できないと思うのですが・・・
312デフォルトの名無しさん:2011/03/18(金) 22:16:06.23
>>311
appは書き込みの時のみファイルの最後に自動的にシークされます
読み込みもしたいのならios::inもORしておけばよいです

問題のプログラムはios::ateでopenしているので、ファイルを開いた
後にファイルの最後にseekするようになっています

Jout.seekp(0, ios::end);

で、自分でファイルの最後にseekしてから書き込みしているので、
既に書いた部分の上書きはされないと思います
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/
316デフォルトの名無しさん:2011/03/19(土) 00:37:56.90
あと最後に一つだけ

ios::nocreateは非標準ですので、動作は環境依存なので使わない方が無難です
317デフォルトの名無しさん:2011/03/19(土) 01:08:16.69
C++で書かれたソースをCで書き直したいのですが、
ダブルコロンの置き換えがよく分かりません。

何の機能がCでは何に当たるのか、を調べる方法ありませんか。
318デフォルトの名無しさん:2011/03/19(土) 01:23:37.24
c++覚えたほうが早いんじゃね?
319デフォルトの名無しさん:2011/03/19(土) 01:40:18.03
>>317
当たるものはないよ
しいて言うなら命名規則で
アンダーバーやキャメル、プリフィックス、サフィックスなどで
工夫するぐらいしかない
CSTLなどありものの作法に倣うのが楽じゃないかな
320デフォルトの名無しさん:2011/03/19(土) 01:51:03.27
>>317
C++ の :: は名前空間
C で名前空間相当の処理を行う場合は接頭辞を使う
接頭辞というのは、gtk_init(), gtk_main() の様に先頭の数文字を同じ単語で揃える事
接頭辞とそれ以外の部分は _ で繋ぐ

つまり、C++ の foo::bar は C で接頭辞を使うと foo_bar になる

ただし std::vector を C で std_vector とした所でそのまま動く訳じゃないよ
std_vector というのは C には存在していないから、自分で実装する必要がある
自分で実装するのは面倒なので、C++ から一行ずつ置き換えるという考えはやめて、
ファイル単位で大体似た様な処理を一から書いて行った方が良いと思われ
321デフォルトの名無しさん:2011/03/19(土) 03:35:08.70
みなさんありがとう
322デフォルトの名無しさん:2011/03/19(土) 10:14:30.74
>>309
298です。
2ちゃんねる使うの初めてだから、これでいいのだろうか。
レスありがとうございます。
ダウンロードしてみます
323デフォルトの名無しさん:2011/03/19(土) 14:54:38.87
どういたしまして
324デフォルトの名無しさん:2011/03/19(土) 16:35:09.48
内部リンケージのグローバル変数を関数越しに値が変更できるのって変に思うんだけど普通?
325デフォルトの名無しさん:2011/03/19(土) 16:47:36.14
普通。
326デフォルトの名無しさん:2011/03/19(土) 17:06:24.75
そっか。
327313:2011/03/19(土) 17:16:03.23
313です
ちゃんと>>1を読んでいませんでした
本当に申し訳ないです
>>315さんの紹介してくださったスレで再度質問したいと思います
僕の質問に回答してくださった方、ありがとうございました
とても参考になりました
328 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/19(土) 19:22:15.64
内部リンケージのグローバル変数 = private変数
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; は * で値にすることができない

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

前置でない単項はないから安心しろ
こいつ冗長な形容で小難しく書き直しているだけで
話がほとんどピーマンだよ
333Perl忍者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

これよめば俺と互角にはりあえる   かもしれないぜ
334デフォルトの名無しさん:2011/03/20(日) 14:32:01.99
おまわりさんこっちです
335Perl忍者lvl2(善) ◆M5ZWRnXOj6 :2011/03/20(日) 14:33:09.78
散!!!
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
340デフォルトの名無しさん:2011/03/20(日) 19:44:37.66
C
341デフォルトの名無しさん:2011/03/20(日) 22:17:45.98
ポインタでつまづいてる初学者なんですけど、
勉強しながらある程度少しは実用的なプログラム習得できる書籍かサイトご存じでしょうか?

AmazonのC言語関連書籍一通り見ましたが、しっくりくるのがなかったので。
仕事はプログラミング全く関係ないです。
342デフォルトの名無しさん:2011/03/20(日) 22:42:16.28
ポインタの用法
第一ステップ:引数をポインタにして、関数で参照渡しに相当することが
出来るようになろう。
第二ステップ:malloc/freeで変数を動的に生成しよう。NULLの使い方も
学ぼう
第三ステップ:配列とポインタの意図的混同に関連する慣習を
学ぼう
第四ステップ:構造体のメンバにポインタを用いることにより
リストや木などの高度なデータ型を取り扱えるようになろう。
343デフォルトの名無しさん:2011/03/20(日) 23:20:32.19
第五ステップ:◆QZaw55cn4cのように皆に嫌われ者になろう。
344330:2011/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 もわからんとは。
348デフォルトの名無しさん:2011/03/21(月) 00:37:06.25
bitter smile
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() が管理する。
352デフォルトの名無しさん:2011/03/21(月) 07:33:33.33
Mr.マロック (うっうっうっううー)
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)A・・・前半起点マージ
B
void merge(center+1 last *A )C・・・後半起点マージ
}}
mainで呼び出した関数で中に二つの自分と同じ関数がある再帰構造を持ってます。
で良く分からないのですが
Cのcenterは、@、Aのcenterの値と一致するのでしょうか?(※まぁlastもなんですが置いときます。)
再帰関数だからA→□1→□2→・□n→・・→□2→□1→Bと戻ってきて次にCの作業
をするので、Cの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
よくわからんが
>Cのcenterは、@、Aのcenterの値と一致するのでしょうか?(※まぁlastもなんですが置いときます。)
一致する
>Cの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
367デフォルトの名無しさん:2011/03/21(月) 13:54:06.94
無駄な比較が多いな
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 ); // A・・・前半起点マージ
    // B
    void merge( center + 1, last, A ); // C・・・後半起点マージ
  }
}
だと仮定して
>Cのcenterは、@、Aのcenterの値と一致するのでしょうか?(※まぁlastもなんですが置いときます。)
一致します
>再帰関数だからA→□1→□2→・□n→・・→□2→□1→Bと戻ってきて次にCの作業
>をするので、Cのcenterの値は□1の部分の作業で設定されたcenterの値じゃないんでしょうか?
centerの型がstaticの場合、再起先と呼出元のcenterの値の格納先が同じ場所となり、
あなたの予想通り、値を上書きしてしまいますが、
今回の場合、staticは使用しないと考えられるので、再起先のcenterの値の格納先と
呼出元のcenterの値の格納先は異なる場所となるため、@・AはCと一致します。
369デフォルトの名無しさん:2011/03/21(月) 15:35:43.42



Mr.マロック (うっうっうっううー)




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);
  }
}
373デフォルトの名無しさん:2011/03/21(月) 21:35:03.39
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);でエラーがでているはずで、処理を止めることができるという感じに

これはまた違うのでしょうか、申し訳ないのですがが宜しくお願いします。
379デフォルトの名無しさん:2011/03/21(月) 21:56:42.71
っとすいません、if(error(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の返すアドレスというのは実質、文章の終わりまで置き換えが終わったかどうか確認するためだけに使うようなものなのでしょうか?
389デフォルトの名無しさん:2011/03/22(火) 00:42:09.06
他の使い方もあります。と言うか他の使い方の方がメイン
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の標準ストリームの
仕様の話になりそうな件
394デフォルトの名無しさん:2011/03/22(火) 10:23:33.38
関係ないよ。eof()を使うのがタコ。
int ch;
while ((ch = fgetc(f1)) != EOF) {
fputc(ch, tmp);
}
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にも対応しといてください。お願いします。
397デフォルトの名無しさん:2011/03/22(火) 11:22:52.75
99BASIC
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のマージソートって、図は判りやすくていいんだが、サンプルコードが微妙だな
406デフォルトの名無しさん:2011/03/22(火) 14:29:04.29
log16 = 4じゃないの?
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秒未満で終わるので、時間の差を取得することでは精度のいい計測ができません。
409デフォルトの名無しさん:2011/03/22(火) 17:23:27.66
おなじことを何度も繰り返してみる
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に戻す方法がありましたら是非教えてください。
417デフォルトの名無しさん:2011/03/23(水) 00:06:04.19
なんちゅうクソ仕様やで
418デフォルトの名無しさん:2011/03/23(水) 00:07:39.92
まぁCなんてオワコンだから仕方ないよ
419デフォルトの名無しさん:2011/03/23(水) 00:10:18.13
VCはC++ベースで書けるからね、いきなりエラーになったら、戸惑うかも...
420デフォルトの名無しさん:2011/03/23(水) 00:19:02.87
>>416
うろ覚えだけど、プロジェクトの設定で Microsoft 言語拡張機能 だったかな
421デフォルトの名無しさん:2011/03/23(水) 01:52:14.62
拡張子がcppだったというオチでは
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)とかよくわかりません。

429デフォルトの名無しさん:2011/03/23(水) 19:20:51.23
DirectXてそんないきなり手出すもんか?
430デフォルトの名無しさん:2011/03/23(水) 19:24:05.35
いきなり手を出せなんてかいてあったかいな?
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);
>    }
何をしたいか、良く分からんが、
取りあえず、無限ループするのは仕様に見えるが?
437デフォルトの名無しさん:2011/03/23(水) 21:31:54.61
a変化しないね
438デフォルトの名無しさん:2011/03/23(水) 22:12:47.27
genkey(s,t)は外部関数で、lk(t)は再帰呼び出しします。lk()から
genkey()は呼び出されます。再帰呼び出しのときに値を買えて計算
し直しているので全ての値に対してaが0でない関数がいつか見つか
るはずなのですがものすごく時間がかかります。また同じ値をハッシュ
関数に渡しているのに再帰呼び出しノアとに値が変わっているのは
なぜでしょうか?よろしくお願いします。
439デフォルトの名無しさん:2011/03/23(水) 22:26:04.85
genkey(s,t)はこれです。

http://codepad.org/wA3mHk7N
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
関数ポインタで困るってことは静的な値を使ってたりして、
呼び出し元毎にユニークにしたいのか?
だとすると、無理。(環境依存なら出来るかも知れんが)
まぁ、実装の方を工夫するべき。
464458:2011/03/24(木) 20:07:12.54
このような感じの処理を行う方法はあるでしょうか?
func2 = malloc(sizeof(func1));
memcpy(func2, func1, sizeof(func1));
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
無理です。
実装の方で工夫して下さい。
477デフォルトの名無しさん:2011/03/24(木) 20:26:36.63
>>476
ありがとうございます。
否定されると、返って開き直れます。

C++と同じI/Fを提供する手立てがないかと探していましたが、
別の道を探ってみます。
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()で文字列を受け取っても多分バグ?りますよね?
499デフォルトの名無しさん:2011/03/25(金) 00:36:17.77
fgetsとか
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) を回避してまでそう書くことの優位性はない
505デフォルトの名無しさん:2011/03/25(金) 17:17:19.24
>>504
d
506デフォルトの名無しさん:2011/03/25(金) 19:20:35.48
秘密鍵に32バイトの認証ハッシュ値をつけて、アクセス時にパスワードで
認証する機能をつけたいのですがうまくいきません。秘密鍵の計算方法が
正しいかどうかもわからないので公開します。lkbを呼び出すとループの
値が0にリセットされて無限ループになります。機能は動いたはずなのに
今朝動かしたら動かなくなっていました。下にソースのアドレスを書きます。
わかる人がいたらよろしくお願いします。

http://codepad.org/55oSSY2H

507デフォルトの名無しさん:2011/03/25(金) 19:55:31.95
codepadめちゃくちゃ重いな
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に変えて、別関数にしたら動いた
と思ったんですけど、今朝見たら動かなかったんです。
514デフォルトの名無しさん:2011/03/25(金) 21:14:30.59
マルチうざい
515デフォルトの名無しさん:2011/03/25(金) 21:21:55.66
>>509
おまえ &*(int *)0 を「やっちゃ駄目」だと思ってるだろw
516Perl忍者lvl2 ◇M5ZWRnXOj6:2011/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の何が駄目なのか分かってないことは分かった
521デフォルトの名無しさん:2011/03/25(金) 23:07:35.23
バッカー
522謙虚フロンティア戦士:2011/03/26(土) 09:57:35.24
おちんちんびろーん
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
同じ事を質問してる人いたけどよく分からん単語ばっかり言ってて参考にもならねぇわ…(´・ω・)
525デフォルトの名無しさん:2011/03/26(土) 23:24:12.96
どれかのcppに
int Player1; 書いて
ヘッダーには
extern int Player1;
書く
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
●のところが文字列を置き換える処理らしいんだけど、
これ何?アドレスの足し算、引き算してんの?
教えてください。エロい人さん。
535デフォルトの名無しさん:2011/03/28(月) 02:46:45.01
クソコードだなw
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'}なときもバグるんじゃないのかな
538デフォルトの名無しさん:2011/03/28(月) 03:04:40.91
一行に複数あっても変換されるのは最初だけ
539デフォルトの名無しさん:2011/03/28(月) 07:56:10.52
>>537
それはない
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言語はいいですか?
546デフォルトの名無しさん:2011/03/28(月) 13:16:00.85
まずは日本語から勉強してください
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言語あきらめた方が良い。
554デフォルトの名無しさん:2011/03/28(月) 17:07:45.25
質問スレで上から目線わろち
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
副作用完了点の取り扱いが間違ってるなら分かるけど怪しいって何?
558デフォルトの名無しさん:2011/03/28(月) 17:31:54.20
誤字脱字で初心者を惑わすクソ書籍とかもあるしな
559デフォルトの名無しさん:2011/03/28(月) 17:34:57.61
>>557
間違いと正解の混在。 一番たちが悪い
560デフォルトの名無しさん:2011/03/28(月) 17:37:41.81
この1冊またはこのサイトっていうのありませんか?
自薦自演OKです
ダメだったら袋叩きにします
561デフォルトの名無しさん:2011/03/28(月) 17:50:33.74
562 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/28(月) 18:47:28.28
C実践プログラミングでLinuxでターミナルでviでgccでa.outするのがベスト
563デフォルトの名無しさん:2011/03/28(月) 19:14:52.29
逆境に耐えきれるかどうかが非情なふるい分けなんだが
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に対する突っ込みは無しでつか?
いや、構文としては間違ってないけどね…
569デフォルトの名無しさん:2011/03/28(月) 19:47:08.80
まだ「でつ」とか使ってるやついるんだw
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は加算する点数ようの引数なので返す必要ないとおもって返してないのですが
572デフォルトの名無しさん:2011/03/28(月) 19:50:26.12
>>570
暇も何もソースみたら一目瞭然だろ
つーか、こんなんで暇だねって言われたら
( ´∀`) <オマエモナー
573デフォルトの名無しさん:2011/03/28(月) 19:52:22.81
現役に憧れてる子なんだからわかってあげなよ
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
580 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/28(月) 20:07:27.86
rubyだとそういうやり方できるね
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の内容を確かめてみると良い
582524:2011/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
586デフォルトの名無しさん:2011/03/28(月) 22:55:19.91
>>583
漢は黙ってPCRE
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
ここの先輩方なら初心者に正しい入門サイトを作れると思うのですが私は間違っていますか?
593デフォルトの名無しさん:2011/03/28(月) 23:28:05.10
作ろうと思ったが一日目で嫌になった
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;
}
となって、タイピング量が減って楽になるという理由でしょうけど、個人的に、マクロによってタイピング量をラクする、こういうコードを好んで書く人は、
ちょっと思慮が浅いと思います。というか、センスが良くないと思います。
595594:2011/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
一度覚えちゃうと初心者向けに系統立って解説するって普通の人にはかなり苦痛
きっと使えると説明できるって異なる能力なんだろうね
597594:2011/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 がすぐ近くにあるけど、実際のコードでは数百行の彼方に記述されてるかもしれません。 それでも簡単に気づけますか?
こういう「コンパイル通る類のバグ」は本当に厄介だと思います。気づきづらい。
ましてや他人の書いた膨大なコード中だと、尚更気づきづらいでしょう。)
598デフォルトの名無しさん:2011/03/28(月) 23:50:00.97
構造体をtypedef使わずに、マクロ使うヤツがタコなだけ
599594:2011/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
あっ、型名じゃなくて、変数名を省略したのか。
んじゃ、最初から、命名規則に則った短い名前を付けましょう。
以上
603デフォルトの名無しさん:2011/03/29(火) 00:07:35.55
なんだ、単なるドライベントだったのかw
604デフォルトの名無しさん:2011/03/29(火) 00:14:54.24
俺もそれなりのオチを期待してずっこかされた
こんにゃろう
605デフォルトの名無しさん:2011/03/29(火) 00:57:40.57
Javaで質問なんでsが、System.out.println("変数aの値は" + a + "です。 ");
とあったのですが、+ a + とはどういう意味ですか?
606デフォルトの名無しさん:2011/03/29(火) 01:08:36.46
C言語なら俺に聞け(入門編)Part 80
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を使う場面
615デフォルトの名無しさん:2011/03/29(火) 05:45:07.90
switch文はなんかかわいいから使う
616デフォルトの名無しさん:2011/03/29(火) 07:24:00.50
「ちょっとまて。その分岐は本当に必要か?」
617デフォルトの名無しさん:2011/03/29(火) 07:37:23.53
「そんな分岐でだいじょぶか?」
618デフォルトの名無しさん:2011/03/29(火) 08:08:42.02
いつのネタだよ
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から入った方がいいかもしれない。
まぁ、そんな質問をしている段階でどうせ無理だと思うが。
623607:2011/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
626607:2011/03/29(火) 11:57:29.02
>>624
mark = getchar()を先にするのは昨日やってみました。
するとちゃんと+などを打っても、
else{
printf("対応してる計算式を入力してください。\n");
printf("もう一度始めからやり直してください。\n");
}
の部分へ行ってしまいます。

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

>>626
定義じゃなくて宣言でしたorz
628607:2011/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`)
631607:2011/03/29(火) 12:10:22.99
>>628
やってみましたが>>628と同じ処理になってしまいました。

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

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

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

ありがとございました
634デフォルトの名無しさん:2011/03/29(火) 14:53:37.99
だからscanf()なんか使わずにfgets()+sscanf()にしろとあれほど……
635デフォルトの名無しさん:2011/03/29(火) 16:52:50.78
1日から内定先で働くのに何にも打てねぇ
先輩に殺されるかも・・・・・・・・・・・・・・・・・・
636デフォルトの名無しさん:2011/03/29(火) 18:29:47.11
www
637デフォルトの名無しさん:2011/03/29(火) 18:31:44.07
すまん!教えてください!BCCとVC++ってどっちが使われてるんですか?
会社でよく使われてるほうのコンパイラを使って勉強したいです!
638 ◆QZaw55cn4c :2011/03/29(火) 18:37:07.03
>>637
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なら、直接アドレスにスッ飛ばすからンなもんいらねえのに
650デフォルトの名無しさん:2011/03/29(火) 21:19:37.23
if() pf=f1; else pf=f2; // ゴメンナサイ if つこてました
651デフォルトの名無しさん:2011/03/29(火) 21:23:25.68
pf=test=='+'?f0:(test=='-'?f1:(test==…)))))); // いいえ使ってません!
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がバッファになる事もある
674デフォルトの名無しさん:2011/03/30(水) 03:11:39.85
バッファは半導体ですか?
675デフォルトの名無しさん:2011/03/30(水) 03:13:45.94
>>673
HDDやSSDがバッファになる事もある

仮想メモリのことですか?
676デフォルトの名無しさん:2011/03/30(水) 03:21:01.51
PowerPCは例外を受けたときに飛ばすアドレスが完璧に決まっているので
単純にテーブルを置いておけばよい。
677デフォルトの名無しさん:2011/03/30(水) 03:23:07.32
a

まあいいや
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         どっかのパソコン


この○○ってプログラムには、実際のところ、パールをつかったり、ジャバーをつかったり、シーをつかったり、それは何を使ってもいいってことなのかもしれない。って思う。
よくしらねーけど。
681デフォルトの名無しさん:2011/03/30(水) 07:38:25.69
Ring Bufferとかを調べませう
682デフォルトの名無しさん:2011/03/30(水) 08:51:31.23
うん
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
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言語の勉強をする前に挫折しそう。
696デフォルトの名無しさん:2011/03/30(水) 16:49:01.36
すいません。質問です。
mac os xで、c言語をやろうと思っています。
設定を、できません。
ターミナルに、gccとうつと、i686-apple-darwin10-gcc-4.2.1: no input filesと、
でます。
どのように、変えたらよいでしょうか/
697デフォルトの名無しさん:2011/03/30(水) 16:54:43.19
gcc に続けてファイル名を打つとよいです
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 ができる
701デフォルトの名無しさん:2011/03/30(水) 17:39:23.78
>>698
自分linux(ubuntu10.10)なのでマックよくしらないけど、ギーシーシーならわかる〜〜

たとえば sample.c ってのをコンパイルしたければ、
コンパイル後の名前(実行形式の名前)を考えます。 とりあえず aaa でいいです。

gcc -o 実行形式の名前  ソースファイル1.c  ソースファイル2.c  ソースファイル3.c ................................

だから、sample.c をこんぱいるしたければ

gcc -o aaa sample.c

とすればいいです。たぶん。



あと、ライブラリーってのが必要な場合は、(たとえば #include <math.h> とかしたなら)
gcc -o aaa sample.c -lm
ってやります。 -lm

これは、たぶん libm.so とかなのだけど、この lib のところを取った名前を -l に続けて書く作法みたい。だから -lm

だから libaaa.so なら -laaa になるみたい。
マックントッシュは持ってないんで、もしかしたらルールが違うかもしれないけど。よくしらない。

余談:
gcc -o sample.c ってやると、たぶん、sample.cのファイルが破壊されてるかもしれません。(中身がぐちゃぐちゃになったり、消えてたり、なんか変になってるかもしれない)
702デフォルトの名無しさん:2011/03/30(水) 17:51:09.50
ありがとうございます
できました!


ooguma-katsuki-no-MacBook:programs 12we56ty$ gcc sample2.c
ooguma-katsuki-no-MacBook:programs 12we56ty$ ./a.out
Hello World!\nooguma-katsuki-no-MacBook:programs 12we56ty$


ooguma-katsuki-no-MacBook:programs 12we56ty$ gcc -o sample2 sample2.c
ooguma-katsuki-no-MacBook:programs 12we56ty$ ./a.out
Hello World!\nooguma-katsuki-no-MacBook:programs 12we56ty$

ありがとうございましたm(_ _)m


703デフォルトの名無しさん:2011/03/30(水) 17:52:51.88
> ooguma-katsuki-no-MacBook:programs 12we56ty$ gcc -o sample2 sample2.c
なら
./a.out
ではなく
./sample2
とすべき
704デフォルトの名無しさん:2011/03/30(水) 18:18:45.98
ありがとうございます
勉強になります
705690:2011/03/30(水) 19:38:35.10
>>691
環境はMinGWです。
706 ◆QZaw55cn4c :2011/03/30(水) 19:38:50.02
>>676
調べてみましたが、256バイトまでのハンドラを配置し、割り込みでは、そのハンドラが直接コールされる仕組みなんですね。
256 バイトを超えるようであれば別途工夫が必要なようですね。割り込みは何種類まで設定できるのでしょうか?

8086 はたしか 128種だったかな?
707デフォルトの名無しさん:2011/03/30(水) 19:49:00.39
>>705
freopen("con", "r", stdin);
708デフォルトの名無しさん:2011/03/30(水) 20:09:43.75
あのVC++ってダウンロードサイズいくつか分かりませんか?
21時から速度規制がありましてテレホーダイ時代の速度になってしまうのですよ
709690:2011/03/30(水) 20:14:05.59
だめです。止まりません。次のように使いたいです。
ファイルPの中身
53585524541702942078802276995470987148022575395067806084418252847286965358370
66374938992110997276702207311816358295672473702142926007886483976217087914527
1
です。4番目の変数に値を初期化するのに、手で入力したいのですが
止まりませんでした。
freopen("con","r",stdin);
とやると、鍵が短すぎますというエラーが出て終わってしまいました。
どうすればファイルリダイレクトの跡に主導入力できるかわかりません。
よろしくお願いします。
710デフォルトの名無しさん:2011/03/30(水) 20:22:40.37
>>709
説明する気あんのかよ
何もかもがダメだから諦めたら?
711690:2011/03/30(水) 20:32:02.06
説明不足でした。Pの中身は709に書いたとおりです。プログラムa.exeに
a.exe < Pのようにしてファイルを読み込ませます。
このとき3つの値が初期化されますが、a.exeには4番目の変数があり、
それだけを手動で入力させたいのです。4番目の変数はパスワードなので
ファイルPを受け取った本人が設定しなければなりません。ファイルに
書き込むという手もありますがなんだか違う気がします。パスワードは
長さ9文字以上です。しかしファイルには3つの値しか存在しないにも
かかわらず、プログラムは4番目の変数を初期化しないまま終了して
しまいます。これではパスワードは設定できません。この状況を
何とかしたいです。お手数おかけしますがもう少しわかりやすく説明
してくれると助かります。よろしくお願いします。
712デフォルトの名無しさん:2011/03/30(水) 20:34:25.60
先に打ち込めば
713デフォルトの名無しさん:2011/03/30(水) 20:35:22.99
>>711
分かりやすく言うと、うまくいくはずなのにダメだってことはあなたのやり方がマズイ
今どうやっているのかソースコードを出さないとどこが悪いか分からないよ

ってこと
714デフォルトの名無しさん:2011/03/30(水) 20:37:19.17
リダイレクトでファイルを読むのをやめろ
715690:2011/03/30(水) 20:39:21.54
手動入力からファイル入力への切り替え方法がわかりません。
716デフォルトの名無しさん:2011/03/30(水) 20:41:18.48
手動入力したいときはstdinを使って、ファイルから入力したいときはそのファイルfopenしたfp使えばいいだろ
717デフォルトの名無しさん:2011/03/30(水) 20:44:10.22
書けるけど、読めません(わかりません)って人が増えてきてるね。
718690:2011/03/30(水) 20:55:45.23
パスワードだけ引数で読み込むようにしました。
質問に付き合ってくれた方々、ありがとうございました。
719 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/30(水) 21:03:26.14
途中でstdinをファイルからキーボードに切り替えられないのか
720デフォルトの名無しさん:2011/03/30(水) 21:04:34.90
>>719
切り替えできるよ
721690:2011/03/30(水) 21:06:04.90
どうやるのか知りたいです。
722デフォルトの名無しさん:2011/03/30(水) 21:07:30.16
freopen 使ってどうやったらうまくいかないのか分からん
723690:2011/03/30(水) 21:17:51.26
使い方がよくわからなかったのです。
ググってもファイル入出力がどうとか書いてあって、リダイレクトからの
切り替えに関してはさっぱりでした。
724 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/30(水) 21:21:04.91
だめだにゃあ。。

// test.c
#include <stdio.h>

int main(void)
{
  int ax; int ay; int az;
  int bx; int by; int bz;

  scanf("%d", &ax); scanf("%d", &ay); scanf("%d", &az);
  freopen("con", "r", stdin);
  scanf("%d", &bx); scanf("%d", &by); scanf("%d", &bz);
  printf("ax:%d, ay:%d, az:%d\n", ax, ay, az);
  printf("bx:%d, by:%d, bz:%d\n", bx, by, bz);

  return 0;
}

// text
100
200
300
//

$ ./a.exe < text
ax:100, ay:200, az:300
bx:1628704768, by:47, bz:1628883074
725690:2011/03/30(水) 21:27:54.46
すごいですね、そうなりますね。
726690:2011/03/30(水) 21:31:21.49
conって何ですか?
727 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/30(水) 21:33:21.49
知らん。ネットで出てきた。コンソールということらしい。
728 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/30(水) 21:37:14.19
ああ、freopen( "/dev/tty", "r", stdin ); に変えたらうまくいったわ
729690:2011/03/30(水) 21:43:18.02
conでもうまくいきますよ
730デフォルトの名無しさん:2011/03/30(水) 21:51:00.90
>>717
俺オナニー好きだからその傾向にあるわ
731デフォルトの名無しさん:2011/03/30(水) 21:55:23.29
リダイレクトなんかに拘らず、ファイルを読んでしまえばいい。
4項目目のデータが何か特別な文字列なら、
標準入力から入力するようにすれば良い。
732690:2011/03/30(水) 21:58:49.48
一行ずる整数のデータ(アスキー)を読むってできますか?
fgetsだとうまくいかないんですけど。後ファイル名も決まってないから。
メールで鍵交換するソフトなんです。
733デフォルトの名無しさん:2011/03/30(水) 22:00:55.98
なんだ鍵の人か
734デフォルトの名無しさん:2011/03/30(水) 22:03:04.60
鍵の人キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
735デフォルトの名無しさん:2011/03/30(水) 22:03:23.88
コイツ何人だよ
日本語おかしすぎだろ
736690:2011/03/30(水) 22:10:36.35
だめならいいですけど・・・
737デフォルトの名無しさん:2011/03/30(水) 22:18:36.48
>>678みたいな人を甘やかしてると第2 第3の鍵の人が誕生すると思う
738デフォルトの名無しさん:2011/03/30(水) 22:23:12.55
鍵の人はウザコテに似てるから
例のスレで2人でよろしくやってくれれば
自分の欠点が見えるようになるんじゃないかな
739デフォルトの名無しさん:2011/03/30(水) 22:39:22.02
>>736
モリタポ払っても良いって言ってみな
誰かが名乗り出てくれるかも
740デフォルトの名無しさん:2011/03/30(水) 23:34:49.39
プログラミング作法って本に定数マクロは#defineじゃなくてenum使えって書いてあるけど、
配列の添え字に使っても問題ないのかな
まあカーニハン先生がOKって言ってるから、いいんだろうけど
741デフォルトの名無しさん:2011/03/30(水) 23:42:10.93
DLLを作成したいのですがコンパイルできません
どなたか助けてください

include <stdio.h>

function text() {
return "Hello world!!";
}
742デフォルトの名無しさん:2011/03/30(水) 23:46:29.34
>>739
モリタポじゃなくて俺の糞ならいくらでもあげますけど
743デフォルトの名無しさん:2011/03/30(水) 23:47:57.63
>>741
お前は一体なに言語を書こうとしてるんだ
744デフォルトの名無しさん:2011/03/30(水) 23:53:01.68
>>742
何れもらうかも知れない。
それまで大事に取って置いてくれ。
745デフォルトの名無しさん:2011/03/31(木) 00:18:06.21
モリタポわからないので、BitCash(セブンイレブンのコピー機で売ってるウェブマネー)に対応してほしい。
746デフォルトの名無しさん:2011/03/31(木) 00:20:27.04
enumは初心者向きの書き方だからでしょ
747デフォルトの名無しさん:2011/03/31(木) 00:21:54.78
>>741 JavaScriptでDLLは作れません
748デフォルトの名無しさん:2011/03/31(木) 00:23:16.85
>>740
enumは最終的にint型になるからおk
749デフォルトの名無しさん:2011/03/31(木) 01:10:31.04
>>746
え?
750デフォルトの名無しさん:2011/03/31(木) 01:13:16.61
#define
を使えない人が多かったから
enum
が出来たんですけど
751デフォルトの名無しさん:2011/03/31(木) 01:26:49.21
#defineってただの置き換えマクロじゃないの?
752デフォルトの名無しさん:2011/03/31(木) 01:27:27.36
>>750
なるほど、老害の武勇伝か
753デフォルトの名無しさん:2011/03/31(木) 01:36:58.82
enumって、勝手にintに拡張されるから、好きじゃないんだけど
754デフォルトの名無しさん:2011/03/31(木) 01:39:00.69
ふーん、#defineはどうなの?
755デフォルトの名無しさん:2011/03/31(木) 01:40:55.88
最近のは調べたことないので、わからん
756デフォルトの名無しさん:2011/03/31(木) 01:44:32.06
昔、口先の知ったかが
enumを使え
とか言ってたからかもしれん
757デフォルトの名無しさん:2011/03/31(木) 02:02:23.66
そいつの書いた短いコード見たけど、センスのかけらもなかったな
758デフォルトの名無しさん:2011/03/31(木) 02:37:57.30
#define に整数拡張がどうたらとかあるわけねえだろ
759デフォルトの名無しさん:2011/03/31(木) 03:08:18.43
宿題片付けますスレ147がたたないのでここで質問します。

任意の5ケタの整数(int型)を入力し、その整数を二乗した数の下5ケタを
始め、以降二乗された数の下5ケタの二乗を計算していく作業を再帰的に
行い一回の作業ごとに下5ケタの数を表示していくプログラムを作れ。



できるだけ簡単なプログラムでお願いします。
760デフォルトの名無しさん:2011/03/31(木) 03:27:20.86
>>759
その言い訳はいらないので自分でスレぐらい立ててください
761デフォルトの名無しさん:2011/03/31(木) 03:44:23.29
>>760
お願いします。
762デフォルトの名無しさん:2011/03/31(木) 03:55:12.35
>>759

#include <stdio.h>

f(a)
long long a;
{
a = (a * a) % 100000;
printf("%lld\n", a);
f(a);
}

main()
{
char s[123];
f(atoi(gets(s)));
}

スタックオーバーフローするのですがどうするばいいでるた?
763デフォルトの名無しさん:2011/03/31(木) 03:57:54.49
>>762
&
764デフォルトの名無しさん:2011/03/31(木) 04:05:49.54
aがゼロ以下?になったら、止めんと
765デフォルトの名無しさん:2011/03/31(木) 04:32:37.41
>>762
できるだけ簡単なプログラムでお願いします。
下5ケタの中に0が現れたら再起崩壊という事でお願いします。
766デフォルトの名無しさん:2011/03/31(木) 04:44:07.79
そもそも問題文おかしいだろ
時々いるんだよな日本語できないヤツ
767デフォルトの名無しさん:2011/03/31(木) 04:46:41.69
終了条件がわからんと終わらん
768デフォルトの名無しさん:2011/03/31(木) 04:51:31.29
なんで再帰すんの?
769デフォルトの名無しさん:2011/03/31(木) 05:02:18.47
>>765

#include <stdio.h>

static int b[100000];

f(long long a)
{
a = (a * a) % 100000;
if(b[a]++ == 0) {
printf("%lld\n", a);
f(a);
}
}

main()
{
char s[123];
f(atoi(gets(s)));
}

0がでたらとかワケわかんないんで、
循環したら再起崩壊という事でがんばってみました。
770デフォルトの名無しさん:2011/03/31(木) 05:19:10.12
static int b[100000];
これってメモリとか大丈夫なのかな?
俺みたいな素人には良く解らんけども
771デフォルトの名無しさん:2011/03/31(木) 05:34:20.04
Intが4byteだから100000だと400kbyteかな?
たいしたことないか
772デフォルトの名無しさん:2011/03/31(木) 06:35:55.77
>>768
概念的に再起。日本語でうまく説明できないし。

プログラム的には再起構造じゃなくてもできるかな。
773デフォルトの名無しさん:2011/03/31(木) 06:43:28.33
>>769
すげーな・・・
必ず条件満たして終了する件。
774デフォルトの名無しさん:2011/03/31(木) 06:54:49.02
時々
3ケタや4ケタの数字出てくるんだけど0が省略されてるのかな?
775デフォルトの名無しさん:2011/03/31(木) 07:12:48.88
%lldのおかげじゃね?

>>772
そういうとこちゃんと出題者に聞かないと駄目じゃん
776デフォルトの名無しさん:2011/03/31(木) 09:46:44.72
CとJava両方を両立して勉強するのは効率悪いですか?
どっちかを1年頑張ってからもう片方を学ぶほうがいいですか?
777デフォルトの名無しさん:2011/03/31(木) 11:00:16.96
>>776
おまえさん次第だね
C と他の言語を並行でやると、ともすると似て非なるところを混同しがちだが
そのあたり「今は C の話」「これは Java の話」ときっちり区別できる人かどうかによるし
C でも Java でもできる積集合にしか関心を持たなくなるのが一番問題だ

1年は長すぎるかも知れないが、片方ずつというのは無難かも
778デフォルトの名無しさん:2011/03/31(木) 11:04:05.22
ありがとうございます
どっちが学習期間が短いですか?なるべき短いほうから学習したいえうs
779デフォルトの名無しさん:2011/03/31(木) 11:04:51.46
×学習したいえうs
○学習したいです

すいませんあまりにも良い回答に興奮して誤字打ってしまいました
780デフォルトの名無しさん:2011/03/31(木) 11:12:56.55
そりゃ C でしょ
身軽さが売りの言語だかんね
781デフォルトの名無しさん:2011/03/31(木) 11:13:47.66
>>777
切り番おめ
782デフォルトの名無しさん:2011/03/31(木) 12:14:48.23
Cすらまともに理解できない俺じゃ他の言語はムリか・・・
1年頑張れば何とか理解できるかなぁ
783デフォルトの名無しさん:2011/03/31(木) 12:41:28.07
> Cすらまともに

これは相性があるから C がダメでもあきらめることはない
784デフォルトの名無しさん:2011/03/31(木) 12:54:20.02
Cは出来ないけどPHPの某有名オープンソースの開発に関わってる俺みたいなのもいるしな
785デフォルトの名無しさん:2011/03/31(木) 13:02:10.87
>>778
実際には言語以外の要素も小さくは無い。
特にCは言語としては未定義にしてあるところがいっぱい有る。
まともなソフトウェアを作ろうと思うと各OSのAPIとかに頼ることになる。
アーキテクチャ依存、処理系依存の要素も考慮するとCがJavaより楽とは言えない。
言語だけで言えばCの方が学習期間は短いと言えると思うが…。
786デフォルトの名無しさん:2011/03/31(木) 13:18:35.35
n=6,r=3と入力されて
111000
110100
110010
110001
101100
101010
101001
100110
100101
100011
011100
011010
011001
010110
010101
010011
001110
001101
001011
000111
こんなのを出力するプログラムを言語なんでもいいのでideoneか何かに書いてください。
再起処理だと思うんだけど苦手で。丸投げで悪いけどすぐ実行結果だけ使いたいので。
787デフォルトの名無しさん:2011/03/31(木) 13:24:03.75
(道路の)穴埋めで、残り資材がr個として、埋めるということだ。
788デフォルトの名無しさん:2011/03/31(木) 13:29:16.85
http://ideone.com/3Cf1O
書いてみたけどちょっと出力の順番が違ったか・・・まぁディスプレイを180度回転して見てやってくれ
789デフォルトの名無しさん:2011/03/31(木) 13:37:54.99
それはnが32にくらいになると、解は少なくても実行が終わらなくならないか。
790デフォルトの名無しさん:2011/03/31(木) 13:39:00.69
あと再帰を使うのも30段くらい行くとスタックオーバーフローの可能性。
全数や再帰を使わないのがいいんでは?
791デフォルトの名無しさん:2011/03/31(木) 13:40:39.90
コンソールプログラムで

char time = "2000年3月09日 14時02分01秒";

これの1時間36分35秒後の日時に直す方法を教えてください
792デフォルトの名無しさん:2011/03/31(木) 13:45:19.93
char time = "2000年3月09日 14時02分01秒の1時間36分35秒後";
793デフォルトの名無しさん:2011/03/31(木) 13:46:04.30
>>791
方法。
たとえば1970年1月1日0時0分0秒を基準として0から初めて、その10000秒後の日時を求めるプログラムを作る。
そしたら簡単だ。
794デフォルトの名無しさん:2011/03/31(木) 13:50:57.91
文字列リテラルがメモリの 0x00 - 0xff 番地にないとまずいかもな
795デフォルトの名無しさん:2011/03/31(木) 14:16:40.78
796デフォルトの名無しさん:2011/03/31(木) 14:34:02.16
BOOL Func(Pram_a,Pram_b,Pram_c);

関数呼び出しの前に、関数の戻り値を指定して呼び出しているソースを見付けたのですが、
これはどんな意味があるのでしょうか?
通常は省略しているのが一般的だと思いますが。
797デフォルトの名無しさん:2011/03/31(木) 14:39:56.02
単にプロトタイプ宣言が
関数のスコープ内にあったという話ではないの? (Param_a Param_b Param_c は型名)
798デフォルトの名無しさん:2011/03/31(木) 14:42:23.61
プロトタイプ宣言
799デフォルトの名無しさん:2011/03/31(木) 14:43:25.72
>>786のn=100 r=20が出来るやつはいないのか。
800796:2011/03/31(木) 14:46:10.61
すいません、間違ってました。

BOOL Func( 型名 Pram_a, 型名 Pram_b,型名 Pram_c)
{
if( Func1())
{
}

if( Func2())
{
}
}

という様な感じで続いていますので、
プロトタイプ宣言ではないと思います。
801デフォルトの名無しさん:2011/03/31(木) 14:50:53.48
>>796
それは呼び出しではなくプロトタイプ宣言です。
802デフォルトの名無しさん:2011/03/31(木) 14:52:12.92
>>800
それは関数定義です。
803デフォルトの名無しさん:2011/03/31(木) 14:53:00.00
>>800
Func を呼び出していないな
804デフォルトの名無しさん:2011/03/31(木) 14:53:41.67
>>799
こんなん誰でも出来んだろ
805デフォルトの名無しさん:2011/03/31(木) 14:53:54.09
>>800
お前さんは
int main()
{
...
}
とか書いたことは無いのか?
806デフォルトの名無しさん:2011/03/31(木) 14:57:40.85
>>786のプログラム貼り付けて。
807デフォルトの名無しさん:2011/03/31(木) 15:09:36.43
>>788
おかげで数学の検算ができた。感謝してる!
808デフォルトの名無しさん:2011/03/31(木) 15:27:50.70
   ___
  / || ̄ ̄||   ∧∧
  |  ||__||  (   )   逆に考えるんだ、回転してるなら
  | ̄ ̄\三⊂/ ̄ ̄ ̄/
  |    | ( ./     /

   ___    ゴキッ
  / || ̄ ̄|| <⌒ヽ ))   自分の首を回転させればいいと!
  |  ||__|| <  丿
  | ̄ ̄\三⊂/ ̄ ̄ ̄/
  |    | ( ./     /
809デフォルトの名無しさん:2011/03/31(木) 15:35:31.24
>>795
お前天才だな俺もトライしたが書けなかった
810デフォルトの名無しさん:2011/03/31(木) 15:36:25.87
インクルードでstdio.hとか○○.hっていうのはどういう時にどれどれを読み込むかって言うのはどうやって分かってるのですか?
811デフォルトの名無しさん:2011/03/31(木) 15:37:18.83
立った

C/C++の宿題片付けます 147代目
http://hibari.2ch.net/test/read.cgi/tech/1301553333/
812デフォルトの名無しさん:2011/03/31(木) 15:40:21.82
使おうとしてる関数のリファレンスに何々をインクルードしてね と書いてある


が、手が勝手にタイプしてることが多い stdio.h と stdlib.h
813デフォルトの名無しさん:2011/03/31(木) 16:07:45.56
>>786
>>806
例題の通り素直に書いた。

http://ideone.com/upV03
814デフォルトの名無しさん:2011/03/31(木) 16:14:26.92
>>812
すいません関数のリファレンスってどこのサイトにあるのですか?自分で調べます
815デフォルトの名無しさん:2011/03/31(木) 16:15:19.03
>>814
例えばVC++2010ならこのへんを見て
http://msdn.microsoft.com/ja-jp/library/634ca0c2.aspx
使いたい関数のページを開いて
http://msdn.microsoft.com/ja-jp/library/wc7014hz.aspx
下の方にスクロールすると必要条件のところに <stdio.h> とか書いてある
816デフォルトの名無しさん:2011/03/31(木) 16:27:08.62
>>814
その関数の作者が発信している情報
標準関数なら ISO や JIS の規格票(書店か日本規格協会から取り寄せる)

特定のコンパイラで通るかどうかは信じないほうがいい
stdlib.h で memcpy が使えたり、標準ぽい関数が実は非標準というのがよくある
817 忍法帖【Lv=16,xxxPT】 :2011/03/31(木) 16:57:23.93
ttt
818デフォルトの名無しさん:2011/03/31(木) 18:07:23.30
APIなどのプログラムコードを全く必要とせず、純粋にC言語のみで組める
ゲーム製作環境ってありますか?
819デフォルトの名無しさん:2011/03/31(木) 18:09:10.46
白黒のオセロとか、テキストのRPGとか。
820デフォルトの名無しさん:2011/03/31(木) 18:16:12.32
CGIでブラウザゲームとか
821デフォルトの名無しさん:2011/03/31(木) 18:19:28.44
>>820
ブラウザならhtmlやらないとダメなのでは?

ChromeでCだけで何か作れませんかね。
822デフォルトの名無しさん:2011/03/31(木) 18:26:10.87
>>818
ヒント: ゲームブック
823デフォルトの名無しさん:2011/03/31(木) 18:28:16.78
純粋なC言語といったら開発環境は関係ない件
824デフォルトの名無しさん:2011/03/31(木) 18:30:27.92
apiなど便利なツールは使っていいだろ。なぜ使わないんだ。
標準化されている部分だけでは、テキスト以外に画面へ出力できないわけだが。
825デフォルトの名無しさん:2011/03/31(木) 18:36:07.53
画面に描画する機能ってあまり聞かないと思ってたら標準じゃなかったのか
826デフォルトの名無しさん:2011/03/31(木) 18:41:40.33
NTLという演算ライブラリを使って開発しています。GCCでコンパイル
するときはg++ -O2 -I /include a.cpp ntl.a でエラーなしで
コンパイルできるのにVisual Studioのコマンドプロンプトから
cl /O2 a.cpp ntl.a とやると13個の未参照のシンボルエラーが
出てきます。なぜなのでしょうか?配布にはなるべくアプリケーション
単体で配布したいので余計なDLLは入れたくありません。どうすれば
解決できるでしょうか?よろしくお願いします。
827デフォルトの名無しさん:2011/03/31(木) 18:42:46.21
>>824
APIコードがC言語で代替できてるような環境ないですかね?
828デフォルトの名無しさん:2011/03/31(木) 18:50:42.78
>>826
gcc の .a って Visual Studio で読めるの? Visual Studio のライブラリって .lib じゃなかったっけ
829デフォルトの名無しさん:2011/03/31(木) 18:54:45.47
>>826
気にするな。DLL同封しろ。
たいしたことではない。
インポートライブラリは、開発環境ごとにいる。
830デフォルトの名無しさん:2011/03/31(木) 18:55:32.23
APIコードって何のこと?
C言語で代替するってどういうこと?

記述言語はCでAPIを呼び出し、それを利用する という話なのか?
831デフォルトの名無しさん:2011/03/31(木) 18:58:14.21
>>827
OSによる保護がない環境でVRAMとかに直接アクセスするとか?
832デフォルトの名無しさん:2011/03/31(木) 18:59:36.39
ゲームソフトの目標はユーザを楽しませること

単なる文字列を見て楽しいと思わせるアイディアがあるなら
標準 C だけで作ることも考えられるが
それなくしては空疎の極みだ
833デフォルトの名無しさん:2011/03/31(木) 19:00:43.85
ゲーム作るなら標準Cも、C言語にもこだわる必要なし。
HSPでもいい。
834デフォルトの名無しさん:2011/03/31(木) 19:19:02.64
835デフォルトの名無しさん:2011/03/31(木) 19:59:49.44
>>815->>816
なるほど、ありがとうございます
頑張ります
836デフォルトの名無しさん:2011/03/31(木) 20:13:16.82
>>834
アドレスタイプが不明とでていけないのですが、リンクミスですか?
837デフォルトの名無しさん:2011/03/31(木) 22:06:38.76
>>818
CGIでWebプログラムにすればグラフィックも音声もいけるぞ
838デフォルトの名無しさん:2011/03/31(木) 23:21:18.06
PHPerがC言語を勉強する際に気をつける10つの事

教えてください
10つじゃなくてもかまいません
839デフォルトの名無しさん:2011/03/31(木) 23:23:15.37
1. 「10つ」とかいう間違った日本語を使わない
840デフォルトの名無しさん:2011/03/31(木) 23:24:02.28
何かスレが臭いと思ったらペチパーか
841デフォルトの名無しさん:2011/03/31(木) 23:46:28.97
C:\testに100個(1ファイル1MB)のファイルが入っています
これをD:\testにフォルダごとコピーする場合
CでやるのとDOSコマンドでやるのはどちらが早いでしょうか?
Cは早いとよく言われるのでDOSよりも高速ですか?
842デフォルトの名無しさん:2011/03/31(木) 23:50:14.10
DOSコマンドもCで書かれているとは思わないのか?
843デフォルトの名無しさん:2011/03/31(木) 23:54:58.56
DOS コマンドは主に MASM で書いてたな
844デフォルトの名無しさん:2011/03/31(木) 23:55:07.01
コード書いてコンパイルしてテストする時間考えたらあるもの使った方が速いよ
845デフォルトの名無しさん:2011/03/31(木) 23:55:55.49
春だからか急にWeb系のネタが増えたね
846デフォルトの名無しさん:2011/03/31(木) 23:56:08.54
DOSの時代、zcopyとかxcopyとか、普通のcpoyより高速なコマンドって
あったけどああいうのってどうやって高速化してたんだろ。
847デフォルトの名無しさん:2011/04/01(金) 00:05:06.98
>>841
win98の頃は、単純コピーならcopyコマンドより
自作したコマンドの方が速かったが、最近は分からん。
でも、copyコマンド自体、あまり速いとも感じないので、
作り方次第だけど、速くなると思うよ。
848デフォルトの名無しさん:2011/04/01(金) 00:06:25.20
>>842
DOSってCでできてたの!?
Windowsで出来てるものだと思ってたけどCで出来てるならDOSのほうがいいか
849デフォルトの名無しさん:2011/04/01(金) 00:13:13.60
xcopy はメモリ容量にものを言わせての一気読みがポイントで
copy が seek read seek write seek read seek write とやるところを
xcopy は seek read read seek write write で済ませるようにしていた
あと /s が使えるのも大きなメリットだった

スレ違いすまそ
850デフォルトの名無しさん:2011/04/01(金) 00:15:01.20
>>848
お前はwindowsをなんだと思ってるんだ?
851デフォルトの名無しさん:2011/04/01(金) 00:20:32.34
>>848
昔のWindowsはDOSから起動してたな
852デフォルトの名無しさん:2011/04/01(金) 00:23:26.77
windowsの下回りは汗ベースだよ
853デフォルトの名無しさん:2011/04/01(金) 00:28:46.48
ぬるぬるしてそうだな
854デフォルトの名無しさん:2011/04/01(金) 00:30:12.58
スーパードンキーコングの1が発売されたのって1994年だけど、
Windows出る前だよな?それなのにあんなに綺麗なグラフィックなのが
信じられない。
855デフォルトの名無しさん:2011/04/01(金) 00:34:54.10
>>854
初期バージョンはもっと前からあるよ。
856デフォルトの名無しさん:2011/04/01(金) 00:41:39.34
Windos 1.0 の発売は1985年6月 遙か昔だが何か?
857デフォルトの名無しさん:2011/04/01(金) 00:42:29.80
×Windos
○Windows
858デフォルトの名無しさん:2011/04/01(金) 01:03:28.25
厳密にいえばそうなんだろうけど
Windowsは95からってのが、WIndowsとかに詳しくない一般人の感覚だからね
859デフォルトの名無しさん:2011/04/01(金) 01:06:06.89
Windows95 より前は DOS上で動く Window System であって OS じゃないイメージ
860デフォルトの名無しさん:2011/04/01(金) 01:41:25.55
最初のWindowsって、Excelのおまけだったし
861デフォルトの名無しさん:2011/04/01(金) 02:55:05.48
1980年代レベルで、スーパードンキーコング並のCGやアニメーション作るのは
可能なの?
862デフォルトの名無しさん:2011/04/01(金) 03:00:29.68
>>861
プリレンダリングなら可能
863デフォルトの名無しさん:2011/04/01(金) 03:22:00.22
すげーな、プリ
864デフォルトの名無しさん:2011/04/01(金) 04:38:47.06
          (あそこいつも電気付いてるな)
::::::::::::::::::::::::::::::::::::::::::::o:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::゚:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ブロロォ・・・............γ_⌒_ 、 ........................        .......
.....................___ U ´д`)_ .............../\........| ̄....ニ ..........
      |_i_|( ー O=(O=O
;;) .:)    /,=、(ヽ ヽ::| |ニ|#|
⌒):. て , (φ)ヽ(__ノ//(O))
865デフォルトの名無しさん:2011/04/01(金) 04:45:58.69
1985年のみなさん、こんにちわ。 未来から書き込んでます。
こちらは現在2011年。 21世紀に入ってから10年くらい経ってます。

パソコン一台50万円という話に驚きました。 最新鋭のインテル386、12メガヘルツ、メモリー2メガバイト、ハードディスク50メガバイトですか… 最新型ですか… そうですか…

ぼくらの時代だと、パソコンは5万円でおつりが来ます。
CPUのクロック周波数は、たったの3000メガヘルツ程度です。(2005年頃から回路の微細化での、物理的な限界問題が顕著に現れ始めて、以降はあまり伸びていません)
そのかわり、CPUの中に、同じCPUがいくつも存在するようになってます。 マルチコアと呼んでます。 昔のデュアルCPUみたいな感じですかね?

2、3万円のパソコンでも、今はマルチコアが当たり前です。 2個か4個が普通ですね。 むしろ、シングルコアのパソコンを探す方が大変なほどですw


あと、メモリーは4000メガバイトが当たり前になってますね。 アキバで5000円くらいで買えますよ? 
(余談ですが、アキバ、すごい風俗街になっちゃってます。 女の子がメイドの恰好で接客してる”メイド喫茶”なんてのが出来てたり、女の子が道路の真ん中でパンツ見せたりしてます。はぁはぁ)


32ビットで扱える数字の範囲は、0から4ギガ程度までなので、32ビットOSで扱えるメモリー量の少なさ(たったの4ギガバイトしかないw)が問題になってます。
CPUは内部的には64ビット化してるのが主流です。

いや、4ギガバイトはメモリーです。 メモリー。
ハードディスクは1テラバイトくらいが普通ですかね。 アキバで7000円で買えますよ。


あと、3Dグラフィックス用のグラフィックスカードが、安いのなら1万円くらいで売ってます。 安物だと性能悪いんで、秒間1億ポリゴンくらいですかね。 よく知りませんが。
866デフォルトの名無しさん:2011/04/01(金) 04:58:19.55
そうそう、
OSは今でもマイクロソフトのOSが主流です。 ウインドウズって名前です。 マッキントッシュみたいな感じですね、見た目。
あと、UNIXが無料で配られてます。 ソースコード付き、ソースの改変も自由です。 Linuxって名前ですけどね。

コンパイラーも無料で配られてますよ。 LSI-C86みたいな、ちゃんとしたCコンパイラーがフリーソフトであります。gccって名前ですけどね。
C言語、BASIC、他にもいろいろな言語のコンパイラーが、有志によって作られて、インターネットで配られてます。
そういえば、マイクロソフトもコンパイラー含め、統合開発環境を無料で配ってました。

そちらはBASICが主流ですか… へぇ、2万円ですか… 大変な時代ですね…
MS-DOS??? ああ、聞いたことありますw へぇ2万円ですか… へぇ〜〜〜… 大変な時代ですね…


そういえば、関係ないですけど、
先日、大地震がおきて、福島で原子力発電所が爆発しましたよw なんか原子炉の建物が吹っ飛んで、鉄骨とかグシャグシャになってる映像がNHKでやってましたw
こっちはこっちで大変な時代です…www
(毎日ニュースで「東京の飲み水が放射能汚染されました〜〜」とかやってますw なんという世紀末www)

あ、でも安心してください。 ノストラダムスは外れましたからw 1999年7月は、ふつうにふつうの夏でしたよw
867デフォルトの名無しさん:2011/04/01(金) 07:52:42.35
int main(void)

がデフォだと思うのに

main()

と省略してるプログラムとか何のつもりなのでしょうか?良く見かけます。
868デフォルトの名無しさん:2011/04/01(金) 08:53:40.80
>>867
K&R disってんのか?
869デフォルトの名無しさん:2011/04/01(金) 09:38:01.63
            )
             (
         ,,        )      )
         ゙ミ;;;;;,_           (
          ミ;;;;;;;;、;:..,,.,,,,,
          i;i;i;i; '',',;^′..ヽ
          ゙ゞy、、;:..、)  }
           .¨.、,_,,、_,,r_,ノ′
         /;:;":;.:;";i; '',',;;;_~;;;′.ヽ
        ゙{y、、;:...:,:.:.、;:..:,:.:. ._  、}
        ".¨ー=v ''‐ .:v、,,、_,r_,ノ′
       /;i;i; '',',;;;_~⌒¨;;;;;;;;ヾ.ミ゙´゙^′..ヽ 
       ゙{y、、;:...:,:.:.、;、;:.:,:.:. ._  .、)  、}
       ".¨ー=v ''‐ .:v、冫_._ .、,_,,、_,,r_,ノ′
      /i;i; '',',;;;_~υ⌒¨;;;;;;;;ヾ.ミ゙´゙^′.ソ.ヽ
      ゙{y、、;:..ゞ.:,:.:.、;:.ミ.:,:.:. ._υ゚o,,'.、)  、}
      ヾ,,..;::;;;::,;,::;):;:;:; .:v、冫_._ .、,_,,、_,,r_,ノ′

870デフォルトの名無しさん:2011/04/01(金) 10:08:23.21
>>867

おまえ、実務経験あるのか?
871デフォルトの名無しさん:2011/04/01(金) 10:24:22.78
>>868
あれはもうdisっていい
872デフォルトの名無しさん:2011/04/01(金) 10:26:37.86
            )
             (
         ,,        )      )
         ゙ミ;;;;;,_           (
          ミ;;;;;;;;、;:..,,.,,,,,
          i;i;i;i; '',',;^′..ヽ
          ゙ゞy、、;:..、)  }
           .¨.、,_,,、_,,r_,ノ′
         /;:;":;.:;";i; '',',;;;_~;;;′.ヽ
        ゙{y、、;:...:,:.:.、;:..:,:.:. ._  、} < おまえ、実務経験あるのか?
        ".¨ー=v ''‐ .:v、,,、_,r_,ノ′
       /;i;i; '',',;;;_~⌒¨;;;;;;;;ヾ.ミ゙´゙^′..ヽ 
       ゙{y、、;:...:,:.:.、;、;:.:,:.:. ._  .、)  、}
       ".¨ー=v ''‐ .:v、冫_._ .、,_,,、_,,r_,ノ′
      /i;i; '',',;;;_~υ⌒¨;;;;;;;;ヾ.ミ゙´゙^′.ソ.ヽ
      ゙{y、、;:..ゞ.:,:.:.、;:.ミ.:,:.:. ._υ゚o,,'.、)  、}
      ヾ,,..;::;;;::,;,::;):;:;:; .:v、冫_._ .、,_,,、_,,r_,ノ′

873デフォルトの名無しさん:2011/04/01(金) 10:38:29.63
ウンコに言われちゃおしまいだね
874デフォルトの名無しさん:2011/04/01(金) 13:02:10.11
どうせなら
    int main(int argc, char* argv[])
    {
        int a = 1 + 1;

        return 0;
    }
をデフォにしてみてはどうでしょうか?
きっと先生も満点くれるとおもいます。
875デフォルトの名無しさん:2011/04/01(金) 13:52:50.84
Cをマクロとして使うのは普通ないですか?
PythonとかRubyでやるべきでしょうか?
876デフォルトの名無しさん:2011/04/01(金) 14:24:49.25
>>875
何のマクロで?
877デフォルトの名無しさん:2011/04/01(金) 14:48:44.59
10桁の数字の上から2桁目から下から2桁目までの数字をint型で表示したいです。
どうしたらいいですか?


123456789→2345678
878デフォルトの名無しさん:2011/04/01(金) 14:52:38.95
学校の宿題は自分で考えたほうがいいぞ
879デフォルトの名無しさん:2011/04/01(金) 14:54:29.34
int i = 123456789, j;
char buf[128];

sprintf(buf, "%d", i);
buf[8] = '\0';
j = atoi(buf + 1);
printf("%d\n", j);
880デフォルトの名無しさん:2011/04/01(金) 14:55:35.51
>>876
たとえば、指定したフォルダに特定のファイルやフォルダを作成するとか
特定のデータをデータベースに記録するなどです
881デフォルトの名無しさん:2011/04/01(金) 15:09:18.07
>>880
バッチファイルとかシェルスクリプトとかワンライナー的な雑務用途に
それらスクリプト言語の代わりにCを使いたいということか?
まぁ使いたければ別にいいんじゃない
大抵は面倒が増えるだけだと思うけど、処理の内容によってはCで書くしかないこともあるかもしれないし
882デフォルトの名無しさん:2011/04/01(金) 15:21:52.72
C言語ってスクリプト言語に分類される?
883デフォルトの名無しさん:2011/04/01(金) 15:41:22.06
>>882
コンパイラ言語
884デフォルトの名無しさん:2011/04/01(金) 15:47:56.55
C言語インタプリタってスクリプト言語?
885デフォルトの名無しさん:2011/04/01(金) 15:52:29.09
>>867
何も問題ない
省略されれば暗黙でintだ
引数はvoidでもなんでもお好きなように
886デフォルトの名無しさん:2011/04/01(金) 15:53:10.80
>>884
どっちがベースかによる。
perlだってコンパイルできる。
887デフォルトの名無しさん:2011/04/01(金) 15:53:37.98
次の動作を自動化したいのですがどうすればいいですか?
スクリプトで処理するほうがいいのでしょうか?よろしくお願いします。

1.ecdh 0 > P (自分の公開鍵を生成する)
2.ecdh 1 P > Q(自分の公開鍵に署名する。この時256ビットの乱数を手で入力する)
3.P,Qをメールで送る。
4.相手の公開鍵 Rと署名Sをもらう。
5.ecdh 2 R < S 相手の公開鍵の署名を検証する。(That's Trueと出ればよい)
6.ecdh 3 < R (相手の公開鍵Rをリダイレクトして共有鍵を生成する。アクセスパスワードの設定が必要)
7.オリジナルの鍵key.binのバックアップを取り、seed.keyをkey.binに変更して相手との通信に使う。
888デフォルトの名無しさん:2011/04/01(金) 16:03:42.60
鍵の人キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
889デフォルトの名無しさん:2011/04/01(金) 16:31:21.87
CとC++について
1.両方覚えるべきか? 
2.どちらを先に覚えるべきか? 
3.どっちを切り捨てるべきか? 

お願いしますっ!
890デフォルトの名無しさん:2011/04/01(金) 16:35:22.03
C言語ほど低級な言語は無いと思う、自由度が高すぎる。

C++はコードが難し過ぎる。
891デフォルトの名無しさん:2011/04/01(金) 16:51:17.00
>>889
CとJAVAの両方覚える、その後必要ならC++ と個人的には思った
892デフォルトの名無しさん:2011/04/01(金) 17:04:04.68
C++だろ。
Cはすべて使えるし、便利になっている。
文字列とか、ポインタなどC言語の特徴的なものを使わずに
同じ事が可能。
893デフォルトの名無しさん:2011/04/01(金) 17:08:25.94
C言語はポインタや配列のおかげで非常に分かりやすい。
C++はわかりにくい。
894デフォルトの名無しさん:2011/04/01(金) 17:10:08.24
>>893
嘘つけカス
895デフォルトの名無しさん:2011/04/01(金) 17:13:18.35
>>892
で、結局どっちなの?
896デフォルトの名無しさん:2011/04/01(金) 17:13:43.64
>>889
C++はCの要素が内包されてるからC++だけ覚えればいい
897デフォルトの名無しさん:2011/04/01(金) 17:13:52.87
>>877
余りをとって割ればいいじゃん
898デフォルトの名無しさん:2011/04/01(金) 17:20:30.52
VSインストール後に再起動しないとOSがアップデート出来なくなるバグが発生するんだけど俺だけ?
899デフォルトの名無しさん:2011/04/01(金) 17:22:37.07
C〜Java or .NET〜C++がいいよ
900デフォルトの名無しさん:2011/04/01(金) 17:27:25.06
C++はいろんな「道具」が揃っている
Cはポインタ「しかない」

どちらを選ぶかは自由
901デフォルトの名無しさん:2011/04/01(金) 17:56:39.84
C++は見にくいから嫌い。

Cは複雑だけど分かりやすい。
902デフォルトの名無しさん:2011/04/01(金) 17:58:44.16
C:奇怪
C++:複雑怪奇
903デフォルトの名無しさん:2011/04/01(金) 18:31:44.20
>>786
#include <stdio.h>

void func(char *p, int n, int r, int indx)
{
if(r == 0) {
printf("%s\n", p);
return; }

if(r > n - indx) return;

p[indx] = '1';
func(p, n, r - 1, indx + 1);

p[indx] = '0';
func(p, n, r, indx + 1);
}

int main(void)
{
int i, n, r;
char buff[256] = {0};

scanf("%d%d", &n, &r);

for(i = 0; i < n; i++) buff[i] = '0';
func(buff, n, r, 0);

return 0;
}
904デフォルトの名無しさん:2011/04/01(金) 18:41:42.60
>>902
アセンブラ:超常現象
C:怪奇
C++:怪異
905デフォルトの名無しさん:2011/04/01(金) 19:57:37.53
おまえら C vs C++ ならこっちでやりなさい
http://hibari.2ch.net/test/read.cgi/tech/1207419469/
906デフォルトの名無しさん:2011/04/02(土) 04:34:35.25
&&, ||の演算子について質問です。

手元の入門書に、&&(||)は無駄な処理を省いていて、
a && b はまずaの式を評価して、もし偽ならばbの式は評価しない。
a || b はまずaの式を評価して、もし真ならばbの式は評価しない。
といったことが書かれてありました。

上の説明では先に左のオペランドから評価されているんですが、逆に
a && b はまずbの式を評価して、もし偽ならばaの式は評価しない。
a || b はまずbの式を評価して、もし真ならばaの式は評価しない。
と、右から評価される可能性も考えられませんか?

一般に式の評価順序は決まっていない(コンパイラに依存する)と聞いたことがあるので、
コンパイラによっては、右から評価される可能性も考えられると思います。
それとも&&(||)の演算子だけは、必ず左のオペランドから評価されなければならない、
と決まってるんですか?

まだ初心者なので、用語の使い方が間違ってたらごめそ
907デフォルトの名無しさん:2011/04/02(土) 04:41:28.27
昔は、コンパイラに依存してたけど
今時のコンパイラは...
908デフォルトの名無しさん:2011/04/02(土) 04:53:53.77
初心者は余計なこと考える必要はない
909 ◆QZaw55cn4c :2011/04/02(土) 04:54:18.37
>>906
>一般に式の評価順序は決まっていない(コンパイラに依存する)

そのとおりなのですが例外があって、少なくとも、&&, ||, は左から右に評価します。
cf. ISO/IEC 9899:1999 6.5.13.4, 6.5.14.4,
三項演算子(条件演算子)についても、第一オペランドの後に副作用完了点がくる、という記述があるので、もしかすると左から右に評価すると定義されているとしていいかもしれませんが、私には言い切る自信がありません。
cf ISO/IEC 9899:1999 6.5.15.4
910デフォルトの名無しさん:2011/04/02(土) 04:58:57.26
入門書に左から右って書いてあるのに、聞いたことがある程度の知識でそれが間違ってるとか思えるのがすげえ
911デフォルトの名無しさん:2011/04/02(土) 05:00:17.83
ま、キチガイだからな
912デフォルトの名無しさん:2011/04/02(土) 05:25:44.82
>>906
入門書のまえがきを読んでみ
コンパイラは○○でだとか
○○規格に準拠だとか但し書きがあるはず
なんでもそうだけど
なんらかの前提(ルール、共通言語、共通認識)がなければ
会話が成り立たないんだな
913デフォルトの名無しさん:2011/04/02(土) 08:51:29.49
そうじゃなくC言語の標準があるでしょ。標準に実装依存と書いて
あればコンパイラによるし、その順番に依存するコード書いたら
いけない。標準に順番が書かれていればそれを守らないコンパイラ
はC言語のコンパイラといってはいけないんだから、その順番は
前提としていい。それだけのことでしょ。
914デフォルトの名無しさん:2011/04/02(土) 09:02:57.85
初めて書き込みます、初心者ですみません
前々からアプリの自作に憧れており、つい最近C言語に手を出そうと決めました
慣れてきたら次はC++を学びたいと考えています
まずは入門書をいくつか流し読みし、まだ最初の数ページを実践している段階なのですが……

例えばIEのような、ウィンドウ?を表示する為には何が必要なのでしょうか?
C言語を使って表示するより、C++言語を使って表示した方が簡単でしょうか?
アプリ完成までの全体像をイメージ出来ればやりやすいのですが……
未だプログラミングについて知識が曖昧なので、変な質問だったらすみません
915デフォルトの名無しさん:2011/04/02(土) 09:05:54.97
入門書に書いてあることは正しいが、順番に依存するような実装はするなってことだな
916デフォルトの名無しさん:2011/04/02(土) 09:08:58.02
>>914
C#かC++ Express
C#のがいいと思うけど、詳しくは各々の専スレでどぞ
http://www.microsoft.com/japan/msdn/vstudio/express/
917デフォルトの名無しさん:2011/04/02(土) 09:10:43.70
ウィンドウズAPI
918デフォルトの名無しさん:2011/04/02(土) 09:55:31.04
>>914
main関数を捨てることからかな?
919デフォルトの名無しさん:2011/04/02(土) 10:42:28.02
テキストファイルの中にtest0101という文字列があるか確認するのは難しいですか?
Windows APIを使うほどの高等な技術でしょうか?
C言語の基本文法でできますか?
920デフォルトの名無しさん:2011/04/02(土) 10:49:48.75
strpbrk
921デフォルトの名無しさん:2011/04/02(土) 10:51:45.35
>>919
テキストファイル全体が一度にメモリに読み込めるなら
strstrが使える。

読み込めない場合は、分割して読込すれば良いだろうけど、
対象文字列が切れた時の処理が必要。
922デフォルトの名無しさん:2011/04/02(土) 10:53:22.36
>>919
基本文法だけだとファイルを扱えないぞ
923デフォルトの名無しさん:2011/04/02(土) 11:11:51.44
fopenはC89の範疇だろうが
924デフォルトの名無しさん:2011/04/02(土) 11:17:36.33
このスレの先輩方の温かいお言葉と励ましでC言語の勉強をスタートした者です
VC++の無料の奴をダウンロードしました
あの自分が作ったコードを先輩方に見てもらってどこがダメだとか指摘してもらえるかもしれないスレはどこに行けばよいでしょうか?
925デフォルトの名無しさん:2011/04/02(土) 11:33:08.64
>>924
ここでいいよ
長かったら直接書かずにどっかにうpしてもらえれば
あと、こういう結果が欲しかったのだけどこうなってしまった、とかいうような状況説明も付けて
926デフォルトの名無しさん:2011/04/02(土) 11:45:52.44
構造体の型の宣言ってmain関数内か、ヘッダのすぐ下でするのかどっちですか?
どっちでもいいですか?
927デフォルトの名無しさん:2011/04/02(土) 11:50:16.28
mainの中でしか使わないならmainの中でいんじゃね?
928デフォルトの名無しさん:2011/04/02(土) 12:02:35.55
>>919
分割で考えてみた
fpよりfdの方が分かりやすくて好き
#include <stdio.h>
#include <string.h>
#define BUF_SIZE (1024)

int search_str(const char* path, const char* str)
{
  FILE* fp;
  char buf[BUF_SIZE], *str_pos;
  int read_cnt = 0;

  if((fp = fopen(path, "r")) == NULL) return -1;

  while(fread(buf, sizeof(char), sizeof(buf), fp) > 0){
    if((str_pos = strstr(buf, str)) != NULL){
      fclose(fp);
      return (int)(str_pos - buf)
           + (sizeof(buf) - sizeof(str)) * read_cnt;
    }
    fseek(fp, -((long)sizeof(str)), SEEK_CUR);
    read_cnt++;
  }
  fclose(fp);
  return -1;
}
929デフォルトの名無しさん:2011/04/02(土) 12:20:25.96
readはこうした方がいいか
  size_t ret;

  while((ret = fread(buf, sizeof(char), sizeof(buf), fp)) > 0){
    memset(buf + (char*)ret, NULL, sizeof(buf) - ret);
930デフォルトの名無しさん:2011/04/02(土) 12:22:49.13
ヘッダファイルって
#stdio.hとか
#stdio.mathのことですか?
931デフォルトの名無しさん:2011/04/02(土) 12:25:16.63
stdio.math というのはありませんぜ旦那

stdio.h とか math.h とかのことです
932デフォルトの名無しさん:2011/04/02(土) 12:26:17.75
>>929
freadでbuf一杯のサイズ読み込んだとき、strstrに渡しても大丈夫?
933デフォルトの名無しさん:2011/04/02(土) 12:32:40.62
せっかく作ったのに誰も見てくれなくて哀しい……

ウィンドウズのコマンドプロンプトで動くハローワールドを作った
http://www1.axfc.net/uploader/Sc/so/220703

遊び方
c:>hello
Hello World!
c:>hello "Good Morning!" good.exe
で good.exe ができる
c:> good
Good Morning!

となる。good.exe も当然同じ機能を持ってる。
(勿論、どんな文字列でもいける)
あほみたいだけど、一応コンパイラコンパイラなんだ
934デフォルトの名無しさん:2011/04/02(土) 12:38:40.50
>>933
実行ファイル置いても、誰も動かさないのでは?
935デフォルトの名無しさん:2011/04/02(土) 12:40:45.38
>>933
それだけなら自分の複製を作って
初期化する文字列部分を書き換えるだけでできるし面白くない
936デフォルトの名無しさん:2011/04/02(土) 12:45:52.80
前提(ルール、共通言語、共通認識)なんてないね。
誤認識してるほうが多いような?
937デフォルトの名無しさん:2011/04/02(土) 12:46:23.33
>>935
勿論、真面目な奴だとBNFパーザを内包して、自前のスクリプト言語で
超言語代入分の部分に関する動作を記述して、まともに動くコンパイラ
コンパイラを作ってるよ。
<NTSYMBOL>::=<><><>:action;
アクションの部分の書き方が定まったものがないから人には勧められないけど……
確かに上にだしてるのは、ランタイムが無しでサイズが1KBなのが売りだけかも
938デフォルトの名無しさん:2011/04/02(土) 12:57:51.72
static const typedefを重要度で順位で付けるならどうなりますか?
939デフォルトの名無しさん:2011/04/02(土) 13:03:07.65
優勝:static
2い:typedef
3い:const
940デフォルトの名無しさん:2011/04/02(土) 13:07:20.61
typedefとconstは使えなくても人力で何とかなるけど、
static使えなきゃグローバルにしなきゃいかんからな
941デフォルトの名無しさん:2011/04/02(土) 13:22:09.62
#include <stdio.h>なんですが
#include <"stdio.h">という風に囲わなくてもいいのですか?
stdio.hの部分は絶対パスで書くことはないのですか?
942デフォルトの名無しさん:2011/04/02(土) 13:26:57.97
#include <stdio.h>

#include "stdio.h"
のどちらかです
混ぜてはダメです
絶対パスで書いてもいいけど、面倒臭いでしょ
943デフォルトの名無しさん:2011/04/02(土) 13:29:18.43
絶対パスで指定する利点がわからない
944Lv1:2011/04/02(土) 13:29:28.68
>>942
ありがとうございました
Lv1に昇格しました
945デフォルトの名無しさん:2011/04/02(土) 13:37:17.07
プログラミング技術卓越してる奴ならstatic使わなくても大丈夫なんじゃね?
946デフォルトの名無しさん:2011/04/02(土) 13:40:06.07
>>945
そう言う奴はmainだけでプログラムが書けそうだな
947デフォルトの名無しさん:2011/04/02(土) 13:40:49.43
>>945
だね
外部シンボルの制限がきつかった頃の痕跡器官といっていい
948 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/02(土) 13:44:26.08
アフォかstatic普通に使うだろC++でprivate変数一切使わずにクラスを作るようなもの
949デフォルトの名無しさん:2011/04/02(土) 13:48:04.31
プログラミング技術卓越してる奴ほどstaticを有効に使ってる ということが分からのがプログラミング技術未熟者
950デフォルトの名無しさん:2011/04/02(土) 13:49:01.66
関数内とそれ以外でstaticの意味が違うじゃん
951Lv1:2011/04/02(土) 14:01:06.28
#include <stdio.h>
int main(void)
{
int a[3];
a[0] = 4;
a[1] = 6;
a[2] = 9;
int i;
for (i=0; i<3; i++) {
printf("%d\n", a[i]);
}
return 0;
}
952Lv1:2011/04/02(土) 14:02:05.42
#include <stdio.h>

int main(void)
{
int i;
int a[3];
a[0] = 4;
a[1] = 6;
a[2] = 9;
for (i=0; i<3; i++) {
printf("%d\n", a[i]);
}

return 0;
}

>>951だとエラーになって、>>952ではエラーになりません
int i;の位置がaよりも後に来るとエラーに来るのは何故ですか?
953デフォルトの名無しさん:2011/04/02(土) 14:03:56.45
変数はブロックの最初でまとめて宣言しないとだめだから
954デフォルトの名無しさん:2011/04/02(土) 14:05:00.94
static VS キャスト演算子

static VS typedef

static VS 配列

sitatic VS enum


便利度で言えば全部staticの負け?
955 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/02(土) 14:05:16.13
プログラマに向いてないから別の道を探した方がいい
956Lv2:2011/04/02(土) 14:06:34.20
>>953
ありがとうございます
957デフォルトの名無しさん:2011/04/02(土) 14:07:17.35
関数と大域変数は、
外部ソースからアクセス可能にするという、運用上の特別な理由が無い限りは、
基本的に全て static として定義した方がよいです。

これはソースを書いた人間が、思慮深い優秀なCプログラマーか否かを判断する、一つの指標にもなります。

C++ の class のデフォルトが private なのも、もともとの根拠は C の static と同じ理由です。
958デフォルトの名無しさん:2011/04/02(土) 14:09:20.93
プログラミング向いてない人程、マニアックで技巧的でユニークなプログラム、アプリを作る。

プログラミング向いてる人程、単純でありきたりなプログラムを早く作る。
959デフォルトの名無しさん:2011/04/02(土) 14:47:57.83
>>957
private がデフォつーのは、あくまで C++ から以後の考え方で
C が public をデフォにしているのは当時なりの善だったんだよ

アセンブラでは private がデフォだった(外部シンボルを手間をかけて「作る」必要があった)
それを C では public をデフォにわざわざ変えた(使えるものは自己責任で使えという思想)
その後 C++ で再び private をデフォにした(隠しコマンドを気安く使うなという思想)

言語自体の設計思想とずれてる奴がこういうマクロを作る
#define begin {
#define end }
おまえの言ってることはこれに近い
960デフォルトの名無しさん:2011/04/02(土) 14:50:22.84
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

main()
{
printf("%c",('c'&'b'));
}
961デフォルトの名無しさん:2011/04/02(土) 14:56:26.73
>>960 &演算子の使い方おしえて
962デフォルトの名無しさん:2011/04/02(土) 15:02:52.77
汗上がりの人には隠蔽とかいう認識がなかっただけでしょ
963デフォルトの名無しさん:2011/04/02(土) 15:28:19.27
staticって呼び方、どうにかならなかったのか
964デフォルトの名無しさん:2011/04/02(土) 15:45:03.87
>>959
んなこたーない
965Lv2:2011/04/02(土) 16:04:24.53
ポインタというのは
int x = 10; int型の変数xを宣言して10を代入する
int *p; ポインタ型の変数pを宣言する
p = &x; pにxのアドレスを格納する
*p = 30; xのアドレスに30を代入する
printf("%d", x); 30が表示される

という認識でよいでしょうか?
966デフォルトの名無しさん:2011/04/02(土) 16:11:47.66
バッチファイルってVisualC++の場合どうやって実行させたらいいですか?
967デフォルトの名無しさん:2011/04/02(土) 16:37:12.88
>>959
もうかなり前から、みんな>>957みたいな考え方じゃない?
モジュール毎にソースファイル割って、グローバルは極力使わない
設計思想とか言っても、その言語設計者がそういう使い方推奨してるし
968デフォルトの名無しさん:2011/04/02(土) 16:49:05.57
>>954
どれもいるけど、staticはプログラムの構造自体変わっちゃうからなあ・・・

>キャスト演算子
memcpyとmemsetで何とかなるかな
>typedef
まあ使わないでも
>配列
ポインタ+mallocで何とかなるか?
malloc禁止なら、静的領域を固定で確保か・・・
>enum
#defineでいいな
969デフォルトの名無しさん:2011/04/02(土) 16:50:42.19
どんなに精密なアプリでも厳密には分からないバグは発生してるものなんですか?
970デフォルトの名無しさん:2011/04/02(土) 17:03:02.66
>>967
グローバルはグローバル
いくら static で五十歩百歩なスコープを付けても
構造化プログラミングからは外れるものだ
この意味ではマクロも同類

言語の設計者がああしろこうしろと押しつけがましいことを言わないのが C の思想の1つで
珍しくそのようなことを言っているのは goto に対してくらいだ

# もっとも goto のスコープには別な理由があるんだが

それから「もうかなり前から」とは C ができる前からで
監視モードや主記憶キーで隠蔽はしていて
「ここは使わないでね♥」みたいな甘ちゃんなやり方じゃなかっただけだ
971デフォルトの名無しさん:2011/04/02(土) 17:13:24.55
>>970
> グローバルはグローバル
> いくら static で五十歩百歩なスコープを付けても
> 構造化プログラミングからは外れるものだ
ちょっと何言ってるか分からないんですけど

> それから「もうかなり前から」とは C ができる前からで
> 監視モードや主記憶キーで隠蔽はしていて
> 「ここは使わないでね♥」みたいな甘ちゃんなやり方じゃなかっただけだ
かなり意味分からないんですけど
C以前の話とか、無意味だと思いますが
972デフォルトの名無しさん:2011/04/02(土) 17:19:58.27
グローバルにするのは初期のBASICのやり方かも
BASICのコード、そのままCにしましたってコード見たことあるし
973デフォルトの名無しさん:2011/04/02(土) 17:25:51.97
初心者なんですが
for文とかの条件でつまずくんですが
1回多かったり、どう回せば上手く出力できるかわかりません。
やっぱ、こういうのは慣れなんでしょうかね?
974デフォルトの名無しさん:2011/04/02(土) 17:31:14.17
>>965
いいよ

>>973
どう書いたらどう動くのか、正確にfor文や条件式の意味や動きを理解できてないだけだろう
975デフォルトの名無しさん:2011/04/02(土) 17:31:45.53
>>971
あそう
で?
976デフォルトの名無しさん:2011/04/02(土) 17:32:30.86
構造体のメンバーについて質問です。

->と.はどう違うのでしょうか?

構造体penのメンバーx1はpen->x1なのかpen.x1とするのかどっちですか?
977デフォルトの名無しさん:2011/04/02(土) 17:33:42.38
>>970
ヴァカ
978デフォルトの名無しさん:2011/04/02(土) 17:33:51.74
>>973
症状から考えると
配列をa[n]で宣言したらa[0]からa[n-1]のn個の領域しかアクセスできないよ

浮動小数点数を比較するのはやめておけ
のどっちかだろ
979デフォルトの名無しさん:2011/04/02(土) 17:35:02.15
>>977
アフォ
980デフォルトの名無しさん:2011/04/02(土) 17:35:08.05
>>976
p->x は (*p).x の意味
981デフォルトの名無しさん:2011/04/02(土) 17:35:14.22
>>970
> グローバルはグローバル
> いくら static で五十歩百歩なスコープを付けても
> 構造化プログラミングからは外れるものだ
その理屈でいくと構造化プログラミングなんてものは存在しないのでは?
main関数のみで#includeも出来ないよね
982デフォルトの名無しさん:2011/04/02(土) 17:39:29.05
とりあえずあれだ、老害のいるプロジェクトのメンバーには入りたくねえってこった
使わないグローバルが見えてるプログラムなんて見たらアチャーって思うし、後輩なら指導する
983デフォルトの名無しさん:2011/04/02(土) 17:39:42.20
>>981
#include ?? どっから出てきた?
少なくともそれは構造化プログラミングを肯定も否定もしないぞ
984デフォルトの名無しさん:2011/04/02(土) 17:43:13.56
グローバルスコープ云々って構造化と関係ないじゃん
985デフォルトの名無しさん:2011/04/02(土) 17:44:38.42
>>983
グローバル自体が構造化を否定(笑)ってのがお前の持論じゃないの?w
986デフォルトの名無しさん:2011/04/02(土) 17:44:52.03
>>984
だからそう言ってる
static をつけても同じことだと
987デフォルトの名無しさん:2011/04/02(土) 17:46:31.83
Cなんてどこがいいの?
C#が最強でしょ。GUIも簡単だし。

Cのいいところ教えてください
988デフォルトの名無しさん:2011/04/02(土) 17:47:04.00
>>980
ありがとうございました
989デフォルトの名無しさん:2011/04/02(土) 17:48:21.51
>>986
スコープが違うのに、何が同じなんだ?

>>987
Windowsアプリ作ってる人ばかりじゃないんだよ
990デフォルトの名無しさん:2011/04/02(土) 17:48:49.01
>>983
意味すら分からないのかw
991デフォルトの名無しさん:2011/04/02(土) 17:49:05.30
仕事で書くプログラムの量って毎日何行くらいですか?
300行くらい?
992デフォルトの名無しさん:2011/04/02(土) 17:50:12.90
>>989
同じだと言っているのは構造化プログラミングの観点からだ
構造化プログラミングとは何かは他で調べればいい
993デフォルトの名無しさん:2011/04/02(土) 17:51:21.24
以前、ぐローバル変数は禁止というプロジェクトで、
「共通テーブルなのでいいでしょ?」と言って認めさせ、
でっかい構造体を置いたっけ。
後からメンバーがどんどん追加されて行ったのには笑った。
994デフォルトの名無しさん:2011/04/02(土) 17:52:01.67
職業プログラマは専門用語自重しろ。
995デフォルトの名無しさん:2011/04/02(土) 17:52:18.63
>>992
君は構造化プログラミングとオブジェクト指向の区別がついてない
996デフォルトの名無しさん:2011/04/02(土) 17:55:33.28
>>992
だから、言語関係なく隠蔽は大事だよね、ってのが世の中の流れだって
いくら屁理屈並べて言語仕様でデフォだからとか言ったって、通用しないよ

>>993
まあ全部get/set関数ってのはやりすぎ感があるね
997デフォルトの名無しさん:2011/04/02(土) 17:56:13.97
>>995
隠蔽=private みたいな矮小な思考の持ち主がよく言うぜ
998 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/02(土) 17:56:54.84
>>991
一ヶ月で300行くらい
会議、資料作成、調査が8割
999デフォルトの名無しさん:2011/04/02(土) 17:57:22.61
アプリ作るだけなら一つの言語覚えとけばいい、色んな言語覚えるのは
時間の無駄に過ぎない。
1000デフォルトの名無しさん:2011/04/02(土) 18:00:16.35
>>999
web開発なら最低4つはいるもんな
HTMLとJavaScriptとSQLとPHPかCGI書けるやつ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。