5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2008/08/26(火) 23:44:06
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
  C/C++の宿題を片付けます 115代目
  http://pc11.2ch.net/test/read.cgi/tech/1217741118/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

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


2 :デフォルトの名無しさん:2008/08/26(火) 23:46:22
>>1

3 :デフォルトの名無しさん:2008/08/26(火) 23:46:48
                          刀、           , ヘ
                  /´ ̄`ヽ /: : : \_____/: : : : ヽ、
              ,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
               /: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
     ,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
    /: :.,.-ァ: : : |: : : : : : : : :    :\: : : : :: : : :ヽ  \   /: : : :/
    ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i  / /: : : : :/
     /: :     ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/  /: : : : :/         、
.    /: : /  . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : |  /: : : : :/            |\
   /: : ィ: : : : :.i: : |   \!___/ ヽ:: : : : : : :\|:.:.:.:/:!  ,': : : : /              |: : \
   / / !: : : : :.ト‐|-    ヽ    \: : : : : l::::__:' :/  i: : : : :{              |: : : :.ヽ
   l/   |: : :!: : .l: :|            \: : : l´r. Y   {: : : : :丶_______.ノ: : : : : :}
      l: : :l: : :ト、|         、___,ィ ヽ: :| ゝ ノ    '.: : : : : : : : : : : : : : : : : : : : : : /
      |: : :ト、: |: :ヽ ___,彡     ´ ̄´   ヽl-‐'     \: : : : : : : : : : : : : : : : : : イ
        !: :从ヽ!ヽ.ハ=≠' , ///// ///u /           ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      V  ヽ|    }///  r‐'⌒ヽ  イ〉、
              ヽ、______ー‐‐' ィ´ /:/:7rt‐---、       こ、これは>>1乙じゃなくて
                  ィ幵ノ ./:/:./:.! !: : : : :!`ヽ     ポニーテールなんだから
              r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\   変な勘違いしないでよね!
               /: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\

4 :デフォルトの名無しさん:2008/08/27(水) 00:36:44
1乙

5 :デフォルトの名無しさん:2008/08/27(水) 03:47:14
見事 毎度キチガイ認定を受けてきたロールに
戦慄走る――

  「狂気の底が見えねェ!!!」

2ch歴5年を超える経験と勘から相手の狂気を数値化してきたロールにとって
過去に例のない狂気を持つマジキチと出会うこと自体は決して珍しくはない

しかし
過去最狂のキチガイAAを据えてすら天秤の対として軽すぎる程の狂気を持つ気狂!!!
遥か膨大なやなせイズムを内包する怪物!!!
                         ____
 前代未聞の経験である         /  R /\
                       /   /\  \
                      |  / /=ヽ \U |
                      |/ (゚)::::(゚)u \|
                      \ι─ ゝ── ノ
                        \____/


6 :デフォルトの名無しさん:2008/08/27(水) 05:29:53
1乙です。
質問です。main関数の処理が終了して、また最初の処理に戻すにはどうすればいいのでしょうか?
switch文を使って、「プログラムを終了しますか?(Y/N)」のような終了の仕方にしたいので。

7 :デフォルトの名無しさん:2008/08/27(水) 05:34:33
そういう場合はmain関数の中でwhileなどでループする部分を作っておいて
その中で処理をさせる・・・かな?

void main()
{

while(1) {
処理させる内容をここにかく

}

}

プログラムを終了させたい場合はwhileを抜ける処理を条件判定を入れて
書いておけばOK

8 :デフォルトの名無しさん:2008/08/27(水) 05:35:45
全処理を無限ループで囲んでifで抜けるようにするとか

9 :デフォルトの名無しさん:2008/08/27(水) 05:37:13
>>6
whileループの中に入れる。
「プログラムを終了しますか?(Y/N)」でYが入力されたら、breakする。
続行するか終了するかの制御変数を用いてもよい。

10 :デフォルトの名無しさん:2008/08/27(水) 05:38:06
goto文を使うとか

11 :デフォルトの名無しさん:2008/08/27(水) 05:46:10
早朝から沢山のレスありがとうございます。
while文の無限ループを使うってのは理解したんですが、
<<また始めの処理に戻す>>やり方がわかりません。
>>10さんのgoto文を使うやり方くらいしかないのかな?

12 :11:2008/08/27(水) 05:47:42
すみません自己解決しました。
無限ループをすべての処理に適用させるわけですね。
ありがとうございます。

13 :デフォルトの名無しさん:2008/08/27(水) 10:46:40
なんで初心者って少し考えればわかりそうなことを聞くのかな
聞く前に考えるってことしないの?

14 :デフォルトの名無しさん:2008/08/27(水) 10:47:50
わからない→ググレ→聞いたほうが早いと思った
わからない→考えろ→聞いたほうが早いと思った

15 :デフォルトの名無しさん:2008/08/27(水) 10:55:29
まあどう考えていいかもわからなかったのが、
聞くために文章にすると気がつくってこともあるからな。

16 :デフォルトの名無しさん:2008/08/27(水) 10:58:57
わからない→ググレ→聞いたほうが早いと思った→goto わからない
わからない→考えろ→聞いたほうが早いと思った→goto わからない


17 :デフォルトの名無しさん:2008/08/27(水) 11:07:17
while (わからない) {
  if (聞いたほうが早い) {
    聞く;
  }
  else {
    なにもしない;
  }
}
    

18 :デフォルトの名無しさん:2008/08/27(水) 11:16:54
できるだけ独りよがりな考えを排除するため

19 :デフォルトの名無しさん:2008/08/27(水) 11:21:21
その独りよがりな考えすら浮かばない奴も多いようだが

20 :デフォルトの名無しさん:2008/08/27(水) 11:41:38
>>18
それなら自分の考えを書いた上で意見を求めればいいと思うんだ

21 :デフォルトの名無しさん:2008/08/27(水) 12:16:33
>>20
まあそうだな、次たてるときまで覚えてたら>>1に追加しておくか

22 :デフォルトの名無しさん:2008/08/27(水) 17:32:47
なんでintとかのサイズを統一しなかったんだろう

23 :デフォルトの名無しさん:2008/08/27(水) 17:34:03
処理系に合わせたほうが速い(はずだ)から

24 :デフォルトの名無しさん:2008/08/27(水) 18:25:18
>>22
CPUが進化とともにレジスタ幅を増やしていった経緯もあるし
用途によってはインテルCPUまでのパワーはいらなくて
マイコンで足りるなんてのもあって古いCPUをカスタム化
したのを使ってたりするしね

25 :デフォルトの名無しさん:2008/08/27(水) 20:43:16
#include <stdio.h>

int Add_Tax (void);

int main(void)
{

int Add_tax();
return 0;
}
int Add_Tax
{
int price,tax,taxtax; /*price=値段 tax=価格 taxtax = 消費税を含んだ価格 */
double taxrate; /*taxrate = 消費税1.05%。実数のためにdouble型 */
taxrate = 1.05;
printf("商品の値段を入力\n");
scanf("%d\n",&tax);
printf("price*taxrate+tax = %d\n",taxtax);
}

消費税を求める関数作れない!!

26 :デフォルトの名無しさん:2008/08/27(水) 20:46:07
>>25
独り言は他所で言ってください

27 :デフォルトの名無しさん:2008/08/27(水) 21:12:47
#include <stdio.h>

int Add_Tax();

int main()
{
Add_Tax();
return 0;
}

int Add_Tax()
{
...
}

28 :デフォルトの名無しさん:2008/08/27(水) 21:32:37
くにへかえるんだな なつやすみはもうおわりだろう

29 :デフォルトの名無しさん:2008/08/27(水) 21:53:11
夏休み明けて早々ゆとりですまない
C言語に取り組もうと思って本なんか買っちゃったんだが、
実行するソフトや方法が分からず既に涙目だ
フリーソフトでも書店とかで買える物でも・・・いや、それも良く分からないんだが
兎に角先ずは作ったプログラムを動かすソフトみたいなものが分からない
なんとか教えてもらえないだろうか、お願いします


30 :デフォルトの名無しさん:2008/08/27(水) 21:53:53
ぐぐれよ

31 :デフォルトの名無しさん:2008/08/27(水) 21:54:19
>>29
マイクロソフトのサイトからVC++でも落とせば?

32 :デフォルトの名無しさん:2008/08/27(水) 21:55:30
>>29
http://www.microsoft.com/japan/msdn/vstudio/express/maninstall/2008/default.aspx
まずはこの中のVisual C++ 2008をインストールせよ


33 :デフォルトの名無しさん:2008/08/27(水) 21:56:45
>>29
プログラミングなんて一から九ぐらいまでは調べ物だから、
サーチエンジンの使い方も分からないようじゃ覚悟しといたほうがいい。

34 :デフォルトの名無しさん:2008/08/27(水) 22:00:45
>>29
お前にプログラミングなんて身に付かない
俺が保証する

35 :デフォルトの名無しさん:2008/08/27(水) 22:04:59
現在C++という奴をインストールする準備中

本当に無能で申し訳ない
今年の残りと翌年から三年間死ぬ気で頑張る気だ
また詰まったら助けを乞うかも知れないが、これから出来るだけ自分で調べてみる

ありがとう


36 :デフォルトの名無しさん:2008/08/27(水) 22:39:31
業務命令でもない限り無理してやることもないのに

37 :デフォルトの名無しさん:2008/08/27(水) 22:47:17
ズブの素人だと3年でも足りるかどうか

38 :デフォルトの名無しさん:2008/08/27(水) 23:40:26
話ぶっちしてすまんが、
なんで正常終了できんとね

#include <setjmp.h>
#include <signal.h>

jmp_buf a;

void b(int c)
{
longjmp(a, 1);
}

int main(void)
{
signal(SIGINT, b);
if (setjmp(a) == 0) for(;;);
return 0;
}

39 :デフォルトの名無しさん:2008/08/28(木) 00:26:00
>>35
大学生か? プログラミングなんかで遊んでないで本職のほう勉強しろよ


40 :デフォルトの名無しさん:2008/08/28(木) 01:56:43
>>38
シグナルハンドラが参照する変数はvolatile型でないといけない

41 :デフォルトの名無しさん:2008/08/28(木) 02:21:25
>>38
setjmp が割り込みに使用する環境を保存しないからじゃないか?

42 :デフォルトの名無しさん:2008/08/28(木) 03:23:02
while("forever") {
}

43 :デフォルトの名無しさん:2008/08/28(木) 03:23:56
C++をインストール・・・
斬新な響きだ

44 :デフォルトの名無しさん:2008/08/28(木) 16:16:09
0x1.fffffeP127F

こんな数値の記述を見かけたんですが、よくわかりません。
16進数なのか浮動少数なのか


45 :デフォルトの名無しさん:2008/08/28(木) 16:23:26
浮動小数点数の十六進法表記。
大抵のコンピュータでは浮動小数点数も二進法ベースなので、
十六進法表記できるようにするのは理に適っている。

46 :デフォルトの名無しさん:2008/08/28(木) 16:35:49
44の文字列をsscanfでfloat型変数に読み込むにはどうすればいいですか?


47 :デフォルトの名無しさん:2008/08/28(木) 16:36:55
訂正

44の数値の文字列をsscanfでfloat型変数に読み込むにはどうすればいいですか?

48 :デフォルトの名無しさん:2008/08/28(木) 16:39:38
意味が良くわからん、こういうこと?
float f;
sscanf("44", "%f", &f);

49 :デフォルトの名無しさん:2008/08/28(木) 16:53:41
>>48
>>44
float f;
sscanf("0x1.fffffeP127F", "%f", &f);


50 :デフォルトの名無しさん:2008/08/28(木) 16:54:43
>>44の、と書け
できない


51 :デフォルトの名無しさん:2008/08/28(木) 16:55:10
ああ、44って>>44のことかw

52 :デフォルトの名無しさん:2008/08/28(木) 17:03:57
コード
  float f;
  int n;
  char c;
  n = sscanf("0x1.fffffeP127F", "%f%c", &f, &c);
  printf("n = %d\nf = %f\nc = %c\n", n, f, c);

出力
  n = 2
  f = 0.000000
  c = x

できないね

53 :デフォルトの名無しさん:2008/08/28(木) 17:16:43
error C2224: '.fffffeP127F' : 左側が構造体または共用体型ではありません

54 :デフォルトの名無しさん:2008/08/28(木) 17:33:57
boostのlexical_cast使えば変数に入力できるって聞きました
標準Cでやる手段はないんですかね


55 :デフォルトの名無しさん:2008/08/28(木) 17:47:02
externのメリットがあれば教えてください

56 :デフォルトの名無しさん:2008/08/28(木) 18:25:26
無い

57 :デフォルトの名無しさん:2008/08/28(木) 18:38:14
>>55
まずexternの意味から学んでください

58 :デフォルトの名無しさん:2008/08/28(木) 18:49:49
>>52-54
C99対応の処理系で%a使え
ほかには、VC++も2005から%aが使える。

59 :デフォルトの名無しさん:2008/08/28(木) 19:10:46
>>58
VC++だと%aが使えるのは、printf系だけだ。
scanf系は使えない。

60 :デフォルトの名無しさん:2008/08/28(木) 19:49:53
char型の文字列を配列みたいに保持する方法はありませんか?


char mozi[10]
という10文字の文字列を200個まとめて持てるデータ構造です


61 :デフォルトの名無しさん:2008/08/28(木) 19:55:57
char mozi[200][10]

62 :デフォルトの名無しさん:2008/08/28(木) 19:57:16
どうも!

char *mozi;


mozi="aaaa";

って代入の仕方はOKですか?

63 :デフォルトの名無しさん:2008/08/28(木) 20:01:42
ちゃんと理解して使ってるならOK

64 :デフォルトの名無しさん:2008/08/28(木) 20:20:22
>>62
文字列リテラルを暗黙的にchar*にキャストするのは控えたほうがいい。

65 :デフォルトの名無しさん:2008/08/28(木) 20:45:38
Cでゲーム作る人なんているんですか?

66 :デフォルトの名無しさん:2008/08/28(木) 20:58:55
>>62
文字列定数を直接ポインタで引っ張りまわすことはもちろん可能である
しかし文字列定数が書き換え可能であることは保証されていないので、
うっかりクラッシュする原因となる危険性も多分にある
できるかぎりconst char *を使うこと

67 :デフォルトの名無しさん:2008/08/28(木) 21:00:24
>>65
いるかもしないし、いないかもしれないし、いたとしてもいなかったとしてもどうでもいいたぐいの問題

68 :デフォルトの名無しさん:2008/08/28(木) 21:23:33
今作っています><

69 :デフォルトの名無しさん:2008/08/28(木) 21:51:14
レスdx

>>40
volatile jmp_buf a;
としてみたが、症状くぁわらん
むぅ・・・

>>41
その辺、怪しいとは俺も思っとやが
割り込みマスクビットが立ったまま main() から return するのはマズいんかいの・・・

70 :デフォルトの名無しさん:2008/08/28(木) 22:05:18
宣言で *moziとしたとき
どういう状態になってるんでしょうか?

文字の先頭アドレスを指すポインタが宣言されてるだけですか?

71 :デフォルトの名無しさん:2008/08/28(木) 22:20:34
文字列じゃなくて文字へのアドレスだよ

72 :デフォルトの名無しさん:2008/08/28(木) 22:32:36
関数ポインタの配列作って関数を呼び出すときに引数の数をバラバラにすることってできますか

73 :デフォルトの名無しさん:2008/08/28(木) 22:32:49
文字列の先頭へのポインタ
=文字列の先頭の文字へのポインタ

74 :デフォルトの名無しさん:2008/08/28(木) 22:35:10
>>72
連絡用の構造体を別途用意して関数ポインタで扱う関数にはその構造体のポインターだけ渡して
内部で構造体を見るようにするとか?

75 :デフォルトの名無しさん:2008/08/28(木) 22:56:51
>>72
可変個引数関数でできるだろ
va_listとかで(ry

76 :デフォルトの名無しさん:2008/08/28(木) 23:11:33
>>75
関数ポインタ使う利点が薄くなるよ

77 :デフォルトの名無しさん:2008/08/28(木) 23:14:45
>>76
ということはやっぱり>>74のように渡すのはとりあえずポインター1個だけ渡すように統一して
関数内部でそのポインターの先にぶら下がってる構造体を見るとかにしたほうがいいかな?

78 :デフォルトの名無しさん:2008/08/28(木) 23:16:17
このスレの話題が大体わかるレベルでやっとってくれるところってあるの?
アルバイトでいいんだけど

79 :デフォルトの名無しさん:2008/08/28(木) 23:18:44
微妙じゃね・・・

このスレで出てくる話題ってピンきりだし、言うほどレベル高い内容でてこないしな。

80 :デフォルトの名無しさん:2008/08/28(木) 23:19:15
>>65
今時は色んな言語使ってるんじゃないの?
LuaとCとアセンブラ、みたいな。

81 :デフォルトの名無しさん:2008/08/28(木) 23:20:05
アルバイトでいいなら雇ってくれるとこはあるんじゃないの

82 :デフォルトの名無しさん:2008/08/28(木) 23:28:38
Cの絵本渡されて読んできたような人が、派遣元いわく経験者として派遣されてるところもあるとかなんとか・・・

83 :デフォルトの名無しさん:2008/08/28(木) 23:30:26
>>82
そんな経歴偽装しまくりなのが今のIT業界では?
なんとか人を放り込んでマージンせしめたい中小零細な社長が多くやっていけるのは
そのためと思ってたけど・・・

84 :デフォルトの名無しさん:2008/08/28(木) 23:46:27
使い捨てにされてかわいそうに。
出向先でダメっぷりをひたすら披露して会社の信用を落とすくらいしか反撃方法がないな

85 :デフォルトの名無しさん:2008/08/28(木) 23:51:44
このスレのな内容がわかるようなら

「C言語経験3年、プロジェクトリーダーの経験あり」

と、イカサマ派遣ソフトハウスの社長は派遣先に提出する業務経歴書に書くだろう。

86 :デフォルトの名無しさん:2008/08/28(木) 23:53:24
PLとかPMとかってどんくらいしんどいの?
そういう人達はこのスレにはすんでない?

87 :デフォルトの名無しさん:2008/08/28(木) 23:58:25
とりあえず16進浮動小数点表記を変換するのが難しいぜ
double convert(const char *str);
で作ろうとしてるが手ごわい

88 :デフォルトの名無しさん:2008/08/29(金) 00:07:15
>>86
いや、いるだろう。
PLの仕事は計画、メンバー編成、進捗管理、顧客折衝といろいろあるが、
なんといっても、一番大変なのが種々の問題対応
問題の発生しないプロジェクトなんて、ある規模以上なら皆無
計画の遅れ、予算不足、出来上がったシステムの品質の悪さ、人間関係、顧客や上司への説得
タフな人間でないと勤まらない

89 :87:2008/08/29(金) 01:09:16
ようやくできた
書式チェックしてないけど…
IEEE754前提にして
90行にもわたる超大作

90 :デフォルトの名無しさん:2008/08/29(金) 03:57:46
>>89
そんなにかかるか?
NANとかエラーチェックとか適当でよければ、
strtolとかビット演算とか組み合わせて、十数行で済む気がするんだけど。

91 :デフォルトの名無しさん:2008/08/29(金) 07:43:51
別の目的で作った簡易atof()から考えて、50か精精70行くらいで済みそうだと思うが。
まぁ、丁寧にエラーチェックすれば90行くらい行くのかも知らん。

92 :デフォルトの名無しさん:2008/08/29(金) 08:23:36
70行から90行だともう誤差だよなw

93 :デフォルトの名無しさん:2008/08/29(金) 08:24:56
だよなw
70行の奴はやたら1行で終わらせるタイプで
90行の奴は1行で書ける部分も{}でわけちゃうとか

if () xxxxx



if() {
xxxxx
}

とかさw


94 :デフォルトの名無しさん:2008/08/29(金) 09:39:18
if() {
xxxxx
}
は全然構わない。ていうかやってくれ

95 :デフォルトの名無しさん:2008/08/29(金) 09:43:59
Cの文法上、定数しか書けない場所とはどういう場合がありますか?

96 :デフォルトの名無しさん:2008/08/29(金) 09:48:00
配列宣言時の要素数、自動変数以外の初期化子とかかな。
前者はC99で定数式以外もおけるようになったはずだけど。

97 :デフォルトの名無しさん:2008/08/29(金) 09:54:27
おれはこう。
if ()
{
xxxxx
}

98 :デフォルトの名無しさん:2008/08/29(金) 10:33:49
>>97
なんかすげー違和感
別にいいけど

99 :デフォルトの名無しさん:2008/08/29(金) 10:39:40
>>97の形式は結構使うな
//や#ifとの相性がいい

100 :デフォルトの名無しさん:2008/08/29(金) 11:10:04
>>99
確かに。
自分は、蟹飯あがりなもんでずっと
if () {
xxxxx
}

なんだけど、ifのコメントアウト面倒なんだよな。

101 :デフォルトの名無しさん:2008/08/29(金) 11:12:42
C#だと勝手に
if ()
{
//
}
になるから今の
if () {
//
}
から変えようか悩んでる

102 :デフォルトの名無しさん:2008/08/29(金) 11:15:43
>>101
俺がいる。
VC#オプションいじってもどうにもならなくて俺涙目。

103 :デフォルトの名無しさん:2008/08/29(金) 13:25:15
>>95
あとswitchのラベル

104 :デフォルトの名無しさん:2008/08/29(金) 20:56:51
>>101
それは、VSのオプションで変更可能。

105 :デフォルトの名無しさん:2008/08/29(金) 20:59:38
if (・・・)
  ・・・・・;

上級者では、ifの下が一行のときは、{}をつけない人も多いな。

106 :デフォルトの名無しさん:2008/08/29(金) 21:01:32
CとC++の間を行ったりきたりふらふらしてる
俺もCだけでバリバリ書けるプログラマになりたい


107 :デフォルトの名無しさん:2008/08/29(金) 21:10:41
>>105
上級者よりも背伸びしたい初心者に多い

108 :デフォルトの名無しさん:2008/08/29(金) 21:11:30
char str[256] = "hage";
こんな変数があったとしたらstr[4]以降はずっとNULL(\0)が入ってますか?

109 :デフォルトの名無しさん:2008/08/29(金) 21:11:57
>>107
そんなことない。
実際上級者に多い。

110 :デフォルトの名無しさん:2008/08/29(金) 21:13:17
>>108
NULLと\0は別物だぞ。

111 :デフォルトの名無しさん:2008/08/29(金) 21:14:35
>>110
そうなんですか?同じようなものと思ってました

112 :デフォルトの名無しさん:2008/08/29(金) 21:16:41
文字列の最後につけるのが\0で、ポインタに入れるのがNULL

113 :デフォルトの名無しさん:2008/08/29(金) 21:18:04
それで最後の\0以降もずっと\0が続くんですか?

114 :デフォルトの名無しさん:2008/08/29(金) 21:25:01
>>110
俺も同じだと思ってたが何が違うんだ?

115 :デフォルトの名無しさん:2008/08/29(金) 21:28:38
>>113
続くよ。

116 :デフォルトの名無しさん:2008/08/29(金) 21:30:40
>>112
うわぁ^^;

117 :デフォルトの名無しさん:2008/08/29(金) 21:34:03
>>114
>>112

118 :デフォルトの名無しさん:2008/08/29(金) 21:34:08
ありがとう

119 :87:2008/08/29(金) 21:37:47
BorlandC++Compiler5.5.1 だとビットフィールド間にパディングが入るのですが、
これを抑制するオプションはありますか?

120 :デフォルトの名無しさん:2008/08/29(金) 21:49:23
コンピュータ用語としてのNULLにはさまざまな意味があるが、
C言語においてはNULLという特別なマクロの名前が存在するため、
特別な文脈以外ではC言語でNULLといえばこのNULLマクロのことを指す
全てのビットがゼロであるバイトを指す場合にはヌル文字、\0、NULなどが使われることが多い

121 :デフォルトの名無しさん:2008/08/29(金) 21:51:40
ファイルポインタで質問があります
int main(void)以外の関数内でファイルポインタを使うことはできますか?
さっきからエラーが直せなくて困ってます;;

122 :デフォルトの名無しさん:2008/08/29(金) 21:52:41
NULLってCでは (void*)0 でしょ?

123 :デフォルトの名無しさん:2008/08/29(金) 21:57:06
>>121
main以外でも使えるよ。


124 :デフォルトの名無しさん:2008/08/29(金) 22:03:30
>>123
うーん、そうですか〜。
どうもありがとうございます。
参考書を終えて初めて100行超えのを自作しているんですが、書いてる最中は楽しいけど
バグ取りがめっちゃめんどくさいですね^^;
とりあえずもうちょい頑張ってみます。

125 :デフォルトの名無しさん:2008/08/29(金) 22:12:17
printf("%p", NULL); で0以外の値が表示される環境もあるかもしれない。

--
intが32bit、ポインタが64bitの環境だと、二行目のコードはバグる。
printf("%p %d", NULL, 1);
printf("%p %d", 0, 1);

--
下のコードはNULLが0の環境がほとんどなので、まあ、ほとんどの環境で問題なく動くけど、
char s[100];
s[0] = NULL;

たとえば、
s[0] = SEEK_SET; と文字列をクリアしてるコードがあったら、だれでもおかしいと思う。
それと同じで、NULLと\0は用途が違うので、 使い分けるべき。



126 :デフォルトの名無しさん:2008/08/29(金) 22:21:56
>>122
いいえ特に決まっていません。

127 :デフォルトの名無しさん:2008/08/29(金) 22:29:53
>>126
C89では値ゼロを持つ整数定数か、それをvoid *にキャストした式と決まってたはずだけど、C99では違うの?

128 :デフォルトの名無しさん:2008/08/29(金) 22:42:05
0がNULLになるのは保障されてるけど
NULLが0であるという保障はなかった記憶が

129 :デフォルトの名無しさん:2008/08/29(金) 22:43:24
>>128
君が言いたいのはNULLでなくてヌルポインタでしょう

130 :デフォルトの名無しさん:2008/08/29(金) 22:44:06
そこらへんの話はC FAQ読めばいい。

131 :デフォルトの名無しさん:2008/08/29(金) 23:35:11
値の内容云々ではなく、

・アドレスを示していないポインタ
・文字列の終端であることを示す値

の区別を付けられない人がこんなにいるんですね…

\0とかNULL、null、(void*)とかそんなことの前に、
ヌルが何も示していない状態・概念を一般化した表現だという
言葉の理解をすれば\0がNULLでは用途の違いどころか意味が
違うと分かるでしょうに…。



132 :デフォルトの名無しさん:2008/08/29(金) 23:37:47
>>131
言葉てきにはnull文字だからやっぱごっちゃじゃねw

133 :デフォルトの名無しさん:2008/08/29(金) 23:39:03
ナル文字でおk

134 :デフォルトの名無しさん:2008/08/29(金) 23:39:44
>>127
C99では「処理系依存の空ポインタ定数」としか書いてない。

135 :デフォルトの名無しさん:2008/08/30(土) 00:08:49
>>115
\0が続く保障はないだろ。
というか、>>108はなんでそのようなことを気にしているんだろうか?

136 :デフォルトの名無しさん:2008/08/30(土) 00:13:24
>>135
宣言でなら保証はあるだろ

137 :デフォルトの名無しさん:2008/08/30(土) 00:19:28
>>136
なんで?

138 :デフォルトの名無しさん:2008/08/30(土) 00:25:15
>>137
char str[256]={'h','a','g','e','\0'};
だから

139 :デフォルトの名無しさん:2008/08/30(土) 00:27:44
char str[256]={'h','a','g','e','\0''\0','\0','\0','\0','\0','\0','\0'・・・'\0',,};

140 :デフォルトの名無しさん:2008/08/30(土) 01:39:00
もうNULLは0では無いって言い争い飽きた

分かってるからNULLでも\0でもいいよもう

141 :デフォルトの名無しさん:2008/08/30(土) 02:08:05
>というか、>>108はなんでそのようなことを気にしているんだろうか?
たぶんstrncpyを使いたいとかそんなんだろう

142 :デフォルトの名無しさん:2008/08/30(土) 02:09:21
>分かってるからNULLでも\0でもいいよもう
わかってないやつが見たときに誤解するから問題なんだ

143 :デフォルトの名無しさん:2008/08/30(土) 02:10:48
>>108
実際何が入ってるか覗いてみればいいのに

144 :デフォルトの名無しさん:2008/08/30(土) 02:12:28
ところで配列の要素数に対して初期化子が多い場合にはエラーになるけど、
char ary[4]="hoge"; ができるのは、文字列リテラルによる初期化をするときに
末尾の\0を入れるか入れないかをコンパイラが自動的に判断してるってことでいいのかな

145 :デフォルトの名無しさん:2008/08/30(土) 02:26:34
「動けばいい」奴は \0 だろうが NULL だろうが、要は 0 が入れば何でもいいんだよ
そういう手合いに無理に美意識を押しつけなくても誰も困らんだろう

146 :デフォルトの名無しさん:2008/08/30(土) 02:33:41
美意識が何の関係がある
言葉の問題は厳密さの問題で、厳密さはPGに最も必要なものの一つだ

147 :デフォルトの名無しさん:2008/08/30(土) 02:35:23
初心者のままで居たくないなら、せめて
http://www.kouno.jp/home/c_faq/
くらいは目を通すべきだろ。

当然 http://www.kouno.jp/home/c_faq/c5.html#9 も。

148 :デフォルトの名無しさん:2008/08/30(土) 03:32:39
NULL のどこが厳密なんだよw

149 :デフォルトの名無しさん:2008/08/30(土) 03:38:01
誰もNULLが厳密であるなどと発言していないのにそんなセリフを吐いてしまう君は相当厳密さに欠けているね

150 :デフォルトの名無しさん:2008/08/30(土) 03:38:22
>>145
そりゃアセンブラレベルだと文字列の最後の\0も空ポインタへ入れるNULLも0だけどさ
厳密には違うぜ

NULLは実行環境でポインタサイズちがうので4バイト0x00かもしれないしもっと多いかもしれないし少ないかもしれない。

文字列の最後を示す\0だって文字列のエリアを実行時は0x00でクリアしても
実行中は面倒なんで文字列の本当に最後だけ0x00であとは実は前の文字列情報が残ってる場合もある

前 hoge_hoge_hoge\0
後 hoeg_hoge\0hoge\0

151 :デフォルトの名無しさん:2008/08/30(土) 03:41:43
>>150
まちがってまつ

152 :デフォルトの名無しさん:2008/08/30(土) 03:43:15
うん。

153 :デフォルトの名無しさん:2008/08/30(土) 03:43:33
とまあこんな風に誤解がはびこるのでなるべく厳密な言葉の扱いをしようという話だ

154 :デフォルトの名無しさん:2008/08/30(土) 03:44:23
>>150
前半も後半もなにもかも間違ってる

155 :デフォルトの名無しさん:2008/08/30(土) 03:44:48
すまん、こんがらがってる。
誰か解説よろしこ

156 :デフォルトの名無しさん:2008/08/30(土) 03:45:40
NULLはヌルポインター
'\0'はヌル文字

そう読めばいい。

157 :デフォルトの名無しさん:2008/08/30(土) 03:47:37
もで0x00なのは確かでしょ

ポインターや文字列が一緒になった構造体配列もmemsetで0x00クリアしたあと
わざわざNULLや\0を代入するロジックを見たことがない

158 :デフォルトの名無しさん:2008/08/30(土) 03:49:33
誰か釣られてやれよ

159 :デフォルトの名無しさん:2008/08/30(土) 03:53:40
>>157
> ポインターや文字列が一緒になった構造体配列もmemsetで0x00クリアしたあと
> わざわざNULLや\0を代入するロジックを見たことがない
それはあまりにも危険なコード。
ひょっとしたら、doubleもmemsetで0x00クリアか?


160 :デフォルトの名無しさん:2008/08/30(土) 03:56:55
構造体全体をmemsetで0x00クリア

構造体のメンバーを参照

コンパイル時、「未初期化変数の参照」のWARNINGがでない?


161 :160:2008/08/30(土) 03:57:48
でないか!?

162 :デフォルトの名無しさん:2008/08/30(土) 03:57:50
>>149
じゃ、何が厳密だって言ったんだよ?
「そんなこと言ってない」で逃げるだけのヘタレの相手はごめんだぜ

163 :デフォルトの名無しさん:2008/08/30(土) 04:02:41
まーさすがにdoubleなんかを使う場合は違う方法でやるでしょ。
というかdoubleなんてそんなに使う?

164 :デフォルトの名無しさん:2008/08/30(土) 04:08:53
とりあえずここを全部読んで理解した上で書き込もうよ
http://www.kouno.jp/home/c_faq/c5.html
特に>>157とか書いてる人

165 :デフォルトの名無しさん:2008/08/30(土) 04:10:06
浮動小数点演算を実装する場合0は全ビット0になるように作るのが普通だけどね。
直感的にわかりやすいし。
そのぶん指数桁にゲタを履かせたりして苦労するが、memset(&dbl_var, 0, sizeof(dbl_var));
とできるメリットは結構ある。
というわけで
「ほとんどすべての処理系でdoubleやfloatは全ビットゼロクリアで0になる」
と言ってもよいのでは。



166 :デフォルトの名無しさん:2008/08/30(土) 04:13:09
「ほとんどすべて」と「すべて」の間には越えられない壁がある

167 :デフォルトの名無しさん:2008/08/30(土) 04:18:32
ほとんどすべての処理系の「ほとんど」が問題なわけで

168 :デフォルトの名無しさん:2008/08/30(土) 04:24:20
c++でオブジェクトを初期化しようとして
memset(&obj, 0, sizeof(obj));
とやってハングさせたオレが来ましたよ

・・・・だってメンバたくさんあったんだもん。


169 :デフォルトの名無しさん:2008/08/30(土) 04:33:40
変数の名前がうまくつけられないのって、英語ができないせいなんですかねぇ・・・。
1ヶ月後にソースみたらさっぱりわからん

170 :デフォルトの名無しさん:2008/08/30(土) 04:34:33
確かに辞書引いてつけた変数名はあとでなんだったかわからなくなる

171 :デフォルトの名無しさん:2008/08/30(土) 04:39:48
良いコードというのは、英語として読めるコード

172 :デフォルトの名無しさん:2008/08/30(土) 04:41:56
英単語の文字をフルにつけちゃうからだろw
うまく略すなりするとか。

あとは文字列を検索してわかりやすく表示してくれるツール使うとか。
それをしないと英単語で長い名前にした意味がないw

173 :デフォルトの名無しさん:2008/08/30(土) 04:44:34
略して頭文字だけになって何の関数だこれ、になる

素直にローマ字でかいとけばいいのかなぁ

174 :デフォルトの名無しさん:2008/08/30(土) 05:08:16
英語は簡単でプログラムによく使われる単語を使う。
和英辞書で単語を探すのは極力避ける。
類似のプログラムを探して、そこで使用されている英語を使う。
略し方にはルールがあるので、それに従う。
業務プログラムはローマ字も可。

こればかりは経験。良いプログラムを多く見ること。

175 :デフォルトの名無しさん:2008/08/30(土) 05:35:32
'\0'は1バイト
NULLは4バイト

176 :デフォルトの名無しさん:2008/08/30(土) 05:38:03
>>175
Cじゃ文字リテラルはint型扱いだろ

177 :デフォルトの名無しさん:2008/08/30(土) 10:09:12
>>171
COBOLer 乙

178 :デフォルトの名無しさん:2008/08/30(土) 11:19:29
>>174
命名規則をまとめたサイトを見りゃ1発。
http://potting.syuriken.jp/potting_conv/CodingGuidelines_J/CodingGuidelines.htm

179 :デフォルトの名無しさん:2008/08/30(土) 12:27:20
404…かと思ったらlが抜けてるのか

180 :デフォルトの名無しさん:2008/08/30(土) 13:11:33
NULLはヌルポインタではないし4バイトとも決まっていない

181 :デフォルトの名無しさん:2008/08/30(土) 13:12:29
>>180
NULLはヌルポインタでしょ

182 :デフォルトの名無しさん:2008/08/30(土) 13:13:36
もうどうでもいいよ

183 :デフォルトの名無しさん:2008/08/30(土) 13:14:35
とりあえず0をn個で埋められるんでしょ


184 :デフォルトの名無しさん:2008/08/30(土) 14:01:23
ある計算を何度もやらせるのに
coutで結果を表示させながらやらせた場合と、
何も表示せず最後にだけレポートを表示させた場合で
100倍くらい処理速度に差があるんですが
これって普通ですか
標準入出力ってこんなにも重いものなんですか

185 :デフォルトの名無しさん:2008/08/30(土) 14:02:50
>>184
Yes

186 :デフォルトの名無しさん:2008/08/30(土) 14:03:46
>>184
最後のレポートが途中の表示の1/100の量なら、普通です。


187 :デフォルトの名無しさん:2008/08/30(土) 14:03:56
>>184
そりゃまあ、そんなもんでしょ。
それをファイルに1レコードずつ読み書きに置き換えたらもっとだと思うよ。
表示っていっても数字を渡した場合は関数の中で文字に変換して書式に従って整形
その後画面表示だったらそのAPIなんかに渡したりと意外となかで処理はやってるし。

188 :デフォルトの名無しさん:2008/08/30(土) 14:04:58
うへぇ、そうだったんですね
処理速度を気にするプログラムを始めて作っていて
これほど差があるものだと思い知りました
ありがとうございました

189 :デフォルトの名無しさん:2008/08/30(土) 16:53:04
>>181
個人的にはどうでも良いけど、NULLはヌルポインタ定数と呼び、
ヌルポインタ定数をポインタ型にキャストした結果をヌルポインタと呼ぶ。

190 :デフォルトの名無しさん:2008/08/30(土) 17:19:17
それを知っててよかったことを200文字以上400文字以下で述べよ

191 :デフォルトの名無しさん:2008/08/30(土) 19:24:29
>>189
違和感があるぞ
ポインタ変数への代入後または右辺値でなければNULLはNULLポインタにあらずって感じだ

192 :デフォルトの名無しさん:2008/08/30(土) 20:21:52
質問お願いします。 

1、PRINTえふで出力した文章って、下に下に書き足されて前の文章がいつまでも残りますよね?
そこで、出力してある文章を一旦全部消す方法はあるでしょうか。ないでしょうか。

2、キーボードの矢印キーで入力する方法はあるでしょうか。ないでしょうか。

193 :デフォルトの名無しさん:2008/08/30(土) 20:31:55
>>192
A. 両方環境依存ですが方法はあります

194 :デフォルトの名無しさん:2008/08/30(土) 20:44:30
>>192
使っている環境をありったけ述べてください
もしlinuxとかなら"\r"だけで行頭に戻るかも


195 :192:2008/08/30(土) 20:44:55
>>193

素早いお返事ありがとうございます。

環境依存というのは、自分のパソコンやらキーボードやらコンパイラやらの事、でいいんでしょうか? 
まあ自分は完全にアマチュアで、「○を動かして宝さがしゲーム」を組んでみて、やったー!動いてるー!というレベルです。 
ですからできなくてもなんら問題はないんですが、参考までにオススメの環境を教えてもらってもいいですか?

196 :192:2008/08/30(土) 20:49:57
>>194

とりあえず、コンパイラはborland c++ compiler5.5 です

197 :デフォルトの名無しさん:2008/08/30(土) 21:10:23
>>192
矢印の取得なら
PeekConsoleInput とか ReadConsoleInput @ windows.h
もしくは
getch とか kbhit @ conio.h

画面消去は system("cls"); とか

198 :デフォルトの名無しさん:2008/08/30(土) 21:15:44
奇遇にも俺もコンソールAPI勉強中だぜ
win32でいいなら↓でいろいろできるようになるよ
ttp://msdn.microsoft.com/ja-jp/library/cc429123.aspx



199 :192:2008/08/30(土) 21:25:29
>>197

うおおおおお!!!!!感動しました!! 
system("cls")で、ぐっとゲームっぽくなりました!
ほかのはちょっと今は理解不能ですけど 

ありがとうございました!!

200 :デフォルトの名無しさん:2008/08/30(土) 21:29:22
>>191
そう言われても、規格にそのように書いてあんだよね。

201 :デフォルトの名無しさん:2008/08/30(土) 21:44:07
clsはネタかと思ってたがマジだったのか

202 :デフォルトの名無しさん:2008/08/30(土) 21:44:08
値0の整数定数はヌルポインタ定数で、ポインタを必要とするところに書いたらヌルポインタに変換されることが保証されている
NULLはマクロで、それはヌルポインタ定数そのものに置換されるかもしれないし、それをvoid*にキャストした式や、(C99の場合は)ヌルポインタそのものに置換されるかもしれない
ヌルポインタが何であるかは規格では定められていない

203 :デフォルトの名無しさん:2008/08/30(土) 21:50:39
なんにも#includeしない状態で使える関数とか演算子とかってどんなものがあるんでしょう?

204 :デフォルトの名無しさん:2008/08/30(土) 21:52:20
>>162
厳密であるとは言葉の持つ意味に曖昧さがないようにするということ
0やNULLやヌルポインタが厳密なのではなく、それぞれの言葉をそれぞれの意味で明確に使い分けることが厳密さ

もちろん、曖昧さがあったとしても、正しく意志が疎通されないわけではない
しかしそれは書き手読み手の双方にCの正しい理解があることが必要であって、
ことこのスレでその前提を期待することは、無根拠な楽観を通り越して明らかな間違いであると言わざるをえない

205 :デフォルトの名無しさん:2008/08/30(土) 21:54:53
>>201
ネタじゃない方法plz

206 :デフォルトの名無しさん:2008/08/30(土) 22:46:01
Temporary Internet Filesフォルダ内の特定のファイルを、
他のフォルダへコピーするにはどうしたらいいのでしょうか?

フォルダ内検索でdesktop.iniのみしか表示されない、というところで詰まっています。。。

207 :デフォルトの名無しさん:2008/08/30(土) 22:52:50
実態は別の場所にある

208 :デフォルトの名無しさん:2008/08/30(土) 23:01:54
>203
関数は引数int(またはなし)で戻り値intのものだけ
それ以外は自分でプロトタイプを用意しない限り正しく動かない
演算子はインクルード関係ない

209 :デフォルトの名無しさん:2008/08/30(土) 23:50:01
>208

203は関数宣言しなかった際の関数の型解釈(C言語仕様)ではなく、
#include しない場合に使える関数→ビルトイン関数のようなことを
聞いている。きっと。

>203

208の言っていることは間違っていないが、使う関数は宣言するのが
常識とすれば「そんな関数はない」が回答。



210 :デフォルトの名無しさん:2008/08/30(土) 23:51:19
ごめん、標準Cなら一個あった。
main がそうだね。


211 :デフォルトの名無しさん:2008/08/30(土) 23:59:47
まさにそのビルトイン関数ってやつが知りたかったのですが、ひとつもないんですか・・・
memsetとか使ってみたら警告は出たけど動作はしてるみたいなんですけどこれはたまたまそういうコンパイラだったってことでしょうかね?


212 :デフォルトの名無しさん:2008/08/31(日) 00:07:24
>>211
その警告はmemsetがわからねーよってのじゃね?
ワーニングレベルでコンパイル通るけど、その実何もやってないはず。
memset程度ならたまたま使う変数だとかがいい感じで初期化されてただけだと思ったほうがいい

213 :デフォルトの名無しさん:2008/08/31(日) 00:12:52
一つもないです。

C言語は言語としての仕様しか提供されていないです。
その代わりというか標準Cライブラリが提供されてます。
C言語が main から動くというのもそのおかげです。

memestが動作したのは、208が言った仕様に従ってコンパイルされた
結果、memsetが入っているclibとリンクできただけ。

高度なサービスがセットになっている言語環境が欲しいなら
JavaとかC#とかの方がいいかも。


214 :デフォルトの名無しさん:2008/08/31(日) 00:16:22
>>202
JIS(C99)より。

値0を持つ整数定数式又はその定数式をvoid *にキャストした式を
空ポインタ定数(null pointer constant)(注釈55)と呼ぶ。
空ポインタ定数をポインタ型に型変換した場合、
その結果のポインタを空ポインタ(null pointer)と呼び、
いかなるオブジェクト又は関数へのポインタと比較しても
等しくないことを保証する。

(注釈55)
空ポインタ定数としてマクロNULLが
<stddef.h>(及び他のヘッダ)で定義されている。

となってるよ。
まぁ知ってんだろうけど、>>202の解釈はちょっと納得出来ないなぁ。
NULLはプリプロセッサで必ず空ポインタ定数に展開されるし、
ヌルポインタが何であるかは規格で定められている。
(何であるか、って内部表現の話か?それだとそもそもそんな話を持ち出す意味が無い)

>ポインタを必要とするところに書いたらヌルポインタに変換されることが保証されている
多くの場合は暗黙の型変換が発生するだけじゃないでしょーか・・・。
printfの%pはポインタを必要とするが、おそらくキャストしない0を渡してもintで渡ると思う。
まぁ、intとポインタのバイト数が違う処理系はまれなんで(ていうか俺は触ったこと無い)
処理系依存だけど殆どの環境で正しく動作する。

215 :デフォルトの名無しさん:2008/08/31(日) 01:28:28
>NULLはプリプロセッサで必ず空ポインタ定数に展開されるし
C99なら、だろ
C89だとただの0とか0Lである場合もある

>printfの%pはポインタを必要とするが
ちがう
可変個数引数の関数はコンパイラが型チェックをしない
だからそれは「プログラマの責任でポインタを書かなくてはいけない場所」であって
コンパイラが変換処理をしてくれるところの「ポインタを必要とする場所」ではない

216 :デフォルトの名無しさん:2008/08/31(日) 01:29:35
>>215
0はヌルポインタ定数なんすよ。

217 :デフォルトの名無しさん:2008/08/31(日) 01:33:44
>>215
よく読め、ナマの0も空ポインタ定数に入ってる

218 :デフォルトの名無しさん:2008/08/31(日) 01:36:42
ようするにNULLはマクロの名前であってそれ自体はヌルポインタじゃないけど
ポインタが必要な場所に書いたらヌルポインタとして扱われるってことだろ

この話終了

219 :デフォルトの名無しさん:2008/08/31(日) 01:42:50
まとめ

文法上ポインタを要求する場所に0を書いたらそれはヌルポインタに変換される。
0や0をvoid*にキャストしたものを空ポインタ定数(ヌルポインタ定数)と呼ぶ。
NULLはマクロの名前で、空ポインタ定数(のどれか)に展開される。
NULLやヌルポインタの本当の値がゼロである保証は無い。というか関係が無い。
だからNULLをゼロとか\0の意味で使うと誤解を招きやすい。

220 :デフォルトの名無しさん:2008/08/31(日) 01:51:51
もともとは\0とNULLの混同だけの話だったのにな・・・

221 :デフォルトの名無しさん:2008/08/31(日) 01:55:55
まー実行環境によってはNULLが0だと困るのもあるかもしれないしないかもしれない

メモリのアドレスの関係上0x00000000を使ってるが0xFFFFFFFFは使わない場合
NULLは0では困る可能性もあるわけだ。

222 :デフォルトの名無しさん:2008/08/31(日) 02:01:48
めんどくせぇなヌルポインタであることを示す予約語をつくろうぜ

null_ptr

とC++0xの話へもうちょっとだけ続くんじゃ

223 :デフォルトの名無しさん:2008/08/31(日) 02:48:23
printf("%c", NULL);
printf("%p", '\0');

224 :デフォルトの名無しさん:2008/08/31(日) 02:52:30
>>223
で?

225 :221:2008/08/31(日) 02:54:49
>>224
まあつべこべ言わずに確認してみろや

ってことじゃね?

226 :デフォルトの名無しさん:2008/08/31(日) 03:05:45
そんな環境によって結果が違うコード持ち出されても

227 :デフォルトの名無しさん:2008/08/31(日) 03:07:27
可変引数の仕組みから考えたら型情報は失われるから同じになりそうなもんだけど依存なの?
第一引数を元にキャストしてとりだすんだよね

228 :デフォルトの名無しさん:2008/08/31(日) 03:11:14
いやごめんなさい

229 :デフォルトの名無しさん:2008/08/31(日) 03:13:09
>>227
依存
上はNULLがvoid*にキャストされていて、ヌルポインタの内部表現が0でなかったとき0にならない(%cで表示されるかどうかは知らんが)
下はポインタのサイズが文字定数のサイズ(int)より大きかったとき、ゴミを読み込んで0以外の値になるかもしれない

230 :デフォルトの名無しさん:2008/08/31(日) 03:27:37
>>227
そもそも、c変換指定子に対応する引数はintでなければならず、
p変換指定子に対応する引数はvoid*でなければならない。
それ以外の場合の挙動は未定義。

231 :デフォルトの名無しさん:2008/08/31(日) 05:52:04
C系のスレを荒らすにはNULLで釣れば簡単だと思った。


232 :デフォルトの名無しさん:2008/08/31(日) 12:14:04
NULLとgotoで荒れるのは昔から万国共通

233 :デフォルトの名無しさん:2008/08/31(日) 12:50:14
gotoは答えが出てるから荒れないよ

234 :デフォルトの名無しさん:2008/08/31(日) 13:07:41
未定義未定義言うんじゃなくて各実装ではどうなってるか調べる方法を教えてくだしあ

235 :デフォルトの名無しさん:2008/08/31(日) 13:23:35
調べて、それでどうするつもりだ

調べるという行為自体が目的なら頑張ればいいが
調べた結果に基づいて書いた処理系依存コードなんぞ窓から投げ捨てるためにあるようなものだ

236 :デフォルトの名無しさん:2008/08/31(日) 13:29:02
というか調べることができる保証すらないのが未定義

237 :デフォルトの名無しさん:2008/08/31(日) 13:30:21
↑馬鹿

238 :デフォルトの名無しさん:2008/08/31(日) 13:39:13
毎回、動作が変わるかもしれないから正確に調べられないのが未定義。

239 :デフォルトの名無しさん:2008/08/31(日) 13:41:09
↑馬鹿

240 :デフォルトの名無しさん:2008/08/31(日) 13:47:28
ばかっていうやつがばかなんだいぷんぷん

241 :デフォルトの名無しさん:2008/08/31(日) 14:02:10
|・未定義(undefined)の動作
|本当に何が起きても不思議はないことを意味する。規格は何の必要条件も課さない。
|コンパイルできないかもしれないし、誤った動きをするかもしれないし
|(クラッシュしたり黙って誤った結果を出したり)、
|あるいはたまたまプログラマの意図したとおりの動きをするかもしれない。

242 :デフォルトの名無しさん:2008/08/31(日) 14:56:47
#define MAX (100)
見たいな感じで#define での定数に括弧を使ってるソースを見かけたんですが、
括弧のあるなしでなにか動作が変わる例はあるのですか?無い様に思ったんですがひょっとしたらあるのかなと思いまして

243 :デフォルトの名無しさん:2008/08/31(日) 15:14:34
>>242
#define add(a, b) ((a)+(b))

9/add(1,2)

244 :デフォルトの名無しさん:2008/08/31(日) 15:14:58
数字だけなら変わらないが、考えるの面倒だから全部に括弧つけるって人は多いと思う
(100+1)みたいに後から足すこともできるし

245 :デフォルトの名無しさん:2008/08/31(日) 15:26:12
バッファ確保等で、MAXを使った積演算を書いたとき、char buff[MAX * N]として
ある日MAXを別の条件で定義し直すとする。

#define MAX 100 + 50 /*なんかの理由で50追加*/
なんてソースにしたらバグになるので、
#define MAX (100 + 50) /*なんかの理由で50追加*/
こういう修正がされることを期待してあらかじめ入れておく。

1行だけのif文に { } を入れる・入れないの議論も本来いっしょ。
オレは入れるべきだと思ってる。

MISRA-Cとかに対応するためにはどちらも必須。


246 :デフォルトの名無しさん:2008/08/31(日) 15:43:00
>>243
すいませんでした
数字だけなのに括弧つけてて不思議だなぁと思って質問してたんです
お手数かけて申し訳ありません

>>244
やっぱ変わらないですよね
追加のことは思い至りませんでした
どうもありがとうございました


247 :デフォルトの名無しさん:2008/08/31(日) 15:48:49
あとはあれだ
トークン連結演算子(##)とかにマクロを放り込むバカに注意を出してくれる

248 :デフォルトの名無しさん:2008/08/31(日) 16:22:24
はるか昔、ある未定義のコードをコンパイルすると、
インベーダーゲームが始まるCコンパイラがあったよーななかったよーな・・・

249 :デフォルトの名無しさん:2008/08/31(日) 18:10:00
ソースを渡した後にゲームをクリアしないとコンパイルを実行してくれないコンパイラはどうか
仕事をしてるふりをして遊べる画期的なコンパイラだ


250 :デフォルトの名無しさん:2008/08/31(日) 18:15:03
ゲームの成績がコンパイル結果に反映されるコンパイラ

251 :デフォルトの名無しさん:2008/08/31(日) 18:15:45
>>249
よしコンパイルするか〜

「ながい たびが はじまる」

252 :デフォルトの名無しさん:2008/08/31(日) 18:25:36
スコアによっては問答無用で GPL なのをリンクしてくれるわけですね

253 :デフォルトの名無しさん:2008/08/31(日) 18:28:57
よしコンパイルするか〜

「これは ひどい」

254 :デフォルトの名無しさん:2008/08/31(日) 21:19:58
スコアによってエラー情報の詳細度が変わります

255 :デフォルトの名無しさん:2008/09/01(月) 01:06:05
数値Lだったらただlongになるだけでバイトサイズはコンパイラ依存ですよね
数値リテラルの型ではなくてバイト数を固定する方法ってないんでしょうか?
多倍長整数ライブラリとかで変数に巨大な定数を代入したくなったときとかlongまでしかできなかったら不便だと思うんですが・・・


256 :デフォルトの名無しさん:2008/09/01(月) 01:08:15
文字列で渡す

257 :デフォルトの名無しさん:2008/09/01(月) 02:16:07
>>255
標準Cで扱えないような数値を扱うために多倍長整数ライブラリをつかうわけで…

258 :デフォルトの名無しさん:2008/09/01(月) 05:01:58
標準では取り敢えず0llでlong longまで扱えるからそれで勘弁してくれ。

259 :デフォルトの名無しさん:2008/09/01(月) 05:07:42
だから標準の処理系ってどこにあるの?

260 :デフォルトの名無しさん:2008/09/01(月) 05:10:46
まーたやってる
臨機応変に考えろ。
昔からある言語でいろんなビット幅のCPUで使われてるんだし
時代とともにあれこれ変えて継ぎはぎだらけなんだし。

所詮は道具

261 :デフォルトの名無しさん:2008/09/01(月) 05:18:33
処理系依存の話は処理系依存のスレでどうぞ

262 :デフォルトの名無しさん:2008/09/01(月) 05:31:10
>>255
巨大な定数は文字列で渡せばおk

263 :デフォルトの名無しさん:2008/09/01(月) 22:51:22
ぶっちゃけて、プログラマーのみなさんは、C言語(C#やC++でなく)でどんなプログラムを組みますか? 
そりゃ色々あるのはわかってますよ!バカな質問かもしれませんよ!?こっちはただのドしろーとで悪いと思ってますよ!!
でもたとえばテキストベースが多いとか、C言語にはC言語ならではの、得意分野ってあるのかなー、と。
むしろ純粋なC言語のみのプログラムなんてやらないんでしょうか? 


264 :デフォルトの名無しさん:2008/09/01(月) 23:01:36
とりあえず持っているデジタル製品や家電を全部言ってみてください。


265 :263:2008/09/01(月) 23:11:22
えっと、携帯電話、テレビ、洗濯機、パソコン、プレステ2、プレステ、サターン、ドリームキャスト、ファミコンの互換機、冷蔵庫、ファック、MDコンポ、デジカメ、デジタル時計、炊飯器、電子レンジ、扇風機、デジタル貯金箱、GBA、掃除機、ビデオデッキ、DVD、
>>264  
まだありますけど、理解しました。
ありがとうございました。 


266 :デフォルトの名無しさん:2008/09/01(月) 23:12:03
むしろC#やC++のアプリなんてPC上くらいしか存在しないんじゃね?
家電のファームなんてほぼCだろ。ほぼって言うのは少数でアセンブラ含むということで

267 :デフォルトの名無しさん:2008/09/01(月) 23:17:52
自動車部品メーカーまわってたら、C++使える?って聞いてくるとこ多かったけどな

268 :デフォルトの名無しさん:2008/09/01(月) 23:17:55
最近は組み込みもC++使うよ

269 :デフォルトの名無しさん:2008/09/01(月) 23:20:29
へー
まあマイコンも性能上がってるしなあ。
書かなきゃいけない規模もあがってるからそうなるのか。

270 :デフォルトの名無しさん:2008/09/01(月) 23:31:45
つーか、携帯電話ならJavaも結構使われているしね。

271 :デフォルトの名無しさん:2008/09/01(月) 23:34:45
組み込みで STL とか boost はやっぱりだめ?

272 :デフォルトの名無しさん:2008/09/02(火) 01:04:10
ちょっとリッチな組み込みでも絶対駄目とまで言わないけどまだ自由には使えない

273 :デフォルトの名無しさん:2008/09/02(火) 01:05:41
組み込みではdoubleも使えないことが多いのに

274 :デフォルトの名無しさん:2008/09/02(火) 03:08:50
bcc32 5.5.1とgcc 3.4.5で以下のようなコードをコンパイルして実行すると
6.000000
5
となるのは何故でしょうか?
Visual studio 2005 pro のコンパイラでは
6.000000
6
となります。

柴田望洋著の『C言語によるアルゴリズムとデータ構造』のList2-13で
intへの変換結果が6となることを意図して下のような処理がされていたのですが
するべきでない処理なのでしょうか。

#include <stdio.h>

int main(void)
{
int i;
double vision = 0.6;
printf("%f\n",vision * 10);
printf("%d\n",(int)(vision *10));

return 0;
}



275 :デフォルトの名無しさん:2008/09/02(火) 03:25:28
0.6という数値は二進数では正確に表現できないので、実際には0.599999……になってしまっている。
んで、数の丸めに関する動作は処理系定義。だから直接整数にキャストするのは移植性の高い書き方ではない。

演算の結果が整数に非常に近いことが期待できるなら、(int)(d+0.5)が使える。

276 :デフォルトの名無しさん:2008/09/02(火) 03:26:49
訂正
×整数に
○0以上の整数に

277 :デフォルトの名無しさん:2008/09/02(火) 12:44:31
>>274
>intへの変換結果が6となることを意図して下のような処理がされていたのですが 
それが本当なら、ブックオフ行きだな


278 :デフォルトの名無しさん:2008/09/02(火) 12:50:46
柴田望洋だし

279 :274:2008/09/02(火) 13:16:26
>>274
0.6(10) = 0.1001…(以下1001の繰り返し) (2)
となって(vision * 10)は内部では5.999999999…になっているのですね。
それで、intの変換の段階で小数点以下を切り落としてbccとgccでは5になり、
VC++では printf("%f\n",vision); の時のような処理がされていて6にしてくれると。
今回は0.1刻みの値をvisionに格納しているので0.5を足して解決するのがよさそうです。
レス有り難うございます。

>>277
付属のCDに収録されたソースコードでも同様の問題が起きたので
私の打ち間違いではなさそうです。
付属のコンパイラはbcc32なのに別のコンパイラで動作確認したのでしょうか
もう少しCになれたら他の人の本を参考にする必要がありそうですね
アドバイス有り難うございます。

280 :デフォルトの名無しさん:2008/09/02(火) 17:06:13
構造体を初期化するときに以下のようなコードを見たのですが問題ないのでしょうか?

struct hoge a;
a = (struct hoge){0};


281 :デフォルトの名無しさん:2008/09/02(火) 17:22:19
C99で追加されたものを使っているんで、ややコンパイラを選ぶ。
初期化自体はstruct hoge a = {0};と同じ方法でやるので問題ない。

282 :デフォルトの名無しさん:2008/09/02(火) 18:28:10
ちくしょう便利だなC99め…

283 :デフォルトの名無しさん:2008/09/02(火) 19:26:16
>>279
0.1刻みなら内部では10倍で計算しておいて出力時に1/10すれば安心では?

284 :デフォルトの名無しさん:2008/09/02(火) 19:29:19
foo bar = {0};
って標準なの?

285 :デフォルトの名無しさん:2008/09/02(火) 20:25:15
>>284
もちろん

286 :デフォルトの名無しさん:2008/09/02(火) 20:56:36
つか、C99をいまだに使ったことがないわけだが

287 :デフォルトの名無しさん:2008/09/02(火) 21:00:21
つ[ICC]

一般の人にはなかなか手が出ませんな。

288 :デフォルトの名無しさん:2008/09/02(火) 21:02:59
自家用ならフリーじゃなかったっけ

289 :デフォルトの名無しさん:2008/09/02(火) 21:06:54
それ本当?評価版ってのがそうなんだろうけど、これ評価期限ってどうなの?
90日間?

290 :デフォルトの名無しさん:2008/09/02(火) 21:25:01
評価版じゃなくて,非商用限定でサポートなしのがある.
ttp://www.intel.com/cd/software/products/asmo-na/eng/index.htm から
Free Non-Commercial Download たどってメールアドレス登録すれば使える.


291 :デフォルトの名無しさん:2008/09/02(火) 22:23:32
10万を超える配列を扱う必要があって、mallocを用いて以下のような
プログラムを書いたのですが、どういうわけか1万3000程度で停止してしまいます。
コードには全く意味のない部分もありますが、どうして止まってしまうのか教えてください。また、どのようにすれば解決するかを教えていただけると幸いです。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int l,w,v,i,*la,*wi,*va;
FILE *fp;
fp = fopen("ru.dat","r");
la = (int *)malloc(sizeof(int)*10);
if (la == NULL) exit(0);
wi = (int *)malloc(sizeof(int)*10);
if (wi == NULL) exit(0);
va = (int *)malloc(sizeof(int)*10);
if (va == NULL) exit(0);
i=1;
while(fscanf(fp, "%d %d %d", &l,&w,&v) != EOF ){
la[i] = l;
printf("%d\n",i);
i++;}
free(la);free(wi);free(va);fclose(fp);
return 0;}


292 :デフォルトの名無しさん:2008/09/02(火) 22:27:40
>>291
malloc の引数はこのまま?

293 :デフォルトの名無しさん:2008/09/02(火) 22:32:30
>>291
malloc(sizeof(int)*10); を malloc(sizeof(int)*13000); にしたってこと?

294 :デフォルトの名無しさん:2008/09/02(火) 22:33:03
まあ*10は*100000の間違いとして
感じでは実際には512kb=int[128]しか割り付けられてないみたいな?
そんな環境あるのかね?

295 :デフォルトの名無しさん:2008/09/02(火) 22:33:50
>>293
あ、そっちか
単に割り付けられる限界超えただけだな

296 :デフォルトの名無しさん:2008/09/02(火) 22:35:00
DOSで動かしてるとか。

297 :デフォルトの名無しさん:2008/09/02(火) 22:40:50
intが16bitでオバーフローしてんじゃね

298 :デフォルトの名無しさん:2008/09/02(火) 22:43:07
DOSっていうとちょっと前にLSI-C86試食版がどうこう書いてたレスがあったな

299 :デフォルトの名無しさん:2008/09/02(火) 22:43:15
> 1万3000程度で停止してしまいます
停止とは具体的になんなのか!?ここ基本。

300 :デフォルトの名無しさん:2008/09/02(火) 22:43:17
まずは実行してる環境書いたほうがいいのでは?



301 :291:2008/09/02(火) 22:44:54
>>292
そうです、mallocの引数はこのまま10です。

>>296
詳しくはないのですが、
たぶんDOSではありません。

>>297
どうすればいいですかね・・・

302 :デフォルトの名無しさん:2008/09/02(火) 22:46:59
>>301
組み込みか・・・もしかすると某ゲーム機の非公式開発か?
あれならアプリごとのヒープサイズを今回の引っかかってるサイズまで
制限できるからなあ。

303 :デフォルトの名無しさん:2008/09/02(火) 22:47:04
これか!

C言語なら俺に聞け(入門篇) Part 34
http://pc11.2ch.net/test/read.cgi/tech/1218532990/7

7 名前:デフォルトの名無しさん[sage] 投稿日:2008/08/12(火) 20:20:22
>>6
ありがとうございます。
いろいろ検索して、LSI C-86 というものを今インストールしてみました。
まったくの初心者なのでこれで十分かと思ってます。
C言語のことほとんど知らないのですが、DOSプロンプトみたいな画面に
文字が出てくるのですね。びっくりしました。

304 :デフォルトの名無しさん:2008/09/02(火) 22:47:32
>>301
> mallocの引数はこのまま10です。
10じゃマズいじゃん。チャンチャン

305 :303:2008/09/02(火) 22:48:21
遅かったか orz

306 :291:2008/09/02(火) 22:49:11
>>300
コンパイラはBorland C++ Compiler 5.5でwindows XP・・・
浅学で必要そうな情報がいまいちつかめてませんが、
あとはどのような情報が必要なのでしょうか。すいません。

307 :デフォルトの名無しさん:2008/09/02(火) 22:50:07
>>306
対象ターゲットは?

308 :デフォルトの名無しさん:2008/09/02(火) 22:50:10
10万の配列を扱うのにsizeof(int)*10にした根拠は?

309 :303:2008/09/02(火) 22:51:06
>>306
(int *)malloc(sizeof(int)*100000); // 使う領域のサイズを確保する;

310 :291:2008/09/02(火) 22:52:43
>>307
すいません、ちょっといまわかりません。
でも*10を 10000にしたら14万行まで進めました!
解決したみたいです・・・!

>>308
>>304
変えてみたらできました・・・ほんとありがとうございます!

311 :291:2008/09/02(火) 22:54:05
初めて書き込んだのですが、
こんなにも素早く対応していただけて嬉しいです。
もっと上達したらここでアドバイスできるくらいになります!
本当にありがとうございました!

312 :デフォルトの名無しさん:2008/09/02(火) 22:56:05
要するに、細かくmallocすると1回1回のmallocで取った領域は実はintx10以上で
メモリを食いつぶしてたってこと?

313 :デフォルトの名無しさん:2008/09/02(火) 22:56:21
なかなか素直でよろしい>>291
がんばって勉強してください。

314 :デフォルトの名無しさん:2008/09/02(火) 22:56:58
>>310
*10000なのに、14万まで進んだらまずくね?

315 :デフォルトの名無しさん:2008/09/02(火) 22:58:42
すごい行き当たりばったりプログラミング。

>>310
>でも*10を 10000にしたら14万行まで進めました!
使う分malloc()してください。

316 :デフォルトの名無しさん:2008/09/02(火) 22:58:44
>>312
書いている内容を素直に受け取る限りは
int *x;
x=malloc(sizeof(int)*10);
x[13000]=1234; // 落ちた!何で?

317 :デフォルトの名無しさん:2008/09/02(火) 22:59:01
>>314
俺は>>291のソースはすでにかなりいじる前のだと思ってたけど
>>291これが最終ソースだったのか?

318 :デフォルトの名無しさん:2008/09/02(火) 23:00:06
>>316
それはこえーな
メモリのこと理解してねーじゃん


319 :291:2008/09/02(火) 23:00:53
>>314
申し訳ないです。
いまやり直したら4万6000だったですが、大丈夫でしょうか。

320 :291:2008/09/02(火) 23:02:06
>>317
これからどんどんいじっていく予定です。
とりあえず10万行以上の処理ができるかテストしたら
止まってしまってたので四苦八苦してました。

321 :デフォルトの名無しさん:2008/09/02(火) 23:02:51
Linuxで、時刻を変更するプログラムは作れますか?

322 :デフォルトの名無しさん:2008/09/02(火) 23:03:19
malloc(sizeof(int)*10);

の()の中が何をやってるかどういう意味か理解してからでないとあぶねーな。


323 :291:2008/09/02(火) 23:04:16
>>322
配慮ありがとうございます。
ちゃんともう一度読み直して使用します。


324 :デフォルトの名無しさん:2008/09/02(火) 23:04:56
>>321
root もしくは実行ファイルに sid があれば可能
一般ユーザ権限では変更できない

325 :デフォルトの名無しさん:2008/09/02(火) 23:09:23
>>321
作れるよ。なんらかのシステムコールを使うんだ。settimeだったかな?

326 :デフォルトの名無しさん:2008/09/02(火) 23:18:39
>>324
ひゃっほー suid だったぜ

327 :デフォルトの名無しさん:2008/09/02(火) 23:24:14
まず何行読んだのか数える変数を用意するんだ

328 :デフォルトの名無しさん:2008/09/02(火) 23:24:59
じゃない、何行読んだのかをチェックするんだ

329 : :2008/09/02(火) 23:39:06
小文字→大文字、大文字→小文字変換のプログラムなのだが・・・
正常終了しないので助けて下さい。
ソースです。
#include <stdio.h>
void main(void)
{
int i,j;
char a[30];

printf("文字入力:");
j=getchar();
for(i=0;j!=EOF;i++){
if('A'<=j && j<='Z'){
j = j - ('A'-'a');
putchar(j);
}else{
if('a'<=j && j<='z'){
j = j - ('a'-'A');
putchar(j);
}else{
putchar(j);
}
}
j=getchar();
}
}

330 :デフォルトの名無しさん:2008/09/02(火) 23:42:41
>>329
EOFを入力すればおk
Windows環境ならCtrl+Z
Unix系環境ならCtrl+D

331 :デフォルトの名無しさん:2008/09/02(火) 23:47:08
ていうかiとかaとかはなんなんだよ

332 :デフォルトの名無しさん:2008/09/02(火) 23:48:56
>>329
main()はintを返す。void main()は間違い。
大文字と小文字の変換はctype.hをincludeしてtolower()とtoupper()を使うべし。

333 : :2008/09/02(火) 23:55:49
>>330

Ctrl+Zを押さなくても終了するようにできますか?

334 :デフォルトの名無しさん:2008/09/03(水) 00:17:31
>>333
for文の条件を!=EOFにしてるんだから、EOF入力しなきゃ終わらんだろ。

335 :デフォルトの名無しさん:2008/09/03(水) 00:21:44
>>333
'\n'を終了条件にすれば?

336 :デフォルトの名無しさん:2008/09/03(水) 03:00:32
×EOF入力
○^zや^dの押下で標準入力をクローズ

337 :デフォルトの名無しさん:2008/09/03(水) 03:28:46
#include<stdio.h>
int main(void)
{ char ch;
while(1)
{ printf("終了しますか? Y/N\n");
ch = getchar();
switch(ch){
case 'Y':
case 'y':
printf("終了します\n");
break;
case 'N':
case 'n':
printf("処理を続行します\n");
break;
default:
printf("正しく入力してください\n");
}

if(ch='Y','y')break;
}
}

Yを入力されない限り、終了しますか? Y/Nを毎回ループさせたいんですが、ちゃんとなってくれません・・・。

338 :デフォルトの名無しさん:2008/09/03(水) 03:39:09
> if(ch='Y','y')break;
これの意味説明してみろ

339 :337:2008/09/03(水) 03:40:17
while文の無限ループをbreakで抜けたいと思いまして

340 :デフォルトの名無しさん:2008/09/03(水) 03:42:11
つーかコンパイルできないだろ。正しくは↓。
if (ch == 'Y' || ch == 'y')

341 :デフォルトの名無しさん:2008/09/03(水) 03:42:57
if使うならswitch使う意味無いじゃん

342 :337:2008/09/03(水) 03:47:32
レスありがとうございます。
>>340
それでいけました。 前のソースコードでもコンパイルはされました(visualC++2008)
カンマ演算子の使い方がイマイチわかってなかったです。ありがとうございます。

>>341
if文だけで作り直してみます。

343 :デフォルトの名無しさん:2008/09/03(水) 03:51:39
プログラム自体を終了する気ならば

switch(ch){
case 'Y':
case 'y':
printf("終了します\n");
break;
↑をbreakじゃなくてreturnなりexitなりを使えば良いと思う

344 :デフォルトの名無しさん:2008/09/03(水) 03:52:58
>>340
意図した通りかどうかは兎も角、正しくコンパイルできるね。
君にはどういう風に解釈されるのかを考えてもらおうか。

345 :337:2008/09/03(水) 04:01:24
レスありがとうございます。
とりあえずif文だけを使って>>340さんと同じような意味のコードを書いてみました。
が、Nや何も入力しないと、DOS窓上で
処理を続行します
ただしく入力してください
終了しますか?Y/N
のように2重になってしまいます・・・。うーん難しい。
#include<stdio.h>
int main(void)
{
char ch;
while(1)
{
printf("終了しますか?Y/N\n");
ch=getchar();
if(ch=='Y'||ch=='y')break;
else if(ch=='N'||ch=='n'){
printf("処理を続行します\n");
}
else
printf("正しく入力してください\n");
}
}



346 :340:2008/09/03(水) 04:01:31
>>344
ch='Y'で代入されて戻り値は破棄される。次の'y'がifの条件文となる。
つまりif('y')と同義で、常に真となる。

…はずなんだが、それだと常にループ抜けるな。あってる?

347 :デフォルトの名無しさん:2008/09/03(水) 04:04:09
>>346
あってる。

>>345
getchar()で喰い残した改行文字が次のgetchar()で喰われている。
再入力前に、食い潰しておけば大丈夫。

348 :デフォルトの名無しさん:2008/09/03(水) 04:50:49
>>346
とりあえずおまえは回答者になる資格ぜんぜんなし。黙ってろ。

349 :デフォルトの名無しさん:2008/09/03(水) 13:24:57
↑回答すら出来ないゴミに言われたかないね


350 :デフォルトの名無しさん:2008/09/03(水) 13:34:02
>if(ch='Y','y')break;
がコンパイルできない、などという嘘を垂れ流す方がよっぽどゴミな訳だが

351 :デフォルトの名無しさん:2008/09/03(水) 13:49:34
ゴミ同士仲良くすれば


352 :デフォルトの名無しさん:2008/09/03(水) 14:04:52
↓の変数のスコープを絞るためだけの{}って標準なの?もっといい方法はない?

#include <stdio.h>
int main(void){
int x;
x = 100;
printf("%d\n", x);

{
int y;
y = x;
printf("%d\n", y);
}

return 0;
}

353 :デフォルトの名無しさん:2008/09/03(水) 14:18:59
ない

354 :デフォルトの名無しさん:2008/09/03(水) 14:19:48
>>353
とりあえずそこだけ関数化して呼ぶとか?


355 :デフォルトの名無しさん:2008/09/03(水) 14:40:01
>>352
C++使う


356 :デフォルトの名無しさん:2008/09/03(水) 14:46:59
意味不明

357 :デフォルトの名無しさん:2008/09/03(水) 14:56:37
πってプログラムでいうとM_PIであらわせるけど
cosの中だったら180で計算すべきなのかな?

358 :デフォルトの名無しさん:2008/09/03(水) 14:57:24
cos sinはラジアンで渡すだろ。
その手前は自分の好きなように

359 :デフォルトの名無しさん:2008/09/03(水) 15:31:20
>>352
スコープを絞るというより、そこで変数を宣言したいからと言ったほうが近いように感じる。

360 :741:2008/09/03(水) 16:51:07
久しぶりです
>>329のj = j - ('A'-'a'); ってどういう意味ですか?

全く理解できないんですが j+=('A'-'a');とやってもおかしく表示されたんですが
j = j - ('A'-'a'); の意味を教えてくださいお願いします


361 :デフォルトの名無しさん:2008/09/03(水) 16:52:46
j -= 'A' - 'a'


362 :デフォルトの名無しさん:2008/09/03(水) 16:52:51
>>360
大文字を小文字に変換してる
文字コードでぐぐればわかるんじゃね?

363 :741:2008/09/03(水) 16:53:27
そうそれでした
j-='A'-'a'なんですが
Aからaをひくいみがわからないんですが。
詳しく説明お願いします

364 :デフォルトの名無しさん:2008/09/03(水) 16:54:43
( 'A') ('a' )

365 :デフォルトの名無しさん:2008/09/03(水) 16:56:05
( 'A') ( '-' ) ('a' )

366 :デフォルトの名無しさん:2008/09/03(水) 16:56:19
>>363
Aのアスキーコード
aのアスキーコード
引くと?

367 :デフォルトの名無しさん:2008/09/03(水) 16:57:36
'A'の文字コードは 0x41
'a'の文字コードは 0x61
差は0x20('A' - 'a' なら マイナスだが)
例えば、jの内容が0x4a('J')なら-0x20を引く(=0x20を足す)と0x6a == 'j'になる

368 :デフォルトの名無しさん:2008/09/03(水) 16:57:54
>>363
まずここを眺める
http://ja.wikipedia.org/wiki/ASCII

表より、'A' は 65、'a' は 97 だから 'A' - 'a' は 65 - 97 で -32
つまり j -= -32; ということ

369 :デフォルトの名無しさん:2008/09/03(水) 17:00:47
'A' - ('A' - 'a') = 'a'
'B' - ('A' - 'a') = 1 + 'A' - ('A' - 'a') = 1 + 'a' = 'b'
・・・

370 :デフォルトの名無しさん:2008/09/03(水) 17:01:31
ここで、じゃあ -32と書けばいいのでは、、という質問がくる?

371 :デフォルトの名無しさん:2008/09/03(水) 17:01:49
A〜Z まで 順に連続したアスキーコード だとする
同様に a〜z まで 順に連続したアスキーコード だとする

j にはアスキーコードが入っている
事前の if で A〜Z 内だと限定できる状況

j - 'A' は Aから数えて何文字目となる

j - 'A' + 'a' で Aから数えて何文字目 + aのアスキーコード
  → jのアスキーコードから対応する小文字化されたアスキーコードが手に入った

372 :デフォルトの名無しさん:2008/09/03(水) 17:03:01
>>370
それは意味をわかって書くならいいが、ここで解説してなんとなくで
そのままだといずれハマるな。
特に文字関連の処理をする場合

373 :デフォルトの名無しさん:2008/09/03(水) 17:05:14
コードが連続してない場合を考えてないので50点

374 :デフォルトの名無しさん:2008/09/03(水) 17:05:30
>>370
-32なんていうマジックナンバーをコード中に埋め込んではだめです、じゃだめかな

375 :741:2008/09/03(水) 17:07:32
329のでint jなんですが
jにaといれたら 97となるわけですが aAといれたら 97+65=162になるんでしょうか?
それと329のchar a[30];は使ってない気がするんですが
char a[30];はどこで使われてるんでしょうか?


376 :デフォルトの名無しさん:2008/09/03(水) 17:08:25
すみません、質問ですが、

struct{
UCHAR a;
UCHAR b[2];
UCHAR c;
}KOU;

main(){
KOU kouzou

func_A(kouzou->b);//適当な関数
}

int func_A(UCHAR bb[2]){
・・・
}

という構造体メンバの変数bからbbへ
渡しているんですが、sizeof(bb) = 2となりませんでした。
添え字を2で宣言しているのにどうしてサイズが変わるのでしょうか?
どなたか御回答お願いしますm(__)m




377 :376:2008/09/03(水) 17:10:28
ちなみにC++ builder5を使っています。
失礼しました。

378 :デフォルトの名無しさん:2008/09/03(水) 17:11:22
>>376
関数の仮引数の配列の添え字を1000にしても sizeof(CHAR*) と同じ数値になる
なぜなら、そう決まっているから

379 :376:2008/09/03(水) 17:14:17
>>378
わかりました!どうもありがとうございますm(__)m

380 :デフォルトの名無しさん:2008/09/03(水) 17:14:21
>>375
getcharは1文字入力する関数だから2文字同時には入力されない
1文字ずつしか入らない

使ってない変数が宣言してあっても死にはしない
単に無駄なだけ
気にしないで放っておけばいい

381 :デフォルトの名無しさん:2008/09/03(水) 17:14:30
>>376
int func_A(UCHAR bb[2])
これ配列を受けてない。

意味的には
 int func_A(UCHAR* bb)
と同じでポインタを受けてる。 だから sizeof(bb) はポインタのサイズ (4 とか 8 とか)

-----------
あえて 配列をスタックに積みきる宣言だと
int func_A((UCHAR bb)[2]);
# で良いんだっけ?

382 :デフォルトの名無しさん:2008/09/03(水) 17:26:21
>>381
違う
構造体につめて渡す以外のどんなことをやっても配列をスタックに積むことはできない

383 :デフォルトの名無しさん:2008/09/03(水) 17:29:12
>>380
使ってない変数があっても気にしないで放っておけだって?
おまえ教える資格ないから。
なんちゃってプログラマは黙ってろよ。


384 :741:2008/09/03(水) 17:29:38
>>380
ああああああ そういう意味ですか
getcharは1文字で aAって入力されたら a=97,A=65って別々に代入してるかんじですよね?
それをforで連続して a-32=A A-32=a ってputcharで出力してるんですね?
文字コードをみたら大文字と小文字は-32の誤差があるってことがわかりました

'a'-'A'ってなんかわかりずらいですね -32にすればいいんですが。

385 :デフォルトの名無しさん:2008/09/03(水) 17:31:45
そんな無理に期待にこたえてくれなくてもwwwwww

386 :デフォルトの名無しさん:2008/09/03(水) 17:32:59
>>384
アスキーコードを使うことが前提なら32を使っても構わない(連続性自体が文字コード依存だから)

387 :デフォルトの名無しさん:2008/09/03(水) 17:34:16
その言い方だと'a'-'A'ならアスキーコードじゃなくても通じるみたいに聞こえちゃうだろ

388 :381:2008/09/03(水) 17:34:55
>>382
ありがとん

389 :デフォルトの名無しさん:2008/09/03(水) 17:34:55
'a'-32='A'だが'A'-32='a'はおかしい

390 :デフォルトの名無しさん:2008/09/03(水) 17:35:02
>>384
'a'や'A'が実際には数だって事を理解していれば
いちいちコードを調べずに済むからわかりやすいよ

391 :デフォルトの名無しさん:2008/09/03(水) 17:35:47
>>384
j = j - ('A'-'a');
これはどっちかといえば
j = (j - 'A') + 'a';
と考えたほうがいい

392 :デフォルトの名無しさん:2008/09/03(水) 17:36:43
>387
通じる可能性はあるから間違ってはいない

393 :デフォルトの名無しさん:2008/09/03(水) 17:37:06
なんでtoupper(), tolower()を使わないで車輪の再発明しようとしてるの?馬鹿なの?

394 :デフォルトの名無しさん:2008/09/03(水) 17:40:03
課題なんじゃね?
toupperやtolowerを使ってはいけないという条件付きの

395 :デフォルトの名無しさん:2008/09/03(水) 17:40:54
>384
念のために言っておけば、本当に移植性の高いコードは、
(toupper()やtolower()やisalpha()を使わないなら)switchを使ってベタっと記述するものになる

switch(c){
 case 'a': c='A'; break;
 case 'b': c='B'; break;
  :
  :
 case 'z': c='Z'; break;
 case 'A': c='a'; break;
 case 'B': c='b'; break;
  :
  :


396 :デフォルトの名無しさん:2008/09/03(水) 17:40:55
簡単な話題だとスレが伸びるねぇ

397 :デフォルトの名無しさん:2008/09/03(水) 17:41:40
いや、人のコードを見た上での疑問だろう。

398 :デフォルトの名無しさん:2008/09/03(水) 17:43:24
>>395
テーブル使う方法もあるよ!
結果的には同じようなものになるかもしれないけど。

399 :デフォルトの名無しさん:2008/09/03(水) 18:06:34
A〜Z 内にあるかの判定が 不連続だとめんどうってだけで

変換部に関しては
不連続でも 'A' を基準に B〜Z のオフセットの値と
'a' を基準に b〜z のオフセットの値とが一致していればよくね?

400 :デフォルトの名無しさん:2008/09/03(水) 18:09:35
EBCDICでも使える

401 :741:2008/09/03(水) 18:14:10
いま思えば 'b'-'B'でもどっちにしろ32の差があるから-32でよかったんですね!



402 :デフォルトの名無しさん:2008/09/03(水) 18:48:33
32の差がある文字コード体系限定ならね

403 :デフォルトの名無しさん:2008/09/03(水) 19:31:11
Cで継承を実現するにはどうしたらいいですか。

404 :デフォルトの名無しさん:2008/09/03(水) 19:33:08
できるわけがない

405 :デフォルトの名無しさん:2008/09/03(水) 19:35:21
>>403
君の言っている継承が具体的にどのようなもので、実現というのが具体的に何を指すのかわからないが、たぶん無理

406 :デフォルトの名無しさん:2008/09/03(水) 20:01:37
http://codezine.jp/article/detail/885?p=1
↑こういう感じの「Cでオブジェクト指向プログラミングをする方法」みたいなのを書く人って定期的に現れるけど、
すなおにC++使ったほうがいいな。

407 :デフォルトの名無しさん:2008/09/03(水) 20:06:54
多態性は関数ポインタの配列で実現できることが分かったんで継承もできるのかなと。

408 :デフォルトの名無しさん:2008/09/03(水) 20:07:39
そりゃやろうと思えばできるよ。

409 :デフォルトの名無しさん:2008/09/03(水) 20:12:40
>>406
C++が出る前からオブジェクト指向プログラミングはある
言語でサポートしている範囲が違うだけ

Cでないといけない場合もあるだろうから、そういう記事はあったほうがいい
自分に今必要ないからといって、世の中に必要ないわけではないんだから

410 :デフォルトの名無しさん:2008/09/03(水) 20:24:49
変に技巧に走ってもいいことないよ。
素直にC++使えばいい。
Cしか使えないなら、Cらしいコードを書けばいいよ。

411 :デフォルトの名無しさん:2008/09/03(水) 20:31:40
>>410
>>406 の記事程度を変な技巧に走っているというなら
C++ で boost を使うのも変な技巧に走っているといえる

Cでオブジェクト指向プログラミングは
実際大した事ではないし、目くじら立てるほどの物でもない

412 :デフォルトの名無しさん:2008/09/03(水) 20:32:58
つうか意識しないでも使っちゃうよね

413 :デフォルトの名無しさん:2008/09/03(水) 20:43:41
>>411
boostは中身を意識しないで使えるから複雑でもいいよ。
>>406 の記事も、抽象型はいいけど、継承とか、無理やり感があって、筋悪だろ。


414 :デフォルトの名無しさん:2008/09/03(水) 20:45:40
>>413
中身を意識しないで使えるようにする方法だよ
class 書くのと変わらない

415 :デフォルトの名無しさん:2008/09/03(水) 21:07:43
>>414
中身を書く人向けでしょ。>>406の類の技法って。

C++でclassを書くのは、Cで無理やり継承やら多態やらをやるような技法とはぜんぜん違う。

416 :デフォルトの名無しさん:2008/09/03(水) 21:11:50
>>415
少なくとも >>406 の記事には継承も多態も関係ない

417 :デフォルトの名無しさん:2008/09/03(水) 21:22:09
何かと思って読んでみたけど>>406のような書き方って大昔からあるじゃん。
いまさらぐちゃぐちゃ言うようなものでない

418 :デフォルトの名無しさん:2008/09/03(水) 21:25:24
>>416
おまえ一ページ目しか読んでないだろ。

419 :デフォルトの名無しさん:2008/09/03(水) 21:27:20
登録とか面土井じゃん

420 :デフォルトの名無しさん:2008/09/03(水) 21:28:32
>>417
抽象データ型みたいのは、標準ライブラリにも入ってるしな。
「Cで継承、多態」みたいのも昔から、言ってるやつはいるけど、ぜんぜん使われてない。
言ってる本人でさえ、本当に使ってるのかよって思うよ。

421 :デフォルトの名無しさん:2008/09/03(水) 21:47:11
>>418
スマン、3ページ目読んでない

422 :デフォルトの名無しさん:2008/09/03(水) 21:49:41
GTK+-2.0はそうなってるよ。
昔からあるし、レアだけど使われてる場合もある。

423 :デフォルトの名無しさん:2008/09/03(水) 21:57:23
> 「Cで継承、多態」みたいのも昔から、言ってるやつはいるけど、ぜんぜん使われてない。

30年前から某有名どころでやってるのを知らない奴がまさかいるとはな

424 :デフォルトの名無しさん:2008/09/03(水) 22:43:24
>>422
ああ、GTKがあったね。
でもそれだって、抽象型とコールバック関数のイベントドリブンってイメージだけど。
(よく知らんけど)

とにかく、>>406 とか ↓これみたいのとか、よくあるCで無理やり系のテクニックって、まじで使ってんのかよって感じ。
http://www.sage-p.com/process/cool.htm#6-2


425 :デフォルトの名無しさん:2008/09/03(水) 23:15:21
IPを変えるのってどうやればいいか教えてください!!

426 :デフォルトの名無しさん:2008/09/03(水) 23:19:03
使っているOSによる

427 :デフォルトの名無しさん:2008/09/03(水) 23:21:32
Vistaでおま

428 :デフォルトの名無しさん:2008/09/03(水) 23:27:43
社内LANのIP?

429 :デフォルトの名無しさん:2008/09/03(水) 23:30:35
APIスレで聞け

430 :デフォルトの名無しさん:2008/09/03(水) 23:33:07
いや、自宅だよ
APIにいくわ。ホントはC#が一番知りたかったんだけどね


431 :デフォルトの名無しさん:2008/09/03(水) 23:35:52
自宅PCがアク禁を食らっちまって、なんとかIPを変えたいとかいうオチじゃないだろな。
もし、そうだとするならプロバイダーを変えなきゃだめだよ。

432 :デフォルトの名無しさん:2008/09/03(水) 23:44:19
最萌でIDでもかぶったんじゃない?

433 :デフォルトの名無しさん:2008/09/03(水) 23:46:38
いや、なんかプログラム中でずっとエラーになる時があるんだよね
多分他に原因があるんだとは思うんだけど、IP変えたりしたら繋がる時ってあるじゃん
今後も必要だろうからまずはそのやり方で挑戦してみようと思ったわけです

434 :デフォルトの名無しさん:2008/09/03(水) 23:48:34
まずイーサネットから勉強するんだ

435 :741:2008/09/03(水) 23:55:21
>>329
これをポインタに直してみました
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *j;
int i;
j=(char *)malloc(sizeof(char)*100);
gets(j);

for(i=0; *(j+i); i++){
*(j+i)-=32;
}
puts(j);

return 0;
}


436 :デフォルトの名無しさん:2008/09/03(水) 23:56:36
つか、LANに組み込まれていなければIPは設定されていないだろ
自宅でLANを構築しているというなら話は別だが

XPならコントロールパネル/ネットワーク接続/ローカルエリア接続/プロパティ

437 :デフォルトの名無しさん:2008/09/03(水) 23:57:32
天才あらわる

438 :デフォルトの名無しさん:2008/09/03(水) 23:59:28
>>435
意味ないだろ。

439 :デフォルトの名無しさん:2008/09/03(水) 23:59:48
>>435
全然違うじゃねーか!

440 :741:2008/09/04(木) 00:00:05
これポインタに直してみたんですが
自分でもうまくいって満足です
ですがただ小文字を大文字にしか変換できないので、大文字を小文字にするには+=32なんですが
他の繰り返して入力するのをくめなくて>>329をポインタでやる方法誰か教えてください

441 :デフォルトの名無しさん:2008/09/04(木) 00:02:28
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *j;
int i;
j=(char *)malloc(sizeof(char)*100);
gets(j);

for(i=0; *(j+i); i++){
*(j+i)-=32;
*(j+i)+=32;
}
puts(j);

return 0;
}

442 :デフォルトの名無しさん:2008/09/04(木) 00:03:51
問題発見能力がどうたらこうたら

443 :デフォルトの名無しさん:2008/09/04(木) 00:04:45
>>440
forの中身を
if (j[i] >= 'A' && j[i] <= 'Z") {
j[i] += 'a' - 'A';
} else if (j[i] >= 'a' && j[i] <= 'z') {
j[i] += 'A' - 'a';
}
に換えるんだ。

444 :デフォルトの名無しさん:2008/09/04(木) 00:10:27
>>440
うまくいってないってヴぁ

445 :デフォルトの名無しさん:2008/09/04(木) 01:56:08
^=32

446 :デフォルトの名無しさん:2008/09/04(木) 03:07:35
質問させてください。
明解C言語 入門編という本にある直角三角形を表示する問題です。

#include <stdio.h>

int main(void)
{
int i, j, ln;

printf("何段ですか:");
scanf("%d", &ln);

for ( i = ln ; i > 0 ; i-- ){
for (j = i ; j > 0 ; j-- )
putchar('*');
putchar('\n');
}

return(0);
}

何度やってもコンパイルできないのですが、どこが原因なのか全くわかりません。
ご教示いただけますようお願いします。

447 :デフォルトの名無しさん:2008/09/04(木) 03:15:56
>>446
何を以ってコンパイルできないと判断したの?
その根拠を提示して欲しいな。

448 :デフォルトの名無しさん:2008/09/04(木) 03:29:10
この板ID表示したらおもしろいことになりそうだな。

449 :デフォルトの名無しさん:2008/09/04(木) 07:42:11
>>446
プログラムにはまったく問題ない
原因はお前の頭

450 :デフォルトの名無しさん:2008/09/04(木) 09:34:53
単継承 テンプレート無し C++ → C のトランスレータが欲しい
と思ったことはあった

ターゲットの開発環境には Cコンパイラしかなかった ってだけの話で

451 :デフォルトの名無しさん:2008/09/04(木) 09:39:15
昔はあったろ。いまはどこにあるのか知らんが

452 :446:2008/09/04(木) 09:54:35
自己解決いたしました。

ファイル名を変えたら何の問題もなくコンパイルできました。
お騒がせして申し訳ありませんでした。

453 :デフォルトの名無しさん:2008/09/04(木) 11:35:24
>>357
>πってプログラムでいうとM_PIであらわせる
かどうかは解らない。

454 :デフォルトの名無しさん:2008/09/04(木) 11:39:25
M_PIってマクロ名は本当に標準な環境では準備されてないはずなんだっけ?

455 :デフォルトの名無しさん:2008/09/04(木) 12:06:02
呆れられそうな質問なんですが、ポインタを使うメリットって何ですか?

456 :デフォルトの名無しさん:2008/09/04(木) 12:06:43
いろいろ
というかCからポインタ−とったらBASIC程度のアプリしかできない悪寒

457 :デフォルトの名無しさん:2008/09/04(木) 12:19:14
よその言語が持っているあれもないこれもなくて、
全部ポインタで済ませるというのがC。

458 :デフォルトの名無しさん:2008/09/04(木) 12:23:10
>>457
というか元はアセンブラの延長なんで何もないのが基本でしょ。
それによそのあれこれってのが実はC->C++と進化する過程で
ごてごてくっついただけじゃん。

459 :デフォルトの名無しさん:2008/09/04(木) 12:23:18
>>454
math.hで#ifで定義されてるからね

#if defined __USE_BSD || defined __USE_XOPEN
みたいな

460 :741:2008/09/04(木) 13:01:07
>>329
を配列で改造してみました
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char j[100];
int i;


do{
for(i=0; j[i]; i++){
if(j[i]>='a' && j[i]<='z')
j[i]-=32;
else if(j[i]>='A' && j[i]<='Z')
j[i]+=32;
}
puts(j);
}while(gets(j));
return 0;
}

461 :デフォルトの名無しさん:2008/09/04(木) 13:05:42
getsは使用禁止

462 :デフォルトの名無しさん:2008/09/04(木) 13:06:42
>>460
最初は
j[0]=='\0';
でないと

463 :デフォルトの名無しさん:2008/09/04(木) 13:13:26
いつまでこんなカスみたいなプログラムいじり続けてんだよ

464 :741:2008/09/04(木) 13:24:43
getsは何故禁止なんでしょう?
>>462
j[i]!='\0';じゃないんですか? j[i];とも書きますが。
j[0]=='\0';だとiが繰り上がっていかないのでNULL字までいかずに代入できませんi-=32;のように

465 :デフォルトの名無しさん:2008/09/04(木) 13:34:17
いや、そう書けって話じゃなくて、i[0]が'\0'じゃないとぶっ飛ぶぞって話だ。
つーか、>460で警告が出ないコンパイラの使い方してるの?
警告くらい出るようにしようや。

466 :デフォルトの名無しさん:2008/09/04(木) 13:42:33
まってくれ旦那、そいつは罠だ。触ってはいけねーぜ

467 :デフォルトの名無しさん:2008/09/04(木) 13:50:16
>>464
>getsは何故禁止なんでしょう?
gets は、渡されたバッファのサイズなんか知る由もないので
'\n' が現れるまではどんなに長い行でも読もうとする。
→所謂、バッファオーバーラン発生。
(fgets だと、バッファの長さを渡すようになってる)
まあ勉強のための短いコードや作り捨てツールじゃ問題に
ならない事が多いけども、使わないよう癖づけといた方がいい。

468 :デフォルトの名無しさん:2008/09/04(木) 15:19:12
>>464
char j[100] = {0};
初期化が必要という話だ

469 :デフォルトの名無しさん:2008/09/04(木) 22:25:19
まあ、事故れる道具は使うなってこったwww

470 :デフォルトの名無しさん:2008/09/04(木) 23:14:30
mallocとかってたとえばwinだったら中でwin32APIとかつかってるの?

471 :デフォルトの名無しさん:2008/09/04(木) 23:16:09
ああ

472 :デフォルトの名無しさん:2008/09/04(木) 23:16:43
確か使ってるはず


473 :デフォルトの名無しさん:2008/09/04(木) 23:18:02
>>470
使ってないんじゃないの?
使ってるかもしれんけど、コールされるたびに毎回API呼ぶような実装にはなってないと思う。

474 :デフォルトの名無しさん:2008/09/04(木) 23:31:17
>>470
ヒープ領域の開始アドレスとサイズを取得することと、空
きエリアを管理するテーブルのリストを作ることでmalloc系
は実装されていると思う。

空きエリアの管理にはAPIは必要がない。ヒープ領域の開
始アドレスとサイズを取得するときにAPIを使っているかもしれない。


475 :デフォルトの名無しさん:2008/09/05(金) 00:31:27
>>473
最近のVC++だとmallocは単にHeapAllocを呼ぶようになっている。
やつらにとっちゃ、mallocもHeapAllocも自分んとこで実装するわけだし、
2つも作るのは無駄でしかないんだろう。

476 :デフォルトの名無しさん:2008/09/05(金) 03:15:35
lsのソースの中にある
__FBSDID("$FreeBSD: src/bin/ls/ls.c,v 1.86 2008/04/04 03:57:46 grog Exp $");
って何ですか?

477 :デフォルトの名無しさん:2008/09/05(金) 03:24:48
rcsかなんかのバージョン管理ツールで追加されたコードでしょ。

478 :477:2008/09/05(金) 03:33:35
間違えたかな?

479 :デフォルトの名無しさん:2008/09/05(金) 03:50:02
こんな感じでバージョンを確認するようですよ。

janney:/home/richard$ grep FBSDID /usr/src/sys/dev/pci/pci.c
__FBSDID("$FreeBSD: src/sys/dev/pci/pci.c,v 1.292.2.7 2006/01/31 14:42:43 imp Exp $");


480 :455:2008/09/05(金) 05:12:08
レスありがとうございます。
先輩も、処理が早くなるから基本的に全部ポインタで作ると言ってました。
ありがとうございます。

481 :デフォルトの名無しさん:2008/09/05(金) 05:16:59
そっか
なーんも理解してなかったか

482 :デフォルトの名無しさん:2008/09/05(金) 05:19:35
ポインターないとすげー柔軟性の無いプログラムになりそうなだな。
構造体リストとかでも可変の場合は最大で使いそうな数以上を
見越して確保した状態でコンパイルとか

483 :デフォルトの名無しさん:2008/09/05(金) 14:50:24
C言語体当たり学習って本はタメ口でむかつくな。

484 :デフォルトの名無しさん:2008/09/05(金) 14:51:30
金もらって教える立場なんだからせめてメイド口調にしてくれないとな

485 :デフォルトの名無しさん:2008/09/05(金) 14:53:43
C言語体当たり学習は落ちこぼれニートの20〜30代のにおいがするぜ。

486 :デフォルトの名無しさん:2008/09/06(土) 02:38:39
>>477
>>479

ありがとうございました。

487 :デフォルトの名無しさん:2008/09/06(土) 14:07:20
K&Cの問題の回答をまとめてるwikiとかってありますか?
回答集が売ってますがあまり評判がよくないようなので

488 :デフォルトの名無しさん:2008/09/06(土) 14:10:50
>>487
K&C って正式名称?

489 :デフォルトの名無しさん:2008/09/06(土) 14:14:04
プログラミング言語C 弟2版 ANSI規格準拠

あ、K&Rだった。リッチーさん・・・

490 :デフォルトの名無しさん:2008/09/06(土) 14:59:04
Cアンサー・ブック 第2版
The C Answer Book 2/e

ISBN4-320-02748-5  共立出版

原書:The C Answer Book(Prentice Hall)

C.L.Tondo, S.E.Gimpel 著

矢吹道郎 訳

A5  246頁  本体価格\2,300  1995/07発売

491 :デフォルトの名無しさん:2008/09/06(土) 15:44:50
単純な疑問なんですけど、
for文にはなんで i,j,kがよく使われるの?
アルファベットの半分からってわけでもないし

492 :デフォルトの名無しさん:2008/09/06(土) 15:46:53
BASICのころからそんな感じ

アセンブラの名残かな?

レジスタはよく
ABCDEくらいまで使ったりするので
FGHくらいをあけてIJKあたりがループ用によく使われてる

493 :デフォルトの名無しさん:2008/09/06(土) 15:47:44
昔々、FORTRANというプログラミング言語で、
名前がi, j k, ..., nで始まる変数は整数、ほかで始まる変数は実数と決まっていたことに由来する。

494 :デフォルトの名無しさん:2008/09/06(土) 15:48:08
FORTRANの暗黙の型宣言じゃないの

495 :デフォルトの名無しさん:2008/09/06(土) 15:50:20
i がインクリメントの略だから
ポインタに p,q が用いられるのと同じ

496 :デフォルトの名無しさん:2008/09/06(土) 15:51:14
Fortran説が正しい。

497 :デフォルトの名無しさん:2008/09/06(土) 15:51:17
iteratorだからiつかって、足りなくなったから続けてj,kってしたんじゃね?真実はどか知らんけど

498 :デフォルトの名無しさん:2008/09/06(土) 15:51:21
>>495
また嘘を

499 :デフォルトの名無しさん:2008/09/06(土) 15:52:38
もともとINTEGERのI
FORTRANが元なのは書いてあるとおり。

500 :デフォルトの名無しさん:2008/09/06(土) 15:53:17
まあそんな感じだよね

マシン語のレジスタも
Aがアキュムレーター
Bがベース
とかなんか無理やり付いてるしwww

501 :デフォルトの名無しさん:2008/09/06(土) 15:54:41
FORTRANはfor文じゃなくてDO文だけどね。

502 :デフォルトの名無しさん:2008/09/06(土) 16:05:39
どっちにしろ昔の命名ルールはなんか省略して記号にするのが多いよね。
やっぱメインフレームとかで1行80文字以下みたいなのがあったのが原因?

503 :デフォルトの名無しさん:2008/09/06(土) 16:11:13
まあ、今となってはちゃんと意味の有る命名しようと思う。
自分も適当になると、iとかjk、使いまくり。

504 :デフォルトの名無しさん:2008/09/06(土) 16:11:59
ソースの見通しがいいからだよ。
ハンガリアンなぞMSでも否定されとる

505 :デフォルトの名無しさん:2008/09/06(土) 16:12:26
FORTRANのINTEGERなのはそうだけどさ…
元々は数学の慣例じゃないの?


506 :デフォルトの名無しさん:2008/09/06(土) 16:14:12
>>503
別にループカウンタはiとかjでもいいよ。

507 :デフォルトの名無しさん:2008/09/06(土) 16:15:29
>>502
そうだな。
そもそもスクリーンじゃなかったしな。

508 :デフォルトの名無しさん:2008/09/06(土) 16:17:44
>>506
そだな。
ループ部分はあんまり関係ないしな。
ただ、これが許されるのはへんなソース書かない奴だけにして欲しいww
ループの中がやったら長いとかそういう場合は簡便w


509 :デフォルトの名無しさん:2008/09/06(土) 16:19:39
いやむしろループのカウンタには積極的に使って欲しいがなあ。
これ以外の用途で使うのは簡便

510 :デフォルトの名無しさん:2008/09/06(土) 16:23:13
やっぱ簡単な話題だとスレが伸びるねぇ

511 :デフォルトの名無しさん:2008/09/06(土) 16:26:49
難しい話題の方が答えられる人少ないに決まってるだろ?バカなの?

512 :デフォルトの名無しさん:2008/09/06(土) 16:27:55
何のカウンターなのかそこに命名で意味を持たせるのは、
別に悪いことじゃないと思う。

>>510
全てに於いて、基本は大事よ?

513 :デフォルトの名無しさん:2008/09/06(土) 16:28:34
難しい話題で見当違いの回答つけてスレ伸ばすのだけは勘弁

514 :デフォルトの名無しさん:2008/09/06(土) 16:34:05
nからmまでの合計の和みたいな計算ってどうやるんでしょうか

515 :デフォルトの名無しさん:2008/09/06(土) 16:41:48
>>514

int sumBody(int n, int m, int sum)
{
if (n > m) return sum;
return sumBody(n + 1, m, sum + n);
}

int sum(int n, int m)
{
return sumBody(n, m, 0);
}

main()
{
int n = sum(10, 20);
printf("%d\n", n);
}


516 :デフォルトの名無しさん:2008/09/06(土) 16:43:01
>>514
日本語でおk


517 :デフォルトの名無しさん:2008/09/06(土) 17:00:00
このスレ見ててよく思うけど質問のレベルで技量を察してやれよ
再帰なんか分からないだろう

>>514
もっと具体的に

518 :デフォルトの名無しさん:2008/09/06(土) 17:02:20
具体的というより厳密に

519 :デフォルトの名無しさん:2008/09/06(土) 17:04:11
ヒープとスタックってどないちがうん?

520 :デフォルトの名無しさん:2008/09/06(土) 17:04:43
ぜんぜん違う


521 :デフォルトの名無しさん:2008/09/06(土) 17:06:27
>>514
エスパーでこんなところか?

int getGoukei() {
int goukei = 0;
int i;
for (i = n; i <= m; i++) {
goukei += i;
}
return goukei;
}

522 :デフォルトの名無しさん:2008/09/06(土) 17:15:09
>>521
int getGoukei(int n, int m) {

にしてやらないとな。

523 :491:2008/09/06(土) 18:37:52
>>492-509

皆さん博識っぷりにはびっくりたまげたもんざえもんです

524 :デフォルトの名無しさん:2008/09/06(土) 18:40:37
>>514
(m + n) * (m - n + 1) / 2;


525 :デフォルトの名無しさん:2008/09/06(土) 19:38:21
まぁ、IntegerかIteratorかは兎も角、Incrementだけはないわ。

526 :デフォルトの名無しさん:2008/09/06(土) 19:50:55
「nからmまでの」と書かれた場合、n<mが前提だと思うのは若干エスパーな希ガス

527 :デフォルトの名無しさん:2008/09/06(土) 19:55:28
大丈夫、普通の神経の持ち主ならわざわざ5から3なんて使い方はしない。

528 :514:2008/09/06(土) 20:44:51
説明不足ですみません、携帯から失礼します

例えば数字を2つ入力して1つめの数字から2つめの数字までの合計(例えば1から10の合計→55)
を出すような感じにしたいのですができる限り簡潔に書くにはどうすればよいのかと思い質問しました

529 :デフォルトの名無しさん:2008/09/06(土) 20:48:19
>>529
>524

530 :デフォルトの名無しさん:2008/09/06(土) 20:49:18
>>524
って何も考えないでみたら顔文字にみえるなw


531 :デフォルトの名無しさん:2008/09/06(土) 20:51:06
>>528
#include <stdio.h>
int main()
{
int m, n;
scanf("%d %d", &m, &n);
printf("%d\n", (m + n) * (n - m + 1) / 2);
return 0;
}
これで満足?

532 :デフォルトの名無しさん:2008/09/06(土) 21:23:56
それはないわ…

533 :デフォルトの名無しさん:2008/09/06(土) 21:31:21
このスレ、学生が定期的に課題丸投げにしてくるな
楽して単位とるなとはいわないけど、せめて宿題丸投げスレで聞けよ


534 :デフォルトの名無しさん:2008/09/06(土) 22:03:36
>>491
indexのi。ルーツは数学。iの次だからってj,kも使われる。

535 :デフォルトの名無しさん:2008/09/06(土) 22:28:36
いや、integerのiでしょ。

536 :デフォルトの名無しさん:2008/09/06(土) 22:29:52
>>534
>>535
不毛だからやめとけ

537 :デフォルトの名無しさん:2008/09/06(土) 22:32:45
不毛だな
旧世代のオッサンが考えたことだ。
理由を探すのも面倒。特に割りとあいまいに処理されるIT関連の擁護とかをみてると。

538 :デフォルトの名無しさん:2008/09/06(土) 22:44:04
不毛以前に今までのやり取りをぜんぜん見てないのが気になる

539 :デフォルトの名無しさん:2008/09/06(土) 22:45:26
不毛って、普段Cのプログラミングで変数iを使っていて
iがどんな意味何かを考えたことはないの?

それはそれで問題があるだろ。

540 :デフォルトの名無しさん:2008/09/06(土) 22:47:00
>>538
なるほど、同じような書き込みがあったね。スマン。

541 :537:2008/09/06(土) 22:52:44
>>539
すまん
ほかの低級言語でそういうごろあわせみたいな意味を持たせてるのは知ってるから
どうせなんか意味あるんだろうなて放置してる。

542 :デフォルトの名無しさん:2008/09/06(土) 22:57:59
問題です。a[2]を2[a]とするのは正しいでしょうか?

543 :デフォルトの名無しさん:2008/09/06(土) 22:58:56
いみがわかりません

544 :デフォルトの名無しさん:2008/09/06(土) 23:01:55
却下

545 :デフォルトの名無しさん:2008/09/06(土) 23:03:35
int a[3]と言う宣言に対してa[2]と書いても2[a]と書いても意味は同じ。
尤も、見た目の印象は壊滅的に違うが。

546 :デフォルトの名無しさん:2008/09/06(土) 23:10:52
a[2]=*(a+2)=*(2+a)=2[a]

547 :デフォルトの名無しさん:2008/09/06(土) 23:14:27
2[a]
これがかけるのは知らんかった

しかしこんな不細工な書き方OKなんだな>コンパイラ

548 :デフォルトの名無しさん:2008/09/06(土) 23:16:52
1[strchr("abc", 1["abc"])] = 'C'なんて書かれたら最早何がなんだかw

549 :デフォルトの名無しさん:2008/09/06(土) 23:17:19
そもそも[]がシンタックスシュガーだから

550 :デフォルトの名無しさん:2008/09/06(土) 23:19:04
>>547 []は演算子なんだよね

551 :547:2008/09/06(土) 23:24:37
>>550
なるほど
配列としてみると気持ち悪いが、ポインタとしてみればそんなもんか

552 :デフォルトの名無しさん:2008/09/06(土) 23:38:16
言わずもがなだが、配列名はポインタと同じくアドレス値をもつが、
ポインタが変数なのに対し、配列名は定数という違いがある。


553 :デフォルトの名無しさん:2008/09/07(日) 00:30:42
[]がシンタックスシュガーのわけないだろ。

554 :デフォルトの名無しさん:2008/09/07(日) 00:33:36
>>553
無知乙

555 :デフォルトの名無しさん:2008/09/07(日) 00:35:55
シンタックスシュガーって
a[1]
*(a+1)
が書き方は違うけど等価になるってことでしょ

どっちか片方だけを指して a[1] は糖衣構文だけど *(a+1) は違うとか言わないよね?

556 :デフォルトの名無しさん:2008/09/07(日) 00:39:39
>>555
シンタックスシュガーに対する認識が間違ってる。

557 :デフォルトの名無しさん:2008/09/07(日) 00:40:51
等価だけどそうじゃなくて
プログラマーに優しい別の書き方の事

558 :デフォルトの名無しさん:2008/09/07(日) 00:41:44
[ ] の方がプログラマーに優しいって事?

559 :デフォルトの名無しさん:2008/09/07(日) 00:42:40
->

560 :デフォルトの名無しさん:2008/09/07(日) 00:42:43
>>558
少なくともリッチーはそういう場合もあると考えたということなんだろう。

561 :デフォルトの名無しさん:2008/09/07(日) 00:44:18
同じことをするのに違う書き方ができたら全部シンタックスシュガーとか言っちゃうやつ多いな。

562 :デフォルトの名無しさん:2008/09/07(日) 00:46:53
ほんとに多いのか?
そんな奴俺だけで十分だろう

563 :デフォルトの名無しさん:2008/09/07(日) 00:48:46
wikipedia だと for は while のシンタックスシュガーだと書いてある
じゃあ while は if と goto のシンタックスシュガーになるのか?
気持ち悪いな

564 :デフォルトの名無しさん:2008/09/07(日) 00:51:03
>>563
そうだよ。

565 :デフォルトの名無しさん:2008/09/07(日) 00:51:04
まあ、大抵はタイプ数が少なくなるから
優しいという感じな気がする

566 :デフォルトの名無しさん:2008/09/07(日) 00:54:03
いきなりですけど・・・C言語とかエディタ上で使う数字は、つまり
表示される数字なんですけど、既に数値なのか、取りあえずテキスト
としての数字なのか、どっちなのでしょうか?

567 :デフォルトの名無しさん:2008/09/07(日) 00:55:00
後者

568 :デフォルトの名無しさん:2008/09/07(日) 00:55:17
>>566
テキストとしての数字です

569 :デフォルトの名無しさん:2008/09/07(日) 00:55:29
>>566
数字です。

570 :デフォルトの名無しさん:2008/09/07(日) 00:55:47
>>566
日本語でおk

571 :デフォルトの名無しさん:2008/09/07(日) 00:57:36
> は < のシンタックスシュガーなんだろうか

572 :デフォルトの名無しさん:2008/09/07(日) 00:57:42
>>564
それは機械語に置き換わるレベルの話だな

まあ配列がポインター云々も似たような話か

>>566
後者です。
コンパイルする段階で数字などに置き換わります。

573 :デフォルトの名無しさん:2008/09/07(日) 01:02:05
>>571
条件判定式の?
だったらアセンブラにあるよ。
ただ||や&&はない

574 :デフォルトの名無しさん:2008/09/07(日) 01:03:40
>>572
機械語に置き換わるっていうか、実行時にな。

ソースなんだからそりゃテキストだけど、意味的には数値だろ?
>>566が、どういう意図で質問したかで答えは変わるか。

575 :デフォルトの名無しさん:2008/09/07(日) 01:09:09
すいません。あまり深い意味はありませんが・・・
エディタで処理する以上テキストという認識でよいのでしょうか?
早速のご回答有難う御座います。少しかじってみたいのですが。

576 :デフォルトの名無しさん:2008/09/07(日) 01:10:38
>>575
自分で書いてるソースをバイナリーエディタで
見てみるとすっきりしますよ。
出てくるコードはアスキーコード表にのってますので

577 :デフォルトの名無しさん:2008/09/07(日) 01:17:43
ご丁寧に有難う御座います。バイナリーエディタ?
本当に初心者で何をそろえようかなというレベルです。

578 :デフォルトの名無しさん:2008/09/07(日) 01:21:30
糖衣構文というのが意味として分かりやすい方というのであれば、
状況によってどちらが糖衣構文になるかは変化すると考えてよい?
#include<stdio.h>

void swap_char(char *a, char *b){ // 実装は気にしないでね
char c;
c=*a; *a=*b; *b=c;
}

void swap_string(char *a, char *b){ // 実装は気にしないでね
int flag;
for(flag=0;flag!=3;a++,b++){
swap_char(a, b);
flag|=(*a=='\0')|((*b=='\0')*2);
}
}

int main(void){
char a[10]="foo", b[10]="bar";

printf("%s %s\n", a, b);

swap_string(a, b); // これは swap_string(&a[0], &b[0]); の糖衣構文
printf("%s %s\n", a, b);

swap_char(&a[0], &b[0]); // これは swap_char(a, b); の糖衣構文
printf("%s %s\n", a, b);

return 0;
}

579 :デフォルトの名無しさん:2008/09/07(日) 01:26:53
少なくともソースが簡略になっていないと、シンタックスシュガーとは呼べない。

580 :デフォルトの名無しさん:2008/09/07(日) 01:29:47
perlには見やすくなったかかなり疑問なシンタックスシュガーあるぜ!

581 :デフォルトの名無しさん:2008/09/07(日) 03:14:20
>>578
「シンタックス」 シュガーだろ。
「セマンティクス」シュガーじゃねーよ。


582 :デフォルトの名無しさん:2008/09/07(日) 03:48:48
Cやってみようか。

583 :デフォルトの名無しさん:2008/09/07(日) 03:53:05
入門編を信じてお聞きしますが、何かいい書籍(他にスレありそう
ですが専門的過ぎて)等ありますか。やはり情報処理試験とかある
程度基本的な資格取りに専念した方がいいのでしょうか?
質問ばかりでスミマセン。

584 :デフォルトの名無しさん:2008/09/07(日) 04:02:50
あなたの目的は?

585 :デフォルトの名無しさん:2008/09/07(日) 04:27:11
fork, pipe, dup2 を使用して
指定してされたコマンドに標準入力にデータを投入し、
そのコマンドの出力結果を取得する popenの双方向版 のような
関数を作ろうとしております。

具体的には、
--
指定したコマンドを子プロセスで実行させる。
子プロセスで実行するコマンドの入力は、親から子へのパイプを通して渡し、
コマンドの出力は、子から親へのパイプを通して渡す。
--
のようになります。

このとき、指定したコマンドが

「標準入力を全て read してから標準出力に writeする」
仕様だと問題ないのですが、(sort 等)
「標準入力から read -> 標準出力に write」
を交互に繰り返す仕様の場合、(cat 等)デッドロックが掛かってしまいます。

write ("親から子へのパイプ", buf, bufsize); << ここで止まる。

「標準入力から read -> 標準出力に write」 の場合でも
指定するコマンドの読み書きの仕方/バッファリングの仕方に関係なく
親プログラム側でデッドロックがかからなくする方法を知りませんでしょうか?


586 :585:2008/09/07(日) 04:29:07
OKだったコマンドとデッドロックがかかってしまうコマンドの例です。

--<コマンド例>----------
OKの場合:
while(..read(..)..){
}
// 全て読んでから
write(..);

デッドロックがかかる場合:
while(..read(..)..){
// 読みながら書き込み
write(..);
}
--

587 :デフォルトの名無しさん:2008/09/07(日) 04:34:15
理系の学生にCをやるとコンピュータ(プログラム)のことが分かる
と言われたことがあって、とりあえず基本から始めて、向いていそう
だったら、いろいろなアルゴリズムにも手を出してみようかと。
少しあまいかもしれませんが、基本的には好奇心です。仕事などでは
Office製品しか使ってません。(あと業務用のパッケージ)
ポインタが難しいとかよく聞きますが
ポインタ=アドレス?それともポインタとはアドレスを扱う変数?
そもそもその辺がちょっとした本を見てもいま一つの感じです。


588 :デフォルトの名無しさん:2008/09/07(日) 06:05:53
select()
シグナル
wait3()
共有メモリ
あたりは知ってる?


589 :デフォルトの名無しさん:2008/09/07(日) 06:33:04
>>587
先ずは、社会常識と日本語を学ぶことから始めると宜しいかと。

590 :585:2008/09/07(日) 07:24:58
>>588
漠然としてて答えにくいですが、知っているつもりです。

select 関数で 読み/書きそれぞれのパイプ(実際にはディスクリプタ)を
監視して、状態の変更に合わせて読み書きすればできるのでしょうか?

ちょっと調べてみます。

591 :デフォルトの名無しさん:2008/09/07(日) 08:14:48
自己解決しました

592 :デフォルトの名無しさん:2008/09/07(日) 08:55:49
ハロワ募集の内容が
基本的な操作ができること
どういう意味?

593 :デフォルトの名無しさん:2008/09/07(日) 09:36:17
>どういう意味?
マ板に逝け。

594 :デフォルトの名無しさん:2008/09/07(日) 10:22:50
すみません。

595 :デフォルトの名無しさん:2008/09/07(日) 14:49:55
CSVファイルを行単位で読み込み、その中のカンマを水平タブに変換する。その後resultファイルで出力
というプログラムなんですが、#define buff_sizeのサイズによって、出力したファイルが化けるのですが原因はなんでしょうか。以下ソースです。
#include<stdio.h>
#include<string.h>
#define buff_size 2
char g_buffer[buff_size]; char strafter[buff_size]; int subrtn1();
int main(){
FILE *fp; FILE *result;
fp = fopen("sample.csv", "rt");
if ( !fp ){
printf("ファイルオープンエラー\n");
return;
}
result = fopen("result", "w");
while( fgets( g_buffer, buff_size, fp ) != '\0' ){
*strafter = subrtn1(g_buffer);
if ( EOF == fprintf(result, strafter) )
printf("ファイル書き込みエラー\n");
}
fclose(fp); fclose(result);
return ;
}
int subrtn1(){
int i = 0;
while ( g_buffer[i] != '\0' )
{
strafter[i] = ( g_buffer[i] == ',' ) ? '\t' : g_buffer[i];
++i;
}
return *strafter;
}

596 :595:2008/09/07(日) 14:52:22
追記。
読み込むファイルは行ごとに文字数がバラバラです。
調べたけれど、原因がほんとに理解できないorz

597 :デフォルトの名無しさん:2008/09/07(日) 14:53:21
かんきょーはうぃんどうず?

598 :595:2008/09/07(日) 14:58:08
すみません、環境書くの忘れてました。

OS:Linux Fedora8
コンパイラ:gcc (バージョン失念しました。Fedora8インストールの際に入れたものです。

599 :デフォルトの名無しさん:2008/09/07(日) 15:02:28
日本語食えないとこに日本語食わせていじったらそら文字化けする。

600 :デフォルトの名無しさん:2008/09/07(日) 15:06:16
>>599
S-JISならTABは問題ないとおもうけど

601 :デフォルトの名無しさん:2008/09/07(日) 15:07:02
fgetsの使い方が変?

602 :デフォルトの名無しさん:2008/09/07(日) 15:17:07
横から質問申し訳ないんですが
>>595にあるようなfopen("sample.csv", "rt");
のtはどういう意味なんでしょうか
manでfopenを見てもありません

603 :デフォルトの名無しさん:2008/09/07(日) 15:17:31
つーかさ1行の文字数ってどのくらいあるの?
このソースだと2バイトしか読めないぞ

604 :デフォルトの名無しさん:2008/09/07(日) 15:18:49
t text
b バイナリー
だったかな

605 :デフォルトの名無しさん:2008/09/07(日) 15:22:52
時折、ポインタを進めるのにsizeofを使うコードを見かけるんですが、
これって普通に使う手法でしょうか?

たとえば、こんな感じですが

char* rPtr = &src_data[0]; ←読むデータのポインタ
val = *rPtr; ←1バイト分コピーする
rPtr +=sizeof(char);

sizeofが、コンパイル時時に定数に置き換えられれば良いけど、
プログラム実行時に毎回引数の型のサイズを見てたら、
無駄に処理が重くなるんじゃない?と疑問に思ったりと。

606 :デフォルトの名無しさん:2008/09/07(日) 15:26:01
>>605
char*をint*にしたらどうなると思う?

607 :595:2008/09/07(日) 15:26:23
>>603さん
行によってマチマチなんですが、おおよそ1行で150文字くらいですね。
#define buff_size 2 となっているのは暫定で適当につけたものです。
とにかく出力さえ、うまくできれば・・・と思っていますorz

608 :デフォルトの名無しさん:2008/09/07(日) 15:28:00
>>605
見ない

それにCでコンパイルすればどっちみ機械語に変換する場合に
型ごとのサイズでポインタが加算されてる。

int型のポインターを+1すると、おおよその環境は+4バイト
short型はポインターを+1すると、+2バイト

Cで型についてうるさいのはこういうことをコンパイラがわからないと困るから。

609 :デフォルトの名無しさん:2008/09/07(日) 15:28:42
>>605
ほんとにそんなコード時折見るのか?
指してるサイズ分すすめるのは+1だぞ?


610 :デフォルトの名無しさん:2008/09/07(日) 15:29:03
>>607
fgetでrtだと一行まるまるよまれるからそのままだと2バイトしか読まないので
バッファサイズを256にでもしておけば?

611 :デフォルトの名無しさん:2008/09/07(日) 15:34:13
>>604
ありがとうございます

612 :デフォルトの名無しさん:2008/09/07(日) 15:38:20
>>608〜609さん
レスありがとうございます。
最近、外注先かの納入物で見ます。
val = *rPtr;
rPtr +=sizeof(char);

val = *rPtr++;
と個人的には書きたいんだけど・・・問題あるのかしら?と悶々としてたり

ちなみに通信系のコードなので、1バイト境界での読み込みしかしませんので、
常にchar*を使用します、int*は使わないです。
intは、2byteか4byte長になるかの機種依存性ありますし・・・。

613 :595:2008/09/07(日) 15:39:17
>>610さん
バッファサイズは3,4,8,16・・・128,256,512,1024など色々試したんですが
いずれも化けるか、おかしな改行が入ったりする状況です。

違う関数のほうがいいのだろうか

614 :デフォルトの名無しさん:2008/09/07(日) 15:43:20
>>602
VC++独自だから忘れていい。
604の言う通りだが、通常はbを指定しないことでテキストモードを表す。

615 :デフォルトの名無しさん:2008/09/07(日) 15:43:52
元ファイルの改行コードがCRLFとか?

616 :デフォルトの名無しさん:2008/09/07(日) 15:46:11
>>612
その例のrPtrは char型のポインタなんで別にsizeof(char)しなくてもOK

>>613
ごめんロジック全部はちゃんとみてないけど
なんかそっちで失敗してると思う。
関数にバッファの中身を処理させてるけど
関数を使う必要がなければもっと簡単にできるはず。
それに
1)g_bufferをクリア

2)g_bufferへ1行読み込み

3)そのまま中身書き換え

4)終わったら出力

これでいいとおもうけど
なんかその処理をみてると2つのバッファ間でへんなことやってるきがする。

あと上の手順はCSVファイルがS-JISだったらOKだけどほかの文字コードは検証してないw

617 :デフォルトの名無しさん:2008/09/07(日) 15:48:39
>>614
なるほど
どうりでmanに載っていないわけです
ありがとうございました



618 :デフォルトの名無しさん:2008/09/07(日) 15:53:33
>>615
それもくさいな。

fgetって改行コードって全部のOSの分みてくれないんだっけ?
3パターンくらいあったよね?

619 :デフォルトの名無しさん:2008/09/07(日) 15:57:23
なんのためのテキストモードだと思ってんだよ・・・

620 :618:2008/09/07(日) 15:59:36
すまねえw
テキストモードで1行単位で読むと遅いのでバイナリーモードで
メモリにあげて自前でやってたから気にしてなかったわ。

じゃあロジックの問題か

621 :デフォルトの名無しさん:2008/09/07(日) 16:00:18
> > > C++
> > > ものすごくいいよ。
> > > 「アルゴリズム」っていうヘッダまである。
> > > ということでソートなどは覚える必要なくなったよ。

とか言ってる奴がいるんだが大丈夫なのか?覚えなくても

622 :デフォルトの名無しさん:2008/09/07(日) 16:03:24
>>621
すれ違い

623 :デフォルトの名無しさん:2008/09/07(日) 16:04:21
>>622

すまん

624 :デフォルトの名無しさん:2008/09/07(日) 16:05:01
>>621
そもそもそういうのがない言語だったとしても、
ググって見つけたコードを書き換えるだけだから、
C++に限らず覚える必要はないと思う、理解さえできていれば。

ちなみに、Cにもqsortがあるよ。

625 :デフォルトの名無しさん:2008/09/07(日) 16:18:10
覚えるというか原理位知ってくれないと

ソートされてない配列に対してbsearch呼んで
「これライブラリのバグじゃないスかねぇ?」
とか抜かしたウチの新人の様になるので気をつけてください

626 :デフォルトの名無しさん:2008/09/07(日) 16:24:21
質問ついでに気づいたことツラツラと

>>595
>>while( fgets( g_buffer, buff_size, fp ) != '\0' ){
→g_bufferは各ループ毎に初期化した方が良いと思う
ちなみにfgetsは読み込んだ文字列の終端に
改行コードを勝手に付けたと思うので仕様を確認してみてはどうでしょう?

>>*strafter = subrtn1(g_buffer);
→strafterも同様に初期化してから文字列を格納している?か確認要かと

>>if ( EOF == fprintf(result, strafter) )
>>printf("ファイル書き込みエラー\n");
→エラーだけど、while抜けなくて良い?

コードを、ざっと見て気になりました。

627 :デフォルトの名無しさん:2008/09/07(日) 16:26:31
>>624-625

サンクス

628 :595:2008/09/07(日) 16:44:31
皆様ありがとうございます。

>>615
ファイル自体はWindowsで作ったものなんで、CRLFになっているはずですね。
改行コードの処理ちゃんとせないかんですねorz

>>616
バッファの初期化は確かにやってなかったですねorz
ロジック含めてもう一度見直します。

>>626
fgetsはNULLを追加するみたいです。
初期化はやっぱりしてませんでした。その辺の処理きちんとしときます。
while抜ける処理も書いてないですね確かにorz

629 :デフォルトの名無しさん:2008/09/07(日) 16:46:03
o(゜◇゜o)ホエ?

630 :デフォルトの名無しさん:2008/09/07(日) 17:02:35
>>612
たぶんその外注先がヘボ

631 :デフォルトの名無しさん:2008/09/07(日) 17:07:23
>>628
NULLを追加するんじゃなくてエラーが起きたかEOFに達したときはNULLを返す、だろ

632 :デフォルトの名無しさん:2008/09/07(日) 17:13:40
>>631
628の言っているNULLは\0のことだと思う。

633 :デフォルトの名無しさん:2008/09/07(日) 17:18:17
まあなんにせよいろいろ突っ込みどころの多いコードだな

634 :デフォルトの名無しさん:2008/09/07(日) 17:20:24
とりあえず
・returnは値を返せ
・resultのfopenもチェックしろ
・fgetsの戻り値はchar*

635 :デフォルトの名無しさん:2008/09/07(日) 17:24:02
っていうかコンパイルできねーだろこれアホか

636 :デフォルトの名無しさん:2008/09/07(日) 17:25:02
他にも幾つか。
・グローバル変数は使うな。
・入力を再利用しないのなら、入力バッファと出力バッファを分ける必要は無い。
・','を探すのは、標準関数を使おう。
・えらーちぇっくするなら、fprintf()だけでなく(出力の)fclose()もエラーチェックすべき。
・勿論、>634の指摘したとおりfopen()も。
・型について、もう少し慎重にチェックすること。
・コンパイラは最低限の警告くらい出すようにしよう。
# 例えばgccなら gcc -Wall ...

637 :デフォルトの名無しさん:2008/09/07(日) 17:26:02
>>635
Cではプロトタイプと引数が食い違っててもコンパイルはできるよ

638 :デフォルトの名無しさん:2008/09/07(日) 17:26:49
単にstrafterにコピーしたあとヌル文字つけてないだけだろ

639 :デフォルトの名無しさん:2008/09/07(日) 17:29:09
あとfprintfの書式指定文字列に配列放り込むな

640 :デフォルトの名無しさん:2008/09/07(日) 17:33:58
これでいいんじゃないの
クローズチェックはやってないけど

#include<stdio.h>
#include<string.h>
#define buff_size 1024
char buffer[buff_size];
int main(){
 FILE *fp; FILE *result;
 int i;
 fp = fopen("sample.csv", "rt");
 result = fopen("result", "w");
 if ( !fp || !result ){
  printf("ファイルオープンエラー\n");
  return -1;
 }
 while( fgets( buffer, buff_size, fp ) ){
 for ( i=0 ; buffer[i] ; i++ ){
   /* ASCIIしか考慮してないが */
  if( buffer[i] == ',' )
    buffer[i] = '\t';
 }
  if ( EOF == fprintf(result, "%s", strafter) ){
   printf("ファイル書き込みエラー\n");
   return -1;
  }
 }
 fclose(fp); fclose(result);
 return 0;
}

641 :デフォルトの名無しさん:2008/09/07(日) 17:36:52
>>640
・fputs()を使わない訳は?
・strchr()を使わない訳は?
・main()で-1を返す訳は?

642 :デフォルトの名無しさん:2008/09/07(日) 17:38:55
・fputs()を使わない訳は? 特に無い
・strchr()を使わない訳は? 特に無い
・main()で-1を返す訳は? 特に無い

643 :641:2008/09/07(日) 17:40:35
あいわかった。

644 :デフォルトの名無しさん:2008/09/07(日) 17:41:39
mainで-1を返すのはエラーだって分かりやすくするために良く使う

645 :デフォルトの名無しさん:2008/09/07(日) 17:44:27
641はmainの戻り値は1とか正の値のほうがいいのでは?と言いたいんだと思う。

646 :デフォルトの名無しさん:2008/09/07(日) 17:44:29
処が大抵のコマンドインタプリタは終了ステータスを正の整数としてしか扱わない。

647 :641:2008/09/07(日) 17:47:02
>>645
×int main(){return -1;}
○int main(){return 0;}
◎int main(){return EXIT_FAILURE;}

648 :641:2008/09/07(日) 17:48:33
うへ、return 0じゃねぇよ、return 1だぜ。

649 :デフォルトの名無しさん:2008/09/07(日) 18:27:47
EXIT_FAILUREはexitの時には使うけど
returnでは何故か使わない…
考えたら変な癖だな

650 :デフォルトの名無しさん:2008/09/07(日) 19:07:14
returnは1、2、3…と増やしていくようにしてるな
使わないけど

651 :デフォルトの名無しさん:2008/09/07(日) 19:09:33
int main(int argc, char** argv)
**って、なに?
ポインタのポインタ?

652 :デフォルトの名無しさん:2008/09/07(日) 19:13:37
fcloseの戻り値でエラーチェックって、なんかする意味あるのか?

653 :デフォルトの名無しさん:2008/09/07(日) 20:13:10
他人のコードを読んでいて、
unsigned char status:4;
のような宣言を見つけたのですが、:4はどのような意味があるのでしょうか。

654 :デフォルトの名無しさん:2008/09/07(日) 20:22:12
揚げ足とるようで気を悪くされたらすまんが
>>fp = fopen("sample.csv", "rt");
>>result = fopen("result", "w");
>>if ( !fp || !result ){
>>printf("ファイルオープンエラー\n");
>>return -1;
>>}

別にプロセスが終わってしまうからreturnしても問題は発生しないだろうけど、
fopen出来たものはfcloseする癖をつけたほうが良いですよ。
mallocとFreeみたいに。

>>if ( EOF == fprintf(result, "%s", strafter) )・・も。

1つの関数内でreturnを散逸させるのは控えた方が良い。

655 :デフォルトの名無しさん:2008/09/07(日) 20:57:59
>>651
char**は、char*を指すポインタ

>>652
まだバッファに残ってたデータがディスクフルとかで書き込めなかったときにわかるんじゃない?たぶん

>>653
ビットフィールド

656 :デフォルトの名無しさん:2008/09/07(日) 21:00:55
>>652
ストリーム出力はバッファリングされるので、fprintf()で全てが出力されるわけではない。
バッファに残っている分は、fclose()によって出力(フラッシュ)される。
従って、(最早殆ど意識する必要が無いとはいえ)最後の最後にディスクフルになって書けないかも知れない。
それを検出するためには、書き込み後のfclose()の戻り値はチェックしておく習慣をつけることが望ましい。
逆に、入力後のfclose()は通常エラーを起こすとは考え難いので省略してしまうことが多い。

657 :デフォルトの名無しさん:2008/09/07(日) 21:02:37
Cではmainを再帰呼び出しできるしなぁ

658 :デフォルトの名無しさん:2008/09/07(日) 21:17:35
Cって開発環境は何つかえばいいの?

659 :デフォルトの名無しさん:2008/09/07(日) 21:18:17
visualC++

660 :デフォルトの名無しさん:2008/09/07(日) 21:22:38
>>659
Cも使えるんですか?

661 :デフォルトの名無しさん:2008/09/07(日) 21:23:55
>>660
大丈夫だMSを信じろ

662 :デフォルトの名無しさん:2008/09/07(日) 21:25:37
>>661
ググってみたんですがC非対応と…
信じて良いですか?

663 :デフォルトの名無しさん:2008/09/07(日) 21:28:16
確かに誰も使っていない最新のC99規格には対応していない。
でも、一般的に用いられているC89-C95には対応しているから大丈夫。
ファイルの拡張子やオプションでCとC++から選べるようになっている。

664 :デフォルトの名無しさん:2008/09/07(日) 21:30:12
VCが一番。 GCCやBCCとかあるけど、MS製のライブラリはたくさんあるし
MS以外のライブラリもたくさんだし、安定度も速度も一級品。

665 :デフォルトの名無しさん:2008/09/07(日) 22:22:52
配列a[3]とb[10]c[10]d[10]があって、

a[1]<-b[1],b[2],b[3]・・・・・b[10]
a[2]<-c[1],c[2],c[3]・・・・・c[10]
a[3]<-d[1],d[2],d[3]・・・・・d[10]

のように、配列aに各bcdのポインタの頭を格納したいんだ。

こういうときは、
*&a[1] = b
*&a[2] = c
*&a[3] = d
でいいのかな。

666 :デフォルトの名無しさん:2008/09/07(日) 22:25:54


a[0]=b
a[1]=c
a[2]=d

667 :デフォルトの名無しさん:2008/09/07(日) 22:28:14
>>665
面白いけど
a[1]=b;
でダメな理由が分からない

668 :デフォルトの名無しさん:2008/09/07(日) 22:30:15
やっぱそうだよね。でも、こう書くと、

1)a[0]=bを実行
a[0]=b
a[1]=不定
a[2]=不定
2)a[1]=cを実行
a[0]=c
a[1]=c
a[2]=不定
2)a[2]=dを実行
a[0]=d
a[1]=d
a[2]=d

ってなるんだお。意味不・・・

669 :デフォルトの名無しさん:2008/09/07(日) 22:33:56
a,b,cの宣言部分から書いてみろよー

670 :デフォルトの名無しさん:2008/09/07(日) 22:41:37
あいよ〜
正確には、

/*宣言*/
struct kata* featlist[MAX_FEATURES];

struct kata* tempfeat;
tempfeat = new kata[MAX_FEATURES];

/*操作*/
for(i=0,i<10,i++)){
//tempfeatに何らかの操作を施す
featlist[i] = tempfeat
}

という風にしているんだけど、688のようなことが起こるわけ
1)featlist[0]=bを実行
featlist[0]=b
featlist[1]=不定
featlist[2]=不定
2)featlist[1]=cを実行
featlist[0]=c
featlist[1]=c
featlist[2]=不定
3)featlist[2]=dを実行
featlist[0]=d
featlist[1]=d
featlist[2]=d

ウマーーー!!!!!

671 :デフォルトの名無しさん:2008/09/07(日) 22:44:32
あ、いやw書いててわかったかもしれんw
forの中で毎回宣言しなくちゃならんのかな?

672 :デフォルトの名無しさん:2008/09/07(日) 22:47:37
あ・・・れ・・・?
C言語にnewなんてあったっけ・・・?

673 :デフォルトの名無しさん:2008/09/07(日) 22:48:55
どこから突っ込もうか

674 :デフォルトの名無しさん:2008/09/07(日) 22:50:18
すまん、スレ違いだったな。
for内で毎回領域確保しないといけないんだな。
ありがとう。

675 :デフォルトの名無しさん:2008/09/07(日) 22:51:41
あ、良かったら突っ込んでください。もっといい書き方あるのかな。

676 :デフォルトの名無しさん:2008/09/07(日) 23:08:50
for(i=0,i<10,i++)){
 featlist[i] = new kata[MAX_FEATURES];
}

677 :デフォルトの名無しさん:2008/09/07(日) 23:12:18
いい書き方より、デバッグの仕方を覚えたほうがいいような?

678 :デフォルトの名無しさん:2008/09/07(日) 23:27:43
まず文法がわかってるかどうかから怪しい

679 :653:2008/09/07(日) 23:30:36
>>655
ありがとうございます!理解できました。

680 :デフォルトの名無しさん:2008/09/07(日) 23:38:23
でででばっくのしかた?

681 :デフォルトの名無しさん:2008/09/08(月) 00:02:13
BASICの質問してる人がいるの?

682 :デフォルトの名無しさん:2008/09/08(月) 00:29:32
C言語を今日から学ぼうと思ってる者です
C言語を学ぶならコンパイルがないと始まらない、と説明書で読んだのでVisual C++ 6を使いたいのですが
(これコンパイラですよね?)フリーソフトかどうかわかりません。どういう意味でしょうか?

683 :デフォルトの名無しさん:2008/09/08(月) 00:31:16
どういう意味、ってどういう意味なのかよく分からんが、
とりあえず Visual C++ 2008 Express Edition 落としてこれば問題ない

684 :デフォルトの名無しさん:2008/09/08(月) 00:31:36
VC++6.0は有償です
VC++2008 ExpressEditionで

685 :デフォルトの名無しさん:2008/09/08(月) 01:04:53
どうしようもないくらい初歩的なことですみません
VC++で1つのプロジェクトに複数の.cppファイルを作ったとき
ビルド→実行で全体のプログラム?を実行することはできますがプロジェクトの中にあるうちの
1つだけの.cppファイルを実行したいときはどうすればよいのでしょうか?

686 :デフォルトの名無しさん:2008/09/08(月) 01:06:19
関数名をmainにしたら動くんじゃないか。
関数の動作チェックがしたいんかい?

687 :デフォルトの名無しさん:2008/09/08(月) 01:09:12
まだ始めたばかりなので上手く表記できないのですが例えば

関数1
{
  2を呼び出し
  3を呼び出し
  4を呼び出し
}

みたいな感じのときに1(全体)ではなく2、3、4単体の動作チェックを行いたいです

688 :デフォルトの名無しさん:2008/09/08(月) 01:26:07
cl.exeをコマンドラインから実行するとか

689 :デフォルトの名無しさん:2008/09/08(月) 01:33:10
関数1
{
  2を呼び出し
  /*3を呼び出し*/
  /*4を呼び出し*/
}

690 :デフォルトの名無しさん:2008/09/08(月) 01:36:36
>>687
テスト用のmain関数を作る。
当然別プロジェクトでテスト対象の関数の.cファイルは同一。

691 :デフォルトの名無しさん:2008/09/08(月) 14:00:05
#include <stdio.h>
int main(void){
printf("hello");
}

「14歳から始めるわくわくゲームプログラム」
と言う本にあったサンプルプログラムなのですが、エラーが出てしまって全く先に進みません。
ボーランド製のC言語です。

692 :デフォルトの名無しさん:2008/09/08(月) 14:01:16
>エラーが出てしまって全く先に進みません。
エラーの種類は?

693 :デフォルトの名無しさん:2008/09/08(月) 14:02:35
エラーの内容を正確に書いてくれないと。
環境設定をやってなくて、xxx.objが見つからないとかいうエラーじゃないの?

694 :デフォルトの名無しさん:2008/09/08(月) 14:03:12
その前に、stdio.hが見つからない、とかになるか。

695 :デフォルトの名無しさん:2008/09/08(月) 14:05:20
return 0;


696 :デフォルトの名無しさん:2008/09/08(月) 14:06:18
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照

です

697 :デフォルトの名無しさん:2008/09/08(月) 14:06:33
>>691
そんな変なタイトルの本、ほんとにあるのか?w

698 :デフォルトの名無しさん:2008/09/08(月) 14:06:47
初期設定しろ!


699 :デフォルトの名無しさん:2008/09/08(月) 14:07:06
まず>>695のを入れるべきだな。
話はそれからだ。

700 :デフォルトの名無しさん:2008/09/08(月) 14:07:55
>>697
尼で見た記憶がw

701 :デフォルトの名無しさん:2008/09/08(月) 14:08:58
設定ファイル "bcc32.cfg" と "ilink32.cfg" の設定はしたんだろうな?


702 :デフォルトの名無しさん:2008/09/08(月) 14:09:35
ググったら「14歳からはじめる〜」シリーズは結構あるんだなw
姉妹品に、「15歳からはじめるDirectX9 3Dゲームプログラミング」というのもあった。

703 :デフォルトの名無しさん:2008/09/08(月) 14:11:27
そういう初めてシリーズだと環境設定から書いてあるだろ。
読んだのか?最初から。
読んでもしそういうのが無ければその本返品しろw

704 :デフォルトの名無しさん:2008/09/08(月) 14:16:03
しかし、>>696のエラーだとmain()のつづりミスじゃないのかなあ。
質問者はエラーの出たソースをそのままコピペしたか?

705 :デフォルトの名無しさん:2008/09/08(月) 14:23:25
>>704
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)

** error 1 ** deleting Debug\renshuu.exe

です
初期設定は本に書いてある通りに行ってます。

706 :デフォルトの名無しさん:2008/09/08(月) 14:24:35
>>705
コピペしたか気にしてるのは>>691のほうだよ。

707 :デフォルトの名無しさん:2008/09/08(月) 14:41:29
>>686
>>688-691
ありがとうございました

708 :デフォルトの名無しさん:2008/09/08(月) 14:41:53
>>706
サンプルファイルでそのままフォルダにあったものをコピペしてます。

709 :デフォルトの名無しさん:2008/09/08(月) 14:43:44
>>708
その本のどこかに訂正を書いてあるページとかない?
なければゴミシリーズ決定だな>その出版社の本

710 :デフォルトの名無しさん:2008/09/08(月) 14:47:47
皆様へ

いろいろやってたら動くようになりました。
どうもありがとうございます。

711 :デフォルトの名無しさん:2008/09/08(月) 14:59:51
なんちゃそりゃ。

712 :デフォルトの名無しさん:2008/09/08(月) 15:00:33
上書きを忘れてたんだよきっと

713 :デフォルトの名無しさん:2008/09/08(月) 16:50:35
「12歳から始めるTex」 …ハァハァ

714 :デフォルトの名無しさん:2008/09/08(月) 17:45:01
落ちこぼれでもかけちゃう本を読んで学ぶ人に失礼では?>>485

715 :デフォルトの名無しさん:2008/09/08(月) 21:22:58
ポインタへの理解に向けてってことで聞きたいんですけど
アドレスと変数の中身ってよくメモリの番号とバイト数の関係で説明されるけど
変数がその変数の中身を指してるって事実はどう処理されてるんですか?

716 :デフォルトの名無しさん:2008/09/08(月) 21:25:47
意味がわかりません。

717 :デフォルトの名無しさん:2008/09/08(月) 21:26:36
>>715
どう処理って何が聞きたいの?俺は100%説明できると思うよ。

718 :デフォルトの名無しさん:2008/09/08(月) 21:30:04
変数の格納先の番地はプログラムが把握してるんだよ
ポインタの場合はプログラムが把握している番地の領域にさらにメモリの番地が入ってる

719 :デフォルトの名無しさん:2008/09/08(月) 21:34:14
static int n;
static int x, y;
とかって変数があったら、コンパイルの段階で、nは100番地に置くとか、xは104番地に置くとか決めてる。


720 :デフォルトの名無しさん:2008/09/08(月) 21:40:11
それはない

721 :715:2008/09/08(月) 21:41:27
なんと言うか、型によってアドレスの幅がとられたりするのは直感的にわかりやすいし、
アドレスが連番ってことももちろんわかります、その変数の中身が型のバイト数以内だから変数の中身もわかる
と思うんですが、それをどうやってaとか変数名と結び付けてあるのかがわかりません

722 :717:2008/09/08(月) 21:41:39
>>718
番地だけじゃない。暗黙のうちに、番地の先にあるオブジェクトのサイズが
包含されてるんだよ。ポインタに演算かけりゃすぐわかるだろ。

Cでさえこれなのに、C++になると頭が破裂しそうに…

723 :デフォルトの名無しさん:2008/09/08(月) 21:48:31
>>721
結びつけるっていうか、コンパイラが覚えてるだけだよ。
nという変数を100という番地に置くと決めて、
n = 3;
というコードがあったら、
mov [100], 3
というアセンブラのコードに置き換えるだけ。

724 :デフォルトの名無しさん:2008/09/08(月) 21:49:07
>>721
結び付けるも何もコンパイルしたらCの場合はaに該当する
格納先は何らかの形で確保されるけどaなんて表記はないよ。

つーかその辺理解したかったらアセンブラか機械語やらないと無理。
それにそもそもアセンブラや機械語では開発効率が悪いので
Cでそういう配置先とかを意識しなくてよくしたのに
それを理解云々って変なところにこだわりすぎ。

725 :デフォルトの名無しさん:2008/09/08(月) 21:53:48
答えは、「結び付けられてない」だなw
マシン語では、データはすべてアドレスで持ってる。

726 :デフォルトの名無しさん:2008/09/08(月) 21:54:09
>>722
はぁ?ポインタに格納してるのはアドレスだけだろ?
お前がいってるのはポインタの型じゃん


727 :デフォルトの名無しさん:2008/09/08(月) 21:58:31
>>725
だなあ。
バイナリーをCソースには戻せないもんな。
アセンブラのソースにはできるが。
なので
Cソース->バイナリの結びつけはなんとか可能だが
その逆はできないし、そもそも必要性を感じない。

仕事でそんなところ詰まってるとすぐ切られるぞ

728 :デフォルトの名無しさん:2008/09/08(月) 22:02:33
>>726
型によってポインタの内部表現の種類が違うかもしれない程度かな
規格上は型を持っていてもかまわないんだろうけどそんなコンパイラあるとは思われない

729 :715:2008/09/08(月) 22:03:17
次元が高いから内部で何重にも処理されてるのか
配列だとaが先頭のアドレスをさすのに
intだとaは変数の中身しか指さないとか理屈的におかしいな〜と思ったわけ
その場合左がポインタだと=の意味が変わることになるのも整合性がないし・・・と

730 :デフォルトの名無しさん:2008/09/08(月) 22:05:55
配列とポインタについては特別な約束事があるからそうなってるだけだ

731 :デフォルトの名無しさん:2008/09/08(月) 22:07:45
>>729
アセンブラレベルでみれば、どっちもさほどコードはかわらん。
配列の先頭のみに限ればだけど。

732 :デフォルトの名無しさん:2008/09/08(月) 22:08:04
>配列だとaが先頭のアドレスをさすのに
違う
配列名は本当は配列そのものを意味する
ただしいくつかの例外を除いて先頭要素へのポインタに変換される

733 :デフォルトの名無しさん:2008/09/08(月) 22:08:56
>>732
逆だ
配列名が先頭アドレスで
&配列名が配列へのアドレスだ

sizeofは例外

734 :デフォルトの名無しさん:2008/09/08(月) 22:09:18
とりあえずね、マシン語でやってることとC言語でやってることをごっちゃにするのは良くない
C言語がやってることというのはコンパイラがやってることを含むから

735 :デフォルトの名無しさん:2008/09/08(月) 22:09:20
ちょwwその辺詳しく教えてww

736 :デフォルトの名無しさん:2008/09/08(月) 22:09:35
これは何のポインタかな?と思ったら
演算してみるのがおすすめ

737 :デフォルトの名無しさん:2008/09/08(月) 22:11:02
>>732
違う。
配列名はアドレスではない、ポインタに変換されるだけ。
というかアドレスとポインタの区別はつけようね。>>734も言ってるけど。


738 :715:2008/09/08(月) 22:17:20
ポインタp=配列a とした瞬間になんでアドレスに変わるのよ?
よくあるメモリの中身と周りに変数名、アドレスが載ってる図じゃ説明できないでしょ

739 :デフォルトの名無しさん:2008/09/08(月) 22:17:50
|式中に現われる型「Tの配列」という左辺値は、
|(3つの 例外を除いて)配列の最初の要素を指すポインタに意味が格下げになる。
|結果としてできるポインタの型は「Tへのポインタ」となる。
|3つの例外とは、配列がsizeofのオペランドとなるとき、&のオペランドとなるとき、
|charの配列を文字列リテラルで初期化するとき、を指す。

とまあ規格ではこうなっている
ポインタに変換されないことは例外だが、一方でそれが本来の意味だということ

740 :デフォルトの名無しさん:2008/09/08(月) 22:19:03
>>738
だから特別な約束事があるんだってば。

741 :デフォルトの名無しさん:2008/09/08(月) 22:20:42
またこいつか
配列がアドレスになるのはおかしいだのなんだの
もうわかってて荒らしてるとか思われん

742 :デフォルトの名無しさん:2008/09/08(月) 22:21:09
正確に理解したいならアドレスとか実装に依存する事は考えずに
あくまで指すもの=ポインタ
として理解しないと

743 :デフォルトの名無しさん:2008/09/08(月) 22:22:37
いやだからその辺の理屈を知りたければアセンブラやれ。
そうすればあるときはポインタに格下げとか言われてる意味がわかるから。
C使う以上はそんなの気にしてられねえよ。
なんのためのCだよ。

744 :デフォルトの名無しさん:2008/09/08(月) 22:24:21
なんだよ。かまってちゃんか。
相手して損した。

745 :715:2008/09/08(月) 22:27:14
>>739
ありがとう。わかりやすかった

746 :デフォルトの名無しさん:2008/09/08(月) 22:42:26
int a;と宣言したからと言って、変数aがどこかのアドレスに割り当てられるわけじゃないのも混乱の原因になるな。
勿論int * p = & a;としてしまうと、その時点で割り当てられることが確定するわけだが。

747 :デフォルトの名無しさん:2008/09/08(月) 22:45:25
>>746
まーなー
コンパイラがレジスタでいけるやんって判断したら
メモリ上には存在しないし。

748 :デフォルトの名無しさん:2008/09/08(月) 22:45:36
>>746
うそつくなよ。

749 :デフォルトの名無しさん:2008/09/08(月) 22:50:32
レジスターも広い意味でアドレスなんだけど

750 :デフォルトの名無しさん:2008/09/08(月) 22:54:02
>>749
ややこしくすんなw

751 :デフォルトの名無しさん:2008/09/08(月) 22:55:24
そもそも、最適化で消えてなくなる変数だってあるわけで。

752 :デフォルトの名無しさん:2008/09/08(月) 23:08:32
要するに>>734

753 :デフォルトの名無しさん:2008/09/09(火) 20:30:18
pclose()がstdio.hに見つからないんだけどどこにありますか?
linux の centosでgccの3.46です

754 :デフォルトの名無しさん:2008/09/09(火) 21:02:38
stdio.hだろ
そこにないってことは実装されていない?

755 :デフォルトの名無しさん:2008/09/09(火) 21:03:39
distroがわからないと何とも。

756 :デフォルトの名無しさん:2008/09/09(火) 21:33:22
えっ?

757 :デフォルトの名無しさん:2008/09/09(火) 22:12:35
glibcにないの?

758 :デフォルトの名無しさん:2008/09/09(火) 23:27:47
>>753
grep pclose /usr/include/*.h /usr/include/sys/*.h


759 :デフォルトの名無しさん:2008/09/09(火) 23:37:56
staticで宣言したグローバル変数を別ファイルで使うのってできます?

760 :デフォルトの名無しさん:2008/09/09(火) 23:43:58
>>759
static を外す
定義しているファイルを include する
関数を使ってアクセスする
アドレスを貰って操作する



761 :デフォルトの名無しさん:2008/09/09(火) 23:51:16
// file; a.c
static int a

これを

// file; a.c
int a;

// file; b.c
extern int a;
※extern int a;をヘッダーファイルに記述して、そのヘッダーファイルを
includeしてもよい。(この方法の方がベター)

762 :デフォルトの名無しさん:2008/09/09(火) 23:58:58
>>760
レスありがとうございます
関数を使ってアクセスするとは具体的にどのようにやるのか教えていただけないでしょうか?

763 :デフォルトの名無しさん:2008/09/10(水) 00:13:49
// file a.c
static int a;
int getA() {return a;}
// file a.h
int getA(void);
// file b.c
#include "a.h"


764 :デフォルトの名無しさん:2008/09/10(水) 03:22:45
>>754
popen()はあるし使えるんですよ、
stdio.hを直接見るとに関数宣言はちゃんとあるのに
なぜか暗黙の型宣言といわれてしまいますが(popen()で)
>>755
だからCentOSですってwちなみに4の最終です
>>757
pclose()を使おうとした場合
プロトタイプ宣言がないことで出る警告だけでなく
本体がが見当たらないというほうのエラーもでてるので
libcに無いみたいです
>>758
stdio.hに
見たらプロトタイプ宣言はありました
でもなぜかincludeしてるのに関数の宣言がされてない警告が出てしまいますが

無さそうそうなので諦めて作ることにします、皆さんありがとうございました

765 :デフォルトの名無しさん:2008/09/10(水) 04:04:17
コンパイラオプションの関係ではないかな?

__STRICT_ANSI__のマクロが定義されているとstdio.hの中のpopen, ocloseのプロトタイプ宣言
は#ifndef __STRICT_ANSI__で展開されない。

> ISO 標準の C。 gcc(1) を -std=c99 や -ansi などのフラグを付けて起動した場合、
> このマクロは暗黙のうちに定義される。

766 :デフォルトの名無しさん:2008/09/10(水) 07:43:36
>>763
ありがとうごさいます、やってみます

767 :デフォルトの名無しさん:2008/09/10(水) 12:15:55
gotoってなんか使わないほうがいいって聞いたんだけど、みんな使ってないの?
あれってたまに便利じゃね?

768 :デフォルトの名無しさん:2008/09/10(水) 12:23:24
>>767
なんで使うなと言われるのか、くらいはググっとけ。

769 :デフォルトの名無しさん:2008/09/10(水) 12:50:10
この板のgotoスレは消滅しちゃったんだな

770 :デフォルトの名無しさん:2008/09/10(水) 13:11:37
>>767
そうだね

771 :デフォルトの名無しさん:2008/09/10(水) 13:13:56
i love goto

772 :デフォルトの名無しさん:2008/09/10(水) 13:15:19
むしろ何でgotoを使いたいか理解できないなあ。

BASICやってたころは使ってたが今はとてもじゃないが使えんわ。
ただチューニングでどうしても関数呼び出しを減らしたい場合は
インライン展開できない部分はgotoにしたりするなあ。

773 :デフォルトの名無しさん:2008/09/10(水) 13:15:24
#define gogo goto

にするといっぱい使いたくなるよ

774 :デフォルトの名無しさん:2008/09/10(水) 13:22:23
gotoの使いどころは決まってる

775 :デフォルトの名無しさん:2008/09/10(水) 18:59:42
多重ループからの脱出

776 :デフォルトの名無しさん:2008/09/10(水) 19:29:39
エラー処理の可読性向上

777 :デフォルトの名無しさん:2008/09/10(水) 19:30:52
>>772
コンパイラを換えるべき。

778 :デフォルトの名無しさん:2008/09/10(水) 19:41:28
おつむを換えるべき?

779 :デフォルトの名無しさん:2008/09/10(水) 19:55:50
これ以上続けるなら隔離スレ立てちゃうぞ。

780 :デフォルトの名無しさん:2008/09/10(水) 20:01:11
おむつと空目した。。。

781 :デフォルトの名無しさん:2008/09/10(水) 20:06:28
>>777
gcc で-O3にして最適化させてみたけど、予定してたよりサイズ増えなかったんだよね。

つまり期待以上の最適化はやってないことかな?

782 :デフォルトの名無しさん:2008/09/10(水) 21:37:03
最適化スレへどうぞ。

783 :デフォルトの名無しさん:2008/09/10(水) 21:40:39
>>782
ども

こんなスレあるのねw

784 :デフォルトの名無しさん:2008/09/10(水) 22:09:49
ループアンローリング

785 :デフォルトの名無しさん:2008/09/10(水) 23:21:11
言語別質問スレしかなかったのでこちらでお聞きします
javaとかCをサンプルコードコピペで動かしたことぐらいしかない初心者です
外部からの音声入力を拾ってそれを変数として何か動かすプログラムを書きたいのですが、
C言語で可能でしょうか。
具体的にはマイクの音と連動してウィンドウの色が変わるようなものを考えています。
なんでもいいので、始めるにあたってどうすればよいかご教授願いたいです。
宜しくお願いします。

786 :デフォルトの名無しさん:2008/09/10(水) 23:22:43
OSは?

787 :デフォルトの名無しさん:2008/09/10(水) 23:25:11
できる

まずはウィンドウ作るところからはじめてみたら?

788 :デフォルトの名無しさん:2008/09/10(水) 23:27:07
可能です。難しいけど。
Windowsならばウィンドウ関連のAPIとWave関連のAPIの知識が必要。

789 :785:2008/09/10(水) 23:44:23
>>786
>>787
>>788
レスありがとうございます。可能だということで安心しました。
OSはWindows Vistaです。(linuxなどの環境も用意できます)
とりあえず何もできない状態なのでウィンドウを作るとこからはじめてみたいと思います。
レス頂いたあとで恐縮なのですが、そもそもこのようなプログラムにC言語は向いているのでしょうか
他にもっと向いている言語等あったら教えていただきたいです。

790 :デフォルトの名無しさん:2008/09/10(水) 23:45:22
マイクとかどうやってプログラムと連携させんの?

791 :デフォルトの名無しさん:2008/09/10(水) 23:45:51
今やWindowsプログラミングでCが向いている分野なんて皆無

792 :デフォルトの名無しさん:2008/09/11(木) 00:04:17
Cが向いているのは(移植性とかを除けば)とにかく性能を追求して
かつ開発効率もそれなりに確保したい場合

とにかく動けばいいってんならほかにもっと簡単に作れる言語がいくらもある

793 :デフォルトの名無しさん:2008/09/11(木) 00:06:41
>>791
デバイスドライバはまだまだいけるんじゃない?

794 :デフォルトの名無しさん:2008/09/11(木) 10:26:11
Cをやる意味は9割がた教養

795 :デフォルトの名無しさん:2008/09/11(木) 10:35:08
ffmpegはCで書かれてる。

796 :デフォルトの名無しさん:2008/09/11(木) 11:07:08
>>789
録音ソフトは過去に作ったことあるんだが
waveの録音ならペゾルドの『プログラミングWindows第5版』つー本の下巻にサンプルコードが載っている
言語はC
これをそのままパクれば録音ソフトは作れる
ただ、前提としてCとWindowsプログラミングの知識は必要
俺の場合2年ぐらいかかった

プログラムの方法はともかく、waveデータを扱うならCぐらいの知識は普通に必要なのでやっておいて損はない

797 :デフォルトの名無しさん:2008/09/11(木) 11:22:33
>>790
録音するだけなら8、音声のデータを解析しながら録音するなら7

http://wisdom.sakura.ne.jp/system/winapi/media/index.html


798 :デフォルトの名無しさん:2008/09/11(木) 14:08:52
文字列(数字のみ)で構成されているファイルを読み込んで
文字列を数値に変換して並び替えを行うプログラムを作っているんですけど
文字列を数値に変換をして並び替えを行った結果、
先頭の数字0がなくなった状態で並び替えがされていました。
先頭の数字0がなくならない状態で並び替えを行う方法を教えてください。
お願いします。

例)
先頭の数字0がなくならない並び替え

並び替え前    並び替え後  
00159    0101
130   →  130 
0101     00159

先頭数字0がなくなった並び替え

並び替え前    並び替え後
00159    101
130   →  130 
0101     159

799 :デフォルトの名無しさん:2008/09/11(木) 14:14:43
>>79
意味がわかりません。

プログラム内部では文字列の数字ではなく変換後の数字でしょ?
頭に0なんて付かないけど。

>先頭の数字0がなくならない状態で並び替えを行う方法を教えてください。
数字に直す以上は無理です。


800 :デフォルトの名無しさん:2008/09/11(木) 14:24:20
回答者もレベル低いなあ。
qsortに渡す関数の中でatoiして比較すりゃいいだけなのに。


801 :デフォルトの名無しさん:2008/09/11(木) 14:25:08
>>798
各文字列を残しとけ。int型配列でも作って、そこの数字を並べ替える時に文字列も一緒に並べ変えろ。

802 :デフォルトの名無しさん:2008/09/11(木) 14:27:31
宿題スレにいけよ屑

803 :デフォルトの名無しさん:2008/09/11(木) 14:27:51
>>800
例がたまたまシンプルなだけで、qsortが使えないような場面の話なんじゃないか?

804 :デフォルトの名無しさん:2008/09/11(木) 14:29:17
qsortに渡す関数の中でatoiして比較するとは、何ですか?
詳しく教えてください。
プログラムで例を出していただくと助かりますが・・・

805 :デフォルトの名無しさん:2008/09/11(木) 14:29:38
>>804
宿題スレにいって解答もらってこい

806 :デフォルトの名無しさん:2008/09/11(木) 14:30:21
意訳:課題だるいから早く解答だせよグズ

807 :デフォルトの名無しさん:2008/09/11(木) 14:31:43
>>804
自力でやる気があるなら、これだけの情報で充分できるはずだ。
出来ないまま例を見ても鵜呑みにするだけで理解なんて出来ない。
理解する気がないなら誰かに作ってもらえ。する気があるならチャレンジしろ。



808 :デフォルトの名無しさん:2008/09/11(木) 14:52:40
>>804
qsortとatoiが使えるなら、文字列をどっかに保存しといて、
atoiで並べ変えられた順に文字列並び替えるだけ。
qsortとatoiが使えないなら、
意味調べて自作汁

809 :デフォルトの名無しさん:2008/09/11(木) 14:54:23
×atoiで並べ変えられた順
○qsortで並べ変えられた順

orz

810 :デフォルトの名無しさん:2008/09/11(木) 16:04:07
ここ、一応スレタイ的にも「入門篇」なんだからさ、もちょっと親切にするとかさ。

>>804
qsort でググレカス(AA略

811 :デフォルトの名無しさん:2008/09/11(木) 16:04:52
課題丸投げは入門以前
単位ほしいだけだろ


812 :デフォルトの名無しさん:2008/09/11(木) 16:06:32
課題まるなげなら宿題スレいけば解答もらえますよ
と究極に親切な誘導してあげてるじゃないかw

813 :デフォルトの名無しさん:2008/09/11(木) 17:22:49
C言語の質問か微妙だけど、 K&Rのカーニハンが日本語だいぶうまくなったって本当?

814 :デフォルトの名無しさん:2008/09/11(木) 17:24:15
K&Rのローマ字の挨拶と比べてって事?
どこからそんなレアな話を聞きつけたんだw

815 :デフォルトの名無しさん:2008/09/11(木) 22:48:01
無名の配列とか構造体が使えれば素敵なのに

816 :デフォルトの名無しさん:2008/09/11(木) 23:02:26
struct {
int foo;
} bar;

817 :デフォルトの名無しさん:2008/09/11(木) 23:03:28
よくコードジェネレータが使う手だな

818 :デフォルトの名無しさん:2008/09/11(木) 23:05:01
struct {
int a;
int b;
} arry[] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

819 :デフォルトの名無しさん:2008/09/11(木) 23:08:08
無名の構造体を引数に使いたかった

820 :デフォルトの名無しさん:2008/09/11(木) 23:10:55
>>819
gccじゃあるまいしw

821 :デフォルトの名無しさん:2008/09/11(木) 23:58:58
構造体返す関数作れば?

822 :デフォルトの名無しさん:2008/09/12(金) 00:17:33
typedef struct { int foo; } Foo_t;
Foo_t *
Hoge(Foo_t * piyo);

int main()
{
Foo_t bar = { 10 };

printf("before : bar::foo == %d\n", bar.foo);

Hoge(&bar);
printf("after : bar::foo == %d\n", bar.foo);

return 0;
}

Foo_t *
Hoge(Foo_t * piyo)
{
piyo->foo = 100;

return piyo;
}
なんか違う気がしてきた

823 :デフォルトの名無しさん:2008/09/12(金) 00:22:26
まず無名の構造体じゃないしな

824 :デフォルトの名無しさん:2008/09/12(金) 00:53:59
無名の構造体 != 無名構造体ということですね、わかりません。

void * で渡して ((struct { int foo; } * )piyo)->foo = 100; こうするんですね、わかります。
もう年だからぼけてきているのかもしれない、そろそろマをやめるべきだろうか。
はぁ〜、ありえない・・・でも。

825 :デフォルトの名無しさん:2008/09/12(金) 01:02:35
struct point { int x; int y; };
void hoge(struct point p);

struct point make_point(int x, int y) {
struct point t; t.x=x; t.y=y; return t;
}

int main() {
/* hoge({100,200}); */ /* 無名の構造体を渡したい */
hoge(make_point(100, 200)); /* OK! */
}
だめ?

826 :デフォルトの名無しさん:2008/09/12(金) 01:36:52
タグ無し構造体 != 構造体型の束縛無し変数

827 :デフォルトの名無しさん:2008/09/12(金) 07:26:22
簡単なTCPサーバを作っているのですが、
struct sockaddr_in sin;

inet_aton(addr, &(sin.sin_addr)); /* IPアドレスの設定 */

の、IPアドレスの設定だけを、を別関数で行いたいのですが、どうしたらいいか教えてください。
同じmain関数内で実行するなら上記でいいのですが、
別関数でinet_atonをやりたくて、アドレス渡しでやってみたのですが、うまくできなくて困っています。
できれば、コードを書いていただけると助かります。よろしくお願いします。

828 :デフォルトの名無しさん:2008/09/12(金) 07:38:45
クラスにしてフレンドつける

829 :デフォルトの名無しさん:2008/09/12(金) 07:42:55
>>828
スレ違い。

830 :デフォルトの名無しさん:2008/09/12(金) 10:06:05
構造体を使う練習をしているのですが、初回のwhileループはうまくいくんですが、
2回目以降、名前を入力すると、出力がおかしい事になります。
どういうことですか?
#include<stdio.h>
typedef struct seiseki{
char name[20];
int kokugo;
int sansuu;
}Seiseki;

int main(void)
{
Seiseki a[3];
Seiseki *ap = a;
while(1){
printf("生徒名,国語,算数の順に入力してください\n");
gets(ap->name);
scanf("%d",&ap->kokugo);
scanf("%d",&ap->sansuu);
printf("出力:生徒名%s,国語%d,算数%d\n",ap->name,ap->kokugo,ap->sansuu);
++ap;
}
return 0;
}

831 :デフォルトの名無しさん:2008/09/12(金) 10:13:50
>>830
scanfで残った改行が次のgetsで読みこまれる

832 :デフォルトの名無しさん:2008/09/12(金) 10:13:57
>>827
構造体と関数でぐぐれ

833 :デフォルトの名無しさん:2008/09/12(金) 10:15:47
>>830
scanf の後 \n が入力バッファに残っている

834 :デフォルトの名無しさん:2008/09/12(金) 10:20:24
ぐぐるとscanf()の前か後ろにfflush()
を入れてるサンプルが

835 :デフォルトの名無しさん:2008/09/12(金) 10:27:04
>>834
それM$独自の拡張だから
gccでやったら未定義の動作

836 :デフォルトの名無しさん:2008/09/12(金) 10:56:16
いや、bccだけど

837 :830:2008/09/12(金) 10:56:33
>831,833
有難うございます。

838 :デフォルトの名無しさん:2008/09/12(金) 11:01:48
>>836
C++Builderのヘルプより

int fflush(FILE *stream);
The function writes any buffered output to the file associated with the
stream stream and returns zero if successful; otherwise, it returns EOF.
If stream is a null pointer, fflush writes any buffered output to all files
opened for output.

というわけで入力バッファに適用した場合にどうなるとは一言も書かれていない。
メーカーが書いてないんだから実際はM$準拠であれ未定義動作と見た方がよい。


839 :デフォルトの名無しさん:2008/09/12(金) 11:52:58
普通に読み捨てでいいじゃん


840 :デフォルトの名無しさん:2008/09/12(金) 11:57:43
どうやって読み捨てるんだよ

841 :デフォルトの名無しさん:2008/09/12(金) 12:59:13
scanf("%d",&ap->sansuu); 
gets(dummy);

842 :デフォルトの名無しさん:2008/09/12(金) 14:18:59
scanf("%d",&ap->sansuu);
getchar();


843 :デフォルトの名無しさん:2008/09/12(金) 16:04:54
C-dとかC-zで入力きられたらどうすんだよ

844 :デフォルトの名無しさん:2008/09/12(金) 16:23:10
>>843
残念な思いでいっぱいになる。

845 :デフォルトの名無しさん:2008/09/12(金) 16:27:20
typedef struct{
  int x, y;
}POINT;

void Test(char *data)
{
  int pt = (int)*data; //エラーはでない。
}

void Test2(char *data)
{
  POINT pt = (POINT)*data; //エラーになります。何故ですか?
}

error C2440: '型キャスト' : 'char' から 'POINT' に変換できません。

846 :デフォルトの名無しさん:2008/09/12(金) 16:42:06
>>845
エラーメッセージのとおり。
>>  int pt = (int)*data; //エラーはでない。
「*data」はchar型 (=1バイトの整数型) なので
int に変換して代入できる。

>>  POINT pt = (POINT)*data; //エラーになります。何故ですか?
「*data」はchar型なので
POINT構造体には変換できない。

847 :デフォルトの名無しさん:2008/09/12(金) 17:06:19
>>845
これがエラーになるのと同じ
char ch = *data;
POINT pt = (POINT) ch; // ←これ

本当にやりたいのはこうではないか?
POINT pt = *(POINT*)data;

848 :デフォルトの名無しさん:2008/09/12(金) 17:06:57
>>846
charは1バイトの整数型だから
intやdoubleに変換できるが、構造体には変換できないということですよね?
それは何故なんでしょう?

void Test2(char *data)
{
  POINT *p = (POINT*)data;
  POINT pt = *p;
}

こうするとエラーがでないのは、ポインタには型の区別がないということですか?

849 :デフォルトの名無しさん:2008/09/12(金) 17:10:01
>>847
ああ、なるほど。よく分かりました。
構造体の型でキャストというのが意味不明でしたね。
ありがとうございました。

850 :デフォルトの名無しさん:2008/09/12(金) 17:19:55
>ポインタには型の区別がないということですか?
ないわけではないが、変換可能
キャストするとはそういうこと

851 :デフォルトの名無しさん:2008/09/12(金) 22:32:18
(int)data や (double)data ってキャストは出来るのに
(struct hoge)data ってキャストできないのは何でだろう。

852 :デフォルトの名無しさん:2008/09/12(金) 22:34:37
>>851
どうやって変換したらいいか判らないからです。
例えば、struct tm dataだったら(int) dataもできません。

C++なら教えることができるので、ちゃんと変換してくれます。

853 :デフォルトの名無しさん:2008/09/12(金) 22:45:16
理科大ナンバーがあったら恥ずかしいなw

854 :デフォルトの名無しさん:2008/09/13(土) 00:07:08
誤爆?

855 :デフォルトの名無しさん:2008/09/13(土) 00:32:17
理科大ナンバーってなんだ?


856 :デフォルトの名無しさん:2008/09/13(土) 00:42:34
岡山理科大学の学籍番号

857 :デフォルトの名無しさん:2008/09/13(土) 02:13:55
意味わからん

858 :デフォルトの名無しさん:2008/09/13(土) 16:14:35
構造体と関数でぐぐって
>>827 をもう一度試したのですがうまくいきません。
どなたかお願いします。

859 :デフォルトの名無しさん:2008/09/13(土) 16:34:08
>>858
ttp://cai.int-univ.com/sugsi/Lecture/NetProg/chapter3/struct.html

860 :デフォルトの名無しさん:2008/09/13(土) 19:30:44
>>851
どんな結果を期待しているんだ?

861 :デフォルトの名無しさん:2008/09/13(土) 21:31:19
>>859
同じ関数内でstruct sockaddr_in aaaを宣言して
inet_atonは普通にできるのはわかるのですが、
mein関数でstruct sockaddr_in aaaを宣言し、
別関数で、構造体の中身(aaa.sin_addr)の値を変更したいのです。

アドレス渡しで試してみたのですが、sin_addrが存在しない的なエラーが出て
うまくいかないのです。
構造体 関数等でググってうまくいかないので質問させていただきました。
どなたかお願いします。教えてください。

862 :デフォルトの名無しさん:2008/09/13(土) 21:45:25
>>861
<使い方>

例:192.168.0.10をsockaddr_in構造体に設定する場合

struct sockaddr_in serv;

inet_aton("192.168.0.10", &(serv.sin_addr));

863 :デフォルトの名無しさん:2008/09/13(土) 21:55:41
int hoge(struct sockaddr_in *bbb, char *addr)
{
inet_aton(addr, &(bbb->sin_addr));
return 0;
}

int main()
{
struct sockaddr_in aaa;
char *str = "192.168.0.10";
hoge(&aaa, str);
return 0;
}

864 :デフォルトの名無しさん:2008/09/14(日) 09:38:35
"○○","××"みたいな形式の2つのデータ群のファイルをそれぞれ別の配列に入れて計算したいのですが
どのようにすればいいのでしょうか?
fgetsで1行読み込んで「,」で区切る方法がいいんでしょうがよくわかりません

865 :デフォルトの名無しさん:2008/09/14(日) 09:47:17
>>864
strtok
sscanf
好きなの使え
まぁそもそも一行目がいまいち何言ってんのかわかんないけど

866 :デフォルトの名無しさん:2008/09/14(日) 09:59:06
>>865
16.67188,1.875e-003,
16.67188,1.1875e-002,
16.68188,-8.125e-003,
16.66188,-2.8125e-002,

こんな感じのデータが延々と続いてる奴で、左側のデータと右側のデータを別々の配列に入れたいというわけです

867 :デフォルトの名無しさん:2008/09/14(日) 10:32:21
scanfだな

868 :デフォルトの名無しさん:2008/09/14(日) 12:09:39
>>864>>866
ファイルから一文字一文字読み込めるだろー?
char buf[128]とかして、
@区切り文字までをbufにいれる
Abufから配列にこぴ〜
Bbufくりあ
Cgoto @
でいいんでね?

>>866のデータ見ると、sprintfは使えないだろうからなぁ
eを処理する関数も必要かもに

869 :デフォルトの名無しさん:2008/09/14(日) 12:17:59
>>868
馬鹿は回答しなくても構わないんですよ。

>>866
sscanf()で"%[^,]"で変換するか、strtok()で切り出すか。

870 :デフォルトの名無しさん:2008/09/14(日) 12:23:06
atof?

871 :デフォルトの名無しさん:2008/09/14(日) 12:31:37
ハッシュ法を使わないといけなくなったんですけど
オススメのアルゴリズム関係の書籍がありましたら教えて下さい
よろしくお願いします

872 :デフォルトの名無しさん:2008/09/14(日) 12:41:08
データを20数bitに変換するだけだよ。
たとえば、CRC32でも使えばいい。
衝突したらずらしたり、別領域に記録するんだよ

873 :デフォルトの名無しさん:2008/09/14(日) 12:47:09
>>869
scanf()系の書式指定、忘れたけど、
"%f,"とかでいいんじゃね?

874 :デフォルトの名無しさん:2008/09/14(日) 12:48:36
>>871
amazonで、アルゴリズムとかで検索して、星がたくさんついてるのを選んだら?

875 :864:2008/09/14(日) 12:54:49
レスありがとうございます。sscanfでとりあえず挑戦してみようと思います

876 :デフォルトの名無しさん:2008/09/14(日) 16:10:44
文字列として読み込みたいのか数値として読み込みたいのかはっきりしろ

877 :デフォルトの名無しさん:2008/09/14(日) 17:04:35
質問文見た限り文字列にしか見えんが
なぜか%fとか提案してる人がいるだけで

878 :デフォルトの名無しさん:2008/09/14(日) 17:05:54
でも普通文字列に対して計算したいって表現は使わない

879 :デフォルトの名無しさん:2008/09/14(日) 17:05:54
どのあたりで文字列だとしか思えないんでしょうか?

880 :デフォルトの名無しさん:2008/09/14(日) 17:21:35
いつものrfc4180がらみにネタに発展しそう。wkwk
スルーカが試されているのか?
(そういう俺はスルーできていない)

881 :デフォルトの名無しさん:2008/09/14(日) 18:21:55
予告なしのスルー検定がしばしば開催される

882 :デフォルトの名無しさん:2008/09/14(日) 19:09:41
>>875
アホ
sscanf する前の文字列をどうやってとるねん
バッファリミットはどこから取る気じゃ
思いっきり処理系依存するぞ

883 :デフォルトの名無しさん:2008/09/14(日) 19:13:25
スルーしようぜ

884 :デフォルトの名無しさん:2008/09/14(日) 20:20:43
おまえをな

885 :デフォルトの名無しさん:2008/09/14(日) 20:35:31
バッファリミットって、なにだろう。

886 :デフォルトの名無しさん:2008/09/14(日) 21:18:09
今作っているものが二重インクルードになってコンパイル出来ないんだ

hoge.c
#include "aa.h"

hoge2.c
#include "aa.h"

aa.h
#ifndef __INCLUDED_AA_H
#define __INCLUDED_AA_H
宣言とか
#endif

これでエラーになるんだけれど、何が悪いのかな?

887 :デフォルトの名無しさん:2008/09/14(日) 21:27:58
コピペに失敗したとか?

888 :デフォルトの名無しさん:2008/09/14(日) 21:38:35
てか別のファイルなら・・・

889 :デフォルトの名無しさん:2008/09/14(日) 21:38:47
>>885
おまえは知らなくていい
この板に来なくてもいい

890 :デフォルトの名無しさん:2008/09/14(日) 21:39:57
【社会】ソフト開発・秘書・通訳etc…「日雇い派遣」を例外的に認める18業務 - 厚労省案★3
http://mamono.2ch.net/test/read.cgi/newsplus/1221382248/

891 :デフォルトの名無しさん:2008/09/14(日) 21:43:27
>>889
突っ込まれるのが怖くて説明できないんですね。わかります。

892 :デフォルトの名無しさん:2008/09/14(日) 22:20:21
>>891
いーや、>>882 の文脈から「バッファリミット」の意味を見当もつけられない完全素人はまず「入門」してからこのスレに来いという意味だ

893 :デフォルトの名無しさん:2008/09/14(日) 22:22:26
>>886
再現する最小のソースセットうp!

894 :デフォルトの名無しさん:2008/09/14(日) 22:25:26
バッファリミット関係ないだろ? だから意味が分からない。

895 :デフォルトの名無しさん:2008/09/14(日) 22:31:04
>>894
お前誰だ?
俺は >>882>>864=>>866 の用途に sscanf を使うことに否定の立場を示している
そこへ自分の立場を隠したまま頓珍漢なレスを返してきた >>891 を完全に馬鹿にしているところだが、
その馬鹿か、おまえは?

896 :デフォルトの名無しさん:2008/09/14(日) 22:36:14
>>895
> 俺は >>882>>864=>>866 の用途に sscanf を使うことに否定の立場を示している

おまえだって、今の今まで言ってなかっただろよ。
人に「立場を隠したまま」とか言うなよ。
だいたいこの問題に、立場とかどう関係してんだよ。


897 :デフォルトの名無しさん:2008/09/14(日) 22:37:52
>>896
やっぱり、あの馬鹿だったか
バッファリミットもアホも読めてない奴に説明なんかするか
チンパンジーに因数分解を教えるより面倒臭い

898 :デフォルトの名無しさん:2008/09/14(日) 22:39:26
だいたい、急に「バッファリミット」とかって言葉を持ち出したのは自分なんだから、人にエスパーを発揮するのを期待しないで、
自分で説明すればそれで済むことだろ。


899 :デフォルトの名無しさん:2008/09/14(日) 22:39:40
>896がスルーされているのに気付けないのが哀れでならない。

900 :デフォルトの名無しさん:2008/09/14(日) 22:42:21
なんだよ。結局説明できないのか。
ツッコミされるの怖がりすぎだろ。


901 :デフォルトの名無しさん:2008/09/14(日) 22:44:29
>>898
いーや、sscanf を使う場合のコードが想像できることは、この問題を議論する論客として最低限の資格だ
質問する気にしても、人にものを尋ねるときの態度がまるでなっておらず、質問者として最低限の資格もおまえは備えていない

繰り返すがチンパンジーには無理な問題だ
あきらめて帰れ

902 :デフォルトの名無しさん:2008/09/14(日) 22:51:20
人をチンパンジーとか煽るやつが、他人に「態度」とかいうなって。
もうどうでもいいけど、こういう技術系の話題で、あおり芸で切り抜けたつもりになってるやつって、悲しくないのかね。

ほんの数行説明すればすむ話をめんどくさいと言って、避けまくって、煽りだけはめんどくさがらずにひたすら続けてるんだもんなぁ。

903 :デフォルトの名無しさん:2008/09/14(日) 22:51:56
>>886
エラーメッセージの内容くらい書け

904 :デフォルトの名無しさん:2008/09/14(日) 22:57:14
>>902
バッファリミットの話はどうした?
あいかわらず想像もできていないようだが、事実を指摘されるのが悔しければこれ以上粘るのは得策ではないぞ

それから、説明するかどうかは回答者の自由意志によるもので、その態度で言い返し続けたあげくには何も得る物がないぞ

905 :デフォルトの名無しさん:2008/09/14(日) 22:57:57
"バッファリミット" に一致する日本語のページ 8 件中 1 - 8 件目 (0.26 秒)

906 :デフォルトの名無しさん:2008/09/14(日) 22:58:15
ほんの数行だってよ、説明したら一行だよバーカ

907 :デフォルトの名無しさん:2008/09/14(日) 22:58:24
横槍すまん。

http://ja.wikipedia.org/wiki/Scanf

のバッファオーバーランの節とか見ればいいんでしょ。
注意しないと落ちちゃうし、固定で切った後の処理考えるのが面倒だよね。
違ってたらごめん。

908 :デフォルトの名無しさん:2008/09/14(日) 23:02:01
>>904
だから、それは「バッファリミット」を言い出したほうが説明するのが先だろ。
なんで周囲が、あれこれ推測してあげなきゃならないんだよ。

909 :デフォルトの名無しさん:2008/09/14(日) 23:02:38
>>908
>>901

910 :デフォルトの名無しさん:2008/09/14(日) 23:03:19
自分勝手な造語で喋っちゃうあたりからして、
人に分からせようとする気がないことが容易に推測できる。

無視するのが吉。

911 :デフォルトの名無しさん:2008/09/14(日) 23:04:03
>>904
>説明するかどうかは回答者の自由意志によるもので、

だったら「バッファリミットの話はどうした?」って煽るなよ。
お前が説明する気がなかったら、それ以上話は進まないよ。


912 :デフォルトの名無しさん:2008/09/14(日) 23:04:34
やーいバッファリミット野郎!

”バッファリミット”の検索結果 8 件中 1 - 8 件目 (0.14 秒)

913 :デフォルトの名無しさん:2008/09/14(日) 23:04:54
char buf[200];
fgets(buf, sizeof(buf), fp);
char col1[20], col2[20];
sscanf(buf, "%99[^,],%99[^,]", col1, col2);
と言うコードがあったとして、バッファオーバランは発生しないし、バッファリミットとやらがどう関係するのかも判らない。
まぁ、col1, col2がそれぞれ実数と言う解釈でいいのならfloat col1, col2; sscanf(buf, "%f,%f", & col1, & col2);でいいわけだけど。
# それ以前に、1行200バイトが妥当かどうかも考慮する必要はあるな。

914 :デフォルトの名無しさん:2008/09/14(日) 23:07:11
>>913
%19 っしょ?

915 :デフォルトの名無しさん:2008/09/14(日) 23:08:31
うん、そうだね。寧ろ、col1[100], col2[100]だろうけど。

916 :デフォルトの名無しさん:2008/09/14(日) 23:10:54
>>911
そのとおり、話を進める気なんぞ >>885 の時点から毛頭なかったが、
おまえ何を前提にレス書いて(≠話して)いたんだ?

917 :デフォルトの名無しさん:2008/09/14(日) 23:13:00
>>913
バッファリミットって、このコードで、200文字以上の行があった場合のことかな?

918 :デフォルトの名無しさん:2008/09/14(日) 23:13:46
>>916
ふーん。そんなにツッコミを怖がらなくてもいいのに。

919 :デフォルトの名無しさん:2008/09/14(日) 23:15:21
言い出したやつが説明する気ないから、永遠になぞか。

920 :デフォルトの名無しさん:2008/09/14(日) 23:15:23
>>918
コード書けない奴は邪魔なんだよ

921 :デフォルトの名無しさん:2008/09/14(日) 23:15:26
イヤーつまんなかった。

922 :デフォルトの名無しさん:2008/09/14(日) 23:16:16
>>919
そのとおり
知りたいことが聞き出せなくて残念だったな

923 :デフォルトの名無しさん:2008/09/14(日) 23:18:16
>>922
いや、どうせ脳内で見当違いのことを考えてるだけだろうから、どうでもいいよ。

924 :デフォルトの名無しさん:2008/09/14(日) 23:18:33
とまあこうしてこのスレの新参たちはキチガイに慣らされていくのであります

925 :デフォルトの名無しさん:2008/09/14(日) 23:19:20
>>923
おまえイソップのキツネだな

926 :デフォルトの名無しさん:2008/09/14(日) 23:23:18
>>925
でも、ここまで煮詰まってるし、二人以外に何人か参加してるし、もしなんか
「普通のPGならとうぜん知ってるけど、俺が知らないだけ」みたいな点があったら、
なんかツッコミが入ってるだろうけど、そういうのないし、まぁ、あんたがシッタカしてるだけでしょ。

927 :デフォルトの名無しさん:2008/09/14(日) 23:24:48
ここまで俺の自作自演

928 :デフォルトの名無しさん:2008/09/14(日) 23:25:54
文字列切り出して、atof使えばいいじゃないの?

929 :デフォルトの名無しさん:2008/09/14(日) 23:26:55
構造体はなぜ

struct XXX {
        int hoge;
};

ではなく

typedef struct {
        int hoge;
} XXX;

と書くのでしょうか?
Cで書いたものもC++でコンパイルすればいいと思うのですが。

930 :デフォルトの名無しさん:2008/09/14(日) 23:28:59
>>926
イソップのキツネと言われた後の発言としては気が狂ったとしか思えんが
そのツッコミもまたまた読めてないわけで、チンパンジーとキツネの悪いとこ取りで多重継承してる奴だな

931 :デフォルトの名無しさん:2008/09/14(日) 23:29:07
>>929
それは単に定義と同時にtypedefをするかどうかの違い
スタイルの話だからなぜもくそもない

932 :デフォルトの名無しさん:2008/09/14(日) 23:29:40
別に前者で構わないよ

933 :デフォルトの名無しさん:2008/09/14(日) 23:31:54
>>929
ん、俺は素では前者で書くぞ
現実には諸般の事情から後者の頻度が高いけどね

C++ も然り、諸般の事情で C 限定の場合がある

934 :デフォルトの名無しさん:2008/09/14(日) 23:33:37
>>926
いや、こいつが何を言いたいかはわかるよ、当然注意すべきことだしね
バッファリミットなんて言葉を使っちゃうアホさと無駄に相手を煽るキチガイさは動かんけど

935 :デフォルトの名無しさん:2008/09/14(日) 23:37:56
>>934
強制 ID 板じゃなくてよかったな

936 :デフォルトの名無しさん:2008/09/14(日) 23:40:18
なんか荒れてるなぁ・・・。
とりあえず、バッファリミットって言葉は知らんが、
普通、スタックオーバーとか言うね。
sscanfってのは、制限無く書式通りの型を指定先のバッファにぶち込む。
それを知らんで、素人はスタック(≒用意したメモリ領域)を良くぶっ壊してたりするもんさ。
コンパイラチェック入ってないと、何もエラー出んから知らないままいることが多いね。
しかも、普通に動くこと多いんでバグが発見しづらいのが最悪な点かな。

例えば、
char destBuf;
sscanf(srcbuf,"data=%d",&destBuf)
とすると、
sscanfはint(%d)型のバイト数を値をsrcBufからdestbufにコピーする。
で、int型ってのは処理系依存で、2〜4byteで不定なもんだから使いにくいのよ。

937 :デフォルトの名無しさん:2008/09/14(日) 23:41:35
またバカが増えやがった
これ以上ややこしくすんな

938 :デフォルトの名無しさん:2008/09/14(日) 23:42:46
>>929
単に「Cで書く」って決まってるプロジェクトで、C++のコードを混ぜたらまずいじゃん。

939 :デフォルトの名無しさん:2008/09/14(日) 23:44:12
ちなみに
>>936のサンプルソースは、最近新人が書いたもの。
既に、destBuf(char型)の後方3バイトを壊して、
他の処理系に異常を出した例。
正しくは、char destBuf→unsigned long destBufにせんといかんだけ

こういう事は気づかん所で良くあるねぇ

940 :デフォルトの名無しさん:2008/09/14(日) 23:46:30
>>939
%d int
%hd short int
%ld long int

char を受けるのは無いな

941 :デフォルトの名無しさん:2008/09/14(日) 23:47:28
>>941
残念、%c があるんだな(笑

942 :デフォルトの名無しさん:2008/09/14(日) 23:47:45
>>936
> sscanfはint(%d)型のバイト数を値をsrcBufからdestbufにコピーする。
> で、int型ってのは処理系依存で、2〜4byteで不定なもんだから使いにくいのよ。

絶対なんか勘違いしてる。



943 :デフォルトの名無しさん:2008/09/14(日) 23:48:12
>>939
釣りはもっと上手くやれ

944 :デフォルトの名無しさん:2008/09/14(日) 23:49:00
>>941
おいw

945 :デフォルトの名無しさん:2008/09/14(日) 23:51:55
>>929
自己レスです。
でもtypedefしたないものは自分は見たことないです。
別にCで書くとかそんな決め事ないケースばかりです。
スタイルだけの問題なんでしょうか?
実際的なメリットがあってそうしているのではないかと思うのですが。

自分で考えると

○ Cにしたときにtypedefのが問題がない
× typedefすると無名ができたり似たような名前が二つ出てきたりで面倒

といった感じです。C++では構造体はclassみたいになるし、シンボルも
違ってくると思います。その辺が絡んだメリット/デメリットがあるのかと
思うのですが、どうにも思いつきませんでした。読んでる限りだと実際ないのか
と思い始め、、、そうなの?

946 :デフォルトの名無しさん:2008/09/14(日) 23:54:41
>>945
typedef struct tag_XXX {
        int hoge;
} XXX;
をオススメする

947 :デフォルトの名無しさん:2008/09/14(日) 23:56:30
>>945
今、見たことなくても、そのうち見ることあるんじゃないか?
大した理由は俺の知る限りないぞ

ところで typedef の問題ってよくわからんのだが、具体的なコード例は示せるか?

948 :デフォルトの名無しさん:2008/09/14(日) 23:58:35
>>939
%dなのにunsignedで受けたらダメじゃん。

949 :デフォルトの名無しさん:2008/09/15(月) 00:00:22
>>944
すまん。誤爆した(w

>>945
typedef ・・しておけば、変数のように構造体を使えるので
通常の記述はそうする。
・typedef していない→struct 型名 変数名;
・typedef している →型名 変数名;

950 :デフォルトの名無しさん:2008/09/15(月) 00:03:27
>>949
いや、C++だと、typedefなくても、宣言のときにstractなしでできるのに、自分の見たコードは、
typedefしてあって、それはなぜでしょうか? って話だろ?

951 :デフォルトの名無しさん:2008/09/15(月) 00:04:31
>>948
細かいところによく気がついてくれた。ありがとう!
誰も突っ込んでくれないんで、どうしようかと oTL オジサン寂しいのん

では、オヤスミ

952 :デフォルトの名無しさん:2008/09/15(月) 00:05:04
>>947
Visual Studioなどで、正しく二つ分表示されるのが鬱陶しい。
ソースを元に簡単な解析をしたいときに鬱陶しい。
コード例ではないんですが。。。

953 :デフォルトの名無しさん:2008/09/15(月) 00:11:03
>>952
ソースを解析するときは逆に typedef で struct を隠されると「鬱陶しい」よな
例えば jmp_buf みたいに構造体ではなく配列であることがミソなコードが読みづらかったりする

954 :デフォルトの名無しさん:2008/09/15(月) 00:11:06
>>940
C99だと%hhdが使える。

955 :デフォルトの名無しさん:2008/09/15(月) 00:12:22
enum って、なんて読めばいいんですか?

956 :デフォルトの名無しさん:2008/09/15(月) 00:12:38
>>945
Cの構造体(共用体も)の宣言はC++とは異なり、構造体タグを自動で typedef しないことを理解しているか。
Cで書くとはCコンパイラでコンパイルできるということで、C++コンパイラでしかコンパイルできないならそれはC++のコードである。
(実質的に) typedef することはキーワード struct を省略することである。それ以上でもそれ以下でもない。

957 :デフォルトの名無しさん:2008/09/15(月) 00:13:39
>>955
いにゅーむ

958 :デフォルトの名無しさん:2008/09/15(月) 00:17:43
ちなみに構造体タグとtypedefは別の名前空間だから
typedef struct hoge{

}hoge;
とかできる

959 :デフォルトの名無しさん:2008/09/15(月) 00:18:47
>>955
いーなむ

960 :デフォルトの名無しさん:2008/09/15(月) 00:20:17
>955
http://dictionary.goo.ne.jp/search.php?MT=enum&kind=ej&mode=0&base=1&row=1

961 :デフォルトの名無しさん:2008/09/15(月) 00:21:25
http://dictionary.goo.ne.jp/voice/e/01011190.wav

962 :デフォルトの名無しさん:2008/09/15(月) 00:21:52
俺はえなむって読んでいる

963 :デフォルトの名無しさん:2008/09/15(月) 00:22:50
>>956
> Cの構造体(共用体も)の宣言はC++とは異なり、構造体タグを自動で
> typedef しないことを理解しているか

いいえ。C++ではtypedefしているのですか?

> Cで書くとはCコンパイラでコンパイルできるということで、C++
> コンパイラでしかコンパイルできないならそれはC++のコードである。
> (実質的に) typedef することはキーワード struct を省略する
> ことである。それ以上でもそれ以下でもない。

つまりメリットはそこにしかないということですね。

964 :デフォルトの名無しさん:2008/09/15(月) 00:23:27
ちゃー
すきゃんふ

965 :デフォルトの名無しさん:2008/09/15(月) 00:48:44
自分だけのソースコードなら好きにすればいい。
他人に読み書きさせるソースコードなら。

このソースは一部C++の機能を使っているので、
C++でコンパイルしてくれと但し書きをしなければならない。

966 :デフォルトの名無しさん:2008/09/15(月) 01:13:48
C言語で核ミサイルが作りたいんですけど、どうすればいいですか?

967 :デフォルトの名無しさん:2008/09/15(月) 01:16:49
書くミサイルなら

968 :デフォルトの名無しさん:2008/09/15(月) 01:17:34
>>966


core

できそこないのプログラムなら得意だろ

969 :デフォルトの名無しさん:2008/09/15(月) 01:26:41
C言語の基礎をようやく覚えた者です。
Cのソースコード集みたいな本は売ってませんでしょうか?
どの方向に使っていくかも決まっていないので
いろんなジャンルのソースがみたいです。
サイト上のページでもいいのですが
本は落ち着いて勉強できますので。


970 :デフォルトの名無しさん:2008/09/15(月) 01:34:00
>>969
アルゴリズムとデータ構造

971 :デフォルトの名無しさん:2008/09/15(月) 01:36:44
本ではないのだけど
FreeBSDのlsなどのコマンドのソースコードはどうでしょうかね

ls http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/ls/
echo http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/echo/

http://www.freebsd.org/cgi/cvsweb.cgi/src/binに一覧のディレクトリ

972 :デフォルトの名無しさん:2008/09/15(月) 01:39:43
標準関数のソースとかは?

973 :デフォルトの名無しさん:2008/09/15(月) 02:23:11
俺がアニメ見てる間にこのスレ盛り上がってたんだな orz 少し参加したかった

974 :デフォルトの名無しさん:2008/09/15(月) 02:48:22
>>970
>>971
ありがとん。
>>972
ググってみたやつですどこういうのでしょうか?
http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/stdio/Attic/?cvsroot=glibc
ちょっとまだ手に負えません。本を読んで理解したいと思います。

975 :デフォルトの名無しさん:2008/09/15(月) 03:23:51
右手にプログラムを
左手にあなたの髪を

976 :デフォルトの名無しさん:2008/09/15(月) 09:41:36
http://msdn.microsoft.com/ja-jp/library/cc429052.aspx
ここの下のほうのコードH 5行目に
> lpMetSect->lpSharedInfo->lAvailableCount*;
とあるのですが最後のアスタリスクはいったい何なんですか?
そういう単項演算子があるのでしょうか?
よろしくお願いします

977 :デフォルトの名無しさん:2008/09/15(月) 10:07:59
>>976
http://msdn.microsoft.com/en-us/library/ms810428.aspx

原文だと、それは--になってるな。

978 :デフォルトの名無しさん:2008/09/15(月) 10:33:32
num と value って何か違いますか?
どっち使いますか

979 :デフォルトの名無しさん:2008/09/15(月) 10:49:13
>>977
翻訳の間違いでしたか
ありがとうございます

980 :デフォルトの名無しさん:2008/09/15(月) 11:36:08
くそぅバッファリミット祭りに乗り遅れたぜ

981 :デフォルトの名無しさん:2008/09/15(月) 11:39:18
次スレ立ててくる

982 :デフォルトの名無しさん:2008/09/15(月) 11:41:25
C言語なら俺に聞け(入門篇) Part 36
http://pc11.2ch.net/test/read.cgi/tech/1221446435/

983 :デフォルトの名無しさん:2008/09/15(月) 13:15:06
>>982


984 :デフォルトの名無しさん:2008/09/15(月) 13:52:36
>>978
辞書引け

985 :デフォルトの名無しさん:2008/09/15(月) 19:24:49
関数の宣言を書くときに一緒にコメント書くの?
それとも定義のところで書くから宣言時はいらない?

986 :デフォルトの名無しさん:2008/09/15(月) 19:31:41
上司に訊いてください

987 :デフォルトの名無しさん:2008/09/15(月) 20:19:13
>>985は一般的にはどうするのかということです。

988 :デフォルトの名無しさん:2008/09/15(月) 20:29:06
コメントの保守できるの?

989 :デフォルトの名無しさん:2008/09/15(月) 20:33:39
>>985
一般的にどうするなんてものはない。
コメントの書き方の一流派でいいならDoxygenでも参考にしとけ。

990 :デフォルトの名無しさん:2008/09/15(月) 20:34:58
>>987
まさに>>986だよ
仕事でやるならコーディング規則だとかコメント規則(笑
とかあるよ。

ころころこれが変わる職場に行ったことがあって、
うっかり修正漏れ(影響ないんだけど)があって
システムが原因不明のトラブルの際に
怒鳴られたことさえあったよwww



991 :デフォルトの名無しさん:2008/09/15(月) 20:37:19
小学生の怪我自慢じゃないんだから、そんなこと言わなくていいです。

992 :デフォルトの名無しさん:2008/09/15(月) 20:39:26
小物ライブラリならヘッダのコメントとして使い方を書いちゃうのもありだし
ちゃんとしたリファレンスを用意するならヘッダには何も書かずにただcopyright表記だけ書いておけばいい。

993 :デフォルトの名無しさん:2008/09/15(月) 23:47:01
ライブラリを配布するだけならヘッダに使用に支障の無い程度の情報を書く。

定義ファイルへはメンテする人のためのコメントを書く。

あとは自動ドキュメント作成ツールやらコーディング規則と相談。

994 :デフォルトの名無しさん:2008/09/16(火) 00:21:55
スタイルにおいて常に、かつ最も重要なことは、「なぜそう書くのか」を即答しうるかどうかである。
明確な、君がそうするべきと信ずる十分な理由があるなら、そうすることをためらう必要はない。
けして唯一絶対の理由である必要はない。スタイルに唯一絶対の正解は存在しないからである。

しかし特に理由がないのなら、皆がやっているものに合わせるべきである。

995 :デフォルトの名無しさん:2008/09/16(火) 01:03:52
インデントや括弧付けについては整形ツールを通すことで簡単に統一できるが、
命名規則は気をつけないと 動詞+名詞 と 名詞+動詞 が入り混じってしまう

vectorSetValue
vectorValueSet
setVectorValue
setValueVector // これは無いが…

996 :デフォルトの名無しさん:2008/09/16(火) 22:18:32
任意の型をmemset以外で再度0初期化する方法ってある?
val = (type)0; ではだめかな


997 :デフォルトの名無しさん:2008/09/16(火) 22:21:37
>>996
bzero

998 :デフォルトの名無しさん:2008/09/16(火) 22:30:15
>>996
static const someStruct zeroSome = {0};
を用意しておいて、適宜
someStruct foo = zeroSome;
のように代入する。

999 :デフォルトの名無しさん:2008/09/16(火) 22:38:26
999げと

1000 :デフォルトの名無しさん:2008/09/16(火) 22:46:34
ume

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

212 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)