C言語なら俺に聞け(入門篇) Part 27
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/04/29(火) 09:44:57・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 26
http://pc11.2ch.net/test/read.cgi/tech/1206196600/
過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 105代目
http://pc11.2ch.net/test/read.cgi/tech/1208268461/
0002デフォルトの名無しさん
2008/04/29(火) 09:45:21Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/
Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/
Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/
0003デフォルトの名無しさん
2008/04/29(火) 09:45:57Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/
Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/
Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/
Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/
Part 19 ttp://pc11.2ch.net/test/read.cgi/tech/1190342593/
Part 20 ttp://pc11.2ch.net/test/read.cgi/tech/1192455273/
Part 21 ttp://pc11.2ch.net/test/read.cgi/tech/1194384258/
Part 22 ttp://pc11.2ch.net/test/read.cgi/tech/1196489491/
Part 23 ttp://pc11.2ch.net/test/read.cgi/tech/1198295362/
Part 24 ttp://pc11.2ch.net/test/read.cgi/tech/1201083176/
Part 25 ttp://pc11.2ch.net/test/read.cgi/tech/1203343907/
Part 26 ttp://pc11.2ch.net/test/read.cgi/tech/1206196600/
0004デフォルトの名無しさん
2008/04/29(火) 09:47:290005デフォルトの名無しさん
2008/04/29(火) 09:48:550006デフォルトの名無しさん
2008/04/29(火) 09:52:460007デフォルトの名無しさん
2008/04/29(火) 10:01:280008デフォルトの名無しさん
2008/04/29(火) 12:01:10main()
{
char *(*pp)[3];
printf("%lu", sizeof(char*));
printf(" pp%lu", pp);
printf(", ++pp%lu", ++pp);
}
というプログラムを実行すると
"4 ,アドレス ,アドレス+12"と、表示されました。
ppは要素が三つの配列へのポインタのポインタだから、
ppがインクリメントされればアドレス+4になると思うのです。
どうして成らないのでしょうか?
0009デフォルトの名無しさん
2008/04/29(火) 12:02:330010デフォルトの名無しさん
2008/04/29(火) 12:05:11スレ違い。
0011デフォルトの名無しさん
2008/04/29(火) 12:14:290012デフォルトの名無しさん
2008/04/29(火) 12:16:08C言語で
1分待機してから次の分を実行
みたいな関数というのは存在するのでしょうかー?
また存在しない場合そのような動作をさせるには
どうすればいいんでしょうか・・・?;
0013デフォルトの名無しさん
2008/04/29(火) 12:18:350014デフォルトの名無しさん
2008/04/29(火) 12:45:26Sleep(60000);
0015デフォルトの名無しさん
2008/04/29(火) 12:49:43ありがとうございますっ
試してみます!
0016デフォルトの名無しさん
2008/04/29(火) 14:27:37を教えて下さい。Javaは自由に書けるので、
構文の基本は大丈夫かと思います。
勉強する際に便利な環境などもあわせて教えて
いただけると嬉しいです。
0017デフォルトの名無しさん
2008/04/29(火) 14:54:21まずはJavaを勉強するように
0018デフォルトの名無しさん
2008/04/29(火) 15:56:15使った事ないけど
0019デフォルトの名無しさん
2008/04/29(火) 16:27:170020デフォルトの名無しさん
2008/04/29(火) 17:27:15それ以上困ることはほとんど無いと思うよ。
0021デフォルトの名無しさん
2008/04/29(火) 18:58:37002216
2008/04/29(火) 21:09:42自分のスペックですが、Javaでの開発経験がそこそこあり、
Javaに関しては仕様が与えられれば実装方式など自分で
考えて行えるレベルです。
最近、もう少し低レベルというか、アセンブリに近い部分に
ついて勉強したいと思い、それなら高級アセンブリと言われる
C言語だと思って質問をいたしました。
Cについては、ずっと昔に「独習C」とか、その他小さな本を読んだ
経験があるぐらいです。実務などでの経験はゼロ。「独習C」も
最近見たら全く読んだ覚えが無いぐらい忘れてましたw
基本的に今後実務で使用する予定も無いのですが、制御系や
OSカーネルの世界をちょっと知りたいのと、言語としてどういう
ものなのか、きちっとした仕様のようなものを知りたいと思ってます。
なので、よくある入門書というよりは、C言語っていうのはこういう
言語なんですよ、こういう原理原則なんですよ、という本などを
教えていただけると嬉しいです。
>>21
おお!これ、面白いですね。早速読んでみます。ありがとうございます。
0023デフォルトの名無しさん
2008/04/29(火) 21:52:00こうしてjava使いは馬鹿にされるのか・・・
0024デフォルトの名無しさん
2008/04/29(火) 21:53:11ほんとにそんなスキルあるってんなら
規格書でも読んでればいいんじゃねーの
002516
2008/04/29(火) 22:51:35購入して勉強してみようと思います。
スレ住人の方々から見て、この本はいかがでしょうか?
0026デフォルトの名無しさん
2008/04/29(火) 22:55:08Javaの経験があるなら入門書読んでも意味ないだろうし
0027デフォルトの名無しさん
2008/04/29(火) 23:12:47ppは初期化されていない。つまりどこを指しているかわからない。
どこを指しているかわからないポインタへの演算は未定義となる。
上のことをさておいても、ppがなんであるかを本当に理解しているか。
ppはcharへのポインタの要素数3の配列へのポインタであり、
これをインクリメントした値は元の値よりcharへのポインタの要素数3の配列ぶん後をさす。
charへのポインタの要素数3の配列の大きさはもちろんcharへのポインタ三つぶんであるから、
charへのポインタの大きさが4であれば当然結果は12となる。
0028デフォルトの名無しさん
2008/04/29(火) 23:20:07エキスパートCプログラミングもよかったよ。
ネットの「C FAQ」も一通り目を通すといい。(一部内容が古いけど)
0029デフォルトの名無しさん
2008/04/30(水) 00:34:190030デフォルトの名無しさん
2008/04/30(水) 08:08:58時間に余裕があるなら、まずアセンブラでプログラム書くことを勧める。
極々簡単なヤツでいい。
JavaのアナロジーでCを理解すると失敗しやすい。
0031デフォルトの名無しさん
2008/04/30(水) 10:06:09アセンブラの1段上みたいなポジションだよな。
0032デフォルトの名無しさん
2008/04/30(水) 10:27:22GlobalLockのメモリを動かないように固定するの『動かない』と
『固定する』ってどういう意味?
0033デフォルトの名無しさん
2008/04/30(水) 10:29:07Cに関係ないのでスレ違い。
まぁ、それぞれ「メモリアドレス」が主語になっていると思えばいいよ。
0034デフォルトの名無しさん
2008/04/30(水) 11:01:48『これならわかる C 入門の入門』を買ったんだが、ボーランドの無償Cコンパイラがなくなってて、別のフリーコンパイラを代用しようとしたんだが、本の通りに進めれなくてオワタ
0035962
2008/04/30(水) 11:02:11fflushなんて初めて聞きました調べてみたらfsyncってのもあるんですね。
それらを使用しても確実ではないようですがだいぶ安定するかと思います。
たすかりましたm(_ _)m
0036デフォルトの名無しさん
2008/04/30(水) 11:17:19APIのスレで聞くべし。
メモリーって実は地動説だったりするんだよ。
003732
2008/04/30(水) 11:25:130038デフォルトの名無しさん
2008/04/30(水) 13:29:56独習C
0039デフォルトの名無しさん
2008/04/30(水) 15:38:300040デフォルトの名無しさん
2008/04/30(水) 15:42:580041デフォルトの名無しさん
2008/04/30(水) 15:48:39英語じゃないし。
0042デフォルトの名無しさん
2008/04/30(水) 15:53:120043デフォルトの名無しさん
2008/04/30(水) 15:55:14また、ピリオドは文中でも小数点記号として使われることがあります。
この辺りを鑑みてセミコロンを文末記号として使うことにしたのでしょう。
もしかしたら、そういうスタイルの言語が既にあったのかも知れません。
0044デフォルトの名無しさん
2008/04/30(水) 15:57:030045デフォルトの名無しさん
2008/04/30(水) 16:03:28ある名目に対しての説明、要するに = のような役割をしているよ。
0046デフォルトの名無しさん
2008/04/30(水) 16:26:23文の区切り記号としては、ピリオド>セミコロン>カンマの順で弱くなる。
0047デフォルトの名無しさん
2008/04/30(水) 16:28:45ttp://dictionary.goo.ne.jp/search.php?MT=%A5%B3%A5%ED%A5%F3&kind=jn&mode=0&base=1&row=1
もちっと英文を読もうぜ?インターネットを使っていて、国境なき情報収集手段で
ジャポネーゼ文字だけ見ていても仕方なかろう?
0048デフォルトの名無しさん
2008/04/30(水) 16:31:13えーと、どなたかコロンの強弱に言及なさってましたか?
0049デフォルトの名無しさん
2008/04/30(水) 16:36:04中々とっつき難いです、最初はこんなものなんでしょうか?
ちなみに本を読んで独学で勉強してます
0050デフォルトの名無しさん
2008/04/30(水) 16:37:15その理由ってお前の思い込みだろ?理由なんてどうでも良いんだよ
ソースコードを記述するのに使われている区切り、ただそれだけ。
っつか、ソースで . や , を区切りとして使っている例を持ち出してみよう。
引数の区切りに , (コンマ)が使われておりますがっ、良いですか?
. (ドット)を使った、オブジェクト指向のコードにメソッドやクラス、構造体の要素を
結合する場合にも使われています。そうなると、ピリオドが終わりを意味するのではなく
結合に使われているという、文章の区切りでの説明が矛盾します。
ゆえに、これ以上個人的な思い込みではなく、規格書があるならそれを用いるなり
法律で言う基本原則の憲法を用いるような形で説明を求めます。
なんで、基本ルールを無視して、あいつ気にくわねぇ、基本的人権を無視して
俺ルールで批判してやれとかって話になるのでしょうか?理解不能
0051デフォルトの名無しさん
2008/04/30(水) 16:39:08>>44
文の区切り記号としては、ピリオド>セミコロン>カンマの順で弱くなる。
↑お前じゃん。っつか、>>43は英語を持ち出しただろ?
区切りにコロンも存在するが、セミコロンはそれに対して「セミ」といった
セミロング、セミダブル、セミヌードなど「半ば」や「半」といった意味が付いた言葉ですが?
ttp://dictionary.goo.ne.jp/search.php?MT=%A5%BB%A5%DF&kind=jn&mode=0&base=1&row=0
0052デフォルトの名無しさん
2008/04/30(水) 16:41:13もし規格で\を区切り文字にする言語を作ればそういう規格になるだけ。
理由なんてない。考えるな。感じろ。
0053デフォルトの名無しさん
2008/04/30(水) 16:46:54以上。区切りとは限らない、ましてや続きとして and の役割とも。
しかし、ソースコードでは流れとしては確かに上から順に
続く意味があるが、1行の分の終わりに使われる。
一方、コンマやピリオドは接続的な役割をしている。(引数、メソッド、メンバーなど)
区切りの強弱で説明をつけるのは、ナンセンス。所詮、人間が勝手に決めたもの。
005443=46
2008/04/30(水) 17:22:51>46は>44に対してなので、英文での話です。
それはさておき、「半分(半ば)」の「コロン」ってのは微妙ですね。
まぁ、M-Wにはこう書いてあるわけですが。
--
semicolon
a punctuation mark ; used chiefly in a coordinating function between major sentence elements (as independent clauses of a compound sentence)
colon
a punctuation mark : used chiefly to direct attention to matter (as a list, explanation, quotation, or amplification) that follows
comma
a punctuation mark , used especially as a mark of separation within the sentence
period
a point . used to mark the end (as of a declarative sentence or an abbreviation)
--
一応拙いながら訳しておきますとこうなります。
==
セミコロン: 句読点「;」は主として主要な文章要素の調整機能に使用される。
コロン: 句読点「:」は主として後続の重要項目に対する注意として使用される。
カンマ: 句読点「,」は特に文中で分離記号として使用される。
ピリオド: 点「.」は終わりを示すために使用される。
==
コロンはどちらかと言うとマーカーということですから、セミコロンとは役割が違うということですね。
>>50
>43は英文でのセミコロンの使われ方から推測しているわけです。
また、ピリオドに関しても「文の終端」という機能以外にも「小数点記号」などとして使われるからこそ、
Cでは終端記号として採用されなかったのだろうという推測です。
まぁ、「理由なんてどうでもいい」という話だけなら納得できますが。
後半は私には関係ないと思いますが、どなたか「批判してやれ」って話をなさってます?
私がアホ呼ばわりされているだけの気がするのですが。
0055デフォルトの名無しさん
2008/04/30(水) 17:33:29お前さぁ、周りから変な目で見られてない?英数文字がコードでは
原則的に使われているが、あれは機械が演算するのを
人間がわかるコードで記述したものであって、英文法じゃないからw
どこで1文が区切られているか?の規定ごとに、英語の強弱が
関与してますよと説明して、それが根本から覆された説明文を見て
まだつまらない食い下がりをするの?すまんが、あんた何者だ?
標準化を決めている組織の関係者か?ただの一講師か?
初心者の生徒か?ナンバーサイン野郎にしろ、気持ち悪い思い込みが激しい香具師が目立つな
0056デフォルトの名無しさん
2008/04/30(水) 17:36:41数学ではその記号はジャポネーゼでは大なり、小なり、英語では
greater than , less than という意味だが?言語や使われ方によって
本来の意味なんてナンセンスだろ?もともと演算子の優劣でさえ
人間が勝手に決めたものだよ。
0057デフォルトの名無しさん
2008/04/30(水) 17:50:570058デフォルトの名無しさん
2008/04/30(水) 17:56:170059デフォルトの名無しさん
2008/04/30(水) 18:03:28左にある変数に対して 代入 となる。
しかし、人間が数学で使っている 3+4=7 は 3+4 は 7 という結果
あるいは7と等価という意味であり、全く意味が異なってくる。
比較演算子に == と決めたが、これは 成り立つかどうか? という評価であって
結局人間がコンピュータに解釈させるために決めたことであって
コンピュータが人間の言語として理解しているわけではない。
そこで、英文法での優劣を持ち出されて説明されても、へっ?意味が分からないんすけど?
ってなるわな。
0060デフォルトの名無しさん
2008/04/30(水) 18:06:53次の質問をどうぞ↓
0061デフォルトの名無しさん
2008/04/30(水) 18:14:450062デフォルトの名無しさん
2008/04/30(水) 19:32:03しかも中身のなさそうな長文ばかりで読む気がしません!
0063デフォルトの名無しさん
2008/04/30(水) 19:39:49ようキチガイ
0064デフォルトの名無しさん
2008/04/30(水) 21:25:34自分が気に食わない奴をネチネチ煽るその性格。人間性のレベルが低すぎ。
あと、プログラミングに関してもお前は頭が悪いから向いてないよ。
0065デフォルトの名無しさん
2008/04/30(水) 21:33:590066デフォルトの名無しさん
2008/04/30(水) 21:36:01長文になると中身が分からなくなるなんて、
受験じゃ国語と英語は失敗するぞ、お前。
数学も題意が分からずに間違った解答をするでしょうな。
0067デフォルトの名無しさん
2008/04/30(水) 21:37:59お説ごもっともですが、すべてのファイルに EOF があると思っているとか、
#define で複数行にわたるときの書き方をしらないあなたに何を言われてもねぇ。
0068デフォルトの名無しさん
2008/04/30(水) 21:39:430069デフォルトの名無しさん
2008/04/30(水) 21:39:590070デフォルトの名無しさん
2008/04/30(水) 21:43:330071デフォルトの名無しさん
2008/04/30(水) 21:51:23この世に10種類の人間がいるから。
0072デフォルトの名無しさん
2008/04/30(水) 21:55:52基地外登場、以後放置よろ
0073デフォルトの名無しさん
2008/04/30(水) 22:15:44int *a;
a[0] = 10; a[1] = 20; ...
のような事を始めてみたりしてます。これはあまり必要性が見えません。必要ないのに pointer を使うとろくなことは無いわけです。
以下が良い例と言うわけではないが気分は伝わるといい。
const int mdayA[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
const int mdayB[] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
int* mday;
if(うるう年なら)
mday = mdayB;;
else
mday = mdayA;
以下 mday[] でうるう年の時もそうでないときも同じソースで記述てきる。
これを
const int mday[2][13]
= {{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
mp = 0;
if(うるう年なら)
mp = 1;
mday[mp][] となるよね。
pointer を使うと何かすっきりしそう。気分の問題です。
0074デフォルトの名無しさん
2008/04/30(水) 22:16:230075デフォルトの名無しさん
2008/04/30(水) 22:19:38>a[0] = 10; a[1] = 20;
なんにもわかってないw
0076デフォルトの名無しさん
2008/04/30(水) 22:29:25誰がだYOw
0077デフォルトの名無しさん
2008/04/30(水) 22:31:37前者は致命的に間違ってる
後者はむしろ構造体の出番だw
0078デフォルトの名無しさん
2008/04/30(水) 23:38:17こんなコードを書いて質問する人がC始めた人に多いというがいいたいのだヨん。
この前のスレみてて何度か目にしたよ。
とにかくチミ達は始めに3行みて反応してるね?(2chはそんなもんか・・w)
0079デフォルトの名無しさん
2008/04/30(水) 23:41:47今日、「Hello World」まで出来ましたが。。
参考書を読みつつ覚えるのも飽きてきましたorz
そこで、簡単な問題を出して頂けませんか?
よろしくお願いします
0080デフォルトの名無しさん
2008/04/30(水) 23:44:29fizzbuzzとか?
0081デフォルトの名無しさん
2008/04/30(水) 23:44:49テキストファイルを開き、その文字列の中から
abcと言う文字が何個含まれているか、カウントして
なおかつ該当箇所が何行目にあったかを表示せよ。
0082デフォルトの名無しさん
2008/04/30(水) 23:47:220083デフォルトの名無しさん
2008/04/30(水) 23:55:01では史上最初に出現したアルゴリズムを追体験してみましょうか。
「a = 1190, b = 1394 とおき、a, b の最大公約数を求めよ。」
0084デフォルトの名無しさん
2008/04/30(水) 23:57:070086デフォルトの名無しさん
2008/04/30(水) 23:59:53朝だったら、おはよう。昼だったらこんにちは、夜だったら今晩は、夜中だったっら、おやすみなさい明日はオハヨウって表示するように改造するんだ。
0087デフォルトの名無しさん
2008/05/01(木) 00:11:06むっちゃ時間かかるで?w
0088デフォルトの名無しさん
2008/05/01(木) 00:13:47とりあえず deque の実装からはじめないとな
0089デフォルトの名無しさん
2008/05/01(木) 00:14:290090デフォルトの名無しさん
2008/05/01(木) 00:16:17まずは単方向リストだろ
0091デフォルトの名無しさん
2008/05/01(木) 00:23:30つーか効率的に実装したスタック?
0092デフォルトの名無しさん
2008/05/01(木) 00:24:220093デフォルトの名無しさん
2008/05/01(木) 00:30:38サイズ足りなすぎw
0094デフォルトの名無しさん
2008/05/01(木) 00:35:270095デフォルトの名無しさん
2008/05/01(木) 00:57:12そう、でも宿題スレではその実力のほどが露呈されてしまったので、さすがに出てこなくなったようです。
出したり引っ込めたり、くだらないソースなのに一人芝居をうじうじしていているのをみて、期限きって答えを書いてやりました。
無論、宿題スレでバンバン答えを出していただけるのであれば、歓迎します。
0096デフォルトの名無しさん
2008/05/01(木) 00:58:24お前がまともに答える能力がなく、コピペに反応して必死になっていた
基地外ですって自己紹介乙w
0097デフォルトの名無しさん
2008/05/01(木) 00:59:18> 期限きって答えを書いてやりました。
もろにあのときに、ソースを書くわけでもなく噛み付いていただけの
無能ですって露呈しているのがお前なのがワロスw
009879
2008/05/01(木) 01:00:33#include <stdio.h>
main()
{
int a=1190,b=1394,c=-1;
while(c !=0){
c=b%a;
b=a;
a=c;
}
printf("最大公約数=%d",b);
}
>>81さん、>>87さんのはハードル高そうなので
次は>>86さんのをやって見ます
板汚しスイマセン
0099デフォルトの名無しさん
2008/05/01(木) 01:05:50http://pc11.2ch.net/test/read.cgi/tech/1208268461/103
http://pc11.2ch.net/test/read.cgi/tech/1208268461/139
http://pc11.2ch.net/test/read.cgi/tech/1208268461/141
http://pc11.2ch.net/test/read.cgi/tech/1208268461/249
http://pc11.2ch.net/test/read.cgi/tech/1208268461/404
http://pc11.2ch.net/test/read.cgi/tech/1208268461/407
分かるだろ?大学で実験もしたこともない低レベル共。
お前ら笑われるぞ、コードだけでプログラミングできたとか言ってるとw
0100デフォルトの名無しさん
2008/05/01(木) 01:09:50お前が糞だから無能を露呈しないためにも、簡単な答えの分かりきった
宿題しか答えられい、実力なきクズだとばれているから。
その言動にお前のレベルの低さが露呈されてますよw
0101デフォルトの名無しさん
2008/05/01(木) 01:24:09お前みたいな奴は、一生まともにはなれんよ。思い上がりの前に
気に入らなきゃ誰それ構わず、自分が間違っていようが多勢に無勢で
攻撃をするから失敗するんだよ。まぁ、もちっと人間社会の人間慣れをするんだな。
所詮誰でも自分なんて数多くいる人間の中の一人。
どんな偉人でも完璧な人はいない。ましてや、こんなスレで初心者相手に
自分は相手が知らないことを知っているということで、安心しているようじゃ
先が知れてる。自分が知らない、体験したことがないことなんていくらでもあるが
こんなの基本は分かりきっていることだろ。その基本事項を用いた説明に対して
自分の体験談や思い込みで反論するから、簡単に跳ね返されるんだよ。
お前じゃ、炭素とダイヤが同じ成分で構成されていることすら知らんだろうよ。そんなもん。
0102デフォルトの名無しさん
2008/05/01(木) 01:50:00結構前にこのスレだかで見た気がするが「projectEuler」とやらをやればいいじゃない
C言語というよりアルゴリズム、数学の問題だが
0103デフォルトの名無しさん
2008/05/01(木) 01:50:01>攻撃をするから失敗するんだよ。まぁ、もちっと人間社会の人間慣れをするんだな。
自分のことだろw
0104デフォルトの名無しさん
2008/05/01(木) 02:02:32放置しろ
0105デフォルトの名無しさん
2008/05/01(木) 03:41:09基地外馬鹿が、その程度の反論しかできないのか、お前性格が腐ってんぞ。
自分のしたレスを読み返せ、こぴぺに反応した馬鹿w
0106デフォルトの名無しさん
2008/05/01(木) 05:14:50> 期限きって答えを書いてやりました。
期限が延長していたわけだが、どこに噛み付いてだこの基地外?
0107デフォルトの名無しさん
2008/05/01(木) 09:44:33別の場所でやれ
0108デフォルトの名無しさん
2008/05/01(木) 10:37:34すみません。
0109デフォルトの名無しさん
2008/05/01(木) 10:38:16申し訳ありませんでした
0110デフォルトの名無しさん
2008/05/01(木) 10:40:21ごめんなさい。
0111デフォルトの名無しさん
2008/05/01(木) 13:01:290112デフォルトの名無しさん
2008/05/01(木) 13:10:570113デフォルトの名無しさん
2008/05/01(木) 13:45:52普通は共用体の配列(場合によっては、データを保存するための共用体と型を記憶するためのフラグ変数をセットにした構造体の配列)を使う
型のサイズが極端に不ぞろいでメモリを節約したい場合にはvoid *の配列を作って各配列要素に適切な領域を割り当てる
0114デフォルトの名無しさん
2008/05/01(木) 13:53:210115デフォルトの名無しさん
2008/05/01(木) 13:57:03IDでない板は自演が楽でいいな。
0116デフォルトの名無しさん
2008/05/01(木) 14:17:460117デフォルトの名無しさん
2008/05/01(木) 15:44:09初歩的なことですいません。
親関数から子関数にとんだときに子関数がreturnしたら親関数も一緒にreturnすることってできますか?
例えば、、、
void func(void)
{
sub();
いろいろな処理;
return;
}
void sub(void)
{
return;
}
となったときに
『いろいろな処理』を行わないでfunc関数を終了したいのです。
適当に作った関数なのでそこの突っ込みはなしてお願いします。
subに値を返させてfunc関数内でsubを呼び出した後にif文で処理するのが
オーソドックスなのかと思いますが、
func内でif文を追加できない状況です。
exitも全て終了してしますのでダメです。
よろしくお願いします。
0118デフォルトの名無しさん
2008/05/01(木) 15:46:580119デフォルトの名無しさん
2008/05/01(木) 15:47:39っていうか、その例だといろいろな処理は常に実行されないってこと?
0120デフォルトの名無しさん
2008/05/01(木) 15:48:24{
sub();
いろいろな処理;
return;
}
↓
void func(void)
{
sub();
/*いろいろな処理;*/
return;
}
0121デフォルトの名無しさん
2008/05/01(木) 15:49:27sub をコールバック関数として渡すんじゃないかと思われ。
0122デフォルトの名無しさん
2008/05/01(木) 15:52:02あるいはコードを直接書き換えるか
0123デフォルトの名無しさん
2008/05/01(木) 15:59:59を作って、func を使う部分を
if (! setjmp(env)) func();
とし、sub 内で return する代わりに
longjmp(env, 1);
とする。
これで一応目的の動作にはなる。
それでいいのかどうかは知らんが。
0124デフォルトの名無しさん
2008/05/01(木) 17:20:340125デフォルトの名無しさん
2008/05/01(木) 17:38:07あるいは、sub()の後の"いろいろな処理"を別メソッドにして、func()呼び出している側がそれを呼び分ける
0126デフォルトの名無しさん
2008/05/01(木) 17:42:41おk
試してみる
void*の配列のほうが汎用性が高そうだけど型キャストがめんどくさそうだ
0127デフォルトの名無しさん
2008/05/01(木) 19:30:02回答ありがとうございます。
正直言いますと自分の設計ミスなんですが、上の例で言いますと、
func関数内でsubに引数与えて(例では引数ありませんが)何回も呼び出してるんですよ。
で、subはエラーを返すんですが、funcに返ってきた時点でエラーならさらに上の関数に戻りたい。
しかし、subを呼び出す度にif文処理をするのが妥当なんですが、時間もかかるので、
もし何か良いやり方があったら教わろうとしたわけです。
jmp関数はgoto文と似ていますね。
goto文は使わない方が良いと言われていますがやはりjmpもできる限り使わない方が良いんですか?
0128デフォルトの名無しさん
2008/05/01(木) 19:40:57そんなことを気にしなきゃならないような状況なら
悪いことはいわないから設計からやりなおせ
0129デフォルトの名無しさん
2008/05/01(木) 19:42:38longjmpにかかるコストのほうがでかいなんてことにならないようにな
0130デフォルトの名無しさん
2008/05/01(木) 19:53:060131デフォルトの名無しさん
2008/05/01(木) 21:07:17C限定じゃなければsub()で例外スローして終了なんだけど
涙目でsubの呼び出し箇所をひとつづつ修正していくんだ
0132デフォルトの名無しさん
2008/05/01(木) 21:58:000133デフォルトの名無しさん
2008/05/01(木) 22:03:20OK です。記述方法はいろいろありますが、いずれまた、この問題にもどることになると思います。
>>114
>>67=>>83=>>95=>>108
0134デフォルトの名無しさん
2008/05/01(木) 22:16:15誰がいつすべてのファイルにEOFがあると言ったん?
お前の勘違いの方がアホだろ・・・あのね、思い込みで
話をこじらせるな。EOFの入力について。
もうね、お前みたいな 入力 の基本も知らない奴にバカ呼ばわりされたくねーから
最終的には、やはり学んだ場所、学歴が重要だってわかったわ。
いくら優秀なドライバーでも事故が起きれば終わりだしな。そんなもんだぞ、人生は。
0135デフォルトの名無しさん
2008/05/01(木) 22:17:30対処されていなかったという、穴があったという話で、良くここまでしつこく粘着が出来るな。
マジきめぇよ、お前。性格狂ってんな。絶対に社会に出てくるなよ。お前みたいな奴は
何をしでかすか分からないからw
0136デフォルトの名無しさん
2008/05/01(木) 22:19:24話
も
終
い
0137デフォルトの名無しさん
2008/05/01(木) 22:19:41> #define で複数行にわたるときの書き方をしらないあなたに何を言われてもねぇ。
言った覚えねーわ・・・なんだこいつ?妄想癖があるのか?マジきめぇ、あぁきめぇ
どんな面してんだろ?鏡見てこいよ、それ、お前の面だから m9(^д^)
0138デフォルトの名無しさん
2008/05/01(木) 22:21:51> その実力のほどが露呈されてしまったので、さすがに出てこなくなったようです。
お前の実力がしょぼいから、そうやって個人叩きしか出来ないか
資料を調べて必死に抵抗することしか出来ないんだろ?w
なんだよ、EOFがあるないを無理やり論点に持ち込む奴って?w
まるで、自分が違反をしても、他にも違反している奴がいるとか
あっ、俺に対して違反だといったお前、今違反しましたね?みたいな
ガキが小学生レベルの知能だな、こいつw
0139デフォルトの名無しさん
2008/05/01(木) 22:23:150140デフォルトの名無しさん
2008/05/01(木) 22:31:21文字列の配列を直接引数として関数にわたしたいんですが、
引数の型定義はどのようにすればいいのでしょうか?
具体的には、
void function(??? data){
...
}
int main(void){
char mojimoji[10][80];
function(mojimoji);
}
といった感じで、???のところがわかりません。
"char *"、"char **"では駄目でした。
よろしくお願いします。
0141デフォルトの名無しさん
2008/05/01(木) 22:35:31それを使うのかと?なぁ、時代遅れのオッサンがここでのさばってんの?
インターネットを最近知ったとかで?今更古い手法に合わせてプログラミングをするの?
ねぇ?教えて、EOFがなかった時代を知っているプロさん?
っつか、ろくにコードを書かない奴ほど、ぎゃーぎゃーわめくよな、自治厨みたく。
実力云々以前に、他人の粗探しをして楽しいのか、こいつ?
0142デフォルトの名無しさん
2008/05/01(木) 22:35:460143デフォルトの名無しさん
2008/05/01(木) 22:37:40}
int main(void){
char mojimoji[10][80];
function((char *)mojimoji);
}
か
mainは変えずに
void function(char (*data)[80])
void function(char data[][80])
0144デフォルトの名無しさん
2008/05/01(木) 22:41:320145デフォルトの名無しさん
2008/05/01(木) 22:49:02ナンバーサインはEOFの入力が出来ないとかほざいてただろ。
印字可能な文字ではないにしろ、代用の入力文字はあるというのに。
お互い様とは言わないが、粗探しする前に本題に目を向けてくれ。
入力とは、信号やデータなどを機器へ取り込むこと全般。その形式、手法は様々。
0147デフォルトの名無しさん
2008/05/01(木) 23:46:09プログラム内から、他の実行ファイルに引数を渡して実行するにはどうすればいいんでしょうか
コマンドプロンプトだと
C:\Program Files\Internet Explorer>iexplore http://***/
と同等の事をCでやりたいのですが
0148デフォルトの名無しさん
2008/05/01(木) 23:50:33んん? EOF はファイルにあるのではなくファイルの終わりをみて返されるものだよね?
EOF (-1) は char でなく int で受けないと処理系で(俺は行ってる、俺は行かない)みたいな不毛な会話が飛び交ったりするし。
ま、なにか EOF の扱いで随分と迷走してる気はするな。そう、粘着するレベルのものではないよ。前にすすもうよ。
0149デフォルトの名無しさん
2008/05/02(金) 00:05:29C言語の話としてやるならsystem()使えで終
実際にはWinAPIのShellExecute()を使うことになるだろう
詳しくはAPIスレで聞け
0150デフォルトの名無しさん
2008/05/02(金) 00:21:27ありがとう
APIの事はほとんど分からんのでとりあえずsystemとやらを使って作ってみます
0151デフォルトの名無しさん
2008/05/02(金) 00:25:08一応そこんとこは分かった上でよろ。
0152デフォルトの名無しさん
2008/05/02(金) 02:11:28だからそのコードをキーボードから入力することについての話だったんだが・・・
何ごちゃごちゃその定義にまで話を持ち込もうとしてんだ???
お前ってさぁ、自分のステータスは良くなくても、所有している
スポーツカーがかっこいいだろ?乗るかい?って乗った女性を
家までさらっていくタイプだろ?目的がちがーうって振られるタイプでしょ?
0153デフォルトの名無しさん
2008/05/02(金) 02:19:130154デフォルトの名無しさん
2008/05/02(金) 02:25:20EOFの入力は余裕で可能です、ありがとうございますた。
0155デフォルトの名無しさん
2008/05/02(金) 02:36:350156デフォルトの名無しさん
2008/05/02(金) 02:47:550157デフォルトの名無しさん
2008/05/02(金) 03:01:33キチガイに付き合うやつもキチガイ
0158デフォルトの名無しさん
2008/05/02(金) 03:38:01当然EOFコードを検出するのに、ファイルの終わりを示している
コードを使うのもありです、本当に本当に、重ね重ね、ありがとうございますた!
0159デフォルトの名無しさん
2008/05/02(金) 09:40:33■死にたくなければ、このレスをコピーして他のスレに □
□10回貼り付けて下さい。1時間以内にです!もし無 ■
■した場合は、今日寝ている間に富子さんがやってきて□
□貴方の首を絞めに来ます。富子さんは太平洋戦争の■
■時に16歳という若さで亡くなった女の子で、未だに成 □
□仏していないそうです。信じる信じないは貴方次第。 ■
■今年になってからこのレスを無視した人で、“呪われ □
□て死亡した人”が続出しています。これは富子さんの ■
■呪い。呪われて死んでもいいのならこれを無視するこ□
□とでしょうね。 ■
■――貴方がこうしているうちに富子さんが後ろから見□
□ていますよ…。 ■
■□■□■□■□■□■□■□■□■□■□■□■□
0160デフォルトの名無しさん
2008/05/02(金) 11:08:020161その1は宿題スレね
2008/05/02(金) 11:30:280162デフォルトの名無しさん
2008/05/02(金) 21:51:560163デフォルトの名無しさん
2008/05/02(金) 21:53:070164デフォルトの名無しさん
2008/05/02(金) 21:53:47何か切れてる? Unixなら伝統的に ^D = EOF
そそ、だからといって通常に ^D (0x04) が現れても EOF にはならないよ。
とにかくファイルに EOF というコードが有ると勘違いしるのかとおもった。
>>160 おっと、すまん。そのとおりだ。
0165デフォルトの名無しさん
2008/05/02(金) 22:07:28どのOSならとかどーでも良いんじゃい(竹原風に)
キーボードからの入力は可能だし、EOFはマクロで値が定義されているし
なんならそれに応じた入力をしてやりゃ良いんだよ。所詮俺らが視覚的に
見えているものは、デジタルデータ、0と1の組み合わせの符号、信号。
0166デフォルトの名無しさん
2008/05/02(金) 22:52:18char num[sum];
みたいな
0167デフォルトの名無しさん
2008/05/02(金) 22:52:54C99じゃあるまいし
0168デフォルトの名無しさん
2008/05/02(金) 22:54:49すまない。俺はまだレベル6だ
0169デフォルトの名無しさん
2008/05/02(金) 23:02:160170デフォルトの名無しさん
2008/05/02(金) 23:06:20ttp://seclan.dll.jp/c99d/c99d04.htm#dt19990719
0171デフォルトの名無しさん
2008/05/02(金) 23:14:11そのページのsizeofのところでふいたw
図からわかるようにって、代入しただけで何がわかるんだよ
0172デフォルトの名無しさん
2008/05/02(金) 23:16:40図の中のコメントに代入されるはずの値が書いてあるから
それを見ろということだろ。
0173デフォルトの名無しさん
2008/05/02(金) 23:23:54結論からいうと変数は使えない・・・ので malloc alloc がある。
char* num = (char*)malloc(num*sizeof(char));
...
*(num+5) = 5; // or num[5] = 0; // みたいな...
...
free(num);
0174デフォルトの名無しさん
2008/05/02(金) 23:26:190175デフォルトの名無しさん
2008/05/02(金) 23:32:18どうも何かごかいしているね。
EOF = (-1) が定義されているとしてこの -1 は入力できない値(int)なのよ。getchar() などが EOF と判断した条件の時に文字として存在しない値 (int)-1 0xffff あるいは 0xffffffff が返されるものなのだから。。。判るかな?
0176デフォルトの名無しさん
2008/05/02(金) 23:37:27君ね、いい加減鬱陶しい。マクロを知らないのか?所詮、プログラム言語も仕様も
人間が都合よく定義、規格化しているだけ。EOFがどうとかどうでも良いんじゃい。
所詮 数値データ だと何度も言っているだろ。あとはマクロを使うことで
より幅広い環境で通用するという話。いい加減、大学にも通ってないような
低レベルとは話はしたくないんで。
0177デフォルトの名無しさん
2008/05/02(金) 23:38:13使えた。
0178デフォルトの名無しさん
2008/05/02(金) 23:39:06> この -1 は入力できない値(int)なのよ
これだけ取り出しても、こいつが相当な勘違い野郎だということがはっきりしたな。
入力の意味も広義で説明されていたというのに。ねぇ、こういう知ったかが
どこか政府が運営する機関の関係者にいたらどう思う?マジでやべーよ。
まぁ、こんな似非理系は当然、専門学校程度だろうけど。
0179デフォルトの名無しさん
2008/05/02(金) 23:46:30EOFの入力は余裕で可能です、ありがとうございますた。
0180デフォルトの名無しさん
2008/05/02(金) 23:47:14コメントの数字が正しいことはどうやって証明するんだよw
0181デフォルトの名無しさん
2008/05/02(金) 23:48:12…
0182デフォルトの名無しさん
2008/05/02(金) 23:50:47入力受付のライブラリを用いて話をするが、while(getchar()!=EOF); で
ループを止める際に、どうやって止めたいんだい、プログラムは?w
論点はそこじゃない。EOFが入力可能か?答えはYES。適切に処理しない
環境をいちいち持ち出されても迷惑。256色しか表現できない環境で
24ビット画像を正確に表示しようとしても無理なようにね。
くどいが、こんな目の前にある機械なんて、所詮人間がルール(規格)を決めて
定義されたとおりにコンピュータがデータを実装された能力に応じて
展開しているに過ぎない、人間が都合よく解釈できるように。
コンピュータには目の前の文字も画像も映像データも、0と1の塊にしか見えんよ。
あとは規則に則って処理しているだけ。
0184デフォルトの名無しさん
2008/05/02(金) 23:57:49そんなむきにならならなくても。
0185デフォルトの名無しさん
2008/05/02(金) 23:59:05> この -1 は入力できない値(int)なのよ
別にint型とは限らなくね?符号ありのchar型にも収まる数値だが?
#include <stdio.h>
int main(void) {
char a=EOF;
unsigned char b=EOF;
if(a==EOF) printf("a=EOF\n");
if(b==EOF) printf("b=EOF\n");
printf("a : %d / b : %d \n",a,b);
return 0;
}
0186デフォルトの名無しさん
2008/05/03(土) 00:10:020187デフォルトの名無しさん
2008/05/03(土) 00:29:06fgetc(), getc(), getchar() の返り値は int ですから、EOF (-1) はファイル中に存在する値でも
なければ、stdin から入力できる値でもないと思うのですが。
0188デフォルトの名無しさん
2008/05/03(土) 00:30:53ああ、ようやく普通の人にであえたきが・・。勘違い >>182 系に辟易だったので・・・
で、実はそうではない。上位ビットが負号を示すのに用いられてるわけだけど
負号無しの unsigned char の場合 0x00 = 0, 0xff = 255 になって
負号付きの signed char の 0x80 〜 0xff は -127 〜 -1 とするから -1 という意味合いはある。
だけどこの -1 を EOF とみてしまうと・・・それはとても困る。
なぜなら(0x00〜0xff) の範囲にあるものすべて扱えないといけないから。
(0xff)が出現するバイナリーファイルの入出力はできないって事になるでしょ?
キーボードなどから (int(-1)) を入力できないデバイスはどうしたらいいかって事になるけど何度も既出だけど ^D (0x04) を犠牲にしそれを終端と意味付け、これをみて intサイズの -1 を返すという決めをしてる。
例で挙げている char a = EOF; の行でコンパイラから警告がでていない?(オプションによるけども char = int とするときの警告文)
後の比較系は int に負号拡張されるから見かけ動くようにみえてしまうので誤解しやすい。
0x7f (char) が 0x0000007f (int) に・・・同じ値 127 となる。
0x80 (signed char) が 0xffffff80 (int) に・・同じ -127 となる。
0x80 (unsigned char) は 0x000080 (unsigned int) ・・ 128・・という具合に・・
上位ビットを負号ビットに割り当てたのは負号拡張がとても容易だから。
a b が printf に渡った時点で負号拡張された int となっているからね。
0189デフォルトの名無しさん
2008/05/03(土) 00:32:33int main(void) {
char a=EOF;
unsigned char b=EOF;
int aa=EOF;
unsigned int bb=EOF;
if(a==EOF) printf("a=EOF\n");
if(b==EOF) printf("b=EOF\n");
printf("a : %d / b : %u \n",a,b);
printf("aa : %d / bb : %u \n",aa,bb);
return 0;
}
後は受け付けた変数の型によって、それ相応に解釈されちゃってるけどね。
0190デフォルトの名無しさん
2008/05/03(土) 00:44:20暴れてるのは一人だけで、まともに相手にすると余計暴れるからスルーしてるだけ
0191デフォルトの名無しさん
2008/05/03(土) 01:01:03「C言語きやすく質問おk」と書かれた扉を開けたら
腕組んでイライラした奴らがこっちを見て来た状況と同じくらい
質問しづらいんだが。
0192デフォルトの名無しさん
2008/05/03(土) 01:22:020193デフォルトの名無しさん
2008/05/03(土) 01:33:53おっ、丁寧に。サンプル間違ってたけどそこはなんだ。うまく修正してくれたわけか。C99 あるいは今の GNU C/C++系だと気付かなかった世界かもしれん。再変更する realloc もあるで。
0194デフォルトの名無しさん
2008/05/03(土) 01:53:55あ!?んだよ!?
0195デフォルトの名無しさん
2008/05/03(土) 01:59:580196デフォルトの名無しさん
2008/05/03(土) 03:41:22いっそコテハンつけてその話題をやって欲しいんだが
0197デフォルトの名無しさん
2008/05/03(土) 03:47:00来月ぐらいまで我慢すれば飽きるでしょ
0198デフォルトの名無しさん
2008/05/03(土) 03:54:180199デフォルトの名無しさん
2008/05/03(土) 03:55:41むしろsizeofを間違ってNGしないように気をつけろ
0200デフォルトの名無しさん
2008/05/03(土) 04:57:32http://pc11.2ch.net/test/read.cgi/tech/1179394713/l50
0201デフォルトの名無しさん
2008/05/03(土) 08:33:170202デフォルトの名無しさん
2008/05/03(土) 10:55:48って場合は
p[0] = 'F';
って変えれないんだよね?
char num[80] = "ABCDE";
char* p = num;
ってポインタが文字列のはいった「配列」をさしてないと
ポインタに添え字つけて一文字代入するのは無理?
0203デフォルトの名無しさん
2008/05/03(土) 11:01:290204202
2008/05/03(土) 11:04:39ありがとう
サンプルソースがなぜかポインタ文字列を直接操作してて
エラーでまくるから、自分の環境が悪いと思い込んでた
サンプルが間違ってたって事だね
0205デフォルトの名無しさん
2008/05/03(土) 12:21:00運が良ければ動くけどやるべきじゃないね
0206デフォルトの名無しさん
2008/05/03(土) 14:08:20202のサンプルと同じ間違いもしっかり犯してたし。
0207デフォルトの名無しさん
2008/05/03(土) 16:24:32過去形にするなや。未だに「レビュー中」のままだぞ。
0208デフォルトの名無しさん
2008/05/03(土) 16:43:080209デフォルトの名無しさん
2008/05/03(土) 16:48:070210デフォルトの名無しさん
2008/05/03(土) 17:01:490211デフォルトの名無しさん
2008/05/03(土) 17:04:02リテラル文字列を char* に代入できるのはそれとの互換性のため。
今はもちろんいじっちゃいけないが。
いじっちゃいけないようにすることで、
同じリテラル文字列が登場したらそれを共通化できるようになるし、
もっと言えば "ABC" と "BC" みたいなのも共通化できるようになる。
0212デフォルトの名無しさん
2008/05/03(土) 17:12:22普通にchar*に代入して参照できるわけだが。
0213デフォルトの名無しさん
2008/05/03(土) 17:19:39おかしなこと言わない。
リテラル文字列は const char の配列であってポインタじゃないし
(sizeof でサイズを取得できるから)、
char* に代入できるのは 「文字列リテラルは char* に代入できる」 という仕様が
特別に用意されているから。
0214デフォルトの名無しさん
2008/05/03(土) 17:20:470215デフォルトの名無しさん
2008/05/03(土) 17:21:06おしい、後一歩だ、がんばれ
0216デフォルトの名無しさん
2008/05/03(土) 17:23:100217デフォルトの名無しさん
2008/05/03(土) 17:32:05過去形じゃないよ。現在完了形だよ。
0218デフォルトの名無しさん
2008/05/03(土) 17:43:46ここのところずっとC++しか触ってないからできないもんだと思ってた
Cだと警告しか出ないのね
0219デフォルトの名無しさん
2008/05/03(土) 17:46:24時代遅れのオッサンが、GW中にどこにも出かけられないから
ここで楽しんでいたところ、気分を悪くしてしまったようでw
0220デフォルトの名無しさん
2008/05/03(土) 17:53:58チガウチガウ
リテラル文字列を char* に暗黙にキャストできるという話。
これは C も C++ も同じ。
0221デフォルトの名無しさん
2008/05/03(土) 17:55:570222デフォルトの名無しさん
2008/05/03(土) 17:57:540223デフォルトの名無しさん
2008/05/03(土) 17:59:090224デフォルトの名無しさん
2008/05/03(土) 18:01:17人
0225デフォルトの名無しさん
2008/05/03(土) 18:01:49「リテラル文字列は const char* const」
「const char* constは普通にchar*に代入して参照できる」
だからリテラル文字列は普通にchar*に代入できるって意味の発言だと思ったんだが
私が単に読み間違えただけか。
0226デフォルトの名無しさん
2008/05/03(土) 18:08:480227デフォルトの名無しさん
2008/05/03(土) 18:12:37>「const char* constは普通にchar*に代入して参照できる」
こんなこと212しか言ってないような、
そして>>220=216=214と>>212は別人のような気がする。
0228デフォルトの名無しさん
2008/05/03(土) 18:15:30>>212と>>216と>>220が同一人物だと思ってたんだけど
それがすでに勘違いだったのか orz こりゃまた失礼しました
0229デフォルトの名無しさん
2008/05/03(土) 18:38:13ここのサイトで
#include <stdio.h>
void main()
{
printf( "好きなことを書きましょう" );
}
ってなっているので、実際にやってみると
testa.c:1: error: missing terminating " character
testa.c: In function `main':
testa.c:3: warning: return type of 'main' is not `int'
というふうにエラーがでます。
で、大学では
#include <stdio.h>
int main(void)
って習ったのですが、どう違うんですか?こっちではうまくいったのですが。
0230デフォルトの名無しさん
2008/05/03(土) 18:40:19質問があります。
こちらで聞いてよろしいんでしょうか??
0231デフォルトの名無しさん
2008/05/03(土) 18:41:49そのコンパイラが日本語に対応してないんじゃね?
0232229
2008/05/03(土) 18:44:18あ、すいません。
#include <stdio.h>
int main(void)
{
printf("好きなことを書きましょう");
}
で、うまく実行できたという意味です。
0233デフォルトの名無しさん
2008/05/03(土) 18:44:52実行すると、内部ファイル云々、操作可能なプログラムと
認識されていません、と出ました。
内定先から頂いたDISCの指示に従ってインストールしたんですが・・・・
0234デフォルトの名無しさん
2008/05/03(土) 18:46:240235デフォルトの名無しさん
2008/05/03(土) 18:46:26ttp://www.kijineko.co.jp/tech/superstitions/void-main.html
0236229
2008/05/03(土) 18:50:11難しすぎてわからないのですが…
ようは、void main() と int main(void) は同じような意味だから
できたほうを使えってことですか?
0237デフォルトの名無しさん
2008/05/03(土) 18:53:320238デフォルトの名無しさん
2008/05/03(土) 18:55:36戻りはint。引数は依存って書いてあるな。void main(void)は不可か
0239デフォルトの名無しさん
2008/05/03(土) 18:58:44全部
int main
でおk
0240デフォルトの名無しさん
2008/05/03(土) 19:01:50そのサイトが嘘つき、もしくは正しい知識をもってない。
大学のほうが正解。
0241デフォルトの名無しさん
2008/05/03(土) 19:05:22正常終了したって事を示す「return 0;」を忘れずに
0242デフォルトの名無しさん
2008/05/03(土) 19:08:20まだ C89 の環境多いから return 0; 書いた方がいいけど。
0243デフォルトの名無しさん
2008/05/03(土) 19:13:18逆に、いちいちつっこむヤツを見ると、省略できるの知らないの? って思う。
0244デフォルトの名無しさん
2008/05/03(土) 19:15:48Linuxのコンソールで擬似和音のビープ音鳴らすのにエスケープシーケンスを
使おうとおもってるんですが、printf関数でエスケープシーケンスを
出力すると、一旦出力バッファに貯められてしまうため、時間差で
音を出したくても上手く音が出力されません。
出力バッファを介さずに文字列を出力する関数ってなにかありますでしょうか?
0245デフォルトの名無しさん
2008/05/03(土) 19:31:43return を省略した際の動作は規格上は未定義。
C99 や C++ だと main 関数は特例として省略が可能だが、
C89 では main 関数にもそれが適用される。
大体の処理系は警告出すだけだがね。
0246230
2008/05/03(土) 20:03:24担当の方がいらっしゃらない物で。
失礼しました。
0247デフォルトの名無しさん
2008/05/03(土) 20:10:18動作が未定義ってかリターン値が未定義だろ。
省略しても問題ないよ。
お作法的には書くほうがいいけど、書き捨てのコードにいちいちツッコミ入れるほどじゃないよ。
0248デフォルトの名無しさん
2008/05/03(土) 20:17:00Drawin / *bsd 系なので Linux はどうかしらないが fflush 使うか raw モードにするというのももある
// うまく管理して
{
int fd;
struct sgttyb bk, fm;
}
{
if((fd = open("/dev/tty", O_RDWR)) == -1)
return -1;
ioctl(fd, TIOCGETP, &bk);
fm = bk;
if(fm.sg_flags != RAW)
{
fm.sg_flags = RAW;
ioctl(fd, TIOCSETP, &fm);
}
read(fd write(fd でどちらもバッファリング無しで入出力...
0249デフォルトの名無しさん
2008/05/03(土) 20:22:02int main() { .... ; return 0; } ですればどうでしょうね。
return 無しの例外が許されてるといいながら return 0; 記述がそれほど手間でもないのでは?
void main() の登場はいわゆる void 型が導入された次期からしばらくの間ではなかったか。サンプルが古いのであって目くじら立てずに見過ごせばどうかな?。
0250デフォルトの名無しさん
2008/05/03(土) 20:25:310251デフォルトの名無しさん
2008/05/03(土) 20:37:49だから int main に読み替えればいいでしょって事なの。参考にしてる物に目くじら立てて(その例文は可笑しい)って作者に文句のメールでも送る?。そんな方向に行くのはどうかという事。
0252デフォルトの名無しさん
2008/05/03(土) 20:38:49仮にも 「講座」 を名乗るのにそれじゃマズいだろ。
0253デフォルトの名無しさん
2008/05/03(土) 20:41:520254デフォルトの名無しさん
2008/05/03(土) 20:58:37# 自分はどこにも行きませんけど
0255229
2008/05/03(土) 20:59:37大学で3回くらいしかまだ習ってないので(習ったのはprintf int forとかだけですけど)
ばりばり初心者だったのですいません
とりあえず普通に勉強していこうと思います
ありがとうございました
0256デフォルトの名無しさん
2008/05/03(土) 21:35:52下のコードは書いているものの一部なのですが、
コメントのつけてある位置でエラーが出てしまい、コンパイルが通りませんでした。
typedef struct {int line, *col;} match_info;
match_info *info;
match_info *str_search(FILE *fp, char *sstr)
{
int line_cnt;
.... // line_cntはここで値が代入されている
info = (match_info *)malloc((line_cnt+1) * (sizeof(match_info)));
info+line_cnt = NULL; // ここでエラー
....
}
エラーの内容は
error: invalid lvalue in assignment
でした。ちなみにinfo = NULLとしたところコンパイルできました。
info + 1 = NULLと定数を使用するとやはりコンパイルできません。
何故オフセットすると値を代入することができなくなってしまうのでしょうか。
お願いします。
(エラーの出ている箇所はこの部分だけであり、載せていない部分ではエラーはありませんでした)
0257デフォルトの名無しさん
2008/05/03(土) 21:38:03infoはポインタでしかないから、それに何かを足したものはただの値でしかないから代入はできない。
やりたいことは、info[line_cnt] = NULLではないのか?
0258デフォルトの名無しさん
2008/05/03(土) 21:39:340259デフォルトの名無しさん
2008/05/03(土) 21:42:39ないな。match_infoが構造体だから代入できない。
まぁ恐らく、
info[line_cnt].line = 0;
info[line_cnt].col = NULL;
なのだろう。
0260デフォルトの名無しさん
2008/05/03(土) 21:56:30かすどもおおおお
スレ違いなんだよ他でやれ
0261デフォルトの名無しさん
2008/05/03(土) 21:58:05(オレモナー)
0262デフォルトの名無しさん
2008/05/03(土) 22:09:21お早いレスありがとうございます。
やりたいことは確かに>>259の通りなのですが、
他の関数でinfoを門番までスキャンさせたくて、門番としてNULLを割り当てようとしました。
ちょうどコマンド引数のargv[argc]に'\0'が入っているような感じに使おうと思っているのです。
>>259のようにしてしまうと、他の関数ではinfoのメンバーを知らなくてはなりません。
質問では触れなかったのですが、検索用の関数を作っています。
最終的には、main()側でstr_search()や,infoの内容を見る関数をラップした関数を使えるようにするだけで、
他の部分は全てヘッダファイルに移し、隠蔽してしまおうと考えていました。(言葉足らずですみません)
つまりinfoは作業用変数としたいのです。
関数の設計も含めて、何か良い方法がありましたら教えていただけないでしょうか。
0263デフォルトの名無しさん
2008/05/03(土) 22:11:470264デフォルトの名無しさん
2008/05/03(土) 22:14:33できない。
infoが配列の要素を指している以上、
その値は必ず配列上に存在する要素へのポインタにしかなりえない。
0265デフォルトの名無しさん
2008/05/03(土) 22:16:02こーゆーことやるならC++のほうが圧倒的に楽だけどね…
0266デフォルトの名無しさん
2008/05/03(土) 22:18:13文字列の最後を\0で検出できるのは、\0が文字型の特殊な値だから。
同じように任意の型の配列の末尾を検出したいなら、特殊な値を割り当てて検出する以外にない。
0267デフォルトの名無しさん
2008/05/03(土) 22:22:50match_infoのポインタの配列を使う。
match_info **info;
info=(match_info **)malloc((line_cnt+1) * (sizeof(match_info *)));
for(i=0;i<line_cnt;i++)
info[i]=(match_info *)malloc(sizeof(match_info));
info[line_cnt]=NULL;
こうすれば出来るけど、当然一個一個freeする手間がかかる。
0268デフォルトの名無しさん
2008/05/03(土) 22:24:02argv[argc]は'\0'ではなくNULLな。
これはargvがポインタの配列だから実現できる。
infoはmatch_info型の配列だから、
末尾要素をNULLにしようとしても型が違う。
0269デフォルトの名無しさん
2008/05/03(土) 22:28:56それはもしかするとこう?
match_info** info; // ← match_info の配列ですね?
{
info = (match_info**)malloc(line_cnt+1)*szeof(match_info));
int i;
for(i = 0; i < line_cnt + 1; i++)
info[i] = NULL+
// ...
0270デフォルトの名無しさん
2008/05/03(土) 22:30:16ががん。かぶってしもた・・
0271デフォルトの名無しさん
2008/05/03(土) 22:33:43公開するか、ポインタの配列で実現するかの二択。
0272デフォルトの名無しさん
2008/05/03(土) 22:57:51みなさんありがとうございます。
argv[]がargv[argc]までスキャンされるのは、
argv[]が文字列の"ポインタ"だからですね。勘違いしていました。
>>267>>269でおっしゃられているようにポインタ配列で実装しようと思います。
>>267>>269のようにmalloc()がネストされている場合は、
中をfree()してから外側をfree()しなければなりませんか?
手間がかかるようなら、>>263,265も考えてみようと思います。
0273デフォルトの名無しさん
2008/05/03(土) 23:07:18|中をfree()してから外側をfree()しなければなりませんか?
もちろん
0274デフォルトの名無しさん
2008/05/03(土) 23:17:030275デフォルトの名無しさん
2008/05/03(土) 23:23:46エディタのマニュアルに書いてないかな
0276デフォルトの名無しさん
2008/05/03(土) 23:27:29grepのソース
0277デフォルトの名無しさん
2008/05/03(土) 23:34:41http://www.amazon.co.jp/dp/4781905854
この本に一章だけ書いてある。
本自体は有名だけど、この説明がいいかどうかは判断できない。
0278デフォルトの名無しさん
2008/05/03(土) 23:40:46レビューワロタ
参考にしてる人多すぎだろ
0279デフォルトの名無しさん
2008/05/03(土) 23:40:520280デフォルトの名無しさん
2008/05/04(日) 00:05:260281デフォルトの名無しさん
2008/05/04(日) 00:21:41手元にある本をあげておきます。
オートマトン・言語理論, 富田悦次・横森 貴, 森北出版 1992, ISBN4627805500
これがベストというわけではありませんが、まず理論的な部分をしっかりおさえておかないと、後々どうにもならなくなると思います。
0282デフォルトの名無しさん
2008/05/04(日) 03:45:270283デフォルトの名無しさん
2008/05/04(日) 03:50:060284デフォルトの名無しさん
2008/05/04(日) 03:52:100285デフォルトの名無しさん
2008/05/04(日) 03:52:32斜めになっているのが縦棒か横棒か、違うんだなぁ。
シャープは楽譜の記号で使われているんだなぁ。
ぼぼぼ、僕はおにぎりが欲しいんだなぁ。
0286デフォルトの名無しさん
2008/05/04(日) 04:18:42むしろ井桁とかだと通じないことがあるし
0287デフォルトの名無しさん
2008/05/04(日) 04:29:29シャープと書かれているんでしょう。同一視してはならぬ、決して。
0288デフォルトの名無しさん
2008/05/04(日) 04:35:23まぁシャープの代わりに井桁を使っているから、井桁をシャープと読むのは不適切かも知れないが
井桁が通じないことがあるんだからしょうがない
もっと普及させてこい。話はそれからだ
0289デフォルトの名無しさん
2008/05/04(日) 04:42:53♯を英語圏にも広めよう!
0290デフォルトの名無しさん
2008/05/04(日) 07:35:58マジなのか
どうでもいいけど
ttp://cplusplus.syntaxerrors.info/index.php?title=Extra_tokens_at_end_of_pound_include_directive
0291デフォルトの名無しさん
2008/05/04(日) 09:46:44http://en.wikipedia.org/wiki/Number_sign#Other_names_in_English
0292デフォルトの名無しさん
2008/05/04(日) 10:17:44共用体とビットフィールドを使って実現しようと思ったのですができませんでした
下のプログラムだとどこがだめなんでしょうか?
#include <stdio.h>
int main(void){
union bits{
char ch;
unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
} bits;
bits.ch = 'a';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
bits.ch = 'b';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
bits.ch = 'c';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
return 0;
}
/*
実行結果:
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
*/
0293デフォルトの名無しさん
2008/05/04(日) 10:18:38こんな感じに書いたときに、
strの宣言がcharの配列だったらいいけど、
charへのポインタだったらだめだった。どうして?
0294デフォルトの名無しさん
2008/05/04(日) 10:31:08運が悪くポインタの指す先が書き換えてはいけない場所だったから
0295デフォルトの名無しさん
2008/05/04(日) 10:54:19a, b, c, d, e, f, g, h が union で共用されているから
#include <stdio.h>
int main(void){
union bits{
char ch;
struct{
unsigned a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
};
} bits;
bits.ch = 'a';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
bits.ch = 'b';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
bits.ch = 'c';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
return 0;
}
0296デフォルトの名無しさん
2008/05/04(日) 10:56:19ポインタを初期化していなかったに一票
0298デフォルトの名無しさん
2008/05/04(日) 11:10:44unsigned とかやってるとサイズが4バイトになるから
union bits{
char ch;
struct{
unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
};
} bits;
にしないとマズいかもしれない。
ただ、ビットフィールドを含む構造体のサイズは処理系依存なので難しい所だが。
さらに言えばビットフィールドのビットがどちら側から埋められるかは処理系依存だから、
union bits{
char ch;
struct{
#ifdef BITFIELD_LITTLE_ENDIAN
unsigned char h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1;
#else
unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
#endif
};
} bits;
として処理系ごとに切り替えられるようにするのが良い。
0299デフォルトの名無しさん
2008/05/04(日) 11:13:03union bits{
char ch;
struct{
#ifdef BITFIELD_LITTLE_ENDIAN
#ifdef BITFIELD_INT_SIZE
unsigned : sizeof (unsigned int) * CHAR_BIT - 8;
unsigned h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1;
#else
unsigned char h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1;
#endif
#else
#ifdef BITFIELD_INT_SIZE
unsigned a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
#else
unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
#endif
#endif
};
} bits;
とすることになるが、この共用体のサイズが1であることは期待できない。
0300デフォルトの名無しさん
2008/05/04(日) 11:28:45ビットフィールドが全部同じ位置を使っていたということですね
プリプロセッサディレクティブは未学習なのですが、イメージはつかめました
ありがとうございました
0301デフォルトの名無しさん
2008/05/04(日) 12:05:18#define BIT(val, pos) (((val) >> (pos)) & 1)
int ch;
ch = 'a';
printf("%d %d %d %d %d %d %d %d\n", \
BIT(ch,7), BIT(ch,6), BIT(ch,5), BIT(ch,4), BIT(ch,3), BIT(ch,2), BIT(ch,1), BIT(ch,0));
0302デフォルトの名無しさん
2008/05/04(日) 12:08:57普通って何さ
0303デフォルトの名無しさん
2008/05/04(日) 12:38:48普通って普通さ
0304デフォルトの名無しさん
2008/05/04(日) 13:43:240305デフォルトの名無しさん
2008/05/04(日) 17:45:50パスはしたの通りです。
C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C
C:\Bディレクトリ\コンパイラ
0306デフォルトの名無しさん
2008/05/04(日) 18:18:23> コンパイラ /H
$ コンパイラ -h
$コンパイラ --help
0307デフォルトの名無しさん
2008/05/04(日) 18:53:080308デフォルトの名無しさん
2008/05/04(日) 18:55:18コンパイラによって方法が違うからコンパイラのマニュアルを見るか
有名なコンパイラなら名前を書け
0309デフォルトの名無しさん
2008/05/04(日) 18:55:530310デフォルトの名無しさん
2008/05/04(日) 19:05:39MinGWなんだけど
0311デフォルトの名無しさん
2008/05/04(日) 19:12:19> C:\Bディレクトリ\コンパイラ
が気になるけどたぶん
gcc C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C
C:\Bディレクトリ\コンパイラ C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C
どっちかかもね?
0312デフォルトの名無しさん
2008/05/04(日) 19:20:27と叩けば使いかたが出る。
0313デフォルトの名無しさん
2008/05/04(日) 19:31:39その二つでためしたんですが、
gcc C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cの場合
'gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
C:\Bディレクトリ\コンパイラ C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cだと
'C:\TYC4TH\gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません
0314デフォルトの名無しさん
2008/05/04(日) 19:33:020315デフォルトの名無しさん
2008/05/04(日) 19:39:10なんか英語がたくさんでて意味がわからない・・・
0316デフォルトの名無しさん
2008/05/04(日) 19:42:10例)gcc "C:\Bディレクトリ\コンパイラ"
>'gcc' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
gccコマンドのパスが通っていない、正しくない
0317デフォルトの名無しさん
2008/05/04(日) 19:49:07パス通すかの確認があった気がしたけど・・・
MinGWをインストールしなおして確認してみるか、
$HOME/.bashrcにexport PATH=$PATH:コンパイラの入ってるディレクトリ
を追加してみ
MinGWコンパイラの入ってるパスは$HOMEからの相対パスがいいかな
ちなみにMSYSも入れるとうれしくなれるかも
0318デフォルトの名無しさん
2008/05/04(日) 19:49:48コンパイラの入ってるパスは
訂正
0319デフォルトの名無しさん
2008/05/04(日) 19:51:13コンパイラの入ってるディレクトリは
打つ出し脳
0320デフォルトの名無しさん
2008/05/04(日) 19:51:51OSはWindowsじゃないの?
XP なのか 9x なのかによっても設定方法違うけど
0321デフォルトの名無しさん
2008/05/04(日) 19:55:06PATH=c:\MinGWまでのディレクトリ\bin;%PATH%
これを書き込んで再起動すればばよかった、、、はず・・・多分
0322デフォルトの名無しさん
2008/05/04(日) 19:57:08Cygwin + MinGW + GCC 相談室 Part 3
http://pc11.2ch.net/test/read.cgi/tech/1177944767/
0323デフォルトの名無しさん
2008/05/04(日) 20:19:39みなさんありがとうございます。
さっそく勉強してきます。
0324デフォルトの名無しさん
2008/05/04(日) 20:51:46typedef HRESULT (STDMETHODCALLTYPE *LPFNGETCORSYSTEMDIRECTORY)(LPWSTR, DWORD, DWORD *);
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
WCHAR szBuf[256];
DWORD dwLength;
HMODULE hmod;
LPFNGETCORSYSTEMDIRECTORY lpfnGetCORSystemDirectory;
略
lpfnGetCORSystemDirectory = (LPFNGETCORSYSTEMDIRECTORY)GetProcAddress(hmod, "GetCORSystemDirectory");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (lpfnGetCORSystemDirectory == NULL) {
MessageBox(NULL, TEXT("関数がエクスポートされていません。"), NULL, MB_ICONWARNING);
FreeLibrary(hmod);
return 0;
}
略
}
上記のようなプログラムを見かけましたが波線の部分関数ポインタの動作いまいち理解できません。
どなたかご教示お願いします。
0325デフォルトの名無しさん
2008/05/04(日) 21:53:20以下の記述で普通に動作しています。
環境 cygwin/WindowsXP, 処理系 gcc 3.4.4
#include <stdio.h>
#define N 1024
int main()
{
char buffer[N], *p;
p = buffer;
fgets(p, N, stdin);
printf(">%s", p);
return 0;
}
/* end */
動作しないソースと環境・処理系を教えていただければ、何かわかるかもしれません。
0326325
2008/05/04(日) 21:54:300327デフォルトの名無しさん
2008/05/05(月) 01:40:56関数ポインタとは動作するものではありません
もう少し質問内容を吟味してくださらないと答えようがありません
0328デフォルトの名無しさん
2008/05/05(月) 04:08:440329デフォルトの名無しさん
2008/05/05(月) 06:47:41何を聞きたいのか今ひとつわからんが、とりあえずMSDN。
http://msdn.microsoft.com/ja-jp/library/64tkc9y5(VS.80).aspx
0330デフォルトの名無しさん
2008/05/05(月) 13:03:48GetProcAddress は指定した関数へのアドレスを返すんだけど、
GetProcAddress の戻り値の型は1つに定めないといけないので
GetProcAddress は関数へのアドレスをとりあえず FARPROC って型にして返すようにしてある。
実際にこの関数のアドレスを使う際には、
本来の関数ポインタ型へとキャストして使う必要がある。
0331デフォルトの名無しさん
2008/05/05(月) 14:15:49どの処理系でもまともな動作が期待できる?
0332デフォルトの名無しさん
2008/05/05(月) 15:04:12プログラマを目指すならもちとあいまいな問いにならないよう気をつけないと。
質問がとんでもなく飛んでいる。
どの処理系・・・列記してみて
まともな動作・・まともってなによ(この質問はちょっとあほっポイ匂い)
0333デフォルトの名無しさん
2008/05/05(月) 15:19:24標準じゃない
0334デフォルトの名無しさん
2008/05/05(月) 15:25:08このソースって凄いね(大文字ばっかで・・・w)
関数のポインターについてだけど
ポインターはアドレスを示すのは判りますね。
int body1(char* mes)
{
printf("body1 : %s¥n", mes); return 0;
}
int body2(char* mes)
{
printf("body2 : %s¥n", mes); return 0;
}
{
int (*func)(char*);
func = body1;
func("message");
func = body2;
func("message");
}
みたいな。
lpfnGetCORSystemDirectory は関数へのポインターを示すけど希望するのがなければ NULL。
あとlpfnGetCORSystemDirectory() として適当に引数与えて呼び出せばいいということかな。
0335デフォルトの名無しさん
2008/05/05(月) 15:57:10関数そのものは標準であり、
どの処理系であろうと「処理系の考えるところのまともな動作」をする
それが「プログラマの期待するところの動作」と一致するかはわからない
0336デフォルトの名無しさん
2008/05/05(月) 16:02:52課題でこのプログラムを組まないといけないのですが、全く分かりません。
問、二次元配列のプログラムを利用し、行列の積を計算するプログラムを作成せよ。
ただし行列a,bは以下のものを使用する。
|0 1 2| |0 3 6|
a=|3 4 5| b=|1 4 7|
|6 7 8| |2 5 8|
aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。
0337デフォルトの名無しさん
2008/05/05(月) 16:12:06>aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。
行列の積の定義から勉強しような。
行と列が逆だと思うぞ。
0338デフォルトの名無しさん
2008/05/05(月) 16:23:36すいません。丁寧に指摘してくださってありがたいです。
一応僕が作ったプログラムを載せておきます。
#include<stdio.h>
main(){
int a[3][3]={{0,1,2},{3,4,5},{6,7,8}};
int b[3][3]={{0,3,6},{1,4,7},{2,5,8}};
int c[3][3]={0};
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++)
c[i][j]=a[i][j]*b[i][j];}
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d ",c[i][j]);
printf("\n");
}}
足し算をするプログラムの演算子を+から*に変えただけなので積が出来るわけもないのですが、
どうすればよいのでしょうか、あつかましいですがよろしくお願いします。
0339側近中の側近 ◆0351148456
2008/05/05(月) 16:28:36#include <stdio.h>
int main(void)
{
int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}};
int ab[3][3];
int i;
int j;
int k;
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++){
ab[i][j] = 0;
for(k = 0; k < 3; k++){
ab[i][j] += (a[i][k] * b[k][j]);
}
}
}
return 0;
}
答えは{{5, 14, 23}, {14, 50, 86}, {33, 86, 149}
0340デフォルトの名無しさん
2008/05/05(月) 16:29:04行列の掛け算は3重のループになるのだぞ。行列を勉強しましょう。
0341デフォルトの名無しさん
2008/05/05(月) 16:30:14for(m = 0; m < 3; m++){
for(i = 0; i < 3; i++) c[n][m] += a[n][i] * b[i][m];
}
}
こんな感じ?
0342側近中の側近 ◆0351148456
2008/05/05(月) 16:33:49(っ´▽`)っ
x行n列の行列Aのi行j列成分をa(i, j)、
n行y列の行列Bのi行j列成分をb(i, j)、
ABのi行j列成分をab(i, j)と表示するとき、
ab(i, j) = Σ(k=1→n)a(i, k)b(k, j)
線形台数の教科書を見直せ☆
0343デフォルトの名無しさん
2008/05/05(月) 16:51:00初歩的なことなのにわざわざ教えてくださってありがとうございます。
感謝しています。
あとほんとに初心者的なことなんですが、>>339さんのプログラムで計算は出来ました。
しかし答えを表示させようと思ったら、なんか変な結果になりました。
以下プログラムと結果です。
(最初のほうは省略)
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++){
ab[i][j] = 0;
for(k = 0; k < 3; k++){
ab[i][j] += (a[i][k] * b[k][j]);
printf("%d ",ab[i][j]);}
}
}
return 0;
}
結果
0 1 5 0 4 14 0 7 23 0 4 14 9 25 50 18 46 86 0 7 23 18 46 86 36 85 149
0344デフォルトの名無しさん
2008/05/05(月) 16:52:39ゆとり乙
数学3cのレベルです
0345344
2008/05/05(月) 16:54:36ごめんなさいゆとりは俺でした
数学3cじゃねええええええええええ
あああああああああああああ何か勘違いしてたああああああああ
0346344
2008/05/05(月) 16:55:210347デフォルトの名無しさん
2008/05/05(月) 16:55:51CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
ポインタを使うような関数を自分で作る必要がありますか?
何かサンプルなどもありましたらお教えください。
0348336
2008/05/05(月) 16:55:510349デフォルトの名無しさん
2008/05/05(月) 16:56:55寿司食うか?
0350344
2008/05/05(月) 16:58:16ケーリーはミルトンの公式ばっかり使って足し算引き算ぐらいだっけ?
行列式はなかったよな・・・あぁ・・・俺なにやってんだろう
0351デフォルトの名無しさん
2008/05/05(月) 16:58:59> printf("%d ",ab[i][j]);}
~~~
中括弧の位置
0352側近中の側近 ◆0351148456
2008/05/05(月) 17:03:14(っ´▽`)っ
printfを最も内側のループの外に出せ☆
#include <stdio.h>
int main(void)
{
int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}};
int ab[3][3];
int i;
int j;
int k;
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++){
ab[i][j] = 0;
for(k = 0; k < 3; k++){
ab[i][j] += (a[i][k] * b[k][j]);
}
printf("%d\t", ab[i][j]);
}
printf("\n");
}
return 0;
}
0353344
2008/05/05(月) 17:05:080354344
2008/05/05(月) 17:06:410355デフォルトの名無しさん
2008/05/05(月) 17:08:02トイレでも篭ってろ
0356344
2008/05/05(月) 17:08:420357デフォルトの名無しさん
2008/05/05(月) 17:10:23>CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
ない
>ポインタを使うような関数を自分で作る必要がありますか?
ある
文字列操作の概念自体が違うので、CでVBのようなことをやるという考え自体を捨てること
まずCのやりかたというものを覚えるのが先
0358側近中の側近 ◆0351148456
2008/05/05(月) 17:12:08(っ´▽`)っ
b = LEFT(a, n)
は
strncpy(b, a, n);
b[n] = '\0';
b = MID(a, m, n)
は
strncpy(b, &a[m-1], n-m+1);
b[n-m+1] = '\0'
で。
0359側近中の側近 ◆0351148456
2008/05/05(月) 17:13:30最後セミコロンが抜けたが気にしない☆
0360デフォルトの名無しさん
2008/05/05(月) 17:14:05>CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
どちらもsprintf()で代用可能。
0361336
2008/05/05(月) 17:14:14おかげさまでうまく答えも出ました。本当にありがとうございます。
0362344
2008/05/05(月) 17:14:54俺と一緒に勉強しようぜ
0364側近中の側近 ◆0351148456
2008/05/05(月) 17:23:39正確には
(っ´▽`)っ
b = LEFTB(a, n)
は
strncpy(b, a, n);
b[n] = '\0';
b = MIDB(a, m, n)
は
strncpy(b, &a[m-1], n-m+1);
b[n-m+1] = '\0';
だ。
strncpyの第3引数はバイト数。
LEFTとMIDを使いたければwcsncpyを使えばいいような気がする。
0365336
2008/05/05(月) 17:35:16共にがんばりましょう。
0366デフォルトの名無しさん
2008/05/05(月) 17:44:26hentai = 293317826;
doutei = 899523;
仮に上のように hentai と doutei に格納された数値において、
hentai += doutei; // 293000000 + 899253
のように hentai の下6桁を0にして doutei を加算し、下6桁を doutei にしたい。
条件は
if ( hentai > doutei &&
doutei >= 0 &&
doutei < 1000000)
で、思いついたのが
hentai = ((hentai / 1000000) * 1000000) + doutei;
納得がいかないのでスマートなやり方教えてくれ。
0367デフォルトの名無しさん
2008/05/05(月) 17:50:49十分スマートと思うが、どういう点で納得がいかないんだ。
hentai += doutei - hentai % 1000000;
0368デフォルトの名無しさん
2008/05/05(月) 17:58:57おお、サンクス。
除算か乗算どちらかを一回でも削りたかったんだ。
0369デフォルトの名無しさん
2008/05/05(月) 21:57:45Basic系から来た人だと right とかも使うんでしょw・・それは置いといて無いものは自作するってのも楽しみじゃないかいな?
>>360
参考までに書いてくれると周りも参考になるとおもう。
せいぜい数行だと思うから sprintf で書いてみてよ。
0370デフォルトの名無しさん
2008/05/05(月) 22:12:13360じゃないが、こうじゃないかな。
char* left(char *dst, const char *src, int count)
{
sprintf(dst, "%.*s", count, src);
return dst;
}
char* mid(char *dst, const char *src, int pos, int count)
{
return left(dst, src+pos, count);
}
0371デフォルトの名無しさん
2008/05/05(月) 23:40:110372デフォルトの名無しさん
2008/05/05(月) 23:43:44おお、%.*s ・・・しらなんだ。
0373デフォルトの名無しさん
2008/05/05(月) 23:47:34・ GCC (MinGW)
・ Microsoft Visual C++ Express Edition 2008
好きなの選べ
0374デフォルトの名無しさん
2008/05/06(火) 00:05:01その2つの違いがまったくわかりません…
それとMSの方はC++となってますがC言語にも対応してるんですか??
0375デフォルトの名無しさん
2008/05/06(火) 00:08:440376デフォルトの名無しさん
2008/05/06(火) 00:09:31MSのコンパイラでもCのコンパイルはできます。但し、99年の規格にさえ準拠していないので注意が必要です。
gccは、Cコンパイラではなくコンパイラコレクションです。勿論、CもC++もコンパイルできます。
まぁ、MinGWにしろCygwinにしろ、環境に対する知識が必要にはなります。
0377デフォルトの名無しさん
2008/05/06(火) 00:24:49int fputc(int 文字、FILE *ストリーム);
fputc( )関数は、「文字」の下位バイトを、「ストリーム」に結び付けられているファイルにunsigned char型の値として書き込みます。
とあるんですが、上位バイトはどうなるんですか?
0378デフォルトの名無しさん
2008/05/06(火) 00:25:590379デフォルトの名無しさん
2008/05/06(火) 00:26:490380デフォルトの名無しさん
2008/05/06(火) 08:01:36やっぱりbcc、gcc辺りかな
0381デフォルトの名無しさん
2008/05/06(火) 09:42:290382デフォルトの名無しさん
2008/05/06(火) 09:53:56使い方を教えてください。
0383デフォルトの名無しさん
2008/05/06(火) 09:54:040384デフォルトの名無しさん
2008/05/06(火) 09:56:25uint16 や uint8 は標準では用意されていない。
0385382
2008/05/06(火) 09:59:52もう少し詳しくお願いします。
0386デフォルトの名無しさん
2008/05/06(火) 10:11:53標準で用意されてない以上、
ヘッダファイル内にある定義を見てくださいとしか言いようが無い。
0387382
2008/05/06(火) 10:22:11ということは・・・
uint16 uint8 はwindows.hとかでも定義されてる分ではなく、
自分の使っているライブラリかなにかで定義されているということですね。
わかりました。 調べてみます。
0388デフォルトの名無しさん
2008/05/06(火) 10:24:30windows.hにあるかもしれませんが、そこにあったとしても標準とは言えません。
そもそも、あなたがWindowsを使っているのかどうか誰にもわかりませんから。
0389デフォルトの名無しさん
2008/05/06(火) 10:25:09どの処理系使ってるかも知らんし、
結局自分で調べてくれ、というこった。
0390デフォルトの名無しさん
2008/05/06(火) 13:51:05int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram hist);
int main (void){
struct histgram hist;
int z;
hist.x = 0;
for(z=0;z<100;z++){
hist.y[z]=0;
}
printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
one(hist);
printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
for(z=0;z<9999999999;z++);
return 0;
}
void one(hist){
two(hist);
void two(hist){
int z;
hist.x = 1;
for(z=0;z<100;z++)hist.y[z]=1;
}
とするとtwo(hist)でエラーが起きます。なぜでしょうか?
0391デフォルトの名無しさん
2008/05/06(火) 13:57:380392デフォルトの名無しさん
2008/05/06(火) 14:00:160393デフォルトの名無しさん
2008/05/06(火) 14:02:26struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram hist);
int main (void){
struct histgram hist;
int z;
hist.x = 0;
for(z=0;z<100;z++){
hist.y[z]=0;
}
printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
two(hist);
printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
for(z=0;z<9999999999;z++);
return 0;
}
void two(struct histgram *hist)
{
int z;
hist->x = 1;
for(z=0;z<100;z++){
hist->y[z]=1;
}
}
は何がいけないのでしょうか?
0394デフォルトの名無しさん
2008/05/06(火) 14:04:25main()で呼んでるtwo()に渡されてるhistは構造体そのもの
あと>392
0395デフォルトの名無しさん
2008/05/06(火) 14:06:220396デフォルトの名無しさん
2008/05/06(火) 14:11:210397393
2008/05/06(火) 14:11:59ここに、393のようにかけと書いてありました…
393を書き直した正解はどうなるのでしょうか?
グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく
処理された任意の変数をn個、n-1個上の階層で使用したいのですが
0398393
2008/05/06(火) 14:12:39ありがとうございます。使ってみます。
0399デフォルトの名無しさん
2008/05/06(火) 14:17:24int x;
x = ZETTAI(-9 - 50) + 5;
これでxの中身が59になってしまうのですが、何故でしょうか?
-59をZETTAIで59にした後、5を加算しているはずなのですが
0400デフォルトの名無しさん
2008/05/06(火) 14:17:47そこの二つ目のの「seito2」は構造体の配列名。配列名は大抵の場合すぐポインタに成り下がるので、
ポインタを引数としてとるseidesp2()にそのまま渡すことができる。
>>393 の場合histは構造体の単体だから、two(&hist) として呼び出さなければならない。
>グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく
>処理された任意の変数をn個、n-1個上の階層で使用したいのですが
言ってる意味がよくわからないが、1つの構造体のデータを再帰的に処理したいのなら構造体のポインタを渡す。
0401デフォルトの名無しさん
2008/05/06(火) 14:21:07プロトタイプ宣言と定義が噛み合っていないぞ。
void two(struct histgram hist);
void two(struct histgram *hist)...
0402デフォルトの名無しさん
2008/05/06(火) 14:23:09x = ZETTAI(-9 - 50) + 5;
↑は↓のように展開されるから。
x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5;
これはもちろん
x = (-59 < 0) ? 59 : -54;
と解釈されて、xには59が代入される。
マクロZETTAIの正しい宣言は下のようになる。
#define ZETTAI(x) ((x < 0) ? -(x) : x)
もちろん自作などせずにライブラリ関数を使うことが望ましい。
0403デフォルトの名無しさん
2008/05/06(火) 14:23:31#define ZETTAI(x) (x < 0) ? -(x) : x
を
#define ZETTAI(x) (((x) < 0) ? -(x) : (x))
にしておてきなさい。
0404デフォルトの名無しさん
2008/05/06(火) 14:30:39上手くいきました
ありがとうございます
ですが、
>x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5;
同じxなのに何故一番右のxだけに+5がくっつくのですか?
0405393
2008/05/06(火) 14:30:43配列でなく、実体を受け渡しする場合は、
struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram *hist);
int main (void){
struct histgram hist;
int z;
hist.x = 0;
printf("before***%d***%d***%d***",hist.x);
one(&hist);
printf("before***%s***%s***%s***",hist.x,hist.y[0],hist.y[50]);
return 0;
}
void one(struct histgram hist){
two(&hist);
}
void two(struct histgram *hist){
int z;
hist->x = 1;
}
だと思ったのですが、error C2440: '関数' : 'histgram *__w64 ' から 'histgram' に変換できません。
というエラーが出てしまいました。
0406デフォルトの名無しさん
2008/05/06(火) 14:36:01元のx=の式の一番右の+5がそのまま残っているだけ。
0407デフォルトの名無しさん
2008/05/06(火) 14:36:58構造体をそのまま渡したいのであれば、アンパサンドをつけてはいけません。
0408デフォルトの名無しさん
2008/05/06(火) 14:40:42つまり
#define ZETTAI(x) (x < 0) ? -(x) : x を
#define ZETTAI(x) ((x < 0) ? -(x) : x) に変えると
x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5; が
x = ((-9 - 50 < 0) ? -(-9 - 50) : -9 - 50) + 5; になるということですね?
#define ZETTAI(x) (((x) < 0) ? -(x) : (x)) だと
x = (((-9 - 50) < 0) ? -(-9 - 50) : (-9 - 50)) + 5; ですね!
理解できました
丁寧にありがとうございました
0409デフォルトの名無しさん
2008/05/06(火) 14:40:560410デフォルトの名無しさん
2008/05/06(火) 16:29:220411デフォルトの名無しさん
2008/05/06(火) 16:49:430412デフォルトの名無しさん
2008/05/06(火) 16:56:260413デフォルトの名無しさん
2008/05/06(火) 16:56:590414デフォルトの名無しさん
2008/05/06(火) 22:00:03悪いことはいわん。inline 使え。
#define は C言語ではない・・マクロは副作用があるからうっかり a++ なんて記述したら・・判るでしょ?
0415デフォルトの名無しさん
2008/05/06(火) 22:03:580416デフォルトの名無しさん
2008/05/06(火) 22:56:05そ、そんなこといいだしたら・・・今から始めるなら新しいツール使おうよって Linux も *BSD も Darwin も普通にクリアしてるし。Windows は今一つ判らないけどまさかそうじゃないの?
0417デフォルトの名無しさん
2008/05/06(火) 23:00:590418デフォルトの名無しさん
2008/05/06(火) 23:03:140419デフォルトの名無しさん
2008/05/07(水) 08:24:58入門書見て書いてるんですが
#include <stdio.h>
int astoi(const char s[])
{
int i;
int number = 0;
for(i = 0; s[i] >= '0' && s[i] <= '9'; i++)
number = 10 * number + (s[i] - '0');
return(number);
}
int main(void)
{
char x[]= "1234";
printf("%d", astoi(x));
return(0);
}
という文字型を数値に変えるプログラムで、
number = 10 * number + (s[i] - '0');
のところで (s[i] - '0') とあるんですがこれはどういう意味なんでしょうか?
この部分を消してみると、変な結果になることは確認したのですが・・・すみません教えてください。
0420デフォルトの名無しさん
2008/05/07(水) 09:07:44文字を数値へ変換してる
asciiコードとかがポイント
0421デフォルトの名無しさん
2008/05/07(水) 11:06:21>#define は C言語ではない
の意味を説明してくれないか?
0422デフォルトの名無しさん
2008/05/07(水) 11:12:54プリプロセッサの範疇だと言うことだろ。
0423デフォルトの名無しさん
2008/05/07(水) 12:12:00s[i]というのは文字コードが格納されている
'0'というのも、数値の0ではなくて文字0の文字コードが格納されている
'1'は'0'より文字コードが一つ大きいんだ
つまり'1'から'0'を引けば数値の1が返るという仕組み
0424デフォルトの名無しさん
2008/05/07(水) 13:12:40ASCIIコード表をみると423さんの言ってることがよりわかりやすい思うよ!
ASCIIのコード表はググってもあるだろうし、参考書にも載ってると思う。
0425デフォルトの名無しさん
2008/05/07(水) 13:49:070426419
2008/05/07(水) 14:49:58レスしてくれたみなさん、ありがとうございました!
0427デフォルトの名無しさん
2008/05/07(水) 15:49:27C言語の一部と考えてもいいんじゃないかな。
プリプロセッサがなきゃコメントすら書けん
0428デフォルトの名無しさん
2008/05/07(水) 15:50:27せめてGoogleくらいは味方にしておこう。
0429デフォルトの名無しさん
2008/05/07(水) 16:00:13コンパイラと完全に独立しているところ
0430デフォルトの名無しさん
2008/05/07(水) 16:11:510431デフォルトの名無しさん
2008/05/07(水) 16:13:360432デフォルトの名無しさん
2008/05/07(水) 19:53:41#include に変わるものは Cコンパイラに用意されてないし #ifdef のような部分も(あまり好きでないけど)うまく使うといろんな環境に対応したソースをまとめることができる・・
ただ #define で色々マクロ組むのはどうかな。
美しく無いばかりか副作用とバグを引き起こす危険な匂いすらある。置換されて結果コンパイラに渡るけど置換元がどうだったかをコンパイラは知らない・・いろんな落とし穴になる。普通に関数に書くのがいいと思う。
#define CONSTANT_VAL 50
ではな
const int CONSTANT_VAL = 50;
こう書けば char a = CONSTANT_VAL; とした時に警告があるし(アホなことした)と直ぐに気付くわけです。
0433デフォルトの名無しさん
2008/05/07(水) 20:00:28マクロは使わなくていいなら使わない方がいいってのは賛成だが、
C++ に比べて C はマクロを使わざるを得ない状況が多いのは確かだな。
0434デフォルトの名無しさん
2008/05/07(水) 20:01:59引数の型気にしなくてもいいマクロとか素敵じゃない?
0435デフォルトの名無しさん
2008/05/07(水) 20:03:47バグを生むことがあるってのがアレなんだろうね
0436デフォルトの名無しさん
2008/05/07(水) 20:10:130437デフォルトの名無しさん
2008/05/07(水) 20:14:03入門篇って書いてあるし、議論すればえ〜ねん
0438デフォルトの名無しさん
2008/05/07(水) 20:16:43私はこのレベルの警告を出すようにしてる。
>>434
そう、ただ型を気にしなくて言いというのは有る意味危険な感覚だと。
#defin abs(x) (x) < 0 ? -(x) : (x) とすれば int, long, double いずれも行けるけど
a = -3;
k = abs(a++);
結果は悲惨になるけど気付きにくいでしょ?
これは関数でなくマクロなんだと意識しなければいけない。何かスマートでないよね。
0439デフォルトの名無しさん
2008/05/07(水) 20:19:39C だとやっぱどうしてもマクロになっちゃうんだよなあ。
0441デフォルトの名無しさん
2008/05/07(水) 20:26:020442デフォルトの名無しさん
2008/05/07(水) 20:52:150443デフォルトの名無しさん
2008/05/07(水) 21:45:43それを言ったら無知と無理解はなんだってバグのもとだろ
0444デフォルトの名無しさん
2008/05/07(水) 21:51:07この世の60億分の1に過ぎない存在。万能、全知全能、
絶対権力者の人間なんて存在しない。
人間なんて脆い生き物だ。打ち所が悪ければすぐに死んでしまう。
そんなもん。だから、気ぃ張るなや、適当に生きろ。
どうせお前が強がっても、地球の運命までは変えられないから。
せいぜい、政府与党に不満を持って、反対票を民主党に入れるくらいしかぁ
出来んやろ?なっ?俺はずっと共産党に投票してたけどな。
0445デフォルトの名無しさん
2008/05/07(水) 22:09:35地道に関数でということかな
0446デフォルトの名無しさん
2008/05/07(水) 22:12:57同じ道路交通法が適用されている道で守るべきルールは同じさ。
それよりも、ドライバーの運転技術はいかがなものか?他に、
アクセルペダルを思いっきり踏み込めば、エンジンの性能が良い車の方が
加速性は良いが、燃費はかなり悪い。見た目じゃないぜ、人間は。
0447デフォルトの名無しさん
2008/05/07(水) 22:15:200448デフォルトの名無しさん
2008/05/07(水) 22:35:14カーソルの処理には何を使ったらいいのでしょうか?
ncursesはできれば使いたくないです。
ttp://oshiete1.goo.ne.jp/qa3121681.html
の方法だとカーソルキー押す度に"[b"などと出力されてしまいます。
よろしくお願いします。
0449デフォルトの名無しさん
2008/05/07(水) 23:12:49型を気にしないプログラムがどうなるのか?コンパイラが事前に警告してくれるのはありがたいと思わないと。
0450デフォルトの名無しさん
2008/05/07(水) 23:21:56昔な、変数を宣言しなくても使えるBASICてのがあってな、綴りのミスを目で探したよ。・
昔な、プロトタイプ宣言のないCコンパイラがあってな、引数の間違いを目で探したよ。
0451デフォルトの名無しさん
2008/05/07(水) 23:23:270452デフォルトの名無しさん
2008/05/07(水) 23:25:14マクロ使っても全然上級者には見えないから安心して関数を使おう
0453デフォルトの名無しさん
2008/05/07(水) 23:28:26まあマクロはその手段の一つなんだけれども。
0454デフォルトの名無しさん
2008/05/07(水) 23:31:13C++でも未だにマクロ使ってるんだけど
0455デフォルトの名無しさん
2008/05/07(水) 23:35:27ただ、初期化順でハマることはあるかもしれないね。
0456デフォルトの名無しさん
2008/05/07(水) 23:37:420457デフォルトの名無しさん
2008/05/07(水) 23:40:54void*をint*にキャストしてシフトすれば?
0458デフォルトの名無しさん
2008/05/07(水) 23:43:20何ビット幅でシフトしたいかをコンパイラが判断できない。必要な幅の型のポインタにキャストする必要がある。
0459デフォルトの名無しさん
2008/05/07(水) 23:57:36これって任意のバイト数を指定することはできないのかな?
mallocで指定しても駄目だったし無理か・・・
0460デフォルトの名無しさん
2008/05/07(水) 23:59:21> これって任意のバイト数を指定することはできないのかな?
意味不明
0461デフォルトの名無しさん
2008/05/08(木) 00:16:420462デフォルトの名無しさん
2008/05/08(木) 00:18:040463デフォルトの名無しさん
2008/05/08(木) 00:26:54それ、何のデータ?
0464デフォルトの名無しさん
2008/05/08(木) 00:28:380465デフォルトの名無しさん
2008/05/08(木) 00:35:13void*の参照先ですか?
intとかcharとか不定です
void*とsize_tを仮引数にして、型に関係なくビット表示するような関数を作りたいんですが・・・
0466デフォルトの名無しさん
2008/05/08(木) 00:38:59リトルエンディアン環境の場合、数十バイトだろうが
その全体でリトルエンディアンになることを仮定していいのか、
それとも4バイト単位でリトルエンディアンになることを仮定するのか。
0467デフォルトの名無しさん
2008/05/08(木) 00:44:48char*にキャストして一バイトごと表示しろよ
0468デフォルトの名無しさん
2008/05/08(木) 00:51:12リトルエンディアンだとおもう
よくわからないから続きはwebで勉強してくるわ
>>467
おk試してみる
0469デフォルトの名無しさん
2008/05/08(木) 01:05:04できない
ビットシフトは組み込み整数型(のビット長)に対してしか保証されていない
どうしてもやりたいなら自力でそのような関数を作るしかない
0470デフォルトの名無しさん
2008/05/08(木) 01:11:230471デフォルトの名無しさん
2008/05/08(木) 01:16:35んなアホな
charに分割したとしても、左右両端からあふれたビットは結局手動で詰めざるを得ないだろ
0472デフォルトの名無しさん
2008/05/08(木) 01:20:12それだったらlhaの解説書見れば早いと思う
0473デフォルトの名無しさん
2008/05/08(木) 01:27:33結局できるんじゃないか
0474デフォルトの名無しさん
2008/05/08(木) 01:39:36「ビットシフト」の言葉の食い違いだったようだ
俺が考えてたのは組み込みのビットシフトのことね
そっちは概念としてのビットシフトだよな
0475デフォルトの名無しさん
2008/05/08(木) 01:41:10なんじゃこれは?ト
0476デフォルトの名無しさん
2008/05/08(木) 02:38:42static void mera(const char *);
このとき
1) void mera(const char *merami)
2) void mera(const char* merazooma)
1だけのはずが
2のようなものも通ってしまうのはどうして?
どちらでも良いという意味ならば、どちらが推奨なの?
また、
static void bagi(const char ****);
このとき
1) void bagi(const char ****bagima)
2) void bagi(const char**** begiragon)
どちらも警告W8075程度で通してしまうのはどうなの?
BCC5.5.1
0477デフォルトの名無しさん
2008/05/08(木) 02:57:27> 1) void mera(const char *merami)
> 2) void mera(const char* merazooma)
1) は C に多く、2) は C++ でみます。
どっちでも大差ないと思います。
0478デフォルトの名無しさん
2008/05/08(木) 02:59:490479デフォルトの名無しさん
2008/05/08(木) 03:00:44おお、ありがとう。
0480デフォルトの名無しさん
2008/05/08(木) 03:20:48char *p も char* p も意味は同じ
スタイルについては、変数の宣言時にたとえば
char* p, * q;
などとするのが不自然という理由で
char *p, *q;
を推奨する人は多い
0481デフォルトの名無しさん
2008/05/08(木) 03:31:59一方で char* p; を推奨する人は、変数名はあくまでpであるから
それがchar*であることを示すためにそうすると主張することが多い
ただし*はcharやint、あるいはstaticやconstのようにデータ型を修飾するものではなく
あくまで変数を修飾するものである(Cの変数宣言構文は [データ型] [変数名];
だから int const n, m; とは書けても char* p, q; とは書けない)ので、
構文的には変数名側に寄せることが正しい扱いであると言える
0482デフォルトの名無しさん
2008/05/08(木) 03:37:26○ただし*はcharやintのようなデータ型、あるいは
0483デフォルトの名無しさん
2008/05/08(木) 04:08:15また関数の仮引数リストにおいては与えられるものがおそらく配列である場合には、それを明示したいならchar str[]と書いてもいい
0484デフォルトの名無しさん
2008/05/08(木) 04:16:420485デフォルトの名無しさん
2008/05/08(木) 07:37:37×begiragon
○bagicross
なんで誰も指摘しないんだよー
0486デフォルトの名無しさん
2008/05/08(木) 13:10:17エスケープシーケンスを正しく読めばいいんじゃないかな
確か0x1bだったっけ? この次の文字は制御文字だから、それに応じた処理をすればいい。
カーソル位なら入力されたコードをじっくり眺めればすぐに分かると思うよ
0487448
2008/05/08(木) 19:42:21そうだったのかー!!
あれはエスケープシーケンスと制御文字が組み合わさってたん
ですね。だからあのプログラムで[Aとかが表示された訳だ。
どうもです。
0488デフォルトの名無しさん
2008/05/08(木) 19:43:210489デフォルトの名無しさん
2008/05/08(木) 19:46:040490デフォルトの名無しさん
2008/05/08(木) 19:46:11http://msdn.microsoft.com/ja-jp/library/cc429740.aspx
0491デフォルトの名無しさん
2008/05/08(木) 21:34:04freeにサイズを書かなくてなんでサイズがわかるんでしょうか。
#include <stdio.h>
void main()
{
char *c;
c = malloc( 10 );
if( c == NULL )return;
strcpy( c , "aiue" );
c--;//ひとつ前のポインタ(サイズは書いていないようだ)
c--;//ここにもサイズはない
c++;c++;//元に戻す
free( c );
c = NULL;
return;
}
0492デフォルトの名無しさん
2008/05/08(木) 21:38:08管理テーブルが別にあるから
0494デフォルトの名無しさん
2008/05/08(木) 22:04:260495デフォルトの名無しさん
2008/05/08(木) 22:13:520496デフォルトの名無しさん
2008/05/08(木) 22:40:41ちなみに確保した前の番地に文字数があるのでは?と仮定してそれを確認するなら
int* ip = (int*)c;
long* lp = (long*)c;
こうしておいて
printf("%d : ", *(ip - 1)); // c 先頭から int 分戻った場所から数値として表示
printf("%ld : ", *(lp - 1)); // c 先頭から long 分戻った場所から数値として表示
こんな風に確認するというのもあるよ(どちらにしても結果は外してるけど)
0497デフォルトの名無しさん
2008/05/08(木) 22:50:03> ポインタの前ではなくほかのところにあったんですね。
それは処理系依存。
ポインタの前にある場合もあるだらう。
0498デフォルトの名無しさん
2008/05/08(木) 23:11:550499デフォルトの名無しさん
2008/05/08(木) 23:13:38空きメモリを探す処理とfreeの分、
CPU時間の無駄遣いになることを気にしたほうがいい気がする。
0500デフォルトの名無しさん
2008/05/08(木) 23:22:31ところでポインタのサイズ管理テーブルへのアクセスってどうやるの?
0501デフォルトの名無しさん
2008/05/08(木) 23:23:16mallocのソースでも眺めてみれ
0502デフォルトの名無しさん
2008/05/08(木) 23:25:09アルゴリズム辞典とか眺めるの?
0503デフォルトの名無しさん
2008/05/08(木) 23:29:090504デフォルトの名無しさん
2008/05/08(木) 23:29:32○スタック状
0505デフォルトの名無しさん
2008/05/09(金) 01:50:05良いソースを読むことだと思う
どの言語でも同じだと思うが
0506デフォルトの名無しさん
2008/05/09(金) 01:55:07それを作るのにまだ足りないものがあるならそれを学べばOK
足りてるなら作ろう
0507デフォルトの名無しさん
2008/05/09(金) 13:06:55その過程で、どのようにすれば目的を達成できるのかを考える能力を身に着けること
言語仕様がわかってても要求を実現できない新人多すぎ
コーダーじゃねぇんだからさ
0508デフォルトの名無しさん
2008/05/09(金) 17:58:14N個の要素はそれぞれ、確率pで0は1に、1は0に変わってしまい、また確率eで情報が消失する。
(消失した情報は2を代入すればよい)
上記の手続きを行い、画面にベクトルv'を出力(消失した要素はXを出力)
というプログラムを整数の配列と擬似乱数で作りたいんですが、↓では数字がおかしくなってしまいます。
環境はunixのgcc 4.0.2です、初心者ですがご指導よろしくお願いします。
なお、ここではN=5、e=0.05、p=0.1としています。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5 ;
int main(void)
{
int v[N], u[N] ;
int i ;
float e, p, x ;
for (i = 0; i <= N-1 ; i++ )
{
printf("v[%d]=",i) ; scanf("%d",&v[i]) ;
while (v[i] && v[i]!=1)
{ printf("v[%d]=",i) ; scanf("%d",&v[i]) ; }
}
0509508続き
2008/05/09(金) 17:58:40p = 0.1 ; e =0.05 ;
for(i = 0 ; i <= N-1 ; i++)
{
srand(time(NULL));
x = (float)rand()/ 32768.0 ;
/* xは0以上1未満の乱数 */
if( x < p )
{ u[i] = (v[i]+1) % 2 ;}
/* xが0以上p未満の時、受信に誤りが生じる */
else if( x >= p && x < p+e )
{ u[i] = 2 ;}
/* xがp以上p+e未満の時、情報は消失(2を代入) */
}
printf("(") ;
for(i = 1 ; i <= 7 ; i++)
{
if (u[i] == 2)
printf("X ") ;
else
printf("%d ",u[i]) ;
}
printf(")\n") ;
return 0 ;
}
0510509訂正。失礼しました
2008/05/09(金) 18:01:25for(i = 0 ; i <= N-1 ; i++)
{
srand(time(NULL));
x = (float)rand()/ 32768.0 ;
/* xは0以上1未満の乱数 */
if( x < p )
{ u[i] = (v[i]+1) % 2 ;}
/* xが0以上p未満の時、受信に誤りが生じる */
else if( x >= p && x < p+e )
{ u[i] = 2 ;}
/* xがp以上p+e未満の時、情報は消失(2を代入) */
}
printf("(") ;
for(i = 0 ; i <= N-1 ; i++)
{
if (u[i] == 2)
printf("X ") ;
else
printf("%d ",u[i]) ;
}
printf(")\n") ;
return 0 ;
}
0511デフォルトの名無しさん
2008/05/09(金) 18:31:39srand をループで毎回実行しない。最初の1回だけで良い。
32768.0 などという数字を直に書かず、(RAND_MAX+1.0) と書く方が良い。コンパイラによって rand() の最大値は異なる。
x<p でもなく x>=p && x<p+e でもない場合、u[i] の値は?
0513508
2008/05/09(金) 18:38:06u[i] = v [i] ;
ですね。なんという初歩的なミス、ありがとうございました。
0514デフォルトの名無しさん
2008/05/09(金) 18:47:040515デフォルトの名無しさん
2008/05/09(金) 19:57:02http://pc11.2ch.net/test/read.cgi/tech/1209810861/
で手伝っていただけるとありがたいのですが、いかが?
0516デフォルトの名無しさん
2008/05/09(金) 21:39:27http://www.amazon.co.jp/Programming-Language-Version-Prentice-Software/dp/0131103628
C言語の決定版と言われるこの本、どうお考えでしょうか。
あと、これのC++版ありますが、ページ数が思いっきり増えてますよね。
こちらもできたら評価をお願いできればと思います。
0517デフォルトの名無しさん
2008/05/09(金) 22:54:01標準Cの数倍以上の分量はこなさないと無理。標準は共通部分だけの勉強だけ
0518デフォルトの名無しさん
2008/05/09(金) 23:06:49それ買っておきなさい。
ネットのは怪しいのが多い。
しかし洋書はたけえな。
0519デフォルトの名無しさん
2008/05/09(金) 23:09:36お前がどうしたいのかによる、まぁその本は教養というか理解が深まるとかそういうのだ
0520デフォルトの名無しさん
2008/05/09(金) 23:43:44スレチだけど、洋書は輸出費を考慮しても.comの方が安い場合があるぜ。
時間と多少の手間を気にしないんならこっちもチェックしておくといい。
ttp://www.amazon.com/Programming-Language-Prentice-Hall-Software/dp/0131103628/ref=sr_1_1?ie=UTF8&s=books&qid=1210344092&sr=8-1
0521デフォルトの名無しさん
2008/05/10(土) 00:04:24#include によってもたらされる先輩方の資産と情報に振り回されない
目的をもってプログラムに取り組む
・・・
例えて、辞書を丸暗記するのか、あるいは目的を持って辞書を引くのか・・というのに通じると。
ライブラリ群の知識や使い方に重点を置くより「こうしたい関数は無いか?」とする切り口の方がいいのではないかなと。
どちらにしても有る程度は知識得ないといけない訳だけど。
0522デフォルトの名無しさん
2008/05/10(土) 00:05:420523デフォルトの名無しさん
2008/05/10(土) 00:06:11それは初心者向けでも玄人向けでもない微妙な本なんであんまりすすめない
推薦図書スレ>ttp://pc11.2ch.net/test/read.cgi/tech/1209441159/l50
感想スレ>ttp://pc11.2ch.net/test/read.cgi/tech/1064681919/l50
0524デフォルトの名無しさん
2008/05/10(土) 00:10:000525デフォルトの名無しさん
2008/05/10(土) 00:14:210526デフォルトの名無しさん
2008/05/10(土) 00:16:21それが可能なのがCの最大の利点であり最大の欠点だから。
0527デフォルトの名無しさん
2008/05/10(土) 00:20:16その上でひたすら「目的意識を持って」コードを書きつつCFAQを流し読めば十分
0528516
2008/05/10(土) 08:23:53自分はプログラミングはちょっとやったことありますが、C言語に
ついてはさっぱりです。プログラミング言語Cがあれば何もいらない、
って話を聞いたんですけど、ちょっと古い本だしどうなんだろうなぁと。
だけど、薄い本なんで、これでC言語が概観できるというなら欲しいと
思ってます。
>>523
こういうスレがあったんですね。ありがとうございます。
0529デフォルトの名無しさん
2008/05/10(土) 11:02:190530デフォルトの名無しさん
2008/05/10(土) 16:04:28\ で複数行まとめて書くとインデントが使えず見辛い。
別の方法を考えたところ
1) printfで一行ずつ
printf("黒い0服\n");
printf("お茶を1杯\n");
2) fputsで一行ずつ
fputs("赤い2んじん\n", stdout);
fputs("橙色の3かん\n", stdout);
3) 配列に格納してwhile puts
char *memo[] = {
"黄色い4んごう",
"五月みどり",
""
};
char **memop = memo;
while(**memop)
puts(*memop++);
(1) や (2) は解かりやすいが、(3) の方が見やすい。
ただ (3) のままだと宣言初期化時しか格納できない。
・分岐後に文字列を格納したい。
・strcpy は使用を控えたい。
悔しいのでスマートな書き方教えてくれ。
0531デフォルトの名無しさん
2008/05/10(土) 16:07:53"お茶を1杯\n");
でいいよ
0532デフォルトの名無しさん
2008/05/10(土) 16:08:31マジおすすめ
0533デフォルトの名無しさん
2008/05/10(土) 16:09:19%入ってるとまずいからだけど
0534デフォルトの名無しさん
2008/05/10(土) 16:12:280535デフォルトの名無しさん
2008/05/10(土) 16:26:360536デフォルトの名無しさん
2008/05/10(土) 16:37:01上記の様にバックグラウンドプロセスABC に、パラメータを与えて実行させるのは
どの様にすればいいのですか?
0537デフォルトの名無しさん
2008/05/10(土) 16:43:210538デフォルトの名無しさん
2008/05/10(土) 16:45:35あぁ , 無しで繋げられるのだっけか。
でも , をつけてしまいやすいので使い方だけ覚えとく。
>>532,533
メモっとく。
>>534
puts("青6し");
puts("むらさき7ぶ");
か
puts(
"むらさき7ぶ\n"
"灰ヤー"
);
のような感じか。
もう少し考えてみるわ、サンクス。
0539デフォルトの名無しさん
2008/05/10(土) 16:50:350540デフォルトの名無しさん
2008/05/10(土) 16:54:17俺は「青二才のろくでなし」って覚えているんだけど。
0541デフォルトの名無しさん
2008/05/10(土) 18:44:45ttp://www.uploda.org/uporg1415339.c.html
上記のようなコードを書いたのですが、
bの領域を解放するときに
”Windows によって aaaaa.exe でブレークポイントが発生しました。ヒープが壊れていることが原因として考えられます。aaaaa.exe または読み込まれた DLL にバグがあります。”
のようなエラーが出てしまいます・・・。。。
確保していない領域にアクセスし、それをフリーしようとしたときにおこるエラーみたいなことがググったら書いてあったのですが、
double** b; が確保されている領域と、callocで追加確保された領域が連続でないということでしょうか?
またそのせいでこのエラーがおこっているのでしょうか?
ご教授願います。よろしくお願いします。。。
0542デフォルトの名無しさん
2008/05/10(土) 18:50:19> memmove(b, a, sizeof(a[0])*sizeof(a[0][0]));
これのせいで同じ領域を二回 free している
0544デフォルトの名無しさん
2008/05/10(土) 20:42:06何がやりたいかによる
a[y][x] に格納されている double の値をコピーしたいのであれば
for(y=0;y<N;y++) memmove(b[y], a[y], N*sizeof(a[0][0]));
0545541
2008/05/10(土) 20:45:190546デフォルトの名無しさん
2008/05/10(土) 20:47:01V / / _,, ァ=ニニ:} _
.V /,.ィ"f= <r'ニ三{ |_ ┐ _l_ l
'vf^<''" 弋z.ミ'テtフ |_ Х □_ 匚 L | У
〉!ト _ i{ ´ ̄r' =|'
./ェ゙‐ェi. 、__`_ヤ ( その通りでございます )
./iュ.Hヽ.、 ゙,ニ/
-^ ー'-.、,i._`ヽ,.仁リ
ー - .、 /、
0547デフォルトの名無しさん
2008/05/10(土) 20:50:49なるほどです。つながりました。ありがとうございました><
0548デフォルトの名無しさん
2008/05/11(日) 01:50:19char (*pacX)[3];
とした場合、pacXは3要素のchar配列へのポインタになると思いますが、
このような変数「の配列」を以下のように動的に確保するとします。
int iNum = 2;
char (*pacX)[3] = new (char)[iNum][3];
この場合、ポインタ変数が2つ(iNum分)確保されるのでしょうか。それとも、それらが指す3要素のchar配列2つ分のメモリまで確保されるのでしょうか?
0549デフォルトの名無しさん
2008/05/11(日) 01:52:50typedef char CharArray3[3];
CharArray3* pacX = new CharArray3[iNum];
0550デフォルトの名無しさん
2008/05/11(日) 01:56:230551デフォルトの名無しさん
2008/05/11(日) 02:13:33すみません、確かにそうですね。
>>549
なるほど。。。元の質問で言えば後者の「それらが指す3要素のchar配列2つ分のメモリまで確保される」ということなのですね?
イメージ的には 「char aacX[2][3]」と同じ分のメモリが確保されて、さらにいえば
delete [] pacX;
とすることで開放されるということよろしいでしょうか?
で
0552デフォルトの名無しさん
2008/05/11(日) 02:24:13そういうこと。
0553デフォルトの名無しさん
2008/05/11(日) 02:28:42ありがとうございました。
0554デフォルトの名無しさん
2008/05/11(日) 04:05:19その記述ちょっと気色悪い。一歩間違うと関数へのポインターと見間違えちゃうし。
int (*func)(int k); // 関数へのポインター
int a1(int k) { printf("%d¥n", k * 5); return k; }
int a2(int k) { printf("%d¥n", k / 5); return k; }
int main()
{
func = &a1;
func(k);
func = &a2;
func(k);
}
みたいな・・・
普通に char *a[3]; でいいと思うけど。
0555デフォルトの名無しさん
2008/05/11(日) 04:06:45内容が理解できない人は黙っておいた方がいいよ。
0556デフォルトの名無しさん
2008/05/11(日) 06:00:32char (*a)[3] 配列のポインタ
0557デフォルトの名無しさん
2008/05/11(日) 10:22:400558デフォルトの名無しさん
2008/05/11(日) 10:33:060559デフォルトの名無しさん
2008/05/11(日) 10:40:200560デフォルトの名無しさん
2008/05/11(日) 10:43:33どの言語が用意されているかというのは、Web制作板的な視点じゃないか
プログラム板的には、どの言語で実装するのが適切かという話題だと思ってたが。
0561デフォルトの名無しさん
2008/05/11(日) 10:47:22とあったからそれに沿うように答えただけなのだが。
性能的には何ら問題ないと思う、とつけたほうがよかったかな?
0562デフォルトの名無しさん
2008/05/11(日) 11:06:01というところまで考え出すと、
結局 >>558 に行き着くんじゃないかと思う。
0563デフォルトの名無しさん
2008/05/11(日) 11:41:06お願いします。
0564デフォルトの名無しさん
2008/05/11(日) 11:45:28わかりました
消えてください
0565デフォルトの名無しさん
2008/05/11(日) 11:48:200566デフォルトの名無しさん
2008/05/11(日) 12:00:340567デフォルトの名無しさん
2008/05/11(日) 12:22:18max(0, max(3, max(1, max(4, max(7, max(2, max(8)))))));
><
0568デフォルトの名無しさん
2008/05/11(日) 14:42:42その数字をまたある数で割って割り切れたらその値を出力して
割り切れなかったら余りだけをまた別の小さい値で割りきれるか
って繰り返して最終的には割り切れるプログラムを作りたいんですが・・・
例えば1020を500で割ると2余り20で2が出力され
余り20を10で割って2が出力されるみたいな
ヒントでもいいんでお願いしますm(_ _)m
0569デフォルトの名無しさん
2008/05/11(日) 15:23:440570デフォルトの名無しさん
2008/05/11(日) 15:24:561020を1020で割って余り0で終了、じゃだめなの
0571デフォルトの名無しさん
2008/05/11(日) 15:25:52ある数って何だよ
入力した値か?
0572デフォルトの名無しさん
2008/05/11(日) 15:28:12速度的にはアレなんじゃね?
スクリプト系のmod_*みたいな仕組みってCでは一般的でないし。
2chは、やってるみたいだけど。
0573デフォルトの名無しさん
2008/05/11(日) 16:10:07ユークリッドの互除法?
0574デフォルトの名無しさん
2008/05/11(日) 16:12:50説明が下手ですいません
レジのおつりを渡す要領で
適当な値を入力して500、100、10、1で各々割って何が何枚必要か求めたいんです
0575デフォルトの名無しさん
2008/05/11(日) 16:14:36それをそのままコードに落とせばいいだけだろ
0576デフォルトの名無しさん
2008/05/11(日) 16:19:330577デフォルトの名無しさん
2008/05/11(日) 16:19:49#include<stdio.h>
int main() {
static const int coin[] = {500,100,50,10,5,1,0};
int price, i;
printf("金額は?");
scanf("%d", &price);
for(i = 0; coin[i]; i ++) {
printf("%d円玉が%d枚\n", coin[i], price / coin[i]);
price %= coin[i];
}
}
0578デフォルトの名無しさん
2008/05/11(日) 16:19:57迷惑かけてすいませんでした
0579デフォルトの名無しさん
2008/05/11(日) 16:20:390580デフォルトの名無しさん
2008/05/11(日) 16:31:40エクセルで作成したファイルをスターファックスで
VBAなどで自動送信出来ませんか?
キーボードマクロなるフリーソフトを見つけましたが
自分ではうまく設定できません
イメージは以下の感じです
�@送信ファイルをエクセルで作成
�AVBAでスターファックスを起動
�Bキーボードマクロ等で送信先を自動入力
�Cエクセル画面に戻る
初心者丸出しですいませんが宜しくお願いします
0581デフォルトの名無しさん
2008/05/11(日) 16:31:490582デフォルトの名無しさん
2008/05/11(日) 16:58:37こんなソフト作ってくださいスレに行きやがれですぅ
0584デフォルトの名無しさん
2008/05/11(日) 18:17:49実績ファイルにある「商品コード」が、商品コードマスタに存在するかどうか
をチェックし、あったらその後の処理へ、なかったらエラーを出すといったプログラムを作りたいと考えてます。
(売上ファイル.csv)
顧客コード,商品コード,数量
10000,2544,2
12111,2566,5
12546,2354,8
(商品コードマスタ.csv)
商品コード,商品名,単価
2544,aaaaa,1000
2354,bbbbb,1500
このとき、c言語ではどういった関数を使って
どういった流れで考えるとよいでしょうか?
例えば下名はアクセスを使ったことあるので
アクセス(VB)でのテーブル同士の比較だったら、
if 商品コード(売上ファイルTBL)=商品コード (商品コードマスタTBL)
をレコードのEOFまで繰り返す、という処理でいいと思うのですが、
c言語の場合、しかもカンマ区切りcsvファイルの処理の場合、
どういった方向で考えたらいいのかということを知りたいです。
参考書を見たところ、ファイルポインタをつかう、fopen関数をつかうfgets関数で1行読み込む
といった機能を使うのかなと思いましたが、商品コード部分のみを取り出して比較するやりかたがわかりません。
(また、全てのデータの桁数は変わる可能性があります)
あつかましいですが、よろしければサンプルコードも提示して
いただけたらありがたいです。
0585側近中の側近 ◆0351148456
2008/05/11(日) 18:28:17(っ´▽`)っ
char shohinCode[256];
char shohinName[256];
int tanka;
fscanf(fp, "%s,%s,%s", shohinCode, shohinName, &tanka);
0586側近中の側近 ◆0351148456
2008/05/11(日) 19:25:26(っ´▽`)っ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *elem1, const void *elem2);
int existInMaster(void);
typedef struct shohinM{
char shohinCode[256];
char shohinName[256];
int tanka;
} shohinMaster;
int main(void)
{
int line;
line = existInMaster();
if(line == 0){
printf("エラーはありません\n");
}
else{
printf("%d行目にエラーがあります\n", line);
}
return 0;
}
(続く)
0587側近中の側近 ◆0351148456
2008/05/11(日) 19:26:07int existInMaster(void)
{
int returnCode = -1;
FILE *fp = NULL;
char line[1024];
int lineCount = 0;
shohinMaster *sm = NULL;
char shohinCode[256];
char kokyakuCode[256];
int suryo;
int count = 0;
int i;
fp = fopen("./商品コードマスタ.csv", "r");
fgets(line, sizeof(line), fp); /*1行目は見出し*/
while(fgets(line, sizeof(line), fp) != NULL){
sm = (shohinMaster *)realloc(sm, sizeof(sm[0]) * (count + 1));
sscanf(line, "%[^,],%[^,],%d", sm[count].shohinCode, sm[count].shohinName, &(sm[count].tanka));
count++;
}
fclose(fp);
qsort(sm, count, sizeof(sm[0]), cmp);
(続く)
0588側近中の側近 ◆0351148456
2008/05/11(日) 19:26:48fp = fopen("./売上ファイル.csv", "r");
fgets(line, sizeof(line), fp); /*1行目は見出し*/
while(fgets(line, sizeof(line), fp) != NULL){
lineCount++;
sscanf(line, "%[^,],%[^,],%d", kokyakuCode, shohinCode, &suryo);
for(i = 0; i < count; i++){
if(strcmp(sm[i].shohinCode, shohinCode) == 0){
break;
}
if(strcmp(sm[i].shohinCode, shohinCode) > 0){
returnCode = lineCount;
goto END;
}
}
if(i == count){
returnCode = lineCount;
goto END;
}
}
END:
return returnCode;
}
int cmp(const void *elem1, const void *elem2){
return strcmp(((shohinMaster *)elem1)->shohinCode, ((shohinMaster *)elem2)->shohinCode);
}
0589側近中の側近 ◆0351148456
2008/05/11(日) 19:35:31さあ感謝しなさい☆
(っ´▽`)っの足を舐めなさい☆
0590デフォルトの名無しさん
2008/05/11(日) 20:03:040591デフォルトの名無しさん
2008/05/11(日) 20:16:410592側近中の側近 ◆0351148456
2008/05/11(日) 20:46:21>>586-589には
リソース解放漏れがたくさんあるから注意してね☆
関数existInMasterのEND:の直後に
fclose(fp);
if(sm != NULL){
free(sm);
}
を加えるんだ☆
0593側近中の側近 ◆0351148456
2008/05/11(日) 20:48:10(っ´▽`)っ
無意味にコテ!?
(っ´▽`)っはコテつけるのが当たり前なの!
http://www.google.co.jp/search?lr=lang_ja&num=50&ie=utf-8&oe=utf-8&q=%22%E2%97%860351148456%22
0594584
2008/05/11(日) 21:03:04ちなみにこのままコピペしてとりあえず実行してみようと思ったら
100個を超えるエラーが出たのですが、そのままではいけないのですかね?
とりあえず、解読動くかどうかより
解読して、流れを理解することをがんばります
0595側近中の側近 ◆0351148456
2008/05/11(日) 21:05:25(っ´▽`)っ
インデントに全角スペース使ってるからね。
半角スペース、タブ文字は、2chでは表示されないの。
コピーしたら全角スペースを全て半角スペースに置換してね。
0597584
2008/05/11(日) 21:24:18すみません、もうひとつ。
今解読中なのですが、理解の手助けに
・処理の流れ
・このプログラムの入力と、出力値
など、簡単に教えていただけませんか?
本当の初心者ですみません。
0598デフォルトの名無しさん
2008/05/11(日) 21:26:570599デフォルトの名無しさん
2008/05/11(日) 21:31:20それを言うならHTMLの仕様だろ、と。
まぁ、変数宣言の変数名を揃えようとする辺りでお察しだから。
0600デフォルトの名無しさん
2008/05/11(日) 21:34:460601デフォルトの名無しさん
2008/05/11(日) 21:50:09自分がどういうプログラム要求したか覚えてる・・?
見ていくと何となく流れがつかめるでしょ
どこまで理解したか言わないと答え丸写しで理解した気になる子になるよ
初心者≠免罪符
0602側近中の側近 ◆0351148456
2008/05/11(日) 22:39:49/*
*戻り値:
*エラーなし:0
*エラーあり:エラーがある行番号(見出し行を除く)
*/
int existInMaster(void)
{
int returnCode = -1; /*戻り値*/
FILE *fp = NULL; /*ファイルポインタ*/
char line[1024]; /*ファイル読み込みバッファ*/
int lineCount = 0; /*行番号*/
shohinMaster *sm = NULL; /*商品マスタ配列*/
/*以下、売上ファイルレコード格納用変数*/
char shohinCode[256]; /*商品コード*/
char kokyakuCode[256]; /*顧客コード*/
int suryo; /*数量*/
int count = 0; /*商品マスタ配列サイズ*/
int i; /*ループカウンタ*/
/*商品コードマスタを全て読み込み、商品マスタ配列に格納する*/
fp = fopen("./商品コードマスタ.csv", "r");
fgets(line, sizeof(line), fp); /*1行目は見出し*/
while(fgets(line, sizeof(line), fp) != NULL){
sm = (shohinMaster *)realloc(sm, sizeof(sm[0]) * (count + 1));
sscanf(line, "%[^,],%[^,],%d", sm[count].shohinCode, sm[count].shohinName, &(sm[count].tanka));
count++;
}
fclose(fp);
0603側近中の側近 ◆0351148456
2008/05/11(日) 22:40:30qsort(sm, count, sizeof(sm[0]), cmp);
/*売上ファイルを1行ずつ読み込み、商品コードを商品マスタ配列と照合する*/
fp = fopen("./売上ファイル.csv", "r");
fgets(line, sizeof(line), fp); /*1行目は見出し*/
while(fgets(line, sizeof(line), fp) != NULL){
lineCount++;
sscanf(line, "%[^,],%[^,],%d", kokyakuCode, shohinCode, &suryo);
for(i = 0; i < count; i++){
if(strcmp(sm[i].shohinCode, shohinCode) == 0){
break;
}
/*商品マスタ配列は商品コードの昇順に並べている*/
if(strcmp(sm[i].shohinCode, shohinCode) > 0){
returnCode = lineCount;
goto END;
}
}
/*商品マスタ配列にない場合、行番号を返す*/
if(i == count){
returnCode = lineCount;
goto END;
}
}
END:
return returnCode;
}
/*商品マスタ配列を並べる時、商品コードの昇順に並ぶようにする*/
int cmp(const void *elem1, const void *elem2){
return strcmp(((shohinMaster *)elem1)->shohinCode, ((shohinMaster *)elem2)->shohinCode);
}
0605側近中の側近 ◆0351148456
2008/05/11(日) 22:52:56売上ファイルも商品コードの昇順に並べると
もっといい感じになるかもね。
0606デフォルトの名無しさん
2008/05/11(日) 23:32:17行いたいと考えてます。文字列の中に入っている単語数は不定とします。
char str_str[] = "str1 str2 ・・・・ strN";
今現在、次に書き込むソースの様な処理で、一つずつ単語を読み込んでいます。
ここで、質問なのですが、sscanf等を使用してもっと上手に処理することはできないでしょうか?
以下の様にダミー変数を利用する方法は考えたのですが、入っている単語数が不定
なため、どうも不恰好なソースになってしまいます。
sscanf(str_str,"%s %s %s %s %s",str1, str2, str3, dummy, dummy);
すいませんが、アドバイスよろしくお願いします。
0607606
2008/05/11(日) 23:33:02int main(void)
{
char src_str[]="str1 str2 str3 str4 str5";
char *next;
char *buff=src_str;
while((next=strsplit(buff, " "))!=NULL){
// 空白文字が2個以上続いた場合はbuffにはナル文字が入っている
if(buff[0] != '\0')
fprintf(stderr, "buff=%s, next=%s\n",buff, next);
buff=next;
}
return 0;
}
// 文字列をdelimstrを区切り文字列として分割し、区切後の文字列へのポインタを返す
char *strsplit(char* str,const char* delim_str)
{
char* delim_point = strstr(str,delim_str);
const size_t delim_len = strlen(delim_str);
size_t i;
if(delim_point == NULL) return NULL;
else {
*delim_point = '\0';
for(i=0;i<delim_len;i++) delim_point++;
}
return delim_point;
}
0608606
2008/05/11(日) 23:35:17int main(void)
{
char src_str[]="str1 str2 str3 str4 str5";
char *next;
char *buff=src_str;
while((next=strsplit(buff, " "))!=NULL){
// 空白文字が2個以上続いた場合はbuffにはナル文字が入っている
if(buff[0] != '\0')
fprintf(stderr, "buff=%s, next=%s\n",buff, next);
buff=next;
}
return 0;
}
// 文字列をdelimstrを区切り文字列として分割し、区切後の文字列へのポインタを返す
char *strsplit(char* str,const char* delim_str)
{
char* delim_point = strstr(str,delim_str);
const size_t delim_len = strlen(delim_str);
size_t i;
if(delim_point == NULL) return NULL;
else {
*delim_point = '\0';
for(i=0;i<delim_len;i++) delim_point++;
}
return delim_point;
}
0609デフォルトの名無しさん
2008/05/11(日) 23:38:060610デフォルトの名無しさん
2008/05/11(日) 23:38:19sscanf(str, "%s%n", ...)
0611606
2008/05/11(日) 23:40:42入っている部分で、処理を実施していると考えてください。
fprintf(stderr, "buff=%s, next=%s\n",buff, next);
また、src_strの内容が変わってしまう点は仕様として、その様にしてます。
よろしくお願いします。
0612606
2008/05/11(日) 23:59:40確かに、この処理内容だと、strtokで十分ですね・・・。文字列群で区切るstrでは
不便な事が多く、strsplitという文字列パターンで区切る関数を作成しており、何も考えず
そのまま使用していました。ご指摘ありがとうございます。
>610
すいません、その処理はダミー変数を利用する方法とは異なる方法なのでしょうか?
つまり、下記の様な処理とは別の処理ということなのでしょうか?
sscanf(str_str,"%s %s %s %s %s",str1, str2, str3, dummy, dummy);
0613デフォルトの名無しさん
2008/05/12(月) 00:39:570614デフォルトの名無しさん
2008/05/12(月) 00:42:50最近は lagged Fibonacci なこともあるようだ。
0615デフォルトの名無しさん
2008/05/12(月) 00:45:03どういう方法でなければならないという規定はない。
現実には線形合同法がよく使われている。
0616デフォルトの名無しさん
2008/05/12(月) 00:48:45大概そうですよ
0617デフォルトの名無しさん
2008/05/12(月) 00:50:38レスありがとうございます。
c言語で書くと
a[i+1]=a[i]*j%10*10*10*10
で良いのですか?(a[i+1]=j*a[i] (mod10^4))
0618デフォルトの名無しさん
2008/05/12(月) 00:54:19a[i+1]=a[i]*j%(10*10*10*10)
というか
a[i+1]=a[i]*j%10000
でいいんじゃないのか
0619デフォルトの名無しさん
2008/05/12(月) 00:55:540から1の範囲の乱数を合同乗算法で書くにはどのように書けばいいですか?
>>618 ばれたか・・・正直kingはウザイと思っています。
0620デフォルトの名無しさん
2008/05/12(月) 00:58:13それに何の反応もせずに「質問を変えます」はないだろ。社会常識的な意味で。
0621デフォルトの名無しさん
2008/05/12(月) 00:59:29すみません・・・
0622デフォルトの名無しさん
2008/05/12(月) 01:00:11double にキャストして n で割ればいいんじゃない
0623デフォルトの名無しさん
2008/05/12(月) 01:02:03レスありがとうございます
a=rand()/(RAND_MAX+1.0);
としてもいいのですが>>618さんの方法で書くことはできませんか?
0624デフォルトの名無しさん
2008/05/12(月) 01:04:35b[i+1]=a[i+1]/(10000.0);
0625デフォルトの名無しさん
2008/05/12(月) 01:32:58一応書いてみたのですがエラーが出てしまいます
どこがおかしいですか?ちなみに円周率を求めるプログラムです
#include <stdio.h>
int main(void)
{
double i,max;
double x,y,pi;
int a[1000],j;
double b;
double c=0,d=0;
max=100;
a[0]=9454;
j=9456;
for(i=0;i<=max;i++) {
a[i+1]=a[i]*j%10000;/*ここでエラーが出ます。*/
b[i+1]=a[i+1]/(10000.0);
if((b[i+1]*b[i+1]+b[i]*b[i])<=1.0) {
c+=1.0;
}
else{
d+=1;
}
}
pi=4*c/(c+d);
printf("%f\n",pi);
return 0;
}
0626デフォルトの名無しさん
2008/05/12(月) 01:36:24char youbi[7][] = {"日曜日", "月曜日",....}
と書きました。
これだと関数が呼ばれるたびに変数を作って文字列を入れてることになりますよね?
頻繁に呼ぶ関数にこういうことすると速度などに悪い影響ありますか?
0627デフォルトの名無しさん
2008/05/12(月) 01:36:320628626
2008/05/12(月) 01:37:21char youbi[][7] です。
0629デフォルトの名無しさん
2008/05/12(月) 01:38:28iをintで宣言すること。
>626
ある場合もあるし、無い場合もあるが、大抵の場合気にするほどの差ではない。
0630デフォルトの名無しさん
2008/05/12(月) 01:38:30|はなんていうんだっけ?
なかなか検索ひっかからないんだよね
0631デフォルトの名無しさん
2008/05/12(月) 01:39:40そうですね・・・すみません
でも、 配列または、ポインタでない変数に添字が使われました。とエラーがでます・・・
どこを直せばよいですか?
0632デフォルトの名無しさん
2008/05/12(月) 01:39:530634デフォルトの名無しさん
2008/05/12(月) 01:41:24そこまでエラーメッセージ読んでてわからないほうがどうかしてる
0635デフォルトの名無しさん
2008/05/12(月) 01:42:22それくらいコンパイラが懇切丁寧に教えてくれてるだろうに無視すんなよ
頼むからエラーをこぴぺしてくれ
0636デフォルトの名無しさん
2008/05/12(月) 01:42:39配列でもポインタでもないものに添え字が使われたから。あとは行番号を見ること。
念のために言っておくが添え字とは[?]の部分のこと。
0637デフォルトの名無しさん
2008/05/12(月) 01:43:07double b;
0638デフォルトの名無しさん
2008/05/12(月) 01:44:55ただのcharの配列にしか過ぎないのかっての
0639デフォルトの名無しさん
2008/05/12(月) 01:45:36あ、bを配列で宣言するのを忘れてました・・・
ありがとうございます
やっぱりプログラムは苦手だなあ
数学板の回答者に戻ります
0640デフォルトの名無しさん
2008/05/12(月) 01:46:400641デフォルトの名無しさん
2008/05/12(月) 02:46:410642デフォルトの名無しさん
2008/05/12(月) 05:18:500643デフォルトの名無しさん
2008/05/12(月) 06:01:050644デフォルトの名無しさん
2008/05/12(月) 06:28:38配列に保存してどうすんだよw
0645↑
2008/05/12(月) 06:56:000646デフォルトの名無しさん
2008/05/12(月) 07:36:33staticを付けるといい。
ついでにconstも付けるとさらにいい。
0647デフォルトの名無しさん
2008/05/12(月) 07:49:12%nの仕様は調べた?
>>626
static const char * const youbi[] = {"sunday", "monday", ...}
0648デフォルトの名無しさん
2008/05/12(月) 09:15:06char *youbi[7] = {"日曜日", "月曜日",....}
好みの問題ですかねぇ・・・
0649デフォルトの名無しさん
2008/05/12(月) 11:15:18それだと毎回youbiを更新するコストが発生するし、constによる保護ができない。
ついでに言えば、態々7という定数を埋め込む意義が全くない。
0650デフォルトの名無しさん
2008/05/12(月) 12:37:550651デフォルトの名無しさん
2008/05/12(月) 12:44:160652デフォルトの名無しさん
2008/05/12(月) 12:50:33つーか、入門者がパフォーマンスを気にするな。
0653デフォルトの名無しさん
2008/05/12(月) 13:07:40そうだとしても実測してみなきゃわかんないしね
0654デフォルトの名無しさん
2008/05/12(月) 13:11:25もし頻繁に呼んでるとしたら、いっそ廃止して
その上の(おそらくループの本体がある)関数で文字列をautoに積んで
インラインで処理させたほうが速いだろうね
0655デフォルトの名無しさん
2008/05/12(月) 13:19:000656デフォルトの名無しさん
2008/05/12(月) 13:22:590657デフォルトの名無しさん
2008/05/12(月) 13:26:35少なくともそのコンパイラにとっては違うからコンパイルできなかったのだろう。
0658デフォルトの名無しさん
2008/05/12(月) 15:05:58ファイル名の大文字小文字を区別する環境としない環境があるから、それも書いてくれ
0659デフォルトの名無しさん
2008/05/12(月) 15:16:090660デフォルトの名無しさん
2008/05/12(月) 15:24:22static const char * const youbi[]
って何でconst2つも付けるのかが分からないんですが
static const char * youbi[] じゃあダメなんですか?
あと、普通の変数でも
static const int const とかやる必要はあるんですか?
0661デフォルトの名無しさん
2008/05/12(月) 15:30:52youbiの先の文字列が書き換え不可能
static char * const youbi[]
youbiが書き換え不可能
static const char * const youbi[]
両方
0662デフォルトの名無しさん
2008/05/12(月) 15:36:31は "火曜日" って文字列を "火曜"
0663デフォルトの名無しさん
2008/05/12(月) 15:38:16static const char *youbi[]
は "火曜日" って文字列を "火曜" に変えたりするのが不可能で
static char * const youbi[]
は youbi[1] に別の文字列のポインタを渡すのが不可能になる
って事なんですか?
0664デフォルトの名無しさん
2008/05/12(月) 15:54:23const char 型のポインタ(文字列定数)を入れる youbi配列で、新たに文字列定数のポインタを入れることは出来て、
char * const youbi[] は
youbiの中のポインタ変数固定だから、文字列そのものは書き変えられてもポインタの指す先は変えられないって事なんですね
やっと理解出来ました
ありがとうございます
0665デフォルトの名無しさん
2008/05/12(月) 16:40:42double f(double x)
{
double y;
y=(((3.1*x-1.8)*x+5.7)*x+1.0)*x-6.2;
return (y);
}
main()
{
double x,y;
int i;
for(i=-20;i<=20;i++){
x=0.5*i;
y=f(x);
printf("x=%7.3f y=%12.3f\n",x,y);
}
}
このプログラムのyの値の総和を計算するプログラムを作れ。
これをだれかお願いします。
0666デフォルトの名無しさん
2008/05/12(月) 16:42:08わかりましたちょっとまっててください
0667デフォルトの名無しさん
2008/05/12(月) 16:46:32>>658 指定の仕方は大丈夫なはず コンパイラはMinGW これでいいのかな?
>>659 Sunってコンパイラ名・・? コンパイラによって違うってこと?
0668デフォルトの名無しさん
2008/05/12(月) 16:55:130669デフォルトの名無しさん
2008/05/12(月) 17:15:43>>>659 Sunってコンパイラ名・・? コンパイラによって違うってこと?
Javaを開発し、OpenOfficeを提供している世界最大級のコンピュータソフト・ハード兼業企業。
古くから、SunOSというUnix系のOSを作っている。
0670デフォルトの名無しさん
2008/05/12(月) 17:55:41勉強になりました
0671デフォルトの名無しさん
2008/05/12(月) 19:47:16a += b; みたいな
0672デフォルトの名無しさん
2008/05/12(月) 19:58:27windows(BCC Developer)だと、ファイルをオープンする事ができなくなりました
ファイルパスを絶対パスにしたりと、試行錯誤しましたが解決しません
どうか、解決法をお願いします
ソース
void read_area(struct prefecture *are)
{
int i;
FILE *fpa;
if(( fpa = fopen("menseki.txt" , "rw")) == NULL)
{
printf("ファイルが見つかりませんでした\n");
exit(1);
}
for(i=0;i<47;i++)
{
fscanf(fpa,"%s %d",are->name,&are->area);
are++;
}
}
txtファイルは、Debugフォルダとその上のファルダに置いています
0673デフォルトの名無しさん
2008/05/12(月) 20:00:38ソースファイルと同じ場所に置けばいけるはずだけど
0674デフォルトの名無しさん
2008/05/12(月) 20:01:550675デフォルトの名無しさん
2008/05/12(月) 20:05:20日本語読めますか?
>>672
それが原因かどうかは判らんが、"rw"は間違い。
実装によってはファイルが空になってもおかしくない。
>>671
できません。配列の要素ごとの足し算ならループから書くことになります。
配列の連結と言うことなら、malloc(), realloc()を使うことになるのでその辺りを先ず勉強する必要あり。
0676デフォルトの名無しさん
2008/05/12(月) 20:06:59それだけの日本語ではさっぱりですよ。
たぶんこういうこと?
for ( int i = 0; i < SIZE; i++ ) {
a[ i ] += b[ i ];
}
0677デフォルトの名無しさん
2008/05/12(月) 20:07:58ファイルの置き場所に問題があるのかと思い、ソースがある場所を含め、
プログラムに関係ありそうなフォルダ全てに置いたのですが、解決しませんでした…
これは、BCCの環境設定?を変更・追加する必要があるのでしょうか?
>>675
Linuxで動いたのは運が良かったからかもしれません…
指摘していただいた点について、もう一度解決法を探してみます
0678677
2008/05/12(月) 20:16:39よく考えてみれば、書き込みする必要がないので、"w"は不要ですね…
>>673-675
つまらない質問にも関わらず、素早い対応して頂き、
本当にありがとうございます
0679デフォルトの名無しさん
2008/05/12(月) 20:27:05そうだけど
構造体のときは不便だなって思った
0680デフォルトの名無しさん
2008/05/12(月) 20:28:310681デフォルトの名無しさん
2008/05/12(月) 20:54:06そんなのラッパー関数かいときゃ次からは楽じゃないか。
0682デフォルトの名無しさん
2008/05/12(月) 21:25:44なれるよ
数学なんて実に簡単なことだ
0683デフォルトの名無しさん
2008/05/12(月) 22:34:040684デフォルトの名無しさん
2008/05/12(月) 22:34:47ぐぐれ
0685デフォルトの名無しさん
2008/05/12(月) 22:39:47マイクロソフトが無料で配布してるよ
0686デフォルトの名無しさん
2008/05/12(月) 22:52:43これですか?どれをダウンロードすればいいんでしょうか
0687デフォルトの名無しさん
2008/05/12(月) 22:53:37visualC++だ
そしてとっととうせろ
0688デフォルトの名無しさん
2008/05/12(月) 22:54:42登録とかめんどくさいからBCC使うといいよ
俺はvisual C++使ってるけど
0689デフォルトの名無しさん
2008/05/12(月) 23:01:500690デフォルトの名無しさん
2008/05/12(月) 23:02:36コンパイラは要らなかったような…
0691デフォルトの名無しさん
2008/05/12(月) 23:03:17いらない
0692デフォルトの名無しさん
2008/05/12(月) 23:06:200693デフォルトの名無しさん
2008/05/12(月) 23:12:22isoを落とせば
0694デフォルトの名無しさん
2008/05/12(月) 23:13:130695デフォルトの名無しさん
2008/05/13(火) 08:04:28単純にC言語のプログラムを作りたい時はどうしたらいいんですか?
0696デフォルトの名無しさん
2008/05/13(火) 08:08:04お使いのソフトウェアのスレへどうぞ。
0697デフォルトの名無しさん
2008/05/13(火) 08:14:19誤 C++のプログラム作ろうと思ったらVBの作成画面みたいなんですけど
正 VisualC++でC++プログラム作ろうと思ったらVBの作成画面みたいなんですけど
Win32コンソールアプリケーションを選べ
0698デフォルトの名無しさん
2008/05/13(火) 08:19:27それだとスレ違い。ここはCスレ。
0699デフォルトの名無しさん
2008/05/13(火) 13:56:55以後はconstに扱われるような変数を宣言することはできますか?
0700699
2008/05/13(火) 13:59:490701デフォルトの名無しさん
2008/05/13(火) 14:34:04実装によっては可能かもしれないが、直接に行うことは一般的にはできない。
constな変数はそれが作成されたときに(関数の外で宣言される変数ならプログラムの開始時、あらゆる関数の外で)初期化されて
以後のコード中では変更できなくなるため、実質的にコンパイル時に解決可能な式でしか初期化できない。
ポインタを間にはさめば、以下のような方法で似たようなものを間接的に宣言することができる。
value.c)
static int value;
const int * const vp=&value;
value.h)
extern const int * const vp;
#define VALUE (*vp)
このようにしておけば、グローバル変数(のふりをしているマクロ)VALUEの実体であるvalueは、少なくともvalue.c以外で変更されることはない。
0702デフォルトの名無しさん
2008/05/13(火) 15:17:07当該の変数をstaticにしてほかのファイルからは見えないようにするとか、
const変数を動的初期化できるC++へ移ってしまうとかが考え付く。
0703デフォルトの名無しさん
2008/05/13(火) 15:32:16{
static int value=-1;
if(value < 0){ /* 最初に呼び出されたときに初期化される */
:
:
}
return value;
}
#define VALUE GetValue()
な手か
0704デフォルトの名無しさん
2008/05/13(火) 16:14:38void hoge(double** matrix)
{}
等として受け取ったdouble**の配列の要素数をその関数内で知るすべがあったらご教授願います。
0705デフォルトの名無しさん
2008/05/13(火) 16:24:570706デフォルトの名無しさん
2008/05/13(火) 16:33:22それを検出することで長さを知ることができる
そうでなければ無理
0707デフォルトの名無しさん
2008/05/13(火) 17:00:51name="hoge.txt";
みたいに代入したいんですが、エラーになります。
*name="hoge.txt";
でもできません。どうやるんでしたっけ?
0708デフォルトの名無しさん
2008/05/13(火) 17:04:40strcpy(name, "hoge.txt") とか?
strncpy(name, sizeof(name) - 1, "hoge.txt")か
0709デフォルトの名無しさん
2008/05/13(火) 17:07:16すいません。わからないので教えていただけるとありがたいです
0710デフォルトの名無しさん
2008/05/13(火) 17:24:03Cでは配列は二級オブジェクト(メモリ上に存在するが演算の対象にならない)で、
配列名は大抵の場合配列そのものではなく配列の先頭要素のアドレスを意味する。
アドレスに代入することはできないので、name="hoge.txt"; のような文は無効になる。
配列名に対して直接=演算子が使えるのは、宣言時に初期化するときだけである。
配列に対して任意の配列をコピーするにはmemcpyやmemmove、
あるいは配列が'\0'で終わるcharの配列(文字列)である場合にはstr〜系の関数を使う。
0711デフォルトの名無しさん
2008/05/13(火) 17:43:39strcpy(name, "hoge.txt");
2)
strncpy(name, sizeof(name)-1, "hoge.txt");
name[sizeof(name)-1]='\0';
3)
name[0]='\0';
strncat(name, sizeof(name)-1, "hoge.txt");
1)はもっとも単純明快だが、もしnameに割り当てられている領域が
コピーしようとしている文字列より小さかったらたぶん問題がおきる
そのような場合に文字列を切り詰めて安全を保証したいなら2)または3)を使う
0712デフォルトの名無しさん
2008/05/13(火) 17:51:330713デフォルトの名無しさん
2008/05/13(火) 18:00:36横見だが 2 および 3 の引数の並びちがうぢゃろ。
strncpy(name, "hoge.txt", sizeof(name) - 1);
name[sizeof(name) - 1] = 0;
0714デフォルトの名無しさん
2008/05/13(火) 22:24:120715デフォルトの名無しさん
2008/05/13(火) 22:24:590716デフォルトの名無しさん
2008/05/13(火) 22:26:550717デフォルトの名無しさん
2008/05/13(火) 23:18:040718デフォルトの名無しさん
2008/05/13(火) 23:20:16それともオーバーフローでもおkなの?
0719デフォルトの名無しさん
2008/05/13(火) 23:21:040720デフォルトの名無しさん
2008/05/13(火) 23:22:55ラン姉ちゃんの方でした、すまそ
0721デフォルトの名無しさん
2008/05/13(火) 23:25:09桁数勘定して sprintf(b, "%100s", s); って, 書けば OK なんじゃないの?
0722デフォルトの名無しさん
2008/05/13(火) 23:32:56バーロー
0723デフォルトの名無しさん
2008/05/13(火) 23:55:15---
#include<stdio.h>
int ary_[]={1,2,4,8};
int main(int argc,char** argv){
int* ary=ary_;
int i=(*ary++) ^ (*ary++);
printf("%d\n",i);
return 0;
}
---
これの実行結果がゼロになるのはなんでだぜ?
VC9EE v15.00.21022.08 最適化無指定、/O1 で発現 VC9SP1βはまだ試してない
0724デフォルトの名無しさん
2008/05/13(火) 23:57:31未定義動作だからどうなっても文句は言えない
むしろどうなると思ったんだよ・・・
0725デフォルトの名無しさん
2008/05/13(火) 23:59:100726デフォルトの名無しさん
2008/05/14(水) 00:01:58いや、そういう意味じゃなくて・・・それらの問題点は
プログラムそのものがトラブルを起こしてしまう仕組みを持っていることであって
問題の無い範囲内でユーザが使う分にはなんら不具合には気づかない、起こらないわけで・・・
0727デフォルトの名無しさん
2008/05/14(水) 00:06:18え。一発目の*ary++が1に、二発目の**ary++が2に、…
…いや、最適化で順序がどうなっても、i==3にはなると思ったんだ
/Fa によると、どちらも*aryになり、そのあとで2回ary++が発生してた
どこで未定義なんだろう…。
// ここでリロード
>>725
ヒントありがとう ぐぐったら一発 必ずしも都度都度副作用が発生するわけじゃないのか
アマだが、聞かねば一生のバグ撒き散らしになるところだったよ 恥晒してよかった
0728デフォルトの名無しさん
2008/05/14(水) 00:21:130729デフォルトの名無しさん
2008/05/14(水) 00:22:15いやそれを書き込む意味が和漢ね
0730723
2008/05/14(水) 00:28:52これを考えてみろ。ってことだろう
実際にVC9EEにつっこんで結果を見てみた
ary = ary;
ary++;
になった 俺には示唆に富んでると思う
0731デフォルトの名無しさん
2008/05/14(水) 00:29:43未定義だけど、1^1で0になってる気がする
0732デフォルトの名無しさん
2008/05/14(水) 00:38:23調べたら色々書いてあった
0733デフォルトの名無しさん
2008/05/14(水) 01:24:07式の評価によってオブジェクトに格納された値を変更する回数は
高々一度だけでなければならない。更に、変更前の値は、
格納される値を決定するためだけにアクセスしなければならない。
0734デフォルトの名無しさん
2008/05/14(水) 01:25:370735デフォルトの名無しさん
2008/05/14(水) 06:32:45文字列を式として扱って計算結果を出力する
というような便利な関数ってあるのでしょうか?
0736デフォルトの名無しさん
2008/05/14(水) 07:26:22まぁ、unix系ならシェルで計算すれば済むけどね。
0737デフォルトの名無しさん
2008/05/14(水) 07:30:100738デフォルトの名無しさん
2008/05/14(水) 09:05:47変数が入るようなやつなら、いろいろあるけど、いっぺんPerlとか使うといいと思うよ
Perlで書く。のではなくて、perl*.dllをつつくように書く あれはインタフェースがCだから。
セキュリティの確保とか結局いろいろ大変になるだろうけど、示唆に富んでていいと思う
0739デフォルトの名無しさん
2008/05/14(水) 10:10:26ttp://www.google.com/codesearch?hl=ja&q=+lang:c+eval+show:LKM9fPKCrz0:r3iT8J84R1w:wri6GBkgM20&sa=N&cd=1&ct=rc&cs_p=http://ftp.gnu.org/gnu/glibc/glibc-2.3.6.tar.bz2&cs_f=glibc-2.3.6/dlfcn/eval.c#l121
LGPLだけど、Google Code Searchで検索すると60行程度で実装している例がある。
0740デフォルトの名無しさん
2008/05/14(水) 13:49:08「関数の中で宣言した値は、関数の実行が終わった後どうなるのか?たとえば二度目に関数を呼んだとき値を読んでみたら
どうなるのか?」
って問題が出たんだけど答えどころか質問の意味すらわかりません。よかったら教えてください。
0741デフォルトの名無しさん
2008/05/14(水) 13:53:490742デフォルトの名無しさん
2008/05/14(水) 13:54:37void hoge(void)
{
int a; ← �A
a = 2;
a = a * 2;
} ←�@
void main (void)
{
hoge();
hoge();
}
�@関数終わったらaはどうなる?
�A2回目のhoge呼び出しの時、このaに4が入っていると思うか?
0743デフォルトの名無しさん
2008/05/14(水) 13:56:53なんだかなぁって思う問題
0744デフォルトの名無しさん
2008/05/14(水) 14:32:20こんな早く答え返ってくるとは思ってませんでした。
有難う、みんな優しいですね。
>>742
�@無くなる?
�A…4じゃないんですか?
0745デフォルトの名無しさん
2008/05/14(水) 14:35:20できれば、hoge()を呼び出す階層を変えて試すのもやってみて
(別の関数を呼び出しその中からhoge()を呼ぶ)
0746デフォルトの名無しさん
2008/05/14(水) 14:48:58ご丁寧に有難うございました。
0747デフォルトの名無しさん
2008/05/14(水) 15:16:09たまたま4が入ってたらどうするんだ
0748デフォルトの名無しさん
2008/05/14(水) 15:25:10だから深さも変えるといいかな、と。
アドレス表示させる手もあるが。
最適化されてると混乱しそう。
0749デフォルトの名無しさん
2008/05/14(水) 15:41:12とりあえず試してうまくいったから、なんてのを放置すると
そのうち必ずなにかやらかす
0750デフォルトの名無しさん
2008/05/14(水) 15:42:09�@無くなる
�A何が入っているかわからない
0751デフォルトの名無しさん
2008/05/14(水) 15:50:04関数の中でstaticをつけずに宣言した変数は、その関数の呼び出し中にのみ存在する変数(auto変数)となる。
宣言した関数から抜けた時点で、変数のために使われていた記憶領域は解放されて意味のないものになる。
このような変数は、明示的に int a=2; などのように初期化しないかぎり、
その宣言時における値は常に不定(何が入っているかわからない)である。
このような変数の中身を、明示的に値を与える前に使ってはいけない。
0752デフォルトの名無しさん
2008/05/14(水) 15:50:57今知りたいのはこの質問の意図するところだべ。
0753デフォルトの名無しさん
2008/05/14(水) 15:55:28意図がわかんないってのは理解してないからだ
0754デフォルトの名無しさん
2008/05/14(水) 16:00:37なお、staticをつけて宣言した変数は、プログラムが実行を開始してから終了するまで存在し、
その開始時に一度だけ、明示的な初期化式があればその値に、なければ「=0;」とか「={0};」と
書いたかのように初期化される。
0755740
2008/05/14(水) 23:45:33その通りです。
まだ講義で習ってない範囲(質問する前は習ってない範囲
かすらもわかりませんでした)で何も知りませんでした。
今回皆さんに教えて頂いたお陰でまだ何となくですが、
わかるようになりました。
あとは講義で理解していこうと思います。
補足してくださった方々もわかりやすい説明有難うございました!
ここ勉強になりますね。
0756デフォルトの名無しさん
2008/05/15(木) 01:50:36宿題スレで頻繁に見られる課題です。実装したくなったときに参考にしてください。
基本形
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6550.txt
逆ポーランド電卓で(基本形の応用)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6551.txt
他にもいろいろ回答されていましたが、私の手元ににはありません。
0757デフォルトの名無しさん
2008/05/15(木) 02:16:27忠告だが
その講義の教官の言うことは眉唾して聞いたほうがいい
教えてないことを聞くとかありえねー
0758デフォルトの名無しさん
2008/05/15(木) 02:56:17話聞いてなかったんだろどうせ
0759デフォルトの名無しさん
2008/05/15(木) 02:56:17両方の言い分を聞かないと分からないぞ
ここで教官の言い分を聞く事はまずないだろうけど
0760デフォルトの名無しさん
2008/05/15(木) 02:57:06前半と後半が支離滅裂なんだがw
0761デフォルトの名無しさん
2008/05/15(木) 02:58:18日本語は難しいです
0762デフォルトの名無しさん
2008/05/15(木) 03:03:26日本語読めない人?
0763デフォルトの名無しさん
2008/05/15(木) 03:06:17小学校じゃあるまいし
0764デフォルトの名無しさん
2008/05/15(木) 03:08:530765デフォルトの名無しさん
2008/05/15(木) 03:11:29「眉に唾する」ならいいのかな?
0766デフォルトの名無しさん
2008/05/15(木) 03:13:520767デフォルトの名無しさん
2008/05/15(木) 03:27:57volatile ULONG Value; // レジスタ(外部から書き換えられる)
void main(void)
{
Value = 0;
while(Value == 0){ ←これ
;
}
}
これを下記のようにポインタを経由すると最適化対象になってしまうのでしょうか?
(このポインタもvolatileをつける必要がある?)
volatile ULONG Value; // レジスタ(外部から書き換えられる)
void main(void)
{
Value = 0;
ULONG* pV = &Value;
while(*pV == 0){ ←これ
;
}
}
0768デフォルトの名無しさん
2008/05/15(木) 03:29:31volatile 修飾する必要があります
0769デフォルトの名無しさん
2008/05/15(木) 10:13:29volatileをつけなければ最適化対象になります。
が、最適化対象になるとValueを外部から書き換えるまでループを続けるという動作を必ずしなくなるわけではありません。
つまり、volatileをつけなくてもあなたの希望する動作をする可能性はあります。
つまり、volatileをつける必要があるとは言い切れません。
0770「言い切れない」は詭弁だ
2008/05/15(木) 12:16:11それは普通、つける必要があると言いますね。
0771デフォルトの名無しさん
2008/05/15(木) 12:22:570772デフォルトの名無しさん
2008/05/15(木) 13:40:39++
ビルド毎に出力を確認すればおk てか、Cの話でなくなるが、テストで引っ掛けろ
0773デフォルトの名無しさん
2008/05/15(木) 22:38:30解説サイトと本どっちがいいの?
色々な掲示板みてたら両方とも良いって書いてたからわからなかった。
0774デフォルトの名無しさん
2008/05/15(木) 22:39:35それで不満に感じたら本を買えば良いんじゃないかな
0775デフォルトの名無しさん
2008/05/15(木) 22:49:12その方法が一番いいかな〜
とりあえずググってサイトさがしてみる。
サイトって「C言語 入門」でググって上らへんのなら大丈夫だよね?
0776デフォルトの名無しさん
2008/05/15(木) 23:32:030777デフォルトの名無しさん
2008/05/15(木) 23:39:22まだ買わなくてよかった〜
ありがとう
それみて本選ぶよ
0778デフォルトの名無しさん
2008/05/16(金) 05:49:52嘘を書いている、情報が古すぎる、環境依存なコード、誉められないコーディングスタイルetc...
あと、サイトにすることで有利な点は、疑問点があればここにアドレス張り付ければ一応質問できることかな?
書籍だと同じ本持ってる人間以外には内容をいちいち書いてもらわないと質問できないから。
0779デフォルトの名無しさん
2008/05/16(金) 09:21:08ソートに関しては、すでにどの手法が高速か分かりきっているが
教本によって記述が違っているものも。中には、あれ?って思うものも。
0780デフォルトの名無しさん
2008/05/16(金) 09:31:06頭が悪いせいか理解しようとしても意味がよくわかりません。
誰か詳しい解説をお願いします。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6540.txt
0781デフォルトの名無しさん
2008/05/16(金) 09:32:000782デフォルトの名無しさん
2008/05/16(金) 10:38:15自分で理解するには向いてないと思う
つか>>780のソースは宿題スレではかなり親切な方だと思うけどな
一応コメントついてるし
0783デフォルトの名無しさん
2008/05/16(金) 11:46:34数字の文字4個の配列を使ってる。そこだろう
数字 + '0' <-> 数字の文字
理解するところまで宿題なんなら、ヒントだと思って考えてみるよろし
0784デフォルトの名無しさん
2008/05/16(金) 13:24:00何がわからないのか具体的に説明してくれないと解説のしようもない。
0785デフォルトの名無しさん
2008/05/16(金) 14:41:36ただ逆に数値(1〜9)を””で囲んで文字列とする場合、内部データは本来の数字にNullが付いた物でなく、ASC�Uコードで
あれば文字の1なら10進数の49(16進数の10X3)に変換されるという認識でよいのでしょうか?
又、普通の文字ならは該当する10進数・16進数に変更はなくNuLLが付くだけなのでしょうか?数値ま場合だけデータそのものが
例えば1なら実質先程言った49に変換されるという認識でよろしいのでしょうか?どうかご教授願います。
0786デフォルトの名無しさん
2008/05/16(金) 14:44:370787デフォルトの名無しさん
2008/05/16(金) 14:48:13Windowsでは見る機会がないでしょうねぇ〜〜〜禿藁
だからLinuxを使えとあれほどry
0788デフォルトの名無しさん
2008/05/16(金) 15:08:13C言語では(エスケープシーケンスを除き) ど ん な 文 字 も そのマシン上での文字集合に対応するデジタルな値として扱われる。
ASCII文字集合を使用しているすべてのマシンで、"1"は0x31 0x00で、" "は0x20 0x00である。
数字であろうと何であろうと扱いに差はない。
0789デフォルトの名無しさん
2008/05/16(金) 15:09:340790デフォルトの名無しさん
2008/05/16(金) 15:11:010791デフォルトの名無しさん
2008/05/16(金) 15:11:26さすがにgdbに張り合ううつもりはないが、ntsdは結構遊べる
0792デフォルトの名無しさん
2008/05/16(金) 15:12:46CにおいてNULLと書いた場合通常はヌルポインタ定数を表すマクロNULLのことをさす。
ASCIIのNULのことを言う場合にはNULまたはヌル文字と表記するべきである。
ついでに、ASCIIは A.S.C.I.I.(American Standard Code for Information Interchange) であってASC�Uではない。
0793デフォルトの名無しさん
2008/05/16(金) 15:14:25mpeg とかかまってると, Windows でも強制的に見なきゃいけない機会は結構あるが…
0794デフォルトの名無しさん
2008/05/16(金) 15:14:32お前が出直して来い
0795デフォルトの名無しさん
2008/05/16(金) 15:35:15とおっしゃりたいのですか?
どっちでもいいじゃん
0796デフォルトの名無しさん
2008/05/16(金) 15:42:56区別がついてないのはお前の方じゃねーかって話
0797デフォルトの名無しさん
2008/05/16(金) 15:44:35煽りたいだけならよそでやれ
0798デフォルトの名無しさん
2008/05/16(金) 15:46:11……
0799デフォルトの名無しさん
2008/05/16(金) 15:46:33相手すんなよ、つけあがるから
0800デフォルトの名無しさん
2008/05/16(金) 15:47:50駄目だこりゃ。
0801デフォルトの名無しさん
2008/05/16(金) 15:49:15またいつものアレか
0802デフォルトの名無しさん
2008/05/16(金) 15:54:28違いですかwww
0803デフォルトの名無しさん
2008/05/16(金) 16:06:33http://yutori.2ch.net/test/read.cgi/news4vip/1210919591/
1 以下、名無しにかわりましてVIPがお送りします。 [] 2008/05/16(金) 15:33:11.35 ID:2pPh1TlA0
自分でソフト作って株の売買自動でやらせてる
種が50万しかなかったし初めて2月目だから
一日三万がいいとこだし金おろせないけど
まあ親元だし食ってくのには困らんので満足してる
しかし欝だ・・・やることなくて寝てばっかり・・
0804雷
2008/05/16(金) 16:28:57*印を出力するプログラムを作成してください
整数型の変数nに7〜15の値を設定する
変数nの値により,以下のような表示を行う(n=7の場合)
for文(またはwhile文)とif文の組合せである
カウンタ変数が偶数か奇数かで判断
printf文は
printf(“n=%d\n”,n); // nの値を出力
printf(“ “); // 空白を出力
printf(“*”); // *印を出力
printf(“\n”); // 改行する
だけを使用する
n=7
* * * *
* * *
* * * *
* * *
* * * *
* * *
* * * *
上の条件でこういう風に表示するプログラムを書いてください
0805デフォルトの名無しさん
2008/05/16(金) 16:37:310806デフォルトの名無しさん
2008/05/16(金) 16:38:00>>1
0808デフォルトの名無しさん
2008/05/17(土) 10:33:01最上位ビットが符号で使われるのはわかるんだけど、それ以外がよくわからない。
小数点以下の数値をどうやって保持してるの?
0809デフォルトの名無しさん
2008/05/17(土) 10:42:45http://ja.wikipedia.org/wiki/IEEE_754
実装がこれに準拠しているかどうかは別問題
0810デフォルトの名無しさん
2008/05/17(土) 11:12:45ありがとう。指数表記を使ってるのがわかって疑問が解けました。
0811デフォルトの名無しさん
2008/05/17(土) 11:40:19double x, y;
}vector_t;
typedef struct{
vector_t vector;
double length;
}edge_t;
edge_t *edge_alloc(char *filename, int *edge_num)
{
int i, point_num;
vector_t *point;
edge_t *edge_area, *edge;
FILE *fp;
途中略
edge_area=malloc(sizeof(*edge)*(point_num+1));
edge=&edge_area[1];
edge[-1]=edge[point_num-1];
*edge_num=point_num;
return edge;
}
このソースなんですが、edge[-1]とかいう場所に代入していいんですか?
0812デフォルトの名無しさん
2008/05/17(土) 12:17:490813デフォルトの名無しさん
2008/05/17(土) 12:32:03?
0814デフォルトの名無しさん
2008/05/17(土) 12:36:280815デフォルトの名無しさん
2008/05/17(土) 13:01:27しかし、配列の中(最初かもしれないし、最後かもしれないし、途中かもしれない)を
指し示すポインタedgeの、そっからn番目、とも読める。
もちろん、edge[-1]の存在は、ちゃんと担保されてないといけないけど、
文法的にというか、読み方的には、そういう意味
てことで、>>814
0816デフォルトの名無しさん
2008/05/17(土) 13:07:28なので文法的に問題は無い
大丈夫かどうかは指してる先がちゃんとあるのかの問題になる
0817デフォルトの名無しさん
2008/05/17(土) 13:10:360818デフォルトの名無しさん
2008/05/17(土) 13:14:13上の数レス読んで理解できないならあきらめろ。
0819デフォルトの名無しさん
2008/05/17(土) 13:14:29edge=&edge_area[1];
の部分で、配列のコピーが発生したりは、してないからね
強いて言うなら、位置情報を代入している。それも、「一個先の位置」ね。
0820デフォルトの名無しさん
2008/05/17(土) 13:18:524進数なら
1 2 3
1 1 2 3
2 2 10 12
3 3 12 21
こんな感じです。お願いします。
0821デフォルトの名無しさん
2008/05/17(土) 13:19:31宿題スレへどうぞ
0822デフォルトの名無しさん
2008/05/17(土) 13:20:364進数なら
1 2 3
1 1 2 3
2 2 10 12
3 3 12 21
こんな感じです。お願いします。
0823デフォルトの名無しさん
2008/05/17(土) 13:22:050824デフォルトの名無しさん
2008/05/17(土) 13:22:101 1 2 3
2 2 10 12
3 3 12 21
こうしたいんだろ?
それはともかくとっとと消えろよ
0825デフォルトの名無しさん
2008/05/17(土) 13:22:36何の言語を勉強すれば、よろしいでしょうか?
個人的には、C++がいいかと。
求人案件などを見ると、求人が多いから。
(ちなみに、どんなソフトを作ろうとしているかというと。
動画編集ソフトを作ろうとしています。)
0826デフォルトの名無しさん
2008/05/17(土) 13:23:43スレタイを百回音読して涙を流しながら去れ
0827デフォルトの名無しさん
2008/05/17(土) 13:25:41さーせn
0828デフォルトの名無しさん
2008/05/17(土) 15:46:46その関数名を教えて下さい (BasicのINKEY$見たいな物)
0829デフォルトの名無しさん
2008/05/17(土) 16:29:04GetAsyncKeyState
0830デフォルトの名無しさん
2008/05/17(土) 17:32:37どうも!、Dos用の関数でお願いします。
0831デフォルトの名無しさん
2008/05/17(土) 17:58:24あるいは、Win95以降のコマンドプロンプト用なのか?(たぶんこれ)
まさかとは思うが、/subsystem:native用か?
どれにしてもこのスレのレベルなのかって感じではあるが、
まずそこらはっきりさせようぜ
0832デフォルトの名無しさん
2008/05/17(土) 18:35:06Winでもrxvt(WinのLinux console)に居ます
GCCなら簡単なんですが、、Borland のlibrary読めば解るんだけど
今、手一杯で時間が無くちょっと聞いて見ようかと思って!
0833デフォルトの名無しさん
2008/05/17(土) 18:53:100834デフォルトの名無しさん
2008/05/17(土) 19:59:270835デフォルトの名無しさん
2008/05/17(土) 20:00:56bcc32はDOSアプリケーションを作れないので、意味ない。
DOS窓で動くプログラムもWin32アプリケーション。
>>832
それならCygwinでGCC使えば?
使い慣れたライブラリもきっとWindowsで使える。
0836デフォルトの名無しさん
2008/05/17(土) 20:21:13けどそれ、よくある簡単そうで簡単じゃない問題のような
UNIXでいう/dev叩きに似たコーディングはWindowsにもあるけど、
GetAsyncKeyState()みたいなのをつつくほうが手堅いと思う
0837デフォルトの名無しさん
2008/05/17(土) 20:25:30kbhit で入力を検知してあれば getch でおkだな。
0838デフォルトの名無しさん
2008/05/17(土) 21:39:07大学の講義で使っているbcc32というコンパイラーを、
自分の使っているノートPCにもインストールしたいのですが、
どこを探してもリンク切れになっています。
bcc32をインストールできるサイトを教えていただきたいのですが。
本当に初歩的な質問で申し訳ないです。
0839デフォルトの名無しさん
2008/05/17(土) 21:45:06http://www.codegear.com/jp/downloads/free/cppbuilder
0840デフォルトの名無しさん
2008/05/17(土) 21:45:350841デフォルトの名無しさん
2008/05/17(土) 21:50:525.5よりバグが少ない。 C++の新機能に対応している。
0842デフォルトの名無しさん
2008/05/17(土) 22:18:46そういう関数とかシステムコールってありますか?
0843デフォルトの名無しさん
2008/05/17(土) 23:13:15~/.bash_profileとか~/.bashrcにあるんじゃね?
これらのファイルを読み込んでるから
0844デフォルトの名無しさん
2008/05/18(日) 00:10:38配列を使わずに、下のようなひし形を作るブログラム作成中なのですが…
____*
___***
__*****
_*******
*********
_*******
__*****
___***
____*
※_は気にしないでください。ずれるのを防止のためにつけたので。
*は9個を基準にお願いします。
途中まで考えてみたものです。
#include <stdio.h>
void main(void) /*ひし形*/
{
int i,j;
for (i=1;i<=9;i=i+2){
for(j=1;j<=i;j=j+1){
printf("*");
}
printf("\n");
}
}
上のだと、上半分はできてて左詰めになってるままです。
0845デフォルトの名無しさん
2008/05/18(日) 00:10:53>Linuxで、端末の幅を習得したいんですが、
「端末の幅を習得」するような関数、システムコールなど、その他一切そのようなものは存在しません。
端末の幅を取得したいだけでしたらman termcapすれはヒントが得られるかもしれませんが、
犬板で聞くのが一番です。
0846デフォルトの名無しさん
2008/05/18(日) 00:14:13ioctl を使うらしいとググル先生はおっしゃいました
続きはwebで!
0847デフォルトの名無しさん
2008/05/18(日) 00:14:39>※_は気にしないでください。ずれるのを防止のためにつけたので。
同じことがあなたのソースにも言えます。
つまり、その「隙間」を気にしない(≒出力しない)ものだからずれてしまっているのです。
>上のだと、上半分はできてて左詰めになってるままです。
上半分ができているのなら、下半分も作りましょう。
0848デフォルトの名無しさん
2008/05/18(日) 00:15:13>ioctl を使うらしいとググル先生はおっしゃいました
いいえ。
0849デフォルトの名無しさん
2008/05/18(日) 00:25:260850デフォルトの名無しさん
2008/05/18(日) 00:37:27http://www.geocities.jp/ky_webid/algorithm/014.html
このページを見ると、
bucket = hash( key );
p->key = key;
p->data = data;
p->next = table[bucket];
table[bucket] = p;
ここでデータを連結リストの末尾に追加する、と書いてあるのですが、
これだとリストの最初(ハッシュテーブル側)に挿入していることになりませんか?
そもそも末尾に追加するなら、p->next = NULLでなければおかしいと思います。
0851デフォルトの名無しさん
2008/05/18(日) 00:40:02大丈夫か?
>>842
#include<stdio.h>
#include<sys/ioctl.h>
int main(void)
{
struct winsize wnd;
ioctl(0, TIOCGWINSZ, &wnd);
printf("Width:%d Height:%d\n", wnd.ws_col, wnd.ws_row);
return 0;
}
0852デフォルトの名無しさん
2008/05/18(日) 00:50:47下半分を作るためにはソースのどこの部分に入れればよいのでしようか?
0853デフォルトの名無しさん
2008/05/18(日) 00:54:17サンクス!
DOS用ってホントめずらしいよ、研究所に勤めているけど先輩方は7〜10日間に
一回位いしか来ないしさ、新人の俺に任してほったらかし、来てもコーヒー飲んで
帰えちゃうし、入所も退所時間もないから気楽だけど、今日も一人で徹夜だよ!
0854842
2008/05/18(日) 00:56:52ごめんなさい。間違えました。端末の幅を収得ですね。
>>846, 851
みなさん。ありがとうございます。助かります!!
0855デフォルトの名無しさん
2008/05/18(日) 00:57:37852訂正です。
下のソースで上と下の両方表示させることができました。
あとはずらしてひし形にする部分だけなのですが・・・
#include <stdio.h>
void main(void) /*ひし形*/
{
int i,j,a,b;
for (i=1;i<=9;i=i+2){
for(j=1;j<=i;j=j+1){
printf("*");
}
printf("\n");
}
for (a=1;a<=7;a=a+2){
for(b=7;b>=a;b=b-1){
printf("*");
}
printf("\n");
}
}
0857854
2008/05/18(日) 01:05:37うぎゃーーー
今までずっと間違えて生きてきますた・・・
>>855
ずらすのにはスペースを用いて下さい。
ひし形の左側に必要なスペースの数を計算してfor文などを
用いて表示させて下さい。
0858デフォルトの名無しさん
2008/05/18(日) 01:14:31#include <stdio.h>
void main(void) {/*ひし形*/
int i,j,max=9;
for (i=1; i<=max/2+1; i++){
for(j=0; j<=max/2-i; j++) putchar(' ');
for(j=0; j<i*2-1; j++) printf("*");
printf("\n");
}
for (i=max/2; i>=1; i--){
for(j=0; j<=max/2-i; j++) putchar(' ');
for(j=0; j<i*2-1; j++) printf("*");
printf("\n");
} }
0859デフォルトの名無しさん
2008/05/18(日) 01:43:22そうですね。
末尾に追加するのは面倒(リストを最後まで辿らないといけない)なので、先頭に追加するのが普通です。
サイトの管理人さんに間違いを指摘しておくとよいです。
0860デフォルトの名無しさん
2008/05/18(日) 02:02:35#include <stdio.h>
int main(void) {/*ひし形*/
int i,j,max=9;
max |= 1;
for (i = 0;i < max; i++) {
for (j = 0; j < max; j++) {
printf( abs(i-max/2) + abs(j-max/2) <= max/2 ? "*" : " ");
}
printf("\n");
}
}
0861デフォルトの名無しさん
2008/05/18(日) 02:03:520862デフォルトの名無しさん
2008/05/18(日) 02:07:33>>858のコードよりだいぶわかりやすくなってて
構造もきれいいいんだけど、
"*"表示の条件判定が初級者にはわかりづらくね?
0863デフォルトの名無しさん
2008/05/18(日) 02:12:02int main(void) {/*ひし形*/
int i,j,max=9;
int kyori;
int half=max/2;
max = half*2+1;
for (i = 0;i < max; i++) {
for (j = 0; j < max; j++) {
kyori = abs(i-half) + abs(j-half);
if (kyori <= half) {
printf("*");
} else {
printf(" ");
}
}
printf("\n");
}
}
0864デフォルトの名無しさん
2008/05/18(日) 02:25:310865デフォルトの名無しさん
2008/05/18(日) 02:29:070866デフォルトの名無しさん
2008/05/18(日) 02:30:55>>860はコードを短くしたいんじゃなくて制御構造を
すっきりさせたかったんだと思う。
少なくとも俺には3重ループx2よりは
2重ループx1の方が読みやすい。
つか効率については短いコードのほうが
優れてるのは一般的じゃないのか?
0867デフォルトの名無しさん
2008/05/18(日) 02:37:22>>864
モチベがあがる
一定レベルを超えれば、なにかしらの奥義発動もあるかも
…ただし、隙も増えるw
0868デフォルトの名無しさん
2008/05/18(日) 02:39:18860と863が858より効率いいと思うんならプログラムはやめたほうがいい
0869デフォルトの名無しさん
2008/05/18(日) 02:41:500870デフォルトの名無しさん
2008/05/18(日) 02:43:530871デフォルトの名無しさん
2008/05/18(日) 02:44:59そう思うやつはプログラマ向いてないなw
0872デフォルトの名無しさん
2008/05/18(日) 02:45:51#include <stdio.h>
#define MAX 9
int main(void)
{
int i, j, a = 1, n = MAX / 2 + 1;
for(i=0; i>=0; i+=a) {
for(j=0; j<n-1-i; j++) putchar(' ');
for(j=0; j<=2*i; j++) putchar('*');
putchar('\n');
if(i==n-1) a *= -1;
}
return 0;
}
0873デフォルトの名無しさん
2008/05/18(日) 02:47:440874デフォルトの名無しさん
2008/05/18(日) 02:49:52>>858 100行
>>863 59行
どうみても>>863の方が上です。本当にあ
0875デフォルトの名無しさん
2008/05/18(日) 02:53:410876デフォルトの名無しさん
2008/05/18(日) 02:55:05思いつきで書いただけだしw
>>860は必要なヘッダがないよ。
>>863が自分が思ったことを実行しているし、これが出た中では良いんじゃないの?
そろそろこの辺で。
0877デフォルトの名無しさん
2008/05/18(日) 02:57:01#include <stdio.h>
int main(void)
{
puts(
" * \n"
" *** \n"
" ***** \n"
" ******* \n"
"*********\n"
" ******* \n"
" ***** \n"
" *** \n"
" * \n"
);
return 0;
}
0878デフォルトの名無しさん
2008/05/18(日) 02:58:36という問題で
putc('A');
putc('B');
putc('C');
・・・
と延々書いていた同級生を思い出した
0879デフォルトの名無しさん
2008/05/18(日) 02:59:13HTMLの知識がないとここに正確に書き込むことが出来ない、JKw
0880デフォルトの名無しさん
2008/05/18(日) 03:00:06>>874 の考えは大切だけどそれの取り組みは最終段階かなと思う。
C的には小さなパーツを構成してつくるってところじゃないだろうか?
引数渡して関数呼び出しなんて効率が悪いっていってしまうと以下のは無しになってしまうけど・
void put_char(char c, int n)
{
while(n-- > 0)
putchar( c );
}
int main()
{
int i;
const int Center_P = 9 / 2;
for(i = 0; i <= Center_P; i++)
{
put_char(' ', Center_P - i);
put_char('*', i + i + 1);
putchar('¥n');
}
for(i -= 2; i >= 0; i--)
{
put_char(' ', CenterP - i);
put_char('*', i + i + 1);
putchar('¥n');
}
}
0881デフォルトの名無しさん
2008/05/18(日) 03:00:25stdoutにsを書き込み、 改行を付加する。
0882デフォルトの名無しさん
2008/05/18(日) 03:00:260883デフォルトの名無しさん
2008/05/18(日) 03:02:14>>877実行してみ
0884デフォルトの名無しさん
2008/05/18(日) 03:02:30#include <stdio.h>
void main() { printf(" *\n ***\n *****\n *******\n*********\n *******\n *****\n ***\n *\n"); }
0885デフォルトの名無しさん
2008/05/18(日) 03:03:510886デフォルトの名無しさん
2008/05/18(日) 03:04:460887デフォルトの名無しさん
2008/05/18(日) 03:05:240888デフォルトの名無しさん
2008/05/18(日) 03:06:040889デフォルトの名無しさん
2008/05/18(日) 03:07:53858と860・863をループでぶん回してかかった時間を計れば858が早くなるだろ
そもそもコードの長さは効率とは関係ないって言ってるのに、アセンブリの長さを持ち出すってw
0890デフォルトの名無しさん
2008/05/18(日) 03:07:530891デフォルトの名無しさん
2008/05/18(日) 03:09:20関数を呼び出すとそうでないと、差は微妙だがある。
0892デフォルトの名無しさん
2008/05/18(日) 03:10:490893デフォルトの名無しさん
2008/05/18(日) 03:12:230894デフォルトの名無しさん
2008/05/18(日) 03:12:38別にそういう流れではない?
0895デフォルトの名無しさん
2008/05/18(日) 03:15:02以前、うるう年を判断するコードで、同じものを関数にして呼び出したものと
そうでないものとで比較したところ、1.5倍の差が出た。関数を用いない方で
20秒掛かったものが用いた方では30秒といったところ。内容はほぼ同じで
関数の方は値を返すところで違いはあったが。
0896デフォルトの名無しさん
2008/05/18(日) 03:16:25これだからソフトだけしか知らんやつは・・・
命令をメモリからとってくるのにもコストかかるんですのよ。
0897デフォルトの名無しさん
2008/05/18(日) 03:17:270898デフォルトの名無しさん
2008/05/18(日) 03:18:580899デフォルトの名無しさん
2008/05/18(日) 03:19:58abs()呼び出しはinlineじゃないの?
まぁ環境依存かと思うが。
0900デフォルトの名無しさん
2008/05/18(日) 03:20:460901デフォルトの名無しさん
2008/05/18(日) 03:22:570902デフォルトの名無しさん
2008/05/18(日) 03:23:18そうすりゃ絶対値なんて使わずに済む
0903デフォルトの名無しさん
2008/05/18(日) 03:24:49処理系で結果違うしなぁ。
それよりも短いコード(機械語的な意味で)が
効率と関係ないというやつは一生JAVAでも
やってればいいと思うよ。
0904デフォルトの名無しさん
2008/05/18(日) 03:26:33ループ内で自前バッファに書いといて
最後に中出しすればおk
0905デフォルトの名無しさん
2008/05/18(日) 03:26:46短いけどムダの処理が重なってりゃ当然効率悪くなるんだし
0906デフォルトの名無しさん
2008/05/18(日) 03:27:060907デフォルトの名無しさん
2008/05/18(日) 03:28:55それなら>>877でいいじゃんと思った
0908デフォルトの名無しさん
2008/05/18(日) 03:29:15なぜかループを一つにまとめたがる時期ってのはあるんだよ。
0909デフォルトの名無しさん
2008/05/18(日) 03:30:310910デフォルトの名無しさん
2008/05/18(日) 03:32:380911デフォルトの名無しさん
2008/05/18(日) 03:33:39あ
ほ
か
0912デフォルトの名無しさん
2008/05/18(日) 03:35:20一般論としてはそういうケースもあるだろうけど、
実際問題はあんまないぞ。
実行する命令数はあんまかわらなくて、
キャッシュ落ちしない分だけ早くなるのが多い。
まぁ命令をロードするのにどれくらいのサイクルが
必要かは効率を語る以上意識しないといけないな。
0913デフォルトの名無しさん
2008/05/18(日) 03:36:31話もまとめてループし始めたような気が・・・
0914デフォルトの名無しさん
2008/05/18(日) 03:38:590915デフォルトの名無しさん
2008/05/18(日) 03:39:15日曜プログラマ乙。
0916デフォルトの名無しさん
2008/05/18(日) 03:41:030917デフォルトの名無しさん
2008/05/18(日) 03:53:30スレ汚ししたおまいらには、罰としてエヴァの使徒のラミエルを
3次元っぽくプロットすることを命ずる
0918デフォルトの名無しさん
2008/05/18(日) 11:44:5232バイト境界も意識しないとな。
0919デフォルトの名無しさん
2008/05/18(日) 12:21:300920デフォルトの名無しさん
2008/05/18(日) 12:29:560921デフォルトの名無しさん
2008/05/18(日) 12:46:260922デフォルトの名無しさん
2008/05/18(日) 12:49:40ループが32バイト境界をまたぐ回数が多いと
プリフェッチ回数が多くなってしまう。
0923デフォルトの名無しさん
2008/05/18(日) 12:52:15ありがとうございます。
しかしみなさんが書いたようなプログラムはまだ見たことがないようなものでして…
できれば857が言ってるようにひし形の左側に必要なスペースの数を計算してfor文などを使ったプログラムにしたいのですが…。
*が7個の時は1個右に、5個の時は2個…のようにすればいいのかな?っていう考え方はなんとなく気づきました。
それをどう表してどこに書けばよいのか分からなくて・・・
0924デフォルトの名無しさん
2008/05/18(日) 12:54:550925デフォルトの名無しさん
2008/05/18(日) 13:04:23ご迷惑をおかけしました。
0926デフォルトの名無しさん
2008/05/18(日) 13:07:54宿題スレじゃ答えしか返ってこないぞ
0927デフォルトの名無しさん
2008/05/18(日) 13:49:130928デフォルトの名無しさん
2008/05/18(日) 14:01:12だめなんです。
0929デフォルトの名無しさん
2008/05/18(日) 14:04:140930デフォルトの名無しさん
2008/05/18(日) 14:10:050931デフォルトの名無しさん
2008/05/18(日) 14:23:29逆に評価たかくなるんじゃないか? (pucharごときじゃあれだけど)
0932デフォルトの名無しさん
2008/05/18(日) 15:08:010933デフォルトの名無しさん
2008/05/18(日) 15:49:090934デフォルトの名無しさん
2008/05/18(日) 15:55:08どうすればいいの?
0935デフォルトの名無しさん
2008/05/18(日) 15:57:120936デフォルトの名無しさん
2008/05/18(日) 15:58:240937デフォルトの名無しさん
2008/05/18(日) 16:00:050938デフォルトの名無しさん
2008/05/18(日) 16:04:060939デフォルトの名無しさん
2008/05/18(日) 16:04:55セットしてそれをたたいてほしいのねん。
素直にCreate()メソッド作ってそれ使ってもいいんだけど
0940デフォルトの名無しさん
2008/05/18(日) 16:05:36C++スレで聞いてください
0941デフォルトの名無しさん
2008/05/18(日) 16:06:18C++ スレじゃないんで、あえて聞くんだが、
コンストラクタって何?
0942デフォルトの名無しさん
2008/05/18(日) 16:06:18どうりで素人っぽい人しかいないと思ったw
0943デフォルトの名無しさん
2008/05/18(日) 16:07:150944デフォルトの名無しさん
2008/05/18(日) 16:07:500945デフォルトの名無しさん
2008/05/18(日) 16:09:52あおってるのは、
「C++ 使ってもメモリリークしまくるコードしか書けない」
低能だろ?
0946デフォルトの名無しさん
2008/05/18(日) 16:13:250947デフォルトの名無しさん
2008/05/18(日) 17:17:50使ったらいいんだ?
0948デフォルトの名無しさん
2008/05/18(日) 17:27:31これはどういう意味ですか?
0949デフォルトの名無しさん
2008/05/18(日) 17:30:01典型的な具体例は二つあって、
1つは抽象的な(中身にプログラマーがタッチしない)データ型を実装するときと、
もう1つはサイズが同じ複数の型が不規則に連続するデータ構造を
(恐らくはファイルから)配列に読み込んで解析したいとき
0950デフォルトの名無しさん
2008/05/18(日) 17:30:56if(i==0) ii = num - 1;
else ii = i - 1;
0951デフォルトの名無しさん
2008/05/18(日) 17:31:51iが0ならnum-1をiiに代入、それ以外ならi-1をiiに代入
条件演算子でググれ
0952デフォルトの名無しさん
2008/05/18(日) 17:32:01int ii = (i==0) ? (num-1) : (i-1);
?:演算子の意味がわからないなら教科書を読むこと
0953デフォルトの名無しさん
2008/05/18(日) 17:33:26ちゃんとcastの意味が分かってて、cast を適正に使用できるのであれば
なるべく忘れた方がいい機能
下みたいな書きかたをして、通信相手に固定長のデータを渡すとき以外に
ご利益を被った記憶がない
struct pkt {
int pkt_type;
union {
char b_x;
struct char b_name[8];
} hdr_body;
#define pkt_x hdr_body.b_x
#define pkt_name hdr_body.b_name
};
上の例で union が裸で配列 1024 バイトなんかだったりすると
組み込み方面では、要りもしない領域をスタックに作られて
システムダウンする可能性もある
0954デフォルトの名無しさん
2008/05/18(日) 17:34:07スレタイすら読めないヤツがスレ内容を理解できると思うか?
0955デフォルトの名無しさん
2008/05/18(日) 18:03:00long(32bit)とshort(16bit)の配列を組み合わせて、
バラバラに取得するってのはたまにやるけどあまり使わない機能だな
0956デフォルトの名無しさん
2008/05/18(日) 18:13:20sprintf(a, "abc");
sprintf(a, "abc%s", a);
printf("%s\n", a);
こんなことって、出来ないのでしょうか。Borland C++ 5.82なんですが。
素直にstrcat使えってことなのですかね。
0957デフォルトの名無しさん
2008/05/18(日) 18:18:49sprintf(a, "abc%s", a);
こいつが、昔から実装依存。つか、規格(C89)的には動作未定義じゃないか?
C99 だと
sprintf(char * restrict str, ...
動作の保証は全くない
0958デフォルトの名無しさん
2008/05/18(日) 18:21:05しょうがないので素直にstrcat使うことにします
0959デフォルトの名無しさん
2008/05/18(日) 18:49:22いまいち要求がわからんが、それはstrcatでもダメなのでは?
0960デフォルトの名無しさん
2008/05/18(日) 18:51:58>>953
サンクス!
C言語始めたばかりの初心者だから
何いってるか分からないけどとりあえず
忘れる方向で行こうと思う。
0961デフォルトの名無しさん
2008/05/18(日) 19:28:28>>960
処理側で要求されるデータが、バイトサイズ x 4 を
4バイト型に8bitシフトで格納されてる場合とか
グラフィック扱う場合とかで、RGBAの各バイト情報とかで結構あるよ
struct RGBA {
unsigned int rgba;
union {
unsigned char r, g, b, a;
};
};
こうしないと
#define SET_RGBA(r, g, b, a) ((r<<24)|(g<<16)|(b<<8)|a)
こんなマクロを組む必要になったり、
セットは言いが、各バイト情報を取得する時とかめんどう
g情報が欲しい時に、
((rgba>>16)&0x000000ff)
なんてするより共用体になってれば
.g
で終わり
0962デフォルトの名無しさん
2008/05/18(日) 19:35:24あぁ, それだめ
ストリームに載ってきたときアライメントがあってる保証がない
全部書き直したことがある
VVVV これのバイトアライン適用可能版が一番堅実
> #define SET_RGBA(r, g, b, a) ((r<<24)|(g<<16)|(b<<8)|a)
0963デフォルトの名無しさん
2008/05/18(日) 19:41:170964デフォルトの名無しさん
2008/05/18(日) 19:46:190965デフォルトの名無しさん
2008/05/18(日) 19:55:090966デフォルトの名無しさん
2008/05/18(日) 19:57:401つのバッファでやる限り、自前で移動するんでなきゃmemmove以外では無理。
0967デフォルトの名無しさん
2008/05/18(日) 20:00:59規格に沿った正しい使い方は、メモリを節約することと、既に>>949と>>953で出たように固定長で型の違うデータの列を扱う場合。
0968デフォルトの名無しさん
2008/05/18(日) 20:08:40それは誤った認識
0969デフォルトの名無しさん
2008/05/18(日) 20:17:29なぜなのでしょうか、、、丸め誤差でも発生してるんでしょうか。
動作例: num=24ならば、arr[0]=2, arr[1]=4
void Breakdown(int arr[], int num){
double udp, odp;
udp = modf((num / 10.0), &odp) * 10;
arr[0] = (int)odp;
arr[1] = (int)udp;
}
0970デフォルトの名無しさん
2008/05/18(日) 20:20:37arr[1]=num%10;
0971デフォルトの名無しさん
2008/05/18(日) 20:23:21即答、ありがとうございますっ
0972デフォルトの名無しさん
2008/05/18(日) 22:06:53やっぱVisualC++のほうがいい?
0973デフォルトの名無しさん
2008/05/18(日) 22:17:41Turbo(IDE)はフォームに部品をぺたぺた貼って遊べるが、VCの無償版はやや難しいか困難
最新のSDKにあわせるなら、VCが無難…な気がするが、気がするだけかもしれない
0974デフォルトの名無しさん
2008/05/18(日) 22:26:390975デフォルトの名無しさん
2008/05/18(日) 22:32:130976デフォルトの名無しさん
2008/05/18(日) 22:32:34コマンドラインコンパイルだけなら、.NET蹴って本体だけ抜いて使っていい
0977デフォルトの名無しさん
2008/05/18(日) 23:06:22初期化されていないローカル変数 'a' が使用されます
初期化されていないローカル変数 'b' が使用されます
って出てきますがどうやったらコンパイル出来るのでしょうか。
#include <stdio.h>
#include <math.h>
main(){
double a,b,c;
c=(0.81*a)+0.01*b*(0.99*a-14.3)+46.3;
printf("temperature=");
scanf("%lf",&a);
printf("moisture=");
scanf("%lf",&b);
if(c<77){
printf("9percent\n");
}
else if((77<=c)&&(c<85)){
printf("65percent\n");
}
else{
printf("93percent\n");
}
}
0978デフォルトの名無しさん
2008/05/18(日) 23:07:52a= 0.0;
b = 0.0;
0979デフォルトの名無しさん
2008/05/18(日) 23:08:35> c=(0.81*a)+0.01*b*(0.99*a-14.3)+46.3;
この行は、scanf()のあとにあるべきだと思われ。
0980デフォルトの名無しさん
2008/05/18(日) 23:09:41c=(0.81*a)+0.01*b*(0.99*a-14.3)+46.3;
この行を
scanf("%lf",&b);
の下の行に移動
0983デフォルトの名無しさん
2008/05/18(日) 23:14:450984デフォルトの名無しさん
2008/05/18(日) 23:15:18c=(0.81*a)+0.01*b*(0.99*a-14.3)+46.3;
の行で何が行われると期待したんだ
0985デフォルトの名無しさん
2008/05/18(日) 23:17:07宣言で常に初期化ってのは、お作法的によくない。
このコードでは、初期化はいらない。
0987デフォルトの名無しさん
2008/05/18(日) 23:20:21Cでは、未初期化の変数はアリですけど、未初期化の変数は未初期化のままです
たとえば、ほっといてもゼロになります。とかは【ない】です
一見不便ですけど、未初期化にいちいちゼロクリアがないという潔さは、魅力でもあるのです
だが、初期化忘れというバグが後を絶ちませんので、
いまどき、未初期化の変数を使うと、ひっかかる処理系が多いですよ
0988977
2008/05/18(日) 23:25:27単純に知識が無さ過ぎるだけですw
4年機械系なのに今までサボりすぎてたから
独学でしようかと。。。
0989デフォルトの名無しさん
2008/05/18(日) 23:31:46規格標的には bss は0クリアされている
ポインタが NULL になっているか否かは処理系依存だが
0990デフォルトの名無しさん
2008/05/18(日) 23:32:540991デフォルトの名無しさん
2008/05/18(日) 23:40:28.bssだけはないわ
0992デフォルトの名無しさん
2008/05/18(日) 23:41:31未初期化の変数、>>989 の示唆を含めれば、こと少なくとも、警告を食らうようであれば、
その中身は不定とみるべきです Cは超少ないメモリの装置にだって使われるのですし、
何に使われたメモリが変数の格納領域に割り当てられるかわからないとみるべきです
0993デフォルトの名無しさん
2008/05/19(月) 18:12:500994デフォルトの名無しさん
2008/05/19(月) 18:13:210995デフォルトの名無しさん
2008/05/19(月) 18:13:530996デフォルトの名無しさん
2008/05/19(月) 18:14:330997デフォルトの名無しさん
2008/05/19(月) 18:14:590998デフォルトの名無しさん
2008/05/19(月) 18:23:420999デフォルトの名無しさん
2008/05/19(月) 21:08:07http://pc11.2ch.net/test/read.cgi/tech/1211198816/
1000デフォルトの名無しさん
2008/05/19(月) 21:09:0510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。