1 :
デフォルトの名無しさん :
2009/01/06(火) 03:30:05
/ // / // ______ / // / / // /| r'7\ ,.ヘ‐'"´iヾ、/\ニ''ー- 、., / / / / | |::|ァ'⌒',ヽ:::ヽrヘ_,,.!-‐-'、二7-ァ'´|、__ `'ー-‐''" ヽ、_'´ `| |:::::|'" 二.,_> ,.へ_ / //__// / / / `ヽ7::/ か っ も | / // メ,/_,,. /./ /| i Y // ァ て う. |'´/ ∠. -‐'ァ'"´'`iヽ.// メ、,_ハ , |〉 | 約 ク ヽ! O .|/。〈ハ、 rリ '´ ,ァ=;、`| ,ハ |、 / | 束 ソ > o ゜,,´ ̄ . ト i 〉.レ'i iヽ|ヽ、.,____ | し ス / ハ | u ,.--- 、 `' ゜o O/、.,___,,..-‐'"´ | た レ | / ハ, / 〉 "从 ヽ! / | じ は |,.イ,.!-‐'-'、,ヘ. !、_ _,/ ,.イヘ. ` ヽ. ッ .ゃ .立 |/ ヽ!7>rァ''7´| / ', 〉`ヽ〉 ! ! な て .', `Y_,/、レ'ヘ/レ' レ' い .な ヽ、_ !:::::ハiヽ. // / で い ./‐r'、.,_,.イ\/_」ヽ ', / / す / `/:::::::/ /,」:::iン、 / / 〈 ,,..-‐''"´ ̄ ̄77ー--、_\.,__ / ,.:'⌒ヽ ´ | | , i |ノ `ヾr-、
janeの隠し機能 1.書き込みウィンドウを出し半角入力に切り替える 2.Wキーを押しっぱなしにする 3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
質問です main(){ int kekka = 0; unsigned char soeji[] = { 4, 3, 2, 1 }; unsigned int deta[] = { 0, 100, 200, 300, 400 }; kekka = deta[(soeji[3])]; } この deta[(soeji[3])] という表記は使っても大丈夫でしょうか?(kekkaに100が入ってる?) また添え字になるならsoeji[]はunsigned charよりunsigned intの方が 処理速度的にはよいのでしょうか? よろしくお願いします。
>>5 大丈夫。括弧は特に要らない。
入るだろう。
大抵はそうだが一概には言えない。
7 :
デフォルトの名無しさん :2009/01/06(火) 08:26:37
>>5 処理速度を気にするのであれば、int を使うべき
8 :
897 :2009/01/06(火) 12:48:41
昨日C言語のインストールの仕方を教えてもらいインストールできました。 ファイルから新しいプロジェクトをクリックするとForm1小さなウインドウが出てきますがこれは何ですか? あとプログラムを入力して出力させたいのですがどういった手順で出力させるのか教えてください。 初心者すぎてごめんなさい。
あー、確かVisualStudioをインストールしたんだっけ? VisualStudioスレ辺りで教えて貰う方がいいよ。 ここはVS使ってない人も多いし、言語スレであってコンパイラ操作方法スレじゃないから。
まさに Visual(視覚的)なものさ。そういうのは、プログラミングというよりも インターフェースなどをぺたぺた貼り付けている感覚だな・・・
c言語の勉強したいなら、bccかcygwinあたりを インストールしなおしたほうがいいような気がするけど
13 :
897 :2009/01/06(火) 13:39:20
すいません。Visual Studio 2008 ってプログラミング向きじゃないんですか? プログラミングの勉強がしたいのですが、、、。
別に、アルゴリズムの勉強などは普通に出来るし。ただ、持ち合わせている開発環境は OSがサポートするインターフェースを簡単に取り込みやすくなっているが。 かといって、それを使うようなプログラムでなければ、別に無理に使う必要もない。 まぁ、手軽にBCCを選ぶ人も少なくないようだが。
VisualStudio 2005で平然と仕事してる俺らは変でしょうか? メインの1つとしてかなり使っているのですが、、、。
目的次第でしょ。必要なら必要だし。ただ、何を学ぶか?で 必要でなければ必ず使わなければならないものでも無い人は 手軽に扱えるBCCなどを選ぶ人も少なくはない。
>手軽に扱えるBCCなどを選ぶ人も少なくはない。 >14とか>16くらいだな。
18 :
デフォルトの名無しさん :2009/01/06(火) 13:58:15
>>13 コマンドラインでコンパイルすればいいだろ。 そしたらgccとかccとか発動する名前が違うだけ。
情報収集の下手な人がうっかり使ってしまうのがBCC
20 :
デフォルトの名無しさん :2009/01/06(火) 14:02:57
bccはいいよ。 低スペックでもコンパイル速いし。GCC、vccなど各種5個くらいインストールしているが いつもbccをつかう。
じゃあ俺のコンパイルは『いくぜえ!メタモルフォーゼ!!!!!!2010』
>>13 VS上でプロジェクトを作るんじゃなくてまず.cファイルを書いてからそれをVSで開けばいい
そうすれば単なるCのプログラムとして作れる
のかな? BCBではそうなんだけど
>>8 とりあえず専用スレで聞いた方がいいが、このスレでやりたいことなら
プロジェクト作る時にWin32のWin32コンソールアプリケーションで始めるといい。
CLRはそれが意味することがわかるまで一切さわらんほうがいいよ。
24 :
デフォルトの名無しさん :2009/01/06(火) 14:07:59
プログラムをメモ帳などで書いたら、test.cppで保存して、dosプロンプトで次のように撃てば実行できる。 complie.bat というファイルに書いてクリックでも言い。 cl test.cpp > err.txt
25 :
デフォルトの名無しさん :2009/01/06(火) 14:09:23
>>17 いや、お前が単にVC厨なだけ。それだけを使っている人は多くないだろうけど
少なくないの言葉の意味が分からないなら、大学にでも通ってみろ、低学歴
26 :
デフォルトの名無しさん :2009/01/06(火) 14:10:18
>>17 あと、VSはこのスレにある、C言語のみの環境じゃないから。
かといって、C言語のスレでVisualは直接的ではないんで、あしからず。
27 :
デフォルトの名無しさん :2009/01/06(火) 14:11:23
test.exeが出来てから、そのまま実行すると一瞬で消えるので 次のようなバッチファイルを実行すると言い. test.exe dosでキー入力を待つ命令
>>17 宿題スレも見てみな。使っている人は 少なく ないから。
あと、VSが無くてもC言語は扱えるし。ここ、C言語スレだよ?
VSがいくら無償で使えるからって、別に無理に使わなくても良いし、
お前みたいな奴は、あのAPIを使うことがプログラミングだと思っているようだし。
たまには、ダイナミックHTMLでも扱ってみれば?
>>25 >>26 鏡を見てご覧、顔真っ赤な学歴コンプレックスな阿呆が見えるよ、きっと。
>>24 >>27 日本語の勉強が必要そうな人は、無理に回答しなくてもいいってご存知ありませんでしたか?
インストールする時点で、既にBCCは容量が小さく、CPad for BCCと併用すれば楽。 いちいちプロジェクトがどうとか、ソースコード以外のごちゃごちゃした管理をするところまで 覚えなければならないのは、初心者にとっては手軽とはいえない。
>>13 初心者がCをやってみたいなら、VSだと混乱をまねく部分が多そうって事。
これはVSとbccやgccの両方使ったことがある人なら同意してくれると思うんだけど。
エディタとコンパイラだけで充分事が足りるのだから、cygwinでもLinuxOnVmwareでもいいからgccを使うのが一番楽。 まぁ、プログラミング以前で躓きそうな人も多そうだから敢えて薦めないが。
>>32 ただ、初期の環境設定(include や lib のパス通し)は
VSだとインスコ段階で確定されてるから少し楽かも?
# bcc で エラー出るんだけど → include パス通って無かった ってオチが多いのもまたw
>>1 > C言語の入門者向け解説スレです。
> ・C++言語はスレ違いです。
いい加減、Visualが付く製品は専用スレに誘導しろ。
手軽さに於いては、BCCは使われている方だよ。
C言語を習うのにUNIX、Linux系でも良いが、それを使っている人なら
MS製品のVSの話なんて場違いだしな。自分はVS使ってます宣言はしなくて良いから。
あと、初心者があれを使うのに、果たしてC言語の入門として使い方まで覚えるのに
時間や手間をかける意味があるとも思えん。何のためにVisualなのか、考えろ。
普通自動車の運転もまともに出来ない奴に、いきなり大型を扱わせるようなもの。
>普通自動車の運転もまともに出来ない奴に、いきなり大型を扱わせるようなもの。 この例えは、、、 Visualなら大型だがAT、gccなら普通自動車だけどMT車ってとこだな。
37 :
デフォルトの名無しさん :2009/01/06(火) 14:27:18
38 :
デフォルトの名無しさん :2009/01/06(火) 14:28:16
Win32コンソールで空のプロジェクトにチェックを入れたら あとは拡張子を.cにするくらいで簡単に使えるけどな〉VC でも個人的にはCPadの方がオススメ
40 :
37 , 38 :2009/01/06(火) 14:29:43
897へ いるなら、動かせる所まで教えてやるぜ
布教活動お疲れ様です
42 :
デフォルトの名無しさん :2009/01/06(火) 14:32:05
CPadは落とせる所が鳴いた幌
VSの話はだめだけどBCCの話はしていいですよね?
>何が含まれているか、確認しろ。あと、MS製品だから。 MS製品であることに何か問題でも? >C言語の質問スレでは明らかに製品そのものの質問はスレ違い。 同意。 >C言語に関わる質問を受け付けるスレだぞ。C++だってスレ違いなんだし。 同意。 但し、bccもgccもC++コンパイラでもあるのは周知の事実なので、VCだけを除外する理由はない。
47 :
897 :2009/01/06(火) 14:55:29
>>40 教えてください。このスレではスレ違いみたいなので他のスレッドで教えてください。
48 :
673 :2009/01/06(火) 15:03:17
キャストのことなんですが 2次元配列のアドレスを代入する場合なんですが 何故、p=(int *)xxx;なんですか? 一次元配列の場合 p=x;だけですむんですが 何故キャストするんでしょうか? 何故int *なんでしょうか?
アンチMSというか、まあ、初学者にVSを薦めると、VS由来の疑問だらけになることがよくあるね。 プロジェクトってなに、とかCLRって、とか実行したらすぐ消えたとか。 そういう意味でcl.exeを直接使用する方法を教えるのは悪くないとおもうよ。
なんかIPA臭くね?
Visual C++ であって、Visual C はVSには無いはずだが? すれ違いも甚だしい。他所でやってくれ。
少なくとも前スレでVSを勧めたヤツは責任取れよw
>>48 pがint *だからに決まっている
二次元配列へのポインタの型は(type *)[size]
type (*)[size]だろ
Visual C++はCコンパイラーも含んでいるよ
>>48 Cにおいてポインタとは、単なるメモリ上のアドレスを意味する言葉ではない。
それは( void * を除けば)オブジェクトを指し示すものであって、
その指し示すオブジェクトの場所(アドレス)に加えて
「そのオブジェクトの型」というものをポインタの型によって保持している。
char * は char を指し示し、int * は int を指し示す。
int ** は int * を指すポインタで、char (*)[10] は char 10 個からなる配列へのポインタである。
Cはこれらのポインタを(主にポインタ演算の都合上)明確に区別する。
特別なポインタである void * とやりとりするときと、ヌルポインタ定数を扱うときを除き、
ポインタの型を変える場合には(「これはプログラマが意図的に変えたんですよ」ということを
コンパイラに伝えるために)明示的に適切なキャストをつけないと、
多くのコンパイラは不適切な代入が行われた可能性があるとして警告を発する。
コンパイラに警告を発されるということは、君が自分のやろうとしていることを
正しく理解していない可能性が高い。配列の配列やポインタの型変換に手を出す前に、
ただの配列とポインタ演算についてしっかりと学習しておくこと。
ポインタとは型付けされたアドレスであると言えば説明の記述量は半分くらいになる気が
なぜ型付けされているか? ポインタの演算(インクリメント等)が 型の大きさ単位で評価するから (その型が中身だったとしたら x個目にあたるね って意味合いになる) char *p = 0; int *q = 0; p+1 で指し示すアドレス と q+1 で指し示すアドレスは sizeod(char) と sizeof(int) の差だけ違う
>ポインタとは型付けされたアドレスであると言えば説明の記述量は半分くらいになる気が いいえ、ポインタは型付けされたアドレスではありません。
否定だけしても何の説明にもならんよ では一体何であるのかを主張しなければ
「アドレスのようなもの」でいーんじゃね? 「入門篇」で深く説明しても解らんだろ。
その、ポインタはアドレスではない、って話を深く聞きたいんですけど、説明して 頂けませんか?別のスレが良いのなら行きますので、よろしくお願いします。 というのも、free() で配列のポインタを渡して、なぜ全部開放されるのか、が よく分からないんです。
>>64 それはmallocの実装の話で、ポインタの型は関係ない
66 :
897 :2009/01/06(火) 18:32:11
>>49 USBドライブ(F:)に保存したいので、f: と入力し、エンターを押します。
これをやってみたのですが指定されたドライブが見つかりません。となってしまいます。どうすればいいでしょうか?
printfのfってどういう意味?
68 :
デフォルトの名無しさん :2009/01/06(火) 18:35:34
フォーマットだろ なぜか最後の単語は1語に省略するんだ
>>66 USBドライブがないのだろ。プログラミング以前のPCの使い方なら初心者板に移動してくれ。
そうでなくても、言語の質問でないならとっとと出て行け。
フォーマットなのか創価サンクスずっと気になってたんだ
ポインタはアドレスを保持するもの
72 :
64 :2009/01/06(火) 18:45:04
ええ、ポインタの型とは別の話なのは分かりますが・・・ ポインタって結局なんなのか、よく分からないんですよ。 被参照型を参照するための値をもつオブジェクトとありますよね。なら、 配列のポインタは、実体の先頭しか指していないはず。なのに free に渡すと、 配列全体が開放される…javaみたいに自分の長さを持つ配列なら分かるんですが。 配列の途中のポインタをfreeに渡しても怒られるだけだし…
mallocしたときに領域の大きさを記憶してる freeするときはそれを参照して解放する範囲を知る
>>72 そりゃ長さをこっそり持たせてるんだろ。
allocしたときにサイズより大きく取って、先頭に情報入れて
入れた情報の次のアドレス返すとかできるべ。
>>91 >>73 みたいにまず教科書読んで過去問といてみたら。
この段階で分からないようなら、今から勉強しても絶対間に合わないと思う。
76 :
75 :2009/01/06(火) 19:08:53
ごめん誤爆
77 :
64 :2009/01/06(火) 19:09:47
>>73 , 74
何らかの形で領域サイズを持っているはずなのは分かります。
でもfreeは先頭しかうけつけないのは…あぁそうか、開始&終了があるかどうか
だけで良いのか。領域サイズだとlonglong以下に制限されますもんね。
ありがとうございます、freeについては分かった気がします。
あともう一つ、ポインタの値は何ですか?
アドレスでないならハッシュ値みたいなもの?
78 :
デフォルトの名無しさん :2009/01/06(火) 19:14:49
>>77 とりあえずdlmallocのソースでも眺めとけ
ポインタに格納されてる値はアドレス だからといってポインタ=アドレスってわけじゃないからね。
80 :
デフォルトの名無しさん :2009/01/06(火) 19:17:20
WIN32のcURLでIPv6って使えます?
ポインタの値はたまたまアドレスを持たせるような実装が多い。 ただし、アドレスとは限らない。 また、アドレスの場合もどうせ仮想化されているので物理アドレスそのものではない。
コップに格納されてる液体は水 だからといってコップ=水ってわけじゃないからね。
83 :
デフォルトの名無しさん :2009/01/06(火) 19:18:48
>>68 というより昔の処理系にあわせて
6文字以内に押し込んでる
たしかこれはgccの話だったと思うけど 実装上はmallocからもらうアドレスの手前に次の割り当てた領域の先頭アドレスが入ってて 全体としてリストだかヒープだかを作ってるんじゃなかったっけ んでfreeはそのアドレスを順繰りに辿っていって記録されたアドレスを更新することで割り当てられた領域を解放する だからアドレスが記録されている場所を書き換えるとリンクが壊れるのでセキュリティホールになってるとかどーとか
>>84 生半可な知識をひけらかす必要はありませんよ。
初心者には難しい話ですし、中級者以上には当たり前の話なんですから。
こんな事聞いちゃうくらい低レベルで恥ずかしいんですけど、gccとかbccとかいろいろあるけどどう違うのかがわからん
87 :
デフォルトの名無しさん :2009/01/06(火) 19:30:54
最新機能を使いたいならVCC 特定のコンピュータでは、それしか使え無いような物もある 基本は一緒
なるほど。さんくす
>>87 このスレ的には最新といったらC99をさすべきだろうwwwwww
だからVCCは古い
91 :
64 :2009/01/06(火) 19:34:39
92 :
デフォルトの名無しさん :2009/01/06(火) 19:36:34
ブーストの対応の多さと、MSの技術を使う為にはVCCだろう。 ブーストの対応表見ると、gccやbccなどは今市だぞ。
93 :
897 :2009/01/06(火) 19:36:56
>>69 すいません。USBメモリの件は解決しました。notepad test.cってやってもバッチファイルとして認識されないと出るのですがこれは環境変数の
Pathを変える必要があると思うのですがどうしたらいいでしょうか?スレ違いなのでこれで最後にします。
94 :
デフォルトの名無しさん :2009/01/06(火) 19:42:37
どーせC89なんだからどれでもいーだろう
97 :
デフォルトの名無しさん :2009/01/06(火) 19:45:05
最後にしなくて良いよ。 #include <stdio.h> int main() { printf("test prog"); } をメモ帳にコピーして、test.cppで保存して cl test.cpp > log.txt をメモ帳にコピーして、complile.batで保存してクリックしてみて。
98 :
897 :2009/01/06(火) 20:04:49
>>97 一瞬だけコマンドプロンプトが出てきてすぐに消えてしまいます。
前スレ嫁
100 :
デフォルトの名無しさん :2009/01/06(火) 20:10:39
>>86 製作者が違う。
トヨタもホンダも自動車を作っているが、だからといってトヨタの車とホンダの車が同じわけがない。
>>98 >>97 の方法は今後の事を考えるとめんどくさいから忘れた方がいい。
PATHを変えなきゃいけないんだろうってわかるなら、PATHを変更したら良いじゃないか。
その方法は、ググればすぐに分かることだよ。
notepad test.cがうまくいかないなら
とりあえず、メモ帳立ち上げればいいだけ。
あと、最初はメモ帳でも良いけど使いやすいエディタ探した方が良いよ。
>>98 空気嫁。
いい加減に2ch以外の掲示板で質問すればいいじゃん。
親切に教えてくれるぞ。
それと、さっさと消えてくれ。
104 :
897 :2009/01/06(火) 21:34:28
>>103 すいません。消えます。なんとかなりました。スレ違いにもかかわらず親切に教えてくださりありがとうございました。
105 :
デフォルトの名無しさん :2009/01/06(火) 21:34:30
知恵袋のほうが煽り100%で情報0%のボケアホカスをスポイルする仕組みは整っているな
106 :
デフォルトの名無しさん :2009/01/06(火) 21:43:19
for文について質問です。 for文の後に{}をつけたときとそうでないときは、動作に何か違いが出るのでしょうか。 行列の積を求めるプログラムを作っているときに、{}をつけた場合はエラーがでて、 つけなかったら正常に動いたので、その詳しい理由が知りたく、質問させていただきました。
107 :
デフォルトの名無しさん :2009/01/06(火) 21:46:09
変化無し ただし、forは一文( 今は{・・・}も一文と見なす )しか効果がない。
forの繰り返しの対象は直後の1文だけ。 複数の文を繰り返したいときに中括弧で囲む。 中括弧で囲むと、それ全体が1つの文という扱いになるため。
>>106 ソースコードを見ないでピンポイントで回答できる人間がいると思う?
それと、エラーって言っているけどコンパイルエラーなの?
実行時のエラーなの?
それによっても回答が変わってくるよ。
# あくまで予想だけど、{}をつける前と後で処理が変わってしまっているに一票。
つーか、このスレで.cppなんて書いている馬鹿って何考えて生きているんだろうね。 他にも、VCをvccなんて書いている間抜けも初めて見たよ。
gcc bcc vcc で統一感出る vc++だが++は一つ加えるんだから vcc
112 :
デフォルトの名無しさん :2009/01/06(火) 22:21:15
さすが間抜け。
>>112 なんで自分に原因があると思わないのかな?
prod()のループ制御変数をよく見て味噌。
それで判らなかったら馬鹿だ。
このスレでCPPといったら普通はCプリプロセッサのこと
C言語とか全然わからないけどこのスレは好きだって奴、おれの他にもいる?
>>114 あー!初めてループ制御変数という言葉を知りました orz
解決しました。ありがとうございます。
C言語でシュミレーションRPGって作れるんですか?
次にお前はシュミレーションRPGってなんですか?と言う
言いません
1次元の構造体配列struct tfield seq[5]がありメンバで struct tfield *gsがあるとすると seq[2].gs =&seq[3]でつなげると思うんだけど。 2次元配列だと無理なのですか? struct tfield seq[5][3]があり seq[2][2]とseq[3][2]をつなぎたい場合はどうすべきなのですか?
なんで無理だと思ったの?
場合わけして、つなぎたい場合はつなぐようにかいて つながない場合はNULLをいれてたんですけど。 処理をしてたらつながってなくて。 あとで調べてみたらNULLがはいってて。 NULLがはいってたから。
ソースを貼れ 切り貼りせずに全部だ
場合分けの条件式が間違ってました
128 :
デフォルトの名無しさん :2009/01/07(水) 04:27:50
大学の課題で悩んでいます その問題というのが 『ジョーカーを除くトランプ52枚(1~13×4種)からランダムに5枚を抜き出した時、 ・ワンペア(同じ数字が2枚) ・ツーペア(同じ数字が2枚のものが2組) ・スリーカード(同じ数字が3枚) ・ストレート(5枚連続した数値、[10,11,12,13,1]や[1,2,3,4,5]はOKだが[12,13,1,2,3]など1をまたぐケースはNG) ・フラッシュ(5枚とも同種) ・フルハウス(ワンペアとスリーカードの組み合わせ) ・フォーカード(同じ数字が4枚) ・ストレートフラッシュ(ストレートとフラッシュの組み合わせ) それぞれの役が発生する確率(実際には試行した回数)を モンテカルロ法により求めるプログラムを作成する。 ただし、上位(記載が下にあるもの)の役と下位の役を同時に満たす場合は 上位の役を優先する。 因数にポインタを含む関数を適当に作成し、利用すること。 メイン関数直下での処理はできるだけ避けることが望ましい 入力についてはキーボードから試行回数(+改行)のみ入力する。 最大でもint型に収まる数値とする 』 という課題なのですが、 まずやってるのが 1、トランプ5枚をランダムに発生する関数を作成 2、トランプ5枚へのポインタを引数とし、多項式時間内に役を判断し、焼くおw返す関数を作成。役の判断は上位の役から行い、成立すればブレイクする 3、1〜2を数百回試行し、結果から各役の発生確率を計算する処理を行う という順番でやっていたのですが、正直、2の段階で混乱してしまいます どうか教えてください
>>128 結局2の段階で役の判断をさせたいだけであれば、役の条件を考えれば
いいだけじゃないの?
C言語以前の問題だからスレ違いだろ。
骨格のイメージはこんな感じか enum Yaku { ONE_PAIR, TWO_PAIR, ・・・ NO_PAIR }; enum Yaku find_yaku(const int trump[]) { if (ワンペアか?) return ONE_PAIR; else if (ツーペアか?) return TWO_PAIR; ・・・ else if (ストレートフラッシュか?) return STRAIGHT_FLUSH; else return NO_PAIR; }
アンチMSとか言っているバカは何?VSがVC++以外のものも含んでいて このスレで使うべきとか聞かれても、目的次第としか言えないだろ。 ただ、あれはCのソースのみでも基本的な使い方を覚えるのに 果たしてプログラミングの入門として適切か?あるいは、使おうとすると 逐一事細かにまた質問してくるだろうから、最終的には無償で使えるんだから 自分で使って事情を知るべきだろ。必要も無いのに余計なものを入れて、 結局それは何なの?使わなければならないのか?って話にまで持ち込まれて てめぇの人生はどうしたら良いか?必要もないのに自動車の免許は必要か? とか言われても、他人は迷惑だろ。必要だと思うなら所持しておけ、 ただし、それを取得、扱えるようになるまで、限りあるてめぇの人生の時間を 使ってしまうという当たり前のことも理解しておけと。あれもこれも出来る人間なんて この世にはいない。明日死ぬかもしれない人生だぞ。
132 :
デフォルトの名無しさん :2009/01/07(水) 05:41:42
>>110 .cppと拡張子を付けているのに、何言ってんだお前?バカで低脳な基地外池沼はお前だぞ。
>>113 何しにこのスレに来てるの?その程度の低いレスしかしていないお前が低脳間抜け。
>>115 >>110 は.cppと書かれているが?ちゃんと拡張子と区別しましょうね、知ったか初心者さん。
このスレには、最近知ったばかりの似非プログラマが多すぎ。
お前らプログラミングの真髄を理解せずにこの世を去るだろうね。
あー、Linuxのglibcで量子圧縮のヒトかー
まぁ、お前らしょぼい奴らは、一度HTMLやCSS、ダイナミックHTMLでも扱ってみろ。 考え方が変わるから。貴様らがやっているのは何なのか? いいなれば、自動車があったとしよう。そのエンジンやその他、動作する仕組みを 作っているようなもの。より効率の良いものを作らないと、燃費が悪い、操作性が悪い 事故が起き易くなるといった原因になる。そして、それを運転、使用するのがドライバー。 貴様らはもちっと、色々な場所を運転して知ることがあるだろう。 色々なプログラム、処理体系を知る、扱うことによって。 貴様らが知っているアルゴリズムなんざ、もう何世紀も前に発見されて 周知のものばかりなんだぞ?その程度のことを知ったくらいで、偉そうにしてんなや。 あとな、それらを発見、世に広めた人だって、一度しかない人生をそういうものに 捧げてきたわけだ。ありがたく使えよ。
>>132 では聞くが、拡張子cppとは一体なんなのだ。
>貴様らが知っているアルゴリズムなんざ、もう何世紀も前に発見されて この辺、具体的に頼む。
137 :
デフォルトの名無しさん :2009/01/07(水) 06:15:34
>>128 Cというよりアルゴリズムな気がするが。
・マークと数字をメンバに持つカード構造体を定義する。
・カードが5つの配列で手札変数を作る。
・手札を点数で評価する
で、アルゴリズムは、
1.乱数使って手札作成
2.数字→マークで手札をソートする。
3.まずフラッシュが出来ているか調べ、出来ていたら9点追加。
4.数字を調べる。
ワンペア 3点 スリーカード 7点 ストレート 8点 フォーカード 11点
として、出来ていたセットの点数を合計する。
すると、
ワンペア 3
ツーペア 6
スリーカード 7
ストレート 8
フラッシュ 9
フルハウス 10
フォーカード 11
ストレートフラッシュ 17
になるので、この数字分布を記録すればいい。
ポインタがどうのこうのいう要件はは手札が配列なのでこれを
サブルーチンに渡せばOK。
2,3,4は順番変えたり重複する処理をまとめたりは出来るを思われる。
話がおかしくなっている。VSはVC++以外も含まれているんだが? 誰がVC++のみの話をしているんだ?VC++でもC言語は扱えるが、 VSは包括的なものだろ。だから専用スレに行けって言われるんだよ。
int constとconst intって一緒だっけ?
一緒
さんく〜
必要かどうかもわからないなら、ひとまず不要だということだ。 必要なものは、今すぐ必要だろ。C言語の入門ごときが、 いきなりインターフェースバリバリ、オブジェクト指向とか向いてないから。
143 :
デフォルトの名無しさん :2009/01/07(水) 07:52:26
GNUの寛容なライセンスに付け込んでC++をぱくったんだろ。 VC++はただのパクリコンパイラだよ。 C++と言えば普通はgcc使う。
釣りだか天然だかわからんやつだな どっちにしてもアホだが
145 :
デフォルトの名無しさん :2009/01/07(水) 08:17:42
VC++はコンパイラにエディタをつけただけで激重。 しかも標準規格に適合していない。 エラーでまくりで使い物にならない。
>しかも標準規格に適合していない。 >エラーでまくりで使い物にならない。 この辺り、詳しく。
>>132 C言語のスレでC++の拡張子はスレ違いといいたいだけだよ
148 :
デフォルトの名無しさん :2009/01/07(水) 08:37:03
>>146 GNUに従ってないだろ。
しかもGNUのほぼすべてをコンパイルできないというお粗末さ。
ほとんど犯罪。
149 :
デフォルトの名無しさん :2009/01/07(水) 08:39:48
だいたいM$なんてプログラマの敵だろ。 作ってしまったものは仕方ないとしてもこれから作るものはLinux用に 作るべきなんだって。
なんでキチガイが涌いてんだ?
TRONプロジェクトがアメリカに潰されたからもう日本にソフトウェア産業はアメリカの会社を儲けさせるぐらいしかやることがないんだよ
インクルードガード でも_使い方が・・・・
156 :
デフォルトの名無しさん :2009/01/07(水) 13:53:56
もう嫌だよー
157 :
デフォルトの名無しさん :2009/01/07(水) 14:19:25
#include <stdio.h> void main() { double d = -6880156672.023001; float f = (float)d; printf("f = %f\n", f); printf("d = %f\n", d); } 結果 f = -6880156672.023001 d = -6880156672.023001 何でですか?floatって7桁じゃないの?
7桁なのは精度 表示される桁数じゃないよ
#include <stdio.h> void main() { double d = -6880155555.023001; float f = -6880155555.023001; printf("f = %f\n", f); printf("d = %f\n", d); } 結果 f = -6880155648.000000 d = -6880155555.023001 つまり、floatの有効桁数ってのは、7桁までしか保証しません、 って事なのかな?
>>157 最適化されたから。
VC6なら/Opを付けてコンパイル。
161 :
デフォルトの名無しさん :2009/01/07(水) 15:54:26
3つのファイルを使うプログラムを作りたいんだけど、どっちのほうが処理時間とか考えたら効率いいかな? 方法1 while(){ fp=fopen(… fp2=fopen(… fp3=fopen(… 処理1 処理2 処理3 fclose(fp); fclose(fp2); fclose(fp3); } 方法2 while(){ fp=fopen(… 処理1 fclose(fp); fp=fopen(… 処理2 fclose(fp); fp=fopen(… 処理3 fclose(fp); }
>>161 そんな程度の情報しか出せない奴ならどう作っても効率悪い
fp=fopen(… fp2=fopen(… fp3=fopen(… while(){ 処理1 処理2 処理3 } fclose(fp3); fclose(fp2); fclose(fp);
現在C(とDXライブラリ)でRPGを作っていますが、 複数あるキャラ画像の画像タイトルとファイル名をテキストファイルに、 キャラA:chara_a.bmp キャラB:chara_b.bmp ・・・・ として保存し、Cで読み込んで画像をロードしたいと思っていますが、 やり方がさっぱりわかりません。(画像のロードはわかります) ぜひご教授お願いします。
何がわからんの? テキストファイルを読んでファイル名を抽出して画像読み込み関数に渡す方法?
画像のロードは分かりますが、やり方がわかりません?
>>167 すみません、自分の説明不足でした。
画像のロードのやり方はわかりますが、
テキストファイルを読み込み⇒画像ロード関数に渡すまでの具体的な操作がわからないのです。
そこ読むまでサイズがわからないとか、いつでも使えるように保持とか いろんな条件を追加するとかなり長くなるので、 単純な形にして少しずつ進めるのがいいと思うけどな。 まずはテキストファイルを1行読んで、コロンで分割してファイル名だけを取り出すとこからか?
>>169 なんとなく形が見えてきました。ありがとうございます。
挑戦してみます。
ノシsprintf
問題が発生しました。 int White, strY; White = GetColor( 255, 255, 255 ); char ftitle[64], fname[64]; FILE *fp; if( (fp = fopen("data/picture.txt", "r")) == NULL ) exit(EXIT_FAILURE); while( fscanf(fp, ":", ftitle, fname) != EOF) { strcpy( ftitle, fname ); DrawString( 0, strY, ftitle, White ); strY += 30; } fclose(fp); というコードを実行したのですが、ハンドルされていない例外が発生し実行できません。 いったい何が悪いのでしょうか?
>いったい何が悪いのでしょうか? あんたの頭。
fscanf()のフォーマット文字列がむちゃくちゃだがね。
fscanf(fp, ":", ftitle, fname)は、fscanf(fp, "%[^:]:%s", ftitle, fname) とかやればいいが、fgetsで1行読んでsscanfのがいいかも。 ファイル名は改行あったら消したりしなくちゃならんしな。
2進数を10進数に変換するプログラムを考えています。 #define MAX の値を変更しても、10桁以上の計算が出来ないのですが、どのように修正したら良いでしょうか? intからdoubleに変えてみたのですが、浮動小数点の不正な使用となります。 また、0と1以外の数字が入力された際にエラーを出したいのですが、この判定はどうしたらよいでしょうか? アドバイスお願いします。 #include <stdio.h> #define MAX 10 main() { int x, z[MAX], i, c; int a=1; int b=1; scanf("%d",&x); for(i = 0;i<=MAX-1;i++){ z[i]=((x/a)%10)*b; a*=10; b*=2; } for(i=0;i<=MAX-1;i++){ c += z[i]; } printf("%d\n",c); return 0; }
>>176 整数型は高々10桁程度しか表せないよ。
2進数を無理矢理10進の形で入力させないで文字列として入力させる方がいい。
エラーの検出も文字の方が扱い易いだろうし。
勉強でないなら、strtol()で変換した上にエラーの検出もできるけどね。
>>176 実数の割り算で余りを求めるのは意味がないからじゃないかな。
>>177 の言う通り文字列使うのが近道だと思う。
2つの画像ファイル名、gazou001.cif,gazou002.cifをつけようとして、 int makeFileName(char *filename, char *basename, int num, char *magic) { sprintf(filename, "%s00%d%s", basename, num, magic); return 0; } void main{ char *filename1; char *filename2; char *basename="gazou"; char *magic=".cif"; int num=1; int numnext=2; makeFileName(filename1,basename,num,magic); makeFileName(filename2,basename,nextnum,magic); return 0; } としたのですが、セグメントエラーとなり上手くいきません。 どうすればいいでしょうか?
filename1,filename2の領域を確保する
%03dの方がよさそうな気配。
>>177-178 とりあえずchar型として入力する部分だけ考えてみたのですが、上手く動いてくれません。
何を入力しても、白紙で出力されます。
今回の改善ポイントをお願いします
#include <stdio.h>
main()
{
char c, s[100];
int i;
for(i = 0; i < 100; i++){
scanf("%c", &c);
if ( c == '\n'){
s[i] = '\0';
break;
}
else if(c==0 || c==1){
s[i] = c;
}
else
s[i] = '\0';
break;
}
printf("数列は「%s」\n", s);
return 0;
}
else if の所の処理が走っているかprintfデバッグしてみたら
else if(c=='0' || c=='1'){ s[i]=c-'0'; }
つうか一回目で必ずbreakが実行されるじゃないか。。
>>183 >printfデバッグしてみたら
kwsk
else if(c=='0' || c=='1'){ s[i]=c-'0'; } else {//追加? s[i] = '\0'; break; }//追加? こう?
>>184 ,187
s[i]=c-'0';
とすると上手く行かないようです。
s[i]=c;でうまくいきました。
189 :
176 :2009/01/07(水) 23:00:43
linux で、パイプをつかってあるプロセスの標準出力を ファイルへのリダイレクトと別のプロセスへの標準入力両方につなげたいんですが どうしたらいいんでしょうか pipe とか dup って一対一でつなぐ方法しか見つからなくて・・・
z[i]=(s[i]-'0')*b; でも、99も回したら、intの上限が…
193 :
176 :2009/01/07(水) 23:13:04
>>191 変更して実行してみたのですが・・・・
C:\c>test
10010
数列は'10010'
-108
C:\c>test
01
数列は'01'
56
C:\c>test
1
数列は'1'
^C
1を入力すると無限ループになるのか結果が出てきません。
>>193 他にもいろいろ間違ってるけど、とりあえず
- for(i=count-1;i<=0;i--){
+ for(i=count-1;i>=0;i--){
で一応動くかな
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
196 :
176 :2009/01/07(水) 23:29:10
char c,s[100],z[100] = {0}; これ試してみて
と思ったらc=0も足りなかったなあ c = 0; for(i=0;i<count;i++){ c += z[i]; }
結果入れてるcがcharなのが変?
>>198 111111までは実際の10進数+10が出力
それ以上は負数が出力されてしまいます。
なんて親切なんだ昔の2ちゃんねらーはこうじゃなかったはずだ
それも時の流れ
unsigned int z; z=0; for(i=count-1;i>=0;i--){ z*=2; z+=(s[i]-'0'); } printf("%d\n",z);
>>192 ありがとうございます
これのソースを参考にしたらなんとかなりそうです
205 :
197 :2009/01/07(水) 23:53:54
>>200 cがcharなので8bit以上のは無理(というか負数になる)として
>>196-198 までまとめたのをこちらで走らせたら7bitで127が出力された。
+10ってのが気になる。
206 :
176 :2009/01/08(木) 00:07:56
zがcharだからだよ。もうちょいだね。
>>203 できました^^
最後まで付き合ってくださったみなさん、ありがとうございました!
例えば、このプログラムでendと入力しない限りループし続けるようにするには、どう変更すれば良いでしょうか? if文でxかyにendが入力されるとbreakすれば良いのだと思いますが、 printfからscanfに戻ってくるにはどうすればいいかわかりません。 #include <stdio.h> main() { int x, y, ans; scanf("%d %d", &x, &y); ans = x + y; printf("%d + %d = %d \n", x, y, ans); return 0; }
以下のfunc_name()をname[]という配列を使って、 実行する方法を教えてください。 void func_name(void) { printf("Hellow func\n"); } int main(int ac, char *av[]) { char name[] = "func_name"; return 0; }
>>210 gets(buf)で文字列として入力させて、end文字列の判定、
endでなければ、
sscanf(buf,"%d %d", &x, &y);
とか?
ループはwhileかforを使う。
>>211 配列というのがわからないけど、関数ポインタを使う。
void (*name)(void);
name=func_name;
(*name)();
かな?
>>211 関数名の文字列から関数を直接呼び出すことは、C言語ではできない。
文字列が"func_name"と一致すれば呼び出すという条件分岐を書けばできる。
#include <stdio.h> void func_name(void) { printf("hello func\n"); } main() { void (*name[1])(void); name[0] = func_name; (*name)(); return 0; } ~
#include <stdio.h> void func_name(void) { printf("hello func\n"); } main() { void (*name[1])(void); name[0] = func_name; (*name[0])(); return 0; } 2chの書き込みでタブを挿入するのってどうやるの
char型はcharacter型の略だから"チャラ"でなく"キャラ"と読むべきだと主張するやつにはint型はinteger型の略だから"イント"でなく"インテ"と読むのかと問い詰めたい
チャーでもキャラでも好きな方を呼べばいいと思うけど、チャラは初めて聞いた なんかちょっと前に似たような話題があった気がするけどどこのスレだったかな
大体あってればどっちでもいいだろ
>>217 できない、全角スペースを使え
は使えたかな
使えた<
あるデータがあるとしてそれの分布を求めるにはどうすればいいですか?
あるデータがあるとしてそれの分布を求めればいいよ
「それの分布」とは?ヒストグラムのことかな?
228 :
デフォルトの名無しさん :2009/01/08(木) 05:20:40
2つ質問なんですが、 ポインタの場合、相手変数のアドレスを格納する為の ポインタ変数のアドレスと、相手変数のアドレスの 2つのアドレスがありますよね? もう一つは、 char *cstr = ゙abc゙; では、*cstr(ポインタ変数)ばabc゙のアドレスが 入っていると考えて、宜しいでしょうか?
゙abc゙ "abc"
231 :
デフォルトの名無しさん :2009/01/08(木) 05:34:49
>>231 ・一つ入力する関数を作る。
・桁数カウント用変数を毎回0にする。
お好きな方を。
あーそうそう、インデントは正しく、ifなどは慣れないうちは必ず{}で括りましょう。
>>228 ポインタ変数に相手変数と言う概念はありません。
*chrはポインタ変数ではありません。chrがポインタ変数です。
234 :
デフォルトの名無しさん :2009/01/08(木) 06:03:18
>>323 ・桁数カウント用変数を毎回0にする。
これを利用したいのですが 詳しくお願いします。
>>234 あんたはそれを一回しか0にしてないじゃないか。
それを毎回やるようにするだけだよ。
# そう言われて判らないなら諦めな。
236 :
デフォルトの名無しさん :2009/01/08(木) 06:34:00
>>235 できました。
改行のみでエラーにしていますが、そのプログラムでは上手くいきません。
if(s[0] == '\0') でも上手くいけませんでした。 ご教授ねがいます
改行文字をチェックしているのはどこ? そこは適切?
#を書いている奴は、いまいち信用ならねぇ。っつか意味も無くきめぇ。
今時のコメントは//ですよね # わかります
>>228 前半が意味不明だが、意味不明だということはきっと君が間違えて覚えているのだろう
ポインタ変数はポインタの値を格納する変数で、
ポインタの値は何らかのオブジェクトか関数を指しているか、あるいは何も指していない(NULL)
ポインタ変数自体を指すポインタ値はこの件とはまったく関係ない
while ((c = getchar()) != '\n') {
EOF
ナンバーサイン野郎は、EOFは読み込めないんだってさw
>>241 の続き
if (!isdigit(c) || (j == 0 && c == '\n') ) {
yaccとlex使え。
そんなの使うほうがこの場合効率悪そうな
247 :
デフォルトの名無しさん :2009/01/08(木) 18:09:01
>>238 全角で書くな莫迦
全角で書いている奴が信用ならないと言いたいのだろう。
明日までにレポートを自動生成してくれるプログラムをCで書きたいんですがどうすればいいんですか?
247 名前:デフォルトの名無しさん 投稿日:2009/01/08(木) 18:09:01 >>238 全角で書くな莫迦
>>249 #include <unistd.h>
int main(void)
{
while (1) {
fork();
}
return 0;
}
252 :
デフォルトの名無しさん :2009/01/08(木) 19:10:43
ヒント:知性の低い本当のバカほど、罵詈雑言を当たり前のように使う 自分の言動を第三者の目で見てみな。滑稽で恥ずかしくなるだろうからw
253 :
デフォルトの名無しさん :2009/01/08(木) 19:18:03
>>249 無限の猿定理を応用すればこれでレポート書くことが可能なはず!
#include <stdio.h>
#include <stdlib.h>
int main(void) {
while(1)
putchar(rand()&255);
return 0;
}
おまいを複製するプログラム書いたほうがはやいな。 そうするとどのみちレポート書けないのかw
受け取った文字列sが"nanasi;"となってるとして末尾の';'だけ取り去った文字列にしたいのですが 以下のプログラムだと変な文字が残ってて上手くいきません。どなたかご教授を void cut_st(char *s){ int x; char cut1[99]; char cpy1[99]; strcpy(cut1,s); x=strlen(s); x=x-1; printf(" x is %d \n",x); for(j=0;j<x;j++) { cpy1[j]=cut1[j]; } cpy1[j]='\n'; strcpy(cpy1[j],cpy1[j]); printf("cpy1 is %s \n",cpy1); }
ヒント:知性の低い本当のバカほど、罵詈雑言を当たり前のように使う 自分の言動を第三者の目で見てみな。滑稽で恥ずかしくなるだろうからw
>>256 strcpyやprintfとかは'\0'までを文字列と認識する。
cpy1[j]='\n';→cpy1[j]='\0';
cpy1[j]=0; //strcpy(cpy1[j],cpy1[j]);
ありがとうございます! っていうか超初歩的な勘違いでした...orz
ちょっと気になったんで
便乗質問です。
>>258 さんの
cpy1[j]='¥0';
と
>>259 さんの
cpy1[j]=0;
ってのは同じ意味ですか?
263 :
デフォルトの名無しさん :2009/01/08(木) 22:14:54
while (1) { c = getchar(); if (c == '\n') { if( j==0) { printf("改行のみError!!"); return 1; } break; }
265 :
デフォルトの名無しさん :2009/01/08(木) 22:34:15
whileで回してるところにTABを入れると見やすくなるよ。
何処に書いて良いか分からなかったので一番上だったここに書き込みます。 最適な場所があれば誘導お願いします。 質問内容 自作したアプリをVistaにインストールする時にファイアウォールの例外登録を同時に行いたいのですが、 なにか良い方法はないでしょうか? インストールは一般的なインストーラ(EXEpressを予定)を使おうと考えています。 単純に考えると例外登録するバッチファイルを作って置いて、 このバッチファイルをインストーラから起動すれば良いのかなと思っています。 そこで・・・ 1,コマンドから例外登録する方法 2,例外登録を設定できるインストーラがあるよ。 3,もっと良い方法があればその方法 なんかをアドバイス頂けると助かります。
>>267 スレ違い。先ずは板トップをよく読みましょう。
>>256 果てしなく無駄なことしているな。
これで充分じゃね?
void cut_st(char *s){
char cpy1[99];
sprintf(cpy1, "%.*s", strlen(s) - 1, s);
}
もう少し安全サイドに振るならこんなもんか。
void cut_st(char const * s)
{
char cpy1[99];
unsigned len = strlen(s) - 1;
sprintf(cpy1, "%.*s", len < sizeof(cpy1) ? len : sizeof(cpy1) - 1, s);
}
strlenに0返されたら、どうなるの?
気になるなら例外処理しておけば?
というか strncpy や strlcpy を使えよ
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
275 :
デフォルトの名無しさん :2009/01/09(金) 11:57:20
strtokを使う荒技もあるな
>>270 × unsigned len
○ size_t len
277 :
デフォルトの名無しさん :2009/01/09(金) 12:46:01
Cについての質問です CSVファイルをカンマ区切りで読み込みたいのですがやり方を教えてくれませんか? 今までVBAしかやっていなくて混乱しています
>>276 size_tだと64bit環境で64bitintだったりするんだもんよ。
>>277 先ず、fgets()で1行ごと切り出す。
数値だけならstrtol(), strtod()で切り出すループ。
文字列がある場合はダブルコーテーションで括られていない保障があるならsscanf()で%[^,]を使って切り出す。
ダブルコーテーションで括られているなら、セルの途中で改行している可能性もあるので1文字ずつパースするしか。
>>278 関数の定義が
size_t strlen(const char *s);
だと言いたいんだと思う
>>278 size_t strlen(const char*);
なわけだが。
そんなことは百も承知でunsignedなんだが。 寧ろ>276はunsignedを超えるサイズだったらどうするんだという夢語りをしたいのだと思った。
283 :
281 :2009/01/09(金) 12:57:49
>>278 size_tは常にunsignedじゃなかったか?
普通は typedef unsigned int size_t になってる
287 :
デフォルトの名無しさん :2009/01/09(金) 13:19:47
>>279 ぼんやりとですが、多少見えました。
ありがとうございます
>>282 お前みたいな奴が time_t を unsigned に突っ込むんだろうな。
289 :
デフォルトの名無しさん :2009/01/09(金) 14:00:19
>>277 ですが
#include(stdio.h)
#define Row_Max 120
#define Line_Max 16
int main(void){
FILE *fp;
char buff[256];
int dt[Row_Max][Line_Max];
//ファイルオープン//
if((fp = fopen("impcsvfil.csv","r")) == NULL){
printf("ERR\n");
exit(1);
}
while(fgets(buff,256,fp) != NULL){
このあと、どうstrtol()を使えばいいですか?
カンマ区切りで配列割り振られるかわかりません
290 :
デフォルトの名無しさん :2009/01/09(金) 14:03:03
質問します。 あるかどうか分らないのですが、 プログラム実行中にある条件(a>0など)を受け取って プログラム自体をリセットして最初から実行する処理の記述は 何かありませんか?
>>291 if (a>0)
{system(argv[0]); exit(0);}
的な?
「条件の受け取って」の部分をどうやって実装するつもりなんでしょ。
シグナルとかイベントとか
ないんじゃない? リセットって一般には難しいけど longjmp()なら近しいかもしんない
そのプログラムを無限に実行させるプログラムを書く。 実行させるプログラムは普通に終了すれば、また、起動される。
>>291 mainを呼ぶとか。リスタートしたかどうかや受け渡しにはstatic使って
自動変数使う部分はブロックで囲んでリセット部分をその外に書くなりで。
execシステムコール使えばどう?
>>291 別プロセスにするのが一番確実
シェルスクリプトを書くのがいいんじゃない?
298 :
291 :2009/01/09(金) 16:53:10
>>292-297 回答ありがとうございます。
今から勉強すると別プロセスからのものになりそうですが
まずはそれから挑戦してみます。
ありがとうございました。
>>289 > #include <stdio.h>
#include <string.h>
#include <stdlib.h>
> #define Row_Max 120
> #define Line_Max 16
>
> int main(void){
>
> FILE *fp;
> char buff[256];
char *dDlim = " ,\n",*endp,*token = NULL;
> int dt[Row_Max][Line_Max]={0};
int i=0,j=0;
>
> ・・・・・・・・・
>
while(fgets(buff,256,fp) != NULL){ j=0;
if(token = strtok(buff,gDlim)){
do{dt[i][j] = (int)strtol(token,&endp,10); j++;}while(token = strtok(NULL,gDlim));
}i++;};
>>289 ×#include(stdio.h)
○#include <stdio.h>
strtolは、たとえばchar buffer[]にfgetsで行を読んだとして、こういう風に使う
char *start=buffer, next;
val[0] = strtol(start, &next, 10); start=next+1;
val[1] = strtol(start, &next, 10); start=next+1;
:
実際には、strtolで読んだ後にstartとnextの値の差や
nextの指している文字をチェックしてエラーを検査するのがいい
たとえば異常フィールドがあったら終了するならif(start == next) exit(1);とする
あと、longに納まりきらない値だった場合などのエラーを検出するにはerrnoを使う
それとこのスレでは
>
>>277 ですが
じゃなくて名前欄に277と入れること
>>299 それだと空フィールドとかあったら無条件に飛ばしちゃうじゃないか
strtokはCSV解析にはむいてないんよ
302 :
300 :2009/01/09(金) 18:40:27
うわ間違った char *start=buffer, *next;
独習Cでコマンドライン引数について勉強中なのですが、 下のプログラムに引数渡す方法が分からないです。 #include <stdio.h> int main(int argc, char *argv[]) { int i; for(i = 1 ;i < argc; i++) printf("%s ",argv[i]); return 0; } 「DOSプロンプトの表示された状態で実行する必要有り」という注意書きがあるのですが、 コマンドプロンプトはほとんど使ったことがなくて、何をやったらいいのか分かりません・・・。
304 :
デフォルトの名無しさん :2009/01/09(金) 21:15:46
毒臭やめて他の入門書にすれば?
>>303 コマンドプロンプトの使い方の話?
build(コンパイル、リンク)するとexeファイルが出来る
→コマンドプロンプトを起動。(プログラム→アクセサリ→コマンドプロンプトetc)
→コマンドライン( > の右側)にexeファイル名を入力してリターン
例:exeファイルの名前が c:\test\debug\test.exe なら
>c:\test\debug\test
とか
>c:\test\debug\test 1 2 3 4 5 6 7 8 9
とか、そんな感じ。(1 2 3...の部分が引数になる)
306 :
デフォルトの名無しさん :2009/01/09(金) 21:20:45
VC なら Debug フォルダとか出てくるだろ そういうとこスルーして「DOSプロンプト」の一言で放り出すような ひどい本は疑ってかかったほうがいい
>>303 使っている OS が WindowsXP なら
[スタートメニュー]-[ファイル名を指定して実行]
これでタイトルに「ファイル名を指定して実行」とあるウインドウができる
そのテキストボックスに
cmd
と入力して [Enter] キーを押せばおk
初心者の質問なんですが ポインタの宣言で int* a; int *a; どちらが正しいのでしょうか いつもいつもすいません
309 :
デフォルトの名無しさん :2009/01/09(金) 21:38:27
便乗で質問 aをint型へのポインタ、bをint型として宣言したい時 int *a, b; ってできるの?
できるよ
319じゃないよ。314だ・・・
ちがう・・・ 313あて
>>295 それはスタックがやべぇことにならんか?
exec シスコが無難だろ。
日本語の読めない俺に、 Manpage of PRINTFにのっているaqの意味を教えて下さい。
文脈からするとaq='(single quote)だな。
>>320 なんですか、single quoteって?
lispにでてくる'()みたいに値の評価をしないってやつですか?
>>321 それです。
ああ、今さら理解しそうです。1,000,000,000ってことか。
>>322 それですって・・・
Manpage of PRINTFの記述そのまんまじゃないか
>>321 は
原文
http://linux.die.net/man/3/printf > '
> For decimal conversion (i, d, u, f, F, g, G) the output is to be grouped
> with thousands' grouping characters if the locale information indicates any.
> Note that many versions of gcc(1) cannot parse this option and will issue a warning.
> SUSv2 does not include %'F.
和訳
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html > aq
> 10進数変換 (i, d, u, f, F, g, G) において、ロケール情報に指定があれば 1000 単位の
> 区切り文字を出力する。 gcc(1) の多くのバージョンは、このオプションを解釈すること
> ができず、警告を出力することに注意せよ。 %aqF は SUSv2 には含まれていない。
aqはシングルクオート(’)のこと。
なんでaqなのかは不明
フラグの'の意味は
>>322 のとおり
printf("%'d", 1000000)で1,000,000と表示される。
環境によるらしいが。
327 :
303 :2009/01/10(土) 01:00:23
レスを返してくださった皆様ありがとうございました。 おかげさまで、正しくプログラムを機能させることができました! 今日一日ずっとそれで頭を悩ませていたので、本当に助かりました。 独習Cで学習を進めることに、今のところあまり不満はないのですが、 これからは詰まったら他の参考書も手にとって見るようにしてみます。
>>306 つか、最近はコマンドプロンプトも知らずにプログラム始めるのか
その前にPCを知れといいたい
最近は統合環境から入る人が多いからじゃないの?
コマンドプロンプトより tcsh や bash の方がいいもん!
とりあえずコマンドプロンプトはCの範疇じゃないからCの本で扱ってなくてもまったくおかしくは無い
332 :
332 :2009/01/10(土) 03:27:01
画像をネガポジ反転したいのですが、プログラムがわかりません 教えていただけないでしょうか?
>>332 各ピクセル(モノクロ画像なら1つ、カラー画像ならRGBの3つ)の値を取り出せるところ
まで到達しているなら、後は計算するだけ。単純なネガポジ反転は、各ピクセルの値を
最大値(8ビット階調なら255)から減算した値で置換する。
(ピクセルの値をPixel とすると、Pixel=255-Pixel のような計算)
JPGやBMP等、画像ファイルの状態から各ピクセルの値を取り出す話となると
少し複雑&長い話になる。どこから始めたいの?
根本的な話になるのですが入門書を見ても書いていなかったので質問です。 変数の宣言位置はずっと関数の先頭が望ましいと思っていた(勘違い?)のですが、 ブロックの先頭で宣言しても問題ないのでしょうか?
>>334 問題ない。
つーか、経験的に変数のスコープは、なるべく短くした方が
あとでメンテが楽になるので、俺はそうする。
>>334 問題ない。ただしその有効範囲はブロック内のみ。
>>335 ,336
ありがとうございます。
自分の勘違いでしたか…
Pascalから入ったのか
大丈夫、C++でさえ関数の先頭で宣言すべきと主張する馬鹿もいる。 つーか、一部のコンパイラを除いてc99に対応しているんだから 必要な場所で初期化付きで定義すべきだろ。
340 :
デフォルトの名無しさん :2009/01/10(土) 06:07:46
数値を入力したら、終了
C言語を使い始めて約20年・・・。
>>339 の発言を見て初めてC99なるものが存在することを知った俺がいる
マイクロソフトのVCが未だにC99に対応していないからね C89=ANSI-Cのときとはわけが違う
ちょっとお聞きしたいのですが、 #include<stdio.h> void main(void) { printf("Hello World\n"); } と書いてコンパイルしたら インクルードファイル ’stdio.h’をオープンできない って出て Hello Worldってでない、、、 ちゃんとBorlandもダウンロードしたしcd設定もしたんだけど、 何が悪いのかな?
>>343 無償版の Borland C++ 5.5.1 のことかな?
--------------------------------------------------
2. インストール先の bin ディレクトリで次の手順を実行します。
a. 既存のパスに "c:\Borland\Bcc55\bin" を追加します。
b. bcc32.cfg ファイルを作成します。このファイルは,Include
および Lib パスのコンパイラオプション(コンパイラの -I
および -L スイッチ)を設定するものです。ファイルには次の
行を含めてください。
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
c. ilink32.cfg ファイルを作成します。このファイルは,Lib
パスのリンカオプションを設定するものです。ファイルには
次の行を含めてください。
-L"c:\Borland\Bcc55\lib"
--------------------------------------------------
↑のcfgファイルがbinディレクトリ内に無い、あるいは内容が間違ってるとか。
少し古いバージョンだと、パスの途中に "Program Files" のような空白文字が
あるディレクトリがあるとダメだったような記憶が・・・(かなりうる覚え)。
C:\Borland のように、パスの途中に空白文字が無い場所に BCCディレクトリを
移動してリトライしてみるといいかも。
>>344 そうやってみたらこんど
’Bcc32’は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。って出た
すみません 自己解決しました。 初歩的なことをやり忘れてました。 お騒がせしてすみません。
>>345 PATHが通っていない
a. 既存のパスに "c:\Borland\Bcc55\bin" を追加します。
fgetsは処理ごとにメモリが動くので、一様な使い方ができません。 どのように切り抜けるか知っていますか。下記例。 #include<stdio.h> int main(){ FILE *fp; char a[256]; char *b[4]; char *c,*d; int i; if((fp=fopen("address.dat","r"))==NULL)exit(1); c=fgets(a,256,fp); printf("%s",c); d=fgets(a,256,fp); printf("%s",d); fclose(fp); } これを c=fgets(a,256,fp); d=fgets(a,256,fp); printf("%s",d); printf("%s",c); のような順序にすると同じ値が出てしまいます。(1行目が消えて、ファイルの2行目の出力になる)
349 :
デフォルトの名無しさん :2009/01/10(土) 09:19:20
>>348 おなじ領域(a[256])に読み込んでいるんだから
上書きされて当然。
>>348 char a[256];
char b[256];
として
fgets(a,256,fp);
fgets(b,256,fp);
printf("%s",a);
printf("%s",b);
とか、そうゆうこと?
IPAの岡田のメールのコピペだな
354 :
デフォルトの名無しさん :2009/01/10(土) 10:18:08
『'引数' : 'double' から 'int' への変換です。データが失われる可能性があります。』っていう警告が出ます。 『setH(Temp);』が原因らしいんですがよくわかりません。 誰か教えてください。
↓エスパー登場
>>354 「縮小変換」、あるいは「狭化変換」でウェブ検索しろ
問題あるか無いかは場合による
>>354 データが失われてもいいんなら無視
警告消したいならキャストすれば警告は出ない
358 :
C初心者 :2009/01/10(土) 13:51:53
基本的な質問ですみません。Cはjava等の代わりにホームページで 使えるのでしょうか。
JAVAのような使い方は無理。
360 :
C初心者 :2009/01/10(土) 13:57:44
>>359 たびたびすみません。JAVAのような使い方以外に、ホームページで
活用できませんか?
その前に、HTMLなどブラウザで表示するウェブページがどういったものに対応しているか? Javaはページの中に組み込めるが、それでも元は単体で孤立している。 C言語が何を作るものとして使われているか? あと、Javaが仮想マシンを介している仕組みも考慮すれば、実行プログラムが OSなどで互換性がない場合と比べて、その使われ方に違いが出るわけだが。
362 :
C初心者 :2009/01/10(土) 14:08:48
>>361 ありがとうございます。勉強になりました。
>>360 1) Active-X。
2) プラグインを作って配布。
Cは君が思いつくものほぼ全てのことができると思ってよいが、 モノによっては想像を絶する労力を必要とすることがよくあるのでマゾに超オススメ Cはホームページには向かない
>>360 javaとjavascriptの区別はついてるよな?
javascriptのような使い方は無理。
javaのようにwebアプリを書くのはできないことはないけど、
普通はやらない。
>>360 CGI を C で書くことは可能。
サーバによっては拡張モジュールも書ける。
あるいはサーバそのものも書ける。
そのようにサーバ側で動くプログラムは C で書くのは不自然ではない。
(が、今となってはそういう機会はそれほどない)
ActiveX のようにクライアント側で動くものを作ることもできるけど、
クライアント側の環境が制限されるし、COM がややこしい。
せめて C++ でなければ実質的には使い物にならない。
>>363 CGIとJavaの使われ方が違うわけだが。何か処理をするプログラムが作れるか?というなら
どちらも可能。生成された実行プログラムがどう使われるか?とは話は別だし。
うん 別に同じだなんて言わなかったんだけどね
CGIにまで話を及ばせると、もうサーバー管理にまで話が関与してくるぞ。 ユーザに用意したものではなく、個人で作ったCGIを使わせてくれるサービスもあるが、 下手すれば被害を大きくするから、余程のことが無い限り使わせないし。 Javaとは次元が違いすぎる。
クライアント側が受信したものをローカルPCで実行するのと、CGIみたいに サーバーが処理するのとでは、もう個人がホームページに導入するのと 随分と使い勝手が違ってくる。これ以上は初心者に入れ知恵しても無駄だろ。
勝手にJSPとかを想像した俺は異端であったか
Javaといえば鯖側がメインだしな
float f0, f1, f2, f3, f4, f5; float fAve = ( f0 + f1 + f2 + f3 + f4 + f5 ) / 6.0f; とした結果と、括弧内の足し算の順番を変えたものの結果がほんのわずかに異なるときが あるのですが、これはなぜなのでしょうか??
まぁ実用的には、doubleで充分なことが多いしdoubleを使うべきケースではあるな。 >377の言う「ほんのわずか」はどうせprintf()で"%f"を使った結果だろう。 どうせなら、"%.20g"で較べてみろ。
380 :
377 :2009/01/10(土) 15:11:21
>>378 なるほど。
>>379 たしかにぜんぜん問題になるような違いではないのですが、
ちょっと気になったのでお聞きしてみました。
計算結果は法線情報としてGPUに渡して立体モデルを描写させているのですが、
960×960規模の画面内でわずか数ピクセルほど、わずかに値が違う色として出力されて気付きました。
勉強になりました。
ありがとうございました。
>>380 周辺の式がどうなっているか判らないからなんとも言えないけれど、double幅で計算すればいいんじゃないの?
全部floatにすることで並列化を狙っていたり変換時間を節約しているのなら失敬。
382 :
377 :2009/01/10(土) 15:35:36
>>381 ありがとうございます。
この精度で描画品質は十分で、描画速度が良いに越したことはないのでfloatでいこうと思います。
速度を語るなら両方の速度を実測してみてからだ
char型の変数に任意の8bitのビットイメージを16進リテラルで代入するときの やり方ってどうなるの? 例えば単純に、 char hoge = (char)0x88; とやってもどのコンパイラでも正しく10001000bのビットイメージになると期待していいんだろうか? 切捨てして0x7Fにしちゃうコンパイラとかあったりしない?
>>384 BCC、VC、gccではリテラルが変数型の範囲を超えてても飽和処理はしない。
char型に0x88ならそのまま、0x788なんてしても下位1バイトだけが代入されて0x88になる。
IF文を使い、char型の変数cに入れた値が0〜1・a〜fの場合は処理を続行。 それ以外の場合終了 という処理を行いたいのですが、 if(c=='0'|| ・・・・c=='9'||c=='a'||・・・・c=='f'c=='A'||・・・・)と書き並べる以外の方法はありませんか? 1行がとても長くなるので、このような書き方はしたくないです。
isxdigit
x 0〜1,a〜fの場合 o 0〜1,A〜F,a〜fの場合
1秒に1回、"Hello"という文字列を出力したいのですが 実行間隔の指定ができる関数を教えてください。。。 環境はLinuxです
>>389 そんな関数があるんですね。ありがとうございます。
こんな便利な関数があれば10進から16進に変換するプログラムは簡単に作れると思ったら、
思った以上に苦戦しています。
頑張って考えてみます
>>391 #include <unistd.h>
unsigned int
sleep(unsigned int seconds);
sleepだとだんだんずれていきます
>>392 10進から16進じゃなくて
16進から10進じゃないの
文字列を数字にしたいだけでしょ。
strtol使えばいいのに
勉強のために自分でやってみることは有意義だ
>>394 gettimeofdayとdifftimeでやってみたら
>>394 usleep とか nanosleep は?
typedefで任意のbit長の型を作りたいのですができますか? 5bitサイズの型とかが欲しいのです
ビットフィールド
typedef は無理やねえ
>>402 ちなみにビットフィールドを使ってもどうせアラインメントをまたぐことはできないので
5ビット整数の配列なんてものを実装したいなら素直にビット演算でどうにかすること
>>403 ,404,406
ありがとうございます。
やはり、ビット演算ですね
>>401 sleepと名のつく関数はどれも、「最低止まる時間」をしているので
根本的にだんだんずれていく性質を持っている。
リアルタイムOSでなければシステム自体が根本的にいい加減。 と言ってもられないんだけど。マルチメディア系では
settimer や sleep の精度で我慢できないなら、タイマー値をポーリング するしか思い付かないなぁ。え、CPU負荷?知らない、そんなの(コラ time_t t1,t2; t1=time(NULL); while(1) { if(t1!=(t2=time(NULL))) { printf("Hello\n"); t1=t2; } }
usleep で遅れた分だけ引けばいいんじゃない?
まぁそれが普通だよな clock() とかと組み合わせて、
while(1){ t=time(); hoge(); fuga(); sleep(d+t-time()); } こんな感じですか?分かりません><
#include<stdio.h> /* 配列の中の指定された数値を数える関数 */ int count(int number,int array[100],int length); /********************************************* *count -- 配列の中の指定された数値を数える * * * *パラメータ * * number -- 数える数値 * * array[] -- 対象配列 * * length -- 配列の要素数 * * * *戻り値 -- 指定された数値の個数 * * * *********************************************/ int count(int number,int array[100],int length){ int rcount = 0; /*再帰の終点を決める*/ if(length == 0){ return(0); } if(number == array[length]){ ++rcount; } /*再帰*/ return(rcount + count(number,array,length-1)); }
int main(){
int data[100];
int num;
int youso;
int i;
printf("要素数を入力:");
scanf("%d",&youso);
printf("data[0~%d]入力:\n",(youso-1));
/*配列の各要素に数値入力*/
for(i=0;i<youso;++i){
scanf("%d",&data[i]);
}
printf("数える数値を入力:");
scanf("%d",&num);
/*戻り値をそのまま出力*/
printf("%dの数は%dつ\n",num,count(num,data,youso));
return(0);
}
>>419-420 上記のコードで、動作はちゃんとするのですが、
return(rcount + count(number,array,length-1));
のarrayの部分を、array[100]などにしてしまうとエラーが出ます。
なぜ中括弧を書くといけないのでしょう?
よく読んでないけど 受け取る側が、arrayへのポインタを受け取るようになっているから。 array[100]と書いてあるのに何故ポインタなのかは、C FAQ でも読んで勉強してね。 で、そこにarrayを渡すとちゃんとポインタが渡されるけど array[100]を渡すと、配列内の100番目の要素が渡されることになるから。 だと思うよ。
>>421 なるほど!よくわかりました。ありがとうございます。
423 :
デフォルトの名無しさん :2009/01/11(日) 12:27:52
*.c から *.h を生成するようなツールってきっといくつもあると思うんですけど、 どれかおすすめのがあれば教えてください。 あとおすすめした理由もあればお願いします。
自力で作る
普通は *.h から *.c を作る
gccもVCもコンパイラオプションでヘッダ作るってのがあったはず。 ごちゃごちゃ新しく何かをインストールする必要がないという点でお勧めする。
gccにそんな機能ってあったけ?
-h
gcc: unrecognized option '-h'
"D:\\outdata.csv"
432 :
430 :2009/01/11(日) 14:15:56
>431 修正してみましたが、うまくいきませんでした。 デバッガでは 下記のコードでもエラーが出ています。 void saveTrackStatusErrorGraytoFile(trackedPointAndStatus **tracked_points,int ch_num,int feature_point_num,char *filehead){ int i , j , k , l ; FILE *out; trackedPointAndStatus tp; char *outputfilename; char ofn[MAX_FILENAME_LENGTH]; sprintf(ofn,"%s_outdata_.csv",filehead); out = fopen(ofn,"w"); fclose(out); return ; } filehead の値 filehead 0x01d4b158 "D:\\experiments\eval-data\Army\frame" char * となっています。 よろしくお願いします
char *filehead="D:\\experiments\\eval-data\\Army\\frame_outdata_.csv"; out = fopen(filehead,"w");
int x; これのアドレスを関数funcに渡し、 func( &x ); この関数内で *px++; とするとインクリメントされず、変な値がxに入りました。 *px = *px + 1; とすると大丈夫なのですが、上記二つはなぜ違うのでしょうか?
435 :
430 :2009/01/11(日) 14:39:08
char *filehead_t="D:\\experiments\\eval-data\\Army\\frame_outdata_.csv"; out = fopen(filehead_t,"w"); // out = fopen("test.csv","w"); // printf("out stat %d\n",(int)out); fclose(out); return ; で実験してみましたが、やはりNULLが帰ってきました。
*(px++);
>>435 csvファイルにリードオンリー属性がついてるとか。
439 :
435 :2009/01/11(日) 14:48:39
>437 フォルダのアクセス権限を確認しました。 Everyoneにフルアクセスの許可があります。 が、csvファイル自体が生成されませんでした。 下記のようにmain関数にすると、ファイルが生成されるのですが… mainでファイルのfopenができるけど、 他の関数ではできないです。 int main(){ FILE *out; char *filehead_t="D:\\experiments\\eval-data\\Army\\frame_outdata_.csv"; out = fopen(filehead_t,"w"); fclose(out); return 0; }
printf("%s\n",filehead_t); してみたら
改造したというソースをもう一度全部貼れ
main()でできるけど、ほかの関数だとできないってことがあるのだろうか。 引数の渡し方をミスってるとか?
errno = 24でした コード中にpng画像( 584x388 ) のデータを7枚分ほど読み込んでいたのが原因のような気がします。 しばらく修正作業に入ります。ありがとうございました。
まあメモリ破壊が一番疑わしいわな
446 :
435 :2009/01/11(日) 15:42:18
セーブできました!ありがとうございました!
447 :
434 :2009/01/11(日) 16:23:25
int data[2][4]; このとき data = *data = data[0] = &data[0][0] だとあるのですが、アドレス的に言えば、ですよね? data + 1 = data[1] *data + 1 = &data[0][1] とあるのだから、厳密に言えば data[0][0]はint型 data=data[0]はint*[4]型 *data=*(data[0])はint*型 ではないのですか? また、間接参照演算子*はポインタが指すメモリの値を指すようにするんですよね? 何で*dataはint*型になるのですか?
>>449 > data = *data = data[0] = &data[0][0]
これが間違ってるから後も間違ってる
>>450 は無しで ><
>data=data[0]はint*[4]型
>*data=*(data[0])はint*型
これが違う
sizeof で調べてみるとか
>>449 data + y はintダブルポインタ。
*(data + y) は data[y] に相当、data[y] はintポインタ。
data[y] + x は intポインタ + 整数、だから結果はintポインタのままで &data[y][x] になる。
*(data[y] + x) としたらintポインタの中身だから data[y][x] になる。
>>452 そんなに悩むことか?
&A[x]はA+xと同じ。
Aにdata[y](これは*(data+y)と同じ)を当てはめれば終了。
C言語の試験受けようと思ってるものですが、 練習問題とか載ってるサイトとかありませんかね?
ポインタへのポインタをダブルポインタなんて言いかたするのはやめなさい
457 :
デフォルトの名無しさん :2009/01/12(月) 16:19:12
>>449 配列の配列というものと、配列がポインタに成り下がるということを理解していないと混乱する。
もう一度説明しよう。
int data[2][4]; としたとき、dataは「int4個の配列」2個の配列で、
これは(一部の例外を除いて)すぐに先頭要素へのポインタに成り下がる。
繰り返すが、配列dataの要素は「int4個の配列」であるdata[0]とdata[1]の2個で、
それへのポインタの型は「int4個の配列へのポインタ型」(int (*)[4])になる。
ポインタ演算の法則から、data+0は0番目の「int4個の配列」へのポインタで、
data+1は1番目の「int4個の配列」へのポインタになる。
間接参照演算子*は、ポインタの指すオブジェクトへの参照を生み出すもので、
そのオブジェクトの値を取り出すわけではない。
配列へのポインタに*を作用させた結果は配列への参照になる
(だいたい、配列そのものには「値」というものは存在しない)。
だから*(data+y)と書けばそれはdataのy番目の「int4個の配列」そのものを意味する。
そしてこれはdata[y]と書いたのと同じである。これは[]演算子の定義による。
しかしこれもまた配列であるから、すぐにその先頭要素へのポインタ(この場合int *)に成り下がる。
よって*(data+y)+xと書けばそれはdataのy番目の「int4個の配列」のx番目の要素へのポインタで、
*(*(data+y)+x)はdataのy番目の「int4個の配列」のx番目の要素である。
これはdata[y][x]と書いたのと同じである。何度も言うが、これは定義による。
*(data+y)+xが&data[y][x]と等しいのは、1+1が2と等しいのと同じ理由である。
>>453 >>456 違う。data+yは配列へのポインタであって、
時にダブルポインタと呼ばれるところのポインタへのポインタではない。
ダブルポインタなんて言葉初めて聞いたわ
俺は聞いた事あるよ 嫌いな呼び方だが
>>458 700件もある
> "ダブルポインタ" "ポインタへのポインタ" OR "ポインタのポインタ" の検索結果 約 717 件中 1 - 10 件目 (0.27 秒)
>>460 1000件以上
"double pointer" "pointer to a pointer" の検索結果 約 1,280 件中 1 - 10 件目 (0.32 秒)
>>457 >配列がポインタに成り下がるということ
これだと「int4個の配列へのポインタ型」の「配列」はなんでポインタに成り下がらないのか
「ポインタのポインタ」ではなんで駄目なのかが上手く理解出来ないんだよな
>>462 確かにわかりにくいかもしれないけれど、それは徹底的に論理的思考を要求されるという意味であって説明が間違っているわけではないよ
>「int4個の配列へのポインタ型」の「配列」はなんでポインタに成り下がらないのか 「配列へのポインタ」はあくまでもポインタであって配列ではないからに決まってる >「ポインタのポインタ」ではなんで駄目なのか 意味がよくわからんが 「への」ではなく「の」ではいけないのかという意味なら、より意味合いとして厳密だから 「配列の〜」ではなく「ポインタの〜」ではいけないのかという意味ならそれは別物だから という答えになる
「配列とポインタは同じ」みたいに書いてる本が悪いんだよ
466 :
デフォルトの名無しさん :2009/01/12(月) 17:01:55
配列とポインタの違いが、わからん 指し方が違うだけ?
ぜんぜん違うものだよ 配列はメモリ上に連続的に確保された、ある大きさの領域で、コンパイラがそれと認識するもののこと ポインタはあるオブジェクトを指し示す値あるいはその値を格納する変数のこと
何スレか前に配列のあらましについて解説したレスがあったな
>>457 >>462 配列→ポインタに成り下がりなら
「「int4個の配列」2個の配列」→「2個の配列」はポインタに成り下がり
=「int4個の配列へのポインタ型」→「4個の配列」はポインタに成り下がり
=「intへのポインタ型へのポインタ型」と脊髄反射で考えたくなるが
この考え方って違うんだよね・・・
本見ながらマニュアル的にint data[x][y];の
dataは「inty個の配列へのポインタ型」(int (*)[y])と覚えてるだけで
ポインタの理解が出来そうに無いorz
写真は燃えるけど、写真の写った写真を燃やしても写真の中の写真までは燃えないだろ
>>457 何かわかったような気がしました
data + yは、int(*)[4]型である、はわかってたつもりでした
じゃあ何で*を付けたときにint(*)型になるのかって思ってましたが
>>*(data+y)と書けばそれはdataのy番目の「int4個の配列」そのものを意味する。
「そのもの」を指すんですね。
つまり、この時点でint(*)型になってるんですね?
>>間接参照演算子*は、ポインタの指すオブジェクトへの参照を生み出すもので、
>>そのオブジェクトの値を取り出すわけではない。
このことが良く理解できていなかったようです。
間違いなどございましたらご指摘ください。
>>471 *(data+y) は int [4] 型だと思うんだが
>471 >つまり、この時点でint(*)型になってるんですね? いや、それに&とsizeof以外の演算子を作用させたり、関数の引数に書いたりしたとき
>>473 そのへんの解釈は微妙かなぁ
厳密には「&またはsizeofを作用させなかった場合」じゃないかな
まあ実質同じだけど
規格の文言では、「例外を除いて」ポインタに意味が格下げになる、となってるから>474が正しい 確かに普通はどうでもいいことだが
*(data + y)はint[4]型だが&またはsizeof()を作用させていないので int(*)に成り下がる(int*に暗黙キャストされる?)んですか?? 良くわからん。。
>>476 「キャスト」ではないことを除けばその解釈であってる
キャストは値を変換すること
配列がポインタになるのは、値ではなく意味自体が変わる(というか配列に値はない)
478 :
デフォルトの名無しさん :2009/01/12(月) 20:48:40
>>478 正しい
なぜなら配列の初期化は宣言時だけで、*(data+y)のような式には適用されないから
そうなんですか。。。んー、何かいまいちもやが晴れないです。 持ってる本にも載ってないしなあ。 アドレスの加算ができるのはサイズが判ってる(ポインタ型だから)ですよね? つまりその加算の前の時点で既にポインタ型になってる? いやむしろ加算する⇔&,sizeof()でない よってポインタ型になる? ところでC言語の規格そのものってどこにあるんでしょう? K&Rがそれにあたるとしたら買わなきゃいけないのかな?
○ &,sizeof()でない よってポインタ型になる
482 :
デフォルトの名無しさん :2009/01/12(月) 23:15:57
なんかさぁ 無駄に難しいことで悩んでいる気がするんだよね。。。 2次元配列をポインタで扱うとか 普通ありえないよ。 そんなコード書いたら 設計からやり直しだよ。。。
#include<stdio.h> int max(int data[100]); int main(){ int kazu; int data[100]; int saidai; int i; printf("数値の数は?:"); scanf("%d",&kazu); printf("数値を入力:"); for(i=0;i<kazu;++i){ scanf("%d",&data[i]); } saidai = max(data); printf("最大の値は%dです\n",saidai); return(0); } int max(int data[100]){ int maxdata = 0; int i; for(i=0;data[i]!='\n';++i){ if(maxdata<data[i]){ maxdata = data[i]; } } return(maxdata); } 上記のコードだと、最終結果で意図しない値になってしまいます。 論理演算の使い方などが間違っているのでしょうか?
配列の有効な大きさの判定がおかしいから kazuもmax関数の引数として渡しましょう。
data[i]!='\n'
下のプログラムは、エラトステネスの篩のアルゴリズムの一部です。 何をやっているか理解出来ないので、解説をお願いします。 for(i=0 ; i<MAX ; i++) p[i] = 0; p[0] = 1; for(i=2 ; i<=MAX/2 ; i++){ for(j=2 ; i*j<=MAX ; j++){ if(p[i*j-1] == 0) p[i*j-1] = 1; if(p[i*j-1] == 0) p[i*j-1] = 1; この処理は、p[i*j-1]が0ならば p[i*j-1] に1を代入 だと思うのですが、p[1]からp[MAX]まで0を入れてあるので、このif文は常に真になりませんか?
if文で + や - が入力されたら〜という条件は設定できますか? 簡易な電卓を作りなさいというような問題で入力した四則演算の演算子で 計算する方法を分岐するという内容を考えています。 操作する感覚を電卓に近くしようということらしく、2(入力) +(入力) 1(入力) = 3(計算結果) というような操作方法にしたいと思っています。
488 :
デフォルトの名無しさん :2009/01/13(火) 22:28:33
>487 できるよ。 キーボードから入力された'+'は0x2Bっていう 値になるから。
>>486 最初の一回だけ真になる(=常じゃない)
たとえば、i=1, j=24 のとき p[23] を参照するけど、
その後 i=2 j=12 とか i=3 j=8 とかのときも p[23] を参照する。
>>488 そんな答え方したらc == 0x2bなんて条件を書くようになりそうだから、そう言うな。
491 :
デフォルトの名無しさん :2009/01/13(火) 22:51:36
struct hh{ int c; int d; unsigned long dd[2] } という構造体があります。 この構造体のアドレスを0x0300とします。 この構造体の0x0300をポインタで指すと、何バイトになるのでしょうか? int c, int d, unsigned long dd[2] がひとつの領域にはいるのかそれとも int c, int d, unsigned long dd[0], unsigned long dd[1], unsigned long dd[2] がはいるのでしょうか? ちなみにアドレスをずらすとこの構造体に次の値が入るものとします
ごくり
>>491 構造体の大きさをsizeofで調べた方がいい
494 :
デフォルトの名無しさん :2009/01/13(火) 23:22:58
なんとかしたいけど、質問の意味がわからない。
498 :
デフォルトの名無しさん :2009/01/13(火) 23:25:09
>>495 そうでした。申し訳ありません。
intを2 unsigned long を4とするとどうなりますでしょうか?
2+2+4*2=?
500 :
デフォルトの名無しさん :2009/01/13(火) 23:30:53
つまり*hhは12バイトをとるということでしょうか? で次のポインタ*hh(++) も値をいれるとすれば同じく12バイトをとるということであってますか? 0x0300 →12バイト 0x0301 →12バイト であってますよね?
>>491 int main(void)
{
struct hh {
int c;
int d;
unsigned long dd[2];
} st;
printf("st size = %2d, adderss = %p\n", sizeof(st), &st);
printf("c size = %2d, adderss = %p\n", sizeof(st.c), &st.c);
printf("d size = %2d, adderss = %p\n", sizeof(st.d), &st.d);
printf("dd size = %2d, adderss = %p\n", sizeof(st.dd), &st.dd);
return 0;
}
構造体内のメンバは普通、配列のようにみっちりと連続した領域に 配置されることなんか保証されていない、 つまり殆どの場合メンバの合計サイズにはならないから、 構造体のポインタの加算減算(アロー演算子以外)で各メンバに アクセスすることはできない 通常はsizeof(構造体) > sizeof(メンバ0) + sizeof(メンバ1) ... + sizeof(メンバn) ってあってる?
ダメだこりゃ。
>>500 sizeof(struct hh *) しやがれ
0x0300+12=? パディングされるかもしれないからコンパイラのマニュアル読んでみたら
506 :
デフォルトの名無しさん :2009/01/13(火) 23:35:34
>500 間違っている。 この構造体が0x0300番地から 配置されているならば 0x030b番地までこの構造体の 「実体」が存在している。
パディングなんて入ってる環境もあれば 入ってない環境もあるんだから、 環境を限定しないと解答不可能。
出力する際、10個出力したら改行という風にしたいのですが、上手くいきません。 このプログラムの場合 int a[200] = {0}; int i, count; for(i=0;i<=199;i++){ printf("%d ",a[i]); count++; if(count % 10 ==0) printf("\n"); 結果が 0 0 0 0 0 0 0 0 0 0 0 0 途中省略 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 となります。 どこが間違っているのでしょうか?
>>508 質問者はポインタを宣言しただけで使えるようになると思っている節がある
511 :
502 :2009/01/13(火) 23:38:24
>>508 良ければどこがどのように間違っているか是非訂正お願いします
高速化のために構造体のサイズはあるバイト数の倍数になるよう必要なら”隙間”で埋められる。 その”あるバイト数”は環境によってことなるためあftgyふいおp;:
513 :
デフォルトの名無しさん :2009/01/13(火) 23:40:06
>509 「count」が初期化されていない。
514 :
502 :2009/01/13(火) 23:42:56
>>512 つまり構造体のサイズが境界?と偶然合えば
sizeof(構造体) = sizeof(メンバ0) + sizeof(メンバ1) ... + sizeof(メンバn)
になるから
sizeof(構造体) >= sizeof(メンバ0) + sizeof(メンバ1) ... + sizeof(メンバn)
ってことですか?
#pragma pack(1)
516 :
デフォルトの名無しさん :2009/01/13(火) 23:43:45
>>491 >この構造体の0x0300をポインタで指すと、何バイトになるのでしょうか?
この質問自体が意味不明。
もうちょっとテキストを読みなさい
517 :
デフォルトの名無しさん :2009/01/13(火) 23:45:13
つまり1バイトが1メモリアドレスを占有するのでしょうか? 0x0300 に3バイト入れたら 0x0302まで占有している 0x0300にアクセスしないと値はとれない。0x0302ではだめ。 で、構造体の次の値をとろうとするとhh[1]とかで指定すると 0x0303の値をとるということであってますよね?
基礎もなく、組み込みやってるんだと思うよ。
519 :
デフォルトの名無しさん :2009/01/13(火) 23:50:08
>>516 おまえさんも日本語のテキストを読んだ方がいい
抜けているのは主語であってCの知識ではない
意味不明にggrks、それから? 存在意義ない人だね
520 :
デフォルトの名無しさん :2009/01/13(火) 23:50:23
>517 うーん。。。 1バイトが1メモリアドレスってどんな処理系? この構造体はどこかで配列として宣言されているの?
>>517 > つまり1バイトが1メモリアドレス
そう。メモリアドレスの1単位が1バイトであるものをバイトマシンと呼び、現在もっとも一般的。
稀にそうでないものもあるが絶滅したも同然だから気にすんな。
つーかデバッガで確認するとか自分であれこれ実験すれば分かること
523 :
デフォルトの名無しさん :2009/01/13(火) 23:56:11
この構造体を格納するメモリアドレスが0x3000から始まります。 で、構造体の中身がint, int, unsigned long dd[2]です。 0x3000が指す領域は12バイトをとりますよね? 次に0x300bが指す領域も12バイトをとりますよね?(次の領域にも構造体をあてはめるとして) たとえば、最初の構造体の二つ目のintをとろうとするとあらかじめ構造体にはポインタ宣言しておいて hh[0].dとアクセスしますよね ddなら hh[0].dd[1]とかで で、次の領域の構造体にアクセスするとなると hh[1].d hh[1].dd[1]といった具合になりますよね
日本語の勉強をした方がいい
525 :
502 :2009/01/14(水) 00:02:44
催促すいませんがどなたか
>>514 に答えて頂けますか
紛らわしいのですが
>>491 氏とは別の質問でして
>>517 >つまり1バイトが1メモリアドレスを占有するのでしょうか?
よくあるPCではそんな雰囲気
>0x0300 に3バイト入れる
0x0300、0x0301、0x0302 に1バイトずつ、合計3バイト入れるとイメージした方がいい
>構造体の次の値
構造体の配列 struct hh test[100]; があるとき、各要素のアドレスは
&test[0], &test[1], &test[2]・・・とか
test, test+1, test+2 で得られる。
アドレスの違いは sizeof(struct hh) になる。
→sizeof(struct hh) が3なら、 0x0300 の次は 0x0303
→sizeof(struct hh) が4なら、 0x0300 の次は 0x0304
→sizeof(struct hh) がxなら、 0x0300 の次は 0x0300+x
>>523 >この構造体を格納するメモリアドレスが0x3000から始まります。
>で、構造体の中身がint, int, unsigned long dd[2]です。
>0x3000が指す領域は12バイトをとりますよね?
12バイトの時もあるが、12バイトでない場合もある。
どちらになるのかは、実装方法が決まらないと確定しない。
× 0x300b
528 :
デフォルトの名無しさん :2009/01/14(水) 00:02:59
>>523 >hh[0].dとアクセスしますよね ddなら hh[0].dd[1]とかで
>で、次の領域の構造体にアクセスするとなると
>hh[1].d hh[1].dd[1]といった具合になりますよね
正しいと思いますが、
どこにもポインタが使用されていてません。
こういうのは「ポインタ宣言して」とはいいません
529 :
デフォルトの名無しさん :2009/01/14(水) 00:06:09
>>525 「境界と偶然合う」って所を除けば概ね問題ない。
532 :
デフォルトの名無しさん :2009/01/14(水) 00:09:50
>>525 一般的?にはアドレスの境界を意識して
構造体を作ります
途中にパディング用のメンバを追加するとか・・・
>>523 ちがう。アドレスが表しているのはメモリ上の単なる位置であって、
その先にどんな大きさのオブジェクトがあるかなんて知ったこっちゃない。
アドレスと、その先にあるものの大きさ(というか型)を持っているのはポインタ。
534 :
デフォルトの名無しさん :2009/01/14(水) 00:38:01
test = array[0]<<16; test |= array[1]<<8; test |= array[2]: これの |は何を意味しているのでしょうか?
論理和 a |= b は a = a | b と同じ
536 :
デフォルトの名無しさん :2009/01/14(水) 00:45:15
534の場合 最終的にtestにアクセスすれば中身がつながってみえるというわけですよね もうarray[0]はみれなくなってる?
arrayには代入してない
ちなみにCellでは128バイト単位がもっとも処理速度が速いのでわざわざゴミを入れて128バイト単位にする
j=aでいいの?
pの中の値を見てcount[i]を増やすところがおかしい 添字の範囲を確認しなおすこと
>>539 自然数nについての篩はp[n-1]なんでしょ?
それなのに↓はおかしいね
for(j=a;j<=b;j++){
if(p[j] == 0) count[i]++;
}
>それ以外は間違ってないようなのですが いやそれ以外も間違ってる
>>540 エラトステネスの篩のつもりです。調べて見つけたアルゴリズムを参考に書いて見ました。
>>541 j=a-1;
ですか!
>>545 ち が う よ
というかそっちを治すならもう一箇所直す場所が増えるよ
考えてから書いてるか? 行き当たりばったりの試行錯誤でプログラミングしてないか?
あっ、! ifの中がp[j-1]でよろしいでしょうか?
行き当たりばったりの試行錯誤でプログラミングしてないか?
言語と本質的にはかかわらないけども、 CでGUIを実装したいときって、皆、何を使ってるんだろう javaならawtかswingの2択で済むのに
WinAPI呼ぶとか、Xlib使うとか
>>550 GUIをCで作ることはあまりないんじゃないかな
コンソールアプリケーション以外
もっと便利な言語がありますよ
>>532 普通はそんなの意識しないよ
意識するのは#pragma pack(push,1)でパッディング無くす時ぐらい
>>532 どこの一般だそれは。
メモリ制限のきつい状況で、要素数のデカい構造体の配列が必要なときくらいだろ。
>>538 128…バイト?ググってみたら DMA 転送効率のためか。
そりゃ無駄が多いなあ。
555 :
デフォルトの名無しさん :2009/01/14(水) 13:04:26
もう嫌だー
すいません、ちょいスレ違いの質問かもしれないのですが 独学でCを覚えたかたはどういう勉強方法をされたのでしょうか? 自分は今初心者本を読みつつ、演習問題本の内容を解いていく、という感じなのですが、 あまり覚えてないような気がしてきて…
宿題スレに問題がいっぱい転がってるからそれを解く
>>549 最初はわからないから試行錯誤するでしょ
>>553 昔のマシンで開発してた人が習慣で未だにやってるしそう教えるから
普通とは言わないまでもけっこう見かける
>>558 試行錯誤は対象についての知の蓄積がない場合にやるもの。
Cやその他のプログラミング言語のように
規格が既知であるものについて試行錯誤するのは
車輪の再発明どころか間違った理解に到達してしまう可能性も高い。
極論を言えばCを理解するのに開発実行環境などいらない。
慣れるのには有用だけど。
もちろん言語そのものに対する理解の話であって
各環境での動作がどうとかいうのはまったく別の問題。
念のため。
>>558 あなたはともかくほとんどの人は初心者の頃から「行き当たりばったり」の試行錯誤はしないんですよ
わからないなりに考えるもんなんです
そのわりに、考えてないような?
int 型(符号つき32 ビット整数)およびunsigned int 型(符号なし32 ビット整数)を表示させたいのですが、 プログラムは #include <stdio.h> #include <limits.h> main() { printf("%d\n",INT_MAX); printf("%lu\n",UINT_MAX); return 0; } 結果は 2147483647 4294967295 で正しいでしょうか?
unsigned intは%uだよ。
>>563 わからない。
処理系(limits.h)の定義する制限値は処理系ごとに違うから処理系ごとに正解が異なる。
32 ビット整数って、書いてあるけど
16進数で表示してみれば、ことかな
おそらくほとんどすべての32ビット処理系では INT_MAXを2147483647と定義しているだろうけど それ以下でない保証はない
そもそも>563がおかしい 整数を表示したいだけならprintfが正しく書けただけで話は終わっている
正しくかけてるかどうか不安だったんじゃないの? 実際%luってなってるわけだし、彼にとって聞いた価値はあった。 上限値がどうこうの話は本題からずれてるよね
572 :
563 :2009/01/14(水) 20:16:57
int 型(符号つき32 ビット整数)およびunsigned int 型(符号なし32 ビット整数)の範囲内で、 それぞれの最大値から10個分の素数を表示させるプログラムを作りなさいという課題が出ています。 それぞれの最大値を調べてみたら、int型の方は-32768 〜 32767となっていたのですが、 そのあとに見つけたINT_MAXを見つけ、表示させるだけのプログラムを書いてみると全然値が違ったので 質問してみました。
>>572 どうやって調べたんだ?どっかの情報古い上に断定しちゃってる糞サイトか何か?
なんかプログラム作って調べたなら食い違うのはおかしい
>>572 おそらく16ビットと勘違いしてたんだと思います。
おかげで、limits.h INT_MAX UINT_MAXを知れたんで、良い勘違いだったかと・・・
for文でint 型(符号つき32 ビット整数)から1ずつデクリメントしたいときは、INT_MAXを使っても大丈夫ですよね?
>>569 よくわからないのですが、これだと問題アリですか?
int g_nData; int setData(int a_nData){ static int bAccesed = FALSE; if(!bAccesed){ bAccesed = TRUE; g_nData = a_nData; bAccesed = FALSE; return TRUE; //アクセス成功 } return FALSE; //アクセス失敗 } グローバル変数へのアクセス用関数って↑見たいな感じでいいの?
マルチスレッドのこと言ってんならそれじゃ失敗するけどそういうことじゃなくて?
>>575 大丈夫というか、使うべき
>>569 は「答えが正しいか」というとんちんかんな質問に対する皮肉にすぎない
>>576 排他したいなら mutex 等の排他制御機能を使うこと
>>576 実際にどのくらいの確率で問題が起きるかは別として、
そのコードが問題を解決することはたぶん無い
具体的な排他制御の方法は処理系依存
582 :
576 :2009/01/14(水) 20:37:58
素直にmutex使うほかないのかぁ レスアリガトヌス
""は、中身(とヌル文字)の要素数の配列をどっかに作って 中身(とヌル文字)を入れ、その先端要素のアドレスを返す演算子である 上記の解釈で正しいのでしょうか。誤っている場合は正しい定義を教えて下さい。 ところで、printf()の第一引数では、 printf("整数を入力してください。\n"); のように日本語を指定し、実際期待した通りに表示されますが これは何故なんでしょうか?
配列を作るわけではないが、連続領域の先頭アドレスを返す 日本語を示すバイト列が連続領域に入っていて、それを連続して出力すれば 日本語として解釈されてそのように表示される 例えばその、整 という文字の1バイト目、2バイト目に何が入っているかを調べ、 それぞれを連続して出力するような処理を書いてみると実感がわくかな? 2バイト目の数字をちょっと変更してみたりすると他の文字になったりもするよ
void consol1(void) { char ch; do { ch = getchar(); printf("%c",ch); putchar('.'); printf("%c",ch); } while (ch != '\n'); printf("%c\n",ch); } このプログラムの実行結果、仮に「a」と入力すると次のようになった。 a.a . 最後のprintf()で「.」が表示される仕組みがよく分からない。「a」と表示されると思ったのに。 putchar()って渡した値を出力するだけじゃないの?chに代入が行われているように見える・・・。 試しにdo〜whileを外してみたら、こっちは最後のprintf()でちゃんと「a」と表示されるんだけどなぁ・・・。
>>585 最後の printf で出力されるのは改行文字
>""は、中身(とヌル文字)の要素数の配列をどっかに作って中身(とヌル文字)を入れ、 そう。 >その先端要素のアドレスを返す演算子である ちがう。その配列への参照として扱われる。 演算子でもない。あくまで文法上の特殊記号。
書き忘れ
>>583 多バイト文字を画面上に構成するのはOS等の仕事。
プログラム自体はあくまでバイトの列を送出しているだけ。
NULLって(void*)0でいいの?
C89 → ((void*)0) あるいは 0 C99 → 処理系定義 C++ → 処理系定義
>>589 「いい」の意味するところを明確にしてください
>>589 ヘッダーファイル検索してみればよくね?
うちのVCだとこんな感じ
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
最近は __null で定義されてたりすることもある。
>>594 力になるからどこが分からないか指定しろ
スレ違い
>>596 int supply_bufferとvoid write_to_fileの関数のなか
たのむ
教師は2chのスレを監視してるから
600 :
583 :2009/01/14(水) 23:24:09
>>584 >>587 レスありがとうございます。
ただおっしゃることが反対のような気がするのですが。
日本語についてですが少し考えてみたのですが
例えば、Shift-JISで書いても使用した文字等がすべてASCIIの範囲なら
Shift-JISとは言えどASCIIで書いたことと全く同値なのですよね?
ということは文章内にASCIIの1バイト文字とそれ以外の2バイト文字とが混在していることになりますが
バイト単位で考えるとどこでそれを判別するのかわからない気がします
というのは、4190AEは表を見て'A'と'整'とをくっつけたものですが
41|90AEのように区切るのか41|90|AEと区切るのか4190|AEと区切るのか
そういった判断はどうやって行なっているのでしょうか。
表を見るに、ASCIIは7Eまでしかなく、Shift-JISの2バイト文字の
1バイト目は81から始まっているようなので、7E以下なら
ASCII、それより大なら2バイト文字なので次の1バイトと合わせて
1文字と考える、とかいう処理をOSがしているのでしょうか?
C言語とは関係なくて思いきりスレチですかね
>>594 みたいなのに教えなくちゃならない教師に同情するよ
区切りは先頭から順にチェックしていかないと不可能だよ。 まあ、UTF-8 は特殊で、途中からでもチェック可能に作られてるけどな。
そんなの関係ない〜
>>600 ざっとしか読んでないけどあってる
で、SJISの2バイト目に\と同じコードを持つ文字があって、それに対して適切な処理ができないと
次の文字の1バイト目がエスケープされてしまい、文字化けが発生したりする。
EUC(-JPに限らず)や、UTF-8なんかだとそういうことはないので化けない
バイト列中の任意の1バイトを見た時に、マルチバイト文字の一部なのか、シングルバイト文字なのかが
分かるようになっている。
その辺は文字コードごとの仕組みに依存するのでその辺を調べてみては
606 :
601 :2009/01/14(水) 23:48:42
と思ったが、見てみると問題もひどいな supply_buffer()では、学籍番号が不一致な場合、出力しない方を 覚えておかなくちゃならないので、static変数を使うしかない。 頑張ればできるけど、なんか問題が間違ってる気がする
>>600 文字定数はコード中では基本的に配列として扱われる(連結が行われた後で。sizeofをかけてみればわかる)。
実際に配列として確保されるかどうかは定かでない
×文字定数 ○文字列定数
609 :
デフォルトの名無しさん :2009/01/15(木) 00:09:37
VC++2008なんですが・・・ほとんどC言語と同じ意識で作業してまして、 スレ違いだったらすいません。 DLLをつくってまして、 static double ticks[0x7FFFFF]; static double tickEMAs[0x7FFFFF]; で定義している変数を初期化するのに、 for(int i0=0;i0<0x7FFFFF;i0++){ ticks[i0]=0; tickEMAs[i0]=0; } とやると実行時に例外を吐いて落ちます。 for(int i0=0;i0<0x7FFFFF;i0++){ ticks[i0]=0; // tickEMAs[i0]=0; } のように片方をコメントアウトするととおります。 なんででしょうか?
>>594 宿題スレで聞いた方がいいかも?
int supply_buffer()
{
int ret=0;
if(num1<num2) {
if((10000>num1)&&(EOF==fscanf(fp1,"%d %s %d",&num1,name1,&math)))
num1=10000;
}
else if(num1>num2) {
if((10000>num2)&&(EOF==fscanf(fp2,"%d %s %d",&num2,name2,&eng)))
num2=10000;
}
else {
if((10000>num1)&&(EOF==fscanf(fp1,"%d %s %d",&num1,name1,&math)))
num1=10000;
if((10000>num2)&&(EOF==fscanf(fp2,"%d %s %d",&num2,name2,&eng)))
num2=10000;
}
if(20000==num1+num2)
ret=1;
return ret;
}
>>607 間違っても誰かが訂正してくれるだろう戦略か
void write_to_file() { if(num1<num2) fprintf(fp3,"%d,%s,%d,-\n",num1,name1,math); else if(num1>num2) fprintf(fp3,"%d,%s,-,%d\n",num2,name2,eng); else fprintf(fp3,"%d,%s,%d,%d\n",num1,name1,math,eng); }
615 :
デフォルトの名無しさん :2009/01/15(木) 00:22:37
DLLの呼び出しもとはMetatraderです。 今、mallocを初めてつかってみようと調べてます。
617 :
609 :2009/01/15(木) 00:39:52
mallocでメモリを確保したらとおりました。 ありがとうございました。
618 :
572 :2009/01/15(木) 00:59:38
unsigned int 型(符号なし32 ビット整数)の範囲内で最大の素数を表示するプログラムを書いているのですが、 出力される値がおそらく素数ではありません。 4294967291と出力されて正解だと思うのですが、4294967295が出力されます。 どこに問題があるか、教えて欲しいです。よろしくお願いします。 #include <stdio.h> #include <math.h> #include <limits.h> int main(void) { long int i, n, m, Limit; int b = 0; while(1){ Limit=(long int)sqrt(UINT_MAX-b); m=UINT_MAX-b; for(i=Limit;i>1;i--){ if(m%i == 0) break; } if(i==1){ printf("%u\n",UINT_MAX-b); break;} else b+=1; } return 0; }
long int
>>618 unsigned が抜けてるから負数になってる
>>619 ,620
なるほど! すっかり忘れていました。ありがとうございます
構造体のポインタの型変換についての質問です struct a { int i; int j; }; struct b { struct a t; int k; }; というような、(構造体bの中に、構造体aがある)ような場合、構造体bへのポインタを 構造体aへのポインタに型変換し、a のメンバとして、構造体b の中を参照しているコードを 見かけることがあるのですが、これは文法上正しいのでしょうか? もしくは何か注意することはありますか? コードで書きますと struct b test, *pb; struct a *pa; pb=&test; pa=(struct a*)pb; のようにして pa->i; pa->j; という感じで参照するような記述です。
具体的にどこでそんなコード見かけたのか知りたいな。 キャストすればなんだって通せるから文法上正しいかどうかは意味がない。 pa = (struct a*)&(pb->k); これもOKなわけだし。 でJIS X3010見たところtを構造体bの先頭に置く限りは&(test.t) == &(test)が真なので期待通りの動作となる。はず…
624 :
デフォルトの名無しさん :2009/01/15(木) 02:17:57
2進整数を10進数に変換する下記プログラム があるのですがこれを正負の2進整数を10進数に変換するにはどこを改良すればよいですか? よろしくお願いします。 #include <stdio.h> #define BITSIZE 8 #define NDECIMALS 0 int main(void) { char buf[16]; int n = 0, i; fgets(buf, sizeof buf, stdin); for(i = 0; i < BITSIZE; ++i) { n <<= 1; n |= buf[i] - '0'; } printf("%f\n", (double)n / (1 << NDECIMALS)); return 0; }
BITSIZEをintのbit数にする
>>624 先頭が符号だったらそれをそのまま出力し、後は同じ処理。
627 :
デフォルトの名無しさん :2009/01/15(木) 02:28:47
>>625 それはどのようにすればいいですか?
知識が無くてすいません。
なんでそんなことを、という気にはなるな。 > pa=(struct a*)pb; を > pa=&(pb->t); とすれば、tがaの先頭にあるかどうか気にしなくていいのに。
>>627 for(i = 0; i < sizeof(int)*8; ++i)
630 :
622 :2009/01/15(木) 02:35:20
>>623 情報ありがとうございます。理解しました。
海外(?)の画像ライブラリで libjpeg6b というのがあるのですが
その中のソースが、こうゆう形で記述している部分がありました。
あと仕事でC++のインスタンス(?)をCで受け取って、その中身を参照する
(のかな?C++よくわからないです)ようなソースを書いている人が
こんな記述をしていました。
>>627 #include <limits.h>
#define BITSIZE INT_MAX
634 :
デフォルトの名無しさん :2009/01/15(木) 03:44:06
指定された入力がされない場合、エラーを出力し指定された入力が行われるまでこれを続けるloop文を作るにはどうすればいいですか?
do while文の中にscanfとif文でエラー吐く文を入れて条件判断の所にアドレスを参照する判断式を使う
636 :
デフォルトの名無しさん :2009/01/15(木) 04:08:27
whileの所にscanf入れて中にif文書けばばいいじゃん
int main(int argc, char +argv[]) なぜmainに引数がつくのでしょうか?またこの引数は何でしょうか?
+ ってなんだお * だお コマンドライン引数とかそういうのが渡されてくるんだお
コマンドライン引数で、int とcharを必ず渡せということでしょうか?
>>640 少しは自分で調べなさい。
コマンドライン引き数を何も書かなくても、最低限プログラムの名前は渡される。
実験してもすぐ判ることだ。
プログラムの名前がintで渡される? 名前ならcharで配列ひとつに1文字ずつ格納するのでは?
>>638 int main(int argc, char *argv[])
ね
aaa.exe bbb.txt ccc.dat
で実行すると
argc に引数の数3(aaa.exeを含めて3個)
argv[0]に"aaa.exe"
argv[1]に"bbb.txt"
argv[2]に"ccc.dat"
が入る
まあargv[0]に必ずプログラム名が入るとは限らないけどね
>>645 egrep/fgrep が grep へのシンボリック/ハードリンクになってて
argv[0] で判断してたりね。
647 :
デフォルトの名無しさん :2009/01/15(木) 20:15:46
人に質問してるくせに 知ったかぶりして回答者に噛み付く初心者ほど滑稽なものは無いな。
C言語(笑)とかwwwもう古いからwwwww
冬休みは終わったって言うのに
いやまじでお前らは時代の流れがみえてねーよw オブジェクト指向も出来ないような言語誰もつかいませんからwww
Cでもオブジェクト指向できるし。
世間知らずのバカの相手をするな
オブジェクトを意識して設計なりコーディングなりすればいいだけじゃないか? 言語自体ではサポートされてないんだから決まったやり方もないと思うがね。
C言語でオブジェクト指向プログラミングできないやつはオブジェクト指向を理解しているとは言えないと思う
>>655 こういうのって幾度となく見てるけど、そのたびに、やっぱCでオブジェクト指向やるのは
ムリがあるなって感想しかもてない。
N88-BASICとか、非構造化言語が使われていた時代から、Cとかpascal、構造化BASICのような 構造化言語が使われだしたときにも、非構造化言語で構造化プログラミングをするテクニック みたいのが雑誌に載ってたけど、プログラマの負担が大きすぎて、とてもやってられない ようなのばっかりだったな。 (Vzのソースは、MASMのマクロを使って、うまく構造化していてあれは感銘をうけたけど)
おれがC言語の彼氏だったら間違いなくオブジェクト指向やらせないな 父親だったらまっすぐ数値計算をやらせる 孫だったらゲーム作らせるな
fopen/fseek/ftell/fclose といった奴らはオブジェクト指向だと思うんだけど
抽象データ型くらいまでがCの限界かな。
形だけの構造化プログラミングの場合、たとえば while が無いから出来ない、とか 思うかもしれないけど、本質的には、goto で while 相当の処理を作ってもいいはず。 BASICでも、いわゆる綺麗なソースは構造化されてることが多い C言語でオブジェクト指向も同じ話だろうな。形だけでいうと classが無いから ダメって見えるかもしれないけど、本質を考えると十分実現できる。
664 :
デフォルトの名無しさん :2009/01/15(木) 22:46:55
Cが古臭いってのは否定しないけど、 組み込みの世界ではバリバリ現役だよね。 一応組み込みのコンパイラでも C++サポートしてるものが多いけど、 C++で作られたソース見たこと無い。 組み込みでC++やったことある人っている?
マイクロソフトに関わるとC++になるな。windows mobileとか
組み込みはCかアセンブラ。速度が要求される鯖はC。 大規模って意味では、EJBクラスタ鯖もあるが連日トラブルの山。 GUIはWebブラウザベースがほとんど。特殊用途用のGUIならVBかC#。 C++で新規開発はほとんど無いな。既存アプリのメンテする時くらいか・・・。
>>664 組み込みをC++でやったけど、制限が多すぎてBetter Cとしてしか使わなかった
組み込みC++の制限って、 ・標準ライブラリが貧弱 ・placement newかアロケータ作るかしないとnewする気にならない ・RTTIや例外を使う気になれない ぐらいか?
・仮想関数を使う気になれない ・ついでに継承する気も起きない
元にしたC++仕様が古過ぎてテンプレートがグダグダ、 STL すらままならない、てのはあった。
習作としてWindows BMP(24bit)を操作するプログラムを作ろうとしています。 しかしヘッダーの上手い出力の仕方がわからず、 char bFileHeader[BMPFILEHEADER_S + 1]; // BITMAPFILEHEADER(14bytes) 中略 // BITMAPFILEHEADER bFileHeader[0] = 'B'; bFileHeader[1] = 'M'; *((int*)(bFileHeader + 2)) = filesize; *((int*)(bFileHeader + 6)) = 0x00; *((int*)(bFileHeader + 10)) = BMPFILEHEADER_S + BMPINFOHEADER_S; 中略 fwrite(bFileHeader, BMPFILEHEADER_S, 1, fp); としており、実際に正規なファイルを出力しますが、 可読性が低いし、書くのが大変な気がします。 構造体と#pragma packを使いたくない場合、 普通はどのようにしてこれを行うのでしょうか? また、最近ではBMPは使わずPNGを使いたい場合が多いようですが、 初心者にPNGの仕様を与えたところで、実装できるようなレベルではないとあります。 プロの(職業プログラマ)のレベルだとPNGの実装くらい自前で行えるのは当たり前なんでしょうか? (ライブラリがあるだろうに、わざわざ自分で実装することが愚かかどうかは別にして、技術的に)
ふつうは構造体つかう
>>671 普通はpackした構造体を使うからな
1個の配列じゃない方法なら構造体のメンバを個別の変数にして使うぐらいしかないんじゃないか
>プロの(職業プログラマ)のレベルだとPNGの実装くらい自前で行えるのは当たり前なんでしょうか
出来ない方が当たり前
仕様と時間があればできるよ。
定番ライブラリのlibpngはセキュリティホールの多さでも定番ではある。 その程度には実装が難しいんだろう。
676 :
デフォルトの名無しさん :2009/01/16(金) 17:08:39
グラフィックカードォォオオオオオオオゥ!!!!!!!!!!!!・・・ッ! なん…イカれちまった俺の相棒とPen4…………ッ!!!!俺ッは!!!!i7を選ぶッ!!!!!!!!!!!!!!!!!!!!!
>>571 多少めんどくさかろうが専用の関数かマクロを1回書いてしまえば完
C言語専用の問題集とかってないかな、、、 サイトでもいいや
すいません、ひとつ質問があります。 int c = 255; printf("%x\n", 255); printf("%x\n", c); >> 出力 # ff # ffffffff なんでこうなるんですか? ちなみ僕の環境では、cは8bitsです。
失礼、間違いがありました。 char c = 255; printf("%x\n", 255); printf("%x\n", c); >> 出力 # ff # ffffffff なんでこうなるんですか? ちなみ僕の環境では、char は8bitsです。
unsignedつけたら? 多分-1になってると思うけど
>>680 unsigned char c = 255;
683 :
デフォルトの名無しさん :2009/01/16(金) 19:08:17
C言語やった後に、エクセルの勉強しようと思う
自動車学校に通ったら、アクセルの勉強をしようと思う
>>681 ,2
素晴らしいです。ありがとうございます!
>>680 char c = 255;
は
c = -1;
になる
%x で表示すると int に拡張されるので int の -1 である ffffffff と表示される
符号ありのchar型の正の上限を超えているからね、255は。
1.10個の2桁で正の10進データをstaticデータとしてプログラム中にいれ、11個目の数をー999とする。ポインターを使って、この10個の数の合計と平均を求めるプログラムをつくる。 2.Sachiko, Emiko, Setuko, Rie, Mariko, Sara の6人の名前をポインター配列にし、頭文字がSで次の文字がaの名前を表示するプログラムを書け。 3.3つの数字をmain文でscanfで与える。そして、関数maxで3つの数の最大値を求めて、mainに帰り次のように出力する。(p102参照) 3つの数を入力してください? 55 86 32 最大値は86です。 4.do while文をつかって、1から100までの和を求めよ。 教えてください><
宿題スレで聞いて下さい ><;
てゆうか、既に宿題スレで見た気がする><
マルチっすか><
>>678 K&Rが最高の参考書であり問題集でもある。
K&Rは今でも少し専門書の充実した本屋に行けば売ってるけど、
ストローのC++本なんて、全く見なくなったな。
11個目の数は何に使うんだ
問題って出す人間の程度も知れるから怖いなぁ
11個目の数をー999とする。
番兵のつもりなんでは 次の課題でデータを10個からn個に拡大するのかもしれんし
ポインタ使えって言ってるんだからwhile(*p!=-999)とかにさせたいんだろ。
ボイン太を使う?
はい、滑った
#include<stdio.h> int main(void) { int no; int na; printf("整数を入力してください:\n"); scanf("%d",&no); if(no==0) printf("%d\n",no); else if(no<=0) printf("\b\n"); else if(no>=0) do{ na=no; no--; printf("%d",na); }while(na<0); return(0); } これで 実行例1) 整数を入力してください:0 0 実行例2) 整数を入力してください:11 11 10 9 8 7 6 5 4 3 2 1 0 実行例3) 整数を入力してください:-5 って出るはずなのに出ない・・・ アドバイスplz
後、この状態でやると 実行例1と3はちゃんと出るけど 2はこんなふうにでちゃう 実行例2) 整数を入力してください:11 11 ↑残りの10以下が出ない。。。10以下を出せたら完成です。
whileが0以下の時に繰り返すになってるわけだ
>>701 この場合、naが0以上だとそのままループから抜けてしまう。
てか、naの存在意義は?
do〜whileのくだりは
while(no>0) printf("%d",no--);
でもいい気がするが
>>706 ごめん、0含むの忘れてた
while(no>=0) printf("%d",no--);
>>706 確かにそのほうが短文でいいですね。
実行例を見て自分でプログラミングを考えてやってるので思いつきませんでした。回答にも
>>706 さんのが書いています。
アドバイスありがとうございます。
>回答にも
>>706 さんのが書いています。
(それ自体を悪いとは言わんが)くだらない質問をする奴に限って日本語が……
主語を何にするかを常に意識するだけで随分違うと思うのだけど。
主語の問題じゃねーw
つーか、主語だけの問題じゃないことは確かだ。
解答にも
>>706 さんのと同じコードが書いてありました。
だな。エスパーすると。
713 :
671 :2009/01/17(土) 16:32:36
エスパーする必要もないぐらい簡単にわかるだろ
>>713 ×for(xx = 0; xx < *ly; xx++) {
○for(xx = 0; xx < *lx; xx++) {
×av = ar + ag + ab / 3;
○av = (ar + ag + ab)/ 3;
×gt = gm;
○gm = gt;
>>715 おお、何か変だけどできました!
感謝感激です!ありがとうございました!
それにしてもこう変数の数が多いと途中で混乱してしまいますね。
今度からもう少しわかり易い識別子にしようと思います。。。
717 :
デフォルトの名無しさん :2009/01/17(土) 19:44:20
VC express2008でファイル入出力のプログラムを書いてるんですが、 exeが生成されるディレクトリ(debug)にあらかじめ「test.txt」を作っておいて FILE *fp fopen("test.txt" ,"r"); コンパイルを通し、デバッグを開始した後 このようにオープンさせようとすると、 ファイルポインタがNULLになって読み込めていないようなのです。 理由は何なのか教えてください。
718 :
デフォルトの名無しさん :2009/01/17(土) 19:45:14
fp書き忘れた。。。 FILE *fp fp = fopen("test.txt" ,"r");
IDE上で実行するときはパスが違った気がする。 プロジェクトのディレクトリに置いたらどう?
>>719 ソリューションファイルやプロジェクトファイルと同じディレクトリに格納してもダメみたいです。
普通の文字列でなくTEXTマクロを使用しても結果は同じでした。
また、試しに相対パスでなく絶対パスで実行しても同様に例外が発生してしまいました。
フルパスで書くときに、バックスラッシュをエスケープしていない悪寒。
>>721 それも大丈夫です。\\と記述してます。
例外が出たんならその内容書いてくれよ
>>723 単純にException: Invalid Null Pointerです。
実際はこの後でfgetsでテキストファイルから一行抽出する処理を入れてあるのですが
ファイルポインタがNULLのためこのような例外が起こってしまっているみたいです。
perrorしてみるとか
パーミッションとか
727 :
デフォルトの名無しさん :2009/01/17(土) 20:17:03
>>725 実際試してみると「ファイルが存在しない」とされていました。
perrorって結構便利ですね。
じゃあ諦めろ。俺はできるんで問題ない
もう fopen(....... , "w"); でなんか出力してそれを検索して場所を特定するとか
"w"で適当なファイル作って、 どこに作成されるか確かめてそこに置くとか。
そんな声を揃えて言わなくても"w""w""w"
>>729 そのやり方でしらみつぶしに検索をかけたら
一つ下の階層にありました。ソリューションと同じ所に置いていたのが原因でした。
確かにプロジェクトファイルと同じ所にできておりました。
├hoge
│ ├main.cpp
│ ├test.txt←
│ └hoge.vcproj
├hoge.ncb
├hoge.sln
ソリューションとプロジェクトが同じ所にできると勘違いして
お騒がせしてすみませんでした。
wwwwwwwwwwwwww
md5計算する使いやすいライブラリってありませぬか?
今更MD5か。 MD5である必然性がないならSHA-2を使おうぜ。 どうしてもMD5でないといけないなら仕方が無いが。
>>716 名前超重要。適切な識別子かそうでないかで、読み易さが天と地ほど違う。
昔、それなりに読み易いコードの識別子だけを、意味のない英字+数字に
書き換えたら、いきなり読めないコードに化けて、激しく衝撃を受けた
記憶がある。
ひょっとして、gets()とscanf()って同じ関数内だと一緒に使えなかったりしますか?
しません
使えないわけではない ただ、getsは使うべきでないし、scanf()を他の入力関数と併用するのはトラブルのもとだ
741 :
738 :2009/01/18(日) 03:43:19
ありがとう。参考になりました。 どちらもちゃんと動作しない時があって困ってました。
いや、どちらもちゃんと動作しているはずだ。 それがあんたが期待した動作ではなかっただけだろう。
743 :
738 :2009/01/18(日) 08:22:15
もうひとつ教えていただきたく。 char str[80]; scanf("%s",str); このような文に半角スペースを読み込ませる方法をお教えください。
>>742 確かに、私の期待した動作が返ってこないだけなのかもしれないです。
基本的な理解が足りず、何か根本的な所で勘違いをしているということがあり得る気がしてきました。
>>744 ありがとうございました。参考にさせていただきます。
746 :
デフォルトの名無しさん :2009/01/18(日) 19:14:12
char p[]="\n"; char *q=strtok(p,"\n"); ってやったらp[0]=='\0'かと思いきやp[0]='\n'のままなんですが、こういう仕様ですか? fgetsした文字列から\nをとるのに使っていたけど、これだと空行で\nが残ってしまう…
仕様ですかって聞く前に仕様を読め はっきり書いてある
>>746 strtok() はトークンを切り出す関数であって、区切り文字を '\0' で置換する関数ではない。
トークンとなるべき文字が見つからないとき、strtok() は何もせずにヌルポインタを返す。
文字列末尾の '\n' を除去するのはそんな大層な処理ではない。
for (i=0 ; p[i] ; i++) ; for ( ; 0<=i && p[i]=='\n' ; i--) p[i]='\0';
訂正。 for (i=0 ; p[i] ; i++) ; for (i-- ; 0<=i && p[i]=='\n' ; i--) p[i]='\0';
MSVCRTのstrtokが特殊?
トークンがないときにはNULLを返すとしか書いてないから区切り文字を書き潰してくれる保証は無い
>>748 >>746 何でたかが行末の'\n'を取り除く程度で
わざわざそんな複雑なことするの?
char *q = strchr(p, '\n');
if (q) *q = '\0';
で充分じゃん。
fgetsで取った文字列なんだし。
>>746 char *strtok( char *s1, const char *s2 );
strtok関数の最初の呼出しでは、s2で指定したデリミタではない最初の文字を、s1内で探索します。
見つからなければ、s1にはトークンがないことを示すNULLポインタを返します。
一方、そのような文字を見つけた場合には、それが最初のトークンの先頭になります。
次に、strtok関数はその位置から現在のデリミタ文字を探索していきます。
見つからない場合には、文字列s1の終わりまでを現在のトークンとします。
見つけた場合には、その文字をヌル文字で上書きして、現在のトークンの探索を終了させます。
strtok関数は、このヌル文字の後ろに続く文字位置を指すポインタを保存します。
次の呼出しで最初の引数がNULLポインタの場合には、次のトークンを見つけるための探索が
この位置から開始されます。
なので、デリミタが '\n' の時、文字列 "\n" においてデリミタでない最初の文字が見つからないから
strtokは何もしないで、null を返す。あと strtok は文字列を変更するので、リテラル文字列(文字列定数)
を第1引数にセットするのは、あまりヨロシク無いかもしれない。
>752に激しく同意。標準ライブラリ関数が当てにならなかった大昔ならいざ知らず、 標準関数を自前で再実装するのは最早滑稽。
>>753 >あと strtok は文字列を変更するので、リテラル文字列(文字列定数)
>を第1引数にセットするのは、あまりヨロシク無いかもしれない。
大丈夫、今回は>746含めて誰もそんなこと阿呆なコードは書いていない。
756 :
746 :2009/01/18(日) 20:32:34
仕様ってネットにあったんですね、すいません;; もやもやしてたのが取れた気がします。 皆さん分かりやすい説明ありがとうございました。
フリーのコンパイラは何がいいですか?
DMCがいいよ
デトロイトメタルシティの略ですね わかります。
gcc か Visual C++ でおk
>>763 narrayのポインタを渡してwalktree()で書き換えを行ってるわけだから
main()に戻ってきても当然書き換わったままとなる。
staticを使うと云々の場合はmain()のnarrayは書き換わらないからうまくいく。
main()でwalktree()を呼び出す前にnarrayをもう一つ変数を用意して保持し
後の表示ではその変数を使用すればよい。
>>764 なるほど。narrayがノード数分進められた状態でmain()に戻って、
そこから表示しようとしていたのが原因ということですね。
下記コードでうまくいきました。
struct tnode **narray2;
narray = nalloc();
narray2 = narray;
walktree( &narray, root );
while ( nnode-- > 0 ) {
printf( "%s\n", (*narray2++)->word );
}
とても助かりました。
ありがとうございます。
766 :
デフォルトの名無しさん :2009/01/20(火) 21:39:00
共有メモリと、systemV IPC メッセージキュー(smdmsg等)を使用した際のメッセージ通信 の手法をご伝授いただけないでしょうか?
疑問符はお願いするときに使うもんじゃないだろ。
Would you do me a favor?
769 :
デフォルトの名無しさん :2009/01/20(火) 22:07:05
smdmsgは初耳 逆に教えて欲しい位 と揚げ足取ってスマンコ
あるC言語の問題集に載っていた、clock関数を使った暗算についての
例題をそのまま実行したのですが、
正しく時間が計算されずその原因がわかりません。
例題のソースは下記にアップロードしました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8693.c このソースを実行すると、
---
視野拡大トレーニング開始!!
start_time:15
49 + 22 + 70:141
27 + 76 + 12:115
86+61+43:190
end_time:15
0.0秒かかりました。
---
となり、正しく時間が計算されません。
(start_timeとend_timeがなぜ同じ値なのか?)
どなたか原因を教えてください。
よろしくお願いします。
>>770 #define RepeatNum 30000
にしてみるとか
clock()はプロセッサ時間だから、かな?
>>770 標準入力待ちの間にclock()が進むかどうかは環境依存。
秒単位でいいなら標準関数のtime()が使えるが、
それ以上の精度が要るならgettimeofday()辺りでどうだろう。
>>767 いただけるか、いただけないかを訊いているんだろう。
いただきまーす!
C FAQ の 7.32 に 「戻り値を直接別の関数に渡す場合に(略)、例えば fgets(alloca(100), 100, stdin)のような式で問題を招く」 とありますが、これはなぜでしょう? alloca()の解放は fgetsを呼ぶ関数の終了時なので 問題ないようにみえますが
allocaの失敗したときを考えろよクズ
778 :
770 :2009/01/21(水) 18:08:19
>>771-773 ありがとうございます。
gettimeofday()関数を調べて、
ソース作りなおしてみます。
キャスト?
>>779 分けてちゃんと返り値ちぇっくしたら起こらない問題が起こるだろーが、理解したか?このカス
>>781 だからそんなのは本質じゃないって
お前は回答側に回るの半年早い
>>776 スタック方式に話を限定するけど
alloca()で確保された領域をいつ開放するべきかを決定する要素が「関数を抜けるとき」しかない
だからその他のローカル変数同様に確保する領域をスタック上に積んで
(よーするにローカル変数な配列のサイズをあとで決めるということだが)
それへのポインタを返すことになるわけだが、
問題はalloca()から制御が帰ってくるまで「現在のスタックの大きさ」が確定しないことにある
その状態で別の関数を呼び出す準備をはじめたら、
つまりalloca()から帰る前のスタックに値を積みはじめたらきっとひどいことになる
fgetsを呼ぶとき、よくある例だとコールスタックはこうなる(あくまで一例だけど)。 3番目の引数 2番目の引数 1番目の引数 fgetsからreturnする先のアドレス ところが、allocaが混ざるとこうなってしまう可能性が高い。 3番目の引数 (stdin) 2番目の引数 (100) allocaで確保した100バイト 1番目の引数 (allocaの戻り値) fgetsからreturnする先のアドレス こうなると、fgetsの中で、2-3番目の引数と思ってアクセスした場所が 実はallocaの領域だったという事態になってしまっている。 だからallocaを引数の中で使うなというわけ。
というかぜんぜん入門編の範疇じゃないな 「初心者が標準外の関数を使うな」で完
>alloca() 関数は、割り付けた領域の始まりを指すポインタを返す。
>割り付けによってスタックオーバーフローが起った場合の プログ
>ラムの動作は定義されていない。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/alloca.3.html NULLなどの特殊な値がかえってくるわけではなく、成功失敗は
プログラムからは決定できないので、呼び出すのは一種のバクチ
>多くのシステムにおいて、関数コールの引き数のリスト内では
>alloca() が使えない。
>これは、 alloca() によって予約されるスタック領域が、
> 関数引き数に使われるスタック領域の中に現れてしまうためである。
>>784 の言う通り
スタックポインタを操作する危険な関数で、仕様も素性もわからない
関数を標準ライブラリにあるからという理由で、気軽に「合成」して
使うと思わぬ落とし穴に嵌る可能性があるというお話
787 :
776 :2009/01/21(水) 19:23:44
回答ありがとうございます。
>>784 なるほど、関数のパラメタをスタックに積んでいるところを妨害する
可能性があるわけですね。非常に納得しました。
でもそういうアーキテクチャの場合、alloca をサポートしちゃいけないような気も・・
>>783 スタックフレームのサイズが静的に決まらないので、いろいろ実装が難しいですね。
とくに、関数コールがスタックフレームサイズを増やすアーテキチャの場合は
関数の外側で使わないとまずいですし。
>>786 確かに、不定値が返るって仕様は厳しい。
それでも GNUのstrdupa() みたいにわざわざ alloca版が作られているのは、
リスクもあるけど便利なんでしょうね
ようするに可変長配列万歳(違
標準ライブラリには危険なものも含まれているというよりか その後のC言語の用途や文法と処理系仕様の標準が相当に変わって きてしまっていて、伝統的な標準ライブラリを正しく使う 機会も、使うのに適したC処理系もなくなりつつあるというのが 実態に近いんじゃないかと。(これはWindows APIについても ある程度言える)要は、標準ライブラリですらそれを使うのは それなりの熟練が必要ということ。
gets!
というかちゃんと構造化してるなら allocaなんかつかわなくたって 明示的にmalloc/freeするのは そんな難しいことじゃないんだけどな
alloca は速さも重要だと思うが。
関数内で使うちょっとした領域を malloc で確保するなんて無駄じゃん。
>>794 お前は何を言っているんだ
具体的に何がどう無駄だと思っているんだ
そういう人はrubyでも使ったほうがいいじゃん
見た目がかっこいいってだけでCを勉強する価値ある? 本当はPascal のほうが好みなんだが、入門書売ってるの見たことないw 俺にとってはプログラミング言語すら見た目重視だからwww
かっこよさならPython だろ
Cプログラマにはイケメンが多いってことだろ
>>795 ちょっと実装して計ってみた
処理時間30倍ワラタ
小さくて多く呼ばれる関数だったらバカにできないせ
>>797 ちょっとした領域というのが本当にちょっとしたものなら、
ちょっとした配列をあらかじめ確保しておくのが管理も処理も効率的である。
ちょっとしたというには大きい領域が頻繁に必要になるなら、
最初から大きい配列を確保しておけばよい(どうせスタックに積まれるのだから)。
常に使われるのはちょっとした領域だけれど、
時折来る大きな領域にも対応したいなら、
普段はあらかじめ確保したちょっとした配列を使い、
大きな領域が来たときだけ大きく確保するほうがきっと効率的である。
もし処理そのものが滅多に呼ばれることがないなら、
処理時間に関する論議はほとんど無意味に近い。
いずれにせよallocaは標準外であり、それを使うための細かい話も環境依存である。
せ?orz
alloca がどれだけ簡単な処理か分かってて言ってんのかね。
それこそ環境依存だから一概には言えないけど スタックに積むだけなら自動変数と同等=タダ同然というのは間違ってる?
別に間違ってない
微妙に今の話題と関係ないんだけどC99で出来るようになった可変長配列は どっち系なの?malloc?
>>809 alloca相当の実装だと期待していい。
allocaはみんななんて読んでる?
あろっか
オールッカ
あろっか
他のスレで聞いたのですが反応がなかったのでこちらで聞きます。 setbuf, setvbuf 関数で自らバッファをmallocして設定したとき、fcloseしたらそのバッファもfreeされるのでしょうか? もしくはそのバッファは(gccでは)どういう運命をたどるのでしょうか。
817 :
デフォルトの名無しさん :2009/01/21(水) 21:59:50
hairetu[num]++ すみません、これはどういうことでしょうか? また、 hairetu[2] | = これもどういう風に足しているのでしょうか? = 1たすとは配列の要素番号を1たすということでしょうか? 下の方は、配列2の要素の値のビット数+ 右辺にあるビット数を足したものを 配列2に格納するというこでしょうか? 基本的に& や | があったら、ビットの演算子であるとおもえばよろしいのでしょうか?
初心者ですいませんがC#なんですけども、10万個くらいの配列のデータの正規化をしたいのですが、どのようにすればいいのかまったくわかりません。誰かご教授いただけないでしょうか?
スレ違い
俺は初心者でも別に吸っていいと思うんだ。
>>822 スレ違いであることを否定はしてないよ。むしろ全面肯定だ。
ただ、吸いませんなんて言わなくてもいいじゃない。吸ってても吸ってなくても同じだよ、ということを言いたい
相変わらずスレ違いには厳しいなここは これじゃ気軽に質問できねえよ
そんな厳しいわけでもなかろ。 言語が違うんだからしょうがないべさ。 英語ぺらぺらの人に北京語の質問してもいい答えは期待できないっしょ
>>824 たしかにw相手は初心者なんだから該当スレまで誘導くらいしてやれよ、上級者の先生たち
意味不明な質問するやつに、質問の意味を質問し返しても、 返事が返ってくる率って、すごい低いしな。
入門篇とかスレタイに入ってると糞素人ばっかり集まってきて困る 次からスレタイ修正したほうがよくね?
その前にさ、なんでこんなところで、お前らは、初心者を見下しながらレスしてんの?w
>>829 初心者だからバカにされてるとおもってるの?
だからいつまでもバカにされるんだよ。
初心者を見下したことはないよ。 スレを間違えていることを伝えてるだけで
みんなで次スレ名の修正案出そうぜ とりあえず俺は、 【初心者】C言語なら俺に聞け【お断り】
いや、別にこのスレで、あんたがレスしなければいけないという 法律もルールもないけど?答えたくなければ、答えなきゃ良いじゃん? この世に、自分以外の人間が何人いると思ってるんだ? 2ちゃんねるなんて、ユーザが限られているけど、不特定多数の人が来る場所だし その中の一人に過ぎない自分が、指定、限定されて答えを求められているわけでもないのに?w
俺は年商100億、家賃1ヶ月何千万もするマンションに住んでいますが、 そんな俺でもこのスレを見に来るんだぜ?
収支がおかしいだろそれはwwww
〜億ジンバブエダラーですが、何か?
平面座標上の図形の面積を求めるプログラムだと思うのですが、なぜこれでいいのか理解出来ません。 とくに、計算部分について解説していただけないでしょうか? なぜi=1なのか、どんな計算をしているのか、sとdは何なのかなど、よろしくお願いします。 手計算で考えてみたのですが、よく分かりません。 #include<stdio.h> #define MAXV 1000 int main(void){ int n; int i; double x0, y0, x1, y1; double v[MAXV][2]; double s, d; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%lf%lf",&v[i][0],&v[i][1]); } s=0.0; for(i=1;i<n;i++){ d=0.5*(v[i][1]+v[i+1][1])*(v[i+1][0]-v[i][0]); s=s+d; } d=0.5*(v[n][1]+v[1][1])*(v[1][0]-v[n][0]); s=s+d; printf("%6f\n",s); return (0); }
840 :
デフォルトの名無しさん :2009/01/22(木) 01:43:27
しつもーんです。 なんで while(*a++=*b++) っていうのが通るの? while文って継続条件だから、 そこにこーゆーコピーするような文ってダメなんじゃないの?
>>840 じゃ
while( 0) ;
ってダメ?
843 :
デフォルトの名無しさん :2009/01/22(木) 01:50:03
>>842 あ・・・・。
そっか・・・・。
んー・・・。
どゆこと???
代入文は条件文を包含する関係にあります
式ならなんでもいいから
846 :
デフォルトの名無しさん :2009/01/22(木) 01:51:45
>>844 じゃあ、条件文と兼ねてるってことですか。。。
わかりましたー。
あざます。
式に限らず値として評価できるものなら何でもいいよね
>>847 Cだとそれはすべて式に分類される。1のようなリテラル、hogeのような変数単体であっても。
>>839 ざっと見ると、図形を縦方向に千切りにすると
十分細ければ一つ一つは台形に近似できるので、
全体の面積=台形の面積の和
にしてるプログラムに見える。(2つ目のd=の計算がちょっと分からないけど)
その細切れが d (deltaの略?)、合計が s (sumの略?)
i = 1 にしているのは、これを作った人が配列の底を 1 にしただけ
C言語ではもちろん配列の底は 0 だけど、この場合配列は固定サイズだから
特に問題はない。BASIC とか FORTRAN 出身の人なんじゃないかね
>>848 ありがとうございます。言われてみればググルよりもfreebsdのsrcみれば早かったですね。
>>850 生半可な知識乙。
台形近似まで判っていて、なんで最後にもう一回台形の面積を足しているか判んないのかね。
3点入力したとしてシミュレーションしてみな。それでも判らなければ馬鹿だ。
>>839 それはいいとして、そのプログラムを書いた奴は随分いい加減だな。x0, y0, x1, y1は何のためにあるんだ?w
小数点の計算をしたいのですが、 double a; a = 1 / 100; printf("%f",a); こうした場合に0.01となりません。 どうすれば計算できますか?
1.0 / 100
855 :
853 :2009/01/22(木) 11:21:10
>>854 ありがとうございます。
パーセントの計算をしたいのですが
a = 1.0 - (1.0 / 100);
と計算したいのですがうまくいかないのですが
よろしくお願いします。
浮動小数点 C言語 誤差 あたりでググってからまた来い。
858 :
855 :2009/01/22(木) 11:48:21
<< 856 すいません。 結果は1.000000となってしまい計算が合いません。
誤差は出るけど、それは無いわ。ソース出してみ。
861 :
デフォルトの名無しさん :2009/01/22(木) 12:02:12
できる方いらっしゃいましたらお願いします! 整数z(2以上の値)を入力し、以下のような図形をn行の文字で表示する プログラムを作成せよ。 例. 10 <--キーボードからzの値を入力 1.********* 2..******** 3...******* 4....****** 5.....***** 6......**** 7.......*** 8........** 9.........* 10.......... 見えにくいですが、ドットがアスタリスクに反比例してでかくなってます。
863 :
858 :2009/01/22(木) 12:03:34
>>859 すいません。
上のa = 1.0 - (1.0 / 100); の計算では0.99とでました。
しかし
double a, b;
scanf("%f" &b); // b = 1.0
a = 1.0 - (b / 100);
printf("%f",a);
としたとき1.000000となってしまいます。
scanf("%lf" &b);
printf("%f",b); やってみな
>>861 #include <stdio.h>
int main()
{
char *s[] = {".*********",
"..********",
"...*******",
"....******",
".....*****",
"......****",
".......***",
"........**",
".........*",
".........."};
int n = 1, i;
scanf("%d", &n);
for (i = 0; i < n; ++i) {
if (i < 9) {
puts(s[i]);
} else {
puts(s[9]);
}
}
return 0;
}
868 :
861 :2009/01/22(木) 12:19:27
%lf でできました。 ありがとうございました。
ランダムに1か2の数を得るプログラムを作りたいのですが srand(10); rand() % 2 + 1; としたとき必ず1から始まってしまうのですが何か 良い方法はないでしょうか?
>srand(10); としなけりゃいい
>>872 873
すいませんでした。
rand() % 2 + 1;
だけでやってみたところ、
次は2から始まってしまいます。
だからsrandにいつも違う値を食わせるんだよ。 実行時に一回だけ現在時刻(秒数)を入れてやる方法が一般的
>>839 本当に面積を出すコードなのか?
面積を出す公式が少し違うけど、本当ならアルゴリズムスレで聞いたらどうだろう。
最近はゴミ見たいな奴が多くて困る
ゴミを見たい奴なんているのか?
オレオレ
>>871 ついでに言うとrand()の返す値の下位ビットはあまりランダムでないかもしれない
(1,2,1,2,1,2, …みたいになる可能性がある)
そういう場合には上位ビットを使うこと
rand()/((RAND_MAX+1)/2) + 1
>>875 できました。
ありがとうございました。
882 :
名無しの大学生 :2009/01/22(木) 14:57:30
1 プログラムからテキストファイルdate.txt(メモ帳)のデータ10個(7.8 3.2 4. 0 5.8 6.9 1.5 2.8 6.1 3.8 0.7みたいな感じの配列)を読み込む 最大値、最小値、平均値を求め、ディスプレイおよび、ファイルout.txtに出力 小数点以下2桁まで表示すること 2 1つの整数を引数とし、引数が素数であれば1、そうでなければ0を返り値とす るサブルーチンをつくる これを用いて自然数n以下の素数のうち最大のものを表示するプログラムをつく る。 この2つをといてください。。。 まったくわかりません Visual C++ 2008 Express Editionです
>>882 ファイルの入出力使えば終わります、以上。
scanf("%d",&n)の&にはどんな意味があるのでしょうか? printf("%d",&n)という書き方は間違いで、&は不要ですよね? &の意味を教えてください。
>>885 アドレス渡しています
まずは教本一冊ぐらい読むことを目指してはいかがでしょうか
>>885 c言語では関数の引数は、コピーが渡されますので、
関数内では元の変数を書き換えできません。。
ですから変数のアドレス(&)のコピーを渡して、
直接関数(scanf)内で変数に代入出来るようにしています。
配列名そのものは配列の先頭要素のアドレスと同値であるとありますが 配列名そのものは例外を除いて配列そのものを指し、その結果、 配列の要素を指すポインタに成り下がる、という段階を踏んでいる という解釈は正しいでしょうか?問題点があればご指摘下さい。
889 :
888 :2009/01/22(木) 20:10:03
間違えました。 配列名そのものは配列そのものを指し、その結果、 例外を除いて配列の要素を指すポインタに成り下がる です。
「その結果」は余分じゃない?意味がわからない
>>880 いまどきそんな質の悪いrand()はないよ。
rand() % 2 で十分。
直感的でない書き方してバグるともともこもないじゃん。
昔のglibcはひどかったな
>>892 ないという保証はどこにもない。
実際に使うかどうかは別として知識として持っておく必要はある。
だが
>>880 はありえない。馬鹿じゃねーの?w
RAND_MAX + 1 がオーバーフローするという件についてか
本当のバカ程、バカと言う言葉を当たり前のように使う
なんで0, 1が出てくるのか、なぞだったんだけど
>>897 なのか、どうも
VC++ だとオーバーフローしないが、 gcc だとオーバーフローする。
>>897 上位ビット取りなさいって言って、
rand() >> 16 とか教えてるやつも目撃したことあるな。
VCのRAND_MAXなんて、0x7fffなのに。
ワークを realloc()でちょっとづつ増やしてるコードに、 それじゃ遅いから、まとまった単位で増やすようにしなさいって アドバイスもよく見るな。 そんなことしても、たいしてっていうかぜんぜん速くならないし、 コードが複雑になってるだけって。
凄いループの中なら改善になると思うけどね。
JPEGファイルをfopenするとRGB色 8ビット x 3 の並びで読み込み可能ですか?
fgetc()を使うより、fread()でまとめて読むほうがだいぶ効率いいけど、 fgetc()を使ったコードが貼られても、さすがに、使うなってアドバイス するやつはいないな。
>>905 単純コピー処理を fgetc 使って実装してたらぶん殴るけどな。
909 :
デフォルトの名無しさん :2009/01/22(木) 22:51:14
>>906 どのみちCの標準関数つかってたら大差ないだろ。
VCのRAND_MAXってそんな小さかったのかw 初めて知った
913 :
デフォルトの名無しさん :2009/01/22(木) 23:24:03
大至急聞きたいんだが プログラムで点数ごとに積み上げグラフを作るプログラムを 作りたいんだがうまくいかなし期限波明日。。 作りたいプログラム テストを5回実施して 5回分の点数を配列に入れる ten[5]={64,53,36,23,36}←これはあらかじめ格納されてるとする。 んで縦100点までで、テスト点を100点で5回ぶん割る d=100; 割って1がたつなら ”*”を出力。それ以外は” ”を出力する。 終わったら d=d-10; でどんどん引いていいって最終的に↓見たいに出力するようにしたいんだ。 100点 * ** 90点 * *** 80点 ***** 70点 ***** 60点 ***** ・ ・ ・ ・ ・ ・ ・ ・ 別に子のやり方じゃなくても積み上げ式のがつくれっればいいんだ!力を貸してくれ!
わかった。
がんばれ!
917 :
デフォルトの名無しさん :2009/01/22(木) 23:28:54
>>914 >>916 おまいら・・・(;ω;)
すまねぇ 結構前に似た感じの作ったんだがlocateで位置を指定しても斜めに*が表示されたりして
まったく積み上げにならんのですはい><;
919 :
デフォルトの名無しさん :2009/01/22(木) 23:36:51
>>918 言ってることが難しくてよくわからんのだがC言語でつくらなければならんのだ^^;
友達が配列に5回分の点数を格納するプログラムを作ってくれて、俺がその点を使って
積み上げグラフをつくらんと遺憾のだ!
以前いい感じの積み上げがつくれて ↓ ↓の積み上げの位置に入れようとしたんだが 綺麗に入らなくてまいった。。
printf(" ┏━━━━┳━━━━┓ ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃たたかう┃そうび ┃ ┃ ┃\n");
printf("┃じゅもん┃どうぐ ┃ 100%%┃ ┃\n");
printf("┃ぼうぎょ┃にげる ┃ ┃ ┃\n");
printf("┃ああああ┃ああああ┃ ┃ ┃\n");
printf("┃ああああ┃ああああ┃ ┃ ┃\n");
printf("┗━━━━━━━━━┛ ┃ ┃\n");
printf(" 80%%┃ ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ ┃\n");
printf(" 60%%┃ ┃\n");
友達なら一緒に考えればいいのに
921 :
デフォルトの名無しさん :2009/01/22(木) 23:42:01
>>920 遠方の友達だし、ソイツはいろいろ忙しい奴だから時間帯があわんのです。。
まあいいとして、環境は。
分担が変すぎるな
924 :
デフォルトの名無しさん :2009/01/23(金) 00:06:30
>>922 .NETです。
学校でグループ課題なんでSEも生徒なんで分担は適当です;;
>>924 OS XP
言語 C言語
コンパイラ Visual Studio.NET2003
.NETが、どうしても.NEET見えてしまう俺の目は、たぶん正常
928 :
デフォルトの名無しさん :2009/01/23(金) 00:29:01
>>928 普通に10で割って64点なら6個積み上げ53点なら5個積み上げってのにしたほうが
>>913 に比べてなんか効率いいなぁと思ったけどどうなんだ
>>928 いや、待っててといっただけで別に作成などしていないが
つーか、>913の質問のポイントはどこなんだ? カラムが揃わないのだけが問題なら先ずはそのソースを晒せよ。調整くらいならしてやるよ。
>>929 そっちのがいいですな!
>>930 orz
>>931 説明不足しまくっててすまん。
それが書いたプログラムを学校に忘れてないんだ。。
実質1からの作成だ。
まずは普通に点数をつみあげにしたい。
63点なら■を縦に6つつむ見たいな感じで。
それを
>>919 でprintfで書きまくってるグラフの中に入れたいんだ。
もっと効率いいやり方があるかもしれんが俺ができそうなのはこの作り方くらいとおもってる。
よし判った、任せろ。 それはさて、>919の時点で出力がずれてしまうのはいかがなものかと。 もう少しまともに書けよ、とは思った。
>>919 #include <stdio.h>
int main(){
int ten[]={84,73,100,93,66};
int d,i,k=sizeof(ten)/sizeof(ten[0]);
printf("┏━━━━┳━━━━┓ ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃たたかう┃そうび ┃ ┃ ┃\n");
for(d=100;60<=d;d-=4){
switch(d){
case 100:printf("┃じゅもん┃どうぐ ┃ 100%%┃ ");break;
case 96:printf("┃ぼうぎょ┃にげる ┃ ┃ ");break;
case 92:printf("┃ああああ┃ああああ┃ ┃ ");break;
case 88:printf("┃ああああ┃ああああ┃ ┃ ");break;
case 84:printf("┗━━━━━━━━━┛ ┃ ");break;
case 80:printf(" 80%%┃ ");break;
case 76:printf(" ┃ ");break;
case 72:printf(" ┃ ");break;
case 68:printf(" ┃ ");break;
case 64:printf(" ┃ ");break;
case 60:printf(" 60%%┃ ");break;
}
for(i=0;i<k;i++){
if(d<=ten[i]){
putchar('*');
}else{
putchar(' ');
}
printf(" ");
}
printf(" ┃\n");
}
}//俺の力ではここまでだな。
935 :
デフォルトの名無しさん :2009/01/23(金) 00:51:40
>>933 本当に説明不足だらけですまなかった。。
俺のどっとネット上では体裁は整ってるんだがなw
今まで縦にものをつむプログラムを書いたことが無くてよくわからないんだ。
とりあえず縦につめればlocateで位置指定してprintf嵐のグラフに叩き込めるはずなんだが
>>934 おおwwwこんな感じだwwwww
ten配列の中身は変わるから川ってもちゃんとつみあがるのかな?
936 :
933 :2009/01/23(金) 00:52:00
もう一つ。要は5回分を10で割った上で足した分だけグラフになればいいのか? で、>919は60%から上しかないが下も含むということか? つまり、こんな出力か? ┏━━━━┳━━━━┓ ┏━━━━━━━━━━━━━━━━━━━━━━━┓ ┃たたかう┃そうび ┃ ┃ ┃ ┃じゅもん┃どうぐ ┃ 100%┃ ┃ ┃ぼうぎょ┃にげる ┃ ┃ ┃ ┃ああああ┃ああああ┃ ┃ ┃ ┃ああああ┃ああああ┃ ┃ ┃ ┗━━━━━━━━━┛ ┃ ┃ 80%┃■ ┃ ┃■ ┃ ┃■ ┃ ┃■ ┃ ┃■ ┃ 60%┃■ ┃ ┃■ ┃ 中略 ┃■ ┃ ┃■ ┃ ┃■ ┃ 0%┃■ ┃
locateってなんぞ?
938 :
デフォルトの名無しさん :2009/01/23(金) 00:58:38
>>936 そうだ!そうだ!こんなんだ!!!
>>919 の0%まであるやつだw
>>937 windowsヘッダだ
locateは座標指定(カーソル移動)できるんだ。
939 :
933 :2009/01/23(金) 01:00:23
// 文字列を選択する static const char * sel(bool var) {return var ? "■" : " ");} // 超横着版。普通は、ループで処理するもんだがなw void func() { int ten[]={84,73,100,93,66}; total = ten[0] / 20 + ten[1] / 20 + ten[2] / 20 + ten[3] / 20 + ten[4] / 20; //10じゃなくて20で割ってみた printf("┏━━━━┳━━━━┓ ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf("┃たたかう┃そうび ┃ ┃ ┃\n"); printf("┃じゅもん┃どうぐ ┃ 100%%┃%s ┃\n", sel(total == 100)); printf("┃ぼうぎょ┃にげる ┃ ┃%s ┃\n", sel(total >= 96)); printf("┃ああああ┃ああああ┃ ┃%s ┃\n", sel(total >= 92)); printf("┃ああああ┃ああああ┃ ┃%s ┃\n", sel(total >= 88)); printf("┗━━━━━━━━━┛ ┃%s ┃\n", sel(total >= 84)); printf(" 80%%┃%s ┃\n", sel(total >= 80)); printf(" ┃%s ┃\n", sel(total >= 76)); // 中略 printf(" ┃%s ┃\n", sel(total >= 12)); printf(" ┃%s ┃\n", sel(total >= 8)); printf(" ┃%s ┃\n", sel(total >= 4)); printf(" 0%%┃%s ┃\n", sel(total >= 0)); }
940 :
933 :2009/01/23(金) 01:05:59
実際には void func(int * ten) { // 前略 // 中略 // 後略 } みたいな感じかな。真面目に書き直そうかと思ったけど、冷えたからお風呂入ってくるw
941 :
デフォルトの名無しさん :2009/01/23(金) 01:06:23
>>939 うお!すごいです! ありがたいんですが、voidfuncやスタチックはまだ習ってないンで使ってたらあやしまれちゃいます(笑)
942 :
デフォルトの名無しさん :2009/01/23(金) 01:06:58
じゃぁ int func() に帰ればいいよ 警告は無視すればいいよ
できれば
>>934 さんがつくった奴みたいな感じがいいです。
他の方のもすごいですが難しくて^^;
>>934 さんのは66点でも*が2こしか積みあがらないんですが、条件式のどこがいけないのかよくわからないです。。
946 :
デフォルトの名無しさん :2009/01/23(金) 01:34:45
case 60:printf(" 60%%┃ ");break;
のあとに↓見たいにどんどんマイナス4していった数値を書いたんですが
case 56:printf(" ┃ ");break;
case 52:printf("┏━━━━━━━━━┓ ┃ ");break;
case 48:printf("┃平均 ┃ ┃ ");bre
error C2018: 文字 '0x81' は認識できません。
とエラーがでてます。。 これは全角のエラーですよね?
>>934 さんのにも普通に全角がつかってあるんですがコンパイルとおりますね・・なぜ?!
平均ってなんだろ・・・
しんどかったですが何とか出来上がりました!ありがとうです^^ ネットならではの素早い回答ありがとうでした。 よくできたプログラムなので学校の友達に見せることができそうです!^^ ありがとうございました ほんとうにお世話になりました^^ どっと疲れたんで もう寝ます。
951 :
933 :2009/01/23(金) 02:10:05
なんだ、嫌われたのねw つーか、飽きたから寝るわ。 と言いつつ。 うーむ、sel((total == 100)じゃなくてtotal == 100 ? "■" : " "でも難しいと言われたのかしらw
>>950 その学校の友達とやらはここ見てたりしないのか
ここには人がいる、有人さ、なんつって
はい。
最終的に使い物になるのか・・・? #include <stdio.h> #include <memory.h> char buf[47];int ten[]={84,73,100,0,93}; static const char * sel(int d) { int i,k=sizeof(ten)/sizeof(ten[0]); memset(buf,'\x20',46); for(i=0;i<k;i++){if(d<=ten[i]){buf[8+i*8]='*';}else{buf[8+i*8]=' ';}} buf[46]='\0'; return buf; } void func(){ printf("┏━━━━┳━━━━┓ ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf("┃たたかう┃そうび ┃ ┃ ┃\n"); printf("┃じゅもん┃どうぐ ┃ 100%%┃%s┃\n", sel(100)); printf("┃ぼうぎょ┃にげる ┃ ┃%s┃\n", sel(96)); printf("┃ああああ┃ああああ┃ ┃%s┃\n", sel(92)); printf("┃ああああ┃ああああ┃ ┃%s┃\n", sel(88)); printf("┗━━━━━━━━━┛ ┃%s┃\n", sel(84)); printf(" 80%%┃%s┃\n", sel(80)); printf(" ┃%s┃\n", sel(76)); printf("〜中略〜〜中略〜〜中略〜〜中略〜〜中略〜〜中略〜〜中略〜〜中略〜〜中略〜\n"); printf(" ┃%s┃\n", sel(12)); printf(" ┃%s┃\n", sel(8)); printf(" ┃%s┃\n", sel(4)); printf(" 0%%┃%s┃\n", sel(1)); } int main(){ func(); return 0; }
すみません。 C言語の文字列の配列の中身をソートするプログラムを組みたいのですが 何か良い方法はありますか。 教えてください。
あります。
おしえていただけますでしょうか?
ググレカス^^
qsort
クソート
クイックソート、速く言うために略して クソート なんつって
うん?
なんかさ、こういうところでカンニングして 不合格になるべき人間が合格しちゃうってのはマズイよな
カンニングは相方がいなくても有名ですが、何か?
#include<stdio.h> int main(void){ int no,nu,na; int tw; double num; printf("1回目の得点は?\n"); scanf("%d",&no); printf("2回目の得点は?\n"); scanf("%d",&nu); printf("3回目の得点は?\n"); scanf("%d",&na); tw=no+nu+na; num=(double)tw/3; printf("合計点:%d点\n",tw); printf("平気点:%5.1lf点\n",num); return(0); } 小数出るけどどんな計算しても .0 になっちゃう。。。 何がいけないのかな、、、
>>967 num=(double)tw/3; -> num=(double)tw/3.0;
printf("平気点:%5.1f点\n",num); に直したら? 古いコンパイラだと、本当に不味かったはずだから
いや、比較的新しいのだと、c99対応のオプション付けなくても警告出したりしつつも表示してくれるじゃないか
>>967 手元にあるgcc-3.4.4はそのままで問題なく動いたよ
1回目の得点は?
7
2回目の得点は?
8
3回目の得点は?
10
合計点:25点
平気点: 8.3点
>>967 %lf以外に悪いところはなさそうだが
ちなみにコンパイラは何
%lfでも平気だろってことか
だから、%g使おうぜ。
>>969 の通りにしたらできました。
返信してくれた人ありがとうございました。
c89(多分)のbcc5.5でも同様だった 1回目の得点は? 7 2回目の得点は? 8 3回目の得点は? 10 合計点:25点 平気点: 8.3点
たいていは独自拡張で対応している、 そもそも間違える人が多すぎで大概のコンパイラが独自拡張して、挙句標準に取り込まれたようなものなんだから もうちょい古いgccなら0.0になっちゃうよ
>>970 みたいにscanf()のと混同するヤツ多すぎたんだろうな
980 :
デフォルトの名無しさん :2009/01/24(土) 15:27:05
関数の中で値のチェックをしたいんですけど、 もし、比較する値が同じであれば return 1; で1を返したいんです。 もし違うのであればそのまま関数を抜けたいんです。 関数を抜ける方法ってありますか?
1以外の何かを返せ
>>980 戻り値の有無を切り替える事は出来ない。
同じでも違っても関数は何かを返さないといけない 違う場合にその値を使わないのであれば 関数の呼び出し側で結果を使わず捨てればいい
void f()でも?
986 :
デフォルトの名無しさん :2009/01/24(土) 15:49:38
途中で関数を抜けてメインに戻る。 なんてのは出来ないって事ですよね。 戻り値。。。 もうちょっと考えて見ます。
987 :
デフォルトの名無しさん :2009/01/24(土) 15:51:01
いふ文で分岐させればいいだろ
途中でreturnすることもできるが、関数が戻り値を必要とするなら、そこでも戻り値が必要になる。
980の関数がどんな関数なのかわからないが、 比較して同じであれば1を返すなら、そうでない場合は0を返すのが普通だと思う。 返した1をどこで利用するつもりかはしらないが、 そこに値を返さないで正常な動作になるとは考えにくいが。
setjmp使えばよろし
きっと、「値を返す」が「メインに戻る」処理を兼ねて いることがわかって無いんだろうな。
コンソールのUIはncursesライブラリを使えよ・・
993 :
デフォルトの名無しさん :2009/01/24(土) 18:37:52
994 :
デフォルトの名無しさん :2009/01/24(土) 18:40:39
995 :
デフォルトの名無しさん :2009/01/24(土) 18:43:57
996 :
デフォルトの名無しさん :2009/01/24(土) 18:49:47
>>979 みたいにアンカーだけで内容が書かれていないのに、
相手が何をレスしようとしたか、勝手に想像するヤツ多すぎたんだろうな
2chでアンカーにレス番だけでバカにするつもりじゃないって言い訳は通らないw
1000 :
デフォルトの名無しさん :2009/01/24(土) 18:57:03
おまえら全員氏ね
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。