トップページ⇒tech
1001コメント286KB

C言語なら俺に聞け(入門編)Part 117

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
C言語の入門者向け解説スレッドです。

★前スレ
C言語なら俺に聞け(入門編)Part 115
http://toro.2ch.net/test/read.cgi/tech/1368444993/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&;andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 164代目
http://toro.2ch.net/test/read.cgi/tech/1370255305/
★C++言語については避けてください。C++対応明記スレへどうぞ。
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。
  # サイズが大きい場合はアップローダ等を利用してください。
http://codepad.org/C/C++の宿題片付けます 165代目
http://ideone.com/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0002デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
惑星の軌道計算はCでも結構遅くないか?
0003デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
叩き台のup
0004デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
>>1
Part11乙
0005デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
前スレ
C言語なら俺に聞け(入門編)Part 116
http://toro.2ch.net/test/read.cgi/tech/1371208925/
0006デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
Cで動的にライブラリ読み込むのどうすんだっけ?
0007デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
OS依存
0008デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
客先常駐で偉そうな客先社員に見下されて何の経験にもならない雑用を押し付けられて精神病むのがオチw
30代で常駐先がなくなって未経験の異業種で人生やり直すのがオチw
常駐先企業の人件費抑制に利用されただけの人生だったな残念w

システムエンジニアになろう〜新入社員研修編〜
ttp://www.nicovideo.jp/watch/sm4010880
0009デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
惑星の楕円軌道って公式あんの?
つか楕円軌道の公式あっても今回の話は他の惑星の重力の影響があるから使えないか。
0010デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
近日点移動も考慮しなきゃいけないのか?
0011デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
アインシュタインかニュートンの運動方程式を解くんだ。


N 体シミュレーション初春の学校教科書
http://home.f08.itscom.net/okuya8/nnodysimulation.pdf

Rで多体問題を数値解析 - 餡子付゛録
http://d.hatena.ne.jp/uncorrelated/20130618/1371565502
0012デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
>>9
ある程度以上真円軌道でないと惑星と認められないので気にしない方向で
0013デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
水星の近日点移動
海王星の発見に大きな貢献をしたルヴェリエは、水星の近日点移動の問題にも気づき、この問題を解決するための仮説を模索し計算をおこなったが、水星の内側に新たな惑星は発見できなかった。
ルヴェリエの計算によれば、このうち38.3秒の分だけがニュートン力学に基づく計算値によっては説明できないで残るとされた。

この問題の解決は、数十年後に意外な形でえられた。
重力の扱いについて一般相対性理論を目指して格闘していたアインシュタインは、1915年11月18日に、彼の重力場の方程式から水星の近日点移動が定量的に予測できることを発見した。
水星のその予測された移動の量は、ルヴェリエ以後の研究でも説明不可能と見なされた43秒の分まで観測値とほぼぴったりと一致していたのである。
http://www1.kcn.ne.jp/~h-uchii/intro.PS/perihelion.html
0014デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
static const int x=10;
と、グローバル空間で宣言して

static const int Inv_x_= 1.0/x;
と、関数内で定義するとエラーが出てコンパイル出来ない・・・
C++だと通るけどCだとエラー出ます。
原因と対策を教えて下さいorz
0015デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
変数を使って初期化できないコンパイラなんじゃねえの
0016デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
>>14
C言語では const int が変数だから
0017デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
gcc 使ってます。
コンパイルオプション使って解決出来可能でしょうか?
0018デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
>>17
#define でおk
0019デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
enum { x = 10 };
0020デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
>>15>>16
やっぱり変数で初期化がNGなんですね・・・

static const double root_3 = sqrt(3);
ってコードも同様で弾かれます
元々やりたいことは計算量減らしたいだけなんだけど、
おとなしくマクロ使うべきでしょうか?
0021デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
constexpr使わないとだめな悪寒・・・
0022デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
double root_3;
static int initialized = 0;
if (!initialized){ root_3 = sqrt(3); initialized = 1;}
0023デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
C++にしてコンパイルすればいいんじゃねえの
0024デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
初期化する関数をこしらえる必要がありそうですね。

今やってるやり方は

double root_3=sqrt(3)
printf("%a",root_3)

で16進法で表して、コピペして、マクロ定義にしてます。
ここらへんもどかしいC言語・・・

>>23
C++でコンパイルすると分けわからないエラー出まくるので
勉強中です
0025デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
カッコ付けてgccでやらずに
素直にVC++でやったらええやん
Linuxとか無駄に時間を消耗するだけ
0026デフォルトの名無しさん2013/07/13(土) NY:AN:NY.AN
そんなことはない。
vcのほうが標準的でない仕様。
0027片山博文MZパンク ◆0lBZNi.Q7evd 2013/07/13(土) NY:AN:NY.AN
g++でC++11をコンパイルオプションで有効にしてconstexpr使えば問題解決
0028デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
取り敢えずmakefileのgccってところをg++変えてみて出来るかやってみたけど
やっぱりコレだけじゃ無理でした。
VC++使いたいけど、組み込みLinux環境なんです。
0029デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
#define HOGE_X 10

static const int Inv_x_= 1.0/HOGE_X;
0030 ◆QZaw55cn4c 2013/07/14(日) NY:AN:NY.AN
もう #define は時代遅れだからねえ
0031デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
プログラムサイズをlsで調べるのが最先端
0032デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
> 時代遅れ
?
0033デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
Qzは自分がロートル過ぎて全てを時代遅れって事にしとかないと
自分の中で辻褄が合わないんだろ
0034デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
>>29
今のところそのようなコードを使ってますが、
ルート3などを定数化するときにちょっと困りました
>>24みたいに書いて一応納得することにしましたが
もう少しキレイに書きたいです。
宣言して、フラグを設けて初期化部分を作る>>22さんの方法も
一つの答えだと思いますが、C++みたいに短く書けるに越したことはないし、
一つの関数でしか使わない定数なので、わざわざマクロ定義するのも
なんか汚いコードな気がして、もどかしいです
(C++でコンパイル出来たらそれに越したことはないですけど)
static const double root_3=sqrt(3);が通ってくれたら
こんなに葛藤することも無かった・・・
0035デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
ビルドの最中に数値に展開するソースコード生成する。
0036デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
組み込み?でsqrt(3)を使いたいなら、こんな感じ
static const double root_3=1.732050808;//sqrt(3);

手計算できるところはなるべく、即値入れたほうがいいかもね
0037デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
>>33
中途半端な知識で知ったかぶると恥をかくぞ。
定数定義限定なら#defineは

× 時代遅れ
○ enumを使うべき

だろう。でもショートコードのマクロ化は#defineじゃないと無理だ。
こういうのは適材適所なんだよ。

マクロも善し悪しで多用すると弊害が大きいけど適切な使用は
十分に利用価値がある。
0038デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
悪い>>33じゃなくて>>30だったわ。
0039 ◆QZaw55cn4c 2013/07/14(日) NY:AN:NY.AN
√3 を算出するコストは今ではたいしたことはない、とわりきるか、値を自分で書いてコメントを付けておくか
0040デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
富豪プログラムできる環境ばかりじゃないんだよ
0041 ◆QZaw55cn4c 2013/07/14(日) NY:AN:NY.AN
>>37
>定数定義限定なら#defineは
>× 時代遅れ
>○ enumを使うべき

今は浮動小数点の定数定義の話なんだと思っていましたが?enum で浮動小数点を定義できるとでも?
0042デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
そもそも#defineが時代遅れとか言うやつは定数定義しか
用途がないと勘違いしているアホだから。
#defineはマクロであって定数を定義する手段ではない。
マクロを使う機会は確かに減ったが、なくなっていいもの
でもない。
普通にコード書いてもいいけどマクロが使えたほうが便利
というシチュエーションはある。
0043 ◆QZaw55cn4c 2013/07/14(日) NY:AN:NY.AN
>>40
ではもう
double r5 = 2.2360679 // 5^0.5
とでもするしか‥‥ >>36 で既出でしたね。

コンパイル時にコード生成で math のライブラリ関数を呼び出すというのは、なかなかに凝ったコンパイラだと思います
0044 ◆QZaw55cn4c 2013/07/14(日) NY:AN:NY.AN
>>42
java とか c# ではマクロがなくなっていますが、それは理由があるとおもいますよ
0045デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
とJavaもc#も使えないボンクラがなんか言ってる
0046 ◆QZaw55cn4c 2013/07/14(日) NY:AN:NY.AN
>>45
それはそのとおりですがそう判断した理由は?
0047デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
>>44
javaやC#はそもそもクラス型設計から(C++を反面教師として)
スタートしてるから、そもそもマクロは使わない言語設計だから。
Cの世界では制御構造がクラス型に比べて制限されるんで、
マクロがあると便利なことがある。なくてもコードは書けるが。
ただCのマクロを時代遅れの一言でバッサリやるのはただの馬鹿。
0048 ◆QZaw55cn4c 2013/07/14(日) NY:AN:NY.AN
>>47
OOとマクロとは関係ないと思いますよ
マクロはIDEとの親和性を破壊するから、だと思っていますけれどもマクロやテンプレート様は文脈を著しく発散させますからね
まあ IDE の支援を「進歩的」、IDE を疎外する存在は obsolete と決め付けるのもどーかとも、まあ思いますが
0049デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
組み込みのくせにsqrtを使おうとは生意気だ
0050デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
テンプレートは言語仕様であってOOじゃねーよ馬鹿。
やっぱこいつ知ったかぶりだけなんだな。
0051デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
お前らカリカリしないで、渾身の自爆ギャグでなごもうぜ。
www54.atwiki.jp/qzaw55cn4c/pages/16.html
www54.atwiki.jp/qzaw55cn4c/pages/17.html
0052デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
バカな素人の思い込みを一々まともに相手する必要はないだろ
0053 ◆QZaw55cn4c 2013/07/14(日) NY:AN:NY.AN
>>50
「テンプレートは言語仕様であってマクロじゃない」っていいたかったの?
0054デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
>>47
制御構造にマクロを使う(#define の中で goto)のは
マクロと goto の最悪コンボ

窓から突き落とされるぞ
0055デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
>>51
ウンコに触って喜ぶのは小学生まで
0056デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
交番で爆竹チキンレースしたのは小学生だっけ?
0057デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
みさなんこんにちわ、暑い日が続きますねいかがおすごしでしょうか。
パイプを使って標準入力を受け取り、そのあとscanfでユーザーから入力を受け取りたいのですが、
ユーザーが入力する間もなくプログラムが終了してしまいます。どうやったらユーザーからの
入力を受け付けることができますか?教えてください。書いたプログラムはこれです。

int main() {
  int n;

  fscanf(stdin, "%d", &n);
  printf("パイプで入力された数字は%dです\n", n);

  printf("数字を入力してください > ");
  scanf("%d", &n);
  printf("あなたが入力した数字は%dです\n", n);

  return 0;
}

実行したコマンドはこれです。
echo 12 | ./a.out

実行した結果はこれです。
パイプで入力された数字は12です
数字を入力してください > あなたが入力した数字は12です


ユーザーが入力することなくプログラムが終了してしまうのです。
ユーザーに入力させたいのです。
どうしたらいいのでしょうか?教えてくださいお願いします。
0058デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
>>57
freopen
0059572013/07/14(日) NY:AN:NY.AN
>>58
ありがとうございます。
このように書いて実行してみたのですが、状況は変わらず入力することができませんでした。

int main() {
  int n;

  fscanf(stdin, "%d", &n);
  printf("パイプで入力された数字は%dです\n", n);
  freopen("/dev/stdin", "r", stdin);
  printf("数字を入力してください > ");
  scanf("%d", &n);
  printf("あなたが入力した数字は%dです\n", n);

  return 0;
}
0060572013/07/14(日) NY:AN:NY.AN
>>58
freopen("/dev/tty", "r", stdin);
にしたところ期待通り動作するようになりました。
解決しました、ありがとうございました。
0061デフォルトの名無しさん2013/07/14(日) NY:AN:NY.AN
でもそんなプログラムあったらキレる
0062デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
freopen じゃないけど stdin と tty 別々に開いて入力してるのはあった
GnuPG とか
0063デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
for文を使ってifは使わないで
■□■
■■■
■□■
みたいな処理をさせたいのですがどういう風に処理させたらいいですか?
白いところを黒いところに混ぜていくやり方がわからないです
0064デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
ary[] = {B, W, B, B, B, B, B, W, B}
0065デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
配列つかわないとやっぱり無理ですかね‥
0066デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
斜め方向はクロネッカーのデルタを使えばいい
x=0とX=maxはy方向に全部埋めればいいんでしょ
3つに処理を分ければif文不要
0067デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
(x==0)|(x==2)|(y==1)
0068デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
if文も三項演算子も同じ括りなんでしょ?
0069デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
>>63
for (i = 0; i < 9; i++)
(i / 3) % 2 + (i + 1) % 2;
0070デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
>>63
この質問で分かるのか。
エスパーさすがだな。
0071デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
>>69
それ任意のn×nでも使えるかな
0072デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
多次元配列って何次元まで可能なんですか?

int x[10][10][10][10][10];

5次元までエラー出ませんでした。皆さんは何次元まで
可能でしたか?
0073デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
メモリの許す限り行けそうな気がする。
0074デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
そんなもんコンパイラとコンパイル設定と実行環境次第だろ
0075デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
>>72
char a[2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2];
VC2012 64bitにて
0076デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
>>75
そこまで増やすと
スタックエラー出ませんか?w
恐ろしくてできないw
0077デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
規格では最低12次元。これを超えるものはコンパイルエラーにしても良い。
0078デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
でも多次元配列は必ずmallocしないといけないのが難ですよね。
0079デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
そもそも1次元で済むのに多次元使うのアホらしい
0080デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
変数名って最長100文字らしいね
自由じゃないのかよ
0081デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
C言語ってアメリカみたいだよな
自由といいつつ制限だらけ

変数名に制限あり(printfとか予約後はダメ)
0082デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
PCゲームの9割はC言語で作ってるんだろ?
需要高いし一生衰退しないだろうな
0083デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
>>80
色んな環境があるから限界値の設定は必要。

>>81
printf は、予約語じゃないだろ…
0084デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
>>83
いや彼は予約【後】とちゃんと言っているんだが
0085デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
そもそも自由なんて言ってないし
0086デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
夏厨
0087デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
Cはコンパイラがいらないから人気あるんだろう
0088デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
>>80
規格上は最長の規定はない。処理系毎の最長値はある。
0089デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
最低何文字までは保証しなければいけない、というのはあったよな
0090デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
今まで1000字を超える変数名とか見たことないが
安全性などを考慮して組み込み系では1万文字超える変数名もザラだって聞いたな
0091デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
リンカ次第だし何文字までとかCの側で一方的に決められるのか?
0092デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
リンカとコンパイラの違い教えて
分らん
分ったところでプログラミングと関係ないけど
0093デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
ソースファイルからオブジェクトファイルを作る奴と
オブジェクトファイルを結合して実行ファイルを作る奴
0094デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
ソースファイルから直接実行ファイル作ればいいじゃん?
何だよオブジェってw
0095デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
>>92
簡単に言うと↓の通り。
コンパイラは、言語を機械語に翻訳するだけ。
リンカは、翻訳された各機械語をくっつけるだけ。
0096デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
うむ、下々の惨めなプログラマもどきは知らずともよい
知る必要のないことじゃ
0097デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
>>94
超巨大なプログラムソース1000万行があったとして,一箇所修正したら,全部をコンパイルしなおすなんて無駄でしょう?
だから或る程度の規模のソフトウェアになると,複数の *.c ファイルをそれぞれコンパイルして,あとで一つにまとめる,という手法を使います.
今はちゃんとした OS ですらソースを公開しているし,一度眺めてみるとかカーネルビルドしてみるとか,おすすめです.
0098デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
HeadFirstCにリンカへのインタビューが載っているから見てくるといい
面白い
0099デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
>>97
ああそう言えば分割コンパイルをしない奴がいたっけなあ
平日の深夜とか昼間にレスする奴
0100デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
>>97
うーん意味分からないですね。
腐ったみかんじゃないけれど
一つ修正したら他は修正しなくていいって
器用すぎませんか...まぁそういうもんだということで。
0101デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
> 一つ修正したら他は修正しなくていいって
一般人にそういったことはできないでしょう

どっか修正したら、他に影響して、終わりなき道を進む...
■ このスレッドは過去ログ倉庫に格納されています