1 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 06:24:18 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 20 pc11.2ch.net/test/read.cgi/tech/1192455273/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 99代目 pc11.2ch.net/test/read.cgi/tech/1194262698/
152 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 15:27:08 ] >>150 printf("値: %0*d\n", FIELD, number); でいけたかと
153 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 15:29:56 ] >>152 いけました! ありがとうございます!!
154 名前:149 mailto:sage [2007/11/11(日) 16:50:50 ] >>151 あっそうなんです どうしても+が一つ多くなってしまうんですが (10 +20 +30) こういうすっきりした形にしたいんですが・・・
155 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 16:53:28 ] for(cnt = 0 ; cnt < INPUT_CNT - 1 ; cnt++) printf("%d +",num[cnt]); printf("%d", num[cnt]);
156 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 16:53:53 ] for(cnt = 0 ; cnt < INPUT_CNT ; cnt++) { if(cnt>0){ printf(" +"); } printf("%d",num[cnt]); } これでいいんじゃない
157 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 17:18:52 ] おすすめできないが、こういう書き方も。 for(cnt = 0 ; cnt < INPUT_CNT - 1 ; cnt++) { printf("%d + ",num[cnt]); } printf("%d",num[cnt]);
158 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 17:21:12 ] ループの中に無駄な分岐突っ込むよりは、はるかにマシだろ。 まぁ、155が見えないバカにはわからないだろうが。
159 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:03:37 ] VC++2005EE の ^Z の問題は結局どうなったの?
160 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:09:45 ] >>154 もっとおすすめできないが、 return文の2行上のprintf文をこうするとか。 printf("\b)"); \bってのはカーソルを1文字戻すエスケープシーケンスね。
161 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:22:26 ] 関数定義で bool hoge(int array[const]) { ... } とやっても良いらしいのだけれど array[const]ってどういう意味の配列になるの?
162 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:26:19 ] mainから整数型の配列受け取るだけじゃね?って思ったら受け取る時は普通ポインタ使う品
163 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:52:40 ] >>161 bool hoge(int * array)と全く同じ。 >>162 何故main限定?w >>160 お勧め云々以前にダメすぎ。
164 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:03:14 ] >>163 bool hoge(int * const array) というわけでもない?
165 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:07:38 ] 67です 遅くなりましたが、レスさんくすです >>69 VisualStudioは残念ながら所有していません ExpressEditionで試してみます >>71 どうもです 面白そうですね 試してみます その他にも知り合いのJava使いからOpenGrokなるツールを紹介してもらいました これらを参考に仕事がんばらせていただきます どうもありがとうございました
166 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:17:56 ] >>161 >>163 int *const arrayと同じ。 C99から導入された書き方。
167 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:28:30 ] >>166 サンクス。C99からだったか・・。 どうりでわからんわけだ。C99の資料も欲しい。
168 名前:デフォルトの名無しさん [2007/11/11(日) 20:51:19 ] コボルはデータを読み込んで演算させて吐き出すことが主ですがC言語はどうですか また、実務で使われている開発環境はVC++ですか、ボーランドのやつですか エクリプスですか
169 名前:149 mailto:sage [2007/11/11(日) 21:53:42 ] 「-」を入れると出来るんですね 本当にどうもありがとうございました
170 名前:デフォルトの名無しさん [2007/11/11(日) 21:54:20 ] 一時停止させる関数とそのヘッダファイル教えてください
171 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 21:59:29 ] 何を一時停止?
172 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:00:21 ] >>170 sleep()でググってみそ。
173 名前:デフォルトの名無しさん [2007/11/11(日) 22:00:35 ] while(){ printf("hoge"); 0.5秒待つ ←これを実行するための関数とヘッダファイルです }
174 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:02:10 ] putc(' ', NULL); //stdio.h
175 名前:デフォルトの名無しさん [2007/11/11(日) 22:02:45 ] >>173 システムに依存する。
176 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:04:58 ] >>173 windows.h Sleep(500);
177 名前:173 [2007/11/11(日) 22:06:23 ] ありがとうございます
178 名前:デフォルトの名無しさん [2007/11/11(日) 22:25:26 ] >>172 ゲイツに聞こうぜ あんだけ話題になったんだし matome.info/HatsuneMikuImageSearch/
179 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:46:32 ] 最近初めたばかりなんですが int double floatについて教えてください。 int型は整数型ということを調べていてよく見たのですが int a=0.5 や int b=0.00000005 でもエラーが出ません。 また、範囲が狭いということが書いてあったのですが int a=1234567890 と大きい値を入れても大丈夫でした。 どれくらい大きい値まで大丈夫なのでしょうか。 それと小数点を扱うときはdouble と floatを使うとあったのですが 二つの違いもよくわかりません お願いします
180 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:50:35 ] >>179 www.aso.ecei.tohoku.ac.jp/~yoshi/C/double.html
181 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:52:33 ] そこには普通floatって書いてあるけど、 実際には理由がなければdoubleを使うのが普通。
182 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:59:55 ] >>179 浮動小数点なのでfloat (↑1.1346*10^5とか) doubleは倍精度(おもに小数部分が)なので
183 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:05:11 ] stdio.cとかstring.cってどこにあるの? *.hは/usr/includeにあるけど本体がどこにあるのかわからない。
184 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:05:58 ] > 倍精度(おもに小数部分が)
185 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:06:52 ] >>183 検索しても見つからなかったら、インストールされてないんじゃない?
186 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:07:57 ] >>185 いやトラブルにあったとかそういうことじゃなくて ソースを読むために居場所を知りたい。
187 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:22:59 ] >>179 >int a=0.5 や int b=0.00000005 でもエラーが出ません。 エラーは出ないけど、だまって整数に切り捨てられる。
188 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:26:29 ] エラー出ないのか Cでもいつもキャストしてるから気づかなかった
189 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:26:36 ] >>186 いやだから、ライブラリのソースはインストールしてないと入ってない
190 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:26:48 ] >>186 標準関数のソースは、OSなりコンパイラをインストールするときに、オプションで指定しないと入らないんじゃないの? なんでもいいから見たいってことなら、ネットで探せば出てくると思うけど。
191 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:27:56 ] >>186 そんなものない。 ファイルに書き出すにしても、OSのAPI呼び出したりアセンブラで書いたりと C言語じゃないことやってるんだから、Cのソースファイルとしては存在しない。
192 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:32:11 ] >>189 >>190 そうなのか、全然知らなかった。 インストールしないといけないのか。thx!
193 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:38:40 ] >>179 doubleの方がfloatより精度が高い。 だから計算に時間がかかるかといえばそうでもなくて、 CPUに乗ってる数値演算プロセッサが32bit精度だったり、 C言語のライブラリがdouble前提で作られたりしてて、 floatで計算すると、 float-double変換→計算→double-float変換 となってdoubleよりも遅くなることが多かった。 けど、最近はSSEなどの演算命令などが出てきたため、 floatの方が速い場合もあるらしい。
194 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:42:51 ] ごめん、ウソついた。 FPUは80bitだから、「CPUに…」の行は無視して。
195 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:48:02 ] 179ですが皆さんありがとうございました。 イメージできてきました。 intが8バイトや、256ビットやら、バイトとビットがよくわかってもいない中で わけがわからなくなっていましたが 精度の違いってこのbitの部分が違うということですよね? 足し算、掛け算やら計算を格納するところはdoubleにしてやるように気をつけます。 ありがとうございました
196 名前:デフォルトの名無しさん [2007/11/12(月) 00:34:47 ] ランダムに-1.0から1.0までのdouble値を生成するコードを考えてくれたまえ
197 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 00:40:02 ] (double)rand() / RAND_MAX * 2 - 1
198 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 00:43:52 ] char *ptr = "ghijkl"; が可能で char *ptr; scanf("%s",ptr); がダメなのはなんで?
199 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 00:46:55 ] >>198 char *ptr = "ghijkl"; は、コンパイラがどっかに用意した"ghijkl"って領域の 先頭アドレスをptrに代入してる。だからOK char *ptr; はptrってポインタ(アドレスを入れる箱)は用意したけど、まだ中身は不定。 文字列を入れる場所が確保されてないから、コピーできない。
200 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 00:47:28 ] そのポインタは確保された領域を指していないから
201 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 00:50:22 ] char *ptr; scanf("%s",ptr); を可能にするにはmallocやnewやらで領域作らないとダメなの? それだと char ptr[256]; scanf("%s",ptr); でやってしまっても問題ないなぁ… なんか領域が可変な1次元のcharでもあればいいのに
202 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 00:52:16 ] >>201 標準ではないが asprintf が便利
203 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 00:56:39 ] >>201 C言語スレだからnewは無いけどな。 char* ptr=(char*)malloc(256); みたいにしないといけない。使い終わったらfreeもしなきゃいけない。 可変配列なんて裏でメモリの確保・開放を勝手にやるってことだからな。 高級アセンブラたるCにそんな機能は無い。必要なら自分で作るんだよ。
204 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 01:05:46 ] C言語スレだから、C++は違うのですね。すんません。 理解できました
205 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 01:12:22 ] 配列と要素数と確保開放を一括で管理するオブジェクトでも作ればいいんじゃね?
206 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 01:24:49 ] おぶじぇくとがよくわかってないなぁ。 「関数がついた構造体」みたいな感じで認識してるけど オブジェクトに何か値をぶち込む。 ↓ 何かよくわからないけど、いろいろ処理する(コンストラクタやらデストラクタやらして) ↓ 何か処理したもんが出てくる って認識であってる?
207 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 01:26:50 ] >>206 スレ違い。
208 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 01:33:40 ] 構造体配列struct tfield data[10]で メンバをchar word[20] として そのメンバとaとかbと一致するかどうかをみたいんだけど どうすればいいですかね?
209 名前:抽象的な質問には抽象的な回答を mailto:sage [2007/11/12(月) 01:36:15 ] 比較すればいいと思います。
210 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 02:04:01 ] #include <stdio.h> #include <math.h> int main(void){ long double r,pi,t; r=2.859492; pi=3.141590; r=pow(r,3); t=4/3*pi*r; printf("%f",t); return 0; } >>> -0.0000 になってしまいます。
211 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 02:44:49 ] long double は %Lf
212 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 02:54:39 ] ありがとございます。
213 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 03:54:55 ] C言語系で就職に役に立つ資格ってありますかね?
214 名前:デフォルトの名無しさん [2007/11/12(月) 04:34:24 ] >>197 MT法でやってくりたまえ
215 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 09:20:48 ] >>213 基本情報処理でいいんじゃないの?
216 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 10:27:21 ] メモリエディタ製作しようとしているが こんな感じでおk? 目標プロセスのアドレス取得 ↓ ある数値、文字列を探すときはstrstrで検索
217 名前:抽象的な質問には抽象的な回答を mailto:sage [2007/11/12(月) 10:38:56 ] ダメ。数値を探すのにstrstr()は使えない。
218 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 12:43:52 ] 画像の指定した範囲を切り出して出力するプログラムはどうやりますか?
219 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 12:57:08 ] 出番だぞ抽象
220 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 13:07:34 ] pythonでやれ
221 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 13:40:24 ] 画像解読か。難しそうだな。 文字で書いてあればまだなんとかなるか。
222 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 13:43:42 ] まず、irfan viewをDLします ヒントはPPM がんばれよ!
223 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 13:56:06 ] >>218 何を切り出すの? 金型?
224 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 14:40:09 ] phpでも使っとけ。
225 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 15:38:25 ] WAVEファイルを読み込む ↓ テキストデータに変換 ↓ 0.5秒間ハミング窓を与える ← ↓ 0.25秒ずらす FFT、ピッチを求めてドッカに保存 → ↑ ↓ 終了 こんな感じで求めればドレミファソラシドって変化していくWAVEファイルのピッチを追えると思ってるんだが どう?
226 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:00:23 ] size_tとかFILEみたいになんか知ってるとそれなりに それなりのC言語の使い手に一見見える型とか構造体ってありますか?
227 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:04:06 ] FILEは違うだろ・・・
228 名前:デフォルトの名無しさん [2007/11/12(月) 18:04:54 ] void*
229 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:13:43 ] LPCWSTR
230 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:14:52 ] char const* const p;
231 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:16:46 ] strct hoge{ ・・・ ・・・ char ar[1]; //[0]じゃなくあえて[1]で。 };
232 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:18:50 ] int main(argc, argv) int argc; char **argv; { return 0; }
233 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:20:30 ] #define begin { #define end ;}
234 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:25:55 ] size_t ptrdiff_t intptr_t uintptr_t
235 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:49:39 ] うわぁ予想外にいっぱいあるんですね。 >>231 [0]じゃなくてあえて[1]で。ってどういうことなんですか すごく興味があります。
236 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:16:10 ] struct e{ int value1,value2,value3; }; void foo(e num[][size]){ e output1[size],output2[size]; double sum1, sum2, sum3; double difference1,difference2,difference3; for( i=0;i<size;i++){ for( j=0; j<size; j++){ sum1 = num[i][j].value1 + num[i][j+1].value1; sum2 = num[i][j].value2 + num[i][j+1].value2; sum3 = num[i][j].value3 + num[i][j+1].value3; difference1 = num[i][j*2].value1 - num[i][j*2+1].value1; difference2 = num[i][j*2].value2 - num[i][j*2+1].value2; difference3 = num[i][j*2].value3 - num[i][j*2+1].value3; output1[j].value1 = sum;output1[j].value2 = sum2;output1[j].value3 = sum3; output2[j].value1 = difference1;output2[j].value2 = difference2;output2[j].value3 = difference3 } // end for j } // end for i } このクソ汚いソースを直すのに、どなたか知恵をお貸しください。 2次元の構造体に3つの変数があって それの隣接する和と差を求めるものの1部なのですが。 変数が多くなってあまりに汚いのでどうにかできないものかと
237 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:25:30 ] >>236 それってsizeは関数に渡るのか?
238 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:26:24 ] きっと #define size 10 に違いない
239 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:30:53 ] >>235 昔は [0] が認められてなかった。 そのころからの古参ベテランだぞというアピール。
240 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:32:21 ] sizeは#define sizeですが 関数に渡してもどっちでもいい状態であります。 どうしても構造体に3つのintが入ることになってしまって… testで作っていたソースはvalue1個だけとかでやってていけて いざ3つにしたら ぅわぁぁあぁ…という状況に…
241 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:35:23 ] >>236 e add(e a, e b); e sub(e a, e b); のような関数を作ればおk
242 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:38:09 ] >>236 i のループで、output1,output2が壊れてない? output1, output2には、i = size - 1 のときの値しかassignされないように見える。
243 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:39:35 ] >>236 配列の範囲外にアクセスしてるみたいだが、それはいいのかな?
244 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:40:01 ] int add(int a, int b){ return a+b; }
245 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:45:37 ] Cだし、マクロをうまく使えばどう? #define SUM(x, m) x[j].m + x[j+1].m みたいに。
246 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:46:11 ] >>242-243 元のソースを少し変えてi jの2重ループだけにしてるので、ちょっとおかしいところ出てますが そこは気にしないでください。 >>241 それは構造体を返す型の、関数ということですか。 やったことが無いのでイメージしづらいのですが…ためしに組んでみます。 マクロでやれるかとも思ったのですが、ヘッダがものすごいことになりそうで。。
247 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 20:03:34 ] DEFINEって定数じゃなく式をも使えたのか!超勉強になるこのスレ!
248 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 20:35:49 ] >>247 そんなあなたにこのマクロをどうぞ #include<stdio.h> int main(void){ printf("File:%s Line:%d\n", __FILE__, __LINE__); return 0; }
249 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 20:42:32 ] 246ですがとりあえず、マクロにして出来ました(その方が行が少なくできたので) ただ行列(構造体)の横走査と 縦走査で同じようなことを2回書いて、あまり良くないソースになりました。 #define ADD(x, m) x[i][j*2].m + x[i][j*2+1].m 横走査 #define ADD_I(x, m) x[j*2][i].m + x[j*2+1][i].m 縦走査 for(i) for(j) ADD(); //横走査 for(i) for(j) ADD_I(); //縦走査 こんな感じに。。。 まだまだ修行不足です。アドバイスありがとうございました。
250 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 22:21:46 ] 行数を少なく書くというのも大事だけど、ソースの可読性ってのも大事だよ。 >241の言うような構造体eを足し引きする関数を作れば、 for(i){for(j){ out1[j] = e_sum ( num[i][j] , num[i][j+1] ); out2[j] = e_sub ( num[i][j*2] , num[i][j*2+1]); }} って感じになるんだけど、 これだとソースを見て何をやっているかが一目でわかる。 後々メンテする可能性のあるプログラムならこっちの方がいいかと。
251 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 01:25:12 ] #include<stdio.h> #define ROW 3 #define COLUMN 4 int main(void){ double a[ROW][COLUMN],b[COLUMN][ROW]; int i,j,k,l; for(i=0;i<ROW;i++){ for(j=0;j<COLUMN;j++){ scanf("%lf",&a[i][j]);}} l=k=0; for(i=0;i<ROW;i++){ for(j=0;j<COLUMN;j++){ a[i][j]=b[k][l]; k++;} l++;k=0;} for(k=0;k<COLUMN;k++){ for(l=0;l<ROW;l++){ printf("b[%d][%d]=%lf\t",k+1,l+1,b[k][l]);} printf("\n");} return 0;} a[3][4]の転置行列b[4][3]を表示したいんですがうまく表示されません。 どうすればよいですか?
252 名前:デフォルトの名無しさん [2007/11/13(火) 01:28:29 ] スカラってなんですか?