[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 13:42 / Filesize : 213 KB / Number-of Response : 830
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 27



1 名前:デフォルトの名無しさん [2008/04/29(火) 09:44:57 ]
言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 26
pc11.2ch.net/test/read.cgi/tech/1206196600/
過去スレ
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代目
pc11.2ch.net/test/read.cgi/tech/1208268461/


47 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 16:28:45 ]
何この勘違い野郎?使い方を知らない奴が、勝手に強弱を語るって、アホか?
ttp://dictionary.goo.ne.jp/search.php?MT=%A5%B3%A5%ED%A5%F3&kind=jn&mode=0&base=1&row=1
もちっと英文を読もうぜ?インターネットを使っていて、国境なき情報収集手段で
ジャポネーゼ文字だけ見ていても仕方なかろう?

48 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 16:31:13 ]
>>47
えーと、どなたかコロンの強弱に言及なさってましたか?

49 名前:デフォルトの名無しさん [2008/04/30(水) 16:36:04 ]
今基礎的なこと勉強してるのですが
中々とっつき難いです、最初はこんなものなんでしょうか?
ちなみに本を読んで独学で勉強してます

50 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 16:37:15 ]
>>43
その理由ってお前の思い込みだろ?理由なんてどうでも良いんだよ
ソースコードを記述するのに使われている区切り、ただそれだけ。
っつか、ソースで . や , を区切りとして使っている例を持ち出してみよう。
引数の区切りに , (コンマ)が使われておりますがっ、良いですか?
. (ドット)を使った、オブジェクト指向のコードにメソッドやクラス、構造体の要素を
結合する場合にも使われています。そうなると、ピリオドが終わりを意味するのではなく
結合に使われているという、文章の区切りでの説明が矛盾します。
ゆえに、これ以上個人的な思い込みではなく、規格書があるならそれを用いるなり
法律で言う基本原則の憲法を用いるような形で説明を求めます。
なんで、基本ルールを無視して、あいつ気にくわねぇ、基本的人権を無視して
俺ルールで批判してやれとかって話になるのでしょうか?理解不能

51 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 16:39:08 ]
46 名前:デフォルトの名無しさん 投稿日:2008/04/30(水) 16:26:23
>>44
文の区切り記号としては、ピリオド>セミコロン>カンマの順で弱くなる。

↑お前じゃん。っつか、>>43は英語を持ち出しただろ?
区切りにコロンも存在するが、セミコロンはそれに対して「セミ」といった
セミロング、セミダブル、セミヌードなど「半ば」や「半」といった意味が付いた言葉ですが?
ttp://dictionary.goo.ne.jp/search.php?MT=%A5%BB%A5%DF&kind=jn&mode=0&base=1&row=0

52 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 16:41:13 ]
理由なんてない。規格でそうなってるんだよ。
もし規格で\を区切り文字にする言語を作ればそういう規格になるだけ。
理由なんてない。考えるな。感じろ。

53 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 16:46:54 ]
ttp://k-tan.staba.jp/home/errors/basic.htm
以上。区切りとは限らない、ましてや続きとして and の役割とも。
しかし、ソースコードでは流れとしては確かに上から順に
続く意味があるが、1行の分の終わりに使われる。
一方、コンマやピリオドは接続的な役割をしている。(引数、メソッド、メンバーなど)
区切りの強弱で説明をつけるのは、ナンセンス。所詮、人間が勝手に決めたもの。

54 名前:43=46 mailto:sage [2008/04/30(水) 17:22:51 ]
>>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では終端記号として採用されなかったのだろうという推測です。
まぁ、「理由なんてどうでもいい」という話だけなら納得できますが。
後半は私には関係ないと思いますが、どなたか「批判してやれ」って話をなさってます?
私がアホ呼ばわりされているだけの気がするのですが。

55 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 17:33:29 ]
>>54
お前さぁ、周りから変な目で見られてない?英数文字がコードでは
原則的に使われているが、あれは機械が演算するのを
人間がわかるコードで記述したものであって、英文法じゃないからw
どこで1文が区切られているか?の規定ごとに、英語の強弱が
関与してますよと説明して、それが根本から覆された説明文を見て
まだつまらない食い下がりをするの?すまんが、あんた何者だ?
標準化を決めている組織の関係者か?ただの一講師か?
初心者の生徒か?ナンバーサイン野郎にしろ、気持ち悪い思い込みが激しい香具師が目立つな



56 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 17:36:41 ]
それじゃさぁ、HTMLにおいて、タグを <>で囲っているが、これは?
数学ではその記号はジャポネーゼでは大なり、小なり、英語では
greater than , less than という意味だが?言語や使われ方によって
本来の意味なんてナンセンスだろ?もともと演算子の優劣でさえ
人間が勝手に決めたものだよ。

57 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 17:50:57 ]
ピリオドは小数点とかぶるからじゃね?

58 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 17:56:17 ]
私の為にけんかはやめて!

59 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:03:28 ]
= は式を計算して導くというよりも、プログラム言語では
左にある変数に対して 代入 となる。
しかし、人間が数学で使っている 3+4=7 は 3+4 は 7 という結果
あるいは7と等価という意味であり、全く意味が異なってくる。
比較演算子に == と決めたが、これは 成り立つかどうか? という評価であって
結局人間がコンピュータに解釈させるために決めたことであって
コンピュータが人間の言語として理解しているわけではない。
そこで、英文法での優劣を持ち出されて説明されても、へっ?意味が分からないんすけど?
ってなるわな。

60 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:06:53 ]
英語とC言語は別物、ってことでいいでしょ

次の質問をどうぞ↓

61 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:14:45 ]
またいつものキチガイかw

62 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 19:32:03 ]
流れが読めません><
しかも中身のなさそうな長文ばかりで読む気がしません!

63 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 19:39:49 ]
>>61
ようキチガイ

64 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 21:25:34 ]
>>61 自己紹介乙。お前かなり頭がイカれてんな。こんなところに常駐して
自分が気に食わない奴をネチネチ煽るその性格。人間性のレベルが低すぎ。
あと、プログラミングに関してもお前は頭が悪いから向いてないよ。

65 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 21:33:59 ]
IDも出ない板で雑談と煽りあいですか



66 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 21:36:01 ]
>>62
長文になると中身が分からなくなるなんて、
受験じゃ国語と英語は失敗するぞ、お前。
数学も題意が分からずに間違った解答をするでしょうな。

67 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 21:37:59 ]
>>55
お説ごもっともですが、すべてのファイルに EOF があると思っているとか、
#define で複数行にわたるときの書き方をしらないあなたに何を言われてもねぇ。

68 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 21:39:43 ]
ナンバーサイン野郎はキレるとファビョると、メモメモ

69 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 21:39:59 ]
質問系のスレって何でこんなに荒れるの?

70 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 21:43:33 ]
ナンバーサインがキレたw

71 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 21:51:23 ]
>>69
この世に10種類の人間がいるから。

72 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 21:55:52 ]
pc11.2ch.net/test/read.cgi/tech/1208268461/758
基地外登場、以後放置よろ

73 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 22:15:44 ]
途中、英語では・・とか意味不明なのがありましたがC言語の世界に戻ってよろしいですか?過去眺めてると pointer が肝なのかな。たとえば・・

int *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 を使うと何かすっきりしそう。気分の問題です。

74 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 22:16:23 ]
じゅーろくしゅるいでじゅーろくちゃ

75 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 22:19:38 ]
>int *a;
>a[0] = 10; a[1] = 20;

なんにもわかってないw



76 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 22:29:25 ]
>のような事を始めてみたりしてます。
誰がだYOw

77 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 22:31:37 ]
>>73
前者は致命的に間違ってる

後者はむしろ構造体の出番だw

78 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 23:38:17 ]
>>75 >>76 >>77
こんなコードを書いて質問する人がC始めた人に多いというがいいたいのだヨん。
この前のスレみてて何度か目にしたよ。

とにかくチミ達は始めに3行みて反応してるね?(2chはそんなもんか・・w)

79 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 23:41:47 ]
最近C言語を勉強し始めたものです
今日、「Hello World」まで出来ましたが。。
参考書を読みつつ覚えるのも飽きてきましたorz
そこで、簡単な問題を出して頂けませんか?
よろしくお願いします




80 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 23:44:29 ]
HelloWorldで飽きた人間に出せる簡単な問題って難しくないか?
fizzbuzzとか?

81 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 23:44:49 ]
>>79
テキストファイルを開き、その文字列の中から
abcと言う文字が何個含まれているか、カウントして
なおかつ該当箇所が何行目にあったかを表示せよ。

82 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 23:47:22 ]
おまえら優しいな・・・・・・・

83 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 23:55:01 ]
>>79
では史上最初に出現したアルゴリズムを追体験してみましょうか。
「a = 1190, b = 1394 とおき、a, b の最大公約数を求めよ。」

84 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 23:57:07 ]
最大って存在すんの?

85 名前:79 mailto:sage [2008/04/30(水) 23:59:06 ]
>>81 >>83さん早速のレスありがとう御座います

早速がんばってみます



86 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 23:59:53 ]
>>79
朝だったら、おはよう。昼だったらこんにちは、夜だったら今晩は、夜中だったっら、おやすみなさい明日はオハヨウって表示するように改造するんだ。


87 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:11:06 ]
っつか、素数を1〜2^32 -1 の範囲内で求めよ。
むっちゃ時間かかるで?w

88 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:13:47 ]
配列サイズの決め撃ち禁止するなら
とりあえず deque の実装からはじめないとな

89 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:14:29 ]
別に両端に追加できなくても最後に追加さえできればいいじゃん

90 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:16:17 ]
dequeである必要は無いだろ
まずは単方向リストだろ

91 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:23:30 ]
配列リストだな。
つーか効率的に実装したスタック?

92 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:24:22 ]
俺はチムポラリーファイルを使わせてもらうぜ

93 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:30:38 ]
>>92
サイズ足りなすぎw

94 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:35:27 ]
その前に書き込み保護されて書き込めません

95 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:57:12 ]
>>65
そう、でも宿題スレではその実力のほどが露呈されてしまったので、さすがに出てこなくなったようです。
出したり引っ込めたり、くだらないソースなのに一人芝居をうじうじしていているのをみて、期限きって答えを書いてやりました。
無論、宿題スレでバンバン答えを出していただけるのであれば、歓迎します。



96 名前:デフォルトの名無しさん [2008/05/01(木) 00:58:24 ]
>>95
お前がまともに答える能力がなく、コピペに反応して必死になっていた
基地外ですって自己紹介乙w

97 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:59:18 ]
>>95
> 期限きって答えを書いてやりました。
もろにあのときに、ソースを書くわけでもなく噛み付いていただけの
無能ですって露呈しているのがお前なのがワロスw

98 名前:79 mailto:sage [2008/05/01(木) 01:00:33 ]
>>83さんできました。1時間以上かかりましたorz
#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さんのをやって見ます

板汚しスイマセン

99 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 01:05:50 ]
>>95 = EOFに関してナンバーサインに加担していたバカ
pc11.2ch.net/test/read.cgi/tech/1208268461/103
pc11.2ch.net/test/read.cgi/tech/1208268461/139
pc11.2ch.net/test/read.cgi/tech/1208268461/141
pc11.2ch.net/test/read.cgi/tech/1208268461/249
pc11.2ch.net/test/read.cgi/tech/1208268461/404
pc11.2ch.net/test/read.cgi/tech/1208268461/407

分かるだろ?大学で実験もしたこともない低レベル共。
お前ら笑われるぞ、コードだけでプログラミングできたとか言ってるとw

100 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 01:09:50 ]
>>95
お前が糞だから無能を露呈しないためにも、簡単な答えの分かりきった
宿題しか答えられい、実力なきクズだとばれているから。
その言動にお前のレベルの低さが露呈されてますよw

101 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 01:24:09 ]
>>95 ん?もう終わりか?威勢が良くないな、ヘタレ小心者。
お前みたいな奴は、一生まともにはなれんよ。思い上がりの前に
気に入らなきゃ誰それ構わず、自分が間違っていようが多勢に無勢で
攻撃をするから失敗するんだよ。まぁ、もちっと人間社会の人間慣れをするんだな。
所詮誰でも自分なんて数多くいる人間の中の一人。
どんな偉人でも完璧な人はいない。ましてや、こんなスレで初心者相手に
自分は相手が知らないことを知っているということで、安心しているようじゃ
先が知れてる。自分が知らない、体験したことがないことなんていくらでもあるが
こんなの基本は分かりきっていることだろ。その基本事項を用いた説明に対して
自分の体験談や思い込みで反論するから、簡単に跳ね返されるんだよ。
お前じゃ、炭素とダイヤが同じ成分で構成されていることすら知らんだろうよ。そんなもん。

102 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 01:50:00 ]
>>98
結構前にこのスレだかで見た気がするが「projectEuler」とやらをやればいいじゃない
C言語というよりアルゴリズム、数学の問題だが

103 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 01:50:01 ]
>気に入らなきゃ誰それ構わず、自分が間違っていようが多勢に無勢で
>攻撃をするから失敗するんだよ。まぁ、もちっと人間社会の人間慣れをするんだな。
自分のことだろw

104 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 02:02:32 ]
相手してるやつのほうがうぜえよ
放置しろ

105 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 03:41:09 ]
>>103
基地外馬鹿が、その程度の反論しかできないのか、お前性格が腐ってんぞ。
自分のしたレスを読み返せ、こぴぺに反応した馬鹿w



106 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 05:14:50 ]
>>95
> 期限きって答えを書いてやりました。
期限が延長していたわけだが、どこに噛み付いてだこの基地外?

107 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 09:44:33 ]
宿題スレで延々と続けたスレ違いを、このスレでもやろうというのか
別の場所でやれ

108 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 10:37:34 ]
>>107
すみません。

109 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 10:38:16 ]
>>107
申し訳ありませんでした

110 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 10:40:21 ]
>>107
ごめんなさい。

111 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:01:29 ]
型の違うものの配列ってどうやって実装するの?

112 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:10:57 ]
void* array[]

113 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:45:52 ]
>>111
普通は共用体の配列(場合によっては、データを保存するための共用体と型を記憶するためのフラグ変数をセットにした構造体の配列)を使う
型のサイズが極端に不ぞろいでメモリを節約したい場合にはvoid *の配列を作って各配列要素に適切な領域を割り当てる

114 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:53:21 ]
>>107 最初に蒸し返した >>103  >>95  お前が言うなよw

115 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:57:03 ]
>>107=>>103=>>95だったのか。
IDでない板は自演が楽でいいな。



116 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 14:17:46 ]
強制IDのところへ移動してやったらどうかね?

117 名前:デフォルトの名無しさん [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も全て終了してしますのでダメです。

よろしくお願いします。

118 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 15:46:58 ]
longjmp するくらいしかないんじゃないか?

119 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 15:47:39 ]
func内にifが追加できない状況ってのがよくわからん。
っていうか、その例だといろいろな処理は常に実行されないってこと?

120 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 15:48:24 ]
void func(void)
{
sub();

いろいろな処理;

return;
}



void func(void)
{
sub();

/*いろいろな処理;*/

return;
}

121 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 15:49:27 ]
多分 func がライブラリで提供される関数で、
sub をコールバック関数として渡すんじゃないかと思われ。

122 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 15:52:02 ]
だと仮定するとsubでスタックをいじるとかあやしい事するしかなくね
あるいはコードを直接書き換えるか

123 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 15:59:59 ]
jmp_buf env;

を作って、func を使う部分を

if (! setjmp(env)) func();

とし、sub 内で return する代わりに

longjmp(env, 1);

とする。
これで一応目的の動作にはなる。
それでいいのかどうかは知らんが。

124 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 17:20:34 ]
func()呼ばずにsub()呼べばいいだけじゃ

125 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 17:38:07 ]
>124に1票

あるいは、sub()の後の"いろいろな処理"を別メソッドにして、func()呼び出している側がそれを呼び分ける




126 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 17:42:41 ]
>>112,113
おk
試してみる
void*の配列のほうが汎用性が高そうだけど型キャストがめんどくさそうだ


127 名前:デフォルトの名無しさん [2008/05/01(木) 19:30:02 ]
>>121 - 125
回答ありがとうございます。
正直言いますと自分の設計ミスなんですが、上の例で言いますと、
func関数内でsubに引数与えて(例では引数ありませんが)何回も呼び出してるんですよ。
で、subはエラーを返すんですが、funcに返ってきた時点でエラーならさらに上の関数に戻りたい。
しかし、subを呼び出す度にif文処理をするのが妥当なんですが、時間もかかるので、
もし何か良いやり方があったら教わろうとしたわけです。

jmp関数はgoto文と似ていますね。
goto文は使わない方が良いと言われていますがやはりjmpもできる限り使わない方が良いんですか?


128 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 19:40:57 ]
>時間もかかるので
そんなことを気にしなきゃならないような状況なら
悪いことはいわないから設計からやりなおせ

129 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 19:42:38 ]
せいぜい、整数の判定をかけるだけのif文はさむよりも
longjmpにかかるコストのほうがでかいなんてことにならないようにな

130 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 19:53:06 ]
if文処理するのが妥当なの分かってるんならif文で処理しろw

131 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 21:07:17 ]
直せるけど面倒臭いだけかよ!

C限定じゃなければsub()で例外スローして終了なんだけど
涙目でsubの呼び出し箇所をひとつづつ修正していくんだ

132 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 21:58:00 ]
素直にfunc()の設計しなおしをお勧めするね。

133 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:03:20 ]
>>98
OK です。記述方法はいろいろありますが、いずれまた、この問題にもどることになると思います。

>>114
>>67=>>83=>>95=>>108

134 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:16:15 ]
>>133
誰がいつすべてのファイルにEOFがあると言ったん?
お前の勘違いの方がアホだろ・・・あのね、思い込みで
話をこじらせるな。EOFの入力について。
もうね、お前みたいな 入力 の基本も知らない奴にバカ呼ばわりされたくねーから
最終的には、やはり学んだ場所、学歴が重要だってわかったわ。
いくら優秀なドライバーでも事故が起きれば終わりだしな。そんなもんだぞ、人生は。

135 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:17:30 ]
で、あのプログラムにおいて、EOFを入力させると無限ループするってトラブルが
対処されていなかったという、穴があったという話で、良くここまでしつこく粘着が出来るな。
マジきめぇよ、お前。性格狂ってんな。絶対に社会に出てくるなよ。お前みたいな奴は
何をしでかすか分からないからw



136 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:19:24 ]



  終


137 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:19:41 ]
>>67
> #define で複数行にわたるときの書き方をしらないあなたに何を言われてもねぇ。
言った覚えねーわ・・・なんだこいつ?妄想癖があるのか?マジきめぇ、あぁきめぇ
どんな面してんだろ?鏡見てこいよ、それ、お前の面だから m9(^д^)

138 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:21:51 ]
>>95
> その実力のほどが露呈されてしまったので、さすがに出てこなくなったようです。
お前の実力がしょぼいから、そうやって個人叩きしか出来ないか
資料を調べて必死に抵抗することしか出来ないんだろ?w
なんだよ、EOFがあるないを無理やり論点に持ち込む奴って?w
まるで、自分が違反をしても、他にも違反している奴がいるとか
あっ、俺に対して違反だといったお前、今違反しましたね?みたいな
ガキが小学生レベルの知能だな、こいつw

139 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:23:15 ]
(∩. ゚д゚)アーアー聞こえない

140 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:31:21 ]
質問です。
文字列の配列を直接引数として関数にわたしたいんですが、
引数の型定義はどのようにすればいいのでしょうか?
具体的には、

void function(??? data){
 ...
}

int main(void){
 char mojimoji[10][80];
 function(mojimoji);
}

といった感じで、???のところがわかりません。
"char *"、"char **"では駄目でした。
よろしくお願いします。

141 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:35:31 ]
そういや、昔ASCII以外にもEBCDICがあったとか、んじゃお前は今更
それを使うのかと?なぁ、時代遅れのオッサンがここでのさばってんの?
インターネットを最近知ったとかで?今更古い手法に合わせてプログラミングをするの?
ねぇ?教えて、EOFがなかった時代を知っているプロさん?
っつか、ろくにコードを書かない奴ほど、ぎゃーぎゃーわめくよな、自治厨みたく。
実力云々以前に、他人の粗探しをして楽しいのか、こいつ?

142 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:35:46 ]
char data[10][80]

143 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:37:40 ]
void function(char * data){
}

int main(void){
 char mojimoji[10][80];
 function((char *)mojimoji);
}


mainは変えずに
void function(char (*data)[80])
void function(char data[][80])


144 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:41:32 ]
原則的にはchar data[][80]

145 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 22:49:02 ]
まぁ、ファイルにEOFがあろうがなかろうが、キーボードからの入力だから。
ナンバーサインはEOFの入力が出来ないとかほざいてただろ。
印字可能な文字ではないにしろ、代用の入力文字はあるというのに。
お互い様とは言わないが、粗探しする前に本題に目を向けてくれ。
入力とは、信号やデータなどを機器へ取り込むこと全般。その形式、手法は様々。



146 名前:140 mailto:sage [2008/05/01(木) 23:00:51 ]
>>142-144
ありがとうございます。
早速明日やってみます!

147 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 23:46:09 ]
C言語でURLの一部でブラウザを振り分けるプログラムを作りたいんですが、
プログラム内から、他の実行ファイルに引数を渡して実行するにはどうすればいいんでしょうか

コマンドプロンプトだと
C:\Program Files\Internet Explorer>iexplore ***/
と同等の事をCでやりたいのですが

148 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 23:50:33 ]
>>145
んん? EOF はファイルにあるのではなくファイルの終わりをみて返されるものだよね?
EOF (-1) は char でなく int で受けないと処理系で(俺は行ってる、俺は行かない)みたいな不毛な会話が飛び交ったりするし。
ま、なにか EOF の扱いで随分と迷走してる気はするな。そう、粘着するレベルのものではないよ。前にすすもうよ。

149 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 00:05:29 ]
>>147
C言語の話としてやるならsystem()使えで終
実際にはWinAPIのShellExecute()を使うことになるだろう
詳しくはAPIスレで聞け

150 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 00:21:27 ]
>>149
ありがとう
APIの事はほとんど分からんのでとりあえずsystemとやらを使って作ってみます

151 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 00:25:08 ]
system はセキュリティ上の問題があるからな。
一応そこんとこは分かった上でよろ。

152 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 02:11:28 ]
>>148
だからそのコードをキーボードから入力することについての話だったんだが・・・
何ごちゃごちゃその定義にまで話を持ち込もうとしてんだ???
お前ってさぁ、自分のステータスは良くなくても、所有している
スポーツカーがかっこいいだろ?乗るかい?って乗った女性を
家までさらっていくタイプだろ?目的がちがーうって振られるタイプでしょ?

153 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 02:19:13 ]
スレ違い

154 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 02:25:20 ]
ttp://www.google.co.jp/search?q=EOF%E3%80%80%E5%85%A5%E5%8A%9B&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t
EOFの入力は余裕で可能です、ありがとうございますた。

155 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 02:36:35 ]
入力の終わりを通知することを「EOFを入力する」と定めるなら、余裕で可能です。



156 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 02:47:55 ]
この前だってそういう話で終わったじゃないか。

157 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 03:01:33 ]
荒らしに付き合うやつも荒らし
キチガイに付き合うやつもキチガイ

158 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 03:38:01 ]
getchar()が云々はどうでも良い。キーボードから入力が可能です
当然EOFコードを検出するのに、ファイルの終わりを示している
コードを使うのもありです、本当に本当に、重ね重ね、ありがとうございますた!

159 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 09:40:33 ]
□!!!これを見た貴方は3日以内に死にます!!!■
■死にたくなければ、このレスをコピーして他のスレに □
□10回貼り付けて下さい。1時間以内にです!もし無 ■
■した場合は、今日寝ている間に富子さんがやってきて□
□貴方の首を絞めに来ます。富子さんは太平洋戦争の■
■時に16歳という若さで亡くなった女の子で、未だに成 □
□仏していないそうです。信じる信じないは貴方次第。 ■
■今年になってからこのレスを無視した人で、“呪われ □
□て死亡した人”が続出しています。これは富子さんの ■
■呪い。呪われて死んでもいいのならこれを無視するこ□
□とでしょうね。                        ■
■――貴方がこうしているうちに富子さんが後ろから見□
□ていますよ…。                       ■
■□■□■□■□■□■□■□■□■□■□■□■□

160 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 11:08:02 ]
おまえらがくだらん煽りあいをしてると初心者の人が質問しにくいだろ

161 名前:その1は宿題スレね mailto:sage [2008/05/02(金) 11:30:28 ]
どうせここは隔離スレ(その2)だからどうでもいいよ。

162 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:51:56 ]
一つ目のウィンドウにHello、二つ目のウィンドウにWorld を表示させるにはどうすればいいんでしょう?

163 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:53:07 ]
レベル7のエスパーを求む!

164 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:53:47 ]
>>152
何か切れてる? Unixなら伝統的に ^D = EOF
そそ、だからといって通常に ^D (0x04) が現れても EOF にはならないよ。
とにかくファイルに EOF というコードが有ると勘違いしるのかとおもった。

>>160 おっと、すまん。そのとおりだ。

165 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:07:28 ]
>>164
どのOSならとかどーでも良いんじゃい(竹原風に)
キーボードからの入力は可能だし、EOFはマクロで値が定義されているし
なんならそれに応じた入力をしてやりゃ良いんだよ。所詮俺らが視覚的に
見えているものは、デジタルデータ、0と1の組み合わせの符号、信号。



166 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:52:18 ]
配列の宣言時に[]の中に変数って使えないんだっけ?
char num[sum];
みたいな

167 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:52:54 ]
>>166
C99じゃあるまいし

168 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:54:49 ]
>>163
すまない。俺はまだレベル6だ

169 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:02:16 ]
つまりC99では使えると

170 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:06:20 ]
「可変長配列」この辺かな
ttp://seclan.dll.jp/c99d/c99d04.htm#dt19990719

171 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:14:11 ]
>>170
そのページのsizeofのところでふいたw
図からわかるようにって、代入しただけで何がわかるんだよ

172 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:16:40 ]
>>171
図の中のコメントに代入されるはずの値が書いてあるから
それを見ろということだろ。

173 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:23:54 ]
>>166
結論からいうと変数は使えない・・・ので malloc alloc がある。

char* num = (char*)malloc(num*sizeof(char));
...
*(num+5) = 5; // or num[5] = 0; // みたいな...
...
free(num);


174 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:26:19 ]
C99では使えるっつーの。

175 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:32:18 ]
>>165
どうも何かごかいしているね。
EOF = (-1) が定義されているとしてこの -1 は入力できない値(int)なのよ。getchar() などが EOF と判断した条件の時に文字として存在しない値 (int)-1 0xffff あるいは 0xffffffff が返されるものなのだから。。。判るかな?



176 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:37:27 ]
>>175
君ね、いい加減鬱陶しい。マクロを知らないのか?所詮、プログラム言語も仕様も
人間が都合よく定義、規格化しているだけ。EOFがどうとかどうでも良いんじゃい。
所詮 数値データ だと何度も言っているだろ。あとはマクロを使うことで
より幅広い環境で通用するという話。いい加減、大学にも通ってないような
低レベルとは話はしたくないんで。

177 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:38:13 ]
>>174
使えた。

178 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:39:06 ]
>>175
> この -1 は入力できない値(int)なのよ
これだけ取り出しても、こいつが相当な勘違い野郎だということがはっきりしたな。
入力の意味も広義で説明されていたというのに。ねぇ、こういう知ったかが
どこか政府が運営する機関の関係者にいたらどう思う?マジでやべーよ。
まぁ、こんな似非理系は当然、専門学校程度だろうけど。

179 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:46:30 ]
ttp://www.google.co.jp/search?q=EOF%E3%80%80%E5%85%A5%E5%8A%9B&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t
EOFの入力は余裕で可能です、ありがとうございますた。

180 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:47:14 ]
>>172
コメントの数字が正しいことはどうやって証明するんだよw

181 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:48:12 ]
>>180


182 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:50:47 ]
プログラムが扱う変数として、EOFの数値データをchar型などで扱うかまで
入力受付のライブラリを用いて話をするが、while(getchar()!=EOF); で
ループを止める際に、どうやって止めたいんだい、プログラムは?w
論点はそこじゃない。EOFが入力可能か?答えはYES。適切に処理しない
環境をいちいち持ち出されても迷惑。256色しか表現できない環境で
24ビット画像を正確に表示しようとしても無理なようにね。
くどいが、こんな目の前にある機械なんて、所詮人間がルール(規格)を決めて
定義されたとおりにコンピュータがデータを実装された能力に応じて
展開しているに過ぎない、人間が都合よく解釈できるように。
コンピュータには目の前の文字も画像も映像データも、0と1の塊にしか見えんよ。
あとは規則に則って処理しているだけ。

183 名前:166 mailto:sage [2008/05/02(金) 23:57:21 ]
>>173
ありがとう
何故か、当然変数で宣言できると思っててエラーでまくってた

184 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:57:49 ]
>>178
そんなむきにならならなくても。

185 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:59:05 ]
>>175
> この -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;
}




186 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:10:02 ]
さすがにそれはないわw

187 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:29:06 ]
>>185
fgetc(), getc(), getchar() の返り値は int ですから、EOF (-1) はファイル中に存在する値でも
なければ、stdin から入力できる値でもないと思うのですが。

188 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:30:53 ]
>>185
ああ、ようやく普通の人にであえたきが・・。勘違い >>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 となっているからね。

189 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:32:33 ]
#include <stdio.h>
int 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;
}

後は受け付けた変数の型によって、それ相応に解釈されちゃってるけどね。

190 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:44:20 ]
>>188
暴れてるのは一人だけで、まともに相手にすると余計暴れるからスルーしてるだけ

191 名前:デフォルトの名無しさん [2008/05/03(土) 01:01:03 ]
正直ここで何か聞こうかと思ってスレちょっと読んだが
「C言語きやすく質問おk」と書かれた扉を開けたら
腕組んでイライラした奴らがこっちを見て来た状況と同じくらい
質問しづらいんだが。


192 名前:デフォルトの名無しさん [2008/05/03(土) 01:22:02 ]
喋り方がむかつくってだけで正しい意見に対して脊髄反射で反論始めるとこうなるって良い見本だなw

193 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 01:33:53 ]
>>183
おっ、丁寧に。サンプル間違ってたけどそこはなんだ。うまく修正してくれたわけか。C99 あるいは今の GNU C/C++系だと気付かなかった世界かもしれん。再変更する realloc もあるで。

194 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 01:53:55 ]
>>191
あ!?んだよ!?

195 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 01:59:58 ]
放置のできないバカはプログラム以前のことを勉強しなおせ



196 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 03:41:22 ]
IDの出ない板はNGにしにくくて困る
いっそコテハンつけてその話題をやって欲しいんだが

197 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 03:47:00 ]
とりあえずEOFをNGワードにすればおk
来月ぐらいまで我慢すれば飽きるでしょ

198 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 03:54:18 ]
ちょ、宿題スレで解答書くときEOF使うから困るw

199 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 03:55:41 ]
どうしても駄目なときはうpろだ使え
むしろsizeofを間違ってNGしないように気をつけろ

200 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 04:57:32 ]
EOFで騒いでいるキチガイ様はこちらの一等席(最高に頭の悪い発言をしてくださいスレ)へどうぞ
pc11.2ch.net/test/read.cgi/tech/1179394713/l50

201 名前:デフォルトの名無しさん [2008/05/03(土) 08:33:17 ]
--- EOF

202 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 10:55:48 ]
ポインタ文字列、char* p = "ABCDE";
って場合は
p[0] = 'F';
って変えれないんだよね?
char num[80] = "ABCDE";
char* p = num;
ってポインタが文字列のはいった「配列」をさしてないと
ポインタに添え字つけて一文字代入するのは無理?

203 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 11:01:29 ]
うん。規格の範囲内では無理ってことになってる。

204 名前:202 mailto:sage [2008/05/03(土) 11:04:39 ]
>>203
ありがとう
サンプルソースがなぜかポインタ文字列を直接操作してて
エラーでまくるから、自分の環境が悪いと思い込んでた
サンプルが間違ってたって事だね

205 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 12:21:00 ]
正確には未定義じゃなかったっけ

運が良ければ動くけどやるべきじゃないね



206 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 14:08:20 ]
ポインタといえばちょっと前の zdnet builder の記事も酷かったな。
202のサンプルと同じ間違いもしっかり犯してたし。

207 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:24:32 ]
>>206
過去形にするなや。未だに「レビュー中」のままだぞ。

208 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:43:08 ]
>>207 なんでこいつ偉そうなの?w

209 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:48:07 ]
自分の意に沿わない発言は全て「偉そう」ですか。大儀ですな。

210 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:01:49 ]
大儀である。下がってよいぞ

211 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:04:02 ]
大昔、リテラル文字列をいじっていい時代があったんだよ・・・。
リテラル文字列を char* に代入できるのはそれとの互換性のため。
今はもちろんいじっちゃいけないが。

いじっちゃいけないようにすることで、
同じリテラル文字列が登場したらそれを共通化できるようになるし、
もっと言えば "ABC" と "BC" みたいなのも共通化できるようになる。

212 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:12:22 ]
いやリテラル文字列は const char* constだから
普通にchar*に代入して参照できるわけだが。

213 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:19:39 ]
>>212
おかしなこと言わない。
リテラル文字列は const char の配列であってポインタじゃないし
(sizeof でサイズを取得できるから)、
char* に代入できるのは 「文字列リテラルは char* に代入できる」 という仕様が
特別に用意されているから。

214 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:20:47 ]
const char* constってchar*に代入できたっけ?

215 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:21:06 ]
>>213
おしい、後一歩だ、がんばれ




216 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:23:10 ]
char* に暗黙にキャストできる、と言った方が良かったか。

217 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:32:05 ]
>>207
過去形じゃないよ。現在完了形だよ。

218 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:43:46 ]
>>216
ここのところずっとC++しか触ってないからできないもんだと思ってた
Cだと警告しか出ないのね

219 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:46:24 ]
なんか大卒の奴にいい負けしてかなり悔しいのぅ悔しいのぅな
時代遅れのオッサンが、GW中にどこにも出かけられないから
ここで楽しんでいたところ、気分を悪くしてしまったようでw

220 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:53:58 ]
>>218
チガウチガウ
リテラル文字列を char* に暗黙にキャストできるという話。
これは C も C++ も同じ。

221 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:55:57 ]
EOFの次はchar*にリテラル文字列ですか。とことん暇な人が多いですね。

222 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:57:54 ]
EOF って何の話?

223 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:59:09 ]
Eroi Oneesan Fujikochan

224 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:01:17 ]
 EOF<ガオー
  人

225 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:01:49 ]
>>220
「リテラル文字列は const char* const」
「const char* constは普通にchar*に代入して参照できる」
だからリテラル文字列は普通にchar*に代入できるって意味の発言だと思ったんだが
私が単に読み間違えただけか。



226 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:08:48 ]
普通はconst外ししようと思ったらキャストがいるけど、const char* const→char*だけは歴史的な理由によりそれが要らないってことだろ。

227 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:12:37 ]
>>225
>「const char* constは普通にchar*に代入して参照できる」
こんなこと212しか言ってないような、
そして>>220=216=214と>>212は別人のような気がする。

228 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:15:30 ]
>>214>>218>>225が私で、
>>212>>216>>220が同一人物だと思ってたんだけど
それがすでに勘違いだったのか orz こりゃまた失礼しました

229 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:38:13 ]
ttp://www.sgnet.co.jp/c/2-1.htm
ここのサイトで

#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)

って習ったのですが、どう違うんですか?こっちではうまくいったのですが。

230 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:40:19 ]
Cの初心者なんですが、コマンドプロンプトに関して
質問があります。
こちらで聞いてよろしいんでしょうか??

231 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:41:49 ]
>>229
そのコンパイラが日本語に対応してないんじゃね?

232 名前:229 mailto:sage [2008/05/03(土) 18:44:18 ]
>>231
あ、すいません。

#include <stdio.h>
int main(void)
{
printf("好きなことを書きましょう");
}

で、うまく実行できたという意味です。

233 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:44:52 ]
素早い返答感謝です。
実行すると、内部ファイル云々、操作可能なプログラムと
認識されていません、と出ました。
内定先から頂いたDISCの指示に従ってインストールしたんですが・・・・

234 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:46:24 ]
何の話か知らないが内定先に聞けよ

235 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:46:26 ]
>>232
ttp://www.kijineko.co.jp/tech/superstitions/void-main.html



236 名前:229 mailto:sage [2008/05/03(土) 18:50:11 ]
>>235
難しすぎてわからないのですが…

ようは、void main() と int main(void) は同じような意味だから
できたほうを使えってことですか?

237 名前:デフォルトの名無しさん [2008/05/03(土) 18:53:32 ]
C++とCで仕様がちがうのでは?

238 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:55:36 ]
>>236
戻りはint。引数は依存って書いてあるな。void main(void)は不可か

239 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:58:44 ]
>>236
全部
int main
でおk

240 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:01:50 ]
>>229

そのサイトが嘘つき、もしくは正しい知識をもってない。
大学のほうが正解。


241 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:05:22 ]
あとint mainでやるなら
正常終了したって事を示す「return 0;」を忘れずに

242 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:08:20 ]
C99 なら大丈夫だけどね。
まだ C89 の環境多いから return 0; 書いた方がいいけど。

243 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:13:18 ]
>>232 みたいなちょっと「動作確認しました」くらいのやつならC89でもreturn 省略してもいいよ。
逆に、いちいちつっこむヤツを見ると、省略できるの知らないの? って思う。


244 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:15:48 ]
質問します。
Linuxのコンソールで擬似和音のビープ音鳴らすのにエスケープシーケンスを
使おうとおもってるんですが、printf関数でエスケープシーケンスを
出力すると、一旦出力バッファに貯められてしまうため、時間差で
音を出したくても上手く音が出力されません。

出力バッファを介さずに文字列を出力する関数ってなにかありますでしょうか?

245 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:31:43 ]
>>243
return を省略した際の動作は規格上は未定義。
C99 や C++ だと main 関数は特例として省略が可能だが、
C89 では main 関数にもそれが適用される。
大体の処理系は警告出すだけだがね。



246 名前:230 mailto:sage [2008/05/03(土) 20:03:24 ]
妙な事をきいてしまってすみません。内定先もGW中で
担当の方がいらっしゃらない物で。
失礼しました。


247 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:10:18 ]
>>245
動作が未定義ってかリターン値が未定義だろ。
省略しても問題ないよ。
お作法的には書くほうがいいけど、書き捨てのコードにいちいちツッコミ入れるほどじゃないよ。

248 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:17:00 ]
>>244
Drawin / *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 でどちらもバッファリング無しで入出力...


249 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:22:02 ]
>>236

int main() { .... ; return 0; } ですればどうでしょうね。
return 無しの例外が許されてるといいながら return 0; 記述がそれほど手間でもないのでは?

void main() の登場はいわゆる void 型が導入された次期からしばらくの間ではなかったか。サンプルが古いのであって目くじら立てずに見過ごせばどうかな?。

250 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:25:31 ]
めくじらっつーか、gcc じゃコンパイル通らんし。

251 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:37:49 ]
>>250
だから int main に読み替えればいいでしょって事なの。参考にしてる物に目くじら立てて(その例文は可笑しい)って作者に文句のメールでも送る?。そんな方向に行くのはどうかという事。

252 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:38:49 ]
>>251
仮にも 「講座」 を名乗るのにそれじゃマズいだろ。

253 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:41:52 ]
問題はおかしいかおかしくないか判断できない初心者がそれを読むってことだろ

254 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:58:37 ]
そうガミガミすんなや、GWも後半に入ったというのに
# 自分はどこにも行きませんけど

255 名前:229 mailto:sage [2008/05/03(土) 20:59:37 ]
いろいろな回答ありがとうございます

大学で3回くらいしかまだ習ってないので(習ったのはprintf int forとかだけですけど)
ばりばり初心者だったのですいません

とりあえず普通に勉強していこうと思います

ありがとうございました



256 名前:デフォルトの名無しさん mailto:sage [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と定数を使用するとやはりコンパイルできません。
何故オフセットすると値を代入することができなくなってしまうのでしょうか。
お願いします。
(エラーの出ている箇所はこの部分だけであり、載せていない部分ではエラーはありませんでした)

257 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:38:03 ]
>>256
infoはポインタでしかないから、それに何かを足したものはただの値でしかないから代入はできない。
やりたいことは、info[line_cnt] = NULLではないのか?

258 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:39:34 ]
*(info + line_cnt)

259 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:42:39 ]
>>257
ないな。match_infoが構造体だから代入できない。
まぁ恐らく、
info[line_cnt].line = 0;
info[line_cnt].col = NULL;
なのだろう。

260 名前:デフォルトの名無しさん [2008/05/03(土) 21:56:30 ]
うるせええええええええええええええええええぞ
かすどもおおおお

スレ違いなんだよ他でやれ

261 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:58:05 ]
だからもちつけって
(オレモナー)

262 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:09:21 ]
>>257-259
お早いレスありがとうございます。
やりたいことは確かに>>259の通りなのですが、
他の関数でinfoを門番までスキャンさせたくて、門番としてNULLを割り当てようとしました。
ちょうどコマンド引数のargv[argc]に'\0'が入っているような感じに使おうと思っているのです。

>>259のようにしてしまうと、他の関数ではinfoのメンバーを知らなくてはなりません。
質問では触れなかったのですが、検索用の関数を作っています。
最終的には、main()側でstr_search()や,infoの内容を見る関数をラップした関数を使えるようにするだけで、
他の部分は全てヘッダファイルに移し、隠蔽してしまおうと考えていました。(言葉足らずですみません)
つまりinfoは作業用変数としたいのです。

関数の設計も含めて、何か良い方法がありましたら教えていただけないでしょうか。

263 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:11:47 ]
最後の要素のcolかlineに特別な値を割り当てておくしかないだろう

264 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:14:33 ]
>>262
できない。
infoが配列の要素を指している以上、
その値は必ず配列上に存在する要素へのポインタにしかなりえない。


265 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:16:02 ]
あとはline_cntを公開しておくしかないな
こーゆーことやるならC++のほうが圧倒的に楽だけどね…



266 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:18:13 ]
>262
文字列の最後を\0で検出できるのは、\0が文字型の特殊な値だから。
同じように任意の型の配列の末尾を検出したいなら、特殊な値を割り当てて検出する以外にない。

267 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:22:50 ]
どうしてもやりたいなら、 match_infoの配列ではなく、
match_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する手間がかかる。

268 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:24:02 ]
>>262
argv[argc]は'\0'ではなくNULLな。
これはargvがポインタの配列だから実現できる。
infoはmatch_info型の配列だから、
末尾要素をNULLにしようとしても型が違う。

269 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:28:56 ]
>>256
それはもしかするとこう?


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+
 // ...


270 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:30:16 ]
>>267
ががん。かぶってしもた・・

271 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:33:43 ]
構造体の中身を公開したくないのに構造体の内容で判定することはできない。
公開するか、ポインタの配列で実現するかの二択。

272 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:57:51 ]
>>263-271
みなさんありがとうございます。

argv[]がargv[argc]までスキャンされるのは、
argv[]が文字列の"ポインタ"だからですね。勘違いしていました。
>>267>>269でおっしゃられているようにポインタ配列で実装しようと思います。

>>267>>269のようにmalloc()がネストされている場合は、
中をfree()してから外側をfree()しなければなりませんか?
手間がかかるようなら、>>263,265も考えてみようと思います。

273 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:07:18 ]
>>267>>269のようにmalloc()がネストされている場合は、
|中をfree()してから外側をfree()しなければなりませんか?
もちろん

274 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:17:03 ]
正規表現のアルゴリズムを勉強したいんスけど、なんかグレートなテキストってないっスかねぇ〜?

275 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:23:46 ]
>>274
エディタのマニュアルに書いてないかな



276 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:27:29 ]
>>274
grepのソース

277 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:34:41 ]
>>274
www.amazon.co.jp/dp/4781905854

この本に一章だけ書いてある。
本自体は有名だけど、この説明がいいかどうかは判断できない。

278 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:40:46 ]
>>277
レビューワロタ
参考にしてる人多すぎだろ

279 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:40:52 ]
「詳説 正規表現」のコラムでも、正規表現をさらに学びたい人は >>277 の三章を進めると書いてあるな。

280 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 00:05:26 ]
せっ・・・性器表現の勉強を(ry お勧めの参考書を(ry

281 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 00:21:41 ]
>>274
手元にある本をあげておきます。
オートマトン・言語理論, 富田悦次・横森 貴, 森北出版 1992, ISBN4627805500
これがベストというわけではありませんが、まず理論的な部分をしっかりおさえておかないと、後々どうにもならなくなると思います。

282 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 03:45:27 ]
#include のことを、シャープインクルードって言っていた香具師、手を上げろ! ノシ

283 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 03:50:06 ]
えっ、違うの!?

284 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 03:52:10 ]
本場の職人なら、パウンド・インクルードという。

285 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 03:52:32 ]
# #は井桁、ナンバーサインでシャープは♯なんだな。
斜めになっているのが縦棒か横棒か、違うんだなぁ。
シャープは楽譜の記号で使われているんだなぁ。
ぼぼぼ、僕はおにぎりが欲しいんだなぁ。



286 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 04:18:42 ]
C#とかあるし、シャープで伝わるからそう読んでるな
むしろ井桁とかだと通じないことがあるし

287 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 04:29:29 ]
シーナンバー・・・うむ・・・いや、いや、そうじゃなくて、C♯はちゃんと
シャープと書かれているんでしょう。同一視してはならぬ、決して。

288 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 04:35:23 ]
C#は間違いなく井桁だな
まぁシャープの代わりに井桁を使っているから、井桁をシャープと読むのは不適切かも知れないが

井桁が通じないことがあるんだからしょうがない
もっと普及させてこい。話はそれからだ

289 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 04:42:53 ]
♯の半角が存在しないから、代用しているのさ・・・そう思いたい・・・きっとそうだ。
♯を英語圏にも広めよう!

290 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 07:35:58 ]
>>284
マジなのか
どうでもいいけど
ttp://cplusplus.syntaxerrors.info/index.php?title=Extra_tokens_at_end_of_pound_include_directive

291 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 09:46:44 ]
英語だといろんな呼ばれ方があるみたいだ。「シャープ」も含めて。

en.wikipedia.org/wiki/Number_sign#Other_names_in_English


292 名前:デフォルトの名無しさん mailto:sage [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
*/

293 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 10:18:38 ]
fgets(str, 32, fp);
こんな感じに書いたときに、
strの宣言がcharの配列だったらいいけど、
charへのポインタだったらだめだった。どうして?

294 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 10:31:08 ]
>>293
運が悪くポインタの指す先が書き換えてはいけない場所だったから

295 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 10:54:19 ]
>>292
a, 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;
}



296 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 10:56:19 ]
>>293
ポインタを初期化していなかったに一票

297 名前:293 mailto:sage [2008/05/04(日) 11:04:20 ]
>>294
>>296
そうだよね、何処にあるかわからない入れ物を渡してもダメに決まってるよね。
すっきりしますた。

298 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 11:10:44 ]
>>295
unsigned とかやってるとサイズが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;

として処理系ごとに切り替えられるようにするのが良い。

299 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 11:13:03 ]
unsigned char に対応していない処理系を考慮するなら

union 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であることは期待できない。

300 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 11:28:45 ]
>>295,298,299
ビットフィールドが全部同じ位置を使っていたということですね
プリプロセッサディレクティブは未学習なのですが、イメージはつかめました
ありがとうございました


301 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 12:05:18 ]
1ビットしかなくて読むだけなのにビットフィールドの共用体なんてフツー使わねえよ。

#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));


302 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 12:08:57 ]
>>301
普通って何さ

303 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 12:38:48 ]
>>302
普通って普通さ

304 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 13:43:24 ]
まあ確かにビットマスク使ったほうが楽だな

305 名前:デフォルトの名無しさん [2008/05/04(日) 17:45:50 ]
コマンドプロントでテキストファイル.Cをコンパイルするにはどうすればいいの?
パスはしたの通りです。
C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C
C:\Bディレクトリ\コンパイラ





306 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 18:18:23 ]
> コンパイラ /?
> コンパイラ /H
$ コンパイラ -h
$コンパイラ --help

307 名前:デフォルトの名無しさん [2008/05/04(日) 18:53:08 ]
えwどういうことw

308 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 18:55:18 ]
>>307
コンパイラによって方法が違うからコンパイラのマニュアルを見るか
有名なコンパイラなら名前を書け

309 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 18:55:53 ]
ヘルプ見ろ

310 名前:デフォルトの名無しさん [2008/05/04(日) 19:05:39 ]
え そうなんだ
MinGWなんだけど

311 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:12:19 ]
MinGWならgccかな
> C:\Bディレクトリ\コンパイラ
が気になるけどたぶん
gcc C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C
C:\Bディレクトリ\コンパイラ C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C
どっちかかもね?

312 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:20:27 ]
gcc --help
と叩けば使いかたが出る。

313 名前:デフォルトの名無しさん [2008/05/04(日) 19:31:39 ]
> C:\Bディレクトリ\コンパイラ は C:\TYC4TH\gcc ってことです
その二つでためしたんですが、
gcc C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cの場合
'gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
C:\Bディレクトリ\コンパイラ C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cだと
'C:\TYC4TH\gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません


314 名前:デフォルトの名無しさん [2008/05/04(日) 19:33:02 ]
ってでます><

315 名前:デフォルトの名無しさん [2008/05/04(日) 19:39:10 ]
>>312
なんか英語がたくさんでて意味がわからない・・・




316 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:42:10 ]
日本語を含む場合は""で括る
例)gcc "C:\Bディレクトリ\コンパイラ"

>'gcc' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
gccコマンドのパスが通っていない、正しくない

317 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:49:07 ]
gccインストールしてからMinGWインストールすると
パス通すかの確認があった気がしたけど・・・
MinGWをインストールしなおして確認してみるか、
$HOME/.bashrcにexport PATH=$PATH:コンパイラの入ってるディレクトリ
を追加してみ
MinGWコンパイラの入ってるパスは$HOMEからの相対パスがいいかな

ちなみにMSYSも入れるとうれしくなれるかも

318 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:49:48 ]
>MinGWコンパイラの入ってるパスは
コンパイラの入ってるパスは

訂正

319 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:51:13 ]
>コンパイラの入ってるパスは
コンパイラの入ってるディレクトリは
打つ出し脳

320 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:51:51 ]
MinGW - Minimalist GNU for Windows
OSはWindowsじゃないの?
XP なのか 9x なのかによっても設定方法違うけど

321 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:55:06 ]
c:\autoexec.batに
PATH=c:\MinGWまでのディレクトリ\bin;%PATH%
これを書き込んで再起動すればばよかった、、、はず・・・多分

322 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:57:08 ]
折角隔離スレがあるんだから誘導しろよ。
Cygwin + MinGW + GCC 相談室 Part 3
pc11.2ch.net/test/read.cgi/tech/1177944767/

323 名前:デフォルトの名無しさん [2008/05/04(日) 20:19:39 ]
おぉ できたかもです!!
みなさんありがとうございます。
さっそく勉強してきます。

324 名前:デフォルトの名無しさん [2008/05/04(日) 20:51:46 ]
#include <windows.h>

typedef 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;
}
               略
}

上記のようなプログラムを見かけましたが波線の部分関数ポインタの動作いまいち理解できません。
どなたかご教示お願いします。

325 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 21:53:20 ]
>>293
以下の記述で普通に動作しています。
環境 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 */
動作しないソースと環境・処理系を教えていただければ、何かわかるかもしれません。



326 名前:325 mailto:sage [2008/05/04(日) 21:54:30 ]
失礼、解決ずみでした。

327 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 01:40:56 ]
>>324
関数ポインタとは動作するものではありません
もう少し質問内容を吟味してくださらないと答えようがありません

328 名前:デフォルトの名無しさん [2008/05/05(月) 04:08:44 ]
>>81ってどうやるのかな

329 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 06:47:41 ]
>>324

何を聞きたいのか今ひとつわからんが、とりあえずMSDN。
msdn.microsoft.com/ja-jp/library/64tkc9y5(VS.80).aspx


330 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 13:03:48 ]
>>324
GetProcAddress は指定した関数へのアドレスを返すんだけど、
GetProcAddress の戻り値の型は1つに定めないといけないので
GetProcAddress は関数へのアドレスをとりあえず FARPROC って型にして返すようにしてある。
実際にこの関数のアドレスを使う際には、
本来の関数ポインタ型へとキャストして使う必要がある。

331 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 14:15:49 ]
stdlib.hにあるsystem関数って、標準ですか?
どの処理系でもまともな動作が期待できる?

332 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:04:12 ]
>>331
プログラマを目指すならもちとあいまいな問いにならないよう気をつけないと。
質問がとんでもなく飛んでいる。
どの処理系・・・列記してみて
まともな動作・・まともってなによ(この質問はちょっとあほっポイ匂い)

333 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:19:24 ]
>>331
標準じゃない

334 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:25:08 ]
>>324
このソースって凄いね(大文字ばっかで・・・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() として適当に引数与えて呼び出せばいいということかな。

335 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:57:10 ]
>>331
関数そのものは標準であり、
どの処理系であろうと「処理系の考えるところのまともな動作」をする
それが「プログラマの期待するところの動作」と一致するかはわからない



336 名前:デフォルトの名無しさん [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行目をかけるのがどうすればいいかわかりません。

337 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:12:06 ]
>>336
>aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。
行列の積の定義から勉強しような。
行と列が逆だと思うぞ。


338 名前:デフォルトの名無しさん [2008/05/05(月) 16:23:36 ]
>>337
すいません。丁寧に指摘してくださってありがたいです。
一応僕が作ったプログラムを載せておきます。
#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");
}}
足し算をするプログラムの演算子を+から*に変えただけなので積が出来るわけもないのですが、
どうすればよいのでしょうか、あつかましいですがよろしくお願いします。

339 名前:側近中の側近 ◆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}

340 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:29:04 ]
>>338
行列の掛け算は3重のループになるのだぞ。行列を勉強しましょう。


341 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:30:14 ]
for(n = 0; n < 3; n++){
for(m = 0; m < 3; m++){
for(i = 0; i < 3; i++) c[n][m] += a[n][i] * b[i][m];
}
}

こんな感じ?



342 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 16:33:49 ]
>>338
(っ´▽`)っ
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)

線形台数の教科書を見直せ☆

343 名前:デフォルトの名無しさん [2008/05/05(月) 16:51:00 ]
>>339->>342
初歩的なことなのにわざわざ教えてくださってありがとうございます。
感謝しています。
あとほんとに初心者的なことなんですが、>>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


344 名前:デフォルトの名無しさん [2008/05/05(月) 16:52:39 ]
>>342
ゆとり乙
数学3cのレベルです

345 名前:344 [2008/05/05(月) 16:54:36 ]
>>342
ごめんなさいゆとりは俺でした
数学3cじゃねええええええええええ
あああああああああああああ何か勘違いしてたああああああああ



346 名前:344 [2008/05/05(月) 16:55:21 ]
やべえ今までで一番恥ずかしい書き込みだ

347 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:55:51 ]
最近Cを始めた者なんですが
CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
ポインタを使うような関数を自分で作る必要がありますか?
何かサンプルなどもありましたらお教えください。

348 名前:336 [2008/05/05(月) 16:55:51 ]
僕はちなみに本当のゆとりです。

349 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:56:55 ]
落ち着け
寿司食うか?

350 名前:344 [2008/05/05(月) 16:58:16 ]
大体3cとかあんまりやってねぇんだよ・・・
ケーリーはミルトンの公式ばっかり使って足し算引き算ぐらいだっけ?
行列式はなかったよな・・・あぁ・・・俺なにやってんだろう

351 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:58:59 ]
>        ab[i][j] += (a[i][k] * b[k][j]);
>      printf("%d ",ab[i][j]);}

                   ~~~

中括弧の位置


352 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:03:14 ]
>>343
(っ´▽`)っ
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;
}

353 名前:344 [2008/05/05(月) 17:05:08 ]
ああああああああああああああああああああああ

354 名前:344 [2008/05/05(月) 17:06:41 ]
ダメだ・・・

355 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:08:02 ]
五月蝿い
トイレでも篭ってろ



356 名前:344 [2008/05/05(月) 17:08:42 ]
線形台数の教科書読んできますノシ

357 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:10:23 ]
>>347
>CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
ない
>ポインタを使うような関数を自分で作る必要がありますか?
ある

文字列操作の概念自体が違うので、CでVBのようなことをやるという考え自体を捨てること
まずCのやりかたというものを覚えるのが先

358 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:12:08 ]
>>347
(っ´▽`)っ
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'
で。

359 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:13:30 ]
(っ´▽`)っ
最後セミコロンが抜けたが気にしない☆

360 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:14:05 ]
>>347
>CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
どちらもsprintf()で代用可能。

361 名前:336 [2008/05/05(月) 17:14:14 ]
>>351->>352
おかげさまでうまく答えも出ました。本当にありがとうございます。


362 名前:344 [2008/05/05(月) 17:14:54 ]
>>361
俺と一緒に勉強しようぜ

363 名前:347 mailto:sage [2008/05/05(月) 17:17:36 ]
>>357-360
ご回答ありがとうございました。
サンプルを参考にしながらC勉強をしていきます。

364 名前:側近中の側近 ◆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を使えばいいような気がする。

365 名前:336 [2008/05/05(月) 17:35:16 ]
>>362
共にがんばりましょう。



366 名前:デフォルトの名無しさん [2008/05/05(月) 17:44:26 ]
 unsigned __int32 hentai, doutei;
 hentai = 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;

納得がいかないのでスマートなやり方教えてくれ。

367 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:50:49 ]
>>366
十分スマートと思うが、どういう点で納得がいかないんだ。

hentai += doutei - hentai % 1000000;

368 名前:デフォルトの名無しさん [2008/05/05(月) 17:58:57 ]
>>367
おお、サンクス。
除算か乗算どちらかを一回でも削りたかったんだ。

369 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 21:57:45 ]
>>363
Basic系から来た人だと right とかも使うんでしょw・・それは置いといて無いものは自作するってのも楽しみじゃないかいな?

>>360
参考までに書いてくれると周りも参考になるとおもう。
せいぜい数行だと思うから sprintf で書いてみてよ。


370 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 22:12:13 ]
>>369
360じゃないが、こうじゃないかな。
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);
}


371 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:40:11 ]
C言語用でお勧めのフリーコンパイラを教えてください

372 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:43:44 ]
>>370
おお、%.*s ・・・しらなんだ。

373 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:47:34 ]
>>371
・ GCC (MinGW)
・ Microsoft Visual C++ Express Edition 2008
好きなの選べ

374 名前:デフォルトの名無しさん [2008/05/06(火) 00:05:01 ]
>>373
その2つの違いがまったくわかりません…
それとMSの方はC++となってますがC言語にも対応してるんですか??

375 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:08:44 ]
おまえは紹介されたコンパイラについてちゃんと調べたのか?



376 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:09:31 ]
>>374
MSのコンパイラでもCのコンパイルはできます。但し、99年の規格にさえ準拠していないので注意が必要です。
gccは、Cコンパイラではなくコンパイラコレクションです。勿論、CもC++もコンパイルできます。
まぁ、MinGWにしろCygwinにしろ、環境に対する知識が必要にはなります。

377 名前:デフォルトの名無しさん [2008/05/06(火) 00:24:49 ]
fputc( )の使い方の説明で

int fputc(int 文字、FILE *ストリーム);

fputc( )関数は、「文字」の下位バイトを、「ストリーム」に結び付けられているファイルにunsigned char型の値として書き込みます。

とあるんですが、上位バイトはどうなるんですか?

378 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:25:59 ]
捨てられる

379 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:26:49 ]
ttp://www.bohyoh.com/CandCPP/C/Library/fputc.html

380 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 08:01:36 ]
vistaで動くコンパイラだったら何がいい?
やっぱりbcc、gcc辺りかな

381 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 09:42:29 ]
VC++ 2008 Express Edition

382 名前:デフォルトの名無しさん [2008/05/06(火) 09:53:56 ]
uint16 とか uint8 とかは int とどう違うのですか?

使い方を教えてください。

383 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 09:54:04 ]
Express Editionとgccの好きな方

384 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 09:56:25 ]
uint16_t や uint8_t なら標準(C99)で用意されているが
uint16 や uint8 は標準では用意されていない。

385 名前:382 [2008/05/06(火) 09:59:52 ]
>>384
もう少し詳しくお願いします。



386 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:11:53 ]
>>385
標準で用意されてない以上、
ヘッダファイル内にある定義を見てくださいとしか言いようが無い。

387 名前:382 [2008/05/06(火) 10:22:11 ]
>>386
ということは・・・

uint16 uint8 はwindows.hとかでも定義されてる分ではなく、

自分の使っているライブラリかなにかで定義されているということですね。

わかりました。 調べてみます。

388 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:24:30 ]
>>387
windows.hにあるかもしれませんが、そこにあったとしても標準とは言えません。
そもそも、あなたがWindowsを使っているのかどうか誰にもわかりませんから。

389 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:25:09 ]
処理系独自に定義されてるかもしれないが、
どの処理系使ってるかも知らんし、
結局自分で調べてくれ、というこった。

390 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 13:51:05 ]
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;
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)でエラーが起きます。なぜでしょうか?

391 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 13:57:38 ]
すいません、解決しました。

392 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:00:16 ]
INT_MAX 4bites = 2147483647 < 9999999999

393 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:02:26 ]
やっぱうまくいきません。
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;
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;
}
}
は何がいけないのでしょうか?

394 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:04:25 ]
two()は構造体のポインタを受け取る関数
main()で呼んでるtwo()に渡されてるhistは構造体そのもの

あと>392

395 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:06:22 ]
bites …くそorz



396 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:11:21 ]
Winでコマンドプロンプトがすぐ終了するのを抑止したいなら、scanf("%*s"); がいい

397 名前:393 mailto:sage [2008/05/06(火) 14:11:59 ]
www9.plala.or.jp/sgwr-t/c/sec15-4.html
ここに、393のようにかけと書いてありました…

393を書き直した正解はどうなるのでしょうか?

グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく
処理された任意の変数をn個、n-1個上の階層で使用したいのですが


398 名前:393 mailto:sage [2008/05/06(火) 14:12:39 ]
>396
ありがとうございます。使ってみます。

399 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:17:24 ]
#define ZETTAI(x) (x < 0) ? -(x) : x

int x;

x = ZETTAI(-9 - 50) + 5;

これでxの中身が59になってしまうのですが、何故でしょうか?
-59をZETTAIで59にした後、5を加算しているはずなのですが

400 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:17:47 ]
>>.397
そこの二つ目のの「seito2」は構造体の配列名。配列名は大抵の場合すぐポインタに成り下がるので、
ポインタを引数としてとるseidesp2()にそのまま渡すことができる。
>>393 の場合histは構造体の単体だから、two(&hist) として呼び出さなければならない。

>グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく
>処理された任意の変数をn個、n-1個上の階層で使用したいのですが
言ってる意味がよくわからないが、1つの構造体のデータを再帰的に処理したいのなら構造体のポインタを渡す。

401 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:21:07 ]
コンパイラのエラーメッセージをちゃんと読め。
プロトタイプ宣言と定義が噛み合っていないぞ。
void two(struct histgram hist);
void two(struct histgram *hist)...


402 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:23:09 ]
>>399

x = 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)

もちろん自作などせずにライブラリ関数を使うことが望ましい。

403 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:23:31 ]
>>399
#define ZETTAI(x) (x < 0) ? -(x) : x

#define ZETTAI(x) (((x) < 0) ? -(x) : (x))
にしておてきなさい。


404 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:30:39 ]
>>402-403
上手くいきました
ありがとうございます

ですが、
>x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5;
同じxなのに何故一番右のxだけに+5がくっつくのですか?

405 名前:393 mailto:sage [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' に変換できません。
というエラーが出てしまいました。



406 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:36:01 ]
>>404
元のx=の式の一番右の+5がそのまま残っているだけ。

407 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:36:58 ]
>>405
構造体をそのまま渡したいのであれば、アンパサンドをつけてはいけません。

408 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:40:42 ]
>>406
つまり
#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; ですね!

理解できました
丁寧にありがとうございました

409 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:40:56 ]
まぁ、あんなサイトを見ているようじゃいつまでたっても理解できないわな。

410 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:29:22 ]
いいから黙ってstdlib.h::abs()を使え

411 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:49:43 ]
やっぱ自作するより、ライブラリ探したほうがいいのかな

412 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:56:26 ]
absはintだから・・・

413 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:56:59 ]
そりゃそうだが基本的なパーツの使い方を勉強してる初心者にそれは野暮な突込みだ。

414 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:00:03 ]
>>399
悪いことはいわん。inline 使え。
#define は C言語ではない・・マクロは副作用があるからうっかり a++ なんて記述したら・・判るでしょ?


415 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:03:58 ]
inline は C99 からだから



416 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:56:05 ]
>>415

そ、そんなこといいだしたら・・・今から始めるなら新しいツール使おうよって Linux も *BSD も Darwin も普通にクリアしてるし。Windows は今一つ判らないけどまさかそうじゃないの?

417 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:00:59 ]
VC++ は C89 だ

418 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:03:14 ]
まぁ、最適化を当てにして関数にしておけってのはありだがな。

419 名前:デフォルトの名無しさん [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') とあるんですがこれはどういう意味なんでしょうか?
この部分を消してみると、変な結果になることは確認したのですが・・・すみません教えてください。

420 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 09:07:44 ]
>>419
文字を数値へ変換してる
asciiコードとかがポイント

421 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 11:06:21 ]
誰か>>414
>#define は C言語ではない
の意味を説明してくれないか?

422 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 11:12:54 ]
>>421
プリプロセッサの範疇だと言うことだろ。

423 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 12:12:00 ]
>>419
s[i]というのは文字コードが格納されている
'0'というのも、数値の0ではなくて文字0の文字コードが格納されている
'1'は'0'より文字コードが一つ大きいんだ
つまり'1'から'0'を引けば数値の1が返るという仕組み

424 名前:デフォルトの名無しさん [2008/05/07(水) 13:12:40 ]
>>419

ASCIIコード表をみると423さんの言ってることがよりわかりやすい思うよ!
ASCIIのコード表はググってもあるだろうし、参考書にも載ってると思う。

425 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 13:49:07 ]
コンパイラが扱う範疇ではないがC言語の範疇には入るんじゃまいか?



426 名前:419 mailto:sage [2008/05/07(水) 14:49:58 ]
asciiコード!そういう仕組みなんですか・・・僕友達いないんで、ここで聞かなければ絶対わかりませんでした。
レスしてくれたみなさん、ありがとうございました!

427 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 15:49:27 ]
プリプロセッサも、C標準に規定されている訳だし、
C言語の一部と考えてもいいんじゃないかな。

プリプロセッサがなきゃコメントすら書けん


428 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 15:50:27 ]
>>426
せめてGoogleくらいは味方にしておこう。

429 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:00:13 ]
プリプロセッサの問題点はC言語の一部かどうかじゃなくて
コンパイラと完全に独立しているところ


430 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:11:51 ]
問題点ではないだろ

431 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:13:36 ]
問題でしょ。デバッグしにくくなるし、型チェックなども甘くなるし。

432 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 19:53:41 ]
プリプロセッサ部がCと強く結びついてるからなんだけどマクロの多用はどうかという一意見だす。
#include に変わるものは Cコンパイラに用意されてないし #ifdef のような部分も(あまり好きでないけど)うまく使うといろんな環境に対応したソースをまとめることができる・・

ただ #define で色々マクロ組むのはどうかな。
美しく無いばかりか副作用とバグを引き起こす危険な匂いすらある。置換されて結果コンパイラに渡るけど置換元がどうだったかをコンパイラは知らない・・いろんな落とし穴になる。普通に関数に書くのがいいと思う。

#define CONSTANT_VAL 50
ではな
const int CONSTANT_VAL = 50;

こう書けば char a = CONSTANT_VAL; とした時に警告があるし(アホなことした)と直ぐに気付くわけです。

433 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:00:28 ]
それは別に警告出ないと思う。
マクロは使わなくていいなら使わない方がいいってのは賛成だが、
C++ に比べて C はマクロを使わざるを得ない状況が多いのは確かだな。

434 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:01:59 ]
プリプロセッサディレクティブを勉強して間もない俺とするとすごい便利だと思うんだけど・・・
引数の型気にしなくてもいいマクロとか素敵じゃない?

435 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:03:47 ]
マクロはどう展開されてどう実行されるのかを理解して無いと
バグを生むことがあるってのがアレなんだろうね



436 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:10:13 ]
そんなとうにされつくしてる議論してんなよ・・・・・・・・

437 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:14:03 ]
>>436
入門篇って書いてあるし、議論すればえ〜ねん

438 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:16:43 ]
>>433
私はこのレベルの警告を出すようにしてる。

>>434
そう、ただ型を気にしなくて言いというのは有る意味危険な感覚だと。
#defin abs(x) (x) < 0 ? -(x) : (x) とすれば int, long, double いずれも行けるけど

a = -3;
k = abs(a++);

結果は悲惨になるけど気付きにくいでしょ?
これは関数でなくマクロなんだと意識しなければいけない。何かスマートでないよね。


439 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:19:39 ]
C++ だとそれを何とかするために関数テンプレートが導入されたが、
C だとやっぱどうしてもマクロになっちゃうんだよなあ。

440 名前:434 mailto:sage [2008/05/07(水) 20:24:50 ]
>>438
マクロの怖さを頭ではなく心で理解したわ

441 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:26:02 ]
ABSにすれば解決

442 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:52:15 ]
馬鹿が使えば包丁も自動車も凶器になる。

443 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 21:45:43 ]
>>435
それを言ったら無知と無理解はなんだってバグのもとだろ

444 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 21:51:07 ]
所詮人間一人なんてちっぽけな存在さ。自分一人なんて
この世の60億分の1に過ぎない存在。万能、全知全能、
絶対権力者の人間なんて存在しない。
人間なんて脆い生き物だ。打ち所が悪ければすぐに死んでしまう。
そんなもん。だから、気ぃ張るなや、適当に生きろ。
どうせお前が強がっても、地球の運命までは変えられないから。
せいぜい、政府与党に不満を持って、反対票を民主党に入れるくらいしかぁ
出来んやろ?なっ?俺はずっと共産党に投票してたけどな。

445 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:09:35 ]
マクロを使うと一見上級者のようでかっこいいんだけどね
地道に関数でということかな



446 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:12:57 ]
ふっ、例えポルシェやBMWを運転していようが、軽自動車を運転していようが
同じ道路交通法が適用されている道で守るべきルールは同じさ。
それよりも、ドライバーの運転技術はいかがなものか?他に、
アクセルペダルを思いっきり踏み込めば、エンジンの性能が良い車の方が
加速性は良いが、燃費はかなり悪い。見た目じゃないぜ、人間は。

447 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:15:20 ]
ええいお前のたとえは分かりにくい

448 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:35:14 ]
linuxのコンソール上でカーソルの処理を行いたいのですが、
カーソルの処理には何を使ったらいいのでしょうか?
ncursesはできれば使いたくないです。
ttp://oshiete1.goo.ne.jp/qa3121681.html
の方法だとカーソルキー押す度に"[b"などと出力されてしまいます。
よろしくお願いします。

449 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:12:49 ]
>434
型を気にしないプログラムがどうなるのか?コンパイラが事前に警告してくれるのはありがたいと思わないと。

450 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:21:56 ]
>>434
昔な、変数を宣言しなくても使えるBASICてのがあってな、綴りのミスを目で探したよ。・
昔な、プロトタイプ宣言のないCコンパイラがあってな、引数の間違いを目で探したよ。

451 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:23:27 ]
FORTRANなら普通の事です

452 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:25:14 ]
>>445
マクロ使っても全然上級者には見えないから安心して関数を使おう


453 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:28:26 ]
可読性、保守性の高いソースを書く人のほうが上級者に見える。
まあマクロはその手段の一つなんだけれども。

454 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:31:13 ]
浮動小数点の定数って定義できるんだっけ?
C++でも未だにマクロ使ってるんだけど

455 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:35:27 ]
別に定数を定義することくらいはできるけど。
ただ、初期化順でハマることはあるかもしれないね。



456 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:37:42 ]
voidポインタの参照先はビットシフトできないのかな?

457 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:40:54 ]
>>456
void*をint*にキャストしてシフトすれば?

458 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:43:20 ]
>>456
何ビット幅でシフトしたいかをコンパイラが判断できない。必要な幅の型のポインタにキャストする必要がある。


459 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:57:36 ]
キャストしたらできた!

これって任意のバイト数を指定することはできないのかな?
mallocで指定しても駄目だったし無理か・・・

460 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:59:21 ]
>>459
> これって任意のバイト数を指定することはできないのかな?
意味不明

461 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:16:42 ]
void*の参照先を任意のビット幅としてビットシフトしたいんです

462 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:18:04 ]
自分でそういうプログラム書け。

463 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:26:54 ]
>>461
それ、何のデータ?

464 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:28:38 ]
ビットシフトすりゃいいじゃん。

465 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:35:13 ]
>>463
void*の参照先ですか?
intとかcharとか不定です
void*とsize_tを仮引数にして、型に関係なくビット表示するような関数を作りたいんですが・・・



466 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:38:59 ]
とりあえずバイトオーダをはっきりしておかないとな。
リトルエンディアン環境の場合、数十バイトだろうが
その全体でリトルエンディアンになることを仮定していいのか、
それとも4バイト単位でリトルエンディアンになることを仮定するのか。

467 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:44:48 ]
>>465
char*にキャストして一バイトごと表示しろよ

468 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:51:12 ]
>>466
リトルエンディアンだとおもう
よくわからないから続きはwebで勉強してくるわ

>>467
おk試してみる

469 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:05:04 ]
>>461
できない
ビットシフトは組み込み整数型(のビット長)に対してしか保証されていない
どうしてもやりたいなら自力でそのような関数を作るしかない

470 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:11:23 ]
キャストすればいくらでもできるだろ・・・。

471 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:16:35 ]
>>470
んなアホな
charに分割したとしても、左右両端からあふれたビットは結局手動で詰めざるを得ないだろ

472 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:20:12 ]
もしかしてデータ圧縮なんかで使うビットごと入出力でも作ってんのかな
それだったらlhaの解説書見れば早いと思う

473 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:27:33 ]
>>471
結局できるんじゃないか

474 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:39:36 ]
>>473
「ビットシフト」の言葉の食い違いだったようだ
俺が考えてたのは組み込みのビットシフトのことね
そっちは概念としてのビットシフトだよな

475 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:41:10 ]
> 組み込みのビットシフ
なんじゃこれは?ト



476 名前:デフォルトの名無しさん [2008/05/08(木) 02:38:42 ]
プロトタイプ
static 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

477 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 02:57:27 ]
>>476
> 1) void mera(const char *merami)
> 2) void mera(const char* merazooma)
1) は C に多く、2) は C++ でみます。
どっちでも大差ないと思います。

478 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 02:59:49 ]
スペースがあるかないかだけじゃん。何で違うものだと思うの?

479 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:00:44 ]
>>477
おお、ありがとう。

480 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:20:48 ]
>>476
char *p も char* p も意味は同じ

スタイルについては、変数の宣言時にたとえば

char* p, * q;

などとするのが不自然という理由で

char *p, *q;

を推奨する人は多い


481 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:31:59 ]
追記

一方で char* p; を推奨する人は、変数名はあくまでpであるから
それがchar*であることを示すためにそうすると主張することが多い

ただし*はcharやint、あるいはstaticやconstのようにデータ型を修飾するものではなく
あくまで変数を修飾するものである(Cの変数宣言構文は [データ型] [変数名];
だから int const n, m; とは書けても char* p, q; とは書けない)ので、
構文的には変数名側に寄せることが正しい扱いであると言える

482 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:37:26 ]
×ただし*はcharやint、あるいは
○ただし*はcharやintのようなデータ型、あるいは

483 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 04:08:15 ]
もちろんスタイルの話だから、君はchar* pと書いてもいいし、char *pと書いてもいいし、さらにはchar * pと書いてもいいし、
また関数の仮引数リストにおいては与えられるものがおそらく配列である場合には、それを明示したいならchar str[]と書いてもいい

484 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 04:16:42 ]
たくさんのレスありがとう、勉強になりなす。

485 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 07:37:37 ]
>>476
×begiragon
○bagicross
なんで誰も指摘しないんだよー



486 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 13:10:17 ]
>>448
エスケープシーケンスを正しく読めばいいんじゃないかな
確か0x1bだったっけ? この次の文字は制御文字だから、それに応じた処理をすればいい。

カーソル位なら入力されたコードをじっくり眺めればすぐに分かると思うよ


487 名前:448 mailto:sage [2008/05/08(木) 19:42:21 ]
>>486
そうだったのかー!!
あれはエスケープシーケンスと制御文字が組み合わさってたん
ですね。だからあのプログラムで[Aとかが表示された訳だ。
どうもです。

488 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 19:43:21 ]
XPでコンソールのカーソルを移動させるにはどうすればいいの?


489 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 19:46:04 ]
スレ違い

490 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 19:46:11 ]
>>488
msdn.microsoft.com/ja-jp/library/cc429740.aspx

491 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 21:34:04 ]
mallocして帰ってきたポインタをfreeするとメモリを開放するらしいのですが、
freeにサイズを書かなくてなんでサイズがわかるんでしょうか。
#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;
}

492 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 21:38:08 ]
>>491
管理テーブルが別にあるから

493 名前:491 mailto:sage [2008/05/08(木) 21:52:55 ]
>>492
ポインタの前ではなくほかのところにあったんですね。
どうもありがとうございました。

494 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:04:26 ]
どうでもいいけど、ポインタを戻すのはよろしくないんじゃね?

495 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:13:52 ]
実際に確保されていることが確実な範囲(+1)を超えた演算の結果は保証されてなかった気がする



496 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:40:41 ]
>>492
ちなみに確保した前の番地に文字数があるのでは?と仮定してそれを確認するなら
int* ip = (int*)c;
long* lp = (long*)c;

こうしておいて
printf("%d : ", *(ip - 1));  // c 先頭から int 分戻った場所から数値として表示
printf("%ld : ", *(lp - 1));  // c 先頭から long 分戻った場所から数値として表示

こんな風に確認するというのもあるよ(どちらにしても結果は外してるけど)


497 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:50:03 ]
>>493

> ポインタの前ではなくほかのところにあったんですね。

それは処理系依存。
ポインタの前にある場合もあるだらう。


498 名前:デフォルトの名無しさん [2008/05/08(木) 23:11:55 ]
じゃああんま頻繁にmallocすると、逆に管理テーブルのぶんムダ使いになるんですかね??

499 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:13:38 ]
管理テーブルを保持することよりも、
空きメモリを探す処理とfreeの分、
CPU時間の無駄遣いになることを気にしたほうがいい気がする。

500 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:22:31 ]
ということはlinked listとかすごい効率悪いんだな・・・


ところでポインタのサイズ管理テーブルへのアクセスってどうやるの?

501 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:23:16 ]
実装によるとしか
mallocのソースでも眺めてみれ

502 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:25:09 ]
入門書クリアしたら次は何がいいかな?
アルゴリズム辞典とか眺めるの?

503 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:29:09 ]
linked list はスタック上にメモリをプールしておけばいいぜ。

504 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:29:32 ]
×スタック上
○スタック状

505 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 01:50:05 ]
>>502
良いソースを読むことだと思う
どの言語でも同じだと思うが



506 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 01:55:07 ]
何か作りたいものがあるから学んでいるのでは?
それを作るのにまだ足りないものがあるならそれを学べばOK
足りてるなら作ろう

507 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 13:06:55 ]
実際に自分の目的とするものを作ること
その過程で、どのようにすれば目的を達成できるのかを考える能力を身に着けること

言語仕様がわかってても要求を実現できない新人多すぎ
コーダーじゃねぇんだからさ

508 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 17:58:14 ]
0か1を要素にもつN次元のベクトルv(Nビットの情報ベクトルv)を入力した時
N個の要素はそれぞれ、確率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]) ; }
}

509 名前:508続き mailto:sage [2008/05/09(金) 17:58:40 ]

p = 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 ;
}

510 名前:509訂正。失礼しました mailto:sage [2008/05/09(金) 18:01:25 ]
p = 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 = 0 ; i <= N-1 ; i++)
{
if (u[i] == 2)
printf("X ") ;
else
printf("%d ",u[i]) ;
}
printf(")\n") ;

return 0 ;
}

511 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:31:39 ]
>>508
srand をループで毎回実行しない。最初の1回だけで良い。
32768.0 などという数字を直に書かず、(RAND_MAX+1.0) と書く方が良い。コンパイラによって rand() の最大値は異なる。
x<p でもなく x>=p && x<p+e でもない場合、u[i] の値は?

512 名前:508 mailto:sage [2008/05/09(金) 18:36:04 ]
>>511
その場合u[i]は変化しません。
擬似乱数間の扱いが違ってましたか、勉強になります

513 名前:508 mailto:sage [2008/05/09(金) 18:38:06 ]
あ、変化しないんだから
u[i] = v [i] ;
ですね。なんという初歩的なミス、ありがとうございました。

514 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:47:04 ]
久々に突っ込みどころ満載なコードを見た気がする

515 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 19:57:02 ]
>>502
pc11.2ch.net/test/read.cgi/tech/1209810861/
で手伝っていただけるとありがたいのですが、いかが?



516 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 21:39:27 ]
皆さんに伺いたいのですけど、

www.amazon.co.jp/Programming-Language-Version-Prentice-Software/dp/0131103628

C言語の決定版と言われるこの本、どうお考えでしょうか。

あと、これのC++版ありますが、ページ数が思いっきり増えてますよね。
こちらもできたら評価をお願いできればと思います。

517 名前:デフォルトの名無しさん [2008/05/09(金) 22:54:01 ]
本はいらないよ ネットのほうがいい それに基礎いくらやってもWindows(UNIX)アプリは作れない。
標準Cの数倍以上の分量はこなさないと無理。標準は共通部分だけの勉強だけ

518 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 23:06:49 ]
>>516
それ買っておきなさい。
ネットのは怪しいのが多い。
しかし洋書はたけえな。

519 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 23:09:36 ]
>>516
お前がどうしたいのかによる、まぁその本は教養というか理解が深まるとかそういうのだ

520 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 23:43:44 ]
>>516
スレチだけど、洋書は輸出費を考慮しても.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

521 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:04:24 ]
C言語そのものはとてもシンプルだと言うこと
#include によってもたらされる先輩方の資産と情報に振り回されない
目的をもってプログラムに取り組む
・・・
例えて、辞書を丸暗記するのか、あるいは目的を持って辞書を引くのか・・というのに通じると。
ライブラリ群の知識や使い方に重点を置くより「こうしたい関数は無いか?」とする切り口の方がいいのではないかなと。
どちらにしても有る程度は知識得ないといけない訳だけど。

522 名前:デフォルトの名無しさん [2008/05/10(土) 00:05:42 ]
自分見やすい(辞書)サイトを保存しておいて、AND OR NEARなどで全文検索しようぜ

523 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:06:11 ]
>>516
それは初心者向けでも玄人向けでもない微妙な本なんであんまりすすめない
推薦図書スレ>ttp://pc11.2ch.net/test/read.cgi/tech/1209441159/l50
感想スレ>ttp://pc11.2ch.net/test/read.cgi/tech/1064681919/l50

524 名前:デフォルトの名無しさん [2008/05/10(土) 00:10:00 ]
たとえば、空き実メモリの容量を知りたければ、 メモリ 容量 などで検索する。

525 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:14:21 ]
シンプルに見えて実はぐちゃぐちゃ それがC



526 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:16:21 ]
Cをちゃんと理解したかったら、コンパイルした先のアセンブラと対比させるのが一番だと思う。
それが可能なのがCの最大の利点であり最大の欠点だから。

527 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:20:16 ]
まず独習かダイテルあたりのしっかりした入門書で基礎仕様の理解を押さえる
その上でひたすら「目的意識を持って」コードを書きつつCFAQを流し読めば十分

528 名前:516 mailto:sage [2008/05/10(土) 08:23:53 ]
レス色々ありがとう。

自分はプログラミングはちょっとやったことありますが、C言語に
ついてはさっぱりです。プログラミング言語Cがあれば何もいらない、
って話を聞いたんですけど、ちょっと古い本だしどうなんだろうなぁと。

だけど、薄い本なんで、これでC言語が概観できるというなら欲しいと
思ってます。

>>523
こういうスレがあったんですね。ありがとうございます。

529 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 11:02:19 ]
ただの趣味だからって、効率悪くてもなるべく自作するようにしてる俺エドモンド本田

530 名前:デフォルトの名無しさん [2008/05/10(土) 16:04:28 ]
複数行文字列(100行以上)を標準出力に書き出す際、
\ で複数行まとめて書くとインデントが使えず見辛い。
別の方法を考えたところ

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 は使用を控えたい。

悔しいのでスマートな書き方教えてくれ。

531 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:07:53 ]
 printf("黒い0服\n"
     "お茶を1杯\n");
でいいよ

532 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:08:31 ]
別のテキストファイルにして読み込む
マジおすすめ

533 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:09:19 ]
あぁでもprintfに直接文字列は推奨されないよ
%入ってるとまずいからだけど

534 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:12:28 ]
putsでいいだろ

535 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:26:36 ]
そこでfputsですよ



536 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:37:01 ]
ABC &
上記の様にバックグラウンドプロセスABC に、パラメータを与えて実行させるのは
どの様にすればいいのですか?

537 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:43:21 ]
それはシェルの役目

538 名前:デフォルトの名無しさん [2008/05/10(土) 16:45:35 ]
>>531
あぁ , 無しで繋げられるのだっけか。
でも , をつけてしまいやすいので使い方だけ覚えとく。
>>532,533
メモっとく。
>>534
 puts("青6し");
 puts("むらさき7ぶ");

 puts(
  "むらさき7ぶ\n"
  "灰ヤー"
 );
のような感じか。

もう少し考えてみるわ、サンクス。

539 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:50:35 ]
本題より例文が気になって仕方がない。むらさきしちぶ?

540 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:54:17 ]
抵抗のカラーコードの語呂合わせだろ。
俺は「青二才のろくでなし」って覚えているんだけど。

541 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 18:44:45 ]
失礼しms。

ttp://www.uploda.org/uporg1415339.c.html

上記のようなコードを書いたのですが、
bの領域を解放するときに
”Windows によって aaaaa.exe でブレークポイントが発生しました。ヒープが壊れていることが原因として考えられます。aaaaa.exe または読み込まれた DLL にバグがあります。”
のようなエラーが出てしまいます・・・。。。

確保していない領域にアクセスし、それをフリーしようとしたときにおこるエラーみたいなことがググったら書いてあったのですが、
double** b; が確保されている領域と、callocで追加確保された領域が連続でないということでしょうか?
またそのせいでこのエラーがおこっているのでしょうか?

ご教授願います。よろしくお願いします。。。

542 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 18:50:19 ]
>>541
> memmove(b, a, sizeof(a[0])*sizeof(a[0][0]));
これのせいで同じ領域を二回 free している

543 名前:541 mailto:sage [2008/05/10(土) 20:38:45 ]
>>542
memmoveだとだめなのでしょうか?

544 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:42:06 ]
>>543
何がやりたいかによる
a[y][x] に格納されている double の値をコピーしたいのであれば

for(y=0;y<N;y++) memmove(b[y], a[y], N*sizeof(a[0][0]));

545 名前:541 mailto:sage [2008/05/10(土) 20:45:19 ]
やりたいことはその通りなのですが、今の状態だとポインタをコピーしてる状態ということでしょうか?



546 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:47:01 ]
>>545
  V /  / _,, ァ=ニニ:}       _
   .V  /,.ィ"f= <r'ニ三{        |_    ┐   _l_ l
    'vf^<''"  弋z.ミ'テtフ       |_ Х □_ 匚 L | У
    〉!ト _ i{ ´ ̄r' =|'
   ./ェ゙‐ェi.    、__`_ヤ     ( その通りでございます )
   ./iュ.Hヽ.、   ゙,ニ/
  -^ ー'-.、,i._`ヽ,.仁リ
  ー - .、     /、

547 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:50:49 ]
>>542,544,546
なるほどです。つながりました。ありがとうございました><


548 名前:デフォルトの名無しさん [2008/05/11(日) 01:50:19 ]
初心者です。すみませんがアドバイスお願いします。

char (*pacX)[3];

とした場合、pacXは3要素のchar配列へのポインタになると思いますが、
このような変数「の配列」を以下のように動的に確保するとします。

int iNum = 2;
char (*pacX)[3] = new (char)[iNum][3];

この場合、ポインタ変数が2つ(iNum分)確保されるのでしょうか。それとも、それらが指す3要素のchar配列2つ分のメモリまで確保されるのでしょうか?


549 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 01:52:50 ]
typedef して考えてみよう。

typedef char CharArray3[3];
CharArray3* pacX = new CharArray3[iNum];

550 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 01:56:23 ]
newてC++やん

551 名前:デフォルトの名無しさん [2008/05/11(日) 02:13:33 ]
>newてC++やん
すみません、確かにそうですね。

>>549
なるほど。。。元の質問で言えば後者の「それらが指す3要素のchar配列2つ分のメモリまで確保される」ということなのですね?
イメージ的には 「char aacX[2][3]」と同じ分のメモリが確保されて、さらにいえば
delete [] pacX;
とすることで開放されるということよろしいでしょうか?


552 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 02:24:13 ]
>>551
そういうこと。

553 名前:デフォルトの名無しさん [2008/05/11(日) 02:28:42 ]
>>552
ありがとうございました。

554 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 04:05:19 ]
>>548
その記述ちょっと気色悪い。一歩間違うと関数へのポインターと見間違えちゃうし。

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];  でいいと思うけど。

555 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 04:06:45 ]
>>554
内容が理解できない人は黙っておいた方がいいよ。



556 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 06:00:32 ]
char *a[3] ポインタの配列
char (*a)[3] 配列のポインタ

557 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:22:40 ]
CGIにC使ってる人ってあまり見かけないんだけど、CでCGIってダメダメなの?

558 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:33:06 ]
実行速度的には悪くないけど、LLに比べるとテキスト処理が面倒なのと、非セキュアになりやすい(バッファオーバーフローとか)からじゃないかねぇ。

559 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:40:20 ]
単にcコンパイラ使わせてくれる鯖が少ないからじゃないの?

560 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:43:33 ]
>>559
どの言語が用意されているかというのは、Web制作板的な視点じゃないか
プログラム板的には、どの言語で実装するのが適切かという話題だと思ってたが。

561 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:47:22 ]
>あまり見かけないんだけど
とあったからそれに沿うように答えただけなのだが。
性能的には何ら問題ないと思う、とつけたほうがよかったかな?

562 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:06:01 ]
なぜCコンパイラ使わせてくれる鯖が少ないか、
というところまで考え出すと、
結局 >>558 に行き着くんじゃないかと思う。

563 名前:デフォルトの名無しさん [2008/05/11(日) 11:41:06 ]
数列の最大値を計算するアルゴリズム 数列:0、3、1、4、7、2、8

お願いします。

564 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:45:28 ]
>>563
わかりました
消えてください

565 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:48:20 ]
宿題丸投げは宿題スレへ



566 名前:デフォルトの名無しさん [2008/05/11(日) 12:00:34 ]
><

567 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 12:22:18 ]
>>563
max(0, max(3, max(1, max(4, max(7, max(2, max(8)))))));
><

568 名前:デフォルトの名無しさん [2008/05/11(日) 14:42:42 ]
適当に数字を入力して
その数字をまたある数で割って割り切れたらその値を出力して
割り切れなかったら余りだけをまた別の小さい値で割りきれるか
って繰り返して最終的には割り切れるプログラムを作りたいんですが・・・
例えば1020を500で割ると2余り20で2が出力され
余り20を10で割って2が出力されるみたいな
ヒントでもいいんでお願いしますm(_ _)m


569 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:23:44 ]
その日本語を1行ずつCに翻訳していけばいいと思うよ

570 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:24:56 ]
ってある数で割るって何で割るんだよ
1020を1020で割って余り0で終了、じゃだめなの

571 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:25:52 ]
意味が分からん

ある数って何だよ
入力した値か?

572 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:28:12 ]
>>558
速度的にはアレなんじゃね?
スクリプト系のmod_*みたいな仕組みってCでは一般的でないし。
2chは、やってるみたいだけど。

573 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:10:07 ]
>>568
ユークリッドの互除法?


574 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:12:50 ]
568です
説明が下手ですいません
レジのおつりを渡す要領で
適当な値を入力して500、100、10、1で各々割って何が何枚必要か求めたいんです


575 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:14:36 ]
どこが分からないのかわからない。
それをそのままコードに落とせばいいだけだろ



576 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:19:33 ]
つりの硬貨の枚数が最小になるようにとか、なにがしかの条件がついてるけど、それが説明できてないんだろ?

577 名前:デフォルトの名無しさん mailto:sage [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];
}
}

578 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:19:57 ]
ちょっと自分でやってみます
迷惑かけてすいませんでした

579 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:20:39 ]
自己解決しました

580 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:31:40 ]
エロイ人教えてください!

エクセルで作成したファイルをスターファックスで
VBAなどで自動送信出来ませんか?
キーボードマクロなるフリーソフトを見つけましたが
自分ではうまく設定できません

イメージは以下の感じです
@送信ファイルをエクセルで作成
AVBAでスターファックスを起動
Bキーボードマクロ等で送信先を自動入力
Cエクセル画面に戻る

初心者丸出しですいませんが宜しくお願いします

581 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:31:49 ]
どうでもいいが、とってもありがちな課題だな。

582 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:58:37 ]
>>580
こんなソフト作ってくださいスレに行きやがれですぅ

583 名前:580 mailto:sage [2008/05/11(日) 18:05:44 ]
>>582
そんなスレあるんですか?
移動します スンマセン


584 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 18:17:49 ]
ある下記のような2つのcsvファイルの「商品コード」という項目を比較して
実績ファイルにある「商品コード」が、商品コードマスタに存在するかどうか
をチェックし、あったらその後の処理へ、なかったらエラーを出すといったプログラムを作りたいと考えてます。

(売上ファイル.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行読み込む
といった機能を使うのかなと思いましたが、商品コード部分のみを取り出して比較するやりかたがわかりません。
(また、全てのデータの桁数は変わる可能性があります)

あつかましいですが、よろしければサンプルコードも提示して
いただけたらありがたいです。



585 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 18:28:17 ]
>>584
(っ´▽`)っ
char shohinCode[256];
char shohinName[256];
int tanka;
fscanf(fp, "%s,%s,%s", shohinCode, shohinName, &tanka);



586 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 19:25:26 ]
>>584
(っ´▽`)っ

#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;
}

(続く)

587 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 19:26:07 ]
>>586の続き

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);
  
  qsort(sm, count, sizeof(sm[0]), cmp);

(続く)

588 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 19:26:48 ]
>>587の続き

  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);
}


589 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 19:35:31 ]
(っ´▽`)っ
さあ感謝しなさい☆
(っ´▽`)っの足を舐めなさい☆

590 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 20:03:04 ]
変なコテだけど、いいやつだな。

591 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 20:16:41 ]
無意味にコテつけてる時点で・・・

592 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 20:46:21 ]
(っ´▽`)っ
>>586-589には
リソース解放漏れがたくさんあるから注意してね☆

関数existInMasterのEND:の直後に
fclose(fp);
if(sm != NULL){
  free(sm);
}
を加えるんだ☆

593 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 20:48:10 ]
>>591
(っ´▽`)っ
無意味にコテ!?
(っ´▽`)っはコテつけるのが当たり前なの!
www.google.co.jp/search?lr=lang_ja&num=50&ie=utf-8&oe=utf-8&q=%22%E2%97%860351148456%22

594 名前:584 mailto:sage [2008/05/11(日) 21:03:04 ]
ご親切にありがとうございます。
ちなみにこのままコピペしてとりあえず実行してみようと思ったら
100個を超えるエラーが出たのですが、そのままではいけないのですかね?

とりあえず、解読動くかどうかより
解読して、流れを理解することをがんばります

595 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 21:05:25 ]
>>594
(っ´▽`)っ
インデントに全角スペース使ってるからね。
半角スペース、タブ文字は、2chでは表示されないの。
コピーしたら全角スペースを全て半角スペースに置換してね。



596 名前:584 mailto:sage [2008/05/11(日) 21:13:39 ]
>>595
了解しました。
なにからなにまでありがとうございます。

597 名前:584 mailto:sage [2008/05/11(日) 21:24:18 ]
>>595
すみません、もうひとつ。

今解読中なのですが、理解の手助けに
・処理の流れ
・このプログラムの入力と、出力値
など、簡単に教えていただけませんか?
本当の初心者ですみません。

598 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 21:26:57 ]
HTMLの使用も理解できない馬鹿がいる。

599 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 21:31:20 ]
>>598
それを言うならHTMLの仕様だろ、と。
まぁ、変数宣言の変数名を揃えようとする辺りでお察しだから。

600 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 21:34:46 ]
灯台や鏡台の先生からは sed の使い方とかは習わなかったんでしょうかね?

601 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 21:50:09 ]
>>597
自分がどういうプログラム要求したか覚えてる・・?
見ていくと何となく流れがつかめるでしょ
どこまで理解したか言わないと答え丸写しで理解した気になる子になるよ

初心者≠免罪符

602 名前:側近中の側近 ◆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);


603 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 22:40:30 ]
  /*商品マスタ配列を商品コードの昇順に並べる*/
  qsort(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);
}


604 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 22:44:43 ]
>>597
(っ´▽`)っ>>602-603
これで満足か?

605 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 22:52:56 ]
(っ´▽`)っ
売上ファイルも商品コードの昇順に並べると
もっといい感じになるかもね。



606 名前:デフォルトの名無しさん mailto:sage [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);

すいませんが、アドバイスよろしくお願いします。


607 名前:606 mailto:sage [2008/05/11(日) 23:33:02 ]
現在使っているソースコードは以下になります。
int 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;
}


608 名前:606 mailto:sage [2008/05/11(日) 23:35:17 ]
すいません、書き込んだ後、インデントがされてないのに気がついつきました。同じソースですが
int 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;
}

609 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 23:38:06 ]
なんというstrtok

610 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 23:38:19 ]
>>608
sscanf(str, "%s%n", ...)

611 名前:606 mailto:sage [2008/05/11(日) 23:40:42 ]
 実際に処理をしている部分は冗長になってしまうため、以下のコードが
入っている部分で、処理を実施していると考えてください。

fprintf(stderr, "buff=%s, next=%s\n",buff, next);


 また、src_strの内容が変わってしまう点は仕様として、その様にしてます。
よろしくお願いします。

612 名前:606 mailto:sage [2008/05/11(日) 23:59:40 ]
>609
 確かに、この処理内容だと、strtokで十分ですね・・・。文字列群で区切るstrでは
不便な事が多く、strsplitという文字列パターンで区切る関数を作成しており、何も考えず
そのまま使用していました。ご指摘ありがとうございます。

>610
 すいません、その処理はダミー変数を利用する方法とは異なる方法なのでしょうか?
つまり、下記の様な処理とは別の処理ということなのでしょうか?

sscanf(str_str,"%s %s %s %s %s",str1, str2, str3, dummy, dummy);




613 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:39:57 ]
rand関数は合同乗算法ですか?

614 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:42:50 ]
仕様上特に決まってない。

最近は lagged Fibonacci なこともあるようだ。

615 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:45:03 ]
>>613
どういう方法でなければならないという規定はない。
現実には線形合同法がよく使われている。



616 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:48:45 ]
>>613
大概そうですよ

617 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:50:38 ]
>>614-615
レスありがとうございます。

c言語で書くと
a[i+1]=a[i]*j%10*10*10*10
で良いのですか?(a[i+1]=j*a[i] (mod10^4))

618 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:54:19 ]
数学板から飛んできたか
a[i+1]=a[i]*j%(10*10*10*10)
というか
a[i+1]=a[i]*j%10000
でいいんじゃないのか

619 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:55:54 ]
すみません質問を変えます。
0から1の範囲の乱数を合同乗算法で書くにはどのように書けばいいですか?

>>618 ばれたか・・・正直kingはウザイと思っています。

620 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:58:13 ]
数学板でも思ったんだが、前の質問に答えてもらってるのに、
それに何の反応もせずに「質問を変えます」はないだろ。社会常識的な意味で。

621 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:59:29 ]
>>620
すみません・・・

622 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:00:11 ]
整数の 0〜(n-1) の乱数を発生させて
double にキャストして n で割ればいいんじゃない

623 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:02:03 ]
>>622
レスありがとうございます
a=rand()/(RAND_MAX+1.0);
としてもいいのですが>>618さんの方法で書くことはできませんか?

624 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:04:35 ]
a[i+1]=a[i]*j%10000;
b[i+1]=a[i+1]/(10000.0);

625 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:32:58 ]
>>624 ありがとうございます
一応書いてみたのですがエラーが出てしまいます
どこがおかしいですか?ちなみに円周率を求めるプログラムです
#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;
}



626 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:36:24 ]
数字を渡したら曜日を表示する関数を作ったのですが、関数内に
char youbi[7][] = {"日曜日", "月曜日",....}
と書きました。
これだと関数が呼ばれるたびに変数を作って文字列を入れてることになりますよね?
頻繁に呼ぶ関数にこういうことすると速度などに悪い影響ありますか?

627 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:36:32 ]
double i

628 名前:626 mailto:sage [2008/05/12(月) 01:37:21 ]
すみません訂正します。
char youbi[][7] です。

629 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:38:28 ]
>625
iをintで宣言すること。

>626
ある場合もあるし、無い場合もあるが、大抵の場合気にするほどの差ではない。

630 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:38:30 ]
&はアンパサンドだけど
|はなんていうんだっけ?
なかなか検索ひっかからないんだよね

631 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:39:40 ]
>>627
そうですね・・・すみません
でも、 配列または、ポインタでない変数に添字が使われました。とエラーがでます・・・
どこを直せばよいですか?


632 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:39:53 ]
パイプ

633 名前:626 mailto:sage [2008/05/12(月) 01:41:06 ]
>>629
ありがとうございます
気にしないことにします

634 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:41:24 ]
>>631
そこまでエラーメッセージ読んでてわからないほうがどうかしてる

635 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:42:22 ]
>>631
それくらいコンパイラが懇切丁寧に教えてくれてるだろうに無視すんなよ
頼むからエラーをこぴぺしてくれ



636 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:42:39 ]
>631
配列でもポインタでもないものに添え字が使われたから。あとは行番号を見ること。

念のために言っておくが添え字とは[?]の部分のこと。

637 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:43:07 ]
>631
double b;


638 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:44:55 ]
せめてエラーメッセージの意味を考えることくらいはしてほしいよまったく
ただのcharの配列にしか過ぎないのかっての

639 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:45:36 ]
>>634
あ、bを配列で宣言するのを忘れてました・・・
ありがとうございます
やっぱりプログラムは苦手だなあ

数学板の回答者に戻ります

640 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:46:40 ]
オーバーフロー・・・

641 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 02:46:41 ]
数学板ってあんなんでも回答側になれんの?

642 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 05:18:50 ]
わざわざ自称している時点で…

643 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 06:01:05 ]
↓聖徳太子知ってる?知らない?

644 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 06:28:38 ]
乗算合同法や線形合同法の利点ってメモリ使わないことなのに、
配列に保存してどうすんだよw

645 名前: mailto:sage [2008/05/12(月) 06:56:00 ]
ttp://jp.youtube.com/watch?v=RIL28wqOQGA



646 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 07:36:33 ]
>>626
staticを付けるといい。
ついでにconstも付けるとさらにいい。

647 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 07:49:12 ]
>>612
%nの仕様は調べた?

>>626
static const char * const youbi[] = {"sunday", "monday", ...}

648 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 09:15:06 ]
リテラル参照はこっちのほうがいいかも?
char *youbi[7] = {"日曜日", "月曜日",....}

好みの問題ですかねぇ・・・

649 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 11:15:18 ]
>>648
それだと毎回youbiを更新するコストが発生するし、constによる保護ができない。
ついでに言えば、態々7という定数を埋め込む意義が全くない。

650 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 12:37:55 ]
確かにスタックに積む場合にはその分の手間がかかるけど、staticのほうがデータ参照は遅くなるんじゃないかったっけ?

651 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 12:44:16 ]
const だけつけとけばコンパイラが何とかしてくれそうな気がするんですがどうなんですか?

652 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 12:50:33 ]
抽象的な質問しないで、具体的に質問してくれ。
つーか、入門者がパフォーマンスを気にするな。

653 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 13:07:40 ]
曜日文字列を使うような関数が、パフォーマンス気にするほど頻繁に呼ばれてるとは思えないねぇ
そうだとしても実測してみなきゃわかんないしね

654 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 13:11:25 ]
>>653
もし頻繁に呼んでるとしたら、いっそ廃止して
その上の(おそらくループの本体がある)関数で文字列をautoに積んで
インラインで処理させたほうが速いだろうね

655 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 13:19:00 ]
>>629で終わった話をいつまでグダグダやってるんだ



656 名前:デフォルトの名無しさん [2008/05/12(月) 13:22:59 ]
TEST.Cをコマンドプロンプトで指名してコンパイルする時、拡張子が.Cだとコンパイルできなくて.cだとコンパイルできたんだけど、.Cと.cって違うの?

657 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 13:26:35 ]
>>656
少なくともそのコンパイラにとっては違うからコンパイルできなかったのだろう。

658 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:05:58 ]
ファイル名の指定を間違ってたんじゃないの
ファイル名の大文字小文字を区別する環境としない環境があるから、それも書いてくれ

659 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:16:09 ]
Sun辺りは.CはC++の拡張子だった希ガス。

660 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:24:22 ]
上の
static const char * const youbi[]
って何でconst2つも付けるのかが分からないんですが
static const char * youbi[] じゃあダメなんですか?

あと、普通の変数でも
static const int const とかやる必要はあるんですか?

661 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:30:52 ]
static const char *youbi[]
youbiの先の文字列が書き換え不可能

static char * const youbi[]
youbiが書き換え不可能

static const char * const youbi[]
両方

662 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:36:31 ]
static const char *youbi[]
 は "火曜日" って文字列を "火曜"

663 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:38:16 ]
途中で書いてしまった

static const char *youbi[]
 は "火曜日" って文字列を "火曜" に変えたりするのが不可能で
static char * const youbi[]
 は youbi[1] に別の文字列のポインタを渡すのが不可能になる

って事なんですか?

664 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 15:54:23 ]
const char *youbi[] は
const char 型のポインタ(文字列定数)を入れる youbi配列で、新たに文字列定数のポインタを入れることは出来て、
char * const youbi[] は
youbiの中のポインタ変数固定だから、文字列そのものは書き変えられてもポインタの指す先は変えられないって事なんですね

やっと理解出来ました
ありがとうございます

665 名前:デフォルトの名無しさん [2008/05/12(月) 16:40:42 ]
#include<stdio.h>
double 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の値の総和を計算するプログラムを作れ。
これをだれかお願いします。




666 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 16:42:08 ]
>>665
わかりましたちょっとまっててください

667 名前:デフォルトの名無しさん [2008/05/12(月) 16:46:32 ]
>>657  なるほど〜 コンパイラの仕様か〜
>>658  指定の仕方は大丈夫なはず コンパイラはMinGW これでいいのかな?
>>659  Sunってコンパイラ名・・? コンパイラによって違うってこと?

668 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 16:55:13 ]
宿題丸投げは宿題スレへ

669 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 17:15:43 ]
>>667
>>659  Sunってコンパイラ名・・? コンパイラによって違うってこと?
Javaを開発し、OpenOfficeを提供している世界最大級のコンピュータソフト・ハード兼業企業。
古くから、SunOSというUnix系のOSを作っている。

670 名前:デフォルトの名無しさん [2008/05/12(月) 17:55:41 ]
あ〜 なるほど OSによって違うってことか〜
勉強になりました

671 名前:デフォルトの名無しさん [2008/05/12(月) 19:47:16 ]
配列に配列を足すことってできないの?
a += b; みたいな

672 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 19:58:27 ]
Linux上では問題なく動作したのですが、
windows(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フォルダとその上のファルダに置いています

673 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:00:38 ]
>>672
ソースファイルと同じ場所に置けばいけるはずだけど

674 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:01:55 ]
exeと同じ場所

675 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:05:20 ]
>>673
日本語読めますか?

>>672
それが原因かどうかは判らんが、"rw"は間違い。
実装によってはファイルが空になってもおかしくない。

>>671
できません。配列の要素ごとの足し算ならループから書くことになります。
配列の連結と言うことなら、malloc(), realloc()を使うことになるのでその辺りを先ず勉強する必要あり。



676 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:06:59 ]
>>671
それだけの日本語ではさっぱりですよ。
たぶんこういうこと?
for ( int i = 0; i < SIZE; i++ ) {
a[ i ] += b[ i ];
}

677 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:07:58 ]
>>673-674
ファイルの置き場所に問題があるのかと思い、ソースがある場所を含め、
プログラムに関係ありそうなフォルダ全てに置いたのですが、解決しませんでした…

これは、BCCの環境設定?を変更・追加する必要があるのでしょうか?

>>675
Linuxで動いたのは運が良かったからかもしれません…
指摘していただいた点について、もう一度解決法を探してみます


678 名前:677 mailto:sage [2008/05/12(月) 20:16:39 ]
"rw"を"r"にした所、正常に動作しました!
よく考えてみれば、書き込みする必要がないので、"w"は不要ですね…

>>673-675
つまらない質問にも関わらず、素早い対応して頂き、
本当にありがとうございます

679 名前:デフォルトの名無しさん [2008/05/12(月) 20:27:05 ]
>>676
そうだけど

構造体のときは不便だなって思った

680 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:28:31 ]
そう思ったんならC++へ旅立ってしまえ

681 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:54:06 ]
>>679
そんなのラッパー関数かいときゃ次からは楽じゃないか。

682 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 21:25:44 ]
>>641
なれるよ
数学なんて実に簡単なことだ

683 名前:デフォルトの名無しさん [2008/05/12(月) 22:34:04 ]
C言語勉強したいのですがフリーソフトはないんでしょうか?

684 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 22:34:47 ]
>>683
ぐぐれ

685 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 22:39:47 ]
>>683
マイクロソフトが無料で配布してるよ



686 名前:デフォルトの名無しさん [2008/05/12(月) 22:52:43 ]
www.microsoft.com/japan/msdn/vstudio/express/default.aspx
これですか?どれをダウンロードすればいいんでしょうか

687 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 22:53:37 ]
>>686
visualC++だ
そしてとっととうせろ

688 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 22:54:42 ]
>>686
登録とかめんどくさいからBCC使うといいよ
俺はvisual C++使ってるけど

689 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 23:01:50 ]
BCC もメルアド登録必要じゃね?

690 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 23:02:36 ]
デバッガは登録必要だったような気がするけど
コンパイラは要らなかったような…

691 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 23:03:17 ]
>>689
いらない

692 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 23:06:20 ]
あれ? メルアド変わるまでスパムのように来てたんだが。

693 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 23:12:22 ]
VC++も登録いらんだろ
isoを落とせば

694 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 23:13:13 ]
それめんどい

695 名前:デフォルトの名無しさん [2008/05/13(火) 08:04:28 ]
C++のプログラム作ろうと思ったらVBの作成画面みたいなんですけど
単純にC言語のプログラムを作りたい時はどうしたらいいんですか?



696 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 08:08:04 ]
>>695
お使いのソフトウェアのスレへどうぞ。

697 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 08:14:19 ]
>>695
誤 C++のプログラム作ろうと思ったらVBの作成画面みたいなんですけど
正 VisualC++でC++プログラム作ろうと思ったらVBの作成画面みたいなんですけど

Win32コンソールアプリケーションを選べ

698 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 08:19:27 ]
>>697
それだとスレ違い。ここはCスレ。

699 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 13:56:55 ]
実行時に与えられる条件により異なる値で初期化して、
以後はconstに扱われるような変数を宣言することはできますか?

700 名前:699 mailto:sage [2008/05/13(火) 13:59:49 ]
追記 環境変数のような働きをするグローバル変数です

701 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 14:34:04 ]
>>699
実装によっては可能かもしれないが、直接に行うことは一般的にはできない。
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以外で変更されることはない。

702 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 15:17:07 ]
あとは、取得用の関数を公開する形にして
当該の変数をstaticにしてほかのファイルからは見えないようにするとか、
const変数を動的初期化できるC++へ移ってしまうとかが考え付く。

703 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 15:32:16 ]
int GetValue()
{
  static int value=-1;

  if(value < 0){ /* 最初に呼び出されたときに初期化される */
    :
    :
  }

  return value;
}

#define VALUE GetValue()

な手か

704 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:14:38 ]
失礼します。

void hoge(double** matrix)
{}

等として受け取ったdouble**の配列の要素数をその関数内で知るすべがあったらご教授願います。

705 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:24:57 ]
ありません



706 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:33:22 ]
配列matrixの終端要素になにか特別な値が格納されていれば
それを検出することで長さを知ることができる
そうでなければ無理

707 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:00:51 ]
char name[100];


name="hoge.txt";

みたいに代入したいんですが、エラーになります。
*name="hoge.txt";
でもできません。どうやるんでしたっけ?

708 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:04:40 ]
何で駄目なのかはわかる?

strcpy(name, "hoge.txt") とか?
strncpy(name, sizeof(name) - 1, "hoge.txt")か

709 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:07:16 ]
>>708
すいません。わからないので教えていただけるとありがたいです

710 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:24:03 ]
>>709
Cでは配列は二級オブジェクト(メモリ上に存在するが演算の対象にならない)で、
配列名は大抵の場合配列そのものではなく配列の先頭要素のアドレスを意味する。
アドレスに代入することはできないので、name="hoge.txt"; のような文は無効になる。
配列名に対して直接=演算子が使えるのは、宣言時に初期化するときだけである。

配列に対して任意の配列をコピーするにはmemcpyやmemmove、
あるいは配列が'\0'で終わるcharの配列(文字列)である場合にはstr〜系の関数を使う。

711 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:43:39 ]
1)
strcpy(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)を使う

712 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:51:33 ]
わかりました!どもうありがとうございました

713 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 18:00:36 ]
>>711
横見だが 2 および 3 の引数の並びちがうぢゃろ。
strncpy(name, "hoge.txt", sizeof(name) - 1);
name[sizeof(name) - 1] = 0;

714 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 22:24:12 ]
文字列リテラルをコピーするのにstrn*()を使うのか……

715 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 22:24:59 ]
当然だろ



716 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 22:26:55 ]
sprintfでおk

717 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:18:04 ]
だからオーバーフローが・・・

718 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:20:16 ]
オーバーランじゃねーの?
それともオーバーフローでもおkなの?

719 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:21:04 ]
おk

720 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:22:55 ]
ttp://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%83%B3
ラン姉ちゃんの方でした、すまそ

721 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:25:09 ]
>>717
桁数勘定して sprintf(b, "%100s", s); って, 書けば OK なんじゃないの?


722 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:32:56 ]
>>720
バーロー

723 名前:デフォルトの名無しさん mailto:sage [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βはまだ試してない

724 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:57:31 ]
>>723
未定義動作だからどうなっても文句は言えない

むしろどうなると思ったんだよ・・・

725 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:59:10 ]
副作用完了点



726 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 00:01:58 ]
>>721
いや、そういう意味じゃなくて・・・それらの問題点は
プログラムそのものがトラブルを起こしてしまう仕組みを持っていることであって
問題の無い範囲内でユーザが使う分にはなんら不具合には気づかない、起こらないわけで・・・

727 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 00:06:18 ]
>>724
え。一発目の*ary++が1に、二発目の**ary++が2に、…
…いや、最適化で順序がどうなっても、i==3にはなると思ったんだ
/Fa によると、どちらも*aryになり、そのあとで2回ary++が発生してた

どこで未定義なんだろう…。

// ここでリロード

>>725
ヒントありがとう ぐぐったら一発 必ずしも都度都度副作用が発生するわけじゃないのか
アマだが、聞かねば一生のバグ撒き散らしになるところだったよ 恥晒してよかった

728 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 00:21:13 ]
ary = ary++;

729 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 00:22:15 ]
>>728
いやそれを書き込む意味が和漢ね

730 名前:723 mailto:sage [2008/05/14(水) 00:28:52 ]
>>729
これを考えてみろ。ってことだろう

実際にVC9EEにつっこんで結果を見てみた
ary = ary;
ary++;
になった 俺には示唆に富んでると思う

731 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 00:29:43 ]
>>723
未定義だけど、1^1で0になってる気がする

732 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 00:38:23 ]
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
調べたら色々書いてあった

733 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 01:24:07 ]
直前の副作用完了点と次の副作用完了点までの間に、
式の評価によってオブジェクトに格納された値を変更する回数は
高々一度だけでなければならない。更に、変更前の値は、
格納される値を決定するためだけにアクセスしなければならない。

734 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 01:25:37 ]
pc11.2ch.net/test/read.cgi/tech/1201153965/157

735 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 06:32:45 ]
初心者なんですが、お願いします
文字列を式として扱って計算結果を出力する
というような便利な関数ってあるのでしょうか?






736 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 07:26:22 ]
標準ではありません。頑張って作ってください。

まぁ、unix系ならシェルで計算すれば済むけどね。

737 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 07:30:10 ]
Java、JavaScriptだと eval というものがあるんだが、自分で実装するっきゃないね。

738 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 09:05:47 ]
簡単な計算させる程度なら、bison/flexあたりでどうにか。

変数が入るようなやつなら、いろいろあるけど、いっぺんPerlとか使うといいと思うよ
Perlで書く。のではなくて、perl*.dllをつつくように書く あれはインタフェースがCだから。
セキュリティの確保とか結局いろいろ大変になるだろうけど、示唆に富んでていいと思う

739 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 10:10:26 ]
>>735
ttp://www.google.com/codesearch?hl=ja&q=+lang:c+eval+show:LKM9fPKCrz0:r3iT8J84R1w:wri6GBkgM20&sa=N&cd=1&ct=rc&cs_p=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行程度で実装している例がある。


740 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 13:49:08 ]
学校の課題で
「関数の中で宣言した値は、関数の実行が終わった後どうなるのか?たとえば二度目に関数を呼んだとき値を読んでみたら
どうなるのか?」
って問題が出たんだけど答えどころか質問の意味すらわかりません。よかったら教えてください。

741 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 13:53:49 ]
ローカル(自動)変数とか、静的(スタティック)変数とかを教える意図の質問じゃないのかな?

742 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 13:54:37 ]
>>740
void hoge(void)
{
   int a;   ← A
   a = 2;
   a = a * 2;
} ←@


void main (void)
{
   hoge();
   hoge();
}

@関数終わったらaはどうなる?
A2回目のhoge呼び出しの時、このaに4が入っていると思うか?

743 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 13:56:53 ]
ローカル変数には初期値入れることになるんだし
なんだかなぁって思う問題

744 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 14:32:20 ]
>>741-743
こんな早く答え返ってくるとは思ってませんでした。
有難う、みんな優しいですね。
>>742
@無くなる?
A…4じゃないんですか?


745 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 14:35:20 ]
aに何も入れない状態で出力させるのさ。
できれば、hoge()を呼び出す階層を変えて試すのもやってみて
(別の関数を呼び出しその中からhoge()を呼ぶ)



746 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 14:48:58 ]
成程!試してみますね。
ご丁寧に有難うございました。


747 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:16:09 ]
試してみる、はよくない
たまたま4が入ってたらどうするんだ

748 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:25:10 ]
高確率で入ってるだろ。
だから深さも変えるといいかな、と。
アドレス表示させる手もあるが。
最適化されてると混乱しそう。

749 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:41:12 ]
ちゃんとCの仕様を示して理解させるのが正しい姿勢
とりあえず試してうまくいったから、なんてのを放置すると
そのうち必ずなにかやらかす

750 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:42:09 ]
>>744
@無くなる
A何が入っているかわからない

751 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:50:04 ]
>>740
関数の中でstaticをつけずに宣言した変数は、その関数の呼び出し中にのみ存在する変数(auto変数)となる。
宣言した関数から抜けた時点で、変数のために使われていた記憶領域は解放されて意味のないものになる。

このような変数は、明示的に int a=2; などのように初期化しないかぎり、
その宣言時における値は常に不定(何が入っているかわからない)である。
このような変数の中身を、明示的に値を与える前に使ってはいけない。

752 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:50:57 ]
学校の課題なんだから、そんなのは教わるんだろう。
今知りたいのはこの質問の意図するところだべ。

753 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:55:28 ]
仕様を理解してりゃ意図はわかるだろ
意図がわかんないってのは理解してないからだ

754 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 16:00:37 ]
>>740
なお、staticをつけて宣言した変数は、プログラムが実行を開始してから終了するまで存在し、
その開始時に一度だけ、明示的な初期化式があればその値に、なければ「=0;」とか「={0};」と
書いたかのように初期化される。


755 名前:740 mailto:sage [2008/05/14(水) 23:45:33 ]
>>753
その通りです。
まだ講義で習ってない範囲(質問する前は習ってない範囲
かすらもわかりませんでした)で何も知りませんでした。
今回皆さんに教えて頂いたお陰でまだ何となくですが、
わかるようになりました。
あとは講義で理解していこうと思います。

補足してくださった方々もわかりやすい説明有難うございました!
ここ勉強になりますね。



756 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 01:50:36 ]
>>735
宿題スレで頻繁に見られる課題です。実装したくなったときに参考にしてください。
基本形
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6550.txt
逆ポーランド電卓で(基本形の応用)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6551.txt
他にもいろいろ回答されていましたが、私の手元ににはありません。

757 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:16:27 ]
>755
忠告だが
その講義の教官の言うことは眉唾して聞いたほうがいい

教えてないことを聞くとかありえねー

758 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:56:17 ]
課題自体はすげー授業のそのまんま復習くせーし
話聞いてなかったんだろどうせ

759 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:56:17 ]
>>757
両方の言い分を聞かないと分からないぞ
ここで教官の言い分を聞く事はまずないだろうけど

760 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:57:06 ]
>>757
前半と後半が支離滅裂なんだがw

761 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:58:18 ]
>>760
日本語は難しいです

762 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:03:26 ]
>>760
日本語読めない人?

763 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:06:17 ]
課題なら別に教えてないことが出てきてもいいと思うけどな
小学校じゃあるまいし

764 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:08:53 ]
横槍だが 眉唾する という使い方がないんです、辞書を引いても分かるように。

765 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:11:29 ]
>>764
「眉に唾する」ならいいのかな?



766 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:13:52 ]
ttp://www.geocities.jp/tomomi965/kotowaza11/11-54-4.html

767 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:27:57 ]
下記の場合volatileがあるためValueを外部から書き換えるまでループを続けると思うのですが、

volatile 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){ ←これ
    ;
  }
}

768 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:29:31 ]
>>767
volatile 修飾する必要があります

769 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 10:13:29 ]
>>767
volatileをつけなければ最適化対象になります。
が、最適化対象になるとValueを外部から書き換えるまでループを続けるという動作を必ずしなくなるわけではありません。
つまり、volatileをつけなくてもあなたの希望する動作をする可能性はあります。
つまり、volatileをつける必要があるとは言い切れません。

770 名前:「言い切れない」は詭弁だ mailto:sage [2008/05/15(木) 12:16:11 ]
>つまり、volatileをつけなくてもあなたの希望する動作をする可能性はあります。
それは普通、つける必要があると言いますね。

771 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 12:22:57 ]
↓必要条件とか十分条件とか言い出すヤツ

772 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 13:40:39 ]
|↑
++

ビルド毎に出力を確認すればおk てか、Cの話でなくなるが、テストで引っ掛けろ

773 名前:デフォルトの名無しさん [2008/05/15(木) 22:38:30 ]
プログラム知識0の俺がCを勉強しようと思うんだが
解説サイトと本どっちがいいの?
色々な掲示板みてたら両方とも良いって書いてたからわからなかった。

774 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 22:39:35 ]
じゃあ、とりあえずお金のかからない方法でやってみて
それで不満に感じたら本を買えば良いんじゃないかな

775 名前:デフォルトの名無しさん [2008/05/15(木) 22:49:12 ]
レスありがとう
その方法が一番いいかな〜
とりあえずググってサイトさがしてみる。
サイトって「C言語 入門」でググって上らへんのなら大丈夫だよね?



776 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:32:03 ]
本はだめな本があるから、本の紹介サイトを見たほうがいいぞ。


777 名前:デフォルトの名無しさん [2008/05/15(木) 23:39:22 ]
そうなんだ
まだ買わなくてよかった〜
ありがとう
それみて本選ぶよ

778 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 05:49:52 ]
本もそうだがサイトは特に多くのところを回った方がいい。
嘘を書いている、情報が古すぎる、環境依存なコード、誉められないコーディングスタイルetc...
あと、サイトにすることで有利な点は、疑問点があればここにアドレス張り付ければ一応質問できることかな?
書籍だと同じ本持ってる人間以外には内容をいちいち書いてもらわないと質問できないから。

779 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 09:21:08 ]
何を学ぶか?で選ぶ資料も違ってくる。
ソートに関しては、すでにどの手法が高速か分かりきっているが
教本によって記述が違っているものも。中には、あれ?って思うものも。

780 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 09:31:06 ]
宿題スレでHit and Blowのソースコードを書いてもらったものですが、
頭が悪いせいか理解しようとしても意味がよくわかりません。
誰か詳しい解説をお願いします。

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6540.txt

781 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 09:32:00 ]
っつか、コードが悪い

782 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 10:38:15 ]
宿題スレはとりあえず提出できればいいやーって人向けで、
自分で理解するには向いてないと思う

つか>>780のソースは宿題スレではかなり親切な方だと思うけどな
一応コメントついてるし

783 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 11:46:34 ]
数当てだからといって、4桁の整数にこだわらずに
数字の文字4個の配列を使ってる。そこだろう

数字 + '0' <-> 数字の文字

理解するところまで宿題なんなら、ヒントだと思って考えてみるよろし

784 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 13:24:00 ]
>>780
何がわからないのか具体的に説明してくれないと解説のしようもない。

785 名前:デフォルトの名無しさん [2008/05/16(金) 14:41:36 ]
すみません。いきなりですが、本当に初心者なので分かりません。C言語では基本的に全て数値としてデータを格納すると聞きました。
ただ逆に数値(1〜9)を””で囲んで文字列とする場合、内部データは本来の数字にNullが付いた物でなく、ASCUコードで
あれば文字の1なら10進数の49(16進数の10X3)に変換されるという認識でよいのでしょうか?
又、普通の文字ならは該当する10進数・16進数に変更はなくNuLLが付くだけなのでしょうか?数値ま場合だけデータそのものが
例えば1なら実質先程言った49に変換されるという認識でよろしいのでしょうか?どうかご教授願います。



786 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 14:44:37 ]
16進ダンプとかって最近は見る機会無いのかな

787 名前:デフォルトの名無しさん [2008/05/16(金) 14:48:13 ]
>>786
Windowsでは見る機会がないでしょうねぇ〜〜〜禿藁
だからLinuxを使えとあれほどry

788 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:08:13 ]
>>785
C言語では(エスケープシーケンスを除き) ど ん な 文 字 も そのマシン上での文字集合に対応するデジタルな値として扱われる。
ASCII文字集合を使用しているすべてのマシンで、"1"は0x31 0x00で、" "は0x20 0x00である。
数字であろうと何であろうと扱いに差はない。

789 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:09:34 ]
linuxだと強制的に見なきゃいけない機会でもあんの?

790 名前:デフォルトの名無しさん [2008/05/16(金) 15:11:01 ]
ありがとうございました。Cはそなのですね。

791 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:11:26 ]
ntsd使うなり、IDEの16進メモリ表示モード使うなり
さすがにgdbに張り合ううつもりはないが、ntsdは結構遊べる

792 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:12:46 ]
なお、Cの話をする際において安易にNULLという単語を使うべきではない。
CにおいてNULLと書いた場合通常はヌルポインタ定数を表すマクロNULLのことをさす。
ASCIIのNULのことを言う場合にはNULまたはヌル文字と表記するべきである。

ついでに、ASCIIは A.S.C.I.I.(American Standard Code for Information Interchange) であってASCUではない。

793 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:14:25 ]
>>789
mpeg とかかまってると, Windows でも強制的に見なきゃいけない機会は結構あるが…


794 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:14:32 ]
>>792
お前が出直して来い

795 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:35:15 ]
俺がNULって書いたらナルだろーが!
とおっしゃりたいのですか?

どっちでもいいじゃん



796 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:42:56 ]
呼び方なんてどうでもいいよ
区別がついてないのはお前の方じゃねーかって話

797 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:44:35 ]
何を指摘したいのかを明確に挙げずに文句つけても話が混乱するだけだぞ
煽りたいだけならよそでやれ

798 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:46:11 ]
>ASCIIのNUL
……

799 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:46:33 ]
なんかまた変な奴が沸いたな。
相手すんなよ、つけあがるから

800 名前:デフォルトの名無しさん [2008/05/16(金) 15:47:50 ]
Windows使ってるとNULLとNULの違いすら分からないようだな。
駄目だこりゃ。

801 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:49:15 ]
なんだ
またいつものアレか

802 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:54:28 ]
>>800
違いですかwww

803 名前:デフォルトの名無しさん [2008/05/16(金) 16:06:33 ]
ニート・ヒキは金どうしてる?
yutori.2ch.net/test/read.cgi/news4vip/1210919591/


1 以下、名無しにかわりましてVIPがお送りします。 [] 2008/05/16(金) 15:33:11.35 ID:2pPh1TlA0

自分でソフト作って株の売買自動でやらせてる

種が50万しかなかったし初めて2月目だから
一日三万がいいとこだし金おろせないけど
まあ親元だし食ってくのには困らんので満足してる


しかし欝だ・・・やることなくて寝てばっかり・・

804 名前: [2008/05/16(金) 16:28:57 ]
microsoft visuar studioで
*印を出力するプログラムを作成してください
整数型の変数nに7〜15の値を設定する
変数nの値により,以下のような表示を行う(n=7の場合)

for文(またはwhile文)とif文の組合せである
カウンタ変数が偶数か奇数かで判断

printf文は
printf(“n=%d\n”,n); // nの値を出力
printf(“ “); // 空白を出力
printf(“*”); // *印を出力
printf(“\n”); // 改行する
だけを使用する




n=7
* * * *
 * * *
* * * *
 * * *
* * * *
 * * *
* * * *

上の条件でこういう風に表示するプログラムを書いてください



805 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 16:37:31 ]
宿題なら宿題スレへ



806 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 16:38:00 ]
>>804
>>1

807 名前:780 mailto:sage [2008/05/16(金) 18:32:38 ]
>>782
>>783
>>784
ありがとうございました。

808 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 10:33:01 ]
float型やdouble型の内部構造がいまいちよく理解できないんだが、どっかわかりやすいとこない?
最上位ビットが符号で使われるのはわかるんだけど、それ以外がよくわからない。
小数点以下の数値をどうやって保持してるの?

809 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 10:42:45 ]
>>808
ja.wikipedia.org/wiki/IEEE_754
実装がこれに準拠しているかどうかは別問題

810 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 11:12:45 ]
>>809
ありがとう。指数表記を使ってるのがわかって疑問が解けました。

811 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 11:40:19 ]
typedef struct{
double 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]とかいう場所に代入していいんですか?

812 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 12:17:49 ]
edge[-1] == (&edge_area[1])[-1]

813 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 12:32:03 ]
えっと〜


814 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 12:36:28 ]
edge[-1] == edge_area[0]

815 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:01:27 ]
edge[n]と書くと、配列edgeのn番目、みたいに読める。
しかし、配列の中(最初かもしれないし、最後かもしれないし、途中かもしれない)を
指し示すポインタedgeの、そっからn番目、とも読める。

もちろん、edge[-1]の存在は、ちゃんと担保されてないといけないけど、
文法的にというか、読み方的には、そういう意味

てことで、>>814



816 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:07:28 ]
edge[-1] == *(egde - 1)
なので文法的に問題は無い

大丈夫かどうかは指してる先がちゃんとあるのかの問題になる

817 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:10:36 ]
値を代入してるわけではないんですか?

818 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:14:13 ]
代入してる場所は代入しても問題ない場所。
上の数レス読んで理解できないならあきらめろ。

819 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:14:29 ]
ああそうだ もしかしてと思ってエスパーしてみるが、

edge=&edge_area[1];

の部分で、配列のコピーが発生したりは、してないからね

強いて言うなら、位置情報を代入している。それも、「一個先の位置」ね。

820 名前:デフォルトの名無しさん [2008/05/17(土) 13:18:52 ]
4,5,6進数の九九を作ってください。

4進数なら
1 2 3
1 1 2 3
2 2 10 12
3 3 12 21
こんな感じです。お願いします。

821 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:19:31 ]
>>820
宿題スレへどうぞ

822 名前:デフォルトの名無しさん [2008/05/17(土) 13:20:36 ]
4,5,6進数の九九を作ってください。

4進数なら
1 2 3
1 1 2 3
2 2 10 12
3 3 12 21
こんな感じです。お願いします。

823 名前:デフォルトの名無しさん [2008/05/17(土) 13:22:05 ]
なんか九九表がうまくできないですけど

824 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:22:10 ]
  1 2 3
1 1  2 3
2 2 10 12
3 3 12 21
こうしたいんだろ?
それはともかくとっとと消えろよ

825 名前:デフォルトの名無しさん [2008/05/17(土) 13:22:36 ]
今日から、パッケージソフトを作るための勉強をします。
何の言語を勉強すれば、よろしいでしょうか?
個人的には、C++がいいかと。
求人案件などを見ると、求人が多いから。

(ちなみに、どんなソフトを作ろうとしているかというと。
動画編集ソフトを作ろうとしています。)



826 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:23:43 ]
>>825
スレタイを百回音読して涙を流しながら去れ

827 名前:デフォルトの名無しさん [2008/05/17(土) 13:25:41 ]
>>826
さーせn

828 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 15:46:46 ]
Borland BCC32(フリー版)を使ってますが、リアルタイムキー入力を使いたいのですが
その関数名を教えて下さい (BasicのINKEY$見たいな物)

829 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:29:04 ]
>>828
GetAsyncKeyState






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<213KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef