1 名前:デフォルトの名無しさん [2009/12/15(火) 23:42:55 ] C言語の*入門者*向け解説スレッドです。 ★前スレ C言語なら俺に聞け(入門編)Part 57 pc12.2ch.net/test/read.cgi/tech/1260020924/ ★過去スレ 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 ★初心者、初級者の方は他の質問スレのほうが良いかもしれません。 例えば 【初心者歓迎】C/C++室 Ver.70【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1258873470/ とか ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 133代目 pc12.2ch.net/test/read.cgi/tech/1260532772/ ★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
74 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 03:05:29 ] ありがとう!
75 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 04:44:57 ] 関数内に宣言されるauto変数について教えてください。 staticを付けないと関数から抜けたときメモリが開放されますが以下の書き方だと 開放されないようです。なぜ開放されないのかが理解できません。 *sには見えないstaticが付いているのでしょうか? char *func(void) { char *s=malloc(20); (省略) return s; }
76 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 04:58:37 ] 解放されるのは変数sに割り当てられてるメモリであって、 変数sに入ってる値じゃないから。
77 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 05:17:07 ] char *s=alloca(20); にすれば期待した動作に成るよ
78 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 05:58:36 ] ビットフィールドは悪魔だ できるなら使わない方がいい 速度も大幅に低下するし
80 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 06:27:51 ] その通りだ よくぞ言った
81 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 06:49:51 ] >>78 ビットフィールドを理解していれば何の疑問もない筈だが? いくつになるべきだと思うんだ?
82 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 06:52:34 ] 3になるとか思ったんじゃね?
83 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 07:37:34 ] 78です。 ビットフィールドを知ったのが最近なので理解不足であります。 知っているのは、コロンの後ろの数値が :4 なら0x0〜0xFまでが格納出来るエリアが確保されるくらいでしょうか。 このビットエリアが明らかにtag1、tag2違うのに同じサイズになるのが理解できません(´д`)
84 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 08:08:21 ] 使ってるビットだけのエリアが確保されるんじゃなくて、 unsigned intのエリアを確保してそこから、そのビットの分を使用してるだけ。
85 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 08:21:30 ] それはない
86 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 09:18:50 ] あるってw
87 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 11:37:39 ] ビットフィールドはできるだけ局在化したほうがいいとは思うが、必要なら積極的に使えばいいと思う。 一々シフトしてアンドマスクかけて取り出すなんて面倒だし間違いやすい。 # 勿論、環境依存になるのでその旨ドキュメントに明記するのは当然として。
88 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 12:18:39 ] test
89 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 13:07:26 ] >>84 が正解。 だが、マスク・アンマスク方が、結局わかりやすい。 (値の取り出し用、設定用のマクロも作る)
90 名前:デフォルトの名無しさん [2009/12/16(水) 18:55:11 ] あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ ぬああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ PowerPCいい!!!!!!!!!!!! 割り込み処理ラク!!!!!!!!!!! ベクタとかいらねえ、まんま関数を置けばいいんじゃん!!!!!!!!!!!!!!!!!!!!!!!!! でも俺の中ではSH >>>> PowerPC だけどな!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
91 名前:デフォルトの名無しさん [2009/12/16(水) 19:15:14 ] やっぱ割り込みコントローラを自分で持ってる奴はいいなあ!!!!! チョー気持ちいい x86みたいにメンドクセーことしないで済む ええなあ ええ ええぞ
92 名前:デフォルトの名無しさん [2009/12/16(水) 19:49:49 ] ああもう素晴らしい カウンタもついてる SHみたいにナノセカンド単位でのカウンティングができる!!!!!!!!! すばらしい!!!!!!!!! OSのミリセカンドオーダーのスリープなんぞに頼らなくてもよい!!!!!!!!!!!! 蕎麦らしい!!!!!!!!!!
93 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 19:54:06 ] すーぱーひたちとかネーミングがダサすぎて話しにならん
94 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 19:57:46 ] はなしし?
95 名前:デフォルトの名無しさん [2009/12/16(水) 21:03:00 ] ハードわからん奴カワイソス
96 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 21:04:07 ] 91 :デフォルトの名無しさん [] :2009/12/16(水) 19:15:14 なんか91というラベルがあって デフォルトの名無しさんという配列があるように見える俺の専用ブラウザ。
97 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:01:48 ] ncursesを使ってプログラム作ってます。(debian&gcc) 画面(端末)の背景全体を、特定の色にしようと思ったら init_pairで指定した上でスペースで埋めないといかんのでしょうか?
98 名前:デフォルトの名無しさん [2009/12/16(水) 22:02:07 ] *(unsigned int *)(0xAAAA) というのが示すのは int型のポインタが示す実体ですか?
99 名前: ◆QZaw55cn4c mailto:sage [2009/12/16(水) 22:10:43 ] >>98 アラインメントを考えないことにすれば、そのとおりでしょうね。 ハードウェアよりな言い方をすれば、アドレス 0xaaaa から始まる int 型の変数の値ですね。
100 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:15:07 ] 謎のトリさん現る
101 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:15:43 ] >98 「int型のポインタ」という言葉使いからして型がわかってないぞ。 *(unsigned int *)(0xAAAA) の意味は 0xAAAAからsizeof(unsigned)分をunsignedとみたてて アクセスしている。
102 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:20:35 ] >>97 画面クリアの類でいいんじゃね?
103 名前:デフォルトの名無しさん [2009/12/16(水) 22:24:14 ] >>99 ありがとうございます。 >>101 ではどのようにいったらよいのですか? unsigned int型のポインタ??
104 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:34:35 ] unsigned int*型の変数 まぁ別に難でもい伊田ろ。いい太古とはわ軽んだから
105 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:37:56 ] そうそう、ポインタっつってもメモリのどっかに記憶されてる変数だから
106 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:49:22 ] >>102 具体的には? 例えば、文字色を白、文字背景を青にして なんも手を加えてない状態の端末背景が黒だと 文字のある所だけ背景が青になるんで、文字のないとこも 青色にしたいんですが。
107 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:54:55 ] バカの言うことに惑わされんなよ ポインタは通常の変数として規定されていない。
108 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:56:25 ] バカがバカと罵るスレ
109 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:58:20 ] C言語のプログラムをVisualC++で書いていて、そっちでは普通に動いていたのですが、 メモ帳にこぴぺしてCygWinで実行したら、 parse error before~ だとか braces around scalar initializer というようなエラーが出ます。 主に配列の宣言・初期化のあたりで発言するのですが。 何が原因なのでしょうか
111 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:58:41 ] データの「型」を指すってのは有り得ない事だよな。 型は変数でもメモリのアドレスでもない。
112 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:00:14 ] >>111 え?
113 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:13:06 ] int *p=(int*)214F23BC; pは214F23BCを指しているがintは指していない。
114 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:15:43 ] int *p[10]は「int型の変数のアドレスを指すポインタ変数の配列[要素数10]」型 決して「intを指すポインタの配列[要素数10]」型ではないので間違えないように。
115 名前:デフォルトの名無しさん [2009/12/16(水) 23:18:25 ] unsigned char TITLE[]="HOGE" これはどういうこと?
116 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:19:58 ] ??
117 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:23:01 ] >>115 HOGEという文字列の先頭へのchar型の変数を指すポインタ変数
118 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:25:51 ] おいおい……
119 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:26:56 ] >>177 char *x="abcde" char x[]="abcde" の区別ができてないバカ発見
120 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:27:09 ] 配列の初期化
121 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:27:39 ] 入門以前のやつは来るなよww 来ても良いけど回答者の側には来るなw
122 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:28:49 ] アウトプットは学習効率を良くするからなあ
123 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:32:44 ] >>119 117と177の区別ができてない馬鹿発見
124 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:32:54 ] >>115 わざわざunsingedがついているところで、深読みをしてしまう。 昔は、char が unsigned のコンパイラも多かったなあ。
125 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:36:26 ] 補足すると、代入を strcpy に置き換えるコンパイラもある。
127 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:40:52 ] >125 関数の外も中も同じ意味だぞ。 >126 (== 125?) 代入とstrcpyは別だろ。 unsigned char TITLE[]="HOGE" は初期化であって代入ではない。 なんか昨日からポインタの知識が怪しい奴が回答側にいるな。 初級者は注意すること。 中級者は間違い探しをするとイイかも。
128 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:41:22 ] 入門者が入門者に適当を答えるスレです。 上級者様は上級者様専用のむずかしーいスレにいって戻ってくるなよ
129 名前:127 mailto:sage [2009/12/16(水) 23:43:58 ] 言い忘れたけど unsigned char TITLE[]="HOGE" のunsignedはない方がよいかも。 文字列リテラルの型はconst charの配列だから。
130 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:45:40 ] 125は、初心者が陥りやすい大きな間違いをしている。
131 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:46:07 ] >>127 は、もはや荒らしの一種だな。
132 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:47:31 ] >>128 荒らすな。
133 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:50:25 ] >114 またわけのわからない読み方をするね。 宣言 int *p[10]; があるとき、pの型はint *[10] ここまでは確定。 日本語にどう変換するかは規定されていないけどね。 あなたの日本語はよくわからない。 ポインタはポインタであって、アドレスではない。 アドレスを指すポインタ変数?
134 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:51:33 ] 127にとっては int x=100; これは初期化であって代入ではないらしい
135 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:51:51 ] データ型ってのはサイズを示す指針だから、指しようがねえよw
136 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:54:08 ] マイナスの値を取らない、取り得ないものだったら 明示的にunsignedを付けたほうがいい。 他人に読ますときは特に
137 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:58:05 ] >134 >int x=100; >これは初期化であって代入ではないらしい その通りですがなにか?
139 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:58:15 ] int *p[10]; これは普通に使うけど、 int (*p)[10]; これって使い道ある? 使ったことないぞ。
140 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:01:22 ] 上級者さまうぜぇ 関係ない話するなや こんなところで「入門者バーカ」って言って悦にいってないでさっさと首つって市ね。
141 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:03:43 ] >139 2次元配列を引数にとる変数の型。 void func(int p[10][10]); のpの型がint (*p)[10] 後は組み込みでVRAMの先頭が与えられたときに 2次元配列として扱いたいときに、この型で領域の先頭を 指したりする。
142 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:04:20 ] 質問に答えず、質問とは無関係などうでもいい話には必死。 自分で回答する気はぜんぜんないくせに、間違った解答を見つけたとたん待ってましたとばかりにたたきにくる。 マジうぜぇわ。
143 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:05:01 ] すくなくとも、このスレになってからは上級じゃなきゃできないような回答はひとつもないように見える。
144 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:05:14 ] >>139 typedef int (*p)[10] なら、稀によく使う
145 名前:厨房 ◆hfigpiEhOM [2009/12/17(木) 00:05:38 ] ゲームの改造とかやりたいんですけど、C言語でできるようになりますか?
146 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:06:26 ] プロアクションリプレイかコードフリークでも使ってろ
147 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:07:07 ] このスレのローカルルール 上級者は荒らし
148 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:07:21 ] ハッカーになりたいならCだけじゃ無理
149 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:07:46 ] >110 問題の出るコードを貼ってみたら。 だけど環境依存の問題だろうから、 こっちがイイかも 【初心者歓迎】C/C++室 Ver.70【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1258873470/
150 名前:厨房 ◆hfigpiEhOM [2009/12/17(木) 00:10:45 ] >>147 >>148 ポインターがどうのとか言っていたので改造コードにはC言語の知識が必要なのかと思いました。 以前
151 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:15:50 ] >>138 そうなんだけどさ、セクション配置かスタックに積むかで バイナリレベルじゃ変わってくるじゃん?てことを言いたいんじゃないかとおも
152 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:33:52 ] >>145 とりあえず、アセンブラだけでなく機械語も覚えろ。 改造だけなら、言語としてはこれだけの知識しか使用しない。
153 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:35:25 ] 実は、この5つすべて(Python, Java, C/C++, Perl, LISP)を勉強しておくのがいちばんいいのです。 これらはもっとも重要なハッキング用言語だというだけでなく、 それぞれプログラミングに対してまったく違ったアプローチをしているので、どれも非常に有益な勉強となるでしょう。
154 名前:厨房 ◆hfigpiEhOM [2009/12/17(木) 00:43:26 ] >>152 アセンブリとか難しそうですね。 せめて自分でチートコード作れるくらいになりたいです。 まったくの初心者ですか今後ともよろしくお願いします。 ちなみに以前C言語も学習していましたが、ポインタで投げました。 また1からやり直したいと思います。
155 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:49:25 ] >>153 C++ は要らねえな。
157 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 01:01:57 ] Cに固執するアンチC++の哀れなこと
158 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 01:11:23 ] C++のポジションはすでにレガシーとなっているよ。 普及してるが、FORTRAN、COBOLと同じ道を歩み始めている。
160 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 01:29:59 ] >>158 通常は、必要に応じてキャストすればいい。 つか、どうしたいんだ?
162 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 01:49:45 ] >>158 無理。 たとえば、Windows の COM なら VARIANT型を使えば、なんとなくそれっぽいことができるが、入門レベルではない。
163 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 01:57:19 ] 目的にもよるんだが、「共用体」を調べてみるといい。 つか、その質問だけでは何がしたいのかが伝わってこないから答えられん。
164 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 02:23:46 ] ユーザ関数に引数を渡す際に型を指定せずに処理がしたいんです。具体的には ここをintでもcharでもいけるにしたい ↓ void function(double *v1) { int i; for(i=0;i<10;i++) { //型の関係のない数値計算 P[i]=〜 } } ていうことです。
165 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 02:38:04 ] ありえないな。 設計からやり直した方がいいよ。
167 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 03:02:53 ] *(ポインタ+i)
169 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 03:16:59 ] p[i]って書けばいいものをわざわざ足し算したりするからわけわからなくなってるっつーねん。 なんで変な書き方したがるかなぁ?
170 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 03:19:54 ] え?
171 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 03:28:48 ] >>168 ありがとうございます。 stSwap = *(stMyData+i); *(stMyData+i) = *(stMyData+n); *(stMyData+n) = stSwap; このようにやってみたところ、一応コンパイルは通るのですが、 実行させてみるとメモリー違反っとなってしまいます・・・。 >>168 ごめんなさい。その書き方もあまり分からないので・・・・
172 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 04:59:27 ] ありとあらゆるものをキャストする この世の事実はすべてint型。 つまりint*型とint[]型とint型さえ使うことができればあらゆるプログラムの困難は解決する。
173 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 05:02:23 ] テンプレートとかただのアヒルタイプだし。マジうける。 そんなものもint*型の前にはひれふすことになる。