C言語なら俺に聞け(入門篇) Part 4
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/11/09(木) 00:31:01・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/
0002デフォルトの名無しさん
2006/11/09(木) 01:01:39>>1乙
0004デフォルトの名無しさん
2006/11/09(木) 01:04:420005デフォルトの名無しさん
2006/11/09(木) 01:21:120006デフォルトの名無しさん
2006/11/09(木) 01:21:54そうだよ
で前レス
http://pc8.2ch.net/test/read.cgi/tech/1160682950/933 へ
こんなの感じで・・・
http://sa-wiki.com/upload/src/up0059.txt
00076
2006/11/09(木) 01:23:01http://pc8.2ch.net/test/read.cgi/tech/1160682950/983
だった
0008デフォルトの名無しさん
2006/11/09(木) 01:31:25転龍呼吸法でいいんじゃね?
マジレスすると本買って地道に一つずつ覚えて行ってくれ。
0009デフォルトの名無しさん
2006/11/09(木) 01:35:440010デフォルトの名無しさん
2006/11/09(木) 01:39:360011デフォルトの名無しさん
2006/11/09(木) 02:39:02金を稼いで風俗へ
0012デフォルトの名無しさん
2006/11/09(木) 03:07:05で、実行を待たせる処理を行いたいと思っているんですが、
sleepは何をインクルードすれば使えるんでしょうか?
webを検索してみてもすぐには出てきませんでした・・
0013デフォルトの名無しさん
2006/11/09(木) 03:26:420014デフォルトの名無しさん
2006/11/09(木) 03:41:10unistd.hは、windows環境ではない
unix環境のファイルなのですね。
すいません、今更ながら前スレを検索したところ、
630 :デフォルトの名無しさん :2006/11/02(木) 02:18:51
>>628
>警告 W8065 bintori.c 55: プロトタイプ宣言のない関数 'sleep' の呼び出し(関数 main )
プロトタイプ宣言がないと言われている。sleep関数のプロトタイプ宣言が書かれた
ヘッダファイルをインクルードすればいい。どのファイルかはMSDNあたりで自分で探して。
とあり、MSDNライブラリーを探したところ、
.net frameworkの中にはあるとのこと。
しかし.net frameworkが無い環境も想定しなければならず、
その場合自前で時間を計り、
導入するしかないと言うことなのでしょうか。
(長々すいません)
0015デフォルトの名無しさん
2006/11/09(木) 03:45:58SJISで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になっていたりします。
0016デフォルトの名無しさん
2006/11/09(木) 04:43:55nkfが失敗しているってことか?
だったら自前で変換するとかiconvライブラリを使うとか。
0017デフォルトの名無しさん
2006/11/09(木) 08:18:25sleep()じゃなくて Sleep() だか _sleep() って名前じゃね?
windows.h wincon.h
のどっちかだったよ。
0018デフォルトの名無しさん
2006/11/09(木) 13:10:50俺の環境だと
#include <dos.h>
void _sleep(unsigned seconds);
0019デフォルトの名無しさん
2006/11/09(木) 17:03:200020デフォルトの名無しさん
2006/11/09(木) 17:34:34試した?(怒)
0021デフォルトの名無しさん
2006/11/09(木) 17:41:370022デフォルトの名無しさん
2006/11/09(木) 17:49:23めんどくさいのでおk
0023デフォルトの名無しさん
2006/11/09(木) 18:02:37どうもです、気にしないことにします
0024デフォルトの名無しさん
2006/11/09(木) 18:03:57内容が同じでエラーでないならいいんじゃね?
0025デフォルトの名無しさん
2006/11/09(木) 18:13:28プリプロセッサで検索してくれ
0026デフォルトの名無しさん
2006/11/09(木) 20:13:20その関数の名前は?
002719
2006/11/09(木) 20:55:50ですよ…ね?
>>25
必要に応じてコードで使われている標準関数が多く書かれてるヘッダを選べばいいってことでしょうか?
該当の関数それ一つしか使わないならどちらでもいい、のかな
>>26
上で話題になってたsystem関数です
VC++とLSICの両方でINCLUDEフォルダにstdlib.hとprocess.hにありました
0028デフォルトの名無しさん
2006/11/09(木) 21:00:210029デフォルトの名無しさん
2006/11/09(木) 21:09:49{
float r, s;
printf("円の半径を入力 :");
scanf("%f", &r);
s=3.14*r*r;
printf("s=%f\n", s);
}
で警告 W8070 test3.c 10: 関数は値を返すべき(関数 main )
と出るんだがなんで?
0030デフォルトの名無しさん
2006/11/09(木) 21:11:430031デフォルトの名無しさん
2006/11/09(木) 21:12:11mainの型は?
0033デフォルトの名無しさん
2006/11/09(木) 21:12:30return 0;の追加
0034デフォルトの名無しさん
2006/11/09(木) 21:13:260035デフォルトの名無しさん
2006/11/09(木) 21:13:50main()だけじゃだめなのか?
そんで最後の}が10のところなんだ
0036デフォルトの名無しさん
2006/11/09(木) 21:14:25main()でもtest()でもなんでもいいだが, 明示的にtypeが指定されていない関数は,
暗黙の内にintを返す関数として扱われるから.
0037デフォルトの名無しさん
2006/11/09(木) 21:15:570038デフォルトの名無しさん
2006/11/09(木) 21:17:03それはいれている
0039デフォルトの名無しさん
2006/11/09(木) 21:17:07それが無ければ真っ先に未定義の関数〜みたいなエラーが出ると思うんだが
0040デフォルトの名無しさん
2006/11/09(木) 21:17:130041デフォルトの名無しさん
2006/11/09(木) 21:18:330042デフォルトの名無しさん
2006/11/09(木) 21:18:55猫
0043デフォルトの名無しさん
2006/11/09(木) 21:19:41#includeなくてもコンパイルできるよ。
0045デフォルトの名無しさん
2006/11/09(木) 21:21:45ってなんなんだ?
0046デフォルトの名無しさん
2006/11/09(木) 21:22:36stdioの中身でもコピーするのか?
0047デフォルトの名無しさん
2006/11/09(木) 21:24:58size_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扱いになってるんですけれども。
vc2003だと、これもエラー無しでコンパイル&実行できるけど?
main()
{
printf("%s\n", "aaaa");
}
0049デフォルトの名無しさん
2006/11/09(木) 21:32:130050デフォルトの名無しさん
2006/11/09(木) 21:32:32全く分からん状態なら本の1冊でも買えっつったろヴォケェ
0051デフォルトの名無しさん
2006/11/09(木) 21:32:39それは知らなかった
でも2005じゃエラー吐くな
0052デフォルトの名無しさん
2006/11/09(木) 21:33:14それだけじゃないんだぜ
Cとしてコンパイルしても?
0054デフォルトの名無しさん
2006/11/09(木) 21:34:11int main(void)
{
return 0;
}
mainもひとつの関数
関数で値を返すにはreturn が必要
0055デフォルトの名無しさん
2006/11/09(木) 21:34:18Cとしてコンパイルしたらエラー無くちゃんとできたんだぜ
すげえなww
0056デフォルトの名無しさん
2006/11/09(木) 21:34:460057デフォルトの名無しさん
2006/11/09(木) 21:35:49関数が値を返すのは関数が値を返すんだろ
0058デフォルトの名無しさん
2006/11/09(木) 21:40:18どういうことってどういうことなんだ
0059デフォルトの名無しさん
2006/11/09(木) 21:49:18関数の処理が終了して、呼び出し元に制御が戻ってきたときに、関数の中でreturnしたデータを、呼び出し元で使えるってこと
0060デフォルトの名無しさん
2006/11/09(木) 21:57:07つまり関数は値を返すってことだ
0061デフォルトの名無しさん
2006/11/09(木) 22:05:000062デフォルトの名無しさん
2006/11/09(木) 22:07:010063デフォルトの名無しさん
2006/11/09(木) 22:10:46意味が分からん
頭痛が痛いみたいなもんか?
0064デフォルトの名無しさん
2006/11/09(木) 22:11:570065デフォルトの名無しさん
2006/11/09(木) 22:17:12呼び出し元に制御が戻った。
0066デフォルトの名無しさん
2006/11/09(木) 22:17:13サブルーチン
ファンクション
どっちがいい?
0067デフォルトの名無しさん
2006/11/09(木) 22:18:26普通に関数でいいだろ
0068デフォルトの名無しさん
2006/11/09(木) 22:20:400069デフォルトの名無しさん
2006/11/09(木) 22:25:150070デフォルトの名無しさん
2006/11/09(木) 22:27:110071デフォルトの名無しさん
2006/11/09(木) 23:09:480072デフォルトの名無しさん
2006/11/09(木) 23:15:06ファンクション。
だが「関数」ではない。
0073デフォルトの名無しさん
2006/11/09(木) 23:18:120074デフォルトの名無しさん
2006/11/09(木) 23:40:56648 名前は開発中のものです。 sage 2006/11/09(木) 23:24:53 ID:OlISg2Xa | ▲上 | ▼下 | リロード | 10件 | 50件 | 100件 | 300件 | 1-100 | あぼ〜ん
こんなん作りました。ソース付きです。まだ完全ではないです。
http://newsstation.info/up/img/ns15294.zip
MD5:093BFE17333C4CB0C99D36CC674143F1
0075デフォルトの名無しさん
2006/11/09(木) 23:47:17ごちゃごちゃと表記する意味がよく判らないが
(typedefはしなくてもいいらしいが、何を何にtypedefしてるのかさっぱり分らない)
とにかく今まで悩んでたあんなことやこんなことに活用できそうな気がしてきた
007674
2006/11/09(木) 23:59:140078デフォルトの名無しさん
2006/11/10(金) 09:06:20隣の山田さん
0079デフォルトの名無しさん
2006/11/10(金) 14:09:20コマンドを発行し、その結果を得たいのですが
サンプルはどっか転がってないですか??
たとえばCで
ifconfig
と発行し、その結果を得たい。
0080デフォルトの名無しさん
2006/11/10(金) 14:14:170081デフォルトの名無しさん
2006/11/10(金) 18:26:530082デフォルトの名無しさん
2006/11/10(金) 18:36:110083デフォルトの名無しさん
2006/11/10(金) 18:37:570084デフォルトの名無しさん
2006/11/10(金) 18:38:080085デフォルトの名無しさん
2006/11/10(金) 18:41:22リロードしてもエラーだからおかしいと思った
Linux板クノッピスレも落ちてた
0086デフォルトの名無しさん
2006/11/10(金) 20:16:56C言語に文字の入出力機能など御座いません。
それらは総てライブラリの仕事です。
0087デフォルトの名無しさん
2006/11/10(金) 20:32:50入門者未満はこっちへどうぞ。
ttp://pc8.2ch.net/test/read.cgi/tech/1158275665/
0088デフォルトの名無しさん
2006/11/10(金) 20:44:25ライブラリが無ければ、それは単なるCのコンパイラというだけ。
0089デフォルトの名無しさん
2006/11/11(土) 12:28:35正しい。
>>87-88
似非回答者はこちらへどうぞ。
ttp://pc8.2ch.net/test/read.cgi/tech/1158275665/
こういうことを言ってみたい年頃なんだよな。
0091デフォルトの名無しさん
2006/11/11(土) 13:04:51ライブラリになってるかとかって話題があって、そういうことを言ってるんだろうけど、
「入出力がC言語にない」って言い方は正しいのか?
0093デフォルトの名無しさん
2006/11/11(土) 13:33:180094デフォルトの名無しさん
2006/11/11(土) 13:33:28戻り値=出力
0095デフォルトの名無しさん
2006/11/11(土) 13:40:06そういうレスは揚げ足取られるだけだお
0096デフォルトの名無しさん
2006/11/11(土) 13:57:130097デフォルトの名無しさん
2006/11/11(土) 14:04:290098デフォルトの名無しさん
2006/11/11(土) 14:14:56をつくってるんですが、
画面のスクロールをconio.hのputchで全行書き直し,
movetextとかins/dellineとかを試したのですが
更新時間がとても遅く(0.3sec/line程度)なってしまいました。
VRAMをいじらずに標準(的)なライブラリで
うまく実装する方法を教えてください。
0099デフォルトの名無しさん
2006/11/11(土) 14:31:28これ見て標準関数の勉強しようかと思ってるんですが、標準関数の中のアルゴリズムってどれも大体は同じなんでしょうか?
0100デフォルトの名無しさん
2006/11/11(土) 14:47:380101デフォルトの名無しさん
2006/11/11(土) 14:56:050102デフォルトの名無しさん
2006/11/11(土) 15:11:57どのコンパイラに付属する標準関数のものでもって意味です…
010399=101
2006/11/11(土) 15:15:030104デフォルトの名無しさん
2006/11/11(土) 15:16:02基本的にアセンブラで書かれてるはずだから
CPUや処理系に依存
0105デフォルトの名無しさん
2006/11/11(土) 15:18:37開発者に聞かなきゃわからないけど
アルゴリズムは大体似通ったものにはなるんじゃないかな
0106デフォルトの名無しさん
2006/11/11(土) 15:19:320107デフォルトの名無しさん
2006/11/11(土) 15:23:330109デフォルトの名無しさん
2006/11/11(土) 15:27:050110デフォルトの名無しさん
2006/11/11(土) 15:29:280111デフォルトの名無しさん
2006/11/11(土) 15:32:310112こんなもんかな
2006/11/11(土) 15:38:34011399
2006/11/11(土) 15:39:09開発者に聞かなきゃ分からないようなこと聞いてすみません
0114デフォルトの名無しさん
2006/11/11(土) 15:41:02>>104-105
0115デフォルトの名無しさん
2006/11/11(土) 15:46:36コンパイルオプションでアーキテクチャ指定されたときどうすんだよ。
0116デフォルトの名無しさん
2006/11/11(土) 15:47:27rawデバイスに対してdatファイルを
writeして、readでInvalid Argument (errno=22)
エラーになるんだがこれって本当に読み出し
出来てないのかな?
rawデバだから読み出し出来てないってOSが
認識してるだけだと思ったんだけど・・・
どうやったら正常にreadさせられるのか
どなたか教えてくださいませ
0117デフォルトの名無しさん
2006/11/11(土) 15:47:41malloc()のような低水準の処理はアセンブラか機械語、
でも機械語はあり得ないからやっぱりアセンブラだと思うんですけど(><)
0118デフォルトの名無しさん
2006/11/11(土) 15:48:23難しいことはわかりません(><)
0119デフォルトの名無しさん
2006/11/11(土) 15:49:140120デフォルトの名無しさん
2006/11/11(土) 15:49:430121デフォルトの名無しさん
2006/11/11(土) 16:11:04>ブロックと関数とループを混同していることなどは看過できない
とあるのですが、これは、どういう意味でしょうか?
こういう批判のある本はやめといたほうがいいのですかね?
0122デフォルトの名無しさん
2006/11/11(土) 16:38:01混合する奴の頭の中をみてみたい。
多分スコープ辺りだと思うけどどう書かれてるのかは気になるな。
0123デフォルトの名無しさん
2006/11/11(土) 16:58:44結局はやめといたほうがいいのですか?
0124デフォルトの名無しさん
2006/11/11(土) 17:09:06例えばsin()を考える。
最適化オプションを指定されていなければ関数を呼び出すであろう。
しかし、そうでないならFPU命令をインライン展開するはずだ。
更に、sin()呼び出しの前後に同じ引き数でcos()呼び出しもあったとする。
コンパイラによってはFPU命令のsincos同時演算命令を展開するかも知れん。
また、memcpy(), memset()なども大抵は極力高速になるようにインライン展開されるだろう。
斯くの如く、コンパイラ付属の標準関数がアセンブリ言語で書かれている可能性は幾らでもある。
>>122
混合する奴はいないだろ、いるのは混同する奴だ。
0125デフォルトの名無しさん
2006/11/11(土) 19:35:44つ man 8 raw
というかすれ違いだ。
0126デフォルトの名無しさん
2006/11/11(土) 21:18:32そもそも現在のBorland C++は、32ビットWindows用のコンパイラであり、
WindowsはVRAMを直に触らせないので、VRAMをいじるという解決策は不可能。
WindowsではWindows APIがもっともOSに近い存在。
0127デフォルトの名無しさん
2006/11/11(土) 22:43:45wincon.h 読め。
0128デフォルトの名無しさん
2006/11/11(土) 23:27:40コマンドプロント上での動作みたいな感じになるんでしょうか?
VBとかはwindowがあることが前提っていうか、そんな感じに見えるのですが
変な質問か分かりませんが教えてくれるとありがたいです。
0129デフォルトの名無しさん
2006/11/11(土) 23:36:02なんか日本語が変だが言わんとしていることは分かる。
答えはyesで、Windowsでの一般的なGUIアプリを作りたいなら、
WIN32 APIかDirectXか、またはそれらを取り込んだライブラリを使用する必要がある。
C言語のみでは、入出力としてはファイルかコンソールへのテキストのみしかできない。
0130デフォルトの名無しさん
2006/11/12(日) 00:18:26winアプリ学ばないと作れ無いのか・・・
0131デフォルトの名無しさん
2006/11/12(日) 00:27:30winアプリ学ばないとってのがよく分からん
WINAPIのことか?
MSでVC無料で配布してるんじゃなかったっけ?
それ使え
0132デフォルトの名無しさん
2006/11/12(日) 00:28:58使ったこと無いから知らんけど C# あたりに行けばいいんちゃう?
0133デフォルトの名無しさん
2006/11/12(日) 00:42:47#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");
0134デフォルトの名無しさん
2006/11/12(日) 00:43:58draw_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);
0135133、ずれてしまったので最初から訂正です
2006/11/12(日) 00:45:35#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");
0136133、ずれてしまったので最初から訂正です
2006/11/12(日) 00:46:32printf("プレイヤー一枚目:");
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);
0137133、ずれてしまったので最初から訂正です
2006/11/12(日) 00:47:13if((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]);
}
0138133、ずれてしまったので最初から訂正です
2006/11/12(日) 00:52:33{//プレイやターンで引いた数が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 ***
このエラーの行を見ても直すに直せません。; など足りているのですが・・・
ご指摘お願いします。
0139133、ずれてしまったので最初から訂正です
2006/11/12(日) 01:02:15エラー E2379 blackgack.c 23: ステートメントにセミコロン(;)がない(関数 main )
エラー E2188 blackgack.c 26: 式の構文エラー(関数 main )
警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数
main )
*** 2 errors in Compile ***
ここが、どうしてもわかりません。
0140デフォルトの名無しさん
2006/11/12(日) 01:03:00>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つ繋がってる
0141デフォルトの名無しさん
2006/11/12(日) 01:04:37これなにをしてるか分かってるか?
0142140
2006/11/12(日) 01:07:40>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
あと文字単位(文字列ではない)での初期化 ”A” ではなく ’A’ だろ
0145133、ずれてしまったので最初から訂正です
2006/11/12(日) 01:12:56ご返答、ありがとうございます。
>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 が参照)
こんなエラー初めてです。参考書のエラー対策にも載っていません。
0147デフォルトの名無しさん
2006/11/12(日) 01:15:07コードを何レスにも渡って貼り付けた後に質問をするんじゃなく、
先に質問を書いてからコードを貼り付けてほしい。
もしくはコードはどこかのアップローダにあげとくとか。
0148140
2006/11/12(日) 01:19:20char digit[13] = {'A','2','3','4','5','6','7','8','9','10','J',''Q',K'};
個数足りないと思ったら Q が抜けてる
>char mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
2次元配列に
char mark[4][12] = {"ハート","ダイヤ","スペード","クローバー"};
0149133、ずれてしまったので最初から訂正です
2006/11/12(日) 01:20:10参考書の結果とは違いますが・・・
>>147
ごめんなさい、次からそうします
0150140
2006/11/12(日) 01:23:02>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
そうか、ポインタ配列にそれぞれの文字列のポインタを格納してるのか
この部分は直さなくてもいいよ
でも Q は追加してね
0151133、ずれてしまったので最初から訂正です
2006/11/12(日) 01:23:14ありがとうございます
自分でもきづきませんでした
0152デフォルトの名無しさん
2006/11/12(日) 01:25:00>>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が混乱するだけじゃない?
別にここのエラーとは関係の無い問題なのだし。
0154デフォルトの名無しさん
2006/11/12(日) 01:28:262次元配列にするより
char *mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
でいいだろ
0155140
2006/11/12(日) 01:31:41いやいや、実は俺こういう方法気づかなかった
いままで
char digit[13] = {'A','2','3','4','5','6','7','8','9','10','J',''Q',K'}; か
char digit[] = {"A2345678910JQK"}; のように
文字列として初期化してた
ポインタ配列って方法もあったんだなと、気づかされたよ
俺もまだまだ勉強不足だと実感・・・・・
>>154
上のと同じだな・・・・
0156デフォルトの名無しさん
2006/11/12(日) 01:34:21参考書に載っているコードをそのまま打ち込んでるがコンパイルエラーになるということ?
Qが抜けてることからも分かるが、打ち込みミスが多いんじゃないか。
質問をする前に、自分が書いたソースと参考書を「一字一句」比較すべし。
>>145
>こんなエラー初めてです。参考書のエラー対策にも載っていません。
その参考書はC言語のすべてを網羅した魔法の本ではない。本に載ってないことは分からない、ではなく
もっと調べる対象を広げるべき。
コンパイラの出すエラーなら、コンパイラのマニュアルなどを調べる。
VC++とかならMSDNにたいていのことが載っている。BCCのことはよく知らんが。
すぐ上の行に
>警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数 main )
とある。プロトタイプ宣言が何かを知ってる? まずはそれをその参考書で調べること。
とりあえずコンパイルエラーがたくさん出たら、一番上のから順に解決していけ。
一つの原因から、それに連鎖してさまざまなエラーが出る。一つをつぶせばそれに関連していくつかのエラーが消えることがある。
0157140
2006/11/12(日) 01:37:00>>Error: 外部シンボル '_drawCrad' が未解決(C:\BBB\BLACKGACK.OBJ が参照)
ちなみにこれはdrawCradという関数が使われているが関数の実体が無いよ、と言っている
0158デフォルトの名無しさん
2006/11/12(日) 02:20:13そうなんですか
じゃあIEとかペイントとかメモ帳とかをCで作ろうと思ったら
WINAPIやらそれ関係が入っているライブラリを呼び出して作るんでしょうか?
なんていうかその呼び出す関数もCで作られてるんですよね?
んー;;なんかよく分からない
Cがすごくできる人の定義ってなんなんでしょう・・
0159133、ずれてしまったので最初から訂正です
2006/11/12(日) 02:49:03はい、ここで訊く前にもっと調べたりエラーを
たどってみます
0160156
2006/11/12(日) 03:26:37問題に対する解決方法を知るのも大事だが、
自分で解決方法を見つけらるようにする方法を学ぶことも大事。
がんばれ。
0161デフォルトの名無しさん
2006/11/12(日) 03:31:28プログラミングに向いてないな。いい加減コテつけっぱなしなことに気付けよ。
0162デフォルトの名無しさん
2006/11/12(日) 04:51:31どうしてもソートできないのです。身長順にしたいんですが・・
構造体の配列のソートってむずかしい。。
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;
}
0163デフォルトの名無しさん
2006/11/12(日) 07:13:19Person 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;
}
}
}
0164デフォルトの名無しさん
2006/11/12(日) 07:13:35構造体のメンバ(身長だけ)を入れ替えてるだけだと思うんだけど
0165デフォルトの名無しさん
2006/11/12(日) 07:14:340166デフォルトの名無しさん
2006/11/12(日) 07:36:19'10' とか書いてる時点で釣りだろ?
0167デフォルトの名無しさん
2006/11/12(日) 08:00:06>>127
ありがとんです
MS-DOS時代のものを
ちょっといじるだけではだめなのですね(!=)
wincon.hをぐぐってきます〜
0168162
2006/11/12(日) 10:37:55なんでtstがtmpに変わってるのか意味がわからないんですが・・
163の文章をどこかに入れ替えればいいのでしょうか?
やったんだけどうまくいきませぬ。。
0169デフォルトの名無しさん
2006/11/12(日) 11:22:170170162
2006/11/12(日) 11:27:27c=b+1のとことPersonのとこでした。
ありがとうございました。
0171デフォルトの名無しさん
2006/11/12(日) 13:17:000172デフォルトの名無しさん
2006/11/12(日) 13:22:13エラーになっている行を消す を繰り返す
0173デフォルトの名無しさん
2006/11/12(日) 15:34:04エラーを出さない怠け者なコンパイラを 使う
0174デフォルトの名無しさん
2006/11/12(日) 18:29:39ごめんUNIXよくわかんない
0175デフォルトの名無しさん
2006/11/12(日) 18:47:47わからないなら答えないでください!
0176デフォルトの名無しさん
2006/11/12(日) 18:48:550177デフォルトの名無しさん
2006/11/12(日) 19:03:58コンパイラの性能にではなく
オマエの性能をうp
0178デフォルトの名無しさん
2006/11/12(日) 19:16:180179デフォルトの名無しさん
2006/11/12(日) 20:02:320180デフォルトの名無しさん
2006/11/12(日) 20:33:010181デフォルトの名無しさん
2006/11/13(月) 00:15:14構造体のメンバー名に変数を使用することはできないのでしょうか?
0182デフォルトの名無しさん
2006/11/13(月) 00:18:22???
試してみりゃいいじゃん
もしくは具体的な例を店ろ
0183デフォルトの名無しさん
2006/11/13(月) 00:27:15メンバー名をchar配列とかで決めるってことか?
0184デフォルトの名無しさん
2006/11/13(月) 00:32:52試したりしてるんですが、いかんせん勉強したてで...
>>183
まさにそれがやりたいんです
char配列で宣言したり、アクセスしたりしたいんですが...
0185デフォルトの名無しさん
2006/11/13(月) 00:45:510186デフォルトの名無しさん
2006/11/13(月) 00:51:53やっぱ無理ですか...
無理だと分かるだけでもありがたいです。
どうもありがとう
0187デフォルトの名無しさん
2006/11/13(月) 01:12:230188デフォルトの名無しさん
2006/11/13(月) 09:10:31上の関数の中身を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;
}
0189デフォルトの名無しさん
2006/11/13(月) 09:40:59呼び出し元のstr_a, str_bには全く影響受けない
0190デフォルトの名無しさん
2006/11/13(月) 10:08:050191デフォルトの名無しさん
2006/11/13(月) 11:37:540192デフォルトの名無しさん
2006/11/13(月) 12:04:000193デフォルトの名無しさん
2006/11/13(月) 12:07:12構造体のサイズが無限大になるから
0194デフォルトの名無しさん
2006/11/13(月) 12:20:43"モード1選択"
#else
"モード2選択"
#endif
#ifdefでどちらが選択されたかをコンパイル時にコンソールに表示したいのですが、
なにか方法はないでしょうか?
0195デフォルトの名無しさん
2006/11/13(月) 12:30:46# 多分 #pragma で出ることが多い
0196デフォルトの名無しさん
2006/11/13(月) 13:14:03#message モード2
でできました。有り難うございました。
C51を使用してますが、手持ちのヘルプには記載ありませんでした。
0197デフォルトの名無しさん
2006/11/13(月) 16:16:07「コンパイル時」
0198デフォルトの名無しさん
2006/11/13(月) 16:17:20double型の変数で整数の部分だけを出力するにはどうしたらいいですか?
0199デフォルトの名無しさん
2006/11/13(月) 16:25:15double val = 1234.5678;
printf("%.0f");
->1235
printf("%d", (int)val);
->1234
0200デフォルトの名無しさん
2006/11/13(月) 17:03:08ありがとうございます
切捨てと切り上げの両方できるんですね。
そしてsage忘れてすみません・・・。
0201デフォルトの名無しさん
2006/11/13(月) 18:10:02切り上げはceil。
切り捨てのfloorもある。
0202デフォルトの名無しさん
2006/11/13(月) 19:05:17struct a(a1) に struct a(a2) を持たせるとその struct a(a2) もstruct a(a3) を持つのでその struct a(a3) はさらに struct a(a4) を持つので(ry
となってしまう
struct a へのポインタなら持たせられるにょ
0203デフォルトの名無しさん
2006/11/13(月) 19:11:12(VC++の場合)まるめの方向が0へ向かう四捨五入(?)っぽいね?
printf("%.0lf %.0lf %.0lf %.0lf", -123.5, -123.4, 123.4, 123.5);
→ -124 -123 123 124
このときの振る舞いは環境依存?
0204デフォルトの名無しさん
2006/11/13(月) 19:13:50C言語としては負数のとき丸め方向は定義されてないから
コンパイラの実装依存と思う
と調べずにカキコ
0205デフォルトの名無しさん
2006/11/13(月) 19:21:42素人なんですが、わりやすくどなたかおしえていただけないでしょうか?
0206デフォルトの名無しさん
2006/11/13(月) 19:22:24単に絶対値で丸めってだけじゃね
と便乗して調べずレス
0207デフォルトの名無しさん
2006/11/13(月) 19:43:07文法が似ているのと、ライブラリ関数が似ているだけで
まったく別の言語です
0208デフォルトの名無しさん
2006/11/13(月) 20:08:42ありがとうございます。
0209デフォルトの名無しさん
2006/11/13(月) 20:18:27Cを拡張、ベースにしたもの
まぁCをまねてC+やC++など作ったみたいな
結果的には別物...
0210デフォルトの名無しさん
2006/11/13(月) 20:19:400211デフォルトの名無しさん
2006/11/13(月) 20:30:36>>210
とりあえずCを勉強すればC+やC++などの方にも応用がきくといった感じですか?
ありがとうございました。
0212デフォルトの名無しさん
2006/11/13(月) 20:33:13限られた特定の環境でしか使わない。
覚えるなら Objective-C にしろ。
0213デフォルトの名無しさん
2006/11/13(月) 20:40:040214デフォルトの名無しさん
2006/11/13(月) 20:41:16それでもC++すきだけどな
0215デフォルトの名無しさん
2006/11/13(月) 20:48:58Objective-CはCとの互換性があるけど、現実的じゃない。
0216デフォルトの名無しさん
2006/11/13(月) 20:53:03とりあえずCを勉強してみようと思います。
0217デフォルトの名無しさん
2006/11/13(月) 21:10:11C#は流行るか?
何かすぐ消えそうな気がする
0218デフォルトの名無しさん
2006/11/13(月) 21:17:200219デフォルトの名無しさん
2006/11/13(月) 21:30:27同意。俺の周りにはC#やってる奴はいない
0220デフォルトの名無しさん
2006/11/13(月) 21:53:190221デフォルトの名無しさん
2006/11/14(火) 01:49:250222デフォルトの名無しさん
2006/11/14(火) 01:59:04文字列を使う。
0223デフォルトの名無しさん
2006/11/14(火) 01:59:550224デフォルトの名無しさん
2006/11/14(火) 02:01:470225デフォルトの名無しさん
2006/11/14(火) 02:27:54Mac専用でしょ?
0226デフォルトの名無しさん
2006/11/14(火) 02:50:36戻り値や引数を展開しないので
動作が速くなると言うが、
戻り値void、引数なしの場合は早くなるんでしょうか?
(・・というかvoidも型か・・)
関数を実行するだけで、何か値が動くと思うので、
そのせいでマクロよりは多少遅いものなのでしょうか?
0227デフォルトの名無しさん
2006/11/14(火) 02:53:57例えば、123 456 78
と入力されると、
78 456 123
と表示されるようなのです。
0228デフォルトの名無しさん
2006/11/14(火) 03:02:11ぱっと思いつくのは2通り。
1.全部配列に読み込んで逆順に出す
2.ファイルポインタをftell()で取得して配列に入れ、fseek()で逆順に出す
0229デフォルトの名無しさん
2006/11/14(火) 03:50:16char str*[] = {"CAT","DOG"}; になっていいのでしょうか?
0230デフォルトの名無しさん
2006/11/14(火) 04:10:03前者はchar型の配列
後者はchar型へのポインタ配列
意味が全然違う
0231デフォルトの名無しさん
2006/11/14(火) 04:10:38予め -1 にしておくとは、どういう意味でしょうか?
0232デフォルトの名無しさん
2006/11/14(火) 04:13:19日本語で書いて
それだけじゃ意味わからんぞ
0233デフォルトの名無しさん
2006/11/14(火) 04:37:06サンクスです。
どうして、*が付くとそう書けるのかがわかりません
0234デフォルトの名無しさん
2006/11/14(火) 04:37:49メモリはどうなるのか教えてください。
あと、絶対にほかのプログラムのメモリにはアクセスできない
のでしょうか?
というか、Cの質問じゃないですかね?
0235デフォルトの名無しさん
2006/11/14(火) 04:46:400236デフォルトの名無しさん
2006/11/14(火) 06:05:16メモリが予約されるが、その中に何が入っているかは未定。
前そのメモリ空間を使っていた変数の値がその領域にのこったまま
だったらそれがそのままその領域に残ってる(初期化してくれない)
したがって宣言時に予約した領域に無意味な値を入れて安全にする
(初期化)ことが重要な場合が・・ある
0237デフォルトの名無しさん
2006/11/14(火) 07:40:34int foo = 5;と書いて
int fooz[] = {1, 2, 3, 4,};と書くが如く、
char * bar = "aho";と書いて
char * barz[] = {"tako", "ika", "kurage",};と書く。
0238デフォルトの名無しさん
2006/11/14(火) 07:41:51今時のコンパイラはインライン展開もするから、下手な小細工考えずに関数で書け。
そしてその関数だけでなくプログラム全体でプロファイリングしろ。
話はそれからだ。
0239デフォルトの名無しさん
2006/11/14(火) 08:30:14226です。ありがとうございます!
インライン展開、プロファイリングという言葉を初めて知り、
調べることが出来ましたyo
0240デフォルトの名無しさん
2006/11/14(火) 08:35:34数値を指定桁数まで右スペース埋めしたいのですがどのように書けば良いのでしょうか?
左埋め… printf("%4d",10)→" 10"を出力
右埋め… printf("?",10)→"10 "を出力
�Aまた、上記の桁数(4)も動的に指定するにはどのように書式を指定すれば良いのでしょうか?
よろしくおねがいします。(性的な意味で)
0241デフォルトの名無しさん
2006/11/14(火) 08:57:38printf("%-*d", 4, 10);
0242デフォルトの名無しさん
2006/11/14(火) 09:12:000243デフォルトの名無しさん
2006/11/14(火) 10:13:510244デフォルトの名無しさん
2006/11/14(火) 15:37:33n×nのサイズで螺旋状に0から(n二乗ー1)までの数が並ぶ行列を作成し、
画面に表示させるプログラムって配列を使って組むにはどうすればいいでしょうか?
ヒントだけでもいいので教えてください。お願いします。
0245デフォルトの名無しさん
2006/11/14(火) 15:43:52宿題スレにでも行ったら?
0246デフォルトの名無しさん
2006/11/14(火) 18:29:280247デフォルトの名無しさん
2006/11/14(火) 18:35:33typedef unsigned long (*function_ptr)(int, long, long);
のようにね。
0248デフォルトの名無しさん
2006/11/14(火) 19:38:4316進以外が途中に入力されたらエラーを出力したいのですが、何か良い方法はありますか?
0249デフォルトの名無しさん
2006/11/14(火) 19:39:450250デフォルトの名無しさん
2006/11/14(火) 19:40:13馬鹿だなぁ
タッチパネルに決まってるだろ?
0251デフォルトの名無しさん
2006/11/14(火) 19:47:26改めて質問させて下さい。コピペになりますが、よろしくお願いします。
グーグル先生に質問してみたのですがよくわかりませんでした・・orz
宜しければ詳しく教えて欲しいのですが。
C++にて、テキストファイルに書き込まれたデータを構造体に格納する方法です。
データは一行につき1件で、カンマで区切られて4つの項目があります。
char型が2つとint型が2つになります。
データは10件(行)あります。
よろしくお願いします(´・ω・`)
0252デフォルトの名無しさん
2006/11/14(火) 19:55:520253デフォルトの名無しさん
2006/11/14(火) 19:57:280254デフォルトの名無しさん
2006/11/14(火) 20:04:51>C++にて
スレ違い。
>テキストファイルに書き込まれたデータ
>char型が2つとint型が2つ
それはテキストファイルではない。
0255デフォルトの名無しさん
2006/11/14(火) 20:07:32すいません、Cでお願いします。
書き方が悪かったです。
文字列,文字列,数字,数字
という構造になっているので、構造体の宣言でchar型を2つとint型を2つ用意する必要があるという事を言いたかったんです
0256デフォルトの名無しさん
2006/11/14(火) 20:08:12man fscanf
0257デフォルトの名無しさん
2006/11/14(火) 20:09:53文字列は(char型)配列に格納してください。
0258デフォルトの名無しさん
2006/11/14(火) 21:13:500259デフォルトの名無しさん
2006/11/14(火) 21:41:39struct xxx {int *x;} hoge;
struct yyy {void *x;};
struct yyy *piyo = (struct yyy *)&hoge;
return 0;
}
これはコンパイルが通ったのですが、四行目を
struct yyy piyo = (struct yyy)hoge;
とすると型変換できませんとエラーが出ます、何故でしょうか?
0260デフォルトの名無しさん
2006/11/14(火) 22:02:56(struct yyy)hoge
このキャストは無理
0261デフォルトの名無しさん
2006/11/14(火) 22:03:160263デフォルトの名無しさん
2006/11/14(火) 22:09:34君は http://pc8.2ch.net/test/read.cgi/tech/1160893851/588 かな?
http://pc8.2ch.net/test/read.cgi/tech/1160893851/595
の左辺のキャストを よーーーく見よう C にはない文法の (struct hoge &) ってキャストしてっから。
これは 構造体自体のキャストでは無い
0264259
2006/11/14(火) 22:19:22同じ日に…いえ、その人は別の方です
C++でも構造体をキャストできているわけでなないんですね
可能だとしても意味はほとんどないんでしょうけれど、疑問に思ったので…
(メンバーの数が違っても)構造体のポインタはキャスト可能ということは
領域破壊でバグの原因になったりしそうでどっちにしろ危険っぽいですね
ありがとうございました
0265デフォルトの名無しさん
2006/11/14(火) 22:22:36struct XXX *p <-> void *p
くらい
0266デフォルトの名無しさん
2006/11/14(火) 22:36:41じゃあ自分のレベルではまだ使うこともなさそうですね
0267デフォルトの名無しさん
2006/11/14(火) 22:38:38まま、そうおっしゃらずに。
実はいける口なんでしょ?
0268デフォルトの名無しさん
2006/11/14(火) 22:40:31int length;
char data[1];
}string;
struct{
int length;
char data[buf_size];
}a;
のとき
(string)a
のようにキャストするのもテクニックとしては知っておいたほうがいいかも
0270デフォルトの名無しさん
2006/11/14(火) 23:02:2516進以外が途中に入力されたらエラーを出力したいのですが、何か良い方法はありますか?
気になって眠れません。
0271デフォルトの名無しさん
2006/11/14(火) 23:07:29どこまで変換したかってポインタが設定されるから、それを見たら?
途中で止まってたらおかしい。
0272デフォルトの名無しさん
2006/11/14(火) 23:08:03>249
0273デフォルトの名無しさん
2006/11/14(火) 23:19:07第一引数は配列名で第三引数は基数、第二引数をみるのですか?
0274デフォルトの名無しさん
2006/11/14(火) 23:21:09そう。
0275デフォルトの名無しさん
2006/11/14(火) 23:49:34268ではないが。
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]);
}
}
当然、構造体の最後のメンバにしか適用できない。
0276デフォルトの名無しさん
2006/11/14(火) 23:55:26仕様書に違反している事には変わりがないけどな。
使うときは自己責任でって奴だ。
C99ではchar data[]って書き方が正式に許されたが。
0277デフォルトの名無しさん
2006/11/15(水) 00:33:05ま、いっか。
0278デフォルトの名無しさん
2006/11/15(水) 02:04:53どういう事なのでしょうか?入門書の説明が難しくて
わかりません。
あと、コメントが文字列なので2次元配列は、
どうして使えないのでしょうか?
0279デフォルトの名無しさん
2006/11/15(水) 02:39:53例えば学校で40人のクラスが5クラスあったとする。
その場合
int data [5][40];
とかになる
>あと、コメントが文字列なので2次元配列は、
>どうして使えないのでしょうか?
これは言ってる意味がわからない
0280デフォルトの名無しさん
2006/11/15(水) 02:59:43もしかして二次元配列とポインタの関係がわからなくて悩んでいるのか?
最初はポインタ無視していいよ。>>279の通りでいい。
>コメントが
これは俺も不明な質問だが、文字列の二次元配列という意味なら、文字列
そのものが既にchar型の一次元配列なので、1+2=3次元配列が必要になる。
例えば
char [][2][10] = {{"orange", "apple"}, {"banana", "pine"}};
のような感じで。
0281278
2006/11/15(水) 03:07:40わkりました!!
>>280->>279
>>コメント
入門書にも詳しく書かれていないので、
自分でもよくわかりません、すんまそ。
>>char [][2][10] = {{"orange", "apple"}, {"banana", "pine"}};
のような感じで。
難しいです・・・まだここまで習っていないので参考にさせて
戴きます、頭が混乱するといけないので。
ありがとうございました。
0282デフォルトの名無しさん
2006/11/15(水) 03:51:46#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);
0283デフォルトの名無しさん
2006/11/15(水) 03:52:25int 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;
0284デフォルトの名無しさん
2006/11/15(水) 03:53:05p_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;
}
0285デフォルトの名無しさん
2006/11/15(水) 03:54:41void 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にしているのでしょうか?
0286デフォルトの名無しさん
2006/11/15(水) 04:18:00質問に愚直に答えるなら、
p_positionから-1にしている。
日本語が不自由な君に軽くエスパーを駆使すると
配列の添え字が0から始まるのに対し、
p_positionは1から始まっているから。
0287デフォルトの名無しさん
2006/11/15(水) 05:09:17謎がとけました、サンクスです
0288デフォルトの名無しさん
2006/11/15(水) 06:14:44ありがとうございます
0289259
2006/11/15(水) 07:16:45あ、(string)aというのは本当にそのままキャストするってことではなくて
領域についてこういう風な考え方もできるから知っておくといいという意味でしたか
現場ならではって感じですね、ありがとうございました
0290デフォルトの名無しさん
2006/11/15(水) 11:20:55printfの%sに対して数値の0を渡したら、
文字化けやエラーではなく「(null)」という文字列が表示されました。
0292デフォルトの名無しさん
2006/11/15(水) 11:43:05%s
0293デフォルトの名無しさん
2006/11/15(水) 11:58:590294デフォルトの名無しさん
2006/11/15(水) 12:05:590 == "\0" は真だろ。
無知はお前の方だろww
0295デフォルトの名無しさん
2006/11/15(水) 12:33:00環境依存。
未定義の動作だから処理系によって動作は違がう。
その例は単なるフェイルプルーフだからその動作を期待してはいけない。
0296デフォルトの名無しさん
2006/11/15(水) 12:56:190298デフォルトの名無しさん
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;
}
こういう奴をいじっていくつもりなんですけど。
0299デフォルトの名無しさん
2006/11/15(水) 13:53:350300デフォルトの名無しさん
2006/11/15(水) 14:02:54#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; }
0301デフォルトの名無しさん
2006/11/15(水) 14:07:18unkoだったらoknuって出るようにします
>>300
すいません、まだポインタ習ってないです。
0302デフォルトの名無しさん
2006/11/15(水) 14:08:01予習になったね
0303デフォルトの名無しさん
2006/11/15(水) 14:14:30printf("oknu");
0304298
2006/11/15(水) 14:16:45ポインタ無しで>>298を(逆順の定義は>>301)解決したいです
どなたかお願いします。
文字列の連結やらコピーをするくらいまではなんとかできます。
0305デフォルトの名無しさん
2006/11/15(水) 14:23:38てことは、>>298の "文字列" ってのが
"列字文" ってならなくてもいいんだな?
0306298
2006/11/15(水) 14:26:38それは困ります><
できたらできたほうがいいです
0307298
2006/11/15(水) 14:32:49>>301は だったら って書いたので例えのことです。
これだったら>>1でいう詳しく書いたことにならないようなので、
言い直すと入力した文字の後から1つ1つ順番に出力したいです。
0308デフォルトの名無しさん
2006/11/15(水) 14:35:400309デフォルトの名無しさん
2006/11/15(水) 14:41:150310デフォルトの名無しさん
2006/11/15(水) 14:46:540311298
2006/11/15(水) 14:48:15すいません、それすら知りませんでした。
>>308
>>298は課題が出たからわからないので聞きにきたんですが、
問題の内容にすら書いていません。今までの課題の流れだと日本語を入力したことがないので
流れから判断して多バイト文字は無視でお願いします。
0312デフォルトの名無しさん
2006/11/15(水) 14:52:55しかし汚いコードでつね
0313デフォルトの名無しさん
2006/11/15(水) 15:38:390314デフォルトの名無しさん
2006/11/15(水) 15:44:12int i,k=6;
for (i=0;i<6;i++)
{
str[i]="文字列"[k--];
}
printf("%s\n",str);
return 0;
はいはい俺天才
0315デフォルトの名無しさん
2006/11/15(水) 15:45:40つ\0
0316デフォルトの名無しさん
2006/11/15(水) 15:48:26え、、えへへ
0317デフォルトの名無しさん
2006/11/15(水) 15:51:31いや、大きさが足りない
(男の人に言ったらまずかった?)
0318デフォルトの名無しさん
2006/11/15(水) 15:52:080319デフォルトの名無しさん
2006/11/15(水) 15:53:240320デフォルトの名無しさん
2006/11/15(水) 15:55:520321デフォルトの名無しさん
2006/11/15(水) 16:30:370322大学生
2006/11/15(水) 22:26:24「問題17」πの値を実数として計算し表示せよ。
「問題18」eの値を小数点以下60桁まで求めよ。
「問題19」πの値を小数点以下60桁まで求めよ。
この問題16.17.18、19のC言語プログラム(C++)でお願いします。
それと多倍長少数を利用して作ってください。
0323デフォルトの名無しさん
2006/11/15(水) 22:28:34C/C++の宿題を片付けます 76代目
http://pc8.2ch.net/test/read.cgi/tech/1162771475/
0324デフォルトの名無しさん
2006/11/15(水) 23:49:40いろんなところでとりあえずこれでやってみれと書いてある
Win32コンソールアプリケーションで作ると追加できるソースファイルが*.cppです
とりあえずHelloWorld!は出たんですが
*.cファイルが追加できるように設定しといた方がいいんでしょうか?
0325デフォルトの名無しさん
2006/11/15(水) 23:57:590326デフォルトの名無しさん
2006/11/16(木) 00:15:230327327
2006/11/16(木) 03:22:17その書き換えかたがわかりません。教えていただけませんでしょうか><;
以下のように記述していまして、c(文字型)の部分に整数を入れたいんです。
while((c = fgetc(fp)) != EOF)
{
if(c == '特定の文字')
{
//ここがわかりません
}
}
0328デフォルトの名無しさん
2006/11/16(木) 03:36:04f = ftell();
fseek(fp, 0, SEEK_CUR);
fputc(c, fp);
つまり"r+"で開いたファイルは、fseek()すればそのすぐ次には書いてもよい。
一度でも書いたらまたfseek()もしくはrewind()しないと読めない。
0329デフォルトの名無しさん
2006/11/16(木) 03:37:18{
if(c == '特定の文字')
{
c = 15; //任意の整数
}
}
0330デフォルトの名無しさん
2006/11/16(木) 03:38:590331デフォルトの名無しさん
2006/11/16(木) 03:45:48おまえ日本語読めないのか?
>>327はそんなこと望んでないぞ。
>>329が正解だろ。
0332デフォルトの名無しさん
2006/11/16(木) 03:54:540333327
2006/11/16(木) 05:13:55>>329さん
>>331さん
ありがとうございました。助かります。
すいません打ち間違ってしまったようで、
332の方のエスパー読みが実はこちらの言いたかったことなんです。
とすると、328の方のおっしゃったfseekを使えばいいんですか?
とりあえず使い方を調べて試してみます。
0334327
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) ;
}
}
0335デフォルトの名無しさん
2006/11/16(木) 05:37:35多分ファイルのオープンモードが"r"になってるんだと思うよ。
"r+"にしてね。
0336327
2006/11/16(木) 05:43:09ありがとうございます。
モードは大丈夫みたいです。
他の文法や使い方は問題ないですか??
0337デフォルトの名無しさん
2006/11/16(木) 05:43:43fgetc(fp)で既にファイルポインタが一つ進んでいるので
fseek(fp, -1, SEEK_CUR);
fputc('s', fp);
fseek(fp, 0, SEEK_CUR);
だな
0338デフォルトの名無しさん
2006/11/16(木) 05:45:44EOFを表せないから
0339デフォルトの名無しさん
2006/11/16(木) 05:47:49後は他の人に任せた
0340327
2006/11/16(木) 05:53:27ありがとうございます。
確認したんですがモードは大丈夫なようです。
前後は以下のようになってますが、
関数の使い方や文法に間違いはありませんか??
もしかすると最初に見つけた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) ;
0341327
2006/11/16(木) 06:00:43ありがとうございました。
337を参考に変えてみたんですが、それでも変わりませんでした・・・。
改行したくないのでfprintfを使ってるのが問題なのかもしれません。
cは整数以外も読み込むのでcharでないとエラーになってしまうと
思います・・・。
遅くまでありがとうございました。頑張ってみます。
0342デフォルトの名無しさん
2006/11/16(木) 09:09:46fgetc()の戻り値はcharで表せないEOFも返す必要から、intになっている。
従って、cはintであることが望ましい。
#つーか、charで受けるのは間違い。
それと、最初のfseek()は1バイト戻せと既に指摘されているのだがそっちは無視か?
0343デフォルトの名無しさん
2006/11/16(木) 13:18:350344デフォルトの名無しさん
2006/11/16(木) 13:32:420345327
2006/11/16(木) 13:49:39ありがとうございます。
fseekの-1は参考にさせてもらいました。
書き込みのタイミングがかぶってしまったようです。
おっしゃるとおりcharが落とし穴だったようで、
intにしたらうまくできました!
文字はcharというド素人の固定概念が間違ってました・・・><;
これを多少応用したものを作らなければならないので、
まだ安心はできませんが、なんとかなりそうです。
助かりました。ありがとうございましたm(__)m
0346デフォルトの名無しさん
2006/11/16(木) 14:25:08どのようにすればよいのでしょうか?
windowsのマシンでCを使い
linuxのサーバにデータを送るという感じです
0347デフォルトの名無しさん
2006/11/16(木) 14:35:59サーバとクライアント用の二つのプログラムを用意する
(来週につづく...)
0348デフォルトの名無しさん
2006/11/16(木) 14:38:13そのサーバって何?http? ftp? samba?
そのプロトコルに従って通信してください。
0349346
2006/11/16(木) 14:38:530350デフォルトの名無しさん
2006/11/16(木) 14:45:090351デフォルトの名無しさん
2006/11/16(木) 14:49:21PHPってことはHTTPだろ。Winsockでも使ってやれ。
0352346
2006/11/16(木) 14:54:09そうですねhttpです
クライアント用のほうは事情があって
Cで書かなきゃならないので・・・
Winesockですか調べてみます
これはCの中でできるんですよね?
0353デフォルトの名無しさん
2006/11/16(木) 14:57:33VC++, gcc, bccなどWin32APIが呼べる環境ならできる。
これ以上の話はCとは関係ないのでスレ違い。
0354デフォルトの名無しさん
2006/11/16(木) 16:22:030355デフォルトの名無しさん
2006/11/16(木) 18:33:090356デフォルトの名無しさん
2006/11/16(木) 19:14:08おまえのものはおれのもの
0357デフォルトの名無しさん
2006/11/16(木) 20:04:59よお、じゃいあん
0358デフォルトの名無しさん
2006/11/16(木) 20:51:49悪いけど、今日は歌いたい気分じゃない・・・
0359デフォルトの名無しさん
2006/11/16(木) 21:17:08構わないようなケースにはどのようなのがあるでしょうか。
0360デフォルトの名無しさん
2006/11/16(木) 21:22:400361わからないので教えてください
2006/11/16(木) 21:46:32ぜひ、よろしくお願いします・・・
問題
配列su(要素数:12)に任意の数値をランダムに初期値設定し、逐次決定法によって
整列(昇順)させ、結果を表示させるプログラムを作成してください。
0362デフォルトの名無しさん
2006/11/16(木) 21:54:260363デフォルトの名無しさん
2006/11/16(木) 22:03:070364デフォルトの名無しさん
2006/11/16(木) 22:05:560365デフォルトの名無しさん
2006/11/16(木) 23:08:41逐次決定法が何か知らんが昇順ソートでおk?
0366デフォルトの名無しさん
2006/11/16(木) 23:19:29宜しければ一度で良いので拝見して頂きたいです
当企画の成立には貴方の力が必要です
次世代コミュニティ製作 C++,mod_perl,P2Pが使えるコーダ、グラフィッカ募集中
http://pc8.2ch.net/test/read.cgi/tech/1163349367/
0367デフォルトの名無しさん
2006/11/16(木) 23:20:33おいいい加減にしろよ。あちこちのスレにコピペしやがって。
削除依頼出すぞ
0368STUDENT
2006/11/16(木) 23:29:36「問題19」πの値を小数点以下60桁まで求めよ。
のCプログラム(C++)を作ってください。
多倍長少数を利用してプログラムを作ってください。
0369デフォルトの名無しさん
2006/11/16(木) 23:44:45おいいい加減にしろよ。あちこちのスレにコピペしやがって。
削除依頼出すぞ
0370デフォルトの名無しさん
2006/11/17(金) 00:06:05作るのはかまわんが、お前にはやらん。
0371デフォルトの名無しさん
2006/11/17(金) 00:12:110372デフォルトの名無しさん
2006/11/17(金) 16:26:48printf("3.141592653589793238462643383279502884197169399375105820974944");
0373デフォルトの名無しさん
2006/11/17(金) 18:18:03{
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;
}
上記のように可変個引数を取得しようとしているのですが、
引数の型が複数あり、うまく引数が取得できません。
なにかいい方法ありませんか?
0374デフォルトの名無しさん
2006/11/17(金) 18:19:490375デフォルトの名無しさん
2006/11/17(金) 18:30:07蛇足だが、vprintf/vscanfのようにva_listを引数にとるものも作れ。
0376デフォルトの名無しさん
2006/11/17(金) 19:30:12int 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);
こいつで実行してもエラーで強制終了するんですけど何故ですか?}
0377デフォルトの名無しさん
2006/11/17(金) 19:33:07scanf("%d",array[count]);
引数はアドレスです
scanf("%d",&array[count]);
0378デフォルトの名無しさん
2006/11/17(金) 19:33:17}がなくね?
0379デフォルトの名無しさん
2006/11/17(金) 19:36:46>こいつで実行してもエラーで強制終了するんですけど何故ですか?}
この文の最後にあるw
0380デフォルトの名無しさん
2006/11/17(金) 19:37:39見えてなかったorz
0381デフォルトの名無しさん
2006/11/17(金) 19:47:13それでできましたどうもです
0382デフォルトの名無しさん
2006/11/17(金) 20:21:41ちょっとワロタ
0383デフォルトの名無しさん
2006/11/17(金) 22:30:56クッキー形式の日付をtime_t値に変換する関数とかあれば教えて下さい。
0384383
2006/11/17(金) 22:39:410385デフォルトの名無しさん
2006/11/17(金) 23:31:22自分で変換する関数作れ
0386デフォルトの名無しさん
2006/11/18(土) 00:21:01つ[popen("date -d 'Friday, 01-Jan-2007 00:00:00 GMT'", "r")]
0387デフォルトの名無しさん
2006/11/18(土) 00:23:10date -d 'Friday, 01-Jan-2007 00:00:00 GMT' +%s
0388デフォルトの名無しさん
2006/11/18(土) 01:23:06#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つが違ってしまう原理自体は理解出来ているつもりなのですが、何かいい方法は
ないでしょうか?スマートな方法を思いつかなくて困っています。
0389デフォルトの名無しさん
2006/11/18(土) 01:27:39C++なら
template <int N>
void fun(int (&x)[N})
と宣言すれば
s=sizeof(x)/sizeof(x[0]);
が使えるが、Cでは配列は必ずポインタに変換されてしまうため
配列の大きさに関する情報は失われてしまう。
通常
void fun(int *x, int n)
と、別のパラメータで大きさを渡す。
0390388
2006/11/18(土) 01:33:36深夜にありがとうございます。
やっぱりパラメータで渡すしかありませんか。引数が増えていくとどんどん
コードが不細工になってくるんで、もう泣きそうで……
ってかC++だったらそんなこと出来るんだ。この際、C++のお勉強しようかな。
0391デフォルトの名無しさん
2006/11/18(土) 01:36:21設計を変えて構造体を使えば?
もしくは番兵を使う手もある。(最後の要素を示す記号として-1を使うとか)
0392388
2006/11/18(土) 01:40:46複素数演算を作ったことがあるんで、上手くやればいけるかも知れませんね。
簡単化のためにintで書いたんですが、実際はdouble型でインパルス応答なんかの
数値を入れようと思っています。なので、番兵に数値が入るとまずくって…
構造体でポインタと要素数を抱き合わせておくっていうのが、よさそうですね。
0393デフォルトの名無しさん
2006/11/18(土) 02:01:19或いは、正規化できる前提で-0を使うとか。
0394デフォルトの名無しさん
2006/11/18(土) 03:11:01printf("%s\n", count % 2 ? "****" : "++++++++");
てやつがあったんですがこれは
count % 2 で1の時に真を返すってことでいいんですか?
0395デフォルトの名無しさん
2006/11/18(土) 03:38:230396デフォルトの名無しさん
2006/11/18(土) 03:55:35俺用語に訳すと「count%2で云々」になるんだと思う。
あと、ゆとり世代で日本語が苦手なので
本の名前なんか正確に書かなくても、読み手は推測してくれるし
文章に読点なんか無くても、読み手が理解するよう努力してくれるものだと思ってる
はず。
0397デフォルトの名無しさん
2006/11/18(土) 04:04:30わかりました、ありがとう!
もう消えていいよ!
0398デフォルトの名無しさん
2006/11/18(土) 05:59:24人の忠告は素直に聞くようにしたほうがいいよ。
自分にとって不愉快な書き方だからってそんな反応をしているようじゃ、
次に書き込むときも似たようなことをして、似たような反応をされるはず。
0399デフォルトの名無しさん
2006/11/18(土) 07:55:530400デフォルトの名無しさん
2006/11/18(土) 10:40:12下手にでる事も出来ない奴って・・・出世できねーぞwwwww
0401デフォルトの名無しさん
2006/11/18(土) 10:54:29木津着いた・・・
0402デフォルトの名無しさん
2006/11/18(土) 11:42:040403デフォルトの名無しさん
2006/11/18(土) 12:42:39コンパイルして正常に動作する感じですが、提出物なので皆さんもレビューしてくださいませんか?
#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);
}
0404デフォルトの名無しさん
2006/11/18(土) 12:55:150405デフォルトの名無しさん
2006/11/18(土) 13:07:43関数で「*strcpy」とかについている「*」の意味ってなんですか?
ポインタ?
0406デフォルトの名無しさん
2006/11/18(土) 13:10:35ポインタ。
0407デフォルトの名無しさん
2006/11/18(土) 13:13:28{を行末に付けるの止めれ。ブロックが見にくい
scanfに&が無い
scanfだと50文字以上入力されてもわからない
for (; owari >= 2 ; owari-- ) → for (; owari >1 ; owari-- )
逐次ソート結果出力はイラネ。
0408デフォルトの名無しさん
2006/11/18(土) 13:15:08* は希望の光
両者は同じであり、異なる。
0409デフォルトの名無しさん
2006/11/18(土) 13:17:28>{を行末に付けるの止めれ。ブロックが見にくい
フリーフォーマット(感想はチラシの裏に)
>scanfに&が無い
配列なのに必要?
>逐次ソート結果出力はイラネ。
「正常に動作」の定義は?
0410デフォルトの名無しさん
2006/11/18(土) 13:17:460411デフォルトの名無しさん
2006/11/18(土) 13:18:54変数名の変更(変数間の関係が分かりやすいように)
moji → mojiretu
owari → mojiretu_len
標準関数を使う
mojiretu_len=strlen(mojiretu);
ループ用変数は別に用意する(文字列の長さを示す変数を変更しない)
0412405
2006/11/18(土) 13:19:470413もんた
2006/11/18(土) 14:41:30プログラムが終了するようにはどうしたらできますか?
0414デフォルトの名無しさん
2006/11/18(土) 14:46:23if (strcmp(str, "EXIT") == 0) exit(0);
0415もんた
2006/11/18(土) 14:50:36宣言は何がいりますか?
0416デフォルトの名無しさん
2006/11/18(土) 14:51:26exitで終わらせたいコードを載せたほうが早いよ。
0417もんた
2006/11/18(土) 14:54:16for (i = x = y =n_y= 0; s[i]; i++){
printf("%s\n", s);
if (!(p = strchr(r, s[i]))) {
break ; }
この部分でfscanでEXITが入ると終了したいんですが。
0418もんた
2006/11/18(土) 15:00:580419デフォルトの名無しさん
2006/11/18(土) 15:02:04while (scanf("%s", s) == 1) {
if (strcmp(s, "EXIT") == 0) exit(0);
scanf()の次の行に入れればいいかな。
ファイルの先頭あたりに、
#include <stdlib.h>
#include <string.h>
という行がなかったら追加する。
0420もんた
2006/11/18(土) 15:10:12if (!(p = strchr(r, s[i]))) {
の行で、
コンパイラに、おそらく不正な代入関数(main)とでるのですが。
何か分かりますか?
0421デフォルトの名無しさん
2006/11/18(土) 15:12:39p = strchr(r, s[i])
これが代入になってるため
コンパイラは本本当は == 何じゃね?と勘違いしてメッセージをだす
むしすればおk
0422デフォルトの名無しさん
2006/11/18(土) 15:14:21p = strchr(r, s[i]);
if (!p) {
コンパイラのオプションを調べて、その警告をでなくするか。
0423もんた
2006/11/18(土) 15:15:10わかりました。ありがとうございました。
0425デフォルトの名無しさん
2006/11/18(土) 15:42:35代入をカッコでくくって、!してる式でも警告がでるなら、それでも出るんじゃないの?
0426デフォルトの名無しさん
2006/11/18(土) 15:59:31いや ( (p = strchr(r, s[i])) == 0 ) はたぶんだが式中に比較演算子があるのでコンパイラは「比較している」と認識する
(!(p = strchr(r, s[i])) だと代入演算と論理演算しかないため式中で比較していないと認識するのではないかと思う
0427デフォルトの名無しさん
2006/11/18(土) 18:17:10#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までの素数検索プログラムなんですけど実行結果が変です。どこかおかしいところありますか?
0428デフォルトの名無しさん
2006/11/18(土) 18:20:16defineがおかしくね?
0430デフォルトの名無しさん
2006/11/18(土) 18:28:46ここがおかしかった自己解決
どうもすいませんでした
0431デフォルトの名無しさん
2006/11/18(土) 19:51:46#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
ってなる・・・どうすればいいのでしょう?アドレスを習ったばかりでアドレスを使って交換
する方法を考えています。
0432デフォルトの名無しさん
2006/11/18(土) 19:55:11頭を柔らかくして考えてみな
a = *bp;このときaのアドレスにbpの中身つまり'B'が代入された
そしてb = *ap;この時ののapはaのアドレスを示している
aのアドレスに入っているのは'B'
もうOKか?
0433デフォルトの名無しさん
2006/11/18(土) 20:09:11おおお!ななななななるほど!
普通の変数wkみたいには行かないってことかぁ・・・
もっとよく考えて見ます。ありがとう御座います。
0434デフォルトの名無しさん
2006/11/18(土) 20:23:07普通の変数でも同じ。
char a='A',b='B';
a=b;
b=a;
だと交換できないよ。
0435デフォルトの名無しさん
2006/11/18(土) 22:01:120436デフォルトの名無しさん
2006/11/18(土) 22:10:56こんなエラーが出たんですけど、わけわかりません・・・
0437デフォルトの名無しさん
2006/11/18(土) 22:13:24ポインタとintを比較してますよ。
0438デフォルトの名無しさん
2006/11/18(土) 22:27:09いいえ。ポインタと整数を比較しているんです。
0439デフォルトの名無しさん
2006/11/18(土) 22:34:15かぁ〜もうめんどくせ〜
違う方法でやるか・・・
0440デフォルトの名無しさん
2006/11/18(土) 22:52:05何を比較したいの?
キャストすれば?
0441デフォルトの名無しさん
2006/11/18(土) 23:43:51その行くらい晒せばいいんじゃね
0442デフォルトの名無しさん
2006/11/19(日) 00:56:47P74に書いてあるサンプルプログラムを本の通り書いたのですが
エラー 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);}
-------------------------------------------------------------------
どこをどう直せばいいですか?
スレ違いでしたらごめんなさい。
0443デフォルトの名無しさん
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;}
///ここまで
0444デフォルトの名無しさん
2006/11/19(日) 01:14:00ありがとうございます。
無事動きましたが一体どこが悪かったんでしょうか?
C言語のコマンドは大文字・小文字で全く違う意味になると考えればいいですか?
0445443
2006/11/19(日) 01:20:39changewindowmode と 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などが付かない。
0446443
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()のカッコ内が変わると、表示される位置がズレルのも注目。
0447デフォルトの名無しさん
2006/11/19(日) 01:50:14掴めませんでした、不向きでしょうか?
0448デフォルトの名無しさん
2006/11/19(日) 02:08:00printf("%*s%s\n",horse_pos[r],"",horse[r]);
とあったのですが、,horse_pos[r],"",horse[r]);
の部分の,""の意味が分かりません
どなたか教えていただけませんか?
0449デフォルトの名無しさん
2006/11/19(日) 03:18:17だったら分かるんか?
0450デフォルトの名無しさん
2006/11/19(日) 04:09:06イメージが掴めたならその内なんとかなるよ。
あとは、コードを読んで分析理解して、
コードを書いて試行錯誤していけばいい。
0451デフォルトの名無しさん
2006/11/19(日) 04:51:39そういわれると、嬉しいです。
中には掴めない方もいるでしょうか?
0452デフォルトの名無しさん
2006/11/19(日) 06:35:52間違ったイメージであることも多い。
自分で書いて適当な場所で他人にレビューしてもらうことを勧める
最初は けなされると思うが。
0453static
2006/11/19(日) 07:27:22static修飾子について質問させてください。
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; // これもいけないらしい
}
0454デフォルトの名無しさん
2006/11/19(日) 08:06:29【初心者歓迎】C/C++室 Ver.32【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1160893851/
0455πr^2
2006/11/19(日) 11:16:01などとなっているchar[]のポインタをリターンする関数はどう宣言すればいいのでしょうか。
0456デフォルトの名無しさん
2006/11/19(日) 11:18:02{
static const char * const static_strings[] = {"string1", "string2",};
return static_strings;
}
0457πr^2
2006/11/19(日) 11:40:13char ** 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() )
というエラーがでました
0458デフォルトの名無しさん
2006/11/19(日) 11:52:54const char * const * foo() // 以下略
0459πr^2
2006/11/19(日) 13:06:06const char * const foo()でできました!
ところで、char* str[];とし、str[]の配列の数を決めるときはどのようにするのでしょうか。
char *str[] = new char*[20];としても、
'char * *' 型は 'char *[]' 型に変換できない
とエラーがでてきてしまいます。
0460デフォルトの名無しさん
2006/11/19(日) 13:10:33数を別に渡すしかない。
0461デフォルトの名無しさん
2006/11/19(日) 13:43:59#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になってしまいます
ボスケテください
0462デフォルトの名無しさん
2006/11/19(日) 13:56:27#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;
}
0463デフォルトの名無しさん
2006/11/19(日) 14:00:54実行してみたのですが、答えがNaNと表示されました・・・
0464デフォルトの名無しさん
2006/11/19(日) 14:01:24↑
0465463
2006/11/19(日) 14:03:29計算されてました
でも、答えがマイナスになる場合だとNaNとでるのですが、
マイナスの答えまできっちり表示させる方法ってありますか?
0466デフォルトの名無しさん
2006/11/19(日) 14:05:500467デフォルトの名無しさん
2006/11/19(日) 14:09:29ていうか>>461は(b*b-4*a*c)のところの計算の順序はこれでいいの?
0468デフォルトの名無しさん
2006/11/19(日) 14:10:20晒し
0470デフォルトの名無しさん
2006/11/19(日) 14:11:41正直キャストが面倒くさい
0471461
2006/11/19(日) 14:14:03>>467
なるほど、そういうやり方あったんですね、気づきませんでしたorz
式はあってると思います・・・・・思います・・・
0472デフォルトの名無しさん
2006/11/19(日) 14:19:54おいおい、
虚数を扱えるライブラリを紹介しろとか
そういうのじゃないのか。
0474デフォルトの名無しさん
2006/11/19(日) 14:57:530475448
2006/11/19(日) 15:22:47超亀レス申し訳ありません
つまり、前の文字列と後ろの文字列の間のスペースということですか?
これを無くして書くことはできないのでしょうか?
0476デフォルトの名無しさん
2006/11/19(日) 15:27:15>448のprintf()なら、これと等価だろ。
printf("%s\n",horse_pos[r] + strlen(horse[r]),horse[r]);
要は、文字列をずらすために空白文字で調整したいのだろうから。
0478デフォルトの名無しさん
2006/11/19(日) 16:47:09使用配列とポインタ変数
int suchi[5];
int *saidai,*saisyou;
ポインタ変数とかポインタとかよく分かんないorz
このプログラムはどう書けばいいのでしょうか?
0479デフォルトの名無しさん
2006/11/19(日) 16:52:26C/C++の宿題を片付けます 76代目
http://pc8.2ch.net/test/read.cgi/tech/1162771475/
0480448
2006/11/19(日) 16:57:14printf("%s\n",horse_pos[r] + strlen(horse[r]),horse[r]);
て%s%sじゃなくていいんですか?
0481デフォルトの名無しさん
2006/11/19(日) 16:58:220483デフォルトの名無しさん
2006/11/20(月) 00:58:40sqrt()する数値をabs(b*b-4*a*c)
にして、
abs(b*b-4*a*c)!=b*b-4*a*c
だったらb*b-4*a*cは負の数になってるので、
答えの最後に「i」を表示すれば一応ソレらしきものにはなるのでは
0484デフォルトの名無しさん
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のようなフィールド幅指定は問題ありませんでした
0485デフォルトの名無しさん
2006/11/20(月) 02:16:490486484
2006/11/20(月) 02:25:02すみません、初歩的なミス過ぎますね・・・
夜更けにどうもありがとうございました
0487デフォルトの名無しさん
2006/11/20(月) 05:21:50とはどう言う意味でしょうか?
あと
for(;;)と言うのも参考書に載っていますが
意味がわかりませんので
これら二つの、ご助言を宜しくお願い致します。
こちらのスレで質問するのが正しいと思いました
マルチではありません。
0488デフォルトの名無しさん
2006/11/20(月) 06:23:54質問を撤回してない
マルチ氏ね
0489デフォルトの名無しさん
2006/11/20(月) 06:46:080490デフォルトの名無しさん
2006/11/20(月) 15:31:07#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;
}
0491デフォルトの名無しさん
2006/11/20(月) 15:33:48free(z)だけでは足りない。
free(z[0][0]);
free(z[0]);
free(z);
0492デフォルトの名無しさん
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;
}
0493デフォルトの名無しさん
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));
とやってからにしろ。
0494デフォルトの名無しさん
2006/11/20(月) 21:45:35Cでも作ることはできるのでしょうか?
0495デフォルトの名無しさん
2006/11/20(月) 21:49:35クロスコンパイラ持ってれば出来るんじゃね?
0496デフォルトの名無しさん
2006/11/20(月) 22:26:22やっぱりプロトタイプ宣言はすべきなのですか?
これは、一番上にmain関数をもって行けば早い話であって、
関数を変えた時にプロトタイプ宣言を変え忘れて、
コンパイラが通らないと言う事も起きたりするので
別に必要ないんじゃ無いかと思ったりしてるからです。
0497デフォルトの名無しさん
2006/11/20(月) 22:34:33そのうちソースとヘッダを分けることを覚えたら、自然と気にならなくなるだろうし。
0498デフォルトの名無しさん
2006/11/21(火) 00:58:36リアルタイムにキー操作を取るにはどうすればいいんでしょうか。
scanfなどでは入力待ち状態になってしまいますし・・
0499デフォルトの名無しさん
2006/11/21(火) 01:00:05kbhit
getch
で調べてみれば?
0500デフォルトの名無しさん
2006/11/21(火) 01:04:06正直、Windowsで作ってるなら、ライブラリを使ったGUI方がはるかに楽だよ。
コンソールは面倒。
たぶん、Win以外もライブラリ使用のほうがらくだと思う。
0501デフォルトの名無しさん
2006/11/21(火) 01:08:13それを乗り越えれば、楽だろうけど。
0502デフォルトの名無しさん
2006/11/21(火) 01:10:34#include<stdio.h>
#include<conio.h>
intmain(void){
intmoji='-';
while(1){
if(kbhit())moji=getch();
printf("\r%c [%3d]", moji, moji);
}
return 0;
}
0503デフォルトの名無しさん
2006/11/21(火) 01:12:452chからリンクするのは気が引けるが
初心者からそこそこの上級者までお勧めできる。
(ただ、なんでもかんでもintが活躍するので、少し危険性も高いが)
0504デフォルトの名無しさん
2006/11/21(火) 01:20:00if(kbhit()){
switch(getch()){
case 75: //キー入力は左カーソル
printf("left");
break;
case 77: //キー入力は右カーソル
printf("right");
break;
case 32://キー入力はスペース
printf("space");
break;
}
}
という感じで出来ました。
コードも載せていただきありがとうございます。
Dxlibも調べてみますね。
0505デフォルトの名無しさん
2006/11/21(火) 01:25:08カーソルキーは一回押すと二つコードが送られるよ
自分で試して確認しな
0506デフォルトの名無しさん
2006/11/21(火) 01:35:14それらのペアを配列を使って読んで、
それぞれの四則演算を別のファイルに書き出しなさい。
5.0 3.0
2.5 1.0
4.0 1.5
って課題が授業で出てサッパリわかんなくて困ってるんですが、
どなたか助けていただけないでしょうか?
0507デフォルトの名無しさん
2006/11/21(火) 01:36:14>>1
0509デフォルトの名無しさん
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が初期化されていないとコンパイラが警告してきます。
0510それで判らなきゃ大抵間抜けだ
2006/11/21(火) 11:24:35下請け関数を先に定義するかプロトタイプ宣言をするかしないとコンパイラが型チェックをしてくれない典型。
先ずはそこからやって味噌。
0511デフォルトの名無しさん
2006/11/21(火) 12:27:27BOOL CreateX01(LPX01 target) を
BOOL CreateX01(LPX01 *target)とかにしないと作ったやつを返せナインぢゃないですか?
0512デフォルトの名無しさん
2006/11/21(火) 12:46:25LPX01がポインタ型だから、それは問題ない。
> 単に、入れるとx01が初期化されていないとコンパイラが警告してきます。
挙げてあるコード片はそんな警告が出るようには見えないけどな。
完全なソースを挙げるべし。
0513512
2006/11/21(火) 12:48:03>>511のようにするか、CreateX01()の戻り値をLPX01にするかですね。
0514デフォルトの名無しさん
2006/11/21(火) 13:02:49>>512-513
ご回答ありがとうございます。
やっぱ、ポインタのポインタを渡さないといけないんですね。ありがとうございました。
typedefでつける銘銘なんですけど、構造体はtag[名前]、構造体へのポインタLP[名前]がWindowsAPIっぽくてかっこいいんですが、
ポインタのポインタは命名せずに*LPX01とかが一般的ですか?SDKのヘッダをLPでGREPしてみましたがそれっぽいのがないです
ポインタのポインタになってるやつはLPVOIDが多い気がしますがいろんな型がかえってくるからかなぁと想像しています
0515デフォルトの名無しさん
2006/11/21(火) 13:10:14Win32 APIみたいにポインタを「LPほげ」とすること自体が、一般的で
はないし、ダサい。
0516デフォルトの名無しさん
2006/11/21(火) 13:13:28かっこいいとおもっていたのでキツいです
かっこいいのはどんなかんじですか?例かかっこいいっぽいソースとか教えてもらえないですか。
0517デフォルトの名無しさん
2006/11/21(火) 13:21:59switch 文に変換不可能かを教えて欲しいです。
0518デフォルトの名無しさん
2006/11/21(火) 13:41:49ある型のポインタにわざわざ型名を割り当てるのは、ポインタであることを見失いやすく却って読み辛くなる。
素直にX01 ** fooで充分だ。
>>517
条件式が定数との一致以外のとき。
#つまり、switchにできる方が例外的。
0519デフォルトの名無しさん
2006/11/21(火) 13:59:05たとえば、
・条件が複数の変数を参照するとき
・条件が整数の定数ではないとき
・整数で分岐だけど、範囲が広過ぎるとき (i < 0 のような)
0520デフォルトの名無しさん
2006/11/21(火) 14:16:01case 0:
break;
default :
}
0521デフォルトの名無しさん
2006/11/21(火) 17:57:50なるほど。別名をつけるのがすでに間違いなんですね。
WindowsSDKではtypedefで構造体とポインタに別名をつけているのが決まりみたいだったんで、
当たり前だと思ってました。実はWindowsSDKがカッコ悪くて、悪い例だったんですね。レス、ありがとう。
0522デフォルトの名無しさん
2006/11/21(火) 18:05:14画面から入力した文字列を逆に表示するというのは
どうやったら表示できますか?
0523デフォルトの名無しさん
2006/11/21(火) 18:07:41どうやったらできますか?
0524デフォルトの名無しさん
2006/11/21(火) 18:08:38Eがヨになるって事?
0525デフォルトの名無しさん
2006/11/21(火) 18:47:37c言語でかなりの数の数値計算を行うソフトウェアに挑戦しています。
ただ、それを実行するとメモリのinactiveがドカーンとできてしまい、
プログラムが終了しても大きく確保されたままです。
メモリの動的な確保などはしていません。
これは私のプログラムにマズい部分があるのでしょうか?
それとも問題ないのでしょうか?
0526デフォルトの名無しさん
2006/11/21(火) 18:58:34Linuxか?
大丈夫、他の用途に使いたくなったらOSが勝手に回収する。
処で、malloc()などを使わないでどうやってメモリを確保しているんだ?
0527デフォルトの名無しさん
2006/11/21(火) 19:03:51こういう事?
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;
}
0528デフォルトの名無しさん
2006/11/21(火) 19:55:22勝手に回収すると聞いてちょっと安心です。
ありがとうございます。
環境は実はMac OSXです...(汗
ええっと。動的な確保自体をやっていないつもりなんです。
(答えになっているのかどうか不安ですが...すみません)
0529デフォルトの名無しさん
2006/11/21(火) 20:30:13・ライブラリが内部で動的確保をしている可能性
例:C標準関数のstrdup
2.巨大な静的又はグローバルな配列を宣言していないか
・スタートアップで静的領域に一気に確保される
0530デフォルトの名無しさん
2006/11/21(火) 20:38:220531デフォルトの名無しさん
2006/11/21(火) 20:48:43hogehoge \t hoge \n
と言う文字列(char配列)に"ABC"という文字列を加えて
hogehoge \t hoge \t ABC \n
としたいのですが,hogehoge,hogeの長さが任意のため
どこまでをコピーするのかで困っています.
どのように既述をすれば良いのでしょうか?
よろしくお願いします.
0532デフォルトの名無しさん
2006/11/21(火) 21:00:210534デフォルトの名無しさん
2006/11/21(火) 21:29:19やべ。まさしく2でした。
でっかいグローバルな構造体の配列がありやす
もっかい勉強し直してきます。
1についても初めて聞きました。勉強になりやした。
ありがとね。
0535デフォルトの名無しさん
2006/11/21(火) 21:49:28方法を教えてください。
char string = "ABCDE/FGHIJ";
として
文字列に'/'があったら、それ以降を削除したいのです。
s_point = strstr (string, "/");
*s_point = '\0';
で行けると思っていたのですが、コンパイルにはエラーは
ありませんが、実行するとエラーが出て止まってしまいます。
Borland Cコンパイラ(フリー版)とWin2000で、
DOSプロンプト上での実行です。
何か案がありましたら、よろしくお願いします。
0536デフォルトの名無しさん
2006/11/21(火) 21:54:04こうすればOK。
0537デフォルトの名無しさん
2006/11/21(火) 21:55:01char string[] = "ABCDE/FGHIJ";
0538デフォルトの名無しさん
2006/11/21(火) 21:55:19これじゃ駄目だから間違えるなよ。
たとえ上手く動いてるように見えても絶対駄目だからな。
0539デフォルトの名無しさん
2006/11/21(火) 21:55:450540デフォルトの名無しさん
2006/11/21(火) 21:56:59ごめんなさい。
その部分は書き込みが間違えていて、ちゃんと
char string[] = {"ABCDE/FGHIJ"}; にしていました。
0541デフォルトの名無しさん
2006/11/21(火) 21:57:06どっちが正しいの?
0542535
2006/11/21(火) 21:58:27○ char string[] = "ABCDE/FGHIJ";
何度もすみません。
0543デフォルトの名無しさん
2006/11/21(火) 22:00:54上のが正しいだろ。常識的に考えて。
0544デフォルトの名無しさん
2006/11/21(火) 22:12:15char a[] = {'a','b','c','\0'};
char b[] = "abc";
printf("%s\n%s\n", a, b);
0545デフォルトの名無しさん
2006/11/21(火) 22:12:56その前後のコードも晒してよ。
それだけじゃ特定できん。
0546デフォルトの名無しさん
2006/11/21(火) 22:16:02#include <string>
int main(void)
{
char s[] = "abcde/fghij";
char *p = strstr(s, "/");
*p = '\0';
printf("%s\n", s);
return 0;
}
0547デフォルトの名無しさん
2006/11/21(火) 22:23:24お前は何を言っているんだ。
0548535
2006/11/21(火) 22:25:08問題は別のところにありました。
strstrで検索したときに、検索文字列のひとつに
"/"がなくNULLを返していたのが原因でした。
ifとかを付けずに *s_point = '\0'; としてしまい、
そこでエラーを起こしていました。
お騒がせして申し訳ありませんでした。
0549デフォルトの名無しさん
2006/11/21(火) 22:28:05あんたは何を言ってるの?
0550デフォルトの名無しさん
2006/11/21(火) 22:28:09char b[] = {"abc"};
printf("%s\n%s\n", a, b);
0551ぴゅあ
2006/11/21(火) 22:32:29>>535
>エラーが出て
というのがエラーメッセージが出ているのなら
それを示した方が良かったかもですね
0552デフォルトの名無しさん
2006/11/21(火) 22:41:07質問者は
"ABCDE/FGHIJ"
これの/以降を削除したいと言っている
コンパイルの段階で分割してどうするね・・・
0553デフォルトの名無しさん
2006/11/21(火) 22:48:41ttp://www.konaken.com/blog/milco.jpg
0554ぴゅあ
2006/11/21(火) 22:51:42あぁ 構文ではなくて"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"};
とかなら。。。
0555ぴゅあ
2006/11/21(火) 22:53:27或いはchar *[]か
0556デフォルトの名無しさん
2006/11/21(火) 22:57:30いる。
0557デフォルトの名無しさん
2006/11/21(火) 22:59:260558デフォルトの名無しさん
2006/11/21(火) 23:01:20× 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);
0560ぴゅあ
2006/11/21(火) 23:05:55"ABC"はchar配列として扱うから
付けない方が一般的だと思いますよ
>キメー
の意味は判らないけど…
0561デフォルトの名無しさん
2006/11/21(火) 23:08:52客観的に考えて。
0563ぴゅあ
2006/11/21(火) 23:13:17>>542
上のが正しいだろ。常識的に考えて。
上のが正しいだろ。常識的に考えて。
上のが正しいだろ。常識的に考えて。
上のが正しいだろ。常識的に考えて。
ttp://www.konaken.com/blog/milco.jpg
0564ぴゅあ
2006/11/21(火) 23:13:40コンパイラが要素数1の配列として誤解しないか
ちょっと気になりました
(コード読む側も間違えないのかな?)
ついでがあったら確認してみよ。。。
0565デフォルトの名無しさん
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を作ってもコンパイルできません。
どうか回答よろしくお願いします。
0566デフォルトの名無しさん
2006/11/21(火) 23:49:070567デフォルトの名無しさん
2006/11/21(火) 23:51:13char c, d, e;
c = 1;
d = 100;
e = 25;
0568デフォルトの名無しさん
2006/11/21(火) 23:51:490569デフォルトの名無しさん
2006/11/22(水) 00:56:35言いたいことはいろいろあるが、とりあえず。
Pとは何だ?
その先生とやらが教えてくれたのか、君が勝手に言い出したかは知らないが、
そんな言葉は一般的に通じない。
人に質問するときは相手に分かるように話せ。
0570デフォルトの名無しさん
2006/11/22(水) 00:57:38Num2 = 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)という数字が無限ループしてしまいます.
指摘してくださる方いましたらよろしくお願いします.
0571デフォルトの名無しさん
2006/11/22(水) 01:03:46ループ内でNum10を書き換えたらきちんとループできないだろ。
プログラムの是非は問わないことにする。
0572デフォルトの名無しさん
2006/11/22(水) 01:14:57for(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);
}
こういうことがやりたいの?
0573デフォルトの名無しさん
2006/11/22(水) 01:15:34while開始前に,Num10の内容を別の変数aに代入し
プログラムを実行させたところ無限ループはなくなりました.
2進数変換は正しく出来ていなかったので考えてみることにします.
ありがとうございました.
0574デフォルトの名無しさん
2006/11/22(水) 01:19:32iとNum2をfor文の外で初期化していたため,10進数の2以上がおかしい値となっていました。
ありがとうございます.
0575ぴゅあ
2006/11/22(水) 01:34:05折角、できたということなので
後で改めて考えてみるとかでいいと思いますけど
2進や8進とかにするというのは文字/文字列にすることを
考えてみるのもいいかも
(8進,16進はわざわざロジックを組まなくてもできたりですけど)
若干コードは面倒臭くなるかもですけどね
8/10/16進も敢えてやってみておいてもいいかも
0576574
2006/11/22(水) 02:00:46文字/文字列とはどういうことでしょうか?
8,16進はprintf内で出来るので敬遠していました.
今は勉強を始めたばかりですので,敬遠せず色々とやってみたいと思います.
0577ぴゅあ
2006/11/22(水) 07:48:26>文字/文字列とはどういうことでしょうか?
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)として扱えるように置き換えているから
桁数に限界がでてきたりするでしょ?)
0578デフォルトの名無しさん
2006/11/22(水) 07:52:170579ぴゅあ
2006/11/22(水) 07:54:19その辺りも勉強するまで置いといて
後でゆっくりやってみるのがいいと思います
0580ぴゅあ
2006/11/22(水) 07:56:21文字列の中から1文字取り出したcharの値が文字コード
後は文字コード表と見比べれば
0581ぴゅあ
2006/11/22(水) 08:41:24(>>577繋がりかと思ってしまいました。。。)
0582デフォルトの名無しさん
2006/11/22(水) 09:15:22えっとファイルから読み込むんですが
そのファイルがEUCであったりSJISであったりUTF-8(だったかな)
であったりするわけです。
そのファイルを処理して別のファイルにまとめたりするのですが
SJISかEUCのどちらかに統一したいんです。
他の言語だともう関数があったりしてそれ利用してたもんで
Cではどうやるのかなぁと
自作するしかないんでしょうか?
0583デフォルトの名無しさん
2006/11/22(水) 09:17:170584ぴゅあ
2006/11/22(水) 09:45:15やはりそうでしたか
タイミング良過ぎ…って感じで勘違いしてしまいました
使うまでに至ったことはないですけど
gccでだったりするとlibiconvとかも使える筈と思います
(glibcのiconvだとオリジナルでは未対応になるのかな?)
0585デフォルトの名無しさん
2006/11/22(水) 10:56:37流れ大きく戻してごめんなさい
>char *string = "ABCDE/FGHIJ";
>これじゃ駄目だから間違えるなよ。
>たとえ上手く動いてるように見えても絶対駄目だからな。
なんでだめなんですか?
char string[]
ぢゃなくて
char *string
をいっつもつかってます
読みにくいからとかですか?
0586デフォルトの名無しさん
2006/11/22(水) 11:05:36(組み込み系なら、ROMに確保される可能性大)
そのどっかが、データ書き換え可能な領域にあるという保証は出来ない。
配列で確保していれば、書き換え可能な領域に確保されている。
0587デフォルトの名無しさん
2006/11/22(水) 11:14:580588デフォルトの名無しさん
2006/11/22(水) 11:17:23文字列を確保するのは"ABCDE/FGHIJ"でそれをあつかうためのポインタをいれるのが=で
ポインタを入れる先がchar[]か、char*のちがいだけではない?ということ?
0589デフォルトの名無しさん
2006/11/22(水) 11:21:08そういうこと。
確保される領域が、可変領域保証かそうでないかの違いがある。
0590ぴゅあ
2006/11/22(水) 11:36:09敢えて補足するまでもないと思いますけど
char *string = "ABCDE/FGHIJ";
のように書いている場合には"ABCDE/FGHIJ"の中を書き換えるような操作をしてはならない
ポインタ変数stringに代入されているものが他でchar[11+1]とかで取っている領域のポインタであるとか
mallocで確保された領域とかであれば
その領域内を書き換えることは可
char string[] = "ABCDE/FGHIJ";
は領域を確保してその中に"ABCDE/FGHIJ"を入れているので書き換え可
("ABCDE/FGHIJ"自身を書き換えているのではなくstring[11+1]の領域の中を触るから)
ということです
0591デフォルトの名無しさん
2006/11/22(水) 11:50:33B b;
} A;
typedef struct {
A a;
} B;
のように相互に型を使う構造体はどうやって定義すればいいんでしょうか。
Aを先に書けばBが定義されていないと言われ、逆にすればAが未定義と
怒られるのですが・・・。
0592デフォルトの名無しさん
2006/11/22(水) 11:51:12char *string = "ABCDE/FGHIJ";
の方が良いけどね。(コピー作る手間がかからないから)
でもその場合はベタ書きするとか
マクロ使うことの方が多いけど。
0593デフォルトの名無しさん
2006/11/22(水) 11:55:25それ流行ってるの?
0594586
2006/11/22(水) 12:02:54そうなのかぁ。ありがとう。
書き換え操作はだめなんですね。勉強になりました。
0595デフォルトの名無しさん
2006/11/22(水) 12:09:590596586
2006/11/22(水) 12:18:420597デフォルトの名無しさん
2006/11/22(水) 12:25:010598デフォルトの名無しさん
2006/11/22(水) 12:26:17(強引なキャストをしない限り)できませんよ。
0599デフォルトの名無しさん
2006/11/22(水) 12:29:36hoge = malloc(256);
wcscpy_s(hoge, 256, TEXT("a"));
hogeが指す先には"a"が入ります。コンパイラは警告してきていますけど。
この警告をはずすのが、強引なキャストという意味でしょうか。
0600デフォルトの名無しさん
2006/11/22(水) 12:52:46警告が出るってことは無理してるってことだ。
「警告をはずす」って日本語はわからん。
0601ぴゅあ
2006/11/22(水) 13:23:14その警告自体は別の意味のものではないですか?
「wcscpy_s関数の第1引数はconstが付いてないものとして宣言されているのに渡されたものにはconstが付いている」とか
const char *hoge = "ABC";
hoge[1] = "1";
とかで判るだろうと思います
>強引なキャスト
((char *)hoge)[1] = '1';
に変えてみることで判るだろうと思います
("だろう"とはコンパイラによっては微妙かもだから)
0602デフォルトの名無しさん
2006/11/22(水) 13:35:14constだと = できないですが、別の方法では書き変えできるということですね。ありがとうございます。
0603ぴゅあ
2006/11/22(水) 13:35:23あと
>hogeが指す先には"a"が入ります。
は実行して(入った)ということだろうと思いますけど
constは飽くまでコンパイラにコンパイル時に判断させるためにコードから教えているだけのものなので
エラーなくコンパイルできれば実行はできてしまいます
>>590の
>char *string = "ABCDE/FGHIJ";
>のように書いている場合には
とかは(それは予期せぬ結果が起こる原因になり得るので)そういうことはやってはいけないということで
constはそれをコードに示してコンパイラを補助するために追加されたものです
なので
const char hoge[] = "ABC";
なんてした場合も、同様に操作が禁止されます(コンパイルのレベルで)
0604デフォルトの名無しさん
2006/11/22(水) 13:50:000605デフォルトの名無しさん
2006/11/22(水) 13:54:32この10部分、添え字のところを外部ファイルのテキストファイルなどから読み込ませることはできないのでしょうか?
#define などを利用すればできるのですかね?
0606デフォルトの名無しさん
2006/11/22(水) 13:58:470607デフォルトの名無しさん
2006/11/22(水) 14:47:460608574
2006/11/22(水) 15:59:14レス遅くなりました.
このレスを保存しておいて,そのレベルまで達したと思えたら挑戦しようと思います.
ありがとうございました.
0609デフォルトの名無しさん
2006/11/22(水) 16:46:58UTF-8もあるんだったら、UTF-16/32とかUCS4とかUnicode使ったコードを使うべきではないか?
0610デフォルトの名無しさん
2006/11/22(水) 18:01:03配列の要素数が実行時に決まる様な場合は、これは出来ないよ。
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);
0611デフォルトの名無しさん
2006/11/22(水) 19:00:27手元の環境で試したらできましたがやらない方がいいのでしょうか。
0612デフォルトの名無しさん
2006/11/22(水) 19:03:480613デフォルトの名無しさん
2006/11/22(水) 19:06:140614デフォルトの名無しさん
2006/11/22(水) 19:25:14そうだったのか。
古いコンパイラしか使ってなかったので知らんかったよ。
C言語も変わったなぁ。
0615デフォルトの名無しさん
2006/11/22(水) 20:38:07C99対応コンパイラなんて俺はGCCしか知らない。
0616デフォルトの名無しさん
2006/11/22(水) 20:38:180617デフォルトの名無しさん
2006/11/22(水) 20:59:140618デフォルトの名無しさん
2006/11/22(水) 21:01:170619デフォルトの名無しさん
2006/11/22(水) 21:40:010620デフォルトの名無しさん
2006/11/22(水) 21:56:560621デフォルトの名無しさん
2006/11/22(水) 22:20:570622デフォルトの名無しさん
2006/11/22(水) 22:54:530623デフォルトの名無しさん
2006/11/22(水) 23:01:30の両方がある意味がわかりません
計算が速い32ビットの整数型があるなら
uint32_tに割り当てれば済む話のような気もするんですが・・・
0624デフォルトの名無しさん
2006/11/22(水) 23:07:3332bitより64bitが速い環境なら、uint_fast32_tは64bitになるんじゃね?
0625デフォルトの名無しさん
2006/11/22(水) 23:08:01~~~~~
0626デフォルトの名無しさん
2006/11/23(木) 01:23:16string.appendみたいなかんじで文字をくっつけるのを簡単にやりたいです
strcatとかは元のバッファサイズの確保が面倒とおもっています
0627デフォルトの名無しさん
2006/11/23(木) 01:30:55#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;
}
0628デフォルトの名無しさん
2006/11/23(木) 01:31:56void 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行目のエラーがどうしても解決しないので
ご指摘お願いします。
0629デフォルトの名無しさん
2006/11/23(木) 01:34:31strxxx関数の類が面倒というなら、
文字列と長さを格納した構造体と、それを操作する関数群を自作して
stringクラス相当のことをC言語の仕様の中で実装するくらいしかないんじゃない?
探せば既に誰かが作っているかも。標準には存在しない。
0630デフォルトの名無しさん
2006/11/23(木) 01:36:16CMTXはマクロ関数として定義している。
CMTX[MTX]というのは使い方が間違っている。
0631デフォルトの名無しさん
2006/11/23(木) 01:38:13ご返答、ありがとうございます。
本ではこの様になっていますが・・・
では、どのように直せば宜しいのでしょうか?
ご指摘お願いします。
0632デフォルトの名無しさん
2006/11/23(木) 01:39:47CMTX(MTX)にするといいよ!
0633デフォルトの名無しさん
2006/11/23(木) 01:46:11ありがとうございました!
できましたが、一つ問題が発生しました
実行結果が
C:\bbb>10-1
【9 ゲーム】
070801
020403
0605
なってしまいます
C:\bbb>10-1
【9 ゲーム】
07 08 01
02 04 03
06 05
のように一行あけたいのですが・・・
何処をどうかえれば、こうなるでしょうか?
0634デフォルトの名無しさん
2006/11/23(木) 01:49:47たぶん、このへんだよ!
useDigit[r-1] = 1;//使われた数値をチェックする
printf("%02 ",r);←/*ここに空白を入れる*/
0635デフォルトの名無しさん
2006/11/23(木) 01:55:31できました!!!
ありがとうございました
0636デフォルトの名無しさん
2006/11/23(木) 02:24:090637デフォルトの名無しさん
2006/11/23(木) 03:21:57google 辺りで上手くやればなんとかなるか?
0638デフォルトの名無しさん
2006/11/23(木) 03:23:130639デフォルトの名無しさん
2006/11/23(木) 03:30:34手に入れたいんですが、検索しても何も引っかからないもんで
0640627-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でしょうか?
ご返答、宜しくお願いします。
0641627-628
2006/11/23(木) 05:26:00マスが1〜9あって1〜8まで数値をマスの中に
振り当てるから、ー1になるのと
添え字でー1になる事です。
0642627-628
2006/11/23(木) 05:32:42配列の添え字は0から始まるので、rand関数で出た数値が
7の時は7−1でuseDigit[6]の位置に1を代入しておきます。
参考書依り抜粋
これが特にちんぷんかんぷんです。
0643デフォルトの名無しさん
2006/11/23(木) 06:56:3010個の箱があります。
それぞれに番号をつけることにしました。
0からつけはじめて9まで付けたら番号の付いてない箱がなくなりました。
1個目の箱の番号は0です。
10個目の箱の番号は9です。
次に、箱に順番に1から10までの数字を入れることにしました。
1個目の箱には1が入りました。
10個目の箱には10が入りました。
さて問題です。
7が入ってる箱の番号はいくつでしょう?
0644デフォルトの名無しさん
2006/11/23(木) 11:04:12[1] = 2
[2] = 3
[3] = 4
[4] = 5
[5] = 6
[6] = 7
[7] = 8
[8] = 9
[9] = 10
[10]= 11
0645ぴゅあ
2006/11/23(木) 13:50:35>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
ではないですか?
0646ぴゅあ
2006/11/23(木) 13:52:02>配列の添え字は0から始まるので、rand関数で出た数値が
>7の時は7−1でuseDigit[6]の位置に1を代入しておきます。
・配列の添え字は0から始まる
・rand関数で出た数値が → それらから求めた変数rに入れた値(1から始まる)
・7の時は7−1で → "1から始まる値"を"0から始まる値"に
・ということで、useDigit[6]の位置
>>645が解れば、解説不要だろうと思いますけど
0647デフォルトの名無しさん
2006/11/23(木) 14:17:56javaでいうところの配列変数.length、vbでいうところのubound(配列変数)です。
mainとかで配列の個数ももらっているから無いのでは?
0648デフォルトの名無しさん
2006/11/23(木) 14:20:55配列ならsizeof
配列の要素へのポインタなら無理
0649デフォルトの名無しさん
2006/11/23(木) 14:32:59ただsizeofだとバイト単位になってしまうので、
配列の個数を求めるには型のサイズで割らないといけませんね。
0650デフォルトの名無しさん
2006/11/23(木) 14:39:220651デフォルトの名無しさん
2006/11/23(木) 14:44:00インテリはみんな、アナルとスカトロ好きだろ?
0652ぴゅあ
2006/11/23(木) 14:46:25>javaでいうところの配列変数.length
はちょっと毛色が違うところ…と思うけど
>vbでいうところのubound(配列変数)
は元々BASICが添え字の0始まり/1始まりを選択できる(何時からできるようになったのかはもう忘れたけど)
というところからlbound/uboundが生まれたりしたんだろうと思うけど
Cでは定数にしたり>>647の言ってるsizeofとか利用しつつ自分で管理
>配列の要素へのポインタなら無理
も自前で対応
>配列の個数を求めるには型のサイズで割らないといけませんね。
もマクロで対応してみたりとかされてきています
>mainとかで配列の個数ももらっているから無いのでは?
は、"配列の個数ももらっている"のではなくて
「要素数を渡さないと判らない(定数(固定値)にならない)から
(mainを呼び出す側が)渡している」んです
と理解できればいいと思います
0653デフォルトの名無しさん
2006/11/23(木) 14:47:430654647
2006/11/23(木) 14:48:49ご回答ありがとうございます。
そうか、配列でとってるからsizeof(配列変数)/sizeof(型名)で逝けるんですね
よーく考えてみたら、やりたいことはmallocとかでとった領域のサイズをしりたいことでした。
ポインタだからムリなんですね。mallocとかってサイズ調整してるみたいだし。
関数とかにmallocで領域取った部分にunsigned charの配列をいれて、
関数内で処理しようとおもったら、関数呼ぶ側からサイズも渡してやらないといけないんですね。
文字列でなくてファイルからとったバイナリ値を操作する関数をつくってます。
lengthとかuboundとかがありがたく思えてきました。
関数にポインタ渡すときはサイズも渡すようにしようと思います。ありがとうございました。
0655647
2006/11/23(木) 14:51:33○やりたいことはmallocとかでとった領域に入ってるどこかで入れた内容のサイズをしりたいことでした。
0656ぴゅあ
2006/11/23(木) 15:03:28>mallocとかってサイズ調整してるみたいだし。
これはコード上より内部的な話なので、考えなくていいと思います
(>mallocとかでとった領域のサイズをしりたいことでした。
mallocの際に必ずサイズを渡している筈なので、それを渡せていればいい…ですね)
0657デフォルトの名無しさん
2006/11/23(木) 15:29:16ファイルからの読み出しで最大値、最小値を表示するプログラムなんですが、
数字以外が含まれるとループし続けてしまいます。
エラーを返すようにしたいのですが、どうすればいいでしょうか?
0658デフォルトの名無しさん
2006/11/23(木) 15:30:13scanf を使わず getcharを使う
0659デフォルトの名無しさん
2006/11/23(木) 15:34:400660647
2006/11/23(木) 15:42:34配列のサイズのとりかた
unsigned char hoge[255];
printf("length = %d\n", sizeof(hoge) / sizeof(unsigned char);
ですね。ありがとうございます。
0661ぴゅあ
2006/11/23(木) 15:49:55スルーっぽさを漂わせてるみたいだから別にいっか
0662ぴゅあ
2006/11/23(木) 16:36:32However, 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?
0663デフォルトの名無しさん
2006/11/23(木) 16:41:46sizeof(hoge) / sizeof(hoge[0])
hoge が構造体でもどんな型でもつかえる。
0664デフォルトの名無しさん
2006/11/23(木) 16:44:04my.name = pure;
it = my.
however(it!=pure.mind);
assert(it & (QUESTION | SUDDEN));
you = I == person[QUESTION] ? 1: I==PRETENDER ? 2: ~UNDERSTAND;
0666623
2006/11/23(木) 17:52:46(u)int_fast32_tはピッタリ32bitの事かと勘違いしてました
0667デフォルトの名無しさん
2006/11/23(木) 18:04:50数値の取得にfscanf()を使っているならfgets()+sscanf()にして戻り値をチェックしたまえ。
sscanf()の代わりに、strtol()/strtod()で変換終了点をチェックしてもいいけど。
0668デフォルトの名無しさん
2006/11/23(木) 19:46:58fscanf()のリターン値のチェックがEOFしかやってないじゃん。
1以外だったらループを抜けるって処理も入ってないと。
0669デフォルトの名無しさん
2006/11/23(木) 20:34:20C++では定数はconstで定義することが普通のようですが、Cではどうなんでしょうか?
色々なサイトを見てみると、#defineでやってるのが多いようですが。
なぜconstで定義しないのでしょうか?
もう一つ、ヘッダファイルにconstで定数を定義しようと考えたのですが、どちらが
一般的でしょうが?
1.ヘッダファイルにstatic constで定義する。
2.ヘッダファイルに対応する.cファイルに実体を定義し、ヘッダファイルでexternする。
0670デフォルトの名無しさん
2006/11/23(木) 21:16:38Cではconstで定義したものを、定数式が要求されるところ
(配列宣言時の要素数やcaseラベルなど)で使うことができない。
そんなCを見て、C++ではconstで定数を定義できるようになった。
だからCでヘッダにconstな変数宣言をおくのは、そもそも一般的ではない。
C++では、staticなしでconst使うが(少なくとも整数型ではそれで問題ないようになっている)。
0671デフォルトの名無しさん
2006/11/23(木) 21:25:300672デフォルトの名無しさん
2006/11/23(木) 21:50:06どうなるか俺は規格書を見ないとわからない。
0673デフォルトの名無しさん
2006/11/23(木) 22:10:48文字列とか,実数でなにかあるのかと思った.
0674669
2006/11/23(木) 23:26:18Cではconst変数と定数は区別しなくちゃいけないんですね。
で、定数と同じ使い勝手を保ちつつ定数に名前を付けるとしたら
#defineしかない、ということですか。
良く分かりました。有難うございました。
0675デフォルトの名無しさん
2006/11/24(金) 00:17:32どうやってやるんでしょう。
0676デフォルトの名無しさん
2006/11/24(金) 00:19:58カレントディレクトリのファイルと要領は同じ。開くファイル名を相対パス名にすればいいだけ。
0677675
2006/11/24(金) 00:32:27レスサンクス
if((sfp = fopen(..\fff.txt,"r"))==NULL)
puts("コピー元、オープンできませんでした。");
0678デフォルトの名無しさん
2006/11/24(金) 00:33:410679675
2006/11/24(金) 00:34:43コンパイルエラーでございます。
0680デフォルトの名無しさん
2006/11/24(金) 00:35:03..\fff.txt
これ”..\\fff.txt” じゃなきゃダメなんジャマイカ?
0681デフォルトの名無しさん
2006/11/24(金) 00:35:20↓
if((sfp = fopen("../fff.txt","r"))==NULL)
0682675
2006/11/24(金) 00:37:26すげーありがと
またよろしくーーーwww
0683デフォルトの名無しさん
2006/11/24(金) 02:05:080684デフォルトの名無しさん
2006/11/24(金) 02:06:150685デフォルトの名無しさん
2006/11/24(金) 02:12:340686デフォルトの名無しさん
2006/11/24(金) 05:51:10定数ならenum 使うべき。
0687ぴゅあ
2006/11/24(金) 07:52:52適材適所でしょ
>>679
ちっちゃいツッコミですけど
>一つ上のカレントディレクトリ
カレントディレクトリの一つ上の(カレントとは言わない)ディレクトリ
と呼ぶです
>>683
Cでは0(偽)ではない値を真(0以外)と捉えてやってください
whileと組み合わせてwhile(1)は"無限にループさせたい"
0688デフォルトの名無しさん
2006/11/24(金) 11:09:260689デフォルトの名無しさん
2006/11/24(金) 11:16:230690デフォルトの名無しさん
2006/11/24(金) 11:26:54#define ever (;;)
for ever
とか、
#define _
for (;_;)
とか。
0691デフォルトの名無しさん
2006/11/24(金) 12:43:40#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);}
これを右に流れるようにしたい
0692デフォルトの名無しさん
2006/11/24(金) 12:45:300693デフォルトの名無しさん
2006/11/24(金) 12:46:370694デフォルトの名無しさん
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("処理は無事、終了しています。");
長くてすみません。
0695デフォルトの名無しさん
2006/11/24(金) 13:08:28この条件が真になるの?
0696695
2006/11/24(金) 13:23:50この条件が偽になるの?だな
0697デフォルトの名無しさん
2006/11/24(金) 13:27:50ちょっと書き替える程度のことでそんなキメーことすんなよ。
0698デフォルトの名無しさん
2006/11/24(金) 13:28:41man sed
0699デフォルトの名無しさん
2006/11/24(金) 13:28:58>while(*fp[pt] != "A-Z" || *fp[pt] != "a-z" ){
ローマ字以外の時だけ繰り返すって意味なら
while !((*fp[pt] >= 'A' && *fp[pt] <='Z') || (*fp[pt] >= 'a' && *fp[pt] <= 'z') ){
こんな感じになる
0700694
2006/11/24(金) 13:31:04*fpはFILE型のポインタでchar型でなく、int型としてしか取り扱えない
ようなエラー内容。fopen関数でfpに変更したいファイルを'r+'で
オープンしています。
695の内容はsetの次の数字以外の文字が来たときにはプログラムが終了
するような意図を持って記入しました。英文字が来たら終了の意図です。
自信ないんですが。
0701デフォルトの名無しさん
2006/11/24(金) 13:32:24while(!isalpha(*fp[pt]))
0702デフォルトの名無しさん
2006/11/24(金) 13:33:09直接 *fp or fp[] で操作する と想像したお前に完敗
0704デフォルトの名無しさん
2006/11/24(金) 13:35:570705デフォルトの名無しさん
2006/11/24(金) 13:46:02それでもコンパイルは通るだろ。
char **fpとかじゃねぇの?
0706694
2006/11/24(金) 16:56:30レスくれた人、有難う。
勘だらけで内容くちゃぐちゃだけど、
結果オーライ。
0707デフォルトの名無しさん
2006/11/24(金) 17:19:43終了したか監視したいんだけども
どうやるんざますの?
0708デフォルトの名無しさん
2006/11/24(金) 17:34:33>>1
0709デフォルトの名無しさん
2006/11/24(金) 17:34:550710ぴゅあ
2006/11/25(土) 00:29:31あちしの場合はwhile (1)よりfor ( ; ; )を好んで使いますね
賢いコンパイラならwhile (1)をfor ( ; ; )として解釈してくれそうでもあるけど
なんか「キメェ」って感じなので。。。(使い方合ってます?)
(while(1)は、毎回「1だよね」って確認してくれてそうな…)
#define forever() for ( ; ; )
とかすることもあったりするけど(色んなコードを見てるとそんな風にしているのも多くあったりする?し)
サラッと書いて済ますときは(特に)for ( ; ; )だったりですけど
実際while(1)を使うかfor ( ; ; )を使うかはそのときの気分?かな
圧倒的にfor ( ; ; )の方が多いのは間違いないけど
仕様もない話ですが。。。
0711デフォルトの名無しさん
2006/11/25(土) 00:37:14while(1)を最適化しないコンパイラなんて糞コンパイラだ。
for(;;)はANSIが無限ループのために規格化した書き方だ。
0712デフォルトの名無しさん
2006/11/25(土) 00:41:07for ( ; ; ) ; /* 悲しそう */
while (1) ; /* ょぅι゛ょの割れ目?卑猥です */
0713デフォルトの名無しさん
2006/11/25(土) 08:02:35while(1) はもう while(1) というパターンとして認識されてるから、正直どっちでもいいと思うぜ。
0714デフォルトの名無しさん
2006/11/25(土) 09:15:280715デフォルトの名無しさん
2006/11/25(土) 09:51:26以外のファイルってなんなの?
.makと.objと.tdsなんだけど。
教えてくださらんか。
0716デフォルトの名無しさん
2006/11/25(土) 09:53:30C言語で他の実行ファイルを実行させたい場合、
どういう風に記述すればいいのだろうか。
0717デフォルトの名無しさん
2006/11/25(土) 09:56:35while (1==1)
だな。
0718デフォルトの名無しさん
2006/11/25(土) 11:08:35.makはコンパイル時には作られないだろう
BCCDeveloperかなんか使ってるんじゃねーの?
ちなみに.makはメイクファイルといってコンパイルやリンク時の手順を記述したもの
自分で書いたりIDEが吐いてくれたメイクファイルを元にコンパイル等を実行する。
tdsは何か忘れた
.objは純粋にコンパイルしたときに作られるオブジェクトファイル
本来EXEを生成するには
・hoge.cをコンパイルしてhoge.objを生成
・hoge.objと必要なライブラリ等をリンクしてEXE生成
という大まかに分けて2つの手順を踏む必要があるが、
bccは-cオプションをつけない限り、リンクも自動的にやってくれるようになっている
間違ってるかもしれないけど、大体こんな感じ
0719715
2006/11/25(土) 11:32:22回答どうもありがとう!
0720ぴゅあ
2006/11/25(土) 13:21:20system関数周りとかexec系の関数辺りとかを見てみれば
>>714
当然パターンとしてコンパイラは認識する筈だけど
中身(式)なしのforがどうなるかだろうけど
アセンブラをずっとやっているときにCが出てきて
アセンブラからCを中から見て理解したけど(特にポインタとか)
中身なしのforは中身なしのコードで出てきてた記憶はあるけど
いずれにしても余程変なことでもしてなきゃ
好みで選んでいいだろうと思うけど
>>711
ANSI Cが定められたのを知っても特に興味も沸かなくて
気にしてこなかったけど
あちしがずっと好んでだけで使ってきてたことを
適切であっただろうとわざわざ立証してくれてありがとう
0721デフォルトの名無しさん
2006/11/25(土) 13:27:590722デフォルトの名無しさん
2006/11/25(土) 13:43:27?
0723デフォルトの名無しさん
2006/11/25(土) 13:52:57http://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
どこに質問していいのか分かりません
ビットシフトについてなんですが・・・
0724デフォルトの名無しさん
2006/11/25(土) 14:10:210725デフォルトの名無しさん
2006/11/25(土) 14:34:11夏休みはまだ早いぞ
0726デフォルトの名無しさん
2006/11/25(土) 15:22:470727デフォルトの名無しさん
2006/11/25(土) 19:40:35ぐしゃぐしゃです。
助言くれーー。
0728デフォルトの名無しさん
2006/11/25(土) 19:42:030729デフォルトの名無しさん
2006/11/25(土) 19:42:32#define NUM 500
int main(){
FILE *fp;
int ch;
int chx[NUM]={0};
int i=0;
0730デフォルトの名無しさん
2006/11/25(土) 19:43:09puts("読み取りオープン失敗");
else{
puts("元の内容");
while((ch=fgetc(fp)) != EOF){
chx[i]=ch;
putchar(chx[i]);
i++;
}
}
putchar('\n');
0731デフォルトの名無しさん
2006/11/25(土) 19:44:09puts("配列chxの内容");
for(i=0;i<NUM;i++)
putchar(chx[i]);
getchar();
return 0;
}
0732727
2006/11/25(土) 19:45:040733727
2006/11/25(土) 19:47:510734727
2006/11/25(土) 19:58:04設定配列数オーバーしても関係ないんですね。
>>720どうもありがとう、ぐぐってみます!
0735デフォルトの名無しさん
2006/11/25(土) 20:06:58iがNUM以上になるのを何故放置するのか?
0736デフォルトの名無しさん
2006/11/25(土) 20:08:50#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;}
0737デフォルトの名無しさん
2006/11/25(土) 20:25:040738デフォルトの名無しさん
2006/11/25(土) 20:26:480739デフォルトの名無しさん
2006/11/25(土) 20:28:00#define SIZE 1000
for (i=0; i<SIZE
chx[i]='\0';
’SIZE’以上のファイルだと i は1000になって chx のサイズオーバー
0740デフォルトの名無しさん
2006/11/25(土) 20:59:53>>737
ゴメンなさい。反省してます。
0741716
2006/11/25(土) 22:12:56こんな感じにやって駄目でした。
#include <stdio.h>
#include <process.h>
int main(){
execv("C:\\tools\\ten.bat",NULL);
getchar();
return 0;
}
ヒントいただけないでしょうか
0742デフォルトの名無しさん
2006/11/25(土) 22:30:570743716
2006/11/25(土) 22:57:04#include <process.h>
int main(){
system("C:\\tools\\ten.bat");
getchar();
return 0;
}
あっさりできたw
どうもありがとうございます。
0744デフォルトの名無しさん
2006/11/26(日) 01:26:501個の構造体では出来たのですが、一つのファイルに二つ以上入れたとき、一つ目のデータが破棄されてしまうのです。
具体的には
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になっている。
コンパイルエラーは起きないし、もちろんメモリ保護違反等も起きてないのですが…
0745デフォルトの名無しさん
2006/11/26(日) 01:28:58ソースコードを晒して
0746デフォルトの名無しさん
2006/11/26(日) 01:30:59んでstr_bはどこで読み込んでんの?
0747デフォルトの名無しさん
2006/11/26(日) 01:48:46{
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;
}
上で書いたまんまのソースはいじりまくってしまったので申し訳ないですけど、↑で。
もちろん、同じ状況である事は確認しました。
0748デフォルトの名無しさん
2006/11/26(日) 01:54:52typedef struct
{
int a,b,c;
} str_a;
です。
0749デフォルトの名無しさん
2006/11/26(日) 01:54:54noはゼロじゃなくていきなり 1 から初めてんの?
多分最初のfseek()が失敗してるよ。戻り値をみてみ。
0750デフォルトの名無しさん
2006/11/26(日) 02:02:34期待した動作と違うって事だろうから、エスパー解答
fp=fopen("data.bin","wb");
↓
fp=fopen("data.bin","r+b");
0751デフォルトの名無しさん
2006/11/26(日) 02:04:05no=0とno=1でfseekの戻り値見てみましたが、0でした。
fseekの引数でnoを(no-1)にしてnoを1と2で試してみましたが、やっぱりno=1を読むと0 0 0になってしまいました。
戻り値の意味が間違ってるならごめんなさい。
0752デフォルトの名無しさん
2006/11/26(日) 02:07:130なら成功してますね。
>>750
あっそういう事か。ファイルを上書きして消してしまってるという事ね。
元のファイルを残したいならr+bだな。
0753デフォルトの名無しさん
2006/11/26(日) 02:11:07それで試したら無事表示できました、ありがとうございます!
オープンモード、もう一度勉強しなおしてきます。
>751
わかりづらくて申し訳ありませんでした。
上書きはwbやwb+とはまた別の書き方なんですね…
こんな深夜にお付き合い頂き、ありがとうございました。
0754デフォルトの名無しさん
2006/11/26(日) 10:26:000755デフォルトの名無しさん
2006/11/26(日) 10:33:40初心者なんでptagmaが何かわかりません。
わかりやすく説明してくださいませんか?
0756デフォルトの名無しさん
2006/11/26(日) 10:36:230757デフォルトの名無しさん
2006/11/26(日) 13:23:19内容をみるのでしょうか。何か専用のツールがあるのかなあ。
こんな感じのファイルです。
MAKEDEV-3.1.0-19.src.rpm
ご存知の方教えてください。
スレちがいならすまん。
0758デフォルトの名無しさん
2006/11/26(日) 13:29:48それはインストール用パッケージだ。詳しくは犬板でどうぞ。
>>755
>754はpragmaと言いたかったのだろう。
要は、構造体のメンバ間に埋め草が必要になる可能性を排除しておけと言うことだ。
0759デフォルトの名無しさん
2006/11/26(日) 13:33:21モード,動作,ファイルがないとき,ファイルがあるとき
r,読み込み専用,エラー,開く
w,書き込み専用,作る,クリアする
a,追記専用,忘れた,開いて末尾に移動
r+,読み書き,エラー,開く
w+,読み書き,作る,クリアする
a+,追記部で読み書き,忘れた,開いて末尾に移動
0760デフォルトの名無しさん
2006/11/26(日) 13:42:00#ptagma ではなく #pragma
C言語の範疇では定義されていない部分について、コンパイラに対して
特殊な指示を出すためのもの。
VC++なら pragmaだったけど、他のコンパイラなら違ってるかも。良く知なくてすまん。
C言語の学習を始めたばかりなら、まだpragmaとかは意識しないほうがいいかも。
ある程度基礎ができてきてから出いいので、
変数をメモリに割り当てるときの境界調整だとか、
構造体のメンバの間に詰め物がされる場合があるとか、
そういう話も調べて見るといいかも。
以下のページの説明が分かりやすそう。
ttp://mag.autumn.org/Content.modf?id=20050430014843
とりあえず、今やっている構造体のメモリ内容をファイルに書き出す&読み込む
というのは、同じ環境でやっている分には使えるけど、
書き出したファイルを別の環境で読み出す上手く行かないことがあるというのを
知っていればいいと思うよ。
0761デフォルトの名無しさん
2006/11/26(日) 13:42:020762デフォルトの名無しさん
2006/11/26(日) 13:50:48中途半端にpragmaどうこうは気にしなくてもいいかもしれんけど。
0763デフォルトの名無しさん
2006/11/26(日) 13:51:08759 宛て
0764デフォルトの名無しさん
2006/11/26(日) 15:58:571以上の値だったらマイナスをつけて返す、
-1以下の値だったらプラスをつけて返す関数を作成したいのですが、
最上位ビットを確認し、反転する一番いい書き方ってどんなんでしょうか?
0765デフォルトの名無しさん
2006/11/26(日) 16:01:15{
return -x;
}
0766デフォルトの名無しさん
2006/11/26(日) 16:12:31最上位ビットを反転しても符号が逆でも絶対値が同じにはならん。
>>764が結局何をしたいのか書かないから
>1以上の値だったらマイナスをつけて返す、
>-1以下の値だったらプラスをつけて返す関数を作成したいのですが、
の部分より>>765が正解のように思える。
0767デフォルトの名無しさん
2006/11/26(日) 16:25:27ってなんだよ〜。くそorz
0768デフォルトの名無しさん
2006/11/26(日) 16:35:31クリアじゃなくフィルだな
int i;
for (i=0; i<10;i++) {
a[i]=0;
b[i]='a';
}
0769767
2006/11/26(日) 16:40:13おっと>>768ありがとうございます。
0770デフォルトの名無しさん
2006/11/26(日) 18:17:24そのときmainの中にある配列atai[10]の値をkaikiに渡して,
kaiki内で計算した結果のkotae1,kotae2という二つの変数をmainに返したいのですが、
どのように書いたらいいのでしょうか?
0771デフォルトの名無しさん
2006/11/26(日) 18:20:46void kaiki(int n, int* kotae1, int* kotae2)
{
...
}
main()
{
int atai[100];
int kotae1, kotae2;
...
kaiki(atai[10], &kotae1, &kotae2);
...
}
0772デフォルトの名無しさん
2006/11/26(日) 18:45:02int 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;
}
0773デフォルトの名無しさん
2006/11/26(日) 21:56:15Aa 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]へ格納していこうと思うのですが、読み込みの部分が上手くいきません。
よろしくお願いします。
0774デフォルトの名無しさん
2006/11/26(日) 22:04:59その365個のファイルは、ファイル名に規則性があるの?
それとも、全部、手入力?
0775デフォルトの名無しさん
2006/11/26(日) 22:22:55年間データで
1_1.xls〜12_31.xls(1月1日〜12月31)
です。
0776デフォルトの名無しさん
2006/11/26(日) 22:37:36読みこむ部分だけ。
一行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;
}
0777776
2006/11/26(日) 22:39:50↓まかせた。
0778デフォルトの名無しさん
2006/11/26(日) 22:40:45来週もよろしく頼むぞよ
0779デフォルトの名無しさん
2006/11/26(日) 22:46:58fgets(s, sizeof(s), fp),
fgets(s, sizeof(s), fp);
P[i] = s[3]-'0';
で良いんじゃね?
0780デフォルトの名無しさん
2006/11/26(日) 22:54:270781デフォルトの名無しさん
2006/11/26(日) 23:04:28テキストとしての4列目なのではなく、4セル目なんでね?
>>776
何故%*dとせずにダミーに格納する?
>>775
xlsファイルを読むのは途方もなく面倒なわけだが、csvか何かに変換できないのか?
0782デフォルトの名無しさん
2006/11/26(日) 23:46:01>>776の方法では駄目でしょうか?
もう少しで試せるので出来次第報告します。
0783デフォルトの名無しさん
2006/11/26(日) 23:48:57拡張子ではなく内容の問題
書式等の情報が含まれるからめんどくさい
0784デフォルトの名無しさん
2006/11/26(日) 23:54:55行間は勿論改行です。
0785デフォルトの名無しさん
2006/11/26(日) 23:58:56データ保存する際にtxtとかにするって意味か
ファイル名の変更で拡張子変えるって意味かと思った
0786デフォルトの名無しさん
2006/11/27(月) 00:28:19スイマセン、そういう意味です。
伝わりにくい言い方で申し訳ないです。
0787デフォルトの名無しさん
2006/11/27(月) 01:20:44とりあえず切り出したらどうだろ?
0788デフォルトの名無しさん
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ではコンパイルできてしまいます。何か理由ってあるんでしょうか。
0789デフォルトの名無しさん
2006/11/27(月) 03:06:44標準じゃないライブラリconioがあるかどうか。
0790デフォルトの名無しさん
2006/11/27(月) 03:15:57括弧が足りない。
0791デフォルトの名無しさん
2006/11/27(月) 03:18:25愛も足りないねぇ 標準で済むのに
0792デフォルトの名無しさん
2006/11/27(月) 03:22:00どの括弧が足りないんでしょうか?
それとコンパイルできないのが正しい形なんでしょうか?
0793デフォルトの名無しさん
2006/11/27(月) 03:29:23getch(); → _getch();
にすればコンパイルできるんじゃないかなかな。
0794デフォルトの名無しさん
2006/11/27(月) 03:39:150795デフォルトの名無しさん
2006/11/27(月) 03:40:57ニュートン法とか二分法とか
0796794
2006/11/27(月) 04:02:27具体的にはどうすればいいんですか?
まったくわからないので教えて下さい。
0797デフォルトの名無しさん
2006/11/27(月) 04:04:12ぐぐれよ
例えば平方根を求める場合
http://www.sm.rim.or.jp/~shishido/newton.html
これのx*xをsin(x)にかえて、2*xをcos(x)に変えるとか
0798794
2006/11/27(月) 04:50:43ぐぐっていろいろ試してみましたができませんでしたorz
0799デフォルトの名無しさん
2006/11/27(月) 05:17:08だいたいこんな感じ
#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;
}
0800デフォルトの名無しさん
2006/11/27(月) 06:43:31theta=asin(x)/2;
0801デフォルトの名無しさん
2006/11/27(月) 06:47:480802デフォルトの名無しさん
2006/11/27(月) 14:15:57そうだとasin(sqrt(x))とasin(-sqrt(x))。
0803デフォルトの名無しさん
2006/11/27(月) 15:24:01曜日を出力するプログラムを作成せよ、って課題が学校で出たんですが
全く分かりません・・・
誰か教えてください
0804デフォルトの名無しさん
2006/11/27(月) 15:32:16宿題スレへどうぞ。
0806デフォルトの名無しさん
2006/11/27(月) 17:45:310807デフォルトの名無しさん
2006/11/27(月) 17:55:36C++作った人もint* p;派だというし。
もちろんC++やったことがなくてもint* p;の人はいるし、その逆もそう。結局は好みの問題。
0808デフォルトの名無しさん
2006/11/27(月) 17:57:51英数字とか漢字をを入力し、それを16進数で表示したいと考えています。
scanfで取り込んでprintfでみたいにしてみたんですがうまくいきません。
アドバイスいただけないでしょうか?よろしくお願いします。
また、このやり方で漢字を16進で受け取ることはできるのでしょうか?
0809デフォルトの名無しさん
2006/11/27(月) 18:02:01仕様も性能も。
0810デフォルトの名無しさん
2006/11/27(月) 18:15:28漢字はchar型の変数に収まらないので、文字列(char配列)として扱え。
>>809
シェアはC++のほうが明らかに上。
でもたぶん、そもそもC++とObjective-Cが目指している方向は違うと思うんだ。比べるだけ無駄だと思う。
0811デフォルトの名無しさん
2006/11/27(月) 20:41:12入力された文字列の文字コードを表示するって意味だろうか。
0812デフォルトの名無しさん
2006/11/27(月) 21:44:222バイトURLを1バイトに直したくて・・・
0813デフォルトの名無しさん
2006/11/27(月) 21:58:45ひらがなは1バイトにできん
2バイト文字だ
0814デフォルトの名無しさん
2006/11/27(月) 22:07:16汎用関数みたいな都合のいいものはないみたいね。
変換するのが英数字なら、なんとか自分で(環境依存のものを)書こう。
適当だけど、
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';
こんな感じで変換するしかないんじゃない?コロンとかスラッシュは
一つずつ対応して・・・ああめんどくさい。しかも移植性なし。
0815デフォルトの名無しさん
2006/11/27(月) 23:55:540816デフォルトの名無しさん
2006/11/28(火) 06:39:06使いたいのですが、関数にして何度も使うには文が長く
参照する変数が二次元配列などが多くてごちゃごちゃしてます。
どうすれば同switch内でもう一度使えるでしょうか?
教えてください。お願いします。
0817デフォルトの名無しさん
2006/11/28(火) 06:52:16その長い文を同じswitch文の中で二ヶ所使う方がさらにごちゃごちゃするんじゃないか?
まず、その長い処理を切り出して関数にする。
関数内で使うために渡すべき変数が多すぎて引数がごちゃごちゃするようなら、
構造体等でまとまりを作って呼び出しをすっきりさせる。
まとまった処理とのインタフェースが変数がごちゃごちゃしているせいで美しくないと感じるようなら、
データ構造の変数への切り出し方を再考することも考えてみたら?
0818デフォルトの名無しさん
2006/11/28(火) 06:55:10うっす。ありがとうございます。
0819デフォルトの名無しさん
2006/11/28(火) 07:53:40case WM_CREATE:
case WM_KEYDOWN:
// 処理
って話ではないのかね。
0820808
2006/11/28(火) 12:48:13scanfで取り込んだらコードが出てくるかなと思い質問さ
していただきました。
JISコードを表示することは簡単ではないのでしょうか?
0821デフォルトの名無しさん
2006/11/28(火) 13:42:030822デフォルトの名無しさん
2006/11/28(火) 18:00:27問題なんですが、エラーは出ずにコンパイルできても
実行したら何も起きません。
宜しければどこが間違ってるか教えて頂けないでしょうか?
#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);
}
0823デフォルトの名無しさん
2006/11/28(火) 18:04:14さらに i が 2 * i と等しくなるのは i=0 の時だけ。
0824デフォルトの名無しさん
2006/11/28(火) 18:33:27#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);
}
0825電信男
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;
}
0826デフォルトの名無しさん
2006/11/28(火) 18:36:50c[i]が小文字以外の時の処理を加えるといいよ
または #include<ctype.h> と b[i]=toupper(c[i])
0827デフォルトの名無しさん
2006/11/28(火) 18:46:19アドバイスありがとうございます。
ですが、2のべき乗のチェックの式がわからないのです。
>>824
例題がwhileを使ってるのでできればwhileのままでやりたいのですが…
0828デフォルトの名無しさん
2006/11/28(火) 18:53:012のべき乗なら1になるまでずーっと2で割り切れる。
forのループをwhileに直すことぐらい自分でしろ。
「2のべき乗かどうか」をチェックする必要など無い。
「2のべき乗にしかならない」値を作ればいい。
i=0;while((2<<i)<=no){printf("%d ", (2<<i));i++;}
0830デフォルトの名無しさん
2006/11/28(火) 18:59:042の0乗=1 も仲間にいれてやって
i=0;while((1<<i)<=no){printf("%d ", (1<<i));i++;}
こうだな。
0832デフォルトの名無しさん
2006/11/28(火) 19:01:46文字列の終端に '\0' もいれないといけない。
0833デフォルトの名無しさん
2006/11/28(火) 19:35:22>>829
すみません。
アドバイスありがとうざいました。
0834デフォルトの名無しさん
2006/11/28(火) 22:55:33C言語でフォルダの中身の一覧を表示させるには
どうすれば良いでしょうか。
0835デフォルトの名無しさん
2006/11/28(火) 22:57:39system("dir");
system("ls");
のどちらかでいいんじゃないかな?
0836デフォルトの名無しさん
2006/11/28(火) 22:58:09ls -R
0837デフォルトの名無しさん
2006/11/28(火) 23:05:14というエラーが出るのですがこれはどういうことなんでしょうか?
0838デフォルトの名無しさん
2006/11/28(火) 23:06:070839デフォルトの名無しさん
2006/11/28(火) 23:08:000840デフォルトの名無しさん
2006/11/28(火) 23:09:380841デフォルトの名無しさん
2006/11/28(火) 23:10:26x = y + z;
ってあれば、yとzはオペレータ'+'のオペランドで、
xとy+zがオペレータ'='のオペランド
>>840
ワロタ
0842デフォルトの名無しさん
2006/11/28(火) 23:15:41教えていただきありがとうございました。ということは=の左辺と右辺が矛盾してますよってことですか?
0843デフォルトの名無しさん
2006/11/28(火) 23:23:51矛盾しているということではなくて、=の左辺にあるものが
代入可能なものではないということ。
0844デフォルトの名無しさん
2006/11/28(火) 23:24:07エラーが出た行を貼り付けてくれれば簡単に答えられると思うが
0845デフォルトの名無しさん
2006/11/28(火) 23:32:18if((l*l+o*o)>i*i)
printf("鋭角三角形");
if((l*l+o*o)=i*i) ←ここです。
printf("直角三角形");
if((l*l+o*o)<i*i)
printf("鈍角三角形");
}
0846デフォルトの名無しさん
2006/11/28(火) 23:33:26==
0847デフォルトの名無しさん
2006/11/28(火) 23:36:230848デフォルトの名無しさん
2006/11/28(火) 23:43:540849デフォルトの名無しさん
2006/11/28(火) 23:49:03fopen関数とかその辺のファイル入出力関係の関数を使って作っていけばいいんですよね?
なにかコツとか陥り易い問題点とかあったらアドバイスよろしくお願いします。
0850デフォルトの名無しさん
2006/11/29(水) 00:01:02テキストエディタを実装するには理解すべきことがかなり多いと思うよ。
ファイル入出力だけじゃなく、GUI(描画、ユーザ入力)とか、メモリ上のデータ管理とか。
とりあえずアドバイスとしては
・いきなり高機能なものは目指さない。
・基本はしっかり学ぶ。入出力が良く分かってないなら、テキストエディタはいったん置いておいて
ある程度自由に入出力が扱えるくらいには勉強してみる。
・ちゃんとテストする。いろいろ作りこんでから上手く動かないと分かっても、原因を調べるのは大変。
・自分でいろいろな情報を調べられるようにする。
・めげない。
0851デフォルトの名無しさん
2006/11/29(水) 00:35:24方向キーを押しっぱなしで弾をうちたい時などに、
何のボタンを押しているか というのを
取りたいのですがどうすればいいでしょうか。
kbhit()では最後に押されたキー1つしか取れないですよね・・
0852デフォルトの名無しさん
2006/11/29(水) 00:41:47{
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に入る数字の並びをエンディアンを気にせずに、
ビッグエンディアン形式にしたいのですが、
エンディアンを気にしない書き方はありますか?
0853デフォルトの名無しさん
2006/11/29(水) 00:48:391.バイトオーダーを隠してしまう関数を作る。
2.シフト演算を使う。
1,2のどちらかだな
0854デフォルトの名無しさん
2006/11/29(水) 01:19:55ありがとうございました。
0855デフォルトの名無しさん
2006/11/29(水) 02:08:40そもそもkbhitじゃ一つも入力取れないぜ?
0856デフォルトの名無しさん
2006/11/29(水) 02:10:02テキストエディタにGUIってどんなだよ?
ワープロと間違えてんのか?
0857デフォルトの名無しさん
2006/11/29(水) 02:12:32ed みたいなの想像してる?
スクリーンエディタなら GUI でしょ
0858デフォルトの名無しさん
2006/11/29(水) 02:24:320859デフォルトの名無しさん
2006/11/29(水) 02:29:51使ってるとしてもツールバー程度じゃね?
ほとんどのエディタはCUIだろ?
0860デフォルトの名無しさん
2006/11/29(水) 02:36:22だから DOS/V は GUI-OS なんだよ。
0861デフォルトの名無しさん
2006/11/29(水) 02:46:54思ってたのとかなり違ってた。
オレは古い人間なんだと思い知らされた。
0862デフォルトの名無しさん
2006/11/29(水) 02:49:27while(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にするのかわかりません。
アドバイスを宜しくお願いします。
0863デフォルトの名無しさん
2006/11/29(水) 03:02:55>>862 でしっかりかいてある通り。
自己解決ってやつだな。しかも一つのレスでw
0864デフォルトの名無しさん
2006/11/29(水) 03:03:34それ書いた人がそういうルールに決めただけ。
0865デフォルトの名無しさん
2006/11/29(水) 03:13:230866デフォルトの名無しさん
2006/11/29(水) 04:30:25前に入力した値がそのままだと失敗したことが分からないかもしれません。
0867デフォルトの名無しさん
2006/11/29(水) 05:01:48事前に-1を入れる方法だと、入力ミスと-1の入力の区別がつかないジャマイカ。
0868デフォルトの名無しさん
2006/11/29(水) 05:15:460869デフォルトの名無しさん
2006/11/29(水) 05:17:49JAVAでしょうか?VISUAL C++でしょうか?
0870デフォルトの名無しさん
2006/11/29(水) 06:20:55確か、
初期のバージョンは VC++
途中から BCB(Borland C++ Builder)
バージョンはよくわからん。
途中から使用してるツールは違えど、言語自体はC++言語になるね。
0871ぴゅあ
2006/11/29(水) 07:53:41恐らく解説の中にあると思いますけど
入力される数は、処理を終了させるための"0"か
正の整数であることを条件にしているでしょう
それより、負の整数は入力されることはないとして
つまり現れることはないもの(例外値)として
scanfで無効な入力があったときに-1(例外値)となるように
予め入れてあるものです
(この例では入力処理(scanfの部分)をきちんと書くことを
目的としているわけではないので簡単に済ませてある)
なので、-2でも-99でもよいわけですが
-1を割り当てようと思う人が比較的多かったりする
というところですね
つまり"-1"という値が重要なのではなく
"例外値"であることが大切なわけです
もし、-1も入力される値であったとすれば
-2(d = -2;)とかにされていたかも知れません
恐らく簡単に済ませてあって
もしdの値が-1であったときそれ以降の処理をスキップさせる
なんて処理も省略されているかも知れませんね
>>866-867の言われているようなところは
省いている筈ですから(それが示されたコードにも現れているのとscanf自身ではなく何か他の解説が目的であろうということ)
0872834
2006/11/29(水) 11:48:35人大杉でレス遅れてすんまそん。
回答有難うございました。
0873834
2006/11/29(水) 11:51:330874デフォルトの名無しさん
2006/11/29(水) 12:37:12その内容をファイルに書き込む方法はどうするんでしょうか。
0875デフォルトの名無しさん
2006/11/29(水) 12:39:10system("ls > a.txt");
0876デフォルトの名無しさん
2006/11/29(水) 12:49:260877デフォルトの名無しさん
2006/11/29(水) 13:23:59「一覧表示させ、その内容をファイルに書き込む」
だからそれじゃダメだろ。
0878デフォルトの名無しさん
2006/11/29(水) 13:25:28system("ls > a.txt");
0879デフォルトの名無しさん
2006/11/29(水) 13:28:070880デフォルトの名無しさん
2006/11/29(水) 13:28:420881デフォルトの名無しさん
2006/11/29(水) 13:31:02system("cat > a.txt");
又は
system("ls | tee a.txt");
0882デフォルトの名無しさん
2006/11/29(水) 13:31:090883デフォルトの名無しさん
2006/11/29(水) 13:32:56system("dir > a.txt");
system("type a.txt");
0884デフォルトの名無しさん
2006/11/29(水) 13:35:20「ディレクトリ」じゃなくて「フォルダ」だぞ。
表示される内容は微妙に違うぞ。
0885デフォルトの名無しさん
2006/11/29(水) 13:40:07それはあくまでディレクトリだ。
0886デフォルトの名無しさん
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]”にするとうまくいきました。
配列の要素の初期化に変数はつかえないのですか?
0887デフォルトの名無しさん
2006/11/29(水) 16:31:57define i 10
0888デフォルトの名無しさん
2006/11/29(水) 16:39:400889デフォルトの名無しさん
2006/11/29(水) 16:44:08ヘタレはC99使ってろよプ
>>888
あるよ。
0890デフォルトの名無しさん
2006/11/29(水) 17:12:23#elif
0891874
2006/11/29(水) 17:29:34とても参考になりました!!!
0892デフォルトの名無しさん
2006/11/29(水) 17:55:23ことはできないでしょうか?
例えばガウス関数のσ=1の計算を1.datに書いて、
σ=2の計算を2.datに書くようにしたいです。
0893デフォルトの名無しさん
2006/11/29(水) 17:59:510894デフォルトの名無しさん
2006/11/29(水) 18:00:22#include<stdio.h>
int main(void){
char filename[FILENAME_MAX];
FILE *fp;
int i;
for(i=0;i<10;i++){
sprintf(filename, "%03d.dat", i);
fp=fopen(filename, "w");
fprintf(fp, "%d\n", i);
fclose(fp);
}
return 0;
}
0895デフォルトの名無しさん
2006/11/29(水) 18:03:32やってみます。
0896デフォルトの名無しさん
2006/11/29(水) 18:48:21Aを実行するとA→B→Dと実行させていくプログラムと、
Aの実行途中でBに移ってAに戻って来るようプログラムする事は可能でしょうか?
0897デフォルトの名無しさん
2006/11/29(水) 18:52:48a.exe b.exe d.exe を実行するって事?
0898896
2006/11/29(水) 19:29:24すみませんそうです、
1つにまとめるて書くより複数に分けた方が管理しやすいかと思ったもので
0899デフォルトの名無しさん
2006/11/29(水) 19:31:23可能。
0900デフォルトの名無しさん
2006/11/29(水) 20:09:36「エラー 'stdio.h'をオープンできない」
ってエラーメッセージがでるんだけど、考えられえる原因を教えてください。
本を買って12ページ目でつまづいてます。
0901デフォルトの名無しさん
2006/11/29(水) 20:13:40stdio.hが無い
stdio.hを探すパスの間違い
stdio.hが書き込み専用になっている
etcetc...
まずCの処理系の名前を書くとアドバイスが増える
0902デフォルトの名無しさん
2006/11/29(水) 20:19:53なぜなんだぜ?
0903デフォルトの名無しさん
2006/11/29(水) 20:20:02処理系ってのがなんなのかわからないけど、
Borland C++ compiler 5.5.1 っての使ってます。
パスもc:\borland\bcc55\binに通してあるし、
bcc32.cfg とilink32.cfgも作ったんですがエラー出てます。
書き込み専用にはなってませんでした。
0904デフォルトの名無しさん
2006/11/29(水) 20:21:50探してみます。
0905デフォルトの名無しさん
2006/11/29(水) 20:22:11#include "stdio.h" になってるとか予測してみる。
0906デフォルトの名無しさん
2006/11/29(水) 20:23:49つかilink32.cfgじゃなくてlink32.cfgじゃね?
0907デフォルトの名無しさん
2006/11/29(水) 20:24:170908デフォルトの名無しさん
2006/11/29(水) 20:25:40それは ilink32 で正しいよ。
0909デフォルトの名無しさん
2006/11/29(水) 20:29:03/* hello, worldを表示するプログラム */
#include <stdio.h>
int main(void)
{
printf("hello, world\n");
return 0;
}
拡張子は全て表示されるようにしてるので、あってると思います。
0910デフォルトの名無しさん
2006/11/29(水) 20:34:39ちゃんと bin の中に入ってる?
0911デフォルトの名無しさん
2006/11/29(水) 20:40:51お騒がせしました。
0913デフォルトの名無しさん
2006/11/29(水) 20:48:55そんな回答でいいのかよw
0914896
2006/11/29(水) 20:59:10どう質問したらいいかわからないので
可能かどうかだけ聞ければ後は自分で探してみます。
0915デフォルトの名無しさん
2006/11/29(水) 21:13:45ここのキーボードからリアルタイム入力の項を読んでいたのですが
c = getchar();
while ((dummy = getchar()) != '\n')
;
がリアルタイム入力に対する解決法に思えないし、「バックスペースで訂正して1にしてからリターンを押す」
というのはc = getchar();だけで十分だと思うんですが、昔の環境ではそうでなかったってことでしょうか?
特に今リアルタイム入力関連の情報集めているわけではないのですが、疑問が解けないのでよろしくお願いします
0916デフォルトの名無しさん
2006/11/29(水) 21:17:260917デフォルトの名無しさん
2006/11/29(水) 21:22:25c = getchar();
while ((dummy = getchar()) != '\n')
;
これはただ入力が1行あって最初の一文字目を取得して、
その後は破棄するって意味ですよ。
0918デフォルトの名無しさん
2006/11/29(水) 21:34:21それは問題ない。
ヘッダ名が"〜"形式で指定した場合、
見つからなければ<〜>と指定したのと同じようにヘッダを探すことになっている。
0919915
2006/11/29(水) 21:39:59あ、メニューを選択する場合に単に数字だけを入力すればいいところを
誤って"1q"のようにタイプミスしてしまい、且つ本当は2を選びたかった場合に
ストリームに残っているqを取り除くための前処理だってことですか?
0920デフォルトの名無しさん
2006/11/29(水) 23:02:19>探すことになっている
なっている、はすだが
なっていない処理系も意外に多い。
0921デフォルトの名無しさん
2006/11/29(水) 23:49:36遅くなりましたが、詳しい解説ありがとうございました。
やっと謎が解けました。
0922デフォルトの名無しさん
2006/11/30(木) 01:04:482進数16桁の加減算プログラムをmain関数で作りたいのですがどのようにしたらいいでしょうか?
0923デフォルトの名無しさん
2006/11/30(木) 01:05:420924デフォルトの名無しさん
2006/11/30(木) 01:31:52まずは、自分が何をしたいのか、何が分からないのかを整理し、
それが相手に伝わるような文章を書くことから始めるといい。
0925デフォルトの名無しさん
2006/11/30(木) 02:13:46キーボードから1と0だけで数字を入力してそれの加減算をしたいのか?
受け取った数字を文字列として扱うとか、intとして受け取って適当に処理するとか
やり方はいくつでもあるだろ。
0926デフォルトの名無しさん
2006/11/30(木) 03:20:02実際printfとかで表示するにはどうしたらよいのですか?
0927デフォルトの名無しさん
2006/11/30(木) 03:26:03その文字コードを普通に出力する
実行環境のフォントがクリンゴンならそう表示されるし
違えば文字化け
0928デフォルトの名無しさん
2006/11/30(木) 21:04:22助言よろしくお願いします
0929デフォルトの名無しさん
2006/11/30(木) 21:07:100930デフォルトの名無しさん
2006/11/30(木) 21:29:01ppmファイルを扱うライブラリで使えるものを探すか、
自分でppmファイルのフォーマットを調べて解析する。
0931デフォルトの名無しさん
2006/11/30(木) 21:30:55何の参考にもなりゃしない。
0932デフォルトの名無しさん
2006/11/30(木) 21:45:42ある程度調べていて、この部分が分からないと具体的に書いたなら
アドバイスのしようもあるんじゃないか。
0933デフォルトの名無しさん
2006/11/30(木) 21:50:470934デフォルトの名無しさん
2006/11/30(木) 21:51:33setlocale (LC_ALL , "tlh");
//クリンゴン語のコードはISO 639よって規定
0935928
2006/11/30(木) 21:54:07h_g = h_f; /* 横画素数 */
v_g = v_f; /* 縦画素数 */
for ( v = 0; v < v_g; v ++ ){
for ( h = 0; h < h_g; h ++ ){
for ( c = 0; c < 3; c ++ ){
g[v][h][c] = (f[v-1][h+1][c] + f[v][h+1][c] + f[v+1][h+1][c]+
f[v-1][h][c] + f[v+1][h][c]+
f[v-1][h-1][c] + f[v][h-1][c] + f[v+1][h-1][c]) / 8;
}
}
}
てやれば,ぼかし画像が出力されますよね。
しかし、任意の一部分を切りぬいて出力するとなるとお手上げで・・・。
よろしくお願いします。
0936デフォルトの名無しさん
2006/11/30(木) 21:59:440937928
2006/11/30(木) 22:04:25不適切だったかもしれません。
0938デフォルトの名無しさん
2006/11/30(木) 22:08:58結局何をやろうとしているのかわからない
>>930にも答えてないし
画像を配列に格納したいのか
配列から1行の画素を取り出したいのか
ESPがないからわからん
0939デフォルトの名無しさん
2006/11/30(木) 22:10:380940デフォルトの名無しさん
2006/11/30(木) 22:13:24とすれば全部10行と同じなる
0941デフォルトの名無しさん
2006/11/30(木) 22:13:580942デフォルトの名無しさん
2006/11/30(木) 22:28:02自分がやろうとしていることなのに、ピンと来ない?
宿題か?
0943928
2006/11/30(木) 22:28:37>>930
今のところ手作業で解析をしております。
>>938
ご指摘の通りです。すいません。
画像を配列に格納した後、配列から一行の画素を取り出したいんです。
>>940
更にいえば複数(i)枚の画像を読み込んだときに,i行目の画素を取り出したいんですが、
for文を使って
g[v][h][c]=g[v][i][c];
とすると、デバッグは問題ないものの、画像が表示されません。
>>941
何とか理解したいんです・・・。
0944デフォルトの名無しさん
2006/11/30(木) 22:33:180945928
2006/11/30(木) 22:36:21宿題ではありません。
>>944
すいません。間違ってました。
gg[v][h][c]=f[v][i][c];
でやってるんですが、表示されません。。。
0946デフォルトの名無しさん
2006/11/30(木) 22:47:28新情報ggですか
0947デフォルトの名無しさん
2006/11/30(木) 22:47:460948デフォルトの名無しさん
2006/11/30(木) 22:50:16123
456
789
という画像データがあったら、どうなってほしいの?
>g[v][h][c]=f[v][i][c];
これだと、i=1のとき
222
555
888
になるけど。
0949928
2006/11/30(木) 22:59:15Visual C++ .NET Standard 2003でのWin32コンソールアプリケーションで
コマンドプロンプトを使用しています。
この説明で正しいでしょうか?
>>948
そう言う説明をすれば解かり易いですね・・・。ありがとうございます。
i=1のとき、 i=2のとき
1 2
4 5
7 8
と行った具合に出力したいんです。
0950デフォルトの名無しさん
2006/11/30(木) 23:05:51そしたら根本的に配列gのサイズが間違ってるだろ
サイズ的にはg[v_g][c]じゃないの?
で、横方向にはコピーしなくていいのだから
for ( v = 0; v < v_g; v ++ ){
for ( c = 0; c < 3; c ++ ){
g[v][c]=f[v][i][c];
}
}
0951デフォルトの名無しさん
2006/11/30(木) 23:09:50聞きたいのは、画像を表示するために何を使っているのか(どうやっているのか)ということ。
コンソールアプリで、各画素のRGB値を数値として文字列表示したいということか?
文字でいいのか?画像ではなく。
0952928
2006/11/30(木) 23:15:59確かにそうですね。ありがとうございます。
しかし下のエラーが出てしまいます。初心者ですいません。
error C2440: '=' : 'unsigned char' から 'unsigned char [3]' に変換できません。
>>951
ppm形式の画像を出力して表示したいと言うことです。
ちなみにソフトはACDSee v3.1vです。
0953デフォルトの名無しさん
2006/11/30(木) 23:17:46宣言部もちゃんと変えた?
画像の問題じゃなくて配列がまともに扱えないだけじゃないのか
0954デフォルトの名無しさん
2006/11/30(木) 23:36:12ここまで進めていて、どこがおかしいのか分からなくなってしまいました。
実行値が正しくない上にエラーとなってしまいます。
よければどの辺がおかしいか教えてください。
0955デフォルトの名無しさん
2006/11/30(木) 23:37:32g[v][c]=f[v][i][c];
を
g[v][0][c]=f[v][i][c];
とすればいいじゃない?
とりあえず画像をどうこうしたいなら多次元配列の勉強を先にしたほうがいい。
>error C2440: '=' : 'unsigned char' から 'unsigned char [3]' に変換できません。
これで困っているようなら、多次元配列を扱うのも早すぎる気がする。
0956928
2006/11/30(木) 23:43:14その通りです。
>>955
解答ありがとうございます。
地道な努力をしようとしなかった自分が甘ちゃんでした。
勉強して出直してきます。
0957デフォルトの名無しさん
2006/12/01(金) 10:28:08やっぱ最初から答えが聞きたかっただけじゃねえか
0958デフォルトの名無しさん
2006/12/01(金) 15:01:160959デフォルトの名無しさん
2006/12/01(金) 15:08:13できます
0960デフォルトの名無しさん
2006/12/01(金) 15:19:550961デフォルトの名無しさん
2006/12/01(金) 15:22:180962デフォルトの名無しさん
2006/12/01(金) 15:25:12printf("%x", n);
0963デフォルトの名無しさん
2006/12/01(金) 15:48:46二進数文字列だからそれじゃダメ。
printf("%x",strtol(str,NULL,2));
0964767
2006/12/01(金) 20:02:15皆さんはCをどのくらいの期間勉強してるんですか?
0965デフォルトの名無しさん
2006/12/01(金) 21:29:211〜10までの乱数を10個発生させて表示させる。ただし、1度出た数字は除外する」
という課題を出されたのですが、教科書を見ながら解いても
同じ数字が重複して表示されてしまうプログラムになってしまいどうしていいかわかりません。
どなたか教えていただけませんでしょうか
0966デフォルトの名無しさん
2006/12/01(金) 21:38:14同じ数字が重複して表示されることを許してるからじゃないの?
0967デフォルトの名無しさん
2006/12/01(金) 21:39:481.チェック用の配列を用意して既に選んだものを選ばないようにする。
2.一つの数字を選ぶたびにその数字を抜き取って配列を詰めなおし、そこから選ぶ
0968デフォルトの名無しさん
2006/12/01(金) 21:48:430969デフォルトの名無しさん
2006/12/01(金) 21:54:06#include<stdlib.h>
int main (void)
{
int i , n;
srand((unsigned)time(NULL));
printf(0〜10:\n");
for (i=1; i<=10;i++)
printf("%d",rand());
としてみたのですが重複してしまいます
0970デフォルトの名無しさん
2006/12/01(金) 21:57:370971デフォルトの名無しさん
2006/12/02(土) 00:05:330972デフォルトの名無しさん
2006/12/02(土) 00:08:540973ぴゅあ
2006/12/02(土) 00:24:54>としてみたのですが重複してしまいます
それが
>ただし、1度出た数字は除外する
で"やりなさい"と言われている部分のことになるのではないですか?
重複してしまうというのはそこをやっていないから…というところは把握できてます?
楽に(&効率良く)片付けるには>>967-968の言っている中で3のような手段がいいだろうと思うけど
最初(初歩的?)な段階のロジックを理解させようとしているのだとすれば1のような手段かも知れないと思ったりもするけど…
或いは各々がどんなロジックを考え出すかというようなことを求めているものなんでしょうか
あるロジックの考え方の理解を深めるために出された課題だとするなら
答えを導き出す元になるものがその中には足りないようにも思えるし
その中>{1〜10までの乱数を10個発生させて表示させる。ただし、1度出た数字は除外する。}
その課題が出される前にあった講義の中にそれがあったりはしないんでしょうか
(講義の中で出された課題ということですし
どういう経緯でその課題が出されたかに沿ってないと答えを提出しても通らないと思ったりもするので…)
0974デフォルトの名無しさん
2006/12/02(土) 00:28:010975デフォルトの名無しさん
2006/12/02(土) 00:30:252chから個人サイトまでマルチポストしまくり
0976デフォルトの名無しさん
2006/12/02(土) 00:32:510977デフォルトの名無しさん
2006/12/02(土) 00:35:240978デフォルトの名無しさん
2006/12/02(土) 00:50:030979デフォルトの名無しさん
2006/12/02(土) 00:53:23yaccは生で食べれない
bisonは刺身で食べれる
あと仕入れ値がbisonはyaccより1.8倍ぐらい高め
0980デフォルトの名無しさん
2006/12/02(土) 00:55:000981ぴゅあ
2006/12/02(土) 00:55:42そか・・・
0982デフォルトの名無しさん
2006/12/02(土) 01:06:49ttp://www.nagoya-fantasia.com/pc/
ここにミラーあったよ
0983デフォルトの名無しさん
2006/12/02(土) 01:16:20アッー!!
0984デフォルトの名無しさん
2006/12/02(土) 01:21:390985デフォルトの名無しさん
2006/12/02(土) 02:06:30それがコンパイラが欲しいという意味なら
ttp://bdn.borland.com/museum/
ここにある Turbo C 2.01 が最高にオススメ。
統合開発環境があった方がいいというなら Turbo C++ 1.01 という選択肢もアリ。
0986デフォルトの名無しさん
2006/12/02(土) 05:45:30日本語なら文法や意味があいまいだったり間違えて書いたりしても
読む側が推測してある程度は理解してもらえるけど、
C言語のコンパイラはそんなことないからな。
頑張れ。
0987デフォルトの名無しさん
2006/12/02(土) 06:01:20fprintf(output2,"%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",bin[0],bin[1],bin[2],
bin[3],bin[4],bin[5],bin[6],bin[7],bin[8],
bin[9],bin[10],bin[11],bin[12],bin[13],
bin[14]);
0988デフォルトの名無しさん
2006/12/02(土) 06:06:32int i;
for (i = 0; i < 15 - 1; i++)
fprintf(output2, "%d\t", bin[i]);
fprintf(output2, "%d\n", bin[i]);
0989デフォルトの名無しさん
2006/12/02(土) 06:17:48>>988 のは立に数値が保存されてくじゃないですか。
1 2 3 4 みたいに
横に並べて保存したいのです。
FILE *output2;
output2=fopen("1ca_dist.dat","a");
てしたので、シミュレーションする毎にデータに追加されて、
何十回かシミュレーションして各ビンの平均値を出したいのですが。
なにか、うまいこと出来ないかのう?
0990デフォルトの名無しさん
2006/12/02(土) 06:28:21>>988試してみて言ってるのか?
0991デフォルトの名無しさん
2006/12/02(土) 06:44:270992デフォルトの名無しさん
2006/12/02(土) 06:46:110993デフォルトの名無しさん
2006/12/02(土) 07:01:060994デフォルトの名無しさん
2006/12/02(土) 07:08:31早とちり。
0995デフォルトの名無しさん
2006/12/02(土) 07:13:45int 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を生成するようにする
0996デフォルトの名無しさん
2006/12/02(土) 08:17:290997デフォルトの名無しさん
2006/12/02(土) 10:18:50http://pc8.2ch.net/test/read.cgi/tech/1165022193/l50
0998デフォルトの名無しさん
2006/12/02(土) 12:46:31何がしたいのかわからん
0999デフォルトの名無しさん
2006/12/02(土) 13:06:58を悩ませたいんだと思う
1000は譲るよ
1000デフォルトの名無しさん
2006/12/02(土) 14:16:4410011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。