C言語なら、俺に聞け! Part 〈52〉

このエントリーをはてなブックマークに追加
1ぬるぽ
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しませう。
質問する前には最低限Googleで検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo!
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

コンパイラを探しているなら >>2- を。

上記を逸した場合の結果は激しく未定義だゴルァ!!

  ∧_∧
 ( ´∀`)< ぬるぽ

C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
2ぬるぽ:03/03/10 14:54
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html






























4ぬるぽ:03/03/10 14:55
【過去ログ】
51 http://pc2.2ch.net/test/read.cgi/tech/1046104909/
50 http://pc2.2ch.net/tech/kako/1044/10449/1044938752.html
49 http://pc2.2ch.net/test/read.cgi/tech/1042646178/
48 http://pc3.2ch.net/tech/kako/1041/10411/1041127646.html
47 http://pc3.2ch.net/tech/kako/1040/10400/1040048202.html
46 http://pc3.2ch.net/tech/kako/1039/10393/1039328710.html
45 http://pc3.2ch.net/tech/kako/1038/10384/1038405432.html
44 http://pc3.2ch.net/tech/kako/1037/10377/1037796472.html
43 http://pc3.2ch.net/tech/kako/1037/10372/1037281411.html
43 http://pc3.2ch.net/tech/kako/1037/10371/1037134356.html
42 http://pc3.2ch.net/tech/kako/1037/10371/1037101156.html
41 http://pc3.2ch.net/tech/kako/1036/10368/1036876790.html
40 http://pc3.2ch.net/tech/kako/1036/10366/1036673739.html
39 http://pc3.2ch.net/tech/kako/1036/10364/1036409391.html
38 http://pc3.2ch.net/tech/kako/1035/10357/1035729526.html
37 http://pc3.2ch.net/tech/kako/1035/10356/1035623265.html
36 http://pc3.2ch.net/tech/kako/1035/10352/1035211039.html
35 http://pc3.2ch.net/tech/kako/1034/10343/1034337064.html
34 http://pc3.2ch.net/tech/kako/1033/10332/1033240509.html
33 http://pc3.2ch.net/tech/kako/1032/10326/1032606064.html
32 http://pc3.2ch.net/tech/kako/1031/10319/1031905402.html
31 http://pc3.2ch.net/tech/kako/1030/10307/1030786546.html
30 http://pc3.2ch.net/tech/kako/1030/10307/1030786546.html
29 http://pc3.2ch.net/tech/kako/1029/10296/1029605182.html
28 http://pc3.2ch.net/tech/kako/1028/10284/1028495798.html
27 http://pc3.2ch.net/tech/kako/1027/10271/1027160374.html
5ぬるぽ:03/03/10 14:55
もう新スレの時期か。
1000直前だということに気づかなかったぞ(藁
  ( ・∀・)   | | ガガガガッ 人
 と    )    | |    人  <  >__Λ∩
   Y /ノ    .人   <  >__Λ∩Д´)/
    / ) .人 <  >__Λ ∩Д´)/   / ←>>1
  _/し' <  >_Λ∩Д´)/   / ←>>2
 (_フ彡 V`Д´)/   / ←>>4
            / ←>>5
>>1
なんて事を・・・
メインフレームってどんなものかいまいち分からないんですが。あと大型汎用機ってのも。
>>9
スレ違い。
ここは、ぬるぽのスレです。
Part 50 が sat 落ちしてるのに、Part 49 がまだ生きてるというのが何とも・・・。
スレ立て乙ー
  ( ・∀・)   | | ガガガガッ 人
 と    )    | |    人  <  >__Λ∩
   Y /ノ    .人   <  >__Λ∩Д´)/
    / ) .人 <  >__Λ ∩Д´)/   / ←>>1
  _/し' <  >_Λ∩Д´)/   / ←>>2
 (_フ彡 V`Д´)/   / ←>>4
            / ←>>5
sat 落ち・・・何か、(・∀・)イイ!!
C言語を使ったプログラムで
練習として簡単なWebサーバを立ち上げたいのですが、
右も左もわかりません・・・

どこか参考にすべきHPなどはありますでしょうか?
system("/usr/local/apache/bin/apachectl start");
>>13
ワラタ

>>14
取りあえずSocketについて調べたら?
>>14
WebサーバをCで作る、ということでしょうか?
WebサーバにアクセスするソフトをCで作るということでしょうか?
>右も左もわかりません・・・

そういや、召還ワードのひとつだったな
1914:03/03/10 17:52
>>16
わかりました。Socketの勉強をしてみます。

>>17
Cで作る、ということです。
>19
この答え方はネタっぽいな。
あるいは、日本語の右も左もわからないかだが。
>>19
Cで 「何を」 作りたかったんだろう
2214:03/03/10 17:58
WebサーバをCで立ち上げるっていうのは
そういうことではないんでしょうか・・・?
ApacheなどのようなWebサーバを作成、という事ですか?
本家ですら、何年もかけて、多くの人数をかけて日々バージョンアップや
バグフィクスを繰り返しているというのに・・・
>>14
まあ、VBですら簡易HTTPサーバは作れるから、気長に作りなされ。
セキュリティとか難しいことを考えなければ、意外になんとかなるぞ。
ひょっとして、CでCGIを書きたいとか!?
漏れんとこの CGI、C で書いてあるけど何かマズい?
>>26
いや、そういう問題じゃなくてw

>>14はどこへ逃げた?
Webサーバ立ち上げというと
ドメイン取得、ネットワーク構成を決める
ハードを買って来て組み立て、ケーブル接続
OSインスコ、起動、ネットワーク設定、テスト
こんな感じ

>>28
お前の会社には今後見積もり取らんことにするよ。
>>14
要するに、ローカルな環境にWebサーバ立てて、Cで組んだCGI動かしたいんだろ?

こちらへどうぞ↓

C言語CGI専用スレッド
http://pc2.2ch.net/test/read.cgi/php/988918264/l50
31デフォルトの名無しさん:03/03/10 19:38
 ∧_∧ 
 (´∀` )       ∧∧
   ̄ ̄    ==== ( ・∀・)つ0===フ
 ⊂ ̄ ̄⊃ ,/| === ̄ ̄
 ノ ノ ノ   | |    ( ⊃/ 
(_ノ )   | | ∧∧し⊃
       ⊂(・∀・ )       ∧∧
           ̄ ̄  ==== ( ・∀・)つ0===フ スレタテオツカレ!!>>1>>2
          \ ⊂)     ( ⊃/
           ⊂ J      し⊃
                   '"'""
32デフォルトの名無しさん:03/03/10 19:55
LSI C-86 試食版というコンパイラが雑誌の付録についてたんだけど
インストール方法がよくわからない。誰か教えて。
>>32
まずはぐぐれ。話はそれからだ。
>>32
雑誌って、Cマガだろ?

いまさらそんなの入れるな。
せめてBCCにしとけ。

どうしても入れたければ、ググれ。
インストール方法もちゃんと載せないようなクソ雑誌を買ったにせよ、
展開してパスを通すだけの脳味噌がないにせよ、>>32には無理。
36デフォルトの名無しさん:03/03/10 20:01
>>35
冷たいねアンタ
>>36
冷たく思うかもしれないけどそれが>>32のためになる。
本当は俺は温かい心の持ち主なのだ。
>>37
冷たいねアンタ
>>38
冷たく思うかもしれないけどそれが>>36のためになる。
本当は俺は温かい心の持ち主なのだ。
ウザイ。
次。
>>40
冷たいねアンタ
リピート厨が今日日のはやりですか
VisualC++というものを友人に借りたんだけど
インストール方法がよくわからない。誰か教えて。
>>45
冷たいねアンタ
>>43
帰れ。
>>44
逝ってよし!
>>43
まずCD-Rにコピれ。話はそれからだ。
>>44>>45 藁田
49デフォルトの名無しさん:03/03/10 21:53
>>47 市ね。
>>49
お前には迷惑かからないだろ?
それともマイクロソフトの社員なのか?
>>50
> それともマイクロソフトの社員なのか?
そうですが何か?
>>51
じゃあ死ね
>>52
一平民の言うことなんか誰が聞くか(w
5452:03/03/10 22:15
>>53
つーか死ねと言われて死ぬやつはいねぇ。
55デフォルトの名無しさん:03/03/10 22:16
一つ聞いても良いですか.Cで#includeするヘッダファイルと
コンパイルオプションの対応はどこで調べればよいのでしょう.
math.hなら-lmだとか、なにか変換規則でもあれば別ですが、
表みたいなものがどこかにあるのでしょうか.お教えください.
5652:03/03/10 22:18
>>55
まて。
-lm(gccだよね?)はリンクオプションだぞ。
インクルードファイルのあるディレクトリを指定するなら-I<Dir>でいけることが多いんじゃない?
>>56
死ね
5852:03/03/10 22:28
>>57
オマエモナー
>>57-58

自殺サイトで知り合った二人。
6055:03/03/10 22:32
>>56 おお、レスありがとうございます. >>57は私ではありません.
gccです. math.hなどの場合#include <hoge>とした場合の話です.
stdio.hならなにも要らず、math.hなら-lmが要るなど.
man ld, man gccでも特に無いようです.Cの言語仕様書に書いてある
のでしょうか?
>>59
そしてお前が主犯
6252:03/03/10 22:44
>>60
分かっているよ。>>52-54あたりからの流れだw

ヘッダーファイルじゃなくてリンカーに標準じゃリンクしてくれないライブラリをリンクしてくれという
オプションのことでしょ?それの一覧がどこにあるかはわからないなぁ。
-lにライブラリのファイル名のlibと.aを取り除いたものをつければいいんじゃないかな?
6360:03/03/10 22:48
>>62
死ね
6452:03/03/10 22:49
>>63
知ったかだったらスマソ
>>64
オマエモナー
6655, 60:03/03/10 23:06
>>62 ああ、すいません、man ldはやってみまして、
lib"hoge".{so.a}なら-lhogeだというのは書いてあったん
ですが、それだと、math -> libm.soという変換がやはり
出来るためのテーブルがどこかにないと困ることになりま
すよね... man mathでmath.hは出てくるんですが、そこにも
math.hで定義される関数のオブジェクトはlibm.soにあるとは
一言も書かれていないんです.
>>66
/usr/libあたりから自分で探す
ガムバレガムバレガムバレ
インクルードファイルとライブラリモジュールの名前に関連性はないよ。
同じにしているライブラリも在るってだけ。
例えばxmp画像を扱うライブラリはlibxpm.aでインクルードはxpm.hだけど。
大きなライブラリだと多対一だしね。
borland の import32 とか?
71デフォルトの名無しさん:03/03/10 23:23
C++なんですが。

class unko{
char* func(int c);
};

char* unko::func(int c){
int k = new int[c];    // ←A
  ・
   ・
  return k; // ←B
}

-----------------------------
int main(int argc,char* argv[]){
unko un;
un.fun(4);
}

としてますが、Aのメモリー解放をどこでしたら良いのでしょう?
というのも、return で返すときにしようしている。

>>69
libc.aがいい例だな。
>>71
C++ならC++のスレで
それにしても阿呆だなぁ。
7471:03/03/10 23:25
×int k = new int[c];    // ←A
○char k = new char[c]; // ←A
strdupは使用者がfreeで解放しろと言っているね。
char* k だべさ
>>73
おしえて〜。
7871:03/03/10 23:29
>>76
ああ、そうだった。君が正解。
mallocは使ったことないのでよろぴく。>>75
>>78
return後もその領域を参照するなら、その関数とは別のところで解放しないとだめだろ。
8055, 60, 66:03/03/10 23:31
>>69 ががーん.分かりました.必ずしも何らかの命名規則によって変換
出来るようなものではないということですね.
一応私もgoogleなどで探してみたんですが、こういう(私からみれば
それこそ無いと致命的と思われる)ものが転がっていないという
ことはすなわちコンパイラ(リンカー)依存だということですかね?
#include ""ではなくて#include <>として使う標準ヘッダ(?)の関数が
自由自在に自分で探せて、使えるようになるだけでも出来ることが
広がりそうなんですが.
man
82デフォルトの名無しさん:03/03/10 23:33
>>79
サンプル例をよろしく。
何様のつもりだろう。板違いのくせに。
じゃなくてスレ違い
しっかりドキュメントしていればどこでもいいんじゃない?
main の中でも、unko クラスに破棄専用のメソッドを作っても。
8655, 60, 66, 80:03/03/10 23:38
http://cham.ne.jp/piro/p_stdfunc.html
などでCの標準関数一覧は見つけました(本にも載っている)が、コン
パイル時につける-lmなどのオプションとの相関はやはり無いようです.
ちょっと基本的質問のような気がしてきましたのでもう少し自分で
調べてみます.明日も学校があるのでもう寝ます.ありがとうござい
ました.
8771:03/03/10 23:38
>>85
あっそうなんだ。ありがとう。

>>86
そりゃそうだ。
仕様ではファイル名は一部のヘッダーファイルしか定義されていないからね。
89デフォルトの名無しさん:03/03/10 23:53
char buf[]="192.168.0.1/24";
int ipaddr;
int subnetmask;

という状態で、bufにあるデータをipaddrとsubnetmaskへ分ける最も効率の
良い方法をアドバイスください。

私は、
int i;
char addr_tmp[20];
と追加して、
for(i=0; i<strlen(buf); i++)
if(buf[i] == '/')
buf[i] == 0x20;

として、スラッシュをスペースに変え、

sscanf(buf, "%s%d", adr_tmp, subnetmask);
inet_atonで、アドレスを数値に変えてます。

こんなんでいいでしょうか?
なんかスラッシュをスペースに変えてるところが無駄に思えるんですが。。

9055,60,66,80,86:03/03/10 23:58
>>88 ありがとう.math.h <-> libm.soの対応表は
また探します.すくなくともgcc-3.2.2のtar.gzの中には
無かったです.みんなどうしているんだろうか.
朝練もあるんでもう寝ます...
>>90
アーカイブの中身をリスティングするとか・・・常識とか・・・
試してないけどこれじゃあかんかな
char* p = strchr(buf, '/');
if (p) {
subnetmask = atoi(p+1);
*p = '\0';
strcpy(addr_tmp, buf);
}
>>89
スペースに置き換えなくてもいいでしょ。
sscanf(buf, "%s/%d", adr_tmp, subnetmask);
これでいけない?
スペースを0x20なんて書き方するなよ。
9593:03/03/11 00:04
おいおい。
%[^/]/%d
こうだった(鬱
9689:03/03/11 00:06
>>92
ちょっと試してみます。
>>93
そう思ってましたが、なぜか最初の%sで全ての文字列を取得してしまいます。
どうやら、スペース、タブ、改行以外は区切り文字にできないようです。

>>94
ホントはデファイン切ってあるんだけどね。
9793:03/03/11 00:07
>>96
そうそう。うっかりしていた。
だから/を含まない文字列と/と数字列に分けるようにしてみた。試していないけど。>>95
9897:03/03/11 00:12
ダメみたい。。。スマソ
確かこんな感じの書き方があったと思ったんだが。
9955,60,66,80,86,90:03/03/11 00:12
gccの中みても意味ないのかもしれません.binutils-2.13.2.1
の中も見ましたがやはりありませんでした.
>>91さん,そのライブラリの中身をリスティングとはどうやるの
ですか!? 本当にもう寝ます.
10097:03/03/11 00:13
あ、やっぱりできた。sscanfの第一引数を間違えていただけだった。
10189:03/03/11 00:13
>>98
いけました!!
かなりグッドです。
どうやら、私の書いているsscanfにもミスがありました。
subは&subで渡すといけました!!

10289:03/03/11 00:21
ちなみに>>92さんのを試してみましたが、
コアダンプしてしてしまいました。
なぜかな。。
>>99
lib*.aというアーカイブに関数名.oというオブジェクトファイルがたくさん入っていると思うから
それから探せばいいかなと・・・現実的じゃないけど。
10455,60,66,80,86,90,99:03/03/11 00:23
最後に一つだけ.>>91 さん,ひょっとしてnmですか!
たしかに関数名っぽいのがずらずら出てきた
これと*.hの中身を比べてどの*.hがlib*.soに対応して
いるのかを自分でひまな時調べて表にしておけば行け
そうです.-lmなどのオプションは結局謎のままでしたが.
そんなコマンドがあったのか・・・
ldd(共有ライブラリへの依存関係を表示するコマンド)も最近知ったばかりだしな・・・
ar --help
man ar
>>104
そういったことが本格的に必要なら、autoconfを使うことを考えた方がいい。

あるいは、最近はgtk-configとかpkg-configなんて仕組みでオプションを提供
する仕組みもある。

$ gtk-config --cflags
-I/usr/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -I/usr/X11R6/include

$ gtk-config --libs
-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm

$ pkg-config gnome --cflags
-DNEED_GNOMESUPPORT_H -I/usr/include/gnome-1.0
-I/usr/lib/gnome-libs/include -I/usr/include/gtk-1.2
-I/usr/include/glib-1.2 -I/usr/lib/glib/include -I/usr/X11R6/include

$ pkg-config gnome --libs
-L/usr/lib -lgnome -lgnomesupport -lesd -laudiofile -lm -lglib
108 ◆8/MtyDeTiY :03/03/11 09:48
みんな、assert() って使ってるカイ?
109ヽ(´ー`)ノ:03/03/11 10:02
使ってるけど?デバグの時に便利だよ。
あたぼうよ。
あれ使わずしてバグが取れるかってえんだ、べらぼうめ。
貧弱な坊やだった僕も、assert()を知ってからたった一週間で
abort() うざい
デバッグはprintfにかぎるよヽ(´ー`)ノ
私はfprintf()だなぁ。
11555,60,66,80,86,90,99,104:03/03/11 17:05
>>107さん.ありがとう.autoconfで本格的にというのはまだ先だと思うので
すが、役立ちます.<>で指定するようなヘッダでもstdio.hのように何もgcc実行時にoptionが必要ないものがあったかと思うと、その一方でmath.hのように
-lmが必要だったりする、という一見規則がない(しかもその規則を書いた
文書が見当たらない)Cの(UNIXの?ANSI Cの?)header、リンカのシステムが
疑問だったのです.gtk-configやpkg-configの開発者の人たちはこれらの
規則を分かっていると思われるのでこれらの中身を調べて見ます.
多分math.hがあれば-lmを足す、という計算をしている部分があるはずですね.

>>115
> 多分math.hがあれば-lmを足す

全然違う・・・
>>115
ヘッダーファイルは切り離して考えろって。
>>115
とりあえずman 3 introしる。


11955,60,66,80,86,90,99,104,115:03/03/11 18:12
>>116さん、違うんですか?(--;)
>>117さん、-lmなどのオプションはヘッダファイルをインクルード
したかではなく,どの関数を使ったかで決まる、という意味ですか?
>>118さん、おお、あなたは神です.Vine Linuxでman 3 intro
としたら、こんなのがありました.
(3M) These functions are contained in the arithmetic library
libm. They are used by the f77(1) FORTRAN compiler by
default,but not by the cc(1) C compiler, which needs
the option -lm.
(3M) 数学ライブラリ libm を構成する関数です。f77(1)コンパイラ
ではデフォルトで使われますがcc(1)コンパイラではそうでは
ありません.(=自動的にはリンクされません。Cコンパイラで
-lmオプションが必要です.
とそのものずばりがありました!
なんで strtol の第二引数に const が付いてないんだ!!!
constなんぞ使うのは若造
12255,60,66,80,86,90,99,104,115,119:03/03/11 18:26
しかも自分のPCのLinuxでman 3 introだとあまり他の記述は無い
ですが、大学の計算機センターのSolarisでman -s 3 introすると、
libmなら-lm, libmailなら-lmail, libmpなら-lmp, libnvpairなら
-lnvpair, などなど(実に50種類も!)ときちんと載っていました.
あとman sinとすれば(Linuxでは載っていなかったですが)
cc [ flag ... ] file ... -lm [ library ... ]とありました.
もちろん私が蛸だったのですが、man gcc, man ldなどで
SEE ALSO intro(3)と書いてあればこんなに時間を取られなかった
のになあ...sectionの概要はintroを引けというのは常識という
ことのようですね.
>120
委員会がどこにconstをつけるべきかで悩んだからconstはついてません(w
124bloom:03/03/11 18:35
125デフォルトの名無しさん:03/03/11 23:26
C言語なら俺に聞いてみなよ。
126デフォルトの名無しさん:03/03/12 00:12
mallocがリエントラントかどうかを判断するにはどうすりゃいいでしょう。
マニュアル読むんじゃなくて、コンパイル時にマクロかなんかで判断させたい。
>>126
>>1
> 標準Cではできない事の質問は使用している開発環境のスレへGo!

スレ違いです。
特定の環境ではなくて、移植性に関する問題だろう。
残念ながら簡単に調べる方法は知らないが。
仮に分かるとしてもそれを保護する方法が環境依存なんだからだめだろう
なにやら一部のスレが混乱中みたいだけど、ここはマターリヽ(´ー`)ノ
131C言語:03/03/12 00:37
C言語ですが、何か?
おまいらはC以外にどんなプログラミング言語がつかえる?
仕事がきたら、それにあわせて使う。
>>132
ないから今織田信長を勉強中。
>>134
マゾっすか?
try{
本能寺
}
catch(光秀){
MessageBox(_T("是非も無し"));
}
>>135
日本人だからな!
abort()を入れるべきか・・・
人生(五十年) {
if (下天 == 夢幻) {
}
}


>>126
無理ぽ。確実にreentrantなmallocが欲しければ自分でラッピングすべし。
141デフォルトの名無しさん:03/03/12 14:05
142デフォルトの名無しさん:03/03/12 14:29
質問です。
printhってなんですか?
>>142
plinthの誤植
>>141
でもLSI-Cって、ANSIとの互換性にあちこち問題があるんだけど……
intも16bitだしスモールモデルしか扱えないし……
>>144
試食版はね。<スモールモデルのみ

いまどき、64KBで制限されるって言われてもねぇ。
つうか今時LSI-C(略
つうか今時(略
148デフォルトの名無しさん:03/03/12 17:38
あるコマンドをやるとダイアログが出るように
してるのですが、それが別ウインドウの裏に隠れて、見えないときがあるのです。
それを改善するためにダイアログを常にアクティブにしたいのですが、
どのようにソースに組み込んだらいいのでしょうか?
どなたか教えてください。
よろしくお願いします。
>>148
まずは>>1の内容を読んで下さい。
OSすら書いてないのにどう答えろと・・・
>>148
激しくすれ違い。
それに、GUI環境によって答えが変わるので最低限環境を書かないと話が進まない。
まぁ、「常にアクティブ」ではなくて「最前面に配置する」設定があると思われ。
151148:03/03/12 17:43
すいません、OSはXP Homeです。
環境は、VisualStudio.NET2002です。
どうかよろしくお願いします。
>>1を嫁
> GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo!
>>148
まず日本語を勉強しろ。
最前面の間違いだろうが、
もしも常にアクティブになったらウザイよなー
それ閉じるまで他に何も出来んじゃん。
最前面てことなら SetWindowPos() だな。
SetWindownullPos()
>>156
システムモーダルの事か?
話を続けるのも気が引けるが、
9x系はウインドウ開いたら一番上にくるが、
2000/XP系は必ず一番上にはこないで点滅のみ、
という仕様のことでは
ドサクサマギレニ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/  
 (_フ彡        /  ←>>156

なんとなく流しちゃってましたが、160の突っ込みでやっと気づきました。
ありがとう160。
ありがとう156。氏ね。
ものすごく(゚ξ∴д。)グヒャな質問ですが、
標準関数だけでファイルのサイズを取得するにはどの関数ですか?

WinAPIならGetFileSizeとか標準関数でなければ_fstatなどあるようですが。。。
>>162
len = fseek(file,0,SEEK_END); とか。
>>163
stat()でもいいじゃん。
>>163
それじゃだめだろ。
fseekしたあとにftell

>>164
標準関数じゃない。
166デフォルトの名無しさん:03/03/13 21:25
#include <iostream>
using namespace std;
int main()
{
cout << "abc";





return 0;
}
error LINK 2019 未解決の外部シンボル
fatal error LINK 1120 外部参照が未解決です。
と出て本文にはフォーカスがかからないのですが、どういうエラーなのでしょうか?
>>166
error thread 5963 スレ違いの質問です。
>>167
ほう、C言語には関数名間違いによるリンカエラーがないと。そうおっしゃる?
>>162
C には 「ファイルサイズ」 という概念が定義されていない。
素直に環境依存の方法を取った方がいい。
>>168
166 は C 言語じゃない。
>>170
もうしゃべるな。恥の上塗り。
(´-`).。oO(…)
>>171
( ´д)ヒソ(´д`)ヒソ(д` )
つーか、モロにマルチだったという説
うむ。マルチ放置。
昔かじったCをはじめから再勉強するにはどの参考書がいいですか?
>>176
前橋のポインタ本
ポインタとカーソルは違うものですよ、奥さん。
じゃあ、マウスポインタをマウスカーソルと言い換えても普通に通じるのは
何でですか?
>>178
ガッ

>>179
何を言っとるんだね君は。
>>180
ガッ

>>180
何って、戯れ言。
>>179
通じませんよ?
int *hoge;
hoge = (int *)malloc(sizeof(int));
free(hoge);

とやって、4行目以降ですでにhogeがfreeされているって事を知ることは出来ます?
if (hoge)
無理
186184:03/03/15 01:07
ごめん嘘書いた。
#define myFree(x) {if (x){free(x);x=NULL;}}

int *hoge;
hoge = (int *)malloc(sizeof(int));
myFree(hoge);
if (hoge) {
 fprintf(stderr, "メモリ使用中だっちゃ\n");
}
>>188
freeはぬるぽを渡しても大丈夫(なにもしない)からマクロのifは不要。
>>189
知ってるけど、別にいいじゃんか。
>>189
ガッ
>>190
if文のコストしらねーのかボケ!
>>192
大抵の環境では最適化を有効にすれば関係無くなると思うんだが。
194193:03/03/15 10:30
あぁ、だからと言って「if 文入れてもイイじゃん」とは思わないが。
もしNULLでコールされる可能性があるような場合は
if文のコストより関数オーバヘッドの方がでかいと思う。

でもそんな何クロックレベルの話ししてもしょうがないだろう。
テンケー的な机上の議論だね。

おれもfreeと=NULLは必ずセットで書くよ。(マクロは使わないけど)
NULLチェックすれば有効かどうかわかるもんね。
196188:03/03/15 10:51
どもです。「freeしたものがNULLになればわかるのに」と思ってはいたんですが、
NULLを代入すればいいというのには気づきませんでした。言われてみれば・・・なんですが
完璧に盲点。おかげさまで助かりました。
あ、ミス。183です。
漏れ以外に、if付ける派は
居るかい?
199188:03/03/15 14:55
仕事で使っているマクロとはちょっと違うけど、あんなもんです。
つまり私もif付ける派ってことで。
200制御屋さん見習中:03/03/15 18:13

質問です。

gcc(windows版)を使っていて、以下のwarningがでます。

Warning : assignment makes pointer from integer without cast.

これはどのようないみなのでしょうか?


201デフォルトの名無しさん:03/03/15 18:18
>>200
int型にint型でないものを代入しようとしている。
if は使わない派。NULL じゃなくても不定ポインタかもしれないし(w
チェックしてもあまり意味が無いような。
if使うのはたいていfreeのリファレンス読んだこと無い奴が多い。
NULLの代入はポインタを再利用するときだけだろ。
どっちでもいいことだ
>>203
ま、関数コールのコストとifかますコストを考えて
ifをかます判断もありえるわけだけど。

でもこのコスト差が効いてくるのってfreeに渡すポインタが
ほとんどぬるぽのときになんだよな。
あんまり考えられるシチュエーションじゃない。

ぬるぽじゃない場合がほとんどであればかえって余計なifの
コストがかかってくるわけで。

というわけでおれはifで先にぬるぽを引っ掛けたりしないな。
ていうか、free自体使わない
>>206
OSが全部解放するからいらないと(w
この話続けてもfjみたいに泥沼になるだけ
プロなら万が一に備えてif(p) free(p)し、mallocを使わずcallocにすべき。
>if(p) free(p)
でどんな万が一が防げるの?
210ヽ(´ー`)ノ:03/03/15 19:29
>>208
なぜ calloc がそこで出てくる?
>>210
callocの方が通っぽいからヽ(´ー`)ノ
>>201
違うだろ。
キャストなしにint型をポインタにしようとしているんだろ。
213デフォルトの名無しさん:03/03/15 19:33
C歴5年にしてついにmallocを使っちゃいました。どきどき
>>209
万が一内部でNULLチェックを怠っている処理系があるかもしれない。

>>210
百が一アロケートしたバッファの未初期化領域を参照してしまうバグがあるかもしれない。
通はmallocもfreeもつかわない

reallocオンリー、これ
標準ライブラリくらい信用しないとやってられねぇよ。
とあるプロジェクトで#define malloc(size) calloc(1, size)したら直ってしまったバグがあり
今もそのマクロが有効であることは機密事項である。
218ヽ(´ー`)ノ:03/03/15 19:49
>>213
お前は5年間何をしていたのかと小一時間問い詰めたい。

>>214
そんなの言い出したら calloc だってどんなバグがあるか分からんだろ。
ワケワカメな事言ってるなぁ。
>>214
規格を無視した実装のことまで考えてられなくない?
そんなこと言ったら free() 以外の標準関数のほとんどは(ry
>>218
はげどう。
きちんと0に初期化してくれているかどうか心配だ。

>>219
はげどう
221デフォルトの名無しさん:03/03/15 19:53
もっともメジャーでもっとも合理的な命名規則教えて
callocはmallocに比べると随分遅いだろ。
まあ、その遅さが実際に問題になることはそうはないとおもうが。
>>221
ループカウンターにはiという名前をつける。複数ある場合は、j,kと。
>>223
Fortranなら。
225221:03/03/15 19:59
>>223
個別の規則じゃなくってハンガリアンとかまとまったものが知りたいです
>>225
別スレにどうぞ。
227221:03/03/15 20:04
>>226
これって言語に依存した話だと思うんだけど
しません。
229ヽ(´ー`)ノ:03/03/15 20:21
>>221
とりあえず一通り読んでみたら?
 http://pc2.2ch.net/test/read.cgi/tech/1011026963/

どうせ宗教問題になるのが目に見えてるから、「好きなの使え」で
イイと思うよ。多人数でやる場合は仲間内で意見の統一が取れてれば良い。
実際問題、C で色んなライブラリを使ったソフトウェアを作る場合、
各々のライブラリの命名規則がバラバラなんてザラ。

Java や Win32API のように、推奨されている命名規則があるなら
それを使うべきだし、あっちの API とこっちの API の命名規則が
違うなんてことはあんまりない。

個人的には意味の分かる命名…かな。openssl のコードとか。
まぁいずれにせよ、ここでやるのは適切じゃないと思われ。
>>221
>もっともメジャーでもっとも合理的な命名規則
んなの、「リンネの2命名法」に決まっとるがな。
231デフォルトの名無しさん:03/03/15 20:32
PC/AT 互換機の内蔵ブザーを鳴らしたいのですが
ポート番号がわかりません。
DOS 使用です。
御存じの方、教えて下さい。
>>222
遅さが問題になった時は、すぐに malloc に書き換える事が出来る。
最初から malloc だった場合はそうはいかない。
ロジックを根本から考え直す必要が出てくる。

これが本当のプロの仕事というものだ。
#include <stdio.h>
void main(void){
fputc('\a',stderr);
}

main関数がvoidなのは、やる気がないから(笑
実際は、マクロにしてやるといいと思われ。
234ヽ(´ー`)ノ:03/03/15 20:39
>>230
ググって色々読んでみたけど面白かったよ、ありがとう。

>>232
最初から malloc だったら、そもそも遅さが問題になる事は無いと思うんだが。
普段は malloc、必要に応じて calloc。これのどこに問題があるっていうの?
わざわざ遅い処理を無駄に行う事もないだろう。
>>230
これからのプログラマはラテン語が必修科目ってこと
>>232
?何のこっちゃ
237デフォルトの名無しさん:03/03/15 20:43
gccはコンパイラだけで、プリプロセッサやリンカーは他のソフトを使っているということ??
callocを使った。
遅さが問題になった
malloc に書き換えた
解決した

……このロジックをとりあえず根本から考え直す必要が(笑)
239制御屋さん見習中:03/03/15 20:48
200での質問の続きです。

int i, j, k, n;
matrix a;
a = new_matrix(n, n);
メイン関数は上記です。

関数は以下。
この警告は、無視していいのですか?

matrix newmat(int nrow, int ncol)
{
int i;
matrix a;

a = malloc((nrow + 1) * sizeof(void *));
if (a == NULL) return NULL; /* 記憶領域不足 */
for (i = 0; i < nrow; i++) {
a[i] = malloc(sizeof(SCALAR) * ncol);
if (a[i] == NULL) {
while (--i >= 0) free(a[i]);
free(a); return NULL; /* 記憶領域不足 */
}
}
a[nrow] = NULL; /* 行の数を自動判断するための工夫 */
return a;
}
240制御屋さん見習中:03/03/15 20:48
続き

matrix new_matrix(int nrow, int ncol)
{
matrix a;

a = newmat(nrow, ncol);
if (a == NULL) error("記憶領域不足.");
return a;
}

宜しくおねがいします。
www.sra.co.jp/public/sra/product/wingnut/gcc/gcc-j.html

我々は、"GCC" をコンパイラシステム全体を指す名前として使う。
もう少し正確には、このコンパイラの言語非依存部を指す。
例えば、「GCC」の動作に影響する最適化オプションと言ったり、
あるいは単に「コンパイラ」と言ったりすることもある。
RTOSシステムじゃ要求仕様からしてその程度の違いが
致命的なことってあるよね。
でもそーゆーのはヒープなんざ使わんでシステムコールでとる罠。

つーわけで処理速度の話し意味ないってw
mallocも内部でシステムコールを呼んでいると思うけど・・・brkとか。
>>239
ところで、関数のプロトタイプ書いた?
if(abc==0)
>>239
matrixって何よ!っていう話と思われ。
わけがわからないものはint型と無理に解釈するコンパイラもあるし。
>>246
無理じゃなくて規格でそうなっているはず(宣言のない関数の戻り値の型のことでしょ?)。
248制御屋さん見習中:03/03/15 21:13
すみません、ソース全部乗っけれなかったので、

matrix.h

#ifndef MATUTIL
#define MATUTIL

#include <stdio.h>
#include <stdlib.h>
#ifndef SCALAR
#define SCALAR float
#endif
typedef SCALAR *vector, **matrix;

です。

で、自己レス。
>>244さんの言うとうりでした。

ところで、さらに質問です。
大規模(大人数)プログラムで、
ある機能を追加するような、サブルーチンを
作る状況があったとします。。

そんな時、例えば、func.cと新規にファイルを作って作ったとします。
このとき、プロトタイプ宣言とか、#defineとかは、全部func.cで閉じたほうが良いのでしょうか?

今回、確認の為に、適当にmain関数をつくって確認したため、先に質問した質問警告がでて、困りました。
うまい開発方法を教えてください。
識者の方宜しくお願いします。
249246:03/03/15 21:14
規格でそうなってたのか……
>>248
言っている意味がよくわからんが、他のファイルからも呼び出される関数の宣言や他のファイルでも使われる変数、型の定義はヘッダーファイルですべき。
>>234
>最初から malloc だったら、そもそも遅さが問題になる事は無いと思うんだが。
そうではない。後々問題となりそうな部分を「早期に」発見することが出来る。

calloc で遅さが問題になった時には
・ロジックを根本から考え直す
・malloc に書き換える
という2つの選択肢がある。
基本的には前者の方法で対策を取るが、
納期対応等、非常時の場合は後者の選択をすること「も」できる。

malloc の場合にはそうはいかない。
252250:03/03/15 21:17
すべきというか、しないと面倒だ。
>>248
> プロトタイプ宣言とか、#defineとかは、全部func.cで閉じ
そんなことしたらほかのソースで使えないと思う。
プロトタイプ宣言は.hで。
>>254
staticな関数のプロトタイプ宣言は.cで。
>>251
もういい、しゃべるな。
257250:03/03/15 21:21
extern int i;とかは変数の「定義」じゃなくて「宣言」だな(鬱
>>251
メモリ確保に malloc() しか使わないなら、そもそもメモリ確保について何も
考えなくてよく、ロジックの再検討に集中できる。
検討事項が多く挙がれば挙がるほど、そのプログラムの品質は低いという事だ。
259制御屋さん見習中:03/03/15 21:30
>>250,252,253.254

ありがとう御座います。

こうですか?

header.hに
/* includeするファイル*/
#include <stdio.h>

/* 定義文*/
typedef SCALAR *vector, **matrix;
typedef float matNL[N][L];

#define N 10 /*10×10行列とする*/

/* プロトタイプ宣言*/
void error(char *message);
vector newvec(int n);

func.cに
#include " header.h"
を宣言して、関数色々記述。

と、いう感じですか?
>>247
どうして戻り値の型の話になるんだ?
239 の以下のコードは、matrix が宣言されていない限り規格では通らない。

> matrix a;


>>249
なってない。
騙されるな、247 にはこう書いてあるだろう。

> (宣言のない関数の戻り値の型のことでしょ?)
>> プロなら万が一に備えてif(p) free(p)し、mallocを使わずcallocにすべき。
>> calloc で遅さが問題になった時には
*初期化*で速度が遅くなったとき、なんの*ロジック*を考え直すのでしょうか?
設計からやり直すようなのって、プロじゃないような
>>260
MATLABじゃないの?
263260:03/03/15 21:34
ごめん。
264262:03/03/15 21:34
>>260
>>248でそれが原因だったと言っているが。
>>259
>/* includeするファイル*/
>#include <stdio.h>

includeはプログラムごとにした方が良くないか?

あと、規模にもよるが、定義文とプロトタイプ宣言は分けた方がいいかも。
>>266
俺もヘッダーファイル内でincludeはあまり好きじゃないけど、関数の引数や戻り値にsize_t等を使う場合はしかたないんだよね。。。
268デフォルトの名無しさん:03/03/15 21:40
/* typedef int * pint; */
pint p;

こう書いた場合、pをint型にしちゃう処理系があるの?エラーにしないで?
>>267
ああ、意図していることがわかった。
スマソ
ちょっと派生した疑問だけど、
.hでincludeする場合と.cでincludeする場合ってどう切り分けるべきなんだろう?
普段は汎用クラスは.hでinclude、依存関係のあるクラスは.cでincludeしてるんだけど
そんな感じでいいのかな?何か哲学とかある?
271267,269:03/03/15 21:45
>>270
うちはそんな感じですが。
つか、コーディング規約でそうなってます。
>>270
ヘッダでのインクルードは、最小限にする。
273デフォルトの名無しさん:03/03/15 21:56
abort と exitってどう使い分けますか?

malloc失敗したときなんかはどっちを呼んだらいいか判らなくて
悩んでいます。何をもって異常としていいんだろう。

もうひとつ
cygwinのgcc3.2.3だと
#include <stdlib.h>
main(){
 abort();
}
はsegmentation fault(Core dumped)になります
不思議です。

マジレスきぼん
>>273
異常終了ならexit(1);でいいよ。
http://www.microsoft.com/japan/developer/library/vccore/_crt_abort.htm

abort 関数は、ストリーム バッファのフラッシュや atexit 関数、
_onexit 関数の処理を行いません。

abort 関数のメッセージの行き先は、実行中のアプリケーションのタイプ
に応じて決まります。コンソール アプリケーションでは、必ず stderr に
メッセージが送られます。シングルスレッドまたはマルチスレッドの
Windows アプリケーションでは、abort は Windows の MessageBox API
を呼び出して、[OK] ボタン付きのメッセージ ボックスにメッセージを
表示します。ユーザーが [OK] をクリックすると、プログラムをただちに
打ち切ります。

うちはAborted (core dumped)って出るけど。
SIGABRTじゃないの?
環境
Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/specs
gcc version 2.95.3-5 (cygwin special)

結果
$ ./abort
Aborted (core dumped)
278デフォルトの名無しさん:03/03/15 22:05
∧_∧
 ( ´∀`)< ふろぽ
ずれた(T_T)
280273:03/03/15 22:05
>>274
さんくす
本見てもexit()は正常終了としか書いてなかったんでパニックになってた
目から鱗 アホでした俺
281273:03/03/15 22:16
あげてしまった
>>275
なるほどatexitは必ず実行されるわけじゃないんですね

>>276
うちでは何故かsegmentation faultです。たぶんこちらの環境
の何かがおかしいんだと思います不思議
gcc version 3.2 20020927 (prerelease)

hoge@none /cygdrive/d/myprog/myerr
$ ./a
Segmentation fault (core dumped)
void f1();
void f2();
void f1() { f2(); }
void f2() {}
int main(int argc, char* argv[]) { return 0; }

上記コードを gcc3.2で

$gcc -gcoff foo.c

としてコンパイルしたら

Assembler messages:
Fatal error: C_EFCN symbol out of scope

というエラーが出てコンパイルできません。なにが問題なのでしょうか?
$gcc -gcoff foo.c >& /dev/nullpo
>>283
ガッ
>>284 めざといな
ISO_IEC 9899_1999

 7.20.4.1 The abort function
  Synopsis
    1 #include <stdlib.h>
       void abort(void);
  Description
    2 The abort function causes abnormal program termination to occur, unless the signal
       SIGABRT is being caught and the signal handler does not return. Whether open streams
       with unwritten buffered data are flushed, open streams are closed, or temporary files are
       removed is implementation-defined. An implementation-defined form of the status
       unsuccessful termination is returned to the host environment by means of the function
       call raise(SIGABRT).
  Returns
    3 The abort function does not return to its caller.

>>276
正解。

>>281
atexit() を呼ぶとは、規格には全く書いていない。
>>282
どこもおかしくない。gccがタコなだけだろ。

フリーのコンパイラなんか使うから時間を無駄に使うことになる。
>>282
漏れんとこの gcc-2.95.1 ではそんなエラーは出ない。
289ヽ(´ー`)ノ:03/03/16 02:04
>>282
同じく、3.2.2ではそんなエラーは出ないよ。新しいバージョンに上げてみたら?
ごめん、もう眠いよ……

Using COFF on cygwin target

I'm trying to debug my program built with GCC (Cygwin) using the Microsoft
Visual C++ debugger. This debugger claims to understand COFF, which GCC
should be able to generate using the -gcoff option.

The assembler, however, fails with the error described below.


/usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/../../../../i686-pc-cygwin/bin/as.e
xe -v -o Debug\gdbserver\utils.o /cygdrive/c/TEMP/ccUN6YHU.s
GNU assembler version 2.11.90 (i686-pc-cygwin) using BFD version 2.11.90
/cygdrive/c/TEMP/ccUN6YHU.s: Assembler messages:
/cygdrive/c/TEMP/ccUN6YHU.s:1421: Fatal error: C_EFCN symbol out of scope
:
:
:

とのこと。なお、cygwinの2.95.3-5 でも同じ症状がでました。
私の予想では……
これは、gccによる問題ではない、けれどもアセンブラの問題ではないかと思う。
C_EFCNは、binutilsでしか用いられないエラーメッセージある。
その意味は「物理的な関数の終端」である。この理由は、エラーを受け取った場所
で、すでに関数名として定義されているのと同じ名前の、アセンブラのcommonな
変数についてのデバッグstuffを読み込んだことである。
これは、どの関数がここで終了しているのかを見つけさせるものであるが、
その場合すでに(同じ名前の別の)関数は終了しているのである。
であるから、アセンブラーはこれをエラーとして表示する。

私の予想では、これはcoff debug formatに対するreal gurus
の制限に関する返答の1つでは無いかと思う。

If you want my guesses here they are -

This is not a problem with gcc, but may possibly be a problem
in the assembler (unlikely though).
C_EFCN is an internal #define used by binutils that just happens
to show up in the error message. It means 'physical end of function'.
The reason you are getting the error is that the assembler is
reading the debug stuff for your common variable, but it thinks that
the name for that is already associated with a function.
So, it goes to find what function it is currently in to end it, but the function has already been ended. So, you
hit an error condition in the assembler.

My guess as to the response from one of the real gurus 'limitation of coff
debug format'.

http://groups.google.com/groups?q=C_EFCN&hl=en&lr=&ie=UTF-8&selm=6jf79l%248gv%241%40rosenews.rose.hp.com&rnum=6
最近 Google のページを開こうとすると内部エラーで IE が落ちる
>>292
激しく基地外
>>292
OS再インストロールしてみてね
それでダメなら、Memoryを交換してみてね
それでダメなら、HDを交換してみてね
それでだめなら、マザーボードとCPUも交換してみてね

295292:03/03/16 03:07
サウンドカードを交換したら直りますた。
( ´∀`)< ぬるぽ
ストリームは結局
PCアーキテクチャのIOとか周辺機器を繋いでる「バス」そのもの
だと考えて宜しいのか?
オーキードーキー
>>296
だめ。
(1)
    unsigned int x = 1;
    char *p = (char *)&x;
    printf("%x %x %x %x\n", p[0], p[1], p[2], p[3]);

(2)
    unsigned int x = 1;
    char buf[256];
    char *p = buf;
    while (i < CHAR_BIT * sizeof (unsigned int)) {
        *p++ = x << i++ & ~(~0U >> 1) ? '1' : '0';
        if (i % CHAR_BIT == 0)
            *p++ = ' ';
    }
    *--p = '\0';
    printf("%s\n", p);


上の2種類の方法で x の値を表示させると、(1)は 1 0 0 0 、(2)は 00000000 00000000 00000000 00000001 と、
それぞれ別のバイトオーダーで表示されてしまいます。
どうしてこの様になってしまうのでしょうか?

コンパイラはgcc2.95.4です。
300299:03/03/16 21:17
すみません。(2)の i は 0 に初期化されています。
>>299
ソース読む気ないけど、リトルエンディアンの関係でしょ。
 
>>299
実際には 301 の言う通りなんだけど、本当の原因は unsigned int 等の内部表現が
C では規定されていないから。
環境によって結果が多いに変わる可能性があるので、特定の内部表現に頼ったコード
はなるべく書かないのが望ましいね。
もちろん、特定環境でしか動かさないプログラムなら依存しまくってもいいけど、
将来に移殖の必要が出た時に苦心する事になるよ。
304.. ◆rGsyzf.Kp2 :03/03/17 05:45
初心者でスマソ。
ポインタで宣言した変数"list"で
「&list」 っていうのはどういう意味なのでしょか?
ぜんかくあんぱさんどlist
>>304
たとえば、
char *list;
って定義したときの&listか?
listはポインタ型の変数でlistにはアドレスを収めることができる。
そのアドレスを収めるアドレスが&listだ。

って、混乱しそうな説明だなあ。とにかく何か変数を定義したら、
どっかメモリーに収める領域が確保される。
その収める領域(アドレス)を得るために&演算子が用意されている。
307.. ◆rGsyzf.Kp2 :03/03/17 05:56
あ〜!なるほど。。
だからポインタのポインタに渡すときつかわれるのですね。。
こんな質問にこたえてくださって感謝
>>298
ちょっと考えてみたんだが

Cはメモリ以外のIO装置の全てをファイルと認識し
ストリームを結合してそれらを操作する。
そのストリームとは物理的なバスのことではなく、
UNIXなどのOSが仮定する概念的なインターフェイスである

こんなんで合ってますか?
309制御屋さん見習中:03/03/17 16:28
>>304便乗

私も、質問です。

float **a;

とした場合、A[10][10]]などの配列を
どうやって示してあげれば良いのですか?

a=&A ×
a=&A[][10]  ×

でした。
>>309
キャストでもしないかぎりは無理。
ポインタをfloat (*a)[10];と定義すべし。
311制御屋さん見習中:03/03/17 17:06
>>310
たすかります。

キャストするにはどうすればよいです?
ポインタは、float **aですでに決まっています。
(mallocで、a[10][10]等、確保する予定)

それと、A[10][10]を参照させたいのです。

お願いします。
>>311
mallocで100 * sizeof(float)するとか2ループ使って地道に確保するとか。
>>311
まず float *[10] を確保する。
次にループを回してそれぞれに float [10] へのポインタを代入する。

float **a;
a = (float *[10])malloc(sizoof(float *[10]));
for (i = 0; i < 10; i++) {
a[i] = (float [10])malloc(sizeof(float [10]));
}

mallocの返り値がNULLかチェックを忘れずに。また freeはこれと
逆順で。
>>311 まあこれでいけそうだ。freeは省略してある。

float A[10][10];

int main(void)
{
float **a;
int i;

if ((a = (float **)malloc(sizeof(float *[10]))) == NULL) exit(1);
for (i = 0; i < 10; i++)
a[i] = (float *)&A[i];

A[1][2] = 345.678;
A[3][4] = 567.891;

printf("%f %f\n", a[1][2], a[3][4]);

return 0;
}
>>308
>Cはメモリ以外のIO装置をファイル〜

それは「C」がではなく「UNIX(系OS)」がやってることで、、、
>>301
>>303
レスありがとうございます。

この場合、通常はリトルエンディアンだけれども、ある条件 (この場合はシフト
演算子のオペランドになった時でしょうか) の時にはビッグエンディアンに変換
してから操作を行っている、 ということでしょうか?
>>311 普通の二次元配列との互換性を無視するならこんな感じ。
同じくfreeは省いた。

int main(void)
{
float **a;
int i, j;

if ((a = (float **)malloc(sizeof(float *[10]))) == NULL) exit(1);
for (i = 0; i < 10; i++)
if ((a[i] = (float *)malloc(sizeof(float [10]))) == NULL) exit(1);

a[1][2] = 345.678;
a[3][4] = 567.891;

printf("%f %f\n", a[1][2], a[3][4]);

return 0;
}
>>316
演算子の評価対象になった場合はビッグエンディアンもリトルエンディアン
もないだろ。宣言してある「型」であくまでアクセスされる。
これを一旦メモリに入れるとエンディアンが問題になる。
>>311
ポインタへのポインタと、2次元配列は全く異なるものだよ。

float *ppf, af[10][10];
という定義があったとしようppfはまっとうな値が入ってるとして、
たとえばppf[2][1]とやったときと、af[2][1]とやったときにコンパイラが
どう評価するかというと

ppf→| ppf[0](floatを指すポインタ) |
    | ppf[1](floatを指すポインタ) |
    | ppf[2](floatを指すポインタ) |→| ppf[2][0] |
                       | ppf[2][1] | ← これ


af
| af[0][0] | af[0][1] | af[0][2] | af[0][3] |……| af[0][9] |
| af[1][0] | af[1][1] | af[1][2] | af[1][3] |……| af[1][9] |
| af[2][0] | af[2][1] | af[2][2] | af[2][3] |……| af[2][9] |
   :   ↑これ
   :
| af[9][0] | af[9][1] | af[9][2] | af[9][3] |……| af[9][9] |

こうなるわけ。たまたま一次元の配列とポインタは似たような表記で
扱うことが可能だけど、それは1次元だけの話で、それ以上はケアしてくれない。
だってppfなんてコンパイラにとっては単にポインタをさすポインタでしかないわけで、
10*10の情報とかそんなのはどこにもないからね。

だから、mallocするとかして実体をさすように自分でケアしてやらなきゃいけない。
>316
違う。
>>316
だから、整数型の内部表現は関係無い。
>> は小さくなる方に、<< は大きくなる方にシフトする。
>>316
そのへんがスッキリしないなら、
アセンブラやるといいよ。
少し齧る程度でいいからさ。
323制御屋さん見習中:03/03/17 18:08
>>312 ,313,314,317,319

SPECIAL ThanX!

どうもありがとう御座います。
この辺は、私には難しいです。

よ〜く、読みなおして試してみます。
>>319
どうでもいいが、
float **ppf;
…念のため。
325319:03/03/17 18:46
>>324
あ。ほんとだ。鬱だ死脳
326デフォルトの名無しさん:03/03/17 20:01
データを格納する領域をあらかじめmallocしておいて、
そこに対するポインタでデータを取り出してるんですが、
データの数が多くなってmallocした領域が足りなくなった場合に、
reallocで拡張するとメモリ上の位置が変わってしまって、
データに対するポインタがうまく動かなくなってしまいます。
こういう時ってどうすればよいのでしょうか?
どなたかご教授願います。
>>326
reallocが返すポインタを元に計算し直せ。
連結リストにするとか
329デフォルトの名無しさん:03/03/17 20:18
dNode *dList::find_Node(const dNode &searchNode,dNode *pStart=NULL,
int (*compare)(const dNode*,const dNode*)
=dNode default_compare);
エラー;' が、識別子 'default_compare' の前に必要ですとでるんですけど
エラーがでないようにしたいんです。
どうすればいいか教えてください。
これってCですか?
331デフォルトの名無しさん:03/03/17 20:23
あ、ごめんなさい間違えました
C++だった

よろしい おちるまえにぬるぽのちから とくとめにやきつけておけ
キミノアタマニヤキツケテヲケヨ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>332
334273:03/03/17 23:24
CYGWINバージョンあげてみたりReinstallしてみたり
Cygwinフォルダ全部消して再インストールしたりしてみたけど
abort()はやっぱりsegmentation faultですた。
いろいろコンパイルしてみてわかったのですが意味不明のsegfaultは
abort()だけでもないみたいです。
もう、Windows98インストールしなおすしかないみたいです;;
なんでだろ…。
鬱だし脳
他人事だが >334 がんがれ
336デフォルトの名無しさん:03/03/18 02:44
299以降でリトルエンディアン、ビッグエンディアンの話が出てたので
便乗質問させていただきます。

303氏が、
>環境によって結果が多いに変わる可能性があるので、
と書いてましたが、この場合の「環境」とは何を指すのでしょうか?
OSやコンパイラに依存するのか、
はたまたマザーボードやメモリに依存するのかが分かりません。
ご教授お願いします。
CPUとか。
338336:03/03/18 03:15
>337氏
レスありがとうございます。
ttp://www.ffortune.net/comp/history/cpu-motorola.htm などなど。
途中で切り替えられるようなCPUもあったっけかな、SHとか<記憶曖昧
あと、ファイルフォーマットや通信パケットなどで
リトル/ビックエンディアンどちらかきめてるとか
>>339
PowerPCもエンディアンを変えられたはず。
ネットワークは確かビッグエンディアン
だけど C の整数型の内部表現の話とは全く関係無い
>>339
途中で、て…
Cにおける疑問をビット単位で整合性をとりたいヤシは
アセンブラでCPUの勉強をyれ
オレモダガナー
4月から大学でC言語を学ぶことになりました。
そこで、C言語を習得するのに役に立った参考書やサイトなどを教えてもらえませんでしょうか?
よろしくお願いします。
参考書ならダイテル兄弟のテキストがお勧めかな
アメリカの大学でも採用されてるし
サイトはテキストで体系的な理解を得てから
断片的にリファレンスするのがいいと思われ
>>345
大学でCを勉強してきたと自称する奴のほとんどが現場で使えないと言う事実があるので、
講義を聞き流して課題をコピーするだけならやめたほうがいい。
自力で勉強する気があるなら、講義で疑問に思ったことはここで聞くといい。
いろんな考えがあることも含めていい勉強になる。
プログラム入門の課題は10分以内に終わらせよう。
>>342
今の下位層のプロトコルは大抵ビッグエンディアンだし、基本的には、ね。
だが、ストリーム中のデータに関しては上位層の責任範囲だから関係なし。
>>349
すみません、モトローラ方式がビッグエンディアンでしたっけ?未だにごっちゃ。
351345:03/03/18 16:45
>>347
そうなんですか!?大学だけに頼らないで勉強していきます!
>>351
頑張れ。大学のプログラム関係の授業は単位稼ぎと思え(る位になっとけ)。
353342:03/03/18 17:56
>>349
わかってる、>>341 が貼ってくれたリンクに全部書いてある
仕事でやっているやつもたいしたことないけどな!
専門行ってる奴が一般人の俺にプログラムの宿題頼んでくるんだけど
何かマ板向けのネタになってきた
エディタを作っています。
エンコーディングの自動判別をしたんですが、何か良い方法はありますか?

 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 |     ヌノレポ    |
 |_________|
    ∧_∧ .||
   ( ´∀`)||
   /   づΦ

>>357
jcode.plでぐぐれ。
>>359
移植せぇと言うのか・・・残酷だな。
>>360
ハァ?
ネットにそれっぽい C のソースがあったから探せばいいと思う。
ちなみに漏れの better C で書いた CGI で SJIS/EUC/JIS を処理するルーチン
書いたけど、コードスタイルの関係であんまり晒したくない。
Cだったらnkfのソース見たほうがいいかも。
まんまぱくれるかもしらんし(w

あ、ライセンスにはきぃつけえよ
>>364
GPLじゃないの?
>>365
ちゃいます。nkf.cのコメント部分で利用条件についてかいてあるけど

** このソースのいかなる複写,改変,修正も許諾します。ただし、
** その際には、誰が貢献したを示すこの部分を残すこと。
** 再配布や雑誌の付録などの問い合わせも必要ありません。
** 営利利用も上記に反しない範囲で許可します。
** バイナリの配布の際にはversion messageを保存することを条件とします。
** このプログラムについては特に何の保証もしない、悪しからず。

これだけ。GPLじゃないです。
残すだけでいいのか。
じゃあこぴっちゃおう。
すんません
フラッシュでバッファのデータを吐き出したとき
ファイルからの読み出しデータの場合はどんな処理がされるんですか?
>>368
質問の意味がわからん。
もし、入力用に開いたストリームに対して fflush() 使った場合を訊いているなら、
その動作は


     未  定  義


なのでよろしく。
激しく未定義キタ━━━━━(゚∀゚)━━━━━!!!!


でも VC++ だと 「入力バッファをクリア」 になるけどナー。
371デフォルトの名無しさん:03/03/18 23:11
プログラム作ってください、C++でお願いします。叩き煽りは無用です。
じゃあ放置で
>>371
ほれ
int main()
{
}
374371:03/03/18 23:15
解決しました。ありがとうございました。
375デフォルトの名無しさん:03/03/18 23:19
カレントディレクトリにあるファイルを調べるにはどうしたらよいのですか?
自作する場合はfopenでa,b,...,aaaa,aaab,...見たいに繰り返して何文字かの
ファイル名でオープンしていき、成功(有る)なら表示して、失敗(無い)なら
飛ばすみたいなのを考えているのですが。system("dir")はただ表示されるだけ
みたいですし。
>>375
標準関数だけじゃ無理。
UNIXならopendir〜readdirで。 dirとか言っているからUNIXじゃないかも。。。
>>375
Win32ならFindFirstFileとかかね。
>>375
標準 C ではディレクトリという概念が定義されていません。
ディレクトリを走査したいならコンパイラ付属のリファレンス等を見て、環境依存の
方法を探してください。
あなたの言う、全種類の名前を網羅するよう方法は全くお奨めできません。
それによってテストされるファイル名の数はどりくらいになるか見当つきますか?
どりくらい
どりくらい
どりくらい
どりくらい
371です。ひどすぎます、もう来ません。
>>380
そいつぁ良かった。
いや、そろそろネタっぽいんだけど
どりくらいが? ネタ?

おまえ考えすぎ!
いや、この文脈で 371 の件だと受け取られないとは思わなかったけれども
>>382-384
ネタですか?
>>384
「そろそろ」って ? >>371 の件だったら、「はじめから」だろ。
戦争反対に署名しよう!(戦争開始20日10時までに、色々な板にコピペしてください。あなたのご協力を切望します。)

http://www.thepetitionsite.com/takeaction/224622495
1.Sign This Petition!の所に名前(ローマ字)を入れボタンを押す。
2.フォームに必要事項(赤字で(required)と書かれた所)を記入し、ボタンを押す。
「E-MAIL ADDRESS」には適当なアドレスを、「STATE」には「(NON USA)」、「COUNTRY」は「Japan」を、「WHY I'M SIGNING THIS PETITION」には、戦争反対声明文を入れよう!(例:No More War!!)
3.下の「Add my Signature」ボタンを押せば、署名完了!
参考:http://xmas.site.ne.jp/topics/20010922/Petition.html
ここ C のスレだしなぁ…放っとこうかなぁ…けど一応ツッコミ入れとかないとなぁ…
>>373
main() オーバーロードすんな。
>>388
( ゚д゚)…
371 よりもネタっぽい人が現われたわけですが・・・
391357:03/03/19 00:23
解答してくれた方、ありがとうございます。
内部エンコーディングを UCS-4 あたりにしようと考えているんですが、
いくつか捜してみましたがエンコーディングの認識の付いたものがないんです。
認識部分だけ nkf を参考にして自前で実装した方が良いでしょうか?
>>391
適当でイインジャネーノ?
どのみち100%の精度で認識なんて、絶対無理なんだし。
>>391
詳しく見てないけど、この辺は?
http://terry.jiubao.org/kanji/
SJISとEUC-JPのどちらでも使われているところだけで書かれているファイルをnkfに渡したらどう判断するんだろう。
やってみれ
多分スレ違い
IEでも自動判別で誤認識するよねぇ
>>358
ガッ
398375:03/03/19 03:35
>>376-378
お答えありがとうございました。一応できました。
#include <stdio.h>
#include <windows.h>
int main(void)
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind=FindFirstFile("D:\\MyCppFiles\\ファイル、ディレクトリ研究\\*.txt",&FindFileData);
if(hFind==INVALID_HANDLE_VALUE)
printf("見つかりませんでした");
else
{
do printf("%s\n",FindFileData.cFileName);
while(FindNextFile(hFind,&FindFileData));
FindClose(hFind);
}
return 0;
}
>>391
UCS-4はエンコーディングではない
>>400
UCS-400はgetではない
1つの文が複数行になる場合、
2行目以降をインデントしない書き方は邪道ですか?

if ( nHoge1== nHoge1 + nHoge2 + nHoge3 ||
nHoge3 == nHoge1 + nHoge2 + nHoge3 ) ←この行
  return 0;
見にくいと思う。ちなみに漏れはcc-mode(bsd style)まかせなのでこんな感じ
やね。

if (nHoge1== nHoge1 + nHoge2 + nHoge3 ||
  nHoge3 == nHoge1 + nHoge2 + nHoge3)
  return 0;

まとめて圧縮をかけてもフロッピーで複数枚になるような
サイズのディレクトリを、プログラム中でやりとりしなければ
ならないのですが、皆さんならどう作成しますか?

データサイズをみながらマウントして、情報を読み書きして、
アンマウントして・・・とか正直にいくのが正解なんですかね、
イチから作るとなると激しく面倒な気がするんですが・・・
(´Д`;)

アドバイスや、先人たちの知恵(ライブラリ等)をご存知で
したら教えてください。ちなみにLinuxです。
(´-`).。oO(なんでこのスレなんだろう…)
(´-`).。oO(いまどきフロッピーって…)
ふつうtar。
407オシエテちゃん:03/03/19 13:32
HyperCardのwin版ってないのでしょうか?
お願い!詳しい人教えてくださいな!
408デフォルトの名無しさん:03/03/19 14:14
2次元配列で混乱してきました。
int A[5][3];の宣言の意味するところは

int型の3個の要素を持つ配列を保持する5個の配列ですか?
それとも
int型の5個の要素を持つ配列を保持する3個の配列ですか?
A[0]はどんなものを保持するんですかね?
>A[0]はどんなものを保持するんですかね?

&A[0][0]
>>407
それって C 言語と関係あるの?
それって C 言語と関係あるの?
それって C 言語と関係あるの?
それって C 言語と関係あるの?
それって C 言語と関係あるの?
それって C 言語と関係あるの?
それって C 言語と関係あるの?
それって C 言語と関係あるの?


  そ れ っ て C 言 語 と 関 係 あ る の ?


411デフォルトの名無しさん:03/03/19 14:18
>>409
じゃあA[1]は
&A[1][0]でいいですか?
>>408
前者。A[0] は int[3]
>>411
イイ

414412:03/03/19 14:23
ただし A[0](=int[3]) は単項 & か sizeof のオペランドになるとき以外は
int[3] の先頭要素を指すポインタになる
415408:03/03/19 14:29
さんくすなるほどだいぶわかりました
A[0]->□□□
A[1]->□□□
A[2]->□□□
A[3]->□□□
A[4]->□□□
みたいなかんじですね
あと、A[0] と A はアドレスは同じ所を表すが
型が int * と int ( *)[3]で違う
質問です
関数getsの引数は配列へのポインタしかとらないんですかね
例えば、宣言時に文字列リテラルで初期化した
charへのポインタを引数にして、入力ストリームから読み込んだデータで
初期化した文字列を上書きさせたりとかはできないんですか?
418408:03/03/19 14:34
あひゃ
A[0]がint ( *)[3]でAがint *ですか?
>>417
getsの引数はcharへのポインタだが。
それと、文字列リテラルは書き換えることは出来ない。
>>417
文字列リテラルを書き変えてはいけないでせう
>>418
逆ぽ
>>418 ぎゃく。
A[0]がint * じゃないとA[0][2]見たいに出来ないじゃん
422418:03/03/19 14:53
どうもたびたびスマンコ
今度こそかなりわかりました
int (*)[3]
っていうのが良く分かんなかったので
int (*)[3]はpointer to array[3] of int ですね
>>419
引数は確かにcharへのポインタなんですが
そのポインタが指す先のオブジェクトのメモリ領域が用意されてないと
メモリ破壊が起こるらしいっす
だから結局
引数には配列へのポインタしかとれないってことなんすかね?
>>422
かしこい!
>>423
#include<stdio.h>
int main(void)
{
    char ch;
    printf("改行してください。\n");
    gets(&ch);
    return 0;
}
メモリ破壊が起こるかどうかは入力による。
>>423
charへのポインタならなんでもいいんだけど、安全に動作させたかったら書き込める領域を指すポインタを渡す。
>>425
>>426
おお!

了解であります!
文字列リテラルを書換えるなんてもっての他だわ
ぬるぽを叩くなんてもっての他だわ
Win2000にセキュリティホールだってさ。
  セキュリティホール・・・
  (; ・∀・)  |  | 
 と    )  |  | スカッ
   Y /ノ  / /
    / )  / /Λ__Λ ?
  _/し' // ( ´∀`)>>429
 (_フ彡    (    )
>同社によると、欠陥を放置した場合、攻撃者が
>攻撃対象コンピューターを停止させたり任意の
>プログラムを実行するなど、事実上乗っ取ることが可能。
>欠陥の中でも最大深刻度の「緊急」と位置付けている

18日発表ったら昨日か。頼むよM$。
処理系=コンパイラ
実装=コンパイル
と認識してしまっていいんでしょうか?
435357:03/03/19 16:19
返事が遅れました、みなさんありがとう。

>>399
すみません、文字セットですよね。

みなさんはこういう対応はどうしてるんでしょう…。iconv や wchar.h じゃ
不十分だと思うんですが…。
// locale が絡んでくるから「多言語化」はできないですよね?
個人的には、処理系っていうとハードソフトひっくるめたコンパイル環境ってイメージだな。
実装は原語implementでしょ?コンパイルとは違う。
>>435
stdlibでは駄目だが、iconvならエンコーディングを自分で指定すれば
問題はないのでは?
438デフォルトの名無しさん:03/03/19 20:19
for(i=0;i<strlen(player[st[sWin].player].winmes[winatr]);i++)
これって使い方あってる?
その行だけを出されたところで何も判断できないわけだが
440438:03/03/19 20:30
上の文章でエラーが
'<' : signed と unsigned の数値を比較しようとしました。
といって弾かれるのです。
あまり重要でない警告。
警告とエラーの区別くらいつけようよ。
ってことは
あのコードまじで使ってるのか。
かっちょいいな
444デフォルトの名無しさん:03/03/19 20:48
>>440
i を unsigned に汁
警告メッセージの意味がわからないならまずコンパイラのリファレンスを調べろ。
リファレンスを調べ方がわからないと言うならばお手上げだ。
条件がマトリョーシカみたいだな。
>>447
wマトリョーシカ辞書引きそうになった。
http://www.geocities.co.jp/HeartLand-Keyaki/2341/encyclopedia/matryosh.htm
ロシアのあれな
マジョーリカはマジョーがえる
450デフォルトの名無しさん:03/03/19 21:42
Cの書籍でvoid main(void)と書いている本の執筆者はタコと思って
いいんでしょうか?
すいません
標準入力ストリームからバッファに溜められたデータは
改行文字を読み込んでプログラムへ送られる時に
改行文字まで読み込むんですか
それとも改行文字はバッファに残すんでせうか?
>>438
間違ってるとは言わんけど、ホントに毎回 strlen() 呼ぶ必要があるか確認した方がいい。
453デフォルトの名無しさん:03/03/19 23:04
for(II=0;II<kekka;II++){

}
のあとに
IIの数値を継続させたまま
for文を作るにはどうすればいいですか?
IIに何も代入しなければいいじゃない。。。
for(;II<kekka;II++)とか
>>453
意味がわかりません。
スコープって知ってますか?
456デフォルトの名無しさん:03/03/19 23:09
>>453の質問の意味がわからないのはオレだけか?
457454:03/03/19 23:10
>>455>>456
ループを抜けたあとにまた似たようなループをつくりたいんじゃないかと・・・
で、forではIIを0に初期化しなければならないと思いこんでいるとか。
>>456
俺も...。
ついでに、>>455 で唐突にスコープが出てくるのもよくわからん。
俺は意味は分かったがループ変数名が気持ち悪い派。
>>459
よく意味わかったね。すごいよ。
変数名は確かに変。意味があるならイイけど…
Tがどっかにでてきてると思うと今日は寝れないなぁ〜
IIって2のことだろ
つまりC++であれば
for(int II=0;II<kekka;II++){
というのが許されて、スコープはfor文内なわけで・・・
まぁここはC言語スレなわけだが。
ところで453はどこへ?w
またC++か
for (void* XI = 0; XI < XII; XI++)
>>464
ガッ
なぜガッ?w
void*の++でコンパイリュエリャー
>>466
void *XI=0 ←ぬるぽだから。
>>466
Cスレだからだと思われ(w
>>451
改行文字はバッファに残す。
#define timesdo(num) for(int i=0;i<(num);i++)
main(){
 timesdo(5){
  printf("あぼーん\n");
 }
}
#define foreach(__var, __begin, __end, __statement) do { \
 int __var; \
 for (__var = __begin ; __var < __end ; __var++) { \
  __statement; \
 } \
} while(0)


int main(int argc, char** argv) {
 foreach (i, 0, argc, printf("%s\n", argv[i]));
}
い、int??
473デフォルトの名無しさん:03/03/20 04:41
int i=3;
func((i++)*2);

こう書いた場合、funcには必ず6が渡されますよね? 未定義とか処理系依存ではないですよね?
>>473
funcが関数であればいいんだが、
マクロで引数が2回以上評価されるかもしれない。
>>473
変数に対して副作用があるコードは、副作用完了点までにその変数が再び出現
しなければいい。
476453:03/03/20 07:41
みなさまありがとうございます。

これからやってみます。

変数名のIIはiもIもiiも別の処理に使ってしまったので、
IIを使うことになったのです。

>>476
うわぁ……
>>476
君にこそハンガリアンが必要だ。
ファイルポインタとファイル位置指示子で混乱してきました
ファイルポインタはOSが割り当てたバッファ用のメモリ領域の先頭位置を指してて
ファイル位置指示子はそのメモリ領域で現在プログラムが読み込んでいる位置を指しているもの
という風に解釈してるんですが
>>469
残した改行文字は自動的にフラッシュされるんでしょうか?
ファイルポインタが指しているのはファイルの情報を収めた構造体でしょ。
>>480
あ、そうでしたか・・・
ちょっと頭冷やしてきます
>>479
質問の意味が全くわからない。
「フラッシュ」 という言葉が何を指しているのかは不明だけど、fflush() の事を言って
いるなら >>369
で、「自動的に」 の意味が皆目見当つかない。

あと、読み込み専用に開かれているストリームの場合は、データは一方通行で巻き戻し
(fseek() や rewind() 等) が出来ず、従ってそもそもデータ位置を記録していない
場合もある。
>>482
了解しました。
自動的はプログラムで明示的にしなくてもで
フラッシュはfflush()のことをいいたかったです
表現が曖昧でもうしわけないです
int  **int_ptr,
    num;

*int_ptr = num;

ぬるぬるいんぽ。
>>482
> あと、読み込み専用に開かれているストリームの場合は、データは一方通行で巻き戻し
> (fseek() や rewind() 等) が出来ず、
(゚Д゚)ハァ?
>>485
そこで切らずに最後まで読んでくれよ。
>>482
> あと、読み込み専用に開かれているストリームの場合は、データは一方通行で巻き戻し
> (fseek() や rewind() 等) が出来ず、従ってそもそもデータ位置を記録していない
(゚Д゚)ハァ?
ワラタ
489デフォルトの名無しさん:03/03/20 15:51
何でvoid main(void)なんて書いてる本が多いのでしょうか?
>>489
説明するのが面倒だからだと思います。
規格のことを良く知らないライターさんが書いてるからではなかろうか。
void main(void) が動かない処理系があっても全然おかしくないわけだし。
初めから int main(void) と書いとけば間違いないのになと思うけど。
>>450もみたけど
void main(void)
本の価値を決めてしまうほど
重要でもない気がする
493デフォルトの名無しさん:03/03/20 16:27
>>490
説明するのが面倒とは?
ただ、void main(void)でANSI C準拠ですみたいなことは言わないで欲しい。
void main(void)でのサンプルコードをUNIXで動作確認しただと??
(((( ;゚Д゚)))ガクガクブルブル
別に大した問題じゃない。
警告がでりゃintにしときゃいい。
本当にステータスを返す必然性があるのならintにすりゃいい。
そんな事よりもっと大事な事は一杯あっぺよ。
言語リファレンスだったら多少問題かもしれんけどな。
まあしかしいきなりやられると内容に一抹の不安を覚えることは確かだ(w
しかし参考書の類で書いてしまうのはマズイと思うのー
>>498
同意。
特に入門書で、いきなり規格外のやり方を教えるのはいかがかと・・
DOSってどうやってつかうんでしょうか?
サービス停止攻撃?使うというものではないような。。
502デフォルトの名無しさん:03/03/20 17:28
  ∧_∧
 ( ´∀`)< ぬるぽ
気合いと共に腰だめに構えて相手に突き立てる
 スルナ!
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        / ←>>502
   | \
   |Д`) ダレモイナイ・・ヌルポ スルナラ イマノウチ
   |⊂
   |


     ♪  Å
   ♪   / \   ヌルポ ヌルポ
      ヽ(´Д`;)ノ   ヌルポ
         (  へ)    ヌルポ ヌルポ
          く       



   ♪    Å
     ♪ / \   ヌルポ ヌルポ
      ヽ( ・∀・)ノ  ヌルポ
         (へ  )    ヌルポ
             >    
   A A ウーリャリャリャリャリャリャリャ
  ( ・∀・)   | | |
 と    )    川 ボコビシバキドカグシャ
   Y /ノ    人 ☆
    / )  ☆<  >__Λ∩
  _/し' //. V☆Д )/
 (_フ彡        /  ←>>505
507デフォルトの名無しさん:03/03/20 17:36
>>501
いや、cやるならDOSつかえと、言われましたもので・・・
>>507
Linuxでも使え
ぬるぽの起源はCニダ
510デフォルトの名無しさん:03/03/20 17:45
>>508
Windowsじゃだめなんですか?
>>510
駄目
>>510
やっぱLinuxだべ。
513デフォルトの名無しさん:03/03/20 17:58
WindowsでCは邪道ということですか?
>>513
Linux+gccでやれば問題なし
515デフォルトの名無しさん:03/03/20 18:38
MacOSX+gccでもいいでつか?
マカーはC言語を使ってはいけません。
>>515
いいと思われ
間を取ってLindowsはどうだ?
>>513
逆。
CにWindowsは邪道
というか、CよかC++を勉強したほうが(グフッ
521デフォルトの名無しさん:03/03/20 20:22
LinuxにしたいけどCygwin使ってる漏れは糞ですか?
>>521
エエんちゃう?
そもそも Cygwin って「Windowsの糞 cmd.exe なんか使ってられないんだよもん」
という Unix 使いや、「Unix 使ってみたいけど、ちょっと敷居が…」って人向けのものでしょ。
ついにCを完全に死滅させることに成功し
来期からC++、Javaオンリーになりますた。
さようならC、ありがとうC君のことは永遠に忘れない。
>>523
ボソおまえはCから逃れられない。
525デフォルトの名無しさん:03/03/20 21:58
Cygwin使ったこと無いからわからないんだけど、やっぱvoid main(void)で
エラー出るの?
技術評論社のとあるC言語の本はLinuxのgccを前提にしてるって書いてある
んだけど、void main(void)なんだよね。Linuxでも警告も出ないのってあるの?
test.c:5: warning: return type of `main' is not `int'
>>525
[user@host 22:29 user]$ cat test.c
#include <stdio.h>
void main(void) { }

[user@host 22:29 user]$ gcc test.c
test.c: 関数 `main' 内:
test.c:3: 警告: `main' の戻り値の型が `int' ではありません
[user@host 22:30 user]$ gcc --version
gcc (GCC) 3.2.2
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
528525:03/03/20 22:48
>>526-527
サンクス。

なぜあの本はLinuxでvoid main(void)を使って平気だったんだろう・・・?
警告が出てもコンパイルは続行されるもん。
警告なんて一切問題のない構文でも出るし。
531デフォルトの名無しさん:03/03/20 23:02
警告なら無視しちゃってもいいってことですか?
void* main(void) { return 0; }
          | | ガガガガガッ   .人
  ( ・∀・)   | |       人  <  >__Λ∩
 と    )    | |    人  <  >__Λ∩Д´)/
   Y /ノ    .人   <  >__Λ∩Д´)/   / ←>>532
    / ) .人 <  >__Λ ∩Д´)/   / ←>>532
  _/し' <  >_Λ∩Д´)/   / ←>>532
 (_フ彡 V`Д´)/   / ←>>532
            / ←>>532
gccなら-Wallでワーニングが出なくなるまでやらなきゃ……
普通、alias gcc="gcc -Wall" だろ。
if(a=b())
こう書いただけでも警告がでるんだが・・
いや、alias gcc="gcc -Wall -ansi -pedantic"だろ。
538デフォルトの名無しさん:03/03/20 23:20
void main(void)の奴ってWindowsでしかCやったこと無い奴なんじゃないの?
HINSTANCE main(DWORD dwArgCount, LPSTR* ppArgs)
K&Rのソースって
main(){
}
が多いけど
-Wall でやると
何かエラーでない?
整数値を返していないだけだろ。
>>537
普通、makefile に CFLAGS=-Wall -ansi -pedantic って書くだろ...。
ここ最近 gcc なんか直接起動したことないぞ。
makefile中ではaliasは無効なの?
そうでなければ別に……
make使うほど大きなプログラムは書かないもーん
>>536
if ((a = b()) { }
if (a = b()) だと a == b() と間違える場合があるから、複数の式に分けるか
() で括って、明示的に示せという事らしい。

>>542
ちょっと遊びで書いたコードとかコンパイルする時に使うかな、俺は。

>>543
普通 makefile 内では alias きかん。
>>545
ちょっとしたプログラムでも、
たとえば abc.c なら、
% make abc
を実行しているよ。そうすりゃ自動的に、
gcc abc.c -o abc
としてくれるからね。
a.out にしたくないから、いつでも make を使う。
>>538
void main(void)で書かれている書籍って割と多い気がする。
googleで検索しても間違いだって書いてあるページが割とある。
だからそう言う本は避けて買えばいいんじゃない?
void main(void)系で書かれてる本で良本なのってある?
>>547
モノの本質を見ろと。
>>547
そういう本って (特に入門本・初心者本) delete[] とすべきところで
delete と書いていたり、説明を曖昧にして危ういのが多い。(また C++
の話かと言われそうだ)。しっかりした本を選ぼうと思ったら、それも
ひとつの判断材料にはなると思う。
>>549
そもそも参考文献スレにいかずに何調子に乗ってんの?うざいんですが。
>>550
void main(void) で本出してしまった人ですか?
>>551
大丈夫、そう言う本出す奴に限って部下か学生にサンプルプログラム書かせて
同僚辺りに文章書かせて自分は口出すだけだから何が問題か判ってないから。
void main()
{
printf("おまえらそんなことで熱くなるなよ\n");
}

どーでもいいじゃんよー
そんなちっせぇことにこだわんなよー
極初心者が↓これ見たらそんだけでムツカシソーって思うかも知らんからじゃねーのー
int main(int argc, char* argv[])
>>554
int main() でいいだろう(w パラメータ付けなくても。最初に int main()
を教えて、関数を学ぶときに main は誰が呼ぶかに言及すればいいんだよ。
char* argv[] <- 実際、最初はこれが難しかった
FILE* main(FILE* pfile, FILE** ppfile)で良いだろ
>>482
>あと、読み込み専用に開かれているストリームの場合は、データは一方通行で巻き戻し
>(fseek() や rewind() 等) が出来ず、従ってそもそもデータ位置を記録していない場合もある

いろいろ考えてみたんですが、こういうことでしょうか?
ファイルのデータ量がバッファ領域の完全バッファ量を超えた場合
超えた部分は吐き出されて、次の部分のデータを新たにバッファ領域に読み込むから
その場合、ファイル位置指示子が示している位置はファイル全体からの相対的な位置ではなく、
バッファ領域に読み込まれた部分における先頭位置からの位置となるから
正確にファイルの位置を指しているわけではない
559デフォルトの名無しさん:03/03/21 16:10
1:int *p;
2:int* p;

2で書く奴キモい
2はC++erの書き方だーね。
漏いらはint * p;
おまえらまだまだだね

int* *p;

これが最高にキモい
2chのCスレで散々がいしゅつなFAQと宗教戦争ネタいい加減どっかにまとめたら?
>>559
1 の方がキモイ。char ch[] とかもう見てらんない。

>>562
お前キモイ。いい加減どっかにまとめたら、なんてもう見てらんない。
#define pointer *

int pointer pn;
565制御屋さん見習中:03/03/21 16:53
ネタではありません、質問です。

関数の返り値で、
return OK;
または
return ERROR;

としたいです。

このとき、普通
OKは0で、ERRORは1にするのが
良いでしょうか?

それとも逆でしょうか?
(どちらも違う?)
>>565
ERRORは-1で。ネタではありません。
567デフォルトの名無しさん:03/03/21 16:55
>>565
悪いけどネタにしか見えない。
ゴメン
>>565
単に成功失敗なら
#define TRUE 1
#define FALSE 0
で成功したらTRUE失敗したらFALSEを返す。

エラーの種類がいろいろなら0が成功0以外が失敗。
普通これくらいは数値をそのまま書くと思うけど・・・
普通自前かライブラリでBOOLくらい定義していると思うけど・・・
571制御屋さん見習中:03/03/21 16:59
まじめです、本当。

OKは 0で
ERRORは -1
にしとけば、良いですか?

K&Rでは、OKは0で、ERRORは1
です。
>>571
数字をそのまま書けって。
エラーの種類がいろいろあるなら話は別だけど。
573制御屋さん見習中:03/03/21 17:00
間違い!

ERROR は-1でした。
すみません!!
574制御屋さん見習中:03/03/21 17:04
みなさん、すみません。

>>568さんのを
頭に入れつつ、
数字を書きます。

プログラムを提出(仕事ね)
するので、混乱しないよう、
数字にしときます。

575デフォルトの名無しさん:03/03/21 17:04
>>574
プロかよっ!!
>>574
関数の説明のコメントは忘れずに。
577制御屋さん見習中:03/03/21 17:06
>>575
見習中です。まじで。

>>576
コメントは沢山いれろと
上司に言われました。
578デフォルトの名無しさん:03/03/21 17:07
>>577
おうむ返しは厳禁
typedef enum { False = 0, True = !False } Boooool;
でも使っと毛。
>>579
なんでTrue = 1にしないの?
581制御屋さん見習中:03/03/21 17:13
>>578

すみません、おうむ返しとは
どういう行為ですか?

あまり、マナーを分かっていないもので。
>>569,572,574
数値直書きは現金。エラー複数返すときは#defineかenum使え。
>>583
#include <stdlib.h>
int main()
{
return EXIT_SUCCESS;
}
とかやる人?
ぬるぽ?
>>584
>>583 じゃないが、俺やってるよ。
>>585
ガッ
漏れなら
HRESULT main()
{
 return S_OK;
}
ってやるな
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>585
>>586
ガーン・・・
ふつー
#ifndef __cplusplus
typedef unsigned char bool;
#define true (1)
#define false (0)
#endif
ちょっとききたいんだが
C FAQ 日本語訳
をちゃんと読んでいるやつはどれくらいいるんだ?

ちゃんと読んでたら議論するようなことじゃないようなことじゃないことばかりでとまどうよ
>>592
読みますた
確かに最後の行に戸惑いが覗える
595デフォルトの名無しさん:03/03/21 17:50
メモリの解放っていつやればいいんですか?
>>595
いらなくなった時。
>>558
関係ない。>>482後半は意味不明だから無視するように。
>>597
stdinとかのことを言っているんだと思うけど。
>>595
メモリが独裁者によって支配されたとき。
>>599
root?
>>598
sadom stdin
scanfってキーバッファから入力データを読み出してるんですか?
>>602
抽象化された標準入力からだと思います。
604デフォルトの名無しさん:03/03/21 20:04
RubyはCで作られているんだよ。
RubyはRubyで作られているんだよ
>>605
それはない。JavaはRubyでも作れるけどな。
でもCはCで作られているよ
>>598
読み込み専用のストリームは*stdinだけ*か?
また、デバイスやパイプに対するstdoutは?
>>608
文盲?
"とか"と言っているのに"のみ"に置き換えてしまう>>608の脳はどうなっているんでしょう。
>>609,610
>>482か?
要するに「seekできない」という「デバイスに対する動作」を、stdinから読
み込み専用すべてに誤って過般化しているという問題なんだが。
半角?くん、久々の登場です!
半角?くん?
はんかくはてなくん
はてなはんかくん
何か質問があったら俺に聞けでつ。
最近HTMLがわかってきたでつ。
「世界の仕組み研究所」
ttp://www.geocities.jp/fieldabout/
半角?くんって誰?
ちょっとイかしたアウトロー
>>617
>>610のこと?>>611のこと?
半角二次元?
( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>582
>>582
そういう技もあったのか…
ぬるぽ?
ズレテンジャネーカ
  ( `Д´)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V・∀・)/
 (_フ彡        /  ←>>620
ドリフのハンマーで頭殴ったときの効果音が好きだった。
625 :03/03/21 23:09
質問です
かなり大きな数(読み方がわからないくらいのオーダーです)を
Cで扱うにはどうすればよいでしょうか。
よろしくお願いしいます。
>>625
文字列
627デフォルトの名無しさん:03/03/21 23:17
>>625
多倍長ライブラリを使う。
628デフォルトの名無しさん:03/03/21 23:29
演算子のオーバーロードってできないの?
う足す足すなら出来ます。
リニアホイールなら出来ます。
ヴォイジャーのワープコアなら出来ます
ループの中でプロトタイプが
BYTE func(BYTE c); の;関数を何度も呼び出す場合
呼出し側でたとえば
while(1)
{
func(var) ;

}
このようにある時、
変数varがint型かBYTE型かでスピードが変わったりしますか?
>>632
することもあるししないこともあります。
コンパイラの最適化やCPUアーキテクチャによって変わります。

一概にどう書けば速くなる、とは言えませんが、経験的には int で
積むのが素直で速いコードになる気がします。
でも最終的にはコンパイラの吐いたコード見て調べるしかないと思います。
634632:03/03/22 02:27
>>633
早速ありがとう。 勉強になるなぁ。
>>633
>でも最終的にはコンパイラの吐いたコード見て調べるしかないと思います。
no.
コード見ただけで、キャッシュや、遅延分岐等の影響まで判断出来たら神。
実際に時間計るしかないってのが正解だと思われ。

もちろん言いたい事は解るし、他も概ね同意だけど。
着弾凄い
637デフォルトの名無しさん:03/03/22 03:08
>>636
イラク?
おお、燃えてる・・・
燃えるイクラ
最近のCGの進歩ってものすごいものがあるね。
光のエフェクトはいうまでもなく建物のモデリング・シェーディングや
煙の物理計算も信じられないほどリアル。
お前の脳内イラクの人も大変だな
>>640
CGの進歩というよりコンピュータの進歩
>>632
結果をint変数に引き取る場合、一般的に戻り値はintのほうがタイトなコードになる。
;int i = func();
call func
mov r1(as int i), r0(ret)
and r1, 0xff ;戻り値がBYTEの場合のみ必要

ただし、関数側でBYTEからintに拡張する場合は結果的に同コスト。
;in func
;return b;
mov r0(ret), r1(as BYTE b)
and r0, 0xff ;戻り値がintの場合のみ必要
return (to caller)

なお、一般的には関数から定数を戻す場合はintで戻すほうがいいが、
CPUによってはBYTE定数のほうがタイトなコードになる場合もある。
;in func
;return -1;
mov r0(ret), 0xffffffff
; mov r0(ret), 0xff ;イミディエイト値の幅の差で命令長が短くなる
return (to caller)
>>635
そんなことを言い出したら...

> 実際に時間計るしかないってのが正解だと思われ。

と言うのも怪しい。計る度に違うこともあるからね。

俺は、このスレ的には >>633 で正解だと思う。
関数引数または戻り値にintより小さい整数型を使うと
パフォーマンスを損なう可能性があると言える。

漏れは、intより小さい整数型は構造体メンバか、ポインタが必要な場合にしか使わない。
アセンブリて知っといた方がいいんすかね?
めんどくさいんで勉強したくないんすが
できれば無視してじゃばに行きたんすが
>>646
先人たちのおかげで知らなくても生きてはいけそうです。
でも、かなり楽しそうな分野であることも間違いないです。

て言うか、アドレスとかビット演算とかって高級言語でも常識だから文法さえ覚えれば書けそうな予感。
648デフォルトの名無しさん:03/03/22 15:12
アドバイスおながいします。
バイナリのファイルを1バイトづつ読み込んで検証するプログラムを作ろうと思っています。
FILE *fp;
char buf = 0;
fp = fopen(file_location, "r")
while(fread(&buf, 1, 1, fp) != EOF) {
printf("%02X,",buf);

}
fclose(fp);
っていう感じでやろうと思ったんですが、これだとint型が僕の環境だと4バイトもあるので
bufの中身が4D000000みたいになってしまいます。(欲しいデータ4Dです)
でbufを1バイトのchar型にしたら少しうまく行ったのですが、
なんかおかしなやり方をしている気がします。
また、ファイルの終端の判断もおかしくて、一生終わりません。
終わり方はあとで考えるとして、1バイトのデータを読み込むためには
どのような方法がいいんでしょうか。
>>648
unsigned charってとこじゃないの?
>fp = fopen(file_location, "r")

fp = fopen(file_location, "rb")
とりあえずここはこうじゃないの?
>>648
関数マニュアル fread をよく読め。
戻り値は EOF じゃなくて成功した要素数。
おお!>>649さん、>>650さん、ありがとうございます。
この2点、書籍でも確認できました。まず変更してみます。
必要に迫られて作ってるのですが、先が思いやられるです(^^;)。
>>651さん どうもです。
そうですよね、やっぱり。第3引数が1だからきっと1以外で終了
なんだろうなあと思ったんですが、止まらなくなったので
いろいろ試してたです。がんばります。
>>653
こうしてみる。

fp = fopen(file_location, "rb");
// fp エラーチェックを入れる
while(fread(buf, 1, 1, fp) != 0)

1バイトずつ読むなら int c; while( (c = fgetc(fp)) != EOF ) で
いいと思うけども。
>>653
そうだね。1以外で終了ってことはつまり1で続行するから。
while(fread(buf,1,1,fp)==1) だね。
がんばって。
>>653さん ありがとさんです。
なるほど、fgetcでOKだったんですね。テキスト書類しか扱ったことが
なかったので、とりあえずfgetcとかchar型変数とか普通のやり方じゃ
だめなんだと思ってました。
とりあえず、unsigned charと終了条件の変更ですべてうまく行ったっぽいです。
"rb"に関しては変更しなくても何故かうまく行きましたが、とりあえず
ちゃんと変更しておきました。>>654さんのも今から試してみます。
ありがとうございましたー。
普通"r"。

"rb"なんかにする必要があるのはへんなOSだけ。
>>657
そうですね、移植性も気にせずとてもいいお考えだと思います。
あなたの前途を祝して、乾杯。
>>656
バイナリはバイナリモードで開くと覚えておいて。
バイナリ指定をしないと、例えばバイナリで (0xD)CR (0xA)LF と
いうコードが出てきたとき、ライブラリが '\n' に変換する。
これはCでMicrosoftのテキストファイルを開くときに都合がいいけど
バイナリでこの処理されると困るから。
660デフォルトの名無しさん:03/03/22 17:50
fopen等でフルパスを与えられる事はこのスレのちょっと前に乗っていて分かった
のですが、一つ下、一つ上のディレクトリの指定の仕方があるなら教えてください。
嫌ですっ!
相対パスってことを言ってますか?
C言語以前の問題ですがw
そうたい!
>>662の中の人も大変だな。
C言語極めたらプログラマーになれますか?
>>665
安いコーダーとしてなら使ってもらえるんではないでしょうか?
極めなくても、
プログラムを組む人をプログラマーと言いますが何か?
668デフォルトの名無しさん:03/03/22 20:31
他のスレで、レスがないのでここで聞いてみます。
すみません。教えてください。
C言語でAPIが呼ばれる毎に識別可能なメモリ領域を確保するには
どのようにしたらよいでしょうか。
まろっくしてたりなくなったらりあろっく
まほろまてぃっくしてたりなくなったらみなわまてぃっく
>>670
荒らすな
672デフォルトの名無しさん:03/03/22 21:31
定数(例えば5)をファイルに書き出す時に
書き出すバイト数を決めておきたい場合(例えばsizeof(int))は、

int n=5;
fwrtie( &n, sizeof(int), 1, fp );

みたいに書くしかないんでしょうか。
>>672
何を期待しているのかわからない。っていうか引数の順番それでよかったっけ?
>>673
引数は正しい。
戻り値見てないとかは置いといて。
675672:03/03/22 23:00
5を、(例えば4バイトで)ファイルに書き出したい。
fprintfだとバイト数は指定できないからfwriteを使ったのだが。
それとも、fwriteの使い方間違ってる?

ところで、
1: fwrite( &n, sizeof(int), 1, fp );
2: fwrite( &n, 1, sizeof(int), fp );
どっち使ってる?
戻り値チェックしないとして(w
処理系にもよると思うけど、関数内部で速度的な差とかあり?
677674:03/03/22 23:09
>>675
間違ってないよ。使う関数もfwriteで正解。
エンディアンとかで問題無ければ。
678デフォルトの名無しさん:03/03/22 23:18
挑戦age
fwr t i e
には突っ込まないのか?
ブロックバイト数×ブロック数だから1が正解。
sizeof struct×配列数を想定していると思われ、
処理速度等はディスクキャッシュとかに左右されるのでは?

あと、質問の例として出したコードに戻り値チェックしてないとか言うのは
揚げ足取り以外の何者でも無いですなw
681674:03/03/23 00:07
>>680
戻り値の事書かないで「全面的に正しい」なんて書いたら
揚げ足取られるの漏れの方だから(w
>>676
関数内で size*n してるだけなので、
速度はまず変わらないと思われ。
>>672
ファイルサイズ固定じゃなきゃいけないとか、
バイナリデータじゃなきゃいけないとか、
大きな値を格納するときに極力サイズを減らしたいとか、
簡単に見られちゃ困るとか、
そういった要請がないならテキストファイルにしとき。
つまり、fwrite(&n, sizeof(int), 1, fp);の代わりにfprintf(fp, "%d\n", n);な。

データが2次元的な構造なら
for (iy = 0; iy < height; iy++) {
 for (ix = 0; ix < width; ix++) {
  if (ix > 0) {
   fprintf(fp, ", ");
  }
  fprintf(fp, "%d", data[iy][ix]);
 }
 fprintf(fp, "\n");
}
とでもすればcsvファイルとしてエディタでもExcelでも読み書きできてデバッグに便利だ。
684660:03/03/23 03:35
できました。と言うか、実験もしない、具具ってもいませんでした。すいません。
HTML等と大体一緒なんですね。\\と2つ使うのを除いては。
・何も指定しないと今のフォルダ
・フォルダ名\\で今のフォルダにあるフォルダの中に入る
・..\\でそのフォルダの1つ上のフォルダに戻る
HTML?
URLのことかと。
つーか、>>660 は「ファイルシステム」について調べた方がいいな。
ディレクトリ区切りはMS-DOS系の場合、バックスラッシュ(\)なので
Cではエスケープして"dir\\file"とする必要がある。
ここで注意しないといけないのは、ShiftJisの2バイト目が'\\'と同じコードに
なる可能性があるのでディレクトリ区切りとファイル名の一部と区別がつけにくいこと。
某芝のMP3プレイヤのバグもこれが理由だった。

こんなOSいやだ。
>>688
>ShiftJisの2バイト目が'\\'と同じコードになる可能性があるので

べつに区切り文字がなんであろうと同じ問題が起きるだろ?
>>689
つーか OS の問題じゃねーだろ。
初期の DOS は忘れたけど、Windows になってからはそんな問題聴いたことがないよ。
問題があるのは、Shift-JIS に対応していないタコな処理系で日本語使おうとしているタコな >>688 だろ。
ShiftJIS で二バイト目に '/' が来ることってあるんだっけか?
>>691
あれ? 無いみたいだ 689のこと忘れてください・・・
>>689
ディレクトリ記号をファイル名に使ってしまうOSなんて、DOS系以外知りませんが?
>>690
自前でフルパスを分解するような処理を書いたことないなら黙ってたら?
>>691
字は読める?
>>691
>>689のこと言ってたのか、すまん。
695660:03/03/23 13:12
>>687
?。パスのやり方が違うのですか。うまく指定したフォルダにファイルを作れたのですが。
>パスのやり方

はぁ?
>>695
あきらかに君のレベルとは違う話してるので、気にしなくてよろしい。
>>693
> 自前でフルパスを分解するような処理を書いたことないなら黙ってたら?

普通 ライブラリか API 使うだろ。

自分で書いたとしてもたいしたことないけどね。
どうでもいいことで、煽ったり煽られたりするな
>>688
DOSやWindowsでも"dir/file"でアクセスできる。
setvbufはOSが割り当てるバッファとは別の場所に
バッファを設けるやつなんすか?
>>700
入力は'/'だけじゃなくて'\\'も受け付けないといけなかったりするもんで。
>>701
と、いうかプログラマが用意してやらないといけない。
その領域は少なくともクローズされるまでは確保されていなければならない。
>>702
入力として外部から与えられるならプログラム中に書くように '\\' と二つにする必要はない
(これはいいよね?)。
その他の場合も普通の API ならプログラマが特に気にしないといけない実装になってる方がおかしい。
もしそういうAPIの環境下なら適当なwrapperをかけてやるといい。
705デフォルトの名無しさん:03/03/23 16:04
最近Cをはじめて、時々聞くのですが
「標準ライブラリ関数の自作」ってどうやるんですか?
最初からC言語側で用意されてる関数を自作ってことですよね?
たとえば、printf()やscanf()等の自作はどうやるのでしょうか?

知ってるかた、教えてください。よろしくお願いします。
>>705
glibcというGNUライブラリで実装されているよ。
勉強になるから読んでみるといい。

(ニヤ
707706:03/03/23 16:17
実装というか、実装ソースが公開されている。ということで。
>>705
printf/scanf 共に最小単位が一文字なんだから最後は(仮想的な)一文字入出力に行き着くのはわかるよね
そこまでは <stdarg.h> を使った可変長引数関数を作ることになる
そこから先の部分は(バッファリングの実装を含めて)環境依存になると思う
キーボードからのバッファリングについて質問なんですが
バッファに読み込んだ1行データはプログラムが読み出したときに
バッファから開放されるんですか?
それともデータはバッファに残ってて、バッファ内の読み出し位置を示すポインタが
次の読み出し位置をポイントするだけなんでしょうか?
>>709
普通後者
>>710
礼を言う
>>711
早く言ってよ。
>>712
I LUV U BABY
曲名じゃねーか。
715デフォルトの名無しさん:03/03/23 21:03
今Cを勉強している者なのですが、
例題とかを公開してるページってないでしょうか?
知っていたら是非教えて下さい。


    ぐ    ぐ    れ
717デフォルトの名無しさん:03/03/23 21:55
ぐぐりましたが、参考書のオンラインショッピングしか出てきません。
718例題:03/03/23 22:32
int a;
719難問:03/03/23 22:53
「自身と同じ型の関数ポインタ」を返す関数の型って、どう書けば良い?
例えば↓で ? の部分に何を書いたら良いのか。

? hoge()
{
 return hoge;
}

一応 void* でもコンパイルは通るが、↓のようなコードは通らない。

phoge = hoge;
for( cnt=0; cnt<10; ++cnt )
  phoge = phoge();
これはどう考えてもムリだということは一目瞭然と思われ。
phoge = phoge();
>>719
直接に定義することはできない。
汎用の関数ポインターを返す関数を 用意して、
ポインターを渡すたびに関数の型にあわせて慎重にキャス トを行う。
または関数が構造体を返すようにする。
その構造体は、そ の関数へのポインターだけをメンバーに持つようにする。

以上はC FAQの引用である

あと、void *に関数ポインタをいれてはいけない。
722デフォルトの名無しさん:03/03/23 23:31
>>719
それってエラー出ないの?
そういうコトが起きる可能性があるから
同名変数の2重定義とか気をつけるんじゃない?
>>722
何か勘違いしてませんか
厳密に定義はできないんじゃないかな。
無理矢理キャストすればなんとでもなりそうだけど。

ちなみにgccだけど、void * で
 phoge = phoge();
は動いたよ。
void *に保証されていることはオプジェクト(すなわちデータ)を指すポインタを格納できることだけだ。
関数ポインタをvoid *に変換することは移植性が高くない。(マシンによっては関数ポインタは非常に大きい。どのデータポインタよりも大きい)

しかしながら、すべての関数ポうん他派、呼び出す前に適切な型に戻す限り、互いに変換可能が保証されている。
だからどのようなものでよいからなんらかの関数型(普通はint (*)()かvoid (*)())を汎用の関数ポインタとして使えばよい。
オブジェクトへのポインタと関数へのポインタをかわるがわる保存する場所が必要なら、
移植性の高い解決策はvoid *と汎用の関数ポインタからなる教養態を使うことである。

これ嫁
>>725
これの引用元は何?
>>726
失礼、これの引用もとは C FAQ

ただしオンラインのFAQでは欠番だった。
本で出ているほうが欠番も少ないし、一つ一つ細かく、ちゃんとコード例も多い
>>727
ありがとう
729728:03/03/24 02:00
ちょっと目から鱗だった。
ちょっと目からぬるぽだった。
ドウイウイミダヨ
          | | ガガガガガッ   .人
  ( ・∀・)   | |       人  <  >__Λ∩
 と    )    | |    人  <  >__Λ∩Д´)/
   Y /ノ    .人   <  >__Λ∩Д´)/   / ←>>730
    / ) .人 <  >__Λ ∩Д´)/   / ←>>729
  _/し' <  >_Λ∩Д´)/   / ←>>730
 (_フ彡 V`Д´)/   / ←>>730
            / ←>>730
>>682
本当にそう思うか?
ディスクフルがもうすぐ起こる状態で第 2 引数と第 3 引数を入れ替えて実験
した事は無いか?
>>732
どっちにしろ動きはOS依存。
>>676
1 の方が早い実装があると思うがどうよ
(いやもちろん作為的に逆には出来るけど)
覚えてたら後で実験してみる
最大の謎はなんでfwriteはあんなインターフェイスになっているかだ

fwrite( buffer, buffer_size, fp);

で別にいいじゃないのか?
たとえば要素数が10個のint型の配列を書き込むときはそうした方が自然だから。callocと同じ。
>>736
だとするなら、fwrite関数はそれを意味するように呼ぶべきだよね
実行効率を気にするよりも
>>735
I/Oが単純なバイトストリームじゃない環境だと、動作が異なるという話を聞
いたことがあるような気がする。
そんなのもちろん使ったことないし、よく覚えてないが。
>>734
してみたけど一緒だった。
考えてみりゃ早くなるなら早くなるように作るのが当然だわな
int型year変数があり西暦が入っているのですが、sprintf一発で下2桁の年号
を文字列で取り出したいです。
可能なんでしょうか?
可能だとしたら、どのように指定すれば良いか教えて下さい。
宜しくおながいします。
sprintf(buffer, "%d", year % 100);
>741
即レス誠にありがとうです。解決です。
743デフォルトの名無しさん:03/03/24 14:05
int型の変数をchar型にキャストしたい時って、対象のchar型変数は
配列にする必要があるのでしょうか?ご教授お願いします。
無い
745デフォルトの名無しさん:03/03/24 14:15
どうもありがとうございました。
やってみます。
>>1
C言語ってなんですか?
748デフォルトの名無しさん:03/03/24 14:34
((提案なんだけど、(読みやすくするために))全ての式にカッコ(()←これね)を付けようよ。)
(i++);
((s)=((a)+(d[((org((i)))+(i))])));
749デフォルトの名無しさん:03/03/24 14:34
(((ちょっと)提案なんだけど、(読みやすくするために))全ての式にカッコ(()←これね)を付けようよ。)
(i++);
((s)=((a)+(d[((org((i)))+(i))])));
>>748
i++ という式に括弧を付ける。
(i++);
(i++) というのは式なので、これに括弧を付ける。
((i++));
((i++)) とい(略。

春だからってイイ気分なのは構わんが、黙って ROM ってろ、ボケ。
((あっ…)ごめんなさいね(二重カキコ(をしちゃったね)))
ガクブルみたいだな。
>>748
そういう奴はLispでプログラム書いてろ
俺には正規表現のように見える。
>>753
Lisp を貶めてるだけの馬鹿だと思われるので、Lisp 界に引きずりこまないでください。
ここで「たくさん釣れた」がくるのに100ペリカ↓
757制御屋さん見習中:03/03/24 14:40
スレ違いな質問かもしれません。

(質)
組み込み系にCでプログラミングする際の
問題点等参考になるページありませんか?

特にタスク間のリエントラントについてなのですが。

お願いします。
>>757
リエントラントならまず大域的なりソースにアクセスしない。する場合は
1)排他処理をきちんとする
2)該当リソースを管理するタスクを用いてタスク間通信でやりとりする
といった方法を採択する、位か。

>>756
100ペリカげと(w
759制御屋さん見習中:03/03/24 14:53
>>758
ありがとう!

大域的なリソースとは何ですか?
externな変数?ですか?
760756:03/03/24 15:10
>>758
> 100ペリカげと(w
外しちまったや(笑)。

>>759
> 大域的なリソースとは何ですか?
たしかにやってしまいがちな例は extern 変数だが、そうとは限らない。
例えば、君は制御屋さんみたいだからデバイスへのアクセスも行うことが
あると思うが、これも大域的なリソースだ。
というか、まずはググれ。ここで説明するよりも膨大な量の資料が
見付かるはずだよ。
>>759
それはまぁ基本。排他もよく考えて使わないとロックする場合がある。
「見習い」ということでOJTみたいなことやってるなら多分スタックだけで
済むサブルーチンではないかと思うけど。
762制御屋さん見習中:03/03/24 15:24
>>760,761
助かります。

確かに、761のいうとうりなのです。
が、それじゃあ面白くないので、
OJTと並行して(マルチタスク(笑))
知識も持ちたいんですよ。

実はリエントラントも知らなかった
超初心者。見習より丁稚ですね。

組み込み Cでググって色々出てきました。
>>762
OSの基礎本を買って読むとよろし。排他の必要性とかデッドロックの種類分けとか
ちゃんと載ってるから、それを踏まえておけば後は作るだけだ。
764制御屋さん見習中:03/03/24 15:34
>>763
OSですね。

参考文献ありましたら、教えて欲しいです。

先日 CQ出版 リアルタイム/マルチタスクシステムの
徹底研究
という本を買ったのですが、かなり難しかったです。
strlen関数使わずに文字数数える方法ってありますか?
きみにはむり
>>764
それはきっと具体的なコードとか示してるんじゃない?
もっと概念的なのでいいと思うんだけど。

> ttp://www.yfcbookshelf.com/operatingsystem's%20books1.htm

うわ、8800円かよ…まぁ会社で買ってもらえ(w
でも自分で買った方が身につくとは思うけど
>>765
1)指を折る
2)
unsigned l;
const char *p;
for (l = 0, p = "abc"; *p++; l++)
;
printf ("%u\n", l);
>>768
サンクスです。
いやいや sizeof("abc")-1 だろ。
あれ? それってポインタのサイズにならないんだっけ
ネタにマジレスはカコワルイですよ。
ここはこう言うベキデス。

>>770
(・∀・)カエレ!!
>771
$ cat t.c
int main()
{
printf("%d\n", sizeof("hello world."));
}
$ gcc t.c
$ ./a.out
13
774デフォルトの名無しさん:03/03/24 18:05
今、中学生でK&Rを買おうと思ってるんですが、
みなさんの意見を聞くと邦訳版より原著版の方がいいと聞きます。
英検2級あれば原著版読めるでしょうか?
775 ◆8Bf1cDJWMA :03/03/24 18:25
>>774
中学生で英検2級?
オミソレ。
春厨のくせに英検2級とはたいした能力ですな

と釣られてみるテスト
777774:03/03/24 18:57
原著版って結構PC用語出てきますか?
辞書で引ける範囲の単語だけだったら買うのですが・・。
>>773
ほんとに13だったけど微妙だなあ
いや、sizeof に対してはポインタに変換されないってちゃんと規格にあったす
char buf[sizeof("255.255.255.255")];
とかよく使うけどな。
>>780
利点がわかりません
buf[16] って数値を直接入れるのが嫌じゃない?
#define KEY_WORD "foo"
char buf[sizeof(KEY_WORD)];
とか?
何かstatic_assertを思い出したよ
>>782
char buf[] = "255.255.255.255";
じゃいかんのか?
>>785
それはランタイム時に初期化コードを通る
charの配列の要素数は256の倍数にしていますが。
>>780
それするくらいなら、
#define MAX_IP_LEN 15
とかの方がマシだろ。意味分かんなくなるよ。
い? それだと逆に「何故 15 なのか」ってのがわからないじゃん。
>>789
はぁ?
buf[sizeof("255.255.255.255")] って書いてあるのと、
buf[MAX_IP_LEN] って書いてあるのとどっちが可読性がいいよ。
マクロの方にはコメントでも入れときゃいいじゃん。
>>790
15 だったら buf[MAX_IP_LEN + 1] じゃね?
でも sizeof 使うのはいくらなんでもキモすぎ。
#define MAX_IP_LEN sizeof ("255.255.255.255")

に何故考えが及ばん…
sizeof か…。俺は数字を直接書く。
というか、sizeof 使った方法なんて思い付かない。
794デフォルトの名無しさん:03/03/24 21:54
#define VERY_BIG sizeof(MY_TIMPO)
$ gcc 1047275669.c
1047275669.c: thread 内の `int main(int, char**)':
1047275669.c:>>794: 嘘(・A・)イクナイ
$
最近のコンパイラ賢くなったよな。
メンドクセェナ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/  
 (_フ彡        /  ←>>776
>>795
そんな馬鹿な。まさか BCC5.5は・・・

エラー E2188 test.cpp 7: >>794 嘘(・A・)イクナイ (関数 main() )
*** 1 errors in Compile ***
** error 1 ** deleting test.obj

ほんまやぁ・・・
% cat null.c
#include <stdio.h>
main(int argc, char **p){
 printf("%s\n",*p = NULL);
 /*
  ∧_∧
 ( ´∀`)< ぬるぽ
 */
}
% gcc null.c
a.c: In function `main':
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/  
 (_フ彡        /
% ./a.out
(null)
%
printf("%dcm\n",VERY_BIG)
./a.out
8cm
printf("%dcm\n",VERY_BIG)
a.exe
42.195km
printf("%dcm\n",VERY_BIG)
./a.out
Segmentation Fault(core dumped)
(´-`).。oO(>>802 のティムポはポインタでした…と)
804デフォルトの名無しさん:03/03/25 03:17
printf("%c",16)等の半角の罫線は環境依存ですか?
>>804
端末依存です。
(´-`).。oO(しかも>>802 のティムポは不正な場所を刺してた…と)
ぬるぽキタ━━━━━(゚∀゚)━━━━━!!!!
808デフォルトの名無しさん:03/03/25 05:22
      | \
      |∀・) ダレモイナイ‥
      |⊂    ナグルナラ イマノウチ
      |

  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>807
809804:03/03/25 14:33
>>805
98/Meでは表示されるのですが、表示されないパソコンとかありますか?
>>809
端末というか、端末の使用するフォントに禿しく依存。
AT互換機の内蔵フォントなら基本的に同じ(IBM文字セット)
だからDOSなどのテキストモードを使うやつなら全部同じにでるはず。
>>811
DOS/Vになった時点で・・・
>>811
DOSの頃から自前のソフトウェアフォントを使うアプリケーションはあったわけだが
>>812
だから、「テキストモード」に限定してあるのさ。
今時、そんなの使うOSなんてないかもね。
2バイト文字を1バイトに圧縮する方法を教えて下さい。
明日までになんとかできるでしょうか?
>>815
どんな事がしたいのか、ちゃんと書きましょう。
>>815
2バイト文字の中からあなたの好きな255文字を選んでください。話はそれからです。
>>815
2^n(k) 符号を使ってください。
基本は >>817 で、それをもっと高度にしたものです。
詳細は、電子情報通信学会の論文誌を読んでください。
こちらはエぬティーティです。
お客様のお掛けになった電話番号は現在使われておりません。
ぽ ーという発信音がす る までしばらくお待ちください。
820809:03/03/25 20:29
>>810-814
お答えありがとうございました。
821デフォルトの名無しさん:03/03/25 22:40
質問おながいします。
バイナリファイルを扱うコードを書いているです。
以前ここで教わって、読み込む変数はunsigned char型にしましたです。
理由は1バイトづつ配列に入れたかったからであります。
普通文字列を扱うときは配列の最終要素を\0にするようなので、今回は文字ではないものの
処理の都合上、最後に\0を付けようと思ったのですが、バイナリデータを配列に飛び飛びで
格納すると間に\0が入ってしまうことがあって、うまくありませんでしたです。
例えば、00000006という、ひとかたまりのデータがあって、これを
unsigned char buf[5]に入れる場合、buf[0]が\0になってしまうので終端と区別が
つきません。上記の場合は4要素と分かっていますが、読み込んでみないとデータのサイズが
分からない場合が多々あるので困っています。そこで終端に印をつけるのはあきらめて、
先頭にデータサイズを記述しておけばいいのではないかと思いました。
という訳で解決です。..って、あれ?そうじゃなくて、何だかこの方法はとても
スマートでないような気がしてならないので、ご意見を聞かせていただければと
思う出ス。長文すみません。

ときに、NULLと\0の違いがわかりません。どう実験しても同じように振舞います。
バイナリデータを文字列として扱ってはいけません。
一定バイト数ごと処理するか、読み込んだバイト数を覚えておいてその分処理すればよいです。
823デフォルトの名無しさん:03/03/25 23:01
>>822さん
なるほどです。ということは前述の方法で処理するほかないということですね。
どうもありがとうございます。

あと、もう一つお聞きしたいことがあるのです。
配列をcallocで必要サイズきっちりに用意すれば、おそらくsizeofでサイズが
わかると思うのですが、関数の引数で先頭のポインタだけを受け取って、
関数内でサイズを得る方法はありますか。
>>823
alloc系で確保したメモリのサイズを知る手段はない。
自分で管理するしかない。
それが面倒ならC++でvectorでも使えば楽ができる。
でもそのくらいのcプログラムは書けるようになっておいたほうがいい。
がんがれ。
あれー。ちょっと気の利いた方法だと思ったのに、だめでしたか。
では、やはり前述の方法でがんがりがす出す。
本当にどうもありがとうございます。
>>821
> ときに、NULLと\0の違いがわかりません。どう実験しても同じように振舞います。

>>823
> 配列をcallocで必要サイズきっちりに用意すれば、おそらくsizeofでサイズが
> わかると思うのですが、関数の引数で先頭のポインタだけを受け取って、
> 関数内でサイズを得る方法はありますか。

C FAQ を読めば,目が覚めるでしょう.
ディスクファイルをメモリ上にキャッシュするタイミングって何時なんですかね?
ファイル入力関数を呼び出した時なのか、ファイルをオープンした時なのか
教えて下さい

>>827
キャッシュ?
C言語の話かそれ?
>>827
fopenなんかの話?
いままで見た事ある実装は読んできた時バッファに貯めてる。

と言うか、そんな事気にするプログラムは書いちゃいけません。
>>829
ありがとう
てことはfopen()を呼び出した段階では
バッファは空ということで良いんでしょうか?
>830
その情報は一体何の役に立つのだろう・・・
またまたアドバイスをいただけますか。
先ほどの動的な割り当てメモリのサイズ取得は不可能と伺って青ざめてしまいました。
というのも下記のようなデータ構造を考えていたからです。
struct event {
byte *delta; // デルタタイム、後で動的に割り当てる
byte statas[2]; //ステータスバイト
byte *datas; // データ、後で動的に割り当てる
};
static struct chunk {
byte type[5]; // チャンクタイプ
byte length[5]; // データ長
struct event *events;//イベント、後で動的に割り当てる
} chunks[17];

これは実は音楽のMIDIデータの構造なんですが、chunk.eventsをcallocで割り当てるには
struct eventのサイズが必要なんですが、eventのメンバにはさらに動的なメモリ割り当て
を必要とするものがあるので、sizeofでサイズが取得できなければ、
そもそもchunk.eventsにメモリを割り当てることができなくなってしまいます。
このようなデータは構造体を使わずにもっとプリミテチブな操作をするしかないですか?
833デフォルトの名無しさん:03/03/26 01:15
あ、ごめんなさい。
typedef unsigned char byte;
でした。
> chunk.eventsをcallocで割り当てるにはstruct eventのサイズが必要なんですが、
必要ないだろ?
もうちょっとポインタについて勉強しろ。
>>832 1バイト入力するごとに realloc してみたら?
んー、必要ないですかぁ。何故必要ないかわからないのでポインタ勉強してきますです。
reallocというのはナイスアイデアですね!!これを使う方向でも考えてみます。
mallocで複数回にわけて取得したメモリを
一括して解放する方法を教えてたもれ。
>>837
ミリ。freeするのが面倒だったらガベコレ使え。
http://www.hpl.hp.com/personal/Hans_Boehm/gc/
>>837
exit()
>>837
パソコンの電源を切れ
837のいってること俺も悩んだ
p1=malloc(1*sizeof(int));
if (p1==NULL)
  goto hellzone0;
p2=malloc(1*sizeof(int));
if (p2==NULL)
  goto hellzone1;
hellzone1:
  free (p1);
hellzone0:
この調子でhellzoneが5個になったわけだが

setjmpとか使うのかのう?
p1=p2=p3=p4=p5=NULL;
if ((p1=malloc(1*sizeof(int))) == NULL) goto hellzone;
if ((p2=malloc(1*sizeof(int))) == NULL) goto hellzone;
……
hellzone:
free(p1); free(p2); free(p3); free(p4); free(p5);
ども、なるほど
今までfreeはぬるぽダメかと勘違いしてました
でも本見たら思いっきり何も起こらないだけだと
書いてありました

ppp=malloc(1*sizeof(int**));
*ppp=malloc(1*sizeof(int *));
**ppp=malloc(1*sizeof(int));
あとこういうのはどうしてますか?
844デフォルトの名無しさん:03/03/26 04:04
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←843


C FAQかなにかに規格に準拠していない古い処理系のためにぬるぽを渡すなと書かれていたけど、
そんなものまで面倒見切れないよね。
windowsをクラッシュさせるコードをおせいてくらはい。止めてみたいのレスだーっハハハハハハハ。
while(1) fork();ってやったらLinuxが動かなくなったなぁ。
>>843
>>842 とやり方は何も変わらないが。
freeの仕様をうまく使ってすっきりと書いただけだろ。
それすらわかってない香具師がいるわけでして
851仕様書無しさん:03/03/26 09:47
ぬるぽに投票してください。
http://pumpkinnet.to/ranking/words/
852851:03/03/26 09:51
すいません誤爆です。
でも投票してください。
ファイル位置ポインタがファイルの先頭を指してる場合において
そのファイルにrewind()を適用した場合の動作を教えて下さい
エラーがクリアされる
>>851-852
ワロタw 投票してやったよ。でも一位の1%にも満たねーじゃねーかヽ(`Д´)ノ

>>953
つーか man rewind。
>>855
'man' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
manはlinuxだよ。
つーかM$ならMSDN嫁よ。
>>855
1 位には追いつかなくても、トップ 10 にはねじ込むべし!!
投票しますた
>>851
>2ch語、エッチ系、掲示板やサイトのローカルネタ、一般人に対する物、誹謗中傷等はお受けいたしません。

って書いてある割に2ch系ばっか。
ああっ、指摘してはいけない事を・・・
いずれにしてもマニュアルぐらい読め、と。
>>857
M$以外はlinuxしか知らんのなら黙ってろ
>>863
だからなんだよボケ。
CYGWINとでもいいたいのか?
煽りたいだけならおまえが黙ってろ。
#include <もちつけ>
黙ってたら煽れないだろヴォケ
おら、こっぱずかしいなあ
>>863-867
ぬるぽに投票してください。
http://pumpkinnet.to/ranking/words/
> From: [857] デフォルトの名無しさん <sage>
> Date: 03/03/26 11:54
>
> manはlinuxだよ。
なんでUNIXと言わないんだろう。
簡単かもしれない質問ですが、

for(i=1;(int)i<10;i=i+0.1) printf("%f",i);
(iはdouble型)

↑のループが10.0まで表示されてから終わるのですが、
どうして9.9で終わらないのでしょうか?

また、iをfloat型で宣言すると数値が狂うのですが
これは変数の精度によるものなのでしょうか?
一応、コンパイラはBCC5.5です。
872sage:03/03/26 20:57
ぬ♥る♥ぽ♥
>>870
私が857本人ですが、
linuxでもunixでも同じじゃん(このレベルでは)
system5もBSDも、red hotもslackwareも、manコマンドはあるだろうよ。
>>873
処理系を限定していないこのスレで、よくそんな言い訳が堂々とできるな。
>>871
2 進数での浮動小数点数は、0.1 ぴったりを表現できない。
その為わずかに誤差が出るので、そのような問題が発生する。
浮動小数点数の誤差について調べる事。
857=864は釣りだろ?
>>874
それは>>855に言ってくれw
フォローのつもりだったんだが・・・
とにかく調べリゃ一瞬でわかることを書くな、と。
それだけだよ。
なんで GNU/Linux じゃないんだろう?
red hotってなんだよ・・・






って今度は俺が釣られたよ。もうぬるぽ
>>875

ぐぐって調べてみました。
「丸め」については二進数の感覚にまだ慣れてないせいで
わかりづらいところもありましたが、
9.9までで終わらない理由については納得できました。
ありがとうございました!
>>857
こんな過疎地で釣りかよ…。
float の0.1の内部表現はたぶんこなぐあいでした
-1^(0) * 1+(0.5033165) * 2^(123-127)

#include <stdio.h>
main(){
   float f=0.1;
   int sisuubu;
   int kasuubu;
   int fugou;
   int *i;
   void *p;
   p=&f;
   i=p;
   fugou =( *i>>31) & 1;
   printf ("fugou = %d\n",fugou);
   sisuubu = (*i>>23) & 0xFF;
   printf ("sisuubu = %d\n",sisuubu);
   kasuubu = (*i)& ((1<<23)-1) ;
   printf ("kasuubu = %d\n",kasuubu);
   printf ("-1^(%d) * 1+(0.%d) * 2^(%d-127) =%f "
,fugou, kasuubu,sisuubu,f);
}
883デフォルトの名無しさん:03/03/26 22:30
ぬるぽの人も大変だな。
ソダナ
ようかんがえたら
i=(int *)&f;
これで良かったのか
あとポインタがiってのも変だな
鬱だし脳
ふと目に付いた、
「お兄ちゃん、ボク妊娠しちゃううううぅっ!」
に投票してしまいました。
こんな僕をぬるぽしてください。
ちんぽ
889デフォルトの名無しさん:03/03/27 00:32
ぐーぐったけど成果なしだったので質問します

バックスペースを「\b」に置き換えて、入力を出力に複写するプログラム
を書きたいのですけど、
#include <stdio.h>
main()
{
int c;
while((c = getchar()) != EOF){
if (c == '\b')
printf("\\b");
else
putchar(c);
}
}
と、したのですけど、うまくいきません。
タブを「\t」に置き換えて入力を出力に複写するのはできました
どうすればいいのでしょう?
入力データに問題があるんだろ
>>889
キーボードからじゃなくてファイルから読んでみるとか。
ファイル関係はまだ勉強しないうちでの問題でして、
かならずキーボードからの入力となります。
これから言語を学ぶ上で特に必要のない事なら、わからないままでいいかな。
とも思うのですが、やるせない感が強くて・・・
コンパイラの問題とかもあるのでしょうかね?ちなみにWinXPで、VC++です
>>892
別に勉強しなくても(コマンドプロンプトなら)プログラム実行するときに<を使ってリダイレクトすればファイルから読めるけど。
894889:03/03/27 00:50
あ、リダイレクトかー。そうすればわかりますね。
指導してくれた皆様、どうもありがとうございました。
今度はどうやってファイルにバックスペースを書き込むんですかぁ?かな。
>>895
さすがにそこまで馬鹿じゃねーだろ(藁

>>891みたいなのがこのスレに常時してると思うとあんま笑えねーけどな
897891:03/03/27 00:58
俺、馬鹿なこと言ったのかな・・・
>>897
いや、どっちかと言うと質問者のやりたいことの方が問題あるから。
main(){puts("\b");}
をパイプでつなげ。なんかアホみたいだが。
>>882
ダウト。
0.1は
>-1^(0) * 1+(0.5033165) * 2^(123-127)
ではなく
-1^(0) * (1+(5033165) / 2~23) * 2^(123-127)
にならないといけない。
ちなみに、(5033165) / 2^23 ≒0.6なわけだな。
この時点で、0.6 * 2^23 = 5033164.8なので0.2の誤差がある。
これを10進の桁数に換算すると高々8桁弱しか精度がないことがわかる。
確かに考えたら数がかなりおかしいですね。

2進数で仮数部の一番最初の桁の重みが2^-1で
最後のけたが2^-23だから
確かにその通りです
カッコの位置も完全におかしいし、
おかげで浮動小数点数がちょっとだけわかりました。
ageておきます
自然数Xに対して

・1の時処理1を行う
・2の時処理1と処理2を行う
・3以上の時処理1と処理2と処理3を行う

ということがやりたくて、以下のようにコードを書いたのですが明らかにスマートじゃない
ですよね・・・。ぜひ、模範解答をお願いします。

switch(X){
more:
処理3
2:
処理2
1:
処理1
break;
default:
goto more;
}
普通に
if (x >= 1)
 処理1;
if (x >= 2)
 処理2;
if (x >= 3)
 処理3;
じゃダメなのか?
Xがintなら
if (X>2){
処理3
}
if (X>1){
処理2
}
if (X>0){
処理1
}
でダメかな?
自然数だからいいんだけどdefaultのとこ
Xがintだったら負の数とか0の場合も突入しそうだしなんか変な感じ
907904:03/03/27 19:11
あ、説明不足でした。
この場合Xは呼び出しコストが高い関数の戻り値として返されます。
素直に一時変数に落として>>905-906のやり方でやればいいんですが、このためだけに
変数宣言すると、あとで処理を追いづらくなりそうで。というか、変数名を考えたり
するのが面倒というのが正直なところか。(まぁ、こんな風に処理するほうが
追いづらいって話もありますが ^^;)

制御構文一個だとこれが限界ですかね?
904 の記述が正しいのなら別に構わないと思うんだが
switch(X){
default:
処理3
2:
処理2
1:
処理1
}
でいいじゃん。
910デフォルトの名無しさん:03/03/27 20:31
下記のようなデータを検索する際に困っております。
00 d2 00 0b c0 e0 00 31 00 00 99 01 01 00 13 c0
e0 01 00 00 00 20 00 00 00 14 00 00 00 01 00 01
00 07 c0 e0 03 01 00 00 0a c1 01 01 00 01 20 01
01 00 08 01 03 00 01 85 00 00 08 01 03 00 01 85
最初の2バイトが全体のデータ長を表します(この場合210バイト)
次の2バイト(00 0b)が11バイトの一塊のデータ。つまり
00 0b c0 e0 00 31 00 00 99 01 01 というカタマリ。
次の(00 13)が19バイトで
00 13 c0 e0 01 00 00 00 20 00 00 00 14 00 00 00 01 00 01
というカタマリになっています。
こんなデータを検索し3行目の(00 0a)が見つかったら1バイト(c1)を飛ばし
(01 01)をチェックする。チェックした結果(01 01)であれば、また1バイト飛ばし
次の2バイト(01 20)を変数に代入という処理をしたいのですが、
毎回データが可変長で先頭から何バイト目という指定ができず困っています。
わかりづらい質問で大変恐縮ですが御教授いただけると幸いです。
よろしくお願い致します。
>次の2バイト(00 0b)が11バイトの一塊のデータ

912910:03/03/27 20:47
>次の2バイト(00 0b)が11バイトの一塊のデータ
これは(00 0b)の0bは10進数で11ですよね?
その数分のバイト数で00 0bの先頭から11バイトが
ひとつのデータのカタマリと表現したかったのです。

わかりづらくてすみません。
>>912
分かりづらいと言うか変と言うレベル。私は離脱します。スマソ。
>>910
データへのアクセスを絶対アドレス?でできないことに困っているの?
別に先頭から順次読んでいけばよいと思うが。

LHAの実装で同じような処理をしたことがあるが、
そんな疑問、持ちもしなかった。
4番目のデータを読む前に4番目の塊がはじまる場所を
2+塊1の長さ+塊2の長さ+塊3の長さ
で出しておけばいいんじゃね?
1バイト飛ばして0101チェックはシラネーてか面倒くせー
c=getc();
while ((c=getc())==256){c=getc();}
とかでできんじゃね?
シラネーけど
>>910
データ長やマーク(0101、c1など)を抜いて別の場所にコピーするコードを考えれば
解は自ずから明らかとなろう
あ,嘘でした
でも,面倒くさい俺もパス
918910:03/03/27 21:45
ツレネェヨ(´Д` )ウワァァン
セチガレェヨヽ(`Д´)ノ ウワァァン!!

ウワァァァン━ヽ(`Д´)ノ━(ヽ`Д)━( ヽ`)━ヽ( )ノ━(ヽ )━(Д´ヽ)━ヽ(`Д´)ノ━!!!

>>907
関数の呼び出しコストが気になるなら、戻り値を変数に保存しておけばいいわけだが・・・
>>910
なんか知んないけど、データの先頭アドレスが unsigned char *p に入ってるとして...

unsigned short int GetLength(unsigned char data[]){
 return (data[0] << 8) + data[1];
}

unsigned short int Result; /* 結果 */
unsigned short int TotalLength = GetLength(p);
p += 2;
/* 一行目 */
unsinged short int Length = GetLength(p);
p += 2 + Length;
/* 二行目 */
Length = GetLength(p);
p += 2 + Length;
/* 三行目 */
Length = GetLength(p);
p += 2;
/* 1バイトスキップ */
p++;
if(GetLength(p) = 0x0101){
 p += 3;
 Result = GetLength(p);
} else {
 fprintf(stderr, "見つかんねーぞ、ゴラァ\n");
}

ぐらいでいいんじゃねーのか。
1〜2行目の処理をループにするなり、全体サイズをはみ出していないかチェックするなりは自分で考えてくれ。
921910:03/03/27 23:37
>>920
マジデアリガdゴザイマス・・・
アナタハたぶん
  神
間違いないです。
認定します。漏れの中で
920サソは神
922デフォルトの名無しさん:03/03/28 02:20
このスレを利用させてもらってた者なんですが、
レベルの低いPGしかこのスレにいないのか?
質問者の欲しい答えが返っていないような例を多数見るし、アホばっか?
って思うこと多数だYO!

やっぱ2chなんだなー。マ板とかは建前のない答えが来るからいいんだけどさ
>>922
可哀想・・・
ネタっぽい質問にはそれ相応な返答をしなきゃいけないと思って…
ゴメンネ
925922:03/03/28 03:22
納得!>>924さんありがと。
ネタぽい質問の区別が出来るのはすごいね。
プログラムは経験で覚えていくって聞いたけど、俺はまだまだですね(1年1ヶ月)
)>>923の返事はちと意味わかんなかった。
2chを勉強の糧の一つとして過ごしている俺の現状が可愛そうてことかな?
そうだとしたらこれからこないことにすっかな。
・・・ってのは馬鹿のすることか。
必要な情報だけ取り入れられるようにこれからもがんばっていこっと
>>922
コテになって、質問答えまくって!!1
>>925
やっぱり可哀想・・・
俺は現状でもいいと思うので922がマ板に行って
居なくなるのが一番両者ともに嬉しいかと思われ
>>922
質問者はどんな情報でもありがたい。
ヒントとかキーワードとかでもそれを元にググったり出来るし・・
それが>>922にとってレベルが低かろうが知ったこっちゃない。
マジ、余計おせわと思う。
930デフォルトの名無しさん:03/03/28 04:24
お前ら釣られすぎw
みっともないねぇ・・自分の質問を無視された払いせか?
>>929
>ヒントとかキーワードとかでもそれを元にググったり出来るし・・

それすらしない馬鹿がここを頼ってるんだと思われ。
少なくともまともに検索した奴は質問文にキーワード混ぜて検索したことアピールしてくるし
言ってることもしっかりとした基礎知識に基づき、論理的に正しい場合が多い。

933904:03/03/28 11:21
>>909
うわ、defaultってcaseの前に置いてもきちんと動作するんですね。
つーことで、これでいくことにします。ありがとうございました。
reallocに付いて曖昧なので教えてください
man だと
If realloc() fails the
original block is left untouched - it is not freed or
moved.
となってますが
ptr=realloc(ptr,sz);
みたいな記述でreallocが失敗した場合
これってメモリリークするってこと?
いったん
ptr2=realloc(ptr,sz);
とかやってptr が失われないようにした方がいいのですかね
>>934
そのたうり
このコードは危険?

int my_realloc(void **memblock, size_t size)
{
  void *p = realloc(*memblock, size);
  if(p)
  {
    *memblock = p;
    return 0;
  }
  return -1;
}
>>936
とっても。
938937:03/03/28 22:22
>>936
あ、ぼけてた。
いいんでない?
939デフォルトの名無しさん:03/03/29 09:19
C言語って死滅しちゃうの。
>>939
君よりは長生き
>>940
流石に20年は持たんだろう。
>>941
COBOL もそんな事言われてましたが結局は・・・
>>942
はじっこの方に追いやられたな。
枯れた技術が必要なときもあるさ
FORTRAN は研究関連でもまだ原液
COBOL は2000年問題で復活して、最近 OpenCOBOL が活発になったらいいなぁ。

UNIX系OSには、2038年問題があるから、
少なくともC言語は、そのときに一時的にかもしれないが、流行るだろう。
>FORTRAN は研究関連でもまだ原液

早く薄めなきゃいかんな。
とっても初心者な素朴な質問ですが,
int型のa,b(またはc)が宣言,初期化されているとき.

for(i=1; i<a+b; i++);

というコードと,

c=a+b;
for(i=1; i<c; i++);

では,実行速度に差がありますか?
>>947
結局最適化の時点で同じにされそうだけどね。
空ループなので、最適化すれば、どっちも削除される(ことが多い)。
削除されなくても、最適化によって同じやうなものになったり、ならなかったり。
初心者なら見やすい方書けばええよ。
アッセンブラはいつ頃死滅する?
>>948
即レスありがとうございます.
上に書いたほうが,早い(可能性がある?)ということですよね?
まことに初心者ですみません.
952947:03/03/29 16:58
>>951=947上じゃなくて下でした.
>>951
普通に考えると、前者が後者以上の速度を出す事は考えられない。
最適化によって、後者と同等のレベルのコードになる可能性があるという話。
954947:03/03/29 17:04
どうもです.皆さんありがとうございました.
甘い。
後者は変数領域を確保するが、前者は確保する必要がないので
よりタイトなコードになる可能性がある。
甘い。
後者が変数領域を確保するとは限らない。
つーか、それは速度とはあまり関係無い。
957デフォルトの名無しさん:03/03/29 17:50
age
後者でcをregister宣言しとくと、最も最適化されそうな気がするのは
勘違い?
>>958
今の最適化が進んだコンパイラはregister宣言を無視することが多い。
もしくは最適化の邪魔になってかえって遅くなることもあるそうな(伝聞)。
redy ・・・ set ・・・ start!
>>960
ready ・・・ set ・・・ start!
directory_iterator
963C言語二日目:03/03/29 22:12
高橋麻奈・著の「やさしいC」を読みました!!!疲れた。
ある程度C言語を習得した気分ですが(w
実際は習得率なん%でしょうか?(20%いってる?)
習得率100%の基準は皆さん次第で。
あと、これからステップアップしてくためにはどんな本orサイトがお勧めですか?
>>963
0.2%
ぬるぽは0.49%

  ∧_∧
 ( ´∀`)< ぬるぽ

ぬるぽ募集中
http://pumpkinnet.to/ranking/words/

【ぬるぽに投票した人】
http://pc.2ch.net/test/read.cgi/prog/1048837306/l50
966C言語二日目:03/03/29 22:19
>>964 
逝ってきます!
クソッ、CD-ROMドライヴを抑えてるネジを潰してしまった。
968デフォルトの名無しさん:03/03/29 22:56
>>965
思わず
「おかしいですよ!カテジナさん!!」
に投票してしまった・・・
>>968
1時間後はヨロシク。

  ∧_∧
 ( ´∀`)< ぬるぽ
970デフォルトの名無しさん:03/03/29 23:43
>>959
無視するとともに勝手にレジスタに置くんだろ?
>>956
> 後者が変数領域を確保するとは限らない。

アフォ ? 変数領域を確保しないとも限らないんだよ ?

> つーか、それは速度とはあまり関係無い。

「全然」ではないよね。つまり、あんたの >>953 は単なる思い込みってことだ。

現実、前後の状況によって、どっちが早くなるかは様々だ。
>>947 では、a, b, c が int 型とまでは書いてあるが、例えば c が volatile int c と宣言されて射たりしたら、後者が遅いことは十分に考えられる。
>>971
煽りはスピードが命。
>>971
流石に volatile まで持ち出すのは行き過ぎではないかと。
>>971
カエレ!!
>>971
文章が支離滅裂だな
>>971
c に volatile付けないとイカン状況で>>947の前者みたいな
書き方するのもいかがかと。
>>971
春だなぁ。
>>971
なんか、総攻撃にあってるな
>>971
  ∧_∧
 ( ´∀`)< ぬるぽ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>971
>965 >969 >979
(・∀・)ガッ
新スレ立ててきます。
983C言語やろう:03/03/30 14:12
よく2chとかで  

int main()
{ printf....................

ていう書き方をみるけど

int main(void)
{printf......................

のように引数がないときは 、引数のない関数void型をつかわなきゃいけないん
じゃないの??
voidを使ってるのと使ってない差を教えてください
>>983
糖衣構文
985C言語やろう:03/03/30 14:22
↑糖衣??
等位?等意?
春+日=あほか
>>983
さんざん既出。
c++では同じ意味。
cではかなり違う意味。
「じゃないの?」と思うなら少しは自分で調べてみよう。
989デフォルトの名無しさん:03/03/30 15:55
セイロガン糖衣A
>>988
Cでも同じだが・・・
991990:03/03/30 16:07
ああ、関数の定義を呼び出しよりも前に書いたら意味がちがくなるな。
>>990
返値みたくint型と評価されるとか言いたいんでしょうか。

じゃあ、

void hoge()
{
/*暗黙のint型の引数にどうやってアクセスすればいいのか?*/
}

int main()
{
hoge();/*引数の数が足りないのでエラー*/
}
993990:03/03/30 16:10
俺は↓のように書くから。

void hoge(void);

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

void hoge()
{

}
994990:03/03/30 16:11
つまりプロトタイプ宣言では意味がちがくなると言いたかっただけ。
// intを返す関数hogeのプロトタイプ宣言。引数チェックなし
int hoge();

// intを返す関数hogeのプロトタイプ宣言。引数なし。
int hoge(void);
996さとし:03/03/30 16:24
int *pa;
とした場合は pa がポインタって言うのはわかるけど
*paっていううのは、変数じゃないしなんなんですか??
>>996
ポインタpaを間接参照。
int a=8;
int *pa=&a;
/* *pa==8 */
999デフォルトの名無しさん:03/03/30 16:27
>>997
黙れ春厨
1000か?
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。