C言語なら俺に聞け(入門編)Part 58at TECH
C言語なら俺に聞け(入門編)Part 58 - 暇つぶし2ch1:デフォルトの名無しさん
09/12/15 23:42:55
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 57
スレリンク(tech板)
★過去スレ
URLリンク(makimo.to:8000)
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.70【環境依存OK】
スレリンク(tech板)
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 133代目
スレリンク(tech板)
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

2:デフォルトの名無しさん
09/12/15 23:46:49
998で質問する度胸

3:デフォルトの名無しさん
09/12/15 23:50:38
#define HOGE 0x3FFFC020
だと、コンパイラ君に怒られることがあるかも?

4:デフォルトの名無しさん
09/12/15 23:51:16
ふう

5:デフォルトの名無しさん
09/12/15 23:55:35
volatile が重要で、ここは最適化するなということをコンパイラに知らせる。
メモリマップドIOや、別スレッドとの共有メモリなど。

6:デフォルトの名無しさん
09/12/15 23:57:20

>>前スレの998
#define HOGE ((volatile unsigned int *)(0x3FFFC020))

この文の意味がわかりません。
#define HOGE 0x3FFFC020
ではだめなのでしょうか?

7:デフォルトの名無しさん
09/12/16 00:06:26
あ、 #define HOGE 0x3FFFC020 じゃ、それ以前に駄目だな。
>>5 は、 #define HOGE ((unsigned int *)(0x3FFFC020)) じゃダメな理由ね。

8:デフォルトの名無しさん
09/12/16 00:10:29
>998 >6

それはこのマクロをどう使うかによる。
キャストしているところを見ると、メモリ領域を示しているのだろうから、
ポインタとして使うだろう。

全スレでも話題になったが、int とvolatile unsigned int *では型が違うからね。

単に0x3FFFC020なら、intとして扱われる。


9:デフォルトの名無しさん
09/12/16 00:53:47
int* a;
があったとき
a=(int*)calloc(100,sizeof(int));
*a=(int*)calloc(100,sizeof(int));
a=(int)calloc(100,sizeof(int));
*a=(int)calloc(100,sizeof(int));
a=(int*)calloc(100,sizeof(int*));
*a=(int*)calloc(100,sizeof(int*));
a=(int)calloc(100,sizeof(int*));
*a=(int)calloc(100,sizeof(int*));

どれが正しいか分からない


10:デフォルトの名無しさん
09/12/16 00:56:00
>>9
たかが8通り
全部コンパイルして試せばいいよ
正常に処理されたものだけ正しい
どれも正常に処理されなければ、おまでの常識は崩れ去る

11:デフォルトの名無しさん
09/12/16 01:06:51
キャストすんなうぜえ

12:デフォルトの名無しさん
09/12/16 01:10:24
>10

コンパイルできるから正しい訳じゃないぞ。
*a=(int)calloc(100,sizeof(int));
*a=(int)calloc(100,sizeof(int*));
はコンパイルは正常に完了するが、その後
正しくコーディングできるとは思えない。

13:デフォルトの名無しさん
09/12/16 01:11:49
バグなんてコンパイルを通ったからこそあるものだろうから

14:デフォルトの名無しさん
09/12/16 01:12:38
>>9
int*a=calloc(100,sizeof(int));

15:デフォルトの名無しさん
09/12/16 01:14:00
結論:キャストなどいらぬ

16:デフォルトの名無しさん
09/12/16 01:15:03
シンタックス上はどれも正しい
セマンティクス上では全ては正しくない

17:デフォルトの名無しさん
09/12/16 01:18:38
セマンティクス - 意味・説明・解説 : ASCII.jpデジタル用語辞典
URLリンク(yougo.ascii.jp)セマンティクス


18:デフォルトの名無しさん
09/12/16 01:20:17
>>11
a=calloc(100,sizeof(int));
*a=calloc(100,sizeof(int));
a=calloc(100,sizeof(int*));
*a=calloc(100,sizeof(int*));
どれが正しいの?

19:12
09/12/16 01:21:35
>10
追記

a=(int*)calloc(100,sizeof(int*));
もコンパイルは通るけど、間違いだろうな。

この後メモリリークや、領域破壊しないでコードが書けるなら、
そもそもこんな書き方はしない。

正しい書き方といえるのは
a=(int*)calloc(100,sizeof(int));

だけかな。>11のいうようにCではキャスト不要なのだから
キャストしないほうがよいスタイルだと思う。


20:デフォルトの名無しさん
09/12/16 01:22:09
>>18
たかが4通り、全て試してみればよい

21:デフォルトの名無しさん
09/12/16 01:23:38
過去にC言語の入門書2~3冊ほど読んだがどれもキャストしてた。

22:デフォルトの名無しさん
09/12/16 01:24:18
>18

左辺と右辺の型を考えようね。
a=calloc(100,sizeof(int));
a=calloc(100,sizeof(int*));
は文法上はどちらも正しい。
しかし
a=calloc(100,sizeof(int*));は普通は誤り。

23:デフォルトの名無しさん
09/12/16 01:25:17
>>14でFA

24:デフォルトの名無しさん
09/12/16 01:30:13
CとC++共通に使えるライブラリにしたいならmallocの戻り値キャストは必要。
(その場合はextern "C"も必要だが。)

Cだけで使うならキャストは不要。

25:デフォルトの名無しさん
09/12/16 01:30:51
>>11
アフォ
calloc は、void* を返す。コンパイル通るからいいなんて言うなよ!

26:22
09/12/16 01:31:25
なぜa=calloc(100,sizeof(int*));が誤りかというと
int *a;である場合、aが指す領域はaが指している型のサイズの整数倍の
領域が確保されなければならないから。

ポインタは指している型のサイズ分、アドレスが進むし、参照したときには
型サイズ分の領域を読むことになるから、実用上は

型Tと正の整数Nがあったときに
T *a = malloc(sizeof(T) * N);
となっていないと間違いと思ってよい。


27:デフォルトの名無しさん
09/12/16 01:32:20
>>9,11

まとめ

Cだけで使うなら
a=calloc(100,sizeof(int));
が正しい(Cはキャストいらない)

C++でも使いたいなら
a=(int*)calloc(100,sizeof(int));
が正しい

C#では使えない

28:デフォルトの名無しさん
09/12/16 01:33:10
>>27
× >>9,11
>>9,18

29:デフォルトの名無しさん
09/12/16 01:34:05
>25

Cでは
void*は関数ポインタ型以外のポインタ型の値を、キャスト無しで格納できるし、
元の型に戻したときに同じになることが保証されている。

C++ではmallocなんて使わずにnew使え。



30:デフォルトの名無しさん
09/12/16 01:34:37
>>14でFA

31:デフォルトの名無しさん
09/12/16 01:35:58
ファー!ファー!

32:デフォルトの名無しさん
09/12/16 01:36:21
FAR

33:デフォルトの名無しさん
09/12/16 01:37:52
ポインタは入門者には難しいから覚えなくていいよ

34:デフォルトの名無しさん
09/12/16 01:40:21
入門者が覚えることはたくさんある。ポインタなんて一番最後にちょろっとやればいい

35:デフォルトの名無しさん
09/12/16 01:41:14
実際の現場でポインタなんて滅多に使わないのに入門書にはさも重要かのように扱われているのが残念でならない。

36:デフォルトの名無しさん
09/12/16 01:42:51
ポインタはプロ中のプロと呼べるレベルのプログラマーだけに扱える分野。
入門者はまず制御文や条件文を目を閉じてでも書けるように上達するのが先

37:デフォルトの名無しさん
09/12/16 01:47:15
プログラマー ・・・ グラマラスな女性モデルのうちプロフェッショナルのことの略

38:デフォルトの名無しさん
09/12/16 01:49:44
質問あるならじゃんじゃん書いちゃって!分かる人が答えてくれるから!

39:デフォルトの名無しさん
09/12/16 01:50:16
>>29
君が言ってることは正しいが、
>>9 は、void* を int* あるいは int にキャストしようとしているので、
その例には当てはまらない。int* → void* ならC++でもキャストいらない。

40:デフォルトの名無しさん
09/12/16 01:54:38
キャストしない場合a=calloc(100,sizeof(int));

キャストした場合a=(int*)calloc(100,sizeof(int));

何か内部的なことに違いがあるの?
「キャストしなくていい」の?
「キャストしないほうがいい」の?
「キャストしてはいけない」の?


41:デフォルトの名無しさん
09/12/16 01:57:42
人に訊けば何でもすぐ分かると思って自分で調べようともしない
自分で調べてみて分からなかった時だけ質問しやがれ

42:デフォルトの名無しさん
09/12/16 02:00:29
国会図書館に保管してある文献を一通り読んでみたけど分かりませんでした

43:デフォルトの名無しさん
09/12/16 02:01:45
海外の文献もちゃんと調べたのか?

44:デフォルトの名無しさん
09/12/16 02:03:05
はい

45:デフォルトの名無しさん
09/12/16 02:03:36
とりあえず、コンパイルしたものを逆アセンブルしてくらべてミソ。

46:デフォルトの名無しさん
09/12/16 02:03:59
逆アセンブルは違法です

47:デフォルトの名無しさん
09/12/16 02:04:50
>>44
世界中の文献を調べて分からないようなことを知る人物などおりゃせん

48:デフォルトの名無しさん
09/12/16 02:05:29
スレの存在意義が消滅しました

49:デフォルトの名無しさん
09/12/16 02:06:05
法律で決まっているわけでもなんでもないでしょ、そんなもの。
それはそれとして、君は日本国憲法を読んでいるか。
逆アセンブルは何て書いてある。それはどういう風に書いてある、憲法に。

50:デフォルトの名無しさん
09/12/16 02:07:23
逆アセンブルは著作権法違反

51:デフォルトの名無しさん
09/12/16 02:08:10
特許侵害

52:デフォルトの名無しさん
09/12/16 02:09:36
逆アセンブル・逆コンパイラ・絶対ダメ

53:デフォルトの名無しさん
09/12/16 02:10:10
醍醐味だと思うけど

54:デフォルトの名無しさん
09/12/16 02:11:07
>>47
地球外知的生命体なら・・

55:デフォルトの名無しさん
09/12/16 02:13:33
>>49
何故に憲法w
「憲法」の定義から始めようかw

56:デフォルトの名無しさん
09/12/16 02:15:24
最近ずっと話題になってる小沢の暴論のコピペだよ。天皇の部分を変えただけ

57:デフォルトの名無しさん
09/12/16 02:16:16
>>55は世間知らず

58:デフォルトの名無しさん
09/12/16 02:20:02
コピペの誤用のほうを詰るべきだろ

59:デフォルトの名無しさん
09/12/16 02:23:35
>>40
そろそろ本題へ。
できるコードには基本的には違いありません。
基本はキャストするです。
キャストしないとコンパイラの警告レベルを上げるとwarning が出ますが、しなくてもコンパイルはできます。
昔は今の void* の代わりにintが使われていましたが、その頃はキャストしないのが普通だったようです。

60:デフォルトの名無しさん
09/12/16 02:24:01
>>40

「キャストしなくていい」 ・・・ 個人の趣味レベルのプログラム

「キャストしないほうがいい」 ・・・ 学校の授業レベルのプログラム

「キャストしてはいけない」 ・・・ プログラマー


61:デフォルトの名無しさん
09/12/16 02:26:05
C関連のスレではキャストの話でいつも盛り上がるね

62:デフォルトの名無しさん
09/12/16 02:26:52
見た目が面白いよね、うん。

63:デフォルトの名無しさん
09/12/16 02:28:55
>>40
キャストすべき

64:デフォルトの名無しさん
09/12/16 02:29:08
安全だろうが安全でなかろうが男ならどんな言語でも明示キャスト

65:デフォルトの名無しさん
09/12/16 02:29:40
>59
最後の文は正しいのか

66:デフォルトの名無しさん
09/12/16 02:31:22
可読性を重視したコーディングを心がけなさい>入門者たちよ

67:デフォルトの名無しさん
09/12/16 02:32:55
何が真実なのかさっぱりわからねえ

68:デフォルトの名無しさん
09/12/16 02:32:56
>>66
自己レス乙

69:デフォルトの名無しさん
09/12/16 02:34:22
>>67
自分で調べずに人に訊くからこうなる。まず自分で調べなさい

70:デフォルトの名無しさん
09/12/16 02:37:48
クライアントから要求された以上のプログラムを実現する必要性は無い。余計なことは技術の無駄遣いだ。

71:デフォルトの名無しさん
09/12/16 02:55:34
何の話かわからないけど
キャストは別にしなくていいんじゃないかな?
必要ないんならしないほうがすっきりして読みやすいよ

72:デフォルトの名無しさん
09/12/16 02:55:49
配列の全要素を同じ値にする関数があったと思うんですが名前を失念しました
なんという名前でしたっけ?
関数名(配列,値)
ってかんじだったはず

73:デフォルトの名無しさん
09/12/16 02:59:34
>>72
memset
fill

74:デフォルトの名無しさん
09/12/16 03:05:29
ありがとう!

75:デフォルトの名無しさん
09/12/16 04:44:57
関数内に宣言されるauto変数について教えてください。
staticを付けないと関数から抜けたときメモリが開放されますが以下の書き方だと
開放されないようです。なぜ開放されないのかが理解できません。
*sには見えないstaticが付いているのでしょうか?

char *func(void)
{
 char *s=malloc(20);
  (省略)
 return s;
}


76:デフォルトの名無しさん
09/12/16 04:58:37
解放されるのは変数sに割り当てられてるメモリであって、
変数sに入ってる値じゃないから。

77:デフォルトの名無しさん
09/12/16 05:17:07
char *s=alloca(20);
にすれば期待した動作に成るよ

78:デフォルトの名無しさん
09/12/16 05:56:30
ビットフィールドなるものがあるのを先日知りお試しPGを作成したのですが、ちょっとわからない箇所が。

struct tag1{
 unsigned int a  :1;
 unsigned int    :2;
 unsigned int b  :4;
 short id;
};

struct tag2{
 unsigned int b  :4;
 short id;
};
構造体tag1、tag2ともsizeofでサイズを見てみると6でした。
なぜ6となったのでしょうか?
------------------------------------------------------------------
int型のサイズは4バイト、short型のサイズは2バイトのOS(WinXP)で実行。
VCの設定項目である構造体メンバのアライメントは1バイトに設定しています。
------------------------------------------------------------------


79:デフォルトの名無しさん
09/12/16 05:58:36
ビットフィールドは悪魔だ
できるなら使わない方がいい
速度も大幅に低下するし

80:デフォルトの名無しさん
09/12/16 06:27:51
その通りだ
よくぞ言った

81:デフォルトの名無しさん
09/12/16 06:49:51
>>78
ビットフィールドを理解していれば何の疑問もない筈だが?
いくつになるべきだと思うんだ?

82:デフォルトの名無しさん
09/12/16 06:52:34
3になるとか思ったんじゃね?

83:デフォルトの名無しさん
09/12/16 07:37:34
78です。
ビットフィールドを知ったのが最近なので理解不足であります。
知っているのは、コロンの後ろの数値が :4 なら0x0~0xFまでが格納出来るエリアが確保されるくらいでしょうか。

このビットエリアが明らかにtag1、tag2違うのに同じサイズになるのが理解できません(´д`)



84:デフォルトの名無しさん
09/12/16 08:08:21
使ってるビットだけのエリアが確保されるんじゃなくて、
unsigned intのエリアを確保してそこから、そのビットの分を使用してるだけ。

85:デフォルトの名無しさん
09/12/16 08:21:30
それはない

86:デフォルトの名無しさん
09/12/16 09:18:50
あるってw

87:デフォルトの名無しさん
09/12/16 11:37:39
ビットフィールドはできるだけ局在化したほうがいいとは思うが、必要なら積極的に使えばいいと思う。
一々シフトしてアンドマスクかけて取り出すなんて面倒だし間違いやすい。
# 勿論、環境依存になるのでその旨ドキュメントに明記するのは当然として。

88:デフォルトの名無しさん
09/12/16 12:18:39
test

89:デフォルトの名無しさん
09/12/16 13:07:26
>>84 が正解。
だが、マスク・アンマスク方が、結局わかりやすい。
(値の取り出し用、設定用のマクロも作る)


90:デフォルトの名無しさん
09/12/16 18:55:11
あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
ぬああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ


PowerPCいい!!!!!!!!!!!!

割り込み処理ラク!!!!!!!!!!!
ベクタとかいらねえ、まんま関数を置けばいいんじゃん!!!!!!!!!!!!!!!!!!!!!!!!!


でも俺の中ではSH >>>> PowerPC
だけどな!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

91:デフォルトの名無しさん
09/12/16 19:15:14
やっぱ割り込みコントローラを自分で持ってる奴はいいなあ!!!!!

チョー気持ちいい
x86みたいにメンドクセーことしないで済む

ええなあ
ええ
ええぞ

92:デフォルトの名無しさん
09/12/16 19:49:49
ああもう素晴らしい
カウンタもついてる
SHみたいにナノセカンド単位でのカウンティングができる!!!!!!!!!
すばらしい!!!!!!!!!

OSのミリセカンドオーダーのスリープなんぞに頼らなくてもよい!!!!!!!!!!!!
蕎麦らしい!!!!!!!!!!

93:デフォルトの名無しさん
09/12/16 19:54:06
すーぱーひたちとかネーミングがダサすぎて話しにならん

94:デフォルトの名無しさん
09/12/16 19:57:46
はなしし?

95:デフォルトの名無しさん
09/12/16 21:03:00
ハードわからん奴カワイソス

96:デフォルトの名無しさん
09/12/16 21:04:07
91 :デフォルトの名無しさん [] :2009/12/16(水) 19:15:14

なんか91というラベルがあって
デフォルトの名無しさんという配列があるように見える俺の専用ブラウザ。

97:デフォルトの名無しさん
09/12/16 22:01:48
ncursesを使ってプログラム作ってます。(debian&gcc)
画面(端末)の背景全体を、特定の色にしようと思ったら
init_pairで指定した上でスペースで埋めないといかんのでしょうか?

98:デフォルトの名無しさん
09/12/16 22:02:07
*(unsigned int *)(0xAAAA)


というのが示すのは

int型のポインタが示す実体ですか?

99: ◆QZaw55cn4c
09/12/16 22:10:43
>>98
アラインメントを考えないことにすれば、そのとおりでしょうね。
ハードウェアよりな言い方をすれば、アドレス 0xaaaa から始まる int 型の変数の値ですね。

100:デフォルトの名無しさん
09/12/16 22:15:07
謎のトリさん現る

101:デフォルトの名無しさん
09/12/16 22:15:43
>98

「int型のポインタ」という言葉使いからして型がわかってないぞ。

*(unsigned int *)(0xAAAA)
の意味は
0xAAAAからsizeof(unsigned)分をunsignedとみたてて
アクセスしている。


102:デフォルトの名無しさん
09/12/16 22:20:35
>>97
画面クリアの類でいいんじゃね?

103:デフォルトの名無しさん
09/12/16 22:24:14
>>99
ありがとうございます。


>>101

ではどのようにいったらよいのですか?


unsigned int型のポインタ??

104:デフォルトの名無しさん
09/12/16 22:34:35
unsigned int*型の変数

まぁ別に難でもい伊田ろ。いい太古とはわ軽んだから

105:デフォルトの名無しさん
09/12/16 22:37:56
そうそう、ポインタっつってもメモリのどっかに記憶されてる変数だから

106:デフォルトの名無しさん
09/12/16 22:49:22
>>102
具体的には?
例えば、文字色を白、文字背景を青にして
なんも手を加えてない状態の端末背景が黒だと
文字のある所だけ背景が青になるんで、文字のないとこも
青色にしたいんですが。

107:デフォルトの名無しさん
09/12/16 22:54:55
バカの言うことに惑わされんなよ
ポインタは通常の変数として規定されていない。

108:デフォルトの名無しさん
09/12/16 22:56:25
バカがバカと罵るスレ

109:デフォルトの名無しさん
09/12/16 22:56:49
>103

型名は宣言から識別子を抜いたもの。
よって
int *a;
の型名は「int *」日本語なら「intを指すポインタ型」だろうな。

よく「int型のポインタ」という人がいるが
int *a[10];
とかよめないだろ。

この場合の型名は「int *[10]」で日本語なら「intを指すポインタの配列[要素数10]」型。

int (*a)[10];
だったら
型名は「int (*)[10]」で日本語なら「intの配[要素数10]を指すポインタ」型


110:デフォルトの名無しさん
09/12/16 22:58:20
C言語のプログラムをVisualC++で書いていて、そっちでは普通に動いていたのですが、
メモ帳にこぴぺしてCygWinで実行したら、

parse error before~

だとか

braces around scalar initializer

というようなエラーが出ます。
主に配列の宣言・初期化のあたりで発言するのですが。
何が原因なのでしょうか

111:デフォルトの名無しさん
09/12/16 22:58:41
データの「型」を指すってのは有り得ない事だよな。
型は変数でもメモリのアドレスでもない。

112:デフォルトの名無しさん
09/12/16 23:00:14
>>111
え?

113:デフォルトの名無しさん
09/12/16 23:13:06
int *p=(int*)214F23BC;
pは214F23BCを指しているがintは指していない。

114:デフォルトの名無しさん
09/12/16 23:15:43
int *p[10]は「int型の変数のアドレスを指すポインタ変数の配列[要素数10]」型
決して「intを指すポインタの配列[要素数10]」型ではないので間違えないように。

115:デフォルトの名無しさん
09/12/16 23:18:25
unsigned char TITLE[]="HOGE"

これはどういうこと?

116:デフォルトの名無しさん
09/12/16 23:19:58
??

117:デフォルトの名無しさん
09/12/16 23:23:01
>>115
HOGEという文字列の先頭へのchar型の変数を指すポインタ変数

118:デフォルトの名無しさん
09/12/16 23:25:51
おいおい……

119:デフォルトの名無しさん
09/12/16 23:26:56
>>177
char *x="abcde"
char x[]="abcde"
の区別ができてないバカ発見

120:デフォルトの名無しさん
09/12/16 23:27:09
配列の初期化

121:デフォルトの名無しさん
09/12/16 23:27:39
入門以前のやつは来るなよww
来ても良いけど回答者の側には来るなw

122:デフォルトの名無しさん
09/12/16 23:28:49
アウトプットは学習効率を良くするからなあ

123:デフォルトの名無しさん
09/12/16 23:32:44
>>119
117と177の区別ができてない馬鹿発見

124:デフォルトの名無しさん
09/12/16 23:32:54
>>115
わざわざunsingedがついているところで、深読みをしてしまう。
昔は、char が unsigned のコンパイラも多かったなあ。

125:デフォルトの名無しさん
09/12/16 23:34:23
>>115
書く場所によって意味が変わる。
関数の外なら
unsigned char TITLE[5]={'H','O','G','E','\0'};

の糖衣構文。

また、関数の中なら
auto unsigned char TITLE[5];
TITLE[0]="HOGE"[0];TITLE[1]="HOGE"[1];
TITLE[2]="HOGE"[2];TITLE[3]="HOGE"[3];
TITLE[4]="HOGE"[4];

の糖衣構文になる。


126:デフォルトの名無しさん
09/12/16 23:36:26
補足すると、代入を strcpy に置き換えるコンパイラもある。

127:デフォルトの名無しさん
09/12/16 23:40:52
>125

関数の外も中も同じ意味だぞ。

>126 (== 125?)

代入とstrcpyは別だろ。

unsigned char TITLE[]="HOGE"
は初期化であって代入ではない。

なんか昨日からポインタの知識が怪しい奴が回答側にいるな。

初級者は注意すること。
中級者は間違い探しをするとイイかも。

128:デフォルトの名無しさん
09/12/16 23:41:22
入門者が入門者に適当を答えるスレです。
上級者様は上級者様専用のむずかしーいスレにいって戻ってくるなよ

129:127
09/12/16 23:43:58
言い忘れたけど
unsigned char TITLE[]="HOGE"

のunsignedはない方がよいかも。

文字列リテラルの型はconst charの配列だから。


130:デフォルトの名無しさん
09/12/16 23:45:40
125は、初心者が陥りやすい大きな間違いをしている。

131:デフォルトの名無しさん
09/12/16 23:46:07
>>127 は、もはや荒らしの一種だな。

132:デフォルトの名無しさん
09/12/16 23:47:31
>>128
荒らすな。

133:デフォルトの名無しさん
09/12/16 23:50:25
>114

またわけのわからない読み方をするね。

宣言
int *p[10];
があるとき、pの型はint *[10]
ここまでは確定。

日本語にどう変換するかは規定されていないけどね。
あなたの日本語はよくわからない。

ポインタはポインタであって、アドレスではない。

アドレスを指すポインタ変数?


134:デフォルトの名無しさん
09/12/16 23:51:33
127にとっては
int x=100;
これは初期化であって代入ではないらしい

135:デフォルトの名無しさん
09/12/16 23:51:51
データ型ってのはサイズを示す指針だから、指しようがねえよw

136:デフォルトの名無しさん
09/12/16 23:54:08
マイナスの値を取らない、取り得ないものだったら
明示的にunsignedを付けたほうがいい。
他人に読ますときは特に

137:デフォルトの名無しさん
09/12/16 23:55:49
>113

>int *p=(int*)214F23BC;
>pは214F23BCを指しているがintは指していない。

pは214F23BCを指しているわけではない。
pの値が214F23BCであると言うだけ。

pは自分がどんな型を指しているか知っているので
*が適用されたときにどうやって値を取り出せばよいかわかる。

pが指しているのがintか、charか、struct{char x; short y; long z}なのかで
値の取り出し方が変わる。


138:デフォルトの名無しさん
09/12/16 23:58:05
>134

>int x=100;
>これは初期化であって代入ではないらしい

その通りですがなにか?


139:デフォルトの名無しさん
09/12/16 23:58:15
int *p[10];

これは普通に使うけど、

int (*p)[10];

これって使い道ある?
使ったことないぞ。


140:デフォルトの名無しさん
09/12/17 00:01:22
上級者さまうぜぇ
関係ない話するなや
こんなところで「入門者バーカ」って言って悦にいってないでさっさと首つって市ね。

141:デフォルトの名無しさん
09/12/17 00:03:43
>139

2次元配列を引数にとる変数の型。

void func(int p[10][10]);
のpの型がint (*p)[10]

後は組み込みでVRAMの先頭が与えられたときに
2次元配列として扱いたいときに、この型で領域の先頭を
指したりする。

142:デフォルトの名無しさん
09/12/17 00:04:20
質問に答えず、質問とは無関係などうでもいい話には必死。
自分で回答する気はぜんぜんないくせに、間違った解答を見つけたとたん待ってましたとばかりにたたきにくる。
マジうぜぇわ。

143:デフォルトの名無しさん
09/12/17 00:05:01
すくなくとも、このスレになってからは上級じゃなきゃできないような回答はひとつもないように見える。

144:デフォルトの名無しさん
09/12/17 00:05:14
>>139
typedef int (*p)[10]
なら、稀によく使う

145:厨房 ◆hfigpiEhOM
09/12/17 00:05:38
ゲームの改造とかやりたいんですけど、C言語でできるようになりますか?

146:デフォルトの名無しさん
09/12/17 00:06:26
プロアクションリプレイかコードフリークでも使ってろ

147:デフォルトの名無しさん
09/12/17 00:07:07
このスレのローカルルール
上級者は荒らし

148:デフォルトの名無しさん
09/12/17 00:07:21
ハッカーになりたいならCだけじゃ無理

149:デフォルトの名無しさん
09/12/17 00:07:46
>110

問題の出るコードを貼ってみたら。
だけど環境依存の問題だろうから、
こっちがイイかも

【初心者歓迎】C/C++室 Ver.70【環境依存OK】
スレリンク(tech板)

150:厨房 ◆hfigpiEhOM
09/12/17 00:10:45
>>147>>148
ポインターがどうのとか言っていたので改造コードにはC言語の知識が必要なのかと思いました。
以前



151:デフォルトの名無しさん
09/12/17 00:15:50
>>138
そうなんだけどさ、セクション配置かスタックに積むかで
バイナリレベルじゃ変わってくるじゃん?てことを言いたいんじゃないかとおも

152:デフォルトの名無しさん
09/12/17 00:33:52
>>145
とりあえず、アセンブラだけでなく機械語も覚えろ。
改造だけなら、言語としてはこれだけの知識しか使用しない。

153:デフォルトの名無しさん
09/12/17 00:35:25
実は、この5つすべて(Python, Java, C/C++, Perl, LISP)を勉強しておくのがいちばんいいのです。

これらはもっとも重要なハッキング用言語だというだけでなく、

それぞれプログラミングに対してまったく違ったアプローチをしているので、どれも非常に有益な勉強となるでしょう。

154:厨房 ◆hfigpiEhOM
09/12/17 00:43:26
>>152
アセンブリとか難しそうですね。
せめて自分でチートコード作れるくらいになりたいです。
まったくの初心者ですか今後ともよろしくお願いします。
ちなみに以前C言語も学習していましたが、ポインタで投げました。
また1からやり直したいと思います。


155:デフォルトの名無しさん
09/12/17 00:45:31
これ試してみろ。違いが解るから。

#include <stdio.h>

char glob[]="HOGE";

void func(int n){
static char sta[]="HOGE";
char aut[]="HOGE";

printf("d%回目\n", n);
printf("global: %s\n", glob);
printf("static: %s\n", sta);
printf("auto: %s\n", aut);

glob[1] = 'A';
sta[1] = 'A';
aut[1] = 'A';
}

int main(){
func(1);
func(2);
return 0;
}


156:デフォルトの名無しさん
09/12/17 00:49:25
>>153
C++ は要らねえな。

157:デフォルトの名無しさん
09/12/17 01:01:57
Cに固執するアンチC++の哀れなこと

158:デフォルトの名無しさん
09/12/17 01:08:00
条件によって変数の型を変えるプログラムって無理?
例えば
int a;
scanf("%d", &a);
switch (a)
{
  case 1:
    int b;
    break;

  case 2:
    double b;
    break;

  case 3:
    char b;
    break;
}

こんな感じで。


159:デフォルトの名無しさん
09/12/17 01:11:23
C++のポジションはすでにレガシーとなっているよ。
普及してるが、FORTRAN、COBOLと同じ道を歩み始めている。

160:デフォルトの名無しさん
09/12/17 01:14:26
int a;
scanf("%d", &a);
viod b;
switch (a)
{
  case 1:
    int c=(int)b;
    break;

  case 2:
    double c=(double)b;
    break;

  case 3:
    char c=(char)b;
    break;
}

161:デフォルトの名無しさん
09/12/17 01:29:59
>>158
通常は、必要に応じてキャストすればいい。
つか、どうしたいんだ?


162:デフォルトの名無しさん
09/12/17 01:49:45
>>158
無理。
たとえば、Windows の COM なら VARIANT型を使えば、なんとなくそれっぽいことができるが、入門レベルではない。

163:デフォルトの名無しさん
09/12/17 01:57:19
目的にもよるんだが、「共用体」を調べてみるといい。
つか、その質問だけでは何がしたいのかが伝わってこないから答えられん。


164:デフォルトの名無しさん
09/12/17 02:23:46
ユーザ関数に引数を渡す際に型を指定せずに処理がしたいんです。具体的には

ここをintでもcharでもいけるにしたい
        ↓
void function(double *v1)
{
  int i;
  for(i=0;i<10;i++)
  {
    //型の関係のない数値計算
    P[i]=~
  }
}
ていうことです。

165:デフォルトの名無しさん
09/12/17 02:24:31
んでいろいろ考えた結果
ユーザ関数ではとりあえずvoid*型でポインタを引数を受け取って、引数の中に型のタイプの情報(上のscanfのa)
を入れて、それに応じてキャストすればいけるかなと思ったわけです。

void function(void *v1,char a)
{
  int i;
  switch(a)
  {
  case 1:
    int *P;
    P=(int*)v1;
    break;

  case 2:
    double *P;
    P=(double*)v1;
    break;

  case 3:
    char *P;
    P=(char*)v1;
    break;
  }
  
  for(i=0;i<10;i++)
  {
    //型の関係のない数値計算
    P[i]=~
  }
}


166:デフォルトの名無しさん
09/12/17 02:38:04
ありえないな。
設計からやり直した方がいいよ。


167:デフォルトの名無しさん
09/12/17 03:00:09
struct DATA
{
  int iheight;
  int iweight;
}

この様に定義された構造体データ(idataNum件)を
身長順にダブルポインタを使ってソートをかけたいのですが、
そのダブルポインタのスワップ処理が分からず困っています・・・。

void swap( DATA** stData_ptr, int idataNum)
{
  DATA* stSwap;
  for( int i = 0; i < idataNum-1; i++ )
  {
    for( int n = i + 1; n < idataNum; n++ )
    {
      if( (*stData_ptr + i )->iheight > (*stData_ptr + n )->iheight )
      {
        stSwap = ( *stData_ptr + i );
        ( *stData_ptr + i ) = ( *stData_ptr + n ) ;
        ( *stData_ptr + n ) = stSwap ;
      }
    }
  }
}

てな感じで自分なりに試行錯誤してみたのですが、どうしてもスワップ部でエラーが出てしまいます。
どうか、お力をお貸しして頂けないでしょうか?

168:デフォルトの名無しさん
09/12/17 03:02:53
*(ポインタ+i)

169:デフォルトの名無しさん
09/12/17 03:16:59
p[i]って書けばいいものをわざわざ足し算したりするからわけわからなくなってるっつーねん。
なんで変な書き方したがるかなぁ?

170:デフォルトの名無しさん
09/12/17 03:19:54
え?

171:デフォルトの名無しさん
09/12/17 03:28:48
>>168
ありがとうございます。

stSwap = *(stMyData+i);
*(stMyData+i) = *(stMyData+n);
*(stMyData+n) = stSwap;

このようにやってみたところ、一応コンパイルは通るのですが、
実行させてみるとメモリー違反っとなってしまいます・・・。

>>168
ごめんなさい。その書き方もあまり分からないので・・・・

172:デフォルトの名無しさん
09/12/17 04:59:27
ありとあらゆるものをキャストする
この世の事実はすべてint型。
つまりint*型とint[]型とint型さえ使うことができればあらゆるプログラムの困難は解決する。

173:デフォルトの名無しさん
09/12/17 05:01:07
>>164
マクロで無理矢理やるというおよそ非実用的な手段がある。
#define DEFINE_FUNCTION(type) \
void function_ ## type(type *v1) \
{ \
  int i; \
  for(i=0;i<10;i++) \
  { \
    P[i]=~ \
  } \
}
そして、こんな風に引数として使いたい型だけマクロを並べる。
DEFINE_FUNCTION(int)
DEFINE_FUNCTION(dobule)
すると、それぞれ型に応じたfunction_int、funciton_doubleって関数が出来上がる。

こんなことするくらいだったら、C++のテンプレートを使ったほうがましなんだけど、ここはCのスレだし。

174:デフォルトの名無しさん
09/12/17 05:02:23
テンプレートとかただのアヒルタイプだし。マジうける。
そんなものもint*型の前にはひれふすことになる。

175:デフォルトの名無しさん
09/12/17 07:32:49
>>165
そういうときは、union使うといい

struct hoge {
 int data_type;  // 0:int 1:char 2:double ...
  union {
       char  c;
       int    i;
       double d;
    ...
  } u;
};


176:デフォルトの名無しさん
09/12/17 07:39:33
>>175
いやその解は有りえんから

177:デフォルトの名無しさん
09/12/17 11:26:16
void function(void *v1,char a)
{
  int i;
  for(i=0;i<10;i++)
  {
    //型に応じた数値計算
    switch(a)
    {
    case 1:
      //((int*)v1)[i];
      break;
    case 2:
      //((double*)v1)[i];
      break;
    case 3:
      //((char*)v1)[i];
      break;
    }
  }
}

こうはできないものかと妄想したが

178:デフォルトの名無しさん
09/12/17 12:59:18
目的がわからんのだよ。
そんなのが必要になる状況なんてありえないだろ。

179:デフォルトの名無しさん
09/12/17 13:20:43
型を別の引数で指定するくらいなら関数を分けるのが最善手。
そうでなけりゃ C++ で template 使え。

180:デフォルトの名無しさん
09/12/17 14:05:17
template利用する場合でも数値を扱うなら実数と整数では別けて特殊化するがね

181:デフォルトの名無しさん
09/12/17 14:48:26
漢字やひらがなでソートしたいのですが可能なのでしょうか
もしできるのなら詳しくソースコードを教えてください

182:デフォルトの名無しさん
09/12/17 14:49:25
文字コードそのままでソートしてるんじゃねえの

183:デフォルトの名無しさん
09/12/17 14:50:07
辞書データと比較してだな

184:デフォルトの名無しさん
09/12/17 15:04:33
並べたい順に並べるだけだな。


185:デフォルトの名無しさん
09/12/17 15:11:03
kwsk

186:デフォルトの名無しさん
09/12/17 15:14:02
住所録ソフトとか見たことないの?
漢字使ってる場合とかは読みを別に入力して、その読みの順でソートするんだよ?
読みはローマ字表記のものもあればかな表記のものあるけど
どちらにせよその後は普通のソートだよ


187:デフォルトの名無しさん
09/12/17 15:53:48
漢字に順番なんてものは無いんだから、
比較して自分が並べたい順に並べるしかないだろ。
「太郎」と「次郎」はどっちが先だ?


188:デフォルトの名無しさん
09/12/17 15:57:48
あいうえお順なら、次郎が先、逆順なら太郎
文字コード順なら太郎が咲き


189:デフォルトの名無しさん
09/12/17 16:02:37
DQNネームが流行ってる今、あいうえお順なんてふりがながふってないとムリ

190:デフォルトの名無しさん
09/12/17 16:07:14
太郎と書いて「ジャスティス」と読ませたり
次郎と書いて「つぐろう」と読ませたり
出生届けの読みが自由ってどうなんだろうな

191:デフォルトの名無しさん
09/12/17 16:14:43
>>190
読み仮名を登録しないだけかんだから「読ませ方」も自由なら「読み方」も自由
自分の好きな読み方で処理すれば良い

192:デフォルトの名無しさん
09/12/17 16:15:29
>>190
読みは登録しないだろ

193:デフォルトの名無しさん
09/12/17 16:16:26
それでも客は無茶を言う

194:デフォルトの名無しさん
09/12/17 16:18:22
OPをEDより先にしたいとか、前編より後編を先にしたい場合に
読み以外の何で整列させればいいんだろ


195:デフォルトの名無しさん
09/12/17 16:19:39
× 前編より後編を先にしたい場合に
○ 前編を後編より先にしたい場合に

196:デフォルトの名無しさん
09/12/17 16:21:05
>>194
正規表現
ハードコーディングで頑張れ

197:デフォルトの名無しさん
09/12/17 16:24:26
>>196
正規表現はCで使えたっけ?

198:デフォルトの名無しさん
09/12/17 16:29:36
>>193
「この顧客リストを強い順にソートしてくれ」

199:デフォルトの名無しさん
09/12/17 16:39:49
「グー・チョキ・パーを強い順番にソートしてくれ」

200:デフォルトの名無しさん
09/12/17 18:12:33
テキストファイルの中身を文字コードで出力する方法ないでしょうか?

201:デフォルトの名無しさん
09/12/17 18:14:30
16進ダンプ?

202:デフォルトの名無しさん
09/12/17 18:17:05
>>201
ん~000000とかの付属情報なしに純粋に文字コードだけ抜き出したいです。

203:デフォルトの名無しさん
09/12/17 18:19:31
文字コードって言ってることがわからないんだけど

204:デフォルトの名無しさん
09/12/17 18:25:04
テキストファイルの中身がunicodeで”あいうえお”と書かれていたら
”3042304430463048304a”と書き出されるイメージです。

205:デフォルトの名無しさん
09/12/17 18:31:57


意外と難しいのがセンタリング
フィールドの大きさをまず測る

一文字だけなら、その中心部分、半分に割った位置にフォントの中心部分を置けばいいが
文字数が増えたときのオフセットの取り方が意外とパッと出てこないもの。

普通にやると
「堀 川 掘 ら れ た 町」
にならず、
「堀川掘      られた町」

みたいになってしまう

206:デフォルトの名無しさん
09/12/17 18:33:34
16進ダンプを基本にして目的のものを書けばいいだけじゃ

207:デフォルトの名無しさん
09/12/17 18:34:50
         ,. ‐''三ヾ´彡シ,=`丶、ヾ´彡シ,=`丶、シ,=`丶、,=`丶、丶、
      /'".:=≡ミ_≧_尨彡三:ヽ、≧_尨彡三:ヽ、彡三:ヽ、三:ヽ、:ヽ、
     //.:;:彡:f'"´‐------ ``'r=:l------ ``'r=:l-- ``'r=:l ``'r=:l 'r=:l
     /〃彡_彡′,.=、 ̄ ̄ ,.=、 |ミ:〉 ̄ ̄,.=、 |ミ:〉,.=、 |ミ:〉、 |ミ:〉|ミ:〉
    'y=、、:f´===tr==、.___,. ==、._ゞ{=、.___,. ==、._ゞ{,. ==、._ゞ{==、._ゞ{._ゞ{
    {´yヘl'′   |   /⌒l′  |`Y} /⌒l′  |`Y}′  |`Y}  |`Y}|`Y}   ああきあきらあきらめあきらめた
    ゙、ゝ)       `''''ツ_  _;`ー‐'゙:::::l{ノ_ _;`ー‐'゙:::::l{_;`ー‐'゙:::::l{‐'゙:::::l{゙:::::l{     そそこそこでそこで試そこで試合
.    ヽ.__     ,ィnmmm、   .:::|!mmm、   .::|!m、   .::|!   .::|! .::|!
   ,.ィ'´ト.´     ´`"`"`゙″ .::::;'`"`"`゙″ .:::;'`゙″ .:::;'″ .:::;' .:::;'
イ´::ノ|::::l \         "'   :::/   "'   :::/'    :::/   :::/ :::/
::::::::::::|:::::l   ヽ、      ..::  .:::/.、   ..:: .:::/.、 ..:: .:::/.、: .:::/.、::/.、
:::::: ::: |:::::ヽ    ヽ、.......::::/..:::/!\\:/..:::/!\\::/!\\ !\\ \
::::::::::: |::::::::ヽ    ``''‐--ァt''′ |!:::ヽ:::\t''′ |!:::ヽ:::\|!:::ヽ:::\:::ヽ:::\:\
:::::::::::::|::::::::::::ヽ、       /i|iト、  |l:::::::ヽ:::::\  |l:::::::ヽ:::::\::::ヽ:::::\:ヽ:::::\:\
:::::::::::::|::::::::::::::/:ヽ、   ∧|i|i|i|〉. ||::::::::::ヽ:::::::\||::::::::::ヽ:::::::\:::ヽ:::::::\ヽ::::::\:\

208:デフォルトの名無しさん
09/12/17 18:47:02
改行はどうするんだろ。


209:デフォルトの名無しさん
09/12/17 18:47:23
>>206
16進ダンプのことあまり理解してなかったみたいなので出直してきます

210:デフォルトの名無しさん
09/12/17 19:38:54
それでいい

211:デフォルトの名無しさん
09/12/17 19:40:49
>>199
      パ
     / | \
   チ  |  グ
  /    チ    \
グ     |     チ
| \    |    / |
|  チ  グ  グ  |
パ    \  /    グ
|  パ  パ  チ  |
| /    |    \ |
チ     |     パ
  \    チ    /
   パ  |  チ
     \ | /
      グ

212:デフォルトの名無しさん
09/12/17 19:56:20
これはひどい

213:デフォルトの名無しさん
09/12/17 21:01:16
>>211
天才現る!
と思ったら、ソートできてねぇ!w

214:デフォルトの名無しさん
09/12/17 21:21:28
あらら

215:デフォルトの名無しさん
09/12/17 23:56:41
>>211
まず配置のルールがわからない
発想はともかくもっと根本的な部分を調整しろよ

216:デフォルトの名無しさん
09/12/18 00:08:46
>>211
ふっ

217:デフォルトの名無しさん
09/12/18 00:39:29
ポインタって、バグがあるのに正常にうごくことがあるから厄介なのかね。

int *p;
{
int x;
p=&x;
}

p[1]=500;
こんなのでも正常にうごいてる(ようにみえる)かもしれないし。

218:デフォルトの名無しさん
09/12/18 00:46:00
>176

>175の方法は普通によくやる。
ていうか>165を見てはじめに思いつくのはこれ。

>178
共用体は、引数に汎用性を持たせたいフレームワーク、メッセージインターフェイス
とかでよく利用する。

後はジャンプテーブルを使うために、関数のプロトタイプ宣言をそろえたいけど、
引数はいろいろあり得るような場合は、引数をvoid*にしたり共用体で渡したりする。

>179
関数のプロトタイプ宣言をそろえるのがミソなので、templateは使えない。


219:デフォルトの名無しさん
09/12/18 00:48:53
>217

そうだね。不具合が発生するのが、全然別の場所、タイミングだったりするのが
やっかいだよね。

220:デフォルトの名無しさん
09/12/18 06:06:03
>>219
たしかにやっかいだよね。

221:デフォルトの名無しさん
09/12/18 09:22:03
>>218
これだけ勘違いカキコする奴もメヅラシイな
普段何やってんだろ??

222:デフォルトの名無しさん
09/12/18 09:25:04
>>218 は別におかしくないぞ

223:デフォルトの名無しさん
09/12/18 09:31:21
俺も>>218はフツーのことを言ってるだけに見える。
別におかしくは無い。

224:デフォルトの名無しさん
09/12/18 10:05:26
>>218
おかしくないと思う

225:デフォルトの名無しさん
09/12/18 10:40:09
>>222-224
最後の行は何か勘違いしているように思えてならないが、
まあスレ違いだしどうでもいいや。

226:デフォルトの名無しさん
09/12/18 10:50:42
可変で関数ってのがあったはず、、、と思って調べてみたら見つかった
va_start
自分は使ったことないけど、これじゃダメなの?
URLリンク(wisdom.sakura.ne.jp)
>printf()関数などは、フォーマット指定子によって引数リストの個数と型をチェックしていますね
と同じように型チェックしてから、、とか


227:デフォルトの名無しさん
09/12/18 11:42:01
ようは、VBでいうVariant型を作りたいのか?

228:デフォルトの名無しさん
09/12/18 11:42:44
かなりダメな気がしてきた、、、

229:デフォルトの名無しさん
09/12/18 11:44:38
C++ならboost::anyが使えるんだけどな

230:デフォルトの名無しさん
09/12/18 11:49:19
>>226
結局、何らかの形で型を示す引数を一緒に渡すわけで
>>165 から何も変わっていない。

231:デフォルトの名無しさん
09/12/18 11:53:27
変わっていないな。

232:デフォルトの名無しさん
09/12/18 12:51:39
なんだよこのグダグダ

233:デフォルトの名無しさん
09/12/18 12:54:29
え?ディグダグ?

234:デフォルトの名無しさん
09/12/18 17:06:34
判ってない奴が頑張りカキコ
判ってる奴は奴では一行レスのチャチャ入れるだけだからグダグダになるのは仕方がない

235:デフォルトの名無しさん
09/12/18 17:37:08
それじゃできない。だけど、なにがしたいか分からんので、茶々入れるしかない。

236:デフォルトの名無しさん
09/12/18 19:25:04
>>235
> なにがしたいか分からんので、茶々入れるしかない。
もう一度 冷静に自分の言っていることを検証したまえ。

237:デフォルトの名無しさん
09/12/18 19:43:03
お、おれは分かってるよ。

キャッチコピーは「戦略的穴掘りゲーム」だろ?

238:デフォルトの名無しさん
09/12/18 19:50:19
ほとんど全てのレスに対して間違い探しゲームが成立してしまうのがこのスレッドの凄いところ

239:デフォルトの名無しさん
09/12/18 20:02:52
ライアーゲームは情報弱者には辛かろうな

240:デフォルトの名無しさん
09/12/18 22:49:36
::

よくバイソンとかシーインクリメントとかで見るんだけど
なんこれ。

241:デフォルトの名無しさん
09/12/18 23:27:25
>>237
戦略的穴掘りゲームおもしろそう

242:デフォルトの名無しさん
09/12/18 23:29:49
アッー

243:デフォルトの名無しさん
09/12/19 00:05:15
int main(void)
{
int num = 567;

num = num / 10;
num = num % 10;
printf( "%d\n", num );

return 0;
}


これを剰余演算を使わずに書きたいんですが、できますか?

244:デフォルトの名無しさん
09/12/19 00:10:37
dividend = quotient * divisor + remainder
remainder = dividend - quotient * divisor


245:デフォルトの名無しさん
09/12/19 00:13:09
num % 10

num - (num / 10) * 10
にする。

246:デフォルトの名無しさん
09/12/19 00:19:58
>>243
int num = 6:

247:デフォルトの名無しさん
09/12/19 00:20:34
以上です。

248:デフォルトの名無しさん
09/12/19 00:24:55
>>247
itoaを使う方法考えてたのに~

249:デフォルトの名無しさん
09/12/19 00:26:13
That's all.

250:デフォルトの名無しさん
09/12/19 00:30:20
>>248
すまんな…

251:デフォルトの名無しさん
09/12/19 07:11:41
>240

シーインクリメントとは斬新な呼び方だね。
けどなぜCスレで聞く?

もしかしてスルーが正解だったか?戦略的穴掘りに落ちちゃった?


252:デフォルトの名無しさん
09/12/19 08:42:08
fread()とfwrite()の意味を教えてください!

253:デフォルトの名無しさん
09/12/19 09:00:32
#include<stdio.h>

int main(void)
{
int data1 , data2, total, average;


printf("データ1? ");
  scanf("%d",&data1);
printf("データ2? ");
scanf("%d",&data2);

total = data1 + data2;
average = total / 2;


printf("合計 :  %d\n",total);
printf("平均  :  %d\n",average);


return 0 ;

}

何が間違っているか教えてくれないでしょうか?

254:デフォルトの名無しさん
09/12/19 09:11:20
最初のscanfの前の全角スペース?

255:デフォルトの名無しさん
09/12/19 09:12:04
>>253
何を聞きたいのか書いてないから
質問の仕方が間違ってるんじゃないの?

256:デフォルトの名無しさん
09/12/19 09:29:38
ディグダグ?

257:デフォルトの名無しさん
09/12/19 09:54:57
double average;
average=total/2.0;

もしかしてこれがしたいのでは無かろうか

258:デフォルトの名無しさん
09/12/19 10:00:03
>>257
言っておくがそれも間違いだからな
average = (double)total / 2.0;
じゃなきゃおかしなことになる

259:デフォルトの名無しさん
09/12/19 10:03:06
お前は何を言っているんだ

260:デフォルトの名無しさん
09/12/19 10:11:30
>>258
つられクマー。

261:デフォルトの名無しさん
09/12/19 10:59:48
また、scanfを連続させるときは

scanfが取ったバッファをクリアしてからでないとうまく取れない。

stdinから取ったら、stdinバッファをカラにしてから別のを取らないといけない

scanfは対象の変数のアドレスに値を入れるのではなく
stdinから取得バッファに入れてそこからアドレスに入れるのだ

262:デフォルトの名無しさん
09/12/19 11:10:03
>>258
何のための2.0だよ

263:デフォルトの名無しさん
09/12/19 11:26:31
malloc→freeと処理すると使っていたポインタはNULLポインタを指しますか?
それともmallocで確保したときのアドレスを保持したままですか?
まったく別でしょうか?

264:デフォルトの名無しさん
09/12/19 11:30:03
mallocで確保したときのアドレスを保持したままです
NULLを指すようにしたければ自分でNULLを代入してください

265:デフォルトの名無しさん
09/12/19 11:31:34
ありがとうございます

266:デフォルトの名無しさん
09/12/19 11:32:12
いえいえ

267:デフォルトの名無しさん
09/12/19 11:37:44
なんかいでもfreeしてやる

268:デフォルトの名無しさん
09/12/19 11:52:06
ポインタをfreeとかで開放するのって
メモリが有限だから?
仮にメモリ領域が無限だったらfreeしなくていいの?

269:デフォルトの名無しさん
09/12/19 11:54:24
駄目に決まってんだろカス

270:デフォルトの名無しさん
09/12/19 11:55:57
メモリが有限だからです
無限だったらしなくていいかもね

271:デフォルトの名無しさん
09/12/19 12:06:10
無限のメモリ領域なんて実現不可能なんだからその仮定は無意味

272:デフォルトの名無しさん
09/12/19 12:09:36
アドレスが足りなくなるからアウトだろ雑魚が

273:デフォルトの名無しさん
09/12/19 12:10:25
仮想メモリか。

274:デフォルトの名無しさん
09/12/19 12:50:23
俺が気に入らないもの
シミカァロン(英語は発音大事)抜き

ThisIsAPointerForMalloc = Mr_malloc(FUCKINGTOSHINGBUFFERSIZETHATFUCKINGOSINGXING)

if(ThisIsAPointerForMalloc == NULL)
  Fucking


なんかムカつく

普通は

if( (ThisIsAPointerForMalloc = Mr_malloc(FUCKINGTOSHINGBUFFERSIZETHATFUCKINGOSINGXING)) == NULL)


だろ


275:デフォルトの名無しさん
09/12/19 12:52:19
一生懸命長い綴り打ち込んでるのかと思うと目頭が熱くなる

276:デフォルトの名無しさん
09/12/19 12:53:28
また、defineは大文字で
っていう縛りもムカつく

ネイティブから見ると、大文字ってのは大声で叫んでるようにしか見えない。

つまり
FUCKINGOSINGXING
ってのは

FuckingOSingXing!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


って怒りながら叫んでいるように見えるのだ。


それと自分で書いておいてなんだが
is の i だけ大文字にするとすげえ不自然きわまる。


277:デフォルトの名無しさん
09/12/19 13:00:31
そうだねピカチュウだね

278:デフォルトの名無しさん
09/12/19 13:04:00
カビゴン♀って何かムラムラくるよね

279:デフォルトの名無しさん
09/12/19 13:42:47
例えばこんなものがあるとしよう

free(void*)

char *Memory_of_Love;

Memory_of_Love = (char *)malloc(MemorySize512);


ここで
free((void *)Memory_of_Love)


これも何だかなあと思う
void * は別の型にキャストできても
他の型からvoid* にはできないはずである。

またvoid*は「何の型でもいい」から、そのまま渡せば何が来てもウェルカムだから
キャストしても意味あらへん

280:デフォルトの名無しさん
09/12/19 13:45:21
誰も聞いてないから、チラシの裏にでも書いといてくれる?

281:デフォルトの名無しさん
09/12/19 14:19:13
ヤキソバうまかったわ
満足です

282:デフォルトの名無しさん
09/12/19 14:24:02
妄想上の相手とシャドーボクシングを始めたら、
林先生の出番だろw

283:デフォルトの名無しさん
09/12/19 14:26:50
亀田が勝ってしまったねえ

284:デフォルトの名無しさん
09/12/19 15:51:01
>>240
シーインクリメントインクリメントのことなら、
俺はシーイクイクって略してる

285:デフォルトの名無しさん
09/12/19 16:26:15
ちょっと心温まる豆知識
インクリメント・デクリメント・サクラメント・ハラスメント



Cだと++って書けば自動的に値が1増えるし
--って書けば自動的に値が1減るが

CPUの機能として、そのようなものを持っていないものが多い。
特にRISC。
これらのCPUではアセンブラになると逆にそういうことができない。
1命令で値を増減させることが出来ないだけで、ADDなどで増やしてやればいいだけだが。



残るサクラメントとハラスメントだが、CPUには何の関係もない。
単なる語呂合わせに過ぎん。

286:デフォルトの名無しさん
09/12/19 16:29:33
CISC はアセンブラで書くために命令が高級なんだよな。
今はもうアセンブラで書くやつはいないから CISC はレガシーだな。

287:デフォルトの名無しさん
09/12/19 16:31:20
>>285
いかにもわかったような口ぶりでウソ書いてるやつってちょくちょく
見るけど、どういうつもりなのかマジで疑問。

288:デフォルトの名無しさん
09/12/19 16:35:40
>>286
SSE3だのSSE4だのコンパイラが上手く扱えない妙な命令が次々に増えていく現状をどう見るかね

289:デフォルトの名無しさん
09/12/19 16:36:38
俺の大好きなSHや、PowerPC、ARMはアセンブリ命令としてインクリメント・デクリメント命令がある。
が、いろんなところでよく使われるMIPSはそんな便利な命令はない。

むしろ、インクリメントなどの命令があるSHとかがRISC陣営では異端中の異端


290:デフォルトの名無しさん
09/12/19 16:39:46
>>286
それ、認識が十数年くらい遅れてる。

291:デフォルトの名無しさん
09/12/19 16:40:54
SPARCのinc %regは add %reg, 1, %reg のマクロだけど
結局1命令なので実質あるのと同じ

292:デフォルトの名無しさん
09/12/19 17:05:40
また湧いてきたか

293:デフォルトの名無しさん
09/12/19 17:20:40
インクリメントするやつはちゃんとCPUさんありがとうコンパイラさんありがとうって
感謝しながら使えよ

あと風呂でションベンするときはお風呂の神様ごめんなさい


294:デフォルトの名無しさん
09/12/19 17:56:28
>>279
> void * は別の型にキャストできても
> 他の型からvoid* にはできないはずである。
逆だ。

295:デフォルトの名無しさん
09/12/19 18:48:15
>>294
いやあってる。
char *p;
if ((p = malloc(sizeof(struct hoge))) == NULL)
とかけるのは >>279 があっている証拠

296:デフォルトの名無しさん
09/12/19 19:14:04
できる/できない、で言えば間違いだろ

297:デフォルトの名無しさん
09/12/19 19:39:58
>>294-296
279は暗黙のキャストも知らないような
自称上級者なんだから触れんな。

298:デフォルトの名無しさん
09/12/19 20:11:55
>>297
あえて明示的にキャストすることでソースの可読性がうんたらかんたら



とかゴチャゴチャ言い出すぞきっと

299:デフォルトの名無しさん
09/12/19 20:23:48
>>279
>void * は別の型にキャストできても
>他の型からvoid* にはできないはずである。

>他の型からvoid* にはできないはずである。
が、まさしく「自分は初心者です」ってアピールしてるんだよな。

300:デフォルトの名無しさん
09/12/19 20:33:43
自分は初心者なはずである。

301:デフォルトの名無しさん
09/12/19 20:37:53
ポインタ変数なんてどんなものだろうが実態はただのINT型の整数なんだからキャストできないわけないじゃん。

12345678って書くか[12345678]って書くかの違いだけで。

302:デフォルトの名無しさん
09/12/19 20:49:04
>>301
ポインタが int という仮定は例外が多い。

303:デフォルトの名無しさん
09/12/19 20:54:54
>>301
ポインタは「整数型」への変換は保証されているが
「int」への変換は保証されていない。
(逆変換で戻したときに情報が失われる可能性がある)

304:デフォルトの名無しさん
09/12/19 21:17:28
倍数判定機を作ろうと思ったのですが、エラーが出てうまくコンパイルできません
どこが間違っているのでしょうか

#include<stdio.h>
void baisuu(int y)
{
int b;
for(b=2;b<=20;b++)
{
if(y%b)
printf("%dの倍数です",b);
}
int main(void)
{
int x;
printf("整数を入力してください\n小数点以下は切り捨てます\n");
scanf("%d",&x);
baisuu(x);
return 0;
}

305:デフォルトの名無しさん
09/12/19 21:24:07
>>304
!

306:デフォルトの名無しさん
09/12/19 21:30:07
(無保証な)ヒント:
論理式に単項式だけを書くやり方
そう if( y % 3)とかwhile( !p )とか
はかっこいい
ように見えて実は
古くダサい
し、下らないミスの温床

if( (y % 3) != 0)とか
while( p != 0 )とか
書く癖のほうが類似書式のプログラミング言語(Javaとか)
も使うようになった時を考えるといい

307:デフォルトの名無しさん
09/12/19 21:31:00
>>304
void baisuu(int y)にも}が足らん

308:デフォルトの名無しさん
09/12/19 21:37:54
とりあえず>>306 >>307の指摘部分を直したのですが
今度は「左辺値が必要」というエラーが出て
うまく倍数判定もできません

void baisuu(int y)
{
int b;
for(b=1;b<=20;b++)
{
if((y%b)=0)
printf("%dの倍数です\n",b);
}
}

309:デフォルトの名無しさん
09/12/19 21:42:51
int a,shidt;
ととして
((a-shift)?(a-shift):2)
の演算でおかしな挙動するので調べてみたら
a-shiftがマイナスでも真と判定されてた
(((a-shift)>0)?(a-shift):2)
としたらちゃんと動いた
真と偽の動作を勘違いしてました


310:デフォルトの名無しさん
09/12/19 21:43:31
>>308
それは代入だろ。

y % b == 0

311:デフォルトの名無しさん
09/12/19 21:45:36
>>310
おお、ちゃんと動きました
=と==の違いを忘れてました

312:デフォルトの名無しさん
09/12/19 21:54:24
意外と中級車も=と==を間違えるんだよなぁ
さすがに上級者はそんな間違いをする人はいなくなるが。

313:デフォルトの名無しさん
09/12/19 22:01:51
代入演算子 = が悪い。
どうしてこうなったのか。

おかげで等価演算子は == という悲しさ。。

314:デフォルトの名無しさん
09/12/19 22:07:20
比較式より代入式の方がソースコード中の出現確率が多いを思ったから代入を=にして比較を==にしたんだろ
面倒なことはできるだけしない、可能な限りシンプルにしたい、そう考えると納得がいく

315:デフォルトの名無しさん
09/12/19 22:22:54
五目並べの盤面評価関数ってどんなふうに作ったらいいと思う?

316:デフォルトの名無しさん
09/12/19 22:49:47
>>314
pascal のように代入を := にし、比較は == にすれば公平でいいかも。

317:デフォルトの名無しさん
09/12/19 23:02:43
pascal が嫌いな人が作った言語でか

318:デフォルトの名無しさん
09/12/19 23:08:46
=と==を間違えるなんて都市伝説だろ?
おれはめっちゃ初心者のときしか間違えてないよ。

319:デフォルトの名無しさん
09/12/19 23:19:27
確かに、ほとんど間違えないんだが、コーディング規則がちゃんとしていないと、いったん間違えると発見困難になることがある。
20年前は、
char *p, *q;
...
if (p = q) {...}
で、この = は間違ってないというような書き方が普通に行われていた。

320:デフォルトの名無しさん
09/12/19 23:29:35
ソースは可能な限り短いほうがいい。

…みたいな考え方のアフォとは一緒に仕事したくないな。

321:デフォルトの名無しさん
09/12/19 23:33:07
>>319
それは、今は警告でるし。

>>320
そういうのは状況によるとしかいいようがない。
「冗長に書けば書くほどわかりやすい」とか思ってるやつも勘弁して欲しいし。

322:デフォルトの名無しさん
09/12/19 23:35:15
変数は可能な限り少ない方が良い。
繰返し回数は可能な限り少ない方が良い。

323:デフォルトの名無しさん
09/12/19 23:40:12
>>319
30年前の間違いだろ。
20年前は既に警告出すコンパイラが主流だし
わかりやすさを優先することが当然になっていたよ。

まあ類は友を呼ぶというから
そういう人達の間ではそれが普通だったのかもしれんがね。

324:デフォルトの名無しさん
09/12/19 23:42:29
>>320そういうひとって
printfもpfとかに名前をかえて

int a;
void f(){
pf("asdf");
}

こんなことしたがるような人?

325:デフォルトの名無しさん
09/12/19 23:43:27
いや、それは論外すぎるだろ…

326:デフォルトの名無しさん
09/12/19 23:48:26
>>253です。
質問内容はコンパイルの出来ない理由を御聞きしました。
どうやら原因は全角スペースに問題があったみたいです。
回答してくれた方ありがとうございます。

327:デフォルトの名無しさん
09/12/19 23:49:58
>>322
そういう考えでできたのが構造体やクラスや配列なんだろうな

int Taro_age;
int Taro_ID;
char* Taro_Name;
char* Taro_EmailAddress;

int Hanako_age;
int Hanako_ID;




みたいに一個一個作ってたら大変だし。

328:デフォルトの名無しさん
09/12/20 00:13:15
int x;
int* p;
p=&x;
printf("%d",p);

この結果が毎回違うのはなぜ?
アドレス固定することはできないの?

329:デフォルトの名無しさん
09/12/20 00:17:15
>>328
pに格納しているxのアドレスを表示している

330:デフォルトの名無しさん
09/12/20 00:20:13
変数xが格納されているメモリの位置はOSが管理している

331:デフォルトの名無しさん
09/12/20 00:21:19
int x;
int* p;
p=&x;
printf("%d",p);

int x;
int* p;
p=&x;
printf("%d",&x);

int x;
int* p;
p=&x;
printf("%d",*p);

int x;
int* p;
p=&x;
printf("%d",x);

332:319
09/12/20 00:28:57
>>323
少々遅レスで悪いが、30年前だと、K&Rの出版年になっちゃいますね。
20年じゃなくてもう2,3年前かも知らんけど、warningがたくさん出るようになったのは ANSI-C普及と同時期だったような気がする。
前のは例が悪かったけど、少なくとも当時は、
while (!(p = p->next)) { ... }
といった書き方はごく普通だったと思うし、悪いともされてなかったと思う。

このスレでもキャストうざい派がいるように、いまだに警告無視する人はいるみたいですよ。

333:デフォルトの名無しさん
09/12/20 00:32:26
>>318
俺もそう思ってたが
先週 != を ! = と書いて
すっげー落ち込んだ

334:デフォルトの名無しさん
09/12/20 00:34:54
警告ってなんなん?問題があるならエラーにしろや

335:デフォルトの名無しさん
09/12/20 00:35:38
>>332
確かに、警告を出すのは比較的あたらしいコンパイラって印象がある。

そもそもこの警告って、C言語の文法に違反してるとかじゃなくて
よくある間違いだから、って理由だしね



336:デフォルトの名無しさん
09/12/20 00:37:21
int main()は値を返すべき

337:デフォルトの名無しさん
09/12/20 00:40:36
>>330
プゲラ
トーシロは黙ってろよwww

338:デフォルトの名無しさん
09/12/20 00:41:56
仮想メモリ。。

339:デフォルトの名無しさん
09/12/20 01:30:05
>309

それは可読性を考えたらこっちがよくないか?


(( a > shift) ? (a-shift) : 2)

340:デフォルトの名無しさん
09/12/20 01:34:36
>328

そのコードで&xの値が毎回同じになることを期待してはいけない。

自分でメモリ管理するのでなければ、変数やmallocの具体的な
値については、知らなくてイイし、依存するようなコードを書くべきではない。


341:デフォルトの名無しさん
09/12/20 01:45:17
関数外でxを宣言してみたら

342:デフォルトの名無しさん
09/12/20 01:53:36
せっかくCをやるんだからメモリのことは熟知したい

343:デフォルトの名無しさん
09/12/20 02:37:24
初心者です。文字列のコピーについてです。

char a[10];
strcpy_s(a, "こんにちわ"); ・・・・・・・ これは正常に動きます。
a = "こんにちわ" ・・・・・・・ これはエラーになります。なぜでしょう。

a は配列の先頭アドレスです。"こんにちわ"も配列の先頭アドレスです。
a = "こんにちわ"は、アドレスをコピーするだけなので正常に動く気がしてしまうのです。

エラーメッセージは、「const char [11]' から 'char [20]' に変換できません。」です。
変換?「=」は代入を行っているわけではないのでしょうか?

344:343
09/12/20 02:38:14
char a[10]; は char a[20]; にしてください。

345:デフォルトの名無しさん
09/12/20 02:45:40
配列の場合、変数なのは中身であって、配列を示す a 自体は変えられない。


346:デフォルトの名無しさん
09/12/20 02:49:45
"こんにちは"

347:343
09/12/20 02:58:26
>>345
ありがとうございます。ですが難しく、頭の中で理解ができていません。
もう少し優しく教えていただけると助かるのですが・・・。

348:デフォルトの名無しさん
09/12/20 03:04:01
char *a;
a = "こんにちわ";

349:デフォルトの名無しさん
09/12/20 03:17:27
エラーメッセージをよく読みませう

350:デフォルトの名無しさん
09/12/20 03:19:20
>>343
これを試してみ

char a[11];
a = "こんにちわ";

VBとかJavaに慣れてると、Cの配列や文字列は扱いづらいよね
最初のうちは参考書をちゃんと見た方がいいよ

351:デフォルトの名無しさん
09/12/20 03:26:34
a[10]が '\0' ってこと?

352:デフォルトの名無しさん
09/12/20 03:42:52
>>347
配列と文字列リテラルは一緒じゃないよ。

文字列リテラル"こんにちは"は、その時点でメモリのどこかに確保されてるわけじゃない。
確保されてない領域のアドレスを代入しても意味が無い。
配列がポインタに成り下がるのは"右辺"のみ。配列の内容はあくまで[20]の部分。
アドレスじゃなくて配列の内容を書き換えたいのだから、単純な代入ではできない。

353:デフォルトの名無しさん
09/12/20 04:06:47
char a[20] = "こんにちわ";

char *p = "こんにちわ";
は全くの別物。

354:デフォルトの名無しさん
09/12/20 04:12:26
将来的に
char a[20]="因習文法";
は禁止される予定

SJISとして
char a[20]={ 0["一貫文法"],1["一貫文法"],2["一貫文法"],3["一貫文法"],
4["一貫文法"],5["一貫文法"],};
てな感じしか許されなくなる可能性も示唆

355:デフォルトの名無しさん
09/12/20 04:13:32
>>350
バカ?

356:デフォルトの名無しさん
09/12/20 05:08:58
>>350>>355の1.1倍バカだね

357:デフォルトの名無しさん
09/12/20 06:20:56
>>343
配列とポインタ、アドレスの理解がごちゃごちゃになってるからそうなる。

358:デフォルトの名無しさん
09/12/20 06:40:45
だそうです!

359:デフォルトの名無しさん
09/12/20 07:41:09
モンスターが勝手に穴掘って落石連鎖に巻き込まれてる雰囲気
もちろん特点加算無し

360:デフォルトの名無しさん
09/12/20 07:59:15
残機も無し

361:デフォルトの名無しさん
09/12/20 08:02:19
あと数十年後
メモリが100GB、CPUの処理速度も今の数百倍とかになったら
C言語も変わるかなぁ

362:デフォルトの名無しさん
09/12/20 08:57:45
>>350の言うようにしても>>343と同じ結果になるだけ。
>>350は文字列と配列をなんにも分かってない。

363:デフォルトの名無しさん
09/12/20 09:29:34
>>361
そりゃスタイルは多少変化するだろうけど
コンピュータの仕様が根本的に変わらない限りCに望まれる働きも変わらないはず
新しい環境に合わせたプログラミングモデルを作るのはむしろ派生言語の役目だと思う

364:デフォルトの名無しさん
09/12/20 09:45:20
>>363
お前には言ってないからw

365:デフォルトの名無しさん
09/12/20 09:46:16
>343

とりあえず、「配列には代入できないから」と思ってください。

正確には、配列は式の中では、「その先頭要素を指すポインタ」
として評価されるが、それは「代入できない左辺値」であるから。

ついでに(初期化付き)宣言と式では文法が別物になっている。

char a[20] = "hello";
はOK

char a[20];
a = "hello";
はNG


366:デフォルトの名無しさん
09/12/20 09:52:41
>343

疑問の主旨とは変わるけど
strcpy_sだったら、そのコードコンパイル通らないんじゃないの?

CRT-Cだと思うから、こんなコードじゃね?
strcpy_s(a, sizeof(a), "hello");


367:デフォルトの名無しさん
09/12/20 09:55:14
初期化付き宣言でややこしくなってるのだなぁ
と思う

368:デフォルトの名無しさん
09/12/20 10:02:38
まあちょっと、誰もが一度は通る道だよな。
そして、だれもが曖昧な理解だけで通り過ぎていく箇所だわな。

369:デフォルトの名無しさん
09/12/20 10:05:55
>352

ちょっと説明が怪しいぞ。
Cの文法のイヤらしいところでわかりにくいのだけれどさ。

文字列リテラルの型はconst char[文字列長]で、普通は
書込不能な静的メモリ領域に置かれる。これは>343
でエラーになることとは直接関係ない。

「配列がポインタに成り下がるのは"右辺"のみ。」
はそんな感覚でよいと思うけど、正確には
「配列を評価すると代入できない左辺値となる」

char a[10];
a[0] = 1;

は左辺だけど、ポインタとして評価されている。

370:デフォルトの名無しさん
09/12/20 11:19:19
メモリ管理は、いっぺん自分でやってみたほうがいい。
最近は大学でさえ教えないからな
俺のときはやったのに



371:デフォルトの名無しさん
09/12/20 11:29:46
メモリ管理って?
Z80を使ったアセンブラ演習はした。
テンキーでマシン語入力して実行させるんだよな。
ステップ実行でメモリを観察しながら。

372:デフォルトの名無しさん
09/12/20 11:31:34
言ってみれば、自分でOSを構築するってことだな

メモリ管理に留まらず、スレッディングやマネジメントも含まれる。

聞いたら、そういうの今の大学じゃやってねえっちゅう話じゃねえか


なもんで、リバースエンジニアリングすらも満足に出来ないと。
それできないとウィルスのリバースエンジニアリングも出来ない=検知できない
だからセキュリティ業界は人材の確保が大変だとよ

373:デフォルトの名無しさん
09/12/20 11:39:35
アセンブラのみでBIOSを構築したり、OS作ったり
とにかくありとあらゆる既存のライブラリやミドルウェアなどを使わずに
自分で何もかも構成した。売り物には、かなわないにしろな
HDDの制御やファイルシステムなども自分で考えて構成したりした。

普通大学つったらそういうことやるだろ
が、今は何かねむたいことを言ってやらないと。

374:デフォルトの名無しさん
09/12/20 11:53:00
だから独り言なら他所でやれよ

375:デフォルトの名無しさん
09/12/20 12:20:43
やだやだー

376:デフォルトの名無しさん
09/12/20 12:31:25
char a[10]; の a の部分はラベルだとでも考えたら良い。


377:デフォルトの名無しさん
09/12/20 15:50:09
ツェーの仕様上、アドレスの受け渡しは

明白に誰が何に使っているか分かってないものは渡せません!

っていうお約束がある。


「こんにち波」っていうのは、あくまでも「まだどこにも属しておらず、アドレスともデータとも認められていない」
状態である。そのソースを呼んだ感じで言えば。


「文字列は連続したアドレスに入れられるよ」って言うのは人間だから分かっているだけで、
コンピュータ内部では「まだどこにもンなもんあらへんやん」という未知の物体なのである。


それと、アドレスだけでは「どこからどこまでか」が分からないので
これも単純にやりとりするわけには行かんのである。
配列は長さが明白に分かってるポインタのようなものだから、
それが分からないポインタには単純に代入できない。

378:デフォルトの名無しさん
09/12/20 15:52:46
          ___
         ξ _ ヽ
           ̄ ├-┤
    / ̄ ̄ ̄\)〆 |
    |       \ |
    ‐∩∩―┐   ||
     |・ ・   |   |│  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ┗ ^ ┛ |    | | <  ツェー!!!
    /777^l |    ||   \
    ) ̄ ̄_ノ__|   lヽl|     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ,―  ̄ ̄_η_|/V^  |
  l   ̄ ̄|_Ξ)/   |
  `‐―┬┘\/   |
      |        | 
      |  〇     | 
      |        |
      |__∧___|
      |   |   |    ∩ 
      |   |__|_ __ ∫ )
      |       \ ̄ ノ 
      `―┬‐―┬‐┘ ̄  
        /  /
      /  /
     /  /
,~^⌒\__/

379:デフォルトの名無しさん
09/12/20 16:47:46
byte* p=malloc(10000);
free(p);

これを行うと何がおこる?
mallocで確保した10000個の領域が全部開放されるの?

380:デフォルトの名無しさん
09/12/20 16:54:26
連続したbyte10000個分の領域1つが解放される

381:デフォルトの名無しさん
09/12/20 16:59:09
だよね。
じゃあbyte* p=malloc(10000);
ってのは悪いやりかた?

382:デフォルトの名無しさん
09/12/20 17:11:59
何でそう思うの?
byteのサイズがいくつになるかわからんから、 sizeof (byte) * 10000 で

383:デフォルトの名無しさん
09/12/20 17:12:43
つ「メモリリーク」
一般的なOS上で動く寿命の短いソフトなら起こっても大した問題は起きない
デーモンとかサービスみたいな起動しっぱなしのソフトや低レベルなソフトとかだと死亡

384:デフォルトの名無しさん
09/12/20 17:12:46
って可変にしたけりゃrealloc使えばいい

385:デフォルトの名無しさん
09/12/20 17:15:48
>>379-384
これこそ、なにがしたいのかわからん質問。

386:デフォルトの名無しさん
09/12/20 17:51:20
>>371
Z80 にステップ実行させる機能(内部割込み)はない。それはZ80 ではないのでは?

387:デフォルトの名無しさん
09/12/20 17:57:18
>>384
過去にmalloc()/realloc() したときに取得したサイズを、現在 get できればいいのですが。
やっぱりどこかに覚えとくしかないか。

388:デフォルトの名無しさん
09/12/20 17:57:58
Z80 のエミュレータかもしれない

389:デフォルトの名無しさん
09/12/20 18:01:12
疑問の全てに実用性を求めることの意味を問いたい

390:デフォルトの名無しさん
09/12/20 18:10:15
>>389
答えられない質問には、その質問自体が無意味であることを主張した方が
自分の優位性を保てるから

391:デフォルトの名無しさん
09/12/20 18:25:15
すいません。流れをぶった切って質問します。

今、10日くらいでhelloから始まり今if文とかの入門書に書いてある
関数の基礎を一回ずつコンパイルしました。
それから配列についてちょこっとやってます。
それで今 実行の引数やポインタに進んでいます。

そこで、勉強法としてそのまま先に進めていっていいのでしょうか?
それとも変数や配列を極めたほうがいいでしょうか?

ちなみに自分はあんまり関係ない機械関係の運用の仕事をしていてすぐに実務に使用するわけではありません。
目的は、プログラミングの勉強をしてゲームプログラムを自分で作れるようになりたいです。

392:デフォルトの名無しさん
09/12/20 18:27:43
>>387
内部的には持ってるだろうけど、通常の方法では無いね。
まあ最後のメンバーが可変長の構造体作って管理する手もある。

393:デフォルトの名無しさん
09/12/20 18:28:19
>>391
訳分からなくてもとりあえず最後までやる
同じ本を何度かやってりゃ分かるようになる

クズ本じゃなければの話だけど

394:デフォルトの名無しさん
09/12/20 18:29:52
まあ先に進んでも、いずれどこが理解してないのかが分かってくるんじゃね?
途中の部分を極めるって考えはどうなのかね

395:デフォルトの名無しさん
09/12/20 18:37:39
いいんじゃないかな。どうでも

396:デフォルトの名無しさん
09/12/20 18:38:16
一回だけしかコンパイルしないんじゃ、理解しないまま先に進んでないか?

397:デフォルトの名無しさん
09/12/20 20:09:23
>>386
ICEとかエミュとか上位互換のカスタムチップとかクロックそのものを止めるとか、
いくらでもステップ実行させる方法はある。
今は学習用だとWin上でエミュが主流だから、テンキー入力するのはちょっと前の世代か
ハンダ付けの実習も兼ねてるか。

398:デフォルトの名無しさん
09/12/20 20:14:16
じゃあここをこう変えたらどうなるんだ?という疑問が沸く。
  ↓ ↑
コンパイル&検証orエラー

このプロセスを経ずして理解できたなどと、おこがましいとは思わんかね?

399:デフォルトの名無しさん
09/12/20 20:34:15
⊂⌒~⊃。Д。)⊃ ピクピク

400:デフォルトの名無しさん
09/12/20 20:39:28
>380
まちがい。なぜわざわざ嘘を教えるの?それともマジ?
C++のnew、deleteと勘違いしていないか?

>379, >381

>380は間違い。

>379自体は問題ない。
ただし1000がsizeof(byte)の倍数になっていないと、
pを使うときに問題が起こるかも。>382はそのことを言っている。





401:デフォルトの名無しさん
09/12/20 20:43:49
setupファイルが簡単に作れるC++の統合開発環境を教えてください.net以外で

402:デフォルトの名無しさん
09/12/20 20:47:26
教えてくれるといいですね

403:デフォルトの名無しさん
09/12/20 21:02:37
質問です。コマンドラインで-Dと指定したときに条件付けしようとしています。
次のように書くと動作するのですが
while(--argc > 0 && (*++argv)[0] == '-')
if((*argv)[1] == 'D') debug = 1;

while(--argc > 0 && (*++argv)[0] == '-' && (*argv)[1] == 'D')
と書くと動作しません。
2個目の条件(*++argv)[0]でargvが1進み、3個目の条件では+1されたargvが参照されると期待しているのですが、
こうはいかないのでしょうか。
ちなみに、
while(--argc > 0 && (*++argv)[0] == '-' && (*++argv)[1] == 'D')
とした場合segmentation errorとなります。
また3番目の条件をargv[0][1]=='D'などと指定してもうまくいきません。
whileの条件中だけで全て条件付けることはできないのでしょうか。

404:デフォルトの名無しさん
09/12/20 21:05:18
>>403
目的を達するために getopt を使うとか strcmp で比較するのはどう?

405:デフォルトの名無しさん
09/12/20 21:06:48
3つ並べた時の短絡評価って保障されてんの?

406:デフォルトの名無しさん
09/12/20 21:10:58
>377
ネタにマジレスするのは、どうかと思うが、つっこんでみる。
怪しい知識をたとえ話にするから、よくわからんぞ。
知らない人は理解できないだろうから、誤解しようも無いが・・・・・・。

>明白に誰が何に使っているか分かってないものは渡せません!っていうお約束がある。
そんな約束はない。Cのポリシーは、明示的にせよ、暗黙にせよソースにかかれたものは
その通り実行する、である。だからポインタにどんな値がセットされていようが、その通り動作しようとする。

>「こんにち波」っていうのは、あくまでも「まだどこにも属しておらず、アドレスともデータとも認められていない」
状態である。
リテラルはコードの中に埋め込まれている。メモリ上に置かれているからポインタも取れる。

>配列は長さが明白に分かってるポインタのようなものだから
配列とポインタは別物。




407:デフォルトの名無しさん
09/12/20 21:12:54
クラックするのにC言語使ってる人っているの?

408:デフォルトの名無しさん
09/12/20 21:13:57
>>403
debug=1 はどこにあるの?

409:デフォルトの名無しさん
09/12/20 21:15:57
>>403
最初の引数が -D じゃなかったらwhileループから抜けてしまって2個め以降の引数を見ないのでは?

410:デフォルトの名無しさん
09/12/20 21:28:53
>403

とりあえず
while(--argc > 0 && (*++argv)[0] == '-' && (*argv)[1] == 'D')
でも問題なさそうだけど。どういう動作を期待しているの?

ちなみに次のように、[]演算子を使って書く方がわかりやすいと思う。
while(--argc > 0 && argv[argc][0] == '-' && argv[argc][1] == 'D')

411:デフォルトの名無しさん
09/12/20 21:33:09
値が0のint型変数2つどうしで引算をすると
すごくでかいint型限界値の値が出ますけど
これって値が0同士の変数で計算はするなということでしょうか?

int table[UCHAR_MAX+1];
char *text = "nanntokakanntoka";
int shift;
int i;

問題の演算: (BMWCT[(UINT)text[i]]-shift)
演算時のそれぞれの値
BMWCT[(UINT)text[i]] ==0;
shift==0;
iは任意

412:403
09/12/20 21:35:01
>>404
getopt調べてみました。かなり便利そうですね。ありがとうございます。

>>409
それでした。この行以前に違うコマンドで認識させている部分があって、-Dは2番目の引数になっていたためでした。
こんな1種類の引数を検出する方法はそもそも汎用性がなさそうですね。
実際に使う時はcaseで場合分けなどしようと思います。
ただ条件文の評価の仕方は疑問が取れてすっきりしました。ありがとうございました。

413:デフォルトの名無しさん
09/12/20 21:35:21
自分で0を代入してないなら、その変数は0じゃないぞ

414:デフォルトの名無しさん
09/12/20 21:35:44
>>411
意味が分からないので動作するソースを貼ってちょ

415:403
09/12/20 21:39:06
>>410
その方がシンプルですね。参考にします。

416:デフォルトの名無しさん
09/12/20 21:39:14
bool型を返す関数foo(), bar()があるとき、

foo()&&bar()

foo()&&bar()
の違いを教えてください。


417:デフォルトの名無しさん
09/12/20 21:42:24
>>416
同じじゃね?

bool の表現が 0 1 だけじゃないかもしれないし

418:デフォルトの名無しさん
09/12/20 21:44:15
foo() && bar()

bar() && foo()

は違うけどな。

419:デフォルトの名無しさん
09/12/20 21:46:56
>>416
てか、上と下が同じに見えるんだけど。

420:416
09/12/20 21:52:18
申し訳ございません。
foo()&&bar()

foo()&bar()
の違いでございました。。。

421:デフォルトの名無しさん
09/12/20 21:56:37
>>415
ごめん解決したわ
unsigned int とint で演算やってたんだがintのみでやったら変な値でなくなった

422:デフォルトの名無しさん
09/12/20 21:57:21
>>414
>>415 ×
ごめんなさい間違えました

423:デフォルトの名無しさん
09/12/20 22:09:51
>>421
え。それじゃ、 (unsigned int)0 - 0 が、0 にならなかったってこと?

424:デフォルトの名無しさん
09/12/20 23:12:09
配列はポインタじゃねえ!というのに
なんで **argv と *argv[]は
同じに見てくれるのですか。コンパイラは。(倒置法)

425:デフォルトの名無しさん
09/12/20 23:16:08
因襲というもんです
立ち入らないで下さい。

426:421,411
09/12/20 23:19:54

UINT shift
shift==0
(UINT)text[i]==110  正常
BMWCT[(UINT)text[i]]==0 正常
(BMWCT[(UINT)text[i]]-shift)==4294967289 異常

>>423
こんな感じ
BMWCTとshiftとかをUINTにしたりintにしたりと変えてみた結果int同士だとうまくいった
UINT同士だとだめだった

427:デフォルトの名無しさん
09/12/20 23:22:08
>>424
配列もポインタも、アドレスを表現しているという意味で同じだから。

428:デフォルトの名無しさん
09/12/20 23:29:32
配列ってポインタよりも高級な構造という扱いなんでしょ?

429:デフォルトの名無しさん
09/12/20 23:29:54
否、シンタックスシュガーという名の因襲と
理解するのが一番。深入りしない。苦労して
覚えない。その為にコンパイラにシンタックスチェッカーが
付いているんだからさw
エラーを指摘せず勝手に内部でコード作って実行しちゃう
JavaScriptとかと違ってCは良心的。但し生産性が高い
言語では無くなってるけどね。

430:デフォルトの名無しさん
09/12/20 23:43:19
もともと場当たり的に作られた言語だし

431:デフォルトの名無しさん
09/12/20 23:45:31
>>427
という説明が char argv[][] という有名な落とし穴へ子羊を蹴落とす

432:デフォルトの名無しさん
09/12/21 00:02:58
*(hoge + i) と hoge[i] は等価。つまり配列とはアドレス演算である。
なお、後者は前者のシンタックスシュガー、C言語規格によるただの"親切"である。
i はインデックスではなく、hoge が示すアドレスからのオフセットである。

これでいいですか?

433:デフォルトの名無しさん
09/12/21 00:06:59
>424

「関数のプロトタイプ宣言の中では」配列とポインタは同じ。

Cでは関数に配列を渡すことはできない。
しかし使う場合は実引数として配列名を書くことが多く、それは配列の
先頭を指すポインタとして評価され、ポインタを渡していることになる。

以下の3つは全て同じ意味。
void func(int *a);
void func(int a[]);
void func(int a[N]);


434:デフォルトの名無しさん
09/12/21 00:07:55
>>397
上位互換チップはありだと思いますが、一般にICE ではどうやって実行を一命令ごとに停止させるのでしょうか?
やっぱりCPU のステップ実行割り込みを利用してそうなんですが。

435:デフォルトの名無しさん
09/12/21 00:12:37
色々あるけど、ROMやRAMを乗っ取って1命令後に停止させる命令を埋め込むのは、力技だなと感心したことがある

436:デフォルトの名無しさん
09/12/21 00:14:28
>>419
ショートカットの有無かな?&& で前の式が偽だったら、後の式は評価すらされない、という。

437:デフォルトの名無しさん
09/12/21 00:15:35
>427

君大間違い。配列とポインタは全く別物。

>432
「つまり配列とはアドレス演算である。」
この一文が致命的な誤り。その他の部分はあっている。

1番目のポイント 宣言と式では文法が別物になっている

2番目のポイント &, *のオペランドになったとき以外は配列名のみを書くと、
配列の先頭要素を指すポインタとして評価される。

二項演算子[]はポインタと整数型をオペランドとし以下のように定義する。

*(p + i) ≡ p[i]

438:デフォルトの名無しさん
09/12/21 00:25:17
>>437
オメー 何書いてあるかわかんねネーンダy

439:デフォルトの名無しさん
09/12/21 00:57:14
ポインタはアドレスを指している場合が多いが、アドレスはポインタではない

440:デフォルトの名無しさん
09/12/21 00:59:34
>>438
*(hoge + i) と hoge[i]以外で、配列とポインタで異なる事例はいくらでもあるから、
配列 == ポインタという図式は成り立たないということ。

>>437
&, *ではなくて&, sizeofだよね。

441:デフォルトの名無しさん
09/12/21 01:01:54
Cには実はアドレスという概念すらないぞ
&変数はあくまでも整数定数値。&を省略出来るケースも
多い。それを適切なポインタにキャストするだけ
そのポインタが&を指定した変数を指してくれてるかどうかは
コンパイラの気分次第。あんまし曖昧だととんでもないところ
を指すかも知れない。

442:デフォルトの名無しさん
09/12/21 01:03:40
>Cには実はアドレスという概念すらないぞ

( ゚Д゚)ハァ?

443:デフォルトの名無しさん
09/12/21 01:06:31
1行目を読んで、メモリアドレスを抽象化した存在だからという説明に向かうのかと思ったが、
2行目以降が残念な文章だった。

444:デフォルトの名無しさん
09/12/21 01:09:11
>>434
Z80のデバッガだと、止めたいアドレスをRST命令に書き換えて、デバッガを実現していた。

445:デフォルトの名無しさん
09/12/21 01:12:05
int a[10];
&a[2]は「アドレス」としてコンパイル時に定められる
翻って
int a[10],i;
&a[i]は文法上はアドレスとしては定義不能。
あくまでもコンパイラに恣意的な解釈裁量権がある。

従って「アドレス」という概念は定まっているとは言い切れないんだ
な。これがw。

446:437
09/12/21 01:13:37
>440

そう、*じゃなくてsizeofでした。

実はもう一つ文字列リテラルを配列の初期化子として与えたとき
というものがあるのだが、これは宣言の中だからね。


447:デフォルトの名無しさん
09/12/21 01:13:43
慣習的解釈がされている部分もあるということですね

448:デフォルトの名無しさん
09/12/21 01:13:46
>>445
お前>>441?何の本の受け売りか知らんが、ちゃんと理解してから書き込めよ

449:デフォルトの名無しさん
09/12/21 01:18:42
>>440
もとの質問 >>424 は、ポインタと配列とではどこが同じなのか(意訳)ということを聞いてるんだよ。

450:デフォルトの名無しさん
09/12/21 01:22:24
>445
根比べになっているけどさ、「アドレス」が無いってのは正しい。

ポインタの内部表現がどうなるべきかは定められていない。
その割には単項&がアドレス演算子だったりするのだけれど。

型T,識別子xにたいして
T x;
という宣言があったとき、&xがxを指すポインタを生成し、
*(&x)の評価結果がxでアリさえすればよい。

>&a[i]は文法上はアドレスとしては定義不能。
この文章の意味不明。
&a[i]は文法上何の問題もなくコンパイラも実行もできる。
ただし実行結果が保証されるのは0~9だけ。

451:デフォルトの名無しさん
09/12/21 01:26:33
>445
>&a[i]は文法上はアドレスとしては定義不能。

iがゴミの値だからどこにアクセスするかわからないのだけれど、そういう意味なの?

&a[i]→&(*(a + i))でiの値は不定。


452:451
09/12/21 01:28:43
ごめん、舌足らずだった。
&a[i]→&(*(a + i))→a + i
でiの値は不定なので、ポインタの値も不定。

453:デフォルトの名無しさん
09/12/21 01:58:56
*(&x)って表現は許されていいでしょうか?

454:デフォルトの名無しさん
09/12/21 02:33:07
はい、もちろん

455:デフォルトの名無しさん
09/12/21 02:35:01
>>450
&a[2]がコンパイル時定数になると書かれているように見える点については突っ込まなくていいのか?

456:デフォルトの名無しさん
09/12/21 08:10:58
>>427をみて
>>437が出てくる意味がわからん。

intとdoubleはどちらも数値と言う意味で一緒

intは整数でdoubleは実数だからまったく別物!int==doubleはまったく違う!
つってるやつと同じ感じだな。

457:デフォルトの名無しさん
09/12/21 09:27:28
>>386
失礼、68000じゃった…。68000シリーズのどれかの石じゃった。

458:デフォルトの名無しさん
09/12/21 10:19:39
>>457
おじいちゃーん、免許更新の際にはに認知症のテストを受けてね

459:デフォルトの名無しさん
09/12/21 12:07:05
うちは8085だったなぁ

460:デフォルトの名無しさん
09/12/21 16:57:28
>>426
んなバカな。

461:デフォルトの名無しさん
09/12/21 18:42:26
>>426
んなアホな。

462:デフォルトの名無しさん
09/12/21 19:16:39
>>459
Z80 の人気はどうしてなのか?と今でも首を傾げています。

463:デフォルトの名無しさん
09/12/21 19:18:39
>>462
命令がシンプルだからじゃね?

464:デフォルトの名無しさん
09/12/21 19:19:41
nop

465:デフォルトの名無しさん
09/12/21 19:59:56
>>462
8080との互換性

466:デフォルトの名無しさん
09/12/21 20:23:59
>>465
そんな答えじゃったら、なんで8080互換は人気なの?

467:デフォルトの名無しさん
09/12/21 20:27:11
>>466
自分で考えてくれ

468:デフォルトの名無しさん
09/12/21 21:37:34
>>462
たまたま、パソコンがたくさん売れ始めた時代にZ80を採用した機種が多数派で
みんながそれで育ったから。

パソコンに限った話じゃないれけど、世の中性能とか関係なく「売れたもん勝ち」なんだよ。

469:デフォルトの名無しさん
09/12/21 21:40:22
>>466

8086 vs. Z80 vs. 6809 vs. 6502 その4
スレリンク(i4004板)

ここのレスのジジイどもに一言ガツンと言ってやってください

470:デフォルトの名無しさん
09/12/21 21:40:49
>>467
TK-80?

471:デフォルトの名無しさん
09/12/21 21:41:04
×>>466
>>468

とにかく勘違い頑固ジジイどもばかりで困ります


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch