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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の*入門者*向け解説スレッドです。
初心者、初級者の方は他の質問スレのほうが良いかもしれません。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 125代目
http://pc12.2ch.net/test/read.cgi/tech/1240226599/


・C++言語はスレ違いですが、ある程度なら対応です。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 47
http://pc12.2ch.net/test/read.cgi/tech/1238087817/

過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
2デフォルトの名無しさん:2009/05/12(火) 21:41:28
もつ
3デフォルトの名無しさん:2009/05/12(火) 21:57:29
Cをコマンドライン版(DOS窓とか)で勉強したら、
VCとか使えるようになるの?
4デフォルトの名無しさん:2009/05/12(火) 22:03:00
>>3
VCを使うっていうのが、Windowsアプリを作るってことなら、使えるようにはならない。
5デフォルトの名無しさん:2009/05/12(火) 22:03:56
>>1
6デフォルトの名無しさん:2009/05/12(火) 22:04:16
VCでC言語を使えるようになる
7デフォルトの名無しさん:2009/05/12(火) 22:20:39
>>4
Windowsアプリを作るなら、
VBのほうがカンタン?
8デフォルトの名無しさん:2009/05/12(火) 22:39:51
>>7
VB.NETもC#も大差ないと思う。Cは難しい。マネージドのC++方面はよく知らない。
(VB6は論外として)
9デフォルトの名無しさん:2009/05/12(火) 22:48:46
CLIだけ使うなら大差ない。
10デフォルトの名無しさん:2009/05/12(火) 23:34:59
 擬似的なコードで書きます。
int c[6];
int a[6] = {"5","1","2","3","4","5"};
ソートして
int b[6] = {"1","2","3","4","5","5"};
int c[6];
で、
for(i=0;i<6;i++)
for(j=0;j<6;j++)
{if(a[i] == b[j])
c[i] = j;}

から、
c[i]の中身を{ "1","6","5","4","3","2"}ってして、
for(i=0;i<N;i++)
a[c[i]] = x;
って感じでa[i]の中身を変えずに降順にa[i]にアクセスしたかった
のですが、実際は"6","6","5","4","3","2"ってなってa[0]にアクセス
できませんでした。配列に同じ要素がいくつもある時に、配列の要素が
降順である順番で、配列にアクセスする方法ってどうやるのでしょうか?
11デフォルトの名無しさん:2009/05/12(火) 23:41:42
>>10
その方法では無理
ポインタ使え
12デフォルトの名無しさん:2009/05/12(火) 23:45:05
結局2重ループって活用性あるの?

ゲーム製作で良く使うって言われるけど、ドットとかの連番ファイルの読み込みぐらいでしか使わないよな?
13デフォルトの名無しさん:2009/05/12(火) 23:45:22
文字列と数値の違いがわかってないな
恐らく文字との違いも分かって無いだろう
14デフォルトの名無しさん:2009/05/12(火) 23:45:33
15デフォルトの名無しさん:2009/05/12(火) 23:47:35
O(n^2)のアルゴリズム
1610:2009/05/13(水) 00:30:32
>>11さん
int *a;
a = malloc(sizeof(int)*N);
と、いうように動的に配列を作れって意味でしょうか?
たぶん違うのでしょうが。もうちょっとヒント頂けると嬉しいです。
17デフォルトの名無しさん:2009/05/13(水) 00:42:34
>>16
いやはいれつのそれぞれの要素を指すポインタ配列を作って
それを通して間接的に操作すべきという事
18デフォルトの名無しさん:2009/05/13(水) 00:50:18
for(i=0; i<6; i++) {
for(j=i; j>0 && a[i] > a[c[j-1]-1]; j--) c[j] = c[j-1];
c[j] = i + 1;
}

c[6] = {1,6,5,4,3,2}にはなる。
19デフォルトの名無しさん:2009/05/13(水) 01:06:20
>>16
int comp(const void *a, const void *b)
{
return **(int **)a - **(int **)b;
}

int main(void)
{
int a[6] = {5, 1, 2, 3, 4, 5};
int b[6] = {1, 2, 3, 4, 5, 5}, c[6];
int *ap[6];
int i, j;

for (i = 0; i < 6; i++) {
ap[i] = &a[i];
}
qsort(ap, 6, sizeof(int *), comp);
for (i = 0; i < 6; i++)
printf("%d ", *ap[i]);
putchar('\n');

for (i = 0; i < 6; i++)
for (j = 0; j < 6; j++)
if (*ap[i] == b[j])
c[i] = j;

for (i = 0; i < 6; i++)
printf("%d ", c[i]);
putchar('\n');

return 0;
}
2019:2009/05/13(水) 01:21:09
あれえおかしいなあ
どんな風にプログラム書いても動作が変
21デフォルトの名無しさん:2009/05/13(水) 01:28:34
>>19
同じ数字があった場合結局>>10の問題は解消されないってのはおいといても、
ソート済みのものと比較してどうすんだよw
22デフォルトの名無しさん:2009/05/13(水) 01:35:01
すいません
教えてください

doubleの初期化で0xFFFFFFFFFFFFFFFFをセットする方法を教えてください
よろしくです
23デフォルトの名無しさん:2009/05/13(水) 01:35:45
>>22
意味がわかりません

24デフォルトの名無しさん:2009/05/13(水) 01:37:30
>>22

union u {
double d;
char c[8];
};

union u a;
int i;

for(i=0;i<8;i++) c[i]= 0xff;
25デフォルトの名無しさん:2009/05/13(水) 01:38:38
for(i=0;i<8;i++) a.c[i]= 0xff; だった

それかmemset(&d, 0xff, sizeof(d));
26デフォルトの名無しさん:2009/05/13(水) 01:41:42
double d = (double)0xFFFFFFFFFFFFFFFF;
27デフォルトの名無しさん:2009/05/13(水) 01:42:51
ビットを全部onにしたいんじゃねーの?
28デフォルトの名無しさん:2009/05/13(水) 01:44:12
わざわざそんなことやる理由がわからん
doubleだとちゃんとした数字になるのか?
29デフォルトの名無しさん:2009/05/13(水) 01:55:10
前スレ>>998
一時ファイルでも作業領域に使えば楽じゃん
マージソートを使えばできる
30デフォルトの名無しさん:2009/05/13(水) 01:55:32
>>24
素早い回答ありがとうございます
さっそく試して、できることが分かりました

31デフォルトの名無しさん:2009/05/13(水) 01:56:06
どういたしまして
32デフォルトの名無しさん:2009/05/13(水) 01:56:50
>>28
ならないけど、ビット処理の都合必要でして・・・
3310:2009/05/13(水) 02:09:21
>>17,18,19
ヒントありがとうございました。
34デフォルトの名無しさん:2009/05/13(水) 08:06:10
>>32
どうせ可搬性のある方法は存在しないから、double*を64bit整数へのポインタにキャストするなり、
共用体つかうなり、好きにすればいいよ。
35デフォルトの名無しさん:2009/05/13(水) 10:28:48
わざわざunion使わなくても、memset()でいいじゃん。
0xffで埋めるなら。
36デフォルトの名無しさん:2009/05/13(水) 10:30:46
37デフォルトの名無しさん:2009/05/13(水) 14:08:20
この話題でunion出す意味がわからんね。
38デフォルトの名無しさん:2009/05/13(水) 14:15:04
char const *const a, *const b;

bの型は(char const *const)ですか?
39デフォルトの名無しさん:2009/05/13(水) 14:15:55
>>38
不安ならわけて書け
40デフォルトの名無しさん:2009/05/13(水) 14:19:06
>>39
僕が書いた訳じゃないんです
41デフォルトの名無しさん:2009/05/13(水) 15:08:21
>>38
Yes.

ってか確認するコード書いてコンパイルしろよ。
42デフォルトの名無しさん:2009/05/13(水) 16:12:12
>>32
double 型の値にビット処理を施す ってのも奇妙ではあるね。
浮動小数点フォーマットを決め打ちして NAN 立てたいとか そういう用途なのかな?
43デフォルトの名無しさん:2009/05/13(水) 16:17:36
>>42
処理内容は絶対値の取得です

正確な内容はSSEを使用して計算途中に発生する負の値を正の値に読み替えるというものなんですよ
ですから本当は0xffffffffffffffffではなく0x7fffffffffffffffでこれと数値とでandをとって正の値を取得するというものです


もっと良い方法ありましたかね?
(SSEにfabsは無いと思います)
44デフォルトの名無しさん:2009/05/13(水) 16:17:57
long longを知らないだけというオチのような…
45デフォルトの名無しさん:2009/05/13(水) 16:41:46
>>43
それって C言語で記述するより インラインアセンブラで記述したい要求じゃないかい?
SSEを使用して計算の記述は インラインアセンブラっしょ?

SSE なら どーせ packed 演算だし 各pack に 0x7fff* 突っ込んで ANDPS する
アセンブルコードを挟めば良いんじゃyないの?
46デフォルトの名無しさん:2009/05/13(水) 17:11:11
>>45
それでもいいんだけどアセンブラは苦手なもんで
intrinsicで記述してます

そろそろアセンブラも始めるかな・・・
47デフォルトの名無しさん:2009/05/13(水) 23:09:41
この先アセンブリは廃れる
できるに越した事は無いけど
48デフォルトの名無しさん:2009/05/14(木) 02:00:54
何十年さきのことやら・・・
49デフォルトの名無しさん:2009/05/14(木) 02:02:59
アセンブラでしか記述できない場面は数限りなくあるのに
廃れるわけがない
50デフォルトの名無しさん:2009/05/14(木) 02:03:16
アセンブラはしぶとく生き残るだろ
組み込みがアホみたいに性能あがったけど省電力になればいらないだろうけど
51デフォルトの名無しさん:2009/05/14(木) 02:22:33
完全には無くならんが細々と生き残るだけだろうな
52デフォルトの名無しさん:2009/05/14(木) 03:39:47
コンパイラを作る人がいる限りアセンブラは死なない
53デフォルトの名無しさん:2009/05/14(木) 04:20:15
>>49
大してねーよ
数限りなく挙げてみろよ
54デフォルトの名無しさん:2009/05/14(木) 04:58:56
>>53
難読性を要求するプロテクトプログラムや
厳しいリアルタイム性を要求される計測装置など

コンパイラはこのような場面を全く保証していない
55デフォルトの名無しさん:2009/05/14(木) 05:23:58
#define A (0.1)
#define B (0.5 * A)
#define C (20 * B)

と定義したCをソース内部で使う際どうも計算誤差(小数点以下切捨て?)
が起きている感じなんですが回避する方法はあるんでしょうか?

Cを受け取る変数はfloatのエリアです。
56デフォルトの名無しさん:2009/05/14(木) 05:31:46
>>55
0.1が二進数では無限小数になってるので、表現しきれず途中で打ち切りになってる
0.0999999999・・・
みたいな値になってる、当然これを掛け算に使うと・・・・

1, 5 にして最後に100で割るような整数計算に置き換えるしかない






57デフォルトの名無しさん:2009/05/14(木) 05:59:06
>>55
誤差が許されないなら浮動少数使うなってこと
数値計算ライブラリ使え
5855:2009/05/14(木) 06:03:18
>>56-57
処理的には小数点以下3桁程度あればいいのですが、どうも小数点以下がまったく存在しない状態なんです。
つまりintにでもキャストしたような感じでして・・・

59デフォルトの名無しさん:2009/05/14(木) 06:13:33
>>58
それはその#define文だけではありえない
再現できるソースを出さない限り誰にもわからない
60デフォルトの名無しさん:2009/05/14(木) 06:18:32
%gで表示してるとか?
61デフォルトの名無しさん:2009/05/14(木) 06:34:37
>>55は何が表示されると思ったのか知りたいな。
62デフォルトの名無しさん:2009/05/14(木) 06:58:41
また、あからさまな釣りがwww
A、Bがintだってオチなんだろ。
63デフォルトの名無しさん:2009/05/14(木) 07:15:36
>>62
バカ発見
64デフォルトの名無しさん:2009/05/14(木) 07:45:50
>>55
こうすれば?
#define A (0.1f)
#define B (0.5f * A)
#define C (20.0f * B)

で、Cはfloatだから表示するならprintfの中は"%.3f"。
65デフォルトの名無しさん:2009/05/14(木) 07:55:13
20 * 0.5 * 0.1 = 1
66デフォルトの名無しさん:2009/05/14(木) 08:06:41
有理数ライブラリ作れ
67デフォルトの名無しさん:2009/05/14(木) 08:20:59
>>54
組込み用途のRTOSはC言語で書いてあるぞw
68デフォルトの名無しさん:2009/05/14(木) 08:32:14
Cで書いてアセンブラ出して
それを修正してコンパイル
69デフォルトの名無しさん:2009/05/14(木) 11:40:56
>>54
ずいぶん限定的だな
70デフォルトの名無しさん:2009/05/14(木) 11:47:24
>>65
20 * 0.5 * 0.1 = 1.0
71デフォルトの名無しさん:2009/05/14(木) 12:44:01
今はC++のコンパイラをC#で書く時代
機械語なんかいらんのや
72デフォルトの名無しさん:2009/05/14(木) 16:02:03
getcharで配列の各インデックスに文字を代入して、
文字コードを1シフトさせてa→b c→dのようにするには
どうしたらいいのでしょうか?
73デフォルトの名無しさん:2009/05/14(木) 16:05:46
>>72
それぞれ順番にやれば宜しいかと。
それぞれの遣り方が判らないのなら、質問し直して。
考える気もないなら宿題スレへ。
74デフォルトの名無しさん:2009/05/14(木) 16:13:28
それは環境によって、
いや、それよりもzの場合どうなるのかが知りたくなった。
そうか、bをシフトしないから、zもシフトしないのか。
いやまてまて、それよりgetchar()で受け取ってそれを配列の各要素に入れるようだが、
オーバーランしないようにしておかないといけないではないか。
いやそれより、その配列は基本型または派生型または複合型の複合型なのかはっきりしないとわからない気がしてきた。
75デフォルトの名無しさん:2009/05/14(木) 16:14:06
putchar( 'a' + 1 );
76デフォルトの名無しさん:2009/05/14(木) 16:15:18
'a'の次が'b'だとは限らんわけだが
77デフォルトの名無しさん:2009/05/14(木) 16:17:12
putchar((ch-'a'+1)%26 +'a');
78デフォルトの名無しさん:2009/05/14(木) 16:18:02
'a'の次が'b'でない処理系なんてそうそう無い
79デフォルトの名無しさん:2009/05/14(木) 16:20:56
つ[EBCDIC]

コンピューターの世界を舐めちゃいけませんぜ
80デフォルトの名無しさん:2009/05/14(木) 16:21:41
EBCDICなんて化石マシンくらいしか使ってないだろ
81デフォルトの名無しさん:2009/05/14(木) 16:21:56
まあEBCDICも'a'の次は'b'だけどな
'm'の次は'n'ではない
82デフォルトの名無しさん:2009/05/14(木) 16:22:40
>>80
話を逸らすな
お前は論破されてる
83デフォルトの名無しさん:2009/05/14(木) 16:24:13
論破とかw
84デフォルトの名無しさん:2009/05/14(木) 16:24:36
おれはあいつじゃねえ
85デフォルトの名無しさん:2009/05/14(木) 16:24:40
そもそも規格票にも書いてない事で偉そうに主張するなw
86デフォルトの名無しさん:2009/05/14(木) 16:24:54
'a'の次が'b'でない処理系なんて「そうそう」無い
87デフォルトの名無しさん:2009/05/14(木) 16:25:38
規格票に書いてないことくらい知ってて言っとるわ
88デフォルトの名無しさん:2009/05/14(木) 16:26:40
>>87
顔が真っ赤ですよ
とにかくお前みたいな奴には仕事は任せられんな
89デフォルトの名無しさん:2009/05/14(木) 16:28:11
とニートが申しております
90デフォルトの名無しさん:2009/05/14(木) 16:29:54
とニートが申しております

お前ら一丁前に働いてから物を言え
91デフォルトの名無しさん:2009/05/14(木) 16:30:13
                           ,r;;;;ミミミミミミヽ,,_
                         ,i':r"    + `ミ;;,
       __,、           ≡     彡        ミ;;;i
    〃ニ;;::`lヽ,,_           ≡  彡 ,,,,,、 ,,,,、、 ミ;;;!
    〈 (lll!! テ-;;;;゙fn    __,,--、_  ..   ,ゞi" ̄ フ‐! ̄~~|-ゞ, ≡
   /ヽ-〃;;;;;;;llllll7,,__/"  \三=ー"."ヾi `ー‐'、 ,ゝ--、' 〉;r'  ≡  自分自身を客観的に見ることはできるんです
   >、/:::/<;;;lllメ   \ヾ、  ヽTf=ヽ  `,|  / "ii" ヽ  |ノ
  j,, ヾて)r=- | ヾ:   :ヽ;;:     | l |  l  ''t ←―→ )/イ^    ≡ >75-82 とは違うんです
 ,イ ヽ二)l(_,>" l|    ::\;::    | |  |  ヽ,,-‐、i'  / V
 i、ヽ--イll"/ ,, ,//,,    :;;   l //  l く> /::l"'i::lll1-=:::: ̄\
 ヾ==:"::^::;;:::/;;;;;;;;;:::::::::::::: :::::ゞ ノ/   L/〈:::t_イ::/ll|─-== ヾ
  \__::::::::/::::::::::::_;;;;;;;;;;;;;;;;;ノノ   ヘ   >(゙ )l:::l-┴ヾ、ヽ  )
      ̄~~ ̄ ̄/ :::|T==--:::::  //  / ト=-|:|-─ ( l   /
         / ::  ::l l::::::::::::::::::/ /:::::::::::/:::::(ヽ--─  / |  /
         ヽ_=--"⌒ ゙゙̄ヾ:/ /:::::::/:::::::::`<==-- ノ / /
92デフォルトの名無しさん:2009/05/14(木) 16:30:55
与えられた a→b c→d の変換は
b→b で d→d
以下 a→b (b→b ?) c→d (d→d ?) … と類推すれば良いのか?
93デフォルトの名無しさん:2009/05/14(木) 16:31:44
そこまで考えてませんでした、って事だと思うよ。
94デフォルトの名無しさん:2009/05/14(木) 16:34:06
低レベルな質問だとスレが伸びるなぁ。
95デフォルトの名無しさん:2009/05/14(木) 16:34:31
>>93
まあこの程度の質問するってことは文字コードのこともろくにわかってねーだろうしな
9672:2009/05/14(木) 16:39:12
皆さんありがとうございます。
a→b b→cという風に入力をした文字を1つシフトさせて
次にループしたときは2シフト
次が3シフト…というように
シーザー暗号を入力して、元の文字列になるようなものを作りたいんです。

本に沿って勉強していたのですが自分でも何か作ってみたかったので。
頂いたレスを読んでもう少し考えてみます、ありがとうございます。
97デフォルトの名無しさん:2009/05/14(木) 16:51:48
a->b b->c .... z->??????
98デフォルトの名無しさん:2009/05/14(木) 16:54:06
>>97
テキストとみるからそうなるだけでしょ。
暗号をかけるだけなら、zの次のコードになろうがぜんぜん問題ねえし
99デフォルトの名無しさん:2009/05/14(木) 16:58:35
#include <stdio.h>
void main() {
char *p, a[] = "ABCDE";
p = a;
while (*p++ = *(p + 1));
printf("%s\n", a);
}
上のプログラムは、本に書いてあるとおりですが、自分のPCでコンパイル
するとwhile(  )のコードが
「警告 W8060 lsft.c 7: おそらく不正な代入(関数 main )」という警告を
受けます。実行結果も本では BCDE となっているが自分のPCでは CDE
になります。
while (*p++ = *(p + 1)); のコードの解説に
「代入した文字が「\0」のときは式の評価結果が「偽」となり、繰返しを
終了します」とあるが、なぜこのコードにこの意味が含まれるのか分かり
ません。
100デフォルトの名無しさん:2009/05/14(木) 17:00:36
>>99
C言語が面白くなくなる典型のような例題だな…
101デフォルトの名無しさん:2009/05/14(木) 17:01:22
>>99
その書籍のタイトルと著者は?
102デフォルトの名無しさん:2009/05/14(木) 17:01:27
>>99
Cは = と == が紛らわしいから
ちなみにその警告は無視して良い

無視してはいけない場合も当然ある
103デフォルトの名無しさん:2009/05/14(木) 17:03:00
>>99
うわこれ副作用完了点について理解してない著者が書いてる
今すぐ本を窓から投げ捨てろ
104デフォルトの名無しさん:2009/05/14(木) 17:04:27
英語の授業で言えば、本場の人でも一生の間に一回使うか使わないか
という言い回しを問題としてやらせているって感じだな
105デフォルトの名無しさん:2009/05/14(木) 17:05:34
これって確か動作の結果は未定義だったような

要するに鼻から悪魔だよな
106デフォルトの名無しさん:2009/05/14(木) 17:05:42
>>99
a[] = "ABCDE";
この最後に実は\0(文字コードとしては0x00)が必ず置かれます。
でa[]のポインターを0x00がくるまで移動しています。
でその文字コードを真偽判定に使ってるんですが・・・

本は捨てた方がいいです。
これを薦めた人も捨てた方がいいです(可能であれば
107デフォルトの名無しさん:2009/05/14(木) 17:06:37
whileの中の*p++がすでに未定義でトラップ
108デフォルトの名無しさん:2009/05/14(木) 17:06:51
>>96
putchar((ch-'a'+shift)%26 +'a');
109デフォルトの名無しさん:2009/05/14(木) 17:06:56
>>99
void main() じゃなくて int main() なんですが、それはさておき
私のところでは実行結果は BCDE ですね。
環境を教えてください。
110デフォルトの名無しさん:2009/05/14(木) 17:07:38
>これを薦めた人も捨てた方がいいです(可能であれば

ワロタw
111デフォルトの名無しさん:2009/05/14(木) 17:10:48
*p++ = *p;

こういう書き方は

http://www.kouno.jp/home/c_faq/c3.html#0

を参照してもらえばわかるが、動作が未定義である。
動作が未定義という意味は、実行の結果どんな事が
起こっても文句は言えないという意味である。
112デフォルトの名無しさん:2009/05/14(木) 17:11:48
>>107
「*p++ に p を用いた演算結果を代入してる」 がトラップだよね?
113デフォルトの名無しさん:2009/05/14(木) 17:14:41
そもそもどういう動作を期待してるのかわからんのだが…
114デフォルトの名無しさん:2009/05/14(木) 17:15:41
>>113
相当古い時期に書かれた本だと思うよ。
最近書かれた物ならマジで著者と本を薦めた人を捨てた方がいい
115デフォルトの名無しさん:2009/05/14(木) 17:15:41
++インクリメント演算子は式の評価が完了するまでのどこかの
点で適用される事を意味している。

式の評価が全部完了している事を保証する場所を「副作用
完了点」と言い、この場合はセミコロンの直前である。

ところが =代入演算子の両側に同じ変数 p が出現している。
つまり++は左辺を評価した後で適用されるか、右辺を評価した
後で適用されるかは規格では定められていないのである。

こういう場合規格では未定義の動作が起こるとしている。
116デフォルトの名無しさん:2009/05/14(木) 17:18:53
この短時間レス集中でわかるように、成功と失敗の境界領域にある
レアな構文だから、構文テクニック大好きな文学少年達が目の色
変えて集まってくる。
こういうトリッキーな構文は怪しげなので避けて通るのが無難。
というようなことをその参考書は書いていたんじゃないのか?
117デフォルトの名無しさん:2009/05/14(木) 17:19:08
なんか、例の文字列コピーみたいな奇怪なコードを書こうとして、失敗したようにしか見えんw
118デフォルトの名無しさん:2009/05/14(木) 17:19:58
>>98
バカ発見
119デフォルトの名無しさん:2009/05/14(木) 17:20:16
まずは書籍と著者を晒せ。
120デフォルトの名無しさん:2009/05/14(木) 17:20:20
が、読み進めると 副作用完了点の話と未定義の話が出てきて
どういう結果になるかは保証できない って脚注にあったりして

でも >>99 の本はマズイよなぁ…
121デフォルトの名無しさん:2009/05/14(木) 17:21:22
柴田望洋まじオヌヌメ
122デフォルトの名無しさん:2009/05/14(木) 17:22:07
なんだ俺が昔書いた本じゃね〜かよ
123デフォルトの名無しさん:2009/05/14(木) 17:25:35
>>122
今すぐC業界から足を洗ってください
お願いします
124デフォルトの名無しさん:2009/05/14(木) 17:26:30
こんなコード書くやつがあうの携帯ファーム作ってるんだろうな
125デフォルトの名無しさん:2009/05/14(木) 17:27:36
while ((*p = *(p + 1))) p++;
のように代入式を ( )でくくって代入式を評価してるんだとアピールすれば警告でないよね
126デフォルトの名無しさん:2009/05/14(木) 17:27:46
a[i] = i++;が駄目なのはわかるんだけど、
a[i++] = i;も駄目なの?
127デフォルトの名無しさん:2009/05/14(木) 17:28:53
>>126
だめだって
i++とか++iは途中に書くなってことだ
128デフォルトの名無しさん:2009/05/14(木) 17:28:55
それはいい
129デフォルトの名無しさん:2009/05/14(木) 17:29:20
>>126
ダメ
そろそろ理解しろ
130デフォルトの名無しさん:2009/05/14(木) 17:29:54
>>128
嘘教えるなよ

131デフォルトの名無しさん:2009/05/14(木) 17:30:35
つーかそこまで省略してどうなるっていうんだよ
マシン語になったらたいした違いねーだろ
132デフォルトの名無しさん:2009/05/14(木) 17:31:05
規格を厳密に知ってる奴ばかりじゃないんだからフェイルセーフでいこうぜ
133デフォルトの名無しさん:2009/05/14(木) 17:33:31
99.
皆さんコメントありがとうございました。
102.さんのコメントを参考に = を == に変えたら
コンパイル、実行結果とも正常になりました。
134デフォルトの名無しさん:2009/05/14(木) 17:34:19
>>133
だからそういう問題じゃないって
135デフォルトの名無しさん:2009/05/14(木) 17:38:18
あーあ
変な本のせいでまた一人間違った知識を身に付けちまったぞ
136デフォルトの名無しさん:2009/05/14(木) 17:39:39
>>133
その場合=と==ではやろうとしてることが違う
そもそもwhile()の中でそんな式入れるなってことだ
137デフォルトの名無しさん:2009/05/14(木) 17:45:35
これだけいろいろレスがついてるのにそんな解釈しちゃうなんて、
本当にプログラミング向いてないか釣りかのどっちかだろ。
138デフォルトの名無しさん:2009/05/14(木) 17:54:09
99.
99=133.
すみません。
= を == に変更したのですが、実行結果はABCDEでした。
目的通りの結果と思いましたが、プログラムの目的は
文字列の左シフトですから勘違いしてしまいました。
もし133にコメントがありましたら、お手数をかけまして
すみませんでした。


139デフォルトの名無しさん:2009/05/14(木) 17:56:32
== は || や && や , と違って副作用完了点にはならんよね? 
140デフォルトの名無しさん:2009/05/14(木) 17:57:11
>>139
ならん
141138++:2009/05/14(木) 17:57:24
すみません、>>99で文字列の左シフトを
実現するにはどうしたらいいですか
142デフォルトの名無しさん:2009/05/14(木) 18:07:34
俺なら
while (*p) { p[0] = p[0]+1; p++; }
ってな感じに書くかな。
特に代入のところで *p = *p+1; とか書いて あれ?って迷うぐらいならシンプルに ということで
143デフォルトの名無しさん:2009/05/14(木) 18:08:25
>>141
while文のカッコの中だけで済ませようとするから無理がくる

ポインタ変数を二つ用意するか、文を二つに分けるかのどちらかだな
144デフォルトの名無しさん:2009/05/14(木) 18:22:09
>>99>>141

こんな感じでどちらか選べ

#include <stdio.h>
#include <string.h>

int main(void)
{
char *p, *q, c, a[] = "ABCDE", b[6];

strcpy(b, a);

/* ポインタ変数を二つ用意する方法 */
p = a; q = a + 1;
while (*p++ = *q++);
printf("%s\n", a);

/* 文を二つに分ける方法 */
p = b;
do {
c = *(p + 1);
*p++ = c;
} while (*(p - 1));
printf("%s\n", b);

return 0;
}
145138++:2009/05/14(木) 18:24:05
>>142
a[] = "ab9*765Zz";
とかでも大丈夫なの?
146デフォルトの名無しさん:2009/05/14(木) 18:26:16
>>145
ポインタの指す中身を指定する*と文字列の*は全く無関係
というか入門書もう一回読みなよ
147138++:2009/05/14(木) 18:38:30
>>144 どうも、どうも
すみません、僕>>99じゃないです。
なんか、src、destポインタ二つの方が解りやすいですね。
148デフォルトの名無しさん:2009/05/14(木) 18:39:31
>>147
普通はそうする
文を分けると可読性が著しく低下する
149デフォルトの名無しさん:2009/05/14(木) 18:58:32
便乗

 a[i++] = *p;  /* 実は p == &i */

こういうのも悪魔召還?
150デフォルトの名無しさん:2009/05/14(木) 19:03:46
初心者です

C言語でマイコン研修をやっているのですが、
PICに入れるプログラムの周波数を大きく設定して実行してしまいました。

この場合マイコンやPICは故障したりするのでしょうか?
すれ違いならすみません・・
151デフォルトの名無しさん:2009/05/14(木) 19:18:10
>>150
故障したから聞いてるの?
故障しなかったから聞いてるの?
152デフォルトの名無しさん:2009/05/14(木) 19:20:25
マイコンについて知らないけど、プログラムの周波数というのはどんなものなの?
153デフォルトの名無しさん:2009/05/14(木) 19:20:43
>>149
もちろんです
154デフォルトの名無しさん:2009/05/14(木) 19:25:39
>>151
故障したかわからないまま終わってしまったので不明です。。
155デフォルトの名無しさん:2009/05/14(木) 19:41:07
いや、スレチを指摘やれよ
156デフォルトの名無しさん:2009/05/14(木) 19:42:21
>>150
「プログラムの周波数」とは何のことですか?
157デフォルトの名無しさん:2009/05/14(木) 19:43:57
つーか、鼬害だがな。
158デフォルトの名無しさん:2009/05/14(木) 19:46:29
>>150
ようするに安易にオーバークロックやって壊したんでしょ?
新しいの買いなよ
159デフォルトの名無しさん:2009/05/14(木) 19:51:24
>>156
言い方悪かったです
プロジェクトを作成するときに動作環境の周波数を決めるんだけどその時に間違ってしまった
という意味です


どうやらそれだけでは壊れないみたいなので解決しました
すれ違い盛大に失礼しますた
160デフォルトの名無しさん:2009/05/14(木) 20:10:24
動作環境の周波数って何?
コンベアとかの関係?
161デフォルトの名無しさん:2009/05/14(木) 20:26:49
ヘルツだな
162デフォルトの名無しさん:2009/05/14(木) 20:50:17
>>149
いや、i++ によって p の値が変わるわけではないから、書き手の意志でそう書いたのなら問題ないでしょう。
163デフォルトの名無しさん:2009/05/14(木) 20:53:42
>>159
don't mind.
164デフォルトの名無しさん:2009/05/14(木) 20:58:43
>>162
pじゃなくて*pの値がどうなるかわかんないでしょ
165デフォルトの名無しさん:2009/05/14(木) 21:02:12
インクリメントされる前の値に決まってるが
166デフォルトの名無しさん:2009/05/14(木) 21:03:34
>>164
*p は p = &i を実行したときの値のままですよ。i++ によって p も*p もかわらない。
だから、書き手がそう望んだのならそのとおりに動く、書き手の意図どおりのはず。
167デフォルトの名無しさん:2009/05/14(木) 21:12:04
#include <stdio.h>
int main(void)
{
  int i=0;
  int *p = &i;

  printf("p: %x\n", p);
  printf("*p: %x\n", *p);
  puts("i++");
  i++;
  printf("p: %x\n", p);
  printf("*p: %x\n", *p);
}

$ ./a.exe
p: 22cce4
*p: 0
i++
p: 22cce4
*p: 1

168デフォルトの名無しさん:2009/05/14(木) 21:18:00
>>167
それは当たり前。
p = &i;
a[i++] = p;
は、インクリメントという副作用がどこで発生するかによって結果がかわる、という問題にはあてはまらないのですけれども。
書き手の意志どおりにうごくので問題ないのでは?
169デフォルトの名無しさん:2009/05/14(木) 21:18:46
>>167が何が言いたいのかわからない。
まさか>>166の「*pがかわらない」が>>149でのコード中でのことだと理解できなかったとか?
170デフォルトの名無しさん:2009/05/14(木) 21:20:59
171デフォルトの名無しさん:2009/05/14(木) 21:21:32
>>166
だからi++が実行されるのが*pを読み出す前なのか後なのか
わからないと言っているんですけど
172デフォルトの名無しさん:2009/05/14(木) 21:22:46
後置インクリメントなんだから*p呼び出した後に決まってるだろうがw
173デフォルトの名無しさん:2009/05/14(木) 21:23:16
このレベルの低さはやばい
174デフォルトの名無しさん:2009/05/14(木) 21:24:25
>>172
お前Cプログラマに向いてないよ
マジでそのセンスの無さやばいから
175デフォルトの名無しさん:2009/05/14(木) 21:56:07
ベクトル空間モデルがわかりません
詳しく教えてください
176デフォルトの名無しさん:2009/05/14(木) 21:57:47
>>172
ならば a[i++] = i; も 右辺側の i を参照した後にインクリメントされるの?

これを ポインタ使ったエイリアスで書き換えた形が >>149 なんだよね
177デフォルトの名無しさん:2009/05/14(木) 22:21:06
>>175
ベクトル空間の2直線は、そのなす角が小さいほど似ていると考えられる。
たとえば、xy座標で(1,1)を通る直線と、角度46度、44度を通る直線は
ともに角度のずれは1度だけ。
ベクトル空間モデルはこういうずれを計っている。
178デフォルトの名無しさん:2009/05/14(木) 22:31:23
>>171
なるほど。やっと理解した。レベル低くしてすまない。
179デフォルトの名無しさん:2009/05/14(木) 23:10:59
ポストインクリメント演算子++は、i++と書かれていた場合は
iを参照した「後に」pの値を増やす事が保証されているだけで、
iを参照した「直後」に増やす事は保証されていない。

a[i++] = *p; /* p = &i */ の場合は副作用完了点はやはり
セミコロンの直前なので、*pを参照する前にiが増やされるのか
*pを参照した後にiが増やされるのか見ただけでは判断できない。

つまり処理系依存である。ANSI-C(C89)ではもっと厳しく
実行結果は「未定義」、つまり鼻から悪魔が出てくるとしている。
180デフォルトの名無しさん:2009/05/14(木) 23:57:50
>>179
C99で定義されてないの?
181デフォルトの名無しさん:2009/05/15(金) 00:01:27
されてません。
182デフォルトの名無しさん:2009/05/15(金) 00:02:05
>>180
C99を採用してるコンパイラでなければ意味無いだろ。
つまり使うなってことだよ。
183デフォルトの名無しさん:2009/05/15(金) 00:05:16
もう10年経つんだから、C99じゃないコンパイラの方が珍しいんじゃないの
184デフォルトの名無しさん:2009/05/15(金) 00:09:10
はあ?
185デフォルトの名無しさん:2009/05/15(金) 00:09:56
>>183
つ[VS2008]
つ[CodeGear C++]

この二大メーカーがまだC89のままです
186デフォルトの名無しさん:2009/05/15(金) 00:17:16
>>185
10年経つのに対応しないって...
結局C++のC部分で十分ってことだよね。
あと窓ではCユーザー少ないから対応しなくても問題なしってことかな
次ではそれらC99対応するん?
187デフォルトの名無しさん:2009/05/15(金) 00:17:17
IntelとAMDの出してるのはC99準拠だよ。あと、Sunのも。
188デフォルトの名無しさん:2009/05/15(金) 00:19:08
AMDのC・C++コンパイラなんて出してたの?
189デフォルトの名無しさん:2009/05/15(金) 00:21:44
>>186
しません
多分永遠にしないでしょう
C++があれば十分だと思っているようですから
190デフォルトの名無しさん:2009/05/15(金) 00:24:09
>>188
CPUメーカーの維持なんだろう
intel版がAMD CPUに最適なコードをはいてくれなくてCPUが遅いといわれる可能性もあるだろうし
その逆もしかり
191デフォルトの名無しさん:2009/05/15(金) 00:48:10
でも確かgccベースじゃなかった?
192デフォルトの名無しさん:2009/05/15(金) 06:50:01
GCCをベースにする以外、急には作れなかったのだろう。。。
193デフォルトの名無しさん:2009/05/15(金) 12:46:27
マウスでいまクリック、もしくはドラッグしているファイルやディレクトリのパスを
取得する方法ってありますか?常駐ソフトのような形で、起動してからクリック、ドラッグ
したファイルのパスをテキストログとして、出力するようなものを作りたいのですが・・・。
194デフォルトの名無しさん:2009/05/15(金) 12:47:52
195デフォルトの名無しさん:2009/05/15(金) 12:51:29
すいません、他行ってきます。
196デフォルトの名無しさん:2009/05/15(金) 16:30:44
なんでスレタイ読めないヤツっているんだろうね。
書き込む前に考えないのだろうか。。。
197デフォルトの名無しさん:2009/05/16(土) 12:33:21
C言語で N88 BASICのLOCATEような 事どうすればできますか?

コンソールアプリケーションで作成して 一番下までいくと
次からは違うページになってしまうので 画面を固定したいのですが
毎回CLS(system("cls");) 掛けると 画面がチカチカして 堪らないので
198デフォルトの名無しさん:2009/05/16(土) 12:39:37
>>197
エスケープシーケンスとか使うんじゃない。
制御コードは端末依存。
199デフォルトの名無しさん:2009/05/16(土) 12:58:39
>>198

ttp://www.kumei.ne.jp/c_lang/intro/no_27.htm

こういう物のことですか?
ここに書かれているエスケープシーケンスでは
CLSすら効かないです。

VC++6.0 では不可なのでしょうか?
200デフォルトの名無しさん:2009/05/16(土) 13:23:15
>>199
・プログラムにバグがある(ESCが正しく出力されてない、等)
・ESCシーケンスの効かない端末を使っている(GUIアプリ等)

まあソース晒すのがいいと思う
201デフォルトの名無しさん:2009/05/16(土) 13:30:05
コマンドプロンプトだからだろw
コマンドプロンプトにエスケープシーケンスは効かねーよw

そのページは古い、昔のwindowsではサポートしてたからな
202デフォルトの名無しさん:2009/05/16(土) 13:35:57
>>200

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9180.cpp

ロダにあげました。よろしくお願いします。
汚いソースですが勘弁してください。
場所はメイン関数の中にある
// テスト用 エスケープシーケンス 効かない
の場所です。

203デフォルトの名無しさん:2009/05/16(土) 14:05:19
どっちかというとこっち向き。

Win32API質問箱 Build79
http://pc12.2ch.net/test/read.cgi/tech/1240411224/
204デフォルトの名無しさん:2009/05/16(土) 14:12:10
>>203

えーと、APIですか?
APIは全く使ってないので関係ないと思うのですが。
205デフォルトの名無しさん:2009/05/16(土) 14:16:28
206デフォルトの名無しさん:2009/05/16(土) 14:56:46
>>205

ありがとうございます。
やってみたのですが出来ませんでした。

207デフォルトの名無しさん:2009/05/16(土) 15:20:48
#include<stdio.h>
#include<stdlib.h>

int setstr(char **p, char *q){
*p = malloc(strlen(q)+1);
strcpy(*p, q);
return strlen(*p);
}

main(){
char **s;
setstr(s, "test");
puts(*s);
}


setstr関数で文字列コピーをしたいのですがうまくいきません。。。なぜでしょうか。
コンパイルは通るのですがなぜか偉ーで落ちます。。。
208デフォルトの名無しさん:2009/05/16(土) 15:25:08
とりあえずメモリ確保しろばか
もしくはchar **s;
じゃなく char *s;
でやれクズ
209デフォルトの名無しさん:2009/05/16(土) 15:27:29
>>202
ESCシーケンスの使い方は間違ってない
実際、cygwinでコンパイルしたら、ちゃんと動いた。(VC6は持ってない)

ただし-mno-cygwinを付けるとダメだったので、素のDOSプロンプトは
ESCシーケンスを使えないんだと思う。

WindowsでESCシーケンスが使うのは大変そうだけど、以下の2案挙げておく。

(1) 他の人がいうように ansi.sysを入れて DOSプロンプトを起動する
#自分は試してない

(2) teraterm + cygwin接続 (teratermはESCシーケンスを解釈する)
の環境でそのプログラムを実行する
  #こっちは大丈夫そう。ただしVT100互換でないかも
210デフォルトの名無しさん:2009/05/16(土) 15:29:25
>>207
main(){
char *s;
setstr(&s, "test");
puts(s);
}
でOk
211デフォルトの名無しさん:2009/05/16(土) 15:31:14
多分 teraterm案はやらないと思うけど、念のため補足。
teraterm で試すなら CLS の部分は、 printf("\033[2J\033[0;0H"); 
とした方がいい。 ESC [ 2 J だけでは カーソル位置が戻らなかった。
212デフォルトの名無しさん:2009/05/16(土) 15:33:47
じゃぁ俺も細かいこというとDOSプロンプトは受け付けるよ

コマンドプロンプトは受け付けないけど
213207:2009/05/16(土) 15:41:21
早速のレスありがとうございます。

>>208
mallocでメモリ確保は行っていますが。。。

>>208,>>210
おっしゃるとおり**sを*sにすると期待した動作になりました。
引数としては**sも&(*s)も同じに見えるのですが。
なぜでしょうか。
214デフォルトの名無しさん:2009/05/16(土) 15:43:06
>>211

レスどうもです。
(1)はどうやっても効きませんでした。
なので(2) 試してみたいと思います。

最も、チカチカしないように出来ればエスケープシーケンス
使えなくても良いのですが、自分では他にいい案が思い浮かばず
それならLocateと同じ事が出来ればいちいちCLSを繰り返し
処理(書いては消すの繰り返し=チカチカ)しなくても、
いけるのでは?と思ったからです。
というのもブロック消す処理は入っているのでCLS不要なわけですし
215デフォルトの名無しさん:2009/05/16(土) 15:47:53
NT系のDOSプロンプトでエスケープシーケンスを使いたいのなら、
WIN32アプリではなくDOSアプリにしないといけない。
9xはDOS/Winごちゃ混ぜだったので、
Win32アプリでもANSI.SYSのエスケープシーケンス処理が適用された。
NTは分離されている。
216デフォルトの名無しさん:2009/05/16(土) 16:23:47
>>213
char **sはchar *に対するポインタでこの時点ではどこを指してるか不定。
217デフォルトの名無しさん:2009/05/16(土) 16:30:05
>>21
確保できてねーだろ死ね
お前の書いた糞コードに近いやり方するとしたら
#include<stdio.h>
#include<stdlib.h>

int setstr(char **p, char *q){
*p = malloc(strlen(q)+1);
strcpy(*p, q);
return strlen(*p);
}

main(){
char **s;
s = malloc(sizeof(char *));
setstr(s, "test");
puts(*s);
}

こういうことだ、わかったかぼけ
218210:2009/05/16(土) 16:41:41
>>216-217
理解できました。
char **sを宣言したとき
sはメモリのどこかを指していてそれがどこかを指している
で、そのままsetstr関数に渡すと
不定な場所にmallocの返り血を書き込もうとして落ちていたわけですね。

どうもありがとうございます。



219デフォルトの名無しさん:2009/05/16(土) 16:52:29
確かに返り血だな

malloc「ゴラ!!変なエリア渡すンじぇねえよ。いてまうで」
プログラム「ふぎゃあ・・・」
220デフォルトの名無しさん:2009/05/16(土) 22:02:47
>>204
API使わなきゃできないつってんだよ
221デフォルトの名無しさん:2009/05/16(土) 22:11:01
>>219
malloc が 0 返してきたあかつきには、どうしていいかわかりません。みなさんどうしているのでしょうか。
222デフォルトの名無しさん:2009/05/16(土) 22:13:09
システムをエラー終了させます
223デフォルトの名無しさん:2009/05/16(土) 22:22:48
>>222
そんなんでいいのでしょうか。といっていいお作法はおもいつかない。
224デフォルトの名無しさん:2009/05/16(土) 22:23:30
NULLを進呈されても被害最小に治める妥協点を見積りステートの保存を行って置きます。
妥協点がプログラムのゼロスタートになる場合も多々あります。
225デフォルトの名無しさん:2009/05/16(土) 22:25:18
>>224
断片化されたんではどうしようもないですし。
226デフォルトの名無しさん:2009/05/16(土) 22:29:36
メモリーが無くなってからの復旧は、ほとんど可能性が無い。
無理にがんばらずに、メモリがなくなったとエラーメッセージを出して終了が間違いなし
227デフォルトの名無しさん:2009/05/16(土) 22:32:18
メモリは差し上げられませんねぇ

って言われたらもう何もまともに続行出来ないじゃん。
あきらめが肝心。
228デフォルトの名無しさん:2009/05/16(土) 22:34:47
断片化してるだけなら分割確保すればいける事も
229デフォルトの名無しさん:2009/05/16(土) 22:38:20
>>223
コンパクション処理走らせてた時代もあったな。
使ってないデータはディスクに書き出して容量確保するとか、そういう努力もしてた。
230デフォルトの名無しさん:2009/05/16(土) 22:41:42
Linuxあたりになるとmalloc()はNULLを返さないらしいから、
NULLチェック自体が無駄かも。
231デフォルトの名無しさん:2009/05/16(土) 22:42:02
今そんな処理がアプリケーションをする時代でなくなってきちゃって
「メモリ?…ハァ?スタックでがまんしろよおい」って言われたら思わず噴出す(ブシャー)
232デフォルトの名無しさん:2009/05/16(土) 22:43:45
233デフォルトの名無しさん:2009/05/16(土) 22:48:41
>>231
どうした???発狂したか???
234デフォルトの名無しさん:2009/05/16(土) 22:51:30
なんで頭の中で言った文章と書き込んだモノが違うんだろうと悩んでる
235デフォルトの名無しさん:2009/05/16(土) 23:08:37
>>230
アドレス空間って聞いたことある?
32bitのLinuxでmalloc(3*1024*1024*1024)出来ると思ってる?

俺もシステム全体での「物理メモリ(スワップ?)」が足りない時のLinuxの動作は知ってるけどさ。
236デフォルトの名無しさん:2009/05/16(土) 23:12:54
用語すら怪しいレベルで知ってるとはおこがましい
237デフォルトの名無しさん:2009/05/16(土) 23:26:55
お前が知らないのは日本語だな。

俺は、Linuxの「プロセスを有無を言わさず殺す動作」が起きるのが
「物理メモリが足りない時」と「スワップ領域が足りない時」のどちらの場合なのかを
知らないだけだ。
238デフォルトの名無しさん:2009/05/16(土) 23:28:36
あ、用語か。

「OOM killer」
これでいいかな。
239デフォルトの名無しさん:2009/05/16(土) 23:57:38
>>235
linuxのmalloc()がNULLを返さないってのは、いかなるときでも絶対返さないって意味じゃないよ。
240デフォルトの名無しさん:2009/05/17(日) 00:15:46
じゃ別に無駄じゃないじゃん
241デフォルトの名無しさん:2009/05/17(日) 00:23:23
>>239
ならば
>NULLチェック自体が無駄かも。
と書かれているのは何故ですかね。


ちゃんとわかってる人には今更説明するまでも無いけど

仮想記憶を使っているOSでは、普通mallocは、アドレス空間が足りない時に、NULLを返す。
その他、一般的には、malloc内で呼んでいるシステムコール(例えばWin32ならVirtualAlloc)が
メモリをくれなかった場合にも、mallocはNULLを返す。
ただ、Linuxは、システムコール自体では「メモリ不足エラー」を返さず、
その領域にアクセスした瞬間に、どこかのプロセスを強制終了させてメモリを確保する。
そのため、Linuxにおいては後者のケースでNULLを返すことはない。

しかし、一般的に「mallocがNULLを返す」というのは、アドレス空間不足によるものが殆ど。
(物理メモリが足りなくても仮想記憶で補っているため)
したがって、mallocを使っている限り、「NULLチェックしなくて良い」などということは無い。
返された領域(NULL)にアクセスして不正終了しても構わないというなら不要といえば不要かもだが。

繰り返すけど
mallocがNULLを返す状況というのは、アドレス空間の不足が殆どなので
「LinuxだからNULLチェック不要」などということはありえない。
242デフォルトの名無しさん:2009/05/17(日) 03:17:35
C++ではnewが投げるbad_allocを拾うことにあんまり意味はないといわれてるが
その話とごっちゃになってるんじゃないか
243デフォルトの名無しさん:2009/05/17(日) 04:49:00
偽のときのびっくりマーク(!)って何て読めばいいんですか?
244デフォルトの名無しさん:2009/05/17(日) 04:57:42
>>243
bang
245デフォルトの名無しさん:2009/05/17(日) 04:59:56
日本人相手なら「びっくり」で通じるよw
246デフォルトの名無しさん:2009/05/17(日) 08:42:05
not
247デフォルトの名無しさん:2009/05/17(日) 09:09:17
>>240
malloc()を読んだ時点では、メモリ確保に成功したか失敗したか
わからないから無駄だという考えもある。
248デフォルトの名無しさん:2009/05/17(日) 09:11:41
あたまわる
249デフォルトの名無しさん:2009/05/17(日) 09:21:36
>>241
×アドレス空間
○プロセスに割り当て可能なメモリ
250デフォルトの名無しさん:2009/05/17(日) 10:07:07
>>248
頭悪いね。NULLチェック必要だって固定観念を棄てられないんだから。
251デフォルトの名無しさん:2009/05/17(日) 10:08:39
>>241
>ただ、Linuxは、システムコール自体では「メモリ不足エラー」を返さず、
>その領域にアクセスした瞬間に、どこかのプロセスを強制終了させてメモリを確保する。

これ本当?
252デフォルトの名無しさん:2009/05/17(日) 10:11:40
>>251
そう。
NULLを返さなくても、それにアクセスしたときにエラーになる。

manpageにはバグって書いてあるけど、そういう仕様。

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html
253デフォルトの名無しさん:2009/05/17(日) 10:21:08
linux の malloc について新しいカーネルでは
/proc/sys/vm/overcommit_memory
で挙動が変えられるみたい

malloc の NULL チェックが必要ないと言ってる奴は
環境依存な話をしてるだけ
254デフォルトの名無しさん:2009/05/17(日) 10:23:58
>>252
mallocしたプロセスの観点ではエラーにならないんだよね。
他の誰かが死ぬだけで。(それもどうかと思うけど)
255デフォルトの名無しさん:2009/05/17(日) 13:07:37
>>250
何?悔しかったの?w
256デフォルトの名無しさん:2009/05/17(日) 13:10:28
>>254
他の誰かとはかぎらんよ。
自分が殺される可能性だってある。
257デフォルトの名無しさん:2009/05/17(日) 13:16:53
>>253
だから最初からlinuxではって言ってるじゃん。

>>255
いや、ぜんぜん。
自分が悔しかったり、むかついたりすると、相手もそうだと思っちゃうよね。
258デフォルトの名無しさん:2009/05/17(日) 13:31:26
>>257
プロセスごとに使用可能なメモリ量を制限することも可能だし
古いカーネルを使い続けるのでない限りは
linux でも NULL チェックは意味があるって事になってるんだって
259デフォルトの名無しさん:2009/05/17(日) 13:49:54
黙ってNULLチェックする

これで万事FAだろ。
260デフォルトの名無しさん:2009/05/17(日) 15:31:15
文字列を入力して、そのまま出力するプログラムなんだけど
これだと出力出来ないし、最後のprintfをforで回してa[i]にするとエラーが出る。

何が違うの?

#include <stdio.h>

void main(void){

char a[10];
int i;
a[9] = '\0';

for( i = 0 ; i < 9 ; i++ ) scanf("%s",a);

printf("入力した文字列は%s",a);

}
261デフォルトの名無しさん:2009/05/17(日) 15:33:41
入力をループでまわす意味がわからんw
262デフォルトの名無しさん:2009/05/17(日) 15:37:32
ものすごい勘違いをしてるなw
263デフォルトの名無しさん:2009/05/17(日) 15:39:54
>>260
ああw
intと違って連続で入力すれば良いだけかw
264デフォルトの名無しさん:2009/05/17(日) 15:44:13
unsigned char型と宣言して、
scanfで%sとして全角で入力させた文字を、
10進数、16進数のコードで表示させるにはどうすればいいですか?
ただ%dや%xとしただけではだめだったのですが…。
265デフォルトの名無しさん:2009/05/17(日) 15:48:03
全角って何かわかってるのか
266デフォルトの名無しさん:2009/05/17(日) 15:49:59
えっと、日本語で入力させてます。
267デフォルトの名無しさん:2009/05/17(日) 16:01:59
アドレスとポインタの違いが判りません。
ポインタはアドレスを格納する変数という理解で良いでしょうか。
268デフォルトの名無しさん:2009/05/17(日) 16:05:33
>>257
だから、

char *p = malloc(3 * 1024 * 1024 * 1024);
printf("p = %p\n");

を 32bit Linuxで実行してみろっての。バカ。
269デフォルトの名無しさん:2009/05/17(日) 16:08:35
頭大丈夫?
270デフォルトの名無しさん:2009/05/17(日) 16:10:26
誰が?
271デフォルトの名無しさん:2009/05/17(日) 16:11:50
>>264
全角は半角2字分のデータ。

>>267
OK
272デフォルトの名無しさん:2009/05/17(日) 16:12:25
頭の悪さを指摘されて悔しくてたまらないもんだから
わざと頭が悪い振りをしてるんでしょ。
理解できないわけないんだから。用語がどうとか言ってた無知も居るし。
273デフォルトの名無しさん:2009/05/17(日) 16:17:51
アドレスの使い方なんぞ複数の戻り値以外に思いつかないぜ
274デフォルトの名無しさん:2009/05/17(日) 16:20:46
>271
ありがと。

あとは、配列とポインタの違いだけど、
配列はアドレスだけどポインタじゃないから、任意のアドレスは格納できない。
ってところが違い?
275デフォルトの名無しさん:2009/05/17(日) 16:24:13
配列はアドレスだけど、って日本語としておかしいと思わないか
276デフォルトの名無しさん:2009/05/17(日) 16:25:40
配列はアドレスの「値」「定数」「ラベル」という認識でよい。

ただ、ポインタもそうだが、「型をもつアドレス」だからな。
それと、ポインタ変数だけでなく、ポインタの値のこともポインタと呼ばれる。
277デフォルトの名無しさん:2009/05/17(日) 16:29:55
sizeof(...)の違いもある。
278デフォルトの名無しさん:2009/05/17(日) 16:37:45
>275
ほんとだな。
俺、日本語でおk、だな。

>276、277
ありがとうございます。
ポインタや配列は型付きのアドレスなんですね。

279デフォルトの名無しさん:2009/05/17(日) 16:44:56
>>278
完璧に間違ってる。

配列は配列。ポインタではない。
変更不可能な左辺値。普通のオブジェクト。
280デフォルトの名無しさん:2009/05/17(日) 16:46:05
>>276
頼むから間違い広めないでくれ。
281デフォルトの名無しさん:2009/05/17(日) 16:48:45
>>276 はアセンブラしか知らない人なんだよ。察してやれ
282デフォルトの名無しさん:2009/05/17(日) 17:06:02
あれ、
ポインタは型付きのアドレスじゃないの?
283デフォルトの名無しさん:2009/05/17(日) 17:11:09
void *
284デフォルトの名無しさん:2009/05/17(日) 17:21:05
インクリメントしたときに、sizeof分アドレスが進むこととかを指して
型付きと言ってるんだよね?
あってんじゃん?
285デフォルトの名無しさん:2009/05/17(日) 19:09:35
>>284
俺は「アドレス」という語が出た時点で
機械的にこいつダメだなと判断する。
286デフォルトの名無しさん:2009/05/17(日) 19:44:45
sizeofした時の結果は、どのようにして求めてるの?
287デフォルトの名無しさん:2009/05/17(日) 19:45:47
しかもsizeofを全角で書いてくるとは。
288デフォルトの名無しさん:2009/05/17(日) 20:55:10
普通に考えればsizeofはコンパイル中に値を出してる筈。
でもリテラル評価のタイミングでは数字になってない。
289デフォルトの名無しさん:2009/05/17(日) 21:11:59
sizeofの値は、オペランドが可変長配列以外の時はコンパイル時に決定される。
290デフォルトの名無しさん:2009/05/17(日) 23:26:11
コンパイル時にですか!
と言うことはexeにはその値が埋め込まれているだけってことですね。
291デフォルトの名無しさん:2009/05/18(月) 00:40:41
今更だけど、>>249って本当に全然わかってないんだな
292デフォルトの名無しさん:2009/05/18(月) 00:46:23
うん、ただのゴミ。
293デフォルトの名無しさん:2009/05/18(月) 00:49:15
Cなんてなつかしw
294デフォルトの名無しさん:2009/05/18(月) 09:57:30
>>290
埋め込まれる保証もないよ。最適化で適当な値に換算されているかもしれないし。
295デフォルトの名無しさん:2009/05/19(火) 15:13:30
2Dのゲーム製作って何が出来れば出来るようになるのか曖昧なんだけど
どの程度のレベルから作り始められるのかが良く分からん。

コンソールを一通り扱えれば、後はライブラリの勉強すれば作れるようになるの?
アルゴリズムさえうまく作れれば、作れる気がするんだが。

それともwinAPIの勉強も必要?
296デフォルトの名無しさん:2009/05/19(火) 15:17:32
/*snapshot.c*/
2 /*メッセージ出力関数*/
3 #include <stdio.h>
4 #include <stdarg.h>
5 #include <time.h>
6
7 #define MAX_SIZE 512
8 static char *symbol[] = {"I","W","E"};/*メッセージレベル*/
9
10 int snapshot(int type,char *fmt, ...){
11 char tstr[MAX_SIZE];/*文字列化した時間を格納するchar型配列*/
12 char buff[MAX_SIZE];/*出力メッセージを格納するchar型配列*/
13 char message[MAX_SIZE];/*ユーザ指定のメッセージを格納するchar型配列* /
14 time_t ct;
15 struct tm *lst;
16 va_list ap;
17 int num = sizeof(symbol) / sizeof(symbol[0]);
18
19 if(type < 0 || type > num -1){
20 type = 0; /*強制にtypeに0を代入*/
21 }
297デフォルトの名無しさん:2009/05/19(火) 15:18:23
22 /*時間の取得と書式変換*/
23 time(&ct);
24 lst = localtime(&ct);
25 strftime(tstr,MAX_SIZE,"%Y/%m/%d %H:%M:%S",lst);
26 /*可変引数の初期設定*/
27 va_start(ap,fmt);
28 /*指定されたメッセージの取り出しと独自メッセージの作成*/
29 vsprintf(message,fmt,ap);
30 sprintf(buff,"%s [%s] %s",tstr,symbol[type],message);
31 /*可変引数の後始末*/
32 va_end(ap);
33 /*独自メッセージの出力*/
34 fprintf(stdout,"%s",buff);
35 return 0;
298デフォルトの名無しさん:2009/05/19(火) 15:19:20
1 /*snapshot.h*/
2 extern int snapshot(int type,char *fmt,...);
3 #define NORMAL 0
4 #define WARNING 1
5 #define ERROR 2
299デフォルトの名無しさん:2009/05/19(火) 15:20:32
1 /*snapshot2.c*/
2 #include <stdio.h>
3 #include "snapshot.h"
4
5 int main(void){
6 int i = 10;
7 snapshot(NORMAL,"normal message. %d\n",i);
8 snapshot(WARNING,"warning message. %d\n",i++);
9 snapshot(ERROR,"error message. %d <%s>\n",i++,"final message");
10 return 0;
11 }
300デフォルトの名無しさん:2009/05/19(火) 15:25:21
これでコンパイルする
gcc -o snapshot2 snapshot2.c
snapshot2.c:(.text+0x2f): undefined reference to `snapshot'
snapshot2.c:(.text+0x4e): undefined reference to `snapshot'
snapshot2.c:(.text+0x75): undefined reference to `snapshot'
となり、コンパイルすることができません。
このプログラムは教材のプログラムです。
何回も見直したので写間違いはないと思います。
多分僕が共通範囲を理解していないのかもしれません。
コンパイルできないものを質問するのは失礼ですが、どうしても分かりません。
ご指摘お願いします。
301デフォルトの名無しさん:2009/05/19(火) 15:34:46
>>300
>>296の13行目の * / を */ になおしたうえで、

gcc -o snapshot2 snapshot2.c snapshot.c

でやってみ
302デフォルトの名無しさん:2009/05/19(火) 16:01:06
>>301
コンパイルすることができました。
コンパイル命令が違っていたのですね...
実行結果は教材に書かれていたのとは違いましたが
それは自分で考えて見ます。
本当にありがとうございました。
303デフォルトの名無しさん:2009/05/19(火) 17:33:13
#include<stdio.h>

int main(void) {
int a = 5;

if ( a < 10 ){
printf("10未満です。\n");
} else{
printf("10以上です。\n");
}
}


ビルドエラーが起きる どこが間違っているか教えてください 
間違いは3ヶ所あるようです
304デフォルトの名無しさん:2009/05/19(火) 17:38:03
全角スペース
305デフォルトの名無しさん:2009/05/19(火) 17:45:26
>>304 ありがとう!!

 
306デフォルトの名無しさん:2009/05/19(火) 18:23:03
>>303
メイン関数の返り血をintに設定しているのにreturnで整数を返さないのは
おかしいのではないでしょうか?
まあこれはエラーではなく警告になるようですね。
307デフォルトの名無しさん:2009/05/19(火) 18:28:13
>>306
C99ならmainでreturnを省略すると0が返ると決められている。
C99じゃないならreturn 0;しとけ。
308デフォルトの名無しさん:2009/05/19(火) 19:07:43
#includeと<stdio.h>の間にスペースが無い
309デフォルトの名無しさん:2009/05/19(火) 19:12:13
>>308だから何なんだ?www
310デフォルトの名無しさん:2009/05/19(火) 19:41:18
{がある行の文頭に1を加えて表示させ、以降}がある行まで文頭に1を表示させ出力する。
{がある行の区間にさらに{が出てきた場合には、1を加え2を表示させ、}が出てきた場合には1を表示させるようなプログラムはどうやったら実現できますでしょうか?
例を書きますと、
元のtxt


 }


  {

 }

出力txt

1{
1 }

1{
2  {
2
2 }
1}

行毎に読み込むまでは出来るのですが、行毎に読み込み元の文章に文字列を加え出力する、というのがわかりません。
どなたか教えてただけたら幸いです。
311デフォルトの名無しさん:2009/05/19(火) 19:43:32
>>310
printf("%4d %s", no, line); とかじゃなくて?
312デフォルトの名無しさん:2009/05/19(火) 19:54:20
>>311さん、ありがとうございます。
当方の言葉が足りませんでした。プログラムに表示させるのではなく書き込んだ後ファイルとして出力します。
313デフォルトの名無しさん:2009/05/19(火) 19:57:26
fprintfにすりゃいいだろw
314デフォルトの名無しさん:2009/05/19(火) 20:00:23
>>310
作ってみたw
#include<stdio.h>

int main(int argc, char *argv[])
{
FILE *fp_in=stdin, *fp_out=stdout;
char buf[256];
int i, brace_count=0;

while(fgets(buf, sizeof(buf), fp_in))
{
for(i=0;buf[i];i++) if(buf[i]=='{') brace_count++;
fprintf(fp_out, "%2.0d %s", brace_count, buf);
for(i=0;buf[i];i++) if(buf[i]=='}') brace_count--;
}
return 0;
}
315デフォルトの名無しさん:2009/05/19(火) 20:05:47
>>314
{}{}{}
に対して
1 {}{}{}
なのか
3 {}{}{}
なのか
負数はどうするとか不明なのに書いちゃダメだ
316デフォルトの名無しさん:2009/05/19(火) 20:17:18
>>313さん
>>314さん
ありがとうございます。>>314さんは書いてくださって本当に感謝しています
>>315さん
まずは書いてくださったコードを読んで、自分なりに理解してから検討したいと主思います。
317デフォルトの名無しさん:2009/05/19(火) 21:53:01
>>295
@ウィンドウの出し方を調べる
A絵の出し方を調べる
B絵の表示位置をキー入力で変えられるようにする
あとは表示する絵を増やしていけばいいだけ難しくない
318デフォルトの名無しさん:2009/05/20(水) 06:22:19
一通りC言語を覚えたので技術力を上げたいのですが
Project Euler以外でなんか良い方法や問題や参考書ありませんか?

将来はソフトウェア開発関係の仕事を考えています
319デフォルトの名無しさん:2009/05/20(水) 06:25:57
>>318
まあどういう方面に進むかわからないけど

・ゲームを一人でシステムだけ作ってみる。
・DBと連携したシステムを書いてみる

のどちらかかなあ?

まあハードウェアの制御用アプリを書くってのもあるんだろうけど
320デフォルトの名無しさん:2009/05/20(水) 06:42:13
>>319
なるほど、参考にさせていただきます

ゲームはC言語とライブラリを使って作ったりはしているんですが
ライブラリよりWin32APIからDirectXで作ったほうがいいのでしょうか?
321デフォルトの名無しさん:2009/05/20(水) 06:55:54
ライブラリ使ってで問題ない。それよりもきちんと完成させることの方が大事
322デフォルトの名無しさん:2009/05/20(水) 07:00:45
>>320
ライブラリに関していえば所詮は環境依存なのでゲーム作るのであれば
たとえばDXライブラリの上で動いてるゲームであっても問題ないです。


323デフォルトの名無しさん:2009/05/20(水) 07:14:10
なるほど、つまり流れを覚えてきちんと完成させるってことでいいんでしょうか?
>>321-322 さん ありがとうございます
324デフォルトの名無しさん:2009/05/20(水) 07:38:50
>>323
まあそういうことですね
ためしに過去のゲームレベルを一人で作ってみるとか挑戦するのもいいかもしれないですね。
グラフィックとか音楽はあまりこだわらずに。
グラフィックとか音楽はハードの進化で確かに綺麗になったりしてますが、
ゲームそのもののシステムは実はそれほど進化してないんですよね。
325デフォルトの名無しさん:2009/05/20(水) 07:52:10
DXライブラリは凄く初心者に取っ付き易くて助かる。
OpenGLはDXライブラリで作ってからじゃないとムリだw

俺もCやり始めて1ヶ月とちょっとだけど、DXで製作出来てる。

…どの程度のが出切るのか不安だけどね
326318:2009/05/21(木) 03:28:10
>>324
そうなんですか
最近はゲームがきれいになってきたので難しいものだと考えてました

過去のゲームを作る上ではやっぱりアルゴリズムなんかも覚えないといけないんでしょうか?
実際自分はまだ文法しか勉強していないのでソートなどのアルゴリズムとか覚えてないんですが…
327デフォルトの名無しさん:2009/05/21(木) 05:01:19
>>326
まあドット絵や3Dモデルをバリバリ作れるわけじゃないのであんまり偉そうな
ことはいえないけど、プログラマ視点からすればさほど変わらんかなあ。

特にアクションが無いゲームの場合は表現方法が2Dか3Dかの違いだしねえ
328デフォルトの名無しさん:2009/05/21(木) 06:20:42
>>326
まずは標準C++の仕様を学んだ方がいいんじゃない?
慣れも大きいが、C言語で書くよりC++で書いた方が
ライブラリなどもそろっているし楽かと。
329デフォルトの名無しさん:2009/05/21(木) 10:58:58
あのですね、dosでclでコンパイルしてC言語やってるので、
dosのことで聞きたいことが2つくらいあるんですけどここじゃダメなんですかね?
dos専用スレみたいなところってあるんですかね?
オマケで教えてもらうことって無理すか?

叩きスレがなければこのあと質問させていただきます。
330デフォルトの名無しさん:2009/05/21(木) 11:00:10
>>329
DOSスレか環境依存スレかVisualStudioスレへどうぞ。
331デフォルトの名無しさん:2009/05/21(木) 11:15:33
それどこですか?
332デフォルトの名無しさん:2009/05/21(木) 11:29:54
DOSでプログラミング
http://pc12.2ch.net/test/read.cgi/tech/1047001533/l50
Visual Studio IDE環境
http://pc12.2ch.net/test/read.cgi/tech/1115707321/l50
【初心者歓迎】C/C++室 Ver.65【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1239326399/l50
333318:2009/05/21(木) 15:47:23
>>328
C++ですか
やってみようと思います。

あとC言語から発展してWin32APIとDirectXは必ずやる予定なんですが、
これはどのように勉強すればいいのでしょう?
普通に文法を覚えていけばいいのでしょうか?
板違いだったらすいません。
334デフォルトの名無しさん:2009/05/21(木) 16:48:19
今はもう Win32APIはあまりいらないかな。
DirectXでつくるゲーム入門みたいな本が大量にあるから、いくつか買って勉強。
335デフォルトの名無しさん:2009/05/21(木) 17:02:21
APIとかやってたら何時になったらゲームに辿り着くんだろう
336デフォルトの名無しさん:2009/05/21(木) 17:11:35
if文の判定式について質問です。

if(a == b || *(c-a) == d) hogehoge();

a!=bならc-aは触って良いことが保証されている場所だとして、
上の書き方はc-aを触らないことが保証されますでしょうか?
それとも、最適化等の都合で、*(c-a) == dが先に評価されることが起きうるのでしょうか。
337デフォルトの名無しさん:2009/05/21(木) 17:19:00
コンパイラ依存
338デフォルトの名無しさん:2009/05/21(木) 17:21:59
ififにしたほうがいいような
339デフォルトの名無しさん:2009/05/21(木) 17:28:43
>>336
保証される。
340デフォルトの名無しさん:2009/05/21(木) 17:29:52
>>336
ANSI準拠のコンパイラなら問題なしみたい

用語は「ショートサーキット」
341デフォルトの名無しさん:2009/05/21(木) 17:45:26
>>337-340
ありがとうございます。規格上は問題ないのですね。gccを信用することにします。
ショートサーキット調べてみました。映画でした。……じゃなくて、オペランドに対する評価順序の規則でした。
最近は複数コアCPUが並列処理して一気に評価してたりするのかなってぼんやり思ってたんですが、
そうではないんですね。。。
ありがとうございました。
342デフォルトの名無しさん:2009/05/21(木) 20:09:55
CというかObjective-cについてです。
以下のコードの流れについて知りたのですがよく分かりません。
行ごとに簡単に解説してくれると助かります。よろしくお願いします。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
Animations:nil context:nil];
[UIView setAnimationDuration:0.7];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:selfcache:YES];
if ( enabled )
[[UIApplication sharedApplication] sendAction:@selector(buttonPushed:)
to:target from:self forEvent:event];
[UIView commitAnimations];
343デフォルトの名無しさん:2009/05/21(木) 21:05:48
344デフォルトの名無しさん:2009/05/21(木) 23:23:59
やっぱいつ見てもObjectiveCはカオスだわ
SmallTalkもカオスっぷりが禿しないけど
345q:2009/05/22(金) 00:47:33
データの格納のアルゴリズムがわからなくて質問させてください。
*formatのデータをunsigend char buff[192]に格納し、buffを転送用関数の引数にセットし送ります。
例えば*formatがサイズが200の場合、buff[0]〜buff[9]は固定データを格納します。
buff[10]〜buff[192]までformatの中身を格納します。転送用関数で転送後(戻りなし)、
formatの残り18byteをまたbuff[0]〜[17]へ格納します。二回目の格納は[0]〜[9]までに固定データの格納はありません。
これをなるべく早く行いたいのですが、どのように行えばいいですか。よろしくお願いいたします。
346デフォルトの名無しさん:2009/05/22(金) 01:01:47
>>345
意味がよくわからない。。。

void tensou(unsigned char *b, int length){
/*だみー*/
}

main(){
unsigned char format[200], buff[193], kotei[10];

memcpy(buff, kotei, 10);
memcpy(buff+10, format, 183);
tensou(buff, 193);
memcpy(buff, format+183, 17);
tensou(buff, 17);
}
347345:2009/05/22(金) 01:29:35
>>346
すいません。。

やりたいことはprintfで渡ってくるデータをいかに効率よく出力exeに送るかということを
やりたいんです。自作printfを作成していて・・

@出力exeに転送する前にprintfから渡ってきたデータの先頭に10byteに固定データを入れる。
A最大192byte転送できる転送用関数の引数としてバッファをセットする。

ということなんですが、転送用バッファの最大が192byteなのでそれ以上のときはどうすればよいかなと。
なおかつスピードが要求されています。
348デフォルトの名無しさん:2009/05/22(金) 01:42:34
"格納のアルゴリズム"なんてスゲーことやろうとしてんな…
っておもった
*formatってのがよくわからん
349345:2009/05/22(金) 01:48:13
>>348

int printf(*format...){
}
の*formatです。
350デフォルトの名無しさん:2009/05/22(金) 01:52:26
いや多分ボトルネックは*formatの分割とかではなく
むしろ転送うんぬんの部分じゃないか?
何か不満のあるやりかたでもしてるの?
351デフォルトの名無しさん:2009/05/22(金) 03:11:28
>>347
組み込みか何かでバッファを使いまわさないとダメなのか?
PC上の話ならこれでいいと思う
なんてったって printf は自作するにはハードルが高い

void tensou(char *b, int length);

int myprintf(const char *format, ...)
{
char buf[1024]={"固定データ"}; // 十分な領域サイズにすること
int i, whole_size, tensou_size=192;
va_list ap;

va_start(ap, format);
whole_size=vsprintf(&buf[10], format, ap)+10;
va_end(ap);

for(i=0;i<whole_size;i+=tensou_size)
{
if(tensou_size>whole_size) tensou_size=whole_size;
tensou(&buf[i], tensou_size);
}

return size;
}
352345:2009/05/22(金) 10:02:23
すいません。昨日は落ちました。転送用バッファは他人からの提供関数で仕様変更は効きません。可変データを固定バッファに入れるは難しいでしょうか?今、色々考えてるのですが。
353デフォルトの名無しさん:2009/05/22(金) 10:20:41
リングバッファの変形だろう
354デフォルトの名無しさん:2009/05/22(金) 15:46:37
初歩的なことで申し訳ない
Aという構造体があるんだが
A **aみたいに宣言した場合、このaのメンバにアクセスするにはどうすればいいんだ?
普通のポインタならa->numだからダブルなら *a->num という風にやるのかと思ったができない
355デフォルトの名無しさん:2009/05/22(金) 15:51:00
優先順位見てみよう
->のが*より優先度高いので*a->numだと*(a->num)になる。
(*a)->numでやってみて。
356デフォルトの名無しさん:2009/05/22(金) 15:55:48
(*(*a)).num
357デフォルトの名無しさん:2009/05/22(金) 15:57:14
>>355
なるほど。優先順位で別の意味に解釈されてたのか
ありがとう!おかげで作業が進むよ
358デフォルトの名無しさん:2009/05/22(金) 19:14:27
>>352
1.どういう手順でその関数を呼び出すのか分からない
(例.特定アドレスに送信内容を設定した後、送信用の関数を呼び出す)
2.printf の結果について最大サイズの計算は可能か
3.メモリ使用量の制限があるのかどうか

どっちにしろ >>351 で大体おkだと思うんだがね
359デフォルトの名無しさん:2009/05/23(土) 00:29:36
あるすげー長いテキストファイルのいくつかを
コピー改行コピー改行
して追加書き込みしたいんだけど
どれくらい領域確保すればいいのやら
360デフォルトの名無しさん:2009/05/23(土) 00:38:52
テキストの中身の領域を調べるのって
どうするの?
361デフォルトの名無しさん:2009/05/23(土) 00:45:22
>>359
あんまりいいロジックではないかもしれないが

線形リストと構造体でなんとかなるんでない?
362デフォルトの名無しさん:2009/05/23(土) 00:53:35
typedef struct hoge HOGE;
struct hoge
{
   struct hoge *next;   //リスト用
        int  num;    //構造体が持っている文字数(改行などの制御文字含む)
}

リストと文字数管理用の構造体はこんな感じにして

領域確保の際は

malloc(sizeof(HOGE)+len);

lenは改行コードまでの1行分の長さ
363デフォルトの名無しさん:2009/05/23(土) 01:03:52
あーでもあれかメモリ上であれこれしなくてもそのままファイルに書き出すのであれば
入力側からちびちび読み込んで1行分の文字数をカウントしながら出力しつつ
改行する必要があれば出力側に改行コードを追加で出力するようにすればいいのか。


というか文字コードは何とか1行はどのくらいで区切るとかがわからないと
コードがもらえないよな
364デフォルトの名無しさん:2009/05/23(土) 02:40:53
最悪一バイト挿入する毎にズレる部分を採って入れて繰り返せば
char tmp;

で十分・・・
365デフォルトの名無しさん:2009/05/23(土) 02:46:54
日本語でおk
366デフォルトの名無しさん:2009/05/23(土) 02:49:03
質問者がインプットとアウトプットなどもうちょっと仕様にあたることを
書かないとどうしようもないわな。
文字が絡むと面倒なことが多いし。
367デフォルトの名無しさん:2009/05/23(土) 03:01:01
よくわからんがプログラム書かなくてもマクロで解決できるような気がする
368デフォルトの名無しさん:2009/05/23(土) 09:07:36
>>365
C言語でおk
日本語で説明するよりCでコードを書いて最適化してもらったほうがわかりやすい
369デフォルトの名無しさん:2009/05/23(土) 15:05:59
来年春からプログラマとして働くけど、
それまでにある程度勉強しときたい通用しないだろうけど基本は

今ネコでもわかるC言語プログラムが終わって、これの次の難易度的な本はありますか?
370デフォルトの名無しさん:2009/05/23(土) 15:10:14
未経験採用ならそんだけやっときゃ十分だよ
371デフォルトの名無しさん:2009/05/23(土) 15:11:51
バグや納期遅れでもへこたれない胆力を鍛える

これが一番かなあ
372デフォルトの名無しさん:2009/05/23(土) 15:20:54
>>369
それくらい自分で探せるようになることかな。
373デフォルトの名無しさん:2009/05/23(土) 15:22:35
>>369
>>372みたいな人間にならないようにな
374デフォルトの名無しさん:2009/05/23(土) 15:35:12
若いのにドカタ一直線だな。他業種目指せばよかったのに
375デフォルトの名無しさん:2009/05/23(土) 16:12:51
>>369
勉強より、強靭な体力、根性力をつける
先ず、今年の夏は冷房(エアコン、扇風機等)なしで過ごし
夏休みは日中の暑い中、毎日1時間以上走れ
376デフォルトの名無しさん:2009/05/23(土) 16:42:20
それと徹夜力を身につけとけ
大体2日寝ないでも特に問題無く3日目活動出来るようにしとくべき

冗談じゃなくてマジで
377デフォルトの名無しさん:2009/05/23(土) 16:50:47
#include<stdio.h>
#include<math.h>
int main(void)
{
double t,h,df,a,r,c,o,e,i,f,vc,dvc;
t=0;
h=0.000001;
e=sqrt(2)*100;
o=3.14*2*50;
a=2;
r=20;
c=1.0*0.0001;
for(t=0;t<=10;t=t+h)
{
df=e*sin(o*t)-vc-a*r*f*f*f*f*f;
dvc=a/c*f*f*f*f*f;
f=f+h*df;
vc=vc+h*dvc;
i=a*f*f*f*f*f;
if(t>9.98){         
printf("%f , %f \n",t,i);
}
}
return 0;
}
このグラミングbcc32で実行しようとすると
エラー E2206 a.txt 20: 不正な文字 ' ' (0x8140)(関数 main )
っていうのがでてしうんですが、どこがエラーを起こしてるんでしょうか?
20行目周辺みてもミスがわからないです。
378デフォルトの名無しさん:2009/05/23(土) 16:51:45
>>377
さがせよ とか
379デフォルトの名無しさん:2009/05/23(土) 16:54:20
>>369
EffectiveC++
380デフォルトの名無しさん:2009/05/23(土) 16:56:26
>>378
Ctrl+Aであぶりだししてみろ
381デフォルトの名無しさん:2009/05/23(土) 17:16:08
どっからコピペしたのか知らんが、なんでそこにだけ仕込んであるんだろ
382デフォルトの名無しさん:2009/05/23(土) 17:18:54
>>377
全角空白
383デフォルトの名無しさん:2009/05/23(土) 17:20:48
VCのコンパイラはclですよね
なんでclという名前なんですか?
bccとかgccは名前を略したものでしょうけど。
384デフォルトの名無しさん:2009/05/23(土) 17:33:12
c languageの略らしい
ごめんなさい嘘です
385デフォルトの名無しさん:2009/05/23(土) 17:35:33
compileの略らしい
ごめんなさいテキトーです
386デフォルトの名無しさん:2009/05/23(土) 17:36:10
たぶん、はるか昔のMS-Cから連綿と伝わる…かな?
387デフォルトの名無しさん:2009/05/23(土) 17:36:39
>>384
マジで!?
>>385
ハァ?死ねよ
388デフォルトの名無しさん:2009/05/23(土) 17:37:44
MSCのころからだね。LINKもするからlついてんじゃない?
MASMはmlだしな。
389デフォルトの名無しさん:2009/05/23(土) 17:41:55
まだ、マイクロソフトが中企業だったころだから、会社名はつけれなかったかも?
なにせ、むかしのMSは営業力で伸びていったのだから、社名は出さない方が良かった
390デフォルトの名無しさん:2009/05/23(土) 17:43:07
coolの略だよ
391383:2009/05/23(土) 17:48:01
>>388
リンクはlink.exeの仕事ですね


392377:2009/05/23(土) 17:59:46
わかりました
ありがとうございました
全角空白あるとエラー起こすんですね
393デフォルトの名無しさん:2009/05/23(土) 18:09:32
>>391
それを言ったらコンパイルはc1、c2だろう。
今はdllだけど昔はexeだった。
394デフォルトの名無しさん:2009/05/23(土) 19:38:02
>>388
masmは以前はmasm.exeだよ。
むしろcl.exeにあわせる為にml.exeに変更された。
masmとlinkを実行するドライバとしてだったと思う。
395デフォルトの名無しさん:2009/05/23(土) 21:31:24
C言語の勉強法で悩んでいます。
入門本を2冊読んで基本はだいたい分かったのですが、いざ何かを作ろうと思っても何も手が進みません。
サンプルプログラムの本をAmazonで探してみましたが、JavaやRubyなどはたくさんあるのですがCは何故か全然見つかりません。
独学で勉強してる人は、入門本以降どのように勉強してるのですか?
396デフォルトの名無しさん:2009/05/23(土) 21:33:48
コンソールじゃなんにも作れないのは当然だろw
ちょっとしたデータの一覧表を出力出来る程度。

アプリケーション開発したいならAPIとかに移れ
ゲームならなんかのライブラリ使え、OpenGLとかオススメだけど難しいかもしれん。

どっちにせよコンソールで関数ポインタとかぐらいまで使いこなせないと、開発は難しいと思う。
397デフォルトの名無しさん:2009/05/23(土) 21:37:49
C++に移ってboostなどを学ぶのも良いかと。
いずれにせよ先はめっちゃくちゃ険しいけど、熱意を持ち続けられればいけるよ!

上の言う通り関数ポインタとかまではまだ入門レベルだから頑張ってね。
398デフォルトの名無しさん:2009/05/23(土) 21:40:42
>>394
同様にclもmsc.exeからっだった。
399デフォルトの名無しさん:2009/05/23(土) 21:58:24
ではMSCの前身となったLatticeCはどうだったのだろうか。
400デフォルトの名無しさん:2009/05/23(土) 22:39:11
>>395
入門書の次は基本的なデータ構造とかアルゴリズムの勉強とかかなぁ
数値計算とかデータ処理したいだけならべつにいらないけど
windowsとかで普段使ってるような文字だけじゃないアプリとかゲーム作るんだったらwindows APIでぐぐるといい
401デフォルトの名無しさん:2009/05/23(土) 23:02:55
数値計算とかデータ処理にデータ構造とかアルゴリズムがいらないって
どういう世界だよ
402デフォルトの名無しさん:2009/05/23(土) 23:07:18
<p>〜勉強とかかなぁ</p>
<p>〜べつにいらないけど
windowsとかで〜</p>

ということでは?
403デフォルトの名無しさん:2009/05/23(土) 23:43:31
>>400 の脳内セカイ。
404デフォルトの名無しさん:2009/05/24(日) 00:07:38
>>395
データ構造・アルゴリズムとか。
あと自分で何かを作ろうとするのもいいですね。お題が見つからないのなら宿題スレはいかが?
405345:2009/05/24(日) 01:12:52
>>358
書き込み遅くなりました。
>1.どういう手順でその関数を呼び出すのか分からない
(例.特定アドレスに送信内容を設定した後、送信用の関数を呼び出す)

送信関数は転送用バッファにデータを入れ引数にセットすればよいです。
特に難しいことは考えなくてよいです。

>2.printf の結果について最大サイズの計算は可能か

すいません。質問の意味が理解できなかったです。

>3.メモリ使用量の制限があるのかどうか
Winプログラムなんで気にしなくてよいです。
ただありとあらゆるところから呼ばれるので、
処理速度を気にしてます。

やっぱり、固定ではmemcpyで処理したあと、引数で渡ってくる(printf(*format...))文字データは
一文字ずつ格納していくしかないのでしょうか?
考えたんですがそれしか思い浮かばなかったです。

406デフォルトの名無しさん:2009/05/24(日) 01:29:13
C言語の授業で、「ブロック変数とは何か調べる.また,atuo変数と異なることを示す検証用のコードを書け」という課題が出ました。
まずブロック変数とは何か教えてください!
ググっても、ヤフー見ても、具体的な単語の説明がなかったので困っています。
407デフォルトの名無しさん:2009/05/24(日) 01:31:31
ブロック {}
ブロック変数 {int a;}

まあauto変数もブロック変数なんだけど。
408デフォルトの名無しさん:2009/05/24(日) 01:34:28
>>406
#include<stdio.h>

int main(void){
int atuo=5;

printf("%d\n", atuo);
{
int atuo=100;
printf("%d\n", atuo);
atuo+=10;
printf("%d\n", atuo);
}
printf("%d\n", atuo);

return 0;
}
409デフォルトの名無しさん:2009/05/24(日) 01:36:36
>>407
>>408
ありがとうございます!
410デフォルトの名無しさん:2009/05/24(日) 01:43:31
>>405
転送用の関数について
1.関数プロトタイプを書いてくれ
2.関数を呼び出す手順があるなら書いてくれ

例えば "ABC" という3文字の固定文字列を転送するだけのサンプルを
示してくれれば多分回答可能
411デフォルトの名無しさん:2009/05/24(日) 07:21:03
エンディアンを気にする必要があるのって通信とファイル操作のときだけですか?
412デフォルトの名無しさん:2009/05/24(日) 07:59:45
インディアン嘘付かない
413デフォルトの名無しさん:2009/05/24(日) 08:25:48
>>411
union使うときも気にする必要があるかもしれない
414デフォルトの名無しさん:2009/05/24(日) 08:58:06
下記のプログラムは実験用なので、入力範囲など、細かなチェックは、なしでいいのですがVS2005だと、こんな感じでscanfは正常に数値を入力できるのですが
array[1]:1
array[2]:2
array[3]:3
gcc-4.4.0だと、
要素数:3
昇順に入力してください。
array[0]:1
array[0]:2
array[0]:3
となってしまします、何処がおかしいのか、教えてくださいませ。文字型%sで受けて、整数型にキャストするのが吉なのでしょうか?
↓コードの一部です
415デフォルトの名無しさん:2009/05/24(日) 08:59:23
>>414より
#include <stdio.h>
#include <stdlib.h>
int main(void) {
  int num, key, idx, i;
  int *array;
  printf("要素数:");
  scanf("%d", &num);
  array = (int *)malloc(sizeof(int) * num);  // 要素数numの配列
  if(array == NULL) {
    printf("メモリの確保に失敗しました。\n");
    exit (0);
  }
  printf("昇順に入力してください。\n");
  for (i = 0; i < num; i++) {
    do {
      printf("array[%d]:", i);
      scanf("%d", &array[i]);
      } while (array[i] < array[i - 1]);  // 前の入力値より小さければ再入力
    }
  printf("探す値:");              // キー値の読込み
  scanf("%d", &key);
  idx = binSearch(array, num, key);      // 配列xから値がkeyの要素を探索  if (idx == -1)
    printf("その値の要素は存在しません。\n");
  else
    printf("その値はarray[%d]にあります。\n", idx);
  free(array);
  return 0;
}
416デフォルトの名無しさん:2009/05/24(日) 09:12:11
for(i = 0, ・・・
・・・ array[i - 1]);
417デフォルトの名無しさん:2009/05/24(日) 09:12:22
>>414
VSでも偶然動いてるだけ
418デフォルトの名無しさん:2009/05/24(日) 09:31:13
>>416>>417Thx
気付きました_(--)_
419デフォルトの名無しさん:2009/05/24(日) 12:31:51
OCRで文字読み取って、自動でコード生成するプログラムだれか作って
420デフォルトの名無しさん:2009/05/24(日) 12:45:24
失せろゴミ
421デフォルトの名無しさん:2009/05/24(日) 13:01:21
>>419
何だこのカス。
422デフォルトの名無しさん:2009/05/24(日) 14:36:10
unsigned int i;

i = 1U<<30;



i = 0x40000000;

とどちらがスピードが早いのですか?
423デフォルトの名無しさん:2009/05/24(日) 14:43:17
同じ
424デフォルトの名無しさん:2009/05/24(日) 14:49:39
実測してくれ
425デフォルトの名無しさん:2009/05/24(日) 14:51:14
これはさすがに実測する必要ないだろ。
426デフォルトの名無しさん:2009/05/24(日) 14:52:38
コンパイルする速度だったら実測する価値があるかも
427デフォルトの名無しさん:2009/05/24(日) 14:54:30
>>426

敢えてやる必要は
断じて
*な い*
428デフォルトの名無しさん:2009/05/24(日) 15:03:00
どっちが読みやすいかだな

大抵は上の方だから上で書く習慣にしておけばいいと思うけど
429デフォルトの名無しさん:2009/05/24(日) 15:38:37
初期化するときみたいに{}で作る配列を関数の引数にしたいんですけどどうやればいいんでしょうか?

int foo(int *p, int len){・・・;};
foo({1, 2, 3}, 3);

こんな感じで使いたいんですけど、うまくいきません
430デフォルトの名無しさん:2009/05/24(日) 15:40:30
ある環境でどっちかが速かったとしても
別の環境がどうなるかは分からない
結論:好きにしろ
431デフォルトの名無しさん:2009/05/24(日) 15:42:52
>>429
C99でいいならできるけど
どうやるか忘れたw
432デフォルトの名無しさん:2009/05/24(日) 15:44:38
>>429
gccなどC99対応コンパイラなら、foo((int[]){1, 2, 3}, 3);と書ける。
433デフォルトの名無しさん:2009/05/24(日) 15:50:53
vc++でやってみましたができませんでした
あきらめてgccを使いますね・・・
434デフォルトの名無しさん:2009/05/24(日) 15:52:10
>>429
{
int bar[]={1,2,3};
foo(bar, 3);
}
435デフォルトの名無しさん:2009/05/24(日) 16:22:03
副作用、副作用完了点について教えてください
a[i] =i++;は使うなということくらいしかわかりません

K&Rのp66の説明にある
関数呼び出しはたぶんcdeclとか呼び出し規約によって結果が異なると理解しています
入れ子になった代入文とはどんなものでしょうか?

よろしくお願いします
436デフォルトの名無しさん:2009/05/24(日) 16:53:46
>>435
後置インクリメント演算子++の働きについて考えてみるとよい
++ は適用されたオブジェクトの元の値を返し、オブジェクトの
値を +1 するという事はわかるよね

しかし、【いつ】オブジェクトの値を +1 するかという事になると、
副作用完了点の直前、としか定義されていない

つまり、a[i]を評価してから +1 するのか、 i++を評価してから +1
するのかどちらかなのかは、この式を見ただけでは判断できない

コンパイラのみぞ知るなわけ

C89より前ではこの振る舞いをunspecifiedとしていたが、C89では
undefined、つまり未定義とした

つまり鼻から悪魔
437デフォルトの名無しさん:2009/05/24(日) 16:58:04
>>435
さらに関数呼び出しの引数の評価順については、関数呼び出しは
特別なケースになっていて、func(a, b, c) とあったらこの中の ',' は
カンマ演算子ではなく、単なる引数のセパレータとして働く

もちろん func (a, (b, c), d) とあった場合の (b, c) はカンマ演算子
である

C89では関数の呼び出しに際して各引数の評価順は右から左でも
左から右でもないとしている

つまりどのような順番で評価されるかわからない

a b c かもしれないし a c b かもしれないし b c a かもしれない

だから評価順に依存したプログラムを書いてはいけない

関数呼び出しに関しては副作用完了点は関数を実際に呼び出す
タイミングの直前にすべての引数の評価が終わっているという事になる
438デフォルトの名無しさん:2009/05/24(日) 17:19:12
まあ、規格を杓子定規に読むとそうなるが
実際にはfunc(a, b, c)をa,b,c以外の順番で評価するような悪趣味なコンパイラはまず存在しない
評価順をそう仮定して依存したコードを書いても、問題になるようなことは普通はありえない
安心して依存するといい
439デフォルトの名無しさん:2009/05/24(日) 17:21:27
>>438
そーでもない

440デフォルトの名無しさん:2009/05/24(日) 17:29:19
自分で確かめたわけじゃないが
VC++はDebugとReleaseで評価順が変わることがあるって記事を見たことあるぞ
441デフォルトの名無しさん:2009/05/24(日) 17:29:28
>>438
最適化前後で変わったことがある
442デフォルトの名無しさん:2009/05/24(日) 17:35:03
てゆーかものすごい素直な実装だったところで、
むしろ c, b, aの順になりそうなもんだけど
443デフォルトの名無しさん:2009/05/24(日) 18:07:53
>>438
>実際にはfunc(a, b, c)をa,b,c以外の順番で評価するような悪趣味なコンパイラはまず存在しない
はあ?
お前の足りない知識においてはそうなのかもしれないが・・・
>評価順をそう仮定して依存したコードを書いても、問題になるようなことは普通はありえない
そんなコードを回してきたヤツが居たら
もうそいつは信用できないと思うのは俺だけではないだろう。
444デフォルトの名無しさん:2009/05/24(日) 18:10:16
とりあえず

分けてかけ

その程度省略してなんになる。

今の時代はマネージドとかいってるんだぞ

Cであっても安パイなコード書け
445デフォルトの名無しさん:2009/05/24(日) 18:11:07
なにそれ規格信者こわい
446デフォルトの名無しさん:2009/05/24(日) 18:13:18
>>445
規格を理解出来ないヤツは間違いなく無能。
447デフォルトの名無しさん:2009/05/24(日) 18:15:37
>>446
だよな
コンピューター開発なんて規格との戦いだろ
いい加減文字コード統一しろ
エンディアンも統一しろ
448デフォルトの名無しさん:2009/05/24(日) 18:15:55
世の中のコンパイラが全て規格通りに出来てるわけでもあるまいに
規格なんて法律じゃないし、絶対でもない

>>443みたいな、そんなことで人の信用を決めつける奴の方が現場では迷惑
449デフォルトの名無しさん:2009/05/24(日) 18:18:25
>>448
こいつまじうんこ
450デフォルトの名無しさん:2009/05/24(日) 18:23:56
>>448
C/C++の世界ではお前が法律じゃない
規格票だけが唯一の法律だ
451デフォルトの名無しさん:2009/05/24(日) 18:24:22
ほんと、無能ほど「現場」って単語が大好きなんだよな。
「自分が低能だからドカタになった」ことだけが唯一のよりどころ。
452デフォルトの名無しさん:2009/05/24(日) 18:27:48
>実際にはfunc(a, b, c)をa,b,c以外の順番で評価するような悪趣味なコンパイラはまず存在しない

これが現場の常識ですか。
ほんっと、世界が狭いですねぇ。
453デフォルトの名無しさん:2009/05/24(日) 18:30:12
納期が迫ってるときに、根性の曲がった変態コンパイラの影に怯えて
しょうもない冗長コードを書いて仕事を遅らせる奴なんていらないんですよ
世の中のありとあらゆるマイナーコンパイラで通るコードを書いた所で自慢になんかならないんですよ

規格厨はこれだから
454デフォルトの名無しさん:2009/05/24(日) 18:32:42
>>453
遅れるほどの手間かよw
1行で書くところをせいぜい数行増えるだけだろ
455443:2009/05/24(日) 18:33:12
>>448
>そんなことで人の信用を決めつける奴の方が現場では迷惑
まわりもお前みたいなヤツばっかなら
まあ問題ないだろう。

そしてお前の会社(仕事くらいあるよな?)が倒産した時、
もう一度俺の書き込みを読んでくれ。
456デフォルトの名無しさん:2009/05/24(日) 18:33:40
それをありとあらゆる関数呼び出しでやってたらどうなると思ってるんだ
実装したことないのかよ
想像力を働かせろ
457デフォルトの名無しさん:2009/05/24(日) 18:38:57
int cdecl func(int,int,int);
int a(),b(),c();

func(a(),b(),c())
で最初に呼ばれる関数はc()でおk?
458デフォルトの名無しさん:2009/05/24(日) 18:39:19
>>453はx86用コンパイラすべてを変態と仰せになった。
459デフォルトの名無しさん:2009/05/24(日) 18:40:36
>>457
違う
最初に「積まれる」値がc()の戻り値にすぎない
460デフォルトの名無しさん:2009/05/24(日) 18:40:50
>>453
納期迫る前に書いておけよ
てかコンパイラ沢山しっているようでございますが,
確認できているコンパイラは何十個そんざいしますか?
461デフォルトの名無しさん:2009/05/24(日) 18:45:50
関数の引数に関数呼び出し文を直接書く場合で、引数設定値を作る
為の関数呼び出しがランダムな順序で発生することに依存したコーディング
は正しい?
462デフォルトの名無しさん:2009/05/24(日) 18:48:01
はいはいわかったよ
皆さんは好きなだけ時間をかけて完璧な規格超準拠コードを書いてて下さい
そんな顔真っ赤にして反論しなくたって、俺は止めないから

ただ、引数の呼び出し順が違うかもなんて意識したことはないし、
それで問題が起こった事なんて一度もないから、無駄な努力だと思うよーってだけ。俺はね
463デフォルトの名無しさん:2009/05/24(日) 18:52:20
>>462
そうでございますが
当社としては動かないコードを安全だと豪語される方にはお引取り願わせていただいております
464デフォルトの名無しさん:2009/05/24(日) 19:02:09
このやり取りも久しぶりだねぇ
465デフォルトの名無しさん:2009/05/24(日) 19:04:14
>>463
一応お伝えしておきますが、安全性はテストによって保証するものであって、
規格に準拠してるかどうかなんてのはコードの安全性と関係ありませんよ
466デフォルトの名無しさん:2009/05/24(日) 19:07:49
>>465
テストできないから安全だっつってるよーn…いやそうでもないか
467デフォルトの名無しさん:2009/05/24(日) 19:12:19
>>465
え?品質チェックとかしてるの?
信じられないなぁw
468デフォルトの名無しさん:2009/05/24(日) 19:16:24
>>431
先に<windows.h>インクルードしてみたらどう?
469468:2009/05/24(日) 19:17:38
すまん誤爆したOTL
470デフォルトの名無しさん:2009/05/24(日) 21:01:16
windows.h が c99対応したのかとビビッタw
471デフォルトの名無しさん:2009/05/24(日) 21:42:03
>>462
そりゃプログラム書いたことのないやつはそんなこと意識しないわな。
472443:2009/05/24(日) 21:51:58
>>462のような低能&低脳の場合、
「現場では○○」
っていうと
自身の程度の低さの免罪符になるとカンチガイしているんだよね。

ま、お前の会社倒産寸前だろうけど、
せいぜい楽しくやりなよ。
 w
473デフォルトの名無しさん:2009/05/24(日) 21:59:55
正しくは、低脳&底辺だな
474デフォルトの名無しさん:2009/05/24(日) 22:30:43
ちょっと質問させてください。
大域変数や関数をstaticにするとどのような効果があるのでしょうか?
475デフォルトの名無しさん:2009/05/24(日) 22:56:18
ファイル内スコープになる
476デフォルトの名無しさん:2009/05/24(日) 23:05:42
>>474
staticキーワードでローカル(プライベート)にする - C言語とC++入門勉強ルーム
ttp://www.mapee.jp/cpp/static_2.html
こことか読んでみ。
477435:2009/05/24(日) 23:09:24
レスが交錯して混乱しています
インクリメントは式の中でいつ評価されるかわからない、
引数内の関数もどの関数が最初に呼ばれるのかわからない
ということでおkでしょうか?

入れ子になった代入文とはどのようなものでしょうか?

478デフォルトの名無しさん:2009/05/24(日) 23:16:59
>>477

>>インクリメントは式の中でいつ評価されるかわからない、
C言語の規格では、未定義
  つまり何が起きるかわからない。評価されないかもしれない。

>>引数内の関数もどの関数が最初に呼ばれるのかわからない
C言語の規格で、不定
つまり順序は仕様上決められていない。分からないというのは
 正しいけど、言いすぎな感じ

479デフォルトの名無しさん:2009/05/24(日) 23:19:54
>>478
嘘書くなよ
480デフォルトの名無しさん:2009/05/24(日) 23:34:54
>>478
>C言語の規格では、未定義
>つまり何が起きるかわからない。評価されないかもしれない。

アフォ?
481デフォルトの名無しさん:2009/05/25(月) 00:25:31
i=0;
a[i]=i++;
これはiが1になるかどうかすらも未定義って話だろ?
規格の上ではその通りだよ

実際上はiが1にならないコンパイラなんてまず存在しないが
482デフォルトの名無しさん:2009/05/25(月) 00:30:09
>>481
ちょっと待った
俺のコンパイラでは2になるぞ
483デフォルトの名無しさん:2009/05/25(月) 00:36:43
どのコンパイラ?
484デフォルトの名無しさん:2009/05/25(月) 00:40:58
wahaha C++コンパイラだw
485デフォルトの名無しさん:2009/05/25(月) 01:02:12
486デフォルトの名無しさん:2009/05/25(月) 01:07:56
それはさておき、>>481で問題なのは i は式の評価後は必ず 1 に
なるが、果たしてa[0]にアクセスするのかa[1]にアクセスするのか
わからないという事だ
487デフォルトの名無しさん:2009/05/25(月) 01:12:32
>>486
それは「不定」でしょ。そうじゃなくて今回の例は「未定義」だ。
488デフォルトの名無しさん:2009/05/25(月) 01:30:22
単に>>478が間違ってるって話だろ。
489デフォルトの名無しさん:2009/05/25(月) 02:18:52
>>12
こういうのが2重ループ

http://asobi.sqweebs.com/tetorisu/1.php
490デフォルトの名無しさん:2009/05/25(月) 02:31:32
>>486
未定義動作が1ヶ所でもあれば、プログラム中のありとあらゆる動作が未定義になる
491デフォルトの名無しさん:2009/05/25(月) 04:59:17
>>490
そんな事は知っているわカス
492デフォルトの名無しさん:2009/05/25(月) 05:21:37
>>481
規格上の未定義の意味誤解してるな
493デフォルトの名無しさん:2009/05/25(月) 05:21:55
>>490
なにを当たり前なwwwww
494デフォルトの名無しさん:2009/05/25(月) 06:36:22
>>489
なにこれ
495デフォルトの名無しさん:2009/05/25(月) 09:34:01
>>489
世の中単純ループに見えるものが本当に単純なのかというところから
疑ってかかってみても遅くは無い。
>>490
本気でそう思ってる?
496:2009/05/25(月) 10:50:34
教えてください。バッファに文字200文字のデータ格納する上でループで一文字ずつ格納していくのと、memcpyでサイズ100を2回とって格納するのとどちらが速いでしょうか?
Windows、組み込み両方について教えて頂きたいです。また、両方の方法での懸念事項、他によい方法があれば教えて頂きたいです。
497デフォルトの名無しさん:2009/05/25(月) 10:54:29
環境が違う以上実測比較するだけでは?
最適化で結局似たコードになってた なんてことも有りえるかもしれないがね
498デフォルトの名無しさん:2009/05/25(月) 11:17:54
>>496
>バッファに文字200文字のデータ格納する
これってコピー元はすでに連続したエリアに文字データが入ってると思っていいのかな?
その辺がよくわからないのでなんともいえない。
状況がよくわからんが自分が作ってるプログラムで二通りの転送方法が
考えれるんだったら、>>497のいうように簡単な速度評価するプログラム
を用意して実測してみればいい。


で、私は別で質問。
最適なスレがよくわからないんですが、あれば誘導していただけると助かります。

皆さん開発してて、リビジョン管理とかどうされてますか?
499デフォルトの名無しさん:2009/05/25(月) 11:19:45
バージョン管理システムについて語るスレ4
http://pc12.2ch.net/test/read.cgi/tech/1242918130/
500498:2009/05/25(月) 11:21:13
ありがとうございます。
501デフォルトの名無しさん:2009/05/25(月) 11:22:40
VCでasm出力してみた。 -c -Ox -Fa
一文字ずつコピーした場合は、memcpy呼び出しになった。
memcpy呼び出しをした場合は、movsdに置き換わった。
ちょっと笑った。
502デフォルトの名無しさん:2009/05/25(月) 11:34:07
>>501
先頭アドレスが8バイト境界かどうかで変りそうだね < movsd 使うかどうか
503デフォルトの名無しさん:2009/05/25(月) 11:37:04
HOGE構造体を管理するポインタ配列の初期化について教えてください。

HOGE *hogelist[1000] = {NULL,};

こういう風に記述した場合に1000個全部NULLが入りますでしょうか?
504デフォルトの名無しさん:2009/05/25(月) 11:40:49
>>503
はいるよ
505デフォルトの名無しさん:2009/05/25(月) 11:47:25
てゆーか、()の省略は今時キザに思われるだけで、よーするにカッコワルイぞw
HOGE *( hogelist[1000] )={NULL};

(hogelistは配列でありその要素はHOGEへのポインタである。)
506デフォルトの名無しさん:2009/05/25(月) 11:53:11
見やすくなったとは思えないけどなw

自分の価値観を一般みたいに言うなよw
507デフォルトの名無しさん:2009/05/25(月) 12:08:16
>>505
意味が変わってる。それは、配列へのポインタ。
508503:2009/05/25(月) 12:11:04
>>504
ありがとうございます。

>>505
ネットとかで見かける書き方は>>503の書き方が多かった気がします。
でも>>505のような書き方もできるんですね。勉強になりました。


ではちょっと別な質問なんですが
構造体のポインタではなく構造体の配列を初期化する場合は
HOGEの中はintが3つあると過程して

HOGE hogelist[1000] = { {0,1,0},};

とした場合1000個全部に0,1,0で初期化されるんでしょうか?
509デフォルトの名無しさん:2009/05/25(月) 12:12:48
>>508
無理。
足りない初期化子は0で埋められる。
510503:2009/05/25(月) 12:14:47
>>509
なるほど

やはり初期化用関数とか作ってその中でfor文でまわすなどして
セットするしかないんですね。
511デフォルトの名無しさん:2009/05/25(月) 12:24:16
>>508さま

アンカーを使い、なおかつですます調で書く場合はですね、アンカーの後ろに
「さま」とか「くん」とか付けるとですね。
違和感が無くなって良いんじゃないかと思いますわ
>>503
>>504
>>505
みたいにかくと対等以下の呼び捨て見下し調であるというトーンは2chでは
既に形成されて久しいですわ
512デフォルトの名無しさん:2009/05/25(月) 12:24:44
>>507
馬鹿はっけーん
513デフォルトの名無しさん:2009/05/25(月) 12:26:04
>>509
おいおい嘘いうなよカス
514デフォルトの名無しさん:2009/05/25(月) 12:26:44
>>513
死ね
515503:2009/05/25(月) 12:42:18
>>511さま
そのほうがいいですね。
さすがに「くん」もちょっとあれですし、「さま」もちょっと硬すぎる感じなので「さん」とか
くらいが丁度いいかもとか思いますがどうでしょうか?
516デフォルトの名無しさん:2009/05/25(月) 12:44:33
>>511
ねーよw
517デフォルトの名無しさん:2009/05/25(月) 13:00:37
>>511たんに同意
518デフォルトの名無しさん:2009/05/25(月) 13:38:21
>>515たんへ

「さん」は男性の女性全体に対する敬語でしょ?目上の人に使う言葉で
2chじゃおかしいです。
たん がちょっと汚くていいとおもいまつ
5194:2009/05/25(月) 14:01:33
4さまブームはどこへ…
520:2009/05/25(月) 19:27:38
教えて欲しいです。Windowsで標準出力で、printfがありますが、文字数制限ってありますか?MSDNを見たのですが特にのってなく。よろしくお願いします。
int printf(const char*format...);
521デフォルトの名無しさん:2009/05/25(月) 19:55:29
ありません。確認中。
522デフォルトの名無しさん:2009/05/25(月) 20:06:57
なんで文字数制限?
そっちのほうが気になる。
523デフォルトの名無しさん:2009/05/25(月) 20:09:50
どこの文字数?出力?
524デフォルトの名無しさん:2009/05/25(月) 21:07:34
待て待て、質問はただのprintfじゃなく、windowsのprintfと限定されている
つまりwindowsでは特有の制限がprintfにあるということだ
525デフォルトの名無しさん:2009/05/25(月) 21:35:06
shortが2バイトでlongが4バイトじゃない環境って全体の何割ぐらいあるんですか?
526デフォルトの名無しさん:2009/05/25(月) 22:11:32
死ね
527デフォルトの名無しさん:2009/05/25(月) 22:30:33
質問なんですが
c言語のfree関数でメモリを解放すれば
タスクマネージャのメモリの使用量の数値は減少するのでしょうか?
528デフォルトの名無しさん:2009/05/25(月) 22:31:17
処理系による
529デフォルトの名無しさん:2009/05/25(月) 22:37:07
減少しないこともあるのですか。
ありがとうございます。
530デフォルトの名無しさん:2009/05/25(月) 22:45:45
減少しないことのほうが多い
531デフォルトの名無しさん:2009/05/25(月) 22:46:39
最初にメモリをたくさん確保して自分でマッピングするほうが速度が早いんですか?
532デフォルトの名無しさん:2009/05/25(月) 22:50:45
>>531
標準のメモリ管理システムより高性能なものを作れれば。
533デフォルトの名無しさん:2009/05/25(月) 22:54:52
>>531
メモリー増設
これが一番手っ取り早い
534デフォルトの名無しさん:2009/05/25(月) 23:44:23
ttp://coconut.sys.eng.shizuoka.ac.jp/bmp/
ここのサイトのbmp.hとbmp.cを使ってBMPファイルを操作したいのですが、
bmp.hとbmp.cはどこに保存すればいいのですか?

コンパイラはCPad for Borland C++Compilerを使ってます。
535デフォルトの名無しさん:2009/05/26(火) 00:00:05
>>534
デスクトップにbmp.hとbmp.cを保存する
次にCPadのアイコンにbmp.cをドロップ
おもむろにF9を殴打する
536デフォルトの名無しさん:2009/05/26(火) 00:02:56
■C:\Users\ほにゃらら\Desktop> bcc32 bmp.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
bmp.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)

って言われました。
537デフォルトの名無しさん:2009/05/26(火) 00:10:15
>>536
test01.cとかtest02.cがあるだろ
test01.cとbmp.cを一緒にコンパイルするの。
538デフォルトの名無しさん:2009/05/26(火) 00:14:36
>>537
一緒にコンパイルするには、どうすればいいですか?
539デフォルトの名無しさん:2009/05/26(火) 00:16:23
bccわからん
bcc32 test0.c bmp.c
ってコマンド欄にいれてみたら?
540デフォルトの名無しさん:2009/05/26(火) 00:18:04
>>539
C:\Users\ (省略) >bcc32 test0.c bmp.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test0.c:
エラー E2140 test0.c 22: ここでは宣言はできない(関数 main )
警告 W8070 test0.c 111: 関数は値を返すべき(関数 main )
警告 W8057 test0.c 111: パラメータ 'argc' は一度も使用されない(関数 main )
*** 1 errors in Compile ***
bmp.c:

ってなりました。
541デフォルトの名無しさん:2009/05/26(火) 00:20:08
>>540
ねたなの?まじなの?
542デフォルトの名無しさん:2009/05/26(火) 00:21:06
>>541
ごめんなさい、まじです
543デフォルトの名無しさん:2009/05/26(火) 00:21:41
C言語わかる?
544デフォルトの名無しさん:2009/05/26(火) 00:23:28
>>540
ええと。そうじゃないな。
自分で書いたソースファイルと、bmp.c とを一緒にコンパイルするんだ。
で、自分で書いたソースファイルでは bmp.h をインクルードすれば、bmp.h で宣言されている関数とかを呼び出せる。

付属品のtest0.cとtest1.cは、なんかポンコツな文法で書かれてるからコンパイル通らなくても気にしない。
(てか、bmp.cを見てないんだがこっちは大丈夫なのかなぁ)
545デフォルトの名無しさん:2009/05/26(火) 00:26:28
test0.c、これCでコンパイルできるわけがない
22行目で宣言があるこいつを16行目にカット&ペーストすればおk

しっかしこんな奴に教えられる学生がかわいそうだ
静岡大学がんばれ!
546デフォルトの名無しさん:2009/05/26(火) 00:28:32
>>545
C99なら大丈夫よ。
547デフォルトの名無しさん:2009/05/26(火) 00:30:06
C99 だと main(int argc, char** argv) { が通らない。
戻り値の型が暗黙で int ってのは、C99では禁止されたからね。
だからポンコツと言ったのだ。どの規格でも通らないコードだ。
548デフォルトの名無しさん:2009/05/26(火) 00:32:19
>>544
「自分で書いたソースファイルと、bmp.c とを一緒にコンパイル」する仕方がわかりません…
549デフォルトの名無しさん:2009/05/26(火) 00:33:36
なんかtest0.cがポンコツらしいので、

#include <stdio.h>
#include "bmp.h"

void main()
{
img im;
im.height = 256;
im.width = 256;

for(int y=0 ; y<256 ; y++){
for(int x=0 ; x<256 ; x++){
im.data[y][x].r = x;
im.data[y][x].g = x;
im.data[y][x].b = x;
}
}
WriteBmp("w2b.bmp" , &im);
}

↑こんなソース(w2b.cpp)作ってみた。
550デフォルトの名無しさん:2009/05/26(火) 00:33:51
わざとへっぽこなコード書いて、学生に自習を促してるんだよ
551デフォルトの名無しさん:2009/05/26(火) 00:35:39
void mainはないだろうさすがに
552534:2009/05/26(火) 00:36:50
>>551
mainに特に返してほしいものないから、いつもvoid mainでやってました…
553デフォルトの名無しさん:2009/05/26(火) 00:39:05
>>548
bccの操作方法について聞きたいなら、俺はよく知らんけど>>539な感じでいいと思う。

あと、「一緒にコンパイル」てのは実は不正確な言い方で、厳密にいうと、
それぞれコンパイルしてからリンクするんだけどね。
このへんの知識があやふやなら、改めて聞いてほしい。
554534:2009/05/26(火) 00:41:13
>>553
「コンパイルしてからリンク」がわかりません。
555デフォルトの名無しさん:2009/05/26(火) 00:45:02
bcc32を浸かったらobjてのができるじゃん、これがコンパイル
この1つ以上のobjをくっつけてexeにするのがリンク
556デフォルトの名無しさん:2009/05/26(火) 00:45:49
>>554
「分割コンパイル」といって、プログラムを作成するときに
ソースファイル(拡張子が c のファイル)を複数作成し、それぞれを個別にコンパイルした後で、
個々のコンパイル結果をまとめあげる(リンク)、という手法がとられることがある。

今回は、bmp.c を道具として利用するための、自分で書いたソースファイルがあるはずだ。
あるいは、>>549 でもいい。
こういうソースと、bmp.c とを、それぞれ個別にコンパイルした後で、リンクすることによって、
まとまった1つのプログラムを得ることが出来る。
557556:2009/05/26(火) 00:47:51
まあ>>539みたいに書けば、勝手にリンクまで面倒みてくれるのが普通。

>>536で言ってるのは、bmp.c のコンパイルには成功したものの、リンク時に失敗している。
プログラムを最終的に組み上げるときに、main関数がないからおかしいよ?って言ってるわけ。
558534:2009/05/26(火) 00:58:45
>>556-557
なるほど、なんとなくわかってきた気がする。
559534:2009/05/26(火) 01:28:14
でも、リンクの仕方がわからない…
560デフォルトの名無しさん:2009/05/26(火) 01:38:27
CPadスレで(どこにあるのか知らんが)聞いたほうが良いのではないか。
561デフォルトの名無しさん:2009/05/26(火) 01:40:09
CPad使わずに、bcc直接使った方がわかりやすいかも。
562534:2009/05/26(火) 01:46:10
>>561
それじゃ、リンクする時はbcc直接使うことにする。
bccだと、どういう風にリンクしますか?
563デフォルトの名無しさん:2009/05/26(火) 01:46:36
リンクは勝手にやってくれる。
>>536でも勝手にリンカを走らせて、リンクエラーを報告してくれてるわけでしょ。
普通は、「コンパイルのみ実行してリンクは行わない」という指示を出さない限り、リンクしてくれる。
564534:2009/05/26(火) 01:54:21
同じフォルダに

bmp.c
bmp.h
w2b.cpp(>>549の)

を入れて、bmp.cとw2b.cppをコンパイルして

bmp.obj
w2b.obj

が作られて、
その後どうすればいいですか?
565デフォルトの名無しさん:2009/05/26(火) 02:00:49
よく知らないが、たぶん bcc32 bmp.obj w2b.obj でいけるかなぁと思う。

bccの使い方については、ここにいる人間もみんなが知っているわけじゃないから、
適当にぐぐるか、bccを知ってそうな人のところに行くか、
もしくはもっと多くの人が使ってそうなコンパイラに乗り換えるか(VCとか)がいいと思う。
566534:2009/05/26(火) 02:05:58
>>565
実行したら、

C:\Users\***>bcc32 bmp.obj w2b.obj

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'WriteBmp(char *, img *)' が未解決(C:\USERS\***\W2B.OBJ が参照)

ってなりました。

C言語でいろいろやってるけど、CPadしか使ったことないから、
他のはよくわからないんだよなぁ
VCとかでも、CPadと同じプログラム書いてきちんと動作する?
567デフォルトの名無しさん:2009/05/26(火) 02:06:36
というより、bccのマニュアルに書いてあるはず。
568デフォルトの名無しさん:2009/05/26(火) 02:07:24
>>566
リンク自体の実行はできてるっぽいが……ちょっとbmp.cの中身を確かめてみるから待ってて。
569デフォルトの名無しさん:2009/05/26(火) 02:08:16
ilink32 ,myexe.exe bmp.obj w2b.obj じゃね?
570568:2009/05/26(火) 02:09:39
bccに詳しそうな人が来たので、後は>>569さんの指示に従ってみてください。
571デフォルトの名無しさん:2009/05/26(火) 02:10:36
bcc32 -ebmp.exe bmp.obj w2b.obj
かな。
うまく行かなかったら.objを作り直してためしてみるとか。
572534:2009/05/26(火) 02:10:37
>>569
C:\Users\***>ilink32 ,myexe.exe bmp.obj w2b.obj
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: 余分な EXE ファイル名が指定された : bmp.obj

こうなりました。
573534:2009/05/26(火) 02:12:18
>>571
C:\Users\admin\Desktop\taku\programing_original\bitmap_cpp>bcc32 -e bmp.exe bmp.
obj w2b.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
エラー E2194: ファイル 'bmp.exe' が見つからない

一応objは一度作り直してみました。
574デフォルトの名無しさん:2009/05/26(火) 02:12:43
ごめん(´・ω・`)ゝ”

ilink32 bmp.obj w2b.obj ,myexe.exe か

でもbcc32.exe からやっても同じみたいだね
575534:2009/05/26(火) 02:13:55
\(^0^)/
576534:2009/05/26(火) 02:14:59
>>574
エラーは出なかったけど、w2b.bmpは作成されてないですね
577デフォルトの名無しさん:2009/05/26(火) 02:16:40
>>573
-e bmp.exe と余分なスペースを入れるからだよ
-ebmp.exe としる
578534:2009/05/26(火) 02:18:00
>>577
スペース入れなかったら、>>566みたいに
WriteBmpが未解決って言われた。
579デフォルトの名無しさん:2009/05/26(火) 02:19:02
>>576
えーと、プログラミングってどういうものかわかってる?
580デフォルトの名無しさん:2009/05/26(火) 02:21:20
>>570
それでいいんだよ
プログラムbmp.cに誤りがあるって事だ
581534:2009/05/26(火) 02:21:44
>>579
よくわかってないかも…
ちなみに、myexe.exe実行してみたら、
C:\***\myexe.exeは有効な Win32 アプリケーションではありません。
ってエラーが出た。
582デフォルトの名無しさん:2009/05/26(火) 02:23:42
>>581
そりゃそうだろ
リンクエラー起きてるんだからまともなexeが出来てるはずがない
583デフォルトの名無しさん:2009/05/26(火) 02:28:50
しかしこのソースひでえな
エディタで開くと改行がスペースに軒並み化けやがって
unixのviでも使って編集したろ

まあCコンパイラはこのようなソースでもちゃんと認識して
コンパイルできるが、人間が読むと可読性が著しく損なわれる
584534:2009/05/26(火) 02:30:31
>>582
それじゃやっぱ、bmp.cが悪いって事?
585デフォルトの名無しさん:2009/05/26(火) 02:31:10
>>583
そりゃそうだ。
コンパイラにgcc使ってるんだから。
586デフォルトの名無しさん:2009/05/26(火) 02:33:21
あーわかった
CとC++混同してるでしょ

だから
Error: 外部シンボル 'WriteBmp(char *, img *)' が未解決(C:\USERS\***\W2B.OBJ が参照)
なんてエラーが出るんだよ

#include <stdio.h>
#include "bmp.h"
void main()
{
img im;
im.height = 256;
im.width = 256;

for(int y=0 ; y<256 ; y++){
for(int x=0 ; x<256 ; x++){
im.data[y][x].r = x;
im.data[y][x].g = x;
im.data[y][x].b = x;
}
}
WriteBmp("w2b.bmp" , &im);
}

これを w2b.cpp でなくて w2b.c と名前をつけて保存してコンパイルしろ
なんでかって言うとC/C++ではexternの意味が違っているからだ

それと名前マングリングが起きてる

どうしてもcppでやりたいなら extern "C" で囲まないといけないが
今は面倒なので.cで保存してみろ
587534:2009/05/26(火) 02:46:06
cで保存して、コンパイルして、
ilink32 bmp.obj w2b.obj ,myexe.exe
したけど、やっぱ「有効な Win32 アプリケーションではありません。」ってエラー。


bcc32 -ebmp.exe bmp.obj w2b.obj
をしてみたら、

C:\***>bcc32 -ebmp.exe bmp.obj w2b.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Warning: パブリックシンボル _Bmp_headbuf がモジュール C:\***\BMP.OBJ と
C:\***\W2B.OBJ の両方に定義されている
Warning: パブリックシンボル _Bmp_Pallet がモジュール C:\***\BMP.OBJ と
C:\***\W2B.OBJ の両方に定義されている
(以下、Warningがいっぱい)

ってなって、一応bmp.exeができたので実行したら、強制終了になる。
588デフォルトの名無しさん:2009/05/26(火) 02:51:05
>>587
よしよしいい所まできたぞ
あとは bmp.h のバグを取るだけだ

_Bmp_headbufは配列で bmp.h で定義されている
宣言でなくて定義だ

だから名前がかち合ってリンカエラーが出る

こういう場合はインクルードガードを使ってどちらか一方だけで
定義されるようにし、もう一方では extern によって宣言するだけに
しなければならない

要するに bmp.h を書いた奴はアホだという事です
589534:2009/05/26(火) 02:57:43
インクルードガードとかexternとか、初めて聞く言葉だ
590デフォルトの名無しさん:2009/05/26(火) 02:58:26
インクルードガードは違うだろ。
591デフォルトの名無しさん:2009/05/26(火) 03:01:44
>>590
厳密にはそうだな

"One definition rule"に従って欲しいのだ

同じ名前の配列が複数あると、どれを取ればいいのかリンカが
悩んでエラーを吐くわけだから、それを解決してやればよい

あとはわかるな
俺そろそろ寝る
592534:2009/05/26(火) 03:04:46
>>591
全然わからない…
593デフォルトの名無しさん:2009/05/26(火) 03:08:59
んーextern使わないと今回の問題は解決できないよ
要するにどのファイルからも bmp.h をインクルードしてて、
bmp.h の中で配列とか変数を定義してるので、同じ配列
や変数がかち合ってエラーが出るわけだ

したがって例えば bmp.h をインクルードする前に my.h などを
インクルードするようにし、my.h の中に #define DEFINITION 1
とか書いて、その時だけ配列や変数が定義されるように bmp.hを
書き換える

次に my.h をインクルードしない時は代わりに extern に置き換わる
ようにしてやる

マクロの仕事だ

まずは extern については勉強が必要
594534:2009/05/26(火) 03:19:27
>>593
そうなのか…なんか大変そうだ…

とりあえず、bmp.hを#ifndefとかで囲んで
かちあってたのの頭にexternつけて、
bcc32 -e〜でコンパイルしたら、
Warningはなくなったけど、
_Bmp_info_sizeとかが、外部シンボルが未解決になった
595デフォルトの名無しさん:2009/05/26(火) 05:44:33
途中からあんまり見てないけど
大変なことになってる理由は、その bmp.h 自体がポンコツだからだよな。
もっとまともなライブラリを使えば、こんな苦労はしなくて済むのだ。
とはいえ、まともなライブラリを探すのも面倒だろうし、俺もちょっと今から詳しく見てアドバイスしてみるよ。
596デフォルトの名無しさん:2009/05/26(火) 05:48:23
ビットマップといえど仕様を理解して一から実装するとなると割と面倒だからなあ。
でも、それくらいは理解できないと正直なところ辛いと思うよ。
597デフォルトの名無しさん:2009/05/26(火) 05:52:39
とりあえず、俺が正当だと思う方法は
bmp.h の中で変数を定義している箇所
(unsigned char Bmp_headbuf[HEADERSIZE]; 〜 long Bmp_yppm;)
を、bmp.c にコピペする。
そして、bmp.h の中のその部分は、すべて変数の宣言へ書き換える。

unsigned long Bmp_size; → extern unsigned long Bmp_size;
char Bmp_type[2]; → extern char Bmp_type[];
など。

これでいけるはず。テストしてないけど。
598デフォルトの名無しさん:2009/05/26(火) 05:59:22
いかん、自分の環境でやってみたら動かん。もうちょっと詳しく見ないとだめか。なんか見落としてるかなぁ
599デフォルトの名無しさん:2009/05/26(火) 06:08:32
あ、分かった。img 型がでかすぎるんだ。
img型のサイズが大きすぎて、スタック上に自動変数として置こうとするとスタックオーバーフローで落ちるっぽい。
思いっきり環境依存な話っぽいが。少なくとも俺の環境ではそんな感じだ。
600デフォルトの名無しさん:2009/05/26(火) 06:11:27
すげー作りだな。

>>534のHPの最下部にある参考文献のところのように
ヘッダ部分を見やすくするための構造体がbmp.hにはいってるんだろうなと
思ったら変数がそのまんま定義されてやんの。
そりゃbmp.hを取り込んだソースで競合がおきるわな。
601デフォルトの名無しさん:2009/05/26(火) 06:13:23
>>599
つくりが悪すぎる

固定サイズでピクセル情報部分を持ってる
typedef struct {
long height;
long width;
color data[MAXHEIGHT][MAXWIDTH];
} img;

#define MAXWIDTH 1000 /* 幅(pixel)の上限 */
#define MAXHEIGHT 1000 /* 高さ(pixel) の上限 */

これだけでも糞だよ

ヘッダ関連の情報もなんで構造体で管理せずにこんなことしてるのかもわからねーし
602デフォルトの名無しさん:2009/05/26(火) 06:13:53
というわけで、「exeファイルは出来たが実行時に強制終了してしまう」の原因はたぶん>>599なので、
手っ取り早い解決策は bmp.hの MAXWIDTH と MAXHEIGHT の数字を小さくすること。
両方とも500くらいにすればよかろう。他のところをいじらなくても、俺の環境ではこれで問題なく動作した。

ただ、もちろんこれだと巨大な画像が扱えなくて困るだろうから、別の解決策としては
スタック上ではなくヒープに確保することだな。(mallocを使うということだ)
603デフォルトの名無しさん:2009/05/26(火) 06:15:59
http://coconut.sys.eng.shizuoka.ac.jp/bmp/
↑このHPは参考にするな。ここがリンクしてる↓で勉強しろ
http://www.kk.iij4u.or.jp/~kondo/bmp/
604デフォルトの名無しさん:2009/05/26(火) 06:16:26
まあ、根本的な解決策は「もっとまともなライブラリを探せ、もしくは作れ」かなぁ。
車輪の再発明は良くないが、不良品の車輪を使うのは面倒だ。
特に、知識や経験の少ない人にとってはね。
605デフォルトの名無しさん:2009/05/26(火) 06:20:53
で、質問者が初心者ぽいので注意点を置いておくと

typedef struct tagBITMAPFILEHEADER {
unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
} BITMAPFILEHEADER

これがそのままだとおそらくアライメントの関係でそのままでずれるからそこだけ注意
606デフォルトの名無しさん:2009/05/26(火) 06:21:49
>これがそのままだとおそらくアライメントの関係でそのままでずれるからそこだけ注意
これがそのままだとおそらくアライメントの関係でbfSizeの開始位置が2バイトずれるから
607デフォルトの名無しさん:2009/05/26(火) 06:22:16
そういえば、俺も便乗で質問していい?
bmp.h にグローバル変数の定義(宣言ではなく)を書いて、それが複数の翻訳単位でインクルードされちゃってると、
定義が複数あるからまずいんだよね?

でも、それを g++ で処理したら多重定義エラーになるが、gcc で処理したらエラーにならずに
ちゃんと動く実行ファイルが出来上がっちゃったんだ。
俺、普段はC++を使ってるからC自体は実はよく知らないんだが、これCだと認められちゃったりするの?
608デフォルトの名無しさん:2009/05/26(火) 06:26:36
>>607
bmp.hを取り込んだソースのうち片方は使ってないんじゃないの?
なんでわざわざヘッダに入れたかわからないbmpヘッダに関連する変数を
609デフォルトの名無しさん:2009/05/26(火) 06:29:36
>>607
CとC++は変数の定義ルールが異なる
デフォルトでスコープはローカル
610デフォルトの名無しさん:2009/05/26(火) 06:30:00
bmpのバージョン関係なしにヘッダサイズきめうちか
テスト用のプログラム載せるなよ
611デフォルトの名無しさん:2009/05/26(火) 06:31:15
>>609
そうだったのか。ありがと。
612デフォルトの名無しさん:2009/05/26(火) 06:31:50
>>610
大学と個人の名前でてるけど教授か何かか?
こんな程度のプログラムしかできないのが偉そうにHPに公開しててOKなんだな
613デフォルトの名無しさん:2009/05/26(火) 06:37:29
なんでここまで盛り上がってるんだよ・・・
614デフォルトの名無しさん:2009/05/26(火) 06:38:59
>>613
よくあること
未定義とかその手はよく伸びます
615デフォルトの名無しさん:2009/05/26(火) 07:03:04
逆に本気で高度な話だと伸びません
616デフォルトの名無しさん:2009/05/26(火) 07:10:13
>>609
違うだろ
C++でデフォルトでローカルスコープなのはconst変数だけだよ
617デフォルトの名無しさん:2009/05/26(火) 15:51:53
質問なのですが、C/C++の宿題片付けます126代目の
http://pc12.2ch.net/test/read.cgi/tech/1242655611/266
を実行すると、
1000 0 0
1000.000000 99.999046 10.000134
1000.000000 100.000000 10.000000
になり、float型の結果がおかしくなるのはなぜなのでしょうか?
618デフォルトの名無しさん:2009/05/26(火) 15:56:53
>>617
精度の問題ってやつではないですか。
619デフォルトの名無しさん:2009/05/26(火) 16:18:42
>>617
すごい端的にいうと
float型に0.1を入れると実際には
0.09999999..... に近い形になってる, つまり微妙に誤差がある
620617:2009/05/26(火) 16:19:48
指数部と仮数部がdoubleに比べて少ないって事でしょうか。
621デフォルトの名無しさん:2009/05/26(火) 16:26:17
>>620
はい、そのとおり。
622デフォルトの名無しさん:2009/05/26(火) 17:35:18
>>619
誤解を招きそうだ
doubleにも誤差はあるからね
floatの有効桁数がせいぜい7桁(10進で)ってこと
623デフォルトの名無しさん:2009/05/26(火) 22:19:03
void main()
{
int count;
double s=0;
for (count = 0; count < 10; count++) {

s=s+(1/2/10+count/10)*(1/2/10+count/10)/10;
printf( "sは今%fです\n", s );
}
}
y=x^2のグラフを0から1まで積分したいんだけど
すべてs=0.000000になります なぜ?
624デフォルトの名無しさん:2009/05/26(火) 22:24:09
>>623
1/2/10は0だし、countが10未満ならcount/10も0
625デフォルトの名無しさん:2009/05/26(火) 22:32:34
>>623
BohYoh.com−C/C++ FAQ 整数値の平均を実数で求めようとしてもうまくいかないのはどうしてですか。
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00097.html
ここ読んでみ。
626デフォルトの名無しさん:2009/05/26(火) 22:36:32
1/10=0.1ではないのですね
627デフォルトの名無しさん:2009/05/26(火) 22:53:20
>>617に関してなんですが、
浮動小数点はdoubleで事足りるのにfloatがあるの?
628デフォルトの名無しさん:2009/05/26(火) 23:00:43
>>627
メモリ使用量が減らせる
629デフォルトの名無しさん:2009/05/26(火) 23:20:43
昔のショボいコンピュータの名残
630デフォルトの名無しさん:2009/05/26(火) 23:22:27
いやいやw

組み込み系だとdoubleは遅いよ

doubleでも速度が落ちないプロセッサばかりじゃないので
631デフォルトの名無しさん:2009/05/26(火) 23:57:14
x86でもdoubleのほうがfloatより遅いことがる不思議について
632デフォルトの名無しさん:2009/05/27(水) 00:33:43
最近のプロセッサはゲームや動画などのマルチメディア用途に最適化されてるんで、floatの方が確実に速いことが多いね。
633デフォルトの名無しさん:2009/05/27(水) 04:01:37
>>629
使い分けを知らんとは、あんたド素人だな?
634デフォルトの名無しさん:2009/05/27(水) 05:04:49
fgets(&wrd[][],MAXCHR_W,fp)
として,文字列を読み込みたいんですがwrd[][]の括弧の中の記述をどうしたらよいかわかりません。
wrd[0][0]が,txtファイルの1行目1文字目,wrd[0][1]を1行目2文字目という形を取りたいんです。
最終的には,wrdで読み取った最後の改行部分にNULLを代入したいのですが。

どうやったら良いかご教授願えませんでしょうか。
素人な質問で申し訳ないです…。
635デフォルトの名無しさん:2009/05/27(水) 05:07:36
そんなことできんから、一行ごとに読め
636デフォルトの名無しさん:2009/05/27(水) 05:19:28
>>634
望んだ仕様になるXXXfgets関数を作れば良いだろう
637デフォルトの名無しさん:2009/05/27(水) 05:32:40
>>634です
関数は既存の規定されているfgetsで読み込み,後にASCIIコード順にソートを行う
ということで文字列の最後はNULLにして,上記の形を用いるように指定されているので…。
課題なんで,指定以外の形をとるわけにもいきませんし…
638デフォルトの名無しさん:2009/05/27(水) 06:26:27
はああ?
639デフォルトの名無しさん:2009/05/27(水) 06:35:09
>>634です,すいません自己解決しました。
ご迷惑おかけいたしました。
640デフォルトの名無しさん:2009/05/27(水) 06:56:59
#include <stdio.h>
#include <string.h>

#define MAXCHR_W (100)
#define MAXCHR_L (10)

void main()
{
FILE *fp;
int i,n;
char word[MAXCHR_L][MAXCHR_W];

fp=fopen("test.txt","rt");
for(i=0; i<MAXCHR_L; i++)
{
fgets(word[i],MAXCHR_W,fp);
if(feof(fp)!=0)
break;
}
fclose(fp);
n=strlen(word[i]);
word[i][n]=NULL;
}

ほらよ
641デフォルトの名無しさん:2009/05/27(水) 08:19:57
釣りはいらん
642デフォルトの名無しさん:2009/05/27(水) 12:27:14
学生でやった以来ひさしぶりにC言語やるんですが
おすすめのエディタとかありますか?
643デフォルトの名無しさん:2009/05/27(水) 12:29:04
>>642
VS2005かVS2008の無料のやつ
もしくは秀丸
644デフォルトの名無しさん:2009/05/27(水) 13:14:53
秀丸って、どういうところがいいの?
645デフォルトの名無しさん:2009/05/27(水) 14:00:56
フリーウェアじゃないところ。
(フリーウェアは原則使用禁止な会社は存在する)
646デフォルトの名無しさん:2009/05/27(水) 14:02:22
そういう会社ってビールウェアとかワインウェアだったらOKでるのかなw
647デフォルトの名無しさん:2009/05/27(水) 14:13:06
会社が経費出すんだろうし、ビールを数十杯提供するのかなw
648デフォルトの名無しさん:2009/05/27(水) 14:26:40
1 #include <stdio.h>
2 #include <math.h>
3
4 int g_data;
5
6 double Get3integerAverage(int a,int b,int c);
7 double Get3integerAverage2(int a,int b,int c);
8
9 int main(void){
10 double ave;
11 double ave2;
12 int a = 5;
13 int b = 10;
14 int c = 15;
15 static int p;
16 printf("address of main:%p\n",main);
17 printf("address of Get3integerAverage:%p\n",Get3integerAverage);
18 printf("address of Get3integerAverage2:%p\n",Get3integerAverage2);
19 printf("address of \"HELLO\":%p\n","HELLO");
20
21 printf("address of g_data:%p\n",&g_data);
22 printf("address of p:%p\n",&p);
23
24
25 printf("address of a:%p\n",&a);
26 printf("address of b:%p\n",&b);
27 printf("address of c:%p\n",&c);
28 printf("address of ave:%p\n",&ave);
29
649デフォルトの名無しさん:2009/05/27(水) 14:30:37
30 ave = Get3integerAverage(a,b,c);
31 ave2 = Get3integerAverage2(a,b,c);
32
33 printf("ave:%f,ave2:%f\n",ave,ave2);
34 return 0;
35 }
36
37 double Get3integerAverage(int a,int b,int c){
38 double ave_local;
39 printf("address of ave_local:%p\n",&ave_local);
40
41 ave_local = (double)(a+b+c) / 3.0;
42 return ave_local;
43 }
44
45 double Get3integerAverage2(int a,int b,int c){
46 double ave_local2;
47 printf("address of ave_local2:%p\n",&ave_local2);
48
49 ave_local2 = pow((double)(a*b*c), (1.0 / 3.0));
50 return ave_local2;
51 }
650デフォルトの名無しさん:2009/05/27(水) 14:40:14
このプロログラムを
gcc object.c -o object
でコンパイルすると、
/tmp/ccolKUUr.o: In function `Get3integerAverage2':
object.c:(.text+0x1be): undefined reference to `pow'
collect2: ld はステータス 1 で終了しました
となり、コンパイルすることができません。undefined reference to `pow'はpow
が未定義という意味です。#include <math.h>で定義しているのにできません。
math.hファイルがおかしくなっていると思って他のプログラムをmath.のpow
関数を使ってプログラムを動かすと、ちゃんと動きました。
どなたか教えてくれないでしょうか?
651デフォルトの名無しさん:2009/05/27(水) 14:42:48
>>650
libmをリンクしないと
652デフォルトの名無しさん:2009/05/27(水) 14:44:02
┗-lm
653デフォルトの名無しさん:2009/05/27(水) 14:50:54
>>651
>>652
回答有難うございます。
libm?
┗-lm?
どちらもよく分かりません。調べてみます。
654デフォルトの名無しさん:2009/05/27(水) 14:54:58
math.hでインクルードする関数の実態が入ってるのがlmとかlibmとかいうのになってる
makefileのlibを設定するところに -lm とか-libmとか書いてないので
math.hので宣言されてる関数が無いとgccが怒ってる
655デフォルトの名無しさん:2009/05/27(水) 14:55:44
実態じゃねえ実体
656デフォルトの名無しさん:2009/05/27(水) 14:58:10
            /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   gcc object.c -o object -lm って言っときゃいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /
657デフォルトの名無しさん:2009/05/27(水) 15:01:16
>>654
そうですね。思い出しました!!
math.h関数を久しぶりに使うので忘れていました。
しかし
1 #include <stdio.h>
2 #include <math.h>
3
4 int main(void){
5 double a = pow(2.0,3.0);
6 printf("a = %lf\n",a);
7 }
は-lmをつけなくても動きます。不思議です。調べてみます。
658デフォルトの名無しさん:2009/05/27(水) 15:08:02
>>656
回答ありがとうございます。
659デフォルトの名無しさん:2009/05/27(水) 15:22:54
リンクオブジェクトは
libほにゃらら.so
とか
libほにゃらら.a
というファイル名だ
それをリンクするのに
-lほにゃらら
をつける
libm.soをリンクするのが-lmになる
660デフォルトの名無しさん:2009/05/27(水) 15:28:59
>>657
環境は同じ?
cygwinだと >>648-649 のプログラムも-lm無しでコンパイル通ったよ。
(cygwin1.dllにpow()があるため)
661デフォルトの名無しさん:2009/05/27(水) 15:32:18
2番目の引数が整数になおせるとlibmのは呼ばないみたいだな
最適化で消えるんだろうな
662デフォルトの名無しさん:2009/05/27(水) 15:33:33
引数がリテラルだとコンパイル前に計算するんじゃない
663デフォルトの名無しさん:2009/05/27(水) 15:34:52
gcc賢すぎる
664デフォルトの名無しさん:2009/05/27(水) 15:38:10
そういうことなのか
665デフォルトの名無しさん:2009/05/27(水) 15:56:01
>>660
>>648-649>>657 は同じ環境でコンパイルしています。
みんなとても詳しいですね...専門用語がさっぱり分かりません。
色々調べてみます。
666デフォルトの名無しさん:2009/05/27(水) 16:00:41
専門用語で難しいのって「花電車」くらいだろ。
667デフォルトの名無しさん:2009/05/27(水) 16:15:07
>>665
引数がリテラル(定数)であるとうまくいくわけではないようです。試しに
1 #include <stdio.h>
2 #include <math.h>
3
4 int main(void){
5 double a = pow(2,3.1);
6 printf("a = %lf\n",a);
7 }
をコンパイルしようとしたらできませんでした。>>661さんの意見が正しいようです。
しかしなぜ2番めの引数が整数だったらlimb.soをリンクしてなくていいのかが不思議です。
668デフォルトの名無しさん:2009/05/27(水) 16:27:04
>>667
整数乗が確定してれば 単純に整数回の掛け算に置き換えられるからかもね

浮動小数乗の場合だと リテラル演算とはいえアルゴリズム経由しないとリテラル値にならないわけだし
669デフォルトの名無しさん:2009/05/27(水) 16:28:20
>>667
整数だったら単純にループにおきかえれるとか?
右側が整数なら
左側を右の回数だけ乗算するループにおきかえれそうだし。
670デフォルトの名無しさん:2009/05/27(水) 16:29:27
かぶった
671デフォルトの名無しさん:2009/05/27(水) 16:37:35
>>668
>>669
なるほど。
話が変わるのですが>>660さんとは違いpow関数は僕の場合はlimb.soをリンクしないといけない。
引数が整数でも、整数ではなくてもpow関数を使っているわけですよね?
なのにlimb.soをリンクしなくてもいい場合があるのはなぜなんでしょうか?
672デフォルトの名無しさん:2009/05/27(水) 16:40:40
だからpow()呼び出し自体が消えるんだって。
呼び出してないんだから当然リンクエラーも出ない。
673デフォルトの名無しさん:2009/05/27(水) 16:40:55
>>671
環境の違いってことで あまり深く考えない
674デフォルトの名無しさん:2009/05/27(水) 16:43:19
>>671
gccの最適化の中で関数を呼び出すまでも無く代替計算式におきかえれる場合は
pow関数を使わないのでリンクしない。そのためエラーにならない。

この辺の基準はgccのみぞ知るなんで、確実に把握したければ
条件を変えて自分で試すしかない。
675デフォルトの名無しさん:2009/05/27(水) 16:44:27
>>672
powを呼び出していないのに階乗の計算をどうやってしているのでしょうか?
>>671さんの言う通り現時点では深く考えないほうがいいのかもしれません。
676デフォルトの名無しさん:2009/05/27(水) 16:52:17
pow()の使い方習う前に、n乗をループで求めるやり方とか普通ならわねーか?
677デフォルトの名無しさん:2009/05/27(水) 16:54:05
>>675
pow(a, 3)
をコンパイラが最適化して
a * a * a
に置き換えてコンパイルしている
678デフォルトの名無しさん:2009/05/27(水) 16:54:29
>>674
なるほど。
例えばpow(2,3)なら2 * 2 * 2,pow(0.1,3)なら0.1 * 0.1 * 0.1と置き換えられるから
powを呼んでいないという訳ですね。
答えてくださった皆さん有難うございました。
679デフォルトの名無しさん:2009/05/27(水) 16:58:38
>>676
習いました。ただpowを呼ばない場合、
そのn乗をループさせるプログラムをどこから手に入れているのかを
疑問に思いましたが>>677さんの言う通りに最適化されていることを知りました。
680デフォルトの名無しさん:2009/05/27(水) 21:25:05
プログラムを実行したら、どこかでメモリがもれてるようで、
使用メモリ量がどんどん上昇します
メモリを確保してるのに開放していないところがあると思うのですが、
いったいどこで漏れている(開放し忘れている)か分かる方法ってありますか?

開発環境:VisualStudio2008
言語:C
知識:普通のプログラムを書いてCtrl+F5でデバッグ実行するくらいで他の知識はない

よろしくお願いします。
681デフォルトの名無しさん:2009/05/27(水) 21:27:26
F5でやればリークしたのがどれか表示されるだろう
682デフォルトの名無しさん:2009/05/27(水) 21:36:36
>>681
すみません、F5を押してもプログラム自体は動くのでエラーが
出ることなく実行できてしまいます。

本当に知識がないのですが…ブレークポイントか言われるものをつかうのでしょうか?
683デフォルトの名無しさん:2009/05/27(水) 21:47:38
>>682
地道に・・・

malllocで確保したヒープのアドレスとfreeしたアドレスをファイルにfprintfでダンプする。
ダンプした内容をチェックしてfreeもれがあるかどうか調べる。
684デフォルトの名無しさん:2009/05/27(水) 21:51:03
>>680
余裕があればmalloc/freeのラッパ関数をつくってみるのも一興です。
685682:2009/05/27(水) 21:53:57
ダンプってなんですか?
686デフォルトの名無しさん:2009/05/27(水) 21:58:53
>>685
「ダンプ」は不適切だったかな?
「ファイル出力」でいいです。

ダンプの意味はメモリーダンプでぐぐってくれ。
687デフォルトの名無しさん:2009/05/27(水) 22:46:12
>>682
終了時に出力ウィンドウにいろいろ出るだろう
688デフォルトの名無しさん:2009/05/27(水) 22:50:40
malloc(0)ってどんな動作すんの?
689デフォルトの名無しさん:2009/05/27(水) 22:51:28
原因がわかりました
…が解決方法がよく分かりません。

プログラム的には以下のようにdouble型の配列を返す関数になっています。

double *test()
{
double *data = (double*)calloc(size, sizeof(double));




return (data);
free(data);
}

これだと、returnしたあとfree()は実行されていないことが分かりました。
しかし、

free(data);
return (data);

と順番を入れ替えると、当然returnする前にdataが消えてしまいます

きちんと値を返し、かつ最後にmallocしたdataをfreeするにはどうしたらいいのでしょうか?
690デフォルトの名無しさん:2009/05/27(水) 22:55:48
>>689
testを呼び出した関数でfreeする。
691デフォルトの名無しさん:2009/05/27(水) 23:00:08
>>689
どんだけ入門者なんだよw
と思ったらここは入門者スレだったか。
じゃあいいのか。
692デフォルトの名無しさん:2009/05/27(水) 23:23:32
double *test()
{
double *data = (double*)calloc(size, sizeof(double));




return (data);
}

int main()
{
double *a;

a=test();
free(a);
}

こういうことでしょうか?

みなさまありがとうございました。
693デフォルトの名無しさん:2009/05/27(水) 23:23:54
この段階で一旦、Javaに手を出してみるのがもしかして
ベターかと。
C/C++のmalloc/free(new/delete)問題はかなりやっかい。
一般論が無い。
Javaである程度の構造を持ったプログラムがかける
ようになってからのステップでやるべきことで
Javaの初歩よりずっと高度な話になってくるし。
694デフォルトの名無しさん:2009/05/27(水) 23:26:13
>>688
環境による.malloc(2)を読め.
例えば*BSDなら,アクセスするとSEGVになる,サイズが0のオブジェクトへのポインタが返る.
695デフォルトの名無しさん:2009/05/27(水) 23:30:43
>>693
リソースの確保と解放っていう意味では、大抵の言語で使われるテクニックだよ。
696デフォルトの名無しさん:2009/05/27(水) 23:42:21
dllのファイル名って取得可能?
dll内で何かの関数コールして、自分自身のファイル名を取得したい。
簡単に出来るかと思いきや、3時間調べてもわからんかった。
exeの名前なら簡単に取れるんだが。
Linuxのlib〜.soでも同じようにファイル名取得出来ると更に嬉しい。
697デフォルトの名無しさん:2009/05/27(水) 23:45:42
>>696
GetModuleFilename
に DllMain で貰ってきたハンドルを渡す
698デフォルトの名無しさん:2009/05/27(水) 23:53:33
>>697
ありがとう
やっぱりそれが一番手っ取り早い?
DllMain 使いたく無いんだが、何か良い方法ないかな。
後出しでスマン
699デフォルトの名無しさん:2009/05/28(木) 00:59:33
どっちにしてもインスタンスのハンドルがいるだろう
複数のDLL使ってたらどのDLLかをどうやって特定するよ
列挙して全部出す手もあるけど、使いたくないというのが意味わからん
700デフォルトの名無しさん:2009/05/28(木) 01:08:46
>>696
CでDllを書く限り、ソースコード直書き__FILE__(マクロ)に勝る方法は無いと思われ
701デフォルトの名無しさん:2009/05/28(木) 01:09:52
そもそも .so のファイル名に依存した方法ってどうかと思う
702デフォルトの名無しさん:2009/05/28(木) 05:07:16
>>693
>C/C++のmalloc/free(new/delete)問題はかなりやっかい。
>一般論が無い。
確かに。
仕事でやるなら先輩もしくは配属先でどういうルールにしてるか確認。
個人で作ってるプログラムなら自分で決める。
C/C++はコンパイルにおける最低限のルール以外は自由にあれこれできるの
がいい点であり大変な点でもある。
703デフォルトの名無しさん:2009/05/28(木) 12:20:32
とはいえど数ある方法が個々の問題に最適に選択されているとまではとても言えない。
初期開発者のスキルやその場の状況や見込みで決まってしまっている部分も
大きい。だからこそ難しいわけ。
704デフォルトの名無しさん:2009/05/29(金) 09:19:03
開発を引き継ぐ際などに関数の関連を把握したいのですが
皆さんはどのようなツールを使われてますか?
705デフォルトの名無しさん:2009/05/29(金) 09:22:45
vim
706>>704:2009/05/29(金) 09:26:00
あ・・・すみません
windows上で動くツール限定としておくべきでした。
707デフォルトの名無しさん:2009/05/29(金) 09:30:10
doxygen, graphvizで静的解析。
gprofなどのプロファイラで動的解析。
必要なら、vtuneでリアルタイム解析。
708デフォルトの名無しさん:2009/05/29(金) 10:08:10
>>704
元の開発者との人脈
709>>704:2009/05/29(金) 10:28:00
>>708
そういうのが可能な場合はおおよそなんとかなるんですが、
昨今はそうじゃないケースも多いわけでw
710デフォルトの名無しさん:2009/05/29(金) 10:38:55
>>709
>707
711>>704:2009/05/29(金) 10:42:08
>>710
あ、それは今調べて自分に合いそうなのを探してますので^^
スルーしてるわけじゃないですよ
712デフォルトの名無しさん:2009/05/29(金) 10:44:14
>707は、doxygen(w/graphviz)と書くべきだな。
gprofに言及するのもどうかと。
713>>704:2009/05/29(金) 12:52:09
>>705>>707>>708>>710>>712さん
お付き合いいただいてありがとうございます。
いろいろ設定関連ではまって検証に時間がかかってしまいました。

graphviz + doxygen はいいですね。
これでいこうと思います。
714デフォルトの名無しさん:2009/05/29(金) 16:16:11
こういう書き方ってあるんすか?
教えてえろいひと。

char *hoge[] = {
[5] = "baka",
[11] = "aho",
[100] = "nuko"
}
715デフォルトの名無しさん:2009/05/29(金) 16:22:52
>>714
ないあるよ
716デフォルトの名無しさん:2009/05/29(金) 16:23:39
>>714
今のCの規格ならできますよ。旧式のおんぼろコンパイラだと駄目かも。
717デフォルトの名無しさん:2009/05/29(金) 17:00:29
>>716
おんぼろコンパイラとは何だ

VS2008がおんぼろだと言いたいのか

だいたいC99に100%対応しているコンパイラなんて
数えるほどしかないんだが

gccですら部分的対応だし
718デフォルトの名無しさん:2009/05/29(金) 17:07:51
>>717
そんな軽口に噛み付く人って・・・・
719デフォルトの名無しさん:2009/05/29(金) 17:08:01
いんてるはいってる
720デフォルトの名無しさん:2009/05/29(金) 17:18:14
>>718
言葉に気を付けろと言っているんだ
現実を見ろ
721デフォルトの名無しさん:2009/05/29(金) 17:21:53
>>720
まぁまぁ落ち着いて
722デフォルトの名無しさん:2009/05/29(金) 17:23:25
>>721
はぁ?ふざけんな死ね
723デフォルトの名無しさん:2009/05/29(金) 17:23:27
>>721
何がまあまあ落ち着いてだ
自分で怒らせておいて
724デフォルトの名無しさん:2009/05/29(金) 17:44:30
自演乙
725デフォルトの名無しさん:2009/05/30(土) 06:35:09
名前空間があれば完璧なんだが…
標準にならないかな…
726デフォルトの名無しさん:2009/05/30(土) 07:47:32
無くても困らないという印象
名前の競合は、ネーミングルールで実用上困ったことはないし、
ローカルスコープ限定で同じ名前を使いたい場合も static で十分。

1ファイルに1関数、というような制限のあるプロジェクトだと
staticじゃ不十分だろうけど
727デフォルトの名無しさん:2009/05/30(土) 07:59:34
もうさ最近C99厨が増えて仕方ないので
この際2ch有志でC99コンパイラ作れや
728デフォルトの名無しさん:2009/05/30(土) 08:14:28
>>727
いやどす

というかプログラマ適正を見る際の初期の目安に最適じゃん

C99に固執するやつ->向いてねえ
729デフォルトの名無しさん:2009/05/30(土) 10:05:07
>>728

>>716みたいにC89コンパイラを「おんぼろコンパイラ」と呼ぶアホまで
現れる始末だぜ

明らかにゆとりだよな>>716
730デフォルトの名無しさん:2009/05/30(土) 10:11:48
ゆとりが年寄りをおんぼろと形容するのは
別におかしくないし貶してる事にはならんと思うぞ。
731デフォルトの名無しさん:2009/05/30(土) 10:35:21
>>730
その例えはちょっとおかしいな

C99コンパイラが全盛ならその例えもわかる
だけど現存するC99完全準拠コンパイラなんて
本当に限られてるんだぜ

Intel C++とか
732デフォルトの名無しさん:2009/05/30(土) 10:37:47
他にあんの?
733デフォルトの名無しさん:2009/05/30(土) 10:38:40
C99完全対応のCコンパイラができて飛躍的に生産性があがるならいいよ。
でなければ無駄。

こんな見極めもできないゆとりがおんぼろ呼ばわりするな。
734デフォルトの名無しさん:2009/05/30(土) 10:45:03
>>732
Macに何かあったみたい
735デフォルトの名無しさん:2009/05/30(土) 10:48:27
Cコンパイラだってソフトの一種だろ

おんぼろとか言ってるやつは無理無茶をいうエンドユーザーと一緒だろ。
お金くれないけど機能追加だけいう痛いエンドユーザー。

こんなこともわからないやつは開発者にいらねえ
736デフォルトの名無しさん:2009/05/30(土) 10:56:28
>>735
>お金くれないけど機能追加だけいう痛いエンドユーザー。
wwwww
737デフォルトの名無しさん:2009/05/30(土) 11:32:54
C99にこだわるような奴はCに向いてない。
もっと高級なスクリプト言語でもやってろ。
738デフォルトの名無しさん:2009/05/30(土) 11:41:10
俺はC99にこだわってはいないわけだが。使えるなら使いたいけど。
C89にこだわってる奴が痛くないか?
739デフォルトの名無しさん:2009/05/30(土) 11:45:57
開発に使うコンパイラがC99対応してない
頭を切り替えてC89でコーディング->普通
頭を切り替えできずコンパイラをこき下ろす->開発者に向いてない

それだけ
740デフォルトの名無しさん:2009/05/30(土) 11:59:10
そうだな、こき下ろすべきはコンパイラじゃなくてコンパイラベンダーだよな。
741デフォルトの名無しさん:2009/05/30(土) 15:49:17
CはC89=Ansii Cで完成したということだ
C89以上のものを望むならC++で
742デフォルトの名無しさん:2009/05/30(土) 16:05:03
引数の型が(int, int)、返り値の型がintであるような関数ポインタを返す関数のプロトタイプはどう書けばいいんでしょうか?
743デフォルトの名無しさん:2009/05/30(土) 16:12:55
typedef int (*My_Type)(int , int);
My_Type foo();
だね。1つにまとめるなら
typedef int (*foo())(int , int);
744743:2009/05/30(土) 16:13:37
1つにまとめるなら
int (*foo())(int , int);
745デフォルトの名無しさん:2009/05/30(土) 16:14:39
課題でないなら、絶対typedefすべきだよな。可読性のために。
746デフォルトの名無しさん:2009/05/30(土) 16:15:36
このシンタックス考えた奴はアホだ。
747デフォルトの名無しさん:2009/05/30(土) 16:18:57
こうか
なるほど頭が混乱する

#include <stdio.h>

int f(int x, int y)
{
return x + y;
}

int (*func(void))(int x, int y)
{
return f;
}

int main(void)
{
printf("%d\n", (func())(1, 2));

return 0;
}
748743:2009/05/30(土) 16:28:15
発狂するな。
>>742さんに分かっただろうか?
749デフォルトの名無しさん:2009/05/30(土) 16:29:46
みなさんサンクスです
素直にtypedefしたほうが身のためのようですね
750デフォルトの名無しさん:2009/05/30(土) 17:49:00
ていうか、>>743のtypedefはあまりわかり易くなってないよ。

typedef int myfn_t(int, int);
myfn_t *foo();

の方が読みやすい。
見た目で「関数へのポインタ」が出ないで
「何らかのポインタを返す関数」があって、その何らかが関数、という形だから。
見た目だけだけど。

C++のメンバ関数なら仕方ないけどね。
751743:2009/05/30(土) 23:15:42
>>750
別に俺は
わかりやすさのためにtypedefしたわけではなく
説明のためだったんだが。

まあとにかく>>750のが分かりやすいことには俺も同意するがね。
752デフォルトの名無しさん:2009/05/31(日) 03:53:30
おいらは頭悪いので、複雑な宣言はまずPerlで書いてみる。
いきなりCじゃ書けない。
ターパスならこんな苦労しないのに
753デフォルトの名無しさん:2009/05/31(日) 08:06:36
>>752
プリプロセッサ使えばいいのに
754デフォルトの名無しさん:2009/05/31(日) 17:45:59
list[]と言う配列にある入っているデータを、0.5秒ごとに出力したいと思っています。
この場合、どうしたら良いのでしょうか?
755デフォルトの名無しさん:2009/05/31(日) 17:52:04
>>753
せめてtypedef使って下さい…
756デフォルトの名無しさん:2009/05/31(日) 17:52:43
>>754
cronでぐぐってください
757デフォルトの名無しさん:2009/05/31(日) 17:54:32
>>754
まぁ標準Cでやるっていうなら
time.hにあるclock() の値を使って、
無限ループの中から0.5秒ごとに出力だね

758デフォルトの名無しさん:2009/05/31(日) 18:09:00
環境によりますが、signal は使えませんか?
759デフォルトの名無しさん:2009/05/31(日) 18:09:50
clockだとプロセスが使用したCPU時間であって、実時間じゃないばあいがあるんじゃね?
760デフォルトの名無しさん:2009/05/31(日) 18:17:31
うん。標準Cでは実時間の一秒未満を計測する方法はない。
761デフォルトの名無しさん:2009/05/31(日) 18:20:38
いやぁこんなこと聞くぐらいだから、変に気を利かせて標準でやる方法を提案してみた次第で
ご指摘はそのとーり

>>758
それができるならそっちのがいいわ
762758:2009/05/31(日) 18:38:21
>>761
うん、話の選び方、苦労はわかります。unix なら signal ですが、Windows ではどうなるんでしょうね。
763デフォルトの名無しさん:2009/05/31(日) 18:50:22
windowsもntあたりからPOSIXなんちゃらに準拠してたから
あるんじゃね?
かといってsignalは可用性なさそうだから嫌だけど
764デフォルトの名無しさん:2009/05/31(日) 19:11:50
Windowsなら500msごとにシグナル状態になるタイマーオブジェクトを作成して
(OpenWaitableTimer/SetWaitableTimer)
WaitForSingleObject関数でにシグナル状態を待つ。
765デフォルトの名無しさん:2009/05/31(日) 19:58:20
簡単に済ませたいのならsleep系でいいんじゃね?
たいがいの環境で使えるし。
正確さが必要なら、sleepする時間を微調整するとかいろいろ方法はあるし。
766デフォルトの名無しさん:2009/05/31(日) 21:16:05
俺これしかソート知らないんだけど、バブルソートってのも覚えておいたほうがいいの?
ていうかバブルソートってどんなの?
int a[5];
int i , j;
int temp;

printf("5個 適当な数字をいれて\n");

for( i = 0 ; i < 5 ; i++ ) scanf("%d" , &a[i] );

for( i = 0 ; i < 5 ; i++ ){
for( j = 0 ; j < 5 ; j++ ){

if( a[i] < a[j] ){
temp = a[i];
a[i] = a[j];
a[j] = temp;

}
}
}

for( i = 0 ; i < 5 ; i++ ) printf("%d ," , a[i]);

}
767デフォルトの名無しさん:2009/05/31(日) 21:17:05
768デフォルトの名無しさん:2009/05/31(日) 21:18:20
signed ⇔ unsignedの型変換の際には二進数表現では変化しないことは規格で保障されてますか?
769デフォルトの名無しさん:2009/05/31(日) 21:19:25
>>768
いいえ。
770デフォルトの名無しさん:2009/05/31(日) 21:21:51
signed char の場合
FFは-1ですが
unsigned charの場合
255です
771デフォルトの名無しさん:2009/05/31(日) 21:24:47
>>766
別にソートアルゴリズムの内容なんて知らなくても大抵は大丈夫だろ
なにやる人か知らんけど

むしろ各ソートの性質をかるく知っとけ
安定ソートとかオーダーとか
772デフォルトの名無しさん:2009/05/31(日) 21:50:36
>>771
ゲームプログラムを趣味でしたいだけ。
ポインタも微妙なんだけど、コレぐらい分かってれば良いの?
それとも関数ポインタまで抑えておくべき?

#include <stdio.h>

void kakeru(int *test , int *test2 , int *ans);

void main(void){
int a , b , ans;
ans = 0;

printf("入力して");
scanf("%d%d" , &a , &b);

kakeru( &a , &b , &ans );

printf("%d" , ans);

}

void kakeru(int *test , int *test2 , int *ans){
*ans = (*test) * (*test2);
}
773デフォルトの名無しさん:2009/05/31(日) 21:59:27
>>772
ゲームなら、関数ポインタを使う場面は結構あると思う。
774デフォルトの名無しさん:2009/05/31(日) 22:00:24
>>773
関数ポインタはちょっと手の込んだアルゴリズムではよくつかいますよ。qsort() とか。
775デフォルトの名無しさん:2009/05/31(日) 22:13:35
さっきのをポインタとか使ってやってみたけど、どうもエラーが出る…。
int型の配列のアドレスを関数の引数に渡す方法が違うのかしら。
でも確か先頭のアドレスを渡せば全部参照してくれたと思ったけど、どなたか教えてください。

#include <stdio.h>
void datesort( int *tes[10] );
void main(void){
int a[10];
int i;

printf("ソートさせたいデータを入れて");
for( i = 0 ; i < 10 ; i++ ) scanf("%d" , &a[i]);

datesort( &a );

for( i = 0 ; i < 10 ; i++ ) printf("%d" , a[i]);

}
void datesort( int *tes[10] ){
int i , j , temp;

for( i = 0 ; i < 10 ; i++ ){
for( j = 0 ; j < 10 ; j++ ){
if( *tes[i] > *tes[j] ){
temp = *tes[i];
*tes[i] = *tes[j];
*tes[j] = temp;
}
}
}
}
776デフォルトの名無しさん:2009/05/31(日) 23:07:39
インデントが整ってないから教えてあげない
777デフォルトの名無しさん:2009/05/31(日) 23:21:14
>>775
for (i = 0; i < 10; i++) tes[i] = &a[i];
...
datasort(tes[i]);

とやらないと、tes[i]が指す先の内容が何か分からないので
未定義の動作になってしまう
778デフォルトの名無しさん:2009/06/01(月) 14:28:01
質問です。

void func1(){
printf("hello world\n");
}
int main(){
printf("%d \n", sizeof(func1));
return 0;
}

プリントされる値は1なんですが、これはなんで1バイトなのしょうか?
(関数は256個以上定義できない??)


779デフォルトの名無しさん:2009/06/01(月) 15:00:28
>>778
VC++だとエラーになってコンパイルできませんでした

sizeof オペランドが正しくありません。
780デフォルトの名無しさん:2009/06/01(月) 15:21:47
>>779
だめみたいですか。
gccだと通るんですが。。
781デフォルトの名無しさん:2009/06/01(月) 15:23:46
というかそもそも何がしたいのかさっぱりわからん
ポインターのサイズを求めたいのか・・・・
関数の数なんて上限きまってないはずだよ。
782デフォルトの名無しさん:2009/06/01(月) 15:35:48
>>780
お前は何のサイズが欲しいんだ。

関数ポインタの大きさなら sizeof &func
戻り値の大きさなら sizeof func()
783デフォルトの名無しさん:2009/06/01(月) 16:07:52
何がしたいというわけではなく、ただの気になっただけなんです。
アドレスサイズは4バイトのはずなのに、なぜ、sizeof(func)で
1バイトと表示されるのかが分かりません。

784デフォルトの名無しさん:2009/06/01(月) 16:21:44
voidのサイズだろうが
785デフォルトの名無しさん:2009/06/01(月) 16:22:42
>>783
未定義動作ってやつじゃないの
1と表示してもいいしエラーにしてもいい
786デフォルトの名無しさん:2009/06/01(月) 16:24:12
>>784
sizeof( void )は0だったよ
787デフォルトの名無しさん:2009/06/01(月) 16:27:36
関数ポインタのサイズに決まってるだろこのアホどもw
788デフォルトの名無しさん:2009/06/01(月) 16:29:34
>>787
ちげーよ死ね
789デフォルトの名無しさん:2009/06/01(月) 16:59:11
>>786
おれの環境ではsizeof( void )は1だよ。

>>785が指摘しているように、
サイズが求められないものに対しては処理系依存なんじゃない?
790デフォルトの名無しさん:2009/06/01(月) 20:23:45
間違っても

void *p = xxx;
p++;

というコードが通るコンパイラ(オプション依存)の動作を
標準Cの挙動と勘違いしないように。
791デフォルトの名無しさん:2009/06/01(月) 20:41:13
何でCスレってこうも話題が反れていくんだろうな
792デフォルトの名無しさん:2009/06/01(月) 21:05:27
C/C++プログラマになりたいんですけど、とりあえずやっとけってことはありますか?
いまのところはゲーム作りで経験値稼ぎ&ランニングで体力作りをやってます
793デフォルトの名無しさん:2009/06/01(月) 21:08:44
>>792
マ板にいってみろ
794デフォルトの名無しさん:2009/06/01(月) 21:09:26
>>792
ゲーム作りって何やってるのか分からないが、
とりあえず覚悟を決めることが必須。
険しい道のりであることは否めない。
途中で諦めると使えないゴミが完成するので、それだけは避けるべく覚悟が必要。

まあC/C++に限らず、
というかプログラマに限らず、
どの職業でもこれは同じだろうけど。
795デフォルトの名無しさん:2009/06/01(月) 21:29:47
別にどんな職業でも同じ事をわざわざおっしゃらなくても結構です
796デフォルトの名無しさん:2009/06/01(月) 21:48:51
>>795
途中で諦めちゃった使えないゴミさんですか?
人生 お疲れ様ですwww
797デフォルトの名無しさん:2009/06/02(火) 00:00:44
>>796
脳内補完が進みすぎているようだ
これでは保守はむり
798:2009/06/02(火) 17:54:40
教えて下さい。
char Buff[2];

if(Buff[0]=="\n"){
処理
}
これだとエラーが出ます。strcmpだと実行時、例外エラーがでます。やりたいことは、配列の特定の所に改行が入ったらという条件文を作りたいです。お願いします。
799デフォルトの名無しさん:2009/06/02(火) 17:58:02
>>798
'\n'
800デフォルトの名無しさん:2009/06/02(火) 17:58:10
>>798
charとchar*って違うんだよね☆
801798:2009/06/02(火) 18:12:41
>>799>>800
ありがとうございます。通りました。
802質問!:2009/06/02(火) 23:23:24
色々聞いていいですか?
803ダメ!絶対!:2009/06/02(火) 23:27:47
お断りします。
804質問!:2009/06/02(火) 23:38:11
ざんんねえん
やっぱC辞めてJava逝ってきますノシ
805デフォルトの名無しさん:2009/06/03(水) 08:28:35
コロコロ変えるやつはどんな言語も身にならないよ
806デフォルトの名無しさん:2009/06/03(水) 14:06:58
バイナリファイルの操作で、更新・追加両方行いたいような場合はどのよう
なモードでfopen()すると良いのでしょうか。
既にファイルがある場合はそのファイルを消さずにデータを追加したく、
なおかつ既存の部分の上書きもしたいです(当然読み込みもしたい)
807デフォルトの名無しさん:2009/06/03(水) 14:11:21
808806:2009/06/03(水) 14:34:23
>>807
ありがとうございます。

1.ファイルが存在しない場合は空ファイルをまず作って閉じる。
2.モード "r+b" でfopen()する。

で目標の動作ができそうです。
ありがとうございました。
809デフォルトの名無しさん:2009/06/03(水) 14:56:19
a+bしてfseekするんでいいじゃな
810デフォルトの名無しさん:2009/06/03(水) 14:57:33
"r+b"で失敗したら、"w+b"で開けばいいよ。
811デフォルトの名無しさん:2009/06/03(水) 14:58:19
>>809
残念、"a+"では追記しかできないんだな。
812806:2009/06/03(水) 15:24:16
>>810
それが一番よさそうですね。そうします。

a+ の失敗を「からだで学んで」いました…。
fseek() 、fwrite() 後の ftell() の戻り値を確認しながら、
「???」となっていました。
813:2009/06/03(水) 15:44:58
printf(const char* format, ...)

printfの...ってどういう意味ですか?
814デフォルトの名無しさん:2009/06/03(水) 15:46:07
つ[stdarg.h]
815sage:2009/06/03(水) 15:50:41
>>813
可変個引数のことだったと思います。
816デフォルトの名無しさん:2009/06/03(水) 15:51:50
... vararg 可変引数 好きなだけ引数を取れる formatを解析して引数の数と型を推論している 対応が狂うと何がおきるかわからない printfは数ある標準ライブラリ関数の中でも特異な関数の一つ
817813:2009/06/03(水) 16:08:50
今、自作printfを作成しています。...の引数をどのように、展開し、文字データに組み込むかわかりません。ご教授お願いします。開発環境はVC2005エクスプレスです。...のウオッチすらままならないです。
818デフォルトの名無しさん:2009/06/03(水) 16:09:33
>>817
宿題スレにいけ
819デフォルトの名無しさん:2009/06/03(水) 16:10:09
>>817
つ[man stdarg]
820デフォルトの名無しさん:2009/06/03(水) 16:24:34
>>817
printf のフォーマットを完全サポートするつもりなのか?
それなら vsprintf 経由でバッファに書き込んだほうが現実解っぽいけど?

>の引数をどのように、展開し
va_arg() で抜き出す

>文字データに組み込むかわかりません
値の可視文字化のフルスクラッチ実装は難易度がかなり高いと思われ…
sprintf 呼び出しで茶にごすか?

# VC2005EE って CRTのソースインストールできたっけ?
# printf の一部分ぐらいは見れると思うけど 追っかけるの面倒だわ
821デフォルトの名無しさん:2009/06/03(水) 16:28:31
車輪を再発明するのはよしなさい。
スコット・メイヤーズというえらい人も
「Effective C++の初版ですまぽを公開した時は
 プロの開発者に散々チェックしてもらったけど
 その後何年もエラー報告が届いたよ〜」
と嘆いていらっしゃった。
今では「boost使ったら?」と笑顔で書いている。
822813:2009/06/03(水) 16:33:16
完全にサポートするつもりです。va_argはmsdnでわかりますか?
823デフォルトの名無しさん:2009/06/03(水) 16:36:38
824デフォルトの名無しさん:2009/06/03(水) 16:36:40
ばっちりだよ!

…ただし、言語仕様のところは全部英語だけど。
(C#、VB、C++/CLIなどは完全日本語化されている)
先日MSKKはMSDNの日本語化を積極的に勧めるって発表してたけど
MSKKの仕事の遅さは折り紙つきだから
CやC++の言語仕様のところが日本語化されるのは1000000年後くらいじゃないかなぁ。
っていうか、いい加減C99に対応しろよ。いつまでC89で行くつもりだよ。
825デフォルトの名無しさん:2009/06/03(水) 16:41:18
813とは違う状況だが組込みのファームウェアの仕事してた時は
社内で作った組み込み用OSに自作 printf() 、自作 malloc() などの
コードがいろいろあった気がする。内容はもう忘れちゃった。
(printf()の出力はシリアル出力に出てきてデバッグに使用する)
826デフォルトの名無しさん:2009/06/03(水) 16:45:05
>>825
コンパイラ・実行環境の都合上、標準関数はまず使えない ってこと?
それはそれで大変な作業だね (社内標準化されてて これ使え になってりゃ良いけど)
827デフォルトの名無しさん:2009/06/03(水) 16:51:18
Whitesmith C
828デフォルトの名無しさん:2009/06/03(水) 16:52:11
>>826
組み込みの場合ディスプレイ付きじゃない場合もあるから
printfを関数で作ってるだけでしょ。

牛のNASなんかもシリアルから標準出力と同じものが出てたはずだし
829デフォルトの名無しさん:2009/06/03(水) 16:52:59
>関数で作ってるだけでしょ。
独自関数で作ってるだけでしょ。
830デフォルトの名無しさん:2009/06/03(水) 16:53:11
>>826
そう。printf()はn進数への変換のコードも必要だったような気がする。
831デフォルトの名無しさん:2009/06/03(水) 16:55:00
オレも組み込みでデバッグ専用でprintf作ったなあ
832デフォルトの名無しさん:2009/06/03(水) 17:00:47
>>826
大変というか無ければ作る
タダそれだけ
833826:2009/06/03(水) 17:02:16
標準出力は塞がれてるけど vsprintf は使えるぜとかなら
独自実装はまだ楽っぽいが…
その手の暗にスタック食いなやつが、(メモリの都合で)実質的に使えねぇ となると泣けるな

組み込みはどんな制限つくかわからんから大変だね
834デフォルトの名無しさん:2009/06/03(水) 17:03:22
printfライクなものの実装は決して難易度は高くは無いが、かなり面倒。
拡張要求(欲望)で機能が肥大化しがち。
またこういったprintf上位互換コードが流出すると、一般的なC言語のライブラリとの間で
相互干渉が発生してトラブルを招きがち。
極めてプライベートな場所でそれを使用するのは止めないが、パブリック(商用)な場所で
それを使う場合は十分な注意が必要。
印字書式を全く新しいものにするとか。
printfの印字書式は非常に小さいがある種のプログラミング言語であるとも考えられ
当然そこには意匠権や特許権とかも絡んでくるかも知れない。
835デフォルトの名無しさん:2009/06/03(水) 17:08:14
printfは%sと%dを実装すればまあ使える。
836デフォルトの名無しさん:2009/06/03(水) 18:22:06
仮にprintfの書式の特許なんかがあったとしても
とっくに切れてるはずだから大丈夫
837デフォルトの名無しさん:2009/06/03(水) 18:31:37
ここまで誰も指摘していないが、printfを自作するなら、vprintfも作っておけ。
printfはvprintfを呼ぶだけで済むから無駄にはならない。
int my_printf(const char *format, ...)
{
int ret;
va_list va;
va_start(va);
ret = my_vprintf(format, va);
va_end(va);
return ret;
}
838デフォルトの名無しさん:2009/06/03(水) 18:43:14
while文で例えば

i=0;
while(i>1)

のような場合、whileは一回も機能せずに終わりますか?
839デフォルトの名無しさん:2009/06/03(水) 18:45:13
int count = 0;
i=0;
while(i>1)
{
 count++;
}

//countを表示

という風に確認してみるといい。
というかその程度ならそういう癖をつけるほうがいい
840デフォルトの名無しさん:2009/06/03(水) 19:09:34
int a,b,c,i,j;
printf("整数1を入力してください:");
scanf("%d",&a);
printf("整数2を入力してください:");
scanf("%d",&b);
if(a>b)
{
c=a;
a=b;
b=c;
}
i=a;
while(i>=a&&i<=b)
{
j=2;
while(j>=2&&j<=i-1)
{
if(i%j!=0) break;
j++;
}
if(i=j) printf("%d",i);
i++;

}


これで整数1と整数2の間にある素数を表示させようとしているのですが、
できません…。
たぶんiとjが変なのだと思うのですが
どこを直したらよいのか見当がつかないので教えてください。
841デフォルトの名無しさん:2009/06/03(水) 19:12:35
>>840
scanf()おかしい? → http://www.aa.alpha-net.ne.jp/freeh/minimini/develop/cscanf.html
それともなにか出来ない?
842デフォルトの名無しさん:2009/06/03(水) 19:24:21
整数1と2は入力できるのでscanfのところは大丈夫だと思うのですが、
たとえば10と5と入れたら7(あと5も?)と出てこなければいけないのに、
2とでてきてしまいます。
843デフォルトの名無しさん:2009/06/03(水) 19:28:02
>とっくに切れてるはずだから大丈夫
とっくに切れてるはずだから注意が必要なわけ
844デフォルトの名無しさん:2009/06/03(水) 19:41:10
切れた特許の何を注意する必要があるのか
845デフォルトの名無しさん:2009/06/03(水) 19:43:55
>>842
うわぁはずかしぃ・・・
if(i=j) printf("%d",i);
846デフォルトの名無しさん:2009/06/03(水) 19:58:32
>>845
ありがとうございました!!!
そこと、if(i%j!=0) break;
の!=が==だったみたいです。

847デフォルトの名無しさん:2009/06/03(水) 20:02:24
間違いじゃないけど、i>=a とか、j>=2とかムダだから
848デフォルトの名無しさん:2009/06/03(水) 20:17:36
なんだある数値の範囲内の素数を列挙するだけか
// かきかえた
#define SWAP(TYPE, A, B) do{TYPE tmp = B; B = A; A = tmp;}while(0)
int readInt(const char * print) {
  int r;
  printf("%s", print);
  scanf("%d", &r);
  return r;
}
int isPrime(int n) {
  int i;
  for (i = 2; i < n / 2; i++)
    if ((n % i) == 0) return 0;
  return 1;
}
int main(void) {
  int a, b, i;
  a = readInt("整数1を入力してください:");
  b = readInt("整数2を入力してください:");
  if (a > b) SWAP(int, a, b);
  for (i = a; i <= b; i++) {
    if (isPrime(i)) printf("%d\n", i);
  }
}
849デフォルトの名無しさん:2009/06/03(水) 23:14:24
下記のそれぞれのsizeofとそれに関するコメント文の対応は正しいですか?
よろしくお願いします。

printf("sizeof 1-1..%d\n", sizeof(double *[10])); /* doubleへのポインタ型の配列(要素数10)のサイズ */
printf("sizeof 1-2..%d\n", sizeof(double (*)[10])); /* double型の配列(要素数10)へのポインタ型のサイズ */

printf("sizeof 2-1..%d\n", sizeof(double *[2][3])); /* doubleへのポインタ型の配列(要素数3)の配列(要素数2)のサイズ */
printf("sizeof 2-2..%d\n", sizeof(double (*[2])[3])); /* double型の配列(要素数3)へのポインタ型の配列(要素数2)のサイズ */
printf("sizeof 2-3..%d\n", sizeof(double (*)[2][3])); /* double型の配列(要素数3)の配列(要素数2)へのポインタ型のサイズ */

printf("sizeof 3-1..%d\n", sizeof(double **[3])); /* doubleへのポインタ型へのポインタ型の配列(要素数3)のサイズ */
printf("sizeof 3-2..%d\n", sizeof(double *(*)[3])); /* doubleへのポインタ型の配列(要素数3)へのポインタ型のサイズ */
printf("sizeof 3-3..%d\n", sizeof(double (**)[3])); /* double型の配列(要素数3)へのポインタ型へのポインタ型のサイズ */
850813:2009/06/04(木) 10:42:55
皆さんアドバイスありがとうございます。
va_start使ってやってみます。
851授業中:2009/06/04(木) 11:21:13
public class Kansu_sum{
public static int sum(int n){
int i,s;
s=0;
for(?????????){
s=s+i;
}
return ???;
}

public static void main(String[] args) {
int n;
n=10;
System.out.println("1から"+n+"までの和="+ ???????);
}
}

これの???????に何がはいるかわかりますか?
852デフォルトの名無しさん:2009/06/04(木) 11:28:13
for(i = 1; i <= n; i++)
...
return s;
...
System.out.println("1から"+n+"までの和="+ Kansu_sum::sum(n));
853授業中:2009/06/04(木) 11:33:50
>>852
ありがとうございます!!

System.out.println("1から"+n+"までの和="+ Kansu_sum::sum(n));

最後の+Kansu_sum::sum(n));

ここでうまくいかないのですが、何かおかしいですか?
854デフォルトの名無しさん:2009/06/04(木) 11:48:15
うぜえ
Javaはスレ違いだろ
855授業中:2009/06/04(木) 12:06:30
>>853
System.out.println("1から"+n+"までの和="+sum(n));

で、できました。
スレチすみませんでした
856デフォルトの名無しさん:2009/06/04(木) 16:24:37
1#include <stdio.h>
2
3 int main(void){
4 char *w[] = {"S","SS","SSS","SSSS","SSSSS","SSSSSS","SSSSSSS",};
5 int k;
6 int i;
7 for(i = 0; i < 7; i++){
8 printf("Bytes of w[%d] are %d\n",i,sizeof w[i]);
9 }
10 for(k = 0; k < sizeof w / sizeof w[0]; k++){
11 printf(" %d:%s",k,w[k]);
12 }
13 printf("\n");
14 return 0;
15 }
857デフォルトの名無しさん:2009/06/04(木) 16:25:10
16 int i;
17 for(i = 0; i < 7; i++){
18 printf("Bytes of w[%d] are %d\n",i,sizeof w[i]);
19 }
20 for(k = 0; k < sizeof w / sizeof w[0]; k++){
21 printf(" %d:%s",k,w[k]);
22 }
23 printf("\n");
24 return 0;
25 }
858デフォルトの名無しさん:2009/06/04(木) 16:28:29
これを実行すると
Bytes of w[0] are 4
Bytes of w[1] are 4
Bytes of w[2] are 4
Bytes of w[3] are 4
Bytes of w[4] are 4
Bytes of w[5] are 4
Bytes of w[6] are 4
0:S 1:SS 2:SSS 3:SSSS 4:SSSSS 5:SSSSSS 6:SSSSSSS
となります。w[0]からw[6]それぞれに格納されている文字の数にも関わらず、
バイトの数が同じなのはなぜなのでしょうか?よくわからないので知っているかた教えてください。
859デフォルトの名無しさん:2009/06/04(木) 16:30:34
ポインタの大きさ出力してるからだよ馬鹿
860デフォルトの名無しさん:2009/06/04(木) 16:30:42
>>858
当たり前だろ
sizeof w / sizeof w[0]は単なるchar型へのポインタの大きさ

文字列の長さを知りたかったらstrlen()を使え
861デフォルトの名無しさん:2009/06/04(木) 16:31:28
sizeof w[i]
これだとポインタサイズになるんじゃないかな?
32bit環境なんで4バイト
それにstrlenとかで調べるしかないんじゃない?
862デフォルトの名無しさん:2009/06/04(木) 16:39:14
わかりました。
回答有難うございました。
863デフォルトの名無しさん:2009/06/04(木) 16:53:04
#defineしたものを一度#undefしてまたもとに戻したい場合はどうすればいいのでしょうか?
864デフォルトの名無しさん:2009/06/04(木) 17:03:43
>>863 また#defineする。
865デフォルトの名無しさん:2009/06/04(木) 17:39:13
foo.hに宣言してある関数をbar.hで使うとします
この場合main.cでfoo.h bar.hを両方インクルードするのか
foo.hに二重インクルード防止をつけてbar.hに#include "foo.h"を書いてしまうのか
一般的に好まれるのはどちらのスタイルですか?
866デフォルトの名無しさん:2009/06/04(木) 17:42:01
ケースバイケース
自分で書いてるだけならお好きなように
867デフォルトの名無しさん:2009/06/04(木) 17:52:32
> foo.hに宣言してある関数をbar.hで使うとします
bar.cで使うの間違いか?

いずれにせよ、二重インクルード防止は常につけるように。
基本は、そのファイルで必要なヘッダだけを includeする。
868デフォルトの名無しさん:2009/06/04(木) 20:44:37
センチネルをおくのが普通なのでは?
#if !defined XXX
#define XXX
...
#endif
とか
869デフォルトの名無しさん:2009/06/04(木) 20:54:55
それ番兵って呼ぶの?変なの。
870デフォルトの名無しさん:2009/06/04(木) 20:55:01
>>865

インクルードガードで
_SEX_H_
のようにベンダでもないくせに先頭にアンダースコア入れる奴にはなるなお
871デフォルトの名無しさん:2009/06/04(木) 21:45:50
//  / ̄ ̄ ̄\
// / ─  ─ \
/// (●) (●) \    
//| \(__人__)/ |     ←     
//\ | ` ⌒´ | /
///          \  
//            ┼ヽ  -|r‐、. レ |
//             d⌒) ./| _ノ  __ノ
//            _______
//            製作 ○○

↑いつも俺がコードの最後に貼ってるヤツ
872デフォルトの名無しさん:2009/06/04(木) 22:03:15
頂きました
873デフォルトの名無しさん:2009/06/05(金) 03:10:22
マクロで定義して使える文字列化演算子とトークン連結演算子ってのがあるが、
これのうまい使い方というか、どんな風に使うと便利なのか誰か例を示してくれないか?
874デフォルトの名無しさん:2009/06/05(金) 03:13:10
TEXT()
875デフォルトの名無しさん:2009/06/05(金) 03:17:53
void func_a(char *a[]);

void main(void){
char *a[]=    /* ←ここを変えたいのです*/
{
"あいうえお",
"かきくけこ",
"さしすせそた"
};

func_a(a);
printf("%s\n",a[1]);
return;
}

void func_a(char *a[]){
printf("□■□func_a開始□■□\n");
printf("%s\n",a[0]);
printf("%s\n",a[1]);
printf("%s\n",a[2]);
strcpy(a[1],"12345");
printf("□■□func_a終了□■□\n\n");
return;
}

迷える子羊をお救い下さい
上記のテーブル定義を
char a[3][14]=
にした場合、関数func_cを正常に呼び出すには、どこをどう修正したらいいのでしょうか?
色々試してはいるのですがさっぱり分かりません。
どうかご教示をお願い致します
876875:2009/06/05(金) 03:18:56
すいません
func_cじゃなくてfunc_aです
877デフォルトの名無しさん:2009/06/05(金) 03:56:43
あきらめた
void func_a(char [3][15]);
int main(void){
    char a[3][15]=
    {
    "あいうえお",
    "かきくけこ",
    "さしすせそた"
    };
    func_a(a);
    printf("%s\n",a[1]);
    return;


void func_a(char a[3][15]){
    printf("--------------\n");
    printf("%s\n",a[0]);
    printf("%s\n",a[1]);
    printf("%s\n",a[2]);
    strcpy(a[1],"12345");
    printf("-----------\n");
    return;

878デフォルトの名無しさん:2009/06/05(金) 04:44:56
ポインタの配列と配列の配列と配列のポインタはそれぞれ違う型なので
char [3][15] は char (*)[15] では受け取ることができるけど char *[3] では受け取れないよ。
char *[3] は char** で受け取る。
ちなみに関数引数ではそれぞれ char [][15], char *[] と書いても良い。
879デフォルトの名無しさん:2009/06/05(金) 09:21:54
>>877
普通はそういうデータはこう持つ。
staic char const * const array[] = {
"あいうえお",
"かきくけこ",
"さしすせそた",
};
あ、書き換えもしたいのか。んじゃchar a[][15]でもいいか。
# 16にしておくのが無難だけど本質的じゃないし。
880875:2009/06/05(金) 15:16:26
>>877
ありがたやありがたや


>>878
なるほど


>>879
勉強になります


みなさん、ありがとうございました
881デフォルトの名無しさん:2009/06/05(金) 18:27:00
>>873
構造体のメンバ ⇔ 表示用シンボル テーブルの実体を記述するときとか

struct MyStruct {
int a;
double b;
};

#define IMP(name) { #name, (void*)&((struct MyStruct*)NULL)->##name }

struct SymbolTable {
char *caption;
void *data_ptr;
} Tables[] = {
 IMP(a),
 IMP(b),
};

こんな感じ。
882デフォルトの名無しさん:2009/06/05(金) 19:07:47
main文のreturn 0;って、どんな使い道があるのか?
883デフォルトの名無しさん:2009/06/05(金) 19:09:01
>>882
あんまりない

自分のプログラムを呼び出す側にリターンコードが必要な環境の場合は有効
884デフォルトの名無しさん:2009/06/05(金) 19:11:02
>>882
大抵の場合、省略可能。
885デフォルトの名無しさん:2009/06/05(金) 19:11:40
そんなあいまいな
886デフォルトの名無しさん:2009/06/05(金) 19:12:19
初心者です。

以下の2つのテーブルがあるんですが、

 int D_TBL00[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
 int D_TBL10[] = {10,11,12,13,14,15,16,17,18,19};
 int D_TBL20[] = {20,21,22,23,24,25,26,27,28,29};

 int *D_TBL_ADR[] = {
 D_TBL00,
 D_TBL10,
 D_TBL20,
};

D_TBL_ADRからいずれかのテーブルアドレス参照し、D_TBL??からデータを取得するプログラムを教えてください。

では、よろしくお願いします。


887デフォルトの名無しさん:2009/06/05(金) 19:13:38
>>885
実際そうだしw
呼び出し元が特にリターンコードを見ないなら
return 0;でOK

必要ならそれなりのコードを返せばいいだけ。
888デフォルトの名無しさん:2009/06/05(金) 19:14:13
>>886
宿題スレオススメ
889デフォルトの名無しさん:2009/06/05(金) 20:18:51
>>886
#include <stdio.h>
#include <string.h>

void main(void){

static int D_TBL00[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
static int D_TBL10[] = {10,11,12,13,14,15,16,17,18,19};
static int D_TBL20[] = {20,21,22,23,24,25,26,27,28,29};

int *D_TBL_ADR[3] = {
D_TBL00,
D_TBL10,
D_TBL20
};

int x,y;

printf("x=");
scanf("%d",&x);
printf("y=");
scanf("%d",&y);
printf("DATA=%d\n",*(D_TBL_ADR[(y-1)]+(x-1)));
}
890889:2009/06/05(金) 20:23:06
int *D_TBL_ADR[3] = { の前に static を付けないとコンパイルが通りませんでした(LSI-C86)

int *D_TBL_ADR[3] = { は
int *D_TBL_ADR[] = {  ですね
すいません
891デフォルトの名無しさん:2009/06/05(金) 20:40:16
>>890
そんな過去の遺物でコンパイルなんかしないでください。
892デフォルトの名無しさん:2009/06/05(金) 20:42:38
コンパイラがどうとかいう問題じゃないけどな
893デフォルトの名無しさん:2009/06/05(金) 20:47:15
>>882
コマンドインタプリタに積極的に値を返すこともある。
例えば、Unixなどのgrepコマンドは対象が見つかったときは0を返し、見つからなければ1を返し、異常があれば2を返す。
また、trueコマンドは常に0を返し、falseコマンドは常に1を返す。
894デフォルトの名無しさん:2009/06/05(金) 21:36:00
じゃ、ANSIでは、main が intで、voidじゃないのは、そういうわけ?
895デフォルトの名無しさん:2009/06/05(金) 22:03:59
>>894
main() の呼び出し元がそういう風になっているからでは?
896デフォルトの名無しさん:2009/06/05(金) 22:16:06
>>894
もともと、C言語は関数のデフォルト型がintだった。
その名残でもある。
897デフォルトの名無しさん:2009/06/06(土) 00:56:12
たとえば、myint をある型(例えば int )として扱いとき、
#define myint int

typedef int myint;
のどちらでも可能ですが、どっちだとどんなときに都合がいい、困るっていうことがありますか?

898デフォルトの名無しさん:2009/06/06(土) 01:07:11
typedefはスコープを持つ

#はポインタ型の別名に使うとひどいことになる


899デフォルトの名無しさん:2009/06/06(土) 01:14:01
そうでなくともtypedefのほうが意図が明確だな。
#defineを使わないですむならそれに越したことはない。
900デフォルトの名無しさん:2009/06/06(土) 01:59:38
// A.java
#define LONG_INT java.math.BigDecimal
#define STR java.lang.String
#define PRINTF System.out.printf
class A {
 public static void main(STR[] args) {
  LONG_INT a = new LONG_INT("10");
  LONG_INT b = new LONG_INT("10");
  PRINTF("%s %s", a, b);
 }
}

みたいな
901デフォルトの名無しさん:2009/06/06(土) 02:53:36
typedefの方が常に優れてるのでそっち使いなさい
902デフォルトの名無しさん:2009/06/06(土) 04:03:11
>>897
圧倒的にtypedefです。
903デフォルトの名無しさん:2009/06/06(土) 12:14:07
freadとfwriteって使い道あるんですか?
fscanfとfprintfの方がわかりやすいんですがね。
904デフォルトの名無しさん:2009/06/06(土) 12:27:21
>>903
fread/fwriteの使い道
mp3のエンコード、デコードや構造体の読み書きなど

テキストデータを読み書きするときはfgetsで読むかな
905デフォルトの名無しさん:2009/06/06(土) 13:31:43
for文だけど、実数型変数でカウンタ変数作っても、問題ないのですか
動作保証ないですか
906デフォルトの名無しさん:2009/06/06(土) 13:33:41
>>905
ほとんど問題はないが、うるさいことをいえば避けておいたほうがいいですね。
907デフォルトの名無しさん:2009/06/06(土) 13:53:34
>903
テキストじゃなくてバイナリでデータを読み書きする時。
908デフォルトの名無しさん:2009/06/06(土) 14:16:21
超抽象的な質問で申し訳ないのですが

配列、関数の扱いまでなんとか理解して、次はポインタについて習得しようと考えています
ただ、全然その、C言語を使えばゲームやらアプリやらで使われているいろんなことができちゃうぜ〜って実感が沸いてこないのですが、そういうレベルに至るまであとどれくらいなんでしょうか
「いろんなものが作れるぜ」ってのを100とすると今の自分はどのあたりなのかなあと
909デフォルトの名無しさん:2009/06/06(土) 14:27:04
>>908
2とか3とかそのくらいじゃね?

どの言語にしてもアプリ開発とかはライブラリ群やAPI使ってなんぼなので
APIやら開発環境使いこなせるようになれば+20とかって感じじゃないかと

http://dixq.net/ ここだってとりあえずDXライブラリ使えって言ってるだろ?
いまやってる基礎を習得した上でライブラリを覚えれば「いろんなものが作れるぜ」
910デフォルトの名無しさん:2009/06/06(土) 14:27:12
ソースから出現する機械語の想像がつきポインタがただの整数に見えたころが第一段階、普段の意識から無くなって無意識のうちに使い始めたら第二段階
どうでもよくなって別の言語に移行したら第三段階
911デフォルトの名無しさん:2009/06/06(土) 15:15:16
>>908
ポインタをまだしらないなら2じゃないかな。
たぶん俺たちですら100ではないわけだし。

C/C++の深遠さはヤバイ
912デフォルトの名無しさん:2009/06/06(土) 15:21:33
>>910
俺C言語がやになってC++に移行したら
めっちゃ気に入ってハマった人間なんだけど。

・・・それでも時折別の高級言語もやってみたくなる。
913デフォルトの名無しさん:2009/06/06(土) 15:44:35
言語を覚えてもアプリは作れないよ。
必要なのはライブラリやAPI。その背後にあるプロトコル。
そこさえおさえておけば、言語を何かに絞る意味はない。
選択肢が広がり、C言語なんか見向きもしなくなる(過言)。

914デフォルトの名無しさん:2009/06/06(土) 15:56:10
Javaはグラフィック表示機能までを含めて言語仕様の中に入っているけど
CやC++にはないから、ハードやOS、開発環境ごとに異なるグラフィックライブラリを
それぞれ習得していかないとゲームを作るところには到達できない。

ウルトラ遠回り^^
915デフォルトの名無しさん:2009/06/06(土) 15:58:06
開発環境ごとにあわせられないヤツなんて使えないだろw
916デフォルトの名無しさん:2009/06/06(土) 16:01:04
プロならね。
917デフォルトの名無しさん:2009/06/06(土) 16:10:36
プロじゃないなら自分の環境だけで、他の環境なんて気にする必要はないと思うが。
918デフォルトの名無しさん:2009/06/06(土) 16:20:56
そうだね。別にCやC++がだめといってるわけじゃない。
遠回りだといってるだけ。

実際、VBとかの方が簡単でしょ。
素人にはオールインワンの方が簡単って意見にも反対?
それなら、しょうがない。^^
919デフォルトの名無しさん:2009/06/06(土) 16:24:25
プログラミングの知識だけじゃ、ダメちゃう
適用分野の知識が必要
2,3かも知れんが、あるところから急激に自信が付くもの
920デフォルトの名無しさん:2009/06/06(土) 16:29:35
>>914
OpenGL使っとけ。
921デフォルトの名無しさん:2009/06/06(土) 16:31:29
ゲームならC++が作りやすいよ!っていわれたから勉強してるけどいつもほんとかよって思う
922デフォルトの名無しさん:2009/06/06(土) 16:32:54
なんつーか、どこまで行ったら「プログラムが組める」って言えるんだろうかなあ
923デフォルトの名無しさん:2009/06/06(土) 16:33:59
>>921
どの言語も一長一短あってこれがベストなんていえないけどな。
むしろ環境に依存する部分の初期化とかいったお作法の方が面倒
924デフォルトの名無しさん:2009/06/06(土) 16:35:25
>>922
言語は所詮道具だしな。
道具を使ってどれくらいの規模のソフトを作ったかによるんじゃない?
925デフォルトの名無しさん:2009/06/06(土) 16:36:06
規模と内容か
926デフォルトの名無しさん:2009/06/06(土) 16:49:49
これからゲームを作るという癖をつけたいのならDXライブラリとかでもいいんじゃね?
あれならかなり楽だし

ゲームってどんなことをしてるかというのを掴まないと厳しいしね。
927デフォルトの名無しさん:2009/06/06(土) 16:56:16
>>922
自分が何を分かってて、何が分かって無いのかがわかるようになったとき。
928デフォルトの名無しさん:2009/06/06(土) 17:00:15
何も分かってないことが分かってる初心者はプログラムを組めるのかw
929デフォルトの名無しさん:2009/06/06(土) 17:02:53
>>928
何も分かってないことは分かってても、何を分かってないかは理解してないだろw
930デフォルトの名無しさん:2009/06/06(土) 17:03:29
あんたったら研究者ね!
931デフォルトの名無しさん:2009/06/06(土) 17:03:47
とりあえずの目標はFC時代くらいのRPGやSTGを作れないとな。
最近のハードをフルに活かすとなるとグラフィックの比重がめちゃくちゃ高いので
素人は大変。プロでさえ人数と金と時間かけてようやく出来る状態なんだし
932デフォルトの名無しさん:2009/06/06(土) 17:07:42
ゲームプログラムなんてグラフィック以外でFCからなんか進歩したの?
933デフォルトの名無しさん:2009/06/06(土) 17:09:35
>>932
してないな
音楽も音源に音符データ渡す方式からPCM録音してそれを鳴らす方式になって
どこにでもある音楽になって特徴なくなったし。

まあ、3D計算が高速になって多少幅は広がったよね。
934デフォルトの名無しさん:2009/06/06(土) 17:20:17
>>932
NPCにAI入るようになってるし、ネットワーク対応するようになったし、
音楽も単に流すだけじゃなくてシーンに合わせてスムーズに変化するようになってるし、
物理演算やモーションキャプチャの利用とか(これらはグラフィック面の強化という意味もあるけど)
詳しく観察したらいろんな事が行われてるよ。
935デフォルトの名無しさん:2009/06/06(土) 17:37:17
そろそろゲーム性とか
ぼくのかんがえるさいきょうのげーむ
とか出てきそうな気配
936デフォルトの名無しさん:2009/06/06(土) 17:48:12
ファイルを書き込みするとき
たとえば
abcと書き込むと

ファイルに
abc
と書き込まれます。

そのあとにdefと書き込むと
abc
def
となります
これを
def
abcと新しく先頭に書き込みたいんですがどうやればいいんですかね?
937デフォルトの名無しさん:2009/06/06(土) 17:51:55
別ファイルに書いてもとのファイルを消す。
又はそれようのファイルシステムライブラリーを作る
938デフォルトの名無しさん:2009/06/06(土) 18:00:09
>>936
本当にそういうことしないとどうしようもないのか
というところから検討した方がいいかもしれないが。

1. abcとかかれたファイルを別の名前に変更
2. 目的のファイルにdefと書き込む
3. 1.で別の名前に変更したファイルを開く
4. 3.のファイルからデータを読み出して、目的のファイルに追加書き
(もっと楽にやりたかったら、mmap系で)
939デフォルトの名無しさん:2009/06/06(土) 18:01:48
ファイル内のデータを直接移動することは出来ない。
必ずいったんメモリに読み込んでからの書き直しになる。
940デフォルトの名無しさん:2009/06/06(土) 18:01:59
>>938
perlでできたきがするんですがね。
たしかfseekを使ってアンケートの書き込みを昇順にするみたいな
あれをCでやりたいわけですが。
941デフォルトの名無しさん:2009/06/06(土) 18:04:18
>>940
perlでできていても
それは中で泥臭いことやってるのを,蓋をしてきれいに見せているのしか見ていないからだとおもう
942デフォルトの名無しさん:2009/06/06(土) 18:08:14
fseekっていうのはファイルの先頭などとうたっているので
fseek(fp,0,SEEK_SET)で
ファイルの先頭
abc
def
abcの場所に来て
defが先頭へ書き込めるかと思ったら全然違いましたね。
943デフォルトの名無しさん:2009/06/06(土) 18:08:17
よく分からんが、あらかじめ昇順にしてから書き込んだらいけないのか?
944デフォルトの名無しさん:2009/06/06(土) 18:12:47
fseekを使った上書きなら出来る。
abcとdef のように長さが同じなら、

abc
def

abcをいったんメモリに読み込み、
abcをdef で上書き。

def
def

そして、abcで上書き

def
abc

ただし、あくまでも上書きなので、同じ文字数のときにしか使えない。
945デフォルトの名無しさん:2009/06/06(土) 18:17:06
同じ文字数でなくても、隣り合っているならば入れ替え可能か。
応用すれば、バブルソートのようなやり方で離れた位置の文字列同士の交換も可能だろう。
ただし、一旦ファイルをメモリに読み込んで、新たにファイルを作り直すほうが単純かつ確実。
速度的にもそのほうが有利だろうな。
946デフォルトの名無しさん:2009/06/06(土) 18:18:58
結局メモリ上での操作とほとんど変わらん

開いた直後 先頭指してる・末端指してる
末端以降の追記は、そのぶんだけファイルサイズが増える

ってだけで、途中からの書き込みは挿入操作ではなく上書き操作だし
947デフォルトの名無しさん:2009/06/06(土) 18:19:35
>>945
> バブルソートのようなやり方
なんか↑って
> 一旦ファイルをメモリに読み込んで、新たにファイルを作り直す
ってのを具体的に書いただけじゃまいか
948デフォルトの名無しさん:2009/06/06(土) 18:23:08
掲示板みたいな感じで新規に書き込んだものを先頭に表示させたかったんですが。
もう1個ファイル作るみたいですね。
むずかしそうですが頑張ってみます。
949デフォルトの名無しさん:2009/06/06(土) 18:23:24
>>947
いや、全部読み込むのではなく、単語単位で読み出し書き込みを繰り返すって意味。
瞬間的には、高々2単語分しかメモリにない状態。
質問者はそういうのをイメージしているだろうと思って。

もちろんキャッシュがあるから、意図したとおりにはなっていないだろうけど。
950デフォルトの名無しさん:2009/06/06(土) 18:29:51
>>948
>掲示板みたいな感じで新規に書き込んだものを先頭に表示させたかったんですが
入力データーを保持するという意味では
ファイルの書き出し順は入力が新しいほど後のほうが都合良い
# 追加は末尾に書くだけ (a+ で開いてそのまま書き出しで済むしな

表示というのは、あくまでデータを可視化する作業だから、分けて考えたほうが良いと思うよ
951デフォルトの名無しさん:2009/06/06(土) 18:31:54
いまどきのPCなら数メガ、数十メガ程度のファイルは全てオンメモリで処理できる。
下手なこと考えずに、ファイル全部読み込んで処理しとくが吉。
952デフォルトの名無しさん:2009/06/06(土) 18:35:38
>>948>>950が妥当
むしろ何かしらデータベース鯖でも立てれば一瞬で終わる
953デフォルトの名無しさん:2009/06/06(土) 18:37:38
データと表示を分離するという発想は
初心者には難しいのかもしれない。
昔、○×ゲームを作るという課題で、
プレイヤーが打ち込んだ○(または×)を
「どうやったら画面から読み取れるのか」
と必至に考えている人がいた。

興奮した。
954デフォルトの名無しさん:2009/06/06(土) 20:32:36
#!/bin/bash
echo $1 > temp_text_file
cat text_file >> temp_text_file
mv temp_text_file text_file

./test.sh aaa
./test.sh bbb

cat text_file
bbb
aaa
955デフォルトの名無しさん:2009/06/06(土) 20:40:39
なぜbash限定・・・
956デフォルトの名無しさん:2009/06/06(土) 21:02:38
int main()
{
  system("./test.sh aaa");
  system("./test.sh bbb");

  return 0;
}
957デフォルトの名無しさん:2009/06/06(土) 21:57:25
>>905
ちゃんと分かって、あえて使うならOK。
ただし、バグの原因になることが多いから、
セキュリティ的にも避けるべきということになってる。
958デフォルトの名無しさん:2009/06/06(土) 23:11:49 BE:113605834-DIA(278040)
ちょっと早いかもしれませんが次スレ立てました
C言語なら俺に聞け(入門篇) Part 49
http://pc12.2ch.net/test/read.cgi/tech/1244297476/
959デフォルトの名無しさん:2009/06/07(日) 10:33:51
バイナリモードでファイルIOするときにEOFとただの-1ってどうやって見分けるんですか?
960デフォルトの名無しさん:2009/06/07(日) 10:59:07
fgetcとかは、ただの-1は(unsigned charとして読み込まれるので)255として取得される。
961デフォルトの名無しさん:2009/06/07(日) 11:12:32
任意のenumを受け取る関数の引数の型は何にするべきかな?
enum NUM1 { A, B, C }; enum NUM2 { D, E, F }; 〜 enum NUMX { X, Y, Z}; 〜
void func(??? e) {
  switch(e) {
    case 0: 〜; break;
    case 1: 〜; break;
    case 2: 〜; break;
    default: 〜; break;
  }
}
暗黙のキャストが安全なのかどうかわからんです
962デフォルトの名無しさん:2009/06/07(日) 11:12:45
>>959
fgetc() の戻り値は int でとります。
963デフォルトの名無しさん:2009/06/07(日) 11:14:25
>>961
enum をわけてしまったのでは不可能
あえてするとすれば、 enum NUM1{ A=0, B=1, C=2}, enum NUM
964デフォルトの名無しさん:2009/06/07(日) 11:41:26
>>961
int

enumって実質intだから、intで受けてかまわない。
965デフォルトの名無しさん:2009/06/07(日) 13:34:24
ファイル分割について質問。
構造体をとあるヘッダーで宣言して、実体を別のヘッダーで宣言した場合(勿論構造体宣言はインクルードしてある)

subと言うソースファイル内で実体のヘッダーを読み込んで、関数内で使った場合
mainのソースファイルで実体を読み込めない。


mainの方にも実体を宣言したヘッダーを置くと二重定義になるし
subの方を消すと、今度はsub内で構造体にアクセス出来なくなる。

externを使ってもエラーが出た。

説明ヘタで申し訳無いけど、どうすればいいの?
966デフォルトの名無しさん:2009/06/07(日) 13:54:52
そういうのは、日常語の掲示板で日常語を媒体として教わるな。
処理系付属のヘッダファイルとか、オプソなコードのヘッダとか
眺めてたら色々と工夫してあるのでそれを盗め。
967デフォルトの名無しさん:2009/06/07(日) 14:02:43
実体をヘッダで宣言するな。
968デフォルトの名無しさん:2009/06/07(日) 14:04:43
実態をヘッダーからsubと言うソースファイルに移してextern
969デフォルトの名無しさん:2009/06/07(日) 14:12:31
#ifdef HOGE_PUBLIC
#define HOGE
#else
#define HOGE extern
#endif

HOGE int hoge;

とヘッダにしておいて(便宜上ヘッダ名はhogehoge.hとする)

hogeの実体を置きたいソースに

#define HOGE_PUBLIC
#include "hogehoge.h"

hogeの実体を置かないソースには

#include "hogehoge.h"

970デフォルトの名無しさん:2009/06/07(日) 14:51:54
お、通った通った。

>>966-969
サンクス、助かった
971デフォルトの名無しさん:2009/06/07(日) 14:55:53
>>970
>>969が何をやってるか理解できてないなら使わない方がいいよ。

あと個人で作るプロジェクトならいいけど、仕事でするなら探りを入れた方がいいかも
972デフォルトの名無しさん:2009/06/07(日) 15:00:12
ヘッダーは宣言のみ つまり extern 付き
ソースのどこか1箇所でextern 無しの実体定義を行う
973デフォルトの名無しさん:2009/06/07(日) 15:20:51
>>971
2人ぐらいで同人ゲーム作る為に、基盤となるソースとヘッダー作ってたんだぜ。
ifdefとか便利だって聞くからちょっと勉強しとくよ。

>>972
それで完璧だった。
どのソース内でも関数内でも構造体のメンバが呼び出せるようになった。
974デフォルトの名無しさん:2009/06/07(日) 15:25:28
const int TEISU = 100;

とかの実体もヘッダに書かない方がいいの?
975デフォルトの名無しさん:2009/06/07(日) 15:28:34
static ってつければOK
976デフォルトの名無しさん:2009/06/07(日) 15:46:41
>>974
なぜstaticって付ければ良いかは
staticキーワードでローカル(プライベート)にする - C言語とC++入門勉強ルーム
ttp://www.mapee.jp/cpp/static_2.html
ここでファイルスコープを学べばわかるかと。
977デフォルトの名無しさん:2009/06/07(日) 15:58:02
ヘッダファイルの使い回し?
出来ればやめたほうが良い。公開用ヘッダ領域には置かないほうが良い。
しかし現実にはやらざるを得ない。
大抵、ライブラリコンパイル用のヘッダは公開用ヘッダと同じ名前だが
includeディレクトリの奥深くに「隠されるのが」普通。
公開用ヘッダも最初はその大部分を参照するが、やがて独立していき
最終的にはライブラリコンパイル用のヘッダは公開ヘッダ領域からは
除かれるというのがセントラルドグマ。
978:2009/06/07(日) 17:18:53
教えて下さい。
@ある処理がA関数コール200文字データを引数で渡す
AA関数実体で200文字処理し、Bタスクへ100文字ずつメッセージ送信。
BBタスクは100文字受取、100文字を保持し、残りの100文字が来たら200文字データに成形する。
C200文字データをパイプでexeに流す。

という処理を作成しています。
Bの100文字データを保持するという処理がどうすればよいかわかりません。
というのも次の100文字データが来る前に、前の100文字データ消えてしますようなきがして。
よろしくお願いします。
979デフォルトの名無しさん:2009/06/07(日) 17:22:05
>>978
> A関数コール200文字データ
なにいってんの?
980デフォルトの名無しさん:2009/06/07(日) 17:24:29
構造体だけが記述してあるヘッダーから
error C2143: 構文エラー : ';' が '<クラスヘッド>' の前にありません。
ってエラーが出る…。

構造体の書式は間違ってないんだけど、この場合何処でエラーになってるの?
981デフォルトの名無しさん:2009/06/07(日) 17:26:23
};
ととじてないとか
982デフォルトの名無しさん:2009/06/07(日) 17:26:36
>>980
あ、自己解決。
関数のプロトタイプ宣言に「;」が無かっただけだった
983デフォルトの名無しさん:2009/06/07(日) 17:28:58
>>978
int datacount;
char data[200];

でいいんじゃないかな。
datacountが0ならdataは空。100なら100文字分保持。200なら200文字分保持。
datacountが100のときに次の100文字が来れば、dataの100番目から格納して
datacountを200にしデータ成形しCを実行。
Cが終了したらdatacountを0に戻す。
984978:2009/06/07(日) 18:32:07
>>983
ありがとうございます。
これって、順番を守って1回目のデータ、二回目のデータを受け取れるでしょうか?
例えば、初めにデータを送ったタスクより、高いプライオリティのタスクがデータを送って
途中データが書き換えられるようなことはないでしょうか?
985デフォルトの名無しさん:2009/06/07(日) 18:32:58
話に出てくる単語が抽象的に成っているぞい
986デフォルトの名無しさん:2009/06/07(日) 18:37:38
>>984
プロセス構成がわからないからなんともいえない。
プロセス構成はこれでOk?

プロセスA(A関数を含む)
プロセスB(Bタスク)
プロセスC(プロセスBよりpipeでデータを受け取るexe)
987デフォルトの名無しさん:2009/06/07(日) 18:43:59
パイプで考えれば
Aは100区切りをBの都合お構いなしで垂れ流す。
OSが垂れ流されたデータを一時保管
Bは次の100くれとOSに頼む。

Bのなかで前の100が消えるとか知ったこっちゃねぇ
988978:2009/06/07(日) 18:53:22
すいません。
>>984
問題ないです。
なにをしようかというと、自作printfを作成していて、あちこちから
自作printfは呼ばれるのでデータの保障について考えています。

989デフォルトの名無しさん:2009/06/07(日) 18:59:23
うわお前か
990sage:2009/06/07(日) 21:02:38
タスクとかC言語の範囲じゃないけど、
多分呼び出し元で確保した領域(文字列など)であれば呼び元が異なっても
干渉することはないと思う。
タスクの構造体見るとスタックの領域があるよね?printf()が呼ばれたときの
引数の領域もこのスタックの領域を使用して作成され、それぞれのタスクで別々
の保存場所になっている。

なので関数の中でstaticみたいなのを使って状態保存
(例:関数が何回呼ばれたかなどの情報を関数内のstatic変数で
カウントしてるなど)しているようなのを使っているとタスク間で干渉する。

ちょっと質問の意図を勘違いしてるかもしれないけど。


991デフォルトの名無しさん:2009/06/07(日) 22:05:16
どうして多次元配列は多次元配列にも関わらず,一重の[]で初期化できるのでしょうか?
992991:2009/06/07(日) 22:06:02
[]ではなく{}でした
993デフォルトの名無しさん:2009/06/07(日) 22:30:58
仕様
994991:2009/06/07(日) 22:42:04
やっぱり仕様ですよね、こんなの。
これ聞く教授陣もアホですよ。
995デフォルトの名無しさん:2009/06/07(日) 22:47:44
>>994
多次元配列なんてCの便宜上の話であってたとえば

内部的には連続したメモリだし
996デフォルトの名無しさん:2009/06/07(日) 22:48:25
>たとえば
はゴミです。消し忘れ
997デフォルトの名無しさん:2009/06/07(日) 23:30:45
うめ
998デフォルトの名無しさん:2009/06/07(日) 23:31:39
うめ
999デフォルトの名無しさん:2009/06/07(日) 23:41:42
999 !!!!!!!!!!!!!!!!!!!!!!!!!
1000デフォルトの名無しさん:2009/06/07(日) 23:41:46
うめ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。