C言語なら俺に聞け(入門編)Part 58 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
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
::

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


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

5400日前に更新/137 KB
担当:undef