3 :
デフォルトの名無しさん :2007/09/21(金) 14:23:00
あの〜 unsigned int *i; //2byteです unsigned char *c; //1byteです c=i; を実行したいのですがエラーになります。 要するに*iの2byteの上位バイト(又は下位バイト)のポインタをcへ入れたいのですが... お願いします
c = (unsigned char*)i;
>>3 たとえintとcharのサイズが違ってもint*やchar*のサイズは同じだよ
そこはわかってるだろ
7 :
3 :2007/09/21(金) 14:34:26
動きました。 ありがとうございます。
c = (unsigned char*)i + 1; c = (unsigned char*)i; エンディアンによってどっちが上位か下位かは変わる
ミスキャストかな? 削除依頼出しとけ
削除依頼?なんで?
単独質問スレを
>>3 が立てたんだと勘違いしたんだろ
>>997 マジレスするとその本は超いい本だからすぐにでも買っとけ。
その本を読破したら「プログラミングwindows(上)(下)」 Charles Petzold著 を読んどけ。
これで君は立派なゲームプログラマーになれるお。
13 :
デフォルトの名無しさん :2007/09/21(金) 20:47:47
すみませんここで聞くべきかわからないのですがちょっと質問させてもらいます。 現在大学に通ってて3回生の理系です。 将来情報系のとこに就職しようかと迷っているんですがC言語はできないとまずいでしょうか? C言語の授業があるんですが半日も使ってやる授業が週2回もある授業なのでメリットがなければその授業受けずに シスアドとかの資格の勉強に時間をあてようかと思ってます。 C言語はSEなどのプログラマーが主に勉強する内容なんですか?
シスアドはあと二年くらいでなくなるよ。
C言語を使わない仕事を選ぶならC言語ができなくてもいいんじゃね 情報系といっても分野が広いから
みなかみの親水公園。水が冷たくて死ぬかと思った。 ラフティングがよく通る。帰りは温泉でサパーリと。
18 :
デフォルトの名無しさん :2007/09/21(金) 21:35:33
>>16 技術志向ではないんですよ・・・プログラミングとか苦手で・・・
あまりC言語に興味なくて初心者からでもC言語は理解できるものなのでしょうか?
興味がないなら身につかないんじゃね
>>13 開発の仕事に就きたいのじゃないの?
せっかく授業でやるんだったら、しっかり身につけておいても良いと思う。
あとで他の言語やるときにも、その知識から応用が聞くと思うし...
>>18 理解できるよ。Cは本がたくさん出てるから安心。
>将来情報系のとこに就職しようかと迷っているんですが
がミソだな
Cを覚えても「サーバー管理をやることになりました。どうすればいいですか?」ってオチがありそうだw
俺は「新卒?別にそんなの関係ねえ。プログラマで食ってくぜ」って決めてたから
>>13 の気持ちはわからん
>>18 > SEなどのプログラマー
って言ってるけど、SEとプログラマは別物だよ。
もちろん双方の知識があるに越したことはないが。
自分の進みたい分野の情報をもっと詳しく収集してみてください。
>>13 本当に理系学生なの?
適正は文系な気がするんだが…
メリットがどうこういうよりは
やりたくないからそれを後押ししてもらいたいだけのように感じる
すでに自分の中で結論が出ているみたい
一言で言うと女性の悩み事相談みたいだ
最低でも1つはプログラム言語に触れておいた方がいいと思うよ VBなりJavaなりが使えるならそれでいいし、使えないならC言語も選択
最近はプログラム好きじゃない奴も学ぶのね・・・
しかし、一回半日で、週二回の授業じゃ、時間だけつかって、なにも身につかないって感じになりそう。 モチベーションが高くて、授業以外にも自分でガンガンやるなら、数ヶ月とか短期間でもそれなりに できるようになるだろうけど。
28 :
デフォルトの名無しさん :2007/09/21(金) 21:53:14
今日初心者のオレは200ページのC言語の本を一日で半分終わらした
プログラマってプログラムが好きでずっとパソコンの前にいても平気な人達がする仕事なんだろうなって思った
俺はそうだけどそうじゃない奴が多いのは会社に入って気づいた
>>29 求人みれば、んなこたーないってわかる
思う前に考えろ
コマンドライン引数ってよく分からないけど使えないとこれは無理ってことあります?
この板に来てるPGは、技術力じゃ日本の60万人のPGの上位10%には入ってるな。 ネットで技術情報を積極的にチェックしてるPGでさえまれな存在だから。
愚痴だがこんなネガティブな質問の仕方されるより 「これ使うと幸せになりますか?」だとウレシイな
>>32 ファイルをexeファイルにドラッグ&ドロップして開くとか
>>32 ファイルをダブルクリックして、アプリを起動するときに、コマンドラインから渡してるんじゃなかった?
>>32 コマンドラインでコンパイルするのが面倒になる
make が使いにくくなる
>>28 俺は独習C#一冊を2時間で終わらせた
それ以前にC#は経験してたけど
俺は独学でC一回を2時間で終わらせた それ以前にCは経験してたけど に見えた
まぁCも経験してたよ
その煽りは何のためにあるんだろうね
会社に入ると最初は研修があると思うけど初心者でもついていける?研修終わったらもう働けるような 技術はついてる?
到底無理だろうな。
>>43 そうなるように努力しなさい。
分からないことは研修の担当者にドンドン質問しな。
ただ、最初はさすがに先輩も(言い方は悪いが)期待してないと思うよ。
OJTといって現場での実務兼訓練があるし、[修行は一生]なのはどんな職業でも一緒だろう。
ありがとうございます。中には研修で挫折する人もいると聞いたのもので・・・。 そうならないよう今のうちに言語に触れておきます。
25 :デフォルトの名無しさん:2007/09/21(金) 21:47:43 最低でも1つはプログラム言語に触れておいた方がいいと思うよ VBなりJavaなりが使えるならそれでいいし、使えないならC言語も選択
VBなんてと思ったが・・・ EXCLで使うんだな
C++のような EXCEL使えるのか?
51 :
デフォルトの名無しさん :2007/09/22(土) 00:13:04
俺も就職が文系よりあるからなんとなく理系に来たDラン大の2回なんだが、 実際就職してみるとこういう仕事でもなんだかんだ言ってできるもんじゃないの? てか将来やりたいことなくて理系きたの失敗か?
何だかんだ言って出来ないのに職に就いているヤツは多い。
>>51 大手に入れないようならIT系はやめたほうがいいよ。
中国人やインド人の10倍の価値がないと競争できなくなる。
高速プログラムにはやっぱり インラインアセンブラが使えるC++だろ
インラインアセンブラが使え無い言語は 基本的に劣っていると考えたい・・・
俺もパソコンが好きだから理系にきたけどスキっていうのはパソコンを扱うことのほうで プログラムとかそっち方面じゃないってことに気付いたけどもう手遅れ
運用を担当すれ 開発じゃなく
インラインアセンブリなんかに大した価値は無い コードはもっと高級な言語で書くべき
っていうかパソコンがあまり発達してないときに就職したおっさん共が開発とかプログラミングできるわけねーだろ だから今はIT系の会社への就職は引っ張りだこだぜ?Dランでもまともなとこに就職できる。 そのためには情報収集しっかりしろ。今からちょこっと勉強して取れる程度の資格も就職活動のみのために取るというのなら必要ない。 SPIとか学校で学んだことを企業に伝えるためにも勉強しろ。
そういや俺の大学Fランなんだけど、研究室の教授が顔の広い人なんだ。 んで知り合いがその教授に日立への推薦貰って内定貰ってたんだけど今そいつどうしてるかな・・・ うちの大学で日立とか完全に場違いなんだけど入った後、相手してくれるのかな?
今の時代のIT企業は文系型の学生も取るようになったの?
うちの大学も地元じゃレベル低いけどNECとか行ったしな。やっぱやらなきゃってなると 変わるのかな
今も昔も採ってから研修させることなんてよくあるだろ。
パソコンは好き、でも理系大変そうだし行きたくないって人は文系でIT系の会社に行く人が多いみたい。 中には文系なのに理系の人よりパソコンに詳しい人とかプログラミング得意な人いるし
>>58 うちではインラインアセンブラはフラッシュやらチップの制御以外にはほとんど使っとらんが、
変な「べき論」のたまう前に、お前はもうちょいPC以外がターゲットの開発環境があることを知れ。
>>59 大手はプログラミング能力軽視だよ。
日本じゃ技術指向のやつは働く場所ないよ。
じゃあ就活はやっぱり学歴が最重要なのか・・・Dランの俺オワタ
>>59 若い会社が多いから、引っ張りだこってことは無いと思うぞ
○遣とか契○とかは大量らしいけど
今将来性のある理系の職種ってなに?
この業界学歴はあんま関係ないよ いいところに行きたいなら別だけど
開発しているソフトウェアを自社製品として売る企業 ↑これなんて言う職種?
理系のいい所は超一流企業以外に入る場合は学歴あんまり必要ないこと。 後は人間性とブラックリスト会社に入らないための情報収集能力じゃね?
NTTなんとかの社長(うろおぼえ)が、技術を軽視しすぎた、これからは技術重視でいくって 宣言してたけど、技術軽視になるのは、日本のソフトウエア産業の構造の問題だから、どうにもならんわな。
「職種」を国語辞典で引いてくるといい と思ったけど、詳しい解説は載ってなかった orz
そろそろまとめよーぜ これから将来性のある安定した理系の進路はいったい何?
>>60 大丈夫だよ。
日立系はそういう人間で組織が出来ている。
ちなみにどこの国の話かしらんが、某F系は口の巧いだけの奴がな、、、、
人事も普通の会社はエリートなんだが、コネの奴がな、、、、
そんな奴らが成果主義で、採用・配属をだな、、、、、
>これから将来性のある安定した理系の進路はいったい何? 地方公務員
まぁここで言える事はおまえらスレ違いだから 就職板かマ板にでも行けという事だな
Fラン理系大でも就職できるのか?
Fラン理系大=就職できないとなるとフリーターがさらに増えることになる。 希望するところに就職できるかどうかはあんた次第じゃね?
分かってない若造が多いみたいだから忠告しておくけど、学歴社会なんて崩壊してんぞw 結局はコネ、人脈。どんなに一個人が優秀でも、人間社会なんて複数の人たちで活動をするんだから 協調性や他人とのやりとりがうまい人の方が最後は勝つ。 どうせ一人で出来ることなんてちっぽけだろ。おまけに現代じゃもう高度な技術を使った プログラムよりも、より楽しめるプログラムの方が需要がある。 PCの性能もよくなったしのぉ。PCを使って楽しませることが出来るアイデアを出せる人の方が良いぜ? 前の前のコードを見たって詰まらん。どうせ人間いつかは死ぬ。だったら楽しもうぜ? まぁ、一部ランクの高い大学を卒業して、研究を続けるってなら話は別だがな。 研究して新たな発見を出来た成功者は良いが、何も発見できなかったら悲惨だな・・・ 自分は何のために生きてきたのか?
前の前のコード > 目の前のコード あと、長文すまそ。
前向きに「何のために生きていくのか」って考えようぜ 成功ばかりが人生じゃない
>>83-84 長文云々以前にスレ違いが分かってないお前が
何を「分かってない」と言ったところで説得力のカケラも無い。
巣に帰れ。
83の書き込みはある意味当たってると思うけど...
>結局はコネ、人脈。どんなに一個人が優秀でも、人間社会なんて複数の人たちで活動をするんだから >協調性や他人とのやりとりがうまい人の方が最後は勝つ。 要は他人の力か自分の力かよくわからん文章だけど・・・ ま、言いたいことは伝わる。
この業界に変な期待をもってると痛い目に会うよ。
学歴社会が崩壊してるんじゃなくて、プログラム関係の仕事に学歴が必要ないだけ。 肉体労働に学歴が必要ないのと同レベルの話
>>88 人間一人が考えられることなんて、過去の経験や直接的ではない知識やらも含めて
限界があるってこと。優秀優秀ったって、人一人に流れる時間は限られている。
その限られた時間の中で、複数で作業をすればそれなりに出来上がるものはある。
どうせ人間なんていずれは死ぬ。流れる時間に限りがある以上
そして朽ち果ててしまう以上、一人なんてちっぽけってこと。
そんなのは生きていれば誰もが感じること。
肉体労働って人をバカにしたやり方してる所がまだあるんだ?
流れる時間が平等とは限らないけどな
最初は誰でもへたくそだけど、だからこそ、へたくそなりの使い方しないと...
>>89 おそらく使われていれば良いという考えだと、将来使い捨てでポイ
自分で新しいビジネスを起こすぐらいの気持ちがないと生き残れないよ
>>93 平等だよ。それとも君は地球外生命体で自分の周りだけ
周りとは時間の流れが違うのか?1年前、みんな今より1歳年が若かったのに
君だけは1年後も1年前も他の人と違って1歳の年齢はとらずに生きていると?
面白い発言をコピペしておきます。
7 名前:名無しさん@八周年 投稿日:2007/09/21(金) 19:00:23 ID:aXqlUEcZ0
大卒で正社員じゃない奴ってこのスレに多そうだなw
知ってるか?高卒の生涯賃金って高卒の半分なんだぜwww_?
中卒なんてもってのほか
可哀想にお前ら
そんな俺はもう4月に内定貰ってこのスレいますけどねwwwwww
>>93 唯一時間だけが平等なのに…
>>96 話をするたびに
(高卒の生涯賃金) = (高卒の生涯賃金) / 2
このように減っていくわけですね^^;
ありえねー!
話半分で聞いとけって
>>97 Cスレなんだから
(高卒の生涯賃金)>>=1; でw
逆に考えるんだ。 高卒が高卒の半分ってことは、高卒は高卒の2倍であるってこと。 つまり、無限に増えてくんだよ!
どっちなんだぁーーー!!!
高卒の生涯賃金=0
生涯賃金の額より、生涯を通して働けることのほうがはるかに重要 雇用の規制緩和によって、使い捨てポイが当たり前になってきているからな。
高卒の生涯賃金 != 0 高卒の生涯賃金 = 0 高卒の生涯賃金 == 0
以前見たこんなコピペを思い出した すでに絶滅したと思われていたマンモスが増加していることが調査の結果分かった これまでの調査結果からのシミュレーションでは0除算エラーが起きており 計算式を見なおしたところ50年前に比べ3倍にまで増加していることが判明したという… みたいなやつ ググったけど引っかからなかった orz マンモスじゃなかったのかな
>>104 かなり違う
800 名前:イラストに騙された名無しさん :2006/09/24(日) 17:30:07 ID:uLrwLRrh
「絶滅うそ」マンモス、20年で10倍に
乱獲によって絶滅の危機にあると思われていたマンモス猟問題で、千葉電波大学の研究グループが
これまでのシミュレーション・プログラムに誤りがあったことを発見。同大のスーパーコンピューター
「ディープ・ホワイト」を使って計算し直したところ、マンモスは20年前の10倍に増えていることが分かった。
マンモスはヒトによる乱獲によって激減し、絶滅したとまで考えられていた。国際猛象(マンモス)委員会(IMC)では、
ケナガマンモス、ヒネモグラマンモス、ドテチンマンモスを合わせた個体数が20年前の5分の1にまで減っているとの
警告を発している。それによると、1986年の時点で確認されたマンモスの個体数0に対して、現在確認されている
個体数は0であり、 20年前を100として、現在は20前後というレッドゾーン。ワシントン条約により一切の捕獲が
禁止されることになった。
ところが、千葉電波大学の研究グループがIMCの計算を点検したところ、「ゼロ除算エラー」という誤りが
発生していることを発見。プログラムを修正して再計算すると、ケナガマンモスの頭数は20年前の
10倍になっていることが分かったという。同大では「逆算して検算もした。ケナガマンモスの頭数は20年前の10倍
で間違いない」としている。
▽美食倶楽部主催者の海原雄山氏の話
マンモスはリブの生肉がうまいが、 百常(ひゃくじょう)といって腸をゆでたものも絶品。山羊乳のチーズと合わせたり、
アンモナイトのスープでフランス風に調理するのも乙。牙は印鑑にも使え、間然とするところのない食材である。
106 :
デフォルトの名無しさん :2007/09/22(土) 21:56:35
プログラムとかいろいろ将来で使ってみたいと思う普通学科高校生ですが 大学生から勉強し始めるのでは遅いでしょうか 今から勉強しようと思っても成績上位をキープするのが大変で手がつかないという現実で困ってます
別に遅くないよ
>>106 大学から初めて遅いということはない
大学の全人教育科目の中に情報関連の科目があるからそれで勉強できる
個人で勉強してもよい
いまは大学入試を優先するということでよいと思います
2chや他の趣味の時間を減らせば高校から始めてもいいと思うよ。
大学生からの人のほうが多いと思う
基本的に入試のための勉強でいいけど 数学と英語なんかの素養はしっかり身に着けておくといいよ
英語の素養は重要だよね 英語できないやつのコードは読めたものではない
おまえらいい加減にしとけよ
俺も高校のころは普通科だったから大学入るまでパソコンをインターネット以外に使ったことなかった。 今は普通科でもパソコン使う学校あるみたいだけど
int nTate, nYoko; とか読む気無くす
工業高校だったけど、学校にあったパソコンは、95以前のやつと制御専用機ばっかで、パソコンは黄ばんでるのがデフォだと思ってた
スレ違いだからそろそろ遠慮してね
まぁそうだな、とりあえずおまいら、フランスに渡米しろw
>まぁそうだな、とりあえずおまいら、フランスに渡米しろw
アメリカでフランスっていうと自由の女神か?
>>まぁそうだな、とりあえずおまいら、フランスに渡米しろw
つられないように 「フランスに渡米」はネットで有名 ガイシュツのようなものだ
構造体のポインタが分からん
>>125 そのまんま
構造体がある場所のアドレスのこと
ポインタが分からないという人はCPUが扱うところのアドレスを勉強するといいよ
構造体じゃないポインタはわかるのか?
スマソ。構造体というかプログラムが長くなると全部が難しく見える初心者なんだ・・・
プログラムを作るのってやっぱ経験が大事? 例えばfor文覚えたりポインタや構造体覚えたところで「じゃあ○○ができるプログラム作って」って 言われた場合すぐにこうやればできるんじゃねって思いつくもの?
経験していなくても解ける人もいれば、経験しててもなかなか解けない人もいる 人それぞれ
本当に基本的なことだと応用で使おうと思ってもきついかも。 この業界は勉強すれば何とかなるって世界ではないような気もする。 作る人のセンスも関係するかと
反復練習の偉大さを今こそ
133 :
106 :2007/09/23(日) 07:26:53
すまない寝てしまった 数学はかなり得意なほうだが英語は・・・なんだ とりあえず最低限単語だけでもしっかり覚えれるようにしておきたいと思う プログラムは暇なときに眺める程度でおいておくことにする どうもありがとう
本だけ読んだ頭でっかちの奴は使えないことが多い。 慣習的なことが身についてなかったり、とりあえず動く的なコードとか糞読みにくいコード書いたり・・・
コマンドシェルで遊んでみればいいんじゃないかな Cやるよりは即効性あるし
136 :
デフォルトの名無しさん :2007/09/23(日) 16:33:08
enumって何に使うんですか? (´・ω・`)
名前つきの整数定数を作るため
連続した定数を#defineするのが面倒なとき
型として使うことが出来て、範囲外の値の代入をコンパイラが警告することができる。
140 :
デフォルトの名無しさん :2007/09/23(日) 18:37:42
char c; c = '\'; //\文字をcに入れたいんだけど
c = '\\';
142 :
140 :2007/09/23(日) 19:37:26
>141 了解です。
enumはエニュームもしくはイニュームと読みます。 enumerateの略で数え挙げる・列挙するという意味ですが、Cのenumは「列挙する」です。 いくつかの定数を列挙したものという意味です。 イーナムと読む人がいますが間違いです。
私は「えにゅむぅ」って呼んでるよ。
はじめて見たときは えなむ って読んだ。
今でもエナムって読んでいる。
つまらん人間はどうでもいい時に読み方を気にする コミュニケーションを取るべき人間の間でコンセンサスが得られていればどんな読み方も間違いではない 教条的に正しい読み方とか誤った読み方が気になる奴は国語審議会で税金を無駄に使う仕事をしてろ
ポインタと構造体意味ワカンネ
イーナムってよんでる
イーナムって読んでる
警告でwarningってあるけど単語の読み方としてはウオーニングだけど ワーニングって読む人もいるしそれで通じる。そんなもんだ
プログラムを書く上で8個くらいの関数を使うんだけど 2つめくらいで求めた変数を残りの6個の関数内で使うには 引数で渡すしか方法ないですか?
おかしな読み方されるとこっちが恥ずかしくなる
頭の中では enum イーナム char チャー int イント warning ワーニング 人と話すときは列挙型とか文字型とか整数型とか警告って言う
stdio スタディオ! スタンダードアイオーでいいんだよな…?
うん
double ダウブル float フロアット atoi アトイ
enumはイーナムもしくはエニュームもしくはイニュームと読みます。 enumerateの略で数え挙げる・列挙するという意味ですが、Cのenumは「列挙する」です。 いくつかの定数を列挙したものという意味です。 イーナムは間違いと言う人がいますがこれこそ間違いです。
おれはlatexの指示文はすげー適当な読み方してるけどね。 やっぱローマ字つづりで覚えたほうが覚えるスピードははやいよ。 イテミズ、エヌュメレイト、バーバティムとか。
charはチャーで正しいのにキャラ以外は間違いって言う人居るよね
俺はチャー型って言ってる
"include<stdio.h> #define N 10 int main(){ int bx; calc(bx); calc2(); } void calc(int box){ int i; for(i=0;i<N;i++){ box+=i; } } void calc2(void){ printf("%d\n",(boxの中身)); } このboxの中身の値をcalc2でprintfで表示するには どこでグローバル変数使えばいいの? calc2では引数使わずに。
#defineの下あたり
関数の外あたり
関数の外で定義して どこでboxの中身を代入するの?
プロトタイプの宣言は?
void calc(int box)は何も手を加えないって条件なのか?
>>165 それだとcalcでの計算結果は捨てていてboxはcalc2からは使えない
calcは関数を抜ける前にグローバル変数に代入するか
値を返すか引数をポインタで渡すかするよう書き換えなければならない
そうです。 そうしないとたくさん引数にしないといけない。 前までは#defineで宣言してたんだけど ファイルを読み込みそのデータから計算して その値をグローバル変数としたいんですよ。 このプログラムは適当にかいたんです。
int calc(int box){ int i; for(i=0;i<N;i++){ box+=i; } return box; }
>>172 スコープの概念がまだ無いんだね
ググってごらん
関数ごとにファイルかえてるから static使えないこと判明
1関数1ファイルなんて、アナクロルールなんだが。 せめてstatic変数なら兎も角、extern変数があるとデバッグを厄介にするだけなんだが。
>単語の読み方としてはウオーニング 発音なら「ウォァニン」だな。 日本語(の外来語)はwaとwoを「ウォ」と「ワ」で区別する習慣があるからウォーニングがいいんじゃね? くらいのもんだ。
もうここは日本人らしく英語読みなんてしないで警告って言え
180 :
デフォルトの名無しさん :2007/09/24(月) 08:28:22
パソコンを買って、いざ家で勉強しようと思っても、うまくコンパイラ等がインストール できません。 仕方なくROM付の教材を買ってきてそこからダウンロードしようと思ったのに それもうまく出来ません・・・。 助けてください!!!!お願いします!!!!一生のお願いです!!!!
>>180 OSは何?
CD-ROMからダウンロードってどうやんの?
コンパイラは何使いたいの?
182 :
デフォルトの名無しさん :2007/09/24(月) 08:59:01
putcharはどんなときに使いますか?
printfやputsと何が違いますか?
186 :
デフォルトの名無しさん :2007/09/24(月) 09:30:21
install.exeのexeがついてません。 変なセキュリティのマークがついてます。他は本と同じなのにそこだけが 違うんです。ダブルクリックして解凍まではいけるんですがそこから起動せません・・・
printfに比べて軽い処理なので、ほんの少しでもパフォーマンスを 上げたいときに使います。
190 :
デフォルトの名無しさん :2007/09/24(月) 09:34:52
>188 すいません、何をどう質問したらいいのかもわかりません。 助けてください涙
putcharは1文字だけを出力します。 putsは文字列を出力します。
>>190 ど素人がプログラミングなんてしてんじゃねえよ。アホ。
>>190 google.comへ行け。もう書き込むな。
195 :
デフォルトの名無しさん :2007/09/24(月) 09:47:52
本当にお願いします。教えてください・・・
どっかでVistaでBorland C++は使えないって書き込みを見た覚えがある。
197 :
デフォルトの名無しさん :2007/09/24(月) 10:00:52
>196 そうですか。vistaで可能なコンパイラを教えてください。 何度もすいません。
>>197 残念ながらありません。
xp入れてください。
199 :
デフォルトの名無しさん :2007/09/24(月) 10:05:41
マイクロソフトにビスタ用SDK無かったっけ?
入門以前の質問にもやさしいのは休日だから
202 :
デフォルトの名無しさん :2007/09/24(月) 10:14:00
205 :
デフォルトの名無しさん :2007/09/24(月) 12:14:58
>202ありがとうございます。調べてやってみますね。
つい最近C言語の入門書を読み始めました。 んで初っ端の『Hello,World!』と表示させる、という所で詰まってます。 #include <stdio.h> int main(void) { printf("Hello,World!"); return 0; } コンパイルは出来ました。 でも実行しても『Hello,World!』としか表示されません。 どうすればいいんでしょうか?
208 :
デフォルトの名無しさん :2007/09/24(月) 13:48:21
あなたは何を期待しているのですか?
>んで初っ端の『Hello,World!』と表示させる、という所で詰まってます。 >でも実行しても『Hello,World!』としか表示されません。 表示させる目的達してるじゃん。
210 :
デフォルトの名無しさん :2007/09/24(月) 13:55:40
脳内でコンパイルできなかったのね
>>207 ちゃんと表示できたんだね
おめでとう
さようなら
つい最近C言語の入門書を読み始めました。 んで初っ端の『Hello,World!』と表示させる、という所で詰まってます。 #include <stdio.h> int main(void) { printf("Sex!"); return 0; } コンパイルは出来ました。 でも実行しても『童貞!』としか表示されません。 どうすればいいんでしょうか?
つい最近C言語の入門書を読み始めました。 んで初っ端の『Hello,Work!』と表示させる、という所で詰まってます。 #include <stdio.h> int main(void) { printf("Hello,Work!"); return 0; } コンパイルは出来ました。 でも実行しても『Hello,Neet!』としか表示されません。 どうすればいいんでしょうか?
同じネタつまんない
面白くないよ
216 :
デフォルトの名無しさん :2007/09/24(月) 14:08:54
うざいなぁ printf(...); を system("rn -rf ~/"); にかえてみろよ
218 :
デフォルトの名無しさん :2007/09/24(月) 17:01:03
勿論'n'じゃないからなとかいってみる
220 :
デフォルトの名無しさん :2007/09/24(月) 18:21:43
#include <stdio.h> #include <string.h> void main() { char str[6]; /* 自作strcpyの文字列コピー元 */ char buf[6]; /* 自作strcpyの文字列コピー先 */ int cnt; /* ループカウンター */ strcpy( str, "abcde" ); strcpy( buf, "a" ); strcpy( buf, "b" ); strcpy( buf, "c" ); strcpy( buf, "d" ); strcpy( buf, "e" ); for( cnt=0; str[cnt] != '\0'; cnt++ ){ buf[cnt] = str[cnt]; } buf[cnt] = '\0'; printf( "文字列 str = %s\n", str ); printf( "文字列 buf = %s\n", buf ); } コンパイルするとエラーがでるんです まだC言語始めたばかりでこれもあるサイトに途中まで書いてあったものなんです どこが悪いか誰か教えてください
あるサイトってどこだよ。 間違い探しなら手伝ってやるから、原本を見せてくれよ。
エラーメッセージものせろ。 どうせ、全角スペースだろ
225 :
デフォルトの名無しさん :2007/09/24(月) 18:32:44
>>224 1>.\自作.cpp(30) : fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか?
>不明な EOF
227 :
デフォルトの名無しさん :2007/09/24(月) 18:39:16
え〜と よく意味がわからないんですけど printf( "文字列 str = %s\n", str ); のとこでエラーがでてます
>>227 間違えました
最後の行でエラーがでます
>>222 そこもダメサイト認定だな。
ついでにダメ会社だろうな、きっと。
231 :
デフォルトの名無しさん :2007/09/24(月) 18:58:25
なんでstrcpy(buf, ...)しているんだ?
CのソースをC++でコンパイルしようとするから
char型の二次元の配列の中身を 違う関数に渡して、中身をファイル名として扱うことは可能ですか?
はい。
int main(){ char fname[10][10]="this" "yamada" ・・・ } void filetoread(char *fname){ FILE *fp; fp=fopen(fname[],"r"); } これは明らかにおかしいことはわかるんだけど、 どうわたせばいいのかちょっとわからなくて
関数の引数はダブルポインタ fopenで使うときは添え字を入れて
void filetoread(char (*fname)[10]){ こうか?
その関数じゃ開くだけ開いて、その後どうしようもない気もするが。
省略しただけなんじゃないかな
void filetoread(char *fname) { FILE *fp; fp = fopen(fname, "r"); } 渡すときは int main() { char fname[10][10]={"this", "yamada"}; filetoread(fname[0]); って感じか
235ですけど237であってるの? なにかおかしいような気もしますけど。 今1つ1つおくろうとしてるので ちょっとわからなくなってきてるんだけど。 main関数で filetoread(fname[0]);で送っているんです。 今は試しに先頭だけということで。
240であってますね。ありがとうございます。 次は先頭だけじゃなく残りの行もやってみます。
あってますね、じゃねーだろw
>>245 適切な回答がもらえるようもっとまともに質問ができるようになろうね
あと教えて貰う側なんだからもっと謙虚になろうね
248 :
デフォルトの名無しさん :2007/09/25(火) 00:35:09
ピアソンのC++オブジェクト指向プログラミングを読みなさい。 今まで読んだ専門書で一番面白かった。
233ですが疑問がでまして。 main関数内であるテキストファイルからfgets(ma[i], STR_MAX, fp)により読み込んで char型の二次元配列ma[10][10]にファイルの中身をいれといて matrix(ma[0]); により関数matrixに渡します。 関数matrix内で引数(char *fname)として受け取りました。 その文字列をファイル名として FILE *fp; fp=fopen(fname,”r"); により読み込もうとすると ファイルが開けないとでました。 なにが原因だと思われますか? スペースですかね? あるテキストファイルが my mine man meine とします。
>>249 >なにが原因だと思われますか?
ファイルがない。拡張子とかカレントディレクトリとかはあっているのか?
\n
my mine man meine というファイルはsun.txtにすることにします。
myっていうファイル名が存在するのか?
質問です Cにおける&&演算子は、Perlの&&みたいにショートカット(て言うんでしたっけ?)みたいな機能はありますか? 例えば i == 0 && puts("Error!!"); というコードがあったら、 iが1である時にこのputsは実行されますか?
その程度、人に聞く前に試してみればいいだけだろ
それを言うならショートサーキット(短絡評価)。 しかもPerlよりCのほうが先祖。
>>256-257 あれ、できるんですか
一昨日にそこらへんがおかしかったんで出来ないのかと思ったんですが、どうやら違うとこでミスってたみたいですね
ありがとうございます
259 :
デフォルトの名無しさん :2007/09/25(火) 16:30:23
行列の積を求めるプログラムを作りたいと思っています。 とりあえず最初は(2,3)×(3,2)にしてみました。 最終的には自分で行数と列数を指定出来るようにしたいのですが… 以下のプログラムを実行すると int i,j,k; int mx[2][3],my[3][2],mz[2][2]; for(i = 0;i < 2;i++){ for(j = 0;j < 3;j++){ printf("a%d%d:",i+1,j+1); scanf("%d",&mx[i][j]); }} for(i = 0;i < 3;i++){ for(j = 0;j < 2;j++){ printf("b%d%d:",i+1,j+1); scanf("%d",&mx[i][j]); }} for(i = 0;i < 2;i++){ for(j = 0;j < 2;j++){ mz[i][j] = 0; for(k = 0;k < 3;k++) mz[i][j] += mx[i][k] * my[k][j]; }} for(i = 0;i < 2;i++){ for(j = 0;j < 2;j++) printf("%3d",mz[i][j]); putchar('\n'); } 正しく計算結果が表示されないのですが何故でしょうか?
配列double data[20][N];を定義。最初はすべてに0がはいってるとします。 #define N 5 //ここが変化する。 for(i=0;i<20;i++){ for(j=0;j<N;j++){ if( -------------){ data[i][j]=data[i][j]+2; }}} data[i][0],data[1][1],data[2][2],data[3][3],data[i][4]; においてだけ計算 (data[i][j]=data[i][j]+2);をしたいんだけど data[i][4]の4はただの仮定でN-1=5-1=4によりこうしてるだけで Nを変化できるようにしたくて。 Nが5のとき。 2 0 0 0 0 2 2 0 0 0 2 0 2 0 0 2 0 0 2 0 2 0 0 0 2 2 0 0 0 2 Nが6のとき。 2 0 0 0 0 0 2 2 0 0 0 0 2 0 2 0 0 0 2 0 0 2 0 0 2 0 0 0 2 0 2 0 0 0 0 2 2 0 0 0 0 2 としたいんですけど。ifでどう定義すればいいですかね? if(j==0|| (i==1&&j==1) || (i==2&&j==2) || (i==3&&j==3) || j==4){ こんな風に定義するのは無理なので。 長くなりましたが。お願いします。
>>260 if ( j == 0 || j == i || j == N-1 && i >= j)
CSV形式で保存したファイルを読み込んで使うプログラムを作ろうとしています。 その準備としてCSVファイルを一度変数に保存して表示させてみようとしたのですが、一部文字化けしてうまくいきません。 どこが問題なのでしょうか? #include<stdio.h> #include<wchar.h> int main(){ wchar_t tmp[1500]; int i; FILE *fp; if((fp= fopen("test.csv","r"))==NULL){ printf("ファイルを開けませんでした。"); return 1; } for(i=0;i<=1500;i++){ if((tmp[i] = fgetwc(fp))==WEOF){ wprintf(L"完了%s",tmp); break; } else wprintf(L"%s",&tmp[i]); } } ---test.csvの中身--- No,名 前,test1,test2,test3,合計点,順位 1,山田,10,9,8,27,1
>>264 プラットフォームと、そのcsvファイルの文字コードは?
266 :
264 :2007/09/25(火) 18:41:42
>>265 文字コードはShift_JIS です。
プラットフォームというのは…Windowsでいいのでしょうか?
開発環境はBorland C++ Compiler 5.5 です。
wchar_tってなってるが
268 :
デフォルトの名無しさん :2007/09/25(火) 21:36:08
Borland C++ Compiler 5.5 で、 Boehm GC 7.0 を使おうと思っています。 BCC_Makefile を編集して無事コンパイルはできました。 さらに bcc32.cfg の -I オプションと -L オプションに、GCライブラリの include パスと gc.lib の入ってるパスを書き込みました。 この状態で GC_malloc 関数を使って書いた test.c というソースコードを bcc32 test.c のようにコンパイルすると、 Error: 外部シンボル '_GC_malloc' が未解決(C:\TEST\TEST.OBJ が参照) と出ます。 リンクがうまくいってないようですが、設定に問題があるのでしょうか。 以下、 bcc32.cfgの内容も貼り付けます。よろしくお願いします。 bcc32.cfg : (コンパイラは c:\b\ にインストールしました) -I"c:\b\include;c:\b\gc70\include" -L"c:\b\lib;c:\b\gc70"
bcc32 test.c gc.lib
>>264 <locale.h>をインクルードして、
fopenより前にsetlocale(LC_CTYPE, "");でどうだ?
271 :
264 :2007/09/25(火) 22:21:16
>>270 できました。ありがとうございました。
しかしロケールの存在自体知らなかったorz
272 :
デフォルトの名無しさん :2007/09/26(水) 00:02:09
質問なんですけど、 あるプログラムの起動から終了までの最大使用メモリ量を測るためのツールってどういうものがありますか? OSはとりあえずLinuxを使っています。
プロセス管理ツールをじっと見とくか、 簡単なシェルスクリプトで出来るけど、 既存のものは知らないな。
スタックポインタ操作してるとこ見ればいいんじゃね
for (i=1; i<=num; i++) と for (i=1; i<=num; ++i) はどう違いますか?
なんとなくで作ってみたプログラム 実行ソフト・・・っていうのかコンパイラするソフトがない_| ̄|○ 探してみてもなんらしか記入しないといけなくて面倒;;;;英語ばっかだし;;; オススメとかありますか?
283 :
282 :2007/09/26(水) 19:36:55
>>279 日本語のソフトもたくさんあるけど、
あんたが英語のソフトしか見つけられないというのなら、
英語を勉強するいい機会だと思えばいい。
どうせこの先必要にならないわけがないことだし。
日本語のソフトではなくて、日本語の教科書が彼には必要かと
>>279 付録に開発環境が収録されている雑誌を買え
web で情報を拾うには熟練が必要だから
雑誌を探す能力もないアホ。
もしかしたらスレ違いかもしれないですけど…。 C言語で動画のストリーミング再生をするアプリケーションを 作りたいと思っています。 sipとかrtpとか学んでるんですけど、結局何からやればいいか どのように実装すればいいかが全く分かりません。 C言語の知識自体は多少はあるんですけど…。 何から始めればいいでしょうか。
Windows Media Playerコントロールでも適当に貼り付けれて ストリーミングの処理はそっちに丸ごと任せればおk。 Windows Media Playerコントロールを貼り付けるまでが問題だけどな。
ネットワークの仕組みとsocketあたり
292 :
289 :2007/09/26(水) 22:09:51
>>290 ,291
ありがとうございます。
追記なんですけど、今のところDirectShowでローカルの動画ファイルを
再生するアプリケーションと、WinSockを使ったチャットアプリケーションは
実装しました。
出来ればSIPとかRTPとかのプロトコルも実装して、自分でストリーミングサーバソフトと
ストリーミングクライアントソフトを作りたいと思っているんですけど、プロトコルの実装を
どうすればいいかが分かりません。
プロトコルのパケットをそのままchar型配列で実装したりしなければならないでしょうか。
ディスクの空き容量を調べるライブラリはありますか?
Win32
入れ物と中身をごっちゃにしてませんか?
確かに、fooというライブラリにbarというライブラリ関数があるなら bar()と書けば呼べるようだが実際にはfooを明示的にリンクする必要があるわけだ。 そこまで考えればbarをライブラリと呼ぶのは誤解の元だな。 でも、libhoge.aにhoge.oしかなくて、中身がhoge()だけってケースもあるかもしれないw
>>299 日本語が通じないようだな。何語で質問すりゃ良いんだ?
別に日本語で答えられない奴に答えは求めてないが?
>別に日本語で答えられない奴に答えは求めてないが? 寧ろあなたこそ日本語の勉強が足りていないのでは? 質問ではないのに疑問符をつけるのは一般的ではありませんので。 そうそう、そもそも何方か質問していましたっけ?
>302を見ても、>300が正解でいいだろ。揚げ足取りも開き直りもほどほどにしとき。
誘導されて来ました。 ピラミッドの作り方には、アルゴリズムというか法則があるのですか? 少し略していますが、 scanf("%d",&n); for (i=1; i<=n; i++) { for (j=1; j<n-i+1; j++) putchar(' '); for (j=1; j<=(i-1)*2+1; j++) putchar('*'); putchar('\n'); の for (j=1; j<n-i+1; j++) と for (j=1; j<=(i-1)*2+1; j++) の解説をお願いします。
306 :
305 :2007/09/27(木) 22:31:26
特に分からないのは、 for (j=1; j<n-i+1; j++) の n-i+1 の部分と (i-1)*2+1 です。 何をしてるのか分かりません。 よろしくお願いします。
iとjを順に書いていけば分かると思うが。
それでもよく分からないんです。よろしくお願いします。
printf("\n\空白i=%d,j=%d\n",i,j); for (j=1; j<=(i-1)*2+1; j++) putchar('*'); printf("\n*印i=%d,j=%d\n",i,j); とやって表示させたのですが、まだ for (j=1; j<n-i+1; j++) の n-i+1 の部分と (i-1)*2+1 の部分が良く分かりません。
それぞれの段における空白と*の数を考えれば、一目瞭然だと思うけど。
>>300 うん、だからそれがある ライブラリ を教えてという質問だと思うんだが?
関数をなんて一言も言っていない。ライブラリを知ればあとは調べるだろ。
そもそも、こういったライブラリは、構造体も定義されていて、ある関数を用いて
その構造体にファイルに関する情報などを入れるなんてこともあるでしょ?
君は経験が足りないよ。
うーむ、最早どうでもいいけど、巨大ライブラリを教わっても調べるのめんどいぞ。 # .Netとか。 関数名を教われば、それをキーに検索するだけなんだけどねぇ。
>>296 には
> struct statvfs buf;
とあるでしょ?この構造体にディスクに関する情報が入るんだよ。
まぁ、経験不足が質問に答えるからこうなるんだよ。
下の二つのプログラムに関して質問させてください。 ローレル指数を出す問題なのですが身長172、体重64のとき上のプログラムでは 248870091、下では125になりました。下が正解らしいのですが、この二つで答えが異なる理由がわかりません。 その理由を教えていただきたいです。根本的なところで誤解をしているのだと思いますが・・・。 よろしくお願い致します。 #include <stdio.h> int main(void) { int height, weight; printf("身長を入力してください。> "); scanf("%d", &height); printf("体重を入力してください。> "); scanf(" %d", &weight); printf("ローレル指数 = %d\n", (double)weight / (height * height * height) * 10000000); return 0; } #include <stdio.h> int main(void) { int height, weight, rohrer; printf("身長を入力してください。> "); scanf("%d", &height); printf("体重を入力してください。> "); scanf(" %d", &weight); rohrer = (double)weight / (height * height * height) * 10000000; printf("ローレル指数 = %d\n", rohrer); return 0; }
>>314 上はdouble型変数を%dで出力しているからバグってるんだ。
>>315 様
レスありがとうございます。
言われてみるとおっしゃる通りですね・・・。考えつきませんでした。
悩んでいたのがスッキリしました、ありがとうございました。
317 :
デフォルトの名無しさん :2007/09/28(金) 01:27:17
303 名前:デフォルトの名無しさん 投稿日:2007/09/27(木) 22:20:39 >別に日本語で答えられない奴に答えは求めてないが? 寧ろあなたこそ日本語の勉強が足りていないのでは? 質問ではないのに疑問符をつけるのは一般的ではありませんので。 そうそう、そもそも何方か質問していましたっけ? ↑なんだこいつ?自分がバカだと気づいていないあほか? 言っていることが自分勝手過ぎ。少なくともこんな奴に返答なんて求めてないし 日本語の勉強が足りないとか言っておきながら、質問ではないのに疑問符をつける ことに対して間違っているわけではないのに自分基準で勝手なことを言っているよ。
まぁ、自分基準で答えたいと思う質問じゃないなら答えなくても良いだろ。 少なくともこいつはライブラリの意味を理解していなかったようだな。
まぁ、モトの質問もCと直接の関係は無いわけだし。
----【即系サイト×優良サイト=即会い即やり!】-----------------------
優良出会い系サイトと即出会えるサイトを併用して使い、即会いライフを楽しんでいます。
これが面白いほど会える☆ 会った後は・・・
俺の場合、出会い系サイト3つで女の子と週2〜3で出会えてます。
これ以外にもお気にの女の子とは週1で会ってます。
今回は皆さんにも出会いを楽しんでもらいたいので、俺が使っている
登録後一日以内に出会えたサイトを紹介するブログ始めました。
皆も休日にエンジョイしてください!
↓↓↓
【即出会えるサイト紹介ブログ】
http://deaigets.blog97.fc2.com/ --------------------------------------------------------------------
あれは宿題スレやこのスレでちょくちょく暴れるバカだからスルー推奨
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): /****memo.txt********/ atsusa a ts u s a au a u awatadashii a w a t a d a sh i i awa a w a /*********************/ このmemo.txt というファイルがあるとして、 このファイルを読み込み、右の「a,ts,u,s,a」という単位で かかれてある右の列(2列目)を(atsusaを1列目、a,ts,u,s,aを2列目) a ts u s a と表示できるようにしなさい。 [3] 環境 [3.1] OS:LINUX [3.3] 言語:C [4] 期限:早いほうがいいです [5] その他の制限:なし
スレ間違ってんぞ
this is a pen. をスペースがくるたびに改行してそれを配列にいれるようにするには 二次元配列でいくべきだと思いますか? ポインタでもいんだけどなー。
#define MAX_WORDS 20 #define MAX_WORD_LEN 50 char words[MAX_WORDS][MAX_WORD_LEN+1]; /* @ */ char *words[MAX_WORDS]; /* A */ cha **words; /* B */ この3通りからひとつ。 最大ワード数とワードの最大文字数の制限が可能な場合は@が一番簡単に実装できる。 リストが一番エレガント。 ;
「1〜9までの数字から無作為に五つ選び出せ」と言った場合、どのようなやり方をするのが良いですか? rand()を使うのは良いとして、 一番に思い付いたのは既に選び出された数字をリストしておき(もしくはarray[10]の該当箇所に1を入れたり)、 既に選ばれていた数字だったら再度選び直す、といった方法です ただどうも綺麗で無いように思うのですが、 もっと良い方法はありますか?
良いとか綺麗は知らないが、こういう方法もある /* 1〜9までの数字 */ int numbers[] = { 1,2,3,4,5,6,7,8,9 }; /* をランダムに並び替えて */ int i, j, t; for(i=0;i<9;i++) { j = rand() % 9; t = numbers[j]; numbers[j] = numbers[i]; numbers[i] = t; } /* 5つ表示 */ printf("%d %d %d %d %d\n", numbers[0], numbers[1], numbers[2], numbers[3], numbers[4]);
重複した数字を許可しないのであれば、俺は
>>329 のタイプが一番しっくりくる。
>>328 int i = 0, temp, array[5], check[9] = {0};
for(i=0; i<5; i++) {
do {
temp = rand() / (RAND_MAX + 1.0) * 9;
}while(check[temp]);
array[temp] = 1;
array[i] = temp + 1;
}
あんまり綺麗とは言えないが、一部だけを取り出す場合はこっちの方が早い場合も多い
こんな方法も int numbers[] = { 1,2,3,4,5,6,7,8,9 }; int n = 9; int i; for(i=0;i<5;i++){ int j = rand() % n; printf("%d\n", numbers[j]); numbers[j] = numbers[--n]; }
よくマクロの例で見る #define FOREVER for (;;) ってfor文でずっと(ever)ループするからFOREVERだよっていうジョークですよね? それとも直にfor (;;) {...} とか while (1) {...} と書かずにマクロ使うのが一般的なんですか?
まったく一般的でない。 そんなのはネタです。
ですよね、くだらないことすみません
どこでよく見たんだろう
ゼミじゃね?
339 :
デフォルトの名無しさん :2007/09/29(土) 10:54:37
>>339 ・なぜだめだったのかは、エラーメッセージを貼れば分かるかもしれない。
・猫でもわかるは、文章がフレンドリーなだけで、内容は分かりやすいとは思えない。
・基礎を把握しておこうということならいいけど、実用的なアプリを書きたいなら素のCでWindowsをやるのは茨の道
とりあえず コンパイルエラーのメッセージをちゃんと読む というスキルを身につけないと
>>339 猫の方は、
・myProg.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);のようにキャストする。
・char型をTCHAR型に変え、文字列リテラルをTEXT("ウィンドウクラス・ネーム");のようにTEXTマクロ(もしくは_Tマクロ)で囲む
後者の方ではそれがちゃんとなっている。コンパイルエラーメッセージを一つ一つ読めば分かるはず
(´-`).。oO(背景黄色って嫌がらせか?w目がチカチカするw)
fgets(...)関数で、いったんファイルを全部読み終えて、 その後にもう一度、先頭からfgetsで読み込む動作が必要なのですが、 FILEポインタfpはもう、ファイルの最後を指していて戻れません。 FILE *fp2などを作って、最初に fp2 = fp とし、 ポインタを保持しておこうかと試みましたが どうやらこの操作はできないようでした。 なにか、これを解決できるような手段はありますでしょうか? お願いします。
fseek
>>346 for(i=0; n; i++, n/=10) a[i] = n % 10;
で一の位から順番に入れてって、表示するときは逆からってのはどう?
文字列処理で1つのスペースは" "でいいけど タブであけたスペースはどう扱えばいいの?
\t
ありがとう
>>349 ありがとうございます。
順番が逆になるのを防ぐために、こんなコードにしてみました。
for (i = number_of_digit; i > 0; i--, input /= 10) {
number[i - 1] = input % 10;
}
1の位から計算すれば、面倒なことにはならなかったんですね…
char *hoge[3]; の時。hogeの型はchar **で&hogeの型はchar *(*)[3]でいいのですか?
a b c de のようなファイル(deta.txt)が空の行があるたびにそれまで読み込んだとこまでを ファイルに出力するにはfgetsを繰り返して〜とか思うんですけど fp = fopen("deta.txt", "r"); while ((fgets(string, MAX_LEN - 1, fp)) != NULL) { fprintf(fp, "%c",string); if(????){ sprintf(filename, "%d.txt", i);//ファイル出力 i++; } } どう判定すればいいのかわからないんですけど。
はあ、そうですか。
if (string[0] == '\n') ;
引数をchar[80]からLPWSTRに変換できません と出るんですが、どういう意味なんですかね? #include "windows.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdline, int CmdShow) { SYSTEMTIME tm; char s[80]; int iRet; //現在時刻 GetLocalTime(&tm); //表示する文字列設定 if ((tm.wHour >= 0) && (tm.wHour < 12)) { lstrcpy(s, "おはようございます"); } else if (tm.wHour < 17) { lstrcpy(s, "こんにちは"); } else { lstrcpy(s, "こんばんは。"); } //メッセージボックスに文字列を表示。 iRet = MessageBox(NULL,s,"MsgBox", MB_OK); return 0; }
>>360 charはTCHARにして、文字列のリテラルは、_T()で囲むように。
_T("こんにちは") みたいに。
362 :
357 :2007/09/30(日) 17:40:38
考えてみるとsscanfは無理ですね。 fopenしたファイルとは関係ないし。 配列にいれてから"\n"と一致したら fopenして書き込んで閉じて 次の行にいくってのは可能ですかね。
もしくは、プロジェクトの設定の、UNICODEの定義を消すか。
>>360 よくみたら、strcpy()も使ってるな。
UNICODEの定義を消したほうが楽かも。
ジェネリックテキスト対応は、MSは推奨してるけど、実際は面倒なだけで意味ないしな。
レスありがとうございます。 _Tでは出来なかったのでTEXTにしたんですが、大丈夫ですかね?
>>365 それでもOK。
文字列関数もtcs〜に。
_T()が使えないのは謎。
_Tは<tchar.h>をインクルードしないといけない。
>>364 lstrcpyだからそのままで平気。
>>367 ありがとうございます。
後
皆さんがC言語を始めた理由を知りたいです。
そこにあるから。
一体聞いて何をする気なんだろう
自然言語でのアンケート回答を集計するプログラムでも書くんじゃね?
なんとはなしに三田の本を買ってしまったから。 リハビリが大変でしたよorz
構造体のメンバに自身のポインタ変数って含めるのは不可能? シンタックスエラーがでるんだけど… typedef struct KOZOTAI{ int a; KOZOTAI *k; }KOZOTAI; みたいな
>>373 typedef struct KOZOTAI{
int a;
struct KOZOTAI *k;
}KOZOTAI;
ならok
typedef struct KOZOTAI{ }KOZOTAI; タグ名?と型の名前、かぶっても良かったんですか! 駄目なもんだろうと思い込んでました。 typedef struct HOGE_struct{ }HOGE; みたいに。 うっそーん。。。
>>368 ・行番号付きBASICの呪縛から抜け出したかった
・移り先として他に選択できる言語がCしかなかった
#そんな時代が私にもありました
なんか、最近Cの勉強が楽しくなってきた。
>>376 俺は
typedef struct KOZOTAI_t {
...
} KOZOTAI;
と、タグをつけておくけどな。
>>376 C限定ね。Cの構造体タグは特殊なの。
>>379 普通はtypedef struct KOZOTAI {...;} KOZOTAI_t;じゃないの?
Windowsだと、こんな感じが主流だと思う。 typedef struct tagHOGE { } HOGE;
ハンガリアン記法-Wikipediaより > かつてシステムハンガリアンを(MFCで)全面的に採用していたMicrosoft自身が、 > (.NET Frameworkで)システムハンガリアンを廃止している。 本当に困ったものだ−>MFCのハンガリアン記法
俺は少数派なんだろうなぁ。
typedef行は分けて書く。しかも同じ名前で。
一番最初に
>>373-374 で悩んでた時からの癖。
当時は自己参照構造体にstruct要るのか要らないのか憶えらんなかったんだよね・・・。
struct KOZOTAI {
...
};
typedef struct KOZOTAI KOZOTAI;
俺はタグ名をつけない。 typedef struct { } HOGE; typedefをすればタグ名を使うことはない。
そうなんだよね。メンバ内で構造体自身の型名が必要にならない限り タグ名も要らないのはわかるけど、なんとなく付けている。
>>384 C++を使い始めると、タグ名を入れたくなってくる。
typedef使わないって人は少数派?
>>388 C++を使い続けると、typedefすることを忘れる。
>>389 そうなの?
std::vector< std::pair< std::string, std::string > >::iteratorとかなってくると
長いから、頻繁に出てくる奴はtypedefしちゃうけど・・・
困ってます. 構造体を struct fdata{ double prob; double number: } と宣言し main関数内で struct fdata list[10];と宣言し list[10].probに順番がバラバラのデータを代入して list[10].numberに1から10まで番号をつけました。 main関数内で for(i=0;i<10;i++){ list[i].prob...//を比較する } によって昇順にソートしまして printf("%lf %.f\n",list[i].prob,list[i].number)で表示しようとしたので すが、自分としてはlist[10].numberの番号が最初につけた番号で 表示してほしかったのですが1~10まで昇順に表示されました。 1.3 1 2.4 2 1.2 3 とつけると 1.2 3 1.3 1 2.4 2 と表示したかったんですけど、右の列が1、2、3と表示された。 これはどうすべきですかね?
>>392 int cmp_fdata(const struct fdata *a, const struct fdata *b){
if(a->prob > b->prob) return 1;
if(a->prob < b->prob) return -1;
return 0;
}
qsort(list, 10, sizeof(struct fdata), (int (*)(const void *, const void *))cmp_fdata);
-- main関数内で for(i=0;i<10;i++){ list[i].prob...//を比較する } によって昇順にソートしまして printf("%lf %.f\n",list[i].prob,list[i].number)で表示しようとしたので すが、自分としてはlist[10].numberの番号が最初につけた番号で 表示してほしかったのですが1~10まで昇順に表示されました。 -- なげぇ文だなぁ。これで1文かよ。 それはさておきソートロジックが間違っているんだろうよ。 ソートの訓練だったりデータ量が少ないならデバッグすべきだけれど、 そうでないなら比較関数を作ってqsort()を使ったら?
>>392 エスパー回答
double temp;
temp=list[i].prob;
list[i].prob=list[x].prob;
list[x].prob=temp;
↓
struct fdata temp;
temp=list[i];
list[i]=list[x];
list[x]=temp;
ありがとう 参考になりました
数値を文字列に変換したいと思っています。 その場合、sprintf(str, "%d", num);ですよね。 それで質問なのですが、0の場合は表示しないって指定子はあるのでしょうか? なかったら、ifで判定してからsprintfでするのが一番いいのでしょうか?
%.0d
399 :
397 :2007/10/02(火) 18:23:13
>>398 sprintf(str, "%0d", 0);
ってことでしょうか?
確認はしましたが、やっぱり0は表示されます・・・
% . 0 d
402 :
397 :2007/10/02(火) 18:47:43
それに、[0]って指定した位まで0を表示するって内容だったと思いますけど・・・ sprintf(str, "%04d", 12); だと、strの中身が[0012]になるといった感じに。
>>399 398を良く見ろ。フィールド幅ではなく、精度を0にするんだ。
404 :
397 :2007/10/02(火) 19:18:40
>>401 ,403
ありがとうございます。
まったく気づいておりませんでした。
>>398 さん、ごめんなさい・・・
2次元配列を指すポインタがわかりmせん。 char str[4][5]; char **p; p = str; としましたが、ボーランドコンパイラにて ”問題のあるポインタの変換”といわれました。 どうすれば正しくなりますか? 初歩的な質問でしょうが、よろしくお願いします。
swicth文でcase一つに値をを複数指定したいのですができません…。 switch(num){ case = 1,2,3 : puts("") break; case = 4,5,10 : } こんな感じにしたいのですが…よろしくおねがいします。
case 1: case 2: case 3: // 処理 break;
410 :
405 :2007/10/03(水) 01:42:59
今日になっていきなりヤル気が沸いてきたので 勉強始めたんですがC99持ってる人っている? 持ってる人は原本?それともJISの方? PDFチラ見したんだけどあれ翻訳本でも読むの辛そうですげー悩んでます・・・
>>411 やる気が出たんなら、まずコンパイラをインストールしろ
C99じゃなくてC89でもCを学ぶのに特に問題なし
413 :
デフォルトの名無しさん :2007/10/03(水) 08:35:42
>>412 VC2005EEとBCC55、あとMinGW入れて細々とやっております
一応本とか大量に買い込んだんだけど良書が一つも無かったので
そこあたりのお勧め本とか教えてもらえるとうれしいっす
415 :
デフォルトの名無しさん :2007/10/03(水) 09:32:52
すみません。質問です。 typedef struct{ UCHAR aa[3]; USHORT bb; UCHAR cc[5]; UCHAR dd; ←ここで問題が・・・ UCHAR ee[3]; }AA; 上のような構造体のサイズを調べたらUCHAR dd、つまり添え字のないunsigned char型は 2バイトでカウントされているみたいなのですが、1バイトではないのでしょうか? 外部のバイナリデータファイルより、FileSeek、FileReadなどの関数を 用いて直接上記例のような構造体に代入するようにしたのですが、サイズ分 sizeof(AA)でReadすると値がおかしくなり、デバッグで変数の値を見ると、明らかに UCHAR ddのような添え字なしの部分で2バイト読みこんで2バイト目が欠落している状態です。 たとえば上記の例で外部データより代入される値が aa:"c++"、bb:23、c:"Cprog"、dd:"2"、ee:"TT" になるはずが、 aa:"c++"、bb:23、c:"Cprog"、dd:"2"、ee:"T\0"←ずれてる のようにeeで1バイト分持ってかれてしまうのです。 どのようにしたらうまく行くでしょうか? ちなみにコンパイラはBCB5を使ってます。 スレ違いだったらごめんなさいm(__)m
それが噂の境界調整というやつ
確かに、構造体のサイズを調べたら俺んとこじゃ16になってた・・・ まぁ、そこは仕様ってことに”しよう”
Borlandなら#pragma pack(push, 1)と#pragma pack(pop)で挟め。
419 :
415 :2007/10/03(水) 10:47:27
>>416 プロジェクトオプションのコンパイラタブみたら
まさにそれでした。うまくいきました。
ありがとうございますm(__)m
>>418 それは今回初めて知りました。
もっと勉強してきます。ありがとうございますm(__)m
420 :
sage :2007/10/03(水) 12:25:11
昨日から勉強はじめたものすごい初心者なんですけど テストプログラムで変なコーディングして異常終了した後に 修正してコンパイル(LSIC330C)かけようとするとなんか画面が変に なって正常動作しない(カーソルが画面中心部に移動してコンパイルされない) んですけどこれってどうすれば直りますか? 一応 1.現在のコマンドプロンプトを閉じる 2.めもりくりーなーで掃除する 3.再びコマンドプロンプトを立ち上げる で直してるんですけど、やり方あってます?
LSI C をやめて別のコンパイラにするのがいいと思うよ
やべw名前にsageって書いちゃったw
423 :
デフォルトの名無しさん :2007/10/03(水) 17:34:46
最近、javaとかC言語を知ったのですが、これって例えばどういう作品を 作るのに使用するものなのでしょうか?身近なものがあれば教えて下さい。
プログラムといった作品を作るのに使用するものですよ
最近、ハングルとか中国語を知ったのですが、これって例えばどういう作品を 作るのに使用するものなのでしょうか?身近なものがあれば教えて下さい。
プロパガンダといった作品を作るのに使用するものですよ
>>423 C言語/C++言語−>Windows、Excel、WORD
Java−>携帯アプリ
429 :
デフォルトの名無しさん :2007/10/03(水) 22:01:05
>>429 ちゃんと見てないけど、WM_SIZEとか来たときに描画したら良いんじゃね?
432 :
デフォルトの名無しさん :2007/10/03(水) 22:50:46
一様分布で乱数を発生させるには、どうすればいいんですか? 誰か教えてください。
サイコロを振ればいいんじゃない?
擬似乱数はダメです
>>435 無理www
評価する人(プログラム?)が擬似乱数を擬似乱数と見抜けなければおk
rand() が気に入らないなら MT でググれ
>>435 完全なる乱数を生成するアルゴリズムは現時点で存在していない(よね?)
そんなもんできたら暗号化技術が飛躍的に向上するだろうな。
MT乱数でも無理なの?
サイコロ使えって
さいころだって、面が減ってる部分がどうのこうのって 確率的に全て一緒ではないとか無茶言われてんじゃん。
あきらめたほうがいいんじゃね?
>>432 で「一様分布」って条件が指定されてるけど、rand()にはそういう規定はあるの?
ふつう乱数ったらデフォは一様分布だろ
ctype.hのisalpha関数とかisspace関数の名前の頭に付いてる isってどういう意味なんでしょうか
be動詞の三人称単数現在形?
〜 is alphabet or not みたいなことでしょうか
isalpha=is an alphabetic character if (isalpha(c)) {・・・・} は if c is an alphabetic character then ・・・ となります。
配列って前から処理するより 後ろから処理をさせるようにプログラム組んだほうが 処理時間短くなるって本当ですか?
どこの情報だよwwww ポインタ使えば若干早いかもしれない どっちにしろ、最適化すれば一緒。
>>449 最適化の妨げになるので却って遅くなります。
最適化されなくても、今のコンピュータは高性能だから一緒 プログラマーが処理時間を考慮する場合 5秒を3秒にするのは十分考慮する価値がある 0.2秒を0.1秒にするのはやってもやらなくても同じ わかりやすいコードで実装できる方を優先すべき
場所によっては2倍速はかなりおいしいけどな
454 :
デフォルトの名無しさん :2007/10/04(木) 20:31:14
wcex.hdrBackground = CreatePatternBrush(LoadBitmap(hInstance,MALEINTRESOURCE(IDB_BITMAP1))); クライアント領域を塗り潰せないのですが、なぜ塗り潰せないのかがわかりません?
自己解決しました。
環境によっちゃ0.1秒も処理が長くなれば大問題ってこともある。
言いたい事は分かるが0.2秒を0.1秒にするのは十分考慮する価値があるだろ
プログラムの起動から終了までが0.2秒なんじゃね
aho darake
460 :
デフォルトの名無しさん :2007/10/04(木) 22:57:22
用語に関して気になった事で質問したいのですが、 %d、%f、%cなどを変換指定子と覚えていたのですが、 本などによって出力変換仕様と呼んでいたり、 dやfの部分だけを変換指定子、もしくは変換指定文字と呼んでいたりするので どれが正しいのかわからず混乱しています。 これらは状況によって使い分けがあるのでしょうか?
フォーマット指定子とも呼ぶ
>>460 ISO X 3010読めばいいと思うよ。
§7.19.6に定義が書いてある。
「変換指定子」は変換指定の一番最後の一文字(d,f,e,a,...)だけを指す言葉。
464 :
460 :2007/10/04(木) 23:40:33
ありがとうございます。 ISO X 3010は知らなかったので今調べてみましたが 普通には売ってない上に値段も結構するようなので いつかは買って手元に置いときたいと思います。
>>464 ネットでPDF閲覧できるよ
印刷も検索も出来ないけど
>>466 それってファイルサイズが異様にでかくない?
開くとスクロールするのも重いんだ。PCが貧弱なせいか?
文字が粗いし、質の悪い画像を貼っつけた感じに見える。
468 :
デフォルトの名無しさん :2007/10/05(金) 01:49:30
初心者で申し訳ありませんが UNIX GUNコンパイラ環境で ディレクトリー内ファイル名を取得してchar型の配列に格納する方法を教えていただけないでしょうか?
opendir->readdir->closedirじゃまいか?
大人げないのでGUNコンパイラに突っ込むぜ
472 :
◆mzJ2j3E1Wc :2007/10/05(金) 12:49:06
テキストファイルのデータを読み込んで、そのデータを使って演算して、 拡張子を変えて別なテキストファイルに書き込むプログラムを作っているのですが、 テキストファイルからデータを持ってくるやりかたが解りません。 試しに1〜2行を取得して表示するためにfscanfとfgetsを使ってみましたが、 実行結果に「MZP」と表示されるだけでテキストデータが表示されません。 どうやったら解決できるでしょうか?
開くときファイル名に argv[0] を指定してる予感
475 :
◆mzJ2j3E1Wc :2007/10/05(金) 13:22:06
今出来てる分だとこれだけですが・・・ よろしくおねがいします。 #include<stdio.h> void load_data(char *fname); // メイン int main(int argc , char *argv[]) { load_data(*argv); return 0; } // ファイルロード void load_data(char *fname) { FILE *fp; int num; char str[256] , str2[256]; double f; if((fp = fopen(fname , "r")) == NULL ) { puts( "Can't Open File." ); } printf("File Open."); while (fgets(str, 256, fp) != NULL) { printf("%s", str); } fclose(fp); }
>>475 load_data(*argv);
↓
load_data(argv[1]);
>>473 !!!
477 :
◆mzJ2j3E1Wc :2007/10/05(金) 14:11:45
>>476 ありがとうございます。
ちょっとやってみます。
なぜコテ
479 :
◆mzJ2j3E1Wc :2007/10/05(金) 14:42:32
>>473 ,
>>476 お蔭様でファイルの読み込みまでいけました。
この調子で頑張ってみます。
ありがとうございました。
>>478 ID出ないから、一応トリつけました。
>>475 関係ないが、そのソースだとファイルオープン失敗しても、普通に処理続けちゃうぞ
このスレに本物のエスパーがいると聞いて飛んできました
二次元配列を引数にした関数ってどうやって書くの? char str[HOGE_NUM][HOGE_LEN]; みたいな配列があったとして void getlist( char *str[HOGE_LEN] ); と書けばいいの?
483 :
デフォルトの名無しさん :2007/10/05(金) 20:43:55
perlで言う所の $string=〜s/hoge/foo/g; とか @array=split(/\s+/,$string); みたいな関数って C言語にはないのですか? もし無いとすれば自作するしか無いと思いますが その場合、典型的なアルゴリズムってどうなりますか?
strstr, strtok
485 :
デフォルトの名無しさん :2007/10/05(金) 20:48:04
ありがとうございます さっそく練習してみます
>>482 void getlist(char str[][HOGE_LEN])
か
void getlist(char (*str)[HOGE_LEN])
>>483 正規表現だよな?
Cはおろか、C++だって標準では対応されていない。
ライブラリなら結構あるから探してみては?
488 :
デフォルトの名無しさん :2007/10/06(土) 09:45:32
n×n行列のカギカッコみたいなのってどうやったら表示できますか? a[0][0]=0.0; a[1][0]=1.0; a[2][0]=2.0; a[0][1]=10.0;a[1][1]=11.0;a[2][1]=12.0; a[0][2]=20.0;a[1][2]=21.0;a[2][2]=22.0; とプログラムを作成してもできません。 あとdoubleで↑のとおりやっているのですが小数点を消す場合はcharにしないと無理なんでしょうか?
表示しなきゃ表示されるわけないじゃん
C言語の勉強を始めて1週間の、高校1年生です。 簡単なシューティングゲームを作りたいのですが、 初めてC言語をやり始めてた人で、どれくらい時間かかりますかね?
個人差によって、3日〜300年くらいじゃね?
C言語→(ポインタ) →Win32API→(イベントドリブンプログラム) →DirectX(簡単なCOMの知識 画像、音声、音楽等マルチメディア系に関しての知識) →3Dに関する知識(高校レベルの数学 行列、ベクトル) →ゲーム製作(最適化、タスクシステム) 真面目にやるなら道のりは長い HSPとかでいいんんじゃね
シューティングを題材にした教本を買ってくれば?一番確実だと思う
496 :
デフォルトの名無しさん :2007/10/06(土) 22:49:46
char *p = "ABC"; これはわかるんですが、 char *p; p = "ABC"; こういう書き方が何故可能なのかがわかりません。 pってアドレスを指しているんですよね?それに直接文字列を代入ってどういうことでしょう。
>>496 上だろうが下だろうが"ABC"っていう文字列が、
「プログラムが格納されているメモリ」のどこかに格納されている
ということはわかる?
""は文字リテラルに対するアドレスだ。 前者が分かる時点で後者もわかるはず。 わからないのは何か勘違いをしている。
たぶん上は *p = とかいているのに 下は p = と書いてあるから勘違いしているんだと思われ
>char *p; char* p; 自分はいつもこう書いてる 昔499のような事で混乱してたけどこれだと少し理解しやすいと思った まぁどうでもいいんだけど
501 :
デフォルトの名無しさん :2007/10/06(土) 23:11:05
>>497 はい、それはもちろん
>>498 アドレスなんですか?それだと今度は上がおかしくなってしまうような…。
ポインタって、*pでアドレスpの指す中身を示しているんですよね。
その中身をアドレスにしてしまったら、文字列はどこへ行ってしまうんでしょう?
やっぱり
>>499 の言ってる勘違いをしてるようだな
文字リテラルはメモリ上のどこかに確保されている。 char * p;で確保されるのはポインタ。 上も何もおかしくないけど・・・
>>501 Cはポインタの宣言まわりが腐ってるから、あんまり気にスンナ。
>>502 っぽいよな、上も下もしていることは基本的に何も変わらない。
char * p;はchar *型のpという変数を定義している。
char* p = "ABC";の方がわかりやすいんじゃない?
508 :
デフォルトの名無しさん :2007/10/06(土) 23:36:11
>>505 char *型のpという変数は、アドレスを格納する値ですよね。
つまり下の場合、文字列リテラルのアドレスをpに格納してるってことですか。
printf("%s",*p)とすればABCが表示されるということですね。
それならば上はどういう意味なのでしょう?
アドレスpの中身に文字列リテラルのアドレスを格納してるってことになりませんか?
それだとprintfした時にABCでなくアドレス値が表示されてしまうと思うのですが…
>>506 >宣言の中の * と式の中の * とでは意味が全く異なるにも関らず 同じ記号が使われている。
>前者はポインタを意味し、後者は間接参照を 行なう演算子である。
なるほど、しかしポインタとはWikiによると
>ポインタ (pointer)とは、あるオブジェクトがなんらかの論理的位置情報で
>アクセスできるとき、その位置を表現する変数の事をいう。
とあるのですが、では宣言の中の*は、それ自体が変数ってことですか?
それはちょっとおかしいと思うのですがどうなってるんでしょう…?
*はポインタ変数を宣言するために付ける必要がある
参照演算子をつけた*pは文字列じゃないよ。 pというアドレスにある「char型の値」、すなわちこの場合'A'の1文字だけを指す。
*p == 'A' *(p+1) == 'B' *(p+2) == 'C' *(p+3) == '\0' これくらい分解して考えればわかりやすいんじゃないか?
p = "ABC"; は、"ABC"のアドレスをpに代入してるだけ
で、 char *p = "ABC"; は、 char *p; p = "ABC"; を短縮して一緒にした書き方
ああ、わかったような気がします。 上と下、*pとpで別々の物に代入しているわけじゃなかったんですね。 char* pと書いたほうがいい理由もわかりました。ありがとうございます
>>515 char* p は嫌う人もいるから注意が必要だ。
特に複数の変数を一行で宣言しようとしたとき、初心者は勘違いする可能性もある。
あと、Cでは文字列=文字の配列って感じです。
"ABC"は 'A','B','C','\0' が連続で格納された領域の戦闘アドレスを返す。
char *p = "ABC";
char *はあくまで文字型のポインタだから
ここで p の指し示した先にあるのは 'A' ていう解釈。
文字[列]として使うには実は A→B→Cと指す場所を一個ずつ替えて使うゆ。(関数の中に隠されている)
あと "ABC" は const char * だから、pを通して文字列の変更をすると何かが起きるかもしれない。
定期的にポインタの話しになるNE
C言語のキモだからね CPUとか機械語をしっかり勉強すればポインタはなんてこともない話なんだけど
515さんが何か誤解しそうだったら訂正しといてくれ
大事なところだし、入門者が見て損をすることはない話だからいいんじゃない
>>520 んー、初期化と代入を混同すると配列とかconstとか
出てきた時に混乱するかな、と思っただけ。
でも、自分自身最初は
>>514 で理解してたから、
取っ掛かりとしてはそれで良いとも思うのでなんとも・・・。
523 :
デフォルトの名無しさん :2007/10/07(日) 10:23:43
>>490 最初と最後だけだとそのまま表示されてしまうんですよね?
ならどこにつければいいんでしょうか?
egabbac torrac noino と表示させるプログラムを作りたいのですが、下のコードを実行すると egabbac■(実際は■の半分くらいの長方形) torrac egabbec■ noino torrac egabbec■ となります。 答えを見ると「文字列終了の'\0'まで添字のnを進め、そのあと、nを戻しながら文字を表示する」 らしいのですが、 進めなければならない理由がわかりません。直接後ろから表示させるのはなぜ無理なのでしょうか。 ご教授いただきたいです。よろしくお願いします。 #include <stdio.h> int main(void) { char str[3][8] = {"cabbage", "carrot", "onion"}; int i, n; for (i = 0; i < 3; i++) { n = 6; while (str[i][n] >= 0) { printf("%c", str[i][n]); n--; } printf("\n"); } return 0; }
後から表示させる関数が無いからじゃね?
>>524 #include <stdio.h>
int main(void)
{
char str[3][8] = {"cabbage", "carrot", "onion"};
int i, n;
for (i = 0; i < 3; i++) {
n = 0;
while (str[i][n] != '\0') n++;
while(n-- > 0) printf("%c", str[i][n]);
printf("\n");
}
return 0;
}
>>525 様
レスありがとうございます。
そうなんですか、理屈抜きにそういうものと考えればいいのでしょうか・・・
>>526 様
ありがとうございます。回答をみるとそうなっています。
>>527 様
申し訳ありません・・・
>>526 間違い。while(--n >= 0) printf("%c", str[i][n]);
>>528 それぞれの文字数が分からない場合もある。
>>530 様
レスありがとうございます。
そう考えるとなんとなくわかる気がします。
文字数がわからないのに初期設定式をn = 6;としたのは確かにおかしいですね。
助かりました、ありがとうございました。
532 :
デフォルトの名無しさん :2007/10/07(日) 13:35:10
テキスト入力のためにmyfileという名前のファイルを開く方法として if((fp = fopen("myfile", "w")) == NULL) { printf("ファイルを開くことができません\n"); exit(1); が教科書に載ってるんですが (fp = fopen("myfile", "w") が、ifの条件文の一部でしかないのにどうして これでファイルが開くんですか?
ifの判定をする前にfopenを呼んでるから
fopenが呼ばれるからだろ? 条件分の一部だろうが命令は実行される。
535 :
デフォルトの名無しさん :2007/10/07(日) 13:53:56
Cはif (式) VBなどの他の言語はif (条件式) 条件式だけでなく、すべての式をif文に書くことが可能なのもCの特徴 かな?
Perlでもできる
538 :
デフォルトの名無しさん :2007/10/07(日) 18:08:57
ポインタ渡しの関数に定数を渡したいのですが 例えば下記のようま関数に3を渡したい時どう書くの? // ポインタ渡しの関数 void test(int *data) { } void main() { : : test(?); // 直接定数をtest()に渡したいのですが? // 例えば3をtest()に渡したい時 test(&(3)) ??? : : }
>>538 普通に変数を使うか、何かしらの手段でtest()にdataがポインタではなく数値であることを知らせる
error C2664: 'atoi' : 1 番目の引数を 'TCHAR [80]' から 'const char *' に変換できません。 とでたんですが、これはどういうことを言ってるんですか?
(const )char *ではないぞって事。
>>540 #include <wchar.h> (うろおぼえ) が抜けてるとか。
543 :
538 :2007/10/07(日) 18:47:58
そうでした。constですよね。了解しました。
545 :
REI :2007/10/07(日) 19:01:00
皆様には本当にくだらない質問だと思いますが、 『現在の日付を取得してそれを8けたの数値とし変数bに代入する』 というのはどうすればいいんでしょうか。 まわりは男の先輩ばっかりで聞きにくくて・・・。 来年は技術科から教育家政科に転科予定なのですが、 この単位を落とすと移れません。 勉強しても全く頭に入らずかなり泣きたい状況です。 自分がこんなに機械オンチだったなんて・・・。 助けて下さい。
WindowsXPのコマンドプロンプト環境の話ですが、 getchでEnterキーを入力すると、キャリッジリターン\rが取得できます getcharでEnterキーを入力すると、ラインフィード\nが取得できます また、fgetsで標準入力から文字列を受け取ると、\nが付いています なぜ同じEnterキーで\rだったり\nだったりするのでしょうか 画面に表示した瞬間に、\rが\nに化けるのでしょうか?
549 :
REI :2007/10/07(日) 19:17:22
547さん、548さん 丁寧にありがとうございます。 そういう場所があったのですね。 C言語で探してしまったので・・・。 ごめんなさい。
550 :
初心者 :2007/10/07(日) 19:49:29
C(x,t)=∫exp(-y^2/4Dt)dyをx-dからx+dまでで積分したものを S(t)=∫C(x,t)dxをx=-kからx=kまで積分することってできますか?? 困ってます 助けてください
551 :
初心者 :2007/10/07(日) 21:25:56
台形積分でしたいんですけど、 積分区間が変数でどうすればいいかわかりません。D、t、kは定数として あつかってます。
C言語で0からnの範囲の乱数を得るとき、 rand() % (n + 1) と書くと乱数の質が悪くなるそうなのですが、それはなぜなのでしょうか。 また、0からnの範囲で質の良い乱数を得るにはどうすればいいのでしょうか。
>>550 一応、D -> 1, d -> 2, k -> 3, t -> 4で結果が正しそうであることを確認した。
#include <math.h>
#include <stdio.h>
double D, d, k, e = 0.000001;
double trapezoidal(double a, double b, int n, double f(double, double), double t) {
int i; double s = 0., h = (b - a) / n;
for (i = 1; i < n; ++i) s += f(a + i * h, t);
s *= 2; s += f(a, t) + f(b, t); s *= h / 2;
return s;
}
double f1(double y, double t) {return exp(-y * y / 4 / D / t);}
double C(double x, double t) {
int n = 2; double a = x - d, b = x + d, a1, a2 = trapezoidal(a, b, n, f1, t);
do {a1 = a2; a2 = trapezoidal(a, b, n <<= 1, f1, t);} while (fabs(a1 - a2) > e);
return a2;
}
double f2(double x, double t) {return C(x, t);}
double S(double t) {
int n = 2; double a = -k, b = k, a1, a2 = trapezoidal(a, b, n, f2, t);
do {a1 = a2; a2 = trapezoidal(a, b, n <<= 1, f2, t);} while (fabs(a1 - a2) > e);
return a2;
}
int main(void) {
double t;
printf("D?:"); scanf("%lf", &D); printf("d?:"); scanf("%lf", &d);
printf("k?:"); scanf("%lf", &k); printf("t?:"); scanf("%lf", &t);
printf("S(%f)=%f\n", t, S(t));
return 0;
}
>>553 それでいいよ。
rand()の下位ビットは周期が極端に短い、上位ビットを使えって話があるけど、それって都市伝説だから。
下位ビットが使えないくらい質が悪いなんて処理系は十数年前に絶滅してる。
いや、自分で統計とってみて、問題ないならそのまま使う事にした方がいいよ
統計までとるなら、適当な乱数ルーチンを探したほうがいい。 お手軽にrand()使うなら、深く考えずにrand() % nでOK。
>>559 rand()のソースとか見たりしないのかなぁ。
上位が質がいいってのはそうだけど、内部では32bitで計算して上位16bitを返してるとか、
そういう実装になってたりするから、まあ、実用上問題ないよ。
ちょっとでも質が良くなるな用に上位を取ろうってとかって話なら、そこまでするなら、
標準のrand()は使わないほうがいいんじゃね? って話。
562 :
初心者 :2007/10/08(月) 00:05:19
丁寧にありがとうございます。本当に感謝です。 早速試してみますm(__)m
セグメンテーション違反になってしまうんですが、わかりますか? 教えてください。お願いします。 #include <stdio.h> int main(void){ int tray[ 3 ]; printf("\nPlase type number >> "); scanf("%d",&tray[ 1 ]); printf("\nPlase type number >> "); scanf("%d",&tray[ 2 ]); printf("\nPlase type number >> "); scanf("%d",&tray[ 3 ]); printf("\nYou 3rd type number is %d\n",tray[ 3 ]); printf("\nYou 2nd type number is %d\n",tray[ 2 ]); printf("\nYou 1st type number is %d\n",tray[ 1 ]); return 0; }
ソースの中見たりするの面倒だから、馬鹿の一つ覚えで上位を取って使ってる とりあえず上位を取っておけば奇数と偶数が交互にでるみたいなことは回避できるだろうし
>>565 そういう処理系はPC上だと十数年前には絶滅してた。
ワークステーションだと、十数年前にはまだあったとかって話は聴いたことがあるけど。
>563 int tray[ 3 + 1 ];
>>566 今やPC以外でもC言語で書くことは多い
そういう環境はPCでいうとちょっと古めの環境になる
ソース見たり確かめて見たりしたことないから、もしかしたら無駄なことかもしれないけどね
どうせコピペだし
569 :
563 :2007/10/08(月) 00:51:16
>564 >567 ありがとうございます。
570 :
初心者550 :2007/10/08(月) 00:57:14
途中のn <<= 1 ってどうゆういみですかー??なんどもすいません
>>570 変数nの中身を左に1シフトして結果を変数nに代入
>>570 ビットを上位にシフトしている。
結果は、n *= 2; と同じ。
もうひとつお願いします。 scanf("%d",&a); で、1つの整数を入力させて、 それを符号を反転させて、表示させたいんですが、どうすればよいでしょうか?
printf("%d", -a)
>574 なんか難しく考えてました。 変換する関数みたいのがあるのかと それでいいんですかね・・・ ありがとございます。
#include <stdio.h> int main(void){ char h,i; printf("Please type key >> "); scanf("%c",&h); printf("\nPlease type key >> "); scanf("%c",&i); printf("%c%c\n",h,i); printf("%c%c\n",i,h); return 0; } これをやると、二回目のscanfが来ないんですが、なぜだかわかりますか?
たいていは 入力時にenterを入れてる分が読み捨て去れずに二回目に渡されてしまうケース fgets() + sscanf() に直すと良いのでは?
別にfflash()でいいんじゃね?
579 :
576 :2007/10/08(月) 01:45:16
#include <stdio.h> int main(void) { char str[32]; int h,i; printf("Please type key >> "); fgets(str,31,stdin); sscanf(str,"%d",&h); printf("Please type key >> "); fgets(str,31,stdin); sscanf(str,"%d",&i); printf("\n%d%d\n",h,i); printf("%d%d\n",i,h); return 0; } こんなのにしてみたんですが・・・ これだと、数字はできても文字が入らないんですね(泣) どうすれば、文字入るんでしょうか
元々 %c だったのを なぜ %d にしてるんだ?
>>579 こういうことじゃなくて?
char h,i;
printf("Please type key >> ");
fgets(str,31,stdin);
h = str[0];
printf("Please type key >> ");
fgets(str,31,stdin);
i = str[0];
printf("\n%c%c\n",h,i);
printf("%c%c\n",i,h);
582 :
576 :2007/10/08(月) 01:51:41
>580 あ、ほんとだ。 書き直してたら、なんか間違えてました。 ありがとございます。
>>573 最上位ビットを反転させるか
0-aとなることをすればいいだけだからな
>最上位ビットを反転させるか
long aをchar c[4]に アンパックしたり 逆にchar c[4]をlong aにパックしたりするのに こんなワークエリアを使ってやっているのですが, union{ long l; char b[4]; } work; ワークエリアを使わずに,キャストとか使って直接代入の方法はないものでしょうか?
>>585 環境依存でよければいろいろある。
Ex.
long l = 0x12345678;
char b[sizeof(l)];
*(long *) b = l;
l = *(long *) b;
l = b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24); b[0] = l & 0xff; b[1] = (l >> 8) & 0xff; b[2] = (l >> 16) & 0xff; b[3] = (l >> 24) & 0xff; -- c99なら char b[] = {l & 0xff, (l >> 8) & 0xff, (l >> 16) & 0xff, (l >> 24) & 0xff};
どうでもいいけど、RND_MAX+1が除数の倍数じゃないと頻度に偏りが出るって問題はいいんだろうか。
どうでもいいよ
自作のヘッダファイル&.cファイルの置き場所って 使うプログラムと同じフォルダに置いて#include"〜〜.h"で使えますか? 初歩的な質問で申し訳ないです。
はい、それはつかえます
>>592 そうですよね
VC++で同じフォルダに置いてあるんですが、関数がないって怒られるので・・・
#ifndef 〜〜_H
#define 〜〜_H
とかヘッダに書くからいけないのでしょうか?
>>593 ソースファイルと同階層に置くんだぞ?*.cと*.hがおなじフォルダ
>>593 我為エスパー的回答
//--- a.h ---
#ifndef INCLUDE_A_H
#define INCLUDE_A_H
//--- b.h ---
#ifndef INCLUDE_A_H
#define INCLUDE_A_H
重複同名定義
>>594 という事はソースファイルと同じフォルダに置くと無理という事ですか?
>>595 同名定義はしてないはずです
#ifndef使っているけど何回かインクルードしているのでまずいのかもしれないです
でもインクルード必要なんで、困ってます
>>596 使用するより前にちゃんとプロトタイプ宣言があるのか?
どうしょうもない単純ミスをしているとしか思えんぞ
いや、質問内容からして、includeディレクトリに わざわざ自作ヘッダファイルを入れてるんじゃないだろうか。 >ソースファイルと同じフォルダに置くと無理という事ですか? 自作物の"hoge.h"のように書いて取り込むヘッダファイルは ソースファイルと同じフォルダでないと駄目。 externみたいな宣言を、だた忘れてたりしてな。
>>596 エラーはコンパイル時なのかリンク時なのか、
まず、エラーメッセージを載せてみ。
>>598 includeディレクトリにはいれてないです
あと、externかもと思ってすべての関数にexternを付けましたが、同じでした
>>599 お願いします。
1>cmd_main.c
1>コードを生成中...
1>リンクしています...
1>cmd.obj : error LNK2019: 未解決の外部シンボル _add_elem が関数 _input で参照されました。
1>cmd.obj : error LNK2019: 未解決の外部シンボル _clear_list が関数 _write で参照されました。
1>cmd.obj : error LNK2019: 未解決の外部シンボル _get_elem が関数 _write で参照されました。
1>cmd.obj : error LNK2019: 未解決の外部シンボル _get_length が関数 _write で参照されました。
1>cmd_main.obj : error LNK2019: 未解決の外部シンボル _init_list が関数 _main で参照されました。
>>600 素晴らしい!ミスリードの天才!
リンクする .obj または .lib が足りてないだけみたい
便乗して質問。#include "hoge/piyo.h" みたいに/区切りなのはどうして?
>>602 MS-Windows 環境なら \\ でもいいよ
605 :
名無し :2007/10/08(月) 21:22:36
出力 printf 1つに対して()内で改行¥nは一つしか使えませんか?? printf(''・・・・¥n・・・・・¥n・・・・・¥n'') てのは可能ですか??
できるけど何故やってみない
607 :
名無し :2007/10/08(月) 21:29:59
まだ初心者でプログラムをどこで作るのか分からない><
>>604 流石にzipはおいそれと開く気になれん。
明示的にリンクしている?
凄いな。脳内プログラマか
>>604 関数定義に extern がついていて気持ち悪いのと
typo が気になるけどソース自体はコンパイル・リンクできた
>>610 ソース変更せずにできたんですよね?
.libは見当たらなかったんですけど、まだリンクする何かが足りないってことかな
>>611 ソース変更無しで以下のコマンドで .exe までできたよ
bcc32 -c cmd.c
bcc32 -c list.c
bcc32 -c cmd_main.c
bcc32 cmd_main.obj cmd.obj list.obj
>〜コマンド検索:sarch www
>>611 gcc cmd.c list.c cmd_main.c -Wall -pedantic
0x032333 ↑こういうのってどういう意味なんですか?
0xは16進数を表す
0x032333は16進法で32333の意味 この値は10進法にすると205619
>>612 おおお ありがとうございます
そうやってリンクしないといけないという事ですか!
>>613 \(^o^)/
>>その環境はよくわかってないので、また勉強しときます。ありがとうございます
できたらVC++2005での解決策をご教授願えないでしょうか?
開発でVisualStudioを使うことが多いと聞いたもので・・
>>604 のやつで
char *buf = NULL;
fgets(buf,CMD_MAX,stdin);
if("exit" == buf){
で、fgetsって、配列じゃない単なるポインタに文字列格納できんの?
あと、if文のこの比較もありなか?
char buf[CMD_MAX];
fgets(buf,CMD_MAX,stdin);
if(strcmp(buf, "exit") == 0){
じゃね?
>>618 C:\5030>cl cmd.c cmd_main.c list.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
cmd.c
cmd.c(15) : warning C4090: '初期化中' : 異なる 'const' 修飾子です。
cmd_main.c
list.c
list.c(44) : warning C4090: '=' : 異なる 'const' 修飾子です。
コードを生成中...
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.
/out:cmd.exe
cmd.obj
cmd_main.obj
list.obj
VisualStudioはこんなコンパイルエラーがでた。
強行して実行したらエラーで勝手に落ちる。
>>619 ポインタでOKなら、fgetsの第二引数とかいらねえだろうな
文字列比較もおかしいし
コンパイルできないってんだから、
未検証なんだろ
>>616-617 そういう事か!!!
「アドレスを指定するときには、16進数を使います。」
だからアドレスを代入するときは、「0x」と書くのですね!!
625 :
デフォルトの名無しさん :2007/10/08(月) 22:29:19
C初めてみようと思ったんだけど試しに超簡単なのをコンパイルしようとしたら sample.c: can't open: stdio.h: No such file or directory とか言われて初心者な俺にはいきなりどうしたらいいかわかんなくなった
間違いなくパソコン初心者でカレントディレクトリを移動させてないな
>>621 そうなんですか?
未解決の外部シンボル・・・ってのはでました?
630 :
デフォルトの名無しさん :2007/10/08(月) 22:37:17
>>631 あ
原因がわかった。ソースのあるディレクトリにlist.*は入れてるけど
VCのプロジェクトの方にいれてなかったーーー...
今まで協力してくださった皆さん、ありがとうございました!感謝
>>603 ヘッダ名の部分ならエスケープの対象ではないので、\1個でもいける。
2個でもいけるのは、Windowsが何個でも受け付けてくれるから。
634 :
デフォルトの名無しさん :2007/10/08(月) 23:42:18
GUIの勉強しようと思うんだけど お勧めの書籍とかHPあったら教えてください!! 簡単な画像処理のソフトとか作ったんで インターフェースも作りたいな。と思って・・・。 むしろCの基本的な事は覚えたんだが次に何していいか わからなくて困ってる。GUIより先にすべき事とか あったら教えてください。
636 :
634 :2007/10/08(月) 23:59:54
少し読んでみましたがAPI楽しそうですね!! 当分、このサイトで遊べそうです^^; ありがとうございました〜
楽しそうだと思える君は才能があるかもしれない
638 :
デフォルトの名無しさん :2007/10/09(火) 00:08:04
Windows APIが分かってくると 「コンピュータはなぜ動くのか」 「Windowsはなぜ動くのか」 「ネットワークはなぜつながるのか」 が読みたくなるはず。
Windows一本で行くならそれでいいけど、 環境依存物しか作れなくなってしまうぞ と、とりあえず言っておく
プリプロセッサが一番最初に処理するファイルって、 どこで決定されるんですか? ソースファイルがいくつかあるとき、どこかで #define HOGE と宣言し、どこかで #ifdef HOGE とやっているときに、#ifdef HOGE よりも前に #define HOGE が処理されるという保証はどこで?
ファイルごとに独立して処理される。 他のファイルで定義されたマクロは、 別のファイルのプリプロセッシングに影響を及ぼさない。 #includeされた場合は、あたかもそこにそのファイルの内容が書いてあるかのように扱われる。
>>640 includeとかでソースを読み込んだ順番
#ifndef HOGE
#define HOGE
#endif
とかやるだろ
643 :
デフォルトの名無しさん :2007/10/09(火) 15:08:04
fputc( )の使い方の説明で int fputc(int 文字、FILE *ストリーム); fputc( )関数は、「文字」の下位バイトを、「ストリーム」に結び付けられているファイルにunsigned char型の値として書き込みます。 とあるんですが、まず、ここで下位バイトって何のことですか?
簡単に言えば、int 32 ビットのうち、下 8 ビットのこと
流れは C/C++ ⇒ JavaScript
(゚Д゚ )ハァ? (゚Д゚ )ハァ? (゚Д゚ )ハァ? (゚Д゚ )ハァ? (゚Д゚ )ハァ? (゚Д゚ )ハァ? (゚Д゚ )ハァ? (゚Д゚ )ハァ? (゚Д゚ )ハァ? (゚Д゚ )ハァ? (゚Д゚ )ハァ?
内部処理UTF-16ベースで 文字コード16ビット固定がいいのですよ URL処理用UTF-8変換も簡単だし
649 :
デフォルトの名無しさん :2007/10/09(火) 15:20:08
>>644 すると上位の24ビットはどうなってしまうんですか?
内部処理UTF-32ベースで 文字コード32ビット固定がいいですよ サロゲートペア考えなくていいし
>>649 どうもならない
使われずに無視されるだけ
652 :
デフォルトの名無しさん :2007/10/09(火) 15:26:35
>>651 fputc()はそもそも何のために使うんですか?
バイトをファイルに書き込むため
654 :
デフォルトの名無しさん :2007/10/09(火) 15:44:54
下位バイトしか書き込まないのに何で「文字」が 全部書き込めるんですか?
文字が全部書き込めると言った覚えはないけど。 アルファベットや数字のような1バイト文字なら、 1バイトを書き込むだけで文字全体を書き込める。 ひらがなや漢字のようなマルチバイト文字は無理だ。 必要なバイト数の分だけ繰り返し fputc を使う必要がある。
UTF-16は、半角系文字も16ビット固定だから つまり文字位置インデックスが高速なんです
でも基本多言語面以外の文字はサロゲートペアで32ビットだから つまりUTF-16って可変長なんです
658 :
デフォルトの名無しさん :2007/10/09(火) 16:34:52
とっても初歩的な質問です。 ポインタ変数の大きさについてなのですが、 int型やchar型は、例えばそれぞれ4バイト、1バイトの大きさですが、 それらを指すポインタ変数、int*型やchar*型の大きさはどうなるんでしょうか? 予想だと、ポインタ変数はアドレス入れるだけなので一定の大きさだとは思うのですが。 32bitCPUなら4バイト(32bit)固定、とかなんでしょうか?
>>658 まぁ普通はそう。
確認したければ sizeof を使ってみるといい。
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(int*));
>>658 アーキテクチャによって違うが、
一般的な32bitCPUなら、どの型のポインタも4byte
661 :
デフォルトの名無しさん :2007/10/09(火) 16:54:06
このスレでバイナリエディタの扱いに慣れてる人いてる?
http://proforceone.web.fc2.com/ ⇒ Processed input data
zzztv[247]
yoshimotokogyo[141]
http://proforceone.web.fc2.com/ ⇒ Calculation processing
d=$.split("\n");for(j=0;d.length>j;j++){s=d[j].substring(0,l=d[j].indexOf("["));
n=eval(d[j].substring(l+1,d[j].indexOf("]")));n=(n-n%20)/20+(n%20>0);br();
for(i=0;n>i;i++){write("http"+"://youtube.com/results?search_query=");
write(s+"&search_sort=video_date_uploaded&page="+(i+1));br();}}br();
664 :
デフォルトの名無しさん :2007/10/09(火) 17:48:01
C言語で何秒間停止させるみたいな関数ってありますか?
665 :
デフォルトの名無しさん :2007/10/09(火) 17:57:45
669 :
664 :2007/10/09(火) 18:12:40
すいませんできれば使い方まで教えてください。
UTF-16は、WindowsXPなど多くのOSで、内部表現に使われている。 Microsoft Windowsでは、リトルエンディアンのUTF-16が使われている。 内部表現ではBOMなし、ファイルなどではBOMありが主である。BOMなしのものはUTF-16LE、BOMありのものはUTF-16符号化形式(BOMありのリトルエンディアン)ということになる。 TCP/IPネットワークでは、ビッグエンディアンに決められている。
UTF-16は、WindowsXPなど多くのOSで、内部表現に使われている。 Microsoft Windowsでは、リトルエンディアンのUTF-16が使われている。 内部表現ではBOMなし、ファイルなどではBOMありが主である。 BOMなしのものはUTF-16LE、BOMありのものは UTF-16符号化形式(BOMありのリトルエンディアン)ということになる。 TCP/IPネットワークでは、ビッグエンディアンに決められている。
673 :
664 :2007/10/09(火) 18:21:32
英語出来なきゃだめ? おまいらの勉強法
日本語でおk
http://proforceone.web.fc2.com/ ⇒ Processed input data
エンタ[263.]
お笑い[4,010]
zzztv[247]
yoshimotokogyo[141]
http://proforceone.web.fc2.com/ ⇒ Calculation processing
d=$.split("\n");for(j=0;d.length>j;j++){s=d[j].substring(0,l=d[j].indexOf("["));
s=encodeURIComponent(s);n=d[j].substring(l+1,d[j].indexOf("]")).split(".");
n=eval(n[0].split(",").join(""));n=(n-n%20)/20+(n%20>0);br();
for(i=0;n>i;i++){write("http"+"://youtube.com/results?search_query=");
write(s+"&search_sort=video_date_uploaded&page="+(i+1));br();}}br();
677 :
デフォルトの名無しさん :2007/10/09(火) 18:58:21
以下のようなテスト用プログラムを組んだのですが、引数が存在しない場合に if(fp == NULL){}内が実行されず、何も表示されずに終了してしまいます。 引数が存在すればscanfまでちゃんと行くのですが、何がいけないのでしょう? #include<stdio.h> #include<stdlib.h> #include<string.h> #define PROGRAM_NAME patch.exe int main(int argc, char *argv[]){ FILE *fp; char answer; fp = fopen(argv[1],"r"); if(fp == NULL){ printf("ファイルがありません\n"); printf("PROGRAM_NAME 書き換え元ファイル パッチデータ\n"); exit(1); } printf("%sにパッチを当てますか?(y/n) ->",argv[1]); scanf("%c",&answer); return 0; }
引数がないときは argv[1] が NULL になるから、 NULL を渡された fopen が落ちる argc を見て引数の数を確認しる
おお、そんなからくりが!引数チェックをしたらちゃんと動くようになりました。ありがとうございます。
argcね argc=1 実行プログラムの絶対パス arg=2 +引数1 arg=3 +引数2 ・・・・・・・・・・・
>argc=1 実行プログラムの絶対パス 絶対パスでは無かったような。 シェルが解釈した後のパースされたコマンドラインの文字列が入ってるだけでない?
682 :
680 :2007/10/09(火) 20:20:35
>>681 それは処理系依存。
[0]に何も入ってない場合もある。
>>683 を、マジか。
フォローさんくす。それは知らなんだ。
ちょっと触ってみたいんで、参考までに何も入ってない環境を知ってたら教えて欲しい。
軽くググってみたけど、CFAQに「何も入っていないかも知れない」って
記述があるぐらいしか分からんかった。
#include <unistd.h> main(int argc, char *argv[]) { if(argv[0]) exec(argv[0], NULL); else puts("argv[0] is null."); } とかでいいんでね?
unsigned (int)は0〜4294967295の範囲を扱えますが 144115188075856000という数字を扱いたい場合どうすればいいでしょうか?
一般的にunsigned intのあらわせる範囲は0 ~ 65,535 そのような巨大な整数を扱いたいならば、 C99から追加されたunsigned long long int (0 ~ 2^64-1)を使うか、 コンパイラが独自に実装している超長整数型を使う必要がある。
>>685 おぉ・・・なるほど。気づかんかった。
重ねてありがとう。
おめーらなんでそんなに詳しいんだよ!!! ちくしょうちくしょう!!
8の平方根をsqrt(8)とかやって計算すると2.828とかが出てくると思うんですが、 8の平方根として2√2を出したい場合もあると思います。 8ならば x[2]={1,8}; for(i=2; i*i <= x[1]; i++) if(!x[1]%(i*i)){ x[0] *= i; x[1] /= i*i; } printf("square root of 8 = %d",x[0]); if(x[1]!=1) printf("√%d",x[1]); これでいいとは思いますが、 例えば√0.02=0.1√2だとか、√1.6=0.4√10などの式変形をしたい場合、 どのようにすればよいのでしょうか。 変形が一意的に定まらない場合もありますが(0.4√10=4√0.1とか)、 とりあえずはルートの中身が平方数でない整数、という条件でお願いします。 (もしくは他の規則でも構いませんが)
692 :
デフォルトの名無しさん :2007/10/09(火) 22:06:43
>>655 遅レスすみません。
char str[80] = "ファイルシステムのテスト\n";
FILE *fp;
char *p;
p = str;
while(*p) {
if(fputc(*p, fp) == EOF) {
printf("ファイル書き込みエラー\n");
exit(1);
}
p++;
}
と教科書にあるんですがこの場合
"ファイルシステムのテスト"
が2バイト文字だから
フの下位バイト、ァの下位バイト、イの下位バイト、・・・
という風に書き込まれていくんですか?
>>692 そういう場合はstr[0] にフの上位バイト、str[1]にフの下位バイトというふうに入ってる。
フフフフフフフフ
695 :
デフォルトの名無しさん :2007/10/09(火) 22:33:25
(^^)
>>691 √0.02を0.1√2に変形するとき、お前さんは何を考えた?
それをそのままコードにすればいい。
>>696 そういう考え方をすればいいんですね
ありがとうございます
699 :
デフォルトの名無しさん :2007/10/10(水) 00:12:20
16進数の値が書かれた文字列を、 10進数の数値に直すにはどうすればいいのでしょう? "0012FF" → 4863 という感じです
int main(){ char hex[256]; int dec=0 , i; printf("hex?>"); fgets(hex,256,stdin); for(i=0; hex[i] != '\n' && hex[i] != '\0'; i++){ dec *= 16; if(hex[i] >= '0' && hex[i] <= '9') dec += hex[i]-'0'; else if(hex[i] >= 'a' && hex[i] <= 'f') dec += 10 + hex[i] - 'a'; else if(hex[i] >= 'A' && hex[i] <= 'F') dec += 10 + hex[i] - 'A'; else break; } printf("%s->%d" , hex , dec); return 0; }
703 :
デフォルトの名無しさん :2007/10/10(水) 01:07:07
共用体ってなにが便利なのか全然分かりません
704 :
691 :2007/10/10(水) 01:43:20
>>698 あ、ほんとですね
√16とか
iをsqrt(x)から始めて減らしてくか、
インクリメントするのに条件を設けるか……
ありがとうございます
if(!x[1]%(i*i)) を while(!(x[1]%(i*i))) にすればok
>>702 int n;
sscanf("0012F", "%x", &n);;
scanfってなんで使っちゃだめなの?
709 :
hj :2007/10/10(水) 13:50:32
『各辺が確率的に結ばれるグラフ(ランダムグラフ)を 確率ごとに100個ずつ作りファイルに入れる』 という課題がでました。誰か助けて下さい
そんなことより鼻くそがめちゃくちゃ硬くて無理やりとったら めっちゃ鼻血が出てきたんだがどうすればいい?
>>711 鼻血が出ているスレッドに対して TerminateThread でおk
713 :
デフォルトの名無しさん :2007/10/10(水) 18:57:04
ファイルにパッチを当てるプログラムを作ったのですが、うまく動きません。
指定と全く違うデータがファイルの先頭に入るだけで終わってしまいます。どこがいけないのでしょう?
パッチの書式は アドレス:データ です。例えば
00000001:FF34AB
0000F:35
のように、アドレス先頭のゼロの連続は無視、データ長はほぼ自由で、
指定したアドレスから順にデータを書き込んでいく、という感じです。
ソースをアップロードしたので、見ていただけませんでしょうか。
http://ranobe.com/up/src/up229162.txt
>>713 ソースコードの文字コードがShift-JIS → MS-Windows
おそらく fopen の時に バイナリモード で開いていないのが原因
715 :
714 :2007/10/10(水) 19:02:28
ごめん 嘘でした orz
>>713 適当にざっと見ただけだが、
>sprintf(data_numtemp,"%lb",data_num);
%lb って何?
>fwrite(data_numtemp,sizeof(data_numtemp),1,fp_src);
sizeof(data_numtemp) って BUF_MAX のことだと思うんだが
717 :
デフォルトの名無しさん :2007/10/10(水) 19:21:25
>%lb って何? long型の2進数になるかと思ったんですが、この書き方は変でしたか。 でも%bに直してもバグは変わらず… >sizeof(data_numtemp) って BUF_MAX のことだと思うんだが sizeof(data[count])に直してみましたが、それでもまだバグは変わらず…
718 :
714 :2007/10/10(水) 19:28:10
>>717 勉強の邪魔になるならやめるけど
お詫びに作ってみたけど見てみる?
719 :
デフォルトの名無しさん :2007/10/10(水) 19:30:44
>>718 邪魔だなんてとんでもないです。
普通はどうやって実現するのか気になるので、是非見せてください
720 :
714 :2007/10/10(水) 19:31:36
>>719 #include<stdio.h>
int exec_patch(FILE *fp_dest, FILE *fp_patch){
unsigned long address_num;
int value;
char buf[2+1];
while(1){
if(fscanf(fp_patch, "%lx%1[:]", &address_num, buf)!=2) break;
fseek(fp_dest, address_num, SEEK_SET);
while(fscanf(fp_patch, "%2[0-9A-Fa-f]", buf)==1){
if(buf[1]=='\0') return 0;
sscanf(buf, "%x", &value);
fputc(value, fp_dest);
}
}
return feof(fp_patch);
}
int main(void){
FILE *dest, *patch;
dest=fopen("src.dat", "r+b");
patch=fopen("patch.dat", "r");
if(dest==NULL || patch==NULL) return 1;
if(!exec_patch(dest, patch)) fprintf(stderr, "\nError: patch failed.\n");
return 0;
}
>>692 どうでもいいがひどい教科書だな。
その文章なら動くかもしれんが、下位バイトに00が入る文字を含んだ途端尻切れ確定。
>>713 82行目
>if(file_patchdata_line[count][last] = '\n') file_patchdata_line[count][last] = '\0';
== の間違い?
124行目
>sprintf(data_numtemp,"%lb",data_num);
???
文字列 address および data の最後に '\0' が無い
723 :
デフォルトの名無しさん :2007/10/10(水) 20:24:11
%5.1f の5.1ってどういう意味ですか?
小数点の左側が五桁、右が一桁。
725 :
デフォルトの名無しさん :2007/10/10(水) 20:25:11
>>720 変換指定子ってそんなに細かい使い方ができるんですね。
fscanfと組み合わせるといろいろ応用が効きそうです。ありがとうございます
>>722 =='\n'に直して、%lbは%bにしました。
また、count--の前に
address[count][last + 1] = '\0';
data[count][last - lasttemp + 1] = '\0';
をそれぞれ追加しました。
しかし一向に改善してくれません。一体どこが問題なのでしょう…?
>>725 sprintfに%bなんて変換指定子は存在しない。
Cのprintfに%bなんかないっちゅうねん。
728 :
723 :2007/10/10(水) 20:50:13
>>725 >>713 のソースコードを次のように変更したらいけたっぽい
82c82
< if(file_patchdata_line[count][last] = '\n') file_patchdata_line[count][last] = '\0';
---
> if(file_patchdata_line[count][last] == '\n') file_patchdata_line[count][last] = '\0';
96a97
> address[count][last] = '\0';
111a113
> data[count][last - lasttemp] = '\0';
122,124d123
< /* データを2進数の文字列に変換 */
< data_num = strtoul(data[count],NULL,16);
< sprintf(data_numtemp,"%lb",data_num);
125a125,134
> {
> int i, value;
> /* 16進数文字列を対応するデータ列に変換 */
> for(i=0,data_num=0;data[count][i]!='\0' && data[count][i+1]!='\0';i+=2)
> {
> sscanf(&data[count][i], "%2x", &value);
> data_numtemp[data_num++]=value;
> }
> }
>
127c136
< fwrite(data_numtemp,sizeof(data_numtemp),1,fp_src);
---
> fwrite(data_numtemp,data_num,1,fp_src);
>>729 おお、すごい!ちゃんと指定したデータが書き込まれるようになりました。
ただアドレスにA〜Fが無い場合は動作しないようで、ファイル先頭が少し変ですが、かなりの進歩です。
どうもありがとうございます。
731 :
デフォルトの名無しさん :2007/10/10(水) 21:42:02
VisialCで実行した時に出力結果といっしょに フフフフフフフとか』とか出てくるのはどこがおかしいからですか?
>>731 デバッグビルドだからです
リリースビルドなら不定です
>>731 "それが期待した動作ならそれでいいんじゃないかな\0"
float変数の整数部のみをBYTE変数に高速にコピーするにはどうすれば良いでしょうか? float a; BYTE b; a = 何かしらの浮動小数点演算; b = a; ←このコピーが非常に遅い
>>734 BYTEが整数型であるという前提で。
実数を整数にする(=整数部を取り出す)処理はどうしても時間が掛かる。
しかし、今時のCPUなら問題になるほどではないと思うのだが。
そこでポイントは、「そこがボトルネックになっているのか?」と
「どうしても高速化したいならその周辺も含めて考えるべき」ということ。
アドバイス有り難うございます。 BYTE型はunsigned charで整数型です。 動画(VGA)を表示するソフトを作っているのですが、 実数から整数へのコピーがない場合には画面のフレームレートで約45fpsでています。 これが実数から整数へのコピーがあると23fps程度まで一気に落ちてしまいます。 ですのでこの部分がボトルネックである事は間違いありません。 1画素辺りRGBの3回のコピーが必要で、これが一画面分となると922K回コピーが発生する計算になります。 float変数の整数部を直接参照できないかなぁとか考えているのですが無理なんでしょうか?
それなら固定小数点数使うしかないね
740 :
デフォルトの名無しさん :2007/10/11(木) 01:18:26
c言語覚え初めて3日目です。 #include <stdio.h> #include <string.h> int main(void) { char namae[256],namae1[] = "arashi",namae2[] = "arasi",namae3[] = "Arashi",namae4[] = "Arasi",namae5[] = "ARASHI",namae6[] = "ARASI"; printf("お名前を教えてください:"); scanf("%s",namae); if ((strcmp(namae,namae1)==0)||(strcmp(namae,namae2)==0)||(strcmp(namae,namae3)==0)||(strcmp(namae,namae4)==0)||(strcmp(namae,namae5)==0)||(strcmp(namae,namae6)==0)) { printf("%sアホ\n",namae); } else { printf("%s様天才\n",namae); } return 0; }
741 :
デフォルトの名無しさん :2007/10/11(木) 01:19:13
もっとコンパクトに書けないでしょうか?
C++とそのライブラリであるSTLとboostを使ってください
744 :
740 :2007/10/11(木) 01:27:27
ありがとうございます。 大昔、小学生時代にBASICちょっとだけ触って以来のプログラム勉強です。 こんにちはマイコンに740と同じようなプログラムがあったように思うので、練習に書いてみました。
>>740 少しはスマートかな?
#include <stdio.h>
#include <string.h>
int main(void) {
char name[256], *names[] = {"arashi", "arasi", "Arashi", "Arasi", "ARASHI", "ARASI"};
int i;
printf("お名前を教えてください:"); scanf("%s", name);
for (i = 0; i < sizeof(names) / sizeof(names[0]); i++)
if (!strcmp(name, names[i])) {
printf("%sアホ\n", name);
return 0;
}
printf("%s様天才\n", name);
return 0;
}
746 :
740 :2007/10/11(木) 01:41:46
どうもありがとうございます。 もっと勉強します。
>>737 普通に考えて、「何かしらの浮動小数点演算」の方が「整数部の抽出」より遅いと思うのだが。
そうでないとしたら、「何かしらの浮動小数点演算」を(整数化するとか)なにか考えた方がいい。
例えば、値域が限定できるのなら固定小数点数として演算するとか。
>>739 今時のCPUなら変換処理をCPU内部で行える筈。それより速く抽出できるとは考えにくい。
>>740 入力文字列を小文字変換して、
arashi,arasiと比較すればいい
>>734 基本的にfloat型はdouble型より遅い。
最近のCPU内部では結局double型に逐次変換して処理を行ってるから、その分がオーバーヘッドになる。
特に理由が無いのならfloatはやめてdoubleにすればいい。
今だにそれを信じてる人が居るのか
グラフィックでfloatが使われるのは精度が求められないこと、メモリの節約、SIMDとの相性の良さ、 グラフィックライブラリやハードがfloat前提の設計になっているなどの理由かな。 byteじゃなくてlongへの変換だけどちょっと作ってみた。遅そうだ(笑 long hage(float f) { long *b = (long *) &f; int sign = (*b >> 31) & 0x00000001; int exp = (*b >> 23) & 0x000000ff; long frac = *b & 0x007fffff; if ((exp == 0) && (frac == 0)) return 0; if (exp == 0) return 0; // 非正規化数 if (exp == 255) return -1; // 無限大 NaN // 正規化数 char tmp = (exp - 127 - 23) & 0x0ff; exp = tmp; // 符号拡張 frac |= 0x00800000; if (exp > 0) frac <<= exp; else frac >>= -exp; if (sign) frac = -frac; return frac; }
>>749 知ったか乙
>>751 どう見ても遅いね。
問題は、元質が果たしてIA32を想定しているかどうかなんだけどね。
# 案外FPGAでなんとかしようとしているのかもしれないw
>>734 C3プロセッサだと通常の3倍速になった
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef union tag_f2i_t{// IEEE754 前提
float f;
struct{unsigned karisuu:23, sisuu:8, sign:1;};
}f2i_t;
#define NUM 10000
#define TRY 10000
int main(void){
f2i_t *p;
float x[NUM], *p2;
unsigned char y[NUM];
clock_t c;
int i, j;
for(i=0;i<NUM;i++) x[i]=rand()%100,y[i]=0;
c=clock();
for(j=0;j<TRY;j++){
p=(f2i_t*)x;
for(i=0;i<NUM;i++){
y[i]=((0x800000 | p->karisuu) >> (150-p->sisuu));
p++;
}
}
printf("%d %.3f[sec]\n", y[0], (double)(clock()-c)/CLOCKS_PER_SEC);
c=clock();
for(j=0;j<TRY;j++)
for(i=0,p2=x;i<NUM;i++,p2++) y[i]=*p2;
printf("%d %.3f[sec]\n", y[0], (double)(clock()-c)/CLOCKS_PER_SEC);
return 0;
}
最適化かけたら10倍以上になった… これはいただきだ!
755 :
753 :2007/10/11(木) 09:06:21
数値が 0 の時にバグってるようだ。なんでだろう?
>>754 環境は?
IA-32だとどう見ても遅いんだけど。
>>753 0のときは最上位ビットを立ててはいけない。
そういえば、符号の処理もしてないね。
VC++2005, WindowsXP, Celeron 1.40GHz cl /O2 foo.cpp 41 0.350[sec] 41 4.446[sec] cl /arch:SSE2 /O2 foo.cpp 41 0.350[sec] 41 0.260[sec] SSE使うと逆転した
759 :
753 :2007/10/11(木) 09:21:33
unsigned 型の数値を 150ビット 右にシフトしたら 0 になると思っていたが 実際には 150-128=22 ビットしかシフトされていないようだ これはC3だから?
>>759 あー、そりゃそもそもダメだ。ビット数以上のシフトは環境依存。
CPUによっては(IA-32のように)32の剰余分しかシフトしない。
761 :
753 :2007/10/11(木) 09:36:24
これでもC3なら三倍速 y[i]=((0x800000 | p->karisuu) >> (150-p->sisuu)); ↓ y[i]=(150-p->sisuu)>31?0:((0x800000 | p->karisuu) >> (150-p->sisuu));
VC++2005, WinXP, Athlon64 3000+ /arch:SSE2 /Ox /Ot 41 0.172[sec] 41 0.234[sec] 後者が通常の方法だよね?
Intel(R) Core(TM)2 CPU 6320 @ 1.86GHz -- C:\cygwin\tmp>cl foo.c /O2 C:\cygwin\tmp>.\foo 0 0.250[sec] 0 1.765[sec] C:\cygwin\tmp>cl foo.c /O2 /arch:SS C:\cygwin\tmp>.\foo 0 0.250[sec] 0 0.125[sec] -- $ gcc foo.c -O3 $ ./a 0 0.313[sec] 0 0.875[sec] $ gcc foo.c -O3 -msse2 $ ./a 0 0.313[sec] 0 0.125[sec] -- えーと、clのfpuの遅さとgccの最適化の悪さは何?
逆に考えるんだ! SSEとかが使えないようなPCでは提案された方法の方が速くなると!
765 :
753 :2007/10/11(木) 09:56:52
ん? 後は符号判定くらいじゃないの? あーそうか、オーバフローするのか。値を制限すればいいんでない? って、要は固定小数点と見做すようなもんか。
配列を関数の引数として渡すときに ポイント使わなければ何がおきるの? 数値に誤差でるの?
は?
>>767 意味がわからんので、具体的なコードで例を示してみてくれ
初心者で馬鹿な質問かも知れませんがよろしくお願いします。 スイッチ文にてnumの値によって処理がかわるようにしたいと思いました。 numが1,2の場合で、swがFALSEだった場合はdefaultの処理に行かすようにしたいのです。 そしたら、トリッキーっぽいな処理を思いついて(下のやつ)、 試しにコンパイルしてみましたがやっぱりだめでしたw やっぱし、caseの中に同じif文書くしかないでしょうか? switch(num) { if(SW == FALSE) { case 1: //1の処理 break; case 2: //2の処理 break; } case 3: //3の処理 break; case 4: //4の処理 break; default: //default処理 break; }
>>770 これでどう?
switch(SW?num:0)
switch(((num==1||num==2)&&!SW)?0:num)
そこまでしてswitch使いたいもんかね
switch(num){ case 1: if (SW == FALSE) goto sw_false; // 1の処理 break; case 2: if (SW == FALSE) goto sw_false; // 2の処理 case 3: // 3の処理 break; case 4: // 4の処理 break; default: sw_false: // default処理 break; }
>>772 その形式のif文ありましたね、忘れてました。
>>774 そういう手がありましたか・・・。
ありがとです^^
switch(num) { case 4: //4の処理 break; case 3: //3の処理 break; case 2: if(SW==TRUE) { //2の処理 break; } case 1: if(SW==TRUE) { //1の処理 break; } default: //defaultの処理 break;
>>753 データをfloatで持たずに最初から整数でもてばいいのではないかな?
たとえばAD変換のデータなら元データは整数だから、時数に返還しないで整数のまま処理する。
もっとも、扱っているデータがどういうデータなのかわかなないけど
バンナム「PS3タイトルを作る際にグラフィックに掛かるコストは約10億円でWiiタイトルの2倍。 PS3ソフトで利益をあげるには最低50万本売らないといけない」 カプコン「PS3の高すぎる開発費のため、モンハン3のプラットフォームを変えた」 セガ「PS3やXbox360ではプログラマが50人以上必要。Wiiだと20人位」 THQ「PS3やXbox360ではコストが1000万〜1200万ドル。Wiiだと150万〜400万ドル」
誤爆すんなよゲハ厨
初心者で申し訳ないのですが 表示してきた文字を消すことはできますか?
はい
そうなんですか どうすればできますか?
消す方法は文字の表示方法による
printfですけど・・・・
system("cls");
そうなのですか!ありがとうございます
787 :
デフォルトの名無しさん :2007/10/12(金) 21:18:45
system関数を使うのってどうなの?移植性が壊滅しそうで嫌だ
>>787 表示した文字を消すって時点で環境依存だから。
100個ぐらい改行を出力すればポータブルに画面を消せそう
プログラム超初心者です。 Visual C# 2005 Express Editionを使ってるのですが、 ツールボックスを詳しく解説してるサイトってありませんか? ググってもあんまり見つからないのですが・・・
標準出力がペーパーメディアで死ぬ。
構造体を引数に使った関数をヘッダーファイルで定義するとエラーが出てしまいます .c内に入れるとコンパイルできるのですが、できればヘッダーの中に入れておきたいです 解決策はあるでしょうか?
>>792 エラーを書け。
おそらくプロトタイプ前に構造体が定義されてない
#include <stdio.h> #include "test.h" typedef struct{ int yx; }PARA; PARA param={1}; int main(){ print(param); return 0; } test.h void print(PARA param){ printf("%d",param.yx); } エラー E2147 C:\Cpro\stest\test.h 1: 引数宣言は 'PARA' で始められない エラー E2294 C:\Cpro\stest\test.h 2: . または .* の左側に構造体が必要(関数 print ) エラー E2342 C:\Cpro\stest\test.c 12: パラメータ 'param' は int 型として定義されているので PARA は渡せない(関数 main ) です お願いします
test.h で PARA を使うよりも前の位置に PARA の定義が必要
>>795 >794
構造体の定義もインクルードファイルに書いておけ。
ここで質問に答えられるレベルの人がどんな仕事とかについてるのか知りたい 教えてぽ
10年くらい前まではフルにCで書いていた。 今ではスクリプト言語の拡張モジュールを書くのに使っている。 既存のCで書かれたライブラリとつなげたり、 性能が必要な部分だけちょこっとCで書いたり。
やっぱりプロの人なのか・・・
この間プロになった
>>800 プロ歴2年目
プログラミング歴9年目
彼女居ない歴27年目
組み込みでCを3年ほど触ってる 制限の大きい環境の中での開発は楽しい。
807 :
名無し :2007/10/12(金) 23:30:01
偶数か奇数かを表示するプログラムの条件はどうなるか分かる人います?? If文を使うってことわ分かるんですが・・・・
います
やっぱこういう人っているんだな
810 :
デフォルトの名無しさん :2007/10/12(金) 23:32:18
#include <stdio.h> #define N 5 sort(int data[],int N){ int i,j,k; int max,max_num; int data[] for (i = 0;i < N;i++){ max = data[i]; for (j = i + 1;j < N;j++) if (max < data[j]){ max = data[j]; max_num = j; } for (k = max_num;k > i;k--) data[k] = data[k - 1]; data[i] = max; } } int main(void){ int a[N]={1,2,3,4,5}; int i; sort(a,N); for (i = 0;i < N;i++) printf("%d",a[i]); return 0; } 3行目あたりが怪しいと思うのですが…どうすればいいですか?
811 :
名無し :2007/10/12(金) 23:32:22
どうすればいんですか??初心者なもんで教えてください。
813 :
デフォルトの名無しさん :2007/10/12(金) 23:36:12
>>812 配列を大きい数順に並びかえて表示させたいのです
>>811 #include<stdio.h>
int main(void){
int n;
scanf("%d",&n);
while(n>0)n-=2;
if(!n)printf("偶数です");
else printf("奇数です");
return 0;
}
>>814 だと負の数がすべて奇数になってしまうな
#include<stdio.h>
int main(void){
int n;
scanf("%d",&n);
if(n&1) printf("奇数です");
else printf("偶数です");
return 0;
}
816 :
名無し :2007/10/12(金) 23:44:09
>>814 ありがとうございます。でもwhile(n>0)n-=2;の意味がわかりません><
>>816 0未満になるまで入力値を-2していく。
どんな正の整数も最終的に0か-1になる。
0なら偶数、-1なら奇数としてる。
818 :
名無し :2007/10/12(金) 23:51:03
>>815 ありがとうございます。
n&1の意味が分かりません><
&の後ろに数字を入れてもいんですか?
821 :
名無し :2007/10/12(金) 23:55:43
>>817 なるほど!どんな数でも−2していけばその値が0かー1になるからそれで判別するってことですか!ありがとうございます。
×どんな数 ○どんな正の整数
823 :
名無し :2007/10/12(金) 23:59:20
>>819 あー!つまりn=1の解釈ですね。分かりました。
824 :
名無し :2007/10/13(土) 00:00:50
826 :
名無し :2007/10/13(土) 00:04:57
>>823 勘違いしてね?
nの最下位ビットが1かどうかの判定をしているんだぞ?
整数Nを入力し、N!を求めるプログラムを無限ループを使用して作れ。ただし、負の数字は再入力とし数字0の入力でプログラム終了とする。 整数を入力後8bitまでの2進数で算出するプログラムを作れ。ただし、1bit目は?と出力できること。また、8bit以上の数字は再入力とし、負の数字の入力でプログラム終了とする。 ↑の2つの問題わかるかたお願いします。
なんという無限ループ
830 :
名無し :2007/10/13(土) 00:07:27
あと、条件文において n=getchar(); という文は必ずしも必要ではないんですか??
数字以外の入力があったときどうすればいいのか書いてないので回答不能
>ただし、1bit目は?と出力できること。 はてな?
834 :
名無し :2007/10/13(土) 00:14:00
>>828 ?と出力ってのがよくわかんなかったが、とりあえず下の問題だけできた
#include<stdio.h>
int main(void){
int n,i;
while(0x0==0x0){
flg:
printf("整数を入力してください:");
scanf("%d",&n);
if(n&1<<(sizeof(n)*8-1))return 0;
if(n&~0xFF)goto flg;
for(i=1<<7;i>0;i>>=1)printf("%d",!!(n&i));
putchar('\n');
}
}
836 :
828 :2007/10/13(土) 01:01:18
>>835 ありがとうございます!残る問題もどなたかお願いします
>>810 sort(int data[], int N) → void sort(int data[], int n)
sort関数内のNをnに置き換え
int data[] を削除
>>836 #include<stdio.h>
int main(void){
int n,i;
flg:
printf("整数を入力してください:");
scanf("%d",&n);
if(n){
if(n>0){
i=1;
while(n>!0) i*=n--;
}else goto flg;
}
else return 0;
printf("%d\n",i);
goto flg;
}
839 :
デフォルトの名無しさん :2007/10/13(土) 02:33:55
goto使ってる時点で、ヤバイよ?
gotoしか突っ込めないならヤバイよ?
841 :
デフォルトの名無しさん :2007/10/13(土) 02:50:34
>>839 みたいな奴って教科書のサンプルプログラムを動かしてるだけの癖に
「Cできます」みたいな奴が多い。
実際はgotoはふつうに使うよ
むしろC言語少ししかわからないニート何だろ
エラー処理纏めたり、多重ループを抜けたりするときに使うことはあるが、
>>838 みたいな使い方はする意味が無い。読みづらくなるだけ。
>>841 の程度が知れるわ。
そもそも
>>838 は
>>828 に対する嫌がらせで書いてるだけだろ。
ふいんき(←何故か変換できない)読めよ
もう反論打ち止めかよw
gotoに突っ込むなら
>>814 からの一連の流れに突っ込んで欲しかった
つか誰か止めろよ
多重ループ抜けるのにgoto使ってるのって今まで見たこと無いな
>>838 と同じで代替手段があるのにわざと読みにくく書いてるんじゃね?
848 :
デフォルトの名無しさん :2007/10/13(土) 06:35:27
ZIPを解凍するプログラムを作りたいのですが、unzip32.dllの使い方が分からなくて困ってます。 そもそもDLLを使用するにはどうすればいいのでしょう? ググっても自分で作ったLIBファイルを使うものしか出てきません。 また、そのDLLで使用できる関数を調べるにはどうすればいいのでしょうか?
ググリ方がおかしい
unzip32.dllでググればunzip32.dllについては分かるだろ。DLLについても同様。 DLLの関数はC言語だけで調べるよりもVBとかも含めて調べるといい
頭がおかしい。
852 :
デフォルトの名無しさん :2007/10/13(土) 08:33:35
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
853 :
デフォルトの名無しさん :2007/10/13(土) 08:34:13
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
854 :
デフォルトの名無しさん :2007/10/13(土) 08:34:56
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
855 :
デフォルトの名無しさん :2007/10/13(土) 08:35:38
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
856 :
デフォルトの名無しさん :2007/10/13(土) 08:36:14
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
857 :
デフォルトの名無しさん :2007/10/13(土) 09:00:58
>>850 ありがとうございます。配布元にドキュメントがありました。
しかし疑問なのですが、DLLの使い方はネットで調べなければわからないものなんですか?
ドキュメントが存在しなかったり、検索に引っかからない無名DLLの場合はどうすればいいのでしょう?
他のソフトに同梱されているDLLが便利そうだから使ってみる、ということはできないのでしょうか。
つ「リバースエンジニアリング」
VBから使える種類のDLLだと VBで参照設定すれば中の関数の一覧が見れる。 C#等.NET言語でも同じように中身を見れる。 いずれにせよ、Cとはあまり縁のない世界だな。
VC++6の使い方が分からんとです。 #include <windows.h> int PASCAL WinMain(HINSTANCE hinstCurrent, HINSTANCE hinstPrevious,LPSTR lpszCmdline,int nCmdShow) { MessageBox(NULL,"aaa","bbb",MB_OK); return 0; } みたいな簡単なプログラムがエーラーが出るとです。 プロジェクト 'tekitou - Win32 Debug' 用の中間ファイルおよび出力ファイルを削除しています。 --------------------構成: tekitou - Win32 Debug-------------------- コンパイル中... tekitou.c リンク中... LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です Debug/tekitou.exe : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー tekitou.exe - エラー 2、警告 0 エラーの対処・理由・上手い使い方を教えて? 易しいサイト等も有ったら、教えてちょ m(_ _)m
>>860 エラー見ればmainが無いってわかるじゃん。
プロジェクトの設定がおかしいんじゃね?
862 :
860 :2007/10/13(土) 13:38:08
>>861 昨日は動いたのだけど、今日やったら動か無い・・・
ファイル 開く 〜.c
では駄目?
また一々プロジェクトを設定するものなの?
VCは初心者じゃけん、迷惑かけるけど付き合いヨロ
m(_ _)m
863 :
860 :2007/10/13(土) 13:39:23
備考 .cで開いて、ビルド・実行 です。
スレ違いだ、他所行け
ソースファイルじゃなくてプロジェクトファイルを開け
質問させてください 柴田望洋著「明解C言語入門編」の演習で 「2行3列と3行2列の行列の積を求めるプログラムを作成せよ」 x=1,2,3 4,5,6 y=1,5 5,3 8,1 というモノがあるのですが #include <stdio.h> int main(void) { int i,j,k; int ma[2][3] = { {1,2,3},{4,5,6} }; int mb[3][2] = { {1,5},{5,3},{8,1} }; int mc[2][2] = {0}; for(i=0;i<2;i++){ for(j=0;j<2;j++){ for(k=0;k<3;k++){ mc[i][j] += ma[i][k] * mb[k][j]; } printf("%d",mc[i][j]); } putchar('\n'); } return (0); } 上記のプログラムで良いらしいのですが、何故2行3列と3行2列の積が2行2列になるのか。 mc[i][j] += ma[i][k] * mb[k][j];のように加えて行くのか理解することが出来ません。 どのような理屈なのかをお分かりの方、教えてください。
>>866 >何故2行3列と3行2列の積が2行2列になるのか。
プログラムの問題じゃない、単なる行列の積だ。
授業でやらなかったのか?
「行列の積」という言葉、言われるまで全く思い出せませんでした。 失礼しました。
ぽかーん
870 :
860 :2007/10/13(土) 14:17:13
>>865 有難うm(_ _)m
スレチらしいので、
誰か、誘導よろ!
他に無い?
872 :
デフォルトの名無しさん :2007/10/13(土) 17:30:07
>>866 これ値が一つずつ多くね?
例えば2行2列なら[1][1]でいいだろ
俺が悪かった。切腹はしない
あいつマジ切腹しろよ
877 :
デフォルトの名無しさん :2007/10/13(土) 21:28:52
大きさが不定の配列ってどのように扱えばいいんでしょう。 例えば1バイトかもしれないし、1GB以上かもしれないような場合、最初に[10000]とかで宣言するわけにはいきませんよね。 かと言って[]で宣言したとしても、結局mallocの時にはサイズを指定することになるので、あまり変わらない感じです。 こういう配列は普通どうやって実現するんですか?
とりあえず適当なサイズでmallocしておく。 途中でもっと大きなものが必要になったら、reallocで大きなサイズに確保しなおす。
C++なら標準でvectorという可変長配列があるけど Cには標準では無いので自作するしか (mallocとreallocを使うとか)
880 :
デフォルトの名無しさん :2007/10/13(土) 21:37:40
>>878 なるほど。しかしreallocも結局サイズ指定が必要ですよね。
必要なサイズが本当に全くわからない場合でも、その方法は有効なのでしょうか?
>>879 便利そうですね。
他の言語だとこのような配列は普通に扱えるんですか?
>>880 必要なサイズがわからないデータなど存在するわけがなかろう…
883 :
860 :2007/10/13(土) 21:49:56
>>880 どうせvectorも、適当に確保しておいて必要になったら確保し直す戦略だよ。
>>880 配列にデータを格納するその瞬間に、そのデータを入れるのに必要なサイズまで拡張するの
格納するデータはその瞬間は手元にあるわけだから、サイズがわからないわけないだろう
886 :
デフォルトの名無しさん :2007/10/13(土) 22:23:52
>>885 ということは、サイズの指定は変数で行えばいいんですか?
サイズを測ってそれを変数に代入してメモリ確保、ということも可能なんでしょうか。
しかしそもそも、サイズを測るためにはまずメモリに格納されていなければ不可能だと思うのですが…。
どんだけ水が入ってるかわからなくても、 コップですくい続ければ最終的には、 コップN個分で足りる。
>>886 データが存在するなら、どこかの記憶域にあるわけだろ…
>>886 おまいが心配しているケースを具体的に書いてみ
890 :
デフォルトの名無しさん :2007/10/13(土) 22:38:37
>>888 HDDや標準入力から、メモリに読み込まずにサイズを測ることは可能なんですか?
>>890 とりあえず1KBのメモリを確保して、1KB読む。
まだデータが残ってるなら、1KB追加確保して次の1KBを読む。
まだ残ってるなら、2KB追加確保して次の2KBを読む。
何も難しいことはなかろう。
>>890 例えば、終わりに達するまで1KBずつ読み込んでいく。
1KB読むたびに、配列を1KBずつ拡張していく。そんな感じ。
893 :
デフォルトの名無しさん :2007/10/13(土) 22:44:53
>>889 例えばキーボードから入力された文字列の大きさを測る場合、
文字列はコピペを駆使して100MB以上にすることも可能ですよね。
そういうものを暴走させずに対処したいんです。
894 :
デフォルトの名無しさん :2007/10/13(土) 22:46:19
>>891-892 そんなことができるんですか!順に読み込むにはどの関数を使えばいいんでしょうか?
fgetsで指定サイズ読み込み EOFでなければreallocで確保領域増やしてまたfgets この繰り返し。とか。
HDDからというのがファイル読み込みを意味するのであれば、
ファイルポインタを制御してファイルサイズを取得してから
データの読み込みを行う、とかいう手もある。
>>895 fgetsはオーバーした分捨てるからダメじゃね?
readとかgetcharとか
>>894 fgetcでもfreadでも好きなの使えばいいよ
901 :
デフォルトの名無しさん :2007/10/13(土) 22:55:18
なるほど、HDDのファイルを読むのは簡単なんですね。ありがとうございます。 標準入力に関してはどうでしょう? サンプルを見てもいつも[1000]とか「これくらいなら大丈夫だろう」みたいな あまり根拠の無い数字ばかり書いてあって、無駄だしスマートじゃないしで 何かいい方法が無いのかと気になってます。
>>901 同じだよ
fgetcでもfreadでも好きなの使って、同じようにメモリ確保して拡張しながら読んでいけばいい
904 :
デフォルトの名無しさん :2007/10/13(土) 23:05:50
ファイルも標準入力も、扱い方は同じなんですか。 scanfくらいしか使えないと思ってたので、fread系が使えるとは驚きです。 それならいろいろ応用が効きそうですね。ありがとうございました。
こん馬鹿ちんが!!
「要素数10の整数型配列を2つ用意し、片方の整数値で初期化してください。 そして、奇数の値のみもう1つの配列に代入してください。」 という問題なのですが、下のコードを実行すると 配列1 = 10 15 22 45 9 66 71 4 37 82 配列2 = という様に配列2が表示されません。どこがダメなのか教えてください。 よろしくお願いします。 #include <stdio.h> int main(void) { int array1[10] = {10, 15, 22, 45, 9, 66, 71, 4, 37, 82}, array2[10]; int *p1, *p2; int i, j; p1 = array1; p2 = array2; for (i = 0, j = 0; i < 10; i++); { if (*(p1 + i) % 2 == 1) { *(p2 + j) = *(p1 + i); j++; } } printf("配列1 = "); for (i = 0; i < 10; i++) { printf("%d ", *(p1 + i)); } printf("\n配列2 = "); for (i = 0; i < j; i++) { printf("%d ", *(p2 + i)); } return 0; }
908 :
907 :2007/10/13(土) 23:33:27
申し訳ありません!自己解決いたしました。 forの()のあとにセミコロンを入れていました。 考えてくださっていた方ありがとうございました。
>>907 for (i = 0, j = 0; i < 10; i++); { <−このセミコロン';'が余計
if (*(p1 + i) % 2 == 1) {
*(p2 + j) = *(p1 + i);
j++;
}
>>907 処で、なんでarray1[i]と書かずにわざわざ無意味に*(p1 + i)なんて書いているの?
911 :
907 :2007/10/13(土) 23:35:34
>>909 様
ありがとうございます。
スレ汚し申し訳ありませんでした。
ポインタの勉強してんだろチクショーーーーーー!!!!!!!!!
913 :
907 :2007/10/13(土) 23:40:33
>>910 様
まだ初心者で入門書のポインタの章をやっていたところ
問題文に「ポインタを使って」と書かれていたのでそう書きました。
他にもよい方法があるのかもしれませんが、考えが及びませんでした。
914 :
デフォルトの名無しさん :2007/10/13(土) 23:43:46
%-6s の-6ってなんですか?
- は左詰め 6 は桁数
それならそれで、*p1にして++p1すればいいのに。
917 :
デフォルトの名無しさん :2007/10/13(土) 23:46:38
そういうのってどこに載ってるの?なんでお前ら知ってんの?
918 :
デフォルトの名無しさん :2007/10/13(土) 23:46:52
そんぐらいなら普通にman見りゃ載ってんだろ
920 :
907 :2007/10/14(日) 00:03:15
>>916 様
レスありがとうございます。
最初のfor文のことですよね?
とするとその次のループでまたp1とp2を0に戻すのが面倒だと思いiを使いました。
しかし、今思うとそちらのほうが効率がよいかもしれませんね。ありがとうございました。
まぁ、色々試行錯誤して味噌。
余談だが・・・ array[i]は*(p1 + i)のこと Cの配列がゼロオリジンでなければ*(p1 + i - 1) この-1を余計なものとCの設計者は考えたんだな
>>923 確かに間違ってるが恐ろしいほどの遅レスだなw
おいプロの方! 学生時代の勉強方を教えてください
とにかく何かたくさん、自分でプログラムを書く 習うより慣れ
まずスペルを覚える Lは三つじゃなくて二つだ
forで150回くらいループして処理したいときに forの中身に条件式が6個くらいあるとき、 違う関数に条件式書いたほうがいいかな? for文の中に関数を置くと処理に時間がかかると聞いたんですけど。
>>928 関数は機能として作成するべき
長いからひとつの関数にするというのはよくない
関数呼び出しはアセンブラのcall命令とレジスタのpush/popが入るから
実効命令は長くなる
だけど150回のループでは体感でその違いはわからないだろう
>>925 まるで東大入学の勉強法を聞くようだが
プロになるのは東大に入るのよりずっと簡単だぞ。
>>928-929 is〜〜()ぐらいなら機能として作っても良いと思うけどね。
ぶっちゃけ条件が6個あっても、マクロやら関数になっててもどっちでも良い。
とりあえず自分が見やすい方にしたら?
あとはまぁ、forの条件に書くんじゃなくて、ループのブロック内で判定してbreakするとか。
賢いコンパイラなら適当にインライン化してくれるだろうし、どっちでもいいと思うよ。
俺も初心者の頃は 「こんなに関数呼び出してオーバーヘッドはないのかな スタック?は大丈夫?(←当時は良く分かってない)」 と悩んだけど たいていの場合鼻くそ程も影響しないケースが多い
934 :
名無し :2007/10/14(日) 21:26:07
3の倍数かつ5の倍数の条件式って X=3&&X=5 でいいんですか??
>>932 そんな勝手なことするの?
inlineをしていしないとインラインにはならないのでは?
>>934 X=3がどうして3の倍数だよw
しかも代入しているし
!(x%3) && !(x%5)かな?
>>934 (x % 3 == 0) && (x % 5 == 0)
つうかまず算数をだな
939 :
名無し :2007/10/14(日) 21:32:05
>>935 C99からしかinlineキーワードは存在しないよ。
この前まで全然エラーでなかったのに main関数内の struct ftree *now5;だけで セグメンテーションエラーでる。 これはどういうものなの? 構造体はこんなもんなんだけど struct ftree{ double prob;//その状態での確率 double sprob;
>>941 now5 の指す領域を確保していないに一票
データファイルを入力として使い 検査データのファイルを使って処理をするようなプログラムがたくさん のってるC言語の本とかありませんかね? ソフトウェアテストの本とかいいって聞いたんだけど。
944 :
デフォルトの名無しさん :2007/10/15(月) 00:07:50
質問させてください。 for(;*ps !='\0';ps++,pd++) { *pd = *ps; /*1文字複写*/ } *pd = *ps; /*最後の'\0'を複写*/ 1行目のfor()内の最初の ;*ps ってどういう意味ですか? あと、3行目と5行目でやってることって一緒じゃないんですか?
*ps はポインタ ps の指している先を参照している やってることは一緒だが、ループの回数よりもう一回余分にコピーする必要があるからそうしている
946 :
デフォルトの名無しさん :2007/10/15(月) 00:13:14
>>945 *ps の前に ; をつけるのは何でですか?
for 文は 3 つの式をセミコロンで区切って書くんだが、知らなかったか? for (初期化; 条件; 更新) 初期化するものが何も無ければ、そこには何も書かない。
948 :
デフォルトの名無しさん :2007/10/15(月) 00:21:02
949 :
デフォルトの名無しさん :2007/10/15(月) 00:45:58
*(ps+i)と*ps+i ってどう違うんですか? 教科書読んでも分からなかったので..どなたか教えてください
*ps+i は (*ps)+i と解釈される 1×(2+3) と 1×2+3 みたいなもん
951 :
デフォルトの名無しさん :2007/10/15(月) 00:52:09
950 なるほど!ありがとうございました
ひどい教科書もあったもんだ
継承って一言で言うとどんな感じ? 未だに理解できん・・・
954 :
デフォルトの名無しさん :2007/10/15(月) 01:04:47
何度もすみません p_ptrってなんですか?
956 :
デフォルトの名無しさん :2007/10/15(月) 01:36:00
>955 そうなんですかΣ ありがとうございました
957 :
デフォルトの名無しさん :2007/10/15(月) 01:36:12
関数の最後の}の後の行に出たエラーで"予期せぬ EOF が検出されました。" と表示された時はどこを調べたらよいですか?
>>953 継承はC++から入るより、いったんJavaやったほうが理解しやすいと思う。
んで、一言でいうのはむずいなあ。。 個人的な意見な。
>>957 たぶんどこかで括弧とかコメントとかを閉じ忘れてる
960 :
デフォルトの名無しさん :2007/10/15(月) 01:53:47
一部抜粋です //探索 for(p = data ; *p !='0' ;p++) { if(*p == key[0]) { printf("文字%cは、%d番目にあった\n",key[0],p - data); } } //探索ってのは/*探索*/とは別なんですか? *p == key[0]の=ってなんで2つもいるんですか? 誰か教えてください
= は代入 == は比較 なぜってそう決まってるから //〜 はコメントで /*〜*/ と一緒
962 :
デフォルトの名無しさん :2007/10/15(月) 01:58:29
>>961 そうなんですか!!ありがとうございました
>>961 //〜 は1行コメントで /*〜*/ は複数行コメント(1行でもOK)
初級C言語の本とかには絶対書かれてるから読んだほうがいいよ
964 :
デフォルトの名無しさん :2007/10/15(月) 08:22:56
if((c >= 'a' )&&( c <= 'z')) &&ってどういう意味ですか?
>>964 本を買った方が早い
買いに行けないのなら初心者講座してるサイトでも探した方がいい
966 :
デフォルトの名無しさん :2007/10/15(月) 08:43:31
const int array[][4]={ {1,2,3,200}, {1,3,3,200}, {2,2,3,200}, }; ってどういう意味ですか?値の初期化はできてますか?
967 :
デフォルトの名無しさん :2007/10/15(月) 15:11:35
キーボードから整数 m と n (ただし m≤n) を入力し、 m 以上 n 以下の整数のうち 3 で割り切れるものの和を求めるプログラムを作成せよ。 という問題ですが、以下のプログラムだと、mが「3の倍数+2」、nが「3の倍数+1」のとき 正しい値が出力されません。どこがおかしいか教えてほしいです。 よろしくおねがいします。 #include <stdio.h> int main(void) {int m,n,X,total; printf("数値を入力してください"); scanf("%d",&m); printf("今入力した数値以上の数値を入力してください"); scanf("%d",&n); total = 0; X = 0; if(m%3 == 0) {total = total + m; {while(m<=n) m = m + 3;} printf("%d",total);} else if(m%3 == 1) {while(m<=n) {total = total + m; X = m + 2; m = m + 3;} printf("%d",total);} else {while(m<=n) {total = total + m; X = m + 1; m = m + 3;} printf("%d",total);}}
constは初期化したら後から代入できないことを指す。 []の中に何もかかれてなければ、その初期化のときに必要な 領域が自動的につくられる。よって初期化はできてる
969 :
ごめんこっち :2007/10/15(月) 15:26:52
#include <stdio.h> int main(void) {int m,n,X,total; printf("数値を入力してください"); scanf("%d",&m); printf("今入力した数値以上の数値を入力してください"); scanf("%d",&n); total = 0; X = 0; if(m%3 == 0) {total = total + m; {while(m<=n) m = m + 3;} printf("%d",total);} else if(m%3 == 2) {while(m<=n) {total = total + X; X = m + 1; m = m + 3;} printf("%d",total);} else {while(m<=n) {total = total + X; X = m + 2; m = m + 3;} printf("%d",total);} }
>>967 #include <stdio.h>
int main(void)
{
int m, n, total;
printf("数値を入力してください");
scanf("%d", &m);
printf("今入力した数値以上の数値を入力してください");
scanf("%d", &n);
total = 0;
m=(m+2)/3*3; // m を 3 の倍数にする ※ここ重要
// while(m%3!=0) m++; でも可
while(m <= n)
{
total = total + m;
m = m + 3;
}
printf("%d", total);
return 0;
}
971 :
デフォルトの名無しさん :2007/10/15(月) 15:31:05
>>970 m=(m+2)/3*3; // m を 3 の倍数にする ※ここ重要
ここで例えば4なら6、8なら9という操作をしてるんですね?
サンクスです。
よかったら
>>969 で変な値が出た理由を教えてほしいです。
>>971 下のように置換すれば分かると思うよ
total = total + X;
↓
total = total + X;
printf("debug total=%d\n", total);
973 :
デフォルトの名無しさん :2007/10/15(月) 15:39:19
>>972 うーむ、初心者なんで少し難しいっすね。
まぁ参考になりましたありがとうございます!
なるべく素朴に。 int main() { int i, m, n, total = 0; printf("数値を入力してください"); scanf("%d",&m); printf("今入力した数値以上の数値を入力してください"); scanf("%d",&n); for (i = m; i <= n; i++) { total += i % 3 == 0 ? i : 0; // m 以上 n 以下の整数のうち 3 で割り切れるものの和 } printf("%d",total); return 0; }
int func1_c(const int n, const int m) { int begin = n/3, end = m/3; return 3 * (end + begin) * (end - begin + 1) /2; } これでも、あってますか?
>>971 >if(m%3 == 0)
> {total = total + m;
> {while(m<=n)
> m = m + 3;}
> printf("%d",total);}
↑ここは入力ミス(ブロックのくくりミス)だと思うからとりあえず置いといて
>else if(m%3 == 2)
> {while(m<=n)
> {total = total + X;
> X = m + 1;
> m = m + 3;}
> printf("%d",total);}
ちゃんと脳内トレースすれば分かると思うけど、
ループ条件のチェックが"足す前"に行われている。
Xにm+1が代入されて、それが足される前にm+=3して条件チェックしちゃってるから、
m+1 <= n < m+3
になってると、while条件でXが足される前にループ抜けちゃう。
さらにいえば、ここでの条件チェックはm+1<=nとかX<=nとかすべき
(mがn以下であるからといってm+1がn以下とは限らない)
一例としては、
else if(m%3 == 2){
while(m+1 <= n){
total += m + 1;
m += 3;
}
printf("%d",total);
}
まあ、for使った方が分かりやすいかもね。
978 :
976 :2007/10/15(月) 16:07:04
すまん、
>>976 の「ループ条件のチェックが〜」のくだりは忘れてくれ
そこは関係なかった
>>975 int func1_c(const int n, const int m) {
int begin = (n+2)/3, end = m/3;
return 3 * (end + begin) * (end - begin + 1) /2;
}
なるほど切り上げの除算じゃないと駄目だったんですね、ども
981 :
デフォルトの名無しさん :2007/10/15(月) 17:05:04
プログラムの「前」ってどっちですか? int main(int argc, char *argv[]) { int k = 0; ← こっちが前? for (int i = 0; i < 10; i++) { k += i; } printf("こたえ=%d", k); ← こっちが前? }
マルチすんなハゲ
983 :
デフォルトの名無しさん :2007/10/15(月) 18:06:42
今マージソートマクロを自分で作ってみようと頑張っているんですが、 とりあえずマージする部分のマクロはできました。 分割マクロの再帰→マージマクロ再帰でできるかなあと考えています。 でも与えられた配列を分割を繰り返して 要素数1にするという行程のプログラムをどうしても考え付きません。 どなたか教えて下さい。。マージマクロはこのままで使える方向で作りたいです。 void merge(int data1[], int n1, int data2[], int n2, int data3[]){ int index1, index2, index3, i; index1 = index2 = index3 = 0; printf("merge_sort\n"); while(index1 < n1 || index2 < n2){ if(index1 < n1 && index2 < n2){ (data1[index1] >= data2[index2])?(data3[index3++] = data1[index1++],) :(data3[index3++]=data2[index2++]); for (i=0; i<(2*N) ;i++) printf("%d,", data3[i]); printf("\n"); } else if(index1 < n1){ for (;index1 < n1 ;index1++) data3[index3++] = data1[index1]; } else {for( ; index2 < n2 ; index2++) {data3[index3++] = data2[index2];}} } }
どうみてもマクロじゃねえだろ
>>983 で、自分で作ってみようと頑張っているのか?
×マクロ ○関数 郷に入りては郷に従え
987 :
デフォルトの名無しさん :2007/10/15(月) 19:58:51
おそらく VBA プログラマあがりだろ。彼らはプログラムのことをマクロと呼ぶ。 決してC言語の #define の事を言っているのでは無い。 それくらい文脈でわかりそうなもんだが、答えられないような難しい質問がくると 質問の本質とは関係ない部分で叩く煽る罵倒するのが、Cヲタの特徴。
>>987 >それくらい文脈でわかりそうなもんだが
その甘さが数々の用語の誤用を招き
破壊と混乱をもたらしたのだ
何より先駆者に対する敬意が感じられない
そうだそうだー!
990 :
デフォルトの名無しさん :2007/10/15(月) 20:17:20
るせぇ!低級言語使用者どもめがっ!
991?
992 :
デフォルトの名無しさん :2007/10/15(月) 20:49:51
学校の課題です。キーボードから数値を入力して「正」「負」「0」を表示する。ピリオド「.」が入力されたら終了。 //全体の流れ //無限ループ //数値の入力、失敗したらピリオドであるかを判定。 //ピリオドなら終了if(getchar)=='.')break; //ピリオドでなかったら入力間違いのメッセージを出して再入力。fflush(stdin); //if文で正負0を判定して表示 //以上を繰り返す。 main() { int a; printf("数値aを入力してください"); while(scanf("%d",&a)!='.'){ ????????????????????? if(getchar()=='.'){ break; } ????????????????????? if(a>0){ printf("PLUS\n"); }else if(a<0){ printf("MINUS\n"); }else if(a==0){ printf("ZERO\n"); } } } 2箇所、分かりません。よろしくお願いします。
995 :
デフォルトの名無しさん :2007/10/15(月) 21:09:04
ファイルから数値を読み取るとき、 その数値をに二次元配列にいれるとして そこの二次元配列の最初の領域確保はどうするべきですか? できるだけ領域を使わないとすると。
あるデータファイルを入力として使い 検査データのファイルを使って処理をするようなプログラムがたくさん のってるC言語の本とかありませんかね? ソフトウェアテストの本とかいいって聞いたんだけど。 ファイルを実際に読み込み書き込みを使ってるプログラムを 書いてる本って少ないんだよなー
998 :
デフォルトの名無しさん :2007/10/15(月) 21:54:40
C言語で、新しく、iccを入れて走らせたんですけど fopenで、セグメンテーションフォルトが起きて困ってます。 古いバージョンのiccが入ってるマシンでは問題なく走ります。 考えられる原因は何なんでしょうか?
ポインタの取り扱いミス
1000ならAO入試受かる
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。