トップページ⇒tech
1001コメント309KB

C言語なら俺に聞け(入門篇) Part 21

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/11/07(水) 06:24:18
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 20
http://pc11.2ch.net/test/read.cgi/tech/1192455273/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 99代目
http://pc11.2ch.net/test/read.cgi/tech/1194262698/
0153デフォルトの名無しさん2007/11/11(日) 15:29:56
>>152
いけました!
ありがとうございます!!
01541492007/11/11(日) 16:50:50
>>151
あっそうなんです
どうしても+が一つ多くなってしまうんですが
(10 +20 +30)
こういうすっきりした形にしたいんですが・・・
0155デフォルトの名無しさん2007/11/11(日) 16:53:28
for(cnt = 0 ; cnt < INPUT_CNT - 1 ; cnt++) printf("%d +",num[cnt]);
printf("%d", num[cnt]);
0156デフォルトの名無しさん2007/11/11(日) 16:53:53
for(cnt = 0 ; cnt < INPUT_CNT ; cnt++)
{
if(cnt>0){ printf(" +"); }
printf("%d",num[cnt]);
}
これでいいんじゃない
0157デフォルトの名無しさん2007/11/11(日) 17:18:52
おすすめできないが、こういう書き方も。

for(cnt = 0 ; cnt < INPUT_CNT - 1 ; cnt++)
{
printf("%d + ",num[cnt]);
}
printf("%d",num[cnt]);
0158デフォルトの名無しさん2007/11/11(日) 17:21:12
ループの中に無駄な分岐突っ込むよりは、はるかにマシだろ。
まぁ、155が見えないバカにはわからないだろうが。
0159デフォルトの名無しさん2007/11/11(日) 18:03:37
VC++2005EE の ^Z の問題は結局どうなったの?
0160デフォルトの名無しさん2007/11/11(日) 18:09:45
>>154
もっとおすすめできないが、
return文の2行上のprintf文をこうするとか。
printf("\b)");
\bってのはカーソルを1文字戻すエスケープシーケンスね。
0161デフォルトの名無しさん2007/11/11(日) 19:22:26
関数定義で
bool hoge(int array[const])
{
...
}
とやっても良いらしいのだけれど
array[const]ってどういう意味の配列になるの?
0162デフォルトの名無しさん2007/11/11(日) 19:26:19
mainから整数型の配列受け取るだけじゃね?って思ったら受け取る時は普通ポインタ使う品
0163デフォルトの名無しさん2007/11/11(日) 19:52:40
>>161
bool hoge(int * array)と全く同じ。

>>162
何故main限定?w

>>160
お勧め云々以前にダメすぎ。
0164デフォルトの名無しさん2007/11/11(日) 20:03:14
>>163
bool hoge(int * const array)
というわけでもない?
0165デフォルトの名無しさん2007/11/11(日) 20:07:38
67です
遅くなりましたが、レスさんくすです

>>69
VisualStudioは残念ながら所有していません
ExpressEditionで試してみます

>>71
どうもです
面白そうですね
試してみます

その他にも知り合いのJava使いからOpenGrokなるツールを紹介してもらいました
これらを参考に仕事がんばらせていただきます

どうもありがとうございました
0166デフォルトの名無しさん2007/11/11(日) 20:17:56
>>161>>163
int *const arrayと同じ。
C99から導入された書き方。
0167デフォルトの名無しさん2007/11/11(日) 20:28:30
>>166
サンクス。C99からだったか・・。
どうりでわからんわけだ。C99の資料も欲しい。
0168デフォルトの名無しさん2007/11/11(日) 20:51:19
コボルはデータを読み込んで演算させて吐き出すことが主ですがC言語はどうですか

また、実務で使われている開発環境はVC++ですか、ボーランドのやつですか
エクリプスですか
01691492007/11/11(日) 21:53:42
「-」を入れると出来るんですね
本当にどうもありがとうございました

0170デフォルトの名無しさん2007/11/11(日) 21:54:20
一時停止させる関数とそのヘッダファイル教えてください
0171デフォルトの名無しさん2007/11/11(日) 21:59:29
何を一時停止?
0172デフォルトの名無しさん2007/11/11(日) 22:00:21
>>170
sleep()でググってみそ。
0173デフォルトの名無しさん2007/11/11(日) 22:00:35
while(){
printf("hoge");
0.5秒待つ ←これを実行するための関数とヘッダファイルです
}
0174デフォルトの名無しさん2007/11/11(日) 22:02:10
putc(' ', NULL); //stdio.h
0175デフォルトの名無しさん2007/11/11(日) 22:02:45
>>173
システムに依存する。
0176デフォルトの名無しさん2007/11/11(日) 22:04:58
>>173
windows.h
Sleep(500);
01771732007/11/11(日) 22:06:23
ありがとうございます
0178デフォルトの名無しさん2007/11/11(日) 22:25:26
>>172
ゲイツに聞こうぜ
あんだけ話題になったんだし
http://matome.info/HatsuneMikuImageSearch/
0179デフォルトの名無しさん2007/11/11(日) 22:46:32
最近初めたばかりなんですが
int double floatについて教えてください。

int型は整数型ということを調べていてよく見たのですが
int a=0.5 や int b=0.00000005 でもエラーが出ません。
また、範囲が狭いということが書いてあったのですが
int a=1234567890 と大きい値を入れても大丈夫でした。
どれくらい大きい値まで大丈夫なのでしょうか。

それと小数点を扱うときはdouble と floatを使うとあったのですが
二つの違いもよくわかりません

お願いします
0180デフォルトの名無しさん2007/11/11(日) 22:50:35
>>179
http://www.aso.ecei.tohoku.ac.jp/~yoshi/C/double.html
0181デフォルトの名無しさん2007/11/11(日) 22:52:33
そこには普通floatって書いてあるけど、
実際には理由がなければdoubleを使うのが普通。
0182デフォルトの名無しさん2007/11/11(日) 22:59:55
>>179
浮動小数点なのでfloat
(↑1.1346*10^5とか)
doubleは倍精度(おもに小数部分が)なので
0183デフォルトの名無しさん2007/11/11(日) 23:05:11
stdio.cとかstring.cってどこにあるの?
*.hは/usr/includeにあるけど本体がどこにあるのかわからない。
0184デフォルトの名無しさん2007/11/11(日) 23:05:58
> 倍精度(おもに小数部分が)
0185デフォルトの名無しさん2007/11/11(日) 23:06:52
>>183
検索しても見つからなかったら、インストールされてないんじゃない?
0186デフォルトの名無しさん2007/11/11(日) 23:07:57
>>185
いやトラブルにあったとかそういうことじゃなくて
ソースを読むために居場所を知りたい。
0187デフォルトの名無しさん2007/11/11(日) 23:22:59
>>179
>int a=0.5 や int b=0.00000005 でもエラーが出ません。

エラーは出ないけど、だまって整数に切り捨てられる。
0188デフォルトの名無しさん2007/11/11(日) 23:26:29
エラー出ないのか
Cでもいつもキャストしてるから気づかなかった
0189デフォルトの名無しさん2007/11/11(日) 23:26:36
>>186
いやだから、ライブラリのソースはインストールしてないと入ってない
0190デフォルトの名無しさん2007/11/11(日) 23:26:48
>>186
標準関数のソースは、OSなりコンパイラをインストールするときに、オプションで指定しないと入らないんじゃないの?

なんでもいいから見たいってことなら、ネットで探せば出てくると思うけど。
0191デフォルトの名無しさん2007/11/11(日) 23:27:56
>>186
そんなものない。
ファイルに書き出すにしても、OSのAPI呼び出したりアセンブラで書いたりと
C言語じゃないことやってるんだから、Cのソースファイルとしては存在しない。
0192デフォルトの名無しさん2007/11/11(日) 23:32:11
>>189
>>190
そうなのか、全然知らなかった。
インストールしないといけないのか。thx!
0193デフォルトの名無しさん2007/11/11(日) 23:38:40
>>179
doubleの方がfloatより精度が高い。

だから計算に時間がかかるかといえばそうでもなくて、
CPUに乗ってる数値演算プロセッサが32bit精度だったり、
C言語のライブラリがdouble前提で作られたりしてて、
floatで計算すると、
float-double変換→計算→double-float変換
となってdoubleよりも遅くなることが多かった。

けど、最近はSSEなどの演算命令などが出てきたため、
floatの方が速い場合もあるらしい。
0194デフォルトの名無しさん2007/11/11(日) 23:42:51
ごめん、ウソついた。
FPUは80bitだから、「CPUに…」の行は無視して。
0195デフォルトの名無しさん2007/11/11(日) 23:48:02
179ですが皆さんありがとうございました。
イメージできてきました。

intが8バイトや、256ビットやら、バイトとビットがよくわかってもいない中で
わけがわからなくなっていましたが
精度の違いってこのbitの部分が違うということですよね?

足し算、掛け算やら計算を格納するところはdoubleにしてやるように気をつけます。
ありがとうございました
0196デフォルトの名無しさん2007/11/12(月) 00:34:47
ランダムに-1.0から1.0までのdouble値を生成するコードを考えてくれたまえ
0197デフォルトの名無しさん2007/11/12(月) 00:40:02
(double)rand() / RAND_MAX * 2 - 1
0198デフォルトの名無しさん2007/11/12(月) 00:43:52
char *ptr = "ghijkl";
が可能で

char *ptr;
scanf("%s",ptr);
がダメなのはなんで?
0199デフォルトの名無しさん2007/11/12(月) 00:46:55
>>198
char *ptr = "ghijkl";
は、コンパイラがどっかに用意した"ghijkl"って領域の
先頭アドレスをptrに代入してる。だからOK

char *ptr;
はptrってポインタ(アドレスを入れる箱)は用意したけど、まだ中身は不定。
文字列を入れる場所が確保されてないから、コピーできない。
0200デフォルトの名無しさん2007/11/12(月) 00:47:28
そのポインタは確保された領域を指していないから
0201デフォルトの名無しさん2007/11/12(月) 00:50:22
char *ptr;
scanf("%s",ptr);
を可能にするにはmallocやnewやらで領域作らないとダメなの?

それだと
char ptr[256];
scanf("%s",ptr);
でやってしまっても問題ないなぁ…

なんか領域が可変な1次元のcharでもあればいいのに
0202デフォルトの名無しさん2007/11/12(月) 00:52:16
>>201
標準ではないが asprintf が便利
0203デフォルトの名無しさん2007/11/12(月) 00:56:39
>>201
C言語スレだからnewは無いけどな。
char* ptr=(char*)malloc(256);
みたいにしないといけない。使い終わったらfreeもしなきゃいけない。

可変配列なんて裏でメモリの確保・開放を勝手にやるってことだからな。
高級アセンブラたるCにそんな機能は無い。必要なら自分で作るんだよ。
0204デフォルトの名無しさん2007/11/12(月) 01:05:46
C言語スレだから、C++は違うのですね。すんません。
理解できました
0205デフォルトの名無しさん2007/11/12(月) 01:12:22
配列と要素数と確保開放を一括で管理するオブジェクトでも作ればいいんじゃね?
0206デフォルトの名無しさん2007/11/12(月) 01:24:49
おぶじぇくとがよくわかってないなぁ。

「関数がついた構造体」みたいな感じで認識してるけど
オブジェクトに何か値をぶち込む。
↓
何かよくわからないけど、いろいろ処理する(コンストラクタやらデストラクタやらして)
↓
何か処理したもんが出てくる

って認識であってる?
0207デフォルトの名無しさん2007/11/12(月) 01:26:50
>>206
スレ違い。
0208デフォルトの名無しさん2007/11/12(月) 01:33:40
構造体配列struct tfield data[10]で
メンバをchar word[20] として

そのメンバとaとかbと一致するかどうかをみたいんだけど
どうすればいいですかね?
0209抽象的な質問には抽象的な回答を2007/11/12(月) 01:36:15
比較すればいいと思います。
0210デフォルトの名無しさん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 になってしまいます。
0211デフォルトの名無しさん2007/11/12(月) 02:44:49
long double は %Lf
0212デフォルトの名無しさん2007/11/12(月) 02:54:39
ありがとございます。
0213デフォルトの名無しさん2007/11/12(月) 03:54:55
C言語系で就職に役に立つ資格ってありますかね?
0214デフォルトの名無しさん2007/11/12(月) 04:34:24
>>197
MT法でやってくりたまえ
0215デフォルトの名無しさん2007/11/12(月) 09:20:48
>>213
基本情報処理でいいんじゃないの?
0216デフォルトの名無しさん2007/11/12(月) 10:27:21
メモリエディタ製作しようとしているが
こんな感じでおk?

目標プロセスのアドレス取得
↓
ある数値、文字列を探すときはstrstrで検索
0217抽象的な質問には抽象的な回答を2007/11/12(月) 10:38:56
ダメ。数値を探すのにstrstr()は使えない。
0218デフォルトの名無しさん2007/11/12(月) 12:43:52
画像の指定した範囲を切り出して出力するプログラムはどうやりますか?
0219デフォルトの名無しさん2007/11/12(月) 12:57:08
出番だぞ抽象
0220デフォルトの名無しさん2007/11/12(月) 13:07:34
pythonでやれ
0221デフォルトの名無しさん2007/11/12(月) 13:40:24
画像解読か。難しそうだな。
文字で書いてあればまだなんとかなるか。
0222デフォルトの名無しさん2007/11/12(月) 13:43:42
まず、irfan viewをDLします
ヒントはPPM

がんばれよ!
0223デフォルトの名無しさん2007/11/12(月) 13:56:06
>>218
何を切り出すの?
金型?
0224デフォルトの名無しさん2007/11/12(月) 14:40:09
phpでも使っとけ。
0225デフォルトの名無しさん2007/11/12(月) 15:38:25
WAVEファイルを読み込む
↓
テキストデータに変換
↓
0.5秒間ハミング窓を与える      ←
↓                          0.25秒ずらす
FFT、ピッチを求めてドッカに保存    →      ↑
↓
終了

こんな感じで求めればドレミファソラシドって変化していくWAVEファイルのピッチを追えると思ってるんだが
どう?
0226デフォルトの名無しさん2007/11/12(月) 18:00:23
size_tとかFILEみたいになんか知ってるとそれなりに
それなりのC言語の使い手に一見見える型とか構造体ってありますか?
0227デフォルトの名無しさん2007/11/12(月) 18:04:06
FILEは違うだろ・・・
0228デフォルトの名無しさん2007/11/12(月) 18:04:54
void*
0229デフォルトの名無しさん2007/11/12(月) 18:13:43
LPCWSTR
0230デフォルトの名無しさん2007/11/12(月) 18:14:52
char const* const p;
0231デフォルトの名無しさん2007/11/12(月) 18:16:46
strct hoge{
・・・
・・・
char ar[1]; //[0]じゃなくあえて[1]で。
};
0232デフォルトの名無しさん2007/11/12(月) 18:18:50
int main(argc, argv)
int argc;
char **argv;
{
return 0;
}
0233デフォルトの名無しさん2007/11/12(月) 18:20:30
#define begin {
#define end ;}
0234デフォルトの名無しさん2007/11/12(月) 18:25:55
size_t
ptrdiff_t
intptr_t
uintptr_t
0235デフォルトの名無しさん2007/11/12(月) 18:49:39
うわぁ予想外にいっぱいあるんですね。
>>231
[0]じゃなくてあえて[1]で。ってどういうことなんですか
すごく興味があります。
0236デフォルトの名無しさん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部なのですが。

変数が多くなってあまりに汚いのでどうにかできないものかと
0237デフォルトの名無しさん2007/11/12(月) 19:25:30
>>236
それってsizeは関数に渡るのか?
0238デフォルトの名無しさん2007/11/12(月) 19:26:24
きっと #define size 10 に違いない
0239デフォルトの名無しさん2007/11/12(月) 19:30:53
>>235
昔は [0] が認められてなかった。
そのころからの古参ベテランだぞというアピール。
0240デフォルトの名無しさん2007/11/12(月) 19:32:21
sizeは#define sizeですが
関数に渡してもどっちでもいい状態であります。

どうしても構造体に3つのintが入ることになってしまって…
testで作っていたソースはvalue1個だけとかでやってていけて
いざ3つにしたら ぅわぁぁあぁ…という状況に…
0241デフォルトの名無しさん2007/11/12(月) 19:35:23
>>236
e add(e a, e b);
e sub(e a, e b);
のような関数を作ればおk
0242デフォルトの名無しさん2007/11/12(月) 19:38:09
>>236
i のループで、output1,output2が壊れてない?
output1, output2には、i = size - 1 のときの値しかassignされないように見える。
0243デフォルトの名無しさん2007/11/12(月) 19:39:35
>>236
配列の範囲外にアクセスしてるみたいだが、それはいいのかな?
0244デフォルトの名無しさん2007/11/12(月) 19:40:01
int add(int a, int b){
return a+b; }
0245デフォルトの名無しさん2007/11/12(月) 19:45:37
Cだし、マクロをうまく使えばどう?
#define SUM(x, m) x[j].m + x[j+1].m
みたいに。
0246デフォルトの名無しさん2007/11/12(月) 19:46:11
>>242-243
元のソースを少し変えてi jの2重ループだけにしてるので、ちょっとおかしいところ出てますが
そこは気にしないでください。

>>241
それは構造体を返す型の、関数ということですか。
やったことが無いのでイメージしづらいのですが…ためしに組んでみます。

マクロでやれるかとも思ったのですが、ヘッダがものすごいことになりそうで。。
0247デフォルトの名無しさん2007/11/12(月) 20:03:34
DEFINEって定数じゃなく式をも使えたのか!超勉強になるこのスレ!
0248デフォルトの名無しさん2007/11/12(月) 20:35:49
>>247
そんなあなたにこのマクロをどうぞ

#include<stdio.h>
int main(void){
printf("File:%s Line:%d\n", __FILE__, __LINE__);
return 0;
}
0249デフォルトの名無しさん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(); //縦走査

こんな感じに。。。
まだまだ修行不足です。アドバイスありがとうございました。
0250デフォルトの名無しさん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]);
}}
って感じになるんだけど、
これだとソースを見て何をやっているかが一目でわかる。
後々メンテする可能性のあるプログラムならこっちの方がいいかと。
0251デフォルトの名無しさん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]を表示したいんですがうまく表示されません。
どうすればよいですか?
0252デフォルトの名無しさん2007/11/13(火) 01:28:29
スカラってなんですか?
■ このスレッドは過去ログ倉庫に格納されています