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

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2006/11/09(木) 00:31:01
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

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

過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/


関連スレ
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/
0893デフォルトの名無しさん2006/11/29(水) 17:59:51
sprintfでファイル名の文字列を作っていけばよい。
0894デフォルトの名無しさん2006/11/29(水) 18:00:22
>>892
#include<stdio.h>

int main(void){
char filename[FILENAME_MAX];
FILE *fp;
int i;

for(i=0;i<10;i++){
sprintf(filename, "%03d.dat", i);
fp=fopen(filename, "w");
fprintf(fp, "%d\n", i);
fclose(fp);
}
return 0;
}
0895デフォルトの名無しさん2006/11/29(水) 18:03:32
はやい返事ありがとうございます!
やってみます。
0896デフォルトの名無しさん2006/11/29(水) 18:48:21
質問ですが、ソースファイル A.c B.c D.c があったとして
Aを実行するとA→B→Dと実行させていくプログラムと、
Aの実行途中でBに移ってAに戻って来るようプログラムする事は可能でしょうか?
0897デフォルトの名無しさん2006/11/29(水) 18:52:48
>>896
a.exe b.exe d.exe を実行するって事?
08988962006/11/29(水) 19:29:24
>>897
すみませんそうです、
1つにまとめるて書くより複数に分けた方が管理しやすいかと思ったもので
0899デフォルトの名無しさん2006/11/29(水) 19:31:23
>>896
可能。
0900デフォルトの名無しさん2006/11/29(水) 20:09:36
すみません、どなたかおねがいします。

「エラー 'stdio.h'をオープンできない」

ってエラーメッセージがでるんだけど、考えられえる原因を教えてください。
本を買って12ページ目でつまづいてます。
0901デフォルトの名無しさん2006/11/29(水) 20:13:40
>>900
stdio.hが無い
stdio.hを探すパスの間違い
stdio.hが書き込み専用になっている
etcetc...
まずCの処理系の名前を書くとアドバイスが増える
0902デフォルトの名無しさん2006/11/29(水) 20:19:53
マニュアル主義のくせに肝心のコンパイラのマニュアルは読まないんだよな。
なぜなんだぜ?
0903デフォルトの名無しさん2006/11/29(水) 20:20:02
>>901 レスありがとう。

処理系ってのがなんなのかわからないけど、
Borland C++ compiler 5.5.1 っての使ってます。

パスもc:\borland\bcc55\binに通してあるし、
bcc32.cfg とilink32.cfgも作ったんですがエラー出てます。

書き込み専用にはなってませんでした。
0904デフォルトの名無しさん2006/11/29(水) 20:21:50
なるほどコンパイラのマニュアルは気づきませんでした。
探してみます。
0905デフォルトの名無しさん2006/11/29(水) 20:22:11
ソース晒せ。

#include "stdio.h" になってるとか予測してみる。
0906デフォルトの名無しさん2006/11/29(水) 20:23:49
bcc32.cfgとlink32.cfgに書いてるパスが違うんじゃね?
つかilink32.cfgじゃなくてlink32.cfgじゃね?
0907デフォルトの名無しさん2006/11/29(水) 20:24:17
bcc32.cfg.txt だったら泣いちゃうよ俺…
0908デフォルトの名無しさん2006/11/29(水) 20:25:40
>>906
それは ilink32 で正しいよ。
0909デフォルトの名無しさん2006/11/29(水) 20:29:03
ソースはこんな感じです

/* hello, worldを表示するプログラム */
#include <stdio.h>

int main(void)
{
printf("hello, world\n");

return 0;
}

拡張子は全て表示されるようにしてるので、あってると思います。
0910デフォルトの名無しさん2006/11/29(水) 20:34:39
じゃあ bcc32.cfg が間違ってんだな。
ちゃんと bin の中に入ってる?
0911デフォルトの名無しさん2006/11/29(水) 20:40:51
bcc32.cfg内のパスの表記ミスでした。
お騒がせしました。
09128962006/11/29(水) 20:45:45
>>899
遅れながらありがとうございます。
0913デフォルトの名無しさん2006/11/29(水) 20:48:55
>>912
そんな回答でいいのかよw
09148962006/11/29(水) 20:59:10
方法も聞きたいところなのですが、まだまだ勉強不足で
どう質問したらいいかわからないので
可能かどうかだけ聞ければ後は自分で探してみます。
0915デフォルトの名無しさん2006/11/29(水) 21:13:45
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa9.html
ここのキーボードからリアルタイム入力の項を読んでいたのですが
c = getchar();
while ((dummy = getchar()) != '\n')
;
がリアルタイム入力に対する解決法に思えないし、「バックスペースで訂正して1にしてからリターンを押す」
というのはc = getchar();だけで十分だと思うんですが、昔の環境ではそうでなかったってことでしょうか?
特に今リアルタイム入力関連の情報集めているわけではないのですが、疑問が解けないのでよろしくお願いします
0916デフォルトの名無しさん2006/11/29(水) 21:17:26
ちんぽ!!!!
0917デフォルトの名無しさん2006/11/29(水) 21:22:25
>>915
c = getchar();
while ((dummy = getchar()) != '\n')
;
これはただ入力が1行あって最初の一文字目を取得して、
その後は破棄するって意味ですよ。
0918デフォルトの名無しさん2006/11/29(水) 21:34:21
>>905
それは問題ない。
ヘッダ名が"〜"形式で指定した場合、
見つからなければ<〜>と指定したのと同じようにヘッダを探すことになっている。
09199152006/11/29(水) 21:39:59
>>917
あ、メニューを選択する場合に単に数字だけを入力すればいいところを
誤って"1q"のようにタイプミスしてしまい、且つ本当は2を選びたかった場合に
ストリームに残っているqを取り除くための前処理だってことですか?
0920デフォルトの名無しさん2006/11/29(水) 23:02:19
>>918
>探すことになっている

なっている、はすだが
なっていない処理系も意外に多い。
0921デフォルトの名無しさん2006/11/29(水) 23:49:36
>>871
遅くなりましたが、詳しい解説ありがとうございました。
やっと謎が解けました。
0922デフォルトの名無しさん2006/11/30(木) 01:04:48
夜分遅くにすみません><
2進数16桁の加減算プログラムをmain関数で作りたいのですがどのようにしたらいいでしょうか?
0923デフォルトの名無しさん2006/11/30(木) 01:05:42
そのようにしたらいい。
0924デフォルトの名無しさん2006/11/30(木) 01:31:52
>>922
まずは、自分が何をしたいのか、何が分からないのかを整理し、
それが相手に伝わるような文章を書くことから始めるといい。
0925デフォルトの名無しさん2006/11/30(木) 02:13:46
>922
キーボードから1と0だけで数字を入力してそれの加減算をしたいのか?
受け取った数字を文字列として扱うとか、intとして受け取って適当に処理するとか
やり方はいくつでもあるだろ。
0926デフォルトの名無しさん2006/11/30(木) 03:20:02
クリンゴン語のフォントをインストールしたのですが、
実際printfとかで表示するにはどうしたらよいのですか?
0927デフォルトの名無しさん2006/11/30(木) 03:26:03
>>926
その文字コードを普通に出力する
実行環境のフォントがクリンゴンならそう表示されるし
違えば文字化け
0928デフォルトの名無しさん2006/11/30(木) 21:04:22
カラー画像(ppmファイル)を読み込み、任意の1行の画素を取り出したいんですが、
助言よろしくお願いします
0929デフォルトの名無しさん2006/11/30(木) 21:07:10
がんばりたまえ
0930デフォルトの名無しさん2006/11/30(木) 21:29:01
>>928
ppmファイルを扱うライブラリで使えるものを探すか、
自分でppmファイルのフォーマットを調べて解析する。
0931デフォルトの名無しさん2006/11/30(木) 21:30:55
そんなことは当たり前だろ。
何の参考にもなりゃしない。
0932デフォルトの名無しさん2006/11/30(木) 21:45:42
>>928を見ると、その当たり前のことすらやっているか怪しそう。
ある程度調べていて、この部分が分からないと具体的に書いたなら
アドバイスのしようもあるんじゃないか。
0933デフォルトの名無しさん2006/11/30(木) 21:50:47
いやおそらくデコーダそのものを書いてよこせと言ってるに相違ない
0934デフォルトの名無しさん2006/11/30(木) 21:51:33
>>926
setlocale (LC_ALL , "tlh");
//クリンゴン語のコードはISO 639よって規定
09359282006/11/30(木) 21:54:07
例えば、

h_g = h_f; /* 横画素数 */
v_g = v_f; /* 縦画素数 */

for ( v = 0; v < v_g; v ++ ){
for ( h = 0; h < h_g; h ++ ){
for ( c = 0; c < 3; c ++ ){
g[v][h][c] = (f[v-1][h+1][c] + f[v][h+1][c] + f[v+1][h+1][c]+
f[v-1][h][c] + f[v+1][h][c]+
f[v-1][h-1][c] + f[v][h-1][c] + f[v+1][h-1][c]) / 8;
}
}
}

てやれば,ぼかし画像が出力されますよね。
しかし、任意の一部分を切りぬいて出力するとなるとお手上げで・・・。
よろしくお願いします。
0936デフォルトの名無しさん2006/11/30(木) 21:59:44
なんでぼかし画像を例にだしたん?
09379282006/11/30(木) 22:04:25
画像を配列になおすって考えがいまいちピンと来てなくて、
不適切だったかもしれません。
0938デフォルトの名無しさん2006/11/30(木) 22:08:58
>>937
結局何をやろうとしているのかわからない

>>930にも答えてないし

画像を配列に格納したいのか
配列から1行の画素を取り出したいのか

ESPがないからわからん
0939デフォルトの名無しさん2006/11/30(木) 22:10:38
あそこにモザイクを
0940デフォルトの名無しさん2006/11/30(木) 22:13:24
g[v][h][c]=g[v][10][c];
とすれば全部10行と同じなる
0941デフォルトの名無しさん2006/11/30(木) 22:13:58
丸投げしたいのなら宿題スレへゴー
0942デフォルトの名無しさん2006/11/30(木) 22:28:02
>>937
自分がやろうとしていることなのに、ピンと来ない?
宿題か?
09439282006/11/30(木) 22:28:37
失礼しました<(_ _)>

>>930
今のところ手作業で解析をしております。

>>938
ご指摘の通りです。すいません。
画像を配列に格納した後、配列から一行の画素を取り出したいんです。

>>940
更にいえば複数(i)枚の画像を読み込んだときに,i行目の画素を取り出したいんですが、
for文を使って

g[v][h][c]=g[v][i][c];

とすると、デバッグは問題ないものの、画像が表示されません。

>>941
何とか理解したいんです・・・。
0944デフォルトの名無しさん2006/11/30(木) 22:33:18
g[v][h][c]=f[v][i][c];
09459282006/11/30(木) 22:36:21
>>937
宿題ではありません。

>>944
すいません。間違ってました。

gg[v][h][c]=f[v][i][c];

でやってるんですが、表示されません。。。
0946デフォルトの名無しさん2006/11/30(木) 22:47:28
>>945
新情報ggですか
0947デフォルトの名無しさん2006/11/30(木) 22:47:46
何を使って表示してるのかすら分からんのにどうしろと
0948デフォルトの名無しさん2006/11/30(木) 22:50:16
>>945
123
456
789
という画像データがあったら、どうなってほしいの?

>g[v][h][c]=f[v][i][c];

これだと、i=1のとき
222
555
888
になるけど。
09499282006/11/30(木) 22:59:15
>>947
Visual C++ .NET Standard 2003でのWin32コンソールアプリケーションで
コマンドプロンプトを使用しています。
この説明で正しいでしょうか?

>>948
そう言う説明をすれば解かり易いですね・・・。ありがとうございます。

i=1のとき、     i=2のとき
1          2
4          5
7          8

と行った具合に出力したいんです。
0950デフォルトの名無しさん2006/11/30(木) 23:05:51
>>949
そしたら根本的に配列gのサイズが間違ってるだろ
サイズ的にはg[v_g][c]じゃないの?

で、横方向にはコピーしなくていいのだから

for ( v = 0; v < v_g; v ++ ){
for ( c = 0; c < 3; c ++ ){
g[v][c]=f[v][i][c];
}
}
0951デフォルトの名無しさん2006/11/30(木) 23:09:50
>>949
聞きたいのは、画像を表示するために何を使っているのか(どうやっているのか)ということ。
コンソールアプリで、各画素のRGB値を数値として文字列表示したいということか?
文字でいいのか?画像ではなく。
09529282006/11/30(木) 23:15:59
>>950
確かにそうですね。ありがとうございます。
しかし下のエラーが出てしまいます。初心者ですいません。

error C2440: '=' : 'unsigned char' から 'unsigned char [3]' に変換できません。

>>951
ppm形式の画像を出力して表示したいと言うことです。
ちなみにソフトはACDSee v3.1vです。
0953デフォルトの名無しさん2006/11/30(木) 23:17:46
>>952
宣言部もちゃんと変えた?

画像の問題じゃなくて配列がまともに扱えないだけじゃないのか
0954デフォルトの名無しさん2006/11/30(木) 23:36:12
ttp://up.img5.net/src/up1054.txt
ここまで進めていて、どこがおかしいのか分からなくなってしまいました。
実行値が正しくない上にエラーとなってしまいます。
よければどの辺がおかしいか教えてください。
0955デフォルトの名無しさん2006/11/30(木) 23:37:32
>>952
g[v][c]=f[v][i][c];
を
g[v][0][c]=f[v][i][c];
とすればいいじゃない?

とりあえず画像をどうこうしたいなら多次元配列の勉強を先にしたほうがいい。
>error C2440: '=' : 'unsigned char' から 'unsigned char [3]' に変換できません。
これで困っているようなら、多次元配列を扱うのも早すぎる気がする。
09569282006/11/30(木) 23:43:14
>>953
その通りです。

>>955
解答ありがとうございます。
地道な努力をしようとしなかった自分が甘ちゃんでした。
勉強して出直してきます。
0957デフォルトの名無しさん2006/12/01(金) 10:28:08
>勉強して出直してきます。
やっぱ最初から答えが聞きたかっただけじゃねえか
0958デフォルトの名無しさん2006/12/01(金) 15:01:16
cpadだとファイルの入出力ができないんですか?
0959デフォルトの名無しさん2006/12/01(金) 15:08:13
>958
できます
0960デフォルトの名無しさん2006/12/01(金) 15:19:55
2進数で入力した文字を16進数で出力するにはどうやればいいんですか?
0961デフォルトの名無しさん2006/12/01(金) 15:22:18
16で割ればいい
0962デフォルトの名無しさん2006/12/01(金) 15:25:12
>960
printf("%x", n);
0963デフォルトの名無しさん2006/12/01(金) 15:48:46
>>962
二進数文字列だからそれじゃダメ。

printf("%x",strtol(str,NULL,2));
09647672006/12/01(金) 20:02:15
少し話題がずれるかもしれないのですが
皆さんはCをどのくらいの期間勉強してるんですか?
0965デフォルトの名無しさん2006/12/01(金) 21:29:21

1〜10までの乱数を10個発生させて表示させる。ただし、1度出た数字は除外する」
という課題を出されたのですが、教科書を見ながら解いても
 同じ数字が重複して表示されてしまうプログラムになってしまいどうしていいかわかりません。 
どなたか教えていただけませんでしょうか
0966デフォルトの名無しさん2006/12/01(金) 21:38:14
>>965
同じ数字が重複して表示されることを許してるからじゃないの?
0967デフォルトの名無しさん2006/12/01(金) 21:39:48
>965
1.チェック用の配列を用意して既に選んだものを選ばないようにする。
2.一つの数字を選ぶたびにその数字を抜き取って配列を詰めなおし、そこから選ぶ
0968デフォルトの名無しさん2006/12/01(金) 21:48:43
3. 1-10の数字が並んでいる配列を用意し、乱数で(要素同士を入れ替えるなどして)適当に並べ替える。
0969デフォルトの名無しさん2006/12/01(金) 21:54:06
#include<stdio.h>
#include<stdlib.h>
int main (void)
{
int i , n;
srand((unsigned)time(NULL));
printf(0〜10:\n");
for (i=1; i<=10;i++)
printf("%d",rand());
としてみたのですが重複してしまいます
0970デフォルトの名無しさん2006/12/01(金) 21:57:37
http://pc8.2ch.net/test/read.cgi/tech/1164079451/803
0971デフォルトの名無しさん2006/12/02(土) 00:05:33
C仕事にしようとする場合、数学の知識はどの程度必要でしょうか?
0972デフォルトの名無しさん2006/12/02(土) 00:08:54
いるのは精神力と体力と忍耐力
0973ぴゅあ2006/12/02(土) 00:24:54
>>969
>としてみたのですが重複してしまいます

それが
>ただし、1度出た数字は除外する
で"やりなさい"と言われている部分のことになるのではないですか?
重複してしまうというのはそこをやっていないから…というところは把握できてます?

楽に(&効率良く)片付けるには>>967-968の言っている中で3のような手段がいいだろうと思うけど
最初(初歩的?)な段階のロジックを理解させようとしているのだとすれば1のような手段かも知れないと思ったりもするけど…

或いは各々がどんなロジックを考え出すかというようなことを求めているものなんでしょうか

あるロジックの考え方の理解を深めるために出された課題だとするなら
答えを導き出す元になるものがその中には足りないようにも思えるし
その中>{1〜10までの乱数を10個発生させて表示させる。ただし、1度出た数字は除外する。}

その課題が出される前にあった講義の中にそれがあったりはしないんでしょうか
(講義の中で出された課題ということですし
どういう経緯でその課題が出されたかに沿ってないと答えを提出しても通らないと思ったりもするので…)
0974デフォルトの名無しさん2006/12/02(土) 00:28:01
ロジック(・∀・)まで読んだ
0975デフォルトの名無しさん2006/12/02(土) 00:30:25
答える必要ないよ
2chから個人サイトまでマルチポストしまくり
0976デフォルトの名無しさん2006/12/02(土) 00:32:51
C言語を作るのにおすすめのフリーソフトはありませんか?
0977デフォルトの名無しさん2006/12/02(土) 00:35:24
yaccとflex。
0978デフォルトの名無しさん2006/12/02(土) 00:50:03
yaccとbisonてどこが違うの?
0979デフォルトの名無しさん2006/12/02(土) 00:53:23
>>978
yaccは生で食べれない
bisonは刺身で食べれる

あと仕入れ値がbisonはyaccより1.8倍ぐらい高め
0980デフォルトの名無しさん2006/12/02(土) 00:55:00
flexのDL場所がみつからないよ
0981ぴゅあ2006/12/02(土) 00:55:42
>>975
そか・・・
0982デフォルトの名無しさん2006/12/02(土) 01:06:49
>>980
ttp://www.nagoya-fantasia.com/pc/
ここにミラーあったよ
0983デフォルトの名無しさん2006/12/02(土) 01:16:20
>>982
アッー!!
0984デフォルトの名無しさん2006/12/02(土) 01:21:39
そろそろ誰か次スレたてようね〜
0985デフォルトの名無しさん2006/12/02(土) 02:06:30
>>976
それがコンパイラが欲しいという意味なら
ttp://bdn.borland.com/museum/
ここにある Turbo C 2.01 が最高にオススメ。
統合開発環境があった方がいいというなら Turbo C++ 1.01 という選択肢もアリ。
0986デフォルトの名無しさん2006/12/02(土) 05:45:30
>>976
日本語なら文法や意味があいまいだったり間違えて書いたりしても
読む側が推測してある程度は理解してもらえるけど、
C言語のコンパイラはそんなことないからな。
頑張れ。
0987デフォルトの名無しさん2006/12/02(土) 06:01:20
これ、もっと効率良い書き方ありませんか?

fprintf(output2,"%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",bin[0],bin[1],bin[2],
bin[3],bin[4],bin[5],bin[6],bin[7],bin[8],
bin[9],bin[10],bin[11],bin[12],bin[13],
bin[14]);
0988デフォルトの名無しさん2006/12/02(土) 06:06:32
>>987
int i;
for (i = 0; i < 15 - 1; i++)
  fprintf(output2, "%d\t", bin[i]);
fprintf(output2, "%d\n", bin[i]);
0989デフォルトの名無しさん2006/12/02(土) 06:17:48
ごめん、説明不足だった。
>>988 のは立に数値が保存されてくじゃないですか。
1  2  3  4  みたいに
横に並べて保存したいのです。
FILE *output2;
output2=fopen("1ca_dist.dat","a");
てしたので、シミュレーションする毎にデータに追加されて、
何十回かシミュレーションして各ビンの平均値を出したいのですが。
なにか、うまいこと出来ないかのう?
0990デフォルトの名無しさん2006/12/02(土) 06:28:21
>>989
>>988試してみて言ってるのか?
0991デフォルトの名無しさん2006/12/02(土) 06:44:27
アーー
0992デフォルトの名無しさん2006/12/02(土) 06:46:11
ごめん、そんなんでOKだったとは知らなかった。
レス数が950を超えています。1000を超えると書き込みができなくなります。