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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん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
0002デフォルトの名無しさん2008/08/26(火) 23:46:22
>>1乙
0003デフォルトの名無しさん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: : : : : :.\
0004デフォルトの名無しさん2008/08/27(水) 00:36:44
1乙
0005デフォルトの名無しさん2008/08/27(水) 03:47:14
見事 毎度キチガイ認定を受けてきたロールに
戦慄走る――

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

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

しかし
過去最狂のキチガイAAを据えてすら天秤の対として軽すぎる程の狂気を持つ気狂!!!
遥か膨大なやなせイズムを内包する怪物!!!
                         ____
 前代未聞の経験である         /  R /\
                       /   /\  \
                      |  / /=ヽ \U |
                      |/ (゚)::::(゚)u \|
                      \ι─ ゝ── ノ
                        \____/
0006デフォルトの名無しさん2008/08/27(水) 05:29:53
1乙です。
質問です。main関数の処理が終了して、また最初の処理に戻すにはどうすればいいのでしょうか?
switch文を使って、「プログラムを終了しますか?(Y/N)」のような終了の仕方にしたいので。
0007デフォルトの名無しさん2008/08/27(水) 05:34:33
そういう場合はmain関数の中でwhileなどでループする部分を作っておいて
その中で処理をさせる・・・かな?

void main()
{

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

}

}

プログラムを終了させたい場合はwhileを抜ける処理を条件判定を入れて
書いておけばOK
0008デフォルトの名無しさん2008/08/27(水) 05:35:45
全処理を無限ループで囲んでifで抜けるようにするとか
0009デフォルトの名無しさん2008/08/27(水) 05:37:13
>>6
whileループの中に入れる。
「プログラムを終了しますか?(Y/N)」でYが入力されたら、breakする。
続行するか終了するかの制御変数を用いてもよい。
0010デフォルトの名無しさん2008/08/27(水) 05:38:06
goto文を使うとか
0011デフォルトの名無しさん2008/08/27(水) 05:46:10
早朝から沢山のレスありがとうございます。
while文の無限ループを使うってのは理解したんですが、
<<また始めの処理に戻す>>やり方がわかりません。
>>10さんのgoto文を使うやり方くらいしかないのかな?
0012112008/08/27(水) 05:47:42
すみません自己解決しました。
無限ループをすべての処理に適用させるわけですね。
ありがとうございます。
0013デフォルトの名無しさん2008/08/27(水) 10:46:40
なんで初心者って少し考えればわかりそうなことを聞くのかな
聞く前に考えるってことしないの?
0014デフォルトの名無しさん2008/08/27(水) 10:47:50
わからない→ググレ→聞いたほうが早いと思った
わからない→考えろ→聞いたほうが早いと思った
0015デフォルトの名無しさん2008/08/27(水) 10:55:29
まあどう考えていいかもわからなかったのが、
聞くために文章にすると気がつくってこともあるからな。
0016デフォルトの名無しさん2008/08/27(水) 10:58:57
わからない→ググレ→聞いたほうが早いと思った→goto わからない
わからない→考えろ→聞いたほうが早いと思った→goto わからない
0017デフォルトの名無しさん2008/08/27(水) 11:07:17
while (わからない) {
  if (聞いたほうが早い) {
    聞く;
  }
  else {
    なにもしない;
  }
}
    
0018デフォルトの名無しさん2008/08/27(水) 11:16:54
できるだけ独りよがりな考えを排除するため
0019デフォルトの名無しさん2008/08/27(水) 11:21:21
その独りよがりな考えすら浮かばない奴も多いようだが
0020デフォルトの名無しさん2008/08/27(水) 11:41:38
>>18
それなら自分の考えを書いた上で意見を求めればいいと思うんだ
0021デフォルトの名無しさん2008/08/27(水) 12:16:33
>>20
まあそうだな、次たてるときまで覚えてたら>>1に追加しておくか
0022デフォルトの名無しさん2008/08/27(水) 17:32:47
なんでintとかのサイズを統一しなかったんだろう
0023デフォルトの名無しさん2008/08/27(水) 17:34:03
処理系に合わせたほうが速い(はずだ)から
0024デフォルトの名無しさん2008/08/27(水) 18:25:18
>>22
CPUが進化とともにレジスタ幅を増やしていった経緯もあるし
用途によってはインテルCPUまでのパワーはいらなくて
マイコンで足りるなんてのもあって古いCPUをカスタム化
したのを使ってたりするしね
0025デフォルトの名無しさん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);
}

消費税を求める関数作れない!!
0026デフォルトの名無しさん2008/08/27(水) 20:46:07
>>25
独り言は他所で言ってください
0027デフォルトの名無しさん2008/08/27(水) 21:12:47
#include <stdio.h>

int Add_Tax();

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

int Add_Tax()
{
...
}
0028デフォルトの名無しさん2008/08/27(水) 21:32:37
くにへかえるんだな なつやすみはもうおわりだろう
0029デフォルトの名無しさん2008/08/27(水) 21:53:11
夏休み明けて早々ゆとりですまない
C言語に取り組もうと思って本なんか買っちゃったんだが、
実行するソフトや方法が分からず既に涙目だ
フリーソフトでも書店とかで買える物でも・・・いや、それも良く分からないんだが
兎に角先ずは作ったプログラムを動かすソフトみたいなものが分からない
なんとか教えてもらえないだろうか、お願いします
0030デフォルトの名無しさん2008/08/27(水) 21:53:53
ぐぐれよ
0031デフォルトの名無しさん2008/08/27(水) 21:54:19
>>29
マイクロソフトのサイトからVC++でも落とせば?
0032デフォルトの名無しさん2008/08/27(水) 21:55:30
>>29
http://www.microsoft.com/japan/msdn/vstudio/express/maninstall/2008/default.aspx
まずはこの中のVisual C++ 2008をインストールせよ
0033デフォルトの名無しさん2008/08/27(水) 21:56:45
>>29
プログラミングなんて一から九ぐらいまでは調べ物だから、
サーチエンジンの使い方も分からないようじゃ覚悟しといたほうがいい。
0034デフォルトの名無しさん2008/08/27(水) 22:00:45
>>29
お前にプログラミングなんて身に付かない
俺が保証する
0035デフォルトの名無しさん2008/08/27(水) 22:04:59
現在C++という奴をインストールする準備中

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

ありがとう
0036デフォルトの名無しさん2008/08/27(水) 22:39:31
業務命令でもない限り無理してやることもないのに
0037デフォルトの名無しさん2008/08/27(水) 22:47:17
ズブの素人だと3年でも足りるかどうか
0038デフォルトの名無しさん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;
}
0039デフォルトの名無しさん2008/08/28(木) 00:26:00
>>35
大学生か? プログラミングなんかで遊んでないで本職のほう勉強しろよ
0040デフォルトの名無しさん2008/08/28(木) 01:56:43
>>38
シグナルハンドラが参照する変数はvolatile型でないといけない
0041デフォルトの名無しさん2008/08/28(木) 02:21:25
>>38
setjmp が割り込みに使用する環境を保存しないからじゃないか?
0042デフォルトの名無しさん2008/08/28(木) 03:23:02
while("forever") {
}
0043デフォルトの名無しさん2008/08/28(木) 03:23:56
C++をインストール・・・
斬新な響きだ
0044デフォルトの名無しさん2008/08/28(木) 16:16:09
0x1.fffffeP127F
↑
こんな数値の記述を見かけたんですが、よくわかりません。
16進数なのか浮動少数なのか
0045デフォルトの名無しさん2008/08/28(木) 16:23:26
浮動小数点数の十六進法表記。
大抵のコンピュータでは浮動小数点数も二進法ベースなので、
十六進法表記できるようにするのは理に適っている。
0046デフォルトの名無しさん2008/08/28(木) 16:35:49
44の文字列をsscanfでfloat型変数に読み込むにはどうすればいいですか?
0047デフォルトの名無しさん2008/08/28(木) 16:36:55
訂正

44の数値の文字列をsscanfでfloat型変数に読み込むにはどうすればいいですか?
0048デフォルトの名無しさん2008/08/28(木) 16:39:38
意味が良くわからん、こういうこと?
float f;
sscanf("44", "%f", &f);
0049デフォルトの名無しさん2008/08/28(木) 16:53:41
>>48
>>44
float f;
sscanf("0x1.fffffeP127F", "%f", &f);
0050デフォルトの名無しさん2008/08/28(木) 16:54:43
>>44の、と書け
できない
0051デフォルトの名無しさん2008/08/28(木) 16:55:10
ああ、44って>>44のことかw
0052デフォルトの名無しさん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

できないね
0053デフォルトの名無しさん2008/08/28(木) 17:16:43
error C2224: '.fffffeP127F' : 左側が構造体または共用体型ではありません
0054デフォルトの名無しさん2008/08/28(木) 17:33:57
boostのlexical_cast使えば変数に入力できるって聞きました
標準Cでやる手段はないんですかね
0055デフォルトの名無しさん2008/08/28(木) 17:47:02
externのメリットがあれば教えてください
0056デフォルトの名無しさん2008/08/28(木) 18:25:26
無い
0057デフォルトの名無しさん2008/08/28(木) 18:38:14
>>55
まずexternの意味から学んでください
0058デフォルトの名無しさん2008/08/28(木) 18:49:49
>>52-54
C99対応の処理系で%a使え
ほかには、VC++も2005から%aが使える。
0059デフォルトの名無しさん2008/08/28(木) 19:10:46
>>58
VC++だと%aが使えるのは、printf系だけだ。
scanf系は使えない。
0060デフォルトの名無しさん2008/08/28(木) 19:49:53
char型の文字列を配列みたいに保持する方法はありませんか?


char mozi[10]
という10文字の文字列を200個まとめて持てるデータ構造です
0061デフォルトの名無しさん2008/08/28(木) 19:55:57
char mozi[200][10]
0062デフォルトの名無しさん2008/08/28(木) 19:57:16
どうも!

char *mozi;


mozi="aaaa";

って代入の仕方はOKですか?
0063デフォルトの名無しさん2008/08/28(木) 20:01:42
ちゃんと理解して使ってるならOK
0064デフォルトの名無しさん2008/08/28(木) 20:20:22
>>62
文字列リテラルを暗黙的にchar*にキャストするのは控えたほうがいい。
0065デフォルトの名無しさん2008/08/28(木) 20:45:38
Cでゲーム作る人なんているんですか?
0066デフォルトの名無しさん2008/08/28(木) 20:58:55
>>62
文字列定数を直接ポインタで引っ張りまわすことはもちろん可能である
しかし文字列定数が書き換え可能であることは保証されていないので、
うっかりクラッシュする原因となる危険性も多分にある
できるかぎりconst char *を使うこと
0067デフォルトの名無しさん2008/08/28(木) 21:00:24
>>65
いるかもしないし、いないかもしれないし、いたとしてもいなかったとしてもどうでもいいたぐいの問題
0068デフォルトの名無しさん2008/08/28(木) 21:23:33
今作っています><
0069デフォルトの名無しさん2008/08/28(木) 21:51:14
レス�dx

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

>>41
その辺、怪しいとは俺も思っとやが
割り込みマスクビットが立ったまま main() から return するのはマズいんかいの・・・
0070デフォルトの名無しさん2008/08/28(木) 22:05:18
宣言で *moziとしたとき
どういう状態になってるんでしょうか?

文字の先頭アドレスを指すポインタが宣言されてるだけですか?
0071デフォルトの名無しさん2008/08/28(木) 22:20:34
文字列じゃなくて文字へのアドレスだよ
0072デフォルトの名無しさん2008/08/28(木) 22:32:36
関数ポインタの配列作って関数を呼び出すときに引数の数をバラバラにすることってできますか
0073デフォルトの名無しさん2008/08/28(木) 22:32:49
文字列の先頭へのポインタ
=文字列の先頭の文字へのポインタ
0074デフォルトの名無しさん2008/08/28(木) 22:35:10
>>72
連絡用の構造体を別途用意して関数ポインタで扱う関数にはその構造体のポインターだけ渡して
内部で構造体を見るようにするとか?
0075デフォルトの名無しさん2008/08/28(木) 22:56:51
>>72
可変個引数関数でできるだろ
va_listとかで(ry
0076デフォルトの名無しさん2008/08/28(木) 23:11:33
>>75
関数ポインタ使う利点が薄くなるよ
0077デフォルトの名無しさん2008/08/28(木) 23:14:45
>>76
ということはやっぱり>>74のように渡すのはとりあえずポインター1個だけ渡すように統一して
関数内部でそのポインターの先にぶら下がってる構造体を見るとかにしたほうがいいかな?
0078デフォルトの名無しさん2008/08/28(木) 23:16:17
このスレの話題が大体わかるレベルでやっとってくれるところってあるの?
アルバイトでいいんだけど
0079デフォルトの名無しさん2008/08/28(木) 23:18:44
微妙じゃね・・・

このスレで出てくる話題ってピンきりだし、言うほどレベル高い内容でてこないしな。
0080デフォルトの名無しさん2008/08/28(木) 23:19:15
>>65
今時は色んな言語使ってるんじゃないの?
LuaとCとアセンブラ、みたいな。
0081デフォルトの名無しさん2008/08/28(木) 23:20:05
アルバイトでいいなら雇ってくれるとこはあるんじゃないの
0082デフォルトの名無しさん2008/08/28(木) 23:28:38
Cの絵本渡されて読んできたような人が、派遣元いわく経験者として派遣されてるところもあるとかなんとか・・・
0083デフォルトの名無しさん2008/08/28(木) 23:30:26
>>82
そんな経歴偽装しまくりなのが今のIT業界では?
なんとか人を放り込んでマージンせしめたい中小零細な社長が多くやっていけるのは
そのためと思ってたけど・・・
0084デフォルトの名無しさん2008/08/28(木) 23:46:27
使い捨てにされてかわいそうに。
出向先でダメっぷりをひたすら披露して会社の信用を落とすくらいしか反撃方法がないな
0085デフォルトの名無しさん2008/08/28(木) 23:51:44
このスレのな内容がわかるようなら

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

と、イカサマ派遣ソフトハウスの社長は派遣先に提出する業務経歴書に書くだろう。
0086デフォルトの名無しさん2008/08/28(木) 23:53:24
PLとかPMとかってどんくらいしんどいの?
そういう人達はこのスレにはすんでない?
0087デフォルトの名無しさん2008/08/28(木) 23:58:25
とりあえず16進浮動小数点表記を変換するのが難しいぜ
double convert(const char *str);
で作ろうとしてるが手ごわい
0088デフォルトの名無しさん2008/08/29(金) 00:07:15
>>86
いや、いるだろう。
PLの仕事は計画、メンバー編成、進捗管理、顧客折衝といろいろあるが、
なんといっても、一番大変なのが種々の問題対応
問題の発生しないプロジェクトなんて、ある規模以上なら皆無
計画の遅れ、予算不足、出来上がったシステムの品質の悪さ、人間関係、顧客や上司への説得
タフな人間でないと勤まらない
0089872008/08/29(金) 01:09:16
ようやくできた
書式チェックしてないけど…
IEEE754前提にして
90行にもわたる超大作
0090デフォルトの名無しさん2008/08/29(金) 03:57:46
>>89
そんなにかかるか?
NANとかエラーチェックとか適当でよければ、
strtolとかビット演算とか組み合わせて、十数行で済む気がするんだけど。
0091デフォルトの名無しさん2008/08/29(金) 07:43:51
別の目的で作った簡易atof()から考えて、50か精精70行くらいで済みそうだと思うが。
まぁ、丁寧にエラーチェックすれば90行くらい行くのかも知らん。
0092デフォルトの名無しさん2008/08/29(金) 08:23:36
70行から90行だともう誤差だよなw
0093デフォルトの名無しさん2008/08/29(金) 08:24:56
だよなw
70行の奴はやたら1行で終わらせるタイプで
90行の奴は1行で書ける部分も{}でわけちゃうとか

if () xxxxx

を

if() {
xxxxx
}

とかさw
0094デフォルトの名無しさん2008/08/29(金) 09:39:18
if() {
xxxxx
}
は全然構わない。ていうかやってくれ
0095デフォルトの名無しさん2008/08/29(金) 09:43:59
Cの文法上、定数しか書けない場所とはどういう場合がありますか?
0096デフォルトの名無しさん2008/08/29(金) 09:48:00
配列宣言時の要素数、自動変数以外の初期化子とかかな。
前者はC99で定数式以外もおけるようになったはずだけど。
0097デフォルトの名無しさん2008/08/29(金) 09:54:27
おれはこう。
if ()
{
xxxxx
}
0098デフォルトの名無しさん2008/08/29(金) 10:33:49
>>97
なんかすげー違和感
別にいいけど
0099デフォルトの名無しさん2008/08/29(金) 10:39:40
>>97の形式は結構使うな
//や#ifとの相性がいい
0100デフォルトの名無しさん2008/08/29(金) 11:10:04
>>99
確かに。
自分は、蟹飯あがりなもんでずっと
if () {
xxxxx
}

なんだけど、ifのコメントアウト面倒なんだよな。
0101デフォルトの名無しさん2008/08/29(金) 11:12:42
C#だと勝手に
if ()
{
//
}
になるから今の
if () {
//
}
から変えようか悩んでる
0102デフォルトの名無しさん2008/08/29(金) 11:15:43
>>101
俺がいる。
VC#オプションいじってもどうにもならなくて俺涙目。
0103デフォルトの名無しさん2008/08/29(金) 13:25:15
>>95
あとswitchのラベル
0104デフォルトの名無しさん2008/08/29(金) 20:56:51
>>101
それは、VSのオプションで変更可能。
0105デフォルトの名無しさん2008/08/29(金) 20:59:38
if (・・・)
  ・・・・・;

上級者では、ifの下が一行のときは、{}をつけない人も多いな。
0106デフォルトの名無しさん2008/08/29(金) 21:01:32
CとC++の間を行ったりきたりふらふらしてる
俺もCだけでバリバリ書けるプログラマになりたい
0107デフォルトの名無しさん2008/08/29(金) 21:10:41
>>105
上級者よりも背伸びしたい初心者に多い
0108デフォルトの名無しさん2008/08/29(金) 21:11:30
char str[256] = "hage";
こんな変数があったとしたらstr[4]以降はずっとNULL(\0)が入ってますか?
0109デフォルトの名無しさん2008/08/29(金) 21:11:57
>>107
そんなことない。
実際上級者に多い。
0110デフォルトの名無しさん2008/08/29(金) 21:13:17
>>108
NULLと\0は別物だぞ。
0111デフォルトの名無しさん2008/08/29(金) 21:14:35
>>110
そうなんですか?同じようなものと思ってました
0112デフォルトの名無しさん2008/08/29(金) 21:16:41
文字列の最後につけるのが\0で、ポインタに入れるのがNULL
0113デフォルトの名無しさん2008/08/29(金) 21:18:04
それで最後の\0以降もずっと\0が続くんですか?
0114デフォルトの名無しさん2008/08/29(金) 21:25:01
>>110
俺も同じだと思ってたが何が違うんだ?
0115デフォルトの名無しさん2008/08/29(金) 21:28:38
>>113
続くよ。
0116デフォルトの名無しさん2008/08/29(金) 21:30:40
>>112
うわぁ^^;
0117デフォルトの名無しさん2008/08/29(金) 21:34:03
>>114
>>112
0118デフォルトの名無しさん2008/08/29(金) 21:34:08
ありがとう
0119872008/08/29(金) 21:37:47
BorlandC++Compiler5.5.1 だとビットフィールド間にパディングが入るのですが、
これを抑制するオプションはありますか?
0120デフォルトの名無しさん2008/08/29(金) 21:49:23
コンピュータ用語としてのNULLにはさまざまな意味があるが、
C言語においてはNULLという特別なマクロの名前が存在するため、
特別な文脈以外ではC言語でNULLといえばこのNULLマクロのことを指す
全てのビットがゼロであるバイトを指す場合にはヌル文字、\0、NULなどが使われることが多い
0121デフォルトの名無しさん2008/08/29(金) 21:51:40
ファイルポインタで質問があります
int main(void)以外の関数内でファイルポインタを使うことはできますか?
さっきからエラーが直せなくて困ってます;;
0122デフォルトの名無しさん2008/08/29(金) 21:52:41
NULLってCでは (void*)0 でしょ?
0123デフォルトの名無しさん2008/08/29(金) 21:57:06
>>121
main以外でも使えるよ。
0124デフォルトの名無しさん2008/08/29(金) 22:03:30
>>123
うーん、そうですか〜。
どうもありがとうございます。
参考書を終えて初めて100行超えのを自作しているんですが、書いてる最中は楽しいけど
バグ取りがめっちゃめんどくさいですね^^;
とりあえずもうちょい頑張ってみます。
0125デフォルトの名無しさん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は用途が違うので、 使い分けるべき。

0126デフォルトの名無しさん2008/08/29(金) 22:21:56
>>122
いいえ特に決まっていません。
0127デフォルトの名無しさん2008/08/29(金) 22:29:53
>>126
C89では値ゼロを持つ整数定数か、それをvoid *にキャストした式と決まってたはずだけど、C99では違うの?
0128デフォルトの名無しさん2008/08/29(金) 22:42:05
0がNULLになるのは保障されてるけど
NULLが0であるという保障はなかった記憶が
0129デフォルトの名無しさん2008/08/29(金) 22:43:24
>>128
君が言いたいのはNULLでなくてヌルポインタでしょう
0130デフォルトの名無しさん2008/08/29(金) 22:44:06
そこらへんの話はC FAQ読めばいい。
0131デフォルトの名無しさん2008/08/29(金) 23:35:11
値の内容云々ではなく、

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

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

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

0132デフォルトの名無しさん2008/08/29(金) 23:37:47
>>131
言葉てきにはnull文字だからやっぱごっちゃじゃねw
0133デフォルトの名無しさん2008/08/29(金) 23:39:03
ナル文字でおk
0134デフォルトの名無しさん2008/08/29(金) 23:39:44
>>127
C99では「処理系依存の空ポインタ定数」としか書いてない。
0135デフォルトの名無しさん2008/08/30(土) 00:08:49
>>115
\0が続く保障はないだろ。
というか、>>108はなんでそのようなことを気にしているんだろうか?
0136デフォルトの名無しさん2008/08/30(土) 00:13:24
>>135
宣言でなら保証はあるだろ
0137デフォルトの名無しさん2008/08/30(土) 00:19:28
>>136
なんで?
0138デフォルトの名無しさん2008/08/30(土) 00:25:15
>>137
char str[256]={'h','a','g','e','\0'};
だから
0139デフォルトの名無しさん2008/08/30(土) 00:27:44
char str[256]={'h','a','g','e','\0''\0','\0','\0','\0','\0','\0','\0'・・・'\0',,};
0140デフォルトの名無しさん2008/08/30(土) 01:39:00
もうNULLは0では無いって言い争い飽きた

分かってるからNULLでも\0でもいいよもう
0141デフォルトの名無しさん2008/08/30(土) 02:08:05
>というか、>>108はなんでそのようなことを気にしているんだろうか?
たぶんstrncpyを使いたいとかそんなんだろう
0142デフォルトの名無しさん2008/08/30(土) 02:09:21
>分かってるからNULLでも\0でもいいよもう
わかってないやつが見たときに誤解するから問題なんだ
0143デフォルトの名無しさん2008/08/30(土) 02:10:48
>>108
実際何が入ってるか覗いてみればいいのに
0144デフォルトの名無しさん2008/08/30(土) 02:12:28
ところで配列の要素数に対して初期化子が多い場合にはエラーになるけど、
char ary[4]="hoge"; ができるのは、文字列リテラルによる初期化をするときに
末尾の\0を入れるか入れないかをコンパイラが自動的に判断してるってことでいいのかな
0145デフォルトの名無しさん2008/08/30(土) 02:26:34
「動けばいい」奴は \0 だろうが NULL だろうが、要は 0 が入れば何でもいいんだよ
そういう手合いに無理に美意識を押しつけなくても誰も困らんだろう
0146デフォルトの名無しさん2008/08/30(土) 02:33:41
美意識が何の関係がある
言葉の問題は厳密さの問題で、厳密さはPGに最も必要なものの一つだ
0147デフォルトの名無しさん2008/08/30(土) 02:35:23
初心者のままで居たくないなら、せめて
http://www.kouno.jp/home/c_faq/
くらいは目を通すべきだろ。

当然 http://www.kouno.jp/home/c_faq/c5.html#9 も。
0148デフォルトの名無しさん2008/08/30(土) 03:32:39
NULL のどこが厳密なんだよw
0149デフォルトの名無しさん2008/08/30(土) 03:38:01
誰もNULLが厳密であるなどと発言していないのにそんなセリフを吐いてしまう君は相当厳密さに欠けているね
0150デフォルトの名無しさん2008/08/30(土) 03:38:22
>>145
そりゃアセンブラレベルだと文字列の最後の\0も空ポインタへ入れるNULLも0だけどさ
厳密には違うぜ

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

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

前 hoge_hoge_hoge\0
後 hoeg_hoge\0hoge\0
0151デフォルトの名無しさん2008/08/30(土) 03:41:43
>>150
まちがってまつ
0152デフォルトの名無しさん2008/08/30(土) 03:43:15
うん。
0153デフォルトの名無しさん2008/08/30(土) 03:43:33
とまあこんな風に誤解がはびこるのでなるべく厳密な言葉の扱いをしようという話だ
0154デフォルトの名無しさん2008/08/30(土) 03:44:23
>>150
前半も後半もなにもかも間違ってる
0155デフォルトの名無しさん2008/08/30(土) 03:44:48
すまん、こんがらがってる。
誰か解説よろしこ
0156デフォルトの名無しさん2008/08/30(土) 03:45:40
NULLはヌルポインター
'\0'はヌル文字

そう読めばいい。
0157デフォルトの名無しさん2008/08/30(土) 03:47:37
もで0x00なのは確かでしょ

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

コンパイル時、「未初期化変数の参照」のWARNINGがでない?
01611602008/08/30(土) 03:57:48
でないか!?
0162デフォルトの名無しさん2008/08/30(土) 03:57:50
>>149
じゃ、何が厳密だって言ったんだよ?
「そんなこと言ってない」で逃げるだけのヘタレの相手はごめんだぜ
0163デフォルトの名無しさん2008/08/30(土) 04:02:41
まーさすがにdoubleなんかを使う場合は違う方法でやるでしょ。
というかdoubleなんてそんなに使う?
0164デフォルトの名無しさん2008/08/30(土) 04:08:53
とりあえずここを全部読んで理解した上で書き込もうよ
http://www.kouno.jp/home/c_faq/c5.html
特に>>157とか書いてる人
0165デフォルトの名無しさん2008/08/30(土) 04:10:06
浮動小数点演算を実装する場合0は全ビット0になるように作るのが普通だけどね。
直感的にわかりやすいし。
そのぶん指数桁にゲタを履かせたりして苦労するが、memset(&dbl_var, 0, sizeof(dbl_var));
とできるメリットは結構ある。
というわけで
「ほとんどすべての処理系でdoubleやfloatは全ビットゼロクリアで0になる」
と言ってもよいのでは。

0166デフォルトの名無しさん2008/08/30(土) 04:13:09
「ほとんどすべて」と「すべて」の間には越えられない壁がある
0167デフォルトの名無しさん2008/08/30(土) 04:18:32
ほとんどすべての処理系の「ほとんど」が問題なわけで
0168デフォルトの名無しさん2008/08/30(土) 04:24:20
c++でオブジェクトを初期化しようとして
memset(&obj, 0, sizeof(obj));
とやってハングさせたオレが来ましたよ

・・・・だってメンバたくさんあったんだもん。
0169デフォルトの名無しさん2008/08/30(土) 04:33:40
変数の名前がうまくつけられないのって、英語ができないせいなんですかねぇ・・・。
1ヶ月後にソースみたらさっぱりわからん
0170デフォルトの名無しさん2008/08/30(土) 04:34:33
確かに辞書引いてつけた変数名はあとでなんだったかわからなくなる
0171デフォルトの名無しさん2008/08/30(土) 04:39:48
良いコードというのは、英語として読めるコード
0172デフォルトの名無しさん2008/08/30(土) 04:41:56
英単語の文字をフルにつけちゃうからだろw
うまく略すなりするとか。

あとは文字列を検索してわかりやすく表示してくれるツール使うとか。
それをしないと英単語で長い名前にした意味がないw
0173デフォルトの名無しさん2008/08/30(土) 04:44:34
略して頭文字だけになって何の関数だこれ、になる

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

こればかりは経験。良いプログラムを多く見ること。
0175デフォルトの名無しさん2008/08/30(土) 05:35:32
'\0'は1バイト
NULLは4バイト
0176デフォルトの名無しさん2008/08/30(土) 05:38:03
>>175
Cじゃ文字リテラルはint型扱いだろ
0177デフォルトの名無しさん2008/08/30(土) 10:09:12
>>171
COBOLer 乙
0178デフォルトの名無しさん2008/08/30(土) 11:19:29
>>174
命名規則をまとめたサイトを見りゃ1発。
http://potting.syuriken.jp/potting_conv/CodingGuidelines_J/CodingGuidelines.htm
0179デフォルトの名無しさん2008/08/30(土) 12:27:20
404…かと思ったらlが抜けてるのか
0180デフォルトの名無しさん2008/08/30(土) 13:11:33
NULLはヌルポインタではないし4バイトとも決まっていない
0181デフォルトの名無しさん2008/08/30(土) 13:12:29
>>180
NULLはヌルポインタでしょ
0182デフォルトの名無しさん2008/08/30(土) 13:13:36
もうどうでもいいよ
0183デフォルトの名無しさん2008/08/30(土) 13:14:35
とりあえず0をn個で埋められるんでしょ
0184デフォルトの名無しさん2008/08/30(土) 14:01:23
ある計算を何度もやらせるのに
coutで結果を表示させながらやらせた場合と、
何も表示せず最後にだけレポートを表示させた場合で
100倍くらい処理速度に差があるんですが
これって普通ですか
標準入出力ってこんなにも重いものなんですか
0185デフォルトの名無しさん2008/08/30(土) 14:02:50
>>184
Yes
0186デフォルトの名無しさん2008/08/30(土) 14:03:46
>>184
最後のレポートが途中の表示の1/100の量なら、普通です。
0187デフォルトの名無しさん2008/08/30(土) 14:03:56
>>184
そりゃまあ、そんなもんでしょ。
それをファイルに1レコードずつ読み書きに置き換えたらもっとだと思うよ。
表示っていっても数字を渡した場合は関数の中で文字に変換して書式に従って整形
その後画面表示だったらそのAPIなんかに渡したりと意外となかで処理はやってるし。
0188デフォルトの名無しさん2008/08/30(土) 14:04:58
うへぇ、そうだったんですね
処理速度を気にするプログラムを始めて作っていて
これほど差があるものだと思い知りました
ありがとうございました
0189デフォルトの名無しさん2008/08/30(土) 16:53:04
>>181
個人的にはどうでも良いけど、NULLはヌルポインタ定数と呼び、
ヌルポインタ定数をポインタ型にキャストした結果をヌルポインタと呼ぶ。
0190デフォルトの名無しさん2008/08/30(土) 17:19:17
それを知っててよかったことを200文字以上400文字以下で述べよ
0191デフォルトの名無しさん2008/08/30(土) 19:24:29
>>189
違和感があるぞ
ポインタ変数への代入後または右辺値でなければNULLはNULLポインタにあらずって感じだ
0192デフォルトの名無しさん2008/08/30(土) 20:21:52
質問お願いします。 

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

2、キーボードの矢印キーで入力する方法はあるでしょうか。ないでしょうか。
0193デフォルトの名無しさん2008/08/30(土) 20:31:55
>>192
A. 両方環境依存ですが方法はあります
0194デフォルトの名無しさん2008/08/30(土) 20:44:30
>>192
使っている環境をありったけ述べてください
もしlinuxとかなら"\r"だけで行頭に戻るかも
01951922008/08/30(土) 20:44:55
>>193

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

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

とりあえず、コンパイラはborland c++ compiler5.5 です
0197デフォルトの名無しさん2008/08/30(土) 21:10:23
>>192
矢印の取得なら
PeekConsoleInput とか ReadConsoleInput @ windows.h
もしくは
getch とか kbhit @ conio.h

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

01991922008/08/30(土) 21:25:29
>>197

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

ありがとうございました!!
0200デフォルトの名無しさん2008/08/30(土) 21:29:22
>>191
そう言われても、規格にそのように書いてあんだよね。
0201デフォルトの名無しさん2008/08/30(土) 21:44:07
clsはネタかと思ってたがマジだったのか
0202デフォルトの名無しさん2008/08/30(土) 21:44:08
値0の整数定数はヌルポインタ定数で、ポインタを必要とするところに書いたらヌルポインタに変換されることが保証されている
NULLはマクロで、それはヌルポインタ定数そのものに置換されるかもしれないし、それをvoid*にキャストした式や、(C99の場合は)ヌルポインタそのものに置換されるかもしれない
ヌルポインタが何であるかは規格では定められていない
0203デフォルトの名無しさん2008/08/30(土) 21:50:39
なんにも#includeしない状態で使える関数とか演算子とかってどんなものがあるんでしょう?
0204デフォルトの名無しさん2008/08/30(土) 21:52:20
>>162
厳密であるとは言葉の持つ意味に曖昧さがないようにするということ
0やNULLやヌルポインタが厳密なのではなく、それぞれの言葉をそれぞれの意味で明確に使い分けることが厳密さ

もちろん、曖昧さがあったとしても、正しく意志が疎通されないわけではない
しかしそれは書き手読み手の双方にCの正しい理解があることが必要であって、
ことこのスレでその前提を期待することは、無根拠な楽観を通り越して明らかな間違いであると言わざるをえない
0205デフォルトの名無しさん2008/08/30(土) 21:54:53
>>201
ネタじゃない方法plz
0206デフォルトの名無しさん2008/08/30(土) 22:46:01
Temporary Internet Filesフォルダ内の特定のファイルを、
他のフォルダへコピーするにはどうしたらいいのでしょうか?

フォルダ内検索でdesktop.iniのみしか表示されない、というところで詰まっています。。。
0207デフォルトの名無しさん2008/08/30(土) 22:52:50
実態は別の場所にある
0208デフォルトの名無しさん2008/08/30(土) 23:01:54
>203
関数は引数int(またはなし)で戻り値intのものだけ
それ以外は自分でプロトタイプを用意しない限り正しく動かない
演算子はインクルード関係ない
0209デフォルトの名無しさん2008/08/30(土) 23:50:01
>208

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

>203

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

0210デフォルトの名無しさん2008/08/30(土) 23:51:19
ごめん、標準Cなら一個あった。
main がそうだね。
0211デフォルトの名無しさん2008/08/30(土) 23:59:47
まさにそのビルトイン関数ってやつが知りたかったのですが、ひとつもないんですか・・・
memsetとか使ってみたら警告は出たけど動作はしてるみたいなんですけどこれはたまたまそういうコンパイラだったってことでしょうかね?
0212デフォルトの名無しさん2008/08/31(日) 00:07:24
>>211
その警告はmemsetがわからねーよってのじゃね?
ワーニングレベルでコンパイル通るけど、その実何もやってないはず。
memset程度ならたまたま使う変数だとかがいい感じで初期化されてただけだと思ったほうがいい
0213デフォルトの名無しさん2008/08/31(日) 00:12:52
一つもないです。

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

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

高度なサービスがセットになっている言語環境が欲しいなら
JavaとかC#とかの方がいいかも。
0214デフォルトの名無しさん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とポインタのバイト数が違う処理系はまれなんで(ていうか俺は触ったこと無い)
処理系依存だけど殆どの環境で正しく動作する。
0215デフォルトの名無しさん2008/08/31(日) 01:28:28
>NULLはプリプロセッサで必ず空ポインタ定数に展開されるし
C99なら、だろ
C89だとただの0とか0Lである場合もある

>printfの%pはポインタを必要とするが
ちがう
可変個数引数の関数はコンパイラが型チェックをしない
だからそれは「プログラマの責任でポインタを書かなくてはいけない場所」であって
コンパイラが変換処理をしてくれるところの「ポインタを必要とする場所」ではない
0216デフォルトの名無しさん2008/08/31(日) 01:29:35
>>215
0はヌルポインタ定数なんすよ。
0217デフォルトの名無しさん2008/08/31(日) 01:33:44
>>215
よく読め、ナマの0も空ポインタ定数に入ってる
0218デフォルトの名無しさん2008/08/31(日) 01:36:42
ようするにNULLはマクロの名前であってそれ自体はヌルポインタじゃないけど
ポインタが必要な場所に書いたらヌルポインタとして扱われるってことだろ

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

文法上ポインタを要求する場所に0を書いたらそれはヌルポインタに変換される。
0や0をvoid*にキャストしたものを空ポインタ定数(ヌルポインタ定数)と呼ぶ。
NULLはマクロの名前で、空ポインタ定数(のどれか)に展開される。
NULLやヌルポインタの本当の値がゼロである保証は無い。というか関係が無い。
だからNULLをゼロとか\0の意味で使うと誤解を招きやすい。
0220デフォルトの名無しさん2008/08/31(日) 01:51:51
もともとは\0とNULLの混同だけの話だったのにな・・・
0221デフォルトの名無しさん2008/08/31(日) 01:55:55
まー実行環境によってはNULLが0だと困るのもあるかもしれないしないかもしれない

メモリのアドレスの関係上0x00000000を使ってるが0xFFFFFFFFは使わない場合
NULLは0では困る可能性もあるわけだ。
0222デフォルトの名無しさん2008/08/31(日) 02:01:48
めんどくせぇなヌルポインタであることを示す予約語をつくろうぜ

null_ptr

とC++0xの話へもうちょっとだけ続くんじゃ
0223デフォルトの名無しさん2008/08/31(日) 02:48:23
printf("%c", NULL);
printf("%p", '\0');
0224デフォルトの名無しさん2008/08/31(日) 02:52:30
>>223
で?
02252212008/08/31(日) 02:54:49
>>224
まあつべこべ言わずに確認してみろや

ってことじゃね?
0226デフォルトの名無しさん2008/08/31(日) 03:05:45
そんな環境によって結果が違うコード持ち出されても
0227デフォルトの名無しさん2008/08/31(日) 03:07:27
可変引数の仕組みから考えたら型情報は失われるから同じになりそうなもんだけど依存なの?
第一引数を元にキャストしてとりだすんだよね
0228デフォルトの名無しさん2008/08/31(日) 03:11:14
いやごめんなさい
0229デフォルトの名無しさん2008/08/31(日) 03:13:09
>>227
依存
上はNULLがvoid*にキャストされていて、ヌルポインタの内部表現が0でなかったとき0にならない(%cで表示されるかどうかは知らんが)
下はポインタのサイズが文字定数のサイズ(int)より大きかったとき、ゴミを読み込んで0以外の値になるかもしれない
0230デフォルトの名無しさん2008/08/31(日) 03:27:37
>>227
そもそも、c変換指定子に対応する引数はintでなければならず、
p変換指定子に対応する引数はvoid*でなければならない。
それ以外の場合の挙動は未定義。
0231デフォルトの名無しさん2008/08/31(日) 05:52:04
C系のスレを荒らすにはNULLで釣れば簡単だと思った。
0232デフォルトの名無しさん2008/08/31(日) 12:14:04
NULLとgotoで荒れるのは昔から万国共通
0233デフォルトの名無しさん2008/08/31(日) 12:50:14
gotoは答えが出てるから荒れないよ
0234デフォルトの名無しさん2008/08/31(日) 13:07:41
未定義未定義言うんじゃなくて各実装ではどうなってるか調べる方法を教えてくだしあ
0235デフォルトの名無しさん2008/08/31(日) 13:23:35
調べて、それでどうするつもりだ

調べるという行為自体が目的なら頑張ればいいが
調べた結果に基づいて書いた処理系依存コードなんぞ窓から投げ捨てるためにあるようなものだ
0236デフォルトの名無しさん2008/08/31(日) 13:29:02
というか調べることができる保証すらないのが未定義
0237デフォルトの名無しさん2008/08/31(日) 13:30:21
↑馬鹿
0238デフォルトの名無しさん2008/08/31(日) 13:39:13
毎回、動作が変わるかもしれないから正確に調べられないのが未定義。
0239デフォルトの名無しさん2008/08/31(日) 13:41:09
↑馬鹿
0240デフォルトの名無しさん2008/08/31(日) 13:47:28
ばかっていうやつがばかなんだいぷんぷん
0241デフォルトの名無しさん2008/08/31(日) 14:02:10
|・未定義(undefined)の動作
|本当に何が起きても不思議はないことを意味する。規格は何の必要条件も課さない。
|コンパイルできないかもしれないし、誤った動きをするかもしれないし
|(クラッシュしたり黙って誤った結果を出したり)、
|あるいはたまたまプログラマの意図したとおりの動きをするかもしれない。
0242デフォルトの名無しさん2008/08/31(日) 14:56:47
#define MAX (100)
見たいな感じで#define での定数に括弧を使ってるソースを見かけたんですが、
括弧のあるなしでなにか動作が変わる例はあるのですか?無い様に思ったんですがひょっとしたらあるのかなと思いまして
0243デフォルトの名無しさん2008/08/31(日) 15:14:34
>>242
#define add(a, b) ((a)+(b))

9/add(1,2)
0244デフォルトの名無しさん2008/08/31(日) 15:14:58
数字だけなら変わらないが、考えるの面倒だから全部に括弧つけるって人は多いと思う
(100+1)みたいに後から足すこともできるし
0245デフォルトの名無しさん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とかに対応するためにはどちらも必須。
0246デフォルトの名無しさん2008/08/31(日) 15:43:00
>>243
すいませんでした
数字だけなのに括弧つけてて不思議だなぁと思って質問してたんです
お手数かけて申し訳ありません

>>244
やっぱ変わらないですよね
追加のことは思い至りませんでした
どうもありがとうございました
0247デフォルトの名無しさん2008/08/31(日) 15:48:49
あとはあれだ
トークン連結演算子(##)とかにマクロを放り込むバカに注意を出してくれる
0248デフォルトの名無しさん2008/08/31(日) 16:22:24
はるか昔、ある未定義のコードをコンパイルすると、
インベーダーゲームが始まるCコンパイラがあったよーななかったよーな・・・
0249デフォルトの名無しさん2008/08/31(日) 18:10:00
ソースを渡した後にゲームをクリアしないとコンパイルを実行してくれないコンパイラはどうか
仕事をしてるふりをして遊べる画期的なコンパイラだ
0250デフォルトの名無しさん2008/08/31(日) 18:15:03
ゲームの成績がコンパイル結果に反映されるコンパイラ
0251デフォルトの名無しさん2008/08/31(日) 18:15:45
>>249
よしコンパイルするか〜
↓
「ながい たびが はじまる」
0252デフォルトの名無しさん2008/08/31(日) 18:25:36
スコアによっては問答無用で GPL なのをリンクしてくれるわけですね
0253デフォルトの名無しさん2008/08/31(日) 18:28:57
よしコンパイルするか〜
↓
「これは ひどい」
0254デフォルトの名無しさん2008/08/31(日) 21:19:58
スコアによってエラー情報の詳細度が変わります
0255デフォルトの名無しさん2008/09/01(月) 01:06:05
数値Lだったらただlongになるだけでバイトサイズはコンパイラ依存ですよね
数値リテラルの型ではなくてバイト数を固定する方法ってないんでしょうか?
多倍長整数ライブラリとかで変数に巨大な定数を代入したくなったときとかlongまでしかできなかったら不便だと思うんですが・・・
0256デフォルトの名無しさん2008/09/01(月) 01:08:15
文字列で渡す
0257デフォルトの名無しさん2008/09/01(月) 02:16:07
>>255
標準Cで扱えないような数値を扱うために多倍長整数ライブラリをつかうわけで…
0258デフォルトの名無しさん2008/09/01(月) 05:01:58
標準では取り敢えず0llでlong longまで扱えるからそれで勘弁してくれ。
0259デフォルトの名無しさん2008/09/01(月) 05:07:42
だから標準の処理系ってどこにあるの?
0260デフォルトの名無しさん2008/09/01(月) 05:10:46
まーたやってる
臨機応変に考えろ。
昔からある言語でいろんなビット幅のCPUで使われてるんだし
時代とともにあれこれ変えて継ぎはぎだらけなんだし。

所詮は道具
0261デフォルトの名無しさん2008/09/01(月) 05:18:33
処理系依存の話は処理系依存のスレでどうぞ
0262デフォルトの名無しさん2008/09/01(月) 05:31:10
>>255
巨大な定数は文字列で渡せばおk
0263デフォルトの名無しさん2008/09/01(月) 22:51:22
ぶっちゃけて、プログラマーのみなさんは、C言語(C#やC++でなく)でどんなプログラムを組みますか? 
そりゃ色々あるのはわかってますよ!バカな質問かもしれませんよ!?こっちはただのドしろーとで悪いと思ってますよ!!
でもたとえばテキストベースが多いとか、C言語にはC言語ならではの、得意分野ってあるのかなー、と。
むしろ純粋なC言語のみのプログラムなんてやらないんでしょうか? 
0264デフォルトの名無しさん2008/09/01(月) 23:01:36
とりあえず持っているデジタル製品や家電を全部言ってみてください。
02652632008/09/01(月) 23:11:22
えっと、携帯電話、テレビ、洗濯機、パソコン、プレステ2、プレステ、サターン、ドリームキャスト、ファミコンの互換機、冷蔵庫、ファック、MDコンポ、デジカメ、デジタル時計、炊飯器、電子レンジ、扇風機、デジタル貯金箱、GBA、掃除機、ビデオデッキ、DVD、
>>264  
まだありますけど、理解しました。
ありがとうございました。 
0266デフォルトの名無しさん2008/09/01(月) 23:12:03
むしろC#やC++のアプリなんてPC上くらいしか存在しないんじゃね?
家電のファームなんてほぼCだろ。ほぼって言うのは少数でアセンブラ含むということで
0267デフォルトの名無しさん2008/09/01(月) 23:17:52
自動車部品メーカーまわってたら、C++使える?って聞いてくるとこ多かったけどな
0268デフォルトの名無しさん2008/09/01(月) 23:17:55
最近は組み込みもC++使うよ
0269デフォルトの名無しさん2008/09/01(月) 23:20:29
へー
まあマイコンも性能上がってるしなあ。
書かなきゃいけない規模もあがってるからそうなるのか。
0270デフォルトの名無しさん2008/09/01(月) 23:31:45
つーか、携帯電話ならJavaも結構使われているしね。
0271デフォルトの名無しさん2008/09/01(月) 23:34:45
組み込みで STL とか boost はやっぱりだめ?
0272デフォルトの名無しさん2008/09/02(火) 01:04:10
ちょっとリッチな組み込みでも絶対駄目とまで言わないけどまだ自由には使えない
0273デフォルトの名無しさん2008/09/02(火) 01:05:41
組み込みではdoubleも使えないことが多いのに
0274デフォルトの名無しさん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;
}

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

演算の結果が整数に非常に近いことが期待できるなら、(int)(d+0.5)が使える。
0276デフォルトの名無しさん2008/09/02(火) 03:26:49
訂正
×整数に
○0以上の整数に
0277デフォルトの名無しさん2008/09/02(火) 12:44:31
>>274
>intへの変換結果が6となることを意図して下のような処理がされていたのですが 
それが本当なら、ブックオフ行きだな
0278デフォルトの名無しさん2008/09/02(火) 12:50:46
柴田望洋だし
02792742008/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になれたら他の人の本を参考にする必要がありそうですね
アドバイス有り難うございます。
0280デフォルトの名無しさん2008/09/02(火) 17:06:13
構造体を初期化するときに以下のようなコードを見たのですが問題ないのでしょうか?

struct hoge a;
a = (struct hoge){0};
0281デフォルトの名無しさん2008/09/02(火) 17:22:19
C99で追加されたものを使っているんで、ややコンパイラを選ぶ。
初期化自体はstruct hoge a = {0};と同じ方法でやるので問題ない。
0282デフォルトの名無しさん2008/09/02(火) 18:28:10
ちくしょう便利だなC99め…
0283デフォルトの名無しさん2008/09/02(火) 19:26:16
>>279
0.1刻みなら内部では10倍で計算しておいて出力時に1/10すれば安心では?
0284デフォルトの名無しさん2008/09/02(火) 19:29:19
foo bar = {0};
って標準なの?
0285デフォルトの名無しさん2008/09/02(火) 20:25:15
>>284
もちろん
0286デフォルトの名無しさん2008/09/02(火) 20:56:36
つか、C99をいまだに使ったことがないわけだが
0287デフォルトの名無しさん2008/09/02(火) 21:00:21
つ[ICC]

一般の人にはなかなか手が出ませんな。
0288デフォルトの名無しさん2008/09/02(火) 21:02:59
自家用ならフリーじゃなかったっけ
0289デフォルトの名無しさん2008/09/02(火) 21:06:54
それ本当?評価版ってのがそうなんだろうけど、これ評価期限ってどうなの?
90日間?
0290デフォルトの名無しさん2008/09/02(火) 21:25:01
評価版じゃなくて,非商用限定でサポートなしのがある.
ttp://www.intel.com/cd/software/products/asmo-na/eng/index.htm から
Free Non-Commercial Download たどってメールアドレス登録すれば使える.
0291デフォルトの名無しさん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;}
0292デフォルトの名無しさん2008/09/02(火) 22:27:40
>>291
malloc の引数はこのまま?
0293デフォルトの名無しさん2008/09/02(火) 22:32:30
>>291
malloc(sizeof(int)*10); を malloc(sizeof(int)*13000); にしたってこと?
0294デフォルトの名無しさん2008/09/02(火) 22:33:03
まあ*10は*100000の間違いとして
感じでは実際には512kb=int[128]しか割り付けられてないみたいな?
そんな環境あるのかね?
0295デフォルトの名無しさん2008/09/02(火) 22:33:50
>>293
あ、そっちか
単に割り付けられる限界超えただけだな
0296デフォルトの名無しさん2008/09/02(火) 22:35:00
DOSで動かしてるとか。
0297デフォルトの名無しさん2008/09/02(火) 22:40:50
intが16bitでオバーフローしてんじゃね
0298デフォルトの名無しさん2008/09/02(火) 22:43:07
DOSっていうとちょっと前にLSI-C86試食版がどうこう書いてたレスがあったな
0299デフォルトの名無しさん2008/09/02(火) 22:43:15
> 1万3000程度で停止してしまいます
停止とは具体的になんなのか!?ここ基本。
0300デフォルトの名無しさん2008/09/02(火) 22:43:17
まずは実行してる環境書いたほうがいいのでは?

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

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

>>297
どうすればいいですかね・・・
0302デフォルトの名無しさん2008/09/02(火) 22:46:59
>>301
組み込みか・・・もしかすると某ゲーム機の非公式開発か?
あれならアプリごとのヒープサイズを今回の引っかかってるサイズまで
制限できるからなあ。
0303デフォルトの名無しさん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プロンプトみたいな画面に
文字が出てくるのですね。びっくりしました。
0304デフォルトの名無しさん2008/09/02(火) 22:47:32
>>301
> mallocの引数はこのまま10です。
10じゃマズいじゃん。チャンチャン
03053032008/09/02(火) 22:48:21
遅かったか orz
03062912008/09/02(火) 22:49:11
>>300
コンパイラはBorland C++ Compiler 5.5でwindows XP・・・
浅学で必要そうな情報がいまいちつかめてませんが、
あとはどのような情報が必要なのでしょうか。すいません。
0307デフォルトの名無しさん2008/09/02(火) 22:50:07
>>306
対象ターゲットは?
0308デフォルトの名無しさん2008/09/02(火) 22:50:10
10万の配列を扱うのにsizeof(int)*10にした根拠は?
03093032008/09/02(火) 22:51:06
>>306
(int *)malloc(sizeof(int)*100000); // 使う領域のサイズを確保する;
03102912008/09/02(火) 22:52:43
>>307
すいません、ちょっといまわかりません。
でも*10を 10000にしたら14万行まで進めました!
解決したみたいです・・・!

>>308
>>304
変えてみたらできました・・・ほんとありがとうございます!
03112912008/09/02(火) 22:54:05
初めて書き込んだのですが、
こんなにも素早く対応していただけて嬉しいです。
もっと上達したらここでアドバイスできるくらいになります!
本当にありがとうございました!
0312デフォルトの名無しさん2008/09/02(火) 22:56:05
要するに、細かくmallocすると1回1回のmallocで取った領域は実はintx10以上で
メモリを食いつぶしてたってこと?
0313デフォルトの名無しさん2008/09/02(火) 22:56:21
なかなか素直でよろしい>>291
がんばって勉強してください。
0314デフォルトの名無しさん2008/09/02(火) 22:56:58
>>310
*10000なのに、14万まで進んだらまずくね?
0315デフォルトの名無しさん2008/09/02(火) 22:58:42
すごい行き当たりばったりプログラミング。

>>310
>でも*10を 10000にしたら14万行まで進めました!
使う分malloc()してください。
0316デフォルトの名無しさん2008/09/02(火) 22:58:44
>>312
書いている内容を素直に受け取る限りは
int *x;
x=malloc(sizeof(int)*10);
x[13000]=1234; // 落ちた!何で?
0317デフォルトの名無しさん2008/09/02(火) 22:59:01
>>314
俺は>>291のソースはすでにかなりいじる前のだと思ってたけど
>>291これが最終ソースだったのか?
0318デフォルトの名無しさん2008/09/02(火) 23:00:06
>>316
それはこえーな
メモリのこと理解してねーじゃん
03192912008/09/02(火) 23:00:53
>>314
申し訳ないです。
いまやり直したら4万6000だったですが、大丈夫でしょうか。
03202912008/09/02(火) 23:02:06
>>317
これからどんどんいじっていく予定です。
とりあえず10万行以上の処理ができるかテストしたら
止まってしまってたので四苦八苦してました。
0321デフォルトの名無しさん2008/09/02(火) 23:02:51
Linuxで、時刻を変更するプログラムは作れますか?
0322デフォルトの名無しさん2008/09/02(火) 23:03:19
malloc(sizeof(int)*10);

の()の中が何をやってるかどういう意味か理解してからでないとあぶねーな。
03232912008/09/02(火) 23:04:16
>>322
配慮ありがとうございます。
ちゃんともう一度読み直して使用します。
0324デフォルトの名無しさん2008/09/02(火) 23:04:56
>>321
root もしくは実行ファイルに sid があれば可能
一般ユーザ権限では変更できない
0325デフォルトの名無しさん2008/09/02(火) 23:09:23
>>321
作れるよ。なんらかのシステムコールを使うんだ。settimeだったかな?
0326デフォルトの名無しさん2008/09/02(火) 23:18:39
>>324
ひゃっほー suid だったぜ
0327デフォルトの名無しさん2008/09/02(火) 23:24:14
まず何行読んだのか数える変数を用意するんだ
0328デフォルトの名無しさん2008/09/02(火) 23:24:59
じゃない、何行読んだのかをチェックするんだ
0329 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();
}
}
0330デフォルトの名無しさん2008/09/02(火) 23:42:41
>>329
EOFを入力すればおk
Windows環境ならCtrl+Z
Unix系環境ならCtrl+D
0331デフォルトの名無しさん2008/09/02(火) 23:47:08
ていうかiとかaとかはなんなんだよ
0332デフォルトの名無しさん2008/09/02(火) 23:48:56
>>329
main()はintを返す。void main()は間違い。
大文字と小文字の変換はctype.hをincludeしてtolower()とtoupper()を使うべし。
0333 2008/09/02(火) 23:55:49
>>330

Ctrl+Zを押さなくても終了するようにできますか?
0334デフォルトの名無しさん2008/09/03(水) 00:17:31
>>333
for文の条件を!=EOFにしてるんだから、EOF入力しなきゃ終わらんだろ。
0335デフォルトの名無しさん2008/09/03(水) 00:21:44
>>333
'\n'を終了条件にすれば?
0336デフォルトの名無しさん2008/09/03(水) 03:00:32
×EOF入力
○^zや^dの押下で標準入力をクローズ
0337デフォルトの名無しさん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を毎回ループさせたいんですが、ちゃんとなってくれません・・・。
0338デフォルトの名無しさん2008/09/03(水) 03:39:09
> if(ch='Y','y')break;
これの意味説明してみろ
03393372008/09/03(水) 03:40:17
while文の無限ループをbreakで抜けたいと思いまして
0340デフォルトの名無しさん2008/09/03(水) 03:42:11
つーかコンパイルできないだろ。正しくは↓。
if (ch == 'Y' || ch == 'y')
0341デフォルトの名無しさん2008/09/03(水) 03:42:57
if使うならswitch使う意味無いじゃん
03423372008/09/03(水) 03:47:32
レスありがとうございます。
>>340
それでいけました。 前のソースコードでもコンパイルはされました(visualC++2008)
カンマ演算子の使い方がイマイチわかってなかったです。ありがとうございます。

>>341
if文だけで作り直してみます。
0343デフォルトの名無しさん2008/09/03(水) 03:51:39
プログラム自体を終了する気ならば

switch(ch){
case 'Y':
case 'y':
printf("終了します\n");
break;
↑をbreakじゃなくてreturnなりexitなりを使えば良いと思う
0344デフォルトの名無しさん2008/09/03(水) 03:52:58
>>340
意図した通りかどうかは兎も角、正しくコンパイルできるね。
君にはどういう風に解釈されるのかを考えてもらおうか。
03453372008/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");
}
}

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

…はずなんだが、それだと常にループ抜けるな。あってる?
0347デフォルトの名無しさん2008/09/03(水) 04:04:09
>>346
あってる。

>>345
getchar()で喰い残した改行文字が次のgetchar()で喰われている。
再入力前に、食い潰しておけば大丈夫。
0348デフォルトの名無しさん2008/09/03(水) 04:50:49
>>346
とりあえずおまえは回答者になる資格ぜんぜんなし。黙ってろ。
0349デフォルトの名無しさん2008/09/03(水) 13:24:57
↑回答すら出来ないゴミに言われたかないね
0350デフォルトの名無しさん2008/09/03(水) 13:34:02
>if(ch='Y','y')break;
がコンパイルできない、などという嘘を垂れ流す方がよっぽどゴミな訳だが
0351デフォルトの名無しさん2008/09/03(水) 13:49:34
ゴミ同士仲良くすれば
0352デフォルトの名無しさん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;
}
0353デフォルトの名無しさん2008/09/03(水) 14:18:59
ない
0354デフォルトの名無しさん2008/09/03(水) 14:19:48
>>353
とりあえずそこだけ関数化して呼ぶとか?
0355デフォルトの名無しさん2008/09/03(水) 14:40:01
>>352
C++使う
0356デフォルトの名無しさん2008/09/03(水) 14:46:59
意味不明
0357デフォルトの名無しさん2008/09/03(水) 14:56:37
πってプログラムでいうとM_PIであらわせるけど
cosの中だったら180で計算すべきなのかな?
0358デフォルトの名無しさん2008/09/03(水) 14:57:24
cos sinはラジアンで渡すだろ。
その手前は自分の好きなように
0359デフォルトの名無しさん2008/09/03(水) 15:31:20
>>352
スコープを絞るというより、そこで変数を宣言したいからと言ったほうが近いように感じる。
03607412008/09/03(水) 16:51:07
久しぶりです
>>329のj = j - ('A'-'a'); ってどういう意味ですか?

全く理解できないんですが j+=('A'-'a');とやってもおかしく表示されたんですが
j = j - ('A'-'a'); の意味を教えてくださいお願いします
0361デフォルトの名無しさん2008/09/03(水) 16:52:46
j -= 'A' - 'a'
0362デフォルトの名無しさん2008/09/03(水) 16:52:51
>>360
大文字を小文字に変換してる
文字コードでぐぐればわかるんじゃね?
03637412008/09/03(水) 16:53:27
そうそれでした
j-='A'-'a'なんですが
Aからaをひくいみがわからないんですが。
詳しく説明お願いします
0364デフォルトの名無しさん2008/09/03(水) 16:54:43
( 'A') ('a' )
0365デフォルトの名無しさん2008/09/03(水) 16:56:05
( 'A') ( '-' ) ('a' )
0366デフォルトの名無しさん2008/09/03(水) 16:56:19
>>363
Aのアスキーコード
aのアスキーコード
引くと?
0367デフォルトの名無しさん2008/09/03(水) 16:57:36
'A'の文字コードは 0x41
'a'の文字コードは 0x61
差は0x20('A' - 'a' なら マイナスだが)
例えば、jの内容が0x4a('J')なら-0x20を引く(=0x20を足す)と0x6a == 'j'になる
0368デフォルトの名無しさん2008/09/03(水) 16:57:54
>>363
まずここを眺める
http://ja.wikipedia.org/wiki/ASCII

表より、'A' は 65、'a' は 97 だから 'A' - 'a' は 65 - 97 で -32
つまり j -= -32; ということ
0369デフォルトの名無しさん2008/09/03(水) 17:00:47
'A' - ('A' - 'a') = 'a'
'B' - ('A' - 'a') = 1 + 'A' - ('A' - 'a') = 1 + 'a' = 'b'
・・・
0370デフォルトの名無しさん2008/09/03(水) 17:01:31
ここで、じゃあ -32と書けばいいのでは、、という質問がくる?
0371デフォルトの名無しさん2008/09/03(水) 17:01:49
A〜Z まで 順に連続したアスキーコード だとする
同様に a〜z まで 順に連続したアスキーコード だとする

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

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

j - 'A' + 'a' で Aから数えて何文字目 + aのアスキーコード
  → jのアスキーコードから対応する小文字化されたアスキーコードが手に入った
0372デフォルトの名無しさん2008/09/03(水) 17:03:01
>>370
それは意味をわかって書くならいいが、ここで解説してなんとなくで
そのままだといずれハマるな。
特に文字関連の処理をする場合
0373デフォルトの名無しさん2008/09/03(水) 17:05:14
コードが連続してない場合を考えてないので50点
0374デフォルトの名無しさん2008/09/03(水) 17:05:30
>>370
-32なんていうマジックナンバーをコード中に埋め込んではだめです、じゃだめかな
03757412008/09/03(水) 17:07:32
329のでint jなんですが
jにaといれたら 97となるわけですが aAといれたら 97+65=162になるんでしょうか?
それと329のchar a[30];は使ってない気がするんですが
char a[30];はどこで使われてるんでしょうか?
0376デフォルトの名無しさん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


03773762008/09/03(水) 17:10:28
ちなみにC++ builder5を使っています。
失礼しました。
0378デフォルトの名無しさん2008/09/03(水) 17:11:22
>>376
関数の仮引数の配列の添え字を1000にしても sizeof(CHAR*) と同じ数値になる
なぜなら、そう決まっているから
03793762008/09/03(水) 17:14:17
>>378
わかりました!どうもありがとうございますm(__)m
0380デフォルトの名無しさん2008/09/03(水) 17:14:21
>>375
getcharは1文字入力する関数だから2文字同時には入力されない
1文字ずつしか入らない

使ってない変数が宣言してあっても死にはしない
単に無駄なだけ
気にしないで放っておけばいい
0381デフォルトの名無しさん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]);
# で良いんだっけ?
0382デフォルトの名無しさん2008/09/03(水) 17:26:21
>>381
違う
構造体につめて渡す以外のどんなことをやっても配列をスタックに積むことはできない
0383デフォルトの名無しさん2008/09/03(水) 17:29:12
>>380
使ってない変数があっても気にしないで放っておけだって?
おまえ教える資格ないから。
なんちゃってプログラマは黙ってろよ。
03847412008/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にすればいいんですが。
0385デフォルトの名無しさん2008/09/03(水) 17:31:45
そんな無理に期待にこたえてくれなくてもwwwwww
0386デフォルトの名無しさん2008/09/03(水) 17:32:59
>>384
アスキーコードを使うことが前提なら32を使っても構わない(連続性自体が文字コード依存だから)
0387デフォルトの名無しさん2008/09/03(水) 17:34:16
その言い方だと'a'-'A'ならアスキーコードじゃなくても通じるみたいに聞こえちゃうだろ
03883812008/09/03(水) 17:34:55
>>382
ありがとん
0389デフォルトの名無しさん2008/09/03(水) 17:34:55
'a'-32='A'だが'A'-32='a'はおかしい
0390デフォルトの名無しさん2008/09/03(水) 17:35:02
>>384
'a'や'A'が実際には数だって事を理解していれば
いちいちコードを調べずに済むからわかりやすいよ
0391デフォルトの名無しさん2008/09/03(水) 17:35:47
>>384
j = j - ('A'-'a');
これはどっちかといえば
j = (j - 'A') + 'a';
と考えたほうがいい
0392デフォルトの名無しさん2008/09/03(水) 17:36:43
>387
通じる可能性はあるから間違ってはいない
0393デフォルトの名無しさん2008/09/03(水) 17:37:06
なんでtoupper(), tolower()を使わないで車輪の再発明しようとしてるの?馬鹿なの?
0394デフォルトの名無しさん2008/09/03(水) 17:40:03
課題なんじゃね?
toupperやtolowerを使ってはいけないという条件付きの
0395デフォルトの名無しさん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;
  :
  :
0396デフォルトの名無しさん2008/09/03(水) 17:40:55
簡単な話題だとスレが伸びるねぇ
0397デフォルトの名無しさん2008/09/03(水) 17:41:40
いや、人のコードを見た上での疑問だろう。
0398デフォルトの名無しさん2008/09/03(水) 17:43:24
>>395
テーブル使う方法もあるよ!
結果的には同じようなものになるかもしれないけど。
0399デフォルトの名無しさん2008/09/03(水) 18:06:34
A〜Z 内にあるかの判定が 不連続だとめんどうってだけで

変換部に関しては
不連続でも 'A' を基準に B〜Z のオフセットの値と
'a' を基準に b〜z のオフセットの値とが一致していればよくね?
0400デフォルトの名無しさん2008/09/03(水) 18:09:35
EBCDICでも使える
04017412008/09/03(水) 18:14:10
いま思えば 'b'-'B'でもどっちにしろ32の差があるから-32でよかったんですね!

0402デフォルトの名無しさん2008/09/03(水) 18:48:33
32の差がある文字コード体系限定ならね
0403デフォルトの名無しさん2008/09/03(水) 19:31:11
Cで継承を実現するにはどうしたらいいですか。
0404デフォルトの名無しさん2008/09/03(水) 19:33:08
できるわけがない
0405デフォルトの名無しさん2008/09/03(水) 19:35:21
>>403
君の言っている継承が具体的にどのようなもので、実現というのが具体的に何を指すのかわからないが、たぶん無理
0406デフォルトの名無しさん2008/09/03(水) 20:01:37
http://codezine.jp/article/detail/885?p=1
↑こういう感じの「Cでオブジェクト指向プログラミングをする方法」みたいなのを書く人って定期的に現れるけど、
すなおにC++使ったほうがいいな。
0407デフォルトの名無しさん2008/09/03(水) 20:06:54
多態性は関数ポインタの配列で実現できることが分かったんで継承もできるのかなと。
0408デフォルトの名無しさん2008/09/03(水) 20:07:39
そりゃやろうと思えばできるよ。
0409デフォルトの名無しさん2008/09/03(水) 20:12:40
>>406
C++が出る前からオブジェクト指向プログラミングはある
言語でサポートしている範囲が違うだけ

Cでないといけない場合もあるだろうから、そういう記事はあったほうがいい
自分に今必要ないからといって、世の中に必要ないわけではないんだから
0410デフォルトの名無しさん2008/09/03(水) 20:24:49
変に技巧に走ってもいいことないよ。
素直にC++使えばいい。
Cしか使えないなら、Cらしいコードを書けばいいよ。
0411デフォルトの名無しさん2008/09/03(水) 20:31:40
>>410
>>406 の記事程度を変な技巧に走っているというなら
C++ で boost を使うのも変な技巧に走っているといえる

Cでオブジェクト指向プログラミングは
実際大した事ではないし、目くじら立てるほどの物でもない
0412デフォルトの名無しさん2008/09/03(水) 20:32:58
つうか意識しないでも使っちゃうよね
0413デフォルトの名無しさん2008/09/03(水) 20:43:41
>>411
boostは中身を意識しないで使えるから複雑でもいいよ。
>>406 の記事も、抽象型はいいけど、継承とか、無理やり感があって、筋悪だろ。
0414デフォルトの名無しさん2008/09/03(水) 20:45:40
>>413
中身を意識しないで使えるようにする方法だよ
class 書くのと変わらない
0415デフォルトの名無しさん2008/09/03(水) 21:07:43
>>414
中身を書く人向けでしょ。>>406の類の技法って。

C++でclassを書くのは、Cで無理やり継承やら多態やらをやるような技法とはぜんぜん違う。
0416デフォルトの名無しさん2008/09/03(水) 21:11:50
>>415
少なくとも >>406 の記事には継承も多態も関係ない
0417デフォルトの名無しさん2008/09/03(水) 21:22:09
何かと思って読んでみたけど>>406のような書き方って大昔からあるじゃん。
いまさらぐちゃぐちゃ言うようなものでない
0418デフォルトの名無しさん2008/09/03(水) 21:25:24
>>416
おまえ一ページ目しか読んでないだろ。
0419デフォルトの名無しさん2008/09/03(水) 21:27:20
登録とか面土井じゃん
0420デフォルトの名無しさん2008/09/03(水) 21:28:32
>>417
抽象データ型みたいのは、標準ライブラリにも入ってるしな。
「Cで継承、多態」みたいのも昔から、言ってるやつはいるけど、ぜんぜん使われてない。
言ってる本人でさえ、本当に使ってるのかよって思うよ。
0421デフォルトの名無しさん2008/09/03(水) 21:47:11
>>418
スマン、3ページ目読んでない
0422デフォルトの名無しさん2008/09/03(水) 21:49:41
GTK+-2.0はそうなってるよ。
昔からあるし、レアだけど使われてる場合もある。
0423デフォルトの名無しさん2008/09/03(水) 21:57:23
> 「Cで継承、多態」みたいのも昔から、言ってるやつはいるけど、ぜんぜん使われてない。

30年前から某有名どころでやってるのを知らない奴がまさかいるとはな
0424デフォルトの名無しさん2008/09/03(水) 22:43:24
>>422
ああ、GTKがあったね。
でもそれだって、抽象型とコールバック関数のイベントドリブンってイメージだけど。
(よく知らんけど)

とにかく、>>406 とか ↓これみたいのとか、よくあるCで無理やり系のテクニックって、まじで使ってんのかよって感じ。
http://www.sage-p.com/process/cool.htm#6-2
0425デフォルトの名無しさん2008/09/03(水) 23:15:21
IPを変えるのってどうやればいいか教えてください!!
0426デフォルトの名無しさん2008/09/03(水) 23:19:03
使っているOSによる
0427デフォルトの名無しさん2008/09/03(水) 23:21:32
Vistaでおま
0428デフォルトの名無しさん2008/09/03(水) 23:27:43
社内LANのIP?
0429デフォルトの名無しさん2008/09/03(水) 23:30:35
APIスレで聞け
0430デフォルトの名無しさん2008/09/03(水) 23:33:07
いや、自宅だよ
APIにいくわ。ホントはC#が一番知りたかったんだけどね
0431デフォルトの名無しさん2008/09/03(水) 23:35:52
自宅PCがアク禁を食らっちまって、なんとかIPを変えたいとかいうオチじゃないだろな。
もし、そうだとするならプロバイダーを変えなきゃだめだよ。
0432デフォルトの名無しさん2008/09/03(水) 23:44:19
最萌でIDでもかぶったんじゃない?
0433デフォルトの名無しさん2008/09/03(水) 23:46:38
いや、なんかプログラム中でずっとエラーになる時があるんだよね
多分他に原因があるんだとは思うんだけど、IP変えたりしたら繋がる時ってあるじゃん
今後も必要だろうからまずはそのやり方で挑戦してみようと思ったわけです
0434デフォルトの名無しさん2008/09/03(水) 23:48:34
まずイーサネットから勉強するんだ
04357412008/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;
}
0436デフォルトの名無しさん2008/09/03(水) 23:56:36
つか、LANに組み込まれていなければIPは設定されていないだろ
自宅でLANを構築しているというなら話は別だが

XPならコントロールパネル/ネットワーク接続/ローカルエリア接続/プロパティ
0437デフォルトの名無しさん2008/09/03(水) 23:57:32
天才あらわる
0438デフォルトの名無しさん2008/09/03(水) 23:59:28
>>435
意味ないだろ。
0439デフォルトの名無しさん2008/09/03(水) 23:59:48
>>435
全然違うじゃねーか!
04407412008/09/04(木) 00:00:05
これポインタに直してみたんですが
自分でもうまくいって満足です
ですがただ小文字を大文字にしか変換できないので、大文字を小文字にするには+=32なんですが
他の繰り返して入力するのをくめなくて>>329をポインタでやる方法誰か教えてください
0441デフォルトの名無しさん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;
}
0442デフォルトの名無しさん2008/09/04(木) 00:03:51
問題発見能力がどうたらこうたら
0443デフォルトの名無しさん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';
}
に換えるんだ。
0444デフォルトの名無しさん2008/09/04(木) 00:10:27
>>440
うまくいってないってヴぁ
0445デフォルトの名無しさん2008/09/04(木) 01:56:08
^=32
0446デフォルトの名無しさん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);
}

何度やってもコンパイルできないのですが、どこが原因なのか全くわかりません。
ご教示いただけますようお願いします。
0447デフォルトの名無しさん2008/09/04(木) 03:15:56
>>446
何を以ってコンパイルできないと判断したの?
その根拠を提示して欲しいな。
0448デフォルトの名無しさん2008/09/04(木) 03:29:10
この板ID表示したらおもしろいことになりそうだな。
0449デフォルトの名無しさん2008/09/04(木) 07:42:11
>>446
プログラムにはまったく問題ない
原因はお前の頭
0450デフォルトの名無しさん2008/09/04(木) 09:34:53
単継承 テンプレート無し C++ → C のトランスレータが欲しい
と思ったことはあった

ターゲットの開発環境には Cコンパイラしかなかった ってだけの話で
0451デフォルトの名無しさん2008/09/04(木) 09:39:15
昔はあったろ。いまはどこにあるのか知らんが
04524462008/09/04(木) 09:54:35
自己解決いたしました。

ファイル名を変えたら何の問題もなくコンパイルできました。
お騒がせして申し訳ありませんでした。
0453デフォルトの名無しさん2008/09/04(木) 11:35:24
>>357
>πってプログラムでいうとM_PIであらわせる
かどうかは解らない。
0454デフォルトの名無しさん2008/09/04(木) 11:39:25
M_PIってマクロ名は本当に標準な環境では準備されてないはずなんだっけ?
0455デフォルトの名無しさん2008/09/04(木) 12:06:02
呆れられそうな質問なんですが、ポインタを使うメリットって何ですか?
0456デフォルトの名無しさん2008/09/04(木) 12:06:43
いろいろ
というかCからポインタ−とったらBASIC程度のアプリしかできない悪寒
0457デフォルトの名無しさん2008/09/04(木) 12:19:14
よその言語が持っているあれもないこれもなくて、
全部ポインタで済ませるというのがC。
0458デフォルトの名無しさん2008/09/04(木) 12:23:10
>>457
というか元はアセンブラの延長なんで何もないのが基本でしょ。
それによそのあれこれってのが実はC->C++と進化する過程で
ごてごてくっついただけじゃん。
0459デフォルトの名無しさん2008/09/04(木) 12:23:18
>>454
math.hで#ifで定義されてるからね

#if defined __USE_BSD || defined __USE_XOPEN
みたいな
04607412008/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;
}
0461デフォルトの名無しさん2008/09/04(木) 13:05:42
getsは使用禁止
0462デフォルトの名無しさん2008/09/04(木) 13:06:42
>>460
最初は
j[0]=='\0';
でないと
0463デフォルトの名無しさん2008/09/04(木) 13:13:26
いつまでこんなカスみたいなプログラムいじり続けてんだよ
04647412008/09/04(木) 13:24:43
getsは何故禁止なんでしょう?
>>462
j[i]!='\0';じゃないんですか? j[i];とも書きますが。
j[0]=='\0';だとiが繰り上がっていかないのでNULL字までいかずに代入できませんi-=32;のように
0465デフォルトの名無しさん2008/09/04(木) 13:34:17
いや、そう書けって話じゃなくて、i[0]が'\0'じゃないとぶっ飛ぶぞって話だ。
つーか、>460で警告が出ないコンパイラの使い方してるの?
警告くらい出るようにしようや。
0466デフォルトの名無しさん2008/09/04(木) 13:42:33
まってくれ旦那、そいつは罠だ。触ってはいけねーぜ
0467デフォルトの名無しさん2008/09/04(木) 13:50:16
>>464
>getsは何故禁止なんでしょう?
gets は、渡されたバッファのサイズなんか知る由もないので
'\n' が現れるまではどんなに長い行でも読もうとする。
→所謂、バッファオーバーラン発生。
(fgets だと、バッファの長さを渡すようになってる)
まあ勉強のための短いコードや作り捨てツールじゃ問題に
ならない事が多いけども、使わないよう癖づけといた方がいい。
0468デフォルトの名無しさん2008/09/04(木) 15:19:12
>>464
char j[100] = {0};
初期化が必要という話だ
0469デフォルトの名無しさん2008/09/04(木) 22:25:19
まあ、事故れる道具は使うなってこったwww
0470デフォルトの名無しさん2008/09/04(木) 23:14:30
mallocとかってたとえばwinだったら中でwin32APIとかつかってるの?
0471デフォルトの名無しさん2008/09/04(木) 23:16:09
ああ
0472デフォルトの名無しさん2008/09/04(木) 23:16:43
確か使ってるはず
0473デフォルトの名無しさん2008/09/04(木) 23:18:02
>>470
使ってないんじゃないの?
使ってるかもしれんけど、コールされるたびに毎回API呼ぶような実装にはなってないと思う。
0474デフォルトの名無しさん2008/09/04(木) 23:31:17
>>470
ヒープ領域の開始アドレスとサイズを取得することと、空
きエリアを管理するテーブルのリストを作ることでmalloc系
は実装されていると思う。

空きエリアの管理にはAPIは必要がない。ヒープ領域の開
始アドレスとサイズを取得するときにAPIを使っているかもしれない。
0475デフォルトの名無しさん2008/09/05(金) 00:31:27
>>473
最近のVC++だとmallocは単にHeapAllocを呼ぶようになっている。
やつらにとっちゃ、mallocもHeapAllocも自分んとこで実装するわけだし、
2つも作るのは無駄でしかないんだろう。
0476デフォルトの名無しさん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 $");
って何ですか?
0477デフォルトの名無しさん2008/09/05(金) 03:24:48
rcsかなんかのバージョン管理ツールで追加されたコードでしょ。
04784772008/09/05(金) 03:33:35
間違えたかな?
0479デフォルトの名無しさん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 $");
04804552008/09/05(金) 05:12:08
レスありがとうございます。
先輩も、処理が早くなるから基本的に全部ポインタで作ると言ってました。
ありがとうございます。
0481デフォルトの名無しさん2008/09/05(金) 05:16:59
そっか
なーんも理解してなかったか
0482デフォルトの名無しさん2008/09/05(金) 05:19:35
ポインターないとすげー柔軟性の無いプログラムになりそうなだな。
構造体リストとかでも可変の場合は最大で使いそうな数以上を
見越して確保した状態でコンパイルとか
0483デフォルトの名無しさん2008/09/05(金) 14:50:24
C言語体当たり学習って本はタメ口でむかつくな。
0484デフォルトの名無しさん2008/09/05(金) 14:51:30
金もらって教える立場なんだからせめてメイド口調にしてくれないとな
0485デフォルトの名無しさん2008/09/05(金) 14:53:43
C言語体当たり学習は落ちこぼれニートの20〜30代のにおいがするぜ。
0486デフォルトの名無しさん2008/09/06(土) 02:38:39
>>477
>>479

ありがとうございました。
0487デフォルトの名無しさん2008/09/06(土) 14:07:20
K&Cの問題の回答をまとめてるwikiとかってありますか?
回答集が売ってますがあまり評判がよくないようなので
0488デフォルトの名無しさん2008/09/06(土) 14:10:50
>>487
K&C って正式名称?
0489デフォルトの名無しさん2008/09/06(土) 14:14:04
プログラミング言語C 弟2版 ANSI規格準拠

あ、K&Rだった。リッチーさん・・・
0490デフォルトの名無しさん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発売
0491デフォルトの名無しさん2008/09/06(土) 15:44:50
単純な疑問なんですけど、
for文にはなんで i,j,kがよく使われるの?
アルファベットの半分からってわけでもないし
0492デフォルトの名無しさん2008/09/06(土) 15:46:53
BASICのころからそんな感じ

アセンブラの名残かな?

レジスタはよく
ABCDEくらいまで使ったりするので
FGHくらいをあけてIJKあたりがループ用によく使われてる
0493デフォルトの名無しさん2008/09/06(土) 15:47:44
昔々、FORTRANというプログラミング言語で、
名前がi, j k, ..., nで始まる変数は整数、ほかで始まる変数は実数と決まっていたことに由来する。
0494デフォルトの名無しさん2008/09/06(土) 15:48:08
FORTRANの暗黙の型宣言じゃないの
0495デフォルトの名無しさん2008/09/06(土) 15:50:20
i がインクリメントの略だから
ポインタに p,q が用いられるのと同じ
0496デフォルトの名無しさん2008/09/06(土) 15:51:14
Fortran説が正しい。
0497デフォルトの名無しさん2008/09/06(土) 15:51:17
iteratorだからiつかって、足りなくなったから続けてj,kってしたんじゃね?真実はどか知らんけど
0498デフォルトの名無しさん2008/09/06(土) 15:51:21
>>495
また嘘を
0499デフォルトの名無しさん2008/09/06(土) 15:52:38
もともとINTEGERのI
FORTRANが元なのは書いてあるとおり。
0500デフォルトの名無しさん2008/09/06(土) 15:53:17
まあそんな感じだよね

マシン語のレジスタも
Aがアキュムレーター
Bがベース
とかなんか無理やり付いてるしwww
0501デフォルトの名無しさん2008/09/06(土) 15:54:41
FORTRANはfor文じゃなくてDO文だけどね。
0502デフォルトの名無しさん2008/09/06(土) 16:05:39
どっちにしろ昔の命名ルールはなんか省略して記号にするのが多いよね。
やっぱメインフレームとかで1行80文字以下みたいなのがあったのが原因?
0503デフォルトの名無しさん2008/09/06(土) 16:11:13
まあ、今となってはちゃんと意味の有る命名しようと思う。
自分も適当になると、iとかjk、使いまくり。
0504デフォルトの名無しさん2008/09/06(土) 16:11:59
ソースの見通しがいいからだよ。
ハンガリアンなぞMSでも否定されとる
0505デフォルトの名無しさん2008/09/06(土) 16:12:26
FORTRANのINTEGERなのはそうだけどさ…
元々は数学の慣例じゃないの?
0506デフォルトの名無しさん2008/09/06(土) 16:14:12
>>503
別にループカウンタはiとかjでもいいよ。
0507デフォルトの名無しさん2008/09/06(土) 16:15:29
>>502
そうだな。
そもそもスクリーンじゃなかったしな。
0508デフォルトの名無しさん2008/09/06(土) 16:17:44
>>506
そだな。
ループ部分はあんまり関係ないしな。
ただ、これが許されるのはへんなソース書かない奴だけにして欲しいww
ループの中がやったら長いとかそういう場合は簡便w
0509デフォルトの名無しさん2008/09/06(土) 16:19:39
いやむしろループのカウンタには積極的に使って欲しいがなあ。
これ以外の用途で使うのは簡便
0510デフォルトの名無しさん2008/09/06(土) 16:23:13
やっぱ簡単な話題だとスレが伸びるねぇ
0511デフォルトの名無しさん2008/09/06(土) 16:26:49
難しい話題の方が答えられる人少ないに決まってるだろ?バカなの?
0512デフォルトの名無しさん2008/09/06(土) 16:27:55
何のカウンターなのかそこに命名で意味を持たせるのは、
別に悪いことじゃないと思う。

>>510
全てに於いて、基本は大事よ?
0513デフォルトの名無しさん2008/09/06(土) 16:28:34
難しい話題で見当違いの回答つけてスレ伸ばすのだけは勘弁
0514デフォルトの名無しさん2008/09/06(土) 16:34:05
nからmまでの合計の和みたいな計算ってどうやるんでしょうか
0515デフォルトの名無しさん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);
}
0516デフォルトの名無しさん2008/09/06(土) 16:43:01
>>514
日本語でおk
0517デフォルトの名無しさん2008/09/06(土) 17:00:00
このスレ見ててよく思うけど質問のレベルで技量を察してやれよ
再帰なんか分からないだろう

>>514
もっと具体的に
0518デフォルトの名無しさん2008/09/06(土) 17:02:20
具体的というより厳密に
0519デフォルトの名無しさん2008/09/06(土) 17:04:11
ヒープとスタックってどないちがうん?
0520デフォルトの名無しさん2008/09/06(土) 17:04:43
ぜんぜん違う
0521デフォルトの名無しさん2008/09/06(土) 17:06:27
>>514
エスパーでこんなところか?

int getGoukei() {
int goukei = 0;
int i;
for (i = n; i <= m; i++) {
goukei += i;
}
return goukei;
}
0522デフォルトの名無しさん2008/09/06(土) 17:15:09
>>521
int getGoukei(int n, int m) {

にしてやらないとな。
05234912008/09/06(土) 18:37:52
>>492-509

皆さん博識っぷりにはびっくりたまげたもんざえもんです
0524デフォルトの名無しさん2008/09/06(土) 18:40:37
>>514
(m + n) * (m - n + 1) / 2;
0525デフォルトの名無しさん2008/09/06(土) 19:38:21
まぁ、IntegerかIteratorかは兎も角、Incrementだけはないわ。
0526デフォルトの名無しさん2008/09/06(土) 19:50:55
「nからmまでの」と書かれた場合、n<mが前提だと思うのは若干エスパーな希ガス
0527デフォルトの名無しさん2008/09/06(土) 19:55:28
大丈夫、普通の神経の持ち主ならわざわざ5から3なんて使い方はしない。
05285142008/09/06(土) 20:44:51
説明不足ですみません、携帯から失礼します

例えば数字を2つ入力して1つめの数字から2つめの数字までの合計(例えば1から10の合計→55)
を出すような感じにしたいのですができる限り簡潔に書くにはどうすればよいのかと思い質問しました
0529デフォルトの名無しさん2008/09/06(土) 20:48:19
>>529
>524
0530デフォルトの名無しさん2008/09/06(土) 20:49:18
>>524
って何も考えないでみたら顔文字にみえるなw
0531デフォルトの名無しさん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;
}
これで満足?
0532デフォルトの名無しさん2008/09/06(土) 21:23:56
それはないわ…
0533デフォルトの名無しさん2008/09/06(土) 21:31:21
このスレ、学生が定期的に課題丸投げにしてくるな
楽して単位とるなとはいわないけど、せめて宿題丸投げスレで聞けよ
0534デフォルトの名無しさん2008/09/06(土) 22:03:36
>>491
indexのi。ルーツは数学。iの次だからってj,kも使われる。
0535デフォルトの名無しさん2008/09/06(土) 22:28:36
いや、integerのiでしょ。
0536デフォルトの名無しさん2008/09/06(土) 22:29:52
>>534
>>535
不毛だからやめとけ
0537デフォルトの名無しさん2008/09/06(土) 22:32:45
不毛だな
旧世代のオッサンが考えたことだ。
理由を探すのも面倒。特に割りとあいまいに処理されるIT関連の擁護とかをみてると。
0538デフォルトの名無しさん2008/09/06(土) 22:44:04
不毛以前に今までのやり取りをぜんぜん見てないのが気になる
0539デフォルトの名無しさん2008/09/06(土) 22:45:26
不毛って、普段Cのプログラミングで変数iを使っていて
iがどんな意味何かを考えたことはないの?

それはそれで問題があるだろ。
0540デフォルトの名無しさん2008/09/06(土) 22:47:00
>>538
なるほど、同じような書き込みがあったね。スマン。
05415372008/09/06(土) 22:52:44
>>539
すまん
ほかの低級言語でそういうごろあわせみたいな意味を持たせてるのは知ってるから
どうせなんか意味あるんだろうなて放置してる。
0542デフォルトの名無しさん2008/09/06(土) 22:57:59
問題です。a[2]を2[a]とするのは正しいでしょうか?
0543デフォルトの名無しさん2008/09/06(土) 22:58:56
いみがわかりません
0544デフォルトの名無しさん2008/09/06(土) 23:01:55
却下
0545デフォルトの名無しさん2008/09/06(土) 23:03:35
int a[3]と言う宣言に対してa[2]と書いても2[a]と書いても意味は同じ。
尤も、見た目の印象は壊滅的に違うが。
0546デフォルトの名無しさん2008/09/06(土) 23:10:52
a[2]=*(a+2)=*(2+a)=2[a]
0547デフォルトの名無しさん2008/09/06(土) 23:14:27
2[a]
これがかけるのは知らんかった

しかしこんな不細工な書き方OKなんだな>コンパイラ
0548デフォルトの名無しさん2008/09/06(土) 23:16:52
1[strchr("abc", 1["abc"])] = 'C'なんて書かれたら最早何がなんだかw
0549デフォルトの名無しさん2008/09/06(土) 23:17:19
そもそも[]がシンタックスシュガーだから
0550デフォルトの名無しさん2008/09/06(土) 23:19:04
>>547 []は演算子なんだよね
05515472008/09/06(土) 23:24:37
>>550
なるほど
配列としてみると気持ち悪いが、ポインタとしてみればそんなもんか
0552デフォルトの名無しさん2008/09/06(土) 23:38:16
言わずもがなだが、配列名はポインタと同じくアドレス値をもつが、
ポインタが変数なのに対し、配列名は定数という違いがある。
0553デフォルトの名無しさん2008/09/07(日) 00:30:42
[]がシンタックスシュガーのわけないだろ。
0554デフォルトの名無しさん2008/09/07(日) 00:33:36
>>553
無知乙
0555デフォルトの名無しさん2008/09/07(日) 00:35:55
シンタックスシュガーって
a[1]
*(a+1)
が書き方は違うけど等価になるってことでしょ

どっちか片方だけを指して a[1] は糖衣構文だけど *(a+1) は違うとか言わないよね?
0556デフォルトの名無しさん2008/09/07(日) 00:39:39
>>555
シンタックスシュガーに対する認識が間違ってる。
0557デフォルトの名無しさん2008/09/07(日) 00:40:51
等価だけどそうじゃなくて
プログラマーに優しい別の書き方の事
0558デフォルトの名無しさん2008/09/07(日) 00:41:44
[ ] の方がプログラマーに優しいって事?
0559デフォルトの名無しさん2008/09/07(日) 00:42:40
->
0560デフォルトの名無しさん2008/09/07(日) 00:42:43
>>558
少なくともリッチーはそういう場合もあると考えたということなんだろう。
0561デフォルトの名無しさん2008/09/07(日) 00:44:18
同じことをするのに違う書き方ができたら全部シンタックスシュガーとか言っちゃうやつ多いな。
0562デフォルトの名無しさん2008/09/07(日) 00:46:53
ほんとに多いのか?
そんな奴俺だけで十分だろう
0563デフォルトの名無しさん2008/09/07(日) 00:48:46
wikipedia だと for は while のシンタックスシュガーだと書いてある
じゃあ while は if と goto のシンタックスシュガーになるのか?
気持ち悪いな
0564デフォルトの名無しさん2008/09/07(日) 00:51:03
>>563
そうだよ。
0565デフォルトの名無しさん2008/09/07(日) 00:51:04
まあ、大抵はタイプ数が少なくなるから
優しいという感じな気がする
0566デフォルトの名無しさん2008/09/07(日) 00:54:03
いきなりですけど・・・C言語とかエディタ上で使う数字は、つまり
表示される数字なんですけど、既に数値なのか、取りあえずテキスト
としての数字なのか、どっちなのでしょうか?
0567デフォルトの名無しさん2008/09/07(日) 00:55:00
後者
0568デフォルトの名無しさん2008/09/07(日) 00:55:17
>>566
テキストとしての数字です
0569デフォルトの名無しさん2008/09/07(日) 00:55:29
>>566
数字です。
0570デフォルトの名無しさん2008/09/07(日) 00:55:47
>>566
日本語でおk
0571デフォルトの名無しさん2008/09/07(日) 00:57:36
> は < のシンタックスシュガーなんだろうか
0572デフォルトの名無しさん2008/09/07(日) 00:57:42
>>564
それは機械語に置き換わるレベルの話だな

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

>>566
後者です。
コンパイルする段階で数字などに置き換わります。
0573デフォルトの名無しさん2008/09/07(日) 01:02:05
>>571
条件判定式の?
だったらアセンブラにあるよ。
ただ||や&&はない
0574デフォルトの名無しさん2008/09/07(日) 01:03:40
>>572
機械語に置き換わるっていうか、実行時にな。

ソースなんだからそりゃテキストだけど、意味的には数値だろ?
>>566が、どういう意図で質問したかで答えは変わるか。
0575デフォルトの名無しさん2008/09/07(日) 01:09:09
すいません。あまり深い意味はありませんが・・・
エディタで処理する以上テキストという認識でよいのでしょうか?
早速のご回答有難う御座います。少しかじってみたいのですが。
0576デフォルトの名無しさん2008/09/07(日) 01:10:38
>>575
自分で書いてるソースをバイナリーエディタで
見てみるとすっきりしますよ。
出てくるコードはアスキーコード表にのってますので
0577デフォルトの名無しさん2008/09/07(日) 01:17:43
ご丁寧に有難う御座います。バイナリーエディタ?
本当に初心者で何をそろえようかなというレベルです。
0578デフォルトの名無しさん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;
}
0579デフォルトの名無しさん2008/09/07(日) 01:26:53
少なくともソースが簡略になっていないと、シンタックスシュガーとは呼べない。
0580デフォルトの名無しさん2008/09/07(日) 01:29:47
perlには見やすくなったかかなり疑問なシンタックスシュガーあるぜ!
0581デフォルトの名無しさん2008/09/07(日) 03:14:20
>>578
「シンタックス」 シュガーだろ。
「セマンティクス」シュガーじゃねーよ。
0582デフォルトの名無しさん2008/09/07(日) 03:48:48
Cやってみようか。
0583デフォルトの名無しさん2008/09/07(日) 03:53:05
入門編を信じてお聞きしますが、何かいい書籍(他にスレありそう
ですが専門的過ぎて)等ありますか。やはり情報処理試験とかある
程度基本的な資格取りに専念した方がいいのでしょうか?
質問ばかりでスミマセン。
0584デフォルトの名無しさん2008/09/07(日) 04:02:50
あなたの目的は?
0585デフォルトの名無しさん2008/09/07(日) 04:27:11
fork, pipe, dup2 を使用して
指定してされたコマンドに標準入力にデータを投入し、
そのコマンドの出力結果を取得する popenの双方向版 のような
関数を作ろうとしております。

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

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

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

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

「標準入力から read -> 標準出力に write」 の場合でも
指定するコマンドの読み書きの仕方/バッファリングの仕方に関係なく
親プログラム側でデッドロックがかからなくする方法を知りませんでしょうか?
05865852008/09/07(日) 04:29:07
OKだったコマンドとデッドロックがかかってしまうコマンドの例です。

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

デッドロックがかかる場合:
while(..read(..)..){
// 読みながら書き込み
write(..);
}
--
0587デフォルトの名無しさん2008/09/07(日) 04:34:15
理系の学生にCをやるとコンピュータ(プログラム)のことが分かる
と言われたことがあって、とりあえず基本から始めて、向いていそう
だったら、いろいろなアルゴリズムにも手を出してみようかと。
少しあまいかもしれませんが、基本的には好奇心です。仕事などでは
Office製品しか使ってません。(あと業務用のパッケージ)
ポインタが難しいとかよく聞きますが
ポインタ=アドレス?それともポインタとはアドレスを扱う変数?
そもそもその辺がちょっとした本を見てもいま一つの感じです。
0588デフォルトの名無しさん2008/09/07(日) 06:05:53
select()
シグナル
wait3()
共有メモリ
あたりは知ってる?
0589デフォルトの名無しさん2008/09/07(日) 06:33:04
>>587
先ずは、社会常識と日本語を学ぶことから始めると宜しいかと。
05905852008/09/07(日) 07:24:58
>>588
漠然としてて答えにくいですが、知っているつもりです。

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

ちょっと調べてみます。
0591デフォルトの名無しさん2008/09/07(日) 08:14:48
自己解決しました
0592デフォルトの名無しさん2008/09/07(日) 08:55:49
ハロワ募集の内容が
基本的な操作ができること
どういう意味?
0593デフォルトの名無しさん2008/09/07(日) 09:36:17
>どういう意味?
マ板に逝け。
0594デフォルトの名無しさん2008/09/07(日) 10:22:50
すみません。
0595デフォルトの名無しさん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;
}
05965952008/09/07(日) 14:52:22
追記。
読み込むファイルは行ごとに文字数がバラバラです。
調べたけれど、原因がほんとに理解できないorz
0597デフォルトの名無しさん2008/09/07(日) 14:53:21
かんきょーはうぃんどうず?
05985952008/09/07(日) 14:58:08
すみません、環境書くの忘れてました。

OS:Linux Fedora8
コンパイラ:gcc (バージョン失念しました。Fedora8インストールの際に入れたものです。
0599デフォルトの名無しさん2008/09/07(日) 15:02:28
日本語食えないとこに日本語食わせていじったらそら文字化けする。
0600デフォルトの名無しさん2008/09/07(日) 15:06:16
>>599
S-JISならTABは問題ないとおもうけど
0601デフォルトの名無しさん2008/09/07(日) 15:07:02
fgetsの使い方が変?
0602デフォルトの名無しさん2008/09/07(日) 15:17:07
横から質問申し訳ないんですが
>>595にあるようなfopen("sample.csv", "rt");
のtはどういう意味なんでしょうか
manでfopenを見てもありません
0603デフォルトの名無しさん2008/09/07(日) 15:17:31
つーかさ1行の文字数ってどのくらいあるの?
このソースだと2バイトしか読めないぞ
0604デフォルトの名無しさん2008/09/07(日) 15:18:49
t text
b バイナリー
だったかな
0605デフォルトの名無しさん2008/09/07(日) 15:22:52
時折、ポインタを進めるのにsizeofを使うコードを見かけるんですが、
これって普通に使う手法でしょうか?

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

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

sizeofが、コンパイル時時に定数に置き換えられれば良いけど、
プログラム実行時に毎回引数の型のサイズを見てたら、
無駄に処理が重くなるんじゃない?と疑問に思ったりと。
0606デフォルトの名無しさん2008/09/07(日) 15:26:01
>>605
char*をint*にしたらどうなると思う?
06075952008/09/07(日) 15:26:23
>>603さん
行によってマチマチなんですが、おおよそ1行で150文字くらいですね。
#define buff_size 2 となっているのは暫定で適当につけたものです。
とにかく出力さえ、うまくできれば・・・と思っていますorz
0608デフォルトの名無しさん2008/09/07(日) 15:28:00
>>605
見ない

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

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

Cで型についてうるさいのはこういうことをコンパイラがわからないと困るから。
0609デフォルトの名無しさん2008/09/07(日) 15:28:42
>>605
ほんとにそんなコード時折見るのか?
指してるサイズ分すすめるのは+1だぞ?
0610デフォルトの名無しさん2008/09/07(日) 15:29:03
>>607
fgetでrtだと一行まるまるよまれるからそのままだと2バイトしか読まないので
バッファサイズを256にでもしておけば?
0611デフォルトの名無しさん2008/09/07(日) 15:34:13
>>604
ありがとうございます
0612デフォルトの名無しさん2008/09/07(日) 15:38:20
>>608〜609さん
レスありがとうございます。
最近、外注先かの納入物で見ます。
val = *rPtr;
rPtr +=sizeof(char);
↓
val = *rPtr++;
と個人的には書きたいんだけど・・・問題あるのかしら?と悶々としてたり

ちなみに通信系のコードなので、1バイト境界での読み込みしかしませんので、
常にchar*を使用します、int*は使わないです。
intは、2byteか4byte長になるかの機種依存性ありますし・・・。
06135952008/09/07(日) 15:39:17
>>610さん
バッファサイズは3,4,8,16・・・128,256,512,1024など色々試したんですが
いずれも化けるか、おかしな改行が入ったりする状況です。

違う関数のほうがいいのだろうか
0614デフォルトの名無しさん2008/09/07(日) 15:43:20
>>602
VC++独自だから忘れていい。
604の言う通りだが、通常はbを指定しないことでテキストモードを表す。
0615デフォルトの名無しさん2008/09/07(日) 15:43:52
元ファイルの改行コードがCRLFとか?
0616デフォルトの名無しさん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
0617デフォルトの名無しさん2008/09/07(日) 15:48:39
>>614
なるほど
どうりでmanに載っていないわけです
ありがとうございました

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

fgetって改行コードって全部のOSの分みてくれないんだっけ?
3パターンくらいあったよね?
0619デフォルトの名無しさん2008/09/07(日) 15:57:23
なんのためのテキストモードだと思ってんだよ・・・
06206182008/09/07(日) 15:59:36
すまねえw
テキストモードで1行単位で読むと遅いのでバイナリーモードで
メモリにあげて自前でやってたから気にしてなかったわ。

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

とか言ってる奴がいるんだが大丈夫なのか?覚えなくても
0622デフォルトの名無しさん2008/09/07(日) 16:03:24
>>621
すれ違い
0623デフォルトの名無しさん2008/09/07(日) 16:04:21
>>622

すまん
0624デフォルトの名無しさん2008/09/07(日) 16:05:01
>>621
そもそもそういうのがない言語だったとしても、
ググって見つけたコードを書き換えるだけだから、
C++に限らず覚える必要はないと思う、理解さえできていれば。

ちなみに、Cにもqsortがあるよ。
0625デフォルトの名無しさん2008/09/07(日) 16:18:10
覚えるというか原理位知ってくれないと

ソートされてない配列に対してbsearch呼んで
「これライブラリのバグじゃないスかねぇ?」
とか抜かしたウチの新人の様になるので気をつけてください
0626デフォルトの名無しさん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抜けなくて良い?

コードを、ざっと見て気になりました。
0627デフォルトの名無しさん2008/09/07(日) 16:26:31
>>624-625

サンクス
06285952008/09/07(日) 16:44:31
皆様ありがとうございます。

>>615氏
ファイル自体はWindowsで作ったものなんで、CRLFになっているはずですね。
改行コードの処理ちゃんとせないかんですねorz

>>616氏
バッファの初期化は確かにやってなかったですねorz
ロジック含めてもう一度見直します。

>>626氏
fgetsはNULLを追加するみたいです。
初期化はやっぱりしてませんでした。その辺の処理きちんとしときます。
while抜ける処理も書いてないですね確かにorz
0629デフォルトの名無しさん2008/09/07(日) 16:46:03
o(゜◇゜o)ホエ?
0630デフォルトの名無しさん2008/09/07(日) 17:02:35
>>612
たぶんその外注先がヘボ
0631デフォルトの名無しさん2008/09/07(日) 17:07:23
>>628
NULLを追加するんじゃなくてエラーが起きたかEOFに達したときはNULLを返す、だろ
0632デフォルトの名無しさん2008/09/07(日) 17:13:40
>>631
628の言っているNULLは\0のことだと思う。
0633デフォルトの名無しさん2008/09/07(日) 17:18:17
まあなんにせよいろいろ突っ込みどころの多いコードだな
0634デフォルトの名無しさん2008/09/07(日) 17:20:24
とりあえず
・returnは値を返せ
・resultのfopenもチェックしろ
・fgetsの戻り値はchar*
0635デフォルトの名無しさん2008/09/07(日) 17:24:02
っていうかコンパイルできねーだろこれアホか
0636デフォルトの名無しさん2008/09/07(日) 17:25:02
他にも幾つか。
・グローバル変数は使うな。
・入力を再利用しないのなら、入力バッファと出力バッファを分ける必要は無い。
・','を探すのは、標準関数を使おう。
・えらーちぇっくするなら、fprintf()だけでなく(出力の)fclose()もエラーチェックすべき。
・勿論、>634の指摘したとおりfopen()も。
・型について、もう少し慎重にチェックすること。
・コンパイラは最低限の警告くらい出すようにしよう。
# 例えばgccなら gcc -Wall ...
0637デフォルトの名無しさん2008/09/07(日) 17:26:02
>>635
Cではプロトタイプと引数が食い違っててもコンパイルはできるよ
0638デフォルトの名無しさん2008/09/07(日) 17:26:49
単にstrafterにコピーしたあとヌル文字つけてないだけだろ
0639デフォルトの名無しさん2008/09/07(日) 17:29:09
あとfprintfの書式指定文字列に配列放り込むな
0640デフォルトの名無しさん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;
}
0641デフォルトの名無しさん2008/09/07(日) 17:36:52
>>640
・fputs()を使わない訳は?
・strchr()を使わない訳は?
・main()で-1を返す訳は?
0642デフォルトの名無しさん2008/09/07(日) 17:38:55
・fputs()を使わない訳は? 特に無い
・strchr()を使わない訳は? 特に無い
・main()で-1を返す訳は? 特に無い
06436412008/09/07(日) 17:40:35
あいわかった。
0644デフォルトの名無しさん2008/09/07(日) 17:41:39
mainで-1を返すのはエラーだって分かりやすくするために良く使う
0645デフォルトの名無しさん2008/09/07(日) 17:44:27
641はmainの戻り値は1とか正の値のほうがいいのでは?と言いたいんだと思う。
0646デフォルトの名無しさん2008/09/07(日) 17:44:29
処が大抵のコマンドインタプリタは終了ステータスを正の整数としてしか扱わない。
06476412008/09/07(日) 17:47:02
>>645
×int main(){return -1;}
○int main(){return 0;}
◎int main(){return EXIT_FAILURE;}
06486412008/09/07(日) 17:48:33
うへ、return 0じゃねぇよ、return 1だぜ。
0649デフォルトの名無しさん2008/09/07(日) 18:27:47
EXIT_FAILUREはexitの時には使うけど
returnでは何故か使わない…
考えたら変な癖だな
0650デフォルトの名無しさん2008/09/07(日) 19:07:14
returnは1、2、3…と増やしていくようにしてるな
使わないけど
0651デフォルトの名無しさん2008/09/07(日) 19:09:33
int main(int argc, char** argv)
**って、なに?
ポインタのポインタ?
0652デフォルトの名無しさん2008/09/07(日) 19:13:37
fcloseの戻り値でエラーチェックって、なんかする意味あるのか?
0653デフォルトの名無しさん2008/09/07(日) 20:13:10
他人のコードを読んでいて、
unsigned char status:4;
のような宣言を見つけたのですが、:4はどのような意味があるのでしょうか。
0654デフォルトの名無しさん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を散逸させるのは控えた方が良い。
0655デフォルトの名無しさん2008/09/07(日) 20:57:59
>>651
char**は、char*を指すポインタ

>>652
まだバッファに残ってたデータがディスクフルとかで書き込めなかったときにわかるんじゃない?たぶん

>>653
ビットフィールド
0656デフォルトの名無しさん2008/09/07(日) 21:00:55
>>652
ストリーム出力はバッファリングされるので、fprintf()で全てが出力されるわけではない。
バッファに残っている分は、fclose()によって出力(フラッシュ)される。
従って、(最早殆ど意識する必要が無いとはいえ)最後の最後にディスクフルになって書けないかも知れない。
それを検出するためには、書き込み後のfclose()の戻り値はチェックしておく習慣をつけることが望ましい。
逆に、入力後のfclose()は通常エラーを起こすとは考え難いので省略してしまうことが多い。
0657デフォルトの名無しさん2008/09/07(日) 21:02:37
Cではmainを再帰呼び出しできるしなぁ
0658デフォルトの名無しさん2008/09/07(日) 21:17:35
Cって開発環境は何つかえばいいの?
0659デフォルトの名無しさん2008/09/07(日) 21:18:17
visualC++
0660デフォルトの名無しさん2008/09/07(日) 21:22:38
>>659
Cも使えるんですか?
0661デフォルトの名無しさん2008/09/07(日) 21:23:55
>>660
大丈夫だMSを信じろ
0662デフォルトの名無しさん2008/09/07(日) 21:25:37
>>661
ググってみたんですがC非対応と…
信じて良いですか?
0663デフォルトの名無しさん2008/09/07(日) 21:28:16
確かに誰も使っていない最新のC99規格には対応していない。
でも、一般的に用いられているC89-C95には対応しているから大丈夫。
ファイルの拡張子やオプションでCとC++から選べるようになっている。
0664デフォルトの名無しさん2008/09/07(日) 21:30:12
VCが一番。 GCCやBCCとかあるけど、MS製のライブラリはたくさんあるし
MS以外のライブラリもたくさんだし、安定度も速度も一級品。
0665デフォルトの名無しさん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
でいいのかな。
0666デフォルトの名無しさん2008/09/07(日) 22:25:54
?

a[0]=b
a[1]=c
a[2]=d
0667デフォルトの名無しさん2008/09/07(日) 22:28:14
>>665
面白いけど
a[1]=b;
でダメな理由が分からない
0668デフォルトの名無しさん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

ってなるんだお。意味不・・・
0669デフォルトの名無しさん2008/09/07(日) 22:33:56
a,b,cの宣言部分から書いてみろよー
0670デフォルトの名無しさん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

ウマーーー!!!!!
0671デフォルトの名無しさん2008/09/07(日) 22:44:32
あ、いやw書いててわかったかもしれんw
forの中で毎回宣言しなくちゃならんのかな?
0672デフォルトの名無しさん2008/09/07(日) 22:47:37
あ・・・れ・・・?
C言語にnewなんてあったっけ・・・?
0673デフォルトの名無しさん2008/09/07(日) 22:48:55
どこから突っ込もうか
0674デフォルトの名無しさん2008/09/07(日) 22:50:18
すまん、スレ違いだったな。
for内で毎回領域確保しないといけないんだな。
ありがとう。
0675デフォルトの名無しさん2008/09/07(日) 22:51:41
あ、良かったら突っ込んでください。もっといい書き方あるのかな。
0676デフォルトの名無しさん2008/09/07(日) 23:08:50
for(i=0,i<10,i++)){
 featlist[i] = new kata[MAX_FEATURES];
}
0677デフォルトの名無しさん2008/09/07(日) 23:12:18
いい書き方より、デバッグの仕方を覚えたほうがいいような?
0678デフォルトの名無しさん2008/09/07(日) 23:27:43
まず文法がわかってるかどうかから怪しい
06796532008/09/07(日) 23:30:36
>>655
ありがとうございます!理解できました。
0680デフォルトの名無しさん2008/09/07(日) 23:38:23
でででばっくのしかた?
0681デフォルトの名無しさん2008/09/08(月) 00:02:13
BASICの質問してる人がいるの?
0682デフォルトの名無しさん2008/09/08(月) 00:29:32
C言語を今日から学ぼうと思ってる者です
C言語を学ぶならコンパイルがないと始まらない、と説明書で読んだのでVisual C++ 6を使いたいのですが
(これコンパイラですよね?)フリーソフトかどうかわかりません。どういう意味でしょうか?
0683デフォルトの名無しさん2008/09/08(月) 00:31:16
どういう意味、ってどういう意味なのかよく分からんが、
とりあえず Visual C++ 2008 Express Edition 落としてこれば問題ない
0684デフォルトの名無しさん2008/09/08(月) 00:31:36
VC++6.0は有償です
VC++2008 ExpressEditionで
0685デフォルトの名無しさん2008/09/08(月) 01:04:53
どうしようもないくらい初歩的なことですみません
VC++で1つのプロジェクトに複数の.cppファイルを作ったとき
ビルド→実行で全体のプログラム?を実行することはできますがプロジェクトの中にあるうちの
1つだけの.cppファイルを実行したいときはどうすればよいのでしょうか?
0686デフォルトの名無しさん2008/09/08(月) 01:06:19
関数名をmainにしたら動くんじゃないか。
関数の動作チェックがしたいんかい?
0687デフォルトの名無しさん2008/09/08(月) 01:09:12
まだ始めたばかりなので上手く表記できないのですが例えば

関数1
{
  2を呼び出し
  3を呼び出し
  4を呼び出し
}

みたいな感じのときに1(全体)ではなく2、3、4単体の動作チェックを行いたいです
0688デフォルトの名無しさん2008/09/08(月) 01:26:07
cl.exeをコマンドラインから実行するとか
0689デフォルトの名無しさん2008/09/08(月) 01:33:10
関数1
{
  2を呼び出し
  /*3を呼び出し*/
  /*4を呼び出し*/
}
0690デフォルトの名無しさん2008/09/08(月) 01:36:36
>>687
テスト用のmain関数を作る。
当然別プロジェクトでテスト対象の関数の.cファイルは同一。
0691デフォルトの名無しさん2008/09/08(月) 14:00:05
#include <stdio.h>
int main(void){
printf("hello");
}

「14歳から始めるわくわくゲームプログラム」
と言う本にあったサンプルプログラムなのですが、エラーが出てしまって全く先に進みません。
ボーランド製のC言語です。
0692デフォルトの名無しさん2008/09/08(月) 14:01:16
>エラーが出てしまって全く先に進みません。
エラーの種類は?
0693デフォルトの名無しさん2008/09/08(月) 14:02:35
エラーの内容を正確に書いてくれないと。
環境設定をやってなくて、xxx.objが見つからないとかいうエラーじゃないの?
0694デフォルトの名無しさん2008/09/08(月) 14:03:12
その前に、stdio.hが見つからない、とかになるか。
0695デフォルトの名無しさん2008/09/08(月) 14:05:20
return 0;
0696デフォルトの名無しさん2008/09/08(月) 14:06:18
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照

です
0697デフォルトの名無しさん2008/09/08(月) 14:06:33
>>691
そんな変なタイトルの本、ほんとにあるのか?w
0698デフォルトの名無しさん2008/09/08(月) 14:06:47
初期設定しろ!
0699デフォルトの名無しさん2008/09/08(月) 14:07:06
まず>>695のを入れるべきだな。
話はそれからだ。
0700デフォルトの名無しさん2008/09/08(月) 14:07:55
>>697
尼で見た記憶がw
0701デフォルトの名無しさん2008/09/08(月) 14:08:58
設定ファイル "bcc32.cfg" と "ilink32.cfg" の設定はしたんだろうな?
0702デフォルトの名無しさん2008/09/08(月) 14:09:35
ググったら「14歳からはじめる〜」シリーズは結構あるんだなw
姉妹品に、「15歳からはじめるDirectX9 3Dゲームプログラミング」というのもあった。
0703デフォルトの名無しさん2008/09/08(月) 14:11:27
そういう初めてシリーズだと環境設定から書いてあるだろ。
読んだのか?最初から。
読んでもしそういうのが無ければその本返品しろw
0704デフォルトの名無しさん2008/09/08(月) 14:16:03
しかし、>>696のエラーだとmain()のつづりミスじゃないのかなあ。
質問者はエラーの出たソースをそのままコピペしたか?
0705デフォルトの名無しさん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

です
初期設定は本に書いてある通りに行ってます。
0706デフォルトの名無しさん2008/09/08(月) 14:24:35
>>705
コピペしたか気にしてるのは>>691のほうだよ。
0707デフォルトの名無しさん2008/09/08(月) 14:41:29
>>686
>>688-691
ありがとうございました
0708デフォルトの名無しさん2008/09/08(月) 14:41:53
>>706
サンプルファイルでそのままフォルダにあったものをコピペしてます。
0709デフォルトの名無しさん2008/09/08(月) 14:43:44
>>708
その本のどこかに訂正を書いてあるページとかない?
なければゴミシリーズ決定だな>その出版社の本
0710デフォルトの名無しさん2008/09/08(月) 14:47:47
皆様へ

いろいろやってたら動くようになりました。
どうもありがとうございます。
0711デフォルトの名無しさん2008/09/08(月) 14:59:51
なんちゃそりゃ。
0712デフォルトの名無しさん2008/09/08(月) 15:00:33
上書きを忘れてたんだよきっと
0713デフォルトの名無しさん2008/09/08(月) 16:50:35
「12歳から始めるTex」 …ハァハァ
0714デフォルトの名無しさん2008/09/08(月) 17:45:01
落ちこぼれでもかけちゃう本を読んで学ぶ人に失礼では?>>485
0715デフォルトの名無しさん2008/09/08(月) 21:22:58
ポインタへの理解に向けてってことで聞きたいんですけど
アドレスと変数の中身ってよくメモリの番号とバイト数の関係で説明されるけど
変数がその変数の中身を指してるって事実はどう処理されてるんですか?
0716デフォルトの名無しさん2008/09/08(月) 21:25:47
意味がわかりません。
0717デフォルトの名無しさん2008/09/08(月) 21:26:36
>>715
どう処理って何が聞きたいの?俺は100%説明できると思うよ。
0718デフォルトの名無しさん2008/09/08(月) 21:30:04
変数の格納先の番地はプログラムが把握してるんだよ
ポインタの場合はプログラムが把握している番地の領域にさらにメモリの番地が入ってる
0719デフォルトの名無しさん2008/09/08(月) 21:34:14
static int n;
static int x, y;
とかって変数があったら、コンパイルの段階で、nは100番地に置くとか、xは104番地に置くとか決めてる。
0720デフォルトの名無しさん2008/09/08(月) 21:40:11
それはない
07217152008/09/08(月) 21:41:27
なんと言うか、型によってアドレスの幅がとられたりするのは直感的にわかりやすいし、
アドレスが連番ってことももちろんわかります、その変数の中身が型のバイト数以内だから変数の中身もわかる
と思うんですが、それをどうやってaとか変数名と結び付けてあるのかがわかりません
07227172008/09/08(月) 21:41:39
>>718
番地だけじゃない。暗黙のうちに、番地の先にあるオブジェクトのサイズが
包含されてるんだよ。ポインタに演算かけりゃすぐわかるだろ。

Cでさえこれなのに、C++になると頭が破裂しそうに…
0723デフォルトの名無しさん2008/09/08(月) 21:48:31
>>721
結びつけるっていうか、コンパイラが覚えてるだけだよ。
nという変数を100という番地に置くと決めて、
n = 3;
というコードがあったら、
mov [100], 3
というアセンブラのコードに置き換えるだけ。
0724デフォルトの名無しさん2008/09/08(月) 21:49:07
>>721
結び付けるも何もコンパイルしたらCの場合はaに該当する
格納先は何らかの形で確保されるけどaなんて表記はないよ。

つーかその辺理解したかったらアセンブラか機械語やらないと無理。
それにそもそもアセンブラや機械語では開発効率が悪いので
Cでそういう配置先とかを意識しなくてよくしたのに
それを理解云々って変なところにこだわりすぎ。
0725デフォルトの名無しさん2008/09/08(月) 21:53:48
答えは、「結び付けられてない」だなw
マシン語では、データはすべてアドレスで持ってる。
0726デフォルトの名無しさん2008/09/08(月) 21:54:09
>>722
はぁ?ポインタに格納してるのはアドレスだけだろ?
お前がいってるのはポインタの型じゃん
0727デフォルトの名無しさん2008/09/08(月) 21:58:31
>>725
だなあ。
バイナリーをCソースには戻せないもんな。
アセンブラのソースにはできるが。
なので
Cソース->バイナリの結びつけはなんとか可能だが
その逆はできないし、そもそも必要性を感じない。

仕事でそんなところ詰まってるとすぐ切られるぞ
0728デフォルトの名無しさん2008/09/08(月) 22:02:33
>>726
型によってポインタの内部表現の種類が違うかもしれない程度かな
規格上は型を持っていてもかまわないんだろうけどそんなコンパイラあるとは思われない
07297152008/09/08(月) 22:03:17
次元が高いから内部で何重にも処理されてるのか
配列だとaが先頭のアドレスをさすのに
intだとaは変数の中身しか指さないとか理屈的におかしいな〜と思ったわけ
その場合左がポインタだと=の意味が変わることになるのも整合性がないし・・・と
0730デフォルトの名無しさん2008/09/08(月) 22:05:55
配列とポインタについては特別な約束事があるからそうなってるだけだ
0731デフォルトの名無しさん2008/09/08(月) 22:07:45
>>729
アセンブラレベルでみれば、どっちもさほどコードはかわらん。
配列の先頭のみに限ればだけど。
0732デフォルトの名無しさん2008/09/08(月) 22:08:04
>配列だとaが先頭のアドレスをさすのに
違う
配列名は本当は配列そのものを意味する
ただしいくつかの例外を除いて先頭要素へのポインタに変換される
0733デフォルトの名無しさん2008/09/08(月) 22:08:56
>>732
逆だ
配列名が先頭アドレスで
&配列名が配列へのアドレスだ

sizeofは例外
0734デフォルトの名無しさん2008/09/08(月) 22:09:18
とりあえずね、マシン語でやってることとC言語でやってることをごっちゃにするのは良くない
C言語がやってることというのはコンパイラがやってることを含むから
0735デフォルトの名無しさん2008/09/08(月) 22:09:20
ちょwwその辺詳しく教えてww
0736デフォルトの名無しさん2008/09/08(月) 22:09:35
これは何のポインタかな?と思ったら
演算してみるのがおすすめ
0737デフォルトの名無しさん2008/09/08(月) 22:11:02
>>732
違う。
配列名はアドレスではない、ポインタに変換されるだけ。
というかアドレスとポインタの区別はつけようね。>>734も言ってるけど。
07387152008/09/08(月) 22:17:20
ポインタp=配列a とした瞬間になんでアドレスに変わるのよ?
よくあるメモリの中身と周りに変数名、アドレスが載ってる図じゃ説明できないでしょ
0739デフォルトの名無しさん2008/09/08(月) 22:17:50
|式中に現われる型「Tの配列」という左辺値は、
|(3つの 例外を除いて)配列の最初の要素を指すポインタに意味が格下げになる。
|結果としてできるポインタの型は「Tへのポインタ」となる。
|3つの例外とは、配列がsizeofのオペランドとなるとき、&のオペランドとなるとき、
|charの配列を文字列リテラルで初期化するとき、を指す。

とまあ規格ではこうなっている
ポインタに変換されないことは例外だが、一方でそれが本来の意味だということ
0740デフォルトの名無しさん2008/09/08(月) 22:19:03
>>738
だから特別な約束事があるんだってば。
0741デフォルトの名無しさん2008/09/08(月) 22:20:42
またこいつか
配列がアドレスになるのはおかしいだのなんだの
もうわかってて荒らしてるとか思われん
0742デフォルトの名無しさん2008/09/08(月) 22:21:09
正確に理解したいならアドレスとか実装に依存する事は考えずに
あくまで指すもの=ポインタ
として理解しないと
0743デフォルトの名無しさん2008/09/08(月) 22:22:37
いやだからその辺の理屈を知りたければアセンブラやれ。
そうすればあるときはポインタに格下げとか言われてる意味がわかるから。
C使う以上はそんなの気にしてられねえよ。
なんのためのCだよ。
0744デフォルトの名無しさん2008/09/08(月) 22:24:21
なんだよ。かまってちゃんか。
相手して損した。
07457152008/09/08(月) 22:27:14
>>739
ありがとう。わかりやすかった
0746デフォルトの名無しさん2008/09/08(月) 22:42:26
int a;と宣言したからと言って、変数aがどこかのアドレスに割り当てられるわけじゃないのも混乱の原因になるな。
勿論int * p = & a;としてしまうと、その時点で割り当てられることが確定するわけだが。
0747デフォルトの名無しさん2008/09/08(月) 22:45:25
>>746
まーなー
コンパイラがレジスタでいけるやんって判断したら
メモリ上には存在しないし。
0748デフォルトの名無しさん2008/09/08(月) 22:45:36
>>746
うそつくなよ。
0749デフォルトの名無しさん2008/09/08(月) 22:50:32
レジスターも広い意味でアドレスなんだけど
0750デフォルトの名無しさん2008/09/08(月) 22:54:02
>>749
ややこしくすんなw
0751デフォルトの名無しさん2008/09/08(月) 22:55:24
そもそも、最適化で消えてなくなる変数だってあるわけで。
0752デフォルトの名無しさん2008/09/08(月) 23:08:32
要するに>>734
0753デフォルトの名無しさん2008/09/09(火) 20:30:18
pclose()がstdio.hに見つからないんだけどどこにありますか?
linux の centosでgccの3.46です
0754デフォルトの名無しさん2008/09/09(火) 21:02:38
stdio.hだろ
そこにないってことは実装されていない?
0755デフォルトの名無しさん2008/09/09(火) 21:03:39
distroがわからないと何とも。
0756デフォルトの名無しさん2008/09/09(火) 21:33:22
えっ?
0757デフォルトの名無しさん2008/09/09(火) 22:12:35
glibcにないの?
0758デフォルトの名無しさん2008/09/09(火) 23:27:47
>>753
grep pclose /usr/include/*.h /usr/include/sys/*.h
0759デフォルトの名無しさん2008/09/09(火) 23:37:56
staticで宣言したグローバル変数を別ファイルで使うのってできます?
0760デフォルトの名無しさん2008/09/09(火) 23:43:58
>>759
static を外す
定義しているファイルを include する
関数を使ってアクセスする
アドレスを貰って操作する

等
0761デフォルトの名無しさん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してもよい。(この方法の方がベター)
0762デフォルトの名無しさん2008/09/09(火) 23:58:58
>>760
レスありがとうございます
関数を使ってアクセスするとは具体的にどのようにやるのか教えていただけないでしょうか?
0763デフォルトの名無しさん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"
0764デフォルトの名無しさん2008/09/10(水) 03:22:45
>>754
popen()はあるし使えるんですよ、
stdio.hを直接見るとに関数宣言はちゃんとあるのに
なぜか暗黙の型宣言といわれてしまいますが(popen()で)
>>755
だからCentOSですってwちなみに4の最終です
>>757
pclose()を使おうとした場合
プロトタイプ宣言がないことで出る警告だけでなく
本体がが見当たらないというほうのエラーもでてるので
libcに無いみたいです
>>758
stdio.hに
見たらプロトタイプ宣言はありました
でもなぜかincludeしてるのに関数の宣言がされてない警告が出てしまいますが

無さそうそうなので諦めて作ることにします、皆さんありがとうございました
0765デフォルトの名無しさん2008/09/10(水) 04:04:17
コンパイラオプションの関係ではないかな?

__STRICT_ANSI__のマクロが定義されているとstdio.hの中のpopen, ocloseのプロトタイプ宣言
は#ifndef __STRICT_ANSI__で展開されない。

> ISO 標準の C。 gcc(1) を -std=c99 や -ansi などのフラグを付けて起動した場合、
> このマクロは暗黙のうちに定義される。
0766デフォルトの名無しさん2008/09/10(水) 07:43:36
>>763
ありがとうごさいます、やってみます
0767デフォルトの名無しさん2008/09/10(水) 12:15:55
gotoってなんか使わないほうがいいって聞いたんだけど、みんな使ってないの?
あれってたまに便利じゃね?
0768デフォルトの名無しさん2008/09/10(水) 12:23:24
>>767
なんで使うなと言われるのか、くらいはググっとけ。
0769デフォルトの名無しさん2008/09/10(水) 12:50:10
この板のgotoスレは消滅しちゃったんだな
0770デフォルトの名無しさん2008/09/10(水) 13:11:37
>>767
そうだね
0771デフォルトの名無しさん2008/09/10(水) 13:13:56
i love goto
0772デフォルトの名無しさん2008/09/10(水) 13:15:19
むしろ何でgotoを使いたいか理解できないなあ。

BASICやってたころは使ってたが今はとてもじゃないが使えんわ。
ただチューニングでどうしても関数呼び出しを減らしたい場合は
インライン展開できない部分はgotoにしたりするなあ。
0773デフォルトの名無しさん2008/09/10(水) 13:15:24
#define gogo goto

にするといっぱい使いたくなるよ
0774デフォルトの名無しさん2008/09/10(水) 13:22:23
gotoの使いどころは決まってる
0775デフォルトの名無しさん2008/09/10(水) 18:59:42
多重ループからの脱出
0776デフォルトの名無しさん2008/09/10(水) 19:29:39
エラー処理の可読性向上
0777デフォルトの名無しさん2008/09/10(水) 19:30:52
>>772
コンパイラを換えるべき。
0778デフォルトの名無しさん2008/09/10(水) 19:41:28
おつむを換えるべき?
0779デフォルトの名無しさん2008/09/10(水) 19:55:50
これ以上続けるなら隔離スレ立てちゃうぞ。
0780デフォルトの名無しさん2008/09/10(水) 20:01:11
おむつと空目した。。。
0781デフォルトの名無しさん2008/09/10(水) 20:06:28
>>777
gcc で-O3にして最適化させてみたけど、予定してたよりサイズ増えなかったんだよね。

つまり期待以上の最適化はやってないことかな?
0782デフォルトの名無しさん2008/09/10(水) 21:37:03
最適化スレへどうぞ。
0783デフォルトの名無しさん2008/09/10(水) 21:40:39
>>782
ども

こんなスレあるのねw
0784デフォルトの名無しさん2008/09/10(水) 22:09:49
ループアンローリング
0785デフォルトの名無しさん2008/09/10(水) 23:21:11
言語別質問スレしかなかったのでこちらでお聞きします
javaとかCをサンプルコードコピペで動かしたことぐらいしかない初心者です
外部からの音声入力を拾ってそれを変数として何か動かすプログラムを書きたいのですが、
C言語で可能でしょうか。
具体的にはマイクの音と連動してウィンドウの色が変わるようなものを考えています。
なんでもいいので、始めるにあたってどうすればよいかご教授願いたいです。
宜しくお願いします。
0786デフォルトの名無しさん2008/09/10(水) 23:22:43
OSは?
0787デフォルトの名無しさん2008/09/10(水) 23:25:11
できる

まずはウィンドウ作るところからはじめてみたら?
0788デフォルトの名無しさん2008/09/10(水) 23:27:07
可能です。難しいけど。
Windowsならばウィンドウ関連のAPIとWave関連のAPIの知識が必要。
07897852008/09/10(水) 23:44:23
>>786
>>787
>>788
レスありがとうございます。可能だということで安心しました。
OSはWindows Vistaです。(linuxなどの環境も用意できます)
とりあえず何もできない状態なのでウィンドウを作るとこからはじめてみたいと思います。
レス頂いたあとで恐縮なのですが、そもそもこのようなプログラムにC言語は向いているのでしょうか
他にもっと向いている言語等あったら教えていただきたいです。
0790デフォルトの名無しさん2008/09/10(水) 23:45:22
マイクとかどうやってプログラムと連携させんの?
0791デフォルトの名無しさん2008/09/10(水) 23:45:51
今やWindowsプログラミングでCが向いている分野なんて皆無
0792デフォルトの名無しさん2008/09/11(木) 00:04:17
Cが向いているのは(移植性とかを除けば)とにかく性能を追求して
かつ開発効率もそれなりに確保したい場合

とにかく動けばいいってんならほかにもっと簡単に作れる言語がいくらもある
0793デフォルトの名無しさん2008/09/11(木) 00:06:41
>>791
デバイスドライバはまだまだいけるんじゃない?
0794デフォルトの名無しさん2008/09/11(木) 10:26:11
Cをやる意味は9割がた教養
0795デフォルトの名無しさん2008/09/11(木) 10:35:08
ffmpegはCで書かれてる。
0796デフォルトの名無しさん2008/09/11(木) 11:07:08
>>789
録音ソフトは過去に作ったことあるんだが
waveの録音ならペゾルドの『プログラミングWindows第5版』つー本の下巻にサンプルコードが載っている
言語はC
これをそのままパクれば録音ソフトは作れる
ただ、前提としてCとWindowsプログラミングの知識は必要
俺の場合2年ぐらいかかった

プログラムの方法はともかく、waveデータを扱うならCぐらいの知識は普通に必要なのでやっておいて損はない
0797デフォルトの名無しさん2008/09/11(木) 11:22:33
>>790
録音するだけなら8、音声のデータを解析しながら録音するなら7

http://wisdom.sakura.ne.jp/system/winapi/media/index.html
0798デフォルトの名無しさん2008/09/11(木) 14:08:52
文字列(数字のみ)で構成されているファイルを読み込んで
文字列を数値に変換して並び替えを行うプログラムを作っているんですけど
文字列を数値に変換をして並び替えを行った結果、
先頭の数字0がなくなった状態で並び替えがされていました。
先頭の数字0がなくならない状態で並び替えを行う方法を教えてください。
お願いします。

例)
先頭の数字0がなくならない並び替え

並び替え前    並び替え後  
00159    0101
130   →  130 
0101     00159

先頭数字0がなくなった並び替え

並び替え前    並び替え後
00159    101
130   →  130 
0101     159
0799デフォルトの名無しさん2008/09/11(木) 14:14:43
>>79
意味がわかりません。

プログラム内部では文字列の数字ではなく変換後の数字でしょ?
頭に0なんて付かないけど。

>先頭の数字0がなくならない状態で並び替えを行う方法を教えてください。
数字に直す以上は無理です。
0800デフォルトの名無しさん2008/09/11(木) 14:24:20
回答者もレベル低いなあ。
qsortに渡す関数の中でatoiして比較すりゃいいだけなのに。
0801デフォルトの名無しさん2008/09/11(木) 14:25:08
>>798
各文字列を残しとけ。int型配列でも作って、そこの数字を並べ替える時に文字列も一緒に並べ変えろ。
0802デフォルトの名無しさん2008/09/11(木) 14:27:31
宿題スレにいけよ屑
0803デフォルトの名無しさん2008/09/11(木) 14:27:51
>>800
例がたまたまシンプルなだけで、qsortが使えないような場面の話なんじゃないか?
0804デフォルトの名無しさん2008/09/11(木) 14:29:17
qsortに渡す関数の中でatoiして比較するとは、何ですか?
詳しく教えてください。
プログラムで例を出していただくと助かりますが・・・
0805デフォルトの名無しさん2008/09/11(木) 14:29:38
>>804
宿題スレにいって解答もらってこい
0806デフォルトの名無しさん2008/09/11(木) 14:30:21
意訳:課題だるいから早く解答だせよグズ
0807デフォルトの名無しさん2008/09/11(木) 14:31:43
>>804
自力でやる気があるなら、これだけの情報で充分できるはずだ。
出来ないまま例を見ても鵜呑みにするだけで理解なんて出来ない。
理解する気がないなら誰かに作ってもらえ。する気があるならチャレンジしろ。

0808デフォルトの名無しさん2008/09/11(木) 14:52:40
>>804
qsortとatoiが使えるなら、文字列をどっかに保存しといて、
atoiで並べ変えられた順に文字列並び替えるだけ。
qsortとatoiが使えないなら、
意味調べて自作汁
0809デフォルトの名無しさん2008/09/11(木) 14:54:23
×atoiで並べ変えられた順
○qsortで並べ変えられた順

orz
0810デフォルトの名無しさん2008/09/11(木) 16:04:07
ここ、一応スレタイ的にも「入門篇」なんだからさ、もちょっと親切にするとかさ。

>>804
qsort でググレカス(AA略
0811デフォルトの名無しさん2008/09/11(木) 16:04:52
課題丸投げは入門以前
単位ほしいだけだろ
0812デフォルトの名無しさん2008/09/11(木) 16:06:32
課題まるなげなら宿題スレいけば解答もらえますよ
と究極に親切な誘導してあげてるじゃないかw
0813デフォルトの名無しさん2008/09/11(木) 17:22:49
C言語の質問か微妙だけど、 K&Rのカーニハンが日本語だいぶうまくなったって本当?
0814デフォルトの名無しさん2008/09/11(木) 17:24:15
K&Rのローマ字の挨拶と比べてって事?
どこからそんなレアな話を聞きつけたんだw
0815デフォルトの名無しさん2008/09/11(木) 22:48:01
無名の配列とか構造体が使えれば素敵なのに
0816デフォルトの名無しさん2008/09/11(木) 23:02:26
struct {
int foo;
} bar;
0817デフォルトの名無しさん2008/09/11(木) 23:03:28
よくコードジェネレータが使う手だな
0818デフォルトの名無しさん2008/09/11(木) 23:05:01
struct {
int a;
int b;
} arry[] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
0819デフォルトの名無しさん2008/09/11(木) 23:08:08
無名の構造体を引数に使いたかった
0820デフォルトの名無しさん2008/09/11(木) 23:10:55
>>819
gccじゃあるまいしw
0821デフォルトの名無しさん2008/09/11(木) 23:58:58
構造体返す関数作れば?
0822デフォルトの名無しさん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;
}
なんか違う気がしてきた
0823デフォルトの名無しさん2008/09/12(金) 00:22:26
まず無名の構造体じゃないしな
0824デフォルトの名無しさん2008/09/12(金) 00:53:59
無名の構造体 != 無名構造体ということですね、わかりません。

void * で渡して ((struct { int foo; } * )piyo)->foo = 100; こうするんですね、わかります。
もう年だからぼけてきているのかもしれない、そろそろマをやめるべきだろうか。
はぁ〜、ありえない・・・でも。
0825デフォルトの名無しさん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! */
}
だめ?
0826デフォルトの名無しさん2008/09/12(金) 01:36:52
タグ無し構造体 != 構造体型の束縛無し変数
0827デフォルトの名無しさん2008/09/12(金) 07:26:22
簡単なTCPサーバを作っているのですが、
struct sockaddr_in sin;

inet_aton(addr, &(sin.sin_addr)); /* IPアドレスの設定 */

の、IPアドレスの設定だけを、を別関数で行いたいのですが、どうしたらいいか教えてください。
同じmain関数内で実行するなら上記でいいのですが、
別関数でinet_atonをやりたくて、アドレス渡しでやってみたのですが、うまくできなくて困っています。
できれば、コードを書いていただけると助かります。よろしくお願いします。
0828デフォルトの名無しさん2008/09/12(金) 07:38:45
クラスにしてフレンドつける
0829デフォルトの名無しさん2008/09/12(金) 07:42:55
>>828
スレ違い。
0830デフォルトの名無しさん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;
}
0831デフォルトの名無しさん2008/09/12(金) 10:13:50
>>830
scanfで残った改行が次のgetsで読みこまれる
0832デフォルトの名無しさん2008/09/12(金) 10:13:57
>>827
構造体と関数でぐぐれ
0833デフォルトの名無しさん2008/09/12(金) 10:15:47
>>830
scanf の後 \n が入力バッファに残っている
0834デフォルトの名無しさん2008/09/12(金) 10:20:24
ぐぐるとscanf()の前か後ろにfflush()
を入れてるサンプルが
0835デフォルトの名無しさん2008/09/12(金) 10:27:04
>>834
それM$独自の拡張だから
gccでやったら未定義の動作
0836デフォルトの名無しさん2008/09/12(金) 10:56:16
いや、bccだけど
08378302008/09/12(金) 10:56:33
>831,833
有難うございます。
0838デフォルトの名無しさん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$準拠であれ未定義動作と見た方がよい。
0839デフォルトの名無しさん2008/09/12(金) 11:52:58
普通に読み捨てでいいじゃん
0840デフォルトの名無しさん2008/09/12(金) 11:57:43
どうやって読み捨てるんだよ
0841デフォルトの名無しさん2008/09/12(金) 12:59:13
scanf("%d",&ap->sansuu); 
gets(dummy);
0842デフォルトの名無しさん2008/09/12(金) 14:18:59
scanf("%d",&ap->sansuu);
getchar();
0843デフォルトの名無しさん2008/09/12(金) 16:04:54
C-dとかC-zで入力きられたらどうすんだよ
0844デフォルトの名無しさん2008/09/12(金) 16:23:10
>>843
残念な思いでいっぱいになる。
0845デフォルトの名無しさん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' に変換できません。
0846デフォルトの名無しさん2008/09/12(金) 16:42:06
>>845
エラーメッセージのとおり。
>>  int pt = (int)*data; //エラーはでない。
「*data」はchar型 (=1バイトの整数型) なので
int に変換して代入できる。

>>  POINT pt = (POINT)*data; //エラーになります。何故ですか?
「*data」はchar型なので
POINT構造体には変換できない。
0847デフォルトの名無しさん2008/09/12(金) 17:06:19
>>845
これがエラーになるのと同じ
char ch = *data;
POINT pt = (POINT) ch; // ←これ

本当にやりたいのはこうではないか?
POINT pt = *(POINT*)data;
0848デフォルトの名無しさん2008/09/12(金) 17:06:57
>>846
charは1バイトの整数型だから
intやdoubleに変換できるが、構造体には変換できないということですよね?
それは何故なんでしょう?

void Test2(char *data)
{
  POINT *p = (POINT*)data;
  POINT pt = *p;
}

こうするとエラーがでないのは、ポインタには型の区別がないということですか?
0849デフォルトの名無しさん2008/09/12(金) 17:10:01
>>847
ああ、なるほど。よく分かりました。
構造体の型でキャストというのが意味不明でしたね。
ありがとうございました。
0850デフォルトの名無しさん2008/09/12(金) 17:19:55
>ポインタには型の区別がないということですか?
ないわけではないが、変換可能
キャストするとはそういうこと
0851デフォルトの名無しさん2008/09/12(金) 22:32:18
(int)data や (double)data ってキャストは出来るのに
(struct hoge)data ってキャストできないのは何でだろう。
0852デフォルトの名無しさん2008/09/12(金) 22:34:37
>>851
どうやって変換したらいいか判らないからです。
例えば、struct tm dataだったら(int) dataもできません。

C++なら教えることができるので、ちゃんと変換してくれます。
0853デフォルトの名無しさん2008/09/12(金) 22:45:16
理科大ナンバーがあったら恥ずかしいなw
0854デフォルトの名無しさん2008/09/13(土) 00:07:08
誤爆?
0855デフォルトの名無しさん2008/09/13(土) 00:32:17
理科大ナンバーってなんだ?
0856デフォルトの名無しさん2008/09/13(土) 00:42:34
岡山理科大学の学籍番号
0857デフォルトの名無しさん2008/09/13(土) 02:13:55
意味わからん
0858デフォルトの名無しさん2008/09/13(土) 16:14:35
構造体と関数でぐぐって
>>827 をもう一度試したのですがうまくいきません。
どなたかお願いします。
0859デフォルトの名無しさん2008/09/13(土) 16:34:08
>>858
ttp://cai.int-univ.com/sugsi/Lecture/NetProg/chapter3/struct.html
0860デフォルトの名無しさん2008/09/13(土) 19:30:44
>>851
どんな結果を期待しているんだ?
0861デフォルトの名無しさん2008/09/13(土) 21:31:19
>>859
同じ関数内でstruct sockaddr_in aaaを宣言して
inet_atonは普通にできるのはわかるのですが、
mein関数でstruct sockaddr_in aaaを宣言し、
別関数で、構造体の中身(aaa.sin_addr)の値を変更したいのです。

アドレス渡しで試してみたのですが、sin_addrが存在しない的なエラーが出て
うまくいかないのです。
構造体 関数等でググってうまくいかないので質問させていただきました。
どなたかお願いします。教えてください。
0862デフォルトの名無しさん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));
0863デフォルトの名無しさん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;
}
0864デフォルトの名無しさん2008/09/14(日) 09:38:35
"○○","××"みたいな形式の2つのデータ群のファイルをそれぞれ別の配列に入れて計算したいのですが
どのようにすればいいのでしょうか?
fgetsで1行読み込んで「,」で区切る方法がいいんでしょうがよくわかりません
0865デフォルトの名無しさん2008/09/14(日) 09:47:17
>>864
strtok
sscanf
好きなの使え
まぁそもそも一行目がいまいち何言ってんのかわかんないけど
0866デフォルトの名無しさん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,

こんな感じのデータが延々と続いてる奴で、左側のデータと右側のデータを別々の配列に入れたいというわけです
0867デフォルトの名無しさん2008/09/14(日) 10:32:21
scanfだな
0868デフォルトの名無しさん2008/09/14(日) 12:09:39
>>864>>866
ファイルから一文字一文字読み込めるだろー?
char buf[128]とかして、
�@区切り文字までをbufにいれる
�Abufから配列にこぴ〜
�Bbufくりあ
�Cgoto �@
でいいんでね?

>>866のデータ見ると、sprintfは使えないだろうからなぁ
eを処理する関数も必要かもに
0869デフォルトの名無しさん2008/09/14(日) 12:17:59
>>868
馬鹿は回答しなくても構わないんですよ。

>>866
sscanf()で"%[^,]"で変換するか、strtok()で切り出すか。
0870デフォルトの名無しさん2008/09/14(日) 12:23:06
atof?
0871デフォルトの名無しさん2008/09/14(日) 12:31:37
ハッシュ法を使わないといけなくなったんですけど
オススメのアルゴリズム関係の書籍がありましたら教えて下さい
よろしくお願いします
0872デフォルトの名無しさん2008/09/14(日) 12:41:08
データを20数bitに変換するだけだよ。
たとえば、CRC32でも使えばいい。
衝突したらずらしたり、別領域に記録するんだよ
0873デフォルトの名無しさん2008/09/14(日) 12:47:09
>>869
scanf()系の書式指定、忘れたけど、
"%f,"とかでいいんじゃね?
0874デフォルトの名無しさん2008/09/14(日) 12:48:36
>>871
amazonで、アルゴリズムとかで検索して、星がたくさんついてるのを選んだら?
08758642008/09/14(日) 12:54:49
レスありがとうございます。sscanfでとりあえず挑戦してみようと思います
0876デフォルトの名無しさん2008/09/14(日) 16:10:44
文字列として読み込みたいのか数値として読み込みたいのかはっきりしろ
0877デフォルトの名無しさん2008/09/14(日) 17:04:35
質問文見た限り文字列にしか見えんが
なぜか%fとか提案してる人がいるだけで
0878デフォルトの名無しさん2008/09/14(日) 17:05:54
でも普通文字列に対して計算したいって表現は使わない
0879デフォルトの名無しさん2008/09/14(日) 17:05:54
どのあたりで文字列だとしか思えないんでしょうか?
0880デフォルトの名無しさん2008/09/14(日) 17:21:35
いつものrfc4180がらみにネタに発展しそう。wkwk
スルーカが試されているのか?
(そういう俺はスルーできていない)
0881デフォルトの名無しさん2008/09/14(日) 18:21:55
予告なしのスルー検定がしばしば開催される
0882デフォルトの名無しさん2008/09/14(日) 19:09:41
>>875
アホ
sscanf する前の文字列をどうやってとるねん
バッファリミットはどこから取る気じゃ
思いっきり処理系依存するぞ
0883デフォルトの名無しさん2008/09/14(日) 19:13:25
スルーしようぜ
0884デフォルトの名無しさん2008/09/14(日) 20:20:43
おまえをな
0885デフォルトの名無しさん2008/09/14(日) 20:35:31
バッファリミットって、なにだろう。
0886デフォルトの名無しさん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

これでエラーになるんだけれど、何が悪いのかな?
0887デフォルトの名無しさん2008/09/14(日) 21:27:58
コピペに失敗したとか?
0888デフォルトの名無しさん2008/09/14(日) 21:38:35
てか別のファイルなら・・・
0889デフォルトの名無しさん2008/09/14(日) 21:38:47
>>885
おまえは知らなくていい
この板に来なくてもいい
0890デフォルトの名無しさん2008/09/14(日) 21:39:57
【社会】ソフト開発・秘書・通訳etc…「日雇い派遣」を例外的に認める18業務 - 厚労省案★3
http://mamono.2ch.net/test/read.cgi/newsplus/1221382248/
0891デフォルトの名無しさん2008/09/14(日) 21:43:27
>>889
突っ込まれるのが怖くて説明できないんですね。わかります。
0892デフォルトの名無しさん2008/09/14(日) 22:20:21
>>891
いーや、>>882 の文脈から「バッファリミット」の意味を見当もつけられない完全素人はまず「入門」してからこのスレに来いという意味だ
0893デフォルトの名無しさん2008/09/14(日) 22:22:26
>>886
再現する最小のソースセットうp!
0894デフォルトの名無しさん2008/09/14(日) 22:25:26
バッファリミット関係ないだろ? だから意味が分からない。
0895デフォルトの名無しさん2008/09/14(日) 22:31:04
>>894
お前誰だ?
俺は >>882 で >>864=>>866 の用途に sscanf を使うことに否定の立場を示している
そこへ自分の立場を隠したまま頓珍漢なレスを返してきた >>891 を完全に馬鹿にしているところだが、
その馬鹿か、おまえは?
0896デフォルトの名無しさん2008/09/14(日) 22:36:14
>>895
> 俺は >>882 で >>864=>>866 の用途に sscanf を使うことに否定の立場を示している

おまえだって、今の今まで言ってなかっただろよ。
人に「立場を隠したまま」とか言うなよ。
だいたいこの問題に、立場とかどう関係してんだよ。
0897デフォルトの名無しさん2008/09/14(日) 22:37:52
>>896
やっぱり、あの馬鹿だったか
バッファリミットもアホも読めてない奴に説明なんかするか
チンパンジーに因数分解を教えるより面倒臭い
0898デフォルトの名無しさん2008/09/14(日) 22:39:26
だいたい、急に「バッファリミット」とかって言葉を持ち出したのは自分なんだから、人にエスパーを発揮するのを期待しないで、
自分で説明すればそれで済むことだろ。
0899デフォルトの名無しさん2008/09/14(日) 22:39:40
>896がスルーされているのに気付けないのが哀れでならない。
0900デフォルトの名無しさん2008/09/14(日) 22:42:21
なんだよ。結局説明できないのか。
ツッコミされるの怖がりすぎだろ。
0901デフォルトの名無しさん2008/09/14(日) 22:44:29
>>898
いーや、sscanf を使う場合のコードが想像できることは、この問題を議論する論客として最低限の資格だ
質問する気にしても、人にものを尋ねるときの態度がまるでなっておらず、質問者として最低限の資格もおまえは備えていない

繰り返すがチンパンジーには無理な問題だ
あきらめて帰れ
0902デフォルトの名無しさん2008/09/14(日) 22:51:20
人をチンパンジーとか煽るやつが、他人に「態度」とかいうなって。
もうどうでもいいけど、こういう技術系の話題で、あおり芸で切り抜けたつもりになってるやつって、悲しくないのかね。

ほんの数行説明すればすむ話をめんどくさいと言って、避けまくって、煽りだけはめんどくさがらずにひたすら続けてるんだもんなぁ。
0903デフォルトの名無しさん2008/09/14(日) 22:51:56
>>886
エラーメッセージの内容くらい書け
0904デフォルトの名無しさん2008/09/14(日) 22:57:14
>>902
バッファリミットの話はどうした?
あいかわらず想像もできていないようだが、事実を指摘されるのが悔しければこれ以上粘るのは得策ではないぞ

それから、説明するかどうかは回答者の自由意志によるもので、その態度で言い返し続けたあげくには何も得る物がないぞ
0905デフォルトの名無しさん2008/09/14(日) 22:57:57
"バッファリミット" に一致する日本語のページ 8 件中 1 - 8 件目 (0.26 秒)
0906デフォルトの名無しさん2008/09/14(日) 22:58:15
ほんの数行だってよ、説明したら一行だよバーカ
0907デフォルトの名無しさん2008/09/14(日) 22:58:24
横槍すまん。

http://ja.wikipedia.org/wiki/Scanf

のバッファオーバーランの節とか見ればいいんでしょ。
注意しないと落ちちゃうし、固定で切った後の処理考えるのが面倒だよね。
違ってたらごめん。
0908デフォルトの名無しさん2008/09/14(日) 23:02:01
>>904
だから、それは「バッファリミット」を言い出したほうが説明するのが先だろ。
なんで周囲が、あれこれ推測してあげなきゃならないんだよ。
0909デフォルトの名無しさん2008/09/14(日) 23:02:38
>>908
>>901
0910デフォルトの名無しさん2008/09/14(日) 23:03:19
自分勝手な造語で喋っちゃうあたりからして、
人に分からせようとする気がないことが容易に推測できる。

無視するのが吉。
0911デフォルトの名無しさん2008/09/14(日) 23:04:03
>>904
>説明するかどうかは回答者の自由意志によるもので、

だったら「バッファリミットの話はどうした?」って煽るなよ。
お前が説明する気がなかったら、それ以上話は進まないよ。
0912デフォルトの名無しさん2008/09/14(日) 23:04:34
やーいバッファリミット野郎!

”バッファリミット”の検索結果 8 血薯 1 - 8 件目 (0.14 秒)
0913デフォルトの名無しさん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バイトが妥当かどうかも考慮する必要はあるな。
0914デフォルトの名無しさん2008/09/14(日) 23:07:11
>>913
%19 っしょ?
0915デフォルトの名無しさん2008/09/14(日) 23:08:31
うん、そうだね。寧ろ、col1[100], col2[100]だろうけど。
0916デフォルトの名無しさん2008/09/14(日) 23:10:54
>>911
そのとおり、話を進める気なんぞ >>885 の時点から毛頭なかったが、
おまえ何を前提にレス書いて(≠話して)いたんだ?
0917デフォルトの名無しさん2008/09/14(日) 23:13:00
>>913
バッファリミットって、このコードで、200文字以上の行があった場合のことかな?
0918デフォルトの名無しさん2008/09/14(日) 23:13:46
>>916
ふーん。そんなにツッコミを怖がらなくてもいいのに。
0919デフォルトの名無しさん2008/09/14(日) 23:15:21
言い出したやつが説明する気ないから、永遠になぞか。
0920デフォルトの名無しさん2008/09/14(日) 23:15:23
>>918
コード書けない奴は邪魔なんだよ
0921デフォルトの名無しさん2008/09/14(日) 23:15:26
イヤーつまんなかった。
0922デフォルトの名無しさん2008/09/14(日) 23:16:16
>>919
そのとおり
知りたいことが聞き出せなくて残念だったな
0923デフォルトの名無しさん2008/09/14(日) 23:18:16
>>922
いや、どうせ脳内で見当違いのことを考えてるだけだろうから、どうでもいいよ。
0924デフォルトの名無しさん2008/09/14(日) 23:18:33
とまあこうしてこのスレの新参たちはキチガイに慣らされていくのであります
0925デフォルトの名無しさん2008/09/14(日) 23:19:20
>>923
おまえイソップのキツネだな
0926デフォルトの名無しさん2008/09/14(日) 23:23:18
>>925
でも、ここまで煮詰まってるし、二人以外に何人か参加してるし、もしなんか
「普通のPGならとうぜん知ってるけど、俺が知らないだけ」みたいな点があったら、
なんかツッコミが入ってるだろうけど、そういうのないし、まぁ、あんたがシッタカしてるだけでしょ。
0927デフォルトの名無しさん2008/09/14(日) 23:24:48
ここまで俺の自作自演
0928デフォルトの名無しさん2008/09/14(日) 23:25:54
文字列切り出して、atof使えばいいじゃないの?
0929デフォルトの名無しさん2008/09/14(日) 23:26:55
構造体はなぜ

struct XXX {
        int hoge;
};

ではなく

typedef struct {
        int hoge;
} XXX;

と書くのでしょうか?
Cで書いたものもC++でコンパイルすればいいと思うのですが。
0930デフォルトの名無しさん2008/09/14(日) 23:28:59
>>926
イソップのキツネと言われた後の発言としては気が狂ったとしか思えんが
そのツッコミもまたまた読めてないわけで、チンパンジーとキツネの悪いとこ取りで多重継承してる奴だな
0931デフォルトの名無しさん2008/09/14(日) 23:29:07
>>929
それは単に定義と同時にtypedefをするかどうかの違い
スタイルの話だからなぜもくそもない
0932デフォルトの名無しさん2008/09/14(日) 23:29:40
別に前者で構わないよ
0933デフォルトの名無しさん2008/09/14(日) 23:31:54
>>929
ん、俺は素では前者で書くぞ
現実には諸般の事情から後者の頻度が高いけどね

C++ も然り、諸般の事情で C 限定の場合がある
0934デフォルトの名無しさん2008/09/14(日) 23:33:37
>>926
いや、こいつが何を言いたいかはわかるよ、当然注意すべきことだしね
バッファリミットなんて言葉を使っちゃうアホさと無駄に相手を煽るキチガイさは動かんけど
0935デフォルトの名無しさん2008/09/14(日) 23:37:56
>>934
強制 ID 板じゃなくてよかったな
0936デフォルトの名無しさん2008/09/14(日) 23:40:18
なんか荒れてるなぁ・・・。
とりあえず、バッファリミットって言葉は知らんが、
普通、スタックオーバーとか言うね。
sscanfってのは、制限無く書式通りの型を指定先のバッファにぶち込む。
それを知らんで、素人はスタック(≒用意したメモリ領域)を良くぶっ壊してたりするもんさ。
コンパイラチェック入ってないと、何もエラー出んから知らないままいることが多いね。
しかも、普通に動くこと多いんでバグが発見しづらいのが最悪な点かな。

例えば、
char destBuf;
sscanf(srcbuf,"data=%d",&destBuf)
とすると、
sscanfはint(%d)型のバイト数を値をsrcBufからdestbufにコピーする。
で、int型ってのは処理系依存で、2〜4byteで不定なもんだから使いにくいのよ。
0937デフォルトの名無しさん2008/09/14(日) 23:41:35
またバカが増えやがった
これ以上ややこしくすんな
0938デフォルトの名無しさん2008/09/14(日) 23:42:46
>>929
単に「Cで書く」って決まってるプロジェクトで、C++のコードを混ぜたらまずいじゃん。
0939デフォルトの名無しさん2008/09/14(日) 23:44:12
ちなみに
>>936のサンプルソースは、最近新人が書いたもの。
既に、destBuf(char型)の後方3バイトを壊して、
他の処理系に異常を出した例。
正しくは、char destBuf→unsigned long destBufにせんといかんだけ

こういう事は気づかん所で良くあるねぇ
0940デフォルトの名無しさん2008/09/14(日) 23:46:30
>>939
%d int
%hd short int
%ld long int

char を受けるのは無いな
0941デフォルトの名無しさん2008/09/14(日) 23:47:28
>>941
残念、%c があるんだな(笑
0942デフォルトの名無しさん2008/09/14(日) 23:47:45
>>936
> sscanfはint(%d)型のバイト数を値をsrcBufからdestbufにコピーする。
> で、int型ってのは処理系依存で、2〜4byteで不定なもんだから使いにくいのよ。

絶対なんか勘違いしてる。

0943デフォルトの名無しさん2008/09/14(日) 23:48:12
>>939
釣りはもっと上手くやれ
0944デフォルトの名無しさん2008/09/14(日) 23:49:00
>>941
おいw
0945デフォルトの名無しさん2008/09/14(日) 23:51:55
>>929
自己レスです。
でもtypedefしたないものは自分は見たことないです。
別にCで書くとかそんな決め事ないケースばかりです。
スタイルだけの問題なんでしょうか?
実際的なメリットがあってそうしているのではないかと思うのですが。

自分で考えると

○ Cにしたときにtypedefのが問題がない
× typedefすると無名ができたり似たような名前が二つ出てきたりで面倒

といった感じです。C++では構造体はclassみたいになるし、シンボルも
違ってくると思います。その辺が絡んだメリット/デメリットがあるのかと
思うのですが、どうにも思いつきませんでした。読んでる限りだと実際ないのか
と思い始め、、、そうなの?
0946デフォルトの名無しさん2008/09/14(日) 23:54:41
>>945
typedef struct tag_XXX {
        int hoge;
} XXX;
をオススメする
0947デフォルトの名無しさん2008/09/14(日) 23:56:30
>>945
今、見たことなくても、そのうち見ることあるんじゃないか?
大した理由は俺の知る限りないぞ

ところで typedef の問題ってよくわからんのだが、具体的なコード例は示せるか?
0948デフォルトの名無しさん2008/09/14(日) 23:58:35
>>939
%dなのにunsignedで受けたらダメじゃん。
0949デフォルトの名無しさん2008/09/15(月) 00:00:22
>>944
すまん。誤爆した(w

>>945
typedef ・・しておけば、変数のように構造体を使えるので
通常の記述はそうする。
・typedef していない→struct 型名 変数名;
・typedef している →型名 変数名;
0950デフォルトの名無しさん2008/09/15(月) 00:03:27
>>949
いや、C++だと、typedefなくても、宣言のときにstractなしでできるのに、自分の見たコードは、
typedefしてあって、それはなぜでしょうか? って話だろ?
0951デフォルトの名無しさん2008/09/15(月) 00:04:31
>>948
細かいところによく気がついてくれた。ありがとう!
誰も突っ込んでくれないんで、どうしようかと oTL オジサン寂しいのん

では、オヤスミ
0952デフォルトの名無しさん2008/09/15(月) 00:05:04
>>947
Visual Studioなどで、正しく二つ分表示されるのが鬱陶しい。
ソースを元に簡単な解析をしたいときに鬱陶しい。
コード例ではないんですが。。。
0953デフォルトの名無しさん2008/09/15(月) 00:11:03
>>952
ソースを解析するときは逆に typedef で struct を隠されると「鬱陶しい」よな
例えば jmp_buf みたいに構造体ではなく配列であることがミソなコードが読みづらかったりする
0954デフォルトの名無しさん2008/09/15(月) 00:11:06
>>940
C99だと%hhdが使える。
0955デフォルトの名無しさん2008/09/15(月) 00:12:22
enum って、なんて読めばいいんですか?
0956デフォルトの名無しさん2008/09/15(月) 00:12:38
>>945
Cの構造体(共用体も)の宣言はC++とは異なり、構造体タグを自動で typedef しないことを理解しているか。
Cで書くとはCコンパイラでコンパイルできるということで、C++コンパイラでしかコンパイルできないならそれはC++のコードである。
(実質的に) typedef することはキーワード struct を省略することである。それ以上でもそれ以下でもない。
0957デフォルトの名無しさん2008/09/15(月) 00:13:39
>>955
いにゅーむ
0958デフォルトの名無しさん2008/09/15(月) 00:17:43
ちなみに構造体タグとtypedefは別の名前空間だから
typedef struct hoge{

}hoge;
とかできる
0959デフォルトの名無しさん2008/09/15(月) 00:18:47
>>955
いーなむ
0960デフォルトの名無しさん2008/09/15(月) 00:20:17
>955
http://dictionary.goo.ne.jp/search.php?MT=enum&kind=ej&mode=0&base=1&row=1
0961デフォルトの名無しさん2008/09/15(月) 00:21:25
http://dictionary.goo.ne.jp/voice/e/01011190.wav
0962デフォルトの名無しさん2008/09/15(月) 00:21:52
俺はえなむって読んでいる
0963デフォルトの名無しさん2008/09/15(月) 00:22:50
>>956
> Cの構造体(共用体も)の宣言はC++とは異なり、構造体タグを自動で
> typedef しないことを理解しているか

いいえ。C++ではtypedefしているのですか?

> Cで書くとはCコンパイラでコンパイルできるということで、C++
> コンパイラでしかコンパイルできないならそれはC++のコードである。
> (実質的に) typedef することはキーワード struct を省略する
> ことである。それ以上でもそれ以下でもない。

つまりメリットはそこにしかないということですね。
0964デフォルトの名無しさん2008/09/15(月) 00:23:27
ちゃー
すきゃんふ
0965デフォルトの名無しさん2008/09/15(月) 00:48:44
自分だけのソースコードなら好きにすればいい。
他人に読み書きさせるソースコードなら。

このソースは一部C++の機能を使っているので、
C++でコンパイルしてくれと但し書きをしなければならない。
0966デフォルトの名無しさん2008/09/15(月) 01:13:48
C言語で核ミサイルが作りたいんですけど、どうすればいいですか?
0967デフォルトの名無しさん2008/09/15(月) 01:16:49
書くミサイルなら
0968デフォルトの名無しさん2008/09/15(月) 01:17:34
>>966
核
↓
core

できそこないのプログラムなら得意だろ
0969デフォルトの名無しさん2008/09/15(月) 01:26:41
C言語の基礎をようやく覚えた者です。
Cのソースコード集みたいな本は売ってませんでしょうか?
どの方向に使っていくかも決まっていないので
いろんなジャンルのソースがみたいです。
サイト上のページでもいいのですが
本は落ち着いて勉強できますので。
0970デフォルトの名無しさん2008/09/15(月) 01:34:00
>>969
アルゴリズムとデータ構造
0971デフォルトの名無しさん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に一覧のディレクトリ
0972デフォルトの名無しさん2008/09/15(月) 01:39:43
標準関数のソースとかは?
0973デフォルトの名無しさん2008/09/15(月) 02:23:11
俺がアニメ見てる間にこのスレ盛り上がってたんだな orz 少し参加したかった
0974デフォルトの名無しさん2008/09/15(月) 02:48:22
>>970
>>971
ありがとん。
>>972
ググってみたやつですどこういうのでしょうか?
http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/stdio/Attic/?cvsroot=glibc
ちょっとまだ手に負えません。本を読んで理解したいと思います。
0975デフォルトの名無しさん2008/09/15(月) 03:23:51
右手にプログラムを
左手にあなたの髪を
0976デフォルトの名無しさん2008/09/15(月) 09:41:36
http://msdn.microsoft.com/ja-jp/library/cc429052.aspx
ここの下のほうのコードH 5行目に
> lpMetSect->lpSharedInfo->lAvailableCount*;
とあるのですが最後のアスタリスクはいったい何なんですか?
そういう単項演算子があるのでしょうか?
よろしくお願いします
0977デフォルトの名無しさん2008/09/15(月) 10:07:59
>>976
http://msdn.microsoft.com/en-us/library/ms810428.aspx

原文だと、それは--になってるな。
0978デフォルトの名無しさん2008/09/15(月) 10:33:32
num と value って何か違いますか?
どっち使いますか
0979デフォルトの名無しさん2008/09/15(月) 10:49:13
>>977
翻訳の間違いでしたか
ありがとうございます
0980デフォルトの名無しさん2008/09/15(月) 11:36:08
くそぅバッファリミット祭りに乗り遅れたぜ
0981デフォルトの名無しさん2008/09/15(月) 11:39:18
次スレ立ててくる
0982デフォルトの名無しさん2008/09/15(月) 11:41:25
C言語なら俺に聞け(入門篇) Part 36
http://pc11.2ch.net/test/read.cgi/tech/1221446435/
0983デフォルトの名無しさん2008/09/15(月) 13:15:06
>>982
乙
0984デフォルトの名無しさん2008/09/15(月) 13:52:36
>>978
辞書引け
0985デフォルトの名無しさん2008/09/15(月) 19:24:49
関数の宣言を書くときに一緒にコメント書くの?
それとも定義のところで書くから宣言時はいらない?
0986デフォルトの名無しさん2008/09/15(月) 19:31:41
上司に訊いてください
0987デフォルトの名無しさん2008/09/15(月) 20:19:13
>>985は一般的にはどうするのかということです。
0988デフォルトの名無しさん2008/09/15(月) 20:29:06
コメントの保守できるの?
0989デフォルトの名無しさん2008/09/15(月) 20:33:39
>>985
一般的にどうするなんてものはない。
コメントの書き方の一流派でいいならDoxygenでも参考にしとけ。
0990デフォルトの名無しさん2008/09/15(月) 20:34:58
>>987
まさに>>986だよ
仕事でやるならコーディング規則だとかコメント規則(笑
とかあるよ。

ころころこれが変わる職場に行ったことがあって、
うっかり修正漏れ(影響ないんだけど)があって
システムが原因不明のトラブルの際に
怒鳴られたことさえあったよwww

0991デフォルトの名無しさん2008/09/15(月) 20:37:19
小学生の怪我自慢じゃないんだから、そんなこと言わなくていいです。
0992デフォルトの名無しさん2008/09/15(月) 20:39:26
小物ライブラリならヘッダのコメントとして使い方を書いちゃうのもありだし
ちゃんとしたリファレンスを用意するならヘッダには何も書かずにただcopyright表記だけ書いておけばいい。
0993デフォルトの名無しさん2008/09/15(月) 23:47:01
ライブラリを配布するだけならヘッダに使用に支障の無い程度の情報を書く。

定義ファイルへはメンテする人のためのコメントを書く。

あとは自動ドキュメント作成ツールやらコーディング規則と相談。
0994デフォルトの名無しさん2008/09/16(火) 00:21:55
スタイルにおいて常に、かつ最も重要なことは、「なぜそう書くのか」を即答しうるかどうかである。
明確な、君がそうするべきと信ずる十分な理由があるなら、そうすることをためらう必要はない。
けして唯一絶対の理由である必要はない。スタイルに唯一絶対の正解は存在しないからである。

しかし特に理由がないのなら、皆がやっているものに合わせるべきである。
0995デフォルトの名無しさん2008/09/16(火) 01:03:52
インデントや括弧付けについては整形ツールを通すことで簡単に統一できるが、
命名規則は気をつけないと 動詞+名詞 と 名詞+動詞 が入り混じってしまう

vectorSetValue
vectorValueSet
setVectorValue
setValueVector // これは無いが…
0996デフォルトの名無しさん2008/09/16(火) 22:18:32
任意の型をmemset以外で再度0初期化する方法ってある?
val = (type)0; ではだめかな
0997デフォルトの名無しさん2008/09/16(火) 22:21:37
>>996
bzero
0998デフォルトの名無しさん2008/09/16(火) 22:30:15
>>996
static const someStruct zeroSome = {0};
を用意しておいて、適宜
someStruct foo = zeroSome;
のように代入する。
0999デフォルトの名無しさん2008/09/16(火) 22:38:26
999げと
1000デフォルトの名無しさん2008/09/16(火) 22:46:34
ume
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。