13/03/09 19:24:49.78
C言語の入門者向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 112
スレリンク(tech板)
★過去スレ
URLリンク(makimo.to:8000)
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 163代目
スレリンク(tech板)
★C++言語については避けてください。C++対応明記スレへどうぞ。
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。
# サイズが大きい場合はアップローダ等を利用してください。
URLリンク(codepad.org)
URLリンク(ideone.com)
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
2:デフォルトの名無しさん
13/03/09 19:26:34.97
NULLってなんですか?
3:デフォルトの名無しさん
13/03/09 19:27:34.37
>>2
NULLです。
4:デフォルトの名無しさん
13/03/09 20:16:57.94
#define NULL 0
ポインタとかメモリアドレスを聞かれてる時にはnullptrつかうとええよ
5:デフォルトの名無しさん
13/03/09 20:34:16.30
>>5
ga
6:デフォルトの名無しさん
13/03/09 20:34:49.42
>>4
さあC++スレにお帰り
7:デフォルトの名無しさん
13/03/09 22:42:06.47
NULLってのはポインタ使わない限り使わないよね
ポインタって基本的に使わない配列があるし
8:デフォルトの名無しさん
13/03/09 22:43:22.50
?
9:デフォルトの名無しさん
13/03/09 22:50:15.81
___ ━┓
/ ― \ ┏┛
/ (●) \ヽ ・
/ (⌒ (●) /
/  ̄ヽ__) /
. /´ ___/
| \
| |
10:デフォルトの名無しさん
13/03/09 22:54:10.60
>>7
0 と書いて全然OKだから、私は NULL でさえ使わない。
11:デフォルトの名無しさん
13/03/09 22:58:01.00
0がぬるぽになるとか悪魔の仕様だよね
何で最初にキーワード導入しなかったんだろうと思ったが
当初ぬるぽのビット表現が0にならない環境とか無考慮で0を入れるようにしてて
その時代との互換性とかなんだろうか
12:デフォルトの名無しさん
13/03/09 23:02:25.55
リテラルの0と
数値の0と
アドレスの0と
ポインタのNULL
違いが分かる人は好きにすればいいんじゃない?
わからない人はきちんと使い分けましょう
13:デフォルトの名無しさん
13/03/09 23:04:15.30
>>8>>9
配列の場合
a[i]=NULL;→エラー
ポインタの場合
int *a=NULL;→不エラー
14:デフォルトの名無しさん
13/03/09 23:04:43.16
リテラルの0だけ仲間はずれ感があるけど気のせいか
15:デフォルトの名無しさん
13/03/09 23:04:46.61
C/C++の仕様を洗練した低レベルでネイティブな言語てないの?
16:デフォルトの名無しさん
13/03/09 23:07:53.63
どういうところを洗練すればいいと思うの?
17:デフォルトの名無しさん
13/03/09 23:08:16.17
ぬるぽになるのはリテラルの0に限らないぞ
計算して0になれば複数のリテラルからなる式でも構わない
18:デフォルトの名無しさん
13/03/09 23:16:06.29
>>15 D言語
19:デフォルトの名無しさん
13/03/09 23:21:21.43
D言語は魔改造を繰り返した結果、
C++より遥かに邪悪な黒魔術が使えるようになってしまった
20:デフォルトの名無しさん
13/03/09 23:33:04.72
C#によく似た文法のCトランスレーターなら名前忘れたが有ったような
21:デフォルトの名無しさん
13/03/10 01:01:57.45
CとC++を同一に考える時点でアホ
22:デフォルトの名無しさん
13/03/10 02:35:06.72
アドレスの0とポインタのNULLは普通のパソコンなら同じ意味じゃないの
23:デフォルトの名無しさん
13/03/10 02:35:34.16
うん
24:デフォルトの名無しさん
13/03/10 02:38:57.25
Cなら普通のパソコンでビット表現が0にならない事はほとんどないと思われるが、
C++ならg++だとメンバ変数ポインタのNULLはのビット表現は0じゃなく-1
25:デフォルトの名無しさん
13/03/10 03:15:16.60
むしろどういう環境だと変わってくるの?
CPUによるものなのかOSによるものなのか。
普通のパソコンでの当たり前が当たり前じゃない例を知らないから
想像しようとしてもよく分からないんだよね・・・
26:デフォルトの名無しさん
13/03/10 03:51:49.15
0番地が普通に使える環境だったらダメそう。なさそうだけど。
27:デフォルトの名無しさん
13/03/10 06:39:07.32
DOS時代は普通に使えてた気がする
28:デフォルトの名無しさん
13/03/10 09:07:29.19
Null Pointer Assignmentのメッセージを出すために使われてたね。
29:デフォルトの名無しさん
13/03/10 11:30:07.37
array[]= {15,78,98,15,98,85,17,35,42,15};
int main(void)
{
int *p_array=array;
int sum= 0;
while(p_array<array+10)
{
sum += *p_array++ ;
printf("sum %d\n",sum);
}
printf("average %d\n",sum/10);
return 0;
}
sum += *p_array++ ここが疑問です。
実際にはsumへの加算が終わってから、ポインタが移動しているようなのですが、
演算の優先順位( ++ > * > =)に従うとポインタが先に移動してから加算される気がしますが、そうなってはいません。
なぜこうなるのでしょうか。
30:デフォルトの名無しさん
13/03/10 11:38:48.78
ぬるぽが正しくつかわれているのを久々に見た
31:デフォルトの名無しさん
13/03/10 11:56:03.68
>>29
演算子の優先順位は ++ → * → += であるのは間違いない。
ここで *(p_array++) であるが、値は、副作用++が適用されるの前の値となる。
したがって ++ が先に適用されるにしても、加算に供される値は、++ 実行前のものとなる
キーワード「後置インクリメント」
32:デフォルトの名無しさん
13/03/10 11:58:31.23
>>29
++と*は同じ優先度で、右から左の結合でしょ?
つまり、* ( p_array++ )
33:デフォルトの名無しさん
13/03/10 12:12:34.41
インクリメントを分離しろ
34:デフォルトの名無しさん
13/03/10 12:20:20.54
演算の優先順位と、インクリメントが行われるタイミングは別の問題
35:デフォルトの名無しさん
13/03/10 13:17:05.06
インクリメント使わずにa=a+1方式使えばいいだけの話じゃ……
36:デフォルトの名無しさん
13/03/10 13:54:30.01
・ポインタ演算は避けられるなら避けるべき。
・forが自然に使えるなら使うべき。
・型指定のintはunsigned intのようなケース以外は省略すべきでない。
いずれにしても、アナクロなコードだ。
それと、sumの出力はループの外ジャマイカ。
37:デフォルトの名無しさん
13/03/10 16:12:43.28
【PC遠隔操作】 「僕はC#を扱う技術がなかった。職場の社長も証言」 片山容疑者、容疑否認のメモ公開 取り調べ可視化を主張★3
スレリンク(newsplus板)
38:デフォルトの名無しさん
13/03/10 17:10:32.65
みなさま、有難うございます
>>31>>32>>34
インクリメント演算子についてしらべたところ、
「値を1増加させるという意味は同じものの、増加させるタイミングが異なる。
後置のものは値を使った後に増加させ、前置のものは値を増加させてから使う。」
だからちゃんと1番目の数値がsumに代入されていたんですね。ちなみに>>29で前置インクリメントにしてみたら暴走しました。
逆にデクリメントするのだったら前置にしないと変な値になるんですね。
int *data = array + 10;
int sum = 0;
do {sum += * --data;
}while (data >array);
>>33
sum += * p_array++ ;は、
sum += * p_array;
p_array++;
と同じになりますね
>>35>>36
for(i=0;i<10;i=i+1) {
sum = sum + array[i];}
普通は配列の合計値はこうして出した方が素直ですよね。(sumの出力は代入の確認で、配列のint宣言はコピーし忘れてました。)
自分は昔のCPU用のプログラムをいじってみようと思っています。
ポインタ演算は使うと速くてサイズも小さくなるそうなので、使ってみようと思います。
39:デフォルトの名無しさん
13/03/10 20:56:39.97
>ポインタ演算は使うと速くてサイズも小さくなる
残念ながら、これ自体が過去のもの。
却って素直にforと配列アクセスで書いた方がコンパイラが最適化してくれる可能性もある。
40:デフォルトの名無しさん
13/03/10 21:27:52.44
そうなんですか。ちょっとでも速く出来ればなと思ったんですけど。
やたら構造体が多くて、下手にポインタを使うと型が一致しなくなりそうなので、リスクの割りに効果がないならやめときます。
41:デフォルトの名無しさん
13/03/10 21:33:51.89
くだらない最適化より先にやる事がある
42:デフォルトの名無しさん
13/03/10 21:41:39.08
というより、最適化は最後の手段。
43:デフォルトの名無しさん
13/03/10 22:30:03.77
最適化のコツ:
初心者は最適化などに色気を出さないこと。
ベテランも最適化のことは忘れること。
44:デフォルトの名無しさん
13/03/10 22:43:26.46
最適化のコツ
・ポインタより配列を使う
・コンパイラの最適化オプションを吟味する
・GPGPUを検討する
45:デフォルトの名無しさん
13/03/10 22:45:44.48
最適化の骨
・三日後の自分が簡単に理解できるコードを心がける
46:デフォルトの名無しさん
13/03/10 22:50:10.45
最適化の落ち
・馬鹿の考え休むに似たり
47:デフォルトの名無しさん
13/03/10 23:23:50.21
初心者は、「最適化」と「あるべき姿のコード」の区別がつかない。
読み易いなコードを書けと言うと、シンプルなコードではなく、冗長なコードを書く傾向がある。
これは「非最適化」とされ、要するに初期悪化なので注意。
48:デフォルトの名無しさん
13/03/10 23:45:04.65
お前好みのコードになってるかそうじゃないかだけだろカスwwwww
49:デフォルトの名無しさん
13/03/10 23:51:53.25
#include <stdio.h>
int main(void) {
int a=1,b=2; /* 「a=1」、「b=2」とする。 */
if ( a = b ) puts ("YES"); /* 1=2ならYESと表示する。 */
return 0; /* 終了する。 */
}
50:デフォルトの名無しさん
13/03/11 00:16:47.59
if (a == b) だろ、ボンクラ
51:デフォルトの名無しさん
13/03/11 00:47:30.23
Cを勉強中1週間目の超ド素人です。
数値を文字列に変換し、下記のようにくっ付けるなんて関数はありますか?
例
"123" + "456" + "789"
↓
123456789
こんなふうにできますか?よろしくおねがいします。
52:デフォルトの名無しさん
13/03/11 00:49:49.59
sprintf
strcat
53:デフォルトの名無しさん
13/03/11 00:55:13.05
リテラルなら並べときゃくっつくが、
まあそういうハナシじゃないよな。
54:デフォルトの名無しさん
13/03/11 00:56:43.46
例だと文字列から数値に変換したいようにも見えるが
55:デフォルトの名無しさん
13/03/11 01:03:16.13
文字列として連結した結果をさらに整数型に変換しろって問題?
56:51
13/03/11 01:07:24.75
すみません言葉足らずでした
整数A,B,Cを、文字列に変換し、ABCという文字列にしてから、ABCという整数に変換したいです
57:デフォルトの名無しさん
13/03/11 01:10:10.94
strtol()でも使えばええやん
58:デフォルトの名無しさん
13/03/11 01:15:27.20
>>56
整数100,200,300,....を <= 入力整数の個数は?
文字列の"100200300...."にして <= 出力
更にこれを整数100200300....にする <= 出力
こんな関数あるかと?
59:片山博文MZパンク ◆0lBZNi.Q7evd
13/03/11 01:18:09.84
int abc;
char s[256];
sprintf(s, "%d%d%d", a, b, c);
abc = atoi(s);
60:デフォルトの名無しさん
13/03/11 01:21:56.80
>>59
いつものようにさりげなく嘘書くな
>int abc;
なんだよこれ
61:片山博文MZパンク ◆0lBZNi.Q7evd
13/03/11 01:32:16.81
>>60
それは>>56の整数ABCを宣言したものです。何か間違いでもありますか?
62:デフォルトの名無しさん
13/03/11 01:33:15.76
C言語でDXライブラリ無しでゲーム作るとしたらどの程度のゲーム作ることできる?
普通に2Dとかのアクションゲームやらシューティングやら作れる?
63:デフォルトの名無しさん
13/03/11 01:44:50.39
>>62
SDL
OpenGL
64:デフォルトの名無しさん
13/03/11 01:46:03.42
OpenGL+C言語+SDLで3Dに挑戦!
65:デフォルトの名無しさん
13/03/11 01:55:54.30
DXライブラリなしならDirectXを直接叩けばいいのでは
66:片山博文MZパンク ◆0lBZNi.Q7evd
13/03/11 02:18:40.16
>>60
嘘つきはお前だ、同業者さん。
67:デフォルトの名無しさん
13/03/11 02:20:24.05
しかしながらDirectXは、Windowsプログラミングをある程度こなせるようになる必要があるし
さらに数多くの引数や初期化で頭がパンクして、画面に描画するのですらめんどくさいしで
ゲーム作ろうと思うと線形代数が必要になってと、ものすごく覚えることがあるし
確実に艱難辛苦が待ち受けているからな、そういう意味では2Dのゲームを作るのならDXライブラリで十分だと思う
68:デフォルトの名無しさん
13/03/11 02:48:30.15
2DならGDIとMCIしてれば十分
69:デフォルトの名無しさん
13/03/11 02:51:35.82
とりあえず「DXライブラリ」利用者は
「C言語」やら「2Dのゲーム」などのように
全角英数字を使う事への抵抗が皆無なのは分かった
70:デフォルトの名無しさん
13/03/11 03:02:52.35
>>51
× int abc;
○ int abc, a, b, c;
71:デフォルトの名無しさん
13/03/11 03:24:38.08
それだけでa,b,cは未初期のまま使われてて意味ない
/* a,b,cは以上宣言されて初期化もされている */
というコメントが入れられてたら納得できたか
72:デフォルトの名無しさん
13/03/11 07:29:54.76
>>56
文字列にする必要はあるの?
abc = ((a * 1000) + b) * 1000 + c; じゃだめ?
イマイチ何がしたいか分からない
73:デフォルトの名無しさん
13/03/11 08:57:52.52
a、b、cが3桁固定とは限らないだろ
74:デフォルトの名無しさん
13/03/11 09:07:33.79
なら調べればいい
75:デフォルトの名無しさん
13/03/11 16:44:10.91
そのうちlong int超えるケタになって
まーた動かないとか言いだすぞ
76:デフォルトの名無しさん
13/03/11 17:28:35.24
桁数調べて*10再帰
77:デフォルトの名無しさん
13/03/11 19:21:58.21
>>75
連結するからすぐにそうなるだろな
入力の整数の最大値はint指定で入力整数の個数から、桁数を計算するぐらいしないと駄目かも
78:デフォルトの名無しさん
13/03/11 19:34:57.67
スイーツ(笑)
{
while(ナタデココ)
main();
}
}
79:デフォルトの名無しさん
13/03/11 21:38:24.49
doubleの使えなさは以上
精度糞スギ
80:デフォルトの名無しさん
13/03/11 21:43:06.40
まじプロフェッショナルは多売長整数使うからヨロシク
81:デフォルトの名無しさん
13/03/11 21:44:34.10
doubleが使えないならBigDecimalを使えばいいじゃない
82:デフォルトの名無しさん
13/03/11 21:47:30.51
15桁以上の精度が必要ってどんな領域よ。
本来、多倍長整数使うべきところでで浮動小数点使ってるだけじゃないのか?
83:デフォルトの名無しさん
13/03/11 21:47:59.21
(1+√(5))^n = a[n]+b[n]√(5) としたときの整数a[n],b[n]の一般項は
a[n] = (1/2)((1+√(5))^n+(1-√(5))^n)
b[n] = (1/(2√(5)))((1+√(5))^n-(1-√(5))^n)
この値を整数演算だけでO(log n)で算出する方法があれば教えて下さい。
84:デフォルトの名無しさん
13/03/11 21:49:55.60
>>82
物理
85:デフォルトの名無しさん
13/03/11 22:00:43.79
>>84
でも、多倍長実数は使わずに妥協するんでしょ。結局必要ないじゃん。
86:デフォルトの名無しさん
13/03/11 22:12:33.58
GMP使えば計算できるんじゃないかな?
ただ難解な物理をやりたいならマセマティカ買った方がいいんでない?
87:デフォルトの名無しさん
13/03/11 22:29:48.91
>>83
a(1)=1 b(1)=1
a(2)=6 b(2)=2
a(3)=56 b(3)=24
a(4)=6016 b(4)=2688
a(5)=72318976 b(5)=32342016
符号付32bit整数だと n=6 でオーバフロー
こんだけでいいならテーブルで持てばいいけど
多倍長演算するなら桁数が n^2 オーダーで増えるから
O(log n) ってのは無理じゃね?
88:デフォルトの名無しさん
13/03/11 22:30:37.68
n^2 オーダーじゃなくて n*2 オーダーだった
89:デフォルトの名無しさん
13/03/11 22:39:07.73
O(n) で増える桁数をセットするためにはどうしても O(n) オーダーの時間がかかると思う
どう転んでも無理ぽ
90:デフォルトの名無しさん
13/03/11 22:39:27.26
>>86
いや、出来る出来ないじゃなくて性能的な問題。
規模と精度で折り合いつけると倍精度で妥協する事になるでしょ。
91:デフォルトの名無しさん
13/03/11 22:41:50.61
桁数のオーダー O(2^n) じゃね?
92:デフォルトの名無しさん
13/03/11 23:37:58.09
>>73
むしろ固定じゃないものを連結するってどういう状況なんだ
93:デフォルトの名無しさん
13/03/12 00:00:53.04
めんどくさい奴らだな
typedef char d[10000] で1万桁だ
94:デフォルトの名無しさん
13/03/12 00:18:19.80
で?
95:デフォルトの名無しさん
13/03/12 01:15:16.44
InitCommonControlsEx イニットコモンコントロールセックス