C言語なら俺に聞け(入門篇) Part 48
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/05/12(火) 21:04:52初心者、初級者の方は他の質問スレのほうが良いかもしれません。
教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
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
0002デフォルトの名無しさん
2009/05/12(火) 21:41:280003デフォルトの名無しさん
2009/05/12(火) 21:57:29VCとか使えるようになるの?
0004デフォルトの名無しさん
2009/05/12(火) 22:03:00VCを使うっていうのが、Windowsアプリを作るってことなら、使えるようにはならない。
0005デフォルトの名無しさん
2009/05/12(火) 22:03:560006デフォルトの名無しさん
2009/05/12(火) 22:04:160007デフォルトの名無しさん
2009/05/12(火) 22:20:39Windowsアプリを作るなら、
VBのほうがカンタン?
0008デフォルトの名無しさん
2009/05/12(火) 22:39:51VB.NETもC#も大差ないと思う。Cは難しい。マネージドのC++方面はよく知らない。
(VB6は論外として)
0009デフォルトの名無しさん
2009/05/12(火) 22:48:460010デフォルトの名無しさん
2009/05/12(火) 23:34:59int 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]にアクセス
できませんでした。配列に同じ要素がいくつもある時に、配列の要素が
降順である順番で、配列にアクセスする方法ってどうやるのでしょうか?
0011デフォルトの名無しさん
2009/05/12(火) 23:41:42その方法では無理
ポインタ使え
0012デフォルトの名無しさん
2009/05/12(火) 23:45:05ゲーム製作で良く使うって言われるけど、ドットとかの連番ファイルの読み込みぐらいでしか使わないよな?
0013デフォルトの名無しさん
2009/05/12(火) 23:45:22恐らく文字との違いも分かって無いだろう
0014デフォルトの名無しさん
2009/05/12(火) 23:45:33http://pc12.2ch.net/test/read.cgi/tech/1238087817/564,569,570
0015デフォルトの名無しさん
2009/05/12(火) 23:47:35001610
2009/05/13(水) 00:30:32int *a;
a = malloc(sizeof(int)*N);
と、いうように動的に配列を作れって意味でしょうか?
たぶん違うのでしょうが。もうちょっとヒント頂けると嬉しいです。
0017デフォルトの名無しさん
2009/05/13(水) 00:42:34いやはいれつのそれぞれの要素を指すポインタ配列を作って
それを通して間接的に操作すべきという事
0018デフォルトの名無しさん
2009/05/13(水) 00:50:18for(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}にはなる。
0019デフォルトの名無しさん
2009/05/13(水) 01:06:20int 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;
}
002019
2009/05/13(水) 01:21:09どんな風にプログラム書いても動作が変
0021デフォルトの名無しさん
2009/05/13(水) 01:28:34同じ数字があった場合結局>>10の問題は解消されないってのはおいといても、
ソート済みのものと比較してどうすんだよw
0022デフォルトの名無しさん
2009/05/13(水) 01:35:01教えてください
doubleの初期化で0xFFFFFFFFFFFFFFFFをセットする方法を教えてください
よろしくです
0023デフォルトの名無しさん
2009/05/13(水) 01:35:45意味がわかりません
0024デフォルトの名無しさん
2009/05/13(水) 01:37:30union u {
double d;
char c[8];
};
union u a;
int i;
for(i=0;i<8;i++) c[i]= 0xff;
0025デフォルトの名無しさん
2009/05/13(水) 01:38:38それかmemset(&d, 0xff, sizeof(d));
0026デフォルトの名無しさん
2009/05/13(水) 01:41:420027デフォルトの名無しさん
2009/05/13(水) 01:42:510028デフォルトの名無しさん
2009/05/13(水) 01:44:12doubleだとちゃんとした数字になるのか?
0029デフォルトの名無しさん
2009/05/13(水) 01:55:10一時ファイルでも作業領域に使えば楽じゃん
マージソートを使えばできる
0030デフォルトの名無しさん
2009/05/13(水) 01:55:32素早い回答ありがとうございます
さっそく試して、できることが分かりました
0031デフォルトの名無しさん
2009/05/13(水) 01:56:060032デフォルトの名無しさん
2009/05/13(水) 01:56:50ならないけど、ビット処理の都合必要でして・・・
003310
2009/05/13(水) 02:09:21ヒントありがとうございました。
0034デフォルトの名無しさん
2009/05/13(水) 08:06:10どうせ可搬性のある方法は存在しないから、double*を64bit整数へのポインタにキャストするなり、
共用体つかうなり、好きにすればいいよ。
0035デフォルトの名無しさん
2009/05/13(水) 10:28:480xffで埋めるなら。
0036デフォルトの名無しさん
2009/05/13(水) 10:30:46>>25
0037デフォルトの名無しさん
2009/05/13(水) 14:08:200038デフォルトの名無しさん
2009/05/13(水) 14:15:04bの型は(char const *const)ですか?
0039デフォルトの名無しさん
2009/05/13(水) 14:15:55不安ならわけて書け
0040デフォルトの名無しさん
2009/05/13(水) 14:19:06僕が書いた訳じゃないんです
0041デフォルトの名無しさん
2009/05/13(水) 15:08:21Yes.
ってか確認するコード書いてコンパイルしろよ。
0042デフォルトの名無しさん
2009/05/13(水) 16:12:12double 型の値にビット処理を施す ってのも奇妙ではあるね。
浮動小数点フォーマットを決め打ちして NAN 立てたいとか そういう用途なのかな?
0043デフォルトの名無しさん
2009/05/13(水) 16:17:36処理内容は絶対値の取得です
正確な内容はSSEを使用して計算途中に発生する負の値を正の値に読み替えるというものなんですよ
ですから本当は0xffffffffffffffffではなく0x7fffffffffffffffでこれと数値とでandをとって正の値を取得するというものです
もっと良い方法ありましたかね?
(SSEにfabsは無いと思います)
0044デフォルトの名無しさん
2009/05/13(水) 16:17:570045デフォルトの名無しさん
2009/05/13(水) 16:41:46それって C言語で記述するより インラインアセンブラで記述したい要求じゃないかい?
SSEを使用して計算の記述は インラインアセンブラっしょ?
SSE なら どーせ packed 演算だし 各pack に 0x7fff* 突っ込んで ANDPS する
アセンブルコードを挟めば良いんじゃyないの?
0046デフォルトの名無しさん
2009/05/13(水) 17:11:11それでもいいんだけどアセンブラは苦手なもんで
intrinsicで記述してます
そろそろアセンブラも始めるかな・・・
0047デフォルトの名無しさん
2009/05/13(水) 23:09:41できるに越した事は無いけど
0048デフォルトの名無しさん
2009/05/14(木) 02:00:540049デフォルトの名無しさん
2009/05/14(木) 02:02:59廃れるわけがない
0050デフォルトの名無しさん
2009/05/14(木) 02:03:16組み込みがアホみたいに性能あがったけど省電力になればいらないだろうけど
0051デフォルトの名無しさん
2009/05/14(木) 02:22:330052デフォルトの名無しさん
2009/05/14(木) 03:39:470053デフォルトの名無しさん
2009/05/14(木) 04:20:15大してねーよ
数限りなく挙げてみろよ
0054デフォルトの名無しさん
2009/05/14(木) 04:58:56難読性を要求するプロテクトプログラムや
厳しいリアルタイム性を要求される計測装置など
コンパイラはこのような場面を全く保証していない
0055デフォルトの名無しさん
2009/05/14(木) 05:23:58#define B (0.5 * A)
#define C (20 * B)
と定義したCをソース内部で使う際どうも計算誤差(小数点以下切捨て?)
が起きている感じなんですが回避する方法はあるんでしょうか?
Cを受け取る変数はfloatのエリアです。
0056デフォルトの名無しさん
2009/05/14(木) 05:31:460.1が二進数では無限小数になってるので、表現しきれず途中で打ち切りになってる
0.0999999999・・・
みたいな値になってる、当然これを掛け算に使うと・・・・
1, 5 にして最後に100で割るような整数計算に置き換えるしかない
0057デフォルトの名無しさん
2009/05/14(木) 05:59:06誤差が許されないなら浮動少数使うなってこと
数値計算ライブラリ使え
005855
2009/05/14(木) 06:03:18処理的には小数点以下3桁程度あればいいのですが、どうも小数点以下がまったく存在しない状態なんです。
つまりintにでもキャストしたような感じでして・・・
0059デフォルトの名無しさん
2009/05/14(木) 06:13:33それはその#define文だけではありえない
再現できるソースを出さない限り誰にもわからない
0060デフォルトの名無しさん
2009/05/14(木) 06:18:320061デフォルトの名無しさん
2009/05/14(木) 06:34:370062デフォルトの名無しさん
2009/05/14(木) 06:58:41A、Bがintだってオチなんだろ。
0063デフォルトの名無しさん
2009/05/14(木) 07:15:36バカ発見
0064デフォルトの名無しさん
2009/05/14(木) 07:45:50こうすれば?
#define A (0.1f)
#define B (0.5f * A)
#define C (20.0f * B)
で、Cはfloatだから表示するならprintfの中は"%.3f"。
0065デフォルトの名無しさん
2009/05/14(木) 07:55:130066デフォルトの名無しさん
2009/05/14(木) 08:06:410067デフォルトの名無しさん
2009/05/14(木) 08:20:59組込み用途のRTOSはC言語で書いてあるぞw
0068デフォルトの名無しさん
2009/05/14(木) 08:32:14それを修正してコンパイル
0069デフォルトの名無しさん
2009/05/14(木) 11:40:56ずいぶん限定的だな
0070デフォルトの名無しさん
2009/05/14(木) 11:47:2420 * 0.5 * 0.1 = 1.0
0071デフォルトの名無しさん
2009/05/14(木) 12:44:01機械語なんかいらんのや
0072デフォルトの名無しさん
2009/05/14(木) 16:02:03文字コードを1シフトさせてa→b c→dのようにするには
どうしたらいいのでしょうか?
0073デフォルトの名無しさん
2009/05/14(木) 16:05:46それぞれ順番にやれば宜しいかと。
それぞれの遣り方が判らないのなら、質問し直して。
考える気もないなら宿題スレへ。
0074デフォルトの名無しさん
2009/05/14(木) 16:13:28いや、それよりもzの場合どうなるのかが知りたくなった。
そうか、bをシフトしないから、zもシフトしないのか。
いやまてまて、それよりgetchar()で受け取ってそれを配列の各要素に入れるようだが、
オーバーランしないようにしておかないといけないではないか。
いやそれより、その配列は基本型または派生型または複合型の複合型なのかはっきりしないとわからない気がしてきた。
0075デフォルトの名無しさん
2009/05/14(木) 16:14:060076デフォルトの名無しさん
2009/05/14(木) 16:15:180077デフォルトの名無しさん
2009/05/14(木) 16:17:120078デフォルトの名無しさん
2009/05/14(木) 16:18:020079デフォルトの名無しさん
2009/05/14(木) 16:20:56コンピューターの世界を舐めちゃいけませんぜ
0080デフォルトの名無しさん
2009/05/14(木) 16:21:410081デフォルトの名無しさん
2009/05/14(木) 16:21:56'm'の次は'n'ではない
0082デフォルトの名無しさん
2009/05/14(木) 16:22:40話を逸らすな
お前は論破されてる
0083デフォルトの名無しさん
2009/05/14(木) 16:24:130084デフォルトの名無しさん
2009/05/14(木) 16:24:360085デフォルトの名無しさん
2009/05/14(木) 16:24:400086デフォルトの名無しさん
2009/05/14(木) 16:24:540087デフォルトの名無しさん
2009/05/14(木) 16:25:380088デフォルトの名無しさん
2009/05/14(木) 16:26:40顔が真っ赤ですよ
とにかくお前みたいな奴には仕事は任せられんな
0089デフォルトの名無しさん
2009/05/14(木) 16:28:110090デフォルトの名無しさん
2009/05/14(木) 16:29:54お前ら一丁前に働いてから物を言え
0091デフォルトの名無しさん
2009/05/14(木) 16:30:13,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::::::::::::::::::/ /:::::::::::/:::::(ヽ--─ / | /
ヽ_=--"⌒ ゙゙̄ヾ:/ /:::::::/:::::::::`<==-- ノ / /
0092デフォルトの名無しさん
2009/05/14(木) 16:30:55b→b で d→d
以下 a→b (b→b ?) c→d (d→d ?) … と類推すれば良いのか?
0093デフォルトの名無しさん
2009/05/14(木) 16:31:440094デフォルトの名無しさん
2009/05/14(木) 16:34:060095デフォルトの名無しさん
2009/05/14(木) 16:34:31まあこの程度の質問するってことは文字コードのこともろくにわかってねーだろうしな
009672
2009/05/14(木) 16:39:12a→b b→cという風に入力をした文字を1つシフトさせて
次にループしたときは2シフト
次が3シフト…というように
シーザー暗号を入力して、元の文字列になるようなものを作りたいんです。
本に沿って勉強していたのですが自分でも何か作ってみたかったので。
頂いたレスを読んでもう少し考えてみます、ありがとうございます。
0097デフォルトの名無しさん
2009/05/14(木) 16:51:480098デフォルトの名無しさん
2009/05/14(木) 16:54:06テキストとみるからそうなるだけでしょ。
暗号をかけるだけなら、zの次のコードになろうがぜんぜん問題ねえし
0099デフォルトの名無しさん
2009/05/14(木) 16:58:35void 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」のときは式の評価結果が「偽」となり、繰返しを
終了します」とあるが、なぜこのコードにこの意味が含まれるのか分かり
ません。
0100デフォルトの名無しさん
2009/05/14(木) 17:00:36C言語が面白くなくなる典型のような例題だな…
0101デフォルトの名無しさん
2009/05/14(木) 17:01:22その書籍のタイトルと著者は?
0102デフォルトの名無しさん
2009/05/14(木) 17:01:27Cは = と == が紛らわしいから
ちなみにその警告は無視して良い
無視してはいけない場合も当然ある
0103デフォルトの名無しさん
2009/05/14(木) 17:03:00うわこれ副作用完了点について理解してない著者が書いてる
今すぐ本を窓から投げ捨てろ
0104デフォルトの名無しさん
2009/05/14(木) 17:04:27という言い回しを問題としてやらせているって感じだな
0105デフォルトの名無しさん
2009/05/14(木) 17:05:34要するに鼻から悪魔だよな
0106デフォルトの名無しさん
2009/05/14(木) 17:05:42a[] = "ABCDE";
この最後に実は\0(文字コードとしては0x00)が必ず置かれます。
でa[]のポインターを0x00がくるまで移動しています。
でその文字コードを真偽判定に使ってるんですが・・・
本は捨てた方がいいです。
これを薦めた人も捨てた方がいいです(可能であれば
0107デフォルトの名無しさん
2009/05/14(木) 17:06:370108デフォルトの名無しさん
2009/05/14(木) 17:06:51putchar((ch-'a'+shift)%26 +'a');
0109デフォルトの名無しさん
2009/05/14(木) 17:06:56void main() じゃなくて int main() なんですが、それはさておき
私のところでは実行結果は BCDE ですね。
環境を教えてください。
0110デフォルトの名無しさん
2009/05/14(木) 17:07:38ワロタw
0111デフォルトの名無しさん
2009/05/14(木) 17:10:48こういう書き方は
http://www.kouno.jp/home/c_faq/c3.html#0
を参照してもらえばわかるが、動作が未定義である。
動作が未定義という意味は、実行の結果どんな事が
起こっても文句は言えないという意味である。
0112デフォルトの名無しさん
2009/05/14(木) 17:11:48「*p++ に p を用いた演算結果を代入してる」 がトラップだよね?
0113デフォルトの名無しさん
2009/05/14(木) 17:14:410114デフォルトの名無しさん
2009/05/14(木) 17:15:41相当古い時期に書かれた本だと思うよ。
最近書かれた物ならマジで著者と本を薦めた人を捨てた方がいい
0115デフォルトの名無しさん
2009/05/14(木) 17:15:41点で適用される事を意味している。
式の評価が全部完了している事を保証する場所を「副作用
完了点」と言い、この場合はセミコロンの直前である。
ところが =代入演算子の両側に同じ変数 p が出現している。
つまり++は左辺を評価した後で適用されるか、右辺を評価した
後で適用されるかは規格では定められていないのである。
こういう場合規格では未定義の動作が起こるとしている。
0116デフォルトの名無しさん
2009/05/14(木) 17:18:53レアな構文だから、構文テクニック大好きな文学少年達が目の色
変えて集まってくる。
こういうトリッキーな構文は怪しげなので避けて通るのが無難。
というようなことをその参考書は書いていたんじゃないのか?
0117デフォルトの名無しさん
2009/05/14(木) 17:19:080118デフォルトの名無しさん
2009/05/14(木) 17:19:58バカ発見
0119デフォルトの名無しさん
2009/05/14(木) 17:20:160120デフォルトの名無しさん
2009/05/14(木) 17:20:20どういう結果になるかは保証できない って脚注にあったりして
でも >>99 の本はマズイよなぁ…
0121デフォルトの名無しさん
2009/05/14(木) 17:21:220122デフォルトの名無しさん
2009/05/14(木) 17:22:070123デフォルトの名無しさん
2009/05/14(木) 17:25:35今すぐC業界から足を洗ってください
お願いします
0124デフォルトの名無しさん
2009/05/14(木) 17:26:300125デフォルトの名無しさん
2009/05/14(木) 17:27:36のように代入式を ( )でくくって代入式を評価してるんだとアピールすれば警告でないよね
0126デフォルトの名無しさん
2009/05/14(木) 17:27:46a[i++] = i;も駄目なの?
0127デフォルトの名無しさん
2009/05/14(木) 17:28:53だめだって
i++とか++iは途中に書くなってことだ
0128デフォルトの名無しさん
2009/05/14(木) 17:28:550129デフォルトの名無しさん
2009/05/14(木) 17:29:20ダメ
そろそろ理解しろ
0130デフォルトの名無しさん
2009/05/14(木) 17:29:54嘘教えるなよ
0131デフォルトの名無しさん
2009/05/14(木) 17:30:35マシン語になったらたいした違いねーだろ
0132デフォルトの名無しさん
2009/05/14(木) 17:31:050133デフォルトの名無しさん
2009/05/14(木) 17:33:31皆さんコメントありがとうございました。
102.さんのコメントを参考に = を == に変えたら
コンパイル、実行結果とも正常になりました。
0134デフォルトの名無しさん
2009/05/14(木) 17:34:19だからそういう問題じゃないって
0135デフォルトの名無しさん
2009/05/14(木) 17:38:18変な本のせいでまた一人間違った知識を身に付けちまったぞ
0136デフォルトの名無しさん
2009/05/14(木) 17:39:39その場合=と==ではやろうとしてることが違う
そもそもwhile()の中でそんな式入れるなってことだ
0137デフォルトの名無しさん
2009/05/14(木) 17:45:35本当にプログラミング向いてないか釣りかのどっちかだろ。
0138デフォルトの名無しさん
2009/05/14(木) 17:54:0999=133.
すみません。
= を == に変更したのですが、実行結果はABCDEでした。
目的通りの結果と思いましたが、プログラムの目的は
文字列の左シフトですから勘違いしてしまいました。
もし133にコメントがありましたら、お手数をかけまして
すみませんでした。
0139デフォルトの名無しさん
2009/05/14(木) 17:56:320140デフォルトの名無しさん
2009/05/14(木) 17:57:11ならん
0142デフォルトの名無しさん
2009/05/14(木) 18:07:34while (*p) { p[0] = p[0]+1; p++; }
ってな感じに書くかな。
特に代入のところで *p = *p+1; とか書いて あれ?って迷うぐらいならシンプルに ということで
0143デフォルトの名無しさん
2009/05/14(木) 18:08:25while文のカッコの中だけで済ませようとするから無理がくる
ポインタ変数を二つ用意するか、文を二つに分けるかのどちらかだな
0144デフォルトの名無しさん
2009/05/14(木) 18:22:09こんな感じでどちらか選べ
#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;
}
0146デフォルトの名無しさん
2009/05/14(木) 18:26:16ポインタの指す中身を指定する*と文字列の*は全く無関係
というか入門書もう一回読みなよ
0148デフォルトの名無しさん
2009/05/14(木) 18:39:31普通はそうする
文を分けると可読性が著しく低下する
0149デフォルトの名無しさん
2009/05/14(木) 18:58:32a[i++] = *p; /* 実は p == &i */
こういうのも悪魔召還?
0150デフォルトの名無しさん
2009/05/14(木) 19:03:46C言語でマイコン研修をやっているのですが、
PICに入れるプログラムの周波数を大きく設定して実行してしまいました。
この場合マイコンやPICは故障したりするのでしょうか?
すれ違いならすみません・・
0151デフォルトの名無しさん
2009/05/14(木) 19:18:10故障したから聞いてるの?
故障しなかったから聞いてるの?
0152デフォルトの名無しさん
2009/05/14(木) 19:20:250153デフォルトの名無しさん
2009/05/14(木) 19:20:43もちろんです
0154デフォルトの名無しさん
2009/05/14(木) 19:25:39故障したかわからないまま終わってしまったので不明です。。
0155デフォルトの名無しさん
2009/05/14(木) 19:41:070156デフォルトの名無しさん
2009/05/14(木) 19:42:21「プログラムの周波数」とは何のことですか?
0157デフォルトの名無しさん
2009/05/14(木) 19:43:570158デフォルトの名無しさん
2009/05/14(木) 19:46:29ようするに安易にオーバークロックやって壊したんでしょ?
新しいの買いなよ
0159デフォルトの名無しさん
2009/05/14(木) 19:51:24言い方悪かったです
プロジェクトを作成するときに動作環境の周波数を決めるんだけどその時に間違ってしまった
という意味です
どうやらそれだけでは壊れないみたいなので解決しました
すれ違い盛大に失礼しますた
0160デフォルトの名無しさん
2009/05/14(木) 20:10:24コンベアとかの関係?
0161デフォルトの名無しさん
2009/05/14(木) 20:26:490162デフォルトの名無しさん
2009/05/14(木) 20:50:17いや、i++ によって p の値が変わるわけではないから、書き手の意志でそう書いたのなら問題ないでしょう。
0163デフォルトの名無しさん
2009/05/14(木) 20:53:42don't mind.
0164デフォルトの名無しさん
2009/05/14(木) 20:58:43pじゃなくて*pの値がどうなるかわかんないでしょ
0165デフォルトの名無しさん
2009/05/14(木) 21:02:120166デフォルトの名無しさん
2009/05/14(木) 21:03:34*p は p = &i を実行したときの値のままですよ。i++ によって p も*p もかわらない。
だから、書き手がそう望んだのならそのとおりに動く、書き手の意図どおりのはず。
0167デフォルトの名無しさん
2009/05/14(木) 21:12:04int 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
0168デフォルトの名無しさん
2009/05/14(木) 21:18:00それは当たり前。
p = &i;
a[i++] = p;
は、インクリメントという副作用がどこで発生するかによって結果がかわる、という問題にはあてはまらないのですけれども。
書き手の意志どおりにうごくので問題ないのでは?
0169デフォルトの名無しさん
2009/05/14(木) 21:18:46まさか>>166の「*pがかわらない」が>>149でのコード中でのことだと理解できなかったとか?
0170デフォルトの名無しさん
2009/05/14(木) 21:20:59>>164
0171デフォルトの名無しさん
2009/05/14(木) 21:21:32だからi++が実行されるのが*pを読み出す前なのか後なのか
わからないと言っているんですけど
0172デフォルトの名無しさん
2009/05/14(木) 21:22:460173デフォルトの名無しさん
2009/05/14(木) 21:23:160174デフォルトの名無しさん
2009/05/14(木) 21:24:25お前Cプログラマに向いてないよ
マジでそのセンスの無さやばいから
0175デフォルトの名無しさん
2009/05/14(木) 21:56:07詳しく教えてください
0176デフォルトの名無しさん
2009/05/14(木) 21:57:47ならば a[i++] = i; も 右辺側の i を参照した後にインクリメントされるの?
これを ポインタ使ったエイリアスで書き換えた形が >>149 なんだよね
0177デフォルトの名無しさん
2009/05/14(木) 22:21:06ベクトル空間の2直線は、そのなす角が小さいほど似ていると考えられる。
たとえば、xy座標で(1,1)を通る直線と、角度46度、44度を通る直線は
ともに角度のずれは1度だけ。
ベクトル空間モデルはこういうずれを計っている。
0178デフォルトの名無しさん
2009/05/14(木) 22:31:23なるほど。やっと理解した。レベル低くしてすまない。
0179デフォルトの名無しさん
2009/05/14(木) 23:10:59iを参照した「後に」pの値を増やす事が保証されているだけで、
iを参照した「直後」に増やす事は保証されていない。
a[i++] = *p; /* p = &i */ の場合は副作用完了点はやはり
セミコロンの直前なので、*pを参照する前にiが増やされるのか
*pを参照した後にiが増やされるのか見ただけでは判断できない。
つまり処理系依存である。ANSI-C(C89)ではもっと厳しく
実行結果は「未定義」、つまり鼻から悪魔が出てくるとしている。
0180デフォルトの名無しさん
2009/05/14(木) 23:57:50C99で定義されてないの?
0181デフォルトの名無しさん
2009/05/15(金) 00:01:270182デフォルトの名無しさん
2009/05/15(金) 00:02:05C99を採用してるコンパイラでなければ意味無いだろ。
つまり使うなってことだよ。
0183デフォルトの名無しさん
2009/05/15(金) 00:05:160184デフォルトの名無しさん
2009/05/15(金) 00:09:100185デフォルトの名無しさん
2009/05/15(金) 00:09:56つ[VS2008]
つ[CodeGear C++]
この二大メーカーがまだC89のままです
0186デフォルトの名無しさん
2009/05/15(金) 00:17:1610年経つのに対応しないって...
結局C++のC部分で十分ってことだよね。
あと窓ではCユーザー少ないから対応しなくても問題なしってことかな
次ではそれらC99対応するん?
0187デフォルトの名無しさん
2009/05/15(金) 00:17:170188デフォルトの名無しさん
2009/05/15(金) 00:19:080189デフォルトの名無しさん
2009/05/15(金) 00:21:44しません
多分永遠にしないでしょう
C++があれば十分だと思っているようですから
0190デフォルトの名無しさん
2009/05/15(金) 00:24:09CPUメーカーの維持なんだろう
intel版がAMD CPUに最適なコードをはいてくれなくてCPUが遅いといわれる可能性もあるだろうし
その逆もしかり
0191デフォルトの名無しさん
2009/05/15(金) 00:48:100192デフォルトの名無しさん
2009/05/15(金) 06:50:010193デフォルトの名無しさん
2009/05/15(金) 12:46:27取得する方法ってありますか?常駐ソフトのような形で、起動してからクリック、ドラッグ
したファイルのパスをテキストログとして、出力するようなものを作りたいのですが・・・。
0194デフォルトの名無しさん
2009/05/15(金) 12:47:52>>1
0195デフォルトの名無しさん
2009/05/15(金) 12:51:290196デフォルトの名無しさん
2009/05/15(金) 16:30:44書き込む前に考えないのだろうか。。。
0197デフォルトの名無しさん
2009/05/16(土) 12:33:21コンソールアプリケーションで作成して 一番下までいくと
次からは違うページになってしまうので 画面を固定したいのですが
毎回CLS(system("cls");) 掛けると 画面がチカチカして 堪らないので
0198デフォルトの名無しさん
2009/05/16(土) 12:39:37エスケープシーケンスとか使うんじゃない。
制御コードは端末依存。
0199デフォルトの名無しさん
2009/05/16(土) 12:58:39ttp://www.kumei.ne.jp/c_lang/intro/no_27.htm
こういう物のことですか?
ここに書かれているエスケープシーケンスでは
CLSすら効かないです。
VC++6.0 では不可なのでしょうか?
0200デフォルトの名無しさん
2009/05/16(土) 13:23:15・プログラムにバグがある(ESCが正しく出力されてない、等)
・ESCシーケンスの効かない端末を使っている(GUIアプリ等)
まあソース晒すのがいいと思う
0201デフォルトの名無しさん
2009/05/16(土) 13:30:05コマンドプロンプトにエスケープシーケンスは効かねーよw
そのページは古い、昔のwindowsではサポートしてたからな
0202デフォルトの名無しさん
2009/05/16(土) 13:35:57http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9180.cpp
ロダにあげました。よろしくお願いします。
汚いソースですが勘弁してください。
場所はメイン関数の中にある
// テスト用 エスケープシーケンス 効かない
の場所です。
0203デフォルトの名無しさん
2009/05/16(土) 14:05:19Win32API質問箱 Build79
http://pc12.2ch.net/test/read.cgi/tech/1240411224/
0204デフォルトの名無しさん
2009/05/16(土) 14:12:10えーと、APIですか?
APIは全く使ってないので関係ないと思うのですが。
0205デフォルトの名無しさん
2009/05/16(土) 14:16:28このへんを参考に
http://kasai86.ld.infoseek.co.jp/dos/esc.htm
0206デフォルトの名無しさん
2009/05/16(土) 14:56:46ありがとうございます。
やってみたのですが出来ませんでした。
0207デフォルトの名無しさん
2009/05/16(土) 15:20:48#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関数で文字列コピーをしたいのですがうまくいきません。。。なぜでしょうか。
コンパイルは通るのですがなぜか偉ーで落ちます。。。
0208デフォルトの名無しさん
2009/05/16(土) 15:25:08もしくはchar **s;
じゃなく char *s;
でやれクズ
0209デフォルトの名無しさん
2009/05/16(土) 15:27:29ESCシーケンスの使い方は間違ってない
実際、cygwinでコンパイルしたら、ちゃんと動いた。(VC6は持ってない)
ただし-mno-cygwinを付けるとダメだったので、素のDOSプロンプトは
ESCシーケンスを使えないんだと思う。
WindowsでESCシーケンスが使うのは大変そうだけど、以下の2案挙げておく。
(1) 他の人がいうように ansi.sysを入れて DOSプロンプトを起動する
#自分は試してない
(2) teraterm + cygwin接続 (teratermはESCシーケンスを解釈する)
の環境でそのプログラムを実行する
#こっちは大丈夫そう。ただしVT100互換でないかも
0210デフォルトの名無しさん
2009/05/16(土) 15:29:25main(){
char *s;
setstr(&s, "test");
puts(s);
}
でOk
0211デフォルトの名無しさん
2009/05/16(土) 15:31:14teraterm で試すなら CLS の部分は、 printf("\033[2J\033[0;0H");
とした方がいい。 ESC [ 2 J だけでは カーソル位置が戻らなかった。
0212デフォルトの名無しさん
2009/05/16(土) 15:33:47コマンドプロンプトは受け付けないけど
0213207
2009/05/16(土) 15:41:21>>208
mallocでメモリ確保は行っていますが。。。
>>208,>>210
おっしゃるとおり**sを*sにすると期待した動作になりました。
引数としては**sも&(*s)も同じに見えるのですが。
なぜでしょうか。
0214デフォルトの名無しさん
2009/05/16(土) 15:43:06レスどうもです。
(1)はどうやっても効きませんでした。
なので(2) 試してみたいと思います。
最も、チカチカしないように出来ればエスケープシーケンス
使えなくても良いのですが、自分では他にいい案が思い浮かばず
それならLocateと同じ事が出来ればいちいちCLSを繰り返し
処理(書いては消すの繰り返し=チカチカ)しなくても、
いけるのでは?と思ったからです。
というのもブロック消す処理は入っているのでCLS不要なわけですし
0215デフォルトの名無しさん
2009/05/16(土) 15:47:53WIN32アプリではなくDOSアプリにしないといけない。
9xはDOS/Winごちゃ混ぜだったので、
Win32アプリでもANSI.SYSのエスケープシーケンス処理が適用された。
NTは分離されている。
0216デフォルトの名無しさん
2009/05/16(土) 16:23:47char **sはchar *に対するポインタでこの時点ではどこを指してるか不定。
0217デフォルトの名無しさん
2009/05/16(土) 16:30:05確保できてねーだろ死ね
お前の書いた糞コードに近いやり方するとしたら
#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);
}
こういうことだ、わかったかぼけ
0218210
2009/05/16(土) 16:41:41理解できました。
char **sを宣言したとき
sはメモリのどこかを指していてそれがどこかを指している
で、そのままsetstr関数に渡すと
不定な場所にmallocの返り血を書き込もうとして落ちていたわけですね。
どうもありがとうございます。
0219デフォルトの名無しさん
2009/05/16(土) 16:52:29malloc「ゴラ!!変なエリア渡すンじぇねえよ。いてまうで」
プログラム「ふぎゃあ・・・」
0220デフォルトの名無しさん
2009/05/16(土) 22:02:47API使わなきゃできないつってんだよ
0221デフォルトの名無しさん
2009/05/16(土) 22:11:01malloc が 0 返してきたあかつきには、どうしていいかわかりません。みなさんどうしているのでしょうか。
0222デフォルトの名無しさん
2009/05/16(土) 22:13:090223デフォルトの名無しさん
2009/05/16(土) 22:22:48そんなんでいいのでしょうか。といっていいお作法はおもいつかない。
0224デフォルトの名無しさん
2009/05/16(土) 22:23:30妥協点がプログラムのゼロスタートになる場合も多々あります。
0225デフォルトの名無しさん
2009/05/16(土) 22:25:18断片化されたんではどうしようもないですし。
0226デフォルトの名無しさん
2009/05/16(土) 22:29:36無理にがんばらずに、メモリがなくなったとエラーメッセージを出して終了が間違いなし
0227デフォルトの名無しさん
2009/05/16(土) 22:32:18って言われたらもう何もまともに続行出来ないじゃん。
あきらめが肝心。
0228デフォルトの名無しさん
2009/05/16(土) 22:34:470229デフォルトの名無しさん
2009/05/16(土) 22:38:20コンパクション処理走らせてた時代もあったな。
使ってないデータはディスクに書き出して容量確保するとか、そういう努力もしてた。
0230デフォルトの名無しさん
2009/05/16(土) 22:41:42NULLチェック自体が無駄かも。
0231デフォルトの名無しさん
2009/05/16(土) 22:42:02「メモリ?…ハァ?スタックでがまんしろよおい」って言われたら思わず噴出す(ブシャー)
0232デフォルトの名無しさん
2009/05/16(土) 22:43:450233デフォルトの名無しさん
2009/05/16(土) 22:48:41どうした???発狂したか???
0234デフォルトの名無しさん
2009/05/16(土) 22:51:300235デフォルトの名無しさん
2009/05/16(土) 23:08:37アドレス空間って聞いたことある?
32bitのLinuxでmalloc(3*1024*1024*1024)出来ると思ってる?
俺もシステム全体での「物理メモリ(スワップ?)」が足りない時のLinuxの動作は知ってるけどさ。
0236デフォルトの名無しさん
2009/05/16(土) 23:12:540237デフォルトの名無しさん
2009/05/16(土) 23:26:55俺は、Linuxの「プロセスを有無を言わさず殺す動作」が起きるのが
「物理メモリが足りない時」と「スワップ領域が足りない時」のどちらの場合なのかを
知らないだけだ。
0238デフォルトの名無しさん
2009/05/16(土) 23:28:36「OOM killer」
これでいいかな。
0239デフォルトの名無しさん
2009/05/16(土) 23:57:38linuxのmalloc()がNULLを返さないってのは、いかなるときでも絶対返さないって意味じゃないよ。
0240デフォルトの名無しさん
2009/05/17(日) 00:15:460241デフォルトの名無しさん
2009/05/17(日) 00:23:23ならば
>NULLチェック自体が無駄かも。
と書かれているのは何故ですかね。
ちゃんとわかってる人には今更説明するまでも無いけど
仮想記憶を使っているOSでは、普通mallocは、アドレス空間が足りない時に、NULLを返す。
その他、一般的には、malloc内で呼んでいるシステムコール(例えばWin32ならVirtualAlloc)が
メモリをくれなかった場合にも、mallocはNULLを返す。
ただ、Linuxは、システムコール自体では「メモリ不足エラー」を返さず、
その領域にアクセスした瞬間に、どこかのプロセスを強制終了させてメモリを確保する。
そのため、Linuxにおいては後者のケースでNULLを返すことはない。
しかし、一般的に「mallocがNULLを返す」というのは、アドレス空間不足によるものが殆ど。
(物理メモリが足りなくても仮想記憶で補っているため)
したがって、mallocを使っている限り、「NULLチェックしなくて良い」などということは無い。
返された領域(NULL)にアクセスして不正終了しても構わないというなら不要といえば不要かもだが。
繰り返すけど
mallocがNULLを返す状況というのは、アドレス空間の不足が殆どなので
「LinuxだからNULLチェック不要」などということはありえない。
0242デフォルトの名無しさん
2009/05/17(日) 03:17:35その話とごっちゃになってるんじゃないか
0243デフォルトの名無しさん
2009/05/17(日) 04:49:000244デフォルトの名無しさん
2009/05/17(日) 04:57:42bang
0245デフォルトの名無しさん
2009/05/17(日) 04:59:560246デフォルトの名無しさん
2009/05/17(日) 08:42:050247デフォルトの名無しさん
2009/05/17(日) 09:09:17malloc()を読んだ時点では、メモリ確保に成功したか失敗したか
わからないから無駄だという考えもある。
0248デフォルトの名無しさん
2009/05/17(日) 09:11:410249デフォルトの名無しさん
2009/05/17(日) 09:21:36×アドレス空間
○プロセスに割り当て可能なメモリ
0250デフォルトの名無しさん
2009/05/17(日) 10:07:07頭悪いね。NULLチェック必要だって固定観念を棄てられないんだから。
0251デフォルトの名無しさん
2009/05/17(日) 10:08:39>ただ、Linuxは、システムコール自体では「メモリ不足エラー」を返さず、
>その領域にアクセスした瞬間に、どこかのプロセスを強制終了させてメモリを確保する。
これ本当?
0252デフォルトの名無しさん
2009/05/17(日) 10:11:40そう。
NULLを返さなくても、それにアクセスしたときにエラーになる。
manpageにはバグって書いてあるけど、そういう仕様。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html
0253デフォルトの名無しさん
2009/05/17(日) 10:21:08/proc/sys/vm/overcommit_memory
で挙動が変えられるみたい
malloc の NULL チェックが必要ないと言ってる奴は
環境依存な話をしてるだけ
0254デフォルトの名無しさん
2009/05/17(日) 10:23:58mallocしたプロセスの観点ではエラーにならないんだよね。
他の誰かが死ぬだけで。(それもどうかと思うけど)
0255デフォルトの名無しさん
2009/05/17(日) 13:07:37何?悔しかったの?w
0256デフォルトの名無しさん
2009/05/17(日) 13:10:28他の誰かとはかぎらんよ。
自分が殺される可能性だってある。
0257デフォルトの名無しさん
2009/05/17(日) 13:16:53だから最初からlinuxではって言ってるじゃん。
>>255
いや、ぜんぜん。
自分が悔しかったり、むかついたりすると、相手もそうだと思っちゃうよね。
0258デフォルトの名無しさん
2009/05/17(日) 13:31:26プロセスごとに使用可能なメモリ量を制限することも可能だし
古いカーネルを使い続けるのでない限りは
linux でも NULL チェックは意味があるって事になってるんだって
0259デフォルトの名無しさん
2009/05/17(日) 13:49:54これで万事FAだろ。
0260デフォルトの名無しさん
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);
}
0261デフォルトの名無しさん
2009/05/17(日) 15:33:410262デフォルトの名無しさん
2009/05/17(日) 15:37:320263デフォルトの名無しさん
2009/05/17(日) 15:39:54ああw
intと違って連続で入力すれば良いだけかw
0264デフォルトの名無しさん
2009/05/17(日) 15:44:13scanfで%sとして全角で入力させた文字を、
10進数、16進数のコードで表示させるにはどうすればいいですか?
ただ%dや%xとしただけではだめだったのですが…。
0265デフォルトの名無しさん
2009/05/17(日) 15:48:030266デフォルトの名無しさん
2009/05/17(日) 15:49:590267デフォルトの名無しさん
2009/05/17(日) 16:01:59ポインタはアドレスを格納する変数という理解で良いでしょうか。
0268デフォルトの名無しさん
2009/05/17(日) 16:05:33だから、
char *p = malloc(3 * 1024 * 1024 * 1024);
printf("p = %p\n");
を 32bit Linuxで実行してみろっての。バカ。
0269デフォルトの名無しさん
2009/05/17(日) 16:08:350270デフォルトの名無しさん
2009/05/17(日) 16:10:260272デフォルトの名無しさん
2009/05/17(日) 16:12:25わざと頭が悪い振りをしてるんでしょ。
理解できないわけないんだから。用語がどうとか言ってた無知も居るし。
0273デフォルトの名無しさん
2009/05/17(日) 16:17:510274デフォルトの名無しさん
2009/05/17(日) 16:20:46ありがと。
あとは、配列とポインタの違いだけど、
配列はアドレスだけどポインタじゃないから、任意のアドレスは格納できない。
ってところが違い?
0275デフォルトの名無しさん
2009/05/17(日) 16:24:130276デフォルトの名無しさん
2009/05/17(日) 16:25:40ただ、ポインタもそうだが、「型をもつアドレス」だからな。
それと、ポインタ変数だけでなく、ポインタの値のこともポインタと呼ばれる。
0277デフォルトの名無しさん
2009/05/17(日) 16:29:550278デフォルトの名無しさん
2009/05/17(日) 16:37:45ほんとだな。
俺、日本語でおk、だな。
>276、277
ありがとうございます。
ポインタや配列は型付きのアドレスなんですね。
0279デフォルトの名無しさん
2009/05/17(日) 16:44:56完璧に間違ってる。
配列は配列。ポインタではない。
変更不可能な左辺値。普通のオブジェクト。
0280デフォルトの名無しさん
2009/05/17(日) 16:46:05頼むから間違い広めないでくれ。
0281デフォルトの名無しさん
2009/05/17(日) 16:48:450282デフォルトの名無しさん
2009/05/17(日) 17:06:02ポインタは型付きのアドレスじゃないの?
0283デフォルトの名無しさん
2009/05/17(日) 17:11:090284デフォルトの名無しさん
2009/05/17(日) 17:21:05型付きと言ってるんだよね?
あってんじゃん?
0285デフォルトの名無しさん
2009/05/17(日) 19:09:35俺は「アドレス」という語が出た時点で
機械的にこいつダメだなと判断する。
0286デフォルトの名無しさん
2009/05/17(日) 19:44:450287デフォルトの名無しさん
2009/05/17(日) 19:45:470288デフォルトの名無しさん
2009/05/17(日) 20:55:10でもリテラル評価のタイミングでは数字になってない。
0289デフォルトの名無しさん
2009/05/17(日) 21:11:590290デフォルトの名無しさん
2009/05/17(日) 23:26:11と言うことはexeにはその値が埋め込まれているだけってことですね。
0291デフォルトの名無しさん
2009/05/18(月) 00:40:410292デフォルトの名無しさん
2009/05/18(月) 00:46:230293デフォルトの名無しさん
2009/05/18(月) 00:49:150294デフォルトの名無しさん
2009/05/18(月) 09:57:30埋め込まれる保証もないよ。最適化で適当な値に換算されているかもしれないし。
0295デフォルトの名無しさん
2009/05/19(火) 15:13:30どの程度のレベルから作り始められるのかが良く分からん。
コンソールを一通り扱えれば、後はライブラリの勉強すれば作れるようになるの?
アルゴリズムさえうまく作れれば、作れる気がするんだが。
それともwinAPIの勉強も必要?
0296デフォルトの名無しさん
2009/05/19(火) 15:17:322 /*メッセージ出力関数*/
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 }
0297デフォルトの名無しさん
2009/05/19(火) 15:18:2323 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;
0298デフォルトの名無しさん
2009/05/19(火) 15:19:202 extern int snapshot(int type,char *fmt,...);
3 #define NORMAL 0
4 #define WARNING 1
5 #define ERROR 2
0299デフォルトの名無しさん
2009/05/19(火) 15:20:322 #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 }
0300デフォルトの名無しさん
2009/05/19(火) 15:25:21gcc -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'
となり、コンパイルすることができません。
このプログラムは教材のプログラムです。
何回も見直したので写間違いはないと思います。
多分僕が共通範囲を理解していないのかもしれません。
コンパイルできないものを質問するのは失礼ですが、どうしても分かりません。
ご指摘お願いします。
0301デフォルトの名無しさん
2009/05/19(火) 15:34:46>>296の13行目の * / を */ になおしたうえで、
gcc -o snapshot2 snapshot2.c snapshot.c
でやってみ
0302デフォルトの名無しさん
2009/05/19(火) 16:01:06コンパイルすることができました。
コンパイル命令が違っていたのですね...
実行結果は教材に書かれていたのとは違いましたが
それは自分で考えて見ます。
本当にありがとうございました。
0303デフォルトの名無しさん
2009/05/19(火) 17:33:13int main(void) {
int a = 5;
if ( a < 10 ){
printf("10未満です。\n");
} else{
printf("10以上です。\n");
}
}
ビルドエラーが起きる どこが間違っているか教えてください
間違いは3ヶ所あるようです
0304デフォルトの名無しさん
2009/05/19(火) 17:38:030305デフォルトの名無しさん
2009/05/19(火) 17:45:260306デフォルトの名無しさん
2009/05/19(火) 18:23:03メイン関数の返り血をintに設定しているのにreturnで整数を返さないのは
おかしいのではないでしょうか?
まあこれはエラーではなく警告になるようですね。
0307デフォルトの名無しさん
2009/05/19(火) 18:28:13C99ならmainでreturnを省略すると0が返ると決められている。
C99じゃないならreturn 0;しとけ。
0308デフォルトの名無しさん
2009/05/19(火) 19:07:430309デフォルトの名無しさん
2009/05/19(火) 19:12:130310デフォルトの名無しさん
2009/05/19(火) 19:41:18{がある行の区間にさらに{が出てきた場合には、1を加え2を表示させ、}が出てきた場合には1を表示させるようなプログラムはどうやったら実現できますでしょうか?
例を書きますと、
元のtxt
{
}
{
{
}
}
出力txt
1{
1 }
1{
2 {
2
2 }
1}
行毎に読み込むまでは出来るのですが、行毎に読み込み元の文章に文字列を加え出力する、というのがわかりません。
どなたか教えてただけたら幸いです。
0311デフォルトの名無しさん
2009/05/19(火) 19:43:32printf("%4d %s", no, line); とかじゃなくて?
0312デフォルトの名無しさん
2009/05/19(火) 19:54:20当方の言葉が足りませんでした。プログラムに表示させるのではなく書き込んだ後ファイルとして出力します。
0313デフォルトの名無しさん
2009/05/19(火) 19:57:260314デフォルトの名無しさん
2009/05/19(火) 20:00:23作ってみた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;
}
0315デフォルトの名無しさん
2009/05/19(火) 20:05:47{}{}{}
に対して
1 {}{}{}
なのか
3 {}{}{}
なのか
負数はどうするとか不明なのに書いちゃダメだ
0316デフォルトの名無しさん
2009/05/19(火) 20:17:18>>314さん
ありがとうございます。>>314さんは書いてくださって本当に感謝しています
>>315さん
まずは書いてくださったコードを読んで、自分なりに理解してから検討したいと主思います。
0317デフォルトの名無しさん
2009/05/19(火) 21:53:01�@ウィンドウの出し方を調べる
�A絵の出し方を調べる
�B絵の表示位置をキー入力で変えられるようにする
あとは表示する絵を増やしていけばいいだけ難しくない
0318デフォルトの名無しさん
2009/05/20(水) 06:22:19Project Euler以外でなんか良い方法や問題や参考書ありませんか?
将来はソフトウェア開発関係の仕事を考えています
0319デフォルトの名無しさん
2009/05/20(水) 06:25:57まあどういう方面に進むかわからないけど
・ゲームを一人でシステムだけ作ってみる。
・DBと連携したシステムを書いてみる
のどちらかかなあ?
まあハードウェアの制御用アプリを書くってのもあるんだろうけど
0320デフォルトの名無しさん
2009/05/20(水) 06:42:13なるほど、参考にさせていただきます
ゲームはC言語とライブラリを使って作ったりはしているんですが
ライブラリよりWin32APIからDirectXで作ったほうがいいのでしょうか?
0321デフォルトの名無しさん
2009/05/20(水) 06:55:540322デフォルトの名無しさん
2009/05/20(水) 07:00:45ライブラリに関していえば所詮は環境依存なのでゲーム作るのであれば
たとえばDXライブラリの上で動いてるゲームであっても問題ないです。
0323デフォルトの名無しさん
2009/05/20(水) 07:14:10>>321-322 さん ありがとうございます
0324デフォルトの名無しさん
2009/05/20(水) 07:38:50まあそういうことですね
ためしに過去のゲームレベルを一人で作ってみるとか挑戦するのもいいかもしれないですね。
グラフィックとか音楽はあまりこだわらずに。
グラフィックとか音楽はハードの進化で確かに綺麗になったりしてますが、
ゲームそのもののシステムは実はそれほど進化してないんですよね。
0325デフォルトの名無しさん
2009/05/20(水) 07:52:10OpenGLはDXライブラリで作ってからじゃないとムリだw
俺もCやり始めて1ヶ月とちょっとだけど、DXで製作出来てる。
…どの程度のが出切るのか不安だけどね
0326318
2009/05/21(木) 03:28:10そうなんですか
最近はゲームがきれいになってきたので難しいものだと考えてました
過去のゲームを作る上ではやっぱりアルゴリズムなんかも覚えないといけないんでしょうか?
実際自分はまだ文法しか勉強していないのでソートなどのアルゴリズムとか覚えてないんですが…
0327デフォルトの名無しさん
2009/05/21(木) 05:01:19まあドット絵や3Dモデルをバリバリ作れるわけじゃないのであんまり偉そうな
ことはいえないけど、プログラマ視点からすればさほど変わらんかなあ。
特にアクションが無いゲームの場合は表現方法が2Dか3Dかの違いだしねえ
0328デフォルトの名無しさん
2009/05/21(木) 06:20:42まずは標準C++の仕様を学んだ方がいいんじゃない?
慣れも大きいが、C言語で書くよりC++で書いた方が
ライブラリなどもそろっているし楽かと。
0329デフォルトの名無しさん
2009/05/21(木) 10:58:58dosのことで聞きたいことが2つくらいあるんですけどここじゃダメなんですかね?
dos専用スレみたいなところってあるんですかね?
オマケで教えてもらうことって無理すか?
叩きスレがなければこのあと質問させていただきます。
0330デフォルトの名無しさん
2009/05/21(木) 11:00:10DOSスレか環境依存スレかVisualStudioスレへどうぞ。
0331デフォルトの名無しさん
2009/05/21(木) 11:15:330332デフォルトの名無しさん
2009/05/21(木) 11:29:54http://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
0333318
2009/05/21(木) 15:47:23C++ですか
やってみようと思います。
あとC言語から発展してWin32APIとDirectXは必ずやる予定なんですが、
これはどのように勉強すればいいのでしょう?
普通に文法を覚えていけばいいのでしょうか?
板違いだったらすいません。
0334デフォルトの名無しさん
2009/05/21(木) 16:48:19DirectXでつくるゲーム入門みたいな本が大量にあるから、いくつか買って勉強。
0335デフォルトの名無しさん
2009/05/21(木) 17:02:210336デフォルトの名無しさん
2009/05/21(木) 17:11:35if(a == b || *(c-a) == d) hogehoge();
a!=bならc-aは触って良いことが保証されている場所だとして、
上の書き方はc-aを触らないことが保証されますでしょうか?
それとも、最適化等の都合で、*(c-a) == dが先に評価されることが起きうるのでしょうか。
0337デフォルトの名無しさん
2009/05/21(木) 17:19:000338デフォルトの名無しさん
2009/05/21(木) 17:21:590339デフォルトの名無しさん
2009/05/21(木) 17:28:43保証される。
0340デフォルトの名無しさん
2009/05/21(木) 17:29:52ANSI準拠のコンパイラなら問題なしみたい
用語は「ショートサーキット」
0341デフォルトの名無しさん
2009/05/21(木) 17:45:26ありがとうございます。規格上は問題ないのですね。gccを信用することにします。
ショートサーキット調べてみました。映画でした。……じゃなくて、オペランドに対する評価順序の規則でした。
最近は複数コアCPUが並列処理して一気に評価してたりするのかなってぼんやり思ってたんですが、
そうではないんですね。。。
ありがとうございました。
0342デフォルトの名無しさん
2009/05/21(木) 20:09:55以下のコードの流れについて知りたのですがよく分かりません。
行ごとに簡単に解説してくれると助かります。よろしくお願いします。
-(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];
0343デフォルトの名無しさん
2009/05/21(木) 21:05:48ここでどうぞ
http://pc12.2ch.net/test/read.cgi/tech/1239721860/
0344デフォルトの名無しさん
2009/05/21(木) 23:23:59SmallTalkもカオスっぷりが禿しないけど
0345q
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]までに固定データの格納はありません。
これをなるべく早く行いたいのですが、どのように行えばいいですか。よろしくお願いいたします。
0346デフォルトの名無しさん
2009/05/22(金) 01:01:47意味がよくわからない。。。
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);
}
0347345
2009/05/22(金) 01:29:35すいません。。
やりたいことはprintfで渡ってくるデータをいかに効率よく出力exeに送るかということを
やりたいんです。自作printfを作成していて・・
�@出力exeに転送する前にprintfから渡ってきたデータの先頭に10byteに固定データを入れる。
�A最大192byte転送できる転送用関数の引数としてバッファをセットする。
ということなんですが、転送用バッファの最大が192byteなのでそれ以上のときはどうすればよいかなと。
なおかつスピードが要求されています。
0348デフォルトの名無しさん
2009/05/22(金) 01:42:34っておもった
*formatってのがよくわからん
0349345
2009/05/22(金) 01:48:13int printf(*format...){
}
の*formatです。
0350デフォルトの名無しさん
2009/05/22(金) 01:52:26むしろ転送うんぬんの部分じゃないか?
何か不満のあるやりかたでもしてるの?
0351デフォルトの名無しさん
2009/05/22(金) 03:11:28組み込みか何かでバッファを使いまわさないとダメなのか?
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;
}
0352345
2009/05/22(金) 10:02:230353デフォルトの名無しさん
2009/05/22(金) 10:20:410354デフォルトの名無しさん
2009/05/22(金) 15:46:37Aという構造体があるんだが
A **aみたいに宣言した場合、このaのメンバにアクセスするにはどうすればいいんだ?
普通のポインタならa->numだからダブルなら *a->num という風にやるのかと思ったができない
0355デフォルトの名無しさん
2009/05/22(金) 15:51:00->のが*より優先度高いので*a->numだと*(a->num)になる。
(*a)->numでやってみて。
0356デフォルトの名無しさん
2009/05/22(金) 15:55:480357デフォルトの名無しさん
2009/05/22(金) 15:57:14なるほど。優先順位で別の意味に解釈されてたのか
ありがとう!おかげで作業が進むよ
0358デフォルトの名無しさん
2009/05/22(金) 19:14:271.どういう手順でその関数を呼び出すのか分からない
(例.特定アドレスに送信内容を設定した後、送信用の関数を呼び出す)
2.printf の結果について最大サイズの計算は可能か
3.メモリ使用量の制限があるのかどうか
どっちにしろ >>351 で大体おkだと思うんだがね
0359デフォルトの名無しさん
2009/05/23(土) 00:29:36コピー改行コピー改行
して追加書き込みしたいんだけど
どれくらい領域確保すればいいのやら
0360デフォルトの名無しさん
2009/05/23(土) 00:38:52どうするの?
0361デフォルトの名無しさん
2009/05/23(土) 00:45:22あんまりいいロジックではないかもしれないが
線形リストと構造体でなんとかなるんでない?
0362デフォルトの名無しさん
2009/05/23(土) 00:53:35struct hoge
{
struct hoge *next; //リスト用
int num; //構造体が持っている文字数(改行などの制御文字含む)
}
リストと文字数管理用の構造体はこんな感じにして
領域確保の際は
malloc(sizeof(HOGE)+len);
lenは改行コードまでの1行分の長さ
0363デフォルトの名無しさん
2009/05/23(土) 01:03:52入力側からちびちび読み込んで1行分の文字数をカウントしながら出力しつつ
改行する必要があれば出力側に改行コードを追加で出力するようにすればいいのか。
というか文字コードは何とか1行はどのくらいで区切るとかがわからないと
コードがもらえないよな
0364デフォルトの名無しさん
2009/05/23(土) 02:40:53char tmp;
で十分・・・
0365デフォルトの名無しさん
2009/05/23(土) 02:46:540366デフォルトの名無しさん
2009/05/23(土) 02:49:03書かないとどうしようもないわな。
文字が絡むと面倒なことが多いし。
0367デフォルトの名無しさん
2009/05/23(土) 03:01:010368デフォルトの名無しさん
2009/05/23(土) 09:07:36C言語でおk
日本語で説明するよりCでコードを書いて最適化してもらったほうがわかりやすい
0369デフォルトの名無しさん
2009/05/23(土) 15:05:59それまでにある程度勉強しときたい通用しないだろうけど基本は
今ネコでもわかるC言語プログラムが終わって、これの次の難易度的な本はありますか?
0370デフォルトの名無しさん
2009/05/23(土) 15:10:140371デフォルトの名無しさん
2009/05/23(土) 15:11:51これが一番かなあ
0372デフォルトの名無しさん
2009/05/23(土) 15:20:54それくらい自分で探せるようになることかな。
0374デフォルトの名無しさん
2009/05/23(土) 15:35:120375デフォルトの名無しさん
2009/05/23(土) 16:12:51勉強より、強靭な体力、根性力をつける
先ず、今年の夏は冷房(エアコン、扇風機等)なしで過ごし
夏休みは日中の暑い中、毎日1時間以上走れ
0376デフォルトの名無しさん
2009/05/23(土) 16:42:20大体2日寝ないでも特に問題無く3日目活動出来るようにしとくべき
冗談じゃなくてマジで
0377デフォルトの名無しさん
2009/05/23(土) 16:50:47#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行目周辺みてもミスがわからないです。
0378デフォルトの名無しさん
2009/05/23(土) 16:51:45さがせよ とか
0379デフォルトの名無しさん
2009/05/23(土) 16:54:20EffectiveC++
0380デフォルトの名無しさん
2009/05/23(土) 16:56:26Ctrl+Aであぶりだししてみろ
0381デフォルトの名無しさん
2009/05/23(土) 17:16:080382デフォルトの名無しさん
2009/05/23(土) 17:18:54全角空白
0383デフォルトの名無しさん
2009/05/23(土) 17:20:48なんでclという名前なんですか?
bccとかgccは名前を略したものでしょうけど。
0384デフォルトの名無しさん
2009/05/23(土) 17:33:12ごめんなさい嘘です
0385デフォルトの名無しさん
2009/05/23(土) 17:35:33ごめんなさいテキトーです
0386デフォルトの名無しさん
2009/05/23(土) 17:36:100387デフォルトの名無しさん
2009/05/23(土) 17:36:39マジで!?
>>385
ハァ?死ねよ
0388デフォルトの名無しさん
2009/05/23(土) 17:37:44MASMはmlだしな。
0389デフォルトの名無しさん
2009/05/23(土) 17:41:55なにせ、むかしのMSは営業力で伸びていったのだから、社名は出さない方が良かった
0390デフォルトの名無しさん
2009/05/23(土) 17:43:070392377
2009/05/23(土) 17:59:46ありがとうございました
全角空白あるとエラー起こすんですね
0393デフォルトの名無しさん
2009/05/23(土) 18:09:32それを言ったらコンパイルはc1、c2だろう。
今はdllだけど昔はexeだった。
0394デフォルトの名無しさん
2009/05/23(土) 19:38:02masmは以前はmasm.exeだよ。
むしろcl.exeにあわせる為にml.exeに変更された。
masmとlinkを実行するドライバとしてだったと思う。
0395デフォルトの名無しさん
2009/05/23(土) 21:31:24入門本を2冊読んで基本はだいたい分かったのですが、いざ何かを作ろうと思っても何も手が進みません。
サンプルプログラムの本をAmazonで探してみましたが、JavaやRubyなどはたくさんあるのですがCは何故か全然見つかりません。
独学で勉強してる人は、入門本以降どのように勉強してるのですか?
0396デフォルトの名無しさん
2009/05/23(土) 21:33:48ちょっとしたデータの一覧表を出力出来る程度。
アプリケーション開発したいならAPIとかに移れ
ゲームならなんかのライブラリ使え、OpenGLとかオススメだけど難しいかもしれん。
どっちにせよコンソールで関数ポインタとかぐらいまで使いこなせないと、開発は難しいと思う。
0397デフォルトの名無しさん
2009/05/23(土) 21:37:49いずれにせよ先はめっちゃくちゃ険しいけど、熱意を持ち続けられればいけるよ!
上の言う通り関数ポインタとかまではまだ入門レベルだから頑張ってね。
0398デフォルトの名無しさん
2009/05/23(土) 21:40:42同様にclもmsc.exeからっだった。
0399デフォルトの名無しさん
2009/05/23(土) 21:58:240400デフォルトの名無しさん
2009/05/23(土) 22:39:11入門書の次は基本的なデータ構造とかアルゴリズムの勉強とかかなぁ
数値計算とかデータ処理したいだけならべつにいらないけど
windowsとかで普段使ってるような文字だけじゃないアプリとかゲーム作るんだったらwindows APIでぐぐるといい
0401デフォルトの名無しさん
2009/05/23(土) 23:02:55どういう世界だよ
0402デフォルトの名無しさん
2009/05/23(土) 23:07:18<p>〜べつにいらないけど
windowsとかで〜</p>
ということでは?
0403デフォルトの名無しさん
2009/05/23(土) 23:43:310404デフォルトの名無しさん
2009/05/24(日) 00:07:38データ構造・アルゴリズムとか。
あと自分で何かを作ろうとするのもいいですね。お題が見つからないのなら宿題スレはいかが?
0405345
2009/05/24(日) 01:12:52書き込み遅くなりました。
>1.どういう手順でその関数を呼び出すのか分からない
(例.特定アドレスに送信内容を設定した後、送信用の関数を呼び出す)
送信関数は転送用バッファにデータを入れ引数にセットすればよいです。
特に難しいことは考えなくてよいです。
>2.printf の結果について最大サイズの計算は可能か
すいません。質問の意味が理解できなかったです。
>3.メモリ使用量の制限があるのかどうか
Winプログラムなんで気にしなくてよいです。
ただありとあらゆるところから呼ばれるので、
処理速度を気にしてます。
やっぱり、固定ではmemcpyで処理したあと、引数で渡ってくる(printf(*format...))文字データは
一文字ずつ格納していくしかないのでしょうか?
考えたんですがそれしか思い浮かばなかったです。
0406デフォルトの名無しさん
2009/05/24(日) 01:29:13まずブロック変数とは何か教えてください!
ググっても、ヤフー見ても、具体的な単語の説明がなかったので困っています。
0407デフォルトの名無しさん
2009/05/24(日) 01:31:31ブロック変数 {int a;}
まあauto変数もブロック変数なんだけど。
0408デフォルトの名無しさん
2009/05/24(日) 01:34:28#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;
}
0409デフォルトの名無しさん
2009/05/24(日) 01:36:36>>408
ありがとうございます!
0410デフォルトの名無しさん
2009/05/24(日) 01:43:31転送用の関数について
1.関数プロトタイプを書いてくれ
2.関数を呼び出す手順があるなら書いてくれ
例えば "ABC" という3文字の固定文字列を転送するだけのサンプルを
示してくれれば多分回答可能
0411デフォルトの名無しさん
2009/05/24(日) 07:21:030412デフォルトの名無しさん
2009/05/24(日) 07:59:450413デフォルトの名無しさん
2009/05/24(日) 08:25:48union使うときも気にする必要があるかもしれない
0414デフォルトの名無しさん
2009/05/24(日) 08:58:06array[1]:1
array[2]:2
array[3]:3
gcc-4.4.0だと、
要素数:3
昇順に入力してください。
array[0]:1
array[0]:2
array[0]:3
となってしまします、何処がおかしいのか、教えてくださいませ。文字型%sで受けて、整数型にキャストするのが吉なのでしょうか?
↓コードの一部です
0415デフォルトの名無しさん
2009/05/24(日) 08:59:23#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;
}
0416デフォルトの名無しさん
2009/05/24(日) 09:12:11・・・ array[i - 1]);
0417デフォルトの名無しさん
2009/05/24(日) 09:12:22VSでも偶然動いてるだけ
0418デフォルトの名無しさん
2009/05/24(日) 09:31:13気付きました_(--)_
0419デフォルトの名無しさん
2009/05/24(日) 12:31:510420デフォルトの名無しさん
2009/05/24(日) 12:45:240421デフォルトの名無しさん
2009/05/24(日) 13:01:21何だこのカス。
0422デフォルトの名無しさん
2009/05/24(日) 14:36:10i = 1U<<30;
と
i = 0x40000000;
とどちらがスピードが早いのですか?
0423デフォルトの名無しさん
2009/05/24(日) 14:43:170424デフォルトの名無しさん
2009/05/24(日) 14:49:390425デフォルトの名無しさん
2009/05/24(日) 14:51:140426デフォルトの名無しさん
2009/05/24(日) 14:52:380427デフォルトの名無しさん
2009/05/24(日) 14:54:30敢えてやる必要は
断じて
*な い*
0428デフォルトの名無しさん
2009/05/24(日) 15:03:00大抵は上の方だから上で書く習慣にしておけばいいと思うけど
0429デフォルトの名無しさん
2009/05/24(日) 15:38:37int foo(int *p, int len){・・・;};
foo({1, 2, 3}, 3);
こんな感じで使いたいんですけど、うまくいきません
0430デフォルトの名無しさん
2009/05/24(日) 15:40:30別の環境がどうなるかは分からない
結論:好きにしろ
0431デフォルトの名無しさん
2009/05/24(日) 15:42:52C99でいいならできるけど
どうやるか忘れたw
0432デフォルトの名無しさん
2009/05/24(日) 15:44:38gccなどC99対応コンパイラなら、foo((int[]){1, 2, 3}, 3);と書ける。
0433デフォルトの名無しさん
2009/05/24(日) 15:50:53あきらめてgccを使いますね・・・
0434デフォルトの名無しさん
2009/05/24(日) 15:52:10{
int bar[]={1,2,3};
foo(bar, 3);
}
0435デフォルトの名無しさん
2009/05/24(日) 16:22:03a[i] =i++;は使うなということくらいしかわかりません
K&Rのp66の説明にある
関数呼び出しはたぶんcdeclとか呼び出し規約によって結果が異なると理解しています
入れ子になった代入文とはどんなものでしょうか?
よろしくお願いします
0436デフォルトの名無しさん
2009/05/24(日) 16:53:46後置インクリメント演算子++の働きについて考えてみるとよい
++ は適用されたオブジェクトの元の値を返し、オブジェクトの
値を +1 するという事はわかるよね
しかし、【いつ】オブジェクトの値を +1 するかという事になると、
副作用完了点の直前、としか定義されていない
つまり、a[i]を評価してから +1 するのか、 i++を評価してから +1
するのかどちらかなのかは、この式を見ただけでは判断できない
コンパイラのみぞ知るなわけ
C89より前ではこの振る舞いをunspecifiedとしていたが、C89では
undefined、つまり未定義とした
つまり鼻から悪魔
0437デフォルトの名無しさん
2009/05/24(日) 16:58:04さらに関数呼び出しの引数の評価順については、関数呼び出しは
特別なケースになっていて、func(a, b, c) とあったらこの中の ',' は
カンマ演算子ではなく、単なる引数のセパレータとして働く
もちろん func (a, (b, c), d) とあった場合の (b, c) はカンマ演算子
である
C89では関数の呼び出しに際して各引数の評価順は右から左でも
左から右でもないとしている
つまりどのような順番で評価されるかわからない
a b c かもしれないし a c b かもしれないし b c a かもしれない
だから評価順に依存したプログラムを書いてはいけない
関数呼び出しに関しては副作用完了点は関数を実際に呼び出す
タイミングの直前にすべての引数の評価が終わっているという事になる
0438デフォルトの名無しさん
2009/05/24(日) 17:19:12実際にはfunc(a, b, c)をa,b,c以外の順番で評価するような悪趣味なコンパイラはまず存在しない
評価順をそう仮定して依存したコードを書いても、問題になるようなことは普通はありえない
安心して依存するといい
0439デフォルトの名無しさん
2009/05/24(日) 17:21:27そーでもない
0440デフォルトの名無しさん
2009/05/24(日) 17:29:19VC++はDebugとReleaseで評価順が変わることがあるって記事を見たことあるぞ
0441デフォルトの名無しさん
2009/05/24(日) 17:29:28最適化前後で変わったことがある
0442デフォルトの名無しさん
2009/05/24(日) 17:35:03むしろ c, b, aの順になりそうなもんだけど
0443デフォルトの名無しさん
2009/05/24(日) 18:07:53>実際にはfunc(a, b, c)をa,b,c以外の順番で評価するような悪趣味なコンパイラはまず存在しない
はあ?
お前の足りない知識においてはそうなのかもしれないが・・・
>評価順をそう仮定して依存したコードを書いても、問題になるようなことは普通はありえない
そんなコードを回してきたヤツが居たら
もうそいつは信用できないと思うのは俺だけではないだろう。
0444デフォルトの名無しさん
2009/05/24(日) 18:10:16分けてかけ
その程度省略してなんになる。
今の時代はマネージドとかいってるんだぞ
Cであっても安パイなコード書け
0445デフォルトの名無しさん
2009/05/24(日) 18:11:070446デフォルトの名無しさん
2009/05/24(日) 18:13:18規格を理解出来ないヤツは間違いなく無能。
0447デフォルトの名無しさん
2009/05/24(日) 18:15:37だよな
コンピューター開発なんて規格との戦いだろ
いい加減文字コード統一しろ
エンディアンも統一しろ
0448デフォルトの名無しさん
2009/05/24(日) 18:15:55規格なんて法律じゃないし、絶対でもない
>>443みたいな、そんなことで人の信用を決めつける奴の方が現場では迷惑
0449デフォルトの名無しさん
2009/05/24(日) 18:18:25こいつまじうんこ
0450デフォルトの名無しさん
2009/05/24(日) 18:23:56C/C++の世界ではお前が法律じゃない
規格票だけが唯一の法律だ
0451デフォルトの名無しさん
2009/05/24(日) 18:24:22「自分が低能だからドカタになった」ことだけが唯一のよりどころ。
0452デフォルトの名無しさん
2009/05/24(日) 18:27:48これが現場の常識ですか。
ほんっと、世界が狭いですねぇ。
0453デフォルトの名無しさん
2009/05/24(日) 18:30:12しょうもない冗長コードを書いて仕事を遅らせる奴なんていらないんですよ
世の中のありとあらゆるマイナーコンパイラで通るコードを書いた所で自慢になんかならないんですよ
規格厨はこれだから
0454デフォルトの名無しさん
2009/05/24(日) 18:32:42遅れるほどの手間かよw
1行で書くところをせいぜい数行増えるだけだろ
0455443
2009/05/24(日) 18:33:12>そんなことで人の信用を決めつける奴の方が現場では迷惑
まわりもお前みたいなヤツばっかなら
まあ問題ないだろう。
そしてお前の会社(仕事くらいあるよな?)が倒産した時、
もう一度俺の書き込みを読んでくれ。
0456デフォルトの名無しさん
2009/05/24(日) 18:33:40実装したことないのかよ
想像力を働かせろ
0457デフォルトの名無しさん
2009/05/24(日) 18:38:57int a(),b(),c();
func(a(),b(),c())
で最初に呼ばれる関数はc()でおk?
0458デフォルトの名無しさん
2009/05/24(日) 18:39:190459デフォルトの名無しさん
2009/05/24(日) 18:40:36違う
最初に「積まれる」値がc()の戻り値にすぎない
0460デフォルトの名無しさん
2009/05/24(日) 18:40:50納期迫る前に書いておけよ
てかコンパイラ沢山しっているようでございますが,
確認できているコンパイラは何十個そんざいしますか?
0461デフォルトの名無しさん
2009/05/24(日) 18:45:50為の関数呼び出しがランダムな順序で発生することに依存したコーディング
は正しい?
0462デフォルトの名無しさん
2009/05/24(日) 18:48:01皆さんは好きなだけ時間をかけて完璧な規格超準拠コードを書いてて下さい
そんな顔真っ赤にして反論しなくたって、俺は止めないから
ただ、引数の呼び出し順が違うかもなんて意識したことはないし、
それで問題が起こった事なんて一度もないから、無駄な努力だと思うよーってだけ。俺はね
0463デフォルトの名無しさん
2009/05/24(日) 18:52:20そうでございますが
当社としては動かないコードを安全だと豪語される方にはお引取り願わせていただいております
0464デフォルトの名無しさん
2009/05/24(日) 19:02:090465デフォルトの名無しさん
2009/05/24(日) 19:04:14一応お伝えしておきますが、安全性はテストによって保証するものであって、
規格に準拠してるかどうかなんてのはコードの安全性と関係ありませんよ
0466デフォルトの名無しさん
2009/05/24(日) 19:07:49テストできないから安全だっつってるよーn…いやそうでもないか
0467デフォルトの名無しさん
2009/05/24(日) 19:12:19え?品質チェックとかしてるの?
信じられないなぁw
0468デフォルトの名無しさん
2009/05/24(日) 19:16:24先に<windows.h>インクルードしてみたらどう?
0469468
2009/05/24(日) 19:17:380470デフォルトの名無しさん
2009/05/24(日) 21:01:160471デフォルトの名無しさん
2009/05/24(日) 21:42:03そりゃプログラム書いたことのないやつはそんなこと意識しないわな。
0472443
2009/05/24(日) 21:51:58「現場では○○」
っていうと
自身の程度の低さの免罪符になるとカンチガイしているんだよね。
ま、お前の会社倒産寸前だろうけど、
せいぜい楽しくやりなよ。
w
0473デフォルトの名無しさん
2009/05/24(日) 21:59:550474デフォルトの名無しさん
2009/05/24(日) 22:30:43大域変数や関数をstaticにするとどのような効果があるのでしょうか?
0475デフォルトの名無しさん
2009/05/24(日) 22:56:180476デフォルトの名無しさん
2009/05/24(日) 23:05:42staticキーワードでローカル(プライベート)にする - C言語とC++入門勉強ルーム
ttp://www.mapee.jp/cpp/static_2.html
こことか読んでみ。
0477435
2009/05/24(日) 23:09:24インクリメントは式の中でいつ評価されるかわからない、
引数内の関数もどの関数が最初に呼ばれるのかわからない
ということでおkでしょうか?
入れ子になった代入文とはどのようなものでしょうか?
0478デフォルトの名無しさん
2009/05/24(日) 23:16:59>>インクリメントは式の中でいつ評価されるかわからない、
C言語の規格では、未定義
つまり何が起きるかわからない。評価されないかもしれない。
>>引数内の関数もどの関数が最初に呼ばれるのかわからない
C言語の規格で、不定
つまり順序は仕様上決められていない。分からないというのは
正しいけど、言いすぎな感じ
0479デフォルトの名無しさん
2009/05/24(日) 23:19:54嘘書くなよ
0480デフォルトの名無しさん
2009/05/24(日) 23:34:54>C言語の規格では、未定義
>つまり何が起きるかわからない。評価されないかもしれない。
アフォ?
0481デフォルトの名無しさん
2009/05/25(月) 00:25:31a[i]=i++;
これはiが1になるかどうかすらも未定義って話だろ?
規格の上ではその通りだよ
実際上はiが1にならないコンパイラなんてまず存在しないが
0482デフォルトの名無しさん
2009/05/25(月) 00:30:09ちょっと待った
俺のコンパイラでは2になるぞ
0483デフォルトの名無しさん
2009/05/25(月) 00:36:430484デフォルトの名無しさん
2009/05/25(月) 00:40:580485デフォルトの名無しさん
2009/05/25(月) 01:02:120486デフォルトの名無しさん
2009/05/25(月) 01:07:56なるが、果たしてa[0]にアクセスするのかa[1]にアクセスするのか
わからないという事だ
0487デフォルトの名無しさん
2009/05/25(月) 01:12:32それは「不定」でしょ。そうじゃなくて今回の例は「未定義」だ。
0488デフォルトの名無しさん
2009/05/25(月) 01:30:220489デフォルトの名無しさん
2009/05/25(月) 02:18:52こういうのが2重ループ
http://asobi.sqweebs.com/tetorisu/1.php
0490デフォルトの名無しさん
2009/05/25(月) 02:31:32未定義動作が1ヶ所でもあれば、プログラム中のありとあらゆる動作が未定義になる
0491デフォルトの名無しさん
2009/05/25(月) 04:59:17そんな事は知っているわカス
0492デフォルトの名無しさん
2009/05/25(月) 05:21:37規格上の未定義の意味誤解してるな
0493デフォルトの名無しさん
2009/05/25(月) 05:21:55なにを当たり前なwwwww
0494デフォルトの名無しさん
2009/05/25(月) 06:36:22なにこれ
0495デフォルトの名無しさん
2009/05/25(月) 09:34:01世の中単純ループに見えるものが本当に単純なのかというところから
疑ってかかってみても遅くは無い。
>>490
本気でそう思ってる?
0496、
2009/05/25(月) 10:50:34Windows、組み込み両方について教えて頂きたいです。また、両方の方法での懸念事項、他によい方法があれば教えて頂きたいです。
0497デフォルトの名無しさん
2009/05/25(月) 10:54:29最適化で結局似たコードになってた なんてことも有りえるかもしれないがね
0498デフォルトの名無しさん
2009/05/25(月) 11:17:54>バッファに文字200文字のデータ格納する
これってコピー元はすでに連続したエリアに文字データが入ってると思っていいのかな?
その辺がよくわからないのでなんともいえない。
状況がよくわからんが自分が作ってるプログラムで二通りの転送方法が
考えれるんだったら、>>497のいうように簡単な速度評価するプログラム
を用意して実測してみればいい。
で、私は別で質問。
最適なスレがよくわからないんですが、あれば誘導していただけると助かります。
皆さん開発してて、リビジョン管理とかどうされてますか?
0499デフォルトの名無しさん
2009/05/25(月) 11:19:45http://pc12.2ch.net/test/read.cgi/tech/1242918130/
0500498
2009/05/25(月) 11:21:130501デフォルトの名無しさん
2009/05/25(月) 11:22:40一文字ずつコピーした場合は、memcpy呼び出しになった。
memcpy呼び出しをした場合は、movsdに置き換わった。
ちょっと笑った。
0502デフォルトの名無しさん
2009/05/25(月) 11:34:07先頭アドレスが8バイト境界かどうかで変りそうだね < movsd 使うかどうか
0503デフォルトの名無しさん
2009/05/25(月) 11:37:04HOGE *hogelist[1000] = {NULL,};
こういう風に記述した場合に1000個全部NULLが入りますでしょうか?
0504デフォルトの名無しさん
2009/05/25(月) 11:40:49はいるよ
0505デフォルトの名無しさん
2009/05/25(月) 11:47:25HOGE *( hogelist[1000] )={NULL};
(hogelistは配列でありその要素はHOGEへのポインタである。)
0506デフォルトの名無しさん
2009/05/25(月) 11:53:11自分の価値観を一般みたいに言うなよw
0507デフォルトの名無しさん
2009/05/25(月) 12:08:16意味が変わってる。それは、配列へのポインタ。
0508503
2009/05/25(月) 12:11:04ありがとうございます。
>>505
ネットとかで見かける書き方は>>503の書き方が多かった気がします。
でも>>505のような書き方もできるんですね。勉強になりました。
ではちょっと別な質問なんですが
構造体のポインタではなく構造体の配列を初期化する場合は
HOGEの中はintが3つあると過程して
HOGE hogelist[1000] = { {0,1,0},};
とした場合1000個全部に0,1,0で初期化されるんでしょうか?
0509デフォルトの名無しさん
2009/05/25(月) 12:12:48無理。
足りない初期化子は0で埋められる。
0511デフォルトの名無しさん
2009/05/25(月) 12:24:16アンカーを使い、なおかつですます調で書く場合はですね、アンカーの後ろに
「さま」とか「くん」とか付けるとですね。
違和感が無くなって良いんじゃないかと思いますわ
>>503
>>504
>>505
みたいにかくと対等以下の呼び捨て見下し調であるというトーンは2chでは
既に形成されて久しいですわ
0512デフォルトの名無しさん
2009/05/25(月) 12:24:44馬鹿はっけーん
0513デフォルトの名無しさん
2009/05/25(月) 12:26:04おいおい嘘いうなよカス
0514デフォルトの名無しさん
2009/05/25(月) 12:26:44死ね
0515503
2009/05/25(月) 12:42:18そのほうがいいですね。
さすがに「くん」もちょっとあれですし、「さま」もちょっと硬すぎる感じなので「さん」とか
くらいが丁度いいかもとか思いますがどうでしょうか?
0516デフォルトの名無しさん
2009/05/25(月) 12:44:33ねーよw
0517デフォルトの名無しさん
2009/05/25(月) 13:00:370518デフォルトの名無しさん
2009/05/25(月) 13:38:21「さん」は男性の女性全体に対する敬語でしょ?目上の人に使う言葉で
2chじゃおかしいです。
たん がちょっと汚くていいとおもいまつ
05194
2009/05/25(月) 14:01:330520、
2009/05/25(月) 19:27:38int printf(const char*format...);
0521デフォルトの名無しさん
2009/05/25(月) 19:55:290522デフォルトの名無しさん
2009/05/25(月) 20:06:57そっちのほうが気になる。
0523デフォルトの名無しさん
2009/05/25(月) 20:09:500524デフォルトの名無しさん
2009/05/25(月) 21:07:34つまりwindowsでは特有の制限がprintfにあるということだ
0525デフォルトの名無しさん
2009/05/25(月) 21:35:060526デフォルトの名無しさん
2009/05/25(月) 22:11:320527デフォルトの名無しさん
2009/05/25(月) 22:30:33c言語のfree関数でメモリを解放すれば
タスクマネージャのメモリの使用量の数値は減少するのでしょうか?
0528デフォルトの名無しさん
2009/05/25(月) 22:31:170529デフォルトの名無しさん
2009/05/25(月) 22:37:07ありがとうございます。
0530デフォルトの名無しさん
2009/05/25(月) 22:45:450531デフォルトの名無しさん
2009/05/25(月) 22:46:390532デフォルトの名無しさん
2009/05/25(月) 22:50:45標準のメモリ管理システムより高性能なものを作れれば。
0533デフォルトの名無しさん
2009/05/25(月) 22:54:52メモリー増設
これが一番手っ取り早い
0534デフォルトの名無しさん
2009/05/25(月) 23:44:23ここのサイトのbmp.hとbmp.cを使ってBMPファイルを操作したいのですが、
bmp.hとbmp.cはどこに保存すればいいのですか?
コンパイラはCPad for Borland C++Compilerを使ってます。
0535デフォルトの名無しさん
2009/05/26(火) 00:00:05デスクトップにbmp.hとbmp.cを保存する
次にCPadのアイコンにbmp.cをドロップ
おもむろにF9を殴打する
0536デフォルトの名無しさん
2009/05/26(火) 00:02:56Borland 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 が参照)
って言われました。
0537デフォルトの名無しさん
2009/05/26(火) 00:10:15test01.cとかtest02.cがあるだろ
test01.cとbmp.cを一緒にコンパイルするの。
0538デフォルトの名無しさん
2009/05/26(火) 00:14:36一緒にコンパイルするには、どうすればいいですか?
0539デフォルトの名無しさん
2009/05/26(火) 00:16:23bcc32 test0.c bmp.c
ってコマンド欄にいれてみたら?
0540デフォルトの名無しさん
2009/05/26(火) 00:18:04C:\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:
ってなりました。
0541デフォルトの名無しさん
2009/05/26(火) 00:20:08ねたなの?まじなの?
0542デフォルトの名無しさん
2009/05/26(火) 00:21:06ごめんなさい、まじです
0543デフォルトの名無しさん
2009/05/26(火) 00:21:410544デフォルトの名無しさん
2009/05/26(火) 00:23:28ええと。そうじゃないな。
自分で書いたソースファイルと、bmp.c とを一緒にコンパイルするんだ。
で、自分で書いたソースファイルでは bmp.h をインクルードすれば、bmp.h で宣言されている関数とかを呼び出せる。
付属品のtest0.cとtest1.cは、なんかポンコツな文法で書かれてるからコンパイル通らなくても気にしない。
(てか、bmp.cを見てないんだがこっちは大丈夫なのかなぁ)
0545デフォルトの名無しさん
2009/05/26(火) 00:26:2822行目で宣言があるこいつを16行目にカット&ペーストすればおk
しっかしこんな奴に教えられる学生がかわいそうだ
静岡大学がんばれ!
0546デフォルトの名無しさん
2009/05/26(火) 00:28:32C99なら大丈夫よ。
0547デフォルトの名無しさん
2009/05/26(火) 00:30:06戻り値の型が暗黙で int ってのは、C99では禁止されたからね。
だからポンコツと言ったのだ。どの規格でも通らないコードだ。
0548デフォルトの名無しさん
2009/05/26(火) 00:32:19「自分で書いたソースファイルと、bmp.c とを一緒にコンパイル」する仕方がわかりません…
0549デフォルトの名無しさん
2009/05/26(火) 00:33:36#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)作ってみた。
0550デフォルトの名無しさん
2009/05/26(火) 00:33:510551デフォルトの名無しさん
2009/05/26(火) 00:35:390553デフォルトの名無しさん
2009/05/26(火) 00:39:05bccの操作方法について聞きたいなら、俺はよく知らんけど>>539な感じでいいと思う。
あと、「一緒にコンパイル」てのは実は不正確な言い方で、厳密にいうと、
それぞれコンパイルしてからリンクするんだけどね。
このへんの知識があやふやなら、改めて聞いてほしい。
0555デフォルトの名無しさん
2009/05/26(火) 00:45:02この1つ以上のobjをくっつけてexeにするのがリンク
0556デフォルトの名無しさん
2009/05/26(火) 00:45:49「分割コンパイル」といって、プログラムを作成するときに
ソースファイル(拡張子が c のファイル)を複数作成し、それぞれを個別にコンパイルした後で、
個々のコンパイル結果をまとめあげる(リンク)、という手法がとられることがある。
今回は、bmp.c を道具として利用するための、自分で書いたソースファイルがあるはずだ。
あるいは、>>549 でもいい。
こういうソースと、bmp.c とを、それぞれ個別にコンパイルした後で、リンクすることによって、
まとまった1つのプログラムを得ることが出来る。
0557556
2009/05/26(火) 00:47:51>>536で言ってるのは、bmp.c のコンパイルには成功したものの、リンク時に失敗している。
プログラムを最終的に組み上げるときに、main関数がないからおかしいよ?って言ってるわけ。
0559534
2009/05/26(火) 01:28:140560デフォルトの名無しさん
2009/05/26(火) 01:38:270561デフォルトの名無しさん
2009/05/26(火) 01:40:090563デフォルトの名無しさん
2009/05/26(火) 01:46:36>>536でも勝手にリンカを走らせて、リンクエラーを報告してくれてるわけでしょ。
普通は、「コンパイルのみ実行してリンクは行わない」という指示を出さない限り、リンクしてくれる。
0564534
2009/05/26(火) 01:54:21bmp.c
bmp.h
w2b.cpp(>>549の)
を入れて、bmp.cとw2b.cppをコンパイルして
bmp.obj
w2b.obj
が作られて、
その後どうすればいいですか?
0565デフォルトの名無しさん
2009/05/26(火) 02:00:49bccの使い方については、ここにいる人間もみんなが知っているわけじゃないから、
適当にぐぐるか、bccを知ってそうな人のところに行くか、
もしくはもっと多くの人が使ってそうなコンパイラに乗り換えるか(VCとか)がいいと思う。
0566534
2009/05/26(火) 02:05:58実行したら、
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と同じプログラム書いてきちんと動作する?
0567デフォルトの名無しさん
2009/05/26(火) 02:06:360568デフォルトの名無しさん
2009/05/26(火) 02:07:24リンク自体の実行はできてるっぽいが……ちょっとbmp.cの中身を確かめてみるから待ってて。
0569デフォルトの名無しさん
2009/05/26(火) 02:08:160571デフォルトの名無しさん
2009/05/26(火) 02:10:36かな。
うまく行かなかったら.objを作り直してためしてみるとか。
0572534
2009/05/26(火) 02:10:37C:\Users\***>ilink32 ,myexe.exe bmp.obj w2b.obj
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: 余分な EXE ファイル名が指定された : bmp.obj
こうなりました。
0573534
2009/05/26(火) 02:12:18C:\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は一度作り直してみました。
0574デフォルトの名無しさん
2009/05/26(火) 02:12:43ilink32 bmp.obj w2b.obj ,myexe.exe か
でもbcc32.exe からやっても同じみたいだね
0575534
2009/05/26(火) 02:13:550577デフォルトの名無しさん
2009/05/26(火) 02:16:40-e bmp.exe と余分なスペースを入れるからだよ
-ebmp.exe としる
0579デフォルトの名無しさん
2009/05/26(火) 02:19:02えーと、プログラミングってどういうものかわかってる?
0580デフォルトの名無しさん
2009/05/26(火) 02:21:20それでいいんだよ
プログラムbmp.cに誤りがあるって事だ
0581534
2009/05/26(火) 02:21:44よくわかってないかも…
ちなみに、myexe.exe実行してみたら、
C:\***\myexe.exeは有効な Win32 アプリケーションではありません。
ってエラーが出た。
0582デフォルトの名無しさん
2009/05/26(火) 02:23:42そりゃそうだろ
リンクエラー起きてるんだからまともなexeが出来てるはずがない
0583デフォルトの名無しさん
2009/05/26(火) 02:28:50エディタで開くと改行がスペースに軒並み化けやがって
unixのviでも使って編集したろ
まあCコンパイラはこのようなソースでもちゃんと認識して
コンパイルできるが、人間が読むと可読性が著しく損なわれる
0585デフォルトの名無しさん
2009/05/26(火) 02:31:10そりゃそうだ。
コンパイラにgcc使ってるんだから。
0586デフォルトの名無しさん
2009/05/26(火) 02:33:21Cと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で保存してみろ
0587534
2009/05/26(火) 02:46:06ilink32 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ができたので実行したら、強制終了になる。
0588デフォルトの名無しさん
2009/05/26(火) 02:51:05よしよしいい所まできたぞ
あとは bmp.h のバグを取るだけだ
_Bmp_headbufは配列で bmp.h で定義されている
宣言でなくて定義だ
だから名前がかち合ってリンカエラーが出る
こういう場合はインクルードガードを使ってどちらか一方だけで
定義されるようにし、もう一方では extern によって宣言するだけに
しなければならない
要するに bmp.h を書いた奴はアホだという事です
0589534
2009/05/26(火) 02:57:430590デフォルトの名無しさん
2009/05/26(火) 02:58:260591デフォルトの名無しさん
2009/05/26(火) 03:01:44厳密にはそうだな
"One definition rule"に従って欲しいのだ
同じ名前の配列が複数あると、どれを取ればいいのかリンカが
悩んでエラーを吐くわけだから、それを解決してやればよい
あとはわかるな
俺そろそろ寝る
0593デフォルトの名無しさん
2009/05/26(火) 03:08:59要するにどのファイルからも bmp.h をインクルードしてて、
bmp.h の中で配列とか変数を定義してるので、同じ配列
や変数がかち合ってエラーが出るわけだ
したがって例えば bmp.h をインクルードする前に my.h などを
インクルードするようにし、my.h の中に #define DEFINITION 1
とか書いて、その時だけ配列や変数が定義されるように bmp.hを
書き換える
次に my.h をインクルードしない時は代わりに extern に置き換わる
ようにしてやる
マクロの仕事だ
まずは extern については勉強が必要
0594534
2009/05/26(火) 03:19:27そうなのか…なんか大変そうだ…
とりあえず、bmp.hを#ifndefとかで囲んで
かちあってたのの頭にexternつけて、
bcc32 -e〜でコンパイルしたら、
Warningはなくなったけど、
_Bmp_info_sizeとかが、外部シンボルが未解決になった
0595デフォルトの名無しさん
2009/05/26(火) 05:44:33大変なことになってる理由は、その bmp.h 自体がポンコツだからだよな。
もっとまともなライブラリを使えば、こんな苦労はしなくて済むのだ。
とはいえ、まともなライブラリを探すのも面倒だろうし、俺もちょっと今から詳しく見てアドバイスしてみるよ。
0596デフォルトの名無しさん
2009/05/26(火) 05:48:23でも、それくらいは理解できないと正直なところ辛いと思うよ。
0597デフォルトの名無しさん
2009/05/26(火) 05:52:39bmp.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[];
など。
これでいけるはず。テストしてないけど。
0598デフォルトの名無しさん
2009/05/26(火) 05:59:220599デフォルトの名無しさん
2009/05/26(火) 06:08:32img型のサイズが大きすぎて、スタック上に自動変数として置こうとするとスタックオーバーフローで落ちるっぽい。
思いっきり環境依存な話っぽいが。少なくとも俺の環境ではそんな感じだ。
0600デフォルトの名無しさん
2009/05/26(火) 06:11:27>>534のHPの最下部にある参考文献のところのように
ヘッダ部分を見やすくするための構造体がbmp.hにはいってるんだろうなと
思ったら変数がそのまんま定義されてやんの。
そりゃbmp.hを取り込んだソースで競合がおきるわな。
0601デフォルトの名無しさん
2009/05/26(火) 06:13:23つくりが悪すぎる
固定サイズでピクセル情報部分を持ってる
typedef struct {
long height;
long width;
color data[MAXHEIGHT][MAXWIDTH];
} img;
#define MAXWIDTH 1000 /* 幅(pixel)の上限 */
#define MAXHEIGHT 1000 /* 高さ(pixel) の上限 */
これだけでも糞だよ
ヘッダ関連の情報もなんで構造体で管理せずにこんなことしてるのかもわからねーし
0602デフォルトの名無しさん
2009/05/26(火) 06:13:53手っ取り早い解決策は bmp.hの MAXWIDTH と MAXHEIGHT の数字を小さくすること。
両方とも500くらいにすればよかろう。他のところをいじらなくても、俺の環境ではこれで問題なく動作した。
ただ、もちろんこれだと巨大な画像が扱えなくて困るだろうから、別の解決策としては
スタック上ではなくヒープに確保することだな。(mallocを使うということだ)
0603デフォルトの名無しさん
2009/05/26(火) 06:15:59↑このHPは参考にするな。ここがリンクしてる↓で勉強しろ
http://www.kk.iij4u.or.jp/~kondo/bmp/
0604デフォルトの名無しさん
2009/05/26(火) 06:16:26車輪の再発明は良くないが、不良品の車輪を使うのは面倒だ。
特に、知識や経験の少ない人にとってはね。
0605デフォルトの名無しさん
2009/05/26(火) 06:20:53typedef struct tagBITMAPFILEHEADER {
unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
} BITMAPFILEHEADER
これがそのままだとおそらくアライメントの関係でそのままでずれるからそこだけ注意
0606デフォルトの名無しさん
2009/05/26(火) 06:21:49これがそのままだとおそらくアライメントの関係でbfSizeの開始位置が2バイトずれるから
0607デフォルトの名無しさん
2009/05/26(火) 06:22:16bmp.h にグローバル変数の定義(宣言ではなく)を書いて、それが複数の翻訳単位でインクルードされちゃってると、
定義が複数あるからまずいんだよね?
でも、それを g++ で処理したら多重定義エラーになるが、gcc で処理したらエラーにならずに
ちゃんと動く実行ファイルが出来上がっちゃったんだ。
俺、普段はC++を使ってるからC自体は実はよく知らないんだが、これCだと認められちゃったりするの?
0608デフォルトの名無しさん
2009/05/26(火) 06:26:36bmp.hを取り込んだソースのうち片方は使ってないんじゃないの?
なんでわざわざヘッダに入れたかわからないbmpヘッダに関連する変数を
0609デフォルトの名無しさん
2009/05/26(火) 06:29:36CとC++は変数の定義ルールが異なる
デフォルトでスコープはローカル
0610デフォルトの名無しさん
2009/05/26(火) 06:30:00テスト用のプログラム載せるなよ
0611デフォルトの名無しさん
2009/05/26(火) 06:31:15そうだったのか。ありがと。
0612デフォルトの名無しさん
2009/05/26(火) 06:31:50大学と個人の名前でてるけど教授か何かか?
こんな程度のプログラムしかできないのが偉そうにHPに公開しててOKなんだな
0613デフォルトの名無しさん
2009/05/26(火) 06:37:290614デフォルトの名無しさん
2009/05/26(火) 06:38:59よくあること
未定義とかその手はよく伸びます
0615デフォルトの名無しさん
2009/05/26(火) 07:03:040616デフォルトの名無しさん
2009/05/26(火) 07:10:13違うだろ
C++でデフォルトでローカルスコープなのはconst変数だけだよ
0617デフォルトの名無しさん
2009/05/26(火) 15:51:53http://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型の結果がおかしくなるのはなぜなのでしょうか?
0618デフォルトの名無しさん
2009/05/26(火) 15:56:53精度の問題ってやつではないですか。
0619デフォルトの名無しさん
2009/05/26(火) 16:18:42すごい端的にいうと
float型に0.1を入れると実際には
0.09999999..... に近い形になってる, つまり微妙に誤差がある
0620617
2009/05/26(火) 16:19:480621デフォルトの名無しさん
2009/05/26(火) 16:26:17はい、そのとおり。
0622デフォルトの名無しさん
2009/05/26(火) 17:35:18誤解を招きそうだ
doubleにも誤差はあるからね
floatの有効桁数がせいぜい7桁(10進で)ってこと
0623デフォルトの名無しさん
2009/05/26(火) 22:19:03{
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になります なぜ?
0624デフォルトの名無しさん
2009/05/26(火) 22:24:091/2/10は0だし、countが10未満ならcount/10も0
0625デフォルトの名無しさん
2009/05/26(火) 22:32:34BohYoh.com−C/C++ FAQ 整数値の平均を実数で求めようとしてもうまくいかないのはどうしてですか。
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00097.html
ここ読んでみ。
0626デフォルトの名無しさん
2009/05/26(火) 22:36:320627デフォルトの名無しさん
2009/05/26(火) 22:53:20浮動小数点はdoubleで事足りるのにfloatがあるの?
0628デフォルトの名無しさん
2009/05/26(火) 23:00:43メモリ使用量が減らせる
0629デフォルトの名無しさん
2009/05/26(火) 23:20:430630デフォルトの名無しさん
2009/05/26(火) 23:22:27組み込み系だとdoubleは遅いよ
doubleでも速度が落ちないプロセッサばかりじゃないので
0631デフォルトの名無しさん
2009/05/26(火) 23:57:140632デフォルトの名無しさん
2009/05/27(水) 00:33:430633デフォルトの名無しさん
2009/05/27(水) 04:01:37使い分けを知らんとは、あんたド素人だな?
0634デフォルトの名無しさん
2009/05/27(水) 05:04:49として,文字列を読み込みたいんですがwrd[][]の括弧の中の記述をどうしたらよいかわかりません。
wrd[0][0]が,txtファイルの1行目1文字目,wrd[0][1]を1行目2文字目という形を取りたいんです。
最終的には,wrdで読み取った最後の改行部分にNULLを代入したいのですが。
どうやったら良いかご教授願えませんでしょうか。
素人な質問で申し訳ないです…。
0635デフォルトの名無しさん
2009/05/27(水) 05:07:360636デフォルトの名無しさん
2009/05/27(水) 05:19:28望んだ仕様になるXXXfgets関数を作れば良いだろう
0637デフォルトの名無しさん
2009/05/27(水) 05:32:40関数は既存の規定されているfgetsで読み込み,後にASCIIコード順にソートを行う
ということで文字列の最後はNULLにして,上記の形を用いるように指定されているので…。
課題なんで,指定以外の形をとるわけにもいきませんし…
0638デフォルトの名無しさん
2009/05/27(水) 06:26:270639デフォルトの名無しさん
2009/05/27(水) 06:35:09ご迷惑おかけいたしました。
0640デフォルトの名無しさん
2009/05/27(水) 06:56:59#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;
}
ほらよ
0641デフォルトの名無しさん
2009/05/27(水) 08:19:570642デフォルトの名無しさん
2009/05/27(水) 12:27:14おすすめのエディタとかありますか?
0643デフォルトの名無しさん
2009/05/27(水) 12:29:04VS2005かVS2008の無料のやつ
もしくは秀丸
0644デフォルトの名無しさん
2009/05/27(水) 13:14:530645デフォルトの名無しさん
2009/05/27(水) 14:00:56(フリーウェアは原則使用禁止な会社は存在する)
0646デフォルトの名無しさん
2009/05/27(水) 14:02:220647デフォルトの名無しさん
2009/05/27(水) 14:13:060648デフォルトの名無しさん
2009/05/27(水) 14:26:402 #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
0649デフォルトの名無しさん
2009/05/27(水) 14:30:3731 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 }
0650デフォルトの名無しさん
2009/05/27(水) 14:40:14gcc 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
関数を使ってプログラムを動かすと、ちゃんと動きました。
どなたか教えてくれないでしょうか?
0651デフォルトの名無しさん
2009/05/27(水) 14:42:48libmをリンクしないと
0652デフォルトの名無しさん
2009/05/27(水) 14:44:020654デフォルトの名無しさん
2009/05/27(水) 14:54:58makefileのlibを設定するところに -lm とか-libmとか書いてないので
math.hので宣言されてる関数が無いとgccが怒ってる
0655デフォルトの名無しさん
2009/05/27(水) 14:55:440656デフォルトの名無しさん
2009/05/27(水) 14:58:10///)
/,.=゙''"/
/ i f ,.r='"-‐'つ____ gcc object.c -o object -lm って言っときゃいいんだよ!!
/ / _,.-‐'~/⌒ ⌒\
/ ,i ,二ニ⊃( ●). (●)\
/ ノ il゙フ::::::⌒(__人__)⌒::::: \
,イ「ト、 ,!,!| |r┬-| |
/ iトヾヽ_/ィ"\ `ー'´ /
0657デフォルトの名無しさん
2009/05/27(水) 15:01:16そうですね。思い出しました!!
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をつけなくても動きます。不思議です。調べてみます。
0658デフォルトの名無しさん
2009/05/27(水) 15:08:02回答ありがとうございます。
0659デフォルトの名無しさん
2009/05/27(水) 15:22:54libほにゃらら.so
とか
libほにゃらら.a
というファイル名だ
それをリンクするのに
-lほにゃらら
をつける
libm.soをリンクするのが-lmになる
0660デフォルトの名無しさん
2009/05/27(水) 15:28:59環境は同じ?
cygwinだと >>648-649 のプログラムも-lm無しでコンパイル通ったよ。
(cygwin1.dllにpow()があるため)
0661デフォルトの名無しさん
2009/05/27(水) 15:32:18最適化で消えるんだろうな
0662デフォルトの名無しさん
2009/05/27(水) 15:33:330663デフォルトの名無しさん
2009/05/27(水) 15:34:520664デフォルトの名無しさん
2009/05/27(水) 15:38:100665デフォルトの名無しさん
2009/05/27(水) 15:56:01>>648-649と>>657 は同じ環境でコンパイルしています。
みんなとても詳しいですね...専門用語がさっぱり分かりません。
色々調べてみます。
0666デフォルトの名無しさん
2009/05/27(水) 16:00:410667デフォルトの名無しさん
2009/05/27(水) 16:15:07引数がリテラル(定数)であるとうまくいくわけではないようです。試しに
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をリンクしてなくていいのかが不思議です。
0668デフォルトの名無しさん
2009/05/27(水) 16:27:04整数乗が確定してれば 単純に整数回の掛け算に置き換えられるからかもね
浮動小数乗の場合だと リテラル演算とはいえアルゴリズム経由しないとリテラル値にならないわけだし
0669デフォルトの名無しさん
2009/05/27(水) 16:28:20整数だったら単純にループにおきかえれるとか?
右側が整数なら
左側を右の回数だけ乗算するループにおきかえれそうだし。
0670デフォルトの名無しさん
2009/05/27(水) 16:29:270671デフォルトの名無しさん
2009/05/27(水) 16:37:35>>669
なるほど。
話が変わるのですが>>660さんとは違いpow関数は僕の場合はlimb.soをリンクしないといけない。
引数が整数でも、整数ではなくてもpow関数を使っているわけですよね?
なのにlimb.soをリンクしなくてもいい場合があるのはなぜなんでしょうか?
0672デフォルトの名無しさん
2009/05/27(水) 16:40:40呼び出してないんだから当然リンクエラーも出ない。
0673デフォルトの名無しさん
2009/05/27(水) 16:40:55環境の違いってことで あまり深く考えない
0674デフォルトの名無しさん
2009/05/27(水) 16:43:19gccの最適化の中で関数を呼び出すまでも無く代替計算式におきかえれる場合は
pow関数を使わないのでリンクしない。そのためエラーにならない。
この辺の基準はgccのみぞ知るなんで、確実に把握したければ
条件を変えて自分で試すしかない。
0675デフォルトの名無しさん
2009/05/27(水) 16:44:27powを呼び出していないのに階乗の計算をどうやってしているのでしょうか?
>>671さんの言う通り現時点では深く考えないほうがいいのかもしれません。
0676デフォルトの名無しさん
2009/05/27(水) 16:52:170677デフォルトの名無しさん
2009/05/27(水) 16:54:05pow(a, 3)
をコンパイラが最適化して
a * a * a
に置き換えてコンパイルしている
0678デフォルトの名無しさん
2009/05/27(水) 16:54:29なるほど。
例えばpow(2,3)なら2 * 2 * 2,pow(0.1,3)なら0.1 * 0.1 * 0.1と置き換えられるから
powを呼んでいないという訳ですね。
答えてくださった皆さん有難うございました。
0679デフォルトの名無しさん
2009/05/27(水) 16:58:38習いました。ただpowを呼ばない場合、
そのn乗をループさせるプログラムをどこから手に入れているのかを
疑問に思いましたが>>677さんの言う通りに最適化されていることを知りました。
0680デフォルトの名無しさん
2009/05/27(水) 21:25:05使用メモリ量がどんどん上昇します
メモリを確保してるのに開放していないところがあると思うのですが、
いったいどこで漏れている(開放し忘れている)か分かる方法ってありますか?
開発環境:VisualStudio2008
言語:C
知識:普通のプログラムを書いてCtrl+F5でデバッグ実行するくらいで他の知識はない
よろしくお願いします。
0681デフォルトの名無しさん
2009/05/27(水) 21:27:260682デフォルトの名無しさん
2009/05/27(水) 21:36:36すみません、F5を押してもプログラム自体は動くのでエラーが
出ることなく実行できてしまいます。
本当に知識がないのですが…ブレークポイントか言われるものをつかうのでしょうか?
0683デフォルトの名無しさん
2009/05/27(水) 21:47:38地道に・・・
malllocで確保したヒープのアドレスとfreeしたアドレスをファイルにfprintfでダンプする。
ダンプした内容をチェックしてfreeもれがあるかどうか調べる。
0684デフォルトの名無しさん
2009/05/27(水) 21:51:03余裕があればmalloc/freeのラッパ関数をつくってみるのも一興です。
0685682
2009/05/27(水) 21:53:570686デフォルトの名無しさん
2009/05/27(水) 21:58:53「ダンプ」は不適切だったかな?
「ファイル出力」でいいです。
ダンプの意味はメモリーダンプでぐぐってくれ。
0687デフォルトの名無しさん
2009/05/27(水) 22:46:12終了時に出力ウィンドウにいろいろ出るだろう
0688デフォルトの名無しさん
2009/05/27(水) 22:50:400689デフォルトの名無しさん
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するにはどうしたらいいのでしょうか?
0690デフォルトの名無しさん
2009/05/27(水) 22:55:48testを呼び出した関数でfreeする。
0691デフォルトの名無しさん
2009/05/27(水) 23:00:08どんだけ入門者なんだよw
と思ったらここは入門者スレだったか。
じゃあいいのか。
0692デフォルトの名無しさん
2009/05/27(水) 23:23:32{
double *data = (double*)calloc(size, sizeof(double));
・
・
・
return (data);
}
int main()
{
double *a;
a=test();
free(a);
}
こういうことでしょうか?
みなさまありがとうございました。
0693デフォルトの名無しさん
2009/05/27(水) 23:23:54ベターかと。
C/C++のmalloc/free(new/delete)問題はかなりやっかい。
一般論が無い。
Javaである程度の構造を持ったプログラムがかける
ようになってからのステップでやるべきことで
Javaの初歩よりずっと高度な話になってくるし。
0694デフォルトの名無しさん
2009/05/27(水) 23:26:13環境による.malloc(2)を読め.
例えば*BSDなら,アクセスするとSEGVになる,サイズが0のオブジェクトへのポインタが返る.
0695デフォルトの名無しさん
2009/05/27(水) 23:30:43リソースの確保と解放っていう意味では、大抵の言語で使われるテクニックだよ。
0696デフォルトの名無しさん
2009/05/27(水) 23:42:21dll内で何かの関数コールして、自分自身のファイル名を取得したい。
簡単に出来るかと思いきや、3時間調べてもわからんかった。
exeの名前なら簡単に取れるんだが。
Linuxのlib〜.soでも同じようにファイル名取得出来ると更に嬉しい。
0697デフォルトの名無しさん
2009/05/27(水) 23:45:42GetModuleFilename
に DllMain で貰ってきたハンドルを渡す
0698デフォルトの名無しさん
2009/05/27(水) 23:53:33ありがとう
やっぱりそれが一番手っ取り早い?
DllMain 使いたく無いんだが、何か良い方法ないかな。
後出しでスマン
0699デフォルトの名無しさん
2009/05/28(木) 00:59:33複数のDLL使ってたらどのDLLかをどうやって特定するよ
列挙して全部出す手もあるけど、使いたくないというのが意味わからん
0700デフォルトの名無しさん
2009/05/28(木) 01:08:46CでDllを書く限り、ソースコード直書き__FILE__(マクロ)に勝る方法は無いと思われ
0701デフォルトの名無しさん
2009/05/28(木) 01:09:520702デフォルトの名無しさん
2009/05/28(木) 05:07:16>C/C++のmalloc/free(new/delete)問題はかなりやっかい。
>一般論が無い。
確かに。
仕事でやるなら先輩もしくは配属先でどういうルールにしてるか確認。
個人で作ってるプログラムなら自分で決める。
C/C++はコンパイルにおける最低限のルール以外は自由にあれこれできるの
がいい点であり大変な点でもある。
0703デフォルトの名無しさん
2009/05/28(木) 12:20:32初期開発者のスキルやその場の状況や見込みで決まってしまっている部分も
大きい。だからこそ難しいわけ。
0704デフォルトの名無しさん
2009/05/29(金) 09:19:03皆さんはどのようなツールを使われてますか?
0705デフォルトの名無しさん
2009/05/29(金) 09:22:450706>>704
2009/05/29(金) 09:26:00windows上で動くツール限定としておくべきでした。
0707デフォルトの名無しさん
2009/05/29(金) 09:30:10gprofなどのプロファイラで動的解析。
必要なら、vtuneでリアルタイム解析。
0708デフォルトの名無しさん
2009/05/29(金) 10:08:10元の開発者との人脈
0710デフォルトの名無しさん
2009/05/29(金) 10:38:55>707
0712デフォルトの名無しさん
2009/05/29(金) 10:44:14gprofに言及するのもどうかと。
0713>>704
2009/05/29(金) 12:52:09お付き合いいただいてありがとうございます。
いろいろ設定関連ではまって検証に時間がかかってしまいました。
graphviz + doxygen はいいですね。
これでいこうと思います。
0714デフォルトの名無しさん
2009/05/29(金) 16:16:11教えてえろいひと。
char *hoge[] = {
[5] = "baka",
[11] = "aho",
[100] = "nuko"
}
0715デフォルトの名無しさん
2009/05/29(金) 16:22:52ないあるよ
0716デフォルトの名無しさん
2009/05/29(金) 16:23:39今のCの規格ならできますよ。旧式のおんぼろコンパイラだと駄目かも。
0717デフォルトの名無しさん
2009/05/29(金) 17:00:29おんぼろコンパイラとは何だ
VS2008がおんぼろだと言いたいのか
だいたいC99に100%対応しているコンパイラなんて
数えるほどしかないんだが
gccですら部分的対応だし
0718デフォルトの名無しさん
2009/05/29(金) 17:07:51そんな軽口に噛み付く人って・・・・
0719デフォルトの名無しさん
2009/05/29(金) 17:08:010720デフォルトの名無しさん
2009/05/29(金) 17:18:14言葉に気を付けろと言っているんだ
現実を見ろ
0721デフォルトの名無しさん
2009/05/29(金) 17:21:53まぁまぁ落ち着いて
0722デフォルトの名無しさん
2009/05/29(金) 17:23:25はぁ?ふざけんな死ね
0723デフォルトの名無しさん
2009/05/29(金) 17:23:27何がまあまあ落ち着いてだ
自分で怒らせておいて
0724デフォルトの名無しさん
2009/05/29(金) 17:44:300725デフォルトの名無しさん
2009/05/30(土) 06:35:09標準にならないかな…
0726デフォルトの名無しさん
2009/05/30(土) 07:47:32名前の競合は、ネーミングルールで実用上困ったことはないし、
ローカルスコープ限定で同じ名前を使いたい場合も static で十分。
1ファイルに1関数、というような制限のあるプロジェクトだと
staticじゃ不十分だろうけど
0727デフォルトの名無しさん
2009/05/30(土) 07:59:34この際2ch有志でC99コンパイラ作れや
0728デフォルトの名無しさん
2009/05/30(土) 08:14:28いやどす
というかプログラマ適正を見る際の初期の目安に最適じゃん
C99に固執するやつ->向いてねえ
0729デフォルトの名無しさん
2009/05/30(土) 10:05:07>>716みたいにC89コンパイラを「おんぼろコンパイラ」と呼ぶアホまで
現れる始末だぜ
明らかにゆとりだよな>>716は
0730デフォルトの名無しさん
2009/05/30(土) 10:11:48別におかしくないし貶してる事にはならんと思うぞ。
0731デフォルトの名無しさん
2009/05/30(土) 10:35:21その例えはちょっとおかしいな
C99コンパイラが全盛ならその例えもわかる
だけど現存するC99完全準拠コンパイラなんて
本当に限られてるんだぜ
Intel C++とか
0732デフォルトの名無しさん
2009/05/30(土) 10:37:470733デフォルトの名無しさん
2009/05/30(土) 10:38:40でなければ無駄。
こんな見極めもできないゆとりがおんぼろ呼ばわりするな。
0734デフォルトの名無しさん
2009/05/30(土) 10:45:03Macに何かあったみたい
0735デフォルトの名無しさん
2009/05/30(土) 10:48:27おんぼろとか言ってるやつは無理無茶をいうエンドユーザーと一緒だろ。
お金くれないけど機能追加だけいう痛いエンドユーザー。
こんなこともわからないやつは開発者にいらねえ
0736デフォルトの名無しさん
2009/05/30(土) 10:56:28>お金くれないけど機能追加だけいう痛いエンドユーザー。
wwwww
0737デフォルトの名無しさん
2009/05/30(土) 11:32:54もっと高級なスクリプト言語でもやってろ。
0738デフォルトの名無しさん
2009/05/30(土) 11:41:10C89にこだわってる奴が痛くないか?
0739デフォルトの名無しさん
2009/05/30(土) 11:45:57頭を切り替えてC89でコーディング->普通
頭を切り替えできずコンパイラをこき下ろす->開発者に向いてない
それだけ
0740デフォルトの名無しさん
2009/05/30(土) 11:59:100741デフォルトの名無しさん
2009/05/30(土) 15:49:17C89以上のものを望むならC++で
0742デフォルトの名無しさん
2009/05/30(土) 16:05:030743デフォルトの名無しさん
2009/05/30(土) 16:12:55My_Type foo();
だね。1つにまとめるなら
typedef int (*foo())(int , int);
0744743
2009/05/30(土) 16:13:37int (*foo())(int , int);
か
0745デフォルトの名無しさん
2009/05/30(土) 16:14:390746デフォルトの名無しさん
2009/05/30(土) 16:15:360747デフォルトの名無しさん
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;
}
0749デフォルトの名無しさん
2009/05/30(土) 16:29:46素直にtypedefしたほうが身のためのようですね
0750デフォルトの名無しさん
2009/05/30(土) 17:49:00typedef int myfn_t(int, int);
myfn_t *foo();
の方が読みやすい。
見た目で「関数へのポインタ」が出ないで
「何らかのポインタを返す関数」があって、その何らかが関数、という形だから。
見た目だけだけど。
C++のメンバ関数なら仕方ないけどね。
0751743
2009/05/30(土) 23:15:42別に俺は
わかりやすさのためにtypedefしたわけではなく
説明のためだったんだが。
まあとにかく>>750のが分かりやすいことには俺も同意するがね。
0752デフォルトの名無しさん
2009/05/31(日) 03:53:30いきなりCじゃ書けない。
ターパスならこんな苦労しないのに
0753デフォルトの名無しさん
2009/05/31(日) 08:06:36プリプロセッサ使えばいいのに
0754デフォルトの名無しさん
2009/05/31(日) 17:45:59この場合、どうしたら良いのでしょうか?
0755デフォルトの名無しさん
2009/05/31(日) 17:52:04せめてtypedef使って下さい…
0756デフォルトの名無しさん
2009/05/31(日) 17:52:43cronでぐぐってください
0757デフォルトの名無しさん
2009/05/31(日) 17:54:32まぁ標準Cでやるっていうなら
time.hにあるclock() の値を使って、
無限ループの中から0.5秒ごとに出力だね
0758デフォルトの名無しさん
2009/05/31(日) 18:09:000759デフォルトの名無しさん
2009/05/31(日) 18:09:500760デフォルトの名無しさん
2009/05/31(日) 18:17:310761デフォルトの名無しさん
2009/05/31(日) 18:20:38ご指摘はそのとーり
>>758
それができるならそっちのがいいわ
0763デフォルトの名無しさん
2009/05/31(日) 18:50:22あるんじゃね?
かといってsignalは可用性なさそうだから嫌だけど
0764デフォルトの名無しさん
2009/05/31(日) 19:11:50(OpenWaitableTimer/SetWaitableTimer)
WaitForSingleObject関数でにシグナル状態を待つ。
0765デフォルトの名無しさん
2009/05/31(日) 19:58:20たいがいの環境で使えるし。
正確さが必要なら、sleepする時間を微調整するとかいろいろ方法はあるし。
0766デフォルトの名無しさん
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]);
}
0767デフォルトの名無しさん
2009/05/31(日) 21:17:050768デフォルトの名無しさん
2009/05/31(日) 21:18:200769デフォルトの名無しさん
2009/05/31(日) 21:19:25いいえ。
0770デフォルトの名無しさん
2009/05/31(日) 21:21:51FFは-1ですが
unsigned charの場合
255です
0771デフォルトの名無しさん
2009/05/31(日) 21:24:47別にソートアルゴリズムの内容なんて知らなくても大抵は大丈夫だろ
なにやる人か知らんけど
むしろ各ソートの性質をかるく知っとけ
安定ソートとかオーダーとか
0772デフォルトの名無しさん
2009/05/31(日) 21:50:36ゲームプログラムを趣味でしたいだけ。
ポインタも微妙なんだけど、コレぐらい分かってれば良いの?
それとも関数ポインタまで抑えておくべき?
#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);
}
0773デフォルトの名無しさん
2009/05/31(日) 21:59:27ゲームなら、関数ポインタを使う場面は結構あると思う。
0774デフォルトの名無しさん
2009/05/31(日) 22:00:24関数ポインタはちょっと手の込んだアルゴリズムではよくつかいますよ。qsort() とか。
0775デフォルトの名無しさん
2009/05/31(日) 22:13:35int型の配列のアドレスを関数の引数に渡す方法が違うのかしら。
でも確か先頭のアドレスを渡せば全部参照してくれたと思ったけど、どなたか教えてください。
#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;
}
}
}
}
0776デフォルトの名無しさん
2009/05/31(日) 23:07:390777デフォルトの名無しさん
2009/05/31(日) 23:21:14for (i = 0; i < 10; i++) tes[i] = &a[i];
...
datasort(tes[i]);
とやらないと、tes[i]が指す先の内容が何か分からないので
未定義の動作になってしまう
0778デフォルトの名無しさん
2009/06/01(月) 14:28:01void func1(){
printf("hello world\n");
}
int main(){
printf("%d \n", sizeof(func1));
return 0;
}
プリントされる値は1なんですが、これはなんで1バイトなのしょうか?
(関数は256個以上定義できない??)
0779デフォルトの名無しさん
2009/06/01(月) 15:00:28VC++だとエラーになってコンパイルできませんでした
sizeof オペランドが正しくありません。
0780デフォルトの名無しさん
2009/06/01(月) 15:21:47だめみたいですか。
gccだと通るんですが。。
0781デフォルトの名無しさん
2009/06/01(月) 15:23:46ポインターのサイズを求めたいのか・・・・
関数の数なんて上限きまってないはずだよ。
0782デフォルトの名無しさん
2009/06/01(月) 15:35:48お前は何のサイズが欲しいんだ。
関数ポインタの大きさなら sizeof &func
戻り値の大きさなら sizeof func()
0783デフォルトの名無しさん
2009/06/01(月) 16:07:52アドレスサイズは4バイトのはずなのに、なぜ、sizeof(func)で
1バイトと表示されるのかが分かりません。
0784デフォルトの名無しさん
2009/06/01(月) 16:21:440785デフォルトの名無しさん
2009/06/01(月) 16:22:42未定義動作ってやつじゃないの
1と表示してもいいしエラーにしてもいい
0786デフォルトの名無しさん
2009/06/01(月) 16:24:12sizeof( void )は0だったよ
0787デフォルトの名無しさん
2009/06/01(月) 16:27:360788デフォルトの名無しさん
2009/06/01(月) 16:29:34ちげーよ死ね
0789デフォルトの名無しさん
2009/06/01(月) 16:59:11おれの環境ではsizeof( void )は1だよ。
>>785が指摘しているように、
サイズが求められないものに対しては処理系依存なんじゃない?
0790デフォルトの名無しさん
2009/06/01(月) 20:23:45void *p = xxx;
p++;
というコードが通るコンパイラ(オプション依存)の動作を
標準Cの挙動と勘違いしないように。
0791デフォルトの名無しさん
2009/06/01(月) 20:41:130792デフォルトの名無しさん
2009/06/01(月) 21:05:27いまのところはゲーム作りで経験値稼ぎ&ランニングで体力作りをやってます
0793デフォルトの名無しさん
2009/06/01(月) 21:08:44マ板にいってみろ
0794デフォルトの名無しさん
2009/06/01(月) 21:09:26ゲーム作りって何やってるのか分からないが、
とりあえず覚悟を決めることが必須。
険しい道のりであることは否めない。
途中で諦めると使えないゴミが完成するので、それだけは避けるべく覚悟が必要。
まあC/C++に限らず、
というかプログラマに限らず、
どの職業でもこれは同じだろうけど。
0795デフォルトの名無しさん
2009/06/01(月) 21:29:470796デフォルトの名無しさん
2009/06/01(月) 21:48:51途中で諦めちゃった使えないゴミさんですか?
人生 お疲れ様ですwww
0797デフォルトの名無しさん
2009/06/02(火) 00:00:44脳内補完が進みすぎているようだ
これでは保守はむり
0798、
2009/06/02(火) 17:54:40char Buff[2];
if(Buff[0]=="\n"){
処理
}
これだとエラーが出ます。strcmpだと実行時、例外エラーがでます。やりたいことは、配列の特定の所に改行が入ったらという条件文を作りたいです。お願いします。
0799デフォルトの名無しさん
2009/06/02(火) 17:58:02'\n'
0800デフォルトの名無しさん
2009/06/02(火) 17:58:10charとchar*って違うんだよね☆
0802質問!
2009/06/02(火) 23:23:240803ダメ!絶対!
2009/06/02(火) 23:27:470804質問!
2009/06/02(火) 23:38:11やっぱC辞めてJava逝ってきますノシ
0805デフォルトの名無しさん
2009/06/03(水) 08:28:350806デフォルトの名無しさん
2009/06/03(水) 14:06:58なモードでfopen()すると良いのでしょうか。
既にファイルがある場合はそのファイルを消さずにデータを追加したく、
なおかつ既存の部分の上書きもしたいです(当然読み込みもしたい)
0807デフォルトの名無しさん
2009/06/03(水) 14:11:21http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fopen.3.html
とか
0808806
2009/06/03(水) 14:34:23ありがとうございます。
1.ファイルが存在しない場合は空ファイルをまず作って閉じる。
2.モード "r+b" でfopen()する。
で目標の動作ができそうです。
ありがとうございました。
0809デフォルトの名無しさん
2009/06/03(水) 14:56:190810デフォルトの名無しさん
2009/06/03(水) 14:57:330811デフォルトの名無しさん
2009/06/03(水) 14:58:19残念、"a+"では追記しかできないんだな。
0812806
2009/06/03(水) 15:24:16それが一番よさそうですね。そうします。
a+ の失敗を「からだで学んで」いました…。
fseek() 、fwrite() 後の ftell() の戻り値を確認しながら、
「???」となっていました。
0813、
2009/06/03(水) 15:44:58printfの...ってどういう意味ですか?
0814デフォルトの名無しさん
2009/06/03(水) 15:46:070815sage
2009/06/03(水) 15:50:41可変個引数のことだったと思います。
0816デフォルトの名無しさん
2009/06/03(水) 15:51:500817813
2009/06/03(水) 16:08:500818デフォルトの名無しさん
2009/06/03(水) 16:09:33宿題スレにいけ
0819デフォルトの名無しさん
2009/06/03(水) 16:10:09つ[man stdarg]
0820デフォルトの名無しさん
2009/06/03(水) 16:24:34printf のフォーマットを完全サポートするつもりなのか?
それなら vsprintf 経由でバッファに書き込んだほうが現実解っぽいけど?
>の引数をどのように、展開し
va_arg() で抜き出す
>文字データに組み込むかわかりません
値の可視文字化のフルスクラッチ実装は難易度がかなり高いと思われ…
sprintf 呼び出しで茶にごすか?
# VC2005EE って CRTのソースインストールできたっけ?
# printf の一部分ぐらいは見れると思うけど 追っかけるの面倒だわ
0821デフォルトの名無しさん
2009/06/03(水) 16:28:31スコット・メイヤーズというえらい人も
「Effective C++の初版ですまぽを公開した時は
プロの開発者に散々チェックしてもらったけど
その後何年もエラー報告が届いたよ〜」
と嘆いていらっしゃった。
今では「boost使ったら?」と笑顔で書いている。
0822813
2009/06/03(水) 16:33:160823デフォルトの名無しさん
2009/06/03(水) 16:36:380824デフォルトの名無しさん
2009/06/03(水) 16:36:40…ただし、言語仕様のところは全部英語だけど。
(C#、VB、C++/CLIなどは完全日本語化されている)
先日MSKKはMSDNの日本語化を積極的に勧めるって発表してたけど
MSKKの仕事の遅さは折り紙つきだから
CやC++の言語仕様のところが日本語化されるのは1000000年後くらいじゃないかなぁ。
っていうか、いい加減C99に対応しろよ。いつまでC89で行くつもりだよ。
0825デフォルトの名無しさん
2009/06/03(水) 16:41:18社内で作った組み込み用OSに自作 printf() 、自作 malloc() などの
コードがいろいろあった気がする。内容はもう忘れちゃった。
(printf()の出力はシリアル出力に出てきてデバッグに使用する)
0826デフォルトの名無しさん
2009/06/03(水) 16:45:05コンパイラ・実行環境の都合上、標準関数はまず使えない ってこと?
それはそれで大変な作業だね (社内標準化されてて これ使え になってりゃ良いけど)
0827デフォルトの名無しさん
2009/06/03(水) 16:51:180828デフォルトの名無しさん
2009/06/03(水) 16:52:11組み込みの場合ディスプレイ付きじゃない場合もあるから
printfを関数で作ってるだけでしょ。
牛のNASなんかもシリアルから標準出力と同じものが出てたはずだし
0829デフォルトの名無しさん
2009/06/03(水) 16:52:59独自関数で作ってるだけでしょ。
0830デフォルトの名無しさん
2009/06/03(水) 16:53:11そう。printf()はn進数への変換のコードも必要だったような気がする。
0831デフォルトの名無しさん
2009/06/03(水) 16:55:000832デフォルトの名無しさん
2009/06/03(水) 17:00:47大変というか無ければ作る
タダそれだけ
0833826
2009/06/03(水) 17:02:16独自実装はまだ楽っぽいが…
その手の暗にスタック食いなやつが、(メモリの都合で)実質的に使えねぇ となると泣けるな
組み込みはどんな制限つくかわからんから大変だね
0834デフォルトの名無しさん
2009/06/03(水) 17:03:22拡張要求(欲望)で機能が肥大化しがち。
またこういったprintf上位互換コードが流出すると、一般的なC言語のライブラリとの間で
相互干渉が発生してトラブルを招きがち。
極めてプライベートな場所でそれを使用するのは止めないが、パブリック(商用)な場所で
それを使う場合は十分な注意が必要。
印字書式を全く新しいものにするとか。
printfの印字書式は非常に小さいがある種のプログラミング言語であるとも考えられ
当然そこには意匠権や特許権とかも絡んでくるかも知れない。
0835デフォルトの名無しさん
2009/06/03(水) 17:08:140836デフォルトの名無しさん
2009/06/03(水) 18:22:06とっくに切れてるはずだから大丈夫
0837デフォルトの名無しさん
2009/06/03(水) 18:31:37printfは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;
}
0838デフォルトの名無しさん
2009/06/03(水) 18:43:14i=0;
while(i>1)
のような場合、whileは一回も機能せずに終わりますか?
0839デフォルトの名無しさん
2009/06/03(水) 18:45:13i=0;
while(i>1)
{
count++;
}
//countを表示
という風に確認してみるといい。
というかその程度ならそういう癖をつけるほうがいい
0840デフォルトの名無しさん
2009/06/03(水) 19:09:34printf("整数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が変なのだと思うのですが
どこを直したらよいのか見当がつかないので教えてください。
0841デフォルトの名無しさん
2009/06/03(水) 19:12:35scanf()おかしい? → http://www.aa.alpha-net.ne.jp/freeh/minimini/develop/cscanf.html
それともなにか出来ない?
0842デフォルトの名無しさん
2009/06/03(水) 19:24:21たとえば10と5と入れたら7(あと5も?)と出てこなければいけないのに、
2とでてきてしまいます。
0843デフォルトの名無しさん
2009/06/03(水) 19:28:02とっくに切れてるはずだから注意が必要なわけ
0844デフォルトの名無しさん
2009/06/03(水) 19:41:100845デフォルトの名無しさん
2009/06/03(水) 19:43:55うわぁはずかしぃ・・・
if(i=j) printf("%d",i);
0846デフォルトの名無しさん
2009/06/03(水) 19:58:32ありがとうございました!!!
そこと、if(i%j!=0) break;
の!=が==だったみたいです。
0847デフォルトの名無しさん
2009/06/03(水) 20:02:240848デフォルトの名無しさん
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);
}
}
0849デフォルトの名無しさん
2009/06/03(水) 23:14:24よろしくお願いします。
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)へのポインタ型へのポインタ型のサイズ */
0850813
2009/06/04(木) 10:42:55va_start使ってやってみます。
0851授業中
2009/06/04(木) 11:21:13public 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+"までの和="+ ???????);
}
}
これの???????に何がはいるかわかりますか?
0852デフォルトの名無しさん
2009/06/04(木) 11:28:13...
return s;
...
System.out.println("1から"+n+"までの和="+ Kansu_sum::sum(n));
0853授業中
2009/06/04(木) 11:33:50ありがとうございます!!
System.out.println("1から"+n+"までの和="+ Kansu_sum::sum(n));
最後の+Kansu_sum::sum(n));
ここでうまくいかないのですが、何かおかしいですか?
0854デフォルトの名無しさん
2009/06/04(木) 11:48:15Javaはスレ違いだろ
0855授業中
2009/06/04(木) 12:06:30System.out.println("1から"+n+"までの和="+sum(n));
で、できました。
スレチすみませんでした
0856デフォルトの名無しさん
2009/06/04(木) 16:24:372
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 }
0857デフォルトの名無しさん
2009/06/04(木) 16:25:1017 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 }
0858デフォルトの名無しさん
2009/06/04(木) 16:28:29Bytes 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]それぞれに格納されている文字の数にも関わらず、
バイトの数が同じなのはなぜなのでしょうか?よくわからないので知っているかた教えてください。
0859デフォルトの名無しさん
2009/06/04(木) 16:30:340860デフォルトの名無しさん
2009/06/04(木) 16:30:42当たり前だろ
sizeof w / sizeof w[0]は単なるchar型へのポインタの大きさ
文字列の長さを知りたかったらstrlen()を使え
0861デフォルトの名無しさん
2009/06/04(木) 16:31:28これだとポインタサイズになるんじゃないかな?
32bit環境なんで4バイト
それにstrlenとかで調べるしかないんじゃない?
0862デフォルトの名無しさん
2009/06/04(木) 16:39:14回答有難うございました。
0863デフォルトの名無しさん
2009/06/04(木) 16:53:040864デフォルトの名無しさん
2009/06/04(木) 17:03:430865デフォルトの名無しさん
2009/06/04(木) 17:39:13この場合main.cでfoo.h bar.hを両方インクルードするのか
foo.hに二重インクルード防止をつけてbar.hに#include "foo.h"を書いてしまうのか
一般的に好まれるのはどちらのスタイルですか?
0866デフォルトの名無しさん
2009/06/04(木) 17:42:01自分で書いてるだけならお好きなように
0867デフォルトの名無しさん
2009/06/04(木) 17:52:32bar.cで使うの間違いか?
いずれにせよ、二重インクルード防止は常につけるように。
基本は、そのファイルで必要なヘッダだけを includeする。
0868デフォルトの名無しさん
2009/06/04(木) 20:44:37#if !defined XXX
#define XXX
...
#endif
とか
0869デフォルトの名無しさん
2009/06/04(木) 20:54:550870デフォルトの名無しさん
2009/06/04(木) 20:55:01インクルードガードで
_SEX_H_
のようにベンダでもないくせに先頭にアンダースコア入れる奴にはなるなお
0871デフォルトの名無しさん
2009/06/04(木) 21:45:50// / ─ ─ \
/// (●) (●) \
//| \(__人__)/ | ←
//\ | ` ⌒´ | /
/// \
// ┼ヽ -|r‐、. レ |
// d⌒) ./| _ノ __ノ
// _______
// 製作 ○○
↑いつも俺がコードの最後に貼ってるヤツ
0872デフォルトの名無しさん
2009/06/04(木) 22:03:150873デフォルトの名無しさん
2009/06/05(金) 03:10:22これのうまい使い方というか、どんな風に使うと便利なのか誰か例を示してくれないか?
0874デフォルトの名無しさん
2009/06/05(金) 03:13:100875デフォルトの名無しさん
2009/06/05(金) 03:17:53void 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を正常に呼び出すには、どこをどう修正したらいいのでしょうか?
色々試してはいるのですがさっぱり分かりません。
どうかご教示をお願い致します
0876875
2009/06/05(金) 03:18:56func_cじゃなくてfunc_aです
0877デフォルトの名無しさん
2009/06/05(金) 03:56:43void 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;
}
0878デフォルトの名無しさん
2009/06/05(金) 04:44:56char [3][15] は char (*)[15] では受け取ることができるけど char *[3] では受け取れないよ。
char *[3] は char** で受け取る。
ちなみに関数引数ではそれぞれ char [][15], char *[] と書いても良い。
0879デフォルトの名無しさん
2009/06/05(金) 09:21:54普通はそういうデータはこう持つ。
staic char const * const array[] = {
"あいうえお",
"かきくけこ",
"さしすせそた",
};
あ、書き換えもしたいのか。んじゃchar a[][15]でもいいか。
# 16にしておくのが無難だけど本質的じゃないし。
0881デフォルトの名無しさん
2009/06/05(金) 18:27:00構造体のメンバ ⇔ 表示用シンボル テーブルの実体を記述するときとか
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),
};
こんな感じ。
0882デフォルトの名無しさん
2009/06/05(金) 19:07:470883デフォルトの名無しさん
2009/06/05(金) 19:09:01あんまりない
自分のプログラムを呼び出す側にリターンコードが必要な環境の場合は有効
0884デフォルトの名無しさん
2009/06/05(金) 19:11:02大抵の場合、省略可能。
0885デフォルトの名無しさん
2009/06/05(金) 19:11:400886デフォルトの名無しさん
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??からデータを取得するプログラムを教えてください。
では、よろしくお願いします。
0887デフォルトの名無しさん
2009/06/05(金) 19:13:38実際そうだしw
呼び出し元が特にリターンコードを見ないなら
return 0;でOK
必要ならそれなりのコードを返せばいいだけ。
0888デフォルトの名無しさん
2009/06/05(金) 19:14:13宿題スレオススメ
0889デフォルトの名無しさん
2009/06/05(金) 20:18:51#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)));
}
0890889
2009/06/05(金) 20:23:06int *D_TBL_ADR[3] = { は
int *D_TBL_ADR[] = { ですね
すいません
0891デフォルトの名無しさん
2009/06/05(金) 20:40:16そんな過去の遺物でコンパイルなんかしないでください。
0892デフォルトの名無しさん
2009/06/05(金) 20:42:380893デフォルトの名無しさん
2009/06/05(金) 20:47:15コマンドインタプリタに積極的に値を返すこともある。
例えば、Unixなどのgrepコマンドは対象が見つかったときは0を返し、見つからなければ1を返し、異常があれば2を返す。
また、trueコマンドは常に0を返し、falseコマンドは常に1を返す。
0894デフォルトの名無しさん
2009/06/05(金) 21:36:000895デフォルトの名無しさん
2009/06/05(金) 22:03:59main() の呼び出し元がそういう風になっているからでは?
0896デフォルトの名無しさん
2009/06/05(金) 22:16:06もともと、C言語は関数のデフォルト型がintだった。
その名残でもある。
0897デフォルトの名無しさん
2009/06/06(土) 00:56:12#define myint int
と
typedef int myint;
のどちらでも可能ですが、どっちだとどんなときに都合がいい、困るっていうことがありますか?
0898デフォルトの名無しさん
2009/06/06(土) 01:07:11#はポインタ型の別名に使うとひどいことになる
0899デフォルトの名無しさん
2009/06/06(土) 01:14:01#defineを使わないですむならそれに越したことはない。
0900デフォルトの名無しさん
2009/06/06(土) 01:59:38#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);
}
}
みたいな
0901デフォルトの名無しさん
2009/06/06(土) 02:53:360902デフォルトの名無しさん
2009/06/06(土) 04:03:11圧倒的にtypedefです。
0903デフォルトの名無しさん
2009/06/06(土) 12:14:07fscanfとfprintfの方がわかりやすいんですがね。
0904デフォルトの名無しさん
2009/06/06(土) 12:27:21fread/fwriteの使い道
mp3のエンコード、デコードや構造体の読み書きなど
テキストデータを読み書きするときはfgetsで読むかな
0905デフォルトの名無しさん
2009/06/06(土) 13:31:43動作保証ないですか
0906デフォルトの名無しさん
2009/06/06(土) 13:33:41ほとんど問題はないが、うるさいことをいえば避けておいたほうがいいですね。
0907デフォルトの名無しさん
2009/06/06(土) 13:53:34テキストじゃなくてバイナリでデータを読み書きする時。
0908デフォルトの名無しさん
2009/06/06(土) 14:16:21配列、関数の扱いまでなんとか理解して、次はポインタについて習得しようと考えています
ただ、全然その、C言語を使えばゲームやらアプリやらで使われているいろんなことができちゃうぜ〜って実感が沸いてこないのですが、そういうレベルに至るまであとどれくらいなんでしょうか
「いろんなものが作れるぜ」ってのを100とすると今の自分はどのあたりなのかなあと
0909デフォルトの名無しさん
2009/06/06(土) 14:27:042とか3とかそのくらいじゃね?
どの言語にしてもアプリ開発とかはライブラリ群やAPI使ってなんぼなので
APIやら開発環境使いこなせるようになれば+20とかって感じじゃないかと
http://dixq.net/ ここだってとりあえずDXライブラリ使えって言ってるだろ?
いまやってる基礎を習得した上でライブラリを覚えれば「いろんなものが作れるぜ」
0910デフォルトの名無しさん
2009/06/06(土) 14:27:12どうでもよくなって別の言語に移行したら第三段階
0911デフォルトの名無しさん
2009/06/06(土) 15:15:16ポインタをまだしらないなら2じゃないかな。
たぶん俺たちですら100ではないわけだし。
C/C++の深遠さはヤバイ
0912デフォルトの名無しさん
2009/06/06(土) 15:21:33俺C言語がやになってC++に移行したら
めっちゃ気に入ってハマった人間なんだけど。
・・・それでも時折別の高級言語もやってみたくなる。
0913デフォルトの名無しさん
2009/06/06(土) 15:44:35必要なのはライブラリやAPI。その背後にあるプロトコル。
そこさえおさえておけば、言語を何かに絞る意味はない。
選択肢が広がり、C言語なんか見向きもしなくなる(過言)。
0914デフォルトの名無しさん
2009/06/06(土) 15:56:10CやC++にはないから、ハードやOS、開発環境ごとに異なるグラフィックライブラリを
それぞれ習得していかないとゲームを作るところには到達できない。
ウルトラ遠回り^^
0915デフォルトの名無しさん
2009/06/06(土) 15:58:060916デフォルトの名無しさん
2009/06/06(土) 16:01:040917デフォルトの名無しさん
2009/06/06(土) 16:10:360918デフォルトの名無しさん
2009/06/06(土) 16:20:56遠回りだといってるだけ。
実際、VBとかの方が簡単でしょ。
素人にはオールインワンの方が簡単って意見にも反対?
それなら、しょうがない。^^
0919デフォルトの名無しさん
2009/06/06(土) 16:24:25適用分野の知識が必要
2,3かも知れんが、あるところから急激に自信が付くもの
0920デフォルトの名無しさん
2009/06/06(土) 16:29:35OpenGL使っとけ。
0921デフォルトの名無しさん
2009/06/06(土) 16:31:290922デフォルトの名無しさん
2009/06/06(土) 16:32:540923デフォルトの名無しさん
2009/06/06(土) 16:33:59どの言語も一長一短あってこれがベストなんていえないけどな。
むしろ環境に依存する部分の初期化とかいったお作法の方が面倒
0924デフォルトの名無しさん
2009/06/06(土) 16:35:25言語は所詮道具だしな。
道具を使ってどれくらいの規模のソフトを作ったかによるんじゃない?
0925デフォルトの名無しさん
2009/06/06(土) 16:36:060926デフォルトの名無しさん
2009/06/06(土) 16:49:49あれならかなり楽だし
ゲームってどんなことをしてるかというのを掴まないと厳しいしね。
0927デフォルトの名無しさん
2009/06/06(土) 16:56:16自分が何を分かってて、何が分かって無いのかがわかるようになったとき。
0928デフォルトの名無しさん
2009/06/06(土) 17:00:150929デフォルトの名無しさん
2009/06/06(土) 17:02:53何も分かってないことは分かってても、何を分かってないかは理解してないだろw
0930デフォルトの名無しさん
2009/06/06(土) 17:03:290931デフォルトの名無しさん
2009/06/06(土) 17:03:47最近のハードをフルに活かすとなるとグラフィックの比重がめちゃくちゃ高いので
素人は大変。プロでさえ人数と金と時間かけてようやく出来る状態なんだし
0932デフォルトの名無しさん
2009/06/06(土) 17:07:420933デフォルトの名無しさん
2009/06/06(土) 17:09:35してないな
音楽も音源に音符データ渡す方式からPCM録音してそれを鳴らす方式になって
どこにでもある音楽になって特徴なくなったし。
まあ、3D計算が高速になって多少幅は広がったよね。
0934デフォルトの名無しさん
2009/06/06(土) 17:20:17NPCにAI入るようになってるし、ネットワーク対応するようになったし、
音楽も単に流すだけじゃなくてシーンに合わせてスムーズに変化するようになってるし、
物理演算やモーションキャプチャの利用とか(これらはグラフィック面の強化という意味もあるけど)
詳しく観察したらいろんな事が行われてるよ。
0935デフォルトの名無しさん
2009/06/06(土) 17:37:17ぼくのかんがえるさいきょうのげーむ
とか出てきそうな気配
0936デフォルトの名無しさん
2009/06/06(土) 17:48:12たとえば
abcと書き込むと
ファイルに
abc
と書き込まれます。
そのあとにdefと書き込むと
abc
def
となります
これを
def
abcと新しく先頭に書き込みたいんですがどうやればいいんですかね?
0937デフォルトの名無しさん
2009/06/06(土) 17:51:55又はそれようのファイルシステムライブラリーを作る
0938デフォルトの名無しさん
2009/06/06(土) 18:00:09本当にそういうことしないとどうしようもないのか
というところから検討した方がいいかもしれないが。
1. abcとかかれたファイルを別の名前に変更
2. 目的のファイルにdefと書き込む
3. 1.で別の名前に変更したファイルを開く
4. 3.のファイルからデータを読み出して、目的のファイルに追加書き
(もっと楽にやりたかったら、mmap系で)
0939デフォルトの名無しさん
2009/06/06(土) 18:01:48必ずいったんメモリに読み込んでからの書き直しになる。
0940デフォルトの名無しさん
2009/06/06(土) 18:01:59perlでできたきがするんですがね。
たしかfseekを使ってアンケートの書き込みを昇順にするみたいな
あれをCでやりたいわけですが。
0941デフォルトの名無しさん
2009/06/06(土) 18:04:18perlでできていても
それは中で泥臭いことやってるのを,蓋をしてきれいに見せているのしか見ていないからだとおもう
0942デフォルトの名無しさん
2009/06/06(土) 18:08:14fseek(fp,0,SEEK_SET)で
ファイルの先頭
abc
def
abcの場所に来て
defが先頭へ書き込めるかと思ったら全然違いましたね。
0943デフォルトの名無しさん
2009/06/06(土) 18:08:170944デフォルトの名無しさん
2009/06/06(土) 18:12:47abcとdef のように長さが同じなら、
abc
def
abcをいったんメモリに読み込み、
abcをdef で上書き。
def
def
そして、abcで上書き
def
abc
ただし、あくまでも上書きなので、同じ文字数のときにしか使えない。
0945デフォルトの名無しさん
2009/06/06(土) 18:17:06応用すれば、バブルソートのようなやり方で離れた位置の文字列同士の交換も可能だろう。
ただし、一旦ファイルをメモリに読み込んで、新たにファイルを作り直すほうが単純かつ確実。
速度的にもそのほうが有利だろうな。
0946デフォルトの名無しさん
2009/06/06(土) 18:18:58開いた直後 先頭指してる・末端指してる
末端以降の追記は、そのぶんだけファイルサイズが増える
ってだけで、途中からの書き込みは挿入操作ではなく上書き操作だし
0947デフォルトの名無しさん
2009/06/06(土) 18:19:35> バブルソートのようなやり方
なんか↑って
> 一旦ファイルをメモリに読み込んで、新たにファイルを作り直す
ってのを具体的に書いただけじゃまいか
0948デフォルトの名無しさん
2009/06/06(土) 18:23:08もう1個ファイル作るみたいですね。
むずかしそうですが頑張ってみます。
0949デフォルトの名無しさん
2009/06/06(土) 18:23:24いや、全部読み込むのではなく、単語単位で読み出し書き込みを繰り返すって意味。
瞬間的には、高々2単語分しかメモリにない状態。
質問者はそういうのをイメージしているだろうと思って。
もちろんキャッシュがあるから、意図したとおりにはなっていないだろうけど。
0950デフォルトの名無しさん
2009/06/06(土) 18:29:51>掲示板みたいな感じで新規に書き込んだものを先頭に表示させたかったんですが
入力データーを保持するという意味では
ファイルの書き出し順は入力が新しいほど後のほうが都合良い
# 追加は末尾に書くだけ (a+ で開いてそのまま書き出しで済むしな
表示というのは、あくまでデータを可視化する作業だから、分けて考えたほうが良いと思うよ
0951デフォルトの名無しさん
2009/06/06(土) 18:31:54下手なこと考えずに、ファイル全部読み込んで処理しとくが吉。
0952デフォルトの名無しさん
2009/06/06(土) 18:35:38むしろ何かしらデータベース鯖でも立てれば一瞬で終わる
0953デフォルトの名無しさん
2009/06/06(土) 18:37:38初心者には難しいのかもしれない。
昔、○×ゲームを作るという課題で、
プレイヤーが打ち込んだ○(または×)を
「どうやったら画面から読み取れるのか」
と必至に考えている人がいた。
興奮した。
0954デフォルトの名無しさん
2009/06/06(土) 20:32:36echo $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
0955デフォルトの名無しさん
2009/06/06(土) 20:40:390956デフォルトの名無しさん
2009/06/06(土) 21:02:38{
system("./test.sh aaa");
system("./test.sh bbb");
return 0;
}
0957デフォルトの名無しさん
2009/06/06(土) 21:57:25ちゃんと分かって、あえて使うならOK。
ただし、バグの原因になることが多いから、
セキュリティ的にも避けるべきということになってる。
C言語なら俺に聞け(入門篇) Part 49
http://pc12.2ch.net/test/read.cgi/tech/1244297476/
0959デフォルトの名無しさん
2009/06/07(日) 10:33:510960デフォルトの名無しさん
2009/06/07(日) 10:59:070961デフォルトの名無しさん
2009/06/07(日) 11:12:32enum 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;
}
}
暗黙のキャストが安全なのかどうかわからんです
0962デフォルトの名無しさん
2009/06/07(日) 11:12:45fgetc() の戻り値は int でとります。
0963デフォルトの名無しさん
2009/06/07(日) 11:14:25enum をわけてしまったのでは不可能
あえてするとすれば、 enum NUM1{ A=0, B=1, C=2}, enum NUM
0964デフォルトの名無しさん
2009/06/07(日) 11:41:26int
enumって実質intだから、intで受けてかまわない。
0965デフォルトの名無しさん
2009/06/07(日) 13:34:24構造体をとあるヘッダーで宣言して、実体を別のヘッダーで宣言した場合(勿論構造体宣言はインクルードしてある)
subと言うソースファイル内で実体のヘッダーを読み込んで、関数内で使った場合
mainのソースファイルで実体を読み込めない。
mainの方にも実体を宣言したヘッダーを置くと二重定義になるし
subの方を消すと、今度はsub内で構造体にアクセス出来なくなる。
externを使ってもエラーが出た。
説明ヘタで申し訳無いけど、どうすればいいの?
0966デフォルトの名無しさん
2009/06/07(日) 13:54:52処理系付属のヘッダファイルとか、オプソなコードのヘッダとか
眺めてたら色々と工夫してあるのでそれを盗め。
0967デフォルトの名無しさん
2009/06/07(日) 14:02:430968デフォルトの名無しさん
2009/06/07(日) 14:04:430969デフォルトの名無しさん
2009/06/07(日) 14:12:31#define HOGE
#else
#define HOGE extern
#endif
HOGE int hoge;
とヘッダにしておいて(便宜上ヘッダ名はhogehoge.hとする)
hogeの実体を置きたいソースに
#define HOGE_PUBLIC
#include "hogehoge.h"
hogeの実体を置かないソースには
#include "hogehoge.h"
0970デフォルトの名無しさん
2009/06/07(日) 14:51:54>>966-969
サンクス、助かった
0971デフォルトの名無しさん
2009/06/07(日) 14:55:53>>969が何をやってるか理解できてないなら使わない方がいいよ。
あと個人で作るプロジェクトならいいけど、仕事でするなら探りを入れた方がいいかも
0972デフォルトの名無しさん
2009/06/07(日) 15:00:12ソースのどこか1箇所でextern 無しの実体定義を行う
0973デフォルトの名無しさん
2009/06/07(日) 15:20:512人ぐらいで同人ゲーム作る為に、基盤となるソースとヘッダー作ってたんだぜ。
ifdefとか便利だって聞くからちょっと勉強しとくよ。
>>972
それで完璧だった。
どのソース内でも関数内でも構造体のメンバが呼び出せるようになった。
0974デフォルトの名無しさん
2009/06/07(日) 15:25:28とかの実体もヘッダに書かない方がいいの?
0975デフォルトの名無しさん
2009/06/07(日) 15:28:340976デフォルトの名無しさん
2009/06/07(日) 15:46:41なぜstaticって付ければ良いかは
staticキーワードでローカル(プライベート)にする - C言語とC++入門勉強ルーム
ttp://www.mapee.jp/cpp/static_2.html
ここでファイルスコープを学べばわかるかと。
0977デフォルトの名無しさん
2009/06/07(日) 15:58:02出来ればやめたほうが良い。公開用ヘッダ領域には置かないほうが良い。
しかし現実にはやらざるを得ない。
大抵、ライブラリコンパイル用のヘッダは公開用ヘッダと同じ名前だが
includeディレクトリの奥深くに「隠されるのが」普通。
公開用ヘッダも最初はその大部分を参照するが、やがて独立していき
最終的にはライブラリコンパイル用のヘッダは公開ヘッダ領域からは
除かれるというのがセントラルドグマ。
0978、
2009/06/07(日) 17:18:53�@ある処理がA関数コール200文字データを引数で渡す
�AA関数実体で200文字処理し、Bタスクへ100文字ずつメッセージ送信。
�BBタスクは100文字受取、100文字を保持し、残りの100文字が来たら200文字データに成形する。
�C200文字データをパイプでexeに流す。
という処理を作成しています。
�Bの100文字データを保持するという処理がどうすればよいかわかりません。
というのも次の100文字データが来る前に、前の100文字データ消えてしますようなきがして。
よろしくお願いします。
0979デフォルトの名無しさん
2009/06/07(日) 17:22:05> A関数コール200文字データ
なにいってんの?
0980デフォルトの名無しさん
2009/06/07(日) 17:24:29error C2143: 構文エラー : ';' が '<クラスヘッド>' の前にありません。
ってエラーが出る…。
構造体の書式は間違ってないんだけど、この場合何処でエラーになってるの?
0981デフォルトの名無しさん
2009/06/07(日) 17:26:23ととじてないとか
0982デフォルトの名無しさん
2009/06/07(日) 17:26:36あ、自己解決。
関数のプロトタイプ宣言に「;」が無かっただけだった
0983デフォルトの名無しさん
2009/06/07(日) 17:28:58int datacount;
char data[200];
でいいんじゃないかな。
datacountが0ならdataは空。100なら100文字分保持。200なら200文字分保持。
datacountが100のときに次の100文字が来れば、dataの100番目から格納して
datacountを200にしデータ成形し�Cを実行。
�Cが終了したらdatacountを0に戻す。
0984978
2009/06/07(日) 18:32:07ありがとうございます。
これって、順番を守って1回目のデータ、二回目のデータを受け取れるでしょうか?
例えば、初めにデータを送ったタスクより、高いプライオリティのタスクがデータを送って
途中データが書き換えられるようなことはないでしょうか?
0985デフォルトの名無しさん
2009/06/07(日) 18:32:580986デフォルトの名無しさん
2009/06/07(日) 18:37:38プロセス構成がわからないからなんともいえない。
プロセス構成はこれでOk?
プロセスA(A関数を含む)
プロセスB(Bタスク)
プロセスC(プロセスBよりpipeでデータを受け取るexe)
0987デフォルトの名無しさん
2009/06/07(日) 18:43:59Aは100区切りをBの都合お構いなしで垂れ流す。
OSが垂れ流されたデータを一時保管
Bは次の100くれとOSに頼む。
Bのなかで前の100が消えるとか知ったこっちゃねぇ
0988978
2009/06/07(日) 18:53:22>>984
問題ないです。
なにをしようかというと、自作printfを作成していて、あちこちから
自作printfは呼ばれるのでデータの保障について考えています。
0989デフォルトの名無しさん
2009/06/07(日) 18:59:230990sage
2009/06/07(日) 21:02:38多分呼び出し元で確保した領域(文字列など)であれば呼び元が異なっても
干渉することはないと思う。
タスクの構造体見るとスタックの領域があるよね?printf()が呼ばれたときの
引数の領域もこのスタックの領域を使用して作成され、それぞれのタスクで別々
の保存場所になっている。
なので関数の中でstaticみたいなのを使って状態保存
(例:関数が何回呼ばれたかなどの情報を関数内のstatic変数で
カウントしてるなど)しているようなのを使っているとタスク間で干渉する。
ちょっと質問の意図を勘違いしてるかもしれないけど。
0991デフォルトの名無しさん
2009/06/07(日) 22:05:160992991
2009/06/07(日) 22:06:020993デフォルトの名無しさん
2009/06/07(日) 22:30:580994991
2009/06/07(日) 22:42:04これ聞く教授陣もアホですよ。
0995デフォルトの名無しさん
2009/06/07(日) 22:47:44多次元配列なんてCの便宜上の話であってたとえば
内部的には連続したメモリだし
0996デフォルトの名無しさん
2009/06/07(日) 22:48:25はゴミです。消し忘れ
0997デフォルトの名無しさん
2009/06/07(日) 23:30:450998デフォルトの名無しさん
2009/06/07(日) 23:31:390999デフォルトの名無しさん
2009/06/07(日) 23:41:421000デフォルトの名無しさん
2009/06/07(日) 23:41:4610011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。