1 :
デフォルトの名無しさん :
2005/12/04(日) 20:46:55
IDチェック
printf("乙");
4 :
デフォルトの名無しさん :2005/12/04(日) 20:53:07
75 名前:デフォルトの名無しさん :2005/12/04(日) 20:43:31 cでパターンまっちを実装した拡張ないですか?
976 名前: デフォルトの名無しさん [sage] 投稿日: 2005/12/04(日) 20:47:07 あるよ
6 :
デフォルトの名無しさん :2005/12/04(日) 21:02:04
978 :デフォルトの名無しさん :2005/12/04(日) 20:50:20
>>976 おしえよ
979 :デフォルトの名無しさん :2005/12/04(日) 20:51:12
>>976 おしえてよ
8 :
デフォルトの名無しさん :2005/12/04(日) 21:08:14
cで(正規表現だけじゃなく、ユーザ定義のパターンも含めた) 一般的なパターンまっちを実装した拡張ないですか?
一般的なユーザー定義のパターンマッチを扱うのが正規表現なのだが。
10 :
デフォルトの名無しさん :2005/12/04(日) 21:12:10
A -> aAb みたいなパターンを扱わないとだめなんですが。
え、なんだって?
A -> aAb みたいなパターンを扱わないとだめなんですが。
意味が分からない。
14 :
デフォルトの名無しさん :2005/12/04(日) 21:22:00
ab , aabb, aaabbb, aaaabbbb, aaaaabbbbb, ........ みたいなパターンを扱わないとだめなんですが。
何がしたいのか分からない。
16 :
デフォルトの名無しさん :2005/12/04(日) 21:31:28
正規表現じゃ表せない、パターンを扱う必要があるってことだけ。
興味深いね。どんなパターンだろう。
まさか
>>12 や、
>>14 が正規表現で表せないなんていう、基地外じみたアホ発言はしないでね。
18 :
デフォルトの名無しさん :2005/12/04(日) 21:42:27
画像データのエンコードされたものかなんか?
19 :
デフォルトの名無しさん :2005/12/04(日) 21:45:23
うん。ジャストじゃないけど、そんなもん。
bison/flex でも使えば?
21 :
デフォルトの名無しさん :2005/12/04(日) 21:50:37
う〜ん、パーサーか…
22 :
デフォルトの名無しさん :2005/12/04(日) 22:46:29
標準出力した結果をリダイレクトしてファイルに保存しているのですが, 標準出力した結果とファイルに保存した結果が違います。 何度やっても違う結果が保存されてしまいます。 なぜこのようなことになるのかご存知の方ご教授お願いします。
23 :
デフォルトの名無しさん :2005/12/04(日) 22:50:36
>>22 具体的にどう違うんですか?
ぜんぜん違うとか、行が抜けるとか、文字が化けるとか
>>22 とりあえず、何がどうちがうのか説明してもらわないと、
さっぱりわからん。
・標準出力と標準エラー出力が混じってる ・標準出力に制御文字を出力している ・標準出力がリダイレクトされている場合に出力を変えるプログラムを動かしている
27 :
デフォルトの名無しさん :2005/12/04(日) 22:57:25
大体同じなのですが,10行〜20行の間の数値が違って出力されてしまいます。
28 :
デフォルトの名無しさん :2005/12/04(日) 23:12:12
>>27 その数値はプログラム内部で計算されたものですよね。
計算の入力値はどうなっているんですか?
ファイル?それとも画面入力?それともコンスタント?
29 :
デフォルトの名無しさん :2005/12/04(日) 23:12:37
ゲームプログラムを作成したい場合、ネイティブコードのプログラムを 作成できるC言語を利用するのが最適ですか? つまり、Windowsでゲームを作成したい場合はVC++が良いですか?
何をしたいかによるんじゃないの
31 :
デフォルトの名無しさん :2005/12/04(日) 23:20:41
>>29 >ネイティブコードのプログラムを作成できるC言語
この「ネイティブコード」ってなんでしょうか?
32 :
デフォルトの名無しさん :2005/12/04(日) 23:24:26
突然ですが、セフォマってなんですか?
排他的リソース管理の仕組み
>>29 ゲームによるんじゃね?
PS2のゲーム作りたければ、そもそもWindowsって選択肢が間違ってるし。
セマフォだし
37 :
デフォルトの名無しさん :2005/12/04(日) 23:31:12
>>27 数値はファイル,コンスタントのものが含まれています。
38 :
デフォルトの名無しさん :2005/12/04(日) 23:31:17
どおりでぐぐっても出てこない訳ですか・・・ 様はフラグみたいなもんですか?
>>29 ネイティブコードが有利とか不利とか考える前に生産性が大事だと思うよ。
ぶっちゃけるとDirectXなんかはC/C++だと手続きが多くて結構面倒。
フリーの小物ゲームは結構VBとかC#は多いよ。
パフォーマンスを重視のために労力の増加を苦としないだけの余裕がある
のでなければ、もっと生産性の高い言語から始めるのも手だと思うよ。
>>38 とりあえずはそういう理解でも構わないかと。
今回のCマガ(12月号)を買うと幸せになれるかも。
41 :
デフォルトの名無しさん :2005/12/04(日) 23:34:00
>>32 セフォマじゃなくてセマフォ(semaphore)な。
郵便局や銀行に行くと順番待ちの紙をくれる機械があるだろ。
あの機械と印刷される順番の紙と番号呼び出しのおかげで、来客したお客さんが
混乱することなく次々と窓口によび出されるわけだ。
おおざっぱだが、あれだと思ったらいい。(ほんとに、おおざっぱ。つっこまないで!)
>>40 たまに立ち読みするんですけど、
初心者には敷居が高い気がするんですよね〜・・・
43 :
デフォルトの名無しさん :2005/12/04(日) 23:40:49
セマファってそんなにすごいの?
>>39 そもそも手続き型じゃないからなw
DXUT使えば多少は楽になる。
45 :
デフォルトの名無しさん :2005/12/04(日) 23:50:21
>>28 数値はファイル,コンスタントのものが含まれています。
46 :
デフォルトの名無しさん :2005/12/04(日) 23:54:35
>>45 まとめると、ファイルからデータを読み込んで標準出力に計算結果を出力する
Cでコーディングされたプログラム(pg)がある。
そのプログラムをコマンドラインで
>pg
と起動した場合と、リダイレクトを使って
>pg > text.out
した場合では、計算結果が異なっている。
ということだね?
>>45 うーん、理由が思いつかないなぁ…
出力するファイルも入力に含まれてしまうって事はないよね?
プログラム示してくれるのが一番手っ取り早そうだが
fprintf(stderr,"1"); fprintf(stdout,"23\n");
質問ですが, exitをよく使うんですけど バリバリ使ってもPCにとってヤバくはないですよね? どうもexit=非常口って感じでなんか使うのを躊躇してしまうとです
51 :
デフォルトの名無しさん :2005/12/05(月) 00:47:31
>>46 はい,そうなんです。
二つのファイルをつかっているので,
>pg >text.out
>file1
>file2
というふうにやっています。
どこかおかしいでしょうか?
そりゃ無理だ pgは呼ばれた時点での出力をtext.outに吐いてfile1とfile2の内容は入力にならないよ
53 :
デフォルトの名無しさん :2005/12/05(月) 01:15:29
>>49 コンソールアプリケーションならば問題はないでしょう。
環境(=OS)によっては、異常終了するときの終了方法を推奨・規定しているものがあるので、
そちらを使ったほうが無難です。
1000 名前:991[sage] 投稿日:2005/12/05(月) 01:18:36
>>992 すいません
>>999 は間違えましたorz
1001 名前:1001[] 投稿日:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
mixi から糞壁 kick できねーかな。
こわがりすぎ(^ω^;)
57 :
デフォルトの名無しさん :2005/12/05(月) 11:26:57
01 011101 2211012 62 01 011101 22110193 -19 ↑ ここの3を読み込みたい時は、どうすればいいんですか? どなたか教えてください。
>>57 規則性がわかんね
[空白][-]の一つ前の数字を読みたいのか?
int main(void){ char *a[] = {"01 011101 2211012 62", "01 011101 22110193 -19"}; char c = a[1][17]; printf("%c", c); return 0; }
データ構造も規定されていない状態でまともに答えられない っていうかデータ構造が決まったらプログラムは自然に書ける
構造体で定義したのメンバの値を後から更新する方法についてお聞きしたいのですが struct point{ int x; int y; int dir; }; struct point mark={ 320, 200 }; メンバーへのアクセスはmark.xで可能ですが 初期化以外の方法ではどのように代入できるのでしょうか?
mark.x = num; 実験したらこれでできました^^;
xとy、入力のnでfor(x=1;x<=n;x++)…を使って表を作成して 1 2 3 4 5 6 7 8 9 10 とし、fprintfで表をそのままdataに書き込みたいのですが、どうも上手くいきません。 アドレス一つ一つ読んで書き込むと上書きされてしまうし、改行すると縦に並んでしまうので… どなたか、纏めて一行読み込む方法を教えて下さい…
書き込みたいのか読み込みたいのかどっちだよ。
>>64 多分無茶苦茶簡単なんだろうが説明がうんこだから誰も和漢ね
ある意味無茶苦茶難しい問題だな ( ´,_ゝ`)プッ
>>64 やりたい事を母国語で説明できない=やりたい事を理解していない
と言う事だから、やりたい事を整理する事をお勧めする。
こんなに釣れたw
71 :
login:Penguin :2005/12/05(月) 13:50:34
linuxで、RLIMIT_STACKの上限を変更したいのだが、 どこをいじえればよいですか?
74 :
64 :2005/12/05(月) 15:21:40
うまく説明出来そうにないので前述の質問は自力で何とかします。 ええと、もう一つ引っかかっているところがあって、こちらだけでも教えていただけると嬉しいのですが… fprintfで、書式を直接出力するようなことは出来ないのでしょうか? FILE *fp; fprintf(fp,"書式",)なのですが、例えば「あいうえお」を出力したい際にfprintf(fp,"あいうえお")ではPCがフリーズします。 関数で数字を放り込んで指定してやったり、scanfでキーボ入力経由してやる分にはOKなのですが… こちらが指定する数字以外の文字をフロッピーに出力する方法がわかりません…
過去に事故か何かで左側頭部を怪我したことはありませんか?
76 :
64 :2005/12/05(月) 15:30:47
説明するより張ったほうが早そうです… int file(int x, int y,int n){ FILE *fp; for(y=1;y<=n;y++){ for(x=1;x<=n;x++){ if(masu[x][y] != 0) fprintf(fp," %2d",masu[x][y]); else fprintf(fp," *"); } fprintf(fp,"\n\r"); } return 0; } masuとかは脳内で補完しちゃって下さい… とにかく、" *"と"\n\r"をフロッピーに出力したいだけです…
>>74 単にfopenしていないとかそんなおちでは?
78 :
77 :2005/12/05(月) 15:31:43
図星だなw。
79 :
64 :2005/12/05(月) 15:35:30
/* Open Error Check */
if((fp=fopen("data.dat","w"))==0){
printf("cannot open file \n");
return 1;
}
はその前に入れてあります。
何故か
>>76 の所でPCフリーズするので悩んでます…
>>76 > masuとかは脳内で補完しちゃって下さい…
ヲイヲイ masu はちゃんと領域確保できているのかね?
masu[1][1] 〜 masu[n][n] までアクセスするから 最低でも masu[n+1][n+1] は必要なんだが...
>>81 ファイル開いてないじゃん。
関数内で確保した変数は、呼び出し先では使えないって習わなかった?
>>81 .... やっぱ
>>77 じゃん。
file() 関数内で fopen() やれやー or fp を引数で取れやー
fpってグローバルなん?
>>84 どう見てもローカル変数として宣言してるだろ。
86 :
81 :2005/12/05(月) 16:04:53
わー!動きました! 何とか宿題の提出期限に間に合いそうです。 単純なことで迷惑かけて済みませんでした。有難う御座います〜!
>>84 >>76 を見て省略されているのかな?と思った。
>>81 を見てコピペだと判明した。
ローカル変数宣言だけしていきなり使ってる。 ちょっとびっくらこいた
あるプログラムで printf("100.00%完了 (全部で%d個見つかりました)\n",cnt); としたところ、%dがうまく置き換えられませんでした。 そこで前にある%が原因だと考え色々試してみると、%%とすることでうまく表示させることができました。 エスケープシーケンスというのは本で読んだのですが、%の場合には%%とするのが正しいのでしょうか。 また、%の他に注意する文字があれば教えてください。
>質問する前には最低限検索を。
CreateMainWindow(600,550,"クライアントとサーバーを通信する",hInstance,nCmdShow,(WNDPROC)WindowProc, WS_OVERLAPPEDWINDOW,WS_EX_CONTROLPARENT | WS_EX_WINDOWEDGE,NULL,LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION))); これの最大化、最小化、閉じるボタンはどこを弄るんでしょうか。 弄り方も教えてくださいな。
>GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は専門の別スレッドがあるのでそこへさようなら。
>>89 検索したら見つかりました。ありがとうございました。
93 :
デフォルトの名無しさん :2005/12/05(月) 17:52:51
ヒープ領域とスタックの違いってなんなんですか? ソートプログラムで次のようなスワップの場合めっちゃ遅いんですけど ヒープが遅いのはなぜなんですか? void swap(void *a , void *b , int size) { char *buf = (char*)malloc(size); memcpy(buf,a,size); memcpy(,a,b,size); memcpy(b,buf,size); free(buf); }
>>93 速いコードが示されてないので良く分からんが、
malloc/freeに時間がかかってるんじゃないの?
汚い記述ばっかりですなスンスンスーン(´Д`)(゚Д゚)ハァ
ポインタによる2次元配列はできるのですが、 ポインタによる3次元配列はどのようにすればできるのですか? ネットや図書館や本屋で調べても、解説すら見つけられません。 どなたか教えてください。 具体的なプログラムを掲示してくれると大変助かります。
>>65 C言語とC++言語 のそこかしこで暴れてる。
正直、書き込みにくい。
>>96 ポインタによる二次元配列の配列を作ればいい。
ポインタによる二次元配列の配列・・・理解できませんorz 二次元配列の配列とはどのようにすればいいのですか?
思考停止乙
>>96 > ポインタによる2次元配列
> ポインタによる3次元配列
とは何か?
そもそも、2次元配列は2次元配列で、
3次元配列は3次元配列でしかない。
# つまり、オレ用語を使うなと。
Linux環境でCを組んでいるんですが、1つ質問させてください。 あるプロセス(A)で「hogehoge00.jpg〜hogehoge09.jpg」という画像ファイルを作成しています。 またあるプロセス(B)では、作成された画像を順次読み出して表示しています。 このとき、Aのプロセスにおいて「画像をファイルとして保存している蔡中」の状態で Bからそのファイルを読み込もうとすると、当然おかしなことになってしまいます。 system関数でfileコマンドでも読み出せば、指定したファイルがちゃんとしたJPG画像かどうかを 判別することはできるのですが、システムの仕様上system関数を使うことができません。 「今現在読み込もうとしているJPG画像が、きちんと生成されているか」というのを判別するには 一体どのようにしたらいいのでしょうか。 手ほどきのほど、よろしくお願いします。
>>102 jpgを書き出した後に「最新のファイル名」をどこかに保存。
もしくはjpg書き出し側で
一時ファイルに書き出し→書き出し終了したらhogehoge....jpgにファイル名変更
とするとか。
flock使う。
JPEGのファイルヘッダにJPEGのバイト数があるので それをstat系関数で調べたファイルサイズと比べるとか read系関数の返り値で得られたバイト数と比べるとかすればOKと思う
セマフォ?
>>93 関数呼び出し時に自動で確保され、関数終了時に廃棄されるのがスタック
手動で確保し、関数が終わっても残るのがヒープ
その書き方が遅いのはa/bの操作をするのに対してmalloc/freeのシステムコール呼び出しの
オーバーヘッドが大きすぎるから
特に初期化を行わないスタックがほぼコスト0で取れるのに対し、ヒープは
一旦OSを呼び出す分オーバーヘッドが大きいのが効いている
別にヒープで取ったメモリだから読み書きが遅いわけではない
あらかじめbufを確保しておけばスタックと同等の速度が出ると思われる
C++ templateのコンテナとauto pointerだけが欲しい
デストラクタを自分で呼ぶなら作れなくもないけども。 あんま意味ない?
>>102 104 だとAがファイルオープンして flock 掛ける直前にBがファイル開こうとしたときの処理が面倒
105 もAファイルヘッダを書き終わっているかのチェックが必要なんで面倒
106 はどの画像ファイルに対して所有権を設定するのか約束事を決めるのが面倒
という訳で一見愚直な感もする 103 が一番使いやすかったりする。
あとファイル共有システムに強いとかデバッグしやすいのも好印象。
あくまでも個人的経験ではそうだったということだけど。
>>107 malloc/freeの呼び出しのせいでスタック上でやるより時間がかかっているのは確かだけど
毎回malloc/freeでOSを呼び出してるわけじゃないよ。
>>110 某業界の電文処理は、基本的に>103の前者で実装されていたりする。
書き出し完了番号と読み出し完了番号を書く側と読む側が其々更新する仕掛け。
書き出し完了番号が更新されたら読みに行き、読み出し完了番号を更新したら1シーケンス完了。
この方式の利点は、読み出し側が処理が止まっても後から追っかけで処理できる点。
>112 なんかお墨付きをもらってちょっと安心な気分。 一回しかこのてのプロジェクトに関わったたこと無いもんで 書き込んだ後どんなレスがつくか戦々恐々でした。
テンポラリディレクトリあたりにjpegファイルを書き出して、 ちゃんと完了したときに、rename(2)で置きに行けば良いんじゃないの?
115 :
デフォルトの名無しさん :2005/12/06(火) 06:35:20
for文で 1+2-3+4-5 の答えを表示するにはどんなコードにすればいいんですか?
丸投げ乙
#include <stdio.h> int main(void) { int i; int d[] = {1, +2, -3, +4, -5}; int s = 0; for(i = 0; i < 5; i++){ s += d[i]; printf("%c%d", d[i] >= 0 ? '+' : ' ', d[i]); } printf(" = %d\n", s); return 0; }
118 :
デフォルトの名無しさん :2005/12/06(火) 06:58:14
for文で 1+2-3+4-5+…-98+99-100 の答えを表示するにはどんなコードにすればいいんですか?
#include <stdio.h> int main(void) { int cnt; int num[100]; int ans = 0; for(cnt = 0; cnt < 100; cnt++){ num[cnt] = cnt + 1; if((cnt + 1) == 1){ ans += num[cnt]; printf("%d",num[cnt]); }else if((cnt % 2) != 0){ ans += num[cnt]; printf("+%d",num[cnt]); } else { ans -= num[cnt]; printf("-%d",num[cnt]); } } printf("\n=%d",ans); return 0; } 厨房だから間違えてても知らない
120 :
102 :2005/12/06(火) 07:32:59
>>103-105 ,110
アドバイスdクス
手持ちのリファレンスブックにはflockが載ってなかったので、
いまいち分からなかったが、ちょっと調べてみようと思います。
ヘッダの中身を比べてみるってのも、候補に上がっていたんですが
解析するのがちょっと面d(ry)だったので・・・
とりあえず、
>>103 氏の提案でやってみようとおもう。
スレ汚しスマソ
全角スペースをtabに置き換えてる?
>>118 > 1+2-3+4-5+…-98+99-100
1 + 2 + (-3) + 4 + (-5) + ... + (-98) + 99 + (-100)
どこで, 符合がつくのが奇数から偶数に変わってるんだ?
そもそも, 数列のならびに規則性はあるのか?
BOOL func(int value) { if(value){ ... return TRUE; } else return FALSE; } くだらないことかもしれませんが 例えば上の関数でelseがあるのとないのとでは違いが生じるのでしょうか
大抵のコンパイラが同じコードを吐きそうだが気にするな。 読みやすさでどちらにするか決めればよかろう。
レスありがとうございます。となるとコーディングスタイルの問題でしょうか どちらが一般的、またはよろしいと思われますか?
あぁ、returnだったのか...w
書き出し・読み出し完了番号が更新されている途中で 読まれる場合は防ぐにはどうすればいいんですか?
>>129 日本語勉強汁
>>123 そもそも 1 に負号が付いていない訳で
最初から既に疑問だらけだったんだが
131 :
112 :2005/12/06(火) 12:02:40
>>129 ・読み出し完了番号は読み出し側のアクセスのみなので問題ない。
・書き出し完了番号は更新されるまでは古い番号が読み出されるから問題ない。
#つまり、書き出し完了番号を記録するファイルはfopen(file, "w")で開いてはいけない。
>>131 その書き出し完了番号が複数バイトに渡っていて、
まさに書いている途中に読み出されたらどうするのかと。
# 漏れは、ちゃんとしたプロセス間通信を行った方が良いと思うよ。
system("namae") でアプリケーション呼び出せませんでしたっけ。
>>132 ディスクシステムとドライバがどういうものか勉強した方がいいと思うよ。
#まさかキャラクタデバイスに書く香具師はいまい。
>>133 OSによっても違うけど、パスが通っていれば(或いはなんらかの形で登録されていれば)
namaeというアプリケーションを起動できると思うよ。
#詳細は各OS関連スレか環境依存スレへ。
>>135 返信ありがとうございます。
not foundばかりでるので、たぶんパスが通ってなかったと思います。
「./ファイル名で起動できたので」
>>132 >ちゃんとしたプロセス間通信を行った方が良い
に同意。
ファイルの読み込みポーリングなんて愚行するなら
名前付きパイプなり何なり使えと。
138 :
132 :2005/12/06(火) 14:46:01
>>134 特定の環境スレであれば、
>>132 の様なレスもしないが、
標準Cの範疇では「キャラクタデバイスでない」なんて、
分かるはずもないし想定すべきでもない。
標準Cの範疇で考える以上、「キャラクタデバイス」であるかも、
と言う事もプログラマが考えるべき。
# だから、環境にあったプロセス間通信を(ry
ほほぉ、プロセス間通信は標準Cにあるとでも?
スレ違いということでは?
あまり私を怒らせない方がいい・・・
自己参照構造体「test」のポインタ2つを引数とした関数です。 bの領域を確保した後に、既に領域を持つaと相互にチェインするものです。 ポインタのポインタを定義してスコープ問題を解決しています。(**bのことです。) しかし、チェインを行うために媒介用のポインタcを用意しなくてはならなくなりました。 例・*b->back = a;は構文エラーとなります。 ポインタcを用いることなくこの関数を成立させることは可能なのでしょうか? inline void Chain(struct test *a, struct test **b) { struct test *c = NULL: *b = (struct test *)malloc(sizeof(struct test)); c = *b; if(c == NULL) { printf("メモリの確保に失敗しました。強制終了します。\n"); exit(1); } a->next = c; c->back= a; return; } を聞こうと思ってたけど、もう1個関数作れば解決するじゃないか…orz でもなんで「*b->back = a;」はエラーになるんでしょうね? 「*bは構造体のポインタではない」とエラーが出ています。はて?
(*b)->back = a;
146 :
143 :2005/12/06(火) 18:17:05
>>144 あ、そういや試してなかった…
入門書を一から読み直そう…
>>143 *b->back は、わかりやすく書くと *(b->back)。
おまいが望むものは、
>>144 演算子の優先順位ぐらい頭に叩きこんどけ
とりあえず括弧で囲んでしまう俺はヘタレ
type ** になりそうになると type * を typedef する俺もヘタレ
そういう実装があると紹介しているだけの>112に対して、 見当違いな反論をした>132が>134に揶揄されたのに逆切れしたのか >137の尻馬に乗って>138では言い訳しているわけだ。 で、「標準Cの範疇で」云々と書きながら「環境に合った」云々と矛盾を書いて、 >139に突っ込まれている。 となれば、>142=>145でかつ、>132=>138とも同一人物であると推測可能なわけだね。
相当悔しかったんだなw 面白いやつだ
>>129 ファイル経由のプロセス間通信をする場合は rename を使うのが定石。
Aは別名でファイルでファイル出力した後特定ファイル名にリネーム
Bは特定ファイル名をポーリングして読み込み完了したら別名にリネーム。
読み込み済みの別名ファイルは適当に削除する(常に1つは残しておく)。
Linuxを含む大抵のOSでrenameはアトミックなのでこれでオッケイ。
不具合が発生時には残されたファイル名とタイムスタンプがデバッグの道標になる。
>>132 >>137 ファイルベースは単体テストが簡単なので初心者に勧めるのはあながち間違ってないと思うよ。
154 :
125 :2005/12/06(火) 22:17:00
>>126 BOOL func(int value)
{
if (value) {
procA;
return TRUE;
} else {
procB;
return FALSE;
}
}
BOOL func(int value)
{
if (value) {
procA;
return TRUE;
}
procB;
return FALSE;
}
として、procAとprocBが意味的にも分量的に同じくらいなら前者の方がインデントが同じでバランスが取れる。
procAとprocBが分量的に差が大きいなら、後者の方が意味が掴みやすいだろう。
procAが重くてprocBが殆どないなら私は論理を逆にして重い処理のインデントを減らすけど。
#それはいいけど、BOOT/TRUE/FALSEかぁ……
>>154 自分でstdbool.hを適当に作ってやる。
156 :
125 :2005/12/06(火) 22:31:55
>>155 基本だw
#つーか、最近はC99で書くことが多いから当たり前のようにインクルードしてるよ。
switch 〜caseでcaseには複数の条件は当てはめられますか? 例えば case 2000 || 2001 || 2002: みたいな感じです
>>157 無理
case 2000
case 2001
case 2002
(処理)
break;
と、やるよろし
>>157 ふつうにできるよ。
その書き方じゃ無理だけど。
無理ですか・・ 条件が多いんでifでやっちゃいますね(´・ω・`)スミマセン
あら? case (2000 || 2001 || 2002):で試してきます
orzそうですね
そもそも、caseに条件式は置けないんだけどね
159が出来るとか書いてるでやってみたのですが、そうですか。
case 2000: case 2001: case 2002: /* */ break;
範囲指定の方がすっきりするところは default で if 使うのもありだな。
>>158 はコロンが欠けてるので、
それにアンカー付けると「動かないんですが」とか言われてマンドクセになるかも。
>>166 だな。
mod演算子で6%0とかでは数値が帰ってきてません。 C99とかよくわからないですが使ってる処理系はBCC5.5です。 a%bでb=0はまずいのでしょうか まずいですよね・・
割り算は0で割っちゃいけませんよ。 BCCはよく知らないけど、VCだと例外が投げられます。 不正な処理を行ったため強制終了(ry まあ、例外を捕捉してやればこれだけで落ちることは無いのだけど
コンソールアプリで、ループ中にXボタンを押されても、ループを抜けて終了処理を するようにしたくて試行錯誤して下のような処理を作成しました。 でも、Xボタンを押したらやっぱりすぐに終了してしまいます。 どの辺が悪いでしょうか。そもそも方向違いでしょうか。 while(mbLoopFlag){ if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if(!GetMessage(&msg,NULL,0,0)){ if(msg.message == WM_CLOSE){ mbLoopFlag = false; } } TranslateMessage(&msg); DispatchMessage(&msg); }
ごめん、どっか行ってくる。
175 :
デフォルトの名無しさん :2005/12/07(水) 13:00:56
最小2乗法の1次多項式のプログラムをc言語のプログラムに作るにはどうしたらいいのでしょうか?
C言語でコードを書いてコンパイルすればいいんじゃないかな
system("C:\\ProgramFiles\\フォルダ名\\ファイル名") でアプリ開こうとしても見つかりませんがでます。 どこか間違ってるのでしょうか。
#include <stdio.h> main(){ char *D[10]; char str[6]; int i; for(i=0;i<5;i++){ scanf("%s",str); D[i]=str; } printf("\n*output*\n"); for(i=0;i<5;i++){ printf("%s : ",D[i]); } } このようなプログラムを書いたのですが... 自分のイメージとしては abc def ghi jkl mno と入力すると abc : def : ghi : jkl : mno : という出力なんですけど、実際は mno : mno : mno : mno : mno : といった感じにってしまいます。 ポインタ配列を使う場合はどのように書いたら良いのでしょうか?ご教示お願いします
Dはポインタの配列です D[0]からD[4]までstrのアドレスを指しています。 strの中身は最後に入れたmnoが入っています。 だから、strの中身のmnoが5回表示されます
ポインタだとコピーが簡単だと思ったのかな? 文字列の入れ物はstr[6]ってchar配列が1個あるだけ。ポインタはその入れ物のアドレスを示すだけ。 5つの文字列を保存できるわけないでしょ。 Dをchar配列の配列にするか、mallocで割り当ててやるかのどっちかだね。 配列の配列でいいと思うけど。
#include <stdio.h> main(){ char D[10][6]; int i; for(i=0;i<5;i++){ scanf("%s",D[i]); } printf("\n*output*\n"); for(i=0;i<5;i++){ printf("%s : ",D[i]); } }
>>178 どうも、解決しました。
C言語で、アプリ(集計ソフトなど)の自動化などできますかね。
./ファイル名 で起動させたら勝手に集計するファイルが設定されて集計しだすとか。
#include <stdio.h> char Myfunc(char o); void main(void); char Myfunc(char o) { printf("私たちはMyfunc()のなかにいます。"); printf("引数として%sを受け取りました。\n",o); printf("そのままを戻り値として返します。\n"); return(o); } void main(void) { char o; char moji[12]; printf("文字を入力してください "); scanf("%s",moji); printf("\n"); o=Myfunc(moji[12]); printf("関数から戻ってきました \n"); printf("戻り値は%sです。\n",o); } ↑のやつを実行すると実行画面で「文字を入力してください」とでて 「もじ」と手入力すると「私たちはMyfunc()のなかにいます」という メッセージがでるところまできて終わってしまいます。 一体なにが悪いのでしょうか?
>>184 char *Myfunc(char o[])
#include <stdio.h> static int x, y; int test(int n, int m) { printf("mainからの引数をチェックします\n"); printf("n = %d, m = %d\n", n, m); x = n+1; y = m+1; return x, y; } void main() { int n,m; printf("n ="); scanf("%d", n); printf("\n"); printf("m ="); scanf("%d", m); test(n-1, m-1); printf("testからの戻り値をチェックします\n"); printf("x = %d, y = %d\n", x, y); } 実行したところ、mainからtestへのn, mの値が正しく渡されていないようなのですが、なぜでしょうか?
>>185 > char *Myfunc(char o[])
さらに
o=Myfunc(moji[12]); ---> o=Myfunc(moji);
↑プロトタイプ宣言のことをいっているのでしょうか? ためしにプロトタイプ宣言と関数の名前をchar *Myfunc(char o[])にしたのですが o=Myfunc(moji[12]);のところでエラーがでました。 ちなみに上のソースは↓のソースをいじったものです。なんとかchar *Myfunc(char o[]) の*を使わなくてよい方法はないでしょうか?まだポインタを勉強していないので・・・ #include <stdio.h> int Myfunc(int n); /* プロトタイプ宣言 */ void main(void); /* 整数を受け取りその 1 / 2 の値を返す */ int Myfunc(int n) { printf("私たちはMyfunc( ) の中にいます。\n"); printf("引数として %d を受け取りました。\n", n); printf("その半分を戻り値として返します。。\n"); return (n / 2); /* ここで戻り値をスタックに積んで返る */ } void main(void) { int m, n; printf("整数を入力して下さい "); scanf("%d", &m); printf("\n"); /* 改行 */ n = Myfunc(m); /* 自作関数の呼び出し */ /* n に戻り値が代入される */ printf("関数から戻って来ました。\n"); printf("戻り値は %d です。\n", n); }
>>185 >>187 ありがとうございます。いいえ同一人物ではありません。
アドバイスのとおりやったのですが実行の結果エラーがでました。
(25) : error C2440: '=' : 'char *' から 'char' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
#include <stdio.h>
char *Myfunc(char o[]);
void main(void);
char *Myfunc(char o[])
{
printf("私たちはMyfunc()のなかにいます。");
printf("引数として%sを受け取りました。\n",o);
printf("そのままを戻り値として返します。\n");
return(o);
}
void main(void)
{
char o;
char moji[12];
printf("文字を入力してください ");
scanf("%s",moji);
printf("\n");
o=Myfunc(moji);
printf("関数から戻ってきました \n");
printf("戻り値は%sです。\n",o);
}
>>190 mainの頭のoの宣言をchar *oへ。
あとvoid mainは一般的でないからやめろ。
>>193 185-192は%sを生かす方向で修正させようとしているのにそう言うのは如何なものか。
>>193 自己レス
184に対する解決策であって、その後の展開は違う方向へ進んでるので
>>190 に対して適用しないように。
皆さんありがとう!しかしダメでした。void main(void)をint main(void)に かえるとエラーがでるのでそのままにしてあります。あとvoid main(void)のプロトタイプは 消しました。 #include <stdio.h> char *Myfunc(char o[]); char *Myfunc(char o[]) { printf("私たちはMyfunc()のなかにいます。"); printf("引数として%sを受け取りました。\n",o); printf("そのままを戻り値として返します。\n"); return(o); } void main(void) { char *o; char moji; printf("文字を入力してください "); scanf("%s",moji); printf("\n"); o=Myfunc(moji); printf("関数から戻ってきました \n"); printf("戻り値は%sです。\n",o); } error C2664: 'Myfunc' : 1 番目の引数を 'char' から 'char []' に変換できません。 (新しい機能 ; ヘルプを参照) 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。 どうしてもo=Myfunc(moji);のところでエラーが出てしまいます。
>>196 char moji[12];の宣言は変えなくて良い。
やった!!!!!!できたよ。できました。本当にありがとう。 サンプルソースをいじっただけでこんなに苦戦するとは・・・ ありがとうプログラムの神々よ。
こんなんで神ではさぞかし本物の神は浮かばれないでしょうな。
そういうのを何回か弄っていくうちにポインタとか変数の関係が分かってくるよ。
C言語の最大の汚点は char *hoge="ぬるぽ"; という記述を許可してる事だと思うのですよ
それって規格が許してるんだっけ?
>>202 201のコードは問題ない。
ただし書き換えるのは駄目。
言語仕様
>>203 そんなこと分かってるの。
バカは黙ってて
>>201 char hoge[] = "ガッ";
を許可してる方が変だと思うのですよ。
208 :
デフォルトの名無しさん :2005/12/07(水) 16:32:55
『3×3型の二つの行列A=[aij],B=[bij]を読み込み、 積ABとBAを 求めるプログラムを作成せよ。また一般的にはABとBAが 等しくならない ことを確認せよ。』ですがどなたか教えてくれませんか? CでもPascalでもいいのでお願いします。
マルチに答える人はいません
669 名前: デフォルトの名無しさん 投稿日: 2005/12/07(水) 16:30:23 『3×3型の二つの行列A=[aij],B=[bij]を読み込み、 積ABとBAを 求めるプログラムを作成せよ。また一般的にはABとBAが 等しくならない ことを確認せよ。』ですがどなたか教えてくれませんか? CでもPascalでもいいのでお願いします。 お前みたいな馬鹿な子はいくら勉強しても無駄だよ。 さっさと処理系消して自殺してね
配列のかけ算が出来ない子って事か?
本当に出来なきゃ確かに低脳だけど、 出来るけど他の人がどう書くのか見たくて 質問してるだけなのかもしれないよ?
#define kMin -1.1 #define kMax 1.1; double x, a; /* ここで x と a に 値を入力*/ if( x+a < kMin || x-a < kMin || kMax < x+a || kMax < x-a ) hoge; else foo; このif文をもう少し簡潔に書けないものでしょうか
double a_abs = abs(a); if( x-a_abs < kMin || kMax < x+a_abs ) hoge;
>>214 absは前に試しましたがintしか扱えないみたいで無理でした
自分でdouble MyAbs(double)とかを作ればいけると思いますが
fabs
いや、マクロでいける。 つーか #define ABS(a) ( (a) > 0 ? (a) : -(a) ) これで全数値型対応可能だと思う。
さっきここでアドバイスをもらっていたものなんですが
>>196 のソースの意味がわかりません。なぜchar oではなくchar *oを宣言
したのか。そして関数Myfuncがなぜ*Myfuncでなければならないのでしょうか?
自分なりに調べてみたのですがchar moji[12]は配列である。そして配列はポインタでもある。(←ここがわからない)
だからその配列(ポインタ)を渡すから関数もポインタで宣言しなければならないってことなんでしょうか?
(char *o[])になるのでは?だとしたらchar *Myfunc(char o[])ではなくchar Myfunc(char *o[])になるような気がするのですが・・・
*は何をしているのでしょうか?
>>217 ああそうかマクロ使えばいいのか
ありがとうございます
>>216 fabsなんてものがあったのですか
いや本当に申し訳ありませんでした
>>218 Line13:char[] moji;かchar* moji;
Line15:scanf("%s",&moji);
>>218 ならない。
配列のアドレスは配列の先頭要素のアドレス
MyFuncの帰り値はなにを返してるかって言うと、引数として渡された配列の先頭のアドレスを返してるの。
charを返したら先頭の文字が帰るだけ。
ちょっと悩んでる事があるんで、質問させて下さい。 以下のような、3列のTSVファイルを開いて、それぞれの項目を指定した変数に 格納する部分で、上手くいかないことがあるんです。 ●読み込むTSVファイルの中身 [文字列1]_[文字列2]_[文字列3] /* _はTabです */ (…以下何行も) まぁ、単純に考えてsscanfで終了だろうやっていうことで、 「sscanf(tmp, "%s\t%s\t%s\n", v1, v2, v3);」って書いたんですが、 確かに全ての項目が埋まってる場合、それぞれの変数に格納しています。 けどここに来て、上記TSVファイル内の文字列が存在しない場合も考えないと いけなくなっちゃったんです。具体的には、 (1)[文字列1]__[文字列3] (2)__[文字列3] みたいな一行が、ファイル内にあるっていうことです。 このまま上記で書いたsscanfを使った場合、その中の変数を借りて表現すると、 (1)だとv1には文字列1が、v2に文字列3が入っちゃいます。 きちんと順番通りに、NULLを考慮して、それぞれの変数に値を格納したいんですけど、 何か良いアイディアは無いでしょうか。よろしくお願いします。 PS:パターンを、"%[^\t]\t%[^\t]\t%[^\n]\n"にしても駄目でした。 もうファイルから一行拾ってきた時点で、全ての番地の中身を確認するような ロジックにしないといけないんですかねぇ…。
なんで、なにがなんでもsscanfでやりたがるんだろう・・・
>>225 sscanfの戻り値は正常に引数へ代入されたものの数になります。
だからその例では(1)の行では2が返されます。
これを見てどうにかしたらどうでしょうか。
fgetsで拾ってstrtok
229 :
デフォルトの名無しさん :2005/12/07(水) 21:38:52
while("2ch") {}; こんなプログラム書くとwhileの条件式が評価されるたびに毎回"2ch"がメモリ内に確保されるのですか?
>>229 そうとは限らない。文字列定数の入ってるアドレスを読み出してきて評価するだけ。
>>229 いいえ。
ダブルクォーテーションで括った文字列は静的(プログラム開始時)にメモリ確保される。
whileで評価されるのはその文字列へのポインタ。
232 :
デフォルトの名無しさん :2005/12/07(水) 21:43:52
>>228 strtok()は空フィールド扱えないからダメ
っ[PCRE]
iostreamとSTLだけでCSVパーザ組んだことがあったがソースどこいったかな
#include <stdio.h> typedef struct{ int eigo; int suugaku; int kokugo; } score; int main(void) { score data[]; int cnt = 0; int people = 0; int eigoh,suugakuh,kokugoh; printf("学生の人数->"); scanf("%d",&people); 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 人数を入力し、その分構造体dataの配列を作りたいのですが、どうしてもscore data[]のところで 「'data' のサイズが不明、あるいはゼロ(関数 main )」とエラーが出てしまいます
>>236 Cの配列はコンパイル時に要素数を決めなければならない。
ポインタとmallocなどを使ってどうにかする必要がある。
>>225 > もうファイルから一行拾ってきた時点で、全ての番地の中身を確認するような
> ロジックにしないといけないんですかねぇ…。
質問するより、そうした方が早いと思うよ。
>>237 すみません
ポインタとmallocについて詳しくお願いします
int main(void) { score *data; int cnt = 0; int people = 0; int eigoh,suugakuh,kokugoh; printf("学生の人数->"); scanf("%d", &people); data = malloc(sizeof (score) * people); if (!data) return 1; 以下dataをあたかも配列であるかのように扱える。
242 :
デフォルトの名無しさん :2005/12/07(水) 22:44:59
GString型の文字列をlong型の数値にしたいんだけど、 どうすればよいのか教えて下さい。
>>240 ごめんなさい
>>241 ありがとうございます
なんとか走らせることができました
簡単にできるものだと思っていたのですが結構難しいんですね・・
そろそろ専門の本買おうかな
>そろそろ専門の本買おうかな >そろそろ専門の本買おうかな >そろそろ専門の本買おうかな >そろそろ専門の本買おうかな >そろそろ専門の本買おうかな >そろそろ専門の本買おうかな >そろそろ専門の本買おうかな >そろそろ専門の本買おうかな >そろそろ専門の本買おうかな >そろそろ専門の本買おうかな
>>242 GString型なんて標準Cにはないけど。
246 :
デフォルトの名無しさん :2005/12/07(水) 23:00:10
glibだろ
C言語で、" while wend " のようにwhileの後に条件式を付けなくても、 wendまで進めばwhileに戻れるようなコマンドを教えてくださいませ
>>249 意味がよくわからんが、無限ループが欲しいなら
for(;;) {}
while(1) {}
で。
よくわからんがGOTO文使え
continue でええやん。
254 :
225 :2005/12/08(木) 00:08:18
>226>227>228>233>238 レスありがとうございました。 >238の言うように、一文字ずつ番地を見ていって、 TABが来たかどうかをキーに判別処理をするしかなさそうです。 もうちょっと当方でもがんがってみます。 一応ロジックは構築が済んだので、後はコーディングのみ? 本当に助言ありがとうございました〜。
すみません、uwscを使ってたときは While true KBD(VK_F5,CLICK,150) Sleep(1) KBD(VK_F5,CLICK,150) Sleep(1) KBD(VK_F2,CLICK,150) Sleep(1) KBD(VK_F6,CLICK,150) Sleep(1) Wend こんな感じだったんで、C言語でもできるのかな?と・・・
uwscって何 HSPぐらいならともかく勘弁してください
>>256 あの〜、あなた馬鹿ですか?
頭のいいやつが悪い学校行ったら宝の持ち腐れでしょ?w
uwsc って何だよ そんなマイナー言語をいきなり出されてもワカンネ
ぐぐってみたが、キーロガープログラムのスクリプトらしい ふざけんな
へ〜、みなさんオンラインゲームとか全くしたことないんですか・・・ それはすみませんでした。
>>258 意味不明だから帰ればいいよ
BASICライクな言語とCライクな言語じゃ文法全然違ぇよ。
CとBASICの違いぐらい理解してからきてください。ここはC言語スレです。
>>318 Windowsだと多分大丈夫
BSDやLinuxなら問題ない
ごめスレ間違えた
質問。 vfscanfは標準じゃないんでしょうか? #include <stdio.h> #include <stdarg.h> の二つを入れても参照エラーでコンパイルが止まってしまいます。 ネットでは確かに存在を確認できるんですが。なぜでしょうか? 環境はVC7.1です。
一つ聞きたかったんだけど、どうやったらスレ間違えれるの? すんごい流れが速いところならともかく・・・
>>268 ギコナビだけど複数のスレ参照しながらレスすると間違える
ごめんなさいね
>>268 複数のスレを巡回してるとたまに間違える
>>267 標準ではそのような関数は存在しないらしいぞ
>>267 C99の標準ライブラリだな。
現行のANCI C(番号忘れたからこれで勘弁)の標準ではない。
独自拡張してる処理系もあるようだがな。
>>268 ヒント:Jane
>>267 俺の環境(Debian testing, gcc 4.0.2)だと、stdio.h で extern されてたけど、実際に定義してるヘッダは見つからんかった
274 :
デフォルトの名無しさん :2005/12/08(木) 00:39:33
>>271 &272
レスさんきゅー。
比較的新しい仕様だったのね。
これは困ったな。うーん、まぁいいか。
疑問がとけてよかったです。
ありがとう!!!
>>273 すぐ近くまでやってきてるのに使えないこのもどかしさ。
情報サンキュー
>>272 Janeはご丁寧にスレが違うと警告出るんだけどねぇ。
それでも間違うのはもう、注意不足としか思えん。
しかしvfscanfって生涯使いそうにも無い関数だな
279 :
デフォルトの名無しさん :2005/12/08(木) 04:34:09
入力されてたら0を返す関数が思い出せません while(!_kidhit)0; こんな感じで使われていたと思います _kidhitみたいな感じだったと思います
_kbhit()じゃないかな。無論標準の関数ではないよ。
281 :
デフォルトの名無しさん :2005/12/08(木) 06:21:11
それです。さんくす
キーボードから入力した1行の文字列を読み込むとき、 簡単に書くと char buffer[256]; fgets(buffer, 256, stdin); で実現できますが、 文字数の制限(この場合255文字)があります。 この制限をなくす簡単な方法とかないでしょうか。 リスト構造とか使うにしても一時的に バッファに格納して文字数を数えてmalloc()とかで 確保しないといけないと思うのですが。
>>282 リストでひたすらmallocとgetchを一つずつ繰り返すとか。
仮に、 char a[100][10]; という領域が動的に欲しいときに、 char (*a)[10]; を定義して malloc でまとめて a = malloc(1000); みたいに確保したとします。 このとき、 for(int i = 0; i < 100; i++) free(a[i]); というような解放の仕方をしても問題ないでしょうか?
^^
問 題 だ ら け で す
for(int i = 0; for(int i = 0; for(int i = 0;
>>284 まとめて確保したなら
まとめて解放しましょう。
別々に解放したいなら
別々に確保しましょう。
>>279 どこから餓鬼(kid)なんて単語が出て来るんだよ。
KeyBoardって連想はできなかったんか?
>>282 制限をなくしても、誰かが際限なくメモリ確保と連結を繰り返すことになるわけだ。
本当に制限をなくす必要があるか検討したほうがいい。
>>284 プログラミング初心者は自分で手を動かせ。それが嫌なら初心者スレで聞け。
>>287 今時C99を知らないならレスしなくていいよ。
290 :
デフォルトの名無しさん :2005/12/08(木) 16:56:14
IPAのプログラミングの選択問題にC++が入っていない理由を教えて下さい Cをやってる場合どうやってオブジェクト思考の問題に取り組めば良いですか?
292 :
デフォルトの名無しさん :2005/12/08(木) 20:00:55
継承を考えなければFILE *とfopen〜fcloseのやり方を応用するだけ。
294 :
デフォルトの名無しさん :2005/12/08(木) 20:51:01
10進数→16進数のプログラムなんですが、 scanf("%d",&n); sprintf(Hex,"%x",n); で変数に受けるました。 そこからHexを配列化して1バイトずつ参照したんですが、 1→31 といった具合に数字が狂ってしまいます。 どうすればいいでしょうか?
296 :
デフォルトの名無しさん :2005/12/08(木) 21:35:28
しばらくやって意味が解りました。 ありがとうございました!
質問です。 リストの勉強をしていて新しいノードを作るプログラムで new_node = (node_t *)malloc( sizeof(node_t) ); というプログラムの、* の意味はポインタ演算をしているって事で合ってますか? 違うのならどのような意味なのでしょうか?お願いします。
>>297 まず違う。それは型キャスト
mallocのプロトタイプはvoid *malloc(size_t);だから
あくまで代入先のポインタと方を合わせる必要がある
キャスト
ありがとう
学校で、 「キーボードから西暦の年、月、日の値をy/m/dの形式で入力すると、その次の 日の年、月、日を画面に _年_月_日の次の日は_年_月_日です。 と表示するプログラム」 と言う課題が出たんですが、みなさんならどういうやり方でしますか? 先生は、配列を使えって言ってたんですが、switch文&if文を使う方法しかわからなくて・・・ 配列を使うプログラムって・・・??
同じp->xという式が大量に出てくる場合、 int t = p->x; のように一時変数を用いて、p->xをtに置き換えた方が、アロー演算子を 多用するよりも速度面で有利な気がするんだけど、違うかな?
>>303 コンパイラがマルチスレッド対応かつpが別スレッドから参照可能なら
ローカル変数にキャッシュすることでより最適化される可能性が高い。
実際のところどうなのかは両方のアセンブリ出力を比較して確認する。
>306 どうも。指針になった。
>>306 最近のコンパイラでは最適化付けたら
pがグローバル、かつvolatile指定してない限りは
ほとんどの場合勝手にレジスタ割り当ててくれるくらいの勢いだな
310 :
306 :2005/12/08(木) 23:52:36
>>308 >pがグローバル、かつvolatile指定してない限りは
if (p == グローバル && p != volatile) 勝手にレジスタ割り当て
この条件式っておかしくないか。p == グローバルってとこ。
最適化レベルにもよるけど、どういう条件でレジスタ変数扱いになるかは
コンパイラによって癖があるので速度が重要な場面(でなけりゃどうでもいい)
ではアセンブリ出力させて見ることにしている。
#VC++だと混合モードで一発確認できるのがうれしい。
>>309 横から失礼
そのページ読んでみたんだが、その1と2はメンバ変数であるためにループ中で書き換えられる
可能性があるのでループの度に逐一再読込がいるからだということは分かったんだが
その3って、ポインタが変更されかねないので同じように再読込がいるが
ループ前に一時変数にコピーしてそれを利用することで、始点がループ中
固定されることがコンパイラに分かるから最適化されるってこと?
312 :
学生 :2005/12/09(金) 00:09:16
初めまして。早速ですが、質問させていただきます><。 学校の課題でpgm形式の画像ファイルを入力する関数と出力する関数を作成せよという課題がでました。 ヘッダ部分を読み込むのはできたのですが、それ以降が自分には難しすぎて手におえません。 どなたかアドバイスなどをいただけたらと思うのですが。。。 よろしくお願いします>< ただいま入力関数を作成中で出力は手をつけていません。 お粗末ですが、作成中のプログラムを載せさせていただきます。 ちなみに扱うのはP5形式のファイルで、255階調です。 ヘッダファイル #include <stdio.h> typedef struct picture{ int w; /*横幅*/ int h; /*縦幅*/ int **gs; /*グレイスケール*/ }
>>301 #include<stdio.h>
int main(void){
char ymd[10];
printf("キーボードから西暦の年、月、日の値をy/m/dの形式で入力すると、\n");
gets(ymd);
printf("%c%c%c%c年%c%c月%c%c日の",ymd[0],ymd[1],ymd[2],ymd[3],ymd[5],ymd[6],ymd[8],ymd[9]);
if(ymd[8]="3" || ymd[9]="1"){
ymd[8] = "0";
ymd[9] = "1";
ymd[6]+= 1;
if(ymd[5]="1" || ymd[6]="2"]){
ymd[5] = "0";
ymd[6] = "1";
ymd[3]+= 1;
}
}
else
printf("次の日は%c%c%c%c年%c%c月%c%c日です",ymd[0],ymd[1],ymd[2],ymd[3],ymd[5],ymd[6],ymd[8],ymd[9]+1);
return 0;
}
315 :
学生 :2005/12/09(金) 00:12:32
ソースファイル1 #include <stdio.h> #include <stdlib.h> #include <string.h> #include "pic.h" void read_pic(Pic *p){ FILE *fp; char buf[2000]; int i,j; if((fp = fopen("pic1.pgm","r")) == NULL){ puts("file open error."); exit(0); } fgets(buf,1024,fp); if(strncmp(buf,"P5",2) != 0){ puts("This picture cannot treat."); exit(0); } fgets(buf,2000,fp); sscanf(buf,"%d %d",&p->w,&p->h); fgets(buf,2000,fp); p->gs = (int **)malloc(sizeof(int *)*p->h); for(i=0;i<p->h;i++){ fread(buf,sizeof(int),p->w,fp); *(p->gs + i) = (int *)malloc(sizeof(int)*(p->w+1)); buf[p->w]='\0'; strcpy(*(p->gs+i), buf);/*エラー部分*/ } fclose(fp); }
316 :
学生 :2005/12/09(金) 00:12:54
ソース2 void free_pic(Pic *p){ int i; for(i=0;i<p->h;i++) free(*(p->gs)+i); free(p->gs); } int main(void){ Pic p; read_pic(&p); free_pic(&p); return 0; }
317 :
306 :2005/12/09(金) 00:23:39
>>317 レスd
ちょっと思ったんだが、メンバ変数と局所変数とでアクセス速度に違いってある?
>>311 の解釈にたどり着く前に、最初に思ったのがメンバ変数ってアクセス遅いのか?ってことなんだが
319 :
306 :2005/12/09(金) 00:35:32
>>318 コンパイラレベルでは変数が別スレッドから参照可能かどうかが問題。
オブジェクトがローカル変数だったらメンバ変数もローカルなので遅くならない。
スレ違いなのでこの話はこれまで。
>>319 そうなのか、わざわざすまね
そういやここはCスレだったな・・・スマソ>ALL
すまん、更に横から・・・ではオブジェクトがグローバルだったら
>>309 の最適化は
必要(有効)ということ?最後に教えてちょ
323 :
306 :2005/12/09(金) 00:49:15
>>322 有効である可能性が高い。実際に有効かどうかはアセンブリ出力を比較すること。
いじょっ、しゅーりょー。
サンクス!終了、退散〜
325 :
学生 :2005/12/09(金) 01:03:40
>>321 そのようなスレもあったのですね。
失礼しました。
326 :
デフォルトの名無しさん :2005/12/09(金) 07:19:59
一度しか呼ばれていないstatic関数をinline関数にしないことの意味とは?? 無条件でinline関数にしちゃっていいと思うんだけどどうしてだろ。 後々、複数の場所で呼ばれる可能性を考慮してinlineにしないぐらいしか考えられない俺はヘタレですか?
一度しか呼ばれないのなら、inlineにする必要ないじゃん。
328 :
デフォルトの名無しさん :2005/12/09(金) 07:37:11
>>327 え、だってinline関数にしたら関数呼び出しのコストがなくなるでしょ?
一度だけなのか、一カ所からだけ、なのかどっちだ?
どうせ最適化されるんじゃないの?
一箇所からだけ、として・・・ ・ループの中心部とかでない限り全体の動作速度はほとんど変わらない ・無条件でinlineにするとアセンブラ出力が追いにくい ・同じくデバッガやプロファイラで追いにくい ・宣言位置に条件があったりして保守がちょっと面倒
>>331 >・ループの中心部とかでない限り全体の動作速度はほとんど変わらない
「ループの中心部」? 多重ループの内側と言う意味か? 俺語で語られても。
>・無条件でinlineにするとアセンブラ出力が追いにくい
inline宣言しても無条件でインライン化されませんし、それが理由でアセンブリ出力を追いにくいなら追わなければいいのでは?
>・同じくデバッガやプロファイラで追いにくい
いやだから、それが理由なら追わなければ(以下略
>・宣言位置に条件があったりして保守がちょっと面倒
意味不明。宣言位置に条件はないと思うのですが。
枝葉末節に拘ってコンパイラに任せると言うことを潔しとしないのなら、最適化などせず
のんびり実行させればよいのでは?
>>326 一ヶ所からしか呼ばれなくても、インライン化されることが期待できないような大きさの関数なら
敢えてinline宣言しなくても構わないでしょう。
勿論、宣言しても構わないわけですが。
そもそもデバッグ時に inline にしなけりゃいいじゃんかよ。 inline 関数は別ファイルに分けて、 inline は INLINE マクロに置き換えて、 デバッグ時は .cpp から直接インクルードして INLINE の定義はなしに、 リリース時は .h からインクルードして INLINE は inline に置き換える。 これでおk。 inline 関数にしてたけど、やっぱやめた、とかやる時、 ヘッダいじるとコンパイル範囲が広いから、 デバッグ時は非 inline 化しといた方がいい。 特に、コンパイルがそれなりに遅い環境とか、 沢山インクルードされてるヘッダとかでは。
そもそも、inlineが必要になるほどタイトなコードを書いてるのかと。
inline だと、アドレスが無いからデバッグ時に面倒なことがある。 仕事じゃなけりゃ、好きにしていいけど。
337 :
326 :2005/12/09(金) 10:27:06
いろんな意見を読ませてもらいました。関数呼び出しのコストが気になるぐらい キツイ部分への限定的な使用に留めておくのが一番賢いみたいですね。
338 :
デフォルトの名無しさん :2005/12/09(金) 13:23:21
2次元配列を動的確保したいのですが、 これで使い方あってますか? char (*pArray)[16]; pArray = (char(*)[16])malloc(sizeof(char) * 2 * 16); pArray[0][0] = 1; pArray[1][15] = 2; free(pArray);
>>337 逆に、ゲッタセッタのような1行野郎程度ならインライン展開してくれた方がデバッグが楽だと思うけど。
要は、開発の状況見ながら適当に判断すればいいのでは?
>>338 sizeof(char)は1に決まっているので、書くだけ野暮。
340 :
デフォルトの名無しさん :2005/12/09(金) 13:49:48
アルゴリズム事典からなんですが、、、組み合わせに関してです。 エラーに関するところと思われる部分だけ抜粋します。 #define first(n) ((set) ((1U << (n)) - 1U)) first(N)を呼び出すときに、Nを大きくするとおかしくなります。なぜでしょうか。 コンパイル時に、「left shift count >= width of type」と出ます。 これだけで原因がわからなかったらすいません。プログラム全体をカキコします。
341 :
デフォルトの名無しさん :2005/12/09(金) 13:52:44
ちなみに、ビットのオンオフを用いる、組み合わせ全パターン生成というのは、 それ以外の普通の方法よりもどの程度早いのでしょうか?
>>340 変数の大きさ(bit数)以上のNは扱えないから。
Nの制限が書いてなかったか?
344 :
338 :2005/12/09(金) 13:57:51
>340のようなビット演算は、判っている人には隠蔽するまでもないし、 例えば>340のように判っていない人には使いこなせないし、 あんまりマクロで書いて欲しくないなぁ。
346 :
デフォルトの名無しさん :2005/12/09(金) 14:04:56
>>341 #define N 10
とマクロで定義して、first(N)としか使っていないのですが、、、。
それなりにNを大きくするとダメです。
>>343 すみません、理論上の計算量に関してです。それもよくわからなかったので
実際に動かそうとしたら動かないので、、、。
int size[]={1,5,10,50,100,500},limit,i,s,p,newvalue; int value[coin],item[coin]; printf("釣銭は="); scanf("%d",&limit); for(s=0;s<=limit;s++){ value[s]=0; } for (i=0;i<n;i++){ for(s=size[i];s<=limit;s++){ p=s-size[i]; newvalue = ? if(newvalue<=value[s]){ value[s]=newvalue;item[s]=i; }}} printf("\nコインの枚数 =%3d : ",value[limit]); for(s=limit;s>0;s=s-size[item[s]]) printf("%3d,",size[item[s]]); このプログラムで 釣銭は=652 コインの枚数 = 5 : 500,100, 50, 1, 1 って表示さたいんだけど、?の部分に何を入れればいいかな? いろいろ試したが、コインの枚数が0になる。
348 :
デフォルトの名無しさん :2005/12/09(金) 14:20:40
#define first(n) ((set) ((1U << (n)) - 1U)) の意味だけでいいので教えていただけると助かります。どなたかお願いします。
>>347 宿題は宿題スレへ。そうでないなら初心者スレへでもどうぞ。
>>346 そのコンパイル時のメッセージの通り、unsignedのビット数より大きいnは指定できない。
それと、理論は兎も角その方法と普通の方法で速度の差を知りたいならソースを提示しろ。
誰もがアルゴリズム辞典を持っているわけじゃない。
>>348 そこに書かれているsetの意味は、アルゴリズム辞典を持っていないと判らんのだが。
記憶に間違いがなければunsigned intのtypedefだったはずだが。
で、それを前提として、そのマクロの意味はビット数分の1が立った2進数値を生成している。
つまり、nが1ならば 1 << 1 - 1 = 2 - 1 = 1、nが3ならば 1 << 3 - 1 = 8 - 1 = 7 といった按配。
351 :
デフォルトの名無しさん :2005/12/09(金) 14:29:24
352 :
デフォルトの名無しさん :2005/12/09(金) 14:40:18
>>350 ありがとうございます。少しわかってきました。nCkを求めるために、
マクロのNを勝手に大きくしたのがダメということですよね。
少し自分で考えてみます。しかし、nCkのnとkは、マクロのNとKに対応している
わけではないのでしょうか、、、。
だから、増やすにしても上限っつーものがあるんだって。
>>352 このアルゴリズムではnCkの全パターンを出すためにn個のビット列を使っている。
従って、unsignedのビット数が32ならnの最大値は32になってしまう。
#実際には31である。∵firstマクロでnビットシフトしているため。
「普通の方法」でも、なんらかの形でn個のフラグを用意しなくてはいけないが、
その点以外でもそのアルゴリズムと大差あるわけではない。
ただ、ビット演算を多用することで若干高速化しているだけだ。
355 :
デフォルトの名無しさん :2005/12/09(金) 14:57:14
>>353 このNを、例えば1000とかで実行するプログラムを作ることは可能なのでしょうか?
357 :
デフォルトの名無しさん :2005/12/09(金) 15:38:31
358 :
デフォルトの名無しさん :2005/12/09(金) 16:13:34
C言語は何から作られてるの
優しさ。
客の我侭とSEのプライドとPGの怨念
361 :
デフォルトの名無しさん :2005/12/09(金) 19:44:40
char line[20]; fgets(line,sizeof(line),stdin); で20文字以上入力したら、バッファに残りが残りますよね? それで、バッファを空にしたいのですが、fflashは処理系依存 というので、他に方法ありますか?
scanf("%*s");
363 :
デフォルトの名無しさん :2005/12/09(金) 20:49:37
scanf("%*[^\n]%*c"); これで改行文字が現れるまで読み捨てられるはず。
365 :
デフォルトの名無しさん :2005/12/09(金) 21:13:49
>>364 なるほど、scanfにはそんな機能があったんですね。
やってみたところ、20文字以上入力してみたら、うまくいきましたが、
入力が20文字未満だと入力を求められてしまいます。
これも何とかできないでしょうか?
それはscanfの使用上無理。 fgetsとかfgetcで入力なくなるまで空読みしろ。
367 :
デフォルトの名無しさん :2005/12/09(金) 21:27:19
>>366 やっぱ、だめですか。
配列の要素数を大きくして対処するしかないみたいですね。
ありがとうございました。
よくわからないけど、fgetsで取ってきた文字列に\nが含まれているかで判定できるんじゃないの?
369 :
デフォルトの名無しさん :2005/12/09(金) 22:29:31
>>368 なるほど、盲点でした。
それで、うまくいきました。ありがとうございます。
あと、バッファに'\n'のみが残ったとき、scanf("%*[^\n]%*c"); だと
対応できなかったんで、while(getchar() != '\n') ; にしました。
>>369 ちょっと長くなるが
scanf("%*[^\n]%*c");
scanf("%*c");
これでいいじゃまいか
p1++ = p2++ ; 美しい..... (p1, p2 : pointer)
↑がエラーにならないコンパイラを、俺は知らない。 あ、C++で演算子をオーバーロードすれば大丈夫かな。
373 :
371 :2005/12/10(土) 01:47:03
p1, p2 が配列とかにくっついてるポインタ a[] つまり a とかだったら左辺値が必要とか 言われるけど純粋なポインタだったら言われない. トリッキーだから,賛否両論あるとはおもうけど.
実際に試してから書いてるのか?
可読性の悪いコードを書いて、嬉々としてる奴みると後ろから刺したくなる
error: invalid lvalue in assignment
こういう奴相手なら Kusakabe も頼もしいんだけどな。
>>373 VCTK
cx.c(3) : error C2106: '=' : left operand must be l-value
BCC
エラー E2277 cx.c 3: 左辺値が必要(関数 f )
VC6SP5 C:\Tategoto\VC\Work\TestCon\TestConC.c(8) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
380 :
デフォルトの名無しさん :2005/12/10(土) 07:59:00
おはようございます. デバッグ用に任意の構造体のメンバの内容を出力する関数を 作ろうと思っています. たとえば, struct student{ char id[20]; char name[20]; int gakunen; }; といった構造体があるとき, print_struct(student); とすれば, id : 2 name : Tashiro gakunen : 1 というふうに標準出力に出力する感じです. まず, 引数となる構造体がどのようなメンバ変数をもっているか というところからいきなりつまづいています。。。 そもそもこういった関数はC言語で作るのは無理でしょうか? なにとぞ助言をお願いしますm(_ _)m
381 :
デフォルトの名無しさん :2005/12/10(土) 07:59:36
マクロの内容を""の中に展開するには、どうしたらいいのでしょうか? #define ID_NUMBER 1234 だとします。 そして、 char *idmsg = "ID = 1234"; という文字列もあるとします。 このidmsgの定義でID_NUMBERを使って、1234を一元化したいのですが、どうすればいいでしょうか? char idmsg[0x100] = "ID = "; sprintf(idmsg + strlen(idmsg), "%d", ID_NUMBER); などとすることは簡単ですが、何かえらく愚かしい気がするんですが・・・
char *idmsg = "ID = "ID_NUMBER;
>>381 これでも嫌か?
char idmsg[0x100];
sprintf(idmsg, "ID = %d", ID_NUMBER);
嫌ならこうする方法がある。
#define ID_NUMBER 1234
#define TO_STR2(x) #x
#define TO_STR(x) TO_STR2(x)
char *idmsg = "ID = " TO_STR(ID_NUMBER);
385 :
デフォルトの名無しさん :2005/12/10(土) 08:33:24
#define ELM 20 int i [ELM], k [ELM] ; int *p, *t, c ; p = i ; t = k ; for (c = 0 ; c < ELM ; c++) k [c] = c * 2 ; for (c = 0 ; c < ELM ; c++) *p++ = *t++ ; for (c = 0 ; c < ELM ; c++) printf ("%10d %10d\n", i[c], k[c]) ;
初歩的な質問で申し訳ありません。 なにかのパーセント(ここでは25%)をprintfで表示したいのですが、 どうしても、125%とか0,25になってしまいます。 3桁目を消して表示する方法はあるでしょうか?
388 :
380 :2005/12/10(土) 09:00:08
>>387 初歩的な質問は初心者スレへ。
printf("%d%%", 25);
>>388 無理ではないけど、そういう技巧は手間と可読性の割に得る物が少ない。
C++ならばメンバ関数として実装する習慣をつければ済むだけだが。
391 :
387 :2005/12/10(土) 10:21:53
>>390 お答えありがとうございました。逝って来ます
392 :
デフォルトの名無しさん :2005/12/10(土) 12:25:02
Visual C++ でプログラムを作成すれば、 そのプログラムだけを配布すれば良いのですか? MFC がどうとか聞いたのですが・・・
MFCはCでは無いのだが。
void f(){ if(条件式) 文←ココ } if文の条件式に合致した時に関数fの始めに戻りたいんですが、'ココ'にどういう命令を入れればできますか? f(); って入れると、戻ることは戻るんですがそれだと結果を出力するときに2回してしまうので・・・
do、whileを使えば良いんじゃね?
まぁwhile文とかでループにするのが一番良いけど、 return f(); と言う手もある
>>396 >>397 どうもありがとうございます。
return f(); っていいですねぇ。
この後に100行くらいは続くので、whileを使うとちょっとかさばるかなと思いまして・・・
ちょっ・・おまっ・・・
goto使え。
goto?おいしい?
>>398 再帰と先頭に戻るのは意味が違うよ。
って言うか、100行もある関数書くな、ボケ!
403 :
デフォルトの名無しさん :2005/12/11(日) 11:09:02
>>398 それは、whhleループを入れた事で、かさばる訳ではない。
元々がかさばってるんだ。
かさばらない様に小分けにし、do〜whileなどを使うのが正しい。
404 :
403 :2005/12/11(日) 11:11:01
>>403 ×whhleループ
〇whileループ
orz
int g(){ if(条件式) return 1; // もう一度処理する時 .. return 0; // 普通に終了する時 } void f(){ while(g()){ } } 俺だったら、こんな形にする。
共用体で union U { int i; char c; double d; } u; uの中にどの型が入ってるかどうかってわかる方法あります? 考えたのが、 struct S { enum {INT, CHAR, DOUBLE} type; union U u; } s; って構造体に入れて、typeを調べる方法ですが、他にもっとスッキリした 方法ないでしょうか?
型をシカトするための共有体なのに型情報が必要って時点で設計ミス。 ポインタ経由でのキャスト使って何とか汁。
>ポインタ経由でのキャスト使って何とか汁。 具体的に少しだけ教えてもらえないでしょうか?・・
>>406 共用体は、場合によって一つの領域を複数の型としてアクセスするためのもの。
どの型の値が格納されているかは、プログラマが管理する。
逆に、どんな値が入っていようとも、intとしてアクセス出来れば、
charとしてもアクセス出来るものだ。
intとして、値を代入して、charとして取り出すことも可能だからな。
>>406 Cではそれが一番すっきりした方法だよ。
case (S.type) { INT: ...; break; CHAR: ...; break; DOUBLE; ...; break; } といったパターンマッチぽいこともできるね。
413 :
デフォルトの名無しさん :2005/12/11(日) 13:52:39
qq.h pが1のときには const AA { BB, CC, DD } という構造体を、取得する。 ここで、pが0のときには const AA2 { BB, GG, DD } という構造体を取得したいため、AA2を作るとする。
414 :
デフォルトの名無しさん :2005/12/11(日) 13:53:14
実際のソースでは ww.c AA *EE; if(p==1) { FF = ??? } { FF = *EE } という処理を行うが、 ???のところで CCではなくて新規に GGを取得したい。 しかし、constでAA2を作ると 容量が大きいので、AA の BB,DDをそのまま流用し、 ifの判定の真の場合に CC の部分のみ GG を取得できるようにするには 何かいい方法がないか
>>413 CCとGGの大きさが同じならそこは共用体にしてしまえばよいのではと思う。
416 :
デフォルトの名無しさん :2005/12/11(日) 14:45:35
説明不足で大変申し訳ございません。 pが1のときには const AA { BB, CC, DD } という構造体を、取得する。 ここで、pが0のときには const AA2 { BB, DD } になるため、大きさは同じにはならないんですね。
C++でやれ。
#include <stdio.h> void main(void) { char s[9]={0}; s="00110001"; printf("%s\n",s); } なぜエラーが出るんでしょうか?
s="00110001"; こんなのはサポートされてない strcpy使え
コマンドライン引数って括弧入れちゃ駄目なの?
それはC言語の話ではありません
>>419 そうだったんですね
ありがとうございました
>>420 そうだったんですね
ありがとうございました
>>424 そうだったんですね
ありがとうございました
>>410 っつーかそういう使い方をするためにあるw
427 :
デフォルトの名無しさん :2005/12/11(日) 20:35:00
main() の定義において、 int main (int argc, char *argv[]) といった書き方をすることはよく見るのだけれどもときどき、 int main (int argc, char **argv) といった定義を見ることがある。 前者の argv は各コマンドライン引数文字列の先頭アドレスを ポインタ配列という形で格納しているのはわかるのだけれども、 後者は多重間接参照をおこなうためのポインタ変数として定義されているから これには char 型ポインタ変数そのもののアドレスを保持させるべきであるのに 引数の取り出しでは、 printf (argv[n]) ; /* n : 0, 1, 2, ... */ でなければセグメンテーション違反を起こしてしまう。 これは前者であれば納得がいくけれども、後者の場合こういう書き方をしたら char 型ポインタ変数そのもののアドレスが printf() に渡される ため、コマンドライン文字列を表示することはできないと思うのだけれども どうなのだろう?
関数の仮引数なんだから問題ないんじゃない
429 :
デフォルトの名無しさん :2005/12/11(日) 20:46:36
>>427 とりあえずそのpriftfの引数おかしいけどな
430 :
429 :2005/12/11(日) 20:47:42
と、いう俺のスペルも間違っている件
431 :
429 :2005/12/11(日) 20:52:39
良くわかんないけど *(argv+n) じゃだめなの。 > char **argv は、 > char 型ポインタ変数 じゃなくて、ポインタ型変数へのポインタなんじゃないの? って、なんか論点合ってない?もしや。
型宣言においてコンパイラから見れば下の3つは同じ意味になる。 [1]char **argv [2]char *argv[] [3]char argv[][] いわゆるしんたっくすしゅがーというものだが、 最近の入門書などでは[2]の書き方が好まれるようだ。
[3]はコンパイルできないですけど。
>>432 ちょっと知ってる気分になる前に、
>>1 のリンクを読み直した方が良いと思うよ。
435 :
432 :2005/12/11(日) 21:27:34
…これが通用するのは、 関数定義の引数定義という特殊な状況だけだという点を 読み飛ばす危険が高すぎる…
よくわからん奴が人に教えるなよ
438 :
435 :2005/12/11(日) 21:38:06
いや、ISO/IEC9899 的にはOKなのはわかってる。 リンク先で「伝統的には」とか書かれていたので 言語処理系レベルの話になってくるとよくわからんと書いた。
よくわからん奴が人に教えるなよ
判ってないくせに開き直るなよ。
それしか言えない奴が煽るなよ
gccで通らん〜。 どの規格に準拠させれば通るんだ?gccのバグ?
お前は姉歯かよ
444 :
427 :2005/12/11(日) 21:52:42
おぉ、沢山のご返答ありがとうございます。 憑き物がとれた感があってとてもすっきりした気分。
俺は
>>432 は配列とポインタの違いを全然判ってないこと
>>1 のFAQを読めば配列とポインタの違いが判ること
位しか言えないが。
446 :
デフォルトの名無しさん :2005/12/11(日) 21:55:51
(1+2)*(8/4) を2分木であらわすにはどうしたらよいのでしょうか? スタックを利用したら良いのでしょうか? 初心者ですみません。ヒントをいただけないでしょうか?
という宿題でした、まる。
* + / 1 2 8 4
Linux環境で独習Cを勉強し始めたのですが conio.hがないのでgetcheの代わりになる関数が欲しいのですが 何を使ったら良いでしょうか? ちょうど変わりになるようなのがあったら教えてください。
環境依存スレへいけ
”猫でもわかるプログラミング”の演習で 終了条件を組み込んでいるんですが、 Nをいれても終了しません。 どうか間違いを指摘してください。 何卒宜しくお願いします。 int menu(void) { char isbn[64]; //大きく領域を確保する。 int ret; printf("ISBNを入力してください(Nで終了です。) \n"); scanf("%s",isbn); //文字列はすべて%s printf("入力された番号は、%sです。 \n", isbn); if(isbn!="N") { ret = check_isbn(isbn); syori(ret); return 1; } else { return 0; } }
>>451 文字列は==や!=で比較できない。
仕方がないから<string.h>のstrcmp()を使う。
>>432 関数の引数宣言時の「一番外側の"[]"」は、ポインタ型として解釈される。
が正しい。
これは、Cでは配列を関数の引数として渡せないため。
つまり、コンパイラは以下のように判断する。
type hoge[n] → type *hoge
type hoge[n][n] → type (*hoge)[n]
type hoge[n][n][n] → type (*hoge)[n][n]
(以下略)
# 入門書などで、関数の引数宣言時、配列は一番外側の添え字が省略できる、
# などの記述はここに起因する。
>>432 関数の引数宣言時の「一番外側の"[]"」は、ポインタ型として解釈される。
が正しい。
これは、Cでは配列を関数の引数として渡せないため。
つまり、コンパイラは以下のように判断する。
type hoge[n] → type *hoge
type hoge[n][n] → type (*hoge)[n]
type hoge[n][n][n] → type (*hoge)[n][n]
(以下略)
# 入門書などで、関数の引数宣言時、配列は一番外側の添え字が省略できる、
# などの記述はここに起因する。
みんな。どんなコンパイルつかってる?
>>455 コンパイルは使えないなぁ…。
# コンパイラなら、VC++・BCB・GCC・HEWなど、
# 案件に合わせて使い分けているが。
>>456 そうか。おれは、GCCなんだが、そろそろ、卒業しようと思うんだ。
特に卒業する理由がないのならそのまま使い続けてればいいと思うよ。 なにか思うところがまるのなら話は別だが。
みんなリンカは何使ってる? 俺はGNU LDなんだがそろそろ卒業かなと考えているんだ
おれは Turbo-C なんだがそろそろ卒業かなと考えてるんだ
卒業してCL.EXEに逝くんだろ?
俺はINTEL C CONPIRERなんだけどそろそろ卒業かな(照
二番煎じはツマンネ
IntelC++Compilerといえば、まだVS2005対応版出てないよな?
ごめん、どこで、gccだんろーどできますか?
467 :
427 :2005/12/12(月) 14:58:16
私は大変な勘違いを犯していたようだ。 *argv[] というポインタ配列の先頭を指すポインタへのポインタが argv であるから、 char **argv の宣言は main() が呼び出される際、 コマンドライン引数のポインタ配列の先頭のアドレスを char **argv に 渡すと考えれば、 argv[n] といった書き方は文字列の先頭のアドレスを printf() に渡すことになり、当然の摂理だったんだ。 話をごっちゃにしてしまって本当に申し訳ない。
>>455 どこの?って言われたら広島になるのかなぁ...?
>>451 × scanf("%s",isbn);
○ scanf("%s",&isbn);
じゃないの?
if(isbn!="N") これだろ
472 :
432 :2005/12/12(月) 19:53:10
嘘書いてすまんかった。 いまさらだけど JIS X3010:2003(ISO/IEC9899:1999) に拠れば 5.1.2.2.1 で int main(int argc, char * argv) を明記し、 更に等価な方法として脚注で「argv の型は char ** argv と書くことも出来る」 とあるので [1] と [2] は main 関数の引数型として正しいが [3] はコンパイルエラーになって当然だ #別の言語と混同してた・・・ お詫びして訂正いたします。
自然対数の底Eを求めたいんだけど E=1+1/1!+1/2!+1/3!+…+1/n!+… てのをどう打ったらいいのか わがんない
>>473 Nはお好きに
#include <stdio.h>
#define N 100
int main(void) {
double e = 1, d;
unsigned i;
for (i = d = 1; i < N; ++i) {
d /= i;
e += d;
}
printf("%f", e);
}
それだと 1+1/1+1/2+1/3+1/4+… にならないか?
scanf関数を用い、10個のintの配列の中に数字を入力して、最大値を返すプログラムを作っていて、 誤って文字を入力した場合に「数字を入力してください」と帰ってくるようにしたいのですが、 どのようにすればいいのでしょうか。 現在できているのが以下の状態です。 #include <stdio.h> main() { int i = 0; int no[10]; int max = 0; puts("数字を10回入力してください。\n"); for(i = 0; i < 10; i++){ printf("数字%d:",i + 1); scanf("%d",&no[i]); max = (max > no[i]) ? max : no[i]; } printf("あなたが入力した数字の最大値は%dです。\n",max); getchar(); } おそらく、scanf(〜の次の行からmax〜の行の間に何かが入るのでしょうが…
>>475 d /= i だからあってるよ (d = 1/i にアラズ)
>>476 これじゃ駄目?
#include<stdio.h>
#include<stdlib.h>
int main(void){
int i=0;
int no;
int max=0;
char buff[10];
printf("数字を入力してください\n");
while(i<10){
fgets(buff,10,stdin);
if((no=atoi(buff))!=0){
max=(max>no) ? max:no;
i++;
}
else{
printf("それは数字ではありません。数字を入力してください\n");
}
}
printf("あなたが入力した数字の最大値は%dです。\n",max);
getchar();
}
1192018341872408みたいな大きな数字が 分割されて119201834と1872408になるのは仕様?
strtol使っちゃだめか?
>>479 理由↓
>char buff[10];
atoiもstrtolも文字列→数値の変換が失敗したら0を返すから 文字列"0"から数値0への変換が出来ないね。 これって関数の欠陥?
485 :
480 :2005/12/12(月) 22:49:03
俺の意図は484のとおり。
>>482 0を返すとは決まっていない。
変換に失敗した場合は不定値を返す。
また、strtol()はどこで変換に失敗したかを受け取る事が出来る。
1行にスペースで区切られた13個のデータを持つファイル 39 55 2 444 1.0000 -0.4061E-05 0.1523E-04 0.349E-01 -0.318E-02 0.181E-02 0.999 0.5211 0.510E-03 の3つ目のデータが2の物だけを取り出して新たに出力したいのですがどうすればよいのでしょうか? 以下作ってみたのですがコンパイルすらできません。助言お願いします。 #include<stdio.h> #include<stdlib.h> int main(void) { FILE *fin, *fout; double a,b,c,d,e,f,g,h,i,j,k,l,m; char infile[80], outfile[80]; printf("入力ファイル:"); gets(infile); printf("出力ファイル:"); gets(outfile); if ((fin=fscanf(infile, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n", &a, &b, &c, &d, &e, &f, &g, &h, &i, &j, &k, &l, &m)) == NULL) { printf("ファイルをオープンできません\n"); exit(1); } while (fin != NULL) { if ( b == 2) { fprintf(outfile, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n", a, b, c, d, e, f, g, h, i, j, k, l, m); } } fclose(fin); fclose(fout); return 0; }
>while (fin != NULL) { >if ( b == 2) { >fprintf(outfile, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n", a, b, c, d, e, f, g, h, i, j, k, l, m); >} >} この「ループ部分」でfscanfしていないので、1行目だけしかみていない。
490 :
487 :2005/12/12(月) 23:02:25
>>488 sortコマンドでも良いのですが抜き取った後今度は4つ目と5つ目のデータを
用いて計算すればならないのです。
まずは抜き出しだけでもなんとか出来るようにしないといけないと思いまして...
>>489 ありがとうございます。
ちょっと考えて見ます。
コンパイルすらできてないってみてなかった。 エラー内容は?
>>490 awkとか。perlとか。excelとか。
493 :
487 :2005/12/12(月) 23:14:35
勘違いしてたみたいで、一応コンパイルできてるみたいですがファイル入力の文字がバグってます。 で、ファイル名入力しても変化なしです。 以下エラーメッセージです。 test2.c: 関数 `main' 内: test2.c:15: 警告: 互換性のないポインタ型からの引数 1 個の `fscanf' を渡しますです test2.c:15: 警告: 代入により、キャストなしで整数からポインタを作りました test2.c:21: 警告: 互換性のないポインタ型からの引数 1 個の `fprintf' を渡しますです /tmp/ccyZguRp.o: In function `main': /tmp/ccyZguRp.o(.text+0x2e): the `gets' function is dangerous and should not be used.
>>493 fclose使ってるくせに、fopen使ってないから。
495 :
487 :2005/12/12(月) 23:19:18
>>492 プログラムは最近覚えたCしか使えません。
excelでもよいのですが、ファイルの行数が10万行を超えるので
excelで扱おうと思うと2^16行までしか読み込めないので分割する必要があり
手間がかかるので、できれば一つのプログラムで処理したいのです。
496 :
487 :2005/12/12(月) 23:59:42
ちょっと作り直してみたのですがコンパイルした後inputいれてoutputファイル名入れた後うんともすんともいいません。 どうすればよいでしょうか? #include<stdio.h> #include<stdlib.h> int main(void) { FILE *fin, *fout; double a,b,c,d,e,f,g,h,i,j,k,l,m; char infile[80], outfile[80]; printf("input:"); gets(infile); printf("output:"); gets(outfile); if ((fin=fopen(infile,"r")) == NULL){ printf("Can't open file!\n"); exit(1); } if ((fout=fopen(outfile,"w")) == NULL){ printf("Can't open file!\n"); exit(1); } while (fin != NULL) { if ( b == 2) { fscanf(fin, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n", &a, &b, &c, &d, &e, &f, &g, &h, &i, &j, &k, &l, &m); fprintf(fout, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n", a, b, c, d, e, f, g, h, i, j, k, l, m); } } fclose(fin); fclose(fout); return 0; }
bの値はいつとってきていつ判定するんだっけ?
if ( b == 2) { fscanf(fin, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n", &a, &b, &c, &d, &e, &f, &g, &h, &i, &j, &k, &l, &m); ↓ fscanf(fin, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n", &a, &b, &c, &d, &e, &f, &g, &h, &i, &j, &k, &l, &m); if ( b == 2) { ?
> while (fin != NULL) { どっからコピペしてきたんだよ。
500 :
487 :2005/12/13(火) 00:17:16
すいません。3つ目のデータを判別するのでbではなくcですね。 流れとしては 1行目を読み込み変数cが2ならoutputに書き出しそうでなければ2行目へ 2行目も同様にcが2ならoutputに書き出しそうでなければ3行目へ 以下略... って感じです。
501 :
487 :2005/12/13(火) 00:21:01
>>499 一応新訂c言語入門を参考にしてるんですが....
全然違いますか?ぐぐってきます
awk '$3 == 2 {print;}' < input > output これだけの話かな? Cで苦労するメリットが何にもないな。
503 :
デフォルトの名無しさん :2005/12/13(火) 00:45:52
>>496 >while (fin != NULL) {
>if ( b == 2) {
>fscanf(fin, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n", &a, &b, &c, &d, &e, &f, &g, &h, &i, &j, &k, &l, &m);
>fprintf(fout, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n", a, b, c, d, e, f, g, h, i, j, k, l, m);
>}
>}
while (fscanf(fin, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n", &a, &b, &c, &d, &e, &f, &g, &h, &i, &j, &k, &l, &m) == 13) {
if (b == 2) {
fprintf(fout, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n", a, b, c, d, e, f, g, h, i, j, k, l, m);
}
}
例外は一切考慮していない。
Cに拘る理由がないなら
>>492 >>502 のいうようにawkで十分。
簡単な質問かもしれませんが教えてください。 現在の時間から、指定した秒だけ離れた時刻を得るにはどうしたらいいんでしょう。 ・・・・ちょっと分かりにくいかもしれないので、例を置いておきます。 09:00:00 ← 現在の時刻 指定する秒 = 5 前:08:59:55
・・・わすれてた・・・ 前:08:59:55 後:09:00:05 この二つが得られるような方法です・・・。
>>504 現在の時刻(≠時間)をtime_tで取得後、加算or減算すればよろしかろ。
それをlocaltime()でばらしてstrftime()で文字列に整形すればOK。
509 :
デフォルトの名無しさん :2005/12/13(火) 12:44:23
strcpy(c, "ABC") で、ABCの文字列をAB"Cとダブルクォーテーション入れたい場合 どうしたらいいんでしょうか?
511 :
509 :2005/12/13(火) 12:54:32
Cの中では正規表現使えないのか?
>>512 どこかで提供しているライブラリを使えば可能。
または、自分で処理を実装すれば可能。
514 :
助けてください。。。 :2005/12/13(火) 16:07:52
いきなりすみません↓↓ 提出期限が迫っててすごく困っています。。。。。 void PbmSetPixel(struct Pbm *pbm, int x, int y, int val) { if((x >= pbm->width) || (y >= pbm->height) || (x <= 0) || (y <= 0)); return; pbm->pixel[x + y * pbm->width] = val; } このソースの範囲チェックが不完全とvalのチェックをしていないといわれた のですが、どうしていいのか手も足もでません,......。 どうか助けてください(切実)
宿題は宿題スレへ
516 :
デフォルトの名無しさん :2005/12/13(火) 16:31:47
Pbmこうぞうたいがどんなのかわからん valもわからんけど if (!val) return; とかそんなのでは
とりあえず、x<=0とかy<=0とかじゃない? 仕様知らんけど。
;
if((x >= pbm->width) || (y >= pbm->height) || (x <= 0) || (y <= 0)); <-コノセミコロンハヤバイ
>>514 普通仕様無しでそういう種類の質問をしても答えてくれるワケは無いぞ。
ま、配列の計算式から言って、高々8bppのpixmapにピクセルを設定する
だけの処理だろうけど。
> if((x >= pbm->width) || (y >= pbm->height) || (x <= 0) || (y <= 0));
x<=0とy<=0はx<0, y<0で良い。それと
>>519 の指摘通りコロンは要らない。
valに関しては、 if (val < 0 || val > 0xff) return;
とでもしておけ。
521 :
& ◆yNq1OO4X9g :2005/12/13(火) 17:26:46
違うスレに書き込んだのに丁寧に教えてくださってありがとうございます(>_<) 無事コンパイルできました。
>>380 やり方は処理系依存だが、デバッグ情報を読み出せればなんとかなりそう。
binary2.0に行き損ねてくやしい思いをしつつ見てた資料の中に、libbfdを
使えというお告げがあった。(UNIX or gcc限定?)
ぐぐってみた情報を参考に、適当に構造体を定義して作成した実行ファイルを
objdump -s で覗いてみると (objdumpなんて初めて使ったよ) .debug_info
セクションに何やら定義した構造体のメンバらしきものが。
どうやってデコードすればよいかわからんが、gdbのソースをあされば何か
出てくるんじゃないかな。
Visual C++とかの場合はどーすればいーのかね。
そりゃ、VCでもpdbをどーこーすればいんだけどさ。 おいらは独自のプリプロセッサを使った方が早いと思うよ
巨大ファイルを扱いたいのですが、open()でオプション指定するしか 方法ないですかね? L_LARGEFILE とか、
size_tが充分巨大な処理系使えば。
526 :
デフォルトの名無しさん :2005/12/13(火) 23:20:18
一つの標準入力を二つのプロセスでほぼ同時(完全同時は無理だから) に受ける事は可能でしょうか?すみませんがご教授下さい。 例えば int main(int argc, int *argc[]) { char str[128]; if(fork()){/*プロセス1*/ scanf("%s", str); } else{/*プロセス2*/ scanf("%s", str); } }
デュアルコアでスレッド使えば可能?
マルチスレッド?
529 :
デフォルトの名無しさん :2005/12/13(火) 23:23:25
スレッドでなく、プロセスで実現したいのですが・・・
>>524 fpos_tも大きいほうが良い。
でも別にsize_tもfpos_tも大きくなくとも
毎回の読み書きがsize_tの範囲内で収まれば問題ないはず。
あっ、プロセスはわからね
533 :
デフォルトの名無しさん :2005/12/13(火) 23:48:38
534 :
デフォルトの名無しさん :2005/12/14(水) 00:31:46
ATIドライバーとかATIプログラムってなんですか?パソ起動したときに警告ってでるんですけれど… そしてパソゲーできなひ…
激しくスレ違い
536 :
デフォルトの名無しさん :2005/12/14(水) 00:35:04
↑ATIドライバーがインストールできませんでした。ってみたいなことの警告がでます。
537 :
デフォルトの名無しさん :2005/12/14(水) 00:35:46
すいません。 どこで聞いたらいいですか??
スレ違いだって言ってんだろうが!
>>537 Windows なら Windows 版に逝け
540 :
デフォルトの名無しさん :2005/12/14(水) 00:38:10
すいません。ありがとうございます!
標準入力を複数プロセスでどうやって受け取るつもりなのか質問者も阿呆だけど、 teeがその目的に合うと勘違いする香具師も阿呆だな。
teeを参考に、stdinを分岐して子プロセスに渡せばいいんじゃないの。 stdin->tee->pipeA | stdin ->proc1 -> pipeB|stdin ->proc2
漏れもteeで良いと思う
teeとはteaのドイツ語
平均と偏差を入力して正規分布に乗った 乱数を発生させたいのですがどうすればよいでしょう?
>>547 検索ぐらいしろ。Box-Muller法
てか、こういう質問ってCなのか? アルゴリズムじゃねーの?
550 :
547 :2005/12/14(水) 11:15:14
ありがとうございます! 検索は一応したのですが。助かりました!
551 :
デフォルトの名無しさん :2005/12/14(水) 12:21:05
.NET 2003で、 #define AAAAA #define BBB (defined(AAAAA)) foo(){ : #if defined(AAAAA) aaa(); #endif #if BBB bbb(); #endif : } とした場合、 aaa()はコードになるのに、bbb()はコードになりません。 defind()をdefineするのはNGなのでしょうか?
>>551 #define AAAAA
#define BBB defined(AAAAA)
foo(){
:
#if defined(AAAAA)
aaa();
#endif
#if BBB
bbb();
#endif
:
}
>>551 #ifdefや#ifndefでいいのでは?
555 :
551 :2005/12/14(水) 12:58:43
レスありがとうございます。
>>553 >#define BBB (defined(AAAAA))
のカッコをはずす、ということでしょうか?
試してみましたが変化ありませんでした。。。
>>554 #define HAVE_AAA
#define HAVE_BBB
#define HAVE_CCC
のようなdefineをして、
さらに
#define ENV_XXX(defined(HAVE_AAA) && defined(HAVE_BBB) && defined(HAVE_CCC))
#define ENV_YYY(defined(HAVE_AAA) && !defined(HAVE_BBB) && !defined(HAVE_CCC))
#define ENV_ZZZ(defined(HAVE_AAA) && defined(HAVE_BBB) && !defined(HAVE_CCC))
// XXXはAAA,BBB,CCCを持っている
// YYYはAAAは持っている、BBB,CCCは持っていない
// ZZZはAAA,BBBは持っている、CCCは持っていない
のような定義をし、
# if ENV_XXX
XXXの処理
#endif
# if ENV_YYY
YYYの処理
#endif
# if ENV_ZZZ
ZZZの処理
#endif
のようにしたかったのですが、意図通りにならなかったので
調べてみたところ、
>>551 の問題につきあたったのです。
複数のdefineのand/orを条件にしたいので#ifdef/#ifndefではうまくいきません。
>
>>555 #if defined(HAVE_AAA) && defined(HAVE_BBB) && defined(HAVE_CCC)
#define ENV_XXX
#endif
#if defined(HAVE_AAA) && !defined(HAVE_BBB) && !defined(HAVE_CCC)
#define ENV_YYY
#endif
#if defined(HAVE_AAA) && defined(HAVE_BBB) && !defined(HAVE_CCC)
#define ENV_ZZZ
#endif
>>555 gccでは通るんだけどね。
特に「definedをdefineしてはいけない」って仕様はなかったはずだし…
VCの欠陥かと
558 :
551 :2005/12/14(水) 13:20:21
レスありがとうございます。
>>556 確かにそのように記述すれば意図どおりになります。
ご教示ありがとうございます。
>>557 当方にもgccがあるのでやってみましたところ
(最初から試すべきでしたねorz)
確かにgccでは意図通りになりました。
VC特有の現象(仕様)でしょうか?
>>556 の書き換えで問題は解消できますが、
(その意味ではクローズで結構です)
できれば「VCだと(?)definedをdefineできない」という根拠というか情報源を
ご存知の方がいましたらご教示いただけるとありがたいです。
よろしくおねがいいたします。
>>557 >特に「definedをdefineしてはいけない」って仕様はなかったはずだし…
「この置き換えによって字句 defined が生成される場合,又は
defined 単項演算子のマクロ置き換え前の使用法が,制約の中で
規定した二つの形式のいずれにも一致しない場合,その動作は
未定義とする。」 (JIS X 3010 : 2003 (ISO/IEC 9899 : 1999)
mallocに関してですが、 char *p; p = (char*)malloc(10000); と領域を取ります。 *--p=1; *--p=2; *--p=3; でもセグメンテーション違反は起らず、 *++p=1; *++p=2; *++p=3; でもセグメンテーション違反が起きません。 どうしてでしょうか?・・・ malloc()は確保した領域の先頭アドレスを返すはずですが。。。
>>561 確保した領域外がどうなっているかなど規定されていませんが。
564 :
561 :2005/12/14(水) 16:27:31
なるほど。 じゃあ、どこかの領域が破壊されてることになるね。。 おそろしや、Cはなんでもありだ・・・。
そんなのCじゃなくても動的メモリ割り当てを持ってる言語ならほとんどに該当するわけだが
だが、それがいい
なあに、かえって免疫がつく
>>561 自分で簡単なmalloc/freeを実装してみれ。何故そうなってるかよく理解できるから。
>>568 それは
>>561 にとってチョット辛いのでは・・なぜなら概念を知らないようなので・・。
>>561 Memory Control Blockって考え方知ってる?
割当てた領域毎の先頭に、こんな感じの構造体が付いているんですよ。
typedef struct mcb {
struct mcb *prev;
struct mcb *next;
unsigned size;
uchar buff[1]; // ここが確保した領域の先頭ですよ、[1]の理由は分かりますか?
} MCB;
実際に割当てた領域サイズは、sizeof MCB + (リクエストサイズ) - 1 なんですよ。
(バウンダリ合わせとか抜きにして)
そういや、MFC の CString もそんな感じに確保してるね。 printf とかにそのままつっこめるように。
そりゃCStringだし
>>569 初心者だからって、嘘を教えないように。
javaのやりすぎでとち狂ってしまい文字列と変数の組み合わせ方を忘れてしまいました。 int x = 20; TextOut(hdc,10,10,"abcd"x); みたいな使い方でいいんでしたっけ? コンパイルする環境が今ないもので;
sprintf(buf, "abcd%d", x); TextOut(hdc, 10, 10, buf);
577 :
デフォルトの名無しさん :2005/12/14(水) 21:33:41
Menu SelectMenu(void) { int ch; do{ printf("\n練習を選択してください。\n"); printf("(1)単純ポジション(2)複合ポジション\n"); printf("(3)C言語の単語 (4)英会話 (0)終了:"); scanf("%d",&ch); }while(ch<Term||ch>=InValid); return((Menu)ch); } これなんですが、宣言の構文エラーになってしまいます。ちゃんと全部書き写したんですが・・・
>>577 >>1 > エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
TermとかInValidはグローバル変数なのか? それとも定数か? Menu型もワカンネ
質問です。 バッファのフラッシュって何のことですか?
582 :
577 :2005/12/14(水) 21:39:42
自力で解決しました。小文字と大文字の違いってだけでしたw ごめんなさ〜い!
583 :
デフォルトの名無しさん :2005/12/14(水) 21:40:09
Menu、 Term、InValidの宣言がないんじゃないの?
>>577
584 :
デフォルトの名無しさん :2005/12/14(水) 21:41:56
>>580 バッファの内容を露出(Flush)することです。
まだファイルに書き出されていないで、バッファに残っている内容を
ファイルに書き出すこと。
585 :
577 :2005/12/14(水) 21:43:17
int main(void) { Menu menu; int cn=sizeof(cstr)/sizeof(cstr[0]); int vn=sizeof(vstr)/sizeof(vstr[0]); srand(time(NULL)); printf("■■■■■■■■■■■■■■■■■\n"); printf("■たのしいC−総合タイピング練習■\n"); printf("■■■■■■■■■■■■■■■■■\n"); do{ switch(menu=SelectMenu()){ case KeyPos: pos_training(); break; case KeyPosComp: pos_training2(); break; case Clang: word_training("C言語の単語",cstr,cn); break; case Conversation: word_training("英会話の文書",vstr,vn); break; }
586 :
577 :2005/12/14(水) 21:43:58
}while(menu!=Term); return(0); } エラー E2034 sample82.cpp 293: 'char * *' 型は 'const char * *' 型に変換できない(関数 main() ) エラー E2342 sample82.cpp 293: パラメータ 'str' は const char * * 型として定義されているので char * * は渡せない(関数 main() ) エラー E2034 sample82.cpp 296: 'char * *' 型は 'const char * *' 型に変換できない(関数 main() ) エラー E2342 sample82.cpp 296: パラメータ 'str' は const char * * 型として定義されているので char * * は渡せない(関数 main() ) こうなっちゃいました・・・馬鹿ですいませんが誰か指導してください・・・・
587 :
580 :2005/12/14(水) 21:45:38
588 :
デフォルトの名無しさん :2005/12/14(水) 21:46:09
>>577 270行もあるようには見えないんだが?
590 :
577 :2005/12/14(水) 21:47:55
いや、またエラーが出ちゃいました。300行以上あるコードなんでなんとか実行したいんです・・・
直して欲しいならソースコード全部うpしろ つーか高々300行かよ
c言語の基本を勉強してください。
全部晒せよ エラー出る所以外にも色々アドバイスもらえるかもよ
InValid って何だ? IsValid や Invalid なら分かるが。
>>586 char ** を const char ** の引数には渡せない。
渡せるのは char *const * に対してだが、あまり意味が無い。
一番いいのは const char *const * で、
これに渡せて良さそうなもんだが、
C の const の仕様は不完全で渡せない。
キャストするしかない。
>>595 横からだが、Cの仕様が不完全で非constなダブルポインタから
constなダブルポインタへの暗黙の変換が_って事?
597 :
デフォルトの名無しさん :2005/12/14(水) 22:10:25
func((const char**)str);
const char **p; で保護されるのは、見たままの **p や p[?][?] だ。 しかし、*p や p[?] までは保護されない。危険だ。 char *const *p; で保護されるのは、見たままの *p や p[?] だ。 しかし、**p や p[?][?] までは保護されない。もっと危険だ。 const char *const *p; ではじめて両方保護される。 こんなに const つけないといけないのはマンドクセだが、 そういう仕様なんだからしゃーない。 そして、なおかつこれに渡すにはキャストがいるってのもマンドクセだが、 そういう仕様なんだからしゃーない。 ちなみに C++ だと const char ** へは暗黙にキャストされないが、 const char *const * へは暗黙にキャストされる。
char const **p; とか char * const *p; とか書いたら理解しやすいと思う。 まあ、参照先保護の const ってのはそういうもん。
601 :
487 :2005/12/14(水) 22:47:14
>>502 ,503
レスが遅れてすいません
無事実行できました
本当にありがとうございました。
602 :
577 :2005/12/14(水) 23:23:11
本が間違ってるのに気が付きました。すいませんでした〜
603 :
577 :2005/12/14(水) 23:29:59
#include<time.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #define NO 15 #define KTYPE 16 typedef enum{Term,KeyPos,KeyPosComp,Clang,Conversation,InValid}Menu; char *kstr[]={"12345","67890-^\\", "!\"$%2","&'()=~|", "qwert","yuiop@[", "QWERT","YUIOP`{", "asdfg","hjkl;:]", "ASDFG","HJKL+*}", "zxcvb","nm,./\\", "ZXCVB","NM<>_", };
604 :
577 :2005/12/14(水) 23:32:06
char *cstr[]={ "auto","break","case","char","const","continue", "default","do","double","else","enum","extern", "float","for","goto","if","int","long", "register","return","short","signed","sizeof", "static","struct","switch","typedef","union", "unsigned","void","volatile","while","abort", "abs","acos","asctime","asin","assert", "atan","atan2","atexit","atof","atoi","atol", "bsearch","calloc","ceil","clearerr","clock","cos", "cosh","ctime","difftime","div","exit","exp", "fabs","fclose","feof","ferroer","fflush","fgetc", "fgetpos","fgets","floor","fmod","fopen","fprintf", "fputc","fputs","fread","free","freopen","frexp", "fscanf","fseek","fsetpos","ftell","fwrite","getc", "getchar","getenv","gets","gmtime","isalnum","isalpha", "iscntrl","isdigit","isgraph","islower","isprint","ispunct", "isspace","isupper","isxdigit","labs","ldexp","ldiv", "localeconv", "localtime","log","log10","longjmp", "malloc","memchr","memcmp","memcpy","memmove","memset", "mktime","modf","perror","pow","printf","putc", "putchar","puts","qsort","raise","rand","realloc", "remove","rename","rewind","scanf","setbuf","setjmp", "setlocale","setvbuf","signal","sin","sinh","sprintf", "sqrt","srand","sscanf","strcat","strchr","strcmp", "strcoll","strcpy","strcspn","strerror","strftime","strlen", "strncat","strncmp","strncpy","strpbrk","strrchr","strspn", "strstr","strtod","strtok","strtol","strtoul","strxfrm", "system","tan","tanh","time","tmpfile","tmpnam", "tolower","toupper","ungetc","va_arg","va_end","va_start", "vfprintf","vprintf","vsprintf" };
ちょwwww嫌がらせ?wwww
606 :
577 :2005/12/14(水) 23:34:48
char *vstr[]={ "Hello!","How are you?", "Fine thanks.","I can't complain,thanks.", "How do you do?","Good bye!", "Good morning!","Good afternoon!", "Good evening!","See you later", "Go ahead,Please.","Thank you.", "No,thank you.","May I have your name?", "I'm glad to meet you.","What time is it now?", "It's about seven.","I must go now.", "How much?","Where is the restroom?", "Excuse me.","Excuse us.", "I'm sorry.","I don't know.","Ihavenochangewith me.", "I will be back.","Are you going out?", "I hope I'm not disturbing you.","I'll offer no excuse.", "Shall we dance?", "Will you do me a favor?", "It's very unseasonable.", "You are always welcome.", "Hold still!", "Follow me.", "To be honest with you,", };
607 :
577 :2005/12/14(水) 23:35:18
int go( const char *str) { int i; int len=strlen(str); int mistake=0; for(i=0;i<len;i++){ printf("%s \r",&str[i]); fflush(stdout); while(getch()!=str[i]){ mistake++; } } return(mistake); }
608 :
577 :2005/12/14(水) 23:36:34
void pos_training(void) { int i; int stage; int temp,line; int len; int qno,pno; int tno,mno; clock_t start,end; printf("\n単純ポジショントレーニングを行います\n"); printf("練習するブロックを選択してください。\n"); printf("第一段(1)左%-8s (2)右 %-8s\n",kstr[0],kstr[1]); printf("第二段(3)左%-8s (4)右 %-8s\n",kstr[4],kstr[5]); printf("第三段(5)左%-8s (6)右 %-8s\n",kstr[8],kstr[9]); printf("第四段(7)左%-8s (8)右 %-8s\n",kstr[12],kstr[13]); do{ printf("番号(練習中止は99:"); scanf("%d",&temp); if(temp==99)return; }while(temp<1||temp>8); line =4*((temp-1)/2)+(temp-1)%2; printf("%sの問題を%d回練習します\n",kstr[line],NO); printf("スペースキーで開始します\n"); while(getch()!= ' ') ; tno=mno=0; len=strlen(kstr[line]); start=clock();
609 :
577 :2005/12/14(水) 23:37:38
for(stage=0;stage<NO;stage++){ char str[11]; for(i=0;i<10;i++) str[i]=kstr[line][rand()%len]; str[i]='\0'; mno+=go(str); tno+=strlen(str); } end=clock(); printf("問題:%d文字/ミス:%d回\n",tno,mno); printf("%.lf秒でした。\n",(double)(end-start)/CLOCKS_PER_SEC); } void pos_training2(void) { int i; int stage; int sno; int select[KTYPE]; int temp,line; int len[KTYPE]; int tno,mno; clock_t start,end; char *format="第%d段(%2d)左%-8s(%2d)右%-8s" "(%2d)[左]%-8s(%2d)[右]%-8s\n"; printf("\n複合ポジショントレーニングを行います。\n"); printf("練習するブロックを選択してください。(複数個選べます)\n");
610 :
577 :2005/12/14(水) 23:38:58
for(i=0;i<4;i++){ int k=i*4; printf(format,i+1,k+1,kstr[k], k+2,kstr[k+1], k+3,kstr[k+2],k+4,kstr[k+3]); } sno=0; while(1){ printf("番号(選択終了は50/練習中止は99):"); do{ scanf("%d",&temp); if(temp==99)return; }while((temp<1||temp>KTYPE)&&temp!=50); if(temp==50) break; for(i=0;i<sno;i++) if(temp==select[i]){ printf("\aその段はすでに選ばれています。\n"); break; } if(i==sno) select[sno++]=temp; } if(sno==0) return; printf("以下のブロックの問題を%d回練習します。\n",NO); for(i=0;i<sno;i++) printf("%s",kstr[select[i]-1]);
うpろだ使ってくれ
612 :
577 :2005/12/14(水) 23:39:24
printf("\nスペースキーで開始します。\n"); while(getch()!=' ') ; tno=mno=0; for(i=0;i<sno;i++) len[i]=strlen(kstr[select[i]-1]); start=clock(); for(stage=0;stage<NO;stage++){ char str[11]; for(i=0;i<10;i++){ int q=rand()%sno; str[i]=kstr[select[q]-1][rand()%len[q]]; } str[i]='\0'; mno+=go(str); tno+=strlen(str); } end=clock(); printf("問題:%d文字/ミス:%d回\n",tno,mno); printf("%.lf秒でした。\n",(double)(end-start)/CLOCKS_PER_SEC); }
613 :
577 :2005/12/14(水) 23:40:16
void word_training(const char *mes,const char *str[],int n) { int stage; int qno,pno; int tno,mno; clock_t start,end; printf("\n%sを%d個練習します。\n",mes,NO); printf("スペースキーで開始します。\n"); while(getch()!=' ') ; tno=mno=0; pno=n; start=clock(); for(stage=0;stage<NO;stage++){ do{ qno=rand()%n; }while(qno==pno); mno+=go(str[qno]); tno+=strlen(str[qno]); pno=qno; } end=clock(); printf("問題%d文字/ミス:%d回n",tno,mno); printf("%.lf秒でした。\n",(double)(end-start)/CLOCKS_PER_SEC); } 迷惑かけてすいません!どうしてもエラーを直したいのです・・
614 :
577 :2005/12/14(水) 23:41:14
Menu SelectMenu(void) { int ch; do{ printf("\n練習を選択してください。\n"); printf("(1)単純ポジション(2)複合ポジション\n"); printf("(3)C言語の単語 (4)英会話 (0)終了:"); scanf("%d",&ch); }while(ch<Term||ch>=InValid); return((Menu)ch); } int main(void) { Menu menu; int cn=sizeof(cstr)/sizeof(cstr[0]); int vn=sizeof(vstr)/sizeof(vstr[0]); srand(time(NULL)); printf("■■■■■■■■■■■■■■■■■\n"); printf("■たのしいC−総合タイピング練習■\n"); printf("■■■■■■■■■■■■■■■■■\n");
615 :
577 :2005/12/14(水) 23:42:27
do{ switch(menu=SelectMenu()){ case KeyPos: pos_training(); break; case KeyPosComp: pos_training2(); break; case Clang: word_training("C言語の単語",cstr,cn); break; case Conversation: word_training("英会話の文書",vstr,vn); break; } }while(menu!=Term); return(0); } 以上です!わかる方いたら抱きしめたいです!
何この荒らし
617 :
デフォルトの名無しさん :2005/12/14(水) 23:46:18
>>577 ×char *cstr[]={
○const char *cstr[]={
×char *vstr[]={
○const char *vstr[]={
618 :
577 :2005/12/14(水) 23:49:02
>>617 ありがとうございます!でも3、4の単語と会話のタイピングが選択しても実行されないっすorz
皆様どうもすいませんでした!
オセロ。 うまくひっくり返すのができません。 原因はなんなんでしょうか。 プログラムはx = 4 y = 2 c = 1を入力してひっくり返しをためしています。 下にプログラムを張ります。
> 迷惑かけてすいません!どうしてもエラーを直したいのです・・ お前の脳味噌のエラーを直しに病院逝け
分かりました!今から閉まっている病院のドアを叩きに行きます・・
こういう香具師って、自殺したらしたで、地獄で迷惑掛け捲るんだろうな。
地獄って、お前…
ワラ
627 :
デフォルトの名無しさん :2005/12/15(木) 08:55:07
構造体のコピーはOKで、配列のコピーはNGってなんで? 構造体のコピーって後から加わった仕様なの?
んなこたぁない
>>627 今ひとつ意味がわからないが構造体が=でコピー代入できるのに
配列だと出来ないことを指してるのか?
自演やめれ
631 :
デフォルトの名無しさん :2005/12/15(木) 09:04:43
コピーって代入(=)のことですか? そうなら、K&R初版のころから仕様としてはあった。 だけど、初期のコンパイラはそれを実装していなかったものが多かったようだ。 ANSI C対応のものなら、OK。 配列a[100]のaはCではポインタだから、aをポインタとして代入するならできる? でも配列の中身のコピーはNG
632 :
627 :2005/12/15(木) 09:05:48
自己解決しました。
633 :
627 :2005/12/15(木) 09:10:07
そうです、代入の事です struct ABC{ int array[10]; }; void main(void){ strcut ABC hg1, hg2; int foo1[10], foo2[10]; hg1 = hg2; ←これだと、arrayもコピされる・・・ foo1 = foo2; ←怒られる } が、なんか納得いかないです
634 :
627 :2005/12/15(木) 09:11:38
>>632 だれ?
初期化してないだろ
とかいう突っ込みは無しでお願いします
635 :
デフォルトの名無しさん :2005/12/15(木) 09:21:10
>>634 これは?
int *foo1, foo2[10];
foo1 = foo2;
636 :
627 :2005/12/15(木) 09:22:23
637 :
デフォルトの名無しさん :2005/12/15(木) 09:24:42
>>636 だから、できない!
foo2はポインタなんだよ。配列全部じゃないんだ。
もしやりたければ、memcpyでコピーするだね。
638 :
店長 :2005/12/15(木) 09:49:39
CASLU 分かります?
構造体が代入できるのはCでなくC++で=を演算子オーバーロードしてるからでは。
オーバーロードしなくてもできるなorz
>>633 キモチは解らんでもないが…
// E は任意の型、n および m は1以上の整定数
E (*left)[n];
const E (*right)[m];
として
left = right;
が出来るようにしちゃうと、どっかに問題が起こりそうな…
>>639 Cで飯食ってる人間でも構造体の代入ができることを知らない香具師がいるけどあんたもその口か?
>>633 Cでまともな配列演算がサポートされていることを期待する方が間違い。
関数に渡すこともできないし、範囲のチェックもサポートされていないのだから。
643 :
487 :2005/12/15(木) 11:39:37
おかげさまで取り出しは可能となったのですが、同じデータで 1行目と2行目を読み込んで計算をさせたいのですがfprintfでは1行しか読み込んでくれません。 複数行読み込むにはどうしたらいいのでしょうか? 一応対策としては元のデータの1行目にダミーデータを入れるか削るかして、 別ファイルで保存して元のファイルとそのファイルを読み込んでデータ処理すれば 1行ずれているので結果2行分扱えると考えてはいるのですが。 良い方法があればお願いします。
関数に渡すこともできないし
fscanfなんか使ってるからだよ
>>642 あんたは全て知り尽くしてて、それまでは飯食わなかったのか?そらすげ
647 :
デフォルトの名無しさん :2005/12/15(木) 11:48:00
/* 記憶領域の確保 */ if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) { printf("malloc error\n"); exit(1); } (struct list *) ↑*なに?かける?
>>487 ==
>>643 doubleなのに%lfじゃなくて%fで書式指定してるけど大丈夫なん?
thx
>>487 FILE *fin;
if((fin = fopen("aho.dat", "r")) == NULL){
fprintf(stderr, "Can't open aho.dat\n");
return 0;
}
while(!feof(fin)){
char buf[BUFSIZE];
double data[13];
int i;
for(i = 0; i < 13; i++){
if(!fscanf(fin, "%lf", &data[i])){
fprintf(stderr, "Error: fscanf %d\n", i);
}
}
if(data[2] == 2.0){
for(i = 0; i < 13; i++){
fprintf(stdout, "%8d:%25.17lf\n", i, data[i]);
}
}
}
fclose(fin);
652 :
642 :2005/12/15(木) 12:21:04
>>646 少なくとも、見習いコーダーのうちは飯食ってるとは言わないと思うが。
それじゃまぁ、一応言い直しておくよ。
何年もCプログラミングで生計を立てている(或いはCプログラマーとして仕事をしている)人間でも(以下略
自分ひとりで作ってるのならともかく、チームの一員として働いてれば 構造体の代入くらいは目にすると思うんだがなぁ。
655 :
487 :2005/12/15(木) 12:55:18
>>648 はい。最初それがわからなくて悩んでたんですが
気がついて直しました。
>>653 なんどもいわれているのでちょっと勉強してみます。
>>654 戻り値に構造体持ってくるケースがあるね。
コピーのオーバーヘッド大きくなりすぎるから
結局ポインタで受け渡しする方が多いけど。
657 :
487 :2005/12/15(木) 13:16:58
>>651 すいません。見落としてました。
これで試してみます。ありがとうございます。
658 :
639 :2005/12/15(木) 13:31:11
>>652 >>654 構造体の代入、目にはしてるし使ってはいたが、あらためて
意識したことが無かったってことだよ。
職人肌で技術プライド高いのはわかるが、ひとこと多いな。
即座に調べてミスを訂正してるにも関わらず。
プログラム以前に人格(以下略
あれで当人が言い直したようには見えないしね。 あんたも652と同じくらい性格が曲がっているよ。
>>651 fprintfのdoubleの書式指定は%fだよ
C99からは%lfも指定できるようになったがそれ以前の規格では%lfを指定すると未定義動作を引き起こす
scanf系とprintf系の書式指定は微妙に対応していない
662 :
デフォルトの名無しさん :2005/12/15(木) 14:48:25
char a[10]="ABC"; char *p; p=a ; printf("%c",*p); ↑OK ↓動かん 何で? int a=5; int *p; p=a ; printf("%s",*p);
char配列を渡すとアドレスの最初[0]が渡される 普通のcharを渡しても実数を渡すだけでアドレスは渡されない int a=5; int *p; p=&a ; //&を付けてaのアドレスを渡す printf("%s",*p);
%sを%dにする
char配列のときだけ特別ってわけね thx
666 :
デフォルトの名無しさん :2005/12/15(木) 15:05:36
int a[2]; int *p; a[1]=5; p=a; printf("%d",*(p+1)); ↑OK ↓動かん 何で?二次配列はアウト? int a[2][2]; int *p; a[1][1]=5; p=a; printf("%d",*(p+5));
お前の態度が気に入らない
>>666 後者は配列ではなく配列の配列なのだからpの型が間違っている。
ついでに言えば、printf()での参照の仕方も間違っている。
>>666 どういう結果を期待してるのか書いてもらわんとわからん
a 番地 物 a[0][0] 1000 0 a[0][1] 1001 0 a[0][2] 1002 0 a[1][0] 1003 0 a[1][1] 1004 1 a[1][2] 1005 0 p=aで a[0][0]のアドレス受け取って printf("%d",*(p+4)); で動くと思った。 ↑5ミスった >668 pの型も二次元にすんの?でも無理だった >669 5
#include <stdio.h> void main() { float s; float t; printf("身長(cm):"); scanf("%f", &s); printf("体重(g):"); scanf("%f", &t); } これを実行すると身長を入力した後に何故かDebug Errorが出ます どうして?ちなみにコンパイラはVC++
>>668 *(p[5])
なんかこんなかんじのにするとかきいたことあるようなないような
>>670 a[2][2]で番地が6個もあるのはおかしい
>>670 a 番地 物
a[0][0] 1000 0
a[0][1] 1001 0
a[1][0] 1002 0
a[1][1] 1003 1
>>671 初心者スレへどうぞ。
その際はエラーメッセージの内容もお書きください。
あ〜 本とだ、2が余分だ
>>670 要素数=2 なんだから、範囲はa[0][0]〜a[1][1]。
p = (int*)a;
とするか、
int (*p)[2];
>>671 >void main()
何だコレは。
つかオマイラ、人に訊くレベルにも達してない。
真横にゴキブリが歩いてる ノロノロと動きが俊敏ZYない・・・・ しかもこっちに着てるし・・・・ こっから #include <stdio.h> int main(void) { int a[2][2]; int *p; a[1][1]=5; p=a; printf("%d",*(p[3])); return 0; } エラー E2034 D:\c\works\test\008.cpp 14: 'int ( *)[2]' 型は 'int *' 型に変換できない(関数 main() ) エラー E2062 D:\c\works\test\008.cpp 15: 無効な間接参照(関数 main() )
ゴキブリ捕まえた
684 :
デフォルトの名無しさん :2005/12/15(木) 15:53:27
>>675 どこにあるの?
>>677 void main()はたいした問題じゃねえだろ
うちなんかmainもvoid main(void); ってプロトタイプ宣言させられるぞ
>>682 それだったら違うコンパイルエラーが出るでしょ
とにかくコンパイルは通るのです
とりあえずコピペしてやってみてよ、VC++だけど
何故か実行時にエラーが出るから
>677 できたわ thx
>684 普通に出来たよ bcc
これで、ゴキブリ二匹目だ 鬱
>>684 bcc普通に通って実行出来ますよ。
VC++6.0普通に通って実行出来ますよ。
再起動 再構築などすれば?
690 :
デフォルトの名無しさん :2005/12/15(木) 16:05:41
16進数から2進数に変換するプログラム をお願いします。 お忙しい中、恐縮です。
692 :
684 :2005/12/15(木) 16:07:33
身長(cm):って出た後に入力してみた?
二個同時に入力してるの? 一個入れてエンター 一個入れてエンターだぞ
695 :
684 :2005/12/15(木) 16:10:49
俺に聞いてるの?もちろんそうやってるさ
>>684 もう一度聞くが、全角文字で身長を入力してるんじゃないのか?
その名前欄からして
699 :
684 :2005/12/15(木) 16:13:46
そこまで初心者じゃないよ
あきらめて HSPに帰れ
701 :
684 :2005/12/15(木) 16:14:47
>>684 原因を指摘して解決方法も指摘できるのだがすれ違いにつき割愛。
それはあくまでも開発環境の問題だ。
703 :
684 :2005/12/15(木) 16:17:38
706 :
デフォルトの名無しさん :2005/12/15(木) 17:00:33
シェルソートので間隔を h=3h+1にしたら 高速になる理由を教えていただけませんか?
過去の恥ずかしいレス消したい気持ちは分かるが 自演やめれって
>>690 宿題スレでかなり真面目に答えたんだが。
>>706 なんでかは知らないが昔の人がいろいろ試してみたらそうなったんだよ。
計算式違ったw
713 :
デフォルトの名無しさん :2005/12/15(木) 22:50:49
画像を読み込んで表示するプログラムを教えてください。超素人です。 お願いします。
[1] 授業単元:生産工学 [2] 問題文(含コード&リンク): 次の4点 (0,0),(1,0),(1,1),(0,1) を順に通る3次のSPLINE曲線とそのグラフを描くプログラムを作成せよ。 始点と終点の接線の方向はそれぞれ(1,1)と(-1,0)とする。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラは何でもいいっていわれました [3.3] 言語: C [4] 期限: 2005年12月10日まで [5] その他の制限: プログラムリストとそれによってできたグラフを印刷して提出といわれますた。 グラフのソフト等も特に制限はないそうです。 よろしくお願いします!!!!!!!!!!!!!!!
>>713 C言語標準の内容でその機能を実現することは不可能です。
表示したい環境を特定した上で、その環境のスレッドへ移動
してください。
719 :
デフォルトの名無しさん :2005/12/15(木) 23:06:03
>>716 さん
すみません、素人中の素人なので。詳しく教えていただけませんか?
>>719 Windowsなら「Win32APIのみ」、「MFCを使ってもよい」、「特定の外部
ライブラリを使ってもよい」など、
Unixなら…Macなら…
と環境によってやり方がバラバラで統一した方法がないということです。
いずれにせよ、ここはスレ違いです。
722 :
デフォルトの名無しさん :2005/12/15(木) 23:11:41
>>713 マジレスするとMicrosoft Photo Editor
WINAPIを使えるようになったらいいんじゃないか?
スレ違いなのに答えるから、次から次へとスレ違いの質問がやってくる。
ハーバート・シルトのSTL標準講座という本でSTLの勉強をしていたのですが どうしてもわからないものにぶち当たってしましたました。 下記のソースのなかで p = find_if(v.begin(), v.end(), iscomma); とありますがこの中のiscommaが何も実引数を持たずに呼び出されています。 これってどういうことなのでしょうか? もしお時間のある方いらっしゃいましたらご教授お願いいたします。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ // find()とfind_if()の用例 #include <iostream> #include <vector> #include <algorithm> #include <cstring> using namespace std; // chがカンマならtrueを返す bool iscomma(char ch) { if(ch==',') return true; return false; } int main() { vector<char> v; vector<char>::iterator p; char str[] = "One, Two, Three"; int i; for(i=0; i<strlen(str); i++) v.push_back(str[i]); p = find_if(v.begin(), v.end(), iscomma); cout << "After find first comma: "; while(p != v.end()) cout << *p++; cout << endl; return 0; }
727 :
726 :2005/12/15(木) 23:20:25
あ・・・スレ間違えました・・・ごめんなさい。
最近スレ違いを素でやる連中が多いのか、それともただの嵐か・・・
729 :
726 :2005/12/15(木) 23:23:11
素で間違えました。 本当にごめんなさい。
>>728 加えて、自分で考えたり調べようともしないヤシが増えたこと、増えたこと…。
Winsockのプログラミングについてお伺いしたいことがあります いま簡単な複数の接続を受け入れるEchoサーバーを作成しています そこでWSAAsyncSelect()へListenSocketを渡し FD_READイベントを待機します しかしイベントが発生した際に送信元が誰なのか(誰に返送すればイイのか?) を特定する方法に悩んでいます。 何か良い方法は無いでしょうか? ※ListenSocketとはサーバーサイドのソケットです
>>731 lesten 用のソケットでは通信出来ないよ。
って言うか激しくスレ違い。
734 :
731 :2005/12/16(金) 04:20:42
もともと純Cで作ってたので間違えました・・・ スレ汚しごめんなさい。
735 :
デフォルトの名無しさん :2005/12/16(金) 08:18:44
736 :
ももの :2005/12/16(金) 09:08:59
初めまして、C言語の宿題に困っています。 教えていただけますか?? // 問題: 数人分の学生成績データ・レコードを格納したファイル(名前をstu-seiseki)がある。 各レコードの長さは次のとおりである。 学生番号 7byte 氏名 20byte 英語・数学・国語 3byte 学生番号は0番からの通し番号であり、 各レコードは学生番号の順に並んでいるものとする。 このデータを使って学生の成績に関する問い合わせを行うプログラムretrieve.cを作りたい。 このプログラムは、キーボードから学生の番号を入力し該当する学生のレコードを検索、 学生番号等の各項目のほかに、合計点と平均点を並べて表示するものとする。 プログラム終了には、^bを押すものとする。 【データの例】 0000000 山田 太郎 030050060 0000001 鈴木 花子 080075030 【実行例】 学生番号入力→1 学番 氏名 英語 数学 国語 総点 平均点 1 鈴木花子 80 75 30 185 61.7 // っという問題です。 バイナリモードアクセスがいまいち理解できなく非常に困っています。 どうかよろしくお願いします。
>>736 テンプレも読まないで、スレ違いの質問をする人が多くて非常に困っています。
どうかよろしくお願いします。
738 :
キングボンビー :2005/12/16(金) 10:10:56
二次方程式ax^2+bx+c をとくプログラムを作成せよ。 ただしa b cはそれぞれ任意の定数とする(なるべくは整数で) a=0 とa=0でない場合に分ける。またa=b=0の場合は解なしと表示する a=0でない場合は判別式Dを用いて実数解、虚数解、二重解にわけて解の公式を用いて 解を表示する ↑というプログラムを作りたいのですがC言語がまったくわかりません。 誰か作ってくれませんか??
>>730 あれだろ。
プログラムに興味も無いのに必修でC言語とかあるから...
もちろん周りも類友なんだろ。
で、内輪で解決できなくて...
そんで2chのスレ検索『C言語』でしてここに来る。
誰も最初に『宿題』でスレ検索しようなんて考えるわけないからな。w
>>738 じゃ、とりあえずC言語の本読むとこから初めてみようか?
むしろ宿題スレに次スレタイトルにC言語を入れてくれる様に頼めば良いんジャマイカ?
タイトルに宿題禁止っていれる? しかしここ数十レス、スレ違いの質問しかねぇな…。
むしろタイトルからC言語を外して、C/C++にしたら厨の検索にかからなくなるのでわ?
あ、++はいらんか?
とても残念なことにここは厨な俺の巡回スレ
747 :
デフォルトの名無しさん :2005/12/16(金) 11:29:42
VC++超初心者のホームページ見れない・・・ なんかあったの?
>>747 二重三重にスレ違い。勝手にそのサイトの管理者に聞いてくれ。
>>736 >>738 小学生か?
何が楽しいのか知らんが
いい加減やめとけ。
(って反応するのが楽しいんだろうな)
反応する馬鹿がいるから・・
冬休み間近ですね
752 :
ももの :2005/12/16(金) 15:00:55
スレ違いの書き込みをしてしまって本当に申し訳ありませんでした;
753 :
デフォルトの名無しさん :2005/12/16(金) 16:26:02
1%3=? 計算がわかりません
1%3 =1 1÷3=0あまり1 2%3 =2 2÷3=0あまり2 3%3 =0 3÷3=1あまり0 3%4 =3 3÷4=0あまり3 10%3 =1 10÷3=3あまり1
>>755 なんで一個だけ除数が4なんだよびっくりするじゃないか
>755 あまりって事ですね ありがとうございました。
剰余演算子くらい本やサイト見れば載ってるだろwwwwwwwwwwwwwwwwwwww
いまは、自分で調べずに質問するのが流行です。
ゆと(ry
略せてない略せてない
簡単にカタカナをひらがなに変換する方法を教えてください。 どうかよろしくお願いします。 1バイト目を0x82固定、2バイト目に0x5Fを足したらヌルポがぬれぽになっちゃいました。
>>762 単純に足すのではなく、テーブルで持つしか。
カタカナとひらがなでは文字数違うしね。
分かりました。 作ってきます。 ありがとうございました。
EUCの全角スペースを検出したいんだけど、 0xA1 0xA1 と 0x20 0x20 があるみたい。 これ両方全角スペースで考えていいのかな?
2020の方は半角スペース2つだろ(w
糞ワロタwww
>>762 カタカナには 0x837F の空白があるからだな。
これに対処すればいけるはず。
ただ、ヴ、ヵ、ヶはひらがなにないので気をつけるよう。
>ヶ これはカタカナですらない。
しかしJISコードでカタカナ扱いされているという現実。
ァアィイ・・・ヰヱヲンヴヵヶ
謎のモノリスを発掘したスレはここですか?
773 :
765 :2005/12/16(金) 23:37:42
>>766 あぁホントだ。
>>767 ありがとう
ちょうど768さんよーることみたいに、他の空白もあるんかな?
775 :
765 :2005/12/16(金) 23:42:12
man ascii
776 :
765 :2005/12/16(金) 23:56:48
man co
初歩的な事柄であれなんだけれど double d; int i, j; という変数があるとき、double 型で d * i / j という演算をやるとして、キャストは必要になりますか? つまり、以下の2つの書き方があったとして: 1) double answer = d * i / j; 2) double answer = d * (double)i / j; 2) なら勿論 double 型で演算できますが、1) のような書き方でもこれと同じ意味になるのでしょうか? それとも環境によっては i / j の部分が先に int 型で演算されて違う結果になってしまったりしますか? 一応、うちの環境(Linux + GCC 3.3.2)で試した限りでは両者とも同じ結果になりました。
778 :
777 :2005/12/17(土) 00:40:18
すみません、自己解決しました。 テストプログラム自体が間違ってて、直してみたところ違う結果になりました。 つまりキャストは必要みたいですね。
全角カタカナ/ひらがなの文字コード作った香具師(JIS)は糞だな
>>777 もしかしてこう書いたんじゃないの?
3) double answer = d * (i / j);
>>781 それは大変失礼な言い分だ。糞なのはShiftJISだ。なぜなら、JISで平仮名とカタカナは隣の区の同じ点に存在している。
>>783 スマソ。そういう意味では確かにそうだ。
しかし、
>ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご
こういう並べ方するセンスが分からん
ヒント:日本語タイプライタの配列
C言語で、int型に入ってる数字をJISコード表に沿って文字として出力するにはどうすればいいのでしょうか?
>>786 char型でJISコードを使う環境ならchar型にキャストしてしまえばよい。
>>786 まず「JIS コード」が何なのか…が解ってりゃ、人に訊かないか。
>>787 2バイトコードだったらどうする気だ。
>>788 >2バイトコードだったらどうする気だ。
charの配列に
>>786 JIS からその環境の文字コードに変換できればあとは特に問題ないはず。
791 :
デフォルトの名無しさん :2005/12/17(土) 22:37:14
qsortのアルゴって難しいな K&R見てもよく分からん 再帰使ってるからかな
792 :
デフォルトの名無しさん :2005/12/17(土) 22:38:04
qsortのアルゴって難しいな K&R見てもよく分からん 最後に2回再帰使ってるところが
そもそも標準ライブラリ関数のqsortがどんな実装かは未定義だけどな QuickSortのAlgorithmが分かりにくいというならごまんとある解説ページを片っ端から読め つーか、俺から見ればQuickなんかよりMergeの方が分かりにくいわけだが(何故Quickと同程度のオーダーなのかという点が)
quick sort のアルゴリズムなんて、 ・数列をある値より大きいブロックと小さいブロックに分割 ・それぞれのブロックを同様に分割 これだけじゃん。
>>793 漸化式考えればすぐわからないか?
きっかり半分に出来た時は
Tn) = T(n/2) + T(n/2) + O(n)
だろ?
きっかり半分に出来なくても同じ。
つか記号が出せなくて書けねぇ。
>>795 あぁなるほどな。dクス
計算量について説明してある所もあったが、うだうだ説明されるより
そう書いてくれた方が分かりやすいな
ソケットをつかってデータ通信をしたいのですが、クライアントがそれぞれA,Bと2つで受信サーバが1つ この状態でAとの通信で受け取ったソケットはbuff1に格納、Bから受け取ったソケットはbuff2に格納という具合にしたいのですが クライアントAとBを区別するにはどうすればいいでしょうか?
スレ違い WindowsならWindowsプログラミング質問スレへどうぞ UNIXならUNIXプログラミング質問スレへどうぞ
799 :
デフォルトの名無しさん :2005/12/18(日) 04:09:22
>>797 UDP なら recvfrom() 使えば?
TCP ならもう考える必要はねえ。accept() した時に分かる。
>>798 アフォか
ネットワークならネットワーク質問スレだろ
801 :
デフォルトの名無しさん :2005/12/18(日) 14:22:35
質問なんですが 3行2列の行列を表現する浮動小数点型2次元配列bの宣言文はどう書けばいいんでしょうか?
double b[3][2];
803 :
デフォルトの名無しさん :2005/12/18(日) 14:34:10
そんなこともわからないのに、そこから先のプログラムを書けるんだろうか・・・
double a[2][3]; double b[3][2]; double c[2][2]; c = a * b; なんて事はしないでくれよ。
806 :
デフォルトの名無しさん :2005/12/18(日) 15:03:22
関数の引数は値でやりとりされる。このメカニズムは何?この処理で自分自身を呼び出す関数は何? ってメカニズムって何だ・・・。関数はfuncでいいんだよな?
807 :
デフォルトの名無しさん :2005/12/18(日) 16:19:25
ファイル名を標準入力して その文字列をchar配列に入れなさい、 というのですがどうすればいいのでしょう
日本中の馬鹿がこのスレに集まってきてる気がする
>>807 宿題なら宿題スレに行けば誰かが答えてくれるかもしれない。
810 :
デフォルトの名無しさん :2005/12/18(日) 18:06:08
こんばんは。 さっそくですが質問させてください。 データファイルの拡張子が.TTPとして.TTPのファイルだけを次々に読み込ませることはできるのでしょうか? ファイル名には規則性はありません。 例えば 001.TXT no.TTP yes.TTP 23.TTP tarou.NAM というようにファイルがある場合、no.TTPとyes.TTPと23.TTPだけのデータを読み込みたいんです。 いかがでしょうか?
811 :
810 :2005/12/18(日) 18:07:39
すいません。追記です。 TTPのファイルはテキストデータです。
813 :
デフォルトの名無しさん :2005/12/18(日) 18:15:37
>>812 OSはwindowsでコンパイラはboland c++です。
可能であれば方法をお教えください。
>>810 Win32なら
FindFirstFile FindNextFile
ってAPIがあるが、他は知らん。処理系によって似たような関数があるとは思う。
ヒント:ワイルドカード
815 :
デフォルトの名無しさん :2005/12/18(日) 18:16:21
ポインタについての質問です。 int *p; とするのはポインタをint型変数の特殊なもの っていうイメージが強いですが 自分は int* p; のほうが意味的に分かりやすいです でも、複数宣言したいときは int *p1,*p2,*p3; のように書かなければならないです。 これは美しくないと思われますが、 やはり int *p; で統一するのが一般的でしょうか?
int *a,b,c; //aはポインタ、bとcはauto変数 int* d,e,f; //全部ポインタ 違いを理解するだす。
>>816 int* d,e,fはポインタdとint型のe,fだろ
819 :
デフォルトの名無しさん :2005/12/18(日) 18:22:31
>>816 int* d,e,f;
ってdだけポインタ?じゃないの?
多くのヘルプやサンプル、書籍では int *p; になっているのでこちらが一般的であるが。 int* p; が意味的に分かりやすいのは同意で、私もそう書いている。 同じように複数のときはかっこ悪いとも思う。 ゆえに激しい議論が飛び交うと予想される。どぞ↓
>>820 >>816 みたいな間違いを犯さないためにint *p;がAcceleratedC++でも推奨されてる
(int *) p とかキャストするからな
823 :
815 :2005/12/18(日) 18:26:12
>>816 int* d,e,f;
みたいに宣言すると
e,fはint型になった。
コードに
int *d,*e,*f;
と書いてるところと
int* a;
って書いてるとこがあったら
統一感ないじゃん?
だったら、全部
int *a;
とかで統一するのが一般的なのかな?
っていう質問
824 :
815 :2005/12/18(日) 18:28:05
>>820 おれは頭の中で既に激しい議論になってます><
客観的に多数派を教えてください
シンタックスシュガーだろ
>>816 aもd, e, fもみんなauto変数だ。
827 :
820 :2005/12/18(日) 18:37:21
>>815 私自身は
>>820 での書き方で、なんら問題の無い環境にいる。
int * p;
気分に合わせてこう書く日もあるが、無問題。
環境に合わせるべきであると思う。
>>823 1度に複数の変数を宣言するほうが悪い。
そんな俺はint *p;派。
829 :
デフォルトの名無しさん :2005/12/18(日) 18:42:02
根本的な発想として
#define intp int *
ではなく
#define intp int*
って「美学」があったんだろ
typedef と #define を同一視したいらしいが
俺に言わせれば糞、くだらねー
>>824 多数派なんて現場によりけり
仮に君が地球規模の「多数派」を知ることができたとして
現場の空気を無視してそれをわめくと叩き出されるだけだぜ
いい悪いじゃないんだよ
コーディングスタイルはプロトコルであってマルチ対応できない奴は低機能ってだけだ
int* p;の方が分かりやすいってのは何らかの理由があるんだから int *p;の方が分かりやすくなる理由を脳内でこじつけたらいいじゃないか
832 :
815 :2005/12/18(日) 18:51:14
なるほど。 どっちでもいいことが分かったので 適当に書くことにするよ。 その適当に美しさを見出せばいいんじゃまいか
833 :
815 :2005/12/18(日) 18:53:05
>>831 こじつけはよくない
本質が分からなくなったら本末転倒じゃね?
おれは、柔軟に対応できるようになるよ
834 :
デフォルトの名無しさん :2005/12/18(日) 18:56:49
複数使うときは、 int* t[5]; で、いいジャマイカ。
ぶっちゃけ一行一変数宣言煮汁
837 :
815 :2005/12/18(日) 19:23:05
>>835 なる。
ただ名前が分かりにくいな。
柔軟に対応でFA
>>831 int *p;は「*pがint型になる」と読めるという利点がある。
スペースの場所が違うとしか考えて無かった俺はなんだかいけない気がしてきた。
840 :
デフォルトの名無しさん :2005/12/18(日) 19:28:33
>>838 実際にint型になるわけじゃないから困る
int* p; なんて書く奴は得意げな顔して #define BEGIN { #define END } とかやっちゃうタイプだな。
>>840 ?
pが適切なところを指していれば838だろ。
843 :
デフォルトの名無しさん :2005/12/18(日) 19:33:25
泗ぢってどんな意味なんですか??
>>841 ちなみにC++作ったStroustrup氏はint* p;派だそうな。
845 :
デフォルトの名無しさん :2005/12/18(日) 19:35:13
perlのソースもめちゃ汚いよな。 センスの悪い奴はソースも汚い。
たしかに TeX のソースもかなりアクが強い。
あと、おたふくソースもアクが強い。
それでうまいこといったつもりか
int a; と書くと、int型の変数が利用できますが、 int *a; と書くと、int型のポインタaが示す先の&aはOSからきちんと割り当てられているのでしょうか?
>>850 そんなわきゃない。
だから、int* a;が好まれる。
>>850 はいともいいえとも答えられる曖昧な質問だ。
int *a;という宣言があったとして、
aの指す先*aはそのままではどこも指していない。
自分でどこかの変数へのポインタやどこかから確保したメモリへのポインタを代入する必要がある。
一方でaも一種の変数であることには違いないのだから&aとするとaへのポインタが得られる。
これはint **型の変数へ代入して有効に使うことができる。
853 :
850 :2005/12/18(日) 22:45:51
>>851 &852
早速のレスありがとうございます。
ポインタを宣言しただけではどこかを指しているはずがないので
int i;
int *ptr;
ptr = &i;
などと書いて、自分で何を指すか指定しないといけないわけですね。
854 :
850 :2005/12/18(日) 23:47:45
たびたび質問で申し訳ありません。 int *a[5]; と書くと、 どのような型ものがいくつ確保されるのでしょうか? まったく見当がつきません。
とりあえず本でも買って読め。
だからおれは
int* a[5];
と書きたいんだ
>>854 int a[5];
はどういう意味?
おk
じゃあ
int* a[5];
は?
おk
int *a[5];
ほーら分かった。
よな?
>>850 レベルの奴にいちいち反応しなくていいから。
ソースが綺麗でも動かないと役に立たない TeXもPerlも汚いが偉大だ
とりあえず、int *p; の書き方に固執してるヤツってのは、器が小さい ということは分かった。
ローカル変数を100も200も使うわけ無いんだから int i; /* コメント */ int j; /* コメント */ int k; /* コメント */ int* p; /* コメント */ int* q; /* コメント */ int* r; /* コメント */ でいいじゃん。
このint*のヒト、ずっと張り付いて主張してるの?
865 :
デフォルトの名無しさん :2005/12/19(月) 04:33:56
授業単元:プログラミングです。 誕生石: 生まれ月に因んで定めた宝石。起こりはユダヤ教の祭司の胸板の12の宝石によるとも、 新約聖書ヨハネ黙示録の「新しきエルサレムの東西南北12の門の12の石垣の基礎石」によるとも言われる。 1月ガーネット、2月アメジスト(紫水晶)、3月アクアマリーン・ブラッドストーン、4月ダイヤモンド、5月エメラルド、 6月真珠・ムーン‐ストーン(月長石)、7月ルビー、8月サードニックス・かんらん石、9月サファイア、10月オパール・トルマリン、 11月トパーズ、12月トルコ石・ラビス‐ラズリ。(1912年アメリカ宝石同業組合で決めたもの) 広辞苑による 上記データに基づいて、誕生月をキーボードから入力しその人の「誕生石」を画面に出力するプログラムを作れ。 条件 switchを使う。
867 :
デフォルトの名無しさん :2005/12/19(月) 06:13:33
どうしても理由のわからないエラーが出て困っています。 エラーメッセージは warning: no newline at end of file です。 pow関数を使ったのですが、それがいけないのでしょうか? ごく簡単なプログラムなので、それくらいしか見当がつきません。 #include <math.h> はちゃんと書いてます。
その程度の英語も読めないのか。
エラーじゃなくて警告だしな。 実行ファイルが作成されたか要確認。
VCスレで聞くべきなのかもしれませんが・・・ char buf[600]; char data[30 + 1]; sprintf(data, "000000000000000000000000000001"); sprintf(buf, "aaaaaa(・・・長い文字列・・・)%sbbbbbb(・・・長い文字列・・・)", data); とすると、bufの中身が242バイトで切られてしまいます。 長い文字列とは言っても600バイトをオーバーするほどではありません。 sprintfの制限とかがあるのでしょうか。printfでコンソールに出力することは できました。 Visual C++ 6.0です。 よろしくお願いします。
872 :
871 :2005/12/19(月) 07:28:05
すいません。解決しました。
873 :
デフォルトの名無しさん :2005/12/19(月) 08:43:08
「不動小数点型引数b,cを引数とする返却値整数型関数funcの関数頭部を書け。」 っていう問題があるんですが、不動小数点数って浮動小数点数のことですよね・・? この問題の答えがよくわからないのですが、どうなるんでしょうか?
何このスレ・・・他力本願の人がモッサモッサ集まってくるスレなの?
いくら調べてもなかなか答えに近づけない 検索能力がない アフォが多いだけじゃね?
不動小数点型...double型(flota型) 返却値整数型...int型のreturn x;で終わる関数 問題が難しいだけで内容はたいしたことないよ int型関数で引数にdouble型のbとcを受け取る関数のヘッダを書く。一行。
誤字 flota > float
878 :
デフォルトの名無しさん :2005/12/19(月) 12:14:01
こんにちはさっそくですが質問させてください。 05/09/20,07:10:00,000,020,+00005 というデータが数行に渡ってCSVファイルに保存されているとき 一行をfgets(s,sizeof(s),fp);でchar型配列sに保存しsscanfで各パラメータを配列に入れようとしたんですが、 うまくいきません。 アドバイスおねがいします 。 パラメータは 05/09/20 をchar型配列 date[80] 07:10:00 をchar型配列 time[80] 000 を int配列 num1 020をint配列 num2 +00005をchar配列val[80] に格納しようと考えております。
>>878 自分はどうやったのか
を書かないとね。
丸投げと変わらないじゃまいか。
それでも答えてくれる親切な人も
いるからダメとはいわない
sscanf(s, "%79[^,],%79[^,],%d,%d,%79s", date, time, & num1, & num2, val);
>>876 > 返却値整数型...int型のreturn x;で終わる関数
「返却値整数型関数」とは書いているが、
int とは書かれていないが?
整数型には int の他にも
signed char (unsigned char)
signed short (unsigned short)
signed long (unsigned long)
などがあるわけだが…。
> 関数のヘッダ
どこの用語ですか?
# プロトタイプ宣言なら知っているがな
みんなやさしス
int でなんの問題もない。もっとも無難な型だと思われる。 「funcの関数頭部を書け。」 という問いなのだから 頭部=ヘッダで、これも間違ってはいない。 このような質問にはなるべく分かり易く答えることが大切で 細かいことを言っても混乱させるだけ。
884 :
デフォルトの名無しさん :2005/12/19(月) 14:41:39
>>779 ご意見ごもっともです。
#include<stdio.h>
int main(void)
{
char buf[80]="05/09/20,07:10:00,000,020,+00005";
char date[80],time[80],mode[80],val[80];
int num1,num2;
sscanf(buf, "%s,%s,%d,%d,%s", date, time, & num1, & num2, val);
printf("%s.%s.%3d.%3d.%s", date, time, num1, num2, val);
return 0;
}
最初は↑のようにしておりましたところ、date[80]にすべての文字列が入ってしまい
こまっておりました。
>>780 ありがとうございます。ご指摘のとおりにしたらできました!
よろしければ%79[^,]と%79sの意味を教えてください。
>>883 その前に、このスレで扱う話かどうかを検討してくれ。
つか、「不動小数点」へのツッコミはなしか…
>>884 >よろしければ%79[^,]と%79sの意味を教えてください。
図に乗らない。
プログラムでフォルダを作ることってできますか? できるならどうすればいいんでしょうか?
>>886 C の標準関数ではできないので、別スレへどうぞ。
889 :
デフォルトの名無しさん :2005/12/19(月) 16:20:23
C言語はクソむずいぞ!!orz
なんつう無駄なやり取りだ
んなもんテンプレ化して
>>2 にでも入れとけドアホ
すぐキレる世代乙
キレる世代もそろそろ部下もつ頃か 時間の流れは速いな
誰がキレてんのん?
キレてないっすよ
僕の頭はキレます><
898 :
デフォルトの名無しさん :2005/12/19(月) 22:20:53
>>874-875 スレタイが読めない誰かさんたちみたいのが集まっている(≠集まる)スレだよw
FILE *fp1=fopen("aaa.txt","r"); if(fp1){ for文 } fclose(fp1); という分があるのですがif(fp1)とはどういうことですか? *fp1でfopenできない場合はfp1を閉じるってことですか?
>>899 if (fp1)はif (fp1 != 0)と同じ。
fopenはファイルオープンができなかった場合ヌルポインタを返す。
その場合は逆にオープンできたらforを行うということになる。
901 :
デフォルトの名無しさん :2005/12/19(月) 22:49:19
>>899 確かに変なコードだな
FILE *fp1=fopen("aaa.txt","r");
if(fp1){
for文
fclose(fp1); /* FOO */
} /* BAR */
FOO と BAR がこうなっていれば意味は通るが
FILE *fp1; if((fp=fopen("aaa.txt","r"))!=NULL){ for文 } fclose(fp1); とかすればいいのに
903 :
デフォルトの名無しさん :2005/12/19(月) 22:54:43
教えてください。 void main() { char *a,*b; *a="1111"; /* NG */ b="2222"; /* OK */ } これは、*a は aが指す実体。bは アドレス。 右辺に文字列リテラルを記述した場合("1111")は、先頭アドレスをあらわす。 という理解でよろしいでしょうか。
>>903 いいよ
でも、*aだと'1'しか表さないよ
>>902 俺は901のスタイルのほうが好きだよ。それだけだけど。
906 :
デフォルトの名無しさん :2005/12/19(月) 23:09:15
>>904 ありがとうござます。
aの代入は型があわないためメモリフォルトでしょうかね。
>>906 いや、型があわないからコンパイルエラーだ。
908 :
デフォルトの名無しさん :2005/12/19(月) 23:16:12
>> 907 ありがとうござます。Linuxのgcc だと警告で*.oは作成されるようです。 警告を無視することは危険ですね。
909 :
デフォルトの名無しさん :2005/12/19(月) 23:24:09
>>908 警告とエラーの区別がついてない
誰かさんの真似しちゃだめだよ
>>901-902 ヌルポで fclose() するのは危険だったような… 自分の記憶が怪しい
fclose()は危険 free()は無問題
912 :
デフォルトの名無しさん :2005/12/20(火) 00:04:07
クリーンアップ関数(セットアップされてないポインタ); 俺は fclose のがきれいだと思う セットアップしてないポインタがぬるぽとは限らないから
教えてください。 int test( void ) { unsigned long x,y,z; x=0xFFFFFFFF; y=32; z=(x>>y); printf("%X",z); getchar(); return 0; } でzの値が0にならないのは何故なんでしょうか? y=31のときはz=1なのに??
そういう仕様だから。
>>914 そういうもんですかー。
何かスッキリしない。
916 :
デフォルトの名無しさん :2005/12/20(火) 00:40:13
で、z はいくつになったの?
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<913
>>916 一般的な処理系なら数値が変わらないんじゃないの
>>916 z=0xFFFFFFFFで値がかわりません。
ついでに書くと VCで実行してるんですが (x>>y)の部分をドラッグして反転させて マウスカーソルを合わせてみると この部分は 0 と表示されます。
>>919 (unsigned long )(-1)
>>913 もしかして
z=(x>y);
になってない?
923 :
922 :2005/12/20(火) 00:50:47
てか、>> シフトしてんじゃん
924 :
デフォルトの名無しさん :2005/12/20(火) 00:51:49
>>919 どんな翻訳環境と実行環境でそうなったの?
925 :
922 :2005/12/20(火) 00:52:14
ゴメン、シフトしたいのか 寝るよ・・・orz
>>913 yを31,32,33,63,64
にしたりして見ればわかるかもしれないが下5bitしか見てない。
y=0xFFFFFFFF で逐次処理してたら泣けるからだ
ものによってはy>31で何か処理しているものもあるかもしれない
intが64bitの場合も下6bitしか見てないものもあるだろう
え?free(NULL)って安全であることが保証されてるんですか?
環境はVC++2005Expressです。
>右オペランドの値が負であるか、又は拡張した左オペランドの幅以上の場合、 >その動作は、未定義とする。 from C99 6.5.7 ビット単位のシフト演算子
環境はVC++2005Expressです
932 :
デフォルトの名無しさん :2005/12/20(火) 00:55:56
>void free(void *ptr); >(略) ptrが空ポインタの場合、なにもしない。 from C99 7.20.3.2 free関数
>>926 ,929
何となく合点がいきました。
ありがとう。
VC++2005Expressのせいでアフォみたいな質問が増えそうだな・・・
>又は拡張した左オペランドの幅以上の場合 ってどいうい事?
ってどいうい事?
938 :
デフォルトの名無しさん :2005/12/20(火) 01:02:58
ってどいうい事?
しかしクイックウォッチで値を参照してみると (x>>y)0x00000000unsigned long z0xffffffffunsigned long なんですよね。何か気持ち悪い。。
>>936 32bitなら32以上、ってことでは?
未定義なんだから仕方ない。おいらの環境では 鼻から悪魔が飛び出してもっと気持ち悪い。
x<<yのxがchar,shortでもy<=INT_BITの場合は未定義ってことでは。 ちなみに、x86では、shr a,bのbに%32を自動でかけるとかなんとか。 VCのクイックウォッチはインタプリタだから、この制限が適用されないだけ。
わかりました。どうもです。
へぇ〜知らんかったわ。勉強になりました。 大体そんなにシフトすることがなかったからなあ。32ビット以下の環境では。
これが有名なpen4の割り算バグか
128bitの整数演算をしたいのですが、VC2005は64bitアプリ対応だそうで、int が64bitなんでしょうが __int128 というのは使えますか。
どうしてこんな勘違いする人間が後を絶たないのか
>>947 > VC2005は64bitアプリ対応だそうで
これはあくまで64bit環境で動くアプリを「作ることができる」のであって、
作ったアプリがひとりでに64bitで動き出すわけではない。で、
> int が64bitなんでしょうが
これもありえない。
64bitアプリを作れるのはVSProだけだけどね・・・ Stdくらいしか買えねーよ!
intは32ビットのままなんでしょ? 今まで int* a = ...; int b = (int)a; /* (今までは32bitどうしで持ちこたえてた場合が多かったが…) */ みたいな糞コードをくさるほど見てきたが、これから大丈夫なんだろうか…
大丈夫も何も、32ビットアプリとしてコンパイルすればよいだけじゃね? 64ビットアプリにしたいのなら、それなりに修正は必要かと。
64 ビット環境で int が 32 ビットってところが 今までと違う所なんだよな。 今まではレジスタサイズ変わろうが、 int がレジスタサイズと同じだったから何とかなった。 まあ、ちゃんとやってる人なら C99 になる前から intptr_t みたいなのを定義して 使ってるんだろうけど、 別の制約で使えない可能性もなきにしもあらず、か。
ソース丸投げ乙
面白いソースだな 勉強中の俺には参考になる struct[0]を消すときはそこにstruct[1]を代入 struct[1]にstruct[2]を代入 for(i=0;i<入力済み構造体数li++){ 構造体[i]=構造体[i+1]; } をやればいいんじゃね?
958 :
955 :2005/12/20(火) 11:12:26
ちょっとスレ違いっぽかったですね。 学校の課題なので、宿題スレで質問することにします。
質問です。 gmtime(3)のような関数は内部でtm構造体を作って、 その構造体へのポインタを渡していると考えてもいいんでしょうか?
>>960 ありがとうございます。見逃していました。
volatile int a,b; void test0(void) { a = b = 0; } をコンパイルした時、 b = 0; a = b; になるコンパイラって正しいんでしょうか? b = 0; a = 0; になることを期待してて、bは実際には書き込んだ値と違う値が読み出される ハードウェアで、aに0でないヘンな値が入ってるらしいとハマりました。 実装依存ってやつでしょうか…?
>>962 =は右結合なので
b = 0;
a = b;
が正しい
>>962 > a = b = 0;
は「a = ( b = 0 );」と言うこと。
つまり、式「b=0」の結果が代入されるのであって、
> b = 0;
> a = 0;
とは等価ではない。
a、b共に0を代入したいのなら、
> b = 0;
> a = 0;
と書くのが正解。
965 :
デフォルトの名無しさん :2005/12/20(火) 18:46:08
ダブルポインタってどういうときに使うのですか?
というと 普通に使ってるじゃん int main(int argc; char **argv) { } とか int *a[]; とか
たぶん実際のアルゴリズムの中で使われてるところを見たいんでしょう
多次元配列扱うときとか
ダブルポインタなんてものはない。 ポインタを理解できていない香具師のいいわけだ。 その証拠に、「トリプルポインタは自信ないですけどダブルポインタならばっちりです」などと言い出す。
多次元配列なんてものはない。 あるのは配列の配列だけだ。
ポインタのポインタ?
ダブルポインタって変数aのアドレスを指すポインタのアドレスを指すポインタのことか?
そうらしい
975 :
962 :2005/12/20(火) 19:24:09
>>966 ハードウェアは LPC2214 という ARM7 CPU で、問題のレジスタは
Timer0 の Interrupt Register というものです。
http://www.semiconductors.philips.com/acrobat/usermanauls/UM_LPC2114_2124_2212_2214_2.pdf この CPU に関して言えば、読み出しと書き込みで値が異なるのは
当り前にある様です。
>>964 >は「a = ( b = 0 );」と言うこと。
>つまり、式「b=0」の結果が代入されるのであって、
その通りだと思うのですが、件のコンパイラ(arm-elf-gcc 4.0.0) は
b=0 をやったあと、0 はレジスタに残ってるのに、わざわざ b を
読み出してきてその値を a に代入するということをやっていました。
volatile だとこうなる方が普通なんでしょうか。
別の言い方をすると、「「b=0」の結果」とは、右辺の 0 とは限らず、
代入後に左辺の変数を読み出すという実装も有り得るということでしょうね。
結果を使わない場合はもちろん読み出さないので、私には不自然に思えますが、
言語として仕様を満たしてない訳ではないということでしょうか。
別の CPU 用の別のコンパイラ(YCSH 4.07)で試してみると、普通に
b=0;
a=0;
というコードが出ていました。
とにかく実装依存と思うことにし、今後気をつけます。
質問です。 配列[5]を宣言又はnewで作成。 中身 [0] a [1] b [2] c ←削除 [3] d [4] e ↓ [0] a [1] b [2] d [3] e [4] ↓ [0] a [1] b [2] d [3] e [4] f ←追加 <5> g ←追加 こういう配列操作をしたいのですが、 追加時は別配列で作り直さないと駄目でしょうか?
newで作成ってどういうこと?
なんで、5よりも大きい配列が必要だって最初からわかっているのに、配列の大きさを5にするんだ? 配列のMAXが最初からわかっているなら、その大きさで配列を確保すればイイじゃん。 可変配列でないとダメならvectorだろ。
>>979 可変配列を作りたかったのです。
vectorって言葉は知らなかったのですが、
検索したところCStringArrayってのを使えば出来そうですね。
ありがとうございました。
あ、>980踏んでたけどこれから帰るから誰か宜しく。
>>975 b = 0;
a = b;
なら aに0が入ってないとおかしい。
>「「b=0」の結果」とは、右辺の 0 とは限らず
この場合は仕様を満たしたコンパイラなら必ず0になる。
b+=0とかならともかく
>>965 木構造への挿入・削除はポインタのポインタを使わないとやたら面倒
再帰で書いていいなら話は別だが
どうも馬鹿共の言うダブルポインタには (*a)[] は含まれないようですね
>>988 『「b=0」の結果』は、bに0を代入した結果。
つまり、bの値を読み出してaに入れるのは当然だろう。
この時、bを読むと0になるかならないかは環境依存。
>>991 っつーか、ポインタのこと理解出来てれば
「ダブルポインタ」の様な変な用語は使わんだろう。
不毛すぎる厨房どもw
997 :
デフォルトの名無しさん :2005/12/20(火) 23:41:13
C言語のエキスパートの方はWindowsプログラミングにも強いと思って質問します。 UnicodeのウィンドウにIMEを使って文字を入力する時、 入力された文字をWM_IME_COMPOSITIONやWM_IME_CHARを使わずにWM_CHARで正確に 文字が取得できますでしょうか?? ちなみにOSはWindows2000です。XPだと取れるっぽいのですが、Windows2000だと 私の環境はだと、とれないっぽいのですが、みなさんいかがでしょうか?? スレ違いなら、他で質問します。
すっかりスレ違いです
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。