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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
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/
2デフォルトの名無しさん:2006/11/09(木) 01:01:39
初めて1000とったわ

>>1
3955:2006/11/09(木) 01:01:54
>>998
>&x

あふっorz
4デフォルトの名無しさん:2006/11/09(木) 01:04:42
&がないとさ、例えばxの中身が0x1000なら、0x1000に書き込んじゃうんだよな?
5デフォルトの名無しさん:2006/11/09(木) 01:21:12
cやってみたいんだがまず何をすればいいんだ
6デフォルトの名無しさん:2006/11/09(木) 01:21:54
>>4
そうだよ

で前レス
http://pc8.2ch.net/test/read.cgi/tech/1160682950/933
こんなの感じで・・・
http://sa-wiki.com/upload/src/up0059.txt
76:2006/11/09(木) 01:23:01
8デフォルトの名無しさん:2006/11/09(木) 01:31:25
>>5
転龍呼吸法でいいんじゃね?
マジレスすると本買って地道に一つずつ覚えて行ってくれ。
9デフォルトの名無しさん:2006/11/09(木) 01:35:44
本か…
10デフォルトの名無しさん:2006/11/09(木) 01:39:36
人生を諦めることからはじめよう。
11デフォルトの名無しさん:2006/11/09(木) 02:39:02
>>5
金を稼いで風俗へ
12デフォルトの名無しさん:2006/11/09(木) 03:07:05
sleep(500);
で、実行を待たせる処理を行いたいと思っているんですが、
sleepは何をインクルードすれば使えるんでしょうか?

webを検索してみてもすぐには出てきませんでした・・
13デフォルトの名無しさん:2006/11/09(木) 03:26:42
unistd.h
14デフォルトの名無しさん:2006/11/09(木) 03:41:10
12です
unistd.hは、windows環境ではない
unix環境のファイルなのですね。

すいません、今更ながら前スレを検索したところ、

630 :デフォルトの名無しさん :2006/11/02(木) 02:18:51
>>628
>警告 W8065 bintori.c 55: プロトタイプ宣言のない関数 'sleep' の呼び出し(関数 main )
プロトタイプ宣言がないと言われている。sleep関数のプロトタイプ宣言が書かれた
ヘッダファイルをインクルードすればいい。どのファイルかはMSDNあたりで自分で探して。

とあり、MSDNライブラリーを探したところ、
.net frameworkの中にはあるとのこと。

しかし.net frameworkが無い環境も想定しなければならず、
その場合自前で時間を計り、
導入するしかないと言うことなのでしょうか。
(長々すいません)
15デフォルトの名無しさん:2006/11/09(木) 03:45:58
C言語(gcc)で書いたプログラムから
SJISでCR/LFのhtmlファイル→EUCでLFのhtmlファイル
に書き出すのに
system("nkf --unix abc1.html > abc-1.html")
system("nkf --unix abc2.html > abc-2.html")
system("nkf --unix abc3.html > abc-3.html")

・(実際はfor文を使ってます。)

system("nkf --unix abc16.html > abc-16.html")
のように使っているけど、文字コードや改行コードを変換するのに
何か他に常套手段てあるんでしょうか?
正常に終了すれば
元ファイル28KB→書き出したファイル28KBでファイル容量は変わらないのに
たまに2・3個失敗していて、書き出したファイルが0KBになっていたり
元ファイル28KB→書き出したファイル22KBになっていたりします。
16デフォルトの名無しさん:2006/11/09(木) 04:43:55
>>15
nkfが失敗しているってことか?
だったら自前で変換するとかiconvライブラリを使うとか。
17デフォルトの名無しさん:2006/11/09(木) 08:18:25
>>14
sleep()じゃなくて Sleep() だか _sleep() って名前じゃね?
windows.h wincon.h
のどっちかだったよ。
18デフォルトの名無しさん:2006/11/09(木) 13:10:50
>>14
俺の環境だと
#include <dos.h>
void _sleep(unsigned seconds);
19デフォルトの名無しさん:2006/11/09(木) 17:03:20
複数のヘッダファイルに名前が入ってる標準関数は、どのヘッダから呼んでも構わないんでしょうか?
20デフォルトの名無しさん:2006/11/09(木) 17:34:34
>>19
試した?(怒)
21デフォルトの名無しさん:2006/11/09(木) 17:41:37
試したんですが、何か違いがあるのかなと思って…
22デフォルトの名無しさん:2006/11/09(木) 17:49:23
>>21
めんどくさいのでおk
23デフォルトの名無しさん:2006/11/09(木) 18:02:37
>>22
どうもです、気にしないことにします
24デフォルトの名無しさん:2006/11/09(木) 18:03:57
>>19
内容が同じでエラーでないならいいんじゃね?
25デフォルトの名無しさん:2006/11/09(木) 18:13:28
>>23
プリプロセッサで検索してくれ
26デフォルトの名無しさん:2006/11/09(木) 20:13:20
>>19
その関数の名前は?
2719:2006/11/09(木) 20:55:50
>>24
ですよ…ね?
>>25
必要に応じてコードで使われている標準関数が多く書かれてるヘッダを選べばいいってことでしょうか?
該当の関数それ一つしか使わないならどちらでもいい、のかな
>>26
上で話題になってたsystem関数です
VC++とLSICの両方でINCLUDEフォルダにstdlib.hとprocess.hにありました
28デフォルトの名無しさん:2006/11/09(木) 21:00:21
むしろ自分で直接プロトタイプを書いてもおk
29デフォルトの名無しさん:2006/11/09(木) 21:09:49
main()
{
float r, s;

printf("円の半径を入力 :");
scanf("%f", &r);
s=3.14*r*r;
printf("s=%f\n", s);
}

で警告 W8070 test3.c 10: 関数は値を返すべき(関数 main )
と出るんだがなんで?
30デフォルトの名無しさん:2006/11/09(木) 21:11:43
関数は値を返すべきだから
31デフォルトの名無しさん:2006/11/09(木) 21:12:11
>>29
mainの型は?
3219:2006/11/09(木) 21:12:15
>>28
あ、ほんとですね
ヘッダをincludeする代わりに単純にint system(const char *);でも行けました
33デフォルトの名無しさん:2006/11/09(木) 21:12:30
main() → int main(void)
return 0;の追加
34デフォルトの名無しさん:2006/11/09(木) 21:13:26
>>29で普通にできたが
35デフォルトの名無しさん:2006/11/09(木) 21:13:50
はじめたばかりで全然わからんのだが
main()だけじゃだめなのか?
そんで最後の}が10のところなんだ
36デフォルトの名無しさん:2006/11/09(木) 21:14:25
>>29
main()でもtest()でもなんでもいいだが, 明示的にtypeが指定されていない関数は,
暗黙の内にintを返す関数として扱われるから.
37デフォルトの名無しさん:2006/11/09(木) 21:15:57
#include <stdio.h> は入れてるよな?
38デフォルトの名無しさん:2006/11/09(木) 21:17:03
>>37
それはいれている
39デフォルトの名無しさん:2006/11/09(木) 21:17:07
>>37
それが無ければ真っ先に未定義の関数〜みたいなエラーが出ると思うんだが
40デフォルトの名無しさん:2006/11/09(木) 21:17:13
初心者におすすめのHP教えてくれ
41デフォルトの名無しさん:2006/11/09(木) 21:18:33
HP:100くらいないと厳しい
42デフォルトの名無しさん:2006/11/09(木) 21:18:55
>>40
43デフォルトの名無しさん:2006/11/09(木) 21:19:41
本格的にやるならVCとかがないと厳しいのかな
44デフォルトの名無しさん:2006/11/09(木) 21:21:06 BE:209677267-2BP(204)
>>39
#includeなくてもコンパイルできるよ。
45デフォルトの名無しさん:2006/11/09(木) 21:21:45
return 0;
ってなんなんだ?
46デフォルトの名無しさん:2006/11/09(木) 21:22:36
>>44
stdioの中身でもコピーするのか?
47デフォルトの名無しさん:2006/11/09(木) 21:24:58
文字同士が同じかどうかを調べるのはどうすればいいんですか。

size_t len = wcslen((wchar_t*)path)-1;
wchar_t c = path[len];
if( c == L"\\")
swprintf_s( path, wcslen(path)+1, L"%s\\",path);
こうするとなぜかcがInt扱いになってるんですけれども。
48デフォルトの名無しさん:2006/11/09(木) 21:31:09 BE:359446289-2BP(204)
>>46
vc2003だと、これもエラー無しでコンパイル&実行できるけど?

main()
{
    printf("%s\n", "aaaa");
}
49デフォルトの名無しさん:2006/11/09(木) 21:32:13
Cって文字の表示・入力しかできないのか
50デフォルトの名無しさん:2006/11/09(木) 21:32:32
>>35>>40
全く分からん状態なら本の1冊でも買えっつったろヴォケェ
51デフォルトの名無しさん:2006/11/09(木) 21:32:39
>>48
それは知らなかった
でも2005じゃエラー吐くな
52デフォルトの名無しさん:2006/11/09(木) 21:33:14
>>49
それだけじゃないんだぜ
53デフォルトの名無しさん:2006/11/09(木) 21:33:34 BE:224653695-2BP(204)
>>51
Cとしてコンパイルしても?
54デフォルトの名無しさん:2006/11/09(木) 21:34:11
>>45
int main(void)
{
return 0;
}
mainもひとつの関数
関数で値を返すにはreturn が必要
55デフォルトの名無しさん:2006/11/09(木) 21:34:18
>>53
Cとしてコンパイルしたらエラー無くちゃんとできたんだぜ
すげえなww
56デフォルトの名無しさん:2006/11/09(木) 21:34:46
関数で値を返すってどういうことなんだ
57デフォルトの名無しさん:2006/11/09(木) 21:35:49
>>56
関数が値を返すのは関数が値を返すんだろ
58デフォルトの名無しさん:2006/11/09(木) 21:40:18
>>56
どういうことってどういうことなんだ
59デフォルトの名無しさん:2006/11/09(木) 21:49:18
>>56
関数の処理が終了して、呼び出し元に制御が戻ってきたときに、関数の中でreturnしたデータを、呼び出し元で使えるってこと
60デフォルトの名無しさん:2006/11/09(木) 21:57:07
>>56
つまり関数は値を返すってことだ
61デフォルトの名無しさん:2006/11/09(木) 22:05:00
値を返さないと関数とは言えないしな。
62デフォルトの名無しさん:2006/11/09(木) 22:07:01
値を返すファンクションを関数とよぶ。
63デフォルトの名無しさん:2006/11/09(木) 22:10:46
>>62
意味が分からん
頭痛が痛いみたいなもんか?
64デフォルトの名無しさん:2006/11/09(木) 22:11:57
値を返すプロシージャと言いたいのかな
65デフォルトの名無しさん:2006/11/09(木) 22:17:12
値をreturnする関数のファンクションが返すプロシージャが
呼び出し元に制御が戻った。
66デフォルトの名無しさん:2006/11/09(木) 22:17:13
戻り値がない場合はなんと呼ぶべきか
サブルーチン
ファンクション
どっちがいい?
67デフォルトの名無しさん:2006/11/09(木) 22:18:26
>>66
普通に関数でいいだろ
68デフォルトの名無しさん:2006/11/09(木) 22:20:40
関数って何だとかくだらん質問してるやつはケチってないで本買え。
69デフォルトの名無しさん:2006/11/09(木) 22:25:15
カオスになってきたな
70デフォルトの名無しさん:2006/11/09(木) 22:27:11
カボス?
71デフォルトの名無しさん:2006/11/09(木) 23:09:48
カバオ?
72デフォルトの名無しさん:2006/11/09(木) 23:15:06
>>66
ファンクション。
だが「関数」ではない。
73デフォルトの名無しさん:2006/11/09(木) 23:18:12
まーた始まった
74デフォルトの名無しさん:2006/11/09(木) 23:40:56
ゲ製作のHSPスレより来ますた
648 名前は開発中のものです。 sage 2006/11/09(木) 23:24:53 ID:OlISg2Xa | ▲上 | ▼下 | リロード | 10件 | 50件 | 100件 | 300件 | 1-100 | あぼ〜ん
こんなん作りました。ソース付きです。まだ完全ではないです。

http://newsstation.info/up/img/ns15294.zip
MD5:093BFE17333C4CB0C99D36CC674143F1
75デフォルトの名無しさん:2006/11/09(木) 23:47:17
関数ポインタってsugeeeee
ごちゃごちゃと表記する意味がよく判らないが
(typedefはしなくてもいいらしいが、何を何にtypedefしてるのかさっぱり分らない)
とにかく今まで悩んでたあんなことやこんなことに活用できそうな気がしてきた
7674:2006/11/09(木) 23:59:14
見事誤爆。駄目だな俺
7715:2006/11/10(金) 00:58:01
>>16
ありがとうございました。
とりあえずiconvライブラリ使ってみることにします。
78デフォルトの名無しさん:2006/11/10(金) 09:06:20
>>66
隣の山田さん
79デフォルトの名無しさん:2006/11/10(金) 14:09:20
Cで
コマンドを発行し、その結果を得たいのですが
サンプルはどっか転がってないですか??

たとえばCで
ifconfig
と発行し、その結果を得たい。
80デフォルトの名無しさん:2006/11/10(金) 14:14:17
man popen
81デフォルトの名無しさん:2006/11/10(金) 18:26:53
test
82デフォルトの名無しさん:2006/11/10(金) 18:36:11
直った
83デフォルトの名無しさん:2006/11/10(金) 18:37:57
なにが?
84デフォルトの名無しさん:2006/11/10(金) 18:38:08
ちょっと落ちてた
85デフォルトの名無しさん:2006/11/10(金) 18:41:22
やっぱそうだったんだ
リロードしてもエラーだからおかしいと思った
Linux板クノッピスレも落ちてた
86デフォルトの名無しさん:2006/11/10(金) 20:16:56
>>49
C言語に文字の入出力機能など御座いません。
それらは総てライブラリの仕事です。
87デフォルトの名無しさん:2006/11/10(金) 20:32:50
>>86
入門者未満はこっちへどうぞ。
ttp://pc8.2ch.net/test/read.cgi/tech/1158275665/
88デフォルトの名無しさん:2006/11/10(金) 20:44:25
ライブラリも含めてC(の処理系)。
ライブラリが無ければ、それは単なるCのコンパイラというだけ。
89デフォルトの名無しさん:2006/11/11(土) 12:28:35
>>86
正しい。

>>87-88
似非回答者はこちらへどうぞ。
ttp://pc8.2ch.net/test/read.cgi/tech/1158275665/
90デフォルトの名無しさん:2006/11/11(土) 12:55:51 BE:159754548-2BP(204)
>>86
こういうことを言ってみたい年頃なんだよな。
91デフォルトの名無しさん:2006/11/11(土) 13:04:51
でもまあ思い違いしてる人も多いしそれを正してやるのはよいことじゃない?
92デフォルトの名無しさん:2006/11/11(土) 13:26:57 BE:29954232-2BP(204)
昔、Cが流行になったろにpascalやらfortranとの比較で、IOがシンタックスに組み込まれてるか、
ライブラリになってるかとかって話題があって、そういうことを言ってるんだろうけど、
「入出力がC言語にない」って言い方は正しいのか?

93デフォルトの名無しさん:2006/11/11(土) 13:33:18
ヒント:「文字の」
94デフォルトの名無しさん:2006/11/11(土) 13:33:28
引数=入力
戻り値=出力
95デフォルトの名無しさん:2006/11/11(土) 13:40:06
>>93
そういうレスは揚げ足取られるだけだお
96デフォルトの名無しさん:2006/11/11(土) 13:57:13
VRAMいじれるOSなら可能だろ。
97デフォルトの名無しさん:2006/11/11(土) 14:04:29
まあ組込なら常識なんだがね
98デフォルトの名無しさん:2006/11/11(土) 14:14:56
bccでWindowsXP上でconsoleアプリ(単純なスクリーンエディタ)
をつくってるんですが、
画面のスクロールをconio.hのputchで全行書き直し,
movetextとかins/dellineとかを試したのですが
更新時間がとても遅く(0.3sec/line程度)なってしまいました。

VRAMをいじらずに標準(的)なライブラリで
うまく実装する方法を教えてください。
99デフォルトの名無しさん:2006/11/11(土) 14:31:28
ttp://www.vector.co.jp/soft/dl/x68/prog/se014962.html
これ見て標準関数の勉強しようかと思ってるんですが、標準関数の中のアルゴリズムってどれも大体は同じなんでしょうか?
100デフォルトの名無しさん:2006/11/11(土) 14:47:38
アルゴリズムが同じなら関数は一個で済む罠
101デフォルトの名無しさん:2006/11/11(土) 14:56:05
たしかに。
102デフォルトの名無しさん:2006/11/11(土) 15:11:57
分かり難くてすみません、どれもというのは、
どのコンパイラに付属する標準関数のものでもって意味です…
10399=101:2006/11/11(土) 15:15:03
どのコンパイラに付属する(同じ名前の)標準関数、でした
104デフォルトの名無しさん:2006/11/11(土) 15:16:02
違うよ
基本的にアセンブラで書かれてるはずだから
CPUや処理系に依存
105デフォルトの名無しさん:2006/11/11(土) 15:18:37
ああ、アルゴリズムか。
開発者に聞かなきゃわからないけど
アルゴリズムは大体似通ったものにはなるんじゃないかな
106デフォルトの名無しさん:2006/11/11(土) 15:19:32
107デフォルトの名無しさん:2006/11/11(土) 15:23:33
笑わないでくださいよ〜いっしょけんめい答えたんだ辛さ〜(><)
10899:2006/11/11(土) 15:24:09
>>104-105
ありがとうございます、アセンブラなんですね
109デフォルトの名無しさん:2006/11/11(土) 15:27:05
笑われたから違うかもです(><)
110デフォルトの名無しさん:2006/11/11(土) 15:29:28
違うよ。
111デフォルトの名無しさん:2006/11/11(土) 15:32:31
正しい答えを教えてあげてください(><)
112こんなもんかな:2006/11/11(土) 15:38:34
アルゴリズムは大して変わらないだろうが、実装レベルではCPUと環境によって様様だろう。
11399:2006/11/11(土) 15:39:09
あ、いえ、105の方がそうらしいならそっちは今は気にしてません
開発者に聞かなきゃ分からないようなこと聞いてすみません
114デフォルトの名無しさん:2006/11/11(土) 15:41:02
115デフォルトの名無しさん:2006/11/11(土) 15:46:36
ちょっとまて、コンパイラ付属の標準関数がアセンブリで書かれてるわけなくね?
コンパイルオプションでアーキテクチャ指定されたときどうすんだよ。
116デフォルトの名無しさん:2006/11/11(土) 15:47:27
すまん Linux(RHEL AS4)の
rawデバイスに対してdatファイルを
writeして、readでInvalid Argument (errno=22)
エラーになるんだがこれって本当に読み出し
出来てないのかな?

rawデバだから読み出し出来てないってOSが
認識してるだけだと思ったんだけど・・・

どうやったら正常にreadさせられるのか
どなたか教えてくださいませ
117デフォルトの名無しさん:2006/11/11(土) 15:47:41
>>112
malloc()のような低水準の処理はアセンブラか機械語、
でも機械語はあり得ないからやっぱりアセンブラだと思うんですけど(><)
118デフォルトの名無しさん:2006/11/11(土) 15:48:23
>>115-116
難しいことはわかりません(><)
119デフォルトの名無しさん:2006/11/11(土) 15:49:14
malloc自体にはアセムは使ってないと思うぞ。
120デフォルトの名無しさん:2006/11/11(土) 15:49:43
単純なメモリ操作だからかな
121デフォルトの名無しさん:2006/11/11(土) 16:11:04
ある本のamazonのコメントで、
>ブロックと関数とループを混同していることなどは看過できない
とあるのですが、これは、どういう意味でしょうか?
こういう批判のある本はやめといたほうがいいのですかね?
122デフォルトの名無しさん:2006/11/11(土) 16:38:01
>>121
混合する奴の頭の中をみてみたい。
多分スコープ辺りだと思うけどどう書かれてるのかは気になるな。
123デフォルトの名無しさん:2006/11/11(土) 16:58:44
ああ、ちなみに、「やさしいC」です。
結局はやめといたほうがいいのですか?
124デフォルトの名無しさん:2006/11/11(土) 17:09:06
>>115
例えばsin()を考える。
最適化オプションを指定されていなければ関数を呼び出すであろう。
しかし、そうでないならFPU命令をインライン展開するはずだ。
更に、sin()呼び出しの前後に同じ引き数でcos()呼び出しもあったとする。
コンパイラによってはFPU命令のsincos同時演算命令を展開するかも知れん。
また、memcpy(), memset()なども大抵は極力高速になるようにインライン展開されるだろう。
斯くの如く、コンパイラ付属の標準関数がアセンブリ言語で書かれている可能性は幾らでもある。

>>122
混合する奴はいないだろ、いるのは混同する奴だ。
125デフォルトの名無しさん:2006/11/11(土) 19:35:44
>>116
つ man 8 raw
というかすれ違いだ。
126デフォルトの名無しさん:2006/11/11(土) 21:18:32
>>98
そもそも現在のBorland C++は、32ビットWindows用のコンパイラであり、
WindowsはVRAMを直に触らせないので、VRAMをいじるという解決策は不可能。

WindowsではWindows APIがもっともOSに近い存在。
127デフォルトの名無しさん:2006/11/11(土) 22:43:45
>>98
wincon.h 読め。
128デフォルトの名無しさん:2006/11/11(土) 23:27:40
C言語でゲームやエディタなどを作ろうと思ったらWINAPIやダイレクトXを使わなかったら
コマンドプロント上での動作みたいな感じになるんでしょうか?
VBとかはwindowがあることが前提っていうか、そんな感じに見えるのですが
変な質問か分かりませんが教えてくれるとありがたいです。
129デフォルトの名無しさん:2006/11/11(土) 23:36:02
>>128
なんか日本語が変だが言わんとしていることは分かる。
答えはyesで、Windowsでの一般的なGUIアプリを作りたいなら、
WIN32 APIかDirectXか、またはそれらを取り込んだライブラリを使用する必要がある。
C言語のみでは、入出力としてはファイルかコンソールへのテキストのみしかできない。
130デフォルトの名無しさん:2006/11/12(日) 00:18:26
128じゃないけど、なんかがっくりきた
winアプリ学ばないと作れ無いのか・・・
131デフォルトの名無しさん:2006/11/12(日) 00:27:30
>>130
winアプリ学ばないとってのがよく分からん
WINAPIのことか?
MSでVC無料で配布してるんじゃなかったっけ?
それ使え
132デフォルトの名無しさん:2006/11/12(日) 00:28:58
VB 気分で行きたいなら、C++ で MFC あたりの VS に入ってるスケルトン使うか、
使ったこと無いから知らんけど C# あたりに行けばいいんちゃう?
133デフォルトの名無しさん:2006/11/12(日) 00:42:47
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int card[4][13];
char total[13] = {11,2,3,4,5,6,7,8,9,10,10,10,10};
char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
char mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
int drawCard(int h);

main(){
int dealer;//ディーラーの引いた合計の数
int player;//プレイヤーの引いた合計の数
int draw_digit;//引いたカードの数
int draw_mark;//引いたカードのマーク
char y_n;//カードを引くか引かないかの答え

srand(time(NULL));
printf("【ブラックジャック】\n");

134デフォルトの名無しさん:2006/11/12(日) 00:43:58
//ディーラーが引く
draw_mark = rand()%4 + 1;
draw_digit = rand()13 + 1;
card[draw_mark-1][draw_digit-1] = 1;
dealer = total[draw_digit-1];
printf("ディーラー一枚目:%sの%s\n",mark[draw_mark-1],,digit[draw_digit-1]);
printf("他は伏せる\n");

//プレイヤーが引く
printf("プレイヤー一枚目:");
player = drawCard(1);
printf("プレイヤー二枚目:");
player += drawCrad(1);

//ディーラー2枚目以降
do{
dealer += drawCard(0);
}
while(dealer <= 16);

//プレイヤー3枚目以降
while(player <21){
printf("もう一枚引きますか?(y\n) > ");
scanf("%c",&y_n);
while(getchar() != '\n'){}
if(y_n == 'y'){
player += drawCard(1);
}
else if(y_n == 'n'){break;} }
        printf("\nディーラー:%d点 プレイヤー:%d点\n",dealer,player);

135133、ずれてしまったので最初から訂正です:2006/11/12(日) 00:45:35
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int card[4][13];
char total[13] = {11,2,3,4,5,6,7,8,9,10,10,10,10};
char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
char mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
int drawCard(int h);

main(){
int dealer;//ディーラーの引いた合計の数
int player;//プレイヤーの引いた合計の数
int draw_digit;//引いたカードの数
int draw_mark;//引いたカードのマーク
char y_n;//カードを引くか引かないかの答え

srand(time(NULL));
printf("【ブラックジャック】\n");

//ディーラーが引く
draw_mark = rand()%4 + 1;
draw_digit = rand()13 + 1;
card[draw_mark-1][draw_digit-1] = 1;
dealer = total[draw_digit-1];
printf("ディーラー一枚目:%sの%s\n",mark[draw_mark-1],,digit[draw_digit-1]);
printf("他は伏せる\n");

136133、ずれてしまったので最初から訂正です:2006/11/12(日) 00:46:32
//プレイヤーが引く
printf("プレイヤー一枚目:");
player = drawCard(1);
printf("プレイヤー二枚目:");
player += drawCrad(1);

//ディーラー2枚目以降
do{
dealer += drawCard(0);
}
while(dealer <= 16);

//プレイヤー3枚目以降
while(player <21){
printf("もう一枚引きますか?(y\n) > ");
scanf("%c",&y_n);
while(getchar() != '\n'){}
if(y_n == 'y'){
player += drawCard(1);
}
else if(y_n == 'n'){break;}
}

printf("\nディーラー:%d点 プレイヤー:%d点\n",dealer,player);

137133、ずれてしまったので最初から訂正です:2006/11/12(日) 00:47:13
//勝敗の判定
if((dealer <= 21 && player > 21)||(dealer <= 21 && dealer > player)) {
printf("ディーラの勝ち!\n");
}
else if((player <= 21 && dealer > 21)||(player <= 21 && player > dealer)){
printf("プレイヤーの勝ち\n");
}
else{printf("引き分け\n");}
return 0;
}

int drawCard(int h){
int draw_mark,draw_digit;//引いたマークと数
int r;//引いたカードの点数
char y_n;//カードを11として計算するか否か

do{
draw_mark = rand()%4 + 1;
draw_digit= rand()%13 + 1;
}
while(card[draw_mark-1][draw_digit-1]);
card[draw_mark-1][draw_digit-1] = 1;
if(h){
printf("%sの%s\n",mark[draw_mark-1],digit[draw_digit-1]);
}

138133、ずれてしまったので最初から訂正です:2006/11/12(日) 00:52:33
if (h && draw_digit == 1)
{//プレイやターンで引いた数が1の時
do{
printf("11として計算しますか?(y_n) > ");
scanf("%c",&y_n);
while(getchar() != '\n'){}
if(y_n == 'y'){r = total[draw_digit-1];}
else if(y_n == 'n'){r = 1}
}
while(!(y_n == 'y' || y_n == 'n'));
}
else{r = total[draw_digit-1];}
return r;
}

blackgack.c:
エラー E2225 blackgack.c 8: 初期化子が多すぎる
エラー E2291 blackgack.c 8: } が必要
エラー E2141 blackgack.c 8: 宣言の構文エラー
エラー E2190 blackgack.c 8: 不要な }
エラー E2190 blackgack.c 8: 不要な }
エラー E2379 blackgack.c 23: ステートメントにセミコロン(;)がない(関数 main )
エラー E2188 blackgack.c 26: 式の構文エラー(関数 main )
警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数
main )
エラー E2379 blackgack.c 87: ステートメントにセミコロン(;)がない(関数 drawCar
d )
*** 8 errors in Compile ***

このエラーの行を見ても直すに直せません。; など足りているのですが・・・
ご指摘お願いします。
139133、ずれてしまったので最初から訂正です:2006/11/12(日) 01:02:15
blackgack.c:
エラー E2379 blackgack.c 23: ステートメントにセミコロン(;)がない(関数 main )
エラー E2188 blackgack.c 26: 式の構文エラー(関数 main )
警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数
main )
*** 2 errors in Compile ***

ここが、どうしてもわかりません。
140デフォルトの名無しさん:2006/11/12(日) 01:03:00
>>135
>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
*これ不要、それとどうでもいいが初期化項目は12個だが・・・

>draw_digit = rand()13 + 1;
rand() と 13  の間に演算子が無い

>printf("ディーラー一枚目:%sの%s\n",mark[draw_mark-1],,digit[draw_digit-1]);
-1],,digit ,, 2つ繋がってる
141デフォルトの名無しさん:2006/11/12(日) 01:04:37
>char mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
これなにをしてるか分かってるか?
142140:2006/11/12(日) 01:07:40
>>135
>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
あと文字単位(文字列ではない)での初期化 ”A” ではなく ’A’ だろ
143140:2006/11/12(日) 01:10:23
>>135
player += drawCrad(1);
Crad のスペルミス
144140:2006/11/12(日) 01:11:14
>>135
else if(y_n == 'n'){r = 1}
1の後ろにセミコロン
145133、ずれてしまったので最初から訂正です:2006/11/12(日) 01:12:56
>>140
ご返答、ありがとうございます。
>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
*これ不要、それとどうでもいいが初期化項目は12個だが・・・

これに関しては参考書の通りに書いていますが・・・
違うのでしょうか?

>>141
ありがとうございます、ポインタですね。


実行できたにはできたのですが
初めてみる、エラーが出てしまいました

blackgack.c:
警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数
main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_drawCrad' が未解決(C:\BBB\BLACKGACK.OBJ が参照)

>>Error: 外部シンボル '_drawCrad' が未解決(C:\BBB\BLACKGACK.OBJ が参照)
こんなエラー初めてです。参考書のエラー対策にも載っていません。
146140:2006/11/12(日) 01:14:41
>>145
スペルミス直したか?
>drawCrad
drawCard
a と r が逆
147デフォルトの名無しさん:2006/11/12(日) 01:15:07
>>133
コードを何レスにも渡って貼り付けた後に質問をするんじゃなく、
先に質問を書いてからコードを貼り付けてほしい。
もしくはコードはどこかのアップローダにあげとくとか。
148140:2006/11/12(日) 01:19:20
>>145
char digit[13] = {'A','2','3','4','5','6','7','8','9','10','J',''Q',K'};
個数足りないと思ったら Q が抜けてる

>char mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
2次元配列に
char mark[4][12] = {"ハート","ダイヤ","スペード","クローバー"};
149133、ずれてしまったので最初から訂正です:2006/11/12(日) 01:20:10
>>146できました!!!!
参考書の結果とは違いますが・・・

>>147
ごめんなさい、次からそうします

150140:2006/11/12(日) 01:23:02
>>149
>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
そうか、ポインタ配列にそれぞれの文字列のポインタを格納してるのか

この部分は直さなくてもいいよ
でも Q は追加してね
151133、ずれてしまったので最初から訂正です:2006/11/12(日) 01:23:14
>>148
ありがとうございます
自分でもきづきませんでした
152デフォルトの名無しさん:2006/11/12(日) 01:25:00
>>140
>>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
>*これ不要、それとどうでもいいが初期化項目は12個だが・・・

char digit[13]={'A', 'B', <略> 'K' }; とさせたいようだが、
digitはchar * の配列としてソース本文?の中で使用しているのだから
元のままでいいだろう。
1文字の文字列しかないなら文字定数でも事足りるといいたいのだろうが、
それをはっきりといわなければ135が混乱するだけじゃない?
別にここのエラーとは関係の無い問題なのだし。
153152:2006/11/12(日) 01:25:57
>>150
お、書き込み気づかなかった。忘れてくれ。
154デフォルトの名無しさん:2006/11/12(日) 01:28:26
>>148
2次元配列にするより
char *mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
でいいだろ
155140:2006/11/12(日) 01:31:41
>>153
いやいや、実は俺こういう方法気づかなかった
いままで
char digit[13] = {'A','2','3','4','5','6','7','8','9','10','J',''Q',K'}; か
char digit[] = {"A2345678910JQK"}; のように
文字列として初期化してた

ポインタ配列って方法もあったんだなと、気づかされたよ
俺もまだまだ勉強不足だと実感・・・・・

>>154
上のと同じだな・・・・
156デフォルトの名無しさん:2006/11/12(日) 01:34:21
>>149
参考書に載っているコードをそのまま打ち込んでるがコンパイルエラーになるということ?
Qが抜けてることからも分かるが、打ち込みミスが多いんじゃないか。
質問をする前に、自分が書いたソースと参考書を「一字一句」比較すべし。

>>145
>こんなエラー初めてです。参考書のエラー対策にも載っていません。
その参考書はC言語のすべてを網羅した魔法の本ではない。本に載ってないことは分からない、ではなく
もっと調べる対象を広げるべき。
コンパイラの出すエラーなら、コンパイラのマニュアルなどを調べる。
VC++とかならMSDNにたいていのことが載っている。BCCのことはよく知らんが。

すぐ上の行に
>警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数 main )
とある。プロトタイプ宣言が何かを知ってる? まずはそれをその参考書で調べること。

とりあえずコンパイルエラーがたくさん出たら、一番上のから順に解決していけ。
一つの原因から、それに連鎖してさまざまなエラーが出る。一つをつぶせばそれに関連していくつかのエラーが消えることがある。
157140:2006/11/12(日) 01:37:00
>>145
>>Error: 外部シンボル '_drawCrad' が未解決(C:\BBB\BLACKGACK.OBJ が参照)
ちなみにこれはdrawCradという関数が使われているが関数の実体が無いよ、と言っている
158デフォルトの名無しさん:2006/11/12(日) 02:20:13
>>129
そうなんですか

じゃあIEとかペイントとかメモ帳とかをCで作ろうと思ったら
WINAPIやらそれ関係が入っているライブラリを呼び出して作るんでしょうか?
なんていうかその呼び出す関数もCで作られてるんですよね?

んー;;なんかよく分からない
Cがすごくできる人の定義ってなんなんでしょう・・
159133、ずれてしまったので最初から訂正です:2006/11/12(日) 02:49:03
>>156
はい、ここで訊く前にもっと調べたりエラーを
たどってみます
160156:2006/11/12(日) 03:26:37
最初は調べ方が分からないのは仕方の無いこと。
問題に対する解決方法を知るのも大事だが、
自分で解決方法を見つけらるようにする方法を学ぶことも大事。
がんばれ。
161デフォルトの名無しさん:2006/11/12(日) 03:31:28
>>159
プログラミングに向いてないな。いい加減コテつけっぱなしなことに気付けよ。
162デフォルトの名無しさん:2006/11/12(日) 04:51:31
#define NUM 3
どうしてもソートできないのです。身長順にしたいんですが・・
構造体の配列のソートってむずかしい。。
typedef struct Person{
char name[100];
double height;
}Person;
int main(void)
{
Person prs1[NUM];
int a,b,c,d;
double tst;
for(a=0; a<3; a++){
printf("名前を入力してください。\n");
scanf("%s",prs1[a].name);
printf("身長を入力してください。\n");
scanf("%lf",&prs1[a].height);
}
for(b=0; b<NUM-1; b++){
for(c=0; c<NUM; c++){
if(prs1[c].height > prs1[b].height){
tst = prs1[c].height;
prs1[c].height = prs1[b].height;
prs1[b].height = tst;
}
}
}
for(d=0; d<NUM; d++){
printf("%sさんは%lfセンチです。\n",prs1[d].name,prs1[d].height);
}
return 0;
}
163デフォルトの名無しさん:2006/11/12(日) 07:13:19
>>162
Person tmp;

for(b=0; b<NUM-1; b++){
for(c=b+1; c<NUM; c++){
if(prs1[c].height > prs1[b].height){
tmp=prs1[c];
prs1[c]=prs1[b];
prs1[b]=tmp;
}
}
}
164デフォルトの名無しさん:2006/11/12(日) 07:13:35
それだと構造体のソートじゃなくて
構造体のメンバ(身長だけ)を入れ替えてるだけだと思うんだけど
165デフォルトの名無しさん:2006/11/12(日) 07:14:34
うほ、>>163が先に書いてた
166デフォルトの名無しさん:2006/11/12(日) 07:36:19
>char digit[13] = {'A','2','3','4','5','6','7','8','9','10','J',''Q',K'};

'10' とか書いてる時点で釣りだろ?
167デフォルトの名無しさん:2006/11/12(日) 08:00:06
>>126
>>127
ありがとんです
MS-DOS時代のものを
ちょっといじるだけではだめなのですね(!=)
wincon.hをぐぐってきます〜
168162:2006/11/12(日) 10:37:55
ほんとは、名前も入れ替えたいんですけど、とりあえず身長だけでもと、
なんでtstがtmpに変わってるのか意味がわからないんですが・・
163の文章をどこかに入れ替えればいいのでしょうか?
やったんだけどうまくいきませぬ。。
169デフォルトの名無しさん:2006/11/12(日) 11:22:17
man qsort
170162:2006/11/12(日) 11:27:27
できました。
c=b+1のとことPersonのとこでした。
ありがとうございました。
171デフォルトの名無しさん:2006/11/12(日) 13:17:00
コンパイルでエラーが出ないようにするのを教えてください!
172デフォルトの名無しさん:2006/11/12(日) 13:22:13
>>171
エラーになっている行を消す を繰り返す
173デフォルトの名無しさん:2006/11/12(日) 15:34:04
>>171
エラーを出さない怠け者なコンパイラを 使う
174デフォルトの名無しさん:2006/11/12(日) 18:29:39
1&>/dev/null

ごめんUNIXよくわかんない
175デフォルトの名無しさん:2006/11/12(日) 18:47:47
そんなこと聴いてるんじゃありません!
わからないなら答えないでください!
176デフォルトの名無しさん:2006/11/12(日) 18:48:55
エラーが出なくなったら大変なんだぜ
177デフォルトの名無しさん:2006/11/12(日) 19:03:58
>>171
コンパイラの性能にではなく
オマエの性能をうp
178デフォルトの名無しさん:2006/11/12(日) 19:16:18
理3です。
179デフォルトの名無しさん:2006/11/12(日) 20:02:32
李さん?シナに帰れ
180デフォルトの名無しさん:2006/11/12(日) 20:33:01
離散家族? さもありなん。
181デフォルトの名無しさん:2006/11/13(月) 00:15:14
c言語の構造体についての質問なんですが、
構造体のメンバー名に変数を使用することはできないのでしょうか?
182デフォルトの名無しさん:2006/11/13(月) 00:18:22
>>181
???
試してみりゃいいじゃん
もしくは具体的な例を店ろ
183デフォルトの名無しさん:2006/11/13(月) 00:27:15
>>181
メンバー名をchar配列とかで決めるってことか?
184デフォルトの名無しさん:2006/11/13(月) 00:32:52
>>182
試したりしてるんですが、いかんせん勉強したてで...

>>183
まさにそれがやりたいんです
char配列で宣言したり、アクセスしたりしたいんですが...
185デフォルトの名無しさん:2006/11/13(月) 00:45:51
メンバー名は区別のための名前であって文字列じゃないから無理じゃね?
186デフォルトの名無しさん:2006/11/13(月) 00:51:53
>>185
やっぱ無理ですか...
無理だと分かるだけでもありがたいです。
どうもありがとう
187デフォルトの名無しさん:2006/11/13(月) 01:12:23
変数名を変数で指定できるか、みたいな感じだな。
188デフォルトの名無しさん:2006/11/13(月) 09:10:31
str_bの中身をstr_aにコピーするプログラムですが
上の関数の中身をs1=s2;にしたらコピーできない理由がわからないです
1文字ずつ比較しないとだめなのでしょうか

#include <stdio.h>
#include <string.h>

#define MAX 10


void str_copy(char *s1,char*s2)
{
while(*s2!='\0')
*s1++ = *s2++;

*s1 ='\0';
}

int main(void)
{
char str_a[MAX]="abcde";
char str_b[MAX]="fghi";

printf("str_a:%s, str_b=%s\n",str_a,str_b);

str_copy(str_a,str_b);

printf("str_a:%s,str_b=%s\n",str_a,str_b);

return 0;
}
189デフォルトの名無しさん:2006/11/13(月) 09:40:59
それだと、関数内でアドレスをコピーしたにすぎないし、
呼び出し元のstr_a, str_bには全く影響受けない
190デフォルトの名無しさん:2006/11/13(月) 10:08:05
ヘタレはC++でもやってろよ(プ
191デフォルトの名無しさん:2006/11/13(月) 11:37:54
ヘタレはC#でもやってりょ(ぷ
192デフォルトの名無しさん:2006/11/13(月) 12:04:00
struct aという構造体は自分と同じstruct a型の変数をメンバとすることができない理由がわかりません。教えてください
193デフォルトの名無しさん:2006/11/13(月) 12:07:12
>>192
構造体のサイズが無限大になるから
194デフォルトの名無しさん:2006/11/13(月) 12:20:43
#ifdef MODE

"モード1選択"
#else

"モード2選択"
#endif

#ifdefでどちらが選択されたかをコンパイル時にコンソールに表示したいのですが、
なにか方法はないでしょうか?
195デフォルトの名無しさん:2006/11/13(月) 12:30:46
コンパイラのヘルプ見ろ。
# 多分 #pragma で出ることが多い
196デフォルトの名無しさん:2006/11/13(月) 13:14:03
#pragma message("モード2")
#message モード2

でできました。有り難うございました。
C51を使用してますが、手持ちのヘルプには記載ありませんでした。
197デフォルトの名無しさん:2006/11/13(月) 16:16:07
>>195
「コンパイル時」
198デフォルトの名無しさん:2006/11/13(月) 16:17:20
C言語の質問なんですが、
double型の変数で整数の部分だけを出力するにはどうしたらいいですか?
199デフォルトの名無しさん:2006/11/13(月) 16:25:15
>>198
double val = 1234.5678;

printf("%.0f");
->1235
printf("%d", (int)val);
->1234
200デフォルトの名無しさん:2006/11/13(月) 17:03:08
>>199
ありがとうございます
切捨てと切り上げの両方できるんですね。

そしてsage忘れてすみません・・・。
201デフォルトの名無しさん:2006/11/13(月) 18:10:02
%0.fは切り上げではなく、丸めている。
切り上げはceil。
切り捨てのfloorもある。
202デフォルトの名無しさん:2006/11/13(月) 19:05:17
>>192
struct a(a1) に struct a(a2) を持たせるとその struct a(a2) もstruct a(a3) を持つのでその struct a(a3) はさらに struct a(a4) を持つので(ry
となってしまう

struct a へのポインタなら持たせられるにょ
203デフォルトの名無しさん:2006/11/13(月) 19:11:12
>>201
(VC++の場合)まるめの方向が0へ向かう四捨五入(?)っぽいね?
printf("%.0lf %.0lf %.0lf %.0lf", -123.5, -123.4, 123.4, 123.5);
→ -124 -123 123 124

このときの振る舞いは環境依存?
204デフォルトの名無しさん:2006/11/13(月) 19:13:50
>>203
C言語としては負数のとき丸め方向は定義されてないから
コンパイラの実装依存と思う

と調べずにカキコ
205デフォルトの名無しさん:2006/11/13(月) 19:21:42
CとC+とC++とC#の違いがわかりません。
素人なんですが、わりやすくどなたかおしえていただけないでしょうか?
206デフォルトの名無しさん:2006/11/13(月) 19:22:24
>>203
単に絶対値で丸めってだけじゃね

と便乗して調べずレス
207デフォルトの名無しさん:2006/11/13(月) 19:43:07
>>205
文法が似ているのと、ライブラリ関数が似ているだけで
まったく別の言語です
208デフォルトの名無しさん:2006/11/13(月) 20:08:42
>>207
ありがとうございます。
209デフォルトの名無しさん:2006/11/13(月) 20:18:27
>>208
Cを拡張、ベースにしたもの
まぁCをまねてC+やC++など作ったみたいな
結果的には別物...
210デフォルトの名無しさん:2006/11/13(月) 20:19:40
CとObjectCだけ覚えればOK
211デフォルトの名無しさん:2006/11/13(月) 20:30:36
>>209
>>210
とりあえずCを勉強すればC+やC++などの方にも応用がきくといった感じですか?
ありがとうございました。
212デフォルトの名無しさん:2006/11/13(月) 20:33:13
C+とかC++なんて覚えるだけ無駄。
限られた特定の環境でしか使わない。
覚えるなら Objective-C にしろ。
213デフォルトの名無しさん:2006/11/13(月) 20:40:04
偶にいるんだよな、敵作りの天才って
214デフォルトの名無しさん:2006/11/13(月) 20:41:16
これから流行るならって観点ならC#だろう。

それでもC++すきだけどな
215デフォルトの名無しさん:2006/11/13(月) 20:48:58
C++はCと微妙に互換性がないからなあ。
Objective-CはCとの互換性があるけど、現実的じゃない。
216デフォルトの名無しさん:2006/11/13(月) 20:53:03
皆さん色々なアドバイスありがとうございました。
とりあえずCを勉強してみようと思います。
217デフォルトの名無しさん:2006/11/13(月) 21:10:11
>>214
C#は流行るか?
何かすぐ消えそうな気がする
218デフォルトの名無しさん:2006/11/13(月) 21:17:20
JAVAと同じ運命をたどる
219デフォルトの名無しさん:2006/11/13(月) 21:30:27
>>217
同意。俺の周りにはC#やってる奴はいない
220デフォルトの名無しさん:2006/11/13(月) 21:53:19
毎日書きまくってますよ>C#
221デフォルトの名無しさん:2006/11/14(火) 01:49:25
C言語で10進数を2進数で表すにはどーすればいいですか??
222デフォルトの名無しさん:2006/11/14(火) 01:59:04
>>221
文字列を使う。
223デフォルトの名無しさん:2006/11/14(火) 01:59:55
んでstrtol()などで変換
224デフォルトの名無しさん:2006/11/14(火) 02:01:47
Cができないから毎日カキまくってますよ
225デフォルトの名無しさん:2006/11/14(火) 02:27:54
オブジェクティグCってWindowsで使える処理系あるの?
Mac専用でしょ?
226デフォルトの名無しさん:2006/11/14(火) 02:50:36
関数をマクロに上手く置き換えると、
戻り値や引数を展開しないので
動作が速くなると言うが、
戻り値void、引数なしの場合は早くなるんでしょうか?
(・・というかvoidも型か・・)

関数を実行するだけで、何か値が動くと思うので、
そのせいでマクロよりは多少遅いものなのでしょうか?
227デフォルトの名無しさん:2006/11/14(火) 02:53:57
指定されたファイルに書かれている整数を、逆順に表示するプログラムをつくるにはどのようにすればよいのでしょうか?
例えば、123 456 78
と入力されると、
78 456 123
と表示されるようなのです。
228デフォルトの名無しさん:2006/11/14(火) 03:02:11
>>227
ぱっと思いつくのは2通り。

1.全部配列に読み込んで逆順に出す
2.ファイルポインタをftell()で取得して配列に入れ、fseek()で逆順に出す
229デフォルトの名無しさん:2006/11/14(火) 03:50:16
何故、char str[] = "CAT" ; だけでポインタが付くと
char str*[] = {"CAT","DOG"}; になっていいのでしょうか?
230デフォルトの名無しさん:2006/11/14(火) 04:10:03
>>229
前者はchar型の配列
後者はchar型へのポインタ配列

意味が全然違う
231デフォルトの名無しさん:2006/11/14(火) 04:10:38
int total[6] = {1,2,3,4,5,6}; で添え字0から始まるので
予め -1 にしておくとは、どういう意味でしょうか?
232デフォルトの名無しさん:2006/11/14(火) 04:13:19
>>231
日本語で書いて
それだけじゃ意味わからんぞ
233デフォルトの名無しさん:2006/11/14(火) 04:37:06
>>230
サンクスです。
どうして、*が付くとそう書けるのかがわかりません
234デフォルトの名無しさん:2006/11/14(火) 04:37:49
変数を宣言したとき、
メモリはどうなるのか教えてください。

あと、絶対にほかのプログラムのメモリにはアクセスできない
のでしょうか?

というか、Cの質問じゃないですかね?
235デフォルトの名無しさん:2006/11/14(火) 04:46:40
*←肛門
236デフォルトの名無しさん:2006/11/14(火) 06:05:16
>>234
メモリが予約されるが、その中に何が入っているかは未定。
前そのメモリ空間を使っていた変数の値がその領域にのこったまま
だったらそれがそのままその領域に残ってる(初期化してくれない)
したがって宣言時に予約した領域に無意味な値を入れて安全にする
(初期化)ことが重要な場合が・・ある
237デフォルトの名無しさん:2006/11/14(火) 07:40:34
>>233
int foo = 5;と書いて
int fooz[] = {1, 2, 3, 4,};と書くが如く、
char * bar = "aho";と書いて
char * barz[] = {"tako", "ika", "kurage",};と書く。
238デフォルトの名無しさん:2006/11/14(火) 07:41:51
>>226
今時のコンパイラはインライン展開もするから、下手な小細工考えずに関数で書け。
そしてその関数だけでなくプログラム全体でプロファイリングしろ。
話はそれからだ。
239デフォルトの名無しさん:2006/11/14(火) 08:30:14
>>238
226です。ありがとうございます!
インライン展開、プロファイリングという言葉を初めて知り、
調べることが出来ましたyo
240デフォルトの名無しさん:2006/11/14(火) 08:35:34
@printf()等の書式指定で
数値を指定桁数まで右スペース埋めしたいのですがどのように書けば良いのでしょうか?

左埋め… printf("%4d",10)→" 10"を出力
右埋め… printf("?",10)→"10 "を出力

Aまた、上記の桁数(4)も動的に指定するにはどのように書式を指定すれば良いのでしょうか?

よろしくおねがいします。(性的な意味で)
241デフォルトの名無しさん:2006/11/14(火) 08:57:38
>>240
printf("%-*d", 4, 10);
242デフォルトの名無しさん:2006/11/14(火) 09:12:00
朝早くからありがとうございます!(性的な意味で)
243デフォルトの名無しさん:2006/11/14(火) 10:13:51
早くないよ・・・速いけど・・・(性的な意味で)
244デフォルトの名無しさん:2006/11/14(火) 15:37:33
整数nが与えられたとき、
n×nのサイズで螺旋状に0から(n二乗ー1)までの数が並ぶ行列を作成し、
画面に表示させるプログラムって配列を使って組むにはどうすればいいでしょうか?
ヒントだけでもいいので教えてください。お願いします。
245デフォルトの名無しさん:2006/11/14(火) 15:43:52
>>244
宿題スレにでも行ったら?
246デフォルトの名無しさん:2006/11/14(火) 18:29:28
typedefとdefineで書き方が逆になるのはなぜなんですか?
247デフォルトの名無しさん:2006/11/14(火) 18:35:33
typdef は複数の句をあつかうから だと思われる。
 typedef unsigned long (*function_ptr)(int, long, long);
のようにね。
248デフォルトの名無しさん:2006/11/14(火) 19:38:43
画面から16進数を入力して10進数に変換する処理ですがstrtol関数を使って
16進以外が途中に入力されたらエラーを出力したいのですが、何か良い方法はありますか?
249デフォルトの名無しさん:2006/11/14(火) 19:39:45
画面から入力ってどんな技術を使うんだよ?
250デフォルトの名無しさん:2006/11/14(火) 19:40:13
>>249
馬鹿だなぁ
タッチパネルに決まってるだろ?
251デフォルトの名無しさん:2006/11/14(火) 19:47:26
板検索しても最初ここが出てこなかったのですれ立てるまでもない質問スレに書き込んでしまったのですが、
改めて質問させて下さい。コピペになりますが、よろしくお願いします。

グーグル先生に質問してみたのですがよくわかりませんでした・・orz
宜しければ詳しく教えて欲しいのですが。

C++にて、テキストファイルに書き込まれたデータを構造体に格納する方法です。
データは一行につき1件で、カンマで区切られて4つの項目があります。
char型が2つとint型が2つになります。
データは10件(行)あります。

よろしくお願いします(´・ω・`)
252デフォルトの名無しさん:2006/11/14(火) 19:55:52
たったの10件程度なら手作業でやるのが早いよ。
253デフォルトの名無しさん:2006/11/14(火) 19:57:28
知識としても理解しておきたいので、どうか(´・ω・`)
254デフォルトの名無しさん:2006/11/14(火) 20:04:51
>>251
>C++にて
スレ違い。

>テキストファイルに書き込まれたデータ
>char型が2つとint型が2つ
それはテキストファイルではない。
255デフォルトの名無しさん:2006/11/14(火) 20:07:32
>254
すいません、Cでお願いします。
書き方が悪かったです。
文字列,文字列,数字,数字
という構造になっているので、構造体の宣言でchar型を2つとint型を2つ用意する必要があるという事を言いたかったんです
256デフォルトの名無しさん:2006/11/14(火) 20:08:12
>>251
man fscanf
257デフォルトの名無しさん:2006/11/14(火) 20:09:53
>>255
文字列は(char型)配列に格納してください。
258デフォルトの名無しさん:2006/11/14(火) 21:13:50
ペイピッポォ
259デフォルトの名無しさん:2006/11/14(火) 21:41:39
int main(){
struct xxx {int *x;} hoge;
struct yyy {void *x;};
struct yyy *piyo = (struct yyy *)&hoge;
return 0;
}
これはコンパイルが通ったのですが、四行目を
struct yyy piyo = (struct yyy)hoge;
とすると型変換できませんとエラーが出ます、何故でしょうか?
260デフォルトの名無しさん:2006/11/14(火) 22:02:56
>>259
(struct yyy)hoge
このキャストは無理
261デフォルトの名無しさん:2006/11/14(火) 22:03:16
struct xxxとstruct yyyは全く無関係の型だから。
262259:2006/11/14(火) 22:05:21
>>260,261
構造体自体のキャストは出来ないんでしょうか?
検索するとC++とかではできるらしい?のでためしてみたんですが
263デフォルトの名無しさん:2006/11/14(火) 22:09:34
>>262
君は http://pc8.2ch.net/test/read.cgi/tech/1160893851/588 かな?
http://pc8.2ch.net/test/read.cgi/tech/1160893851/595
の左辺のキャストを よーーーく見よう C にはない文法の (struct hoge &) ってキャストしてっから。
これは 構造体自体のキャストでは無い
264259:2006/11/14(火) 22:19:22
>>263
同じ日に…いえ、その人は別の方です
C++でも構造体をキャストできているわけでなないんですね
可能だとしても意味はほとんどないんでしょうけれど、疑問に思ったので…
(メンバーの数が違っても)構造体のポインタはキャスト可能ということは
領域破壊でバグの原因になったりしそうでどっちにしろ危険っぽいですね
ありがとうございました
265デフォルトの名無しさん:2006/11/14(火) 22:22:36
ふつう構造体のポインタのキャストで実際に使うのは

struct XXX *p <-> void *p

くらい
266デフォルトの名無しさん:2006/11/14(火) 22:36:41
どうもです、mallocの時〜は、自動でキャストしてくれるんでしたっけ
じゃあ自分のレベルではまだ使うこともなさそうですね
267デフォルトの名無しさん:2006/11/14(火) 22:38:38
>>266
まま、そうおっしゃらずに。
実はいける口なんでしょ?
268デフォルトの名無しさん:2006/11/14(火) 22:40:31
typedef struct{
int length;
char data[1];
}string;

struct{
int length;
char data[buf_size];
}a;

のとき

(string)a

のようにキャストするのもテクニックとしては知っておいたほうがいいかも
269259:2006/11/14(火) 23:01:41
せいぜい数十行のコード書いて試す、を繰り返してる程度ですから…
>>268
すみません、どのように使うんでしょうか?
270デフォルトの名無しさん:2006/11/14(火) 23:02:25
すいません、先ほども質問しましたが、画面から配列に16進数を8桁入力して10進数に変換する処理ですがstrtol関数を使って
16進以外が途中に入力されたらエラーを出力したいのですが、何か良い方法はありますか?
気になって眠れません。
271デフォルトの名無しさん:2006/11/14(火) 23:07:29
>>270
どこまで変換したかってポインタが設定されるから、それを見たら?
途中で止まってたらおかしい。
272デフォルトの名無しさん:2006/11/14(火) 23:08:03
>>270
>249
273デフォルトの名無しさん:2006/11/14(火) 23:19:07
>>271さん
第一引数は配列名で第三引数は基数、第二引数をみるのですか?
274デフォルトの名無しさん:2006/11/14(火) 23:21:09
>>273
そう。
275デフォルトの名無しさん:2006/11/14(火) 23:49:34
>>269
268ではないが。
C言語ではコンパイル時に配列のサイズが決まっている必要があるが、
サイズを動的に変えられる(かのように扱える)構造体を使うためのテクニック。

配列のサイズは固定なので、基本的に最大の要素数を格納できるような
型を用意しておく必要がある。これでは、要素数の少ないデータしか
格納しない場合に無駄が多い。
よって、ケースバイケースで配列の要素数の異なる型が使えると嬉しい。

以下のようにすれば任意の要素数の配列として動的に確保できる。
string *p;
int size = 30;
p = (string *)malloc(sizeof(string) + sizeof(char)*(size - 1);
p->length = size;

この構造体を操作するときは、配列部分のサイズが固定じゃないから、
lengthメンバのようにどこかで配列サイズを保持しておき、
その分だけをアクセスするようにすればいい。

void func(string *pstr)
{
 int i;
 for(i = 0 ; i < pstr->length ; i++) {
  printf("%c", toupper(pstr->data[i]);
 }
}

当然、構造体の最後のメンバにしか適用できない。
276デフォルトの名無しさん:2006/11/14(火) 23:55:26
>>275
仕様書に違反している事には変わりがないけどな。
使うときは自己責任でって奴だ。
C99ではchar data[]って書き方が正式に許されたが。
277デフォルトの名無しさん:2006/11/15(水) 00:33:05
sizeof(char) は常に 1 なんだけど・・・


ま、いっか。
278デフォルトの名無しさん:2006/11/15(水) 02:04:53
2次元配列の意味がわかりません、簡単に言うと
どういう事なのでしょうか?入門書の説明が難しくて
わかりません。
あと、コメントが文字列なので2次元配列は、
どうして使えないのでしょうか?
279デフォルトの名無しさん:2006/11/15(水) 02:39:53
>>278
例えば学校で40人のクラスが5クラスあったとする。
その場合
int data [5][40];
とかになる

>あと、コメントが文字列なので2次元配列は、
>どうして使えないのでしょうか?

これは言ってる意味がわからない
280デフォルトの名無しさん:2006/11/15(水) 02:59:43
>>278
もしかして二次元配列とポインタの関係がわからなくて悩んでいるのか?
最初はポインタ無視していいよ。>>279の通りでいい。

>コメントが

これは俺も不明な質問だが、文字列の二次元配列という意味なら、文字列
そのものが既にchar型の一次元配列なので、1+2=3次元配列が必要になる。

例えば

char [][2][10] = {{"orange", "apple"}, {"banana", "pine"}};

のような感じで。
281278:2006/11/15(水) 03:07:40
>>279
わkりました!!

>>280->>279
>>コメント
入門書にも詳しく書かれていないので、
自分でもよくわかりません、すんまそ。

>>char [][2][10] = {{"orange", "apple"}, {"banana", "pine"}};

のような感じで。


難しいです・・・まだここまで習っていないので参考にさせて
戴きます、頭が混乱するといけないので。

ありがとうございました。
282デフォルトの名無しさん:2006/11/15(水) 03:51:46
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

//すごろくマップの構造体
struct board{
int p;//進む数
int h;//休む回数
char comment[128];
};

int p_position = 1; //プレイヤーの現在位置
int max = 10; //マップの全駒数
void writeBoard(void);

283デフォルトの名無しさん:2006/11/15(水) 03:52:25
main(){
int player; //プレイヤーのサイコロの目

int add; //止まった駒の進む数を格納する
struct board sugoroku[] = {
{0,0,"スタート"},
{0,0,"2駒目"},
{0,0,"3駒目"},
{3,0,"4駒目。3つ進む"},
{-2,0,"5駒目。2つ戻る"},
{0,0,"6駒目"},
{1,0,"7駒目。1つ進む"},
{0,0,"8駒目"},
{0,0,"9駒目"},
{-4,0,"10駒目。4つ戻る"}
};

printf("【すごろく】\n");
srand(time(NULL));

for(;;){
//サイコロを振る
printf("\nプレイヤーの番です。サイコロを振る > ");
while(getchar() != '\n'){}
player = rand()%6 + 1;

284デフォルトの名無しさん:2006/11/15(水) 03:53:05
//位置決定&マップ移動
p_position += player;
printf("目:%d\n",player);
if(p_position > max){break;}

//追加移動
do{
add = sugoroku[p_position-1].p;
printf("%s\n",sugoroku[p_position-1].comment);
p_position += add;
}
while(add != 0);
if(p_position > max){break;}

//現在位置の表示
printf("現在位置%d / %d\n",p_position,max);
writeBoard();
}
printf("あがり\n");
return 0;
}


285デフォルトの名無しさん:2006/11/15(水) 03:54:41
//現在位置を表す関数
void writeBoard(void){
int i;
for(i = 0; i < max; i++){
if(i == p_position-1){
printf("プ");
}
else{printf("□");}
}
printf("\n");
}

これで、合っていますが疑問があります。

>>[p_position-1]

で、-1と言うのが疑問です。何から-1にしているのでしょうか?
286デフォルトの名無しさん:2006/11/15(水) 04:18:00
>>285
質問に愚直に答えるなら、
p_positionから-1にしている。

日本語が不自由な君に軽くエスパーを駆使すると
配列の添え字が0から始まるのに対し、
p_positionは1から始まっているから。
287デフォルトの名無しさん:2006/11/15(水) 05:09:17
>>286
謎がとけました、サンクスです
288デフォルトの名無しさん:2006/11/15(水) 06:14:44
>>236
ありがとうございます
289259:2006/11/15(水) 07:16:45
>>275,276
あ、(string)aというのは本当にそのままキャストするってことではなくて
領域についてこういう風な考え方もできるから知っておくといいという意味でしたか
現場ならではって感じですね、ありがとうございました
290デフォルトの名無しさん:2006/11/15(水) 11:20:55
質問です。
printfの%sに対して数値の0を渡したら、
文字化けやエラーではなく「(null)」という文字列が表示されました。
291printf:2006/11/15(水) 11:22:45
>>290
だって0 == '\0'なんだもん
空の文字列だと思ったんだもん
でも、違うかなと思って気を利かせたんだもん
292デフォルトの名無しさん:2006/11/15(水) 11:43:05
>>291
%s
293デフォルトの名無しさん:2006/11/15(水) 11:58:59
おおっと! 意外なことで291の無知が発覚してしまいました!
294デフォルトの名無しさん:2006/11/15(水) 12:05:59
ハァ?
0 == "\0" は真だろ。
無知はお前の方だろww
295デフォルトの名無しさん:2006/11/15(水) 12:33:00
>>290
環境依存。
未定義の動作だから処理系によって動作は違がう。
その例は単なるフェイルプルーフだからその動作を期待してはいけない。
296デフォルトの名無しさん:2006/11/15(水) 12:56:19
0 == '\0' は真だが 0 != "\0" だろ
297printf:2006/11/15(水) 13:02:24
>>294
私のために争わないで!!
勘違いしただけなんだもん
0==NULLなんだもん
だけど、参照できなかったんだもん
298デフォルトの名無しさん:2006/11/15(水) 13:48:45
引数として受け取った文字列を逆順にした文字列に書き換える関数
を作りたいんですけど、どうすればいいですか?
自分は
char str[6];
int i;

for (i=0;i<6;i++)
{
str[i]="文字列"[i];
}
printf("%s\n",str);
return 0;
}
こういう奴をいじっていくつもりなんですけど。
299デフォルトの名無しさん:2006/11/15(水) 13:53:35
まず「逆順」の定義を。
300デフォルトの名無しさん:2006/11/15(水) 14:02:54
>>298
#include <string.h>
#include <stdlib.h>
char* reverse(char str[]) /* return NULL if error */
{ int i, len=strlen(str); char* buf;
if ((buf=(char*)calloc(sizeof(*buf), len)) == NULL) return NULL;
for (i=0; i<len; i++) buf[i]=str[i]; for (i=0; i<len; i++) str[i]=buf[len-1-i];
free(buf); return str; }
301デフォルトの名無しさん:2006/11/15(水) 14:07:18
>>299
unkoだったらoknuって出るようにします
>>300
すいません、まだポインタ習ってないです。
302デフォルトの名無しさん:2006/11/15(水) 14:08:01
>>301
予習になったね
303デフォルトの名無しさん:2006/11/15(水) 14:14:30
if(strcmp(str,"unko")==0)
printf("oknu");
304298:2006/11/15(水) 14:16:45
わからないことの内容に含まれると思うので言い直します><
ポインタ無しで>>298を(逆順の定義は>>301)解決したいです
どなたかお願いします。
文字列の連結やらコピーをするくらいまではなんとかできます。
305デフォルトの名無しさん:2006/11/15(水) 14:23:38
>>304
てことは、>>298の "文字列" ってのが
"列字文" ってならなくてもいいんだな?
306298:2006/11/15(水) 14:26:38
>>305
それは困ります><
できたらできたほうがいいです
307298:2006/11/15(水) 14:32:49
>>306は自分じゃないです。

>>301は だったら って書いたので例えのことです。
これだったら>>1でいう詳しく書いたことにならないようなので、
言い直すと入力した文字の後から1つ1つ順番に出力したいです。
308デフォルトの名無しさん:2006/11/15(水) 14:35:40
だから多バイト文字を1文字として扱うか複数文字として扱うかを訊いてんの。
309デフォルトの名無しさん:2006/11/15(水) 14:41:15
漢字1文字にかかるデータ量 が Cのデータ上で1つになるとは限らない。
310デフォルトの名無しさん:2006/11/15(水) 14:46:54
CRLFの問題もあるけどね
311298:2006/11/15(水) 14:48:15
>>309
すいません、それすら知りませんでした。
>>308
>>298は課題が出たからわからないので聞きにきたんですが、
問題の内容にすら書いていません。今までの課題の流れだと日本語を入力したことがないので
流れから判断して多バイト文字は無視でお願いします。
312デフォルトの名無しさん:2006/11/15(水) 14:52:55
>>300
しかし汚いコードでつね
313デフォルトの名無しさん:2006/11/15(水) 15:38:39
宿題スレでやれ
314デフォルトの名無しさん:2006/11/15(水) 15:44:12
char str[6];
int i,k=6;

for (i=0;i<6;i++)
{
str[i]="文字列"[k--];
}
printf("%s\n",str);
return 0;


はいはい俺天才
315デフォルトの名無しさん:2006/11/15(水) 15:45:40
>>314
つ\0
316デフォルトの名無しさん:2006/11/15(水) 15:48:26
str[5] = '\0';

え、、えへへ
317デフォルトの名無しさん:2006/11/15(水) 15:51:31
>>314
いや、大きさが足りない
(男の人に言ったらまずかった?)
318デフォルトの名無しさん:2006/11/15(水) 15:52:08
釣りは釣りスレでやれ。
319デフォルトの名無しさん:2006/11/15(水) 15:53:24
k-- → --k
320デフォルトの名無しさん:2006/11/15(水) 15:55:52
str[6] → str[7]
321デフォルトの名無しさん:2006/11/15(水) 16:30:37
勉強になりました
322大学生:2006/11/15(水) 22:26:24
「問題16」eの値を実数として計算し表示せよ。
「問題17」πの値を実数として計算し表示せよ。

「問題18」eの値を小数点以下60桁まで求めよ。
「問題19」πの値を小数点以下60桁まで求めよ。
この問題16.17.18、19のC言語プログラム(C++)でお願いします。
それと多倍長少数を利用して作ってください。
323デフォルトの名無しさん:2006/11/15(水) 22:28:34
>>322
C/C++の宿題を片付けます 76代目
http://pc8.2ch.net/test/read.cgi/tech/1162771475/
324デフォルトの名無しさん:2006/11/15(水) 23:49:40
C言語の入門サイトを見て回ってVC++ 2005 ExpressEditionをインストールしたのですが
いろんなところでとりあえずこれでやってみれと書いてある
Win32コンソールアプリケーションで作ると追加できるソースファイルが*.cppです
とりあえずHelloWorld!は出たんですが
*.cファイルが追加できるように設定しといた方がいいんでしょうか?
325デフォルトの名無しさん:2006/11/15(水) 23:57:59
別に cpp でいいんじゃない?
326デフォルトの名無しさん:2006/11/16(木) 00:15:23
ファイル名を指定する時に拡張子付きで入力しろ。
327327:2006/11/16(木) 03:22:17
テキストファイルを読み込んで特定の箇所を上書きしたんですが、
その書き換えかたがわかりません。教えていただけませんでしょうか><;
以下のように記述していまして、c(文字型)の部分に整数を入れたいんです。

   while((c = fgetc(fp)) != EOF)
   {
      if(c == '特定の文字')
      {
         //ここがわかりません
      }
   }
328デフォルトの名無しさん:2006/11/16(木) 03:36:04
>>327
f = ftell();
fseek(fp, 0, SEEK_CUR);
fputc(c, fp);

つまり"r+"で開いたファイルは、fseek()すればそのすぐ次には書いてもよい。
一度でも書いたらまたfseek()もしくはrewind()しないと読めない。
329デフォルトの名無しさん:2006/11/16(木) 03:37:18
while((c = fgetc(fp)) != EOF)
{
if(c == '特定の文字')
{
c = 15; //任意の整数
}
}
330デフォルトの名無しさん:2006/11/16(木) 03:38:59
おっとっとftell()は不要でした
331デフォルトの名無しさん:2006/11/16(木) 03:45:48
>>328
おまえ日本語読めないのか?
>>327はそんなこと望んでないぞ。
>>329が正解だろ。
332デフォルトの名無しさん:2006/11/16(木) 03:54:54
”上書きしたんですが”を”上書きしたいんですが”とエスパー読みしてみた
333327:2006/11/16(木) 05:13:55
>>328さん
>>329さん
>>331さん

ありがとうございました。助かります。
すいません打ち間違ってしまったようで、
332の方のエスパー読みが実はこちらの言いたかったことなんです。
とすると、328の方のおっしゃったfseekを使えばいいんですか?
とりあえず使い方を調べて試してみます。
334327:2006/11/16(木) 05:30:56
続けて失礼します。
試しに大文字と小文字を置き換えてみようと思って下のように
記述したのですが、これだと実行時にエラーになってしました。
恐らくfseekの使い方が誤っていると思うのですが、
どのように改善すればいいんですか? 質問ばかりで申し訳ないです。

  while((c = fgetc(fp)) != EOF)
  {
    if(c=='S')
    {
      fseek(fp,0,SEEK_CUR) ;
      fprintf(fp, "s") ;
      fseek(fp,0,SEEK_CUR) ;
    }
  }
335デフォルトの名無しさん:2006/11/16(木) 05:37:35
>>334
多分ファイルのオープンモードが"r"になってるんだと思うよ。
"r+"にしてね。
336327:2006/11/16(木) 05:43:09
>>335さん

ありがとうございます。
モードは大丈夫みたいです。
他の文法や使い方は問題ないですか??
337デフォルトの名無しさん:2006/11/16(木) 05:43:43
あ、それともう一つ
fgetc(fp)で既にファイルポインタが一つ進んでいるので

fseek(fp, -1, SEEK_CUR);
fputc('s', fp);
fseek(fp, 0, SEEK_CUR);

だな
338デフォルトの名無しさん:2006/11/16(木) 05:45:44
それからcはintで宣言してる?charじゃだめだよ
EOFを表せないから
339デフォルトの名無しさん:2006/11/16(木) 05:47:49
眠気に耐えられないので寝まつ
後は他の人に任せた
340327:2006/11/16(木) 05:53:27
>>335さん

ありがとうございます。
確認したんですがモードは大丈夫なようです。
前後は以下のようになってますが、
関数の使い方や文法に間違いはありませんか??
もしかすると最初に見つけたSで
処理を繰り返してしまっているかもしれません。


  fp = fopen("MMMMM.txt", "r+") ;

while((c = fgetc(fp)) != EOF)
{
if(c=='S')
{
fseek(fp,0,SEEK_CUR) ;
fprintf(fp, "s") ;
fseek(fp,0,SEEK_CUR) ;
}
}

fclose(fp) ;
341327:2006/11/16(木) 06:00:43
>>339さん

ありがとうございました。
337を参考に変えてみたんですが、それでも変わりませんでした・・・。
改行したくないのでfprintfを使ってるのが問題なのかもしれません。

cは整数以外も読み込むのでcharでないとエラーになってしまうと
思います・・・。

遅くまでありがとうございました。頑張ってみます。
342デフォルトの名無しさん:2006/11/16(木) 09:09:46
>>341
fgetc()の戻り値はcharで表せないEOFも返す必要から、intになっている。
従って、cはintであることが望ましい。
#つーか、charで受けるのは間違い。

それと、最初のfseek()は1バイト戻せと既に指摘されているのだがそっちは無視か?
343デフォルトの名無しさん:2006/11/16(木) 13:18:35
>>342が無視された件・・・
344デフォルトの名無しさん:2006/11/16(木) 13:32:42
無知な奴ほど素直じゃないのさ
345327:2006/11/16(木) 13:49:39
>>342さん

ありがとうございます。

fseekの-1は参考にさせてもらいました。
書き込みのタイミングがかぶってしまったようです。

おっしゃるとおりcharが落とし穴だったようで、
intにしたらうまくできました!
文字はcharというド素人の固定概念が間違ってました・・・><;

これを多少応用したものを作らなければならないので、
まだ安心はできませんが、なんとかなりそうです。
助かりました。ありがとうございましたm(__)m
346デフォルトの名無しさん:2006/11/16(木) 14:25:08
サーバに単純な数値だけのデータを送りたいのですが
どのようにすればよいのでしょうか?
windowsのマシンでCを使い
linuxのサーバにデータを送るという感じです
347デフォルトの名無しさん:2006/11/16(木) 14:35:59
>>346
サーバとクライアント用の二つのプログラムを用意する
(来週につづく...)
348デフォルトの名無しさん:2006/11/16(木) 14:38:13
>>346
そのサーバって何?http? ftp? samba?
そのプロトコルに従って通信してください。
349346:2006/11/16(木) 14:38:53
ちなみにサーバ用はPHPを使うのですが出来ますか?
350デフォルトの名無しさん:2006/11/16(木) 14:45:09
メールで送ったらいいんじゃね?
351デフォルトの名無しさん:2006/11/16(木) 14:49:21
>>349
PHPってことはHTTPだろ。Winsockでも使ってやれ。
352346:2006/11/16(木) 14:54:09
>>351
そうですねhttpです
クライアント用のほうは事情があって
Cで書かなきゃならないので・・・
Winesockですか調べてみます
これはCの中でできるんですよね?
353デフォルトの名無しさん:2006/11/16(木) 14:57:33
>>352
VC++, gcc, bccなどWin32APIが呼べる環境ならできる。
これ以上の話はCとは関係ないのでスレ違い。
354デフォルトの名無しさん:2006/11/16(木) 16:22:03
inetd使えば?
355デフォルトの名無しさん:2006/11/16(木) 18:33:09
おまいらに全てを捧げたくなる位惚れちゃってます。
356デフォルトの名無しさん:2006/11/16(木) 19:14:08
>>355
おまえのものはおれのもの
357デフォルトの名無しさん:2006/11/16(木) 20:04:59
>>356
よお、じゃいあん
358デフォルトの名無しさん:2006/11/16(木) 20:51:49
>>357
悪いけど、今日は歌いたい気分じゃない・・・
359デフォルトの名無しさん:2006/11/16(木) 21:17:08
fgets + sscanf でなく、scanf を使ってしまっても
構わないようなケースにはどのようなのがあるでしょうか。
360デフォルトの名無しさん:2006/11/16(木) 21:22:40
ちょっと実験するためだけのような使い捨てのコードなら。
361わからないので教えてください:2006/11/16(木) 21:46:32
すみません、この問題のプログラムはどう作ればよいのかがわからないので
ぜひ、よろしくお願いします・・・

問題
配列su(要素数:12)に任意の数値をランダムに初期値設定し、逐次決定法によって
整列(昇順)させ、結果を表示させるプログラムを作成してください。
362デフォルトの名無しさん:2006/11/16(木) 21:54:26
何とか法とか何とか論を皆が知ってると思うなよ
363デフォルトの名無しさん:2006/11/16(木) 22:03:07
どうみても宿題ですありが(r
364デフォルトの名無しさん:2006/11/16(木) 22:05:56
逐次決定法って何だよ。バブルソートか?単純選択法か?
365デフォルトの名無しさん:2006/11/16(木) 23:08:41
任意の数値をランダムに初期値設定って何?ランダム値を初期値にするってこと?
逐次決定法が何か知らんが昇順ソートでおk?
366デフォルトの名無しさん:2006/11/16(木) 23:19:29
C++やP2P技術に卓越したプログラマの方々
宜しければ一度で良いので拝見して頂きたいです
当企画の成立には貴方の力が必要です

次世代コミュニティ製作 C++,mod_perl,P2Pが使えるコーダ、グラフィッカ募集中
http://pc8.2ch.net/test/read.cgi/tech/1163349367/
367デフォルトの名無しさん:2006/11/16(木) 23:20:33
>>366
おいいい加減にしろよ。あちこちのスレにコピペしやがって。
削除依頼出すぞ
368STUDENT:2006/11/16(木) 23:29:36
「問題17」πの値を実数として計算し表示せよ。
「問題19」πの値を小数点以下60桁まで求めよ。
のCプログラム(C++)を作ってください。
多倍長少数を利用してプログラムを作ってください。

369デフォルトの名無しさん:2006/11/16(木) 23:44:45
>>368
おいいい加減にしろよ。あちこちのスレにコピペしやがって。
削除依頼出すぞ
370デフォルトの名無しさん:2006/11/17(金) 00:06:05
>>368
作るのはかまわんが、お前にはやらん。
371デフォルトの名無しさん:2006/11/17(金) 00:12:11
Delete(368);
372デフォルトの名無しさん:2006/11/17(金) 16:26:48
>>368
printf("3.141592653589793238462643383279502884197169399375105820974944");
373デフォルトの名無しさん:2006/11/17(金) 18:18:03
int Test(int iParamCount,...)
{
char* pParam[20];
int i;
va_list args;

//可変個引数を取得
va_start(args, iParamCount);
for(i=0; i<20; i++){
pParam[i] = va_arg( args, char* );
}

return 0;
}

上記のように可変個引数を取得しようとしているのですが、
引数の型が複数あり、うまく引数が取得できません。
なにかいい方法ありませんか?
374デフォルトの名無しさん:2006/11/17(金) 18:19:49
sageちゃった。
375デフォルトの名無しさん:2006/11/17(金) 18:30:07
printf/scanf系みたいに呼び出し側から型を伝えるようにするしかない。
蛇足だが、vprintf/vscanfのようにva_listを引数にとるものも作れ。
376デフォルトの名無しさん:2006/11/17(金) 19:30:12
#include<stdio.h>

int main(void)
{
int array[5];
int count;


for(count=0;count<5;count=count+1){
printf("Input No.%d",count);
scanf("%d",array[count]);
}

for(count=4;count>=0;count=count-1)
printf("No.%d:%d\n",count,array[count]);

return(0);
こいつで実行してもエラーで強制終了するんですけど何故ですか?}
377デフォルトの名無しさん:2006/11/17(金) 19:33:07
>>376
scanf("%d",array[count]);
引数はアドレスです
scanf("%d",&array[count]);
378デフォルトの名無しさん:2006/11/17(金) 19:33:17
>>376
}がなくね?
379デフォルトの名無しさん:2006/11/17(金) 19:36:46
>>378
>こいつで実行してもエラーで強制終了するんですけど何故ですか?}

この文の最後にあるw
380デフォルトの名無しさん:2006/11/17(金) 19:37:39
>>379
見えてなかったorz
381デフォルトの名無しさん:2006/11/17(金) 19:47:13
>>377
それでできましたどうもです
382デフォルトの名無しさん:2006/11/17(金) 20:21:41
>>379
ちょっとワロタ
383デフォルトの名無しさん:2006/11/17(金) 22:30:56
LPCSTR str = "Friday, 01-Jan-2007 00:00:00 GMT";のような
クッキー形式の日付をtime_t値に変換する関数とかあれば教えて下さい。
384383:2006/11/17(金) 22:39:41
無さそうなんでやっぱりいいです。
385デフォルトの名無しさん:2006/11/17(金) 23:31:22
>>383
自分で変換する関数作れ
386デフォルトの名無しさん:2006/11/18(土) 00:21:01
>>383
つ[popen("date -d 'Friday, 01-Jan-2007 00:00:00 GMT'", "r")]
387デフォルトの名無しさん:2006/11/18(土) 00:23:10
あ、いかん、出力形式指定するの忘れてた。
date -d 'Friday, 01-Jan-2007 00:00:00 GMT' +%s
388デフォルトの名無しさん:2006/11/18(土) 01:23:06
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int s, x[8]={0};
s=sizeof(x)/sizeof(x[0]);
printf("size of x: %u¥n"(unsigned) s);
return 0;
}
void fun(int *x)
{
int s;
s=sizeof(x)/sizeof(x[0]);
printf("size of x: %u¥n"(unsigned) s);
}

fun関数の中で配列xの要素数をカウントするプログラムを考えているんですが、
関数に配列を渡す時点でポインタに置き換えられるので、main関数での
printf文とfun関数でのprintfの出力が違ってしまいます。

2つが違ってしまう原理自体は理解出来ているつもりなのですが、何かいい方法は
ないでしょうか?スマートな方法を思いつかなくて困っています。
389デフォルトの名無しさん:2006/11/18(土) 01:27:39
>>388
C++なら
template <int N>
void fun(int (&x)[N})

と宣言すれば

s=sizeof(x)/sizeof(x[0]);

が使えるが、Cでは配列は必ずポインタに変換されてしまうため
配列の大きさに関する情報は失われてしまう。

通常
void fun(int *x, int n)
と、別のパラメータで大きさを渡す。
390388:2006/11/18(土) 01:33:36
>>389
深夜にありがとうございます。

やっぱりパラメータで渡すしかありませんか。引数が増えていくとどんどん
コードが不細工になってくるんで、もう泣きそうで……

ってかC++だったらそんなこと出来るんだ。この際、C++のお勉強しようかな。
391デフォルトの名無しさん:2006/11/18(土) 01:36:21
>>390
設計を変えて構造体を使えば?
もしくは番兵を使う手もある。(最後の要素を示す記号として-1を使うとか)
392388:2006/11/18(土) 01:40:46
構造体はよく理解出来てないんで、ちょっとやってみます。
複素数演算を作ったことがあるんで、上手くやればいけるかも知れませんね。

簡単化のためにintで書いたんですが、実際はdouble型でインパルス応答なんかの
数値を入れようと思っています。なので、番兵に数値が入るとまずくって…

構造体でポインタと要素数を抱き合わせておくっていうのが、よさそうですね。
393デフォルトの名無しさん:2006/11/18(土) 02:01:19
大抵の処理系なら、NaNを番兵に使えるかもしれない。
或いは、正規化できる前提で-0を使うとか。
394デフォルトの名無しさん:2006/11/18(土) 03:11:01
ダイテル本の練習問題の条件演算子を使った問題で

printf("%s\n", count % 2 ? "****" : "++++++++");
てやつがあったんですがこれは
count % 2 で1の時に真を返すってことでいいんですか?
395デフォルトの名無しさん:2006/11/18(土) 03:38:23
お前は何をいっているんだ。
396デフォルトの名無しさん:2006/11/18(土) 03:55:35
たぶん、「0じゃない値を真と評価する」を
俺用語に訳すと「count%2で云々」になるんだと思う。

あと、ゆとり世代で日本語が苦手なので
本の名前なんか正確に書かなくても、読み手は推測してくれるし
文章に読点なんか無くても、読み手が理解するよう努力してくれるものだと思ってる
はず。
397デフォルトの名無しさん:2006/11/18(土) 04:04:30
>>396
わかりました、ありがとう!
もう消えていいよ!
398デフォルトの名無しさん:2006/11/18(土) 05:59:24
>>397
人の忠告は素直に聞くようにしたほうがいいよ。
自分にとって不愉快な書き方だからってそんな反応をしているようじゃ、
次に書き込むときも似たようなことをして、似たような反応をされるはず。
399デフォルトの名無しさん:2006/11/18(土) 07:55:53
この場合どっちもどっちだと思うけど
400デフォルトの名無しさん:2006/11/18(土) 10:40:12
少し注意されただけで煽り返すとか精神年齢低すぎだろ
下手にでる事も出来ない奴って・・・出世できねーぞwwwww
401デフォルトの名無しさん:2006/11/18(土) 10:54:29
>>400
木津着いた・・・
402デフォルトの名無しさん:2006/11/18(土) 11:42:04
実年齢が低かったら精神年齢も低くても問題ないよ
403デフォルトの名無しさん:2006/11/18(土) 12:42:39
私の書いたBubble Sortのプログラムこれであっていますか?
コンパイルして正常に動作する感じですが、提出物なので皆さんもレビューしてくださいませんか?

#include <stdio.h>
main()
{
char moji[50],wk;
int i,owari;
printf("文字列を入力してください。隣接交換法で昇順にソートします\n");
scanf("%s",moji);
/* printf("%s\n",moji); */
/* 入力された文字列の終わりを求める */
for ( owari = 0 ; moji[owari] ; owari++)
; /* owariの中身が要素数になる */
/*printf("%d\n",owari); */
for ( ; owari >= 2 ; owari-- ){
for ( i = 0 ; i+1 < owari ; i++ ){
if ( moji[i] > moji[i+1] ){
wk = moji[i];
moji[i] = moji[i+1];
moji[i+1] = wk;
}
printf("%s\n",moji);
}
}
printf("ソート後の文字列は %s です。\n",moji);
}
404デフォルトの名無しさん:2006/11/18(土) 12:55:15
>>403 「正常に動作」の定義は?
405デフォルトの名無しさん:2006/11/18(土) 13:07:43
初心者です。
関数で「*strcpy」とかについている「*」の意味ってなんですか?
ポインタ?
406デフォルトの名無しさん:2006/11/18(土) 13:10:35
>>405
ポインタ。
407デフォルトの名無しさん:2006/11/18(土) 13:13:28
>>403
{を行末に付けるの止めれ。ブロックが見にくい
scanfに&が無い
scanfだと50文字以上入力されてもわからない
for (; owari >= 2 ; owari-- ) → for (; owari >1 ; owari-- )
逐次ソート結果出力はイラネ。
408デフォルトの名無しさん:2006/11/18(土) 13:15:08
[ ]は自由の牢獄
* は希望の光
両者は同じであり、異なる。
409デフォルトの名無しさん:2006/11/18(土) 13:17:28
>>407 本当にお疲れ様でした。
>{を行末に付けるの止めれ。ブロックが見にくい
フリーフォーマット(感想はチラシの裏に)
>scanfに&が無い
配列なのに必要?
>逐次ソート結果出力はイラネ。
「正常に動作」の定義は?
410デフォルトの名無しさん:2006/11/18(土) 13:17:46
あとforの後にスペース入れるのも止めれ。読みづらい。
411デフォルトの名無しさん:2006/11/18(土) 13:18:54
>>403 個人差があるとは思うけどレビューってことで
変数名の変更(変数間の関係が分かりやすいように)
moji → mojiretu
owari → mojiretu_len

標準関数を使う
mojiretu_len=strlen(mojiretu);

ループ用変数は別に用意する(文字列の長さを示す変数を変更しない)
412405:2006/11/18(土) 13:19:47
なんか理解しました。
413もんた:2006/11/18(土) 14:41:30
キーボードからの入力で、EXITと入力すると
プログラムが終了するようにはどうしたらできますか?
414デフォルトの名無しさん:2006/11/18(土) 14:46:23
>>413
if (strcmp(str, "EXIT") == 0) exit(0);
415もんた:2006/11/18(土) 14:50:36
>>414

宣言は何がいりますか?
416デフォルトの名無しさん:2006/11/18(土) 14:51:26
>>415
exitで終わらせたいコードを載せたほうが早いよ。
417もんた:2006/11/18(土) 14:54:16
while (scanf("%s", s) == 1) {

for (i = x = y =n_y= 0; s[i]; i++){
printf("%s\n", s);

if (!(p = strchr(r, s[i]))) {

break ; }
この部分でfscanでEXITが入ると終了したいんですが。
418もんた:2006/11/18(土) 15:00:58
すいませんscanfでEXITが入ると終了したいんですが
419デフォルトの名無しさん:2006/11/18(土) 15:02:04
>>417
while (scanf("%s", s) == 1) { 
if (strcmp(s, "EXIT") == 0) exit(0); 

scanf()の次の行に入れればいいかな。

ファイルの先頭あたりに、
#include <stdlib.h>
#include <string.h>
という行がなかったら追加する。

420もんた:2006/11/18(土) 15:10:12
できました。ありがとうございます。

if (!(p = strchr(r, s[i]))) {
の行で、
コンパイラに、おそらく不正な代入関数(main)とでるのですが。
何か分かりますか?
421デフォルトの名無しさん:2006/11/18(土) 15:12:39
>>420
p = strchr(r, s[i])
これが代入になってるため
コンパイラは本本当は == 何じゃね?と勘違いしてメッセージをだす
むしすればおk
422デフォルトの名無しさん:2006/11/18(土) 15:14:21
それで警告出るなら、二行に分けて書くしかないかな?

p = strchr(r, s[i]);
if (!p) { 

コンパイラのオプションを調べて、その警告をでなくするか。
423もんた:2006/11/18(土) 15:15:10
>>421
わかりました。ありがとうございました。
424421:2006/11/18(土) 15:40:49
>>423
if ( (p = strchr(r, s[i])) == 0 ) {
でもいい
425デフォルトの名無しさん:2006/11/18(土) 15:42:35
>>424
代入をカッコでくくって、!してる式でも警告がでるなら、それでも出るんじゃないの?
426デフォルトの名無しさん:2006/11/18(土) 15:59:31
>>425
いや ( (p = strchr(r, s[i])) == 0 ) はたぶんだが式中に比較演算子があるのでコンパイラは「比較している」と認識する
(!(p = strchr(r, s[i])) だと代入演算と論理演算しかないため式中で比較していないと認識するのではないかと思う
427デフォルトの名無しさん:2006/11/18(土) 18:17:10
#include<stdio.h>
#define MAX100
#define PRIME0
#define NOT_PRIME1

int main(void)
{
int number[MAX+1];
int i,j;


for(i = 1; i <= MAX; i = i + 1)
number[i] = PRIME;


number[1] = NOT_PRIME;
for(i = 2; i <= MAX; i = i + 1) {
if(number[i] == PRIME) {
for(j = 2 * i; j <= MAX; j = j + 1)
number[j] = NOT_PRIME;
}
}


for(i = 1; i <= MAX; i = i + 1)
if(number[i] == PRIME)
printf("%d\n",i);

return(0);
}

100までの素数検索プログラムなんですけど実行結果が変です。どこかおかしいところありますか?
428デフォルトの名無しさん:2006/11/18(土) 18:20:16
>>427
defineがおかしくね?
429428:2006/11/18(土) 18:22:43
>>427
と思ったらそれだけじゃなったな
430デフォルトの名無しさん:2006/11/18(土) 18:28:46
for(j = 2 * i; j <= MAX; j = j + i)
ここがおかしかった自己解決
どうもすいませんでした
431デフォルトの名無しさん:2006/11/18(土) 19:51:46
なんでこれ aとbの中身を交換できないの〜?

#include <stdio.h>
main()
{
char a='A',b='B',*ap,*bp;
printf("%c %c\n\n",a,b);
ap = &a;
bp = &b;
a = *bp;
b = *ap;
printf("%c %c",a,b);
}

$ ./pointer.exe
A B

B B

ってなる・・・どうすればいいのでしょう?アドレスを習ったばかりでアドレスを使って交換
する方法を考えています。
432デフォルトの名無しさん:2006/11/18(土) 19:55:11
>>431
頭を柔らかくして考えてみな
a = *bp;このときaのアドレスにbpの中身つまり'B'が代入された
そしてb = *ap;この時ののapはaのアドレスを示している
aのアドレスに入っているのは'B'
もうOKか?
433デフォルトの名無しさん:2006/11/18(土) 20:09:11
>>432
おおお!ななななななるほど!

普通の変数wkみたいには行かないってことかぁ・・・

もっとよく考えて見ます。ありがとう御座います。
434デフォルトの名無しさん:2006/11/18(土) 20:23:07
>>433
普通の変数でも同じ。

char a='A',b='B';
a=b;
b=a;

だと交換できないよ。
435デフォルトの名無しさん:2006/11/18(土) 22:01:12
常識ちぇきに考えちぇ変数二ちゅじゃ交換できないだろ
436デフォルトの名無しさん:2006/11/18(土) 22:10:56
warning: comparison between pointer and integer
こんなエラーが出たんですけど、わけわかりません・・・
437デフォルトの名無しさん:2006/11/18(土) 22:13:24
>>436
ポインタとintを比較してますよ。
438デフォルトの名無しさん:2006/11/18(土) 22:27:09
>>437
いいえ。ポインタと整数を比較しているんです。
439デフォルトの名無しさん:2006/11/18(土) 22:34:15
ポインタと整数を比較・・・
かぁ〜もうめんどくせ〜
違う方法でやるか・・・
440デフォルトの名無しさん:2006/11/18(土) 22:52:05
>>439
何を比較したいの?
キャストすれば?
441デフォルトの名無しさん:2006/11/18(土) 23:43:51
警告なら行番号くらいでてるだろ
その行くらい晒せばいいんじゃね
442デフォルトの名無しさん:2006/11/19(日) 00:56:47
初めまして。プログラムの勉強をしようと思い「14歳から始めるわくわくゲームプログラミング」という本を買いました。
P74に書いてあるサンプルプログラムを本の通り書いたのですが

エラー E2293 C:\MyC\dxtest\dxtest.cpp 9: ) が必要(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
と表示されてしまいます。
---------------------------------------------------------------------
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)

{changewindowmode(true);

if(dxlib_Init() ==-1) return(-1);

int drawbox(0,0,120,120,6553,true);

int waitkey();

int DxLib_end();

return(0);}
-------------------------------------------------------------------
どこをどう直せばいいですか?
スレ違いでしたらごめんなさい。
443デフォルトの名無しさん:2006/11/19(日) 01:10:11
どこから突っ込むべきか迷ったから、修正版を先にあげるぞ。
///////ここから
#include "DxLib.h" 

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) 
{ChangeWindowMode(true); 
if(DxLib_Init() ==-1) return(-1); 

DrawBox(25,25,120,120,6553,true); 
WaitKey(); 
DxLib_End(); 
return  0;}
///ここまで
444デフォルトの名無しさん:2006/11/19(日) 01:14:00
>>443
ありがとうございます。
無事動きましたが一体どこが悪かったんでしょうか?
C言語のコマンドは大文字・小文字で全く違う意味になると考えればいいですか?
445443:2006/11/19(日) 01:20:39
まず、一つ目は大文字と小文字は区別されるってこと。
changewindowmode と ChangeWindowModeは別物扱い。
他にも幾つか間違ってるが、自分で確認してくれ。

それと、2つ目int drawbox(0,0,120,120,6553,true);   int waitkey();   int DxLib_end();
のintは付かない。 
詳しく説明するとめんどいから、軽くするが、 int WiINAPI WinMain() {}
ってのは、関数を作ってる。感覚。
逸れに対して、ただの DxLib_Init() ってのはどっかに作った関数を呼び出してる感覚。
DrawBox()とWaitKey()とDxLib_End()はここでは作るわけじゃく呼び出してるので、 intなどが付かない。
446443:2006/11/19(日) 01:33:48
こんなので、関数のイメージをつかんでみるといいかもしれん。
//ここから
#include "DxLib.h" 
void muro(int a)
{DrawString( 250 , a*32 , "これはmuro()関数内の処理" , 38453 );
}
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) 
{ChangeWindowMode(true); 
if(DxLib_Init() ==-1) return(-1); 
muro(2);
WaitKey();
DrawBox(25,25,120,120,6553,true); 
DrawString( 250 , 240 - 32 , "WinMain()関数内の処理" , 56453 );
WaitKey();
muro(3);
WaitKey();
DxLib_End(); 
return  0;}
//ここまで
muro()関数を作って、それをDxLib_End()やWaitKey()
そしてDrawBox()と同じように呼び出している。
のがつかめれば上出来。
muro()のカッコ内が変わると、表示される位置がズレルのも注目。
447デフォルトの名無しさん:2006/11/19(日) 01:50:14
370ページの入門書終わらしたのですが、イメージしか
掴めませんでした、不向きでしょうか?
448デフォルトの名無しさん:2006/11/19(日) 02:08:00
プログラムを書いている途中
printf("%*s%s\n",horse_pos[r],"",horse[r]);
とあったのですが、,horse_pos[r],"",horse[r]);
の部分の,""の意味が分かりません
どなたか教えていただけませんか?
449デフォルトの名無しさん:2006/11/19(日) 03:18:17
printf("%*s%s\n",horse_pos[r],"あいうえお",horse[r]);

だったら分かるんか?
450デフォルトの名無しさん:2006/11/19(日) 04:09:06
>>447
イメージが掴めたならその内なんとかなるよ。
あとは、コードを読んで分析理解して、
コードを書いて試行錯誤していけばいい。
451デフォルトの名無しさん:2006/11/19(日) 04:51:39
>>450
そういわれると、嬉しいです。
中には掴めない方もいるでしょうか?
452デフォルトの名無しさん:2006/11/19(日) 06:35:52
入門書は著者自身が誤解しているとしか思えない本が多いので、
間違ったイメージであることも多い。
自分で書いて適当な場所で他人にレビューしてもらうことを勧める

最初は けなされると思うが。
453static:2006/11/19(日) 07:27:22
初めまして。書籍を参考にしながら独自コードに直している間につまづきました。
static修飾子について質問させてください。

static修飾子をつけた同じクラスのメンバにアクセスさせると、
コンパイル時にリンクエラーになります。
参考にした書籍にはそのように載っているので、何か条件があるのだと思いますがわかりません。
何から疑っていったら良いでしょうか。
具体的には、下記のようなコードの場合にエラーになります。

class CWindow {
public:
  HWND RegistWindow(char* wndName, char* wndTitle, int posXX, int posYY);
protected:
  static LRESULT CALLBACK _WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  static CWindow* m_static;
};

LRESULT CALLBACK CWindow::_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  CWindow* p = m_static;  // こいつがいけないらしい
}

HWND CWindow::RegistWindow(char* wndName, char* wndTitle, int posXX, int posYY) {
  m_static = this;  // これもいけないらしい
}
454デフォルトの名無しさん:2006/11/19(日) 08:06:29
ここはCスレ。C++の話題はスレ違い。

【初心者歓迎】C/C++室 Ver.32【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1160893851/
455πr^2:2006/11/19(日) 11:16:01
char * str[] = {"String1","String2"}
などとなっているchar[]のポインタをリターンする関数はどう宣言すればいいのでしょうか。
456デフォルトの名無しさん:2006/11/19(日) 11:18:02
char ** foo()
{
static const char * const static_strings[] = {"string1", "string2",};
return static_strings;
}
457πr^2:2006/11/19(日) 11:40:13
>>456
char ** foo();

int main(){
char **str = foo();
}

char ** foo()
{
static const char * const static_strings[] = {"string1", "string2",};
return static_strings;
}

をコンパイルすると、
エラー E2034 strtest.cpp 10: 'const char * const *' 型は 'char * *' 型に変換できない(関数 foo() )
というエラーがでました
458デフォルトの名無しさん:2006/11/19(日) 11:52:54
あーいけね。
const char * const * foo() // 以下略
459πr^2:2006/11/19(日) 13:06:06
>>458
const char * const foo()でできました!
ところで、char* str[];とし、str[]の配列の数を決めるときはどのようにするのでしょうか。
char *str[] = new char*[20];としても、
'char * *' 型は 'char *[]' 型に変換できない
とエラーがでてきてしまいます。
460デフォルトの名無しさん:2006/11/19(日) 13:10:33
>>459
数を別に渡すしかない。
461デフォルトの名無しさん:2006/11/19(日) 13:43:59
#include<stdio.h>
#include<math.h>
int main(void){
int a,b,c;
double kotae;
printf("aの値は入力:");
scanf("%d",&a);
printf("bの値は入力:");
scanf("%d",&b);
printf("cの値は入力:");
scanf("%d",&c);
kotae=sqrt(b*b-4*a*c);
printf("%f",&kotae);
return 0;
}


何を入力しても答えが0になってしまいます
ボスケテください
462デフォルトの名無しさん:2006/11/19(日) 13:56:27
>>461
#include<stdio.h>
#include<math.h>
int main(void){
int a,b,c;
double kotae;
printf("aの値は入力:");
scanf("%d",&a);
printf("bの値は入力:");
scanf("%d",&b);
printf("cの値は入力:");
scanf("%d",&c);
kotae=sqrt(b*b-4*a*c);
printf("%f",kotae);
return 0;
}
463デフォルトの名無しさん:2006/11/19(日) 14:00:54
>>462
実行してみたのですが、答えがNaNと表示されました・・・
464デフォルトの名無しさん:2006/11/19(日) 14:01:24
printf("%f",&kotae);
       ↑
465463:2006/11/19(日) 14:03:29
あっと、ごめんなさい勘違いでした
計算されてました
でも、答えがマイナスになる場合だとNaNとでるのですが、
マイナスの答えまできっちり表示させる方法ってありますか?
466デフォルトの名無しさん:2006/11/19(日) 14:05:50
そもそもマイナスの平方根なんてないだろ・・・
467デフォルトの名無しさん:2006/11/19(日) 14:09:29
kotaeなんて変数つくらなくても printf("%f",sqrt(b*b-4*a*c)); でいいよ
ていうか>>461は(b*b-4*a*c)のところの計算の順序はこれでいいの?
468デフォルトの名無しさん:2006/11/19(日) 14:10:20
469461:2006/11/19(日) 14:10:37
>>466
言われてみるとそうでした・・・orz

>>462
>>464
>>466
どうもありがとうございました助かりました
470デフォルトの名無しさん:2006/11/19(日) 14:11:41
>>461のソースでもエラーが出るのがVC2005だから困る
正直キャストが面倒くさい
471461:2006/11/19(日) 14:14:03
すみません、更新せずに書いてしまいました

>>467
なるほど、そういうやり方あったんですね、気づきませんでしたorz

式はあってると思います・・・・・思います・・・
472デフォルトの名無しさん:2006/11/19(日) 14:19:54
>>469
おいおい、
虚数を扱えるライブラリを紹介しろとか
そういうのじゃないのか。
473static:2006/11/19(日) 14:41:52
>>454
失礼しました。
474デフォルトの名無しさん:2006/11/19(日) 14:57:53
数学の話ができるおまいらに嫉妬
475448:2006/11/19(日) 15:22:47
>>449
超亀レス申し訳ありません
つまり、前の文字列と後ろの文字列の間のスペースということですか?
これを無くして書くことはできないのでしょうか?
476デフォルトの名無しさん:2006/11/19(日) 15:27:15
>>475
>448のprintf()なら、これと等価だろ。
printf("%s\n",horse_pos[r] + strlen(horse[r]),horse[r]);
要は、文字列をずらすために空白文字で調整したいのだろうから。
477448:2006/11/19(日) 15:40:08
>>476
それでデバッグしてみると文字列の最後にク■↑と表示したい文字列の後ろに出てしまいます
エラーは起きていないようですが
478デフォルトの名無しさん:2006/11/19(日) 16:47:09
入力された五つの数値の最大と最小を表示する。この処理を、配列とポインタ変数を使用して作成。

使用配列とポインタ変数
int suchi[5];
int *saidai,*saisyou;

ポインタ変数とかポインタとかよく分かんないorz
このプログラムはどう書けばいいのでしょうか?
479デフォルトの名無しさん:2006/11/19(日) 16:52:26
>>478
C/C++の宿題を片付けます 76代目
http://pc8.2ch.net/test/read.cgi/tech/1162771475/
480448:2006/11/19(日) 16:57:14
>>476
printf("%s\n",horse_pos[r] + strlen(horse[r]),horse[r]);
て%s%sじゃなくていいんですか?
481デフォルトの名無しさん:2006/11/19(日) 16:58:22
%*sだな。
482448:2006/11/19(日) 17:02:52
>>481
ありがとうございます、変な文字も出ず解決しました
483デフォルトの名無しさん:2006/11/20(月) 00:58:40
>>461らへん
sqrt()する数値をabs(b*b-4*a*c)
にして、
abs(b*b-4*a*c)!=b*b-4*a*c
だったらb*b-4*a*cは負の数になってるので、
答えの最後に「i」を表示すれば一応ソレらしきものにはなるのでは
484デフォルトの名無しさん:2006/11/20(月) 01:23:27
便乗質問ですみませんが
#include <stdio.h>
int main(void){
printf("%*s","hogehoge",10);/*10は適当な数値*/
return 0;
}
はどこか構文間違えていますか?
コンパイルは通るのですが、不正終了してしまいます
三行目printf("%*s","hoge","piyo",10);にすれば実行は出来ますが
数千個分の改行とスペースが出力されるだけです
環境はWinXP VC++Toolkit2003です
%10sのようなフィールド幅指定は問題ありませんでした
485デフォルトの名無しさん:2006/11/20(月) 02:16:49
printf("%*s", 10, "hogehoge");
486484:2006/11/20(月) 02:25:02
orz
すみません、初歩的なミス過ぎますね・・・
夜更けにどうもありがとうございました
487デフォルトの名無しさん:2006/11/20(月) 05:21:50
for(;; p_turn = !p_turn){

とはどう言う意味でしょうか?

あと
for(;;)と言うのも参考書に載っていますが
意味がわかりませんので
これら二つの、ご助言を宜しくお願い致します。

こちらのスレで質問するのが正しいと思いました
マルチではありません。
488デフォルトの名無しさん:2006/11/20(月) 06:23:54
ttp://pc8.2ch.net/test/read.cgi/tech/1160897843/52

質問を撤回してない
マルチ氏ね
489デフォルトの名無しさん:2006/11/20(月) 06:46:08
490デフォルトの名無しさん:2006/11/20(月) 15:31:07
3次元配列をポインタで動的メモリ割り当てするのってこれであってる?

#include<stdio.h>
#include<stdlib.h>
main()
{
int i,j;
int ***z;
z = (int ***)malloc( 3 * sizeof(int **));
z[0] = (int **)malloc( 4 * sizeof(int *));
z[0][0] = (int *)malloc( 3 * 4 * 5 * sizeof(int));

for(i=0;i<3;i++){
z[i] = z[0] + i * 4;
}
for(i=0;i<3;i++){
for(j=0;j<4;j++){
z[i][j] = z[0][0] + i * 5;
}
}

free(z);
return 0;
}
491デフォルトの名無しさん:2006/11/20(月) 15:33:48
>>490
free(z)だけでは足りない。

free(z[0][0]);
free(z[0]);
free(z);
492デフォルトの名無しさん:2006/11/20(月) 19:06:41
循環定義を含むプログラムを正しくコンパイルするにはどうすればいいですか?
以下のようなコードを書いたところ、コンパイル時に
error: dereferencing pointer to incomplete type
というエラーが出てしまいます。


typedef struct sa *sa_p; // 先に sa のポインタだけ定義

typedef struct {
  sa_p a2;
} sb, *sb_p;

typedef struct { // sa の本体を定義
  sb_p b;
} sa;

int main() {
  sa_p a = (sa_p)malloc(sizeof(sa));
  a->b->a2 = a; // compile error
  return 0;
}
493デフォルトの名無しさん:2006/11/20(月) 19:30:58
それ循環のせいじゃないし。
コンパイルが通らないのは当然かつそれでは実行時も落ちるだろう。
>typedef struct { // sa の本体を定義
>  sb_p b;
>} sa;
ここで無名構造体をtypedefしたsaと本来のstruct saが別物になってる。
でもって
>  a->b->a2 = a; // compile error
ここでおそらく落ちる。ちゃんと
a->b = (sb_p)malloc(sizeof(sb));
とやってからにしろ。
494デフォルトの名無しさん:2006/11/20(月) 21:45:35
携帯電話のiアプリは起動するとほとんどのがjavaで作ってるみたいなのですが
Cでも作ることはできるのでしょうか?
495デフォルトの名無しさん:2006/11/20(月) 21:49:35
>>494
クロスコンパイラ持ってれば出来るんじゃね?
496デフォルトの名無しさん:2006/11/20(月) 22:26:22
ちょいと質問させてくださいな。
やっぱりプロトタイプ宣言はすべきなのですか?

これは、一番上にmain関数をもって行けば早い話であって、
関数を変えた時にプロトタイプ宣言を変え忘れて、
コンパイラが通らないと言う事も起きたりするので
別に必要ないんじゃ無いかと思ったりしてるからです。
497デフォルトの名無しさん:2006/11/20(月) 22:34:33
別にしなくていいよ。
そのうちソースとヘッダを分けることを覚えたら、自然と気にならなくなるだろうし。
498デフォルトの名無しさん:2006/11/21(火) 00:58:36
コンソールで動く、簡単なシューティングゲームを作りたいのですが、
リアルタイムにキー操作を取るにはどうすればいいんでしょうか。

scanfなどでは入力待ち状態になってしまいますし・・
499デフォルトの名無しさん:2006/11/21(火) 01:00:05
環境依存だけど
kbhit
getch
で調べてみれば?
500デフォルトの名無しさん:2006/11/21(火) 01:04:06
>>498
正直、Windowsで作ってるなら、ライブラリを使ったGUI方がはるかに楽だよ。
コンソールは面倒。
たぶん、Win以外もライブラリ使用のほうがらくだと思う。
501デフォルトの名無しさん:2006/11/21(火) 01:08:13
問題はライブラリの使い方を覚えるのが面倒だという可能性があること。
それを乗り越えれば、楽だろうけど。
502デフォルトの名無しさん:2006/11/21(火) 01:10:34
>>498 サンプルコード
#include<stdio.h>
#include<conio.h>

intmain(void){
intmoji='-';

while(1){
if(kbhit())moji=getch();
printf("\r%c [%3d]", moji, moji);
}
return 0;
}
503デフォルトの名無しさん:2006/11/21(火) 01:12:45
上の方でも出てる、DxLibなんかは、かなり簡単。
2chからリンクするのは気が引けるが
初心者からそこそこの上級者までお勧めできる。
(ただ、なんでもかんでもintが活躍するので、少し危険性も高いが)
504デフォルトの名無しさん:2006/11/21(火) 01:20:00
みなさんどうも!

if(kbhit()){
 switch(getch()){
 case 75: //キー入力は左カーソル
printf("left");
break;
 case 77: //キー入力は右カーソル
printf("right");
         break;

case 32://キー入力はスペース
printf("space");
break;
}
}

という感じで出来ました。
コードも載せていただきありがとうございます。
Dxlibも調べてみますね。
505デフォルトの名無しさん:2006/11/21(火) 01:25:08
>>504
カーソルキーは一回押すと二つコードが送られるよ
自分で試して確認しな
506デフォルトの名無しさん:2006/11/21(火) 01:35:14
以下のような3つのペアの実数をファイルに書き、
それらのペアを配列を使って読んで、
それぞれの四則演算を別のファイルに書き出しなさい。

5.0 3.0
2.5 1.0
4.0 1.5


って課題が授業で出てサッパリわかんなくて困ってるんですが、
どなたか助けていただけないでしょうか?
507デフォルトの名無しさん:2006/11/21(火) 01:36:14
508507:2006/11/21(火) 01:51:36
>>506 ごめ、別スレと勘違いしてた。
あと、マルチ…
509デフォルトの名無しさん:2006/11/21(火) 11:20:59
構造体を作成して返す定石を教えてください
今は以下のようにしています。関数の戻りで値コピーでなく、ポインタ渡しでやりたいです。

typedef struct tagX01
{
 int val1;
 car *val2;
} *LPX01, X01;

呼び出し

LPX01 x01;

x01 = (LPX01)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(X01));
CreateX01(x01);

BOOL CreateX01(LPX01 target) {
  // ここで値設定
}

この、HeapAllocで領域作っているところを、CreateX01の中に入れたいです。
単に、入れるとx01が初期化されていないとコンパイラが警告してきます。
510それで判らなきゃ大抵間抜けだ:2006/11/21(火) 11:24:35
>>509
下請け関数を先に定義するかプロトタイプ宣言をするかしないとコンパイラが型チェックをしてくれない典型。
先ずはそこからやって味噌。
511デフォルトの名無しさん:2006/11/21(火) 12:27:27
>>510
BOOL CreateX01(LPX01 target) を
BOOL CreateX01(LPX01 *target)とかにしないと作ったやつを返せナインぢゃないですか?
512デフォルトの名無しさん:2006/11/21(火) 12:46:25
>>511
LPX01がポインタ型だから、それは問題ない。

> 単に、入れるとx01が初期化されていないとコンパイラが警告してきます。

挙げてあるコード片はそんな警告が出るようには見えないけどな。
完全なソースを挙げるべし。
513512:2006/11/21(火) 12:48:03
あ、勘違いしてた。HeapAlloc()を移動したいのね。
>>511のようにするか、CreateX01()の戻り値をLPX01にするかですね。
514デフォルトの名無しさん:2006/11/21(火) 13:02:49
>>510
>>512-513
ご回答ありがとうございます。
やっぱ、ポインタのポインタを渡さないといけないんですね。ありがとうございました。

typedefでつける銘銘なんですけど、構造体はtag[名前]、構造体へのポインタLP[名前]がWindowsAPIっぽくてかっこいいんですが、
ポインタのポインタは命名せずに*LPX01とかが一般的ですか?SDKのヘッダをLPでGREPしてみましたがそれっぽいのがないです
ポインタのポインタになってるやつはLPVOIDが多い気がしますがいろんな型がかえってくるからかなぁと想像しています
515デフォルトの名無しさん:2006/11/21(火) 13:10:14
>>514
Win32 APIみたいにポインタを「LPほげ」とすること自体が、一般的で
はないし、ダサい。

516デフォルトの名無しさん:2006/11/21(火) 13:13:28
>>515
かっこいいとおもっていたのでキツいです
かっこいいのはどんなかんじですか?例かかっこいいっぽいソースとか教えてもらえないですか。
517デフォルトの名無しさん:2006/11/21(火) 13:21:59
どのようなときに、if-else if 文を
switch 文に変換不可能かを教えて欲しいです。
518デフォルトの名無しさん:2006/11/21(火) 13:41:49
>>516
ある型のポインタにわざわざ型名を割り当てるのは、ポインタであることを見失いやすく却って読み辛くなる。
素直にX01 ** fooで充分だ。

>>517
条件式が定数との一致以外のとき。
#つまり、switchにできる方が例外的。
519デフォルトの名無しさん:2006/11/21(火) 13:59:05
>>517
たとえば、
・条件が複数の変数を参照するとき
・条件が整数の定数ではないとき
・整数で分岐だけど、範囲が広過ぎるとき (i < 0 のような)
520デフォルトの名無しさん:2006/11/21(火) 14:16:01
switch(i < 0 ){
case 0:

break;
default :

}
521デフォルトの名無しさん:2006/11/21(火) 17:57:50
>>518
なるほど。別名をつけるのがすでに間違いなんですね。
WindowsSDKではtypedefで構造体とポインタに別名をつけているのが決まりみたいだったんで、
当たり前だと思ってました。実はWindowsSDKがカッコ悪くて、悪い例だったんですね。レス、ありがとう。
522デフォルトの名無しさん:2006/11/21(火) 18:05:14
すいません。
画面から入力した文字列を逆に表示するというのは
どうやったら表示できますか?
523デフォルトの名無しさん:2006/11/21(火) 18:07:41
逆というのは文字が逆という意味です。
どうやったらできますか?
524デフォルトの名無しさん:2006/11/21(火) 18:08:38
文字が逆ってことは、
Eがヨになるって事?
525デフォルトの名無しさん:2006/11/21(火) 18:47:37
初心者な質問で恐縮ですがお願いします。
c言語でかなりの数の数値計算を行うソフトウェアに挑戦しています。
ただ、それを実行するとメモリのinactiveがドカーンとできてしまい、
プログラムが終了しても大きく確保されたままです。
メモリの動的な確保などはしていません。
これは私のプログラムにマズい部分があるのでしょうか?
それとも問題ないのでしょうか?
526デフォルトの名無しさん:2006/11/21(火) 18:58:34
>>525
Linuxか?
大丈夫、他の用途に使いたくなったらOSが勝手に回収する。
処で、malloc()などを使わないでどうやってメモリを確保しているんだ?
527デフォルトの名無しさん:2006/11/21(火) 19:03:51
>>523
こういう事?
char* reverse(char *s)
{
char t, *l = s, *r = s + (strlen(s) - 1);

if(s == NULL){ return NULL; }
while(l < r){
t = *l;
*l = *r;
*r = t;
++l;
--r;
}
return s;
}
528デフォルトの名無しさん:2006/11/21(火) 19:55:22
>>526
勝手に回収すると聞いてちょっと安心です。
ありがとうございます。
環境は実はMac OSXです...(汗

ええっと。動的な確保自体をやっていないつもりなんです。
(答えになっているのかどうか不安ですが...すみません)
529デフォルトの名無しさん:2006/11/21(火) 20:30:13
1.本当に動的確保をしていないか
 ・ライブラリが内部で動的確保をしている可能性
  例:C標準関数のstrdup
2.巨大な静的又はグローバルな配列を宣言していないか
 ・スタートアップで静的領域に一気に確保される
530デフォルトの名無しさん:2006/11/21(火) 20:38:22
プログラム実行のときにある意味動的に被疑者確保
531デフォルトの名無しさん:2006/11/21(火) 20:48:43
\t はタブ文字,\n は改行文字です.

hogehoge \t hoge \n
と言う文字列(char配列)に"ABC"という文字列を加えて

hogehoge \t hoge \t ABC \n
としたいのですが,hogehoge,hogeの長さが任意のため
どこまでをコピーするのかで困っています.
どのように既述をすれば良いのでしょうか?
よろしくお願いします.
532デフォルトの名無しさん:2006/11/21(火) 21:00:21
strlen()で長さを調べろ。
533531:2006/11/21(火) 21:27:26
>>532
こんなことで悩んでいたとはお恥ずかしい.
ありがとうございます.
534デフォルトの名無しさん:2006/11/21(火) 21:29:19
>>529
やべ。まさしく2でした。
でっかいグローバルな構造体の配列がありやす
もっかい勉強し直してきます。
1についても初めて聞きました。勉強になりやした。
ありがとね。
535デフォルトの名無しさん:2006/11/21(火) 21:49:28
文字列を特定の位置から削除したいのですが、どうするのが良いのでしょう?
方法を教えてください。

char string = "ABCDE/FGHIJ";
として
文字列に'/'があったら、それ以降を削除したいのです。

s_point = strstr (string, "/");
*s_point = '\0';

で行けると思っていたのですが、コンパイルにはエラーは
ありませんが、実行するとエラーが出て止まってしまいます。
Borland Cコンパイラ(フリー版)とWin2000で、
DOSプロンプト上での実行です。

何か案がありましたら、よろしくお願いします。
536デフォルトの名無しさん:2006/11/21(火) 21:54:04
char string[] = {"ABCDE/FGHIJ"};
こうすればOK。
537デフォルトの名無しさん:2006/11/21(火) 21:55:01
>>535
char string[] = "ABCDE/FGHIJ";
538デフォルトの名無しさん:2006/11/21(火) 21:55:19
char *string = "ABCDE/FGHIJ";
これじゃ駄目だから間違えるなよ。
たとえ上手く動いてるように見えても絶対駄目だからな。
539デフォルトの名無しさん:2006/11/21(火) 21:55:45
被った。スマソ
540デフォルトの名無しさん:2006/11/21(火) 21:56:59
>>536-538

ごめんなさい。
その部分は書き込みが間違えていて、ちゃんと
char string[] = {"ABCDE/FGHIJ"}; にしていました。

541デフォルトの名無しさん:2006/11/21(火) 21:57:06
>>536,537
どっちが正しいの?
542535:2006/11/21(火) 21:58:27
× char string[] = {"ABCDE/FGHIJ"};
○ char string[] = "ABCDE/FGHIJ";

何度もすみません。
543デフォルトの名無しさん:2006/11/21(火) 22:00:54
>>542
上のが正しいだろ。常識的に考えて。
544デフォルトの名無しさん:2006/11/21(火) 22:12:15
>>543
char a[] = {'a','b','c','\0'};
char b[] = "abc";
printf("%s\n%s\n", a, b);
545デフォルトの名無しさん:2006/11/21(火) 22:12:56
>>535
その前後のコードも晒してよ。
それだけじゃ特定できん。
546デフォルトの名無しさん:2006/11/21(火) 22:16:02
#include <stdio.h>
#include <string>
int main(void)
{
char s[] = "abcde/fghij";
char *p = strstr(s, "/");
*p = '\0';
printf("%s\n", s);
return 0;
}
547デフォルトの名無しさん:2006/11/21(火) 22:23:24
>>544
お前は何を言っているんだ。
548535:2006/11/21(火) 22:25:08
すみません。
問題は別のところにありました。
strstrで検索したときに、検索文字列のひとつに
"/"がなくNULLを返していたのが原因でした。
ifとかを付けずに *s_point = '\0'; としてしまい、
そこでエラーを起こしていました。

お騒がせして申し訳ありませんでした。
549デフォルトの名無しさん:2006/11/21(火) 22:28:05
>>547
あんたは何を言ってるの?
550デフォルトの名無しさん:2006/11/21(火) 22:28:09
char a[] = {'a','b','c','\0'};
char b[] = {"abc"};
printf("%s\n%s\n", a, b);
551ぴゅあ:2006/11/21(火) 22:32:29
>>544のでいいと思うんだけど…

>>535
>エラーが出て
というのがエラーメッセージが出ているのなら
それを示した方が良かったかもですね
552デフォルトの名無しさん:2006/11/21(火) 22:41:07
>>551
質問者は
"ABCDE/FGHIJ"
これの/以降を削除したいと言っている
コンパイルの段階で分割してどうするね・・・
553デフォルトの名無しさん:2006/11/21(火) 22:48:41
554ぴゅあ:2006/11/21(火) 22:51:42
>>552
あぁ 構文ではなくて"abc"とされていたことを言っていたわけですか
(てか、それなら"ABCDE"とかだろうけど)

>"ABCDE/FGHIJ"
にならうなら
char a[] = {'A','B','C','C','D','E','/','F','G','H','I','J','\0'};
char b[] = "ABCDE/FGHIJ";

後者に括弧は要らんでしょう

char c[][] = {"ABC","DEF"};
とかなら。。。
555ぴゅあ:2006/11/21(火) 22:53:27
あれ?最後のは要素数要ったかな
或いはchar *[]か
556デフォルトの名無しさん:2006/11/21(火) 22:57:30
>>555
いる。
557デフォルトの名無しさん:2006/11/21(火) 22:59:26
キメーから括弧付けろよ。
558デフォルトの名無しさん:2006/11/21(火) 23:01:20
542 :535:2006/11/21(火) 21:58:27
× char string[] = {"ABCDE/FGHIJ"};
○ char string[] = "ABCDE/FGHIJ";

何度もすみません。

543 :デフォルトの名無しさん :2006/11/21(火) 22:00:54
>>542
上のが正しいだろ。常識的に考えて。

544 :デフォルトの名無しさん :2006/11/21(火) 22:12:15
>>543
char a[] = {'a','b','c','\0'};
char b[] = "abc";
printf("%s\n%s\n", a, b);
559ぴゅあ:2006/11/21(火) 23:03:33
>>557
貴様の指図は受けん!
560ぴゅあ:2006/11/21(火) 23:05:55
>>557
"ABC"はchar配列として扱うから
付けない方が一般的だと思いますよ

>キメー
の意味は判らないけど…
561デフォルトの名無しさん:2006/11/21(火) 23:08:52
まあ、カッコは付けたほうが見た目には綺麗だよな。
客観的に考えて。
562ぴゅあ:2006/11/21(火) 23:11:26
>>561
それはお前の主観だろ。
563ぴゅあ:2006/11/21(火) 23:13:17
543 :デフォルトの名無しさん :2006/11/21(火) 22:00:54
>>542
上のが正しいだろ。常識的に考えて。


上のが正しいだろ。常識的に考えて。

上のが正しいだろ。常識的に考えて。
上のが正しいだろ。常識的に考えて。


ttp://www.konaken.com/blog/milco.jpg
564ぴゅあ:2006/11/21(火) 23:13:40
>>561
コンパイラが要素数1の配列として誤解しないか
ちょっと気になりました
(コード読む側も間違えないのかな?)

ついでがあったら確認してみよ。。。
565デフォルトの名無しさん:2006/11/21(火) 23:44:51
質問です。
今授業で char を使い始めました。
さっそくこれを使って2〜16進数を4進数や8進数に直せというPを作れといわれたのですが、
char に自由な数値を入れるにはどうしたらいいのでしょうか?

int なら 
int a;
scanf("%d",&a);
でいけますよね?

先生曰く char と int は1ビットと4ビットでサイズが違うのでscanfは使えないと言っていた気がするし、
実際scanfを使ったPを作ってもコンパイルできません。

どうか回答よろしくお願いします。
566デフォルトの名無しさん:2006/11/21(火) 23:49:07
宿題は宿題スレへ
567デフォルトの名無しさん:2006/11/21(火) 23:51:13
代入を使うといい。
char c, d, e;
c = 1;
d = 100;
e = 25;
568デフォルトの名無しさん:2006/11/21(火) 23:51:49
ものすごく香ばしいような気がするのは気のせいではない
569デフォルトの名無しさん:2006/11/22(水) 00:56:35
>565
言いたいことはいろいろあるが、とりあえず。
Pとは何だ?
その先生とやらが教えてくれたのか、君が勝手に言い出したかは知らないが、
そんな言葉は一般的に通じない。
人に質問するときは相手に分かるように話せ。


570デフォルトの名無しさん:2006/11/22(水) 00:57:38
10進数の1から10を,2進数に変換するプログラムを作っています。
Num2 = 0,i = 1に初期化しています.

for (Num10 = 1; Num10 <= 10; Num10++)
   {
      while (Num10)
      {
         if (Num10 % 2 == 1)
            Num2 += i;
         i *= 10;
         Num10 /= 2;
      }
      printf("%05d", Num2);
   }

これで実行すると,意味不明な(-954437117)という数字が無限ループしてしまいます.
指摘してくださる方いましたらよろしくお願いします.
571デフォルトの名無しさん:2006/11/22(水) 01:03:46
forループにNum10を使っているんだから、
ループ内でNum10を書き換えたらきちんとループできないだろ。
プログラムの是非は問わないことにする。
572デフォルトの名無しさん:2006/11/22(水) 01:14:57
>>570
for(NUM10=1; NUM10<=10; NUM10++) {
 NUM2 = 0;
 i = 1;
 j = NUM10;
while(j) {
  if(j%2) NUM2 += i;
  i *= 10;
  j /= 2;
 }
 printf("%d,%d\n",NUM10, NUM2);
}
こういうことがやりたいの?
573デフォルトの名無しさん:2006/11/22(水) 01:15:34
>>571
while開始前に,Num10の内容を別の変数aに代入し
プログラムを実行させたところ無限ループはなくなりました.
2進数変換は正しく出来ていなかったので考えてみることにします.

ありがとうございました.
574デフォルトの名無しさん:2006/11/22(水) 01:19:32
>>572
iとNum2をfor文の外で初期化していたため,10進数の2以上がおかしい値となっていました。
ありがとうございます.
575ぴゅあ:2006/11/22(水) 01:34:05
>>574
折角、できたということなので
後で改めて考えてみるとかでいいと思いますけど
2進や8進とかにするというのは文字/文字列にすることを
考えてみるのもいいかも
(8進,16進はわざわざロジックを組まなくてもできたりですけど)

若干コードは面倒臭くなるかもですけどね
8/10/16進も敢えてやってみておいてもいいかも
576574:2006/11/22(水) 02:00:46
>>575
文字/文字列とはどういうことでしょうか?

8,16進はprintf内で出来るので敬遠していました.
今は勉強を始めたばかりですので,敬遠せず色々とやってみたいと思います.
577ぴゅあ:2006/11/22(水) 07:48:26
>>576
>文字/文字列とはどういうことでしょうか?
sprintf(メモリ,printf/fprintf(標準出力/ストリーム)で
結果を出そうとするとき、いずれも結局は文字列ですよね

2進(>>572)を例に採ると"j%2"或いは"j&(2-1)"は数値で0か1
これに文字'0'か文字コード0x30を加えれば文字'0'か'1'
これをprintfで書式"%c"を使えば文字列"0"か"1"として表示される

>>572をなるべく変えないでやろうとするなら
まずその文字列分のメモリ域を確保・初期化しておいて
先に求めた'0','1'を1の位(のメモリ位置)から埋めていく
全て揃ったらprintfなりで文字列(書式"%s")として出力

それが形になれば8/10/16進も同様(2/8/10/16進の違いの部分だけ)
符号の有りは別途後でやってみるのがいいと思うけど

printfの中もこういうことやってたりします
(>>572の例だと一度10進数(int)として扱えるように置き換えているから
桁数に限界がでてきたりするでしょ?)
578デフォルトの名無しさん:2006/11/22(水) 07:52:17
C言語で文字コード変換てどうすればいいでしょうか
579ぴゅあ:2006/11/22(水) 07:54:19
あぁ 文字/文字列の扱い,メモリ操作とかまだ難しいと思えるなら
その辺りも勉強するまで置いといて
後でゆっくりやってみるのがいいと思います
580ぴゅあ:2006/11/22(水) 07:56:21
>>578
文字列の中から1文字取り出したcharの値が文字コード
後は文字コード表と見比べれば
581ぴゅあ:2006/11/22(水) 08:41:24
あ… 文字コード"変換"て、そういう意味で聞いたのではないのかな
(>>577繋がりかと思ってしまいました。。。)
582デフォルトの名無しさん:2006/11/22(水) 09:15:22
>>578
えっとファイルから読み込むんですが
そのファイルがEUCであったりSJISであったりUTF-8(だったかな)
であったりするわけです。
そのファイルを処理して別のファイルにまとめたりするのですが
SJISかEUCのどちらかに統一したいんです。

他の言語だともう関数があったりしてそれ利用してたもんで
Cではどうやるのかなぁと
自作するしかないんでしょうか?

583デフォルトの名無しさん:2006/11/22(水) 09:17:17
nkf 通せば?
584ぴゅあ:2006/11/22(水) 09:45:15
>>582
やはりそうでしたか
タイミング良過ぎ…って感じで勘違いしてしまいました

使うまでに至ったことはないですけど
gccでだったりするとlibiconvとかも使える筈と思います
(glibcのiconvだとオリジナルでは未対応になるのかな?)
585デフォルトの名無しさん:2006/11/22(水) 10:56:37
>>538
流れ大きく戻してごめんなさい

>char *string = "ABCDE/FGHIJ";
>これじゃ駄目だから間違えるなよ。
>たとえ上手く動いてるように見えても絶対駄目だからな。

なんでだめなんですか?
char string[]
ぢゃなくて
char *string
をいっつもつかってます

読みにくいからとかですか?
586デフォルトの名無しさん:2006/11/22(水) 11:05:36
文字列をどっかに確保して、そのアドレスをポインタへ取得しているに過ぎないから。
(組み込み系なら、ROMに確保される可能性大)
そのどっかが、データ書き換え可能な領域にあるという保証は出来ない。
配列で確保していれば、書き換え可能な領域に確保されている。
587デフォルトの名無しさん:2006/11/22(水) 11:14:58
ヒープとスタックのどっちかってこと?
588デフォルトの名無しさん:2006/11/22(水) 11:17:23
>>586
文字列を確保するのは"ABCDE/FGHIJ"でそれをあつかうためのポインタをいれるのが=で
ポインタを入れる先がchar[]か、char*のちがいだけではない?ということ?
589デフォルトの名無しさん:2006/11/22(水) 11:21:08
>>588
そういうこと。
確保される領域が、可変領域保証かそうでないかの違いがある。
590ぴゅあ:2006/11/22(水) 11:36:09
>>588
敢えて補足するまでもないと思いますけど

char *string = "ABCDE/FGHIJ";
のように書いている場合には"ABCDE/FGHIJ"の中を書き換えるような操作をしてはならない

ポインタ変数stringに代入されているものが他でchar[11+1]とかで取っている領域のポインタであるとか
mallocで確保された領域とかであれば
その領域内を書き換えることは可

char string[] = "ABCDE/FGHIJ";
は領域を確保してその中に"ABCDE/FGHIJ"を入れているので書き換え可
("ABCDE/FGHIJ"自身を書き換えているのではなくstring[11+1]の領域の中を触るから)

ということです
591デフォルトの名無しさん:2006/11/22(水) 11:50:33
typedef struct {
 B b;
} A;

typedef struct {
 A a;
} B;

のように相互に型を使う構造体はどうやって定義すればいいんでしょうか。
Aを先に書けばBが定義されていないと言われ、逆にすればAが未定義と
怒られるのですが・・・。
592デフォルトの名無しさん:2006/11/22(水) 11:51:12
中身を絶対にいじらない参照用としてのみ使うなら

char *string = "ABCDE/FGHIJ";

の方が良いけどね。(コピー作る手間がかからないから)
でもその場合はベタ書きするとか
マクロ使うことの方が多いけど。
593デフォルトの名無しさん:2006/11/22(水) 11:55:25
>>591
それ流行ってるの?
594586:2006/11/22(水) 12:02:54
>>586-590
そうなのかぁ。ありがとう。
書き換え操作はだめなんですね。勉強になりました。
595デフォルトの名無しさん:2006/11/22(水) 12:09:59
つ[const char *]
596586:2006/11/22(水) 12:18:42
const char *にしても、ぽんたが示す文字列は変更できますよね?
597デフォルトの名無しさん:2006/11/22(水) 12:25:01
ぽんたなら、今昼寝してるよ
598デフォルトの名無しさん:2006/11/22(水) 12:26:17
>>596
(強引なキャストをしない限り)できませんよ。
599デフォルトの名無しさん:2006/11/22(水) 12:29:36
const TCHAR *hoge;
hoge = malloc(256);
wcscpy_s(hoge, 256, TEXT("a"));

hogeが指す先には"a"が入ります。コンパイラは警告してきていますけど。
この警告をはずすのが、強引なキャストという意味でしょうか。
600デフォルトの名無しさん:2006/11/22(水) 12:52:46
>>599
警告が出るってことは無理してるってことだ。
「警告をはずす」って日本語はわからん。
601ぴゅあ:2006/11/22(水) 13:23:14
>>599
その警告自体は別の意味のものではないですか?
「wcscpy_s関数の第1引数はconstが付いてないものとして宣言されているのに渡されたものにはconstが付いている」とか

const char *hoge = "ABC";
hoge[1] = "1";
とかで判るだろうと思います

>強引なキャスト
((char *)hoge)[1] = '1';
に変えてみることで判るだろうと思います
("だろう"とはコンパイラによっては微妙かもだから)
602デフォルトの名無しさん:2006/11/22(水) 13:35:14
なるほど、わかりました。
constだと = できないですが、別の方法では書き変えできるということですね。ありがとうございます。
603ぴゅあ:2006/11/22(水) 13:35:23
>>599
あと
>hogeが指す先には"a"が入ります。
は実行して(入った)ということだろうと思いますけど
constは飽くまでコンパイラにコンパイル時に判断させるためにコードから教えているだけのものなので
エラーなくコンパイルできれば実行はできてしまいます

>>590
>char *string = "ABCDE/FGHIJ";
>のように書いている場合には
とかは(それは予期せぬ結果が起こる原因になり得るので)そういうことはやってはいけないということで
constはそれをコードに示してコンパイラを補助するために追加されたものです

なので
const char hoge[] = "ABC";
なんてした場合も、同様に操作が禁止されます(コンパイルのレベルで)
604デフォルトの名無しさん:2006/11/22(水) 13:50:00
共用体ってどんなときにつかうんじゃこの野郎
605デフォルトの名無しさん:2006/11/22(水) 13:54:32
配列(例えばdim[10]など)で
この10部分、添え字のところを外部ファイルのテキストファイルなどから読み込ませることはできないのでしょうか?
#define などを利用すればできるのですかね?
606デフォルトの名無しさん:2006/11/22(水) 13:58:47
できるできる。考えて
607デフォルトの名無しさん:2006/11/22(水) 14:47:46
ポインタ
608574:2006/11/22(水) 15:59:14
>>577 >>579
レス遅くなりました.
このレスを保存しておいて,そのレベルまで達したと思えたら挑戦しようと思います.
ありがとうございました.
609デフォルトの名無しさん:2006/11/22(水) 16:46:58
>>582
UTF-8もあるんだったら、UTF-16/32とかUCS4とかUnicode使ったコードを使うべきではないか?
610デフォルトの名無しさん:2006/11/22(水) 18:01:03
>>605
配列の要素数が実行時に決まる様な場合は、これは出来ないよ。
int n;
scanf("%d", &n);
int array[n];

この場合はmalloc()を使って動的に領域を確保してやる必要があるよ。
int n;
scanf("%d", &n);
int *array = (int*)malloc(sizeof(int) * n);

それとmalloc()で確保した領域は、必ずfree()で開放する必要があるから気を付けて。
上の例だとこんな感じで。
free(array);
611デフォルトの名無しさん:2006/11/22(水) 19:00:27
>配列の要素数が実行時に決まる様な場合は、これは出来ないよ。
手元の環境で試したらできましたがやらない方がいいのでしょうか。
612デフォルトの名無しさん:2006/11/22(水) 19:03:48
C99からはできるようになっただろ。
613デフォルトの名無しさん:2006/11/22(水) 19:06:14
実行中に要素数が変わらないのなら問題ない
614デフォルトの名無しさん:2006/11/22(水) 19:25:14
>>612
そうだったのか。
古いコンパイラしか使ってなかったので知らんかったよ。
C言語も変わったなぁ。
615デフォルトの名無しさん:2006/11/22(水) 20:38:07
大丈夫、今もみんなmallocなんかを使っている。
C99対応コンパイラなんて俺はGCCしか知らない。
616デフォルトの名無しさん:2006/11/22(水) 20:38:18
ANSI-C以外は認めない。
617デフォルトの名無しさん:2006/11/22(水) 20:59:14
ANSI-Cも認めない。
618デフォルトの名無しさん:2006/11/22(水) 21:01:17
だが、ISO C90/C99は認める。
619デフォルトの名無しさん:2006/11/22(水) 21:40:01
「ANSI-C」って。
620デフォルトの名無しさん:2006/11/22(水) 21:56:56
JIS X 3010:2003 なら認める。
621デフォルトの名無しさん:2006/11/22(水) 22:20:57
ワードパッドの印刷で、印刷のページ指定を「0-0」にすると挙動が変。
622デフォルトの名無しさん:2006/11/22(水) 22:54:53
しらんがな
623デフォルトの名無しさん:2006/11/22(水) 23:01:30
C99でuint32_t とuint_fast32_t等
の両方がある意味がわかりません

計算が速い32ビットの整数型があるなら
uint32_tに割り当てれば済む話のような気もするんですが・・・

624デフォルトの名無しさん:2006/11/22(水) 23:07:33
>>623
32bitより64bitが速い環境なら、uint_fast32_tは64bitになるんじゃね?
625デフォルトの名無しさん:2006/11/22(水) 23:08:01
int_fast32_t 最低 32 ビットの最も効率的な符合付き整数
       ~~~~~
626デフォルトの名無しさん:2006/11/23(木) 01:23:16
cでc++のstringみたいに可変長文字列を簡単にあつかう方法ありませんか
string.appendみたいなかんじで文字をくっつけるのを簡単にやりたいです
strcatとかは元のバッファサイズの確保が面倒とおもっています
627デフォルトの名無しさん:2006/11/23(木) 01:30:55
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

#define MTX 3
#define CMTX(x) (x)*(x)

//ボード
int board[MTX][MTX];

void initBoard(void);

main(){
srand(time(NULL));
printf("【%d ゲーム】\n",CMTX(MTX));

initBoard();
return 0;
}

628デフォルトの名無しさん:2006/11/23(木) 01:31:56
//ボードの初期化を行う関数
void initBoard(void){
int i,j;
int r;//ランダムな値
int useDigit[100];//既に数値が使われているか否かを記録する配列

for(j = 1; j <= MTX; j++){//縦方向繰り返し
for(i = 1; i <= MTX; i++){//横方向の繰り返し
//最後のマスなら終了
if((j == MTX) && (i == MTX)){break;}
do{
r = rand()%(CMTX[MTX]-1)+1;
}
while(useDigit[r-1] == 1);
board[j-1][i-1] = r;//ボードに代入する
useDigit[r-1] = 1;//使われた数値をチェックする
printf("%02",r);
}
printf("\n");
}
board[MTX-1][MTX-1] = 0;//最後のマスに0を代入する
}

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
10-1.c:
エラー E2451 10-1.c 32: 未定義のシンボル CMTX(関数 initBoard )
*** 1 errors in Compile ***

この、32行目のエラーがどうしても解決しないので
ご指摘お願いします。
629デフォルトの名無しさん:2006/11/23(木) 01:34:31
>>626
strxxx関数の類が面倒というなら、
文字列と長さを格納した構造体と、それを操作する関数群を自作して
stringクラス相当のことをC言語の仕様の中で実装するくらいしかないんじゃない?
探せば既に誰かが作っているかも。標準には存在しない。
630デフォルトの名無しさん:2006/11/23(木) 01:36:16
>>628
CMTXはマクロ関数として定義している。
CMTX[MTX]というのは使い方が間違っている。
631デフォルトの名無しさん:2006/11/23(木) 01:38:13
>>630
ご返答、ありがとうございます。

本ではこの様になっていますが・・・
では、どのように直せば宜しいのでしょうか?
ご指摘お願いします。
632デフォルトの名無しさん:2006/11/23(木) 01:39:47
>>631
CMTX(MTX)にするといいよ!
633デフォルトの名無しさん:2006/11/23(木) 01:46:11
>>632
ありがとうございました!
できましたが、一つ問題が発生しました

実行結果が
C:\bbb>10-1
【9 ゲーム】
070801
020403
0605
なってしまいます

C:\bbb>10-1
【9 ゲーム】
07 08 01
02 04 03
06 05

のように一行あけたいのですが・・・
何処をどうかえれば、こうなるでしょうか?
634デフォルトの名無しさん:2006/11/23(木) 01:49:47
>>633
たぶん、このへんだよ!
useDigit[r-1] = 1;//使われた数値をチェックする
printf("%02 ",r);←/*ここに空白を入れる*/
635デフォルトの名無しさん:2006/11/23(木) 01:55:31
>>634
できました!!!
ありがとうございました
636デフォルトの名無しさん:2006/11/23(木) 02:24:09
C言語でjpgとか表示できる関数てどのくらいあるかわかるサイトないでしょうか?
637デフォルトの名無しさん:2006/11/23(木) 03:21:57
難しい注文だなw
google 辺りで上手くやればなんとかなるか?
638デフォルトの名無しさん:2006/11/23(木) 03:23:13
コラムを行とか言うヤツ初めて見た。
639デフォルトの名無しさん:2006/11/23(木) 03:30:34
GLFCのWindows版についてわかる方いらっしゃいませんか?
手に入れたいんですが、検索しても何も引っかからないもんで
640627-628:2006/11/23(木) 05:17:27
度々、質問ですみません。

ここの所で二つほど疑問があるのでご助言戴けたら、幸いです。
先ず一つ目は、>>627->>628 特に>>628のソースで

//最後のマスなら終了
if((j == MTX) && (i == MTX)){break;}
do{
r = rand()%(CMTX[MTX]-1)+1;
}
while(useDigit[r-1] == 1);
board[j-1][i-1] = r;//ボードに代入する
useDigit[r-1] = 1;//使われた数値をチェックする

-1や+1が出てきて、今一よくわかりません
参考書に依れば、添え字で云々と難しく解説が
書かれています。
ですので簡単に解りやすく助言して戴きたいのと

もう一つは、
>>if((j == MTX) && (i == MTX)){break;}
で、MTXとは3でしょうか、もしくは9でしょうか?

ご返答、宜しくお願いします。
641627-628:2006/11/23(木) 05:26:00
自分なりに混乱している部分は
マスが1〜9あって1〜8まで数値をマスの中に
振り当てるから、ー1になるのと
添え字でー1になる事です。
642627-628:2006/11/23(木) 05:32:42
添え字の所では
配列の添え字は0から始まるので、rand関数で出た数値が
7の時は7−1でuseDigit[6]の位置に1を代入しておきます。

参考書依り抜粋

これが特にちんぷんかんぷんです。
643デフォルトの名無しさん:2006/11/23(木) 06:56:30
>642
10個の箱があります。
それぞれに番号をつけることにしました。
0からつけはじめて9まで付けたら番号の付いてない箱がなくなりました。
1個目の箱の番号は0です。
10個目の箱の番号は9です。
次に、箱に順番に1から10までの数字を入れることにしました。
1個目の箱には1が入りました。
10個目の箱には10が入りました。

さて問題です。
7が入ってる箱の番号はいくつでしょう?
644デフォルトの名無しさん:2006/11/23(木) 11:04:12
[0] = 1
[1] = 2
[2] = 3
[3] = 4
[4] = 5
[5] = 6
[6] = 7
[7] = 8
[8] = 9
[9] = 10
[10]= 11
645ぴゅあ:2006/11/23(木) 13:50:35
>>640
>for(j = 1; j <= MTX; j++){//縦方向繰り返し
>for(i = 1; i <= MTX; i++){//横方向の繰り返し
でのi,jが持つ値と
>board[j-1][i-1] = r;//ボードに代入する
での配列の添え字との関係

>r = rand()%(CMTX[MTX]-1)+1;
でrand()が返すだろう最小値,rが取る値と
>useDigit[r-1] = 1;//使われた数値をチェックする
での配列の添え字との関係

・扱う値としては1〜としたいけど …i,j,r等(r = rand() ...ではそのために"+1")
・配列の添え字は0〜だから"-1"
と読めるんではないでしょうか


>>>if((j == MTX) && (i == MTX)){break;}
>で、MTXとは3でしょうか、もしくは9でしょうか?
どのようにして3と思ってみたのか、もしくは9と思ってみたんでしょうか
思った"わけ"がある筈
(3か9か(或いは全く違うか)の答え(数字)を知るだけでなく、どう解釈した/或いは間違いに至った経緯は後々のためにも把握しておいた方がいいかも)

>#define MTX 3
ではないですか?
646ぴゅあ:2006/11/23(木) 13:52:02
>>642
>配列の添え字は0から始まるので、rand関数で出た数値が
>7の時は7−1でuseDigit[6]の位置に1を代入しておきます。

・配列の添え字は0から始まる
・rand関数で出た数値が → それらから求めた変数rに入れた値(1から始まる)
・7の時は7−1で → "1から始まる値"を"0から始まる値"に
・ということで、useDigit[6]の位置

>>645が解れば、解説不要だろうと思いますけど
647デフォルトの名無しさん:2006/11/23(木) 14:17:56
cで配列のサイズをとるのはないのでしょうか。
javaでいうところの配列変数.length、vbでいうところのubound(配列変数)です。
mainとかで配列の個数ももらっているから無いのでは?
648デフォルトの名無しさん:2006/11/23(木) 14:20:55
>>647
配列ならsizeof
配列の要素へのポインタなら無理
649デフォルトの名無しさん:2006/11/23(木) 14:32:59
>>648
ただsizeofだとバイト単位になってしまうので、
配列の個数を求めるには型のサイズで割らないといけませんね。
650デフォルトの名無しさん:2006/11/23(木) 14:39:22
マジ糞言語だなこれwww
651デフォルトの名無しさん:2006/11/23(木) 14:44:00
>>650
インテリはみんな、アナルとスカトロ好きだろ?
652ぴゅあ:2006/11/23(木) 14:46:25
>>647
>javaでいうところの配列変数.length
はちょっと毛色が違うところ…と思うけど

>vbでいうところのubound(配列変数)
は元々BASICが添え字の0始まり/1始まりを選択できる(何時からできるようになったのかはもう忘れたけど)
というところからlbound/uboundが生まれたりしたんだろうと思うけど

Cでは定数にしたり>>647の言ってるsizeofとか利用しつつ自分で管理
>配列の要素へのポインタなら無理
も自前で対応
>配列の個数を求めるには型のサイズで割らないといけませんね。
もマクロで対応してみたりとかされてきています

>mainとかで配列の個数ももらっているから無いのでは?
は、"配列の個数ももらっている"のではなくて
「要素数を渡さないと判らない(定数(固定値)にならない)から
(mainを呼び出す側が)渡している」んです
と理解できればいいと思います
653デフォルトの名無しさん:2006/11/23(木) 14:47:43
length なんかの管理領域すら惜しい頃からC言語はあるんだよ
654647:2006/11/23(木) 14:48:49
>>648-649
ご回答ありがとうございます。
そうか、配列でとってるからsizeof(配列変数)/sizeof(型名)で逝けるんですね
よーく考えてみたら、やりたいことはmallocとかでとった領域のサイズをしりたいことでした。
ポインタだからムリなんですね。mallocとかってサイズ調整してるみたいだし。

関数とかにmallocで領域取った部分にunsigned charの配列をいれて、
関数内で処理しようとおもったら、関数呼ぶ側からサイズも渡してやらないといけないんですね。
文字列でなくてファイルからとったバイナリ値を操作する関数をつくってます。
lengthとかuboundとかがありがたく思えてきました。
関数にポインタ渡すときはサイズも渡すようにしようと思います。ありがとうございました。
655647:2006/11/23(木) 14:51:33
×やりたいことはmallocとかでとった領域のサイズをしりたいことでした。
○やりたいことはmallocとかでとった領域に入ってるどこかで入れた内容のサイズをしりたいことでした。
656ぴゅあ:2006/11/23(木) 15:03:28
>>654
>mallocとかってサイズ調整してるみたいだし。
これはコード上より内部的な話なので、考えなくていいと思います
(>mallocとかでとった領域のサイズをしりたいことでした。
mallocの際に必ずサイズを渡している筈なので、それを渡せていればいい…ですね)
657デフォルトの名無しさん:2006/11/23(木) 15:29:16
http://ranobe.com/up/src/up152115.lzh

ファイルからの読み出しで最大値、最小値を表示するプログラムなんですが、
数字以外が含まれるとループし続けてしまいます。
エラーを返すようにしたいのですが、どうすればいいでしょうか?
658デフォルトの名無しさん:2006/11/23(木) 15:30:13
>>657
scanf を使わず getcharを使う
659デフォルトの名無しさん:2006/11/23(木) 15:34:40
>>649 型のサイズもsizeofで書くと失敗しないよ
660647:2006/11/23(木) 15:42:34
>>659
配列のサイズのとりかた
unsigned char hoge[255];
printf("length = %d\n", sizeof(hoge) / sizeof(unsigned char);
ですね。ありがとうございます。
661ぴゅあ:2006/11/23(木) 15:49:55
マクロにすると便利かと思ったりするけど
スルーっぽさを漂わせてるみたいだから別にいっか
662ぴゅあ:2006/11/23(木) 16:36:32
My name is pure.
However, it is not a pure mind.
It is a question though is sudden.
Do you think that I am a person in question?
Or, the pretender?
Do you understand?
663デフォルトの名無しさん:2006/11/23(木) 16:41:46
>>660
sizeof(hoge) / sizeof(hoge[0])

hoge が構造体でもどんな型でもつかえる。
664デフォルトの名無しさん:2006/11/23(木) 16:44:04
>>662
my.name = pure;
it = my.
however(it!=pure.mind);
assert(it & (QUESTION | SUDDEN));
you = I == person[QUESTION] ? 1: I==PRETENDER ? 2: ~UNDERSTAND;
665623:2006/11/23(木) 17:51:02
>>624
>>625
今さらですが、ありがとうございました
(u)int32_tはピッタリ32bitの事かと勘違いしてました
666623:2006/11/23(木) 17:52:46
訂正
(u)int_fast32_tはピッタリ32bitの事かと勘違いしてました
667デフォルトの名無しさん:2006/11/23(木) 18:04:50
>>657
数値の取得にfscanf()を使っているならfgets()+sscanf()にして戻り値をチェックしたまえ。
sscanf()の代わりに、strtol()/strtod()で変換終了点をチェックしてもいいけど。
668デフォルトの名無しさん:2006/11/23(木) 19:46:58
>>657
fscanf()のリターン値のチェックがEOFしかやってないじゃん。
1以外だったらループを抜けるって処理も入ってないと。
669デフォルトの名無しさん:2006/11/23(木) 20:34:20
2つ質問です。

C++では定数はconstで定義することが普通のようですが、Cではどうなんでしょうか?
色々なサイトを見てみると、#defineでやってるのが多いようですが。
なぜconstで定義しないのでしょうか?

もう一つ、ヘッダファイルにconstで定数を定義しようと考えたのですが、どちらが
一般的でしょうが?
1.ヘッダファイルにstatic constで定義する。
2.ヘッダファイルに対応する.cファイルに実体を定義し、ヘッダファイルでexternする。
670デフォルトの名無しさん:2006/11/23(木) 21:16:38
>>669
Cではconstで定義したものを、定数式が要求されるところ
(配列宣言時の要素数やcaseラベルなど)で使うことができない。
そんなCを見て、C++ではconstで定数を定義できるようになった。

だからCでヘッダにconstな変数宣言をおくのは、そもそも一般的ではない。
C++では、staticなしでconst使うが(少なくとも整数型ではそれで問題ないようになっている)。
671デフォルトの名無しさん:2006/11/23(木) 21:25:30
整数型以外だとなにか問題あるケースがあるの?
672デフォルトの名無しさん:2006/11/23(木) 21:50:06
クラスオブジェクトだとコンストラクタ・デストラクタがあるから、
どうなるか俺は規格書を見ないとわからない。
673デフォルトの名無しさん:2006/11/23(木) 22:10:48
ああ,クラスか.
文字列とか,実数でなにかあるのかと思った.
674669:2006/11/23(木) 23:26:18
>>670
Cではconst変数と定数は区別しなくちゃいけないんですね。
で、定数と同じ使い勝手を保ちつつ定数に名前を付けるとしたら
#defineしかない、ということですか。
良く分かりました。有難うございました。
675デフォルトの名無しさん:2006/11/24(金) 00:17:32
C言語で違うディレクトリのファイルの内容を書き換えたいんだけど、
どうやってやるんでしょう。
676デフォルトの名無しさん:2006/11/24(金) 00:19:58
>>676
カレントディレクトリのファイルと要領は同じ。開くファイル名を相対パス名にすればいいだけ。
677675:2006/11/24(金) 00:32:27
こんな感じにやってみたけど駄目だ。
レスサンクス
if((sfp = fopen(..\fff.txt,"r"))==NULL)
puts("コピー元、オープンできませんでした。");
678デフォルトの名無しさん:2006/11/24(金) 00:33:41
\ → \\
679675:2006/11/24(金) 00:34:43
一つ上のカレントディレクトリのファイルを開こうとしてるんだけど。
コンパイルエラーでございます。
680デフォルトの名無しさん:2006/11/24(金) 00:35:03
>>677
..\fff.txt
これ”..\\fff.txt” じゃなきゃダメなんジャマイカ?
681デフォルトの名無しさん:2006/11/24(金) 00:35:20
if((sfp = fopen(..\fff.txt,"r"))==NULL)

if((sfp = fopen("../fff.txt","r"))==NULL)
682675:2006/11/24(金) 00:37:26
出来たwww
すげーありがと
またよろしくーーーwww
683デフォルトの名無しさん:2006/11/24(金) 02:05:08
while(1)の(1)は、どんな意味があるのでしょうか?
684デフォルトの名無しさん:2006/11/24(金) 02:06:15
真偽値の真
685デフォルトの名無しさん:2006/11/24(金) 02:12:34
サンクスだす
686デフォルトの名無しさん:2006/11/24(金) 05:51:10
>>674
定数ならenum 使うべき。
687ぴゅあ:2006/11/24(金) 07:52:52
>>686
適材適所でしょ

>>679
ちっちゃいツッコミですけど
>一つ上のカレントディレクトリ
カレントディレクトリの一つ上の(カレントとは言わない)ディレクトリ
と呼ぶです

>>683
Cでは0(偽)ではない値を真(0以外)と捉えてやってください
whileと組み合わせてwhile(1)は"無限にループさせたい"
688デフォルトの名無しさん:2006/11/24(金) 11:09:26
どっちかと言えば、for (;;) 推奨。
689デフォルトの名無しさん:2006/11/24(金) 11:16:23
それキメェからやめろ。
690デフォルトの名無しさん:2006/11/24(金) 11:26:54
んじゃ、
#define ever (;;)
for ever
とか、
#define _
for (;_;)
とか。
691デフォルトの名無しさん:2006/11/24(金) 12:43:40
#include<math.h>
#include<stdio.h>
#include<string.h>
void wait(int tm)
{int i,j;
for (i = 1;i < tm; i++)
for(j = 1;j < tm; j++){
double x = sin(i) * cos(j);}}
int main(void)
{
int cnt = 0;
char mes[] = "あいうえ";
int len = strlen(mes);
while(1){
int i;
putchar('\r');
for (i = 0;i<strlen(mes);i+=2){
if(cnt + i<len){
putchar(mes[cnt + i]);
putchar(mes[cnt + i+1]);}else{
putchar(mes[(cnt + i) % 8]);
putchar(mes[(cnt + i+1)%8]);}}
wait(2000);
if(cnt < len - 1)
cnt+=2;
else
cnt = 0;
}return(0);}
これを右に流れるようにしたい
692デフォルトの名無しさん:2006/11/24(金) 12:45:30
すれば?
693デフォルトの名無しさん:2006/11/24(金) 12:46:37
while ( "loop forever" )
694デフォルトの名無しさん:2006/11/24(金) 13:05:42
ファイルの一部分の変更の仕方が分かりません。
例えば set の次の0を1に変える方法です。
助言プリーズ
while(*fp[pt] != '\0') && (temp[pp] != '\0')){
if(*fp[pt]== temp[pp]){
pt++;
pp++;
}
else{
pt=pt-pp+1;
pp=0;
}
}
if(temp[pp]=='\0'){
while(*fp[pt] != "A-Z" || *fp[pt] != "a-z" ){
switch(*fp[pt]){
case ' ': pt++; break;
case '0': *fp[pt]='1';
puts("0を1に書き換えました");
break;
case '1': puts("すでに1です。");
break;

}
}
puts("処理は無事、終了しています。");

長くてすみません。
695デフォルトの名無しさん:2006/11/24(金) 13:08:28
while(*fp[pt] != "A-Z" || *fp[pt] != "a-z" ){
この条件が真になるの?
696695:2006/11/24(金) 13:23:50
よく見たら常に真の無限ループだった orz

この条件が偽になるの?だな
697デフォルトの名無しさん:2006/11/24(金) 13:27:50
>>694
ちょっと書き替える程度のことでそんなキメーことすんなよ。
698デフォルトの名無しさん:2006/11/24(金) 13:28:41
>>694
man sed
699デフォルトの名無しさん:2006/11/24(金) 13:28:58
>>694
>while(*fp[pt] != "A-Z" || *fp[pt] != "a-z" ){
ローマ字以外の時だけ繰り返すって意味なら
while !((*fp[pt] >= 'A' && *fp[pt] <='Z') || (*fp[pt] >= 'a' && *fp[pt] <= 'z') ){
こんな感じになる
700694:2006/11/24(金) 13:31:04
setの次の数字を0から1に変えたくてtemp[]="set"としています。
*fpはFILE型のポインタでchar型でなく、int型としてしか取り扱えない
ようなエラー内容。fopen関数でfpに変更したいファイルを'r+'で
オープンしています。
695の内容はsetの次の数字以外の文字が来たときにはプログラムが終了
するような意図を持って記入しました。英文字が来たら終了の意図です。
自信ないんですが。
701デフォルトの名無しさん:2006/11/24(金) 13:32:24
#include<ctype.h>
while(!isalpha(*fp[pt]))
702デフォルトの名無しさん:2006/11/24(金) 13:33:09
ファイル操作が FILE* fp = fopen() の後
直接 *fp or fp[] で操作する と想像したお前に完敗
703694:2006/11/24(金) 13:35:35
なるほどーー,全然違いましたねw>>699
ぐぐってみます>>698
ど素人ですw>>697
704デフォルトの名無しさん:2006/11/24(金) 13:35:57
それってコンパイルできないんじゃ
705デフォルトの名無しさん:2006/11/24(金) 13:46:02
>>704
それでもコンパイルは通るだろ。
char **fpとかじゃねぇの?
706694:2006/11/24(金) 16:56:30
解決しました。
レスくれた人、有難う。
勘だらけで内容くちゃぐちゃだけど、
結果オーライ。
707デフォルトの名無しさん:2006/11/24(金) 17:19:43
fork execlで蹴った子プロセスが
終了したか監視したいんだけども

どうやるんざますの?
708デフォルトの名無しさん:2006/11/24(金) 17:34:33
709デフォルトの名無しさん:2006/11/24(金) 17:34:55
710ぴゅあ:2006/11/25(土) 00:29:31
>>688-690
あちしの場合はwhile (1)よりfor ( ; ; )を好んで使いますね
賢いコンパイラならwhile (1)をfor ( ; ; )として解釈してくれそうでもあるけど
なんか「キメェ」って感じなので。。。(使い方合ってます?)
(while(1)は、毎回「1だよね」って確認してくれてそうな…)

#define forever() for ( ; ; )
とかすることもあったりするけど(色んなコードを見てるとそんな風にしているのも多くあったりする?し)
サラッと書いて済ますときは(特に)for ( ; ; )だったりですけど

実際while(1)を使うかfor ( ; ; )を使うかはそのときの気分?かな
圧倒的にfor ( ; ; )の方が多いのは間違いないけど

仕様もない話ですが。。。
711デフォルトの名無しさん:2006/11/25(土) 00:37:14
てめえの好みなんか聞いてねえ。
while(1)を最適化しないコンパイラなんて糞コンパイラだ。
for(;;)はANSIが無限ループのために規格化した書き方だ。
712デフォルトの名無しさん:2006/11/25(土) 00:41:07
for (;;) ; /* ひげのおじさん */
for ( ; ; ) ; /* 悲しそう */
while (1) ; /* ょぅι゛ょの割れ目?卑猥です */
713デフォルトの名無しさん:2006/11/25(土) 08:02:35
マジックナンバーを含まないっつーポリシーに従うなら for(;;) の方がベターだとは思うが、
while(1) はもう while(1) というパターンとして認識されてるから、正直どっちでもいいと思うぜ。
714デフォルトの名無しさん:2006/11/25(土) 09:15:28
for (;;)こそパターンとして認識されているだろと俺は思っている。
715デフォルトの名無しさん:2006/11/25(土) 09:51:26
質問なんだけど、bccコンパイラでコンパイルした時に出来るexeファイル
以外のファイルってなんなの?
.makと.objと.tdsなんだけど。
教えてくださらんか。
716デフォルトの名無しさん:2006/11/25(土) 09:53:30
もう一点質問です。
C言語で他の実行ファイルを実行させたい場合、
どういう風に記述すればいいのだろうか。
717デフォルトの名無しさん:2006/11/25(土) 09:56:35
漏れは
while (1==1)
だな。
718デフォルトの名無しさん:2006/11/25(土) 11:08:35
>>715
.makはコンパイル時には作られないだろう
BCCDeveloperかなんか使ってるんじゃねーの?
ちなみに.makはメイクファイルといってコンパイルやリンク時の手順を記述したもの
自分で書いたりIDEが吐いてくれたメイクファイルを元にコンパイル等を実行する。

tdsは何か忘れた

.objは純粋にコンパイルしたときに作られるオブジェクトファイル

本来EXEを生成するには
・hoge.cをコンパイルしてhoge.objを生成
・hoge.objと必要なライブラリ等をリンクしてEXE生成
という大まかに分けて2つの手順を踏む必要があるが、
bccは-cオプションをつけない限り、リンクも自動的にやってくれるようになっている

間違ってるかもしれないけど、大体こんな感じ
719715:2006/11/25(土) 11:32:22
>>718
回答どうもありがとう!
720ぴゅあ:2006/11/25(土) 13:21:20
>>716
system関数周りとかexec系の関数辺りとかを見てみれば

>>714
当然パターンとしてコンパイラは認識する筈だけど
中身(式)なしのforがどうなるかだろうけど

アセンブラをずっとやっているときにCが出てきて
アセンブラからCを中から見て理解したけど(特にポインタとか)
中身なしのforは中身なしのコードで出てきてた記憶はあるけど

いずれにしても余程変なことでもしてなきゃ
好みで選んでいいだろうと思うけど

>>711
ANSI Cが定められたのを知っても特に興味も沸かなくて
気にしてこなかったけど
あちしがずっと好んでだけで使ってきてたことを
適切であっただろうとわざわざ立証してくれてありがとう
721デフォルトの名無しさん:2006/11/25(土) 13:27:59
あちこちのスレにしゃしゃり出てくる人がウザイですー
722デフォルトの名無しさん:2006/11/25(土) 13:43:27
>>721
?
723デフォルトの名無しさん:2006/11/25(土) 13:52:57
C言語なら俺に聞け(入門篇) Part 4
http://pc8.2ch.net/test/read.cgi/tech/1162999861/l50

Cなら俺に聞け(応用編)
http://pc8.2ch.net/test/read.cgi/tech/1163246166/l50

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/l50

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

渡辺篤史のGoogle Code Search探訪
http://pc8.2ch.net/test/read.cgi/tech/1160188096/l50


どこに質問していいのか分かりません
ビットシフトについてなんですが・・・
724デフォルトの名無しさん:2006/11/25(土) 14:10:21
ここでおk?
725デフォルトの名無しさん:2006/11/25(土) 14:34:11
>>721
夏休みはまだ早いぞ
726デフォルトの名無しさん:2006/11/25(土) 15:22:47
おkおk
727デフォルトの名無しさん:2006/11/25(土) 19:40:35
ファイルの中身を配列に入れて配列を表示させると順番が
ぐしゃぐしゃです。
助言くれーー。
728デフォルトの名無しさん:2006/11/25(土) 19:42:03
ソース見せないと
729デフォルトの名無しさん:2006/11/25(土) 19:42:32
#include "sengen.h"


#define NUM 500


int main(){

FILE *fp;
int ch;
int chx[NUM]={0};
int i=0;
730デフォルトの名無しさん:2006/11/25(土) 19:43:09
if((fp=fopen("C:\\tools\\ten.bat","r"))==NULL)
puts("読み取りオープン失敗");
else{

puts("元の内容");
while((ch=fgetc(fp)) != EOF){
chx[i]=ch;
putchar(chx[i]);
i++;
}
}
putchar('\n');
731デフォルトの名無しさん:2006/11/25(土) 19:44:09

puts("配列chxの内容");

for(i=0;i<NUM;i++)
putchar(chx[i]);


getchar();
return 0;
}

732727:2006/11/25(土) 19:45:04
さらすのに手間取りました

733727:2006/11/25(土) 19:47:51
NUM=1000にしてもだめです。
734727:2006/11/25(土) 19:58:04
NUM=2000にしたらできました。でもファイル読み込みのときって
設定配列数オーバーしても関係ないんですね。
>>720どうもありがとう、ぐぐってみます!
735デフォルトの名無しさん:2006/11/25(土) 20:06:58
>>727
iがNUM以上になるのを何故放置するのか?
736デフォルトの名無しさん:2006/11/25(土) 20:08:50
>>727
#include <stdio.h>
#define SIZE 1000
main(){FILE *fp; int i, c, chx[SIZE];
if((fp=fopen("C:\\tools\\ten.bat","r")) ==NULL) puts("どんまい");
else {puts("もとの");
for (i=0; i<SIZE && (c=fgetc(fp))!=EOF; i++) putchar(chx[i]=c);
chx[i]='\0';}

getchar(); puts("\nはいれつのなか");

for (i=0; i<SIZE && chx[i]; i++) putchar(chx[i]);
getchar();return 0;}
737デフォルトの名無しさん:2006/11/25(土) 20:25:04
fclose はしないのかにゃ
738デフォルトの名無しさん:2006/11/25(土) 20:26:48
fclose()は省略しても、まあ、問題ないな。
739デフォルトの名無しさん:2006/11/25(土) 20:28:00
>>736
#define SIZE 1000
for (i=0; i<SIZE
chx[i]='\0';
’SIZE’以上のファイルだと i は1000になって chx のサイズオーバー
740デフォルトの名無しさん:2006/11/25(土) 20:59:53
>>739
>>737
ゴメンなさい。反省してます。
741716:2006/11/25(土) 22:12:56
ファイル実行させるソースを書きたいんだけど
こんな感じにやって駄目でした。
#include <stdio.h>
#include <process.h>
int main(){
execv("C:\\tools\\ten.bat",NULL);
getchar();
return 0;
}
ヒントいただけないでしょうか
742デフォルトの名無しさん:2006/11/25(土) 22:30:57
system() 使っとけ。
743716:2006/11/25(土) 22:57:04
#include <stdio.h>
#include <process.h>
int main(){
system("C:\\tools\\ten.bat");
getchar();
return 0;
}
あっさりできたw
どうもありがとうございます。
744デフォルトの名無しさん:2006/11/26(日) 01:26:50
バイナリファイルへの読み書きについて、構造体単位で扱うことは可能でしょうか?
1個の構造体では出来たのですが、一つのファイルに二つ以上入れたとき、一つ目のデータが破棄されてしまうのです。

具体的には
1、no番目の構造体データをfseek(fp,no*sizeof(str),SEEK_SET)後fwrite(&str_a,sizeof(str),1,fp)で入力。
2、別のnoについて同様に入力。
3、確認の為、no番目のデータををfseek(fp,no*sizeof(str),SEEK_SET)後fread(&str_b,sizeof(str),1,fp)でstr_aにコピー。
4、printfでstr_bの中身を見ると、0になっている。
コンパイルエラーは起きないし、もちろんメモリ保護違反等も起きてないのですが…
745デフォルトの名無しさん:2006/11/26(日) 01:28:58
>>744
ソースコードを晒して
746デフォルトの名無しさん:2006/11/26(日) 01:30:59
>>744
んでstr_bはどこで読み込んでんの?
747デフォルトの名無しさん:2006/11/26(日) 01:48:46
int main(void)
{
int no,sel;
str_a alpha;
FILE *fp;
printf("plz input no\n");
scanf("%d",&no);
printf("plz input RorW(W=1,R=2)\n");
scanf("%d",&sel);
switch (sel){
case 1:
fp=fopen("data.bin","wb");
fseek(fp,sizeof(str_a)*no,SEEK_SET);
printf("plz input a,b,c\n");
scanf("%d%d%d",&alpha.a,&alpha.b,&alpha.c);
fwrite(&alpha,sizeof(str_a),1,fp);
break;
case 2:
default:
fp=fopen("data.bin","rb");
fseek(fp,sizeof(str_a)*no,SEEK_SET);
fread(&alpha,sizeof(str_a),1,fp);
break;
}
printf("%d\t%d\t%d\n",alpha.a,alpha.b,alpha.c);
fclose(fp);
return 0;
}

上で書いたまんまのソースはいじりまくってしまったので申し訳ないですけど、↑で。
もちろん、同じ状況である事は確認しました。
748デフォルトの名無しさん:2006/11/26(日) 01:54:52
と、肝心の構造体を書き忘れました。

typedef struct
{
int a,b,c;
} str_a;

です。
749デフォルトの名無しさん:2006/11/26(日) 01:54:54
>>747
noはゼロじゃなくていきなり 1 から初めてんの?
多分最初のfseek()が失敗してるよ。戻り値をみてみ。
750デフォルトの名無しさん:2006/11/26(日) 02:02:34
貼ってあるソースコードで書いているとおりに動作したぞ。
期待した動作と違うって事だろうから、エスパー解答
fp=fopen("data.bin","wb");

fp=fopen("data.bin","r+b");
751デフォルトの名無しさん:2006/11/26(日) 02:04:05
>749
no=0とno=1でfseekの戻り値見てみましたが、0でした。
fseekの引数でnoを(no-1)にしてnoを1と2で試してみましたが、やっぱりno=1を読むと0 0 0になってしまいました。
戻り値の意味が間違ってるならごめんなさい。
752デフォルトの名無しさん:2006/11/26(日) 02:07:13
>>751
0なら成功してますね。
>>750
あっそういう事か。ファイルを上書きして消してしまってるという事ね。
元のファイルを残したいならr+bだな。
753デフォルトの名無しさん:2006/11/26(日) 02:11:07
>750
それで試したら無事表示できました、ありがとうございます!
オープンモード、もう一度勉強しなおしてきます。

>751
わかりづらくて申し訳ありませんでした。
上書きはwbやwb+とはまた別の書き方なんですね…

こんな深夜にお付き合い頂き、ありがとうございました。
754デフォルトの名無しさん:2006/11/26(日) 10:26:00
せめて構造体の前後に#ptagma pack(0)みたいなやつでも入れといたほうがいいよ。
755デフォルトの名無しさん:2006/11/26(日) 10:33:40
>754
初心者なんでptagmaが何かわかりません。
わかりやすく説明してくださいませんか?
756デフォルトの名無しさん:2006/11/26(日) 10:36:23
ptagmaってのはスメグマみたいなもんだ。
757デフォルトの名無しさん:2006/11/26(日) 13:23:19
リナックスのソースコードをダウンロードしたんだけど、どうやって
内容をみるのでしょうか。何か専用のツールがあるのかなあ。
こんな感じのファイルです。
MAKEDEV-3.1.0-19.src.rpm
ご存知の方教えてください。
スレちがいならすまん。
758デフォルトの名無しさん:2006/11/26(日) 13:29:48
>>757
それはインストール用パッケージだ。詳しくは犬板でどうぞ。

>>755
>754はpragmaと言いたかったのだろう。
要は、構造体のメンバ間に埋め草が必要になる可能性を排除しておけと言うことだ。
759デフォルトの名無しさん:2006/11/26(日) 13:33:21
>>753
モード,動作,ファイルがないとき,ファイルがあるとき
r,読み込み専用,エラー,開く
w,書き込み専用,作る,クリアする
a,追記専用,忘れた,開いて末尾に移動
r+,読み書き,エラー,開く
w+,読み書き,作る,クリアする
a+,追記部で読み書き,忘れた,開いて末尾に移動
760デフォルトの名無しさん:2006/11/26(日) 13:42:00
>>755
#ptagma ではなく #pragma
C言語の範疇では定義されていない部分について、コンパイラに対して
特殊な指示を出すためのもの。
VC++なら pragmaだったけど、他のコンパイラなら違ってるかも。良く知なくてすまん。

C言語の学習を始めたばかりなら、まだpragmaとかは意識しないほうがいいかも。
ある程度基礎ができてきてから出いいので、
変数をメモリに割り当てるときの境界調整だとか、
構造体のメンバの間に詰め物がされる場合があるとか、
そういう話も調べて見るといいかも。

以下のページの説明が分かりやすそう。
ttp://mag.autumn.org/Content.modf?id=20050430014843

とりあえず、今やっている構造体のメモリ内容をファイルに書き出す&読み込む
というのは、同じ環境でやっている分には使えるけど、
書き出したファイルを別の環境で読み出す上手く行かないことがあるというのを
知っていればいいと思うよ。
761デフォルトの名無しさん:2006/11/26(日) 13:42:02
曖昧なくせに講釈垂れんじゃねーよ
762デフォルトの名無しさん:2006/11/26(日) 13:50:48
そもそも構造体をそのままfread,fwriteするのがアレなんで、
中途半端にpragmaどうこうは気にしなくてもいいかもしれんけど。
763デフォルトの名無しさん:2006/11/26(日) 13:51:08
761 は
759 宛て
764デフォルトの名無しさん:2006/11/26(日) 15:58:57
int型の数値を送ってもらい、最上位ビットを反転して、
1以上の値だったらマイナスをつけて返す、
-1以下の値だったらプラスをつけて返す関数を作成したいのですが、
最上位ビットを確認し、反転する一番いい書き方ってどんなんでしょうか?
765デフォルトの名無しさん:2006/11/26(日) 16:01:15
int hoge(int x)
{
    return -x;
}
766デフォルトの名無しさん:2006/11/26(日) 16:12:31
2の補数で格納されてるから
最上位ビットを反転しても符号が逆でも絶対値が同じにはならん。
>>764が結局何をしたいのか書かないから

>1以上の値だったらマイナスをつけて返す、
>-1以下の値だったらプラスをつけて返す関数を作成したいのですが、

の部分より>>765が正解のように思える。
767デフォルトの名無しさん:2006/11/26(日) 16:25:27
1次元配列a[10],b[10]をそれぞれ0と’a’でクリアし、
ってなんだよ〜。くそorz
768デフォルトの名無しさん:2006/11/26(日) 16:35:31
>>767
クリアじゃなくフィルだな
int i;
for (i=0; i<10;i++) {
a[i]=0;
b[i]='a';
}
769767:2006/11/26(日) 16:40:13
自己解決します・・ありがとうございます。
おっと>>768ありがとうございます。
770デフォルトの名無しさん:2006/11/26(日) 18:17:24
main関数内でkaikiという関数を呼び出し、
そのときmainの中にある配列atai[10]の値をkaikiに渡して,
kaiki内で計算した結果のkotae1,kotae2という二つの変数をmainに返したいのですが、
どのように書いたらいいのでしょうか?
771デフォルトの名無しさん:2006/11/26(日) 18:20:46
>>770

void kaiki(int n, int* kotae1, int* kotae2)
{
...
}

main()
{
int atai[100];
int kotae1, kotae2;
...

kaiki(atai[10], &kotae1, &kotae2);
...
}
772デフォルトの名無しさん:2006/11/26(日) 18:45:02
struct kotae {
int kotae1;
int kotae2;
};
struct kotae kaiki(int n, int const * atai)
{
struct kotae rtn;
//
rtn.kotae1 = 0;
rtn.kotae2 = 0;
//
return rtn;
}

int main()
{
int atai[100];
struct kotae kotae = kaiki(sizeof(atai) / sizeof(* atai), atai);
printf("kotae1:%d, kotae2:%d\n", kotae.kotae1, kotae.kotae2);
return 0;
}
773デフォルトの名無しさん:2006/11/26(日) 21:56:15
エクセルファイルで
Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm
0 23 0 374.2 0 0 0 0 0 0 0 0 0
1 22 ・・・
があるのですが、2行4列目の数字だけをfscanf等で取り込みたいです。
このようなエクセルファイルが365個あり、順々に2行4列目だけをP[i]へ格納していこうと思うのですが、読み込みの部分が上手くいきません。
よろしくお願いします。
774デフォルトの名無しさん:2006/11/26(日) 22:04:59
>>773
その365個のファイルは、ファイル名に規則性があるの?
それとも、全部、手入力?
775デフォルトの名無しさん:2006/11/26(日) 22:22:55
>>774
年間データで
1_1.xls〜12_31.xls(1月1日〜12月31)
です。
776デフォルトの名無しさん:2006/11/26(日) 22:37:36
>>773
読みこむ部分だけ。
一行256文字以下で、二行目が整数、整数、整数、実数の並びになっているとして。

int readVal(const char *filename, double* d)
{
FILE *fp;
char line[256];
int dmy1, dmy2, dmy3;

fp = fopen(filename, "r");
if (fp == NULL)
return 0;
if (fgets(line, sizeof line, fp) == NULL)
return 0;

if (fgets(line, sizeof line, fp) == NULL)
return 0;

if (sscanf("%d %d %d %lf", &dmy1, &dmy2, &dmy3, d) != 4)
return 0;

fclose(fp);

return 1;
}
777776:2006/11/26(日) 22:39:50
もう寝なきゃならないので、他の部分は、
↓まかせた。
778デフォルトの名無しさん:2006/11/26(日) 22:40:45
>>777
来週もよろしく頼むぞよ
779デフォルトの名無しさん:2006/11/26(日) 22:46:58
2行4列目って決まってんのなら
fgets(s, sizeof(s), fp),
fgets(s, sizeof(s), fp);
P[i] = s[3]-'0';
で良いんじゃね?
780デフォルトの名無しさん:2006/11/26(日) 22:54:27
つか、perlかRuby使えよそんなの。
781デフォルトの名無しさん:2006/11/26(日) 23:04:28
>>779
テキストとしての4列目なのではなく、4セル目なんでね?
>>776
何故%*dとせずにダミーに格納する?
>>775
xlsファイルを読むのは途方もなく面倒なわけだが、csvか何かに変換できないのか?
782デフォルトの名無しさん:2006/11/26(日) 23:46:01
拡張子を直接txtかcsvに直せばどうにかなりますかね?
>>776の方法では駄目でしょうか?
もう少しで試せるので出来次第報告します。
783デフォルトの名無しさん:2006/11/26(日) 23:48:57
>>782
拡張子ではなく内容の問題
書式等の情報が含まれるからめんどくさい
784デフォルトの名無しさん:2006/11/26(日) 23:54:55
txtに直接直したら、セル間はタブで分けられてます。
行間は勿論改行です。
785デフォルトの名無しさん:2006/11/26(日) 23:58:56
>>784
データ保存する際にtxtとかにするって意味か
ファイル名の変更で拡張子変えるって意味かと思った
786デフォルトの名無しさん:2006/11/27(月) 00:28:19
>>785
スイマセン、そういう意味です。
伝わりにくい言い方で申し訳ないです。
787デフォルトの名無しさん:2006/11/27(月) 01:20:44
grepか何かでもっと単純な形に
とりあえず切り出したらどうだろ?
788デフォルトの名無しさん:2006/11/27(月) 03:03:39
某サイトより
#include <stdio.h>
#include <conio.h>

int main()
{
int a = -32769, b = 32768;/*コメント*/

printf("a = 15\nb = 20\n");
printf("a + b = %d\n", a + b);
printf("何かキーを押してください\n");
getch();
printf("End");
return 0;

これってVC++だとコンパイルできないようなんですが、BCCではコンパイルできてしまいます。何か理由ってあるんでしょうか。
789デフォルトの名無しさん:2006/11/27(月) 03:06:44
>>788
標準じゃないライブラリconioがあるかどうか。
790デフォルトの名無しさん:2006/11/27(月) 03:15:57
>>788
括弧が足りない。
791デフォルトの名無しさん:2006/11/27(月) 03:18:25
>>788
愛も足りないねぇ 標準で済むのに
792デフォルトの名無しさん:2006/11/27(月) 03:22:00
>>790
どの括弧が足りないんでしょうか?

それとコンパイルできないのが正しい形なんでしょうか?
793デフォルトの名無しさん:2006/11/27(月) 03:29:23
たぶん VC++ の方は
getch(); → _getch();
にすればコンパイルできるんじゃないかなかな。
794デフォルトの名無しさん:2006/11/27(月) 03:39:15
例えばsin2θ=xで、xがわかっている場合にθの値を求めるにはどうすればいいですか?
795デフォルトの名無しさん:2006/11/27(月) 03:40:57
>>794
ニュートン法とか二分法とか
796794:2006/11/27(月) 04:02:27
>>795
具体的にはどうすればいいんですか?
まったくわからないので教えて下さい。
797デフォルトの名無しさん:2006/11/27(月) 04:04:12
>>796
ぐぐれよ

例えば平方根を求める場合
http://www.sm.rim.or.jp/~shishido/newton.html

これのx*xをsin(x)にかえて、2*xをcos(x)に変えるとか
798794:2006/11/27(月) 04:50:43
>>797
ぐぐっていろいろ試してみましたができませんでしたorz
799デフォルトの名無しさん:2006/11/27(月) 05:17:08
>>798
だいたいこんな感じ
#include <stdio.h>
#include <math.h>

#define f(x) (sin(2 * (x)) - 0.5) /* x = 0.5 */
#define g(x) (2 * cos(2 * (x)))

#define MAXCOUNT 10

int main(void)
{
double x = 0.5;
int k;

for (k = 1; k <= MAXCOUNT; k++) {
x = x - f(x) / g(x);
printf("%17.12f %15.8e\n", x, fabs(f(x)));
}

return 0;
}
800デフォルトの名無しさん:2006/11/27(月) 06:43:31
>>794
theta=asin(x)/2;
801デフォルトの名無しさん:2006/11/27(月) 06:47:48
math.hをインクルードするのを忘れんようにな
802デフォルトの名無しさん:2006/11/27(月) 14:15:57
sin2θって表記は2が上付きなのをまんま書いてるかも。
そうだとasin(sqrt(x))とasin(-sqrt(x))。
803デフォルトの名無しさん:2006/11/27(月) 15:24:01
putchar,getcharを使って、20061109のように日付を入力すると
曜日を出力するプログラムを作成せよ、って課題が学校で出たんですが
全く分かりません・・・
誰か教えてください
804デフォルトの名無しさん:2006/11/27(月) 15:32:16
>>803
宿題スレへどうぞ。
805794:2006/11/27(月) 17:18:45
>>799
>>800
ありがとうございました
おかげでできました
806デフォルトの名無しさん:2006/11/27(月) 17:45:31
なんで int *x じゃなくて int* x にする人がいるの?
807デフォルトの名無しさん:2006/11/27(月) 17:55:36
C++やると、参照型 (int& r;)との兼ね合いで、そっちも悪くないように思えてくる。
C++作った人もint* p;派だというし。

もちろんC++やったことがなくてもint* p;の人はいるし、その逆もそう。結局は好みの問題。
808デフォルトの名無しさん:2006/11/27(月) 17:57:51
こんばんわ。質問さしてください。
英数字とか漢字をを入力し、それを16進数で表示したいと考えています。
scanfで取り込んでprintfでみたいにしてみたんですがうまくいきません。
アドバイスいただけないでしょうか?よろしくお願いします。
また、このやり方で漢字を16進で受け取ることはできるのでしょうか?
809デフォルトの名無しさん:2006/11/27(月) 18:02:01
C++ より Objective-C の方が明らかに上。
仕様も性能も。
810デフォルトの名無しさん:2006/11/27(月) 18:15:28
>>808
漢字はchar型の変数に収まらないので、文字列(char配列)として扱え。

>>809
シェアはC++のほうが明らかに上。
でもたぶん、そもそもC++とObjective-Cが目指している方向は違うと思うんだ。比べるだけ無駄だと思う。
811デフォルトの名無しさん:2006/11/27(月) 20:41:12
>>808
入力された文字列の文字コードを表示するって意味だろうか。
812デフォルトの名無しさん:2006/11/27(月) 21:44:22
ひらがなとかを1バイト文字に変換するにはどうすればよくて?
2バイトURLを1バイトに直したくて・・・
813デフォルトの名無しさん:2006/11/27(月) 21:58:45
>>812
ひらがなは1バイトにできん
2バイト文字だ
814デフォルトの名無しさん:2006/11/27(月) 22:07:16
URLなら、英数字2バイトを1バイトにしたいわけだろ?
汎用関数みたいな都合のいいものはないみたいね。
変換するのが英数字なら、なんとか自分で(環境依存のものを)書こう。
適当だけど、
unsigned char hoge[] = "abcde:/";
int i;
for (i = 0; i < sizeof(hoge); i++)
{
printf("%x ", hoge[i]);
}
こんな感じでコードの規則性を調べて、
unsigned char hoge[] = "abcde:/";
char str[256];
int i;
for (i = 0; i < sizeof(hoge) / 2; i++)
{
switch(hoge[i * 2]) {
case 0x82:
str[i] = hoge[i * 2 + 1] - 0x81 + 'a';
break;
default:
break;
}
}
str[i] = '\0';
こんな感じで変換するしかないんじゃない?コロンとかスラッシュは
一つずつ対応して・・・ああめんどくさい。しかも移植性なし。
815デフォルトの名無しさん:2006/11/27(月) 23:55:54
812がやりたいことはURLエンコードのような気がする。
816デフォルトの名無しさん:2006/11/28(火) 06:39:06
case WM_CREATE時のコードをcase WM_KEYDOWNの時にも
使いたいのですが、関数にして何度も使うには文が長く
参照する変数が二次元配列などが多くてごちゃごちゃしてます。
どうすれば同switch内でもう一度使えるでしょうか?
教えてください。お願いします。
817デフォルトの名無しさん:2006/11/28(火) 06:52:16
関数にして何度も使うには文が長く、って、
その長い文を同じswitch文の中で二ヶ所使う方がさらにごちゃごちゃするんじゃないか?
まず、その長い処理を切り出して関数にする。
関数内で使うために渡すべき変数が多すぎて引数がごちゃごちゃするようなら、
構造体等でまとまりを作って呼び出しをすっきりさせる。
まとまった処理とのインタフェースが変数がごちゃごちゃしているせいで美しくないと感じるようなら、
データ構造の変数への切り出し方を再考することも考えてみたら?
818デフォルトの名無しさん:2006/11/28(火) 06:55:10
>>817
うっす。ありがとうございます。
819デフォルトの名無しさん:2006/11/28(火) 07:53:40
単純に、
case WM_CREATE:
case WM_KEYDOWN:
// 処理
って話ではないのかね。
820808:2006/11/28(火) 12:48:13
>>811 そうです。文字コードを受けってそれを表示したいので
   scanfで取り込んだらコードが出てくるかなと思い質問さ
   していただきました。
   JISコードを表示することは簡単ではないのでしょうか?
821デフォルトの名無しさん:2006/11/28(火) 13:42:03
JISコードで入力してもらえれば簡単だろうけどな。
822デフォルトの名無しさん:2006/11/28(火) 18:00:27
整数を入力して、その数までを2のべき乗ずつ表示していくという
問題なんですが、エラーは出ずにコンパイルできても
実行したら何も起きません。
宜しければどこが間違ってるか教えて頂けないでしょうか?

#include <stdio.h>

int main (void)
{
    int i,no;

    printf("正の整数を入力して下さい:");
    scanf("%d", &no);

    i = 1;
    while (i <= no)
    {
        if (i == (2 * i))
            printf("%d ", i);
        i++;
    }
    if (no > 0)
        putchar('\n');

    return (0);
}
823デフォルトの名無しさん:2006/11/28(火) 18:04:14
if の条件が不備。 2のべき乗かどうかのチェックをしていない。

さらに i が 2 * i と等しくなるのは i=0 の時だけ。
824デフォルトの名無しさん:2006/11/28(火) 18:33:27
>>822
#include<stdio.h>

int main (void)
{
    int i,no;

    printf("正の整数を入力して下さい:");
    scanf("%d", &no);

    for(i=1;i<=no;i<<=1)
        printf("%d ", i);
    if (no > 0)
        putchar('\n');

    return (0);
}
825電信男:2006/11/28(火) 18:34:08
小文字から大文字に変換したいので↓のようなプログラムを作ったのののですが、
うまいことできません。
AppleがyPPLEになってしまいます。
どーすればいいでしょうか?
#include <stdio.h>

int main()
{
int i = 0;
char c[] = "Apple";
char b [80];

printf("String: %s\n", c);

for(i = 0;i < 5; i++){
if ('a' <= c[i] && c[i] <= 'z' )
b[i] = c[i] + 'A' - 'a';
}
printf("Upper case: %s\n", b);
return 0;
}
826デフォルトの名無しさん:2006/11/28(火) 18:36:50
>>825
c[i]が小文字以外の時の処理を加えるといいよ

または #include<ctype.h> と b[i]=toupper(c[i])
827デフォルトの名無しさん:2006/11/28(火) 18:46:19
>>823
アドバイスありがとうございます。
ですが、2のべき乗のチェックの式がわからないのです。

>>824
例題がwhileを使ってるのでできればwhileのままでやりたいのですが…
828デフォルトの名無しさん:2006/11/28(火) 18:53:01
>>827
2のべき乗なら1になるまでずーっと2で割り切れる。

forのループをwhileに直すことぐらい自分でしろ。
829デフォルトの名無しさん:2006/11/28(火) 18:56:28 BE:15528724-2BP(200)
>>827
「2のべき乗かどうか」をチェックする必要など無い。
「2のべき乗にしかならない」値を作ればいい。

i=0;while((2<<i)<=no){printf("%d ", (2<<i));i++;}
830デフォルトの名無しさん:2006/11/28(火) 18:59:04
>>829
2の0乗=1 も仲間にいれてやって
831デフォルトの名無しさん:2006/11/28(火) 19:00:06 BE:23292162-2BP(200)
間違いた。
i=0;while((1<<i)<=no){printf("%d ", (1<<i));i++;}
こうだな。
832デフォルトの名無しさん:2006/11/28(火) 19:01:46
>>825
文字列の終端に '\0' もいれないといけない。
833デフォルトの名無しさん:2006/11/28(火) 19:35:22
>>828
>>829
すみません。
アドバイスありがとうざいました。
834デフォルトの名無しさん:2006/11/28(火) 22:55:33
質問です。
C言語でフォルダの中身の一覧を表示させるには
どうすれば良いでしょうか。
835デフォルトの名無しさん:2006/11/28(火) 22:57:39
>>834
system("dir");
system("ls");
のどちらかでいいんじゃないかな?
836デフォルトの名無しさん:2006/11/28(火) 22:58:09
>>834
ls -R
837デフォルトの名無しさん:2006/11/28(火) 23:05:14
質問なのですがvisual C++ で         = :左のオペランドが,左辺値になっていません。
というエラーが出るのですがこれはどういうことなんでしょうか?
838デフォルトの名無しさん:2006/11/28(火) 23:06:07
左のオペランドが,左辺値になってないんじゃないか?
839デフォルトの名無しさん:2006/11/28(火) 23:08:00
すみません。オペランドってなんですか?
840デフォルトの名無しさん:2006/11/28(火) 23:09:38
手術室のこと
841デフォルトの名無しさん:2006/11/28(火) 23:10:26
>>839
x = y + z;
ってあれば、yとzはオペレータ'+'のオペランドで、
xとy+zがオペレータ'='のオペランド

>>840
ワロタ
842デフォルトの名無しさん:2006/11/28(火) 23:15:41
>>841
教えていただきありがとうございました。ということは=の左辺と右辺が矛盾してますよってことですか?
843デフォルトの名無しさん:2006/11/28(火) 23:23:51
>>842
矛盾しているということではなくて、=の左辺にあるものが
代入可能なものではないということ。
844デフォルトの名無しさん:2006/11/28(火) 23:24:07
代入できないってことじゃないの
エラーが出た行を貼り付けてくれれば簡単に答えられると思うが
845デフォルトの名無しさん:2006/11/28(火) 23:32:18
if(i>l && i>o){

if((l*l+o*o)>i*i)
printf("鋭角三角形");
if((l*l+o*o)=i*i)  ←ここです。
printf("直角三角形");
if((l*l+o*o)<i*i)
printf("鈍角三角形");
}               
846デフォルトの名無しさん:2006/11/28(火) 23:33:26
>>845
==
847デフォルトの名無しさん:2006/11/28(火) 23:36:23
どうもありがとうございました。おかげで完成しました。
848デフォルトの名無しさん:2006/11/28(火) 23:43:54
なんかの一行AAに見えた
849デフォルトの名無しさん:2006/11/28(火) 23:49:03
テキストエディターを作成しようと思うのですが、
fopen関数とかその辺のファイル入出力関係の関数を使って作っていけばいいんですよね?

なにかコツとか陥り易い問題点とかあったらアドバイスよろしくお願いします。
850デフォルトの名無しさん:2006/11/29(水) 00:01:02
ファイル操作の関数が何かを聞くということはたぶんかなりの初心者かと思うけど、
テキストエディタを実装するには理解すべきことがかなり多いと思うよ。
ファイル入出力だけじゃなく、GUI(描画、ユーザ入力)とか、メモリ上のデータ管理とか。

とりあえずアドバイスとしては
・いきなり高機能なものは目指さない。
・基本はしっかり学ぶ。入出力が良く分かってないなら、テキストエディタはいったん置いておいて
 ある程度自由に入出力が扱えるくらいには勉強してみる。
・ちゃんとテストする。いろいろ作りこんでから上手く動かないと分かっても、原因を調べるのは大変。
・自分でいろいろな情報を調べられるようにする。
・めげない。
851デフォルトの名無しさん:2006/11/29(水) 00:35:24
シューティングゲームで、
方向キーを押しっぱなしで弾をうちたい時などに、
何のボタンを押しているか というのを
取りたいのですがどうすればいいでしょうか。

kbhit()では最後に押されたキー1つしか取れないですよね・・
852デフォルトの名無しさん:2006/11/29(水) 00:41:47
Func(int byte_len)
{
int i = 1000;
char data[4], *pc;

pc = (char*)&i;
data[0] = pc[3];
data[1] = pc[2];
data[2] = pc[1];
data[3] = pc[0];
}

↑のdataに入る数字の並びをエンディアンを気にせずに、
ビッグエンディアン形式にしたいのですが、
エンディアンを気にしない書き方はありますか?
853デフォルトの名無しさん:2006/11/29(水) 00:48:39
>>852
1.バイトオーダーを隠してしまう関数を作る。
2.シフト演算を使う。
1,2のどちらかだな
854デフォルトの名無しさん:2006/11/29(水) 01:19:55
シフト演算で取り出す関数を作ろうと思います。
ありがとうございました。
855デフォルトの名無しさん:2006/11/29(水) 02:08:40
>>851
そもそもkbhitじゃ一つも入力取れないぜ?
856デフォルトの名無しさん:2006/11/29(水) 02:10:02
>>850
テキストエディタにGUIってどんなだよ?
ワープロと間違えてんのか?
857デフォルトの名無しさん:2006/11/29(水) 02:12:32
>>856
ed みたいなの想像してる?
スクリーンエディタなら GUI でしょ
858デフォルトの名無しさん:2006/11/29(水) 02:24:32
かなや漢字を表示するからGUIだな。
859デフォルトの名無しさん:2006/11/29(水) 02:29:51
GUI使ってるテキストエディタって少なくね?
使ってるとしてもツールバー程度じゃね?
ほとんどのエディタはCUIだろ?
860デフォルトの名無しさん:2006/11/29(水) 02:36:22
ASCII文字以外を表示したらそれは GUI なんだよ。
だから DOS/V は GUI-OS なんだよ。
861デフォルトの名無しさん:2006/11/29(水) 02:46:54
GUI が気になってググってみた。
思ってたのとかなり違ってた。
オレは古い人間なんだと思い知らされた。
862デフォルトの名無しさん:2006/11/29(水) 02:49:27
int d; //入力値
while(1){
//移動する数値を入力する
do {
d = -1;
printf("動かす数字を入力して下さい > ");
scanf("%d", &d);
while (getchar() != '\n') { }
if(d == 0) { r = 1; break; }

これで、d = -1; に何故-1が付くのかわかりません。
入門書に書いてある説明に依ると数値以外の文字や文字列が
入力されると、scanf関数の入力値を格納する変数には何も
入らないので、前に入力した値が入っている状態です。
なので、scanf関数を使う前に、入力値を格納する変数に
毎回数値-1を設定しておきましょう。

との事です。
>>scanf関数を使う前に、入力値を格納する変数に
毎回数値-1を設定しておきましょう。
何故、-1を設定しなければならないのでしょうか?

それと、>>前に入力した値が入っている状態です。
前に入ってるから、何故-1にするのかわかりません。

アドバイスを宜しくお願いします。
863デフォルトの名無しさん:2006/11/29(水) 03:02:55
>>862
>>862 でしっかりかいてある通り。
自己解決ってやつだな。しかも一つのレスでw
864デフォルトの名無しさん:2006/11/29(水) 03:03:34
別に意味は無い。
それ書いた人がそういうルールに決めただけ。
865デフォルトの名無しさん:2006/11/29(水) 03:13:23
ではー1を入れる事に依り、空白に戻すと言う事でしょうか?
866デフォルトの名無しさん:2006/11/29(水) 04:30:25
-1が入っていた場合はscanfに失敗していると分かるかもしれません。
前に入力した値がそのままだと失敗したことが分からないかもしれません。
867デフォルトの名無しさん:2006/11/29(水) 05:01:48
でも-1を事前に入れておくくらいなら、scanf()の戻り値をチェックすべきだがな。
事前に-1を入れる方法だと、入力ミスと-1の入力の区別がつかないジャマイカ。
868デフォルトの名無しさん:2006/11/29(水) 05:15:46
何だかよくわかりませんが、ありがとうございました…
869デフォルトの名無しさん:2006/11/29(水) 05:17:49
すみません、Winnyは何言語でできているのでしょうか?
JAVAでしょうか?VISUAL C++でしょうか?
870デフォルトの名無しさん:2006/11/29(水) 06:20:55
>>869
確か、
初期のバージョンは VC++
途中から BCB(Borland C++ Builder)
バージョンはよくわからん。

途中から使用してるツールは違えど、言語自体はC++言語になるね。
871ぴゅあ:2006/11/29(水) 07:53:41
>>862
恐らく解説の中にあると思いますけど
入力される数は、処理を終了させるための"0"か
正の整数であることを条件にしているでしょう

それより、負の整数は入力されることはないとして
つまり現れることはないもの(例外値)として
scanfで無効な入力があったときに-1(例外値)となるように
予め入れてあるものです
(この例では入力処理(scanfの部分)をきちんと書くことを
目的としているわけではないので簡単に済ませてある)
なので、-2でも-99でもよいわけですが
-1を割り当てようと思う人が比較的多かったりする
というところですね

つまり"-1"という値が重要なのではなく
"例外値"であることが大切なわけです

もし、-1も入力される値であったとすれば
-2(d = -2;)とかにされていたかも知れません

恐らく簡単に済ませてあって
もしdの値が-1であったときそれ以降の処理をスキップさせる
なんて処理も省略されているかも知れませんね
>>866-867の言われているようなところは
省いている筈ですから(それが示されたコードにも現れているのとscanf自身ではなく何か他の解説が目的であろうということ)
872834:2006/11/29(水) 11:48:35
>>835
人大杉でレス遅れてすんまそん。
回答有難うございました。
873834:2006/11/29(水) 11:51:33
836さんも!!
874デフォルトの名無しさん:2006/11/29(水) 12:37:12
ちなみにフォルダの中身を一覧表示させ、
その内容をファイルに書き込む方法はどうするんでしょうか。
875デフォルトの名無しさん:2006/11/29(水) 12:39:10
>>874
system("ls > a.txt");
876デフォルトの名無しさん:2006/11/29(水) 12:49:26
Cっていうよりシェルの使い方だなw
877デフォルトの名無しさん:2006/11/29(水) 13:23:59
>>875
「一覧表示させ、その内容をファイルに書き込む」
だからそれじゃダメだろ。
878デフォルトの名無しさん:2006/11/29(水) 13:25:28
system("ls");
system("ls > a.txt");
879デフォルトの名無しさん:2006/11/29(水) 13:28:07
1行目と2行目の一瞬の間にディレクトリ内容が変更される可能性を考慮してない。失格。
880デフォルトの名無しさん:2006/11/29(水) 13:28:42
system("ls | tee > a.txt");
881デフォルトの名無しさん:2006/11/29(水) 13:31:02
system("ls > a.txt");
system("cat > a.txt");
又は
system("ls | tee a.txt");
882デフォルトの名無しさん:2006/11/29(水) 13:31:09
teeなら '>' は必要ないなとマジレスしてみる
883デフォルトの名無しさん:2006/11/29(水) 13:32:56
フォルダってことはこうジャマイカ?
system("dir > a.txt");
system("type a.txt");
884デフォルトの名無しさん:2006/11/29(水) 13:35:20
>>874 をよく読め。
「ディレクトリ」じゃなくて「フォルダ」だぞ。
表示される内容は微妙に違うぞ。
885デフォルトの名無しさん:2006/11/29(水) 13:40:07
>>883
それはあくまでディレクトリだ。
886デフォルトの名無しさん:2006/11/29(水) 16:23:48
なぜか次の単純なプログラムにエラーがでます。

#include <stdio.h>

int main(void)
{
int i = 10;
int k;
int m[i] = {1,2,3};

for(k = 0;k < i;k++)
printf("%d\n",m[k]);
return(0);
}

配列mの初期化を”m[i] → m[10]”にするとうまくいきました。
配列の要素の初期化に変数はつかえないのですか?
887デフォルトの名無しさん:2006/11/29(水) 16:31:57
>>886
define i 10
888デフォルトの名無しさん:2006/11/29(水) 16:39:40
#ifdefにelse ifはないのでしょうか?
889デフォルトの名無しさん:2006/11/29(水) 16:44:08
>>886
ヘタレはC99使ってろよプ

>>888
あるよ。
890デフォルトの名無しさん:2006/11/29(水) 17:12:23
>888
#elif
891874:2006/11/29(水) 17:29:34
レスくれた方々ありがとうございます。
とても参考になりました!!!
892デフォルトの名無しさん:2006/11/29(水) 17:55:23
fprintf のファイル名をfor文などを使って数字1から順番に作っていく
ことはできないでしょうか?
例えばガウス関数のσ=1の計算を1.datに書いて、
σ=2の計算を2.datに書くようにしたいです。
893デフォルトの名無しさん:2006/11/29(水) 17:59:51
sprintfでファイル名の文字列を作っていけばよい。
894デフォルトの名無しさん: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;
}
895デフォルトの名無しさん:2006/11/29(水) 18:03:32
はやい返事ありがとうございます!
やってみます。
896デフォルトの名無しさん:2006/11/29(水) 18:48:21
質問ですが、ソースファイル A.c B.c D.c があったとして
Aを実行するとA→B→Dと実行させていくプログラムと、
Aの実行途中でBに移ってAに戻って来るようプログラムする事は可能でしょうか?
897デフォルトの名無しさん:2006/11/29(水) 18:52:48
>>896
a.exe b.exe d.exe を実行するって事?
898896:2006/11/29(水) 19:29:24
>>897
すみませんそうです、
1つにまとめるて書くより複数に分けた方が管理しやすいかと思ったもので
899デフォルトの名無しさん:2006/11/29(水) 19:31:23
>>896
可能。
900デフォルトの名無しさん:2006/11/29(水) 20:09:36
すみません、どなたかおねがいします。

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

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

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

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

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

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

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

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

return 0;
}

拡張子は全て表示されるようにしてるので、あってると思います。
910デフォルトの名無しさん:2006/11/29(水) 20:34:39
じゃあ bcc32.cfg が間違ってんだな。
ちゃんと bin の中に入ってる?
911デフォルトの名無しさん:2006/11/29(水) 20:40:51
bcc32.cfg内のパスの表記ミスでした。
お騒がせしました。
912896:2006/11/29(水) 20:45:45
>>899
遅れながらありがとうございます。
913デフォルトの名無しさん:2006/11/29(水) 20:48:55
>>912
そんな回答でいいのかよw
914896:2006/11/29(水) 20:59:10
方法も聞きたいところなのですが、まだまだ勉強不足で
どう質問したらいいかわからないので
可能かどうかだけ聞ければ後は自分で探してみます。
915デフォルトの名無しさん: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();だけで十分だと思うんですが、昔の環境ではそうでなかったってことでしょうか?
特に今リアルタイム入力関連の情報集めているわけではないのですが、疑問が解けないのでよろしくお願いします
916デフォルトの名無しさん:2006/11/29(水) 21:17:26
ちんぽ!!!!
917デフォルトの名無しさん:2006/11/29(水) 21:22:25
>>915
c = getchar();
while ((dummy = getchar()) != '\n')
;
これはただ入力が1行あって最初の一文字目を取得して、
その後は破棄するって意味ですよ。
918デフォルトの名無しさん:2006/11/29(水) 21:34:21
>>905
それは問題ない。
ヘッダ名が"〜"形式で指定した場合、
見つからなければ<〜>と指定したのと同じようにヘッダを探すことになっている。
919915:2006/11/29(水) 21:39:59
>>917
あ、メニューを選択する場合に単に数字だけを入力すればいいところを
誤って"1q"のようにタイプミスしてしまい、且つ本当は2を選びたかった場合に
ストリームに残っているqを取り除くための前処理だってことですか?
920デフォルトの名無しさん:2006/11/29(水) 23:02:19
>>918
>探すことになっている

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

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

>>930にも答えてないし

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

と行った具合に出力したいんです。
950デフォルトの名無しさん: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];
}
}
951デフォルトの名無しさん:2006/11/30(木) 23:09:50
>>949
聞きたいのは、画像を表示するために何を使っているのか(どうやっているのか)ということ。
コンソールアプリで、各画素のRGB値を数値として文字列表示したいということか?
文字でいいのか?画像ではなく。
952928:2006/11/30(木) 23:15:59
>>950
確かにそうですね。ありがとうございます。
しかし下のエラーが出てしまいます。初心者ですいません。

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

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

画像の問題じゃなくて配列がまともに扱えないだけじゃないのか
954デフォルトの名無しさん:2006/11/30(木) 23:36:12
ttp://up.img5.net/src/up1054.txt
ここまで進めていて、どこがおかしいのか分からなくなってしまいました。
実行値が正しくない上にエラーとなってしまいます。
よければどの辺がおかしいか教えてください。
955デフォルトの名無しさん: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]' に変換できません。
これで困っているようなら、多次元配列を扱うのも早すぎる気がする。
956928:2006/11/30(木) 23:43:14
>>953
その通りです。

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

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

1〜10までの乱数を10個発生させて表示させる。ただし、1度出た数字は除外する」
という課題を出されたのですが、教科書を見ながら解いても
 同じ数字が重複して表示されてしまうプログラムになってしまいどうしていいかわかりません。 
どなたか教えていただけませんでしょうか
966デフォルトの名無しさん:2006/12/01(金) 21:38:14
>>965
同じ数字が重複して表示されることを許してるからじゃないの?
967デフォルトの名無しさん:2006/12/01(金) 21:39:48
>965
1.チェック用の配列を用意して既に選んだものを選ばないようにする。
2.一つの数字を選ぶたびにその数字を抜き取って配列を詰めなおし、そこから選ぶ
968デフォルトの名無しさん:2006/12/01(金) 21:48:43
3. 1-10の数字が並んでいる配列を用意し、乱数で(要素同士を入れ替えるなどして)適当に並べ替える。
969デフォルトの名無しさん: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());
としてみたのですが重複してしまいます
970デフォルトの名無しさん:2006/12/01(金) 21:57:37
971デフォルトの名無しさん:2006/12/02(土) 00:05:33
C仕事にしようとする場合、数学の知識はどの程度必要でしょうか?
972デフォルトの名無しさん:2006/12/02(土) 00:08:54
いるのは精神力と体力と忍耐力
973ぴゅあ:2006/12/02(土) 00:24:54
>>969
>としてみたのですが重複してしまいます

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

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

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

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

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

あと仕入れ値がbisonはyaccより1.8倍ぐらい高め
980デフォルトの名無しさん:2006/12/02(土) 00:55:00
flexのDL場所がみつからないよ
981ぴゅあ:2006/12/02(土) 00:55:42
>>975
そか・・・
982デフォルトの名無しさん:2006/12/02(土) 01:06:49
>>980
ttp://www.nagoya-fantasia.com/pc/
ここにミラーあったよ
983デフォルトの名無しさん:2006/12/02(土) 01:16:20
>>982
アッー!!
984デフォルトの名無しさん:2006/12/02(土) 01:21:39
そろそろ誰か次スレたてようね〜
985デフォルトの名無しさん:2006/12/02(土) 02:06:30
>>976
それがコンパイラが欲しいという意味なら
ttp://bdn.borland.com/museum/
ここにある Turbo C 2.01 が最高にオススメ。
統合開発環境があった方がいいというなら Turbo C++ 1.01 という選択肢もアリ。
986デフォルトの名無しさん:2006/12/02(土) 05:45:30
>>976
日本語なら文法や意味があいまいだったり間違えて書いたりしても
読む側が推測してある程度は理解してもらえるけど、
C言語のコンパイラはそんなことないからな。
頑張れ。
987デフォルトの名無しさん: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]);
988デフォルトの名無しさん: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]);
989デフォルトの名無しさん:2006/12/02(土) 06:17:48
ごめん、説明不足だった。
>>988 のは立に数値が保存されてくじゃないですか。
1  2  3  4  みたいに
横に並べて保存したいのです。
FILE *output2;
output2=fopen("1ca_dist.dat","a");
てしたので、シミュレーションする毎にデータに追加されて、
何十回かシミュレーションして各ビンの平均値を出したいのですが。
なにか、うまいこと出来ないかのう?
990デフォルトの名無しさん:2006/12/02(土) 06:28:21
>>989
>>988試してみて言ってるのか?
991デフォルトの名無しさん:2006/12/02(土) 06:44:27
アーー
992デフォルトの名無しさん:2006/12/02(土) 06:46:11
ごめん、そんなんでOKだったとは知らなかった。
993デフォルトの名無しさん:2006/12/02(土) 07:01:06
>987を書くような人間が>988をそんなんてw
994デフォルトの名無しさん:2006/12/02(土) 07:08:31
こりゃ将来苦労するタイプだな。人の意見がなかなか耳に入らない奴。
早とちり。
995デフォルトの名無しさん:2006/12/02(土) 07:13:45
int main(void) {
  int yorn[10];
  int i;

  for (i = 0; i < 10; i++) {
    yorn[rand()-1] = 1;
  }

  for (i = 0; i < 10; i++) {
    if (yorn[i] == 1) {
      printf("%d\t", i);
    }
  }
}

//rand()のところは1-10を生成するようにする
996デフォルトの名無しさん:2006/12/02(土) 08:17:29
そういや、次スレは?
997デフォルトの名無しさん:2006/12/02(土) 10:18:50
C言語なら俺に聞け(入門篇) Part 5
http://pc8.2ch.net/test/read.cgi/tech/1165022193/l50
998デフォルトの名無しさん:2006/12/02(土) 12:46:31
>995
何がしたいのかわからん
999デフォルトの名無しさん:2006/12/02(土) 13:06:58
>>998
を悩ませたいんだと思う
1000は譲るよ
1000デフォルトの名無しさん:2006/12/02(土) 14:16:44
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。