1 :
デフォルトの名無しさん :
2006/11/09(木) 00:31:01
3 :
955 :2006/11/09(木) 01:01:54
4 :
デフォルトの名無しさん :2006/11/09(木) 01:04:42
&がないとさ、例えばxの中身が0x1000なら、0x1000に書き込んじゃうんだよな?
5 :
デフォルトの名無しさん :2006/11/09(木) 01:21:12
cやってみたいんだがまず何をすればいいんだ
7 :
6 :2006/11/09(木) 01:23:01
>>5 転龍呼吸法でいいんじゃね?
マジレスすると本買って地道に一つずつ覚えて行ってくれ。
本か…
人生を諦めることからはじめよう。
12 :
デフォルトの名無しさん :2006/11/09(木) 03:07:05
sleep(500); で、実行を待たせる処理を行いたいと思っているんですが、 sleepは何をインクルードすれば使えるんでしょうか? webを検索してみてもすぐには出てきませんでした・・
unistd.h
14 :
デフォルトの名無しさん :2006/11/09(木) 03:41:10
12です
unistd.hは、windows環境ではない
unix環境のファイルなのですね。
すいません、今更ながら前スレを検索したところ、
630 :デフォルトの名無しさん :2006/11/02(木) 02:18:51
>>628 >警告 W8065 bintori.c 55: プロトタイプ宣言のない関数 'sleep' の呼び出し(関数 main )
プロトタイプ宣言がないと言われている。sleep関数のプロトタイプ宣言が書かれた
ヘッダファイルをインクルードすればいい。どのファイルかはMSDNあたりで自分で探して。
とあり、MSDNライブラリーを探したところ、
.net frameworkの中にはあるとのこと。
しかし.net frameworkが無い環境も想定しなければならず、
その場合自前で時間を計り、
導入するしかないと言うことなのでしょうか。
(長々すいません)
C言語(gcc)で書いたプログラムから SJISでCR/LFのhtmlファイル→EUCでLFのhtmlファイル に書き出すのに system("nkf --unix abc1.html > abc-1.html") system("nkf --unix abc2.html > abc-2.html") system("nkf --unix abc3.html > abc-3.html") ・ ・(実際はfor文を使ってます。) ・ system("nkf --unix abc16.html > abc-16.html") のように使っているけど、文字コードや改行コードを変換するのに 何か他に常套手段てあるんでしょうか? 正常に終了すれば 元ファイル28KB→書き出したファイル28KBでファイル容量は変わらないのに たまに2・3個失敗していて、書き出したファイルが0KBになっていたり 元ファイル28KB→書き出したファイル22KBになっていたりします。
>>15 nkfが失敗しているってことか?
だったら自前で変換するとかiconvライブラリを使うとか。
>>14 sleep()じゃなくて Sleep() だか _sleep() って名前じゃね?
windows.h wincon.h
のどっちかだったよ。
>>14 俺の環境だと
#include <dos.h>
void _sleep(unsigned seconds);
複数のヘッダファイルに名前が入ってる標準関数は、どのヘッダから呼んでも構わないんでしょうか?
試したんですが、何か違いがあるのかなと思って…
24 :
デフォルトの名無しさん :2006/11/09(木) 18:03:57
>>19 内容が同じでエラーでないならいいんじゃね?
25 :
デフォルトの名無しさん :2006/11/09(木) 18:13:28
26 :
デフォルトの名無しさん :2006/11/09(木) 20:13:20
27 :
19 :2006/11/09(木) 20:55:50
>>24 ですよ…ね?
>>25 必要に応じてコードで使われている標準関数が多く書かれてるヘッダを選べばいいってことでしょうか?
該当の関数それ一つしか使わないならどちらでもいい、のかな
>>26 上で話題になってたsystem関数です
VC++とLSICの両方でINCLUDEフォルダにstdlib.hとprocess.hにありました
むしろ自分で直接プロトタイプを書いてもおk
29 :
デフォルトの名無しさん :2006/11/09(木) 21:09:49
main() { float r, s; printf("円の半径を入力 :"); scanf("%f", &r); s=3.14*r*r; printf("s=%f\n", s); } で警告 W8070 test3.c 10: 関数は値を返すべき(関数 main ) と出るんだがなんで?
関数は値を返すべきだから
31 :
デフォルトの名無しさん :2006/11/09(木) 21:12:11
32 :
19 :2006/11/09(木) 21:12:15
>>28 あ、ほんとですね
ヘッダをincludeする代わりに単純にint system(const char *);でも行けました
33 :
デフォルトの名無しさん :2006/11/09(木) 21:12:30
main() → int main(void) return 0;の追加
35 :
デフォルトの名無しさん :2006/11/09(木) 21:13:50
はじめたばかりで全然わからんのだが main()だけじゃだめなのか? そんで最後の}が10のところなんだ
>>29 main()でもtest()でもなんでもいいだが, 明示的にtypeが指定されていない関数は,
暗黙の内にintを返す関数として扱われるから.
#include <stdio.h> は入れてるよな?
38 :
デフォルトの名無しさん :2006/11/09(木) 21:17:03
39 :
デフォルトの名無しさん :2006/11/09(木) 21:17:07
>>37 それが無ければ真っ先に未定義の関数〜みたいなエラーが出ると思うんだが
初心者におすすめのHP教えてくれ
41 :
デフォルトの名無しさん :2006/11/09(木) 21:18:33
HP:100くらいないと厳しい
42 :
デフォルトの名無しさん :2006/11/09(木) 21:18:55
本格的にやるならVCとかがないと厳しいのかな
>>39 #includeなくてもコンパイルできるよ。
45 :
デフォルトの名無しさん :2006/11/09(木) 21:21:45
return 0; ってなんなんだ?
46 :
デフォルトの名無しさん :2006/11/09(木) 21:22:36
文字同士が同じかどうかを調べるのはどうすればいいんですか。 size_t len = wcslen((wchar_t*)path)-1; wchar_t c = path[len]; if( c == L"\\") swprintf_s( path, wcslen(path)+1, L"%s\\",path); こうするとなぜかcがInt扱いになってるんですけれども。
>>46 vc2003だと、これもエラー無しでコンパイル&実行できるけど?
main()
{
printf("%s\n", "aaaa");
}
Cって文字の表示・入力しかできないのか
51 :
デフォルトの名無しさん :2006/11/09(木) 21:32:39
>>48 それは知らなかった
でも2005じゃエラー吐くな
52 :
デフォルトの名無しさん :2006/11/09(木) 21:33:14
>>45 int main(void)
{
return 0;
}
mainもひとつの関数
関数で値を返すにはreturn が必要
55 :
デフォルトの名無しさん :2006/11/09(木) 21:34:18
>>53 Cとしてコンパイルしたらエラー無くちゃんとできたんだぜ
すげえなww
関数で値を返すってどういうことなんだ
57 :
デフォルトの名無しさん :2006/11/09(木) 21:35:49
>>56 関数の処理が終了して、呼び出し元に制御が戻ってきたときに、関数の中でreturnしたデータを、呼び出し元で使えるってこと
値を返さないと関数とは言えないしな。
値を返すファンクションを関数とよぶ。
>>62 意味が分からん
頭痛が痛いみたいなもんか?
値を返すプロシージャと言いたいのかな
値をreturnする関数のファンクションが返すプロシージャが 呼び出し元に制御が戻った。
戻り値がない場合はなんと呼ぶべきか サブルーチン ファンクション どっちがいい?
関数って何だとかくだらん質問してるやつはケチってないで本買え。
カオスになってきたな
カボス?
カバオ?
>>66 ファンクション。
だが「関数」ではない。
まーた始まった
74 :
デフォルトの名無しさん :2006/11/09(木) 23:40:56
ゲ製作のHSPスレより来ますた
648 名前は開発中のものです。 sage 2006/11/09(木) 23:24:53 ID:OlISg2Xa | ▲上 | ▼下 | リロード | 10件 | 50件 | 100件 | 300件 | 1-100 | あぼ〜ん
こんなん作りました。ソース付きです。まだ完全ではないです。
http://newsstation.info/up/img/ns15294.zip MD5:093BFE17333C4CB0C99D36CC674143F1
関数ポインタってsugeeeee ごちゃごちゃと表記する意味がよく判らないが (typedefはしなくてもいいらしいが、何を何にtypedefしてるのかさっぱり分らない) とにかく今まで悩んでたあんなことやこんなことに活用できそうな気がしてきた
76 :
74 :2006/11/09(木) 23:59:14
見事誤爆。駄目だな俺
77 :
15 :2006/11/10(金) 00:58:01
>>16 ありがとうございました。
とりあえずiconvライブラリ使ってみることにします。
78 :
デフォルトの名無しさん :2006/11/10(金) 09:06:20
79 :
デフォルトの名無しさん :2006/11/10(金) 14:09:20
Cで コマンドを発行し、その結果を得たいのですが サンプルはどっか転がってないですか?? たとえばCで ifconfig と発行し、その結果を得たい。
man popen
test
直った
なにが?
ちょっと落ちてた
やっぱそうだったんだ リロードしてもエラーだからおかしいと思った Linux板クノッピスレも落ちてた
>>49 C言語に文字の入出力機能など御座いません。
それらは総てライブラリの仕事です。
ライブラリも含めてC(の処理系)。 ライブラリが無ければ、それは単なるCのコンパイラというだけ。
>>86 こういうことを言ってみたい年頃なんだよな。
でもまあ思い違いしてる人も多いしそれを正してやるのはよいことじゃない?
昔、Cが流行になったろにpascalやらfortranとの比較で、IOがシンタックスに組み込まれてるか、 ライブラリになってるかとかって話題があって、そういうことを言ってるんだろうけど、 「入出力がC言語にない」って言い方は正しいのか?
ヒント:「文字の」
引数=入力 戻り値=出力
VRAMいじれるOSなら可能だろ。
まあ組込なら常識なんだがね
98 :
デフォルトの名無しさん :2006/11/11(土) 14:14:56
bccでWindowsXP上でconsoleアプリ(単純なスクリーンエディタ) をつくってるんですが、 画面のスクロールをconio.hのputchで全行書き直し, movetextとかins/dellineとかを試したのですが 更新時間がとても遅く(0.3sec/line程度)なってしまいました。 VRAMをいじらずに標準(的)なライブラリで うまく実装する方法を教えてください。
アルゴリズムが同じなら関数は一個で済む罠
たしかに。
分かり難くてすみません、どれもというのは、 どのコンパイラに付属する標準関数のものでもって意味です…
どのコンパイラに付属する(同じ名前の)標準関数、でした
違うよ 基本的にアセンブラで書かれてるはずだから CPUや処理系に依存
ああ、アルゴリズムか。 開発者に聞かなきゃわからないけど アルゴリズムは大体似通ったものにはなるんじゃないかな
プ
笑わないでくださいよ〜いっしょけんめい答えたんだ辛さ〜(><)
108 :
99 :2006/11/11(土) 15:24:09
笑われたから違うかもです(><)
違うよ。
正しい答えを教えてあげてください(><)
アルゴリズムは大して変わらないだろうが、実装レベルではCPUと環境によって様様だろう。
113 :
99 :2006/11/11(土) 15:39:09
あ、いえ、105の方がそうらしいならそっちは今は気にしてません 開発者に聞かなきゃ分からないようなこと聞いてすみません
ちょっとまて、コンパイラ付属の標準関数がアセンブリで書かれてるわけなくね? コンパイルオプションでアーキテクチャ指定されたときどうすんだよ。
すまん Linux(RHEL AS4)の rawデバイスに対してdatファイルを writeして、readでInvalid Argument (errno=22) エラーになるんだがこれって本当に読み出し 出来てないのかな? rawデバだから読み出し出来てないってOSが 認識してるだけだと思ったんだけど・・・ どうやったら正常にreadさせられるのか どなたか教えてくださいませ
>>112 malloc()のような低水準の処理はアセンブラか機械語、
でも機械語はあり得ないからやっぱりアセンブラだと思うんですけど(><)
malloc自体にはアセムは使ってないと思うぞ。
単純なメモリ操作だからかな
121 :
デフォルトの名無しさん :2006/11/11(土) 16:11:04
ある本のamazonのコメントで、 >ブロックと関数とループを混同していることなどは看過できない とあるのですが、これは、どういう意味でしょうか? こういう批判のある本はやめといたほうがいいのですかね?
>>121 混合する奴の頭の中をみてみたい。
多分スコープ辺りだと思うけどどう書かれてるのかは気になるな。
123 :
デフォルトの名無しさん :2006/11/11(土) 16:58:44
ああ、ちなみに、「やさしいC」です。 結局はやめといたほうがいいのですか?
>>115 例えばsin()を考える。
最適化オプションを指定されていなければ関数を呼び出すであろう。
しかし、そうでないならFPU命令をインライン展開するはずだ。
更に、sin()呼び出しの前後に同じ引き数でcos()呼び出しもあったとする。
コンパイラによってはFPU命令のsincos同時演算命令を展開するかも知れん。
また、memcpy(), memset()なども大抵は極力高速になるようにインライン展開されるだろう。
斯くの如く、コンパイラ付属の標準関数がアセンブリ言語で書かれている可能性は幾らでもある。
>>122 混合する奴はいないだろ、いるのは混同する奴だ。
>>116 つ man 8 raw
というかすれ違いだ。
>>98 そもそも現在のBorland C++は、32ビットWindows用のコンパイラであり、
WindowsはVRAMを直に触らせないので、VRAMをいじるという解決策は不可能。
WindowsではWindows APIがもっともOSに近い存在。
C言語でゲームやエディタなどを作ろうと思ったらWINAPIやダイレクトXを使わなかったら コマンドプロント上での動作みたいな感じになるんでしょうか? VBとかはwindowがあることが前提っていうか、そんな感じに見えるのですが 変な質問か分かりませんが教えてくれるとありがたいです。
>>128 なんか日本語が変だが言わんとしていることは分かる。
答えはyesで、Windowsでの一般的なGUIアプリを作りたいなら、
WIN32 APIかDirectXか、またはそれらを取り込んだライブラリを使用する必要がある。
C言語のみでは、入出力としてはファイルかコンソールへのテキストのみしかできない。
128じゃないけど、なんかがっくりきた winアプリ学ばないと作れ無いのか・・・
>>130 winアプリ学ばないとってのがよく分からん
WINAPIのことか?
MSでVC無料で配布してるんじゃなかったっけ?
それ使え
VB 気分で行きたいなら、C++ で MFC あたりの VS に入ってるスケルトン使うか、 使ったこと無いから知らんけど C# あたりに行けばいいんちゃう?
133 :
デフォルトの名無しさん :2006/11/12(日) 00:42:47
#include <stdio.h> #include <time.h> #include <stdlib.h> int card[4][13]; char total[13] = {11,2,3,4,5,6,7,8,9,10,10,10,10}; char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"}; char mark[4] = {"ハート","ダイヤ","スペード","クローバー"}; int drawCard(int h); main(){ int dealer;//ディーラーの引いた合計の数 int player;//プレイヤーの引いた合計の数 int draw_digit;//引いたカードの数 int draw_mark;//引いたカードのマーク char y_n;//カードを引くか引かないかの答え srand(time(NULL)); printf("【ブラックジャック】\n");
134 :
デフォルトの名無しさん :2006/11/12(日) 00:43:58
//ディーラーが引く draw_mark = rand()%4 + 1; draw_digit = rand()13 + 1; card[draw_mark-1][draw_digit-1] = 1; dealer = total[draw_digit-1]; printf("ディーラー一枚目:%sの%s\n",mark[draw_mark-1],,digit[draw_digit-1]); printf("他は伏せる\n"); //プレイヤーが引く printf("プレイヤー一枚目:"); player = drawCard(1); printf("プレイヤー二枚目:"); player += drawCrad(1); //ディーラー2枚目以降 do{ dealer += drawCard(0); } while(dealer <= 16); //プレイヤー3枚目以降 while(player <21){ printf("もう一枚引きますか?(y\n) > "); scanf("%c",&y_n); while(getchar() != '\n'){} if(y_n == 'y'){ player += drawCard(1); } else if(y_n == 'n'){break;} } printf("\nディーラー:%d点 プレイヤー:%d点\n",dealer,player);
135 :
133、ずれてしまったので最初から訂正です :2006/11/12(日) 00:45:35
#include <stdio.h> #include <time.h> #include <stdlib.h> int card[4][13]; char total[13] = {11,2,3,4,5,6,7,8,9,10,10,10,10}; char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"}; char mark[4] = {"ハート","ダイヤ","スペード","クローバー"}; int drawCard(int h); main(){ int dealer;//ディーラーの引いた合計の数 int player;//プレイヤーの引いた合計の数 int draw_digit;//引いたカードの数 int draw_mark;//引いたカードのマーク char y_n;//カードを引くか引かないかの答え srand(time(NULL)); printf("【ブラックジャック】\n"); //ディーラーが引く draw_mark = rand()%4 + 1; draw_digit = rand()13 + 1; card[draw_mark-1][draw_digit-1] = 1; dealer = total[draw_digit-1]; printf("ディーラー一枚目:%sの%s\n",mark[draw_mark-1],,digit[draw_digit-1]); printf("他は伏せる\n");
136 :
133、ずれてしまったので最初から訂正です :2006/11/12(日) 00:46:32
//プレイヤーが引く printf("プレイヤー一枚目:"); player = drawCard(1); printf("プレイヤー二枚目:"); player += drawCrad(1); //ディーラー2枚目以降 do{ dealer += drawCard(0); } while(dealer <= 16); //プレイヤー3枚目以降 while(player <21){ printf("もう一枚引きますか?(y\n) > "); scanf("%c",&y_n); while(getchar() != '\n'){} if(y_n == 'y'){ player += drawCard(1); } else if(y_n == 'n'){break;} } printf("\nディーラー:%d点 プレイヤー:%d点\n",dealer,player);
137 :
133、ずれてしまったので最初から訂正です :2006/11/12(日) 00:47:13
//勝敗の判定 if((dealer <= 21 && player > 21)||(dealer <= 21 && dealer > player)) { printf("ディーラの勝ち!\n"); } else if((player <= 21 && dealer > 21)||(player <= 21 && player > dealer)){ printf("プレイヤーの勝ち\n"); } else{printf("引き分け\n");} return 0; } int drawCard(int h){ int draw_mark,draw_digit;//引いたマークと数 int r;//引いたカードの点数 char y_n;//カードを11として計算するか否か do{ draw_mark = rand()%4 + 1; draw_digit= rand()%13 + 1; } while(card[draw_mark-1][draw_digit-1]); card[draw_mark-1][draw_digit-1] = 1; if(h){ printf("%sの%s\n",mark[draw_mark-1],digit[draw_digit-1]); }
138 :
133、ずれてしまったので最初から訂正です :2006/11/12(日) 00:52:33
if (h && draw_digit == 1) {//プレイやターンで引いた数が1の時 do{ printf("11として計算しますか?(y_n) > "); scanf("%c",&y_n); while(getchar() != '\n'){} if(y_n == 'y'){r = total[draw_digit-1];} else if(y_n == 'n'){r = 1} } while(!(y_n == 'y' || y_n == 'n')); } else{r = total[draw_digit-1];} return r; } blackgack.c: エラー E2225 blackgack.c 8: 初期化子が多すぎる エラー E2291 blackgack.c 8: } が必要 エラー E2141 blackgack.c 8: 宣言の構文エラー エラー E2190 blackgack.c 8: 不要な } エラー E2190 blackgack.c 8: 不要な } エラー E2379 blackgack.c 23: ステートメントにセミコロン(;)がない(関数 main ) エラー E2188 blackgack.c 26: 式の構文エラー(関数 main ) 警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数 main ) エラー E2379 blackgack.c 87: ステートメントにセミコロン(;)がない(関数 drawCar d ) *** 8 errors in Compile *** このエラーの行を見ても直すに直せません。; など足りているのですが・・・ ご指摘お願いします。
139 :
133、ずれてしまったので最初から訂正です :2006/11/12(日) 01:02:15
blackgack.c: エラー E2379 blackgack.c 23: ステートメントにセミコロン(;)がない(関数 main ) エラー E2188 blackgack.c 26: 式の構文エラー(関数 main ) 警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数 main ) *** 2 errors in Compile *** ここが、どうしてもわかりません。
>>135 >char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
*これ不要、それとどうでもいいが初期化項目は12個だが・・・
>draw_digit = rand()13 + 1;
rand() と 13 の間に演算子が無い
>printf("ディーラー一枚目:%sの%s\n",mark[draw_mark-1],,digit[draw_digit-1]);
-1],,digit ,, 2つ繋がってる
>char mark[4] = {"ハート","ダイヤ","スペード","クローバー"}; これなにをしてるか分かってるか?
142 :
140 :2006/11/12(日) 01:07:40
>>135 >char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
あと文字単位(文字列ではない)での初期化 ”A” ではなく ’A’ だろ
143 :
140 :2006/11/12(日) 01:10:23
>>135 player += drawCrad(1);
Crad のスペルミス
144 :
140 :2006/11/12(日) 01:11:14
>>135 else if(y_n == 'n'){r = 1}
1の後ろにセミコロン
145 :
133、ずれてしまったので最初から訂正です :2006/11/12(日) 01:12:56
>>140 ご返答、ありがとうございます。
>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
*これ不要、それとどうでもいいが初期化項目は12個だが・・・
これに関しては参考書の通りに書いていますが・・・
違うのでしょうか?
>>141 ありがとうございます、ポインタですね。
実行できたにはできたのですが
初めてみる、エラーが出てしまいました
blackgack.c:
警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数
main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_drawCrad' が未解決(C:\BBB\BLACKGACK.OBJ が参照)
>>Error: 外部シンボル '_drawCrad' が未解決(C:\BBB\BLACKGACK.OBJ が参照)
こんなエラー初めてです。参考書のエラー対策にも載っていません。
146 :
140 :2006/11/12(日) 01:14:41
>>145 スペルミス直したか?
>drawCrad
drawCard
a と r が逆
>>133 コードを何レスにも渡って貼り付けた後に質問をするんじゃなく、
先に質問を書いてからコードを貼り付けてほしい。
もしくはコードはどこかのアップローダにあげとくとか。
148 :
140 :2006/11/12(日) 01:19:20
>>145 char digit[13] = {'A','2','3','4','5','6','7','8','9','10','J',''Q',K'};
個数足りないと思ったら Q が抜けてる
>char mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
2次元配列に
char mark[4][12] = {"ハート","ダイヤ","スペード","クローバー"};
149 :
133、ずれてしまったので最初から訂正です :2006/11/12(日) 01:20:10
>>146 できました!!!!
参考書の結果とは違いますが・・・
>>147 ごめんなさい、次からそうします
150 :
140 :2006/11/12(日) 01:23:02
>>149 >char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
そうか、ポインタ配列にそれぞれの文字列のポインタを格納してるのか
この部分は直さなくてもいいよ
でも Q は追加してね
151 :
133、ずれてしまったので最初から訂正です :2006/11/12(日) 01:23:14
>>148 ありがとうございます
自分でもきづきませんでした
>>140 >>char *digit[13] = {"A","2","3","4","5","6","7","8","9","10","J","K"};
>*これ不要、それとどうでもいいが初期化項目は12個だが・・・
char digit[13]={'A', 'B', <略> 'K' }; とさせたいようだが、
digitはchar * の配列としてソース本文?の中で使用しているのだから
元のままでいいだろう。
1文字の文字列しかないなら文字定数でも事足りるといいたいのだろうが、
それをはっきりといわなければ135が混乱するだけじゃない?
別にここのエラーとは関係の無い問題なのだし。
153 :
152 :2006/11/12(日) 01:25:57
>>150 お、書き込み気づかなかった。忘れてくれ。
>>148 2次元配列にするより
char *mark[4] = {"ハート","ダイヤ","スペード","クローバー"};
でいいだろ
155 :
140 :2006/11/12(日) 01:31:41
>>153 いやいや、実は俺こういう方法気づかなかった
いままで
char digit[13] = {'A','2','3','4','5','6','7','8','9','10','J',''Q',K'}; か
char digit[] = {"A2345678910JQK"}; のように
文字列として初期化してた
ポインタ配列って方法もあったんだなと、気づかされたよ
俺もまだまだ勉強不足だと実感・・・・・
>>154 上のと同じだな・・・・
>>149 参考書に載っているコードをそのまま打ち込んでるがコンパイルエラーになるということ?
Qが抜けてることからも分かるが、打ち込みミスが多いんじゃないか。
質問をする前に、自分が書いたソースと参考書を「一字一句」比較すべし。
>>145 >こんなエラー初めてです。参考書のエラー対策にも載っていません。
その参考書はC言語のすべてを網羅した魔法の本ではない。本に載ってないことは分からない、ではなく
もっと調べる対象を広げるべき。
コンパイラの出すエラーなら、コンパイラのマニュアルなどを調べる。
VC++とかならMSDNにたいていのことが載っている。BCCのことはよく知らんが。
すぐ上の行に
>警告 W8065 blackgack.c 33: プロトタイプ宣言のない関数 'drawCrad' の呼び出し(関数 main )
とある。プロトタイプ宣言が何かを知ってる? まずはそれをその参考書で調べること。
とりあえずコンパイルエラーがたくさん出たら、一番上のから順に解決していけ。
一つの原因から、それに連鎖してさまざまなエラーが出る。一つをつぶせばそれに関連していくつかのエラーが消えることがある。
157 :
140 :2006/11/12(日) 01:37:00
>>145 >>Error: 外部シンボル '_drawCrad' が未解決(C:\BBB\BLACKGACK.OBJ が参照)
ちなみにこれはdrawCradという関数が使われているが関数の実体が無いよ、と言っている
>>129 そうなんですか
じゃあIEとかペイントとかメモ帳とかをCで作ろうと思ったら
WINAPIやらそれ関係が入っているライブラリを呼び出して作るんでしょうか?
なんていうかその呼び出す関数もCで作られてるんですよね?
んー;;なんかよく分からない
Cがすごくできる人の定義ってなんなんでしょう・・
159 :
133、ずれてしまったので最初から訂正です :2006/11/12(日) 02:49:03
>>156 はい、ここで訊く前にもっと調べたりエラーを
たどってみます
160 :
156 :2006/11/12(日) 03:26:37
最初は調べ方が分からないのは仕方の無いこと。 問題に対する解決方法を知るのも大事だが、 自分で解決方法を見つけらるようにする方法を学ぶことも大事。 がんばれ。
>>159 プログラミングに向いてないな。いい加減コテつけっぱなしなことに気付けよ。
162 :
デフォルトの名無しさん :2006/11/12(日) 04:51:31
#define NUM 3 どうしてもソートできないのです。身長順にしたいんですが・・ 構造体の配列のソートってむずかしい。。 typedef struct Person{ char name[100]; double height; }Person; int main(void) { Person prs1[NUM]; int a,b,c,d; double tst; for(a=0; a<3; a++){ printf("名前を入力してください。\n"); scanf("%s",prs1[a].name); printf("身長を入力してください。\n"); scanf("%lf",&prs1[a].height); } for(b=0; b<NUM-1; b++){ for(c=0; c<NUM; c++){ if(prs1[c].height > prs1[b].height){ tst = prs1[c].height; prs1[c].height = prs1[b].height; prs1[b].height = tst; } } } for(d=0; d<NUM; d++){ printf("%sさんは%lfセンチです。\n",prs1[d].name,prs1[d].height); } return 0; }
>>162 Person tmp;
for(b=0; b<NUM-1; b++){
for(c=b+1; c<NUM; c++){
if(prs1[c].height > prs1[b].height){
tmp=prs1[c];
prs1[c]=prs1[b];
prs1[b]=tmp;
}
}
}
それだと構造体のソートじゃなくて 構造体のメンバ(身長だけ)を入れ替えてるだけだと思うんだけど
>char digit[13] = {'A','2','3','4','5','6','7','8','9','10','J',''Q',K'}; '10' とか書いてる時点で釣りだろ?
>>126 >>127 ありがとんです
MS-DOS時代のものを
ちょっといじるだけではだめなのですね(!=)
wincon.hをぐぐってきます〜
168 :
162 :2006/11/12(日) 10:37:55
ほんとは、名前も入れ替えたいんですけど、とりあえず身長だけでもと、 なんでtstがtmpに変わってるのか意味がわからないんですが・・ 163の文章をどこかに入れ替えればいいのでしょうか? やったんだけどうまくいきませぬ。。
man qsort
170 :
162 :2006/11/12(日) 11:27:27
できました。 c=b+1のとことPersonのとこでした。 ありがとうございました。
コンパイルでエラーが出ないようにするのを教えてください!
172 :
デフォルトの名無しさん :2006/11/12(日) 13:22:13
>>171 エラーになっている行を消す を繰り返す
>>171 エラーを出さない怠け者なコンパイラを 使う
1&>/dev/null ごめんUNIXよくわかんない
そんなこと聴いてるんじゃありません! わからないなら答えないでください!
エラーが出なくなったら大変なんだぜ
>>171 コンパイラの性能にではなく
オマエの性能をうp
理3です。
179 :
デフォルトの名無しさん :2006/11/12(日) 20:02:32
李さん?シナに帰れ
離散家族? さもありなん。
c言語の構造体についての質問なんですが、 構造体のメンバー名に変数を使用することはできないのでしょうか?
>>181 ???
試してみりゃいいじゃん
もしくは具体的な例を店ろ
183 :
デフォルトの名無しさん :2006/11/13(月) 00:27:15
>>181 メンバー名をchar配列とかで決めるってことか?
>>182 試したりしてるんですが、いかんせん勉強したてで...
>>183 まさにそれがやりたいんです
char配列で宣言したり、アクセスしたりしたいんですが...
185 :
デフォルトの名無しさん :2006/11/13(月) 00:45:51
メンバー名は区別のための名前であって文字列じゃないから無理じゃね?
>>185 やっぱ無理ですか...
無理だと分かるだけでもありがたいです。
どうもありがとう
変数名を変数で指定できるか、みたいな感じだな。
str_bの中身をstr_aにコピーするプログラムですが 上の関数の中身をs1=s2;にしたらコピーできない理由がわからないです 1文字ずつ比較しないとだめなのでしょうか #include <stdio.h> #include <string.h> #define MAX 10 void str_copy(char *s1,char*s2) { while(*s2!='\0') *s1++ = *s2++; *s1 ='\0'; } int main(void) { char str_a[MAX]="abcde"; char str_b[MAX]="fghi"; printf("str_a:%s, str_b=%s\n",str_a,str_b); str_copy(str_a,str_b); printf("str_a:%s,str_b=%s\n",str_a,str_b); return 0; }
それだと、関数内でアドレスをコピーしたにすぎないし、 呼び出し元のstr_a, str_bには全く影響受けない
ヘタレはC++でもやってろよ(プ
ヘタレはC#でもやってりょ(ぷ
struct aという構造体は自分と同じstruct a型の変数をメンバとすることができない理由がわかりません。教えてください
#ifdef MODE "モード1選択" #else "モード2選択" #endif #ifdefでどちらが選択されたかをコンパイル時にコンソールに表示したいのですが、 なにか方法はないでしょうか?
コンパイラのヘルプ見ろ。 # 多分 #pragma で出ることが多い
#pragma message("モード2") #message モード2 でできました。有り難うございました。 C51を使用してますが、手持ちのヘルプには記載ありませんでした。
198 :
デフォルトの名無しさん :2006/11/13(月) 16:17:20
C言語の質問なんですが、 double型の変数で整数の部分だけを出力するにはどうしたらいいですか?
>>198 double val = 1234.5678;
printf("%.0f");
->1235
printf("%d", (int)val);
->1234
>>199 ありがとうございます
切捨てと切り上げの両方できるんですね。
そしてsage忘れてすみません・・・。
%0.fは切り上げではなく、丸めている。 切り上げはceil。 切り捨てのfloorもある。
>>192 struct a(a1) に struct a(a2) を持たせるとその struct a(a2) もstruct a(a3) を持つのでその struct a(a3) はさらに struct a(a4) を持つので(ry
となってしまう
struct a へのポインタなら持たせられるにょ
>>201 (VC++の場合)まるめの方向が0へ向かう四捨五入(?)っぽいね?
printf("%.0lf %.0lf %.0lf %.0lf", -123.5, -123.4, 123.4, 123.5);
→ -124 -123 123 124
このときの振る舞いは環境依存?
>>203 C言語としては負数のとき丸め方向は定義されてないから
コンパイラの実装依存と思う
と調べずにカキコ
205 :
デフォルトの名無しさん :2006/11/13(月) 19:21:42
CとC+とC++とC#の違いがわかりません。 素人なんですが、わりやすくどなたかおしえていただけないでしょうか?
>>203 単に絶対値で丸めってだけじゃね
と便乗して調べずレス
>>205 文法が似ているのと、ライブラリ関数が似ているだけで
まったく別の言語です
208 :
デフォルトの名無しさん :2006/11/13(月) 20:08:42
>>208 Cを拡張、ベースにしたもの
まぁCをまねてC+やC++など作ったみたいな
結果的には別物...
CとObjectCだけ覚えればOK
211 :
デフォルトの名無しさん :2006/11/13(月) 20:30:36
>>209 >>210 とりあえずCを勉強すればC+やC++などの方にも応用がきくといった感じですか?
ありがとうございました。
C+とかC++なんて覚えるだけ無駄。 限られた特定の環境でしか使わない。 覚えるなら Objective-C にしろ。
偶にいるんだよな、敵作りの天才って
これから流行るならって観点ならC#だろう。 それでもC++すきだけどな
C++はCと微妙に互換性がないからなあ。 Objective-CはCとの互換性があるけど、現実的じゃない。
216 :
デフォルトの名無しさん :2006/11/13(月) 20:53:03
皆さん色々なアドバイスありがとうございました。 とりあえずCを勉強してみようと思います。
>>214 C#は流行るか?
何かすぐ消えそうな気がする
JAVAと同じ運命をたどる
219 :
デフォルトの名無しさん :2006/11/13(月) 21:30:27
>>217 同意。俺の周りにはC#やってる奴はいない
毎日書きまくってますよ>C#
221 :
デフォルトの名無しさん :2006/11/14(火) 01:49:25
C言語で10進数を2進数で表すにはどーすればいいですか??
んでstrtol()などで変換
Cができないから毎日カキまくってますよ
オブジェクティグCってWindowsで使える処理系あるの? Mac専用でしょ?
226 :
デフォルトの名無しさん :2006/11/14(火) 02:50:36
関数をマクロに上手く置き換えると、 戻り値や引数を展開しないので 動作が速くなると言うが、 戻り値void、引数なしの場合は早くなるんでしょうか? (・・というかvoidも型か・・) 関数を実行するだけで、何か値が動くと思うので、 そのせいでマクロよりは多少遅いものなのでしょうか?
227 :
デフォルトの名無しさん :2006/11/14(火) 02:53:57
指定されたファイルに書かれている整数を、逆順に表示するプログラムをつくるにはどのようにすればよいのでしょうか? 例えば、123 456 78 と入力されると、 78 456 123 と表示されるようなのです。
>>227 ぱっと思いつくのは2通り。
1.全部配列に読み込んで逆順に出す
2.ファイルポインタをftell()で取得して配列に入れ、fseek()で逆順に出す
229 :
デフォルトの名無しさん :2006/11/14(火) 03:50:16
何故、char str[] = "CAT" ; だけでポインタが付くと char str*[] = {"CAT","DOG"}; になっていいのでしょうか?
>>229 前者はchar型の配列
後者はchar型へのポインタ配列
意味が全然違う
231 :
デフォルトの名無しさん :2006/11/14(火) 04:10:38
int total[6] = {1,2,3,4,5,6}; で添え字0から始まるので 予め -1 にしておくとは、どういう意味でしょうか?
>>231 日本語で書いて
それだけじゃ意味わからんぞ
233 :
デフォルトの名無しさん :2006/11/14(火) 04:37:06
>>230 サンクスです。
どうして、*が付くとそう書けるのかがわかりません
変数を宣言したとき、 メモリはどうなるのか教えてください。 あと、絶対にほかのプログラムのメモリにはアクセスできない のでしょうか? というか、Cの質問じゃないですかね?
*←肛門
>>234 メモリが予約されるが、その中に何が入っているかは未定。
前そのメモリ空間を使っていた変数の値がその領域にのこったまま
だったらそれがそのままその領域に残ってる(初期化してくれない)
したがって宣言時に予約した領域に無意味な値を入れて安全にする
(初期化)ことが重要な場合が・・ある
>>233 int foo = 5;と書いて
int fooz[] = {1, 2, 3, 4,};と書くが如く、
char * bar = "aho";と書いて
char * barz[] = {"tako", "ika", "kurage",};と書く。
>>226 今時のコンパイラはインライン展開もするから、下手な小細工考えずに関数で書け。
そしてその関数だけでなくプログラム全体でプロファイリングしろ。
話はそれからだ。
239 :
デフォルトの名無しさん :2006/11/14(火) 08:30:14
>>238 226です。ありがとうございます!
インライン展開、プロファイリングという言葉を初めて知り、
調べることが出来ましたyo
240 :
デフォルトの名無しさん :2006/11/14(火) 08:35:34
@printf()等の書式指定で 数値を指定桁数まで右スペース埋めしたいのですがどのように書けば良いのでしょうか? 左埋め… printf("%4d",10)→" 10"を出力 右埋め… printf("?",10)→"10 "を出力 Aまた、上記の桁数(4)も動的に指定するにはどのように書式を指定すれば良いのでしょうか? よろしくおねがいします。(性的な意味で)
>>240 printf("%-*d", 4, 10);
242 :
デフォルトの名無しさん :2006/11/14(火) 09:12:00
朝早くからありがとうございます!(性的な意味で)
早くないよ・・・速いけど・・・(性的な意味で)
整数nが与えられたとき、 n×nのサイズで螺旋状に0から(n二乗ー1)までの数が並ぶ行列を作成し、 画面に表示させるプログラムって配列を使って組むにはどうすればいいでしょうか? ヒントだけでもいいので教えてください。お願いします。
typedefとdefineで書き方が逆になるのはなぜなんですか?
typdef は複数の句をあつかうから だと思われる。 typedef unsigned long (*function_ptr)(int, long, long); のようにね。
248 :
デフォルトの名無しさん :2006/11/14(火) 19:38:43
画面から16進数を入力して10進数に変換する処理ですがstrtol関数を使って 16進以外が途中に入力されたらエラーを出力したいのですが、何か良い方法はありますか?
画面から入力ってどんな技術を使うんだよ?
>>249 馬鹿だなぁ
タッチパネルに決まってるだろ?
板検索しても最初ここが出てこなかったのですれ立てるまでもない質問スレに書き込んでしまったのですが、 改めて質問させて下さい。コピペになりますが、よろしくお願いします。 グーグル先生に質問してみたのですがよくわかりませんでした・・orz 宜しければ詳しく教えて欲しいのですが。 C++にて、テキストファイルに書き込まれたデータを構造体に格納する方法です。 データは一行につき1件で、カンマで区切られて4つの項目があります。 char型が2つとint型が2つになります。 データは10件(行)あります。 よろしくお願いします(´・ω・`)
たったの10件程度なら手作業でやるのが早いよ。
知識としても理解しておきたいので、どうか(´・ω・`)
>>251 >C++にて
スレ違い。
>テキストファイルに書き込まれたデータ
>char型が2つとint型が2つ
それはテキストファイルではない。
>254 すいません、Cでお願いします。 書き方が悪かったです。 文字列,文字列,数字,数字 という構造になっているので、構造体の宣言でchar型を2つとint型を2つ用意する必要があるという事を言いたかったんです
>>255 文字列は(char型)配列に格納してください。
ペイピッポォ
int main(){ struct xxx {int *x;} hoge; struct yyy {void *x;}; struct yyy *piyo = (struct yyy *)&hoge; return 0; } これはコンパイルが通ったのですが、四行目を struct yyy piyo = (struct yyy)hoge; とすると型変換できませんとエラーが出ます、何故でしょうか?
260 :
デフォルトの名無しさん :2006/11/14(火) 22:02:56
>>259 (struct yyy)hoge
このキャストは無理
struct xxxとstruct yyyは全く無関係の型だから。
262 :
259 :2006/11/14(火) 22:05:21
>>260 ,261
構造体自体のキャストは出来ないんでしょうか?
検索するとC++とかではできるらしい?のでためしてみたんですが
264 :
259 :2006/11/14(火) 22:19:22
>>263 同じ日に…いえ、その人は別の方です
C++でも構造体をキャストできているわけでなないんですね
可能だとしても意味はほとんどないんでしょうけれど、疑問に思ったので…
(メンバーの数が違っても)構造体のポインタはキャスト可能ということは
領域破壊でバグの原因になったりしそうでどっちにしろ危険っぽいですね
ありがとうございました
265 :
デフォルトの名無しさん :2006/11/14(火) 22:22:36
ふつう構造体のポインタのキャストで実際に使うのは struct XXX *p <-> void *p くらい
どうもです、mallocの時〜は、自動でキャストしてくれるんでしたっけ じゃあ自分のレベルではまだ使うこともなさそうですね
>>266 まま、そうおっしゃらずに。
実はいける口なんでしょ?
typedef struct{ int length; char data[1]; }string; struct{ int length; char data[buf_size]; }a; のとき (string)a のようにキャストするのもテクニックとしては知っておいたほうがいいかも
269 :
259 :2006/11/14(火) 23:01:41
せいぜい数十行のコード書いて試す、を繰り返してる程度ですから…
>>268 すみません、どのように使うんでしょうか?
270 :
デフォルトの名無しさん :2006/11/14(火) 23:02:25
すいません、先ほども質問しましたが、画面から配列に16進数を8桁入力して10進数に変換する処理ですがstrtol関数を使って 16進以外が途中に入力されたらエラーを出力したいのですが、何か良い方法はありますか? 気になって眠れません。
>>270 どこまで変換したかってポインタが設定されるから、それを見たら?
途中で止まってたらおかしい。
273 :
デフォルトの名無しさん :2006/11/14(火) 23:19:07
>>271 さん
第一引数は配列名で第三引数は基数、第二引数をみるのですか?
>>269 268ではないが。
C言語ではコンパイル時に配列のサイズが決まっている必要があるが、
サイズを動的に変えられる(かのように扱える)構造体を使うためのテクニック。
配列のサイズは固定なので、基本的に最大の要素数を格納できるような
型を用意しておく必要がある。これでは、要素数の少ないデータしか
格納しない場合に無駄が多い。
よって、ケースバイケースで配列の要素数の異なる型が使えると嬉しい。
以下のようにすれば任意の要素数の配列として動的に確保できる。
string *p;
int size = 30;
p = (string *)malloc(sizeof(string) + sizeof(char)*(size - 1);
p->length = size;
この構造体を操作するときは、配列部分のサイズが固定じゃないから、
lengthメンバのようにどこかで配列サイズを保持しておき、
その分だけをアクセスするようにすればいい。
void func(string *pstr)
{
int i;
for(i = 0 ; i < pstr->length ; i++) {
printf("%c", toupper(pstr->data[i]);
}
}
当然、構造体の最後のメンバにしか適用できない。
>>275 仕様書に違反している事には変わりがないけどな。
使うときは自己責任でって奴だ。
C99ではchar data[]って書き方が正式に許されたが。
sizeof(char) は常に 1 なんだけど・・・ ま、いっか。
278 :
デフォルトの名無しさん :2006/11/15(水) 02:04:53
2次元配列の意味がわかりません、簡単に言うと どういう事なのでしょうか?入門書の説明が難しくて わかりません。 あと、コメントが文字列なので2次元配列は、 どうして使えないのでしょうか?
>>278 例えば学校で40人のクラスが5クラスあったとする。
その場合
int data [5][40];
とかになる
>あと、コメントが文字列なので2次元配列は、
>どうして使えないのでしょうか?
これは言ってる意味がわからない
>>278 もしかして二次元配列とポインタの関係がわからなくて悩んでいるのか?
最初はポインタ無視していいよ。
>>279 の通りでいい。
>コメントが
これは俺も不明な質問だが、文字列の二次元配列という意味なら、文字列
そのものが既にchar型の一次元配列なので、1+2=3次元配列が必要になる。
例えば
char [][2][10] = {{"orange", "apple"}, {"banana", "pine"}};
のような感じで。
281 :
278 :2006/11/15(水) 03:07:40
>>279 わkりました!!
>>280-
>>279 >>コメント
入門書にも詳しく書かれていないので、
自分でもよくわかりません、すんまそ。
>>char [][2][10] = {{"orange", "apple"}, {"banana", "pine"}};
のような感じで。
難しいです・・・まだここまで習っていないので参考にさせて
戴きます、頭が混乱するといけないので。
ありがとうございました。
282 :
デフォルトの名無しさん :2006/11/15(水) 03:51:46
#include <stdio.h> #include <time.h> #include <stdlib.h> //すごろくマップの構造体 struct board{ int p;//進む数 int h;//休む回数 char comment[128]; }; int p_position = 1; //プレイヤーの現在位置 int max = 10; //マップの全駒数 void writeBoard(void);
283 :
デフォルトの名無しさん :2006/11/15(水) 03:52:25
main(){ int player; //プレイヤーのサイコロの目 int add; //止まった駒の進む数を格納する struct board sugoroku[] = { {0,0,"スタート"}, {0,0,"2駒目"}, {0,0,"3駒目"}, {3,0,"4駒目。3つ進む"}, {-2,0,"5駒目。2つ戻る"}, {0,0,"6駒目"}, {1,0,"7駒目。1つ進む"}, {0,0,"8駒目"}, {0,0,"9駒目"}, {-4,0,"10駒目。4つ戻る"} }; printf("【すごろく】\n"); srand(time(NULL)); for(;;){ //サイコロを振る printf("\nプレイヤーの番です。サイコロを振る > "); while(getchar() != '\n'){} player = rand()%6 + 1;
284 :
デフォルトの名無しさん :2006/11/15(水) 03:53:05
//位置決定&マップ移動 p_position += player; printf("目:%d\n",player); if(p_position > max){break;} //追加移動 do{ add = sugoroku[p_position-1].p; printf("%s\n",sugoroku[p_position-1].comment); p_position += add; } while(add != 0); if(p_position > max){break;} //現在位置の表示 printf("現在位置%d / %d\n",p_position,max); writeBoard(); } printf("あがり\n"); return 0; }
285 :
デフォルトの名無しさん :2006/11/15(水) 03:54:41
//現在位置を表す関数 void writeBoard(void){ int i; for(i = 0; i < max; i++){ if(i == p_position-1){ printf("プ"); } else{printf("□");} } printf("\n"); } これで、合っていますが疑問があります。 >>[p_position-1] で、-1と言うのが疑問です。何から-1にしているのでしょうか?
>>285 質問に愚直に答えるなら、
p_positionから-1にしている。
日本語が不自由な君に軽くエスパーを駆使すると
配列の添え字が0から始まるのに対し、
p_positionは1から始まっているから。
287 :
デフォルトの名無しさん :2006/11/15(水) 05:09:17
289 :
259 :2006/11/15(水) 07:16:45
>>275 ,276
あ、(string)aというのは本当にそのままキャストするってことではなくて
領域についてこういう風な考え方もできるから知っておくといいという意味でしたか
現場ならではって感じですね、ありがとうございました
質問です。 printfの%sに対して数値の0を渡したら、 文字化けやエラーではなく「(null)」という文字列が表示されました。
>>290 だって0 == '\0'なんだもん
空の文字列だと思ったんだもん
でも、違うかなと思って気を利かせたんだもん
おおっと! 意外なことで291の無知が発覚してしまいました!
ハァ? 0 == "\0" は真だろ。 無知はお前の方だろww
>>290 環境依存。
未定義の動作だから処理系によって動作は違がう。
その例は単なるフェイルプルーフだからその動作を期待してはいけない。
0 == '\0' は真だが 0 != "\0" だろ
>>294 私のために争わないで!!
勘違いしただけなんだもん
0==NULLなんだもん
だけど、参照できなかったんだもん
引数として受け取った文字列を逆順にした文字列に書き換える関数 を作りたいんですけど、どうすればいいですか? 自分は char str[6]; int i; for (i=0;i<6;i++) { str[i]="文字列"[i]; } printf("%s\n",str); return 0; } こういう奴をいじっていくつもりなんですけど。
まず「逆順」の定義を。
>>298 #include <string.h>
#include <stdlib.h>
char* reverse(char str[]) /* return NULL if error */
{ int i, len=strlen(str); char* buf;
if ((buf=(char*)calloc(sizeof(*buf), len)) == NULL) return NULL;
for (i=0; i<len; i++) buf[i]=str[i]; for (i=0; i<len; i++) str[i]=buf[len-1-i];
free(buf); return str; }
>>299 unkoだったらoknuって出るようにします
>>300 すいません、まだポインタ習ってないです。
if(strcmp(str,"unko")==0) printf("oknu");
304 :
298 :2006/11/15(水) 14:16:45
わからないことの内容に含まれると思うので言い直します><
ポインタ無しで
>>298 を(逆順の定義は
>>301 )解決したいです
どなたかお願いします。
文字列の連結やらコピーをするくらいまではなんとかできます。
306 :
298 :2006/11/15(水) 14:26:38
>>305 それは困ります><
できたらできたほうがいいです
307 :
298 :2006/11/15(水) 14:32:49
>>306 は自分じゃないです。
>>301 は だったら って書いたので例えのことです。
これだったら
>>1 でいう詳しく書いたことにならないようなので、
言い直すと入力した文字の後から1つ1つ順番に出力したいです。
だから多バイト文字を1文字として扱うか複数文字として扱うかを訊いてんの。
漢字1文字にかかるデータ量 が Cのデータ上で1つになるとは限らない。
CRLFの問題もあるけどね
311 :
298 :2006/11/15(水) 14:48:15
>>309 すいません、それすら知りませんでした。
>>308 >>298 は課題が出たからわからないので聞きにきたんですが、
問題の内容にすら書いていません。今までの課題の流れだと日本語を入力したことがないので
流れから判断して多バイト文字は無視でお願いします。
312 :
デフォルトの名無しさん :2006/11/15(水) 14:52:55
宿題スレでやれ
char str[6]; int i,k=6; for (i=0;i<6;i++) { str[i]="文字列"[k--]; } printf("%s\n",str); return 0; はいはい俺天才
str[5] = '\0'; え、、えへへ
>>314 いや、大きさが足りない
(男の人に言ったらまずかった?)
釣りは釣りスレでやれ。
k-- → --k
str[6] → str[7]
勉強になりました
322 :
大学生 :2006/11/15(水) 22:26:24
「問題16」eの値を実数として計算し表示せよ。 「問題17」πの値を実数として計算し表示せよ。 「問題18」eの値を小数点以下60桁まで求めよ。 「問題19」πの値を小数点以下60桁まで求めよ。 この問題16.17.18、19のC言語プログラム(C++)でお願いします。 それと多倍長少数を利用して作ってください。
C言語の入門サイトを見て回ってVC++ 2005 ExpressEditionをインストールしたのですが いろんなところでとりあえずこれでやってみれと書いてある Win32コンソールアプリケーションで作ると追加できるソースファイルが*.cppです とりあえずHelloWorld!は出たんですが *.cファイルが追加できるように設定しといた方がいいんでしょうか?
別に cpp でいいんじゃない?
ファイル名を指定する時に拡張子付きで入力しろ。
327 :
327 :2006/11/16(木) 03:22:17
テキストファイルを読み込んで特定の箇所を上書きしたんですが、 その書き換えかたがわかりません。教えていただけませんでしょうか><; 以下のように記述していまして、c(文字型)の部分に整数を入れたいんです。 while((c = fgetc(fp)) != EOF) { if(c == '特定の文字') { //ここがわかりません } }
>>327 f = ftell();
fseek(fp, 0, SEEK_CUR);
fputc(c, fp);
つまり"r+"で開いたファイルは、fseek()すればそのすぐ次には書いてもよい。
一度でも書いたらまたfseek()もしくはrewind()しないと読めない。
while((c = fgetc(fp)) != EOF) { if(c == '特定の文字') { c = 15; //任意の整数 } }
おっとっとftell()は不要でした
”上書きしたんですが”を”上書きしたいんですが”とエスパー読みしてみた
333 :
327 :2006/11/16(木) 05:13:55
>>328 さん
>>329 さん
>>331 さん
ありがとうございました。助かります。
すいません打ち間違ってしまったようで、
332の方のエスパー読みが実はこちらの言いたかったことなんです。
とすると、328の方のおっしゃったfseekを使えばいいんですか?
とりあえず使い方を調べて試してみます。
334 :
327 :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) ; } }
>>334 多分ファイルのオープンモードが"r"になってるんだと思うよ。
"r+"にしてね。
336 :
327 :2006/11/16(木) 05:43:09
>>335 さん
ありがとうございます。
モードは大丈夫みたいです。
他の文法や使い方は問題ないですか??
あ、それともう一つ fgetc(fp)で既にファイルポインタが一つ進んでいるので fseek(fp, -1, SEEK_CUR); fputc('s', fp); fseek(fp, 0, SEEK_CUR); だな
それからcはintで宣言してる?charじゃだめだよ EOFを表せないから
眠気に耐えられないので寝まつ 後は他の人に任せた
340 :
327 :2006/11/16(木) 05:53:27
>>335 さん
ありがとうございます。
確認したんですがモードは大丈夫なようです。
前後は以下のようになってますが、
関数の使い方や文法に間違いはありませんか??
もしかすると最初に見つけたSで
処理を繰り返してしまっているかもしれません。
fp = fopen("MMMMM.txt", "r+") ;
while((c = fgetc(fp)) != EOF)
{
if(c=='S')
{
fseek(fp,0,SEEK_CUR) ;
fprintf(fp, "s") ;
fseek(fp,0,SEEK_CUR) ;
}
}
fclose(fp) ;
341 :
327 :2006/11/16(木) 06:00:43
>>339 さん
ありがとうございました。
337を参考に変えてみたんですが、それでも変わりませんでした・・・。
改行したくないのでfprintfを使ってるのが問題なのかもしれません。
cは整数以外も読み込むのでcharでないとエラーになってしまうと
思います・・・。
遅くまでありがとうございました。頑張ってみます。
>>341 fgetc()の戻り値はcharで表せないEOFも返す必要から、intになっている。
従って、cはintであることが望ましい。
#つーか、charで受けるのは間違い。
それと、最初のfseek()は1バイト戻せと既に指摘されているのだがそっちは無視か?
無知な奴ほど素直じゃないのさ
345 :
327 :2006/11/16(木) 13:49:39
>>342 さん
ありがとうございます。
fseekの-1は参考にさせてもらいました。
書き込みのタイミングがかぶってしまったようです。
おっしゃるとおりcharが落とし穴だったようで、
intにしたらうまくできました!
文字はcharというド素人の固定概念が間違ってました・・・><;
これを多少応用したものを作らなければならないので、
まだ安心はできませんが、なんとかなりそうです。
助かりました。ありがとうございましたm(__)m
346 :
デフォルトの名無しさん :2006/11/16(木) 14:25:08
サーバに単純な数値だけのデータを送りたいのですが どのようにすればよいのでしょうか? windowsのマシンでCを使い linuxのサーバにデータを送るという感じです
>>346 サーバとクライアント用の二つのプログラムを用意する
(来週につづく...)
>>346 そのサーバって何?http? ftp? samba?
そのプロトコルに従って通信してください。
349 :
346 :2006/11/16(木) 14:38:53
ちなみにサーバ用はPHPを使うのですが出来ますか?
メールで送ったらいいんじゃね?
>>349 PHPってことはHTTPだろ。Winsockでも使ってやれ。
352 :
346 :2006/11/16(木) 14:54:09
>>351 そうですねhttpです
クライアント用のほうは事情があって
Cで書かなきゃならないので・・・
Winesockですか調べてみます
これはCの中でできるんですよね?
>>352 VC++, gcc, bccなどWin32APIが呼べる環境ならできる。
これ以上の話はCとは関係ないのでスレ違い。
inetd使えば?
おまいらに全てを捧げたくなる位惚れちゃってます。
>>357 悪いけど、今日は歌いたい気分じゃない・・・
fgets + sscanf でなく、scanf を使ってしまっても 構わないようなケースにはどのようなのがあるでしょうか。
ちょっと実験するためだけのような使い捨てのコードなら。
すみません、この問題のプログラムはどう作ればよいのかがわからないので ぜひ、よろしくお願いします・・・ 問題 配列su(要素数:12)に任意の数値をランダムに初期値設定し、逐次決定法によって 整列(昇順)させ、結果を表示させるプログラムを作成してください。
何とか法とか何とか論を皆が知ってると思うなよ
どうみても宿題ですありが(r
逐次決定法って何だよ。バブルソートか?単純選択法か?
365 :
デフォルトの名無しさん :2006/11/16(木) 23:08:41
任意の数値をランダムに初期値設定って何?ランダム値を初期値にするってこと? 逐次決定法が何か知らんが昇順ソートでおk?
366 :
デフォルトの名無しさん :2006/11/16(木) 23:19:29
>>366 おいいい加減にしろよ。あちこちのスレにコピペしやがって。
削除依頼出すぞ
368 :
STUDENT :2006/11/16(木) 23:29:36
「問題17」πの値を実数として計算し表示せよ。 「問題19」πの値を小数点以下60桁まで求めよ。 のCプログラム(C++)を作ってください。 多倍長少数を利用してプログラムを作ってください。
>>368 おいいい加減にしろよ。あちこちのスレにコピペしやがって。
削除依頼出すぞ
Delete(368);
>>368 printf("3.141592653589793238462643383279502884197169399375105820974944");
int Test(int iParamCount,...) { char* pParam[20]; int i; va_list args; //可変個引数を取得 va_start(args, iParamCount); for(i=0; i<20; i++){ pParam[i] = va_arg( args, char* ); } return 0; } 上記のように可変個引数を取得しようとしているのですが、 引数の型が複数あり、うまく引数が取得できません。 なにかいい方法ありませんか?
374 :
デフォルトの名無しさん :2006/11/17(金) 18:19:49
sageちゃった。
printf/scanf系みたいに呼び出し側から型を伝えるようにするしかない。 蛇足だが、vprintf/vscanfのようにva_listを引数にとるものも作れ。
#include<stdio.h> int main(void) { int array[5]; int count; for(count=0;count<5;count=count+1){ printf("Input No.%d",count); scanf("%d",array[count]); } for(count=4;count>=0;count=count-1) printf("No.%d:%d\n",count,array[count]); return(0); こいつで実行してもエラーで強制終了するんですけど何故ですか?}
>>376 scanf("%d",array[count]);
引数はアドレスです
scanf("%d",&array[count]);
>>378 >こいつで実行してもエラーで強制終了するんですけど何故ですか?}
この文の最後にあるw
LPCSTR str = "Friday, 01-Jan-2007 00:00:00 GMT";のような クッキー形式の日付をtime_t値に変換する関数とかあれば教えて下さい。
384 :
383 :2006/11/17(金) 22:39:41
無さそうなんでやっぱりいいです。
>>383 つ[popen("date -d 'Friday, 01-Jan-2007 00:00:00 GMT'", "r")]
あ、いかん、出力形式指定するの忘れてた。 date -d 'Friday, 01-Jan-2007 00:00:00 GMT' +%s
#include<stdio.h> #include<stdlib.h> int main(void) { int s, x[8]={0}; s=sizeof(x)/sizeof(x[0]); printf("size of x: %u¥n"(unsigned) s); return 0; } void fun(int *x) { int s; s=sizeof(x)/sizeof(x[0]); printf("size of x: %u¥n"(unsigned) s); } fun関数の中で配列xの要素数をカウントするプログラムを考えているんですが、 関数に配列を渡す時点でポインタに置き換えられるので、main関数での printf文とfun関数でのprintfの出力が違ってしまいます。 2つが違ってしまう原理自体は理解出来ているつもりなのですが、何かいい方法は ないでしょうか?スマートな方法を思いつかなくて困っています。
>>388 C++なら
template <int N>
void fun(int (&x)[N})
と宣言すれば
s=sizeof(x)/sizeof(x[0]);
が使えるが、Cでは配列は必ずポインタに変換されてしまうため
配列の大きさに関する情報は失われてしまう。
通常
void fun(int *x, int n)
と、別のパラメータで大きさを渡す。
390 :
388 :2006/11/18(土) 01:33:36
>>389 深夜にありがとうございます。
やっぱりパラメータで渡すしかありませんか。引数が増えていくとどんどん
コードが不細工になってくるんで、もう泣きそうで……
ってかC++だったらそんなこと出来るんだ。この際、C++のお勉強しようかな。
>>390 設計を変えて構造体を使えば?
もしくは番兵を使う手もある。(最後の要素を示す記号として-1を使うとか)
392 :
388 :2006/11/18(土) 01:40:46
構造体はよく理解出来てないんで、ちょっとやってみます。 複素数演算を作ったことがあるんで、上手くやればいけるかも知れませんね。 簡単化のためにintで書いたんですが、実際はdouble型でインパルス応答なんかの 数値を入れようと思っています。なので、番兵に数値が入るとまずくって… 構造体でポインタと要素数を抱き合わせておくっていうのが、よさそうですね。
大抵の処理系なら、NaNを番兵に使えるかもしれない。 或いは、正規化できる前提で-0を使うとか。
ダイテル本の練習問題の条件演算子を使った問題で printf("%s\n", count % 2 ? "****" : "++++++++"); てやつがあったんですがこれは count % 2 で1の時に真を返すってことでいいんですか?
お前は何をいっているんだ。
たぶん、「0じゃない値を真と評価する」を 俺用語に訳すと「count%2で云々」になるんだと思う。 あと、ゆとり世代で日本語が苦手なので 本の名前なんか正確に書かなくても、読み手は推測してくれるし 文章に読点なんか無くても、読み手が理解するよう努力してくれるものだと思ってる はず。
>>396 わかりました、ありがとう!
もう消えていいよ!
>>397 人の忠告は素直に聞くようにしたほうがいいよ。
自分にとって不愉快な書き方だからってそんな反応をしているようじゃ、
次に書き込むときも似たようなことをして、似たような反応をされるはず。
この場合どっちもどっちだと思うけど
少し注意されただけで煽り返すとか精神年齢低すぎだろ 下手にでる事も出来ない奴って・・・出世できねーぞwwwww
実年齢が低かったら精神年齢も低くても問題ないよ
私の書いたBubble Sortのプログラムこれであっていますか? コンパイルして正常に動作する感じですが、提出物なので皆さんもレビューしてくださいませんか? #include <stdio.h> main() { char moji[50],wk; int i,owari; printf("文字列を入力してください。隣接交換法で昇順にソートします\n"); scanf("%s",moji); /* printf("%s\n",moji); */ /* 入力された文字列の終わりを求める */ for ( owari = 0 ; moji[owari] ; owari++) ; /* owariの中身が要素数になる */ /*printf("%d\n",owari); */ for ( ; owari >= 2 ; owari-- ){ for ( i = 0 ; i+1 < owari ; i++ ){ if ( moji[i] > moji[i+1] ){ wk = moji[i]; moji[i] = moji[i+1]; moji[i+1] = wk; } printf("%s\n",moji); } } printf("ソート後の文字列は %s です。\n",moji); }
405 :
デフォルトの名無しさん :2006/11/18(土) 13:07:43
初心者です。 関数で「*strcpy」とかについている「*」の意味ってなんですか? ポインタ?
407 :
デフォルトの名無しさん :2006/11/18(土) 13:13:28
>>403 {を行末に付けるの止めれ。ブロックが見にくい
scanfに&が無い
scanfだと50文字以上入力されてもわからない
for (; owari >= 2 ; owari-- ) → for (; owari >1 ; owari-- )
逐次ソート結果出力はイラネ。
[ ]は自由の牢獄 * は希望の光 両者は同じであり、異なる。
>>407 本当にお疲れ様でした。
>{を行末に付けるの止めれ。ブロックが見にくい
フリーフォーマット(感想はチラシの裏に)
>scanfに&が無い
配列なのに必要?
>逐次ソート結果出力はイラネ。
「正常に動作」の定義は?
あとforの後にスペース入れるのも止めれ。読みづらい。
>>403 個人差があるとは思うけどレビューってことで
変数名の変更(変数間の関係が分かりやすいように)
moji → mojiretu
owari → mojiretu_len
標準関数を使う
mojiretu_len=strlen(mojiretu);
ループ用変数は別に用意する(文字列の長さを示す変数を変更しない)
412 :
405 :2006/11/18(土) 13:19:47
なんか理解しました。
413 :
もんた :2006/11/18(土) 14:41:30
キーボードからの入力で、EXITと入力すると プログラムが終了するようにはどうしたらできますか?
>>413 if (strcmp(str, "EXIT") == 0) exit(0);
415 :
もんた :2006/11/18(土) 14:50:36
>>415 exitで終わらせたいコードを載せたほうが早いよ。
417 :
もんた :2006/11/18(土) 14:54:16
while (scanf("%s", s) == 1) { for (i = x = y =n_y= 0; s[i]; i++){ printf("%s\n", s); if (!(p = strchr(r, s[i]))) { break ; } この部分でfscanでEXITが入ると終了したいんですが。
418 :
もんた :2006/11/18(土) 15:00:58
すいませんscanfでEXITが入ると終了したいんですが
>>417 while (scanf("%s", s) == 1) {
if (strcmp(s, "EXIT") == 0) exit(0);
scanf()の次の行に入れればいいかな。
ファイルの先頭あたりに、
#include <stdlib.h>
#include <string.h>
という行がなかったら追加する。
420 :
もんた :2006/11/18(土) 15:10:12
できました。ありがとうございます。 if (!(p = strchr(r, s[i]))) { の行で、 コンパイラに、おそらく不正な代入関数(main)とでるのですが。 何か分かりますか?
>>420 p = strchr(r, s[i])
これが代入になってるため
コンパイラは本本当は == 何じゃね?と勘違いしてメッセージをだす
むしすればおk
それで警告出るなら、二行に分けて書くしかないかな? p = strchr(r, s[i]); if (!p) { コンパイラのオプションを調べて、その警告をでなくするか。
423 :
もんた :2006/11/18(土) 15:15:10
>>421 わかりました。ありがとうございました。
424 :
421 :2006/11/18(土) 15:40:49
>>423 if ( (p = strchr(r, s[i])) == 0 ) {
でもいい
>>424 代入をカッコでくくって、!してる式でも警告がでるなら、それでも出るんじゃないの?
>>425 いや ( (p = strchr(r, s[i])) == 0 ) はたぶんだが式中に比較演算子があるのでコンパイラは「比較している」と認識する
(!(p = strchr(r, s[i])) だと代入演算と論理演算しかないため式中で比較していないと認識するのではないかと思う
#include<stdio.h> #define MAX100 #define PRIME0 #define NOT_PRIME1 int main(void) { int number[MAX+1]; int i,j; for(i = 1; i <= MAX; i = i + 1) number[i] = PRIME; number[1] = NOT_PRIME; for(i = 2; i <= MAX; i = i + 1) { if(number[i] == PRIME) { for(j = 2 * i; j <= MAX; j = j + 1) number[j] = NOT_PRIME; } } for(i = 1; i <= MAX; i = i + 1) if(number[i] == PRIME) printf("%d\n",i); return(0); } 100までの素数検索プログラムなんですけど実行結果が変です。どこかおかしいところありますか?
429 :
428 :2006/11/18(土) 18:22:43
for(j = 2 * i; j <= MAX; j = j + i) ここがおかしかった自己解決 どうもすいませんでした
なんでこれ aとbの中身を交換できないの〜? #include <stdio.h> main() { char a='A',b='B',*ap,*bp; printf("%c %c\n\n",a,b); ap = &a; bp = &b; a = *bp; b = *ap; printf("%c %c",a,b); } $ ./pointer.exe A B B B ってなる・・・どうすればいいのでしょう?アドレスを習ったばかりでアドレスを使って交換 する方法を考えています。
>>431 頭を柔らかくして考えてみな
a = *bp;このときaのアドレスにbpの中身つまり'B'が代入された
そしてb = *ap;この時ののapはaのアドレスを示している
aのアドレスに入っているのは'B'
もうOKか?
>>432 おおお!ななななななるほど!
普通の変数wkみたいには行かないってことかぁ・・・
もっとよく考えて見ます。ありがとう御座います。
>>433 普通の変数でも同じ。
char a='A',b='B';
a=b;
b=a;
だと交換できないよ。
435 :
デフォルトの名無しさん :2006/11/18(土) 22:01:12
常識ちぇきに考えちぇ変数二ちゅじゃ交換できないだろ
warning: comparison between pointer and integer こんなエラーが出たんですけど、わけわかりません・・・
>>437 いいえ。ポインタと整数を比較しているんです。
ポインタと整数を比較・・・ かぁ〜もうめんどくせ〜 違う方法でやるか・・・
警告なら行番号くらいでてるだろ その行くらい晒せばいいんじゃね
初めまして。プログラムの勉強をしようと思い「14歳から始めるわくわくゲームプログラミング」という本を買いました。 P74に書いてあるサンプルプログラムを本の通り書いたのですが エラー E2293 C:\MyC\dxtest\dxtest.cpp 9: ) が必要(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) と表示されてしまいます。 --------------------------------------------------------------------- #include "DxLib.h" int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) {changewindowmode(true); if(dxlib_Init() ==-1) return(-1); int drawbox(0,0,120,120,6553,true); int waitkey(); int DxLib_end(); return(0);} ------------------------------------------------------------------- どこをどう直せばいいですか? スレ違いでしたらごめんなさい。
どこから突っ込むべきか迷ったから、修正版を先にあげるぞ。 ///////ここから #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;} ///ここまで
>>443 ありがとうございます。
無事動きましたが一体どこが悪かったんでしょうか?
C言語のコマンドは大文字・小文字で全く違う意味になると考えればいいですか?
445 :
443 :2006/11/19(日) 01:20:39
まず、一つ目は大文字と小文字は区別されるってこと。 changewindowmode と ChangeWindowModeは別物扱い。 他にも幾つか間違ってるが、自分で確認してくれ。 それと、2つ目int drawbox(0,0,120,120,6553,true); int waitkey(); int DxLib_end(); のintは付かない。 詳しく説明するとめんどいから、軽くするが、 int WiINAPI WinMain() {} ってのは、関数を作ってる。感覚。 逸れに対して、ただの DxLib_Init() ってのはどっかに作った関数を呼び出してる感覚。 DrawBox()とWaitKey()とDxLib_End()はここでは作るわけじゃく呼び出してるので、 intなどが付かない。
446 :
443 :2006/11/19(日) 01:33:48
こんなので、関数のイメージをつかんでみるといいかもしれん。 //ここから #include "DxLib.h" void muro(int a) {DrawString( 250 , a*32 , "これはmuro()関数内の処理" , 38453 ); } int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) {ChangeWindowMode(true); if(DxLib_Init() ==-1) return(-1); muro(2); WaitKey(); DrawBox(25,25,120,120,6553,true); DrawString( 250 , 240 - 32 , "WinMain()関数内の処理" , 56453 ); WaitKey(); muro(3); WaitKey(); DxLib_End(); return 0;} //ここまで muro()関数を作って、それをDxLib_End()やWaitKey() そしてDrawBox()と同じように呼び出している。 のがつかめれば上出来。 muro()のカッコ内が変わると、表示される位置がズレルのも注目。
447 :
デフォルトの名無しさん :2006/11/19(日) 01:50:14
370ページの入門書終わらしたのですが、イメージしか 掴めませんでした、不向きでしょうか?
プログラムを書いている途中 printf("%*s%s\n",horse_pos[r],"",horse[r]); とあったのですが、,horse_pos[r],"",horse[r]); の部分の,""の意味が分かりません どなたか教えていただけませんか?
printf("%*s%s\n",horse_pos[r],"あいうえお",horse[r]); だったら分かるんか?
>>447 イメージが掴めたならその内なんとかなるよ。
あとは、コードを読んで分析理解して、
コードを書いて試行錯誤していけばいい。
451 :
デフォルトの名無しさん :2006/11/19(日) 04:51:39
>>450 そういわれると、嬉しいです。
中には掴めない方もいるでしょうか?
入門書は著者自身が誤解しているとしか思えない本が多いので、 間違ったイメージであることも多い。 自分で書いて適当な場所で他人にレビューしてもらうことを勧める 最初は けなされると思うが。
初めまして。書籍を参考にしながら独自コードに直している間につまづきました。 static修飾子について質問させてください。 static修飾子をつけた同じクラスのメンバにアクセスさせると、 コンパイル時にリンクエラーになります。 参考にした書籍にはそのように載っているので、何か条件があるのだと思いますがわかりません。 何から疑っていったら良いでしょうか。 具体的には、下記のようなコードの場合にエラーになります。 class CWindow { public: HWND RegistWindow(char* wndName, char* wndTitle, int posXX, int posYY); protected: static LRESULT CALLBACK _WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static CWindow* m_static; }; LRESULT CALLBACK CWindow::_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { CWindow* p = m_static; // こいつがいけないらしい } HWND CWindow::RegistWindow(char* wndName, char* wndTitle, int posXX, int posYY) { m_static = this; // これもいけないらしい }
455 :
πr^2 :2006/11/19(日) 11:16:01
char * str[] = {"String1","String2"} などとなっているchar[]のポインタをリターンする関数はどう宣言すればいいのでしょうか。
char ** foo() { static const char * const static_strings[] = {"string1", "string2",}; return static_strings; }
457 :
πr^2 :2006/11/19(日) 11:40:13
>>456 char ** foo();
int main(){
char **str = foo();
}
char ** foo()
{
static const char * const static_strings[] = {"string1", "string2",};
return static_strings;
}
をコンパイルすると、
エラー E2034 strtest.cpp 10: 'const char * const *' 型は 'char * *' 型に変換できない(関数 foo() )
というエラーがでました
あーいけね。 const char * const * foo() // 以下略
459 :
πr^2 :2006/11/19(日) 13:06:06
>>458 const char * const foo()でできました!
ところで、char* str[];とし、str[]の配列の数を決めるときはどのようにするのでしょうか。
char *str[] = new char*[20];としても、
'char * *' 型は 'char *[]' 型に変換できない
とエラーがでてきてしまいます。
#include<stdio.h> #include<math.h> int main(void){ int a,b,c; double kotae; printf("aの値は入力:"); scanf("%d",&a); printf("bの値は入力:"); scanf("%d",&b); printf("cの値は入力:"); scanf("%d",&c); kotae=sqrt(b*b-4*a*c); printf("%f",&kotae); return 0; } 何を入力しても答えが0になってしまいます ボスケテください
>>461 #include<stdio.h>
#include<math.h>
int main(void){
int a,b,c;
double kotae;
printf("aの値は入力:");
scanf("%d",&a);
printf("bの値は入力:");
scanf("%d",&b);
printf("cの値は入力:");
scanf("%d",&c);
kotae=sqrt(b*b-4*a*c);
printf("%f",kotae);
return 0;
}
>>462 実行してみたのですが、答えがNaNと表示されました・・・
printf("%f",&kotae); ↑
465 :
463 :2006/11/19(日) 14:03:29
あっと、ごめんなさい勘違いでした 計算されてました でも、答えがマイナスになる場合だとNaNとでるのですが、 マイナスの答えまできっちり表示させる方法ってありますか?
そもそもマイナスの平方根なんてないだろ・・・
kotaeなんて変数つくらなくても printf("%f",sqrt(b*b-4*a*c)); でいいよ
ていうか
>>461 は(b*b-4*a*c)のところの計算の順序はこれでいいの?
469 :
461 :2006/11/19(日) 14:10:37
>>461 のソースでもエラーが出るのがVC2005だから困る
正直キャストが面倒くさい
471 :
461 :2006/11/19(日) 14:14:03
すみません、更新せずに書いてしまいました
>>467 なるほど、そういうやり方あったんですね、気づきませんでしたorz
式はあってると思います・・・・・思います・・・
>>469 おいおい、
虚数を扱えるライブラリを紹介しろとか
そういうのじゃないのか。
数学の話ができるおまいらに嫉妬
475 :
448 :2006/11/19(日) 15:22:47
>>449 超亀レス申し訳ありません
つまり、前の文字列と後ろの文字列の間のスペースということですか?
これを無くして書くことはできないのでしょうか?
>>475 >448のprintf()なら、これと等価だろ。
printf("%s\n",horse_pos[r] + strlen(horse[r]),horse[r]);
要は、文字列をずらすために空白文字で調整したいのだろうから。
477 :
448 :2006/11/19(日) 15:40:08
>>476 それでデバッグしてみると文字列の最後にク■↑と表示したい文字列の後ろに出てしまいます
エラーは起きていないようですが
入力された五つの数値の最大と最小を表示する。この処理を、配列とポインタ変数を使用して作成。 使用配列とポインタ変数 int suchi[5]; int *saidai,*saisyou; ポインタ変数とかポインタとかよく分かんないorz このプログラムはどう書けばいいのでしょうか?
480 :
448 :2006/11/19(日) 16:57:14
>>476 printf("%s\n",horse_pos[r] + strlen(horse[r]),horse[r]);
て%s%sじゃなくていいんですか?
%*sだな。
482 :
448 :2006/11/19(日) 17:02:52
>>481 ありがとうございます、変な文字も出ず解決しました
483 :
デフォルトの名無しさん :2006/11/20(月) 00:58:40
>>461 らへん
sqrt()する数値をabs(b*b-4*a*c)
にして、
abs(b*b-4*a*c)!=b*b-4*a*c
だったらb*b-4*a*cは負の数になってるので、
答えの最後に「i」を表示すれば一応ソレらしきものにはなるのでは
便乗質問ですみませんが #include <stdio.h> int main(void){ printf("%*s","hogehoge",10);/*10は適当な数値*/ return 0; } はどこか構文間違えていますか? コンパイルは通るのですが、不正終了してしまいます 三行目printf("%*s","hoge","piyo",10);にすれば実行は出来ますが 数千個分の改行とスペースが出力されるだけです 環境はWinXP VC++Toolkit2003です %10sのようなフィールド幅指定は問題ありませんでした
printf("%*s", 10, "hogehoge");
486 :
484 :2006/11/20(月) 02:25:02
orz すみません、初歩的なミス過ぎますね・・・ 夜更けにどうもありがとうございました
487 :
デフォルトの名無しさん :2006/11/20(月) 05:21:50
for(;; p_turn = !p_turn){ とはどう言う意味でしょうか? あと for(;;)と言うのも参考書に載っていますが 意味がわかりませんので これら二つの、ご助言を宜しくお願い致します。 こちらのスレで質問するのが正しいと思いました マルチではありません。
3次元配列をポインタで動的メモリ割り当てするのってこれであってる? #include<stdio.h> #include<stdlib.h> main() { int i,j; int ***z; z = (int ***)malloc( 3 * sizeof(int **)); z[0] = (int **)malloc( 4 * sizeof(int *)); z[0][0] = (int *)malloc( 3 * 4 * 5 * sizeof(int)); for(i=0;i<3;i++){ z[i] = z[0] + i * 4; } for(i=0;i<3;i++){ for(j=0;j<4;j++){ z[i][j] = z[0][0] + i * 5; } } free(z); return 0; }
>>490 free(z)だけでは足りない。
free(z[0][0]);
free(z[0]);
free(z);
492 :
デフォルトの名無しさん :2006/11/20(月) 19:06:41
循環定義を含むプログラムを正しくコンパイルするにはどうすればいいですか? 以下のようなコードを書いたところ、コンパイル時に error: dereferencing pointer to incomplete type というエラーが出てしまいます。 typedef struct sa *sa_p; // 先に sa のポインタだけ定義 typedef struct { sa_p a2; } sb, *sb_p; typedef struct { // sa の本体を定義 sb_p b; } sa; int main() { sa_p a = (sa_p)malloc(sizeof(sa)); a->b->a2 = a; // compile error return 0; }
それ循環のせいじゃないし。 コンパイルが通らないのは当然かつそれでは実行時も落ちるだろう。 >typedef struct { // sa の本体を定義 > sb_p b; >} sa; ここで無名構造体をtypedefしたsaと本来のstruct saが別物になってる。 でもって > a->b->a2 = a; // compile error ここでおそらく落ちる。ちゃんと a->b = (sb_p)malloc(sizeof(sb)); とやってからにしろ。
携帯電話のiアプリは起動するとほとんどのがjavaで作ってるみたいなのですが Cでも作ることはできるのでしょうか?
>>494 クロスコンパイラ持ってれば出来るんじゃね?
ちょいと質問させてくださいな。 やっぱりプロトタイプ宣言はすべきなのですか? これは、一番上にmain関数をもって行けば早い話であって、 関数を変えた時にプロトタイプ宣言を変え忘れて、 コンパイラが通らないと言う事も起きたりするので 別に必要ないんじゃ無いかと思ったりしてるからです。
別にしなくていいよ。 そのうちソースとヘッダを分けることを覚えたら、自然と気にならなくなるだろうし。
498 :
デフォルトの名無しさん :2006/11/21(火) 00:58:36
コンソールで動く、簡単なシューティングゲームを作りたいのですが、 リアルタイムにキー操作を取るにはどうすればいいんでしょうか。 scanfなどでは入力待ち状態になってしまいますし・・
環境依存だけど kbhit getch で調べてみれば?
>>498 正直、Windowsで作ってるなら、ライブラリを使ったGUI方がはるかに楽だよ。
コンソールは面倒。
たぶん、Win以外もライブラリ使用のほうがらくだと思う。
問題はライブラリの使い方を覚えるのが面倒だという可能性があること。 それを乗り越えれば、楽だろうけど。
>>498 サンプルコード
#include<stdio.h>
#include<conio.h>
intmain(void){
intmoji='-';
while(1){
if(kbhit())moji=getch();
printf("\r%c [%3d]", moji, moji);
}
return 0;
}
上の方でも出てる、DxLibなんかは、かなり簡単。 2chからリンクするのは気が引けるが 初心者からそこそこの上級者までお勧めできる。 (ただ、なんでもかんでもintが活躍するので、少し危険性も高いが)
504 :
デフォルトの名無しさん :2006/11/21(火) 01:20:00
みなさんどうも! if(kbhit()){ switch(getch()){ case 75: //キー入力は左カーソル printf("left"); break; case 77: //キー入力は右カーソル printf("right"); break; case 32://キー入力はスペース printf("space"); break; } } という感じで出来ました。 コードも載せていただきありがとうございます。 Dxlibも調べてみますね。
>>504 カーソルキーは一回押すと二つコードが送られるよ
自分で試して確認しな
506 :
デフォルトの名無しさん :2006/11/21(火) 01:35:14
以下のような3つのペアの実数をファイルに書き、 それらのペアを配列を使って読んで、 それぞれの四則演算を別のファイルに書き出しなさい。 5.0 3.0 2.5 1.0 4.0 1.5 って課題が授業で出てサッパリわかんなくて困ってるんですが、 どなたか助けていただけないでしょうか?
508 :
507 :2006/11/21(火) 01:51:36
>>506 ごめ、別スレと勘違いしてた。
あと、マルチ…
509 :
デフォルトの名無しさん :2006/11/21(火) 11:20:59
構造体を作成して返す定石を教えてください 今は以下のようにしています。関数の戻りで値コピーでなく、ポインタ渡しでやりたいです。 typedef struct tagX01 { int val1; car *val2; } *LPX01, X01; 呼び出し LPX01 x01; x01 = (LPX01)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(X01)); CreateX01(x01); BOOL CreateX01(LPX01 target) { // ここで値設定 } この、HeapAllocで領域作っているところを、CreateX01の中に入れたいです。 単に、入れるとx01が初期化されていないとコンパイラが警告してきます。
>>509 下請け関数を先に定義するかプロトタイプ宣言をするかしないとコンパイラが型チェックをしてくれない典型。
先ずはそこからやって味噌。
511 :
デフォルトの名無しさん :2006/11/21(火) 12:27:27
>>510 BOOL CreateX01(LPX01 target) を
BOOL CreateX01(LPX01 *target)とかにしないと作ったやつを返せナインぢゃないですか?
>>511 LPX01がポインタ型だから、それは問題ない。
> 単に、入れるとx01が初期化されていないとコンパイラが警告してきます。
挙げてあるコード片はそんな警告が出るようには見えないけどな。
完全なソースを挙げるべし。
513 :
512 :2006/11/21(火) 12:48:03
あ、勘違いしてた。HeapAlloc()を移動したいのね。
>>511 のようにするか、CreateX01()の戻り値をLPX01にするかですね。
514 :
デフォルトの名無しさん :2006/11/21(火) 13:02:49
>>510 >>512-513 ご回答ありがとうございます。
やっぱ、ポインタのポインタを渡さないといけないんですね。ありがとうございました。
typedefでつける銘銘なんですけど、構造体はtag[名前]、構造体へのポインタLP[名前]がWindowsAPIっぽくてかっこいいんですが、
ポインタのポインタは命名せずに*LPX01とかが一般的ですか?SDKのヘッダをLPでGREPしてみましたがそれっぽいのがないです
ポインタのポインタになってるやつはLPVOIDが多い気がしますがいろんな型がかえってくるからかなぁと想像しています
>>514 Win32 APIみたいにポインタを「LPほげ」とすること自体が、一般的で
はないし、ダサい。
516 :
デフォルトの名無しさん :2006/11/21(火) 13:13:28
>>515 かっこいいとおもっていたのでキツいです
かっこいいのはどんなかんじですか?例かかっこいいっぽいソースとか教えてもらえないですか。
どのようなときに、if-else if 文を switch 文に変換不可能かを教えて欲しいです。
>>516 ある型のポインタにわざわざ型名を割り当てるのは、ポインタであることを見失いやすく却って読み辛くなる。
素直にX01 ** fooで充分だ。
>>517 条件式が定数との一致以外のとき。
#つまり、switchにできる方が例外的。
>>517 たとえば、
・条件が複数の変数を参照するとき
・条件が整数の定数ではないとき
・整数で分岐だけど、範囲が広過ぎるとき (i < 0 のような)
switch(i < 0 ){ case 0: break; default : }
521 :
デフォルトの名無しさん :2006/11/21(火) 17:57:50
>>518 なるほど。別名をつけるのがすでに間違いなんですね。
WindowsSDKではtypedefで構造体とポインタに別名をつけているのが決まりみたいだったんで、
当たり前だと思ってました。実はWindowsSDKがカッコ悪くて、悪い例だったんですね。レス、ありがとう。
すいません。 画面から入力した文字列を逆に表示するというのは どうやったら表示できますか?
逆というのは文字が逆という意味です。 どうやったらできますか?
文字が逆ってことは、 Eがヨになるって事?
初心者な質問で恐縮ですがお願いします。 c言語でかなりの数の数値計算を行うソフトウェアに挑戦しています。 ただ、それを実行するとメモリのinactiveがドカーンとできてしまい、 プログラムが終了しても大きく確保されたままです。 メモリの動的な確保などはしていません。 これは私のプログラムにマズい部分があるのでしょうか? それとも問題ないのでしょうか?
>>525 Linuxか?
大丈夫、他の用途に使いたくなったらOSが勝手に回収する。
処で、malloc()などを使わないでどうやってメモリを確保しているんだ?
>>523 こういう事?
char* reverse(char *s)
{
char t, *l = s, *r = s + (strlen(s) - 1);
if(s == NULL){ return NULL; }
while(l < r){
t = *l;
*l = *r;
*r = t;
++l;
--r;
}
return s;
}
>>526 勝手に回収すると聞いてちょっと安心です。
ありがとうございます。
環境は実はMac OSXです...(汗
ええっと。動的な確保自体をやっていないつもりなんです。
(答えになっているのかどうか不安ですが...すみません)
1.本当に動的確保をしていないか ・ライブラリが内部で動的確保をしている可能性 例:C標準関数のstrdup 2.巨大な静的又はグローバルな配列を宣言していないか ・スタートアップで静的領域に一気に確保される
プログラム実行のときにある意味動的に被疑者確保
\t はタブ文字,\n は改行文字です. hogehoge \t hoge \n と言う文字列(char配列)に"ABC"という文字列を加えて hogehoge \t hoge \t ABC \n としたいのですが,hogehoge,hogeの長さが任意のため どこまでをコピーするのかで困っています. どのように既述をすれば良いのでしょうか? よろしくお願いします.
strlen()で長さを調べろ。
533 :
531 :2006/11/21(火) 21:27:26
>>532 こんなことで悩んでいたとはお恥ずかしい.
ありがとうございます.
>>529 やべ。まさしく2でした。
でっかいグローバルな構造体の配列がありやす
もっかい勉強し直してきます。
1についても初めて聞きました。勉強になりやした。
ありがとね。
535 :
デフォルトの名無しさん :2006/11/21(火) 21:49:28
文字列を特定の位置から削除したいのですが、どうするのが良いのでしょう? 方法を教えてください。 char string = "ABCDE/FGHIJ"; として 文字列に'/'があったら、それ以降を削除したいのです。 s_point = strstr (string, "/"); *s_point = '\0'; で行けると思っていたのですが、コンパイルにはエラーは ありませんが、実行するとエラーが出て止まってしまいます。 Borland Cコンパイラ(フリー版)とWin2000で、 DOSプロンプト上での実行です。 何か案がありましたら、よろしくお願いします。
char string[] = {"ABCDE/FGHIJ"}; こうすればOK。
>>535 char string[] = "ABCDE/FGHIJ";
char *string = "ABCDE/FGHIJ"; これじゃ駄目だから間違えるなよ。 たとえ上手く動いてるように見えても絶対駄目だからな。
被った。スマソ
540 :
デフォルトの名無しさん :2006/11/21(火) 21:56:59
>>536-538 ごめんなさい。
その部分は書き込みが間違えていて、ちゃんと
char string[] = {"ABCDE/FGHIJ"}; にしていました。
542 :
535 :2006/11/21(火) 21:58:27
× char string[] = {"ABCDE/FGHIJ"}; ○ char string[] = "ABCDE/FGHIJ"; 何度もすみません。
>>543 char a[] = {'a','b','c','\0'};
char b[] = "abc";
printf("%s\n%s\n", a, b);
>>535 その前後のコードも晒してよ。
それだけじゃ特定できん。
#include <stdio.h> #include <string> int main(void) { char s[] = "abcde/fghij"; char *p = strstr(s, "/"); *p = '\0'; printf("%s\n", s); return 0; }
548 :
535 :2006/11/21(火) 22:25:08
すみません。 問題は別のところにありました。 strstrで検索したときに、検索文字列のひとつに "/"がなくNULLを返していたのが原因でした。 ifとかを付けずに *s_point = '\0'; としてしまい、 そこでエラーを起こしていました。 お騒がせして申し訳ありませんでした。
char a[] = {'a','b','c','\0'}; char b[] = {"abc"}; printf("%s\n%s\n", a, b);
551 :
ぴゅあ :2006/11/21(火) 22:32:29
>>544 のでいいと思うんだけど…
>>535 >エラーが出て
というのがエラーメッセージが出ているのなら
それを示した方が良かったかもですね
>>551 質問者は
"ABCDE/FGHIJ"
これの/以降を削除したいと言っている
コンパイルの段階で分割してどうするね・・・
554 :
ぴゅあ :2006/11/21(火) 22:51:42
>>552 あぁ 構文ではなくて"abc"とされていたことを言っていたわけですか
(てか、それなら"ABCDE"とかだろうけど)
>"ABCDE/FGHIJ"
にならうなら
char a[] = {'A','B','C','C','D','E','/','F','G','H','I','J','\0'};
char b[] = "ABCDE/FGHIJ";
後者に括弧は要らんでしょう
char c[][] = {"ABC","DEF"};
とかなら。。。
555 :
ぴゅあ :2006/11/21(火) 22:53:27
あれ?最後のは要素数要ったかな 或いはchar *[]か
キメーから括弧付けろよ。
542 :535:2006/11/21(火) 21:58:27
× char string[] = {"ABCDE/FGHIJ"};
○ char string[] = "ABCDE/FGHIJ";
何度もすみません。
543 :デフォルトの名無しさん :2006/11/21(火) 22:00:54
>>542 上のが正しいだろ。常識的に考えて。
544 :デフォルトの名無しさん :2006/11/21(火) 22:12:15
>>543 char a[] = {'a','b','c','\0'};
char b[] = "abc";
printf("%s\n%s\n", a, b);
559 :
ぴゅあ :2006/11/21(火) 23:03:33
560 :
ぴゅあ :2006/11/21(火) 23:05:55
>>557 "ABC"はchar配列として扱うから
付けない方が一般的だと思いますよ
>キメー
の意味は判らないけど…
まあ、カッコは付けたほうが見た目には綺麗だよな。 客観的に考えて。
562 :
ぴゅあ :2006/11/21(火) 23:11:26
563 :
ぴゅあ :2006/11/21(火) 23:13:17
564 :
ぴゅあ :2006/11/21(火) 23:13:40
>>561 コンパイラが要素数1の配列として誤解しないか
ちょっと気になりました
(コード読む側も間違えないのかな?)
ついでがあったら確認してみよ。。。
質問です。 今授業で char を使い始めました。 さっそくこれを使って2〜16進数を4進数や8進数に直せというPを作れといわれたのですが、 char に自由な数値を入れるにはどうしたらいいのでしょうか? int なら int a; scanf("%d",&a); でいけますよね? 先生曰く char と int は1ビットと4ビットでサイズが違うのでscanfは使えないと言っていた気がするし、 実際scanfを使ったPを作ってもコンパイルできません。 どうか回答よろしくお願いします。
宿題は宿題スレへ
代入を使うといい。 char c, d, e; c = 1; d = 100; e = 25;
ものすごく香ばしいような気がするのは気のせいではない
>565 言いたいことはいろいろあるが、とりあえず。 Pとは何だ? その先生とやらが教えてくれたのか、君が勝手に言い出したかは知らないが、 そんな言葉は一般的に通じない。 人に質問するときは相手に分かるように話せ。
10進数の1から10を,2進数に変換するプログラムを作っています。 Num2 = 0,i = 1に初期化しています. for (Num10 = 1; Num10 <= 10; Num10++) { while (Num10) { if (Num10 % 2 == 1) Num2 += i; i *= 10; Num10 /= 2; } printf("%05d", Num2); } これで実行すると,意味不明な(-954437117)という数字が無限ループしてしまいます. 指摘してくださる方いましたらよろしくお願いします.
forループにNum10を使っているんだから、 ループ内でNum10を書き換えたらきちんとループできないだろ。 プログラムの是非は問わないことにする。
>>570 for(NUM10=1; NUM10<=10; NUM10++) {
NUM2 = 0;
i = 1;
j = NUM10;
while(j) {
if(j%2) NUM2 += i;
i *= 10;
j /= 2;
}
printf("%d,%d\n",NUM10, NUM2);
}
こういうことがやりたいの?
>>571 while開始前に,Num10の内容を別の変数aに代入し
プログラムを実行させたところ無限ループはなくなりました.
2進数変換は正しく出来ていなかったので考えてみることにします.
ありがとうございました.
>>572 iとNum2をfor文の外で初期化していたため,10進数の2以上がおかしい値となっていました。
ありがとうございます.
575 :
ぴゅあ :2006/11/22(水) 01:34:05
>>574 折角、できたということなので
後で改めて考えてみるとかでいいと思いますけど
2進や8進とかにするというのは文字/文字列にすることを
考えてみるのもいいかも
(8進,16進はわざわざロジックを組まなくてもできたりですけど)
若干コードは面倒臭くなるかもですけどね
8/10/16進も敢えてやってみておいてもいいかも
576 :
574 :2006/11/22(水) 02:00:46
>>575 文字/文字列とはどういうことでしょうか?
8,16進はprintf内で出来るので敬遠していました.
今は勉強を始めたばかりですので,敬遠せず色々とやってみたいと思います.
577 :
ぴゅあ :2006/11/22(水) 07:48:26
>>576 >文字/文字列とはどういうことでしょうか?
sprintf(メモリ,printf/fprintf(標準出力/ストリーム)で
結果を出そうとするとき、いずれも結局は文字列ですよね
2進(
>>572 )を例に採ると"j%2"或いは"j&(2-1)"は数値で0か1
これに文字'0'か文字コード0x30を加えれば文字'0'か'1'
これをprintfで書式"%c"を使えば文字列"0"か"1"として表示される
>>572 をなるべく変えないでやろうとするなら
まずその文字列分のメモリ域を確保・初期化しておいて
先に求めた'0','1'を1の位(のメモリ位置)から埋めていく
全て揃ったらprintfなりで文字列(書式"%s")として出力
それが形になれば8/10/16進も同様(2/8/10/16進の違いの部分だけ)
符号の有りは別途後でやってみるのがいいと思うけど
printfの中もこういうことやってたりします
(
>>572 の例だと一度10進数(int)として扱えるように置き換えているから
桁数に限界がでてきたりするでしょ?)
578 :
デフォルトの名無しさん :2006/11/22(水) 07:52:17
C言語で文字コード変換てどうすればいいでしょうか
579 :
ぴゅあ :2006/11/22(水) 07:54:19
あぁ 文字/文字列の扱い,メモリ操作とかまだ難しいと思えるなら その辺りも勉強するまで置いといて 後でゆっくりやってみるのがいいと思います
580 :
ぴゅあ :2006/11/22(水) 07:56:21
>>578 文字列の中から1文字取り出したcharの値が文字コード
後は文字コード表と見比べれば
581 :
ぴゅあ :2006/11/22(水) 08:41:24
あ… 文字コード"変換"て、そういう意味で聞いたのではないのかな
(
>>577 繋がりかと思ってしまいました。。。)
582 :
デフォルトの名無しさん :2006/11/22(水) 09:15:22
>>578 えっとファイルから読み込むんですが
そのファイルがEUCであったりSJISであったりUTF-8(だったかな)
であったりするわけです。
そのファイルを処理して別のファイルにまとめたりするのですが
SJISかEUCのどちらかに統一したいんです。
他の言語だともう関数があったりしてそれ利用してたもんで
Cではどうやるのかなぁと
自作するしかないんでしょうか?
nkf 通せば?
584 :
ぴゅあ :2006/11/22(水) 09:45:15
>>582 やはりそうでしたか
タイミング良過ぎ…って感じで勘違いしてしまいました
使うまでに至ったことはないですけど
gccでだったりするとlibiconvとかも使える筈と思います
(glibcのiconvだとオリジナルでは未対応になるのかな?)
585 :
デフォルトの名無しさん :2006/11/22(水) 10:56:37
>>538 流れ大きく戻してごめんなさい
>char *string = "ABCDE/FGHIJ";
>これじゃ駄目だから間違えるなよ。
>たとえ上手く動いてるように見えても絶対駄目だからな。
なんでだめなんですか?
char string[]
ぢゃなくて
char *string
をいっつもつかってます
読みにくいからとかですか?
文字列をどっかに確保して、そのアドレスをポインタへ取得しているに過ぎないから。 (組み込み系なら、ROMに確保される可能性大) そのどっかが、データ書き換え可能な領域にあるという保証は出来ない。 配列で確保していれば、書き換え可能な領域に確保されている。
587 :
デフォルトの名無しさん :2006/11/22(水) 11:14:58
ヒープとスタックのどっちかってこと?
588 :
デフォルトの名無しさん :2006/11/22(水) 11:17:23
>>586 文字列を確保するのは"ABCDE/FGHIJ"でそれをあつかうためのポインタをいれるのが=で
ポインタを入れる先がchar[]か、char*のちがいだけではない?ということ?
>>588 そういうこと。
確保される領域が、可変領域保証かそうでないかの違いがある。
590 :
ぴゅあ :2006/11/22(水) 11:36:09
>>588 敢えて補足するまでもないと思いますけど
char *string = "ABCDE/FGHIJ";
のように書いている場合には"ABCDE/FGHIJ"の中を書き換えるような操作をしてはならない
ポインタ変数stringに代入されているものが他でchar[11+1]とかで取っている領域のポインタであるとか
mallocで確保された領域とかであれば
その領域内を書き換えることは可
char string[] = "ABCDE/FGHIJ";
は領域を確保してその中に"ABCDE/FGHIJ"を入れているので書き換え可
("ABCDE/FGHIJ"自身を書き換えているのではなくstring[11+1]の領域の中を触るから)
ということです
typedef struct { B b; } A; typedef struct { A a; } B; のように相互に型を使う構造体はどうやって定義すればいいんでしょうか。 Aを先に書けばBが定義されていないと言われ、逆にすればAが未定義と 怒られるのですが・・・。
中身を絶対にいじらない参照用としてのみ使うなら char *string = "ABCDE/FGHIJ"; の方が良いけどね。(コピー作る手間がかからないから) でもその場合はベタ書きするとか マクロ使うことの方が多いけど。
594 :
586 :2006/11/22(水) 12:02:54
>>586-590 そうなのかぁ。ありがとう。
書き換え操作はだめなんですね。勉強になりました。
つ[const char *]
596 :
586 :2006/11/22(水) 12:18:42
const char *にしても、ぽんたが示す文字列は変更できますよね?
ぽんたなら、今昼寝してるよ
>>596 (強引なキャストをしない限り)できませんよ。
599 :
デフォルトの名無しさん :2006/11/22(水) 12:29:36
const TCHAR *hoge; hoge = malloc(256); wcscpy_s(hoge, 256, TEXT("a")); hogeが指す先には"a"が入ります。コンパイラは警告してきていますけど。 この警告をはずすのが、強引なキャストという意味でしょうか。
>>599 警告が出るってことは無理してるってことだ。
「警告をはずす」って日本語はわからん。
601 :
ぴゅあ :2006/11/22(水) 13:23:14
>>599 その警告自体は別の意味のものではないですか?
「wcscpy_s関数の第1引数はconstが付いてないものとして宣言されているのに渡されたものにはconstが付いている」とか
const char *hoge = "ABC";
hoge[1] = "1";
とかで判るだろうと思います
>強引なキャスト
((char *)hoge)[1] = '1';
に変えてみることで判るだろうと思います
("だろう"とはコンパイラによっては微妙かもだから)
602 :
デフォルトの名無しさん :2006/11/22(水) 13:35:14
なるほど、わかりました。 constだと = できないですが、別の方法では書き変えできるということですね。ありがとうございます。
603 :
ぴゅあ :2006/11/22(水) 13:35:23
>>599 あと
>hogeが指す先には"a"が入ります。
は実行して(入った)ということだろうと思いますけど
constは飽くまでコンパイラにコンパイル時に判断させるためにコードから教えているだけのものなので
エラーなくコンパイルできれば実行はできてしまいます
>>590 の
>char *string = "ABCDE/FGHIJ";
>のように書いている場合には
とかは(それは予期せぬ結果が起こる原因になり得るので)そういうことはやってはいけないということで
constはそれをコードに示してコンパイラを補助するために追加されたものです
なので
const char hoge[] = "ABC";
なんてした場合も、同様に操作が禁止されます(コンパイルのレベルで)
共用体ってどんなときにつかうんじゃこの野郎
605 :
デフォルトの名無しさん :2006/11/22(水) 13:54:32
配列(例えばdim[10]など)で この10部分、添え字のところを外部ファイルのテキストファイルなどから読み込ませることはできないのでしょうか? #define などを利用すればできるのですかね?
できるできる。考えて
607 :
デフォルトの名無しさん :2006/11/22(水) 14:47:46
ポインタ
608 :
574 :2006/11/22(水) 15:59:14
>>577 >>579 レス遅くなりました.
このレスを保存しておいて,そのレベルまで達したと思えたら挑戦しようと思います.
ありがとうございました.
>>582 UTF-8もあるんだったら、UTF-16/32とかUCS4とかUnicode使ったコードを使うべきではないか?
>>605 配列の要素数が実行時に決まる様な場合は、これは出来ないよ。
int n;
scanf("%d", &n);
int array[n];
この場合はmalloc()を使って動的に領域を確保してやる必要があるよ。
int n;
scanf("%d", &n);
int *array = (int*)malloc(sizeof(int) * n);
それとmalloc()で確保した領域は、必ずfree()で開放する必要があるから気を付けて。
上の例だとこんな感じで。
free(array);
>配列の要素数が実行時に決まる様な場合は、これは出来ないよ。 手元の環境で試したらできましたがやらない方がいいのでしょうか。
C99からはできるようになっただろ。
613 :
デフォルトの名無しさん :2006/11/22(水) 19:06:14
実行中に要素数が変わらないのなら問題ない
>>612 そうだったのか。
古いコンパイラしか使ってなかったので知らんかったよ。
C言語も変わったなぁ。
大丈夫、今もみんなmallocなんかを使っている。 C99対応コンパイラなんて俺はGCCしか知らない。
ANSI-C以外は認めない。
ANSI-Cも認めない。
だが、ISO C90/C99は認める。
「ANSI-C」って。
JIS X 3010:2003 なら認める。
ワードパッドの印刷で、印刷のページ指定を「0-0」にすると挙動が変。
しらんがな
623 :
デフォルトの名無しさん :2006/11/22(水) 23:01:30
C99でuint32_t とuint_fast32_t等 の両方がある意味がわかりません 計算が速い32ビットの整数型があるなら uint32_tに割り当てれば済む話のような気もするんですが・・・
>>623 32bitより64bitが速い環境なら、uint_fast32_tは64bitになるんじゃね?
int_fast32_t 最低 32 ビットの最も効率的な符合付き整数 ~~~~~
626 :
デフォルトの名無しさん :2006/11/23(木) 01:23:16
cでc++のstringみたいに可変長文字列を簡単にあつかう方法ありませんか string.appendみたいなかんじで文字をくっつけるのを簡単にやりたいです strcatとかは元のバッファサイズの確保が面倒とおもっています
627 :
デフォルトの名無しさん :2006/11/23(木) 01:30:55
#include<stdio.h> #include<time.h> #include<stdlib.h> #define MTX 3 #define CMTX(x) (x)*(x) //ボード int board[MTX][MTX]; void initBoard(void); main(){ srand(time(NULL)); printf("【%d ゲーム】\n",CMTX(MTX)); initBoard(); return 0; }
628 :
デフォルトの名無しさん :2006/11/23(木) 01:31:56
//ボードの初期化を行う関数 void initBoard(void){ int i,j; int r;//ランダムな値 int useDigit[100];//既に数値が使われているか否かを記録する配列 for(j = 1; j <= MTX; j++){//縦方向繰り返し for(i = 1; i <= MTX; i++){//横方向の繰り返し //最後のマスなら終了 if((j == MTX) && (i == MTX)){break;} do{ r = rand()%(CMTX[MTX]-1)+1; } while(useDigit[r-1] == 1); board[j-1][i-1] = r;//ボードに代入する useDigit[r-1] = 1;//使われた数値をチェックする printf("%02",r); } printf("\n"); } board[MTX-1][MTX-1] = 0;//最後のマスに0を代入する } Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland 10-1.c: エラー E2451 10-1.c 32: 未定義のシンボル CMTX(関数 initBoard ) *** 1 errors in Compile *** この、32行目のエラーがどうしても解決しないので ご指摘お願いします。
>>626 strxxx関数の類が面倒というなら、
文字列と長さを格納した構造体と、それを操作する関数群を自作して
stringクラス相当のことをC言語の仕様の中で実装するくらいしかないんじゃない?
探せば既に誰かが作っているかも。標準には存在しない。
>>628 CMTXはマクロ関数として定義している。
CMTX[MTX]というのは使い方が間違っている。
631 :
デフォルトの名無しさん :2006/11/23(木) 01:38:13
>>630 ご返答、ありがとうございます。
本ではこの様になっていますが・・・
では、どのように直せば宜しいのでしょうか?
ご指摘お願いします。
633 :
デフォルトの名無しさん :2006/11/23(木) 01:46:11
>>632 ありがとうございました!
できましたが、一つ問題が発生しました
実行結果が
C:\bbb>10-1
【9 ゲーム】
070801
020403
0605
なってしまいます
C:\bbb>10-1
【9 ゲーム】
07 08 01
02 04 03
06 05
のように一行あけたいのですが・・・
何処をどうかえれば、こうなるでしょうか?
>>633 たぶん、このへんだよ!
useDigit[r-1] = 1;//使われた数値をチェックする
printf("%02 ",r);←/*ここに空白を入れる*/
635 :
デフォルトの名無しさん :2006/11/23(木) 01:55:31
>>634 できました!!!
ありがとうございました
C言語でjpgとか表示できる関数てどのくらいあるかわかるサイトないでしょうか?
難しい注文だなw google 辺りで上手くやればなんとかなるか?
コラムを行とか言うヤツ初めて見た。
GLFCのWindows版についてわかる方いらっしゃいませんか? 手に入れたいんですが、検索しても何も引っかからないもんで
640 :
627-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でしょうか?
ご返答、宜しくお願いします。
641 :
627-628 :2006/11/23(木) 05:26:00
自分なりに混乱している部分は マスが1〜9あって1〜8まで数値をマスの中に 振り当てるから、ー1になるのと 添え字でー1になる事です。
642 :
627-628 :2006/11/23(木) 05:32:42
添え字の所では 配列の添え字は0から始まるので、rand関数で出た数値が 7の時は7−1でuseDigit[6]の位置に1を代入しておきます。 参考書依り抜粋 これが特にちんぷんかんぷんです。
>642 10個の箱があります。 それぞれに番号をつけることにしました。 0からつけはじめて9まで付けたら番号の付いてない箱がなくなりました。 1個目の箱の番号は0です。 10個目の箱の番号は9です。 次に、箱に順番に1から10までの数字を入れることにしました。 1個目の箱には1が入りました。 10個目の箱には10が入りました。 さて問題です。 7が入ってる箱の番号はいくつでしょう?
[0] = 1 [1] = 2 [2] = 3 [3] = 4 [4] = 5 [5] = 6 [6] = 7 [7] = 8 [8] = 9 [9] = 10 [10]= 11
645 :
ぴゅあ :2006/11/23(木) 13:50:35
>>640 >for(j = 1; j <= MTX; j++){//縦方向繰り返し
>for(i = 1; i <= MTX; i++){//横方向の繰り返し
でのi,jが持つ値と
>board[j-1][i-1] = r;//ボードに代入する
での配列の添え字との関係
>r = rand()%(CMTX[MTX]-1)+1;
でrand()が返すだろう最小値,rが取る値と
>useDigit[r-1] = 1;//使われた数値をチェックする
での配列の添え字との関係
・扱う値としては1〜としたいけど …i,j,r等(r = rand() ...ではそのために"+1")
・配列の添え字は0〜だから"-1"
と読めるんではないでしょうか
>>>if((j == MTX) && (i == MTX)){break;}
>で、MTXとは3でしょうか、もしくは9でしょうか?
どのようにして3と思ってみたのか、もしくは9と思ってみたんでしょうか
思った"わけ"がある筈
(3か9か(或いは全く違うか)の答え(数字)を知るだけでなく、どう解釈した/或いは間違いに至った経緯は後々のためにも把握しておいた方がいいかも)
>#define MTX 3
ではないですか?
646 :
ぴゅあ :2006/11/23(木) 13:52:02
>>642 >配列の添え字は0から始まるので、rand関数で出た数値が
>7の時は7−1でuseDigit[6]の位置に1を代入しておきます。
・配列の添え字は0から始まる
・rand関数で出た数値が → それらから求めた変数rに入れた値(1から始まる)
・7の時は7−1で → "1から始まる値"を"0から始まる値"に
・ということで、useDigit[6]の位置
>>645 が解れば、解説不要だろうと思いますけど
647 :
デフォルトの名無しさん :2006/11/23(木) 14:17:56
cで配列のサイズをとるのはないのでしょうか。 javaでいうところの配列変数.length、vbでいうところのubound(配列変数)です。 mainとかで配列の個数ももらっているから無いのでは?
>>647 配列ならsizeof
配列の要素へのポインタなら無理
>>648 ただsizeofだとバイト単位になってしまうので、
配列の個数を求めるには型のサイズで割らないといけませんね。
マジ糞言語だなこれwww
>>650 インテリはみんな、アナルとスカトロ好きだろ?
652 :
ぴゅあ :2006/11/23(木) 14:46:25
>>647 >javaでいうところの配列変数.length
はちょっと毛色が違うところ…と思うけど
>vbでいうところのubound(配列変数)
は元々BASICが添え字の0始まり/1始まりを選択できる(何時からできるようになったのかはもう忘れたけど)
というところからlbound/uboundが生まれたりしたんだろうと思うけど
Cでは定数にしたり
>>647 の言ってるsizeofとか利用しつつ自分で管理
>配列の要素へのポインタなら無理
も自前で対応
>配列の個数を求めるには型のサイズで割らないといけませんね。
もマクロで対応してみたりとかされてきています
>mainとかで配列の個数ももらっているから無いのでは?
は、"配列の個数ももらっている"のではなくて
「要素数を渡さないと判らない(定数(固定値)にならない)から
(mainを呼び出す側が)渡している」んです
と理解できればいいと思います
length なんかの管理領域すら惜しい頃からC言語はあるんだよ
654 :
647 :2006/11/23(木) 14:48:49
>>648-649 ご回答ありがとうございます。
そうか、配列でとってるからsizeof(配列変数)/sizeof(型名)で逝けるんですね
よーく考えてみたら、やりたいことはmallocとかでとった領域のサイズをしりたいことでした。
ポインタだからムリなんですね。mallocとかってサイズ調整してるみたいだし。
関数とかにmallocで領域取った部分にunsigned charの配列をいれて、
関数内で処理しようとおもったら、関数呼ぶ側からサイズも渡してやらないといけないんですね。
文字列でなくてファイルからとったバイナリ値を操作する関数をつくってます。
lengthとかuboundとかがありがたく思えてきました。
関数にポインタ渡すときはサイズも渡すようにしようと思います。ありがとうございました。
655 :
647 :2006/11/23(木) 14:51:33
×やりたいことはmallocとかでとった領域のサイズをしりたいことでした。 ○やりたいことはmallocとかでとった領域に入ってるどこかで入れた内容のサイズをしりたいことでした。
656 :
ぴゅあ :2006/11/23(木) 15:03:28
>>654 >mallocとかってサイズ調整してるみたいだし。
これはコード上より内部的な話なので、考えなくていいと思います
(>mallocとかでとった領域のサイズをしりたいことでした。
mallocの際に必ずサイズを渡している筈なので、それを渡せていればいい…ですね)
>>657 scanf を使わず getcharを使う
>>649 型のサイズもsizeofで書くと失敗しないよ
660 :
647 :2006/11/23(木) 15:42:34
>>659 配列のサイズのとりかた
unsigned char hoge[255];
printf("length = %d\n", sizeof(hoge) / sizeof(unsigned char);
ですね。ありがとうございます。
661 :
ぴゅあ :2006/11/23(木) 15:49:55
マクロにすると便利かと思ったりするけど スルーっぽさを漂わせてるみたいだから別にいっか
662 :
ぴゅあ :2006/11/23(木) 16:36:32
My name is pure. However, it is not a pure mind. It is a question though is sudden. Do you think that I am a person in question? Or, the pretender? Do you understand?
>>660 sizeof(hoge) / sizeof(hoge[0])
hoge が構造体でもどんな型でもつかえる。
>>662 my.name = pure;
it = my.
however(it!=pure.mind);
assert(it & (QUESTION | SUDDEN));
you = I == person[QUESTION] ? 1: I==PRETENDER ? 2: ~UNDERSTAND;
665 :
623 :2006/11/23(木) 17:51:02
>>624 >>625 今さらですが、ありがとうございました
(u)int32_tはピッタリ32bitの事かと勘違いしてました
666 :
623 :2006/11/23(木) 17:52:46
訂正 (u)int_fast32_tはピッタリ32bitの事かと勘違いしてました
>>657 数値の取得にfscanf()を使っているならfgets()+sscanf()にして戻り値をチェックしたまえ。
sscanf()の代わりに、strtol()/strtod()で変換終了点をチェックしてもいいけど。
>>657 fscanf()のリターン値のチェックがEOFしかやってないじゃん。
1以外だったらループを抜けるって処理も入ってないと。
2つ質問です。 C++では定数はconstで定義することが普通のようですが、Cではどうなんでしょうか? 色々なサイトを見てみると、#defineでやってるのが多いようですが。 なぜconstで定義しないのでしょうか? もう一つ、ヘッダファイルにconstで定数を定義しようと考えたのですが、どちらが 一般的でしょうが? 1.ヘッダファイルにstatic constで定義する。 2.ヘッダファイルに対応する.cファイルに実体を定義し、ヘッダファイルでexternする。
>>669 Cではconstで定義したものを、定数式が要求されるところ
(配列宣言時の要素数やcaseラベルなど)で使うことができない。
そんなCを見て、C++ではconstで定数を定義できるようになった。
だからCでヘッダにconstな変数宣言をおくのは、そもそも一般的ではない。
C++では、staticなしでconst使うが(少なくとも整数型ではそれで問題ないようになっている)。
整数型以外だとなにか問題あるケースがあるの?
クラスオブジェクトだとコンストラクタ・デストラクタがあるから、 どうなるか俺は規格書を見ないとわからない。
ああ,クラスか. 文字列とか,実数でなにかあるのかと思った.
674 :
669 :2006/11/23(木) 23:26:18
>>670 Cではconst変数と定数は区別しなくちゃいけないんですね。
で、定数と同じ使い勝手を保ちつつ定数に名前を付けるとしたら
#defineしかない、ということですか。
良く分かりました。有難うございました。
675 :
デフォルトの名無しさん :2006/11/24(金) 00:17:32
C言語で違うディレクトリのファイルの内容を書き換えたいんだけど、 どうやってやるんでしょう。
>>676 カレントディレクトリのファイルと要領は同じ。開くファイル名を相対パス名にすればいいだけ。
677 :
675 :2006/11/24(金) 00:32:27
こんな感じにやってみたけど駄目だ。 レスサンクス if((sfp = fopen(..\fff.txt,"r"))==NULL) puts("コピー元、オープンできませんでした。");
\ → \\
679 :
675 :2006/11/24(金) 00:34:43
一つ上のカレントディレクトリのファイルを開こうとしてるんだけど。 コンパイルエラーでございます。
>>677 ..\fff.txt
これ”..\\fff.txt” じゃなきゃダメなんジャマイカ?
if((sfp = fopen(..\fff.txt,"r"))==NULL) ↓ if((sfp = fopen("../fff.txt","r"))==NULL)
682 :
675 :2006/11/24(金) 00:37:26
出来たwww すげーありがと またよろしくーーーwww
683 :
デフォルトの名無しさん :2006/11/24(金) 02:05:08
while(1)の(1)は、どんな意味があるのでしょうか?
真偽値の真
685 :
デフォルトの名無しさん :2006/11/24(金) 02:12:34
サンクスだす
687 :
ぴゅあ :2006/11/24(金) 07:52:52
>>686 適材適所でしょ
>>679 ちっちゃいツッコミですけど
>一つ上のカレントディレクトリ
カレントディレクトリの一つ上の(カレントとは言わない)ディレクトリ
と呼ぶです
>>683 Cでは0(偽)ではない値を真(0以外)と捉えてやってください
whileと組み合わせてwhile(1)は"無限にループさせたい"
どっちかと言えば、for (;;) 推奨。
それキメェからやめろ。
んじゃ、 #define ever (;;) for ever とか、 #define _ for (;_;) とか。
691 :
デフォルトの名無しさん :2006/11/24(金) 12:43:40
#include<math.h> #include<stdio.h> #include<string.h> void wait(int tm) {int i,j; for (i = 1;i < tm; i++) for(j = 1;j < tm; j++){ double x = sin(i) * cos(j);}} int main(void) { int cnt = 0; char mes[] = "あいうえ"; int len = strlen(mes); while(1){ int i; putchar('\r'); for (i = 0;i<strlen(mes);i+=2){ if(cnt + i<len){ putchar(mes[cnt + i]); putchar(mes[cnt + i+1]);}else{ putchar(mes[(cnt + i) % 8]); putchar(mes[(cnt + i+1)%8]);}} wait(2000); if(cnt < len - 1) cnt+=2; else cnt = 0; }return(0);} これを右に流れるようにしたい
すれば?
while ( "loop forever" )
694 :
デフォルトの名無しさん :2006/11/24(金) 13:05:42
ファイルの一部分の変更の仕方が分かりません。 例えば set の次の0を1に変える方法です。 助言プリーズ while(*fp[pt] != '\0') && (temp[pp] != '\0')){ if(*fp[pt]== temp[pp]){ pt++; pp++; } else{ pt=pt-pp+1; pp=0; } } if(temp[pp]=='\0'){ while(*fp[pt] != "A-Z" || *fp[pt] != "a-z" ){ switch(*fp[pt]){ case ' ': pt++; break; case '0': *fp[pt]='1'; puts("0を1に書き換えました"); break; case '1': puts("すでに1です。"); break; } } puts("処理は無事、終了しています。"); 長くてすみません。
while(*fp[pt] != "A-Z" || *fp[pt] != "a-z" ){ この条件が真になるの?
696 :
695 :2006/11/24(金) 13:23:50
よく見たら常に真の無限ループだった orz この条件が偽になるの?だな
>>694 ちょっと書き替える程度のことでそんなキメーことすんなよ。
>>694 >while(*fp[pt] != "A-Z" || *fp[pt] != "a-z" ){
ローマ字以外の時だけ繰り返すって意味なら
while !((*fp[pt] >= 'A' && *fp[pt] <='Z') || (*fp[pt] >= 'a' && *fp[pt] <= 'z') ){
こんな感じになる
700 :
694 :2006/11/24(金) 13:31:04
setの次の数字を0から1に変えたくてtemp[]="set"としています。 *fpはFILE型のポインタでchar型でなく、int型としてしか取り扱えない ようなエラー内容。fopen関数でfpに変更したいファイルを'r+'で オープンしています。 695の内容はsetの次の数字以外の文字が来たときにはプログラムが終了 するような意図を持って記入しました。英文字が来たら終了の意図です。 自信ないんですが。
#include<ctype.h> while(!isalpha(*fp[pt]))
ファイル操作が FILE* fp = fopen() の後 直接 *fp or fp[] で操作する と想像したお前に完敗
703 :
694 :2006/11/24(金) 13:35:35
それってコンパイルできないんじゃ
>>704 それでもコンパイルは通るだろ。
char **fpとかじゃねぇの?
706 :
694 :2006/11/24(金) 16:56:30
解決しました。 レスくれた人、有難う。 勘だらけで内容くちゃぐちゃだけど、 結果オーライ。
707 :
デフォルトの名無しさん :2006/11/24(金) 17:19:43
fork execlで蹴った子プロセスが 終了したか監視したいんだけども どうやるんざますの?
709 :
デフォルトの名無しさん :2006/11/24(金) 17:34:55
710 :
ぴゅあ :2006/11/25(土) 00:29:31
>>688-690 あちしの場合はwhile (1)よりfor ( ; ; )を好んで使いますね
賢いコンパイラならwhile (1)をfor ( ; ; )として解釈してくれそうでもあるけど
なんか「キメェ」って感じなので。。。(使い方合ってます?)
(while(1)は、毎回「1だよね」って確認してくれてそうな…)
#define forever() for ( ; ; )
とかすることもあったりするけど(色んなコードを見てるとそんな風にしているのも多くあったりする?し)
サラッと書いて済ますときは(特に)for ( ; ; )だったりですけど
実際while(1)を使うかfor ( ; ; )を使うかはそのときの気分?かな
圧倒的にfor ( ; ; )の方が多いのは間違いないけど
仕様もない話ですが。。。
てめえの好みなんか聞いてねえ。 while(1)を最適化しないコンパイラなんて糞コンパイラだ。 for(;;)はANSIが無限ループのために規格化した書き方だ。
for (;;) ; /* ひげのおじさん */ for ( ; ; ) ; /* 悲しそう */ while (1) ; /* ょぅι゛ょの割れ目?卑猥です */
マジックナンバーを含まないっつーポリシーに従うなら for(;;) の方がベターだとは思うが、 while(1) はもう while(1) というパターンとして認識されてるから、正直どっちでもいいと思うぜ。
for (;;)こそパターンとして認識されているだろと俺は思っている。
715 :
デフォルトの名無しさん :2006/11/25(土) 09:51:26
質問なんだけど、bccコンパイラでコンパイルした時に出来るexeファイル 以外のファイルってなんなの? .makと.objと.tdsなんだけど。 教えてくださらんか。
716 :
デフォルトの名無しさん :2006/11/25(土) 09:53:30
もう一点質問です。 C言語で他の実行ファイルを実行させたい場合、 どういう風に記述すればいいのだろうか。
漏れは while (1==1) だな。
>>715 .makはコンパイル時には作られないだろう
BCCDeveloperかなんか使ってるんじゃねーの?
ちなみに.makはメイクファイルといってコンパイルやリンク時の手順を記述したもの
自分で書いたりIDEが吐いてくれたメイクファイルを元にコンパイル等を実行する。
tdsは何か忘れた
.objは純粋にコンパイルしたときに作られるオブジェクトファイル
本来EXEを生成するには
・hoge.cをコンパイルしてhoge.objを生成
・hoge.objと必要なライブラリ等をリンクしてEXE生成
という大まかに分けて2つの手順を踏む必要があるが、
bccは-cオプションをつけない限り、リンクも自動的にやってくれるようになっている
間違ってるかもしれないけど、大体こんな感じ
719 :
715 :2006/11/25(土) 11:32:22
720 :
ぴゅあ :2006/11/25(土) 13:21:20
>>716 system関数周りとかexec系の関数辺りとかを見てみれば
>>714 当然パターンとしてコンパイラは認識する筈だけど
中身(式)なしのforがどうなるかだろうけど
アセンブラをずっとやっているときにCが出てきて
アセンブラからCを中から見て理解したけど(特にポインタとか)
中身なしのforは中身なしのコードで出てきてた記憶はあるけど
いずれにしても余程変なことでもしてなきゃ
好みで選んでいいだろうと思うけど
>>711 ANSI Cが定められたのを知っても特に興味も沸かなくて
気にしてこなかったけど
あちしがずっと好んでだけで使ってきてたことを
適切であっただろうとわざわざ立証してくれてありがとう
あちこちのスレにしゃしゃり出てくる人がウザイですー
723 :
デフォルトの名無しさん :2006/11/25(土) 13:52:57
724 :
デフォルトの名無しさん :2006/11/25(土) 14:10:21
ここでおk?
725 :
デフォルトの名無しさん :2006/11/25(土) 14:34:11
726 :
デフォルトの名無しさん :2006/11/25(土) 15:22:47
おkおk
727 :
デフォルトの名無しさん :2006/11/25(土) 19:40:35
ファイルの中身を配列に入れて配列を表示させると順番が ぐしゃぐしゃです。 助言くれーー。
ソース見せないと
729 :
デフォルトの名無しさん :2006/11/25(土) 19:42:32
#include "sengen.h" #define NUM 500 int main(){ FILE *fp; int ch; int chx[NUM]={0}; int i=0;
730 :
デフォルトの名無しさん :2006/11/25(土) 19:43:09
if((fp=fopen("C:\\tools\\ten.bat","r"))==NULL) puts("読み取りオープン失敗"); else{ puts("元の内容"); while((ch=fgetc(fp)) != EOF){ chx[i]=ch; putchar(chx[i]); i++; } } putchar('\n');
731 :
デフォルトの名無しさん :2006/11/25(土) 19:44:09
puts("配列chxの内容"); for(i=0;i<NUM;i++) putchar(chx[i]); getchar(); return 0; }
732 :
727 :2006/11/25(土) 19:45:04
さらすのに手間取りました
733 :
727 :2006/11/25(土) 19:47:51
NUM=1000にしてもだめです。
734 :
727 :2006/11/25(土) 19:58:04
NUM=2000にしたらできました。でもファイル読み込みのときって
設定配列数オーバーしても関係ないんですね。
>>720 どうもありがとう、ぐぐってみます!
>>727 iがNUM以上になるのを何故放置するのか?
>>727 #include <stdio.h>
#define SIZE 1000
main(){FILE *fp; int i, c, chx[SIZE];
if((fp=fopen("C:\\tools\\ten.bat","r")) ==NULL) puts("どんまい");
else {puts("もとの");
for (i=0; i<SIZE && (c=fgetc(fp))!=EOF; i++) putchar(chx[i]=c);
chx[i]='\0';}
getchar(); puts("\nはいれつのなか");
for (i=0; i<SIZE && chx[i]; i++) putchar(chx[i]);
getchar();return 0;}
fclose はしないのかにゃ
fclose()は省略しても、まあ、問題ないな。
>>736 #define SIZE 1000
for (i=0; i<SIZE
chx[i]='\0';
’SIZE’以上のファイルだと i は1000になって chx のサイズオーバー
741 :
716 :2006/11/25(土) 22:12:56
ファイル実行させるソースを書きたいんだけど こんな感じにやって駄目でした。 #include <stdio.h> #include <process.h> int main(){ execv("C:\\tools\\ten.bat",NULL); getchar(); return 0; } ヒントいただけないでしょうか
system() 使っとけ。
743 :
716 :2006/11/25(土) 22:57:04
#include <stdio.h> #include <process.h> int main(){ system("C:\\tools\\ten.bat"); getchar(); return 0; } あっさりできたw どうもありがとうございます。
バイナリファイルへの読み書きについて、構造体単位で扱うことは可能でしょうか? 1個の構造体では出来たのですが、一つのファイルに二つ以上入れたとき、一つ目のデータが破棄されてしまうのです。 具体的には 1、no番目の構造体データをfseek(fp,no*sizeof(str),SEEK_SET)後fwrite(&str_a,sizeof(str),1,fp)で入力。 2、別のnoについて同様に入力。 3、確認の為、no番目のデータををfseek(fp,no*sizeof(str),SEEK_SET)後fread(&str_b,sizeof(str),1,fp)でstr_aにコピー。 4、printfでstr_bの中身を見ると、0になっている。 コンパイルエラーは起きないし、もちろんメモリ保護違反等も起きてないのですが…
>>744 んでstr_bはどこで読み込んでんの?
int main(void) { int no,sel; str_a alpha; FILE *fp; printf("plz input no\n"); scanf("%d",&no); printf("plz input RorW(W=1,R=2)\n"); scanf("%d",&sel); switch (sel){ case 1: fp=fopen("data.bin","wb"); fseek(fp,sizeof(str_a)*no,SEEK_SET); printf("plz input a,b,c\n"); scanf("%d%d%d",&alpha.a,&alpha.b,&alpha.c); fwrite(&alpha,sizeof(str_a),1,fp); break; case 2: default: fp=fopen("data.bin","rb"); fseek(fp,sizeof(str_a)*no,SEEK_SET); fread(&alpha,sizeof(str_a),1,fp); break; } printf("%d\t%d\t%d\n",alpha.a,alpha.b,alpha.c); fclose(fp); return 0; } 上で書いたまんまのソースはいじりまくってしまったので申し訳ないですけど、↑で。 もちろん、同じ状況である事は確認しました。
と、肝心の構造体を書き忘れました。 typedef struct { int a,b,c; } str_a; です。
>>747 noはゼロじゃなくていきなり 1 から初めてんの?
多分最初のfseek()が失敗してるよ。戻り値をみてみ。
貼ってあるソースコードで書いているとおりに動作したぞ。 期待した動作と違うって事だろうから、エスパー解答 fp=fopen("data.bin","wb"); ↓ fp=fopen("data.bin","r+b");
>749 no=0とno=1でfseekの戻り値見てみましたが、0でした。 fseekの引数でnoを(no-1)にしてnoを1と2で試してみましたが、やっぱりno=1を読むと0 0 0になってしまいました。 戻り値の意味が間違ってるならごめんなさい。
>>751 0なら成功してますね。
>>750 あっそういう事か。ファイルを上書きして消してしまってるという事ね。
元のファイルを残したいならr+bだな。
>750 それで試したら無事表示できました、ありがとうございます! オープンモード、もう一度勉強しなおしてきます。 >751 わかりづらくて申し訳ありませんでした。 上書きはwbやwb+とはまた別の書き方なんですね… こんな深夜にお付き合い頂き、ありがとうございました。
せめて構造体の前後に#ptagma pack(0)みたいなやつでも入れといたほうがいいよ。
>754 初心者なんでptagmaが何かわかりません。 わかりやすく説明してくださいませんか?
ptagmaってのはスメグマみたいなもんだ。
757 :
デフォルトの名無しさん :2006/11/26(日) 13:23:19
リナックスのソースコードをダウンロードしたんだけど、どうやって 内容をみるのでしょうか。何か専用のツールがあるのかなあ。 こんな感じのファイルです。 MAKEDEV-3.1.0-19.src.rpm ご存知の方教えてください。 スレちがいならすまん。
>>757 それはインストール用パッケージだ。詳しくは犬板でどうぞ。
>>755 >754はpragmaと言いたかったのだろう。
要は、構造体のメンバ間に埋め草が必要になる可能性を排除しておけと言うことだ。
>>753 モード,動作,ファイルがないとき,ファイルがあるとき
r,読み込み専用,エラー,開く
w,書き込み専用,作る,クリアする
a,追記専用,忘れた,開いて末尾に移動
r+,読み書き,エラー,開く
w+,読み書き,作る,クリアする
a+,追記部で読み書き,忘れた,開いて末尾に移動
>>755 #ptagma ではなく #pragma
C言語の範疇では定義されていない部分について、コンパイラに対して
特殊な指示を出すためのもの。
VC++なら pragmaだったけど、他のコンパイラなら違ってるかも。良く知なくてすまん。
C言語の学習を始めたばかりなら、まだpragmaとかは意識しないほうがいいかも。
ある程度基礎ができてきてから出いいので、
変数をメモリに割り当てるときの境界調整だとか、
構造体のメンバの間に詰め物がされる場合があるとか、
そういう話も調べて見るといいかも。
以下のページの説明が分かりやすそう。
ttp://mag.autumn.org/Content.modf?id=20050430014843 とりあえず、今やっている構造体のメモリ内容をファイルに書き出す&読み込む
というのは、同じ環境でやっている分には使えるけど、
書き出したファイルを別の環境で読み出す上手く行かないことがあるというのを
知っていればいいと思うよ。
曖昧なくせに講釈垂れんじゃねーよ
そもそも構造体をそのままfread,fwriteするのがアレなんで、 中途半端にpragmaどうこうは気にしなくてもいいかもしれんけど。
761 は 759 宛て
764 :
デフォルトの名無しさん :2006/11/26(日) 15:58:57
int型の数値を送ってもらい、最上位ビットを反転して、 1以上の値だったらマイナスをつけて返す、 -1以下の値だったらプラスをつけて返す関数を作成したいのですが、 最上位ビットを確認し、反転する一番いい書き方ってどんなんでしょうか?
int hoge(int x) { return -x; }
2の補数で格納されてるから
最上位ビットを反転しても符号が逆でも絶対値が同じにはならん。
>>764 が結局何をしたいのか書かないから
>1以上の値だったらマイナスをつけて返す、
>-1以下の値だったらプラスをつけて返す関数を作成したいのですが、
の部分より
>>765 が正解のように思える。
767 :
デフォルトの名無しさん :2006/11/26(日) 16:25:27
1次元配列a[10],b[10]をそれぞれ0と’a’でクリアし、 ってなんだよ〜。くそorz
>>767 クリアじゃなくフィルだな
int i;
for (i=0; i<10;i++) {
a[i]=0;
b[i]='a';
}
769 :
767 :2006/11/26(日) 16:40:13
自己解決します・・ありがとうございます。
おっと
>>768 ありがとうございます。
770 :
デフォルトの名無しさん :2006/11/26(日) 18:17:24
main関数内でkaikiという関数を呼び出し、 そのときmainの中にある配列atai[10]の値をkaikiに渡して, kaiki内で計算した結果のkotae1,kotae2という二つの変数をmainに返したいのですが、 どのように書いたらいいのでしょうか?
>>770 void kaiki(int n, int* kotae1, int* kotae2)
{
...
}
main()
{
int atai[100];
int kotae1, kotae2;
...
kaiki(atai[10], &kotae1, &kotae2);
...
}
struct kotae { int kotae1; int kotae2; }; struct kotae kaiki(int n, int const * atai) { struct kotae rtn; // rtn.kotae1 = 0; rtn.kotae2 = 0; // return rtn; } int main() { int atai[100]; struct kotae kotae = kaiki(sizeof(atai) / sizeof(* atai), atai); printf("kotae1:%d, kotae2:%d\n", kotae.kotae1, kotae.kotae2); return 0; }
773 :
デフォルトの名無しさん :2006/11/26(日) 21:56:15
エクセルファイルで Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm 0 23 0 374.2 0 0 0 0 0 0 0 0 0 1 22 ・・・ があるのですが、2行4列目の数字だけをfscanf等で取り込みたいです。 このようなエクセルファイルが365個あり、順々に2行4列目だけをP[i]へ格納していこうと思うのですが、読み込みの部分が上手くいきません。 よろしくお願いします。
>>773 その365個のファイルは、ファイル名に規則性があるの?
それとも、全部、手入力?
775 :
デフォルトの名無しさん :2006/11/26(日) 22:22:55
>>774 年間データで
1_1.xls〜12_31.xls(1月1日〜12月31)
です。
>>773 読みこむ部分だけ。
一行256文字以下で、二行目が整数、整数、整数、実数の並びになっているとして。
int readVal(const char *filename, double* d)
{
FILE *fp;
char line[256];
int dmy1, dmy2, dmy3;
fp = fopen(filename, "r");
if (fp == NULL)
return 0;
if (fgets(line, sizeof line, fp) == NULL)
return 0;
if (fgets(line, sizeof line, fp) == NULL)
return 0;
if (sscanf("%d %d %d %lf", &dmy1, &dmy2, &dmy3, d) != 4)
return 0;
fclose(fp);
return 1;
}
777 :
776 :2006/11/26(日) 22:39:50
もう寝なきゃならないので、他の部分は、 ↓まかせた。
778 :
デフォルトの名無しさん :2006/11/26(日) 22:40:45
2行4列目って決まってんのなら fgets(s, sizeof(s), fp), fgets(s, sizeof(s), fp); P[i] = s[3]-'0'; で良いんじゃね?
つか、perlかRuby使えよそんなの。
>>779 テキストとしての4列目なのではなく、4セル目なんでね?
>>776 何故%*dとせずにダミーに格納する?
>>775 xlsファイルを読むのは途方もなく面倒なわけだが、csvか何かに変換できないのか?
782 :
デフォルトの名無しさん :2006/11/26(日) 23:46:01
拡張子を直接txtかcsvに直せばどうにかなりますかね?
>>776 の方法では駄目でしょうか?
もう少しで試せるので出来次第報告します。
>>782 拡張子ではなく内容の問題
書式等の情報が含まれるからめんどくさい
784 :
デフォルトの名無しさん :2006/11/26(日) 23:54:55
txtに直接直したら、セル間はタブで分けられてます。 行間は勿論改行です。
>>784 データ保存する際にtxtとかにするって意味か
ファイル名の変更で拡張子変えるって意味かと思った
>>785 スイマセン、そういう意味です。
伝わりにくい言い方で申し訳ないです。
grepか何かでもっと単純な形に とりあえず切り出したらどうだろ?
某サイトより #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ではコンパイルできてしまいます。何か理由ってあるんでしょうか。
>>788 標準じゃないライブラリconioがあるかどうか。
>>790 どの括弧が足りないんでしょうか?
それとコンパイルできないのが正しい形なんでしょうか?
たぶん VC++ の方は getch(); → _getch(); にすればコンパイルできるんじゃないかなかな。
794 :
デフォルトの名無しさん :2006/11/27(月) 03:39:15
例えばsin2θ=xで、xがわかっている場合にθの値を求めるにはどうすればいいですか?
796 :
794 :2006/11/27(月) 04:02:27
>>795 具体的にはどうすればいいんですか?
まったくわからないので教えて下さい。
798 :
794 :2006/11/27(月) 04:50:43
>>797 ぐぐっていろいろ試してみましたができませんでしたorz
>>798 だいたいこんな感じ
#include <stdio.h>
#include <math.h>
#define f(x) (sin(2 * (x)) - 0.5) /* x = 0.5 */
#define g(x) (2 * cos(2 * (x)))
#define MAXCOUNT 10
int main(void)
{
double x = 0.5;
int k;
for (k = 1; k <= MAXCOUNT; k++) {
x = x - f(x) / g(x);
printf("%17.12f %15.8e\n", x, fabs(f(x)));
}
return 0;
}
math.hをインクルードするのを忘れんようにな
sin2θって表記は2が上付きなのをまんま書いてるかも。 そうだとasin(sqrt(x))とasin(-sqrt(x))。
putchar,getcharを使って、20061109のように日付を入力すると 曜日を出力するプログラムを作成せよ、って課題が学校で出たんですが 全く分かりません・・・ 誰か教えてください
805 :
794 :2006/11/27(月) 17:18:45
なんで int *x じゃなくて int* x にする人がいるの?
C++やると、参照型 (int& r;)との兼ね合いで、そっちも悪くないように思えてくる。 C++作った人もint* p;派だというし。 もちろんC++やったことがなくてもint* p;の人はいるし、その逆もそう。結局は好みの問題。
こんばんわ。質問さしてください。 英数字とか漢字をを入力し、それを16進数で表示したいと考えています。 scanfで取り込んでprintfでみたいにしてみたんですがうまくいきません。 アドバイスいただけないでしょうか?よろしくお願いします。 また、このやり方で漢字を16進で受け取ることはできるのでしょうか?
C++ より Objective-C の方が明らかに上。 仕様も性能も。
>>808 漢字はchar型の変数に収まらないので、文字列(char配列)として扱え。
>>809 シェアはC++のほうが明らかに上。
でもたぶん、そもそもC++とObjective-Cが目指している方向は違うと思うんだ。比べるだけ無駄だと思う。
>>808 入力された文字列の文字コードを表示するって意味だろうか。
ひらがなとかを1バイト文字に変換するにはどうすればよくて? 2バイトURLを1バイトに直したくて・・・
>>812 ひらがなは1バイトにできん
2バイト文字だ
URLなら、英数字2バイトを1バイトにしたいわけだろ? 汎用関数みたいな都合のいいものはないみたいね。 変換するのが英数字なら、なんとか自分で(環境依存のものを)書こう。 適当だけど、 unsigned char hoge[] = "abcde:/"; int i; for (i = 0; i < sizeof(hoge); i++) { printf("%x ", hoge[i]); } こんな感じでコードの規則性を調べて、 unsigned char hoge[] = "abcde:/"; char str[256]; int i; for (i = 0; i < sizeof(hoge) / 2; i++) { switch(hoge[i * 2]) { case 0x82: str[i] = hoge[i * 2 + 1] - 0x81 + 'a'; break; default: break; } } str[i] = '\0'; こんな感じで変換するしかないんじゃない?コロンとかスラッシュは 一つずつ対応して・・・ああめんどくさい。しかも移植性なし。
812がやりたいことはURLエンコードのような気がする。
case WM_CREATE時のコードをcase WM_KEYDOWNの時にも 使いたいのですが、関数にして何度も使うには文が長く 参照する変数が二次元配列などが多くてごちゃごちゃしてます。 どうすれば同switch内でもう一度使えるでしょうか? 教えてください。お願いします。
817 :
デフォルトの名無しさん :2006/11/28(火) 06:52:16
関数にして何度も使うには文が長く、って、 その長い文を同じswitch文の中で二ヶ所使う方がさらにごちゃごちゃするんじゃないか? まず、その長い処理を切り出して関数にする。 関数内で使うために渡すべき変数が多すぎて引数がごちゃごちゃするようなら、 構造体等でまとまりを作って呼び出しをすっきりさせる。 まとまった処理とのインタフェースが変数がごちゃごちゃしているせいで美しくないと感じるようなら、 データ構造の変数への切り出し方を再考することも考えてみたら?
単純に、 case WM_CREATE: case WM_KEYDOWN: // 処理 って話ではないのかね。
820 :
808 :2006/11/28(火) 12:48:13
>>811 そうです。文字コードを受けってそれを表示したいので
scanfで取り込んだらコードが出てくるかなと思い質問さ
していただきました。
JISコードを表示することは簡単ではないのでしょうか?
JISコードで入力してもらえれば簡単だろうけどな。
822 :
デフォルトの名無しさん :2006/11/28(火) 18:00:27
整数を入力して、その数までを2のべき乗ずつ表示していくという 問題なんですが、エラーは出ずにコンパイルできても 実行したら何も起きません。 宜しければどこが間違ってるか教えて頂けないでしょうか? #include <stdio.h> int main (void) { int i,no; printf("正の整数を入力して下さい:"); scanf("%d", &no); i = 1; while (i <= no) { if (i == (2 * i)) printf("%d ", i); i++; } if (no > 0) putchar('\n'); return (0); }
if の条件が不備。 2のべき乗かどうかのチェックをしていない。 さらに i が 2 * i と等しくなるのは i=0 の時だけ。
>>822 #include<stdio.h>
int main (void)
{
int i,no;
printf("正の整数を入力して下さい:");
scanf("%d", &no);
for(i=1;i<=no;i<<=1)
printf("%d ", i);
if (no > 0)
putchar('\n');
return (0);
}
825 :
電信男 :2006/11/28(火) 18:34:08
小文字から大文字に変換したいので↓のようなプログラムを作ったのののですが、 うまいことできません。 AppleがyPPLEになってしまいます。 どーすればいいでしょうか? #include <stdio.h> int main() { int i = 0; char c[] = "Apple"; char b [80]; printf("String: %s\n", c); for(i = 0;i < 5; i++){ if ('a' <= c[i] && c[i] <= 'z' ) b[i] = c[i] + 'A' - 'a'; } printf("Upper case: %s\n", b); return 0; }
>>825 c[i]が小文字以外の時の処理を加えるといいよ
または #include<ctype.h> と b[i]=toupper(c[i])
>>823 アドバイスありがとうございます。
ですが、2のべき乗のチェックの式がわからないのです。
>>824 例題がwhileを使ってるのでできればwhileのままでやりたいのですが…
>>827 2のべき乗なら1になるまでずーっと2で割り切れる。
forのループをwhileに直すことぐらい自分でしろ。
>>827 「2のべき乗かどうか」をチェックする必要など無い。
「2のべき乗にしかならない」値を作ればいい。
i=0;while((2<<i)<=no){printf("%d ", (2<<i));i++;}
間違いた。 i=0;while((1<<i)<=no){printf("%d ", (1<<i));i++;} こうだな。
>>825 文字列の終端に '\0' もいれないといけない。
834 :
デフォルトの名無しさん :2006/11/28(火) 22:55:33
質問です。 C言語でフォルダの中身の一覧を表示させるには どうすれば良いでしょうか。
>>834 system("dir");
system("ls");
のどちらかでいいんじゃないかな?
質問なのですがvisual C++ で = :左のオペランドが,左辺値になっていません。 というエラーが出るのですがこれはどういうことなんでしょうか?
左のオペランドが,左辺値になってないんじゃないか?
すみません。オペランドってなんですか?
手術室のこと
>>839 x = y + z;
ってあれば、yとzはオペレータ'+'のオペランドで、
xとy+zがオペレータ'='のオペランド
>>840 ワロタ
>>841 教えていただきありがとうございました。ということは=の左辺と右辺が矛盾してますよってことですか?
>>842 矛盾しているということではなくて、=の左辺にあるものが
代入可能なものではないということ。
代入できないってことじゃないの エラーが出た行を貼り付けてくれれば簡単に答えられると思うが
if(i>l && i>o){ if((l*l+o*o)>i*i) printf("鋭角三角形"); if((l*l+o*o)=i*i) ←ここです。 printf("直角三角形"); if((l*l+o*o)<i*i) printf("鈍角三角形"); }
どうもありがとうございました。おかげで完成しました。
848 :
デフォルトの名無しさん :2006/11/28(火) 23:43:54
なんかの一行AAに見えた
テキストエディターを作成しようと思うのですが、 fopen関数とかその辺のファイル入出力関係の関数を使って作っていけばいいんですよね? なにかコツとか陥り易い問題点とかあったらアドバイスよろしくお願いします。
ファイル操作の関数が何かを聞くということはたぶんかなりの初心者かと思うけど、 テキストエディタを実装するには理解すべきことがかなり多いと思うよ。 ファイル入出力だけじゃなく、GUI(描画、ユーザ入力)とか、メモリ上のデータ管理とか。 とりあえずアドバイスとしては ・いきなり高機能なものは目指さない。 ・基本はしっかり学ぶ。入出力が良く分かってないなら、テキストエディタはいったん置いておいて ある程度自由に入出力が扱えるくらいには勉強してみる。 ・ちゃんとテストする。いろいろ作りこんでから上手く動かないと分かっても、原因を調べるのは大変。 ・自分でいろいろな情報を調べられるようにする。 ・めげない。
851 :
デフォルトの名無しさん :2006/11/29(水) 00:35:24
シューティングゲームで、 方向キーを押しっぱなしで弾をうちたい時などに、 何のボタンを押しているか というのを 取りたいのですがどうすればいいでしょうか。 kbhit()では最後に押されたキー1つしか取れないですよね・・
852 :
デフォルトの名無しさん :2006/11/29(水) 00:41:47
Func(int byte_len) { int i = 1000; char data[4], *pc; pc = (char*)&i; data[0] = pc[3]; data[1] = pc[2]; data[2] = pc[1]; data[3] = pc[0]; } ↑のdataに入る数字の並びをエンディアンを気にせずに、 ビッグエンディアン形式にしたいのですが、 エンディアンを気にしない書き方はありますか?
>>852 1.バイトオーダーを隠してしまう関数を作る。
2.シフト演算を使う。
1,2のどちらかだな
シフト演算で取り出す関数を作ろうと思います。 ありがとうございました。
>>851 そもそもkbhitじゃ一つも入力取れないぜ?
>>850 テキストエディタにGUIってどんなだよ?
ワープロと間違えてんのか?
>>856 ed みたいなの想像してる?
スクリーンエディタなら GUI でしょ
かなや漢字を表示するからGUIだな。
GUI使ってるテキストエディタって少なくね? 使ってるとしてもツールバー程度じゃね? ほとんどのエディタはCUIだろ?
ASCII文字以外を表示したらそれは GUI なんだよ。 だから DOS/V は GUI-OS なんだよ。
GUI が気になってググってみた。 思ってたのとかなり違ってた。 オレは古い人間なんだと思い知らされた。
862 :
デフォルトの名無しさん :2006/11/29(水) 02:49:27
int d; //入力値 while(1){ //移動する数値を入力する do { d = -1; printf("動かす数字を入力して下さい > "); scanf("%d", &d); while (getchar() != '\n') { } if(d == 0) { r = 1; break; } これで、d = -1; に何故-1が付くのかわかりません。 入門書に書いてある説明に依ると数値以外の文字や文字列が 入力されると、scanf関数の入力値を格納する変数には何も 入らないので、前に入力した値が入っている状態です。 なので、scanf関数を使う前に、入力値を格納する変数に 毎回数値-1を設定しておきましょう。 との事です。 >>scanf関数を使う前に、入力値を格納する変数に 毎回数値-1を設定しておきましょう。 何故、-1を設定しなければならないのでしょうか? それと、>>前に入力した値が入っている状態です。 前に入ってるから、何故-1にするのかわかりません。 アドバイスを宜しくお願いします。
別に意味は無い。 それ書いた人がそういうルールに決めただけ。
865 :
デフォルトの名無しさん :2006/11/29(水) 03:13:23
ではー1を入れる事に依り、空白に戻すと言う事でしょうか?
-1が入っていた場合はscanfに失敗していると分かるかもしれません。 前に入力した値がそのままだと失敗したことが分からないかもしれません。
でも-1を事前に入れておくくらいなら、scanf()の戻り値をチェックすべきだがな。 事前に-1を入れる方法だと、入力ミスと-1の入力の区別がつかないジャマイカ。
868 :
デフォルトの名無しさん :2006/11/29(水) 05:15:46
何だかよくわかりませんが、ありがとうございました…
869 :
デフォルトの名無しさん :2006/11/29(水) 05:17:49
すみません、Winnyは何言語でできているのでしょうか? JAVAでしょうか?VISUAL C++でしょうか?
>>869 確か、
初期のバージョンは VC++
途中から BCB(Borland C++ Builder)
バージョンはよくわからん。
途中から使用してるツールは違えど、言語自体はC++言語になるね。
871 :
ぴゅあ :2006/11/29(水) 07:53:41
>>862 恐らく解説の中にあると思いますけど
入力される数は、処理を終了させるための"0"か
正の整数であることを条件にしているでしょう
それより、負の整数は入力されることはないとして
つまり現れることはないもの(例外値)として
scanfで無効な入力があったときに-1(例外値)となるように
予め入れてあるものです
(この例では入力処理(scanfの部分)をきちんと書くことを
目的としているわけではないので簡単に済ませてある)
なので、-2でも-99でもよいわけですが
-1を割り当てようと思う人が比較的多かったりする
というところですね
つまり"-1"という値が重要なのではなく
"例外値"であることが大切なわけです
もし、-1も入力される値であったとすれば
-2(d = -2;)とかにされていたかも知れません
恐らく簡単に済ませてあって
もしdの値が-1であったときそれ以降の処理をスキップさせる
なんて処理も省略されているかも知れませんね
>>866-867 の言われているようなところは
省いている筈ですから(それが示されたコードにも現れているのとscanf自身ではなく何か他の解説が目的であろうということ)
872 :
834 :2006/11/29(水) 11:48:35
>>835 人大杉でレス遅れてすんまそん。
回答有難うございました。
873 :
834 :2006/11/29(水) 11:51:33
836さんも!!
874 :
デフォルトの名無しさん :2006/11/29(水) 12:37:12
ちなみにフォルダの中身を一覧表示させ、 その内容をファイルに書き込む方法はどうするんでしょうか。
>>874 system("ls > a.txt");
Cっていうよりシェルの使い方だなw
>>875 「一覧表示させ、その内容をファイルに書き込む」
だからそれじゃダメだろ。
system("ls"); system("ls > a.txt");
1行目と2行目の一瞬の間にディレクトリ内容が変更される可能性を考慮してない。失格。
system("ls | tee > a.txt");
system("ls > a.txt"); system("cat > a.txt"); 又は system("ls | tee a.txt");
teeなら '>' は必要ないなとマジレスしてみる
フォルダってことはこうジャマイカ? system("dir > a.txt"); system("type a.txt");
>>874 をよく読め。
「ディレクトリ」じゃなくて「フォルダ」だぞ。
表示される内容は微妙に違うぞ。
886 :
デフォルトの名無しさん :2006/11/29(水) 16:23:48
なぜか次の単純なプログラムにエラーがでます。 #include <stdio.h> int main(void) { int i = 10; int k; int m[i] = {1,2,3}; for(k = 0;k < i;k++) printf("%d\n",m[k]); return(0); } 配列mの初期化を”m[i] → m[10]”にするとうまくいきました。 配列の要素の初期化に変数はつかえないのですか?
#ifdefにelse ifはないのでしょうか?
>888 #elif
891 :
874 :2006/11/29(水) 17:29:34
レスくれた方々ありがとうございます。 とても参考になりました!!!
fprintf のファイル名をfor文などを使って数字1から順番に作っていく ことはできないでしょうか? 例えばガウス関数のσ=1の計算を1.datに書いて、 σ=2の計算を2.datに書くようにしたいです。
sprintfでファイル名の文字列を作っていけばよい。
>>892 #include<stdio.h>
int main(void){
char filename[FILENAME_MAX];
FILE *fp;
int i;
for(i=0;i<10;i++){
sprintf(filename, "%03d.dat", i);
fp=fopen(filename, "w");
fprintf(fp, "%d\n", i);
fclose(fp);
}
return 0;
}
はやい返事ありがとうございます! やってみます。
896 :
デフォルトの名無しさん :2006/11/29(水) 18:48:21
質問ですが、ソースファイル A.c B.c D.c があったとして Aを実行するとA→B→Dと実行させていくプログラムと、 Aの実行途中でBに移ってAに戻って来るようプログラムする事は可能でしょうか?
>>896 a.exe b.exe d.exe を実行するって事?
898 :
896 :2006/11/29(水) 19:29:24
>>897 すみませんそうです、
1つにまとめるて書くより複数に分けた方が管理しやすいかと思ったもので
すみません、どなたかおねがいします。 「エラー 'stdio.h'をオープンできない」 ってエラーメッセージがでるんだけど、考えられえる原因を教えてください。 本を買って12ページ目でつまづいてます。
>>900 stdio.hが無い
stdio.hを探すパスの間違い
stdio.hが書き込み専用になっている
etcetc...
まずCの処理系の名前を書くとアドバイスが増える
マニュアル主義のくせに肝心のコンパイラのマニュアルは読まないんだよな。 なぜなんだぜ?
>>901 レスありがとう。
処理系ってのがなんなのかわからないけど、
Borland C++ compiler 5.5.1 っての使ってます。
パスもc:\borland\bcc55\binに通してあるし、
bcc32.cfg とilink32.cfgも作ったんですがエラー出てます。
書き込み専用にはなってませんでした。
なるほどコンパイラのマニュアルは気づきませんでした。 探してみます。
ソース晒せ。 #include "stdio.h" になってるとか予測してみる。
bcc32.cfgとlink32.cfgに書いてるパスが違うんじゃね? つかilink32.cfgじゃなくてlink32.cfgじゃね?
bcc32.cfg.txt だったら泣いちゃうよ俺…
ソースはこんな感じです /* hello, worldを表示するプログラム */ #include <stdio.h> int main(void) { printf("hello, world\n"); return 0; } 拡張子は全て表示されるようにしてるので、あってると思います。
じゃあ bcc32.cfg が間違ってんだな。 ちゃんと bin の中に入ってる?
bcc32.cfg内のパスの表記ミスでした。 お騒がせしました。
912 :
896 :2006/11/29(水) 20:45:45
914 :
896 :2006/11/29(水) 20:59:10
方法も聞きたいところなのですが、まだまだ勉強不足で どう質問したらいいかわからないので 可能かどうかだけ聞ければ後は自分で探してみます。
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa9.html ここのキーボードからリアルタイム入力の項を読んでいたのですが
c = getchar();
while ((dummy = getchar()) != '\n')
;
がリアルタイム入力に対する解決法に思えないし、「バックスペースで訂正して1にしてからリターンを押す」
というのはc = getchar();だけで十分だと思うんですが、昔の環境ではそうでなかったってことでしょうか?
特に今リアルタイム入力関連の情報集めているわけではないのですが、疑問が解けないのでよろしくお願いします
ちんぽ!!!!
>>915 c = getchar();
while ((dummy = getchar()) != '\n')
;
これはただ入力が1行あって最初の一文字目を取得して、
その後は破棄するって意味ですよ。
>>905 それは問題ない。
ヘッダ名が"〜"形式で指定した場合、
見つからなければ<〜>と指定したのと同じようにヘッダを探すことになっている。
919 :
915 :2006/11/29(水) 21:39:59
>>917 あ、メニューを選択する場合に単に数字だけを入力すればいいところを
誤って"1q"のようにタイプミスしてしまい、且つ本当は2を選びたかった場合に
ストリームに残っているqを取り除くための前処理だってことですか?
>>918 >探すことになっている
なっている、はすだが
なっていない処理系も意外に多い。
921 :
デフォルトの名無しさん :2006/11/29(水) 23:49:36
>>871 遅くなりましたが、詳しい解説ありがとうございました。
やっと謎が解けました。
922 :
デフォルトの名無しさん :2006/11/30(木) 01:04:48
夜分遅くにすみません>< 2進数16桁の加減算プログラムをmain関数で作りたいのですがどのようにしたらいいでしょうか?
そのようにしたらいい。
>>922 まずは、自分が何をしたいのか、何が分からないのかを整理し、
それが相手に伝わるような文章を書くことから始めるといい。
>922 キーボードから1と0だけで数字を入力してそれの加減算をしたいのか? 受け取った数字を文字列として扱うとか、intとして受け取って適当に処理するとか やり方はいくつでもあるだろ。
クリンゴン語のフォントをインストールしたのですが、 実際printfとかで表示するにはどうしたらよいのですか?
>>926 その文字コードを普通に出力する
実行環境のフォントがクリンゴンならそう表示されるし
違えば文字化け
928 :
デフォルトの名無しさん :2006/11/30(木) 21:04:22
カラー画像(ppmファイル)を読み込み、任意の1行の画素を取り出したいんですが、 助言よろしくお願いします
がんばりたまえ
>>928 ppmファイルを扱うライブラリで使えるものを探すか、
自分でppmファイルのフォーマットを調べて解析する。
そんなことは当たり前だろ。 何の参考にもなりゃしない。
>>928 を見ると、その当たり前のことすらやっているか怪しそう。
ある程度調べていて、この部分が分からないと具体的に書いたなら
アドバイスのしようもあるんじゃないか。
いやおそらくデコーダそのものを書いてよこせと言ってるに相違ない
>>926 setlocale (LC_ALL , "tlh");
//クリンゴン語のコードはISO 639よって規定
935 :
928 :2006/11/30(木) 21:54:07
例えば、 h_g = h_f; /* 横画素数 */ v_g = v_f; /* 縦画素数 */ for ( v = 0; v < v_g; v ++ ){ for ( h = 0; h < h_g; h ++ ){ for ( c = 0; c < 3; c ++ ){ g[v][h][c] = (f[v-1][h+1][c] + f[v][h+1][c] + f[v+1][h+1][c]+ f[v-1][h][c] + f[v+1][h][c]+ f[v-1][h-1][c] + f[v][h-1][c] + f[v+1][h-1][c]) / 8; } } } てやれば,ぼかし画像が出力されますよね。 しかし、任意の一部分を切りぬいて出力するとなるとお手上げで・・・。 よろしくお願いします。
なんでぼかし画像を例にだしたん?
937 :
928 :2006/11/30(木) 22:04:25
画像を配列になおすって考えがいまいちピンと来てなくて、 不適切だったかもしれません。
>>937 結局何をやろうとしているのかわからない
>>930 にも答えてないし
画像を配列に格納したいのか
配列から1行の画素を取り出したいのか
ESPがないからわからん
あそこにモザイクを
g[v][h][c]=g[v][10][c]; とすれば全部10行と同じなる
丸投げしたいのなら宿題スレへゴー
>>937 自分がやろうとしていることなのに、ピンと来ない?
宿題か?
943 :
928 :2006/11/30(木) 22:28:37
失礼しました<(_ _)>
>>930 今のところ手作業で解析をしております。
>>938 ご指摘の通りです。すいません。
画像を配列に格納した後、配列から一行の画素を取り出したいんです。
>>940 更にいえば複数(i)枚の画像を読み込んだときに,i行目の画素を取り出したいんですが、
for文を使って
g[v][h][c]=g[v][i][c];
とすると、デバッグは問題ないものの、画像が表示されません。
>>941 何とか理解したいんです・・・。
g[v][h][c]=f[v][i][c];
945 :
928 :2006/11/30(木) 22:36:21
>>937 宿題ではありません。
>>944 すいません。間違ってました。
gg[v][h][c]=f[v][i][c];
でやってるんですが、表示されません。。。
何を使って表示してるのかすら分からんのにどうしろと
>>945 123
456
789
という画像データがあったら、どうなってほしいの?
>g[v][h][c]=f[v][i][c];
これだと、i=1のとき
222
555
888
になるけど。
949 :
928 :2006/11/30(木) 22:59:15
>>947 Visual C++ .NET Standard 2003でのWin32コンソールアプリケーションで
コマンドプロンプトを使用しています。
この説明で正しいでしょうか?
>>948 そう言う説明をすれば解かり易いですね・・・。ありがとうございます。
i=1のとき、 i=2のとき
1 2
4 5
7 8
と行った具合に出力したいんです。
>>949 そしたら根本的に配列gのサイズが間違ってるだろ
サイズ的にはg[v_g][c]じゃないの?
で、横方向にはコピーしなくていいのだから
for ( v = 0; v < v_g; v ++ ){
for ( c = 0; c < 3; c ++ ){
g[v][c]=f[v][i][c];
}
}
>>949 聞きたいのは、画像を表示するために何を使っているのか(どうやっているのか)ということ。
コンソールアプリで、各画素のRGB値を数値として文字列表示したいということか?
文字でいいのか?画像ではなく。
952 :
928 :2006/11/30(木) 23:15:59
>>950 確かにそうですね。ありがとうございます。
しかし下のエラーが出てしまいます。初心者ですいません。
error C2440: '=' : 'unsigned char' から 'unsigned char [3]' に変換できません。
>>951 ppm形式の画像を出力して表示したいと言うことです。
ちなみにソフトはACDSee v3.1vです。
>>952 宣言部もちゃんと変えた?
画像の問題じゃなくて配列がまともに扱えないだけじゃないのか
954 :
デフォルトの名無しさん :2006/11/30(木) 23:36:12
>>952 g[v][c]=f[v][i][c];
を
g[v][0][c]=f[v][i][c];
とすればいいじゃない?
とりあえず画像をどうこうしたいなら多次元配列の勉強を先にしたほうがいい。
>error C2440: '=' : 'unsigned char' から 'unsigned char [3]' に変換できません。
これで困っているようなら、多次元配列を扱うのも早すぎる気がする。
956 :
928 :2006/11/30(木) 23:43:14
>>953 その通りです。
>>955 解答ありがとうございます。
地道な努力をしようとしなかった自分が甘ちゃんでした。
勉強して出直してきます。
>勉強して出直してきます。 やっぱ最初から答えが聞きたかっただけじゃねえか
cpadだとファイルの入出力ができないんですか?
>958 できます
2進数で入力した文字を16進数で出力するにはどうやればいいんですか?
16で割ればいい
>960 printf("%x", n);
>>962 二進数文字列だからそれじゃダメ。
printf("%x",strtol(str,NULL,2));
964 :
767 :2006/12/01(金) 20:02:15
少し話題がずれるかもしれないのですが 皆さんはCをどのくらいの期間勉強してるんですか?
965 :
デフォルトの名無しさん :2006/12/01(金) 21:29:21
1〜10までの乱数を10個発生させて表示させる。ただし、1度出た数字は除外する」 という課題を出されたのですが、教科書を見ながら解いても 同じ数字が重複して表示されてしまうプログラムになってしまいどうしていいかわかりません。 どなたか教えていただけませんでしょうか
>>965 同じ数字が重複して表示されることを許してるからじゃないの?
>965 1.チェック用の配列を用意して既に選んだものを選ばないようにする。 2.一つの数字を選ぶたびにその数字を抜き取って配列を詰めなおし、そこから選ぶ
3. 1-10の数字が並んでいる配列を用意し、乱数で(要素同士を入れ替えるなどして)適当に並べ替える。
969 :
デフォルトの名無しさん :2006/12/01(金) 21:54:06
#include<stdio.h> #include<stdlib.h> int main (void) { int i , n; srand((unsigned)time(NULL)); printf(0〜10:\n"); for (i=1; i<=10;i++) printf("%d",rand()); としてみたのですが重複してしまいます
971 :
デフォルトの名無しさん :2006/12/02(土) 00:05:33
C仕事にしようとする場合、数学の知識はどの程度必要でしょうか?
972 :
デフォルトの名無しさん :2006/12/02(土) 00:08:54
いるのは精神力と体力と忍耐力
973 :
ぴゅあ :2006/12/02(土) 00:24:54
>>969 >としてみたのですが重複してしまいます
それが
>ただし、1度出た数字は除外する
で"やりなさい"と言われている部分のことになるのではないですか?
重複してしまうというのはそこをやっていないから…というところは把握できてます?
楽に(&効率良く)片付けるには
>>967-968 の言っている中で3のような手段がいいだろうと思うけど
最初(初歩的?)な段階のロジックを理解させようとしているのだとすれば1のような手段かも知れないと思ったりもするけど…
或いは各々がどんなロジックを考え出すかというようなことを求めているものなんでしょうか
あるロジックの考え方の理解を深めるために出された課題だとするなら
答えを導き出す元になるものがその中には足りないようにも思えるし
その中>{1〜10までの乱数を10個発生させて表示させる。ただし、1度出た数字は除外する。}
その課題が出される前にあった講義の中にそれがあったりはしないんでしょうか
(講義の中で出された課題ということですし
どういう経緯でその課題が出されたかに沿ってないと答えを提出しても通らないと思ったりもするので…)
974 :
デフォルトの名無しさん :2006/12/02(土) 00:28:01
ロジック(・∀・)まで読んだ
答える必要ないよ 2chから個人サイトまでマルチポストしまくり
C言語を作るのにおすすめのフリーソフトはありませんか?
yaccとflex。
yaccとbisonてどこが違うの?
979 :
デフォルトの名無しさん :2006/12/02(土) 00:53:23
>>978 yaccは生で食べれない
bisonは刺身で食べれる
あと仕入れ値がbisonはyaccより1.8倍ぐらい高め
flexのDL場所がみつからないよ
981 :
ぴゅあ :2006/12/02(土) 00:55:42
そろそろ誰か次スレたてようね〜
>>976 日本語なら文法や意味があいまいだったり間違えて書いたりしても
読む側が推測してある程度は理解してもらえるけど、
C言語のコンパイラはそんなことないからな。
頑張れ。
987 :
デフォルトの名無しさん :2006/12/02(土) 06:01:20
これ、もっと効率良い書き方ありませんか? fprintf(output2,"%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",bin[0],bin[1],bin[2], bin[3],bin[4],bin[5],bin[6],bin[7],bin[8], bin[9],bin[10],bin[11],bin[12],bin[13], bin[14]);
>>987 int i;
for (i = 0; i < 15 - 1; i++)
fprintf(output2, "%d\t", bin[i]);
fprintf(output2, "%d\n", bin[i]);
989 :
デフォルトの名無しさん :2006/12/02(土) 06:17:48
ごめん、説明不足だった。
>>988 のは立に数値が保存されてくじゃないですか。
1 2 3 4 みたいに
横に並べて保存したいのです。
FILE *output2;
output2=fopen("1ca_dist.dat","a");
てしたので、シミュレーションする毎にデータに追加されて、
何十回かシミュレーションして各ビンの平均値を出したいのですが。
なにか、うまいこと出来ないかのう?
991 :
デフォルトの名無しさん :2006/12/02(土) 06:44:27
アーー
992 :
デフォルトの名無しさん :2006/12/02(土) 06:46:11
ごめん、そんなんでOKだったとは知らなかった。
>987を書くような人間が>988をそんなんてw
こりゃ将来苦労するタイプだな。人の意見がなかなか耳に入らない奴。 早とちり。
int main(void) { int yorn[10]; int i; for (i = 0; i < 10; i++) { yorn[rand()-1] = 1; } for (i = 0; i < 10; i++) { if (yorn[i] == 1) { printf("%d\t", i); } } } //rand()のところは1-10を生成するようにする
そういや、次スレは?
>995 何がしたいのかわからん
>>998 を悩ませたいんだと思う
1000は譲るよ
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。