C言語なら、俺に聞け! <31>

このエントリーをはてなブックマークに追加
1SHOW-A息子
漏れは32才。22年間、父SHOW-Aにプログラムを叩き込まれてきた。
いろいろな言語を極めたが、一番漏れになじんだのはCだった。
Cのことなら父をも超えた。疑問な点があったら漏れに聞け。

便所とメシ食ってる時以外は暇だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。あと、至急父に仕事を与えてやってください。

コンパイラ、過去ログなどのリンクは>>2-5 あたり
2SHOW-A息子:02/09/07 04:36
【コンパイラ】
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
3SHOW-A息子:02/09/07 04:37
【その他】
http://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/prog/progf.html
http://www.bloodshed.net/index.html

【注意】
Cmachineは一般的なCと挙動が違いすぎるので動作の保証はできません。
まともな処理系を使いましょう。
4SHOW-A息子:02/09/07 04:37
C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART 5
http://pc3.2ch.net/test/read.cgi/tech/1027593322/

前スレ <30> http://pc3.2ch.net/test/read.cgi/tech/1030786546/
5SHOW-A息子:02/09/07 04:37
【過去ログ】
30 http://pc3.2ch.net/test/read.cgi/tech/1030786546/
29 http://pc3.2ch.net/test/read.cgi/tech/1029605182/
28 http://pc3.2ch.net/test/read.cgi/tech/1028495798/
27 http://pc3.2ch.net/test/read.cgi/tech/1027160374/
26 http://pc3.2ch.net/test/read.cgi/tech/1026048820/
25 http://pc.2ch.net/tech/kako/1024/10249/1024918442.html
24 http://pc.2ch.net/tech/kako/1024/10240/1024033400.html
23 http://pc.2ch.net/tech/kako/1023/10230/1023024817.html
22 http://pc.2ch.net/tech/kako/1022/10224/1022402165.html
21 http://pc.2ch.net/tech/kako/1022/10220/1022045622.html
20 http://pc.2ch.net/tech/kako/1021/10214/1021459016.html
19 http://pc.2ch.net/tech/kako/1020/10207/1020756993.html
18 http://pc.2ch.net/tech/kako/1020/10202/1020260813.html
17 http://pc.2ch.net/tech/kako/1019/10193/1019372139.html
16 http://pc.2ch.net/tech/kako/1018/10184/1018453690.html
15 http://pc.2ch.net/tech/kako/1016/10165/1016519243.html
14 http://pc.2ch.net/tech/kako/1015/10152/1015286974.html
13 http://pc.2ch.net/tech/kako/1013/10139/1013990673.html
12 http://pc.2ch.net/tech/kako/1012/10123/1012348974.html
11 http://pc.2ch.net/tech/kako/1009/10094/1009499565.html
10 http://pc.2ch.net/tech/kako/1008/10083/1008300863.html
9 http://pc.2ch.net/tech/kako/1007/10072/1007272267.html
8 http://pc.2ch.net/tech/kako/1005/10058/1005811510.html
7 http://pc.2ch.net/tech/kako/1003/10034/1003418249.html
6 http://piza2.2ch.net/tech/kako/999/999617524.html
5 http://piza2.2ch.net/tech/kako/994/994908590.html
4 http://piza.2ch.net/tech/kako/992/992357382.html
3 http://piza.2ch.net/tech/kako/989/989929288.html
2 http://piza.2ch.net/tech/kako/979/979529893.html
1 http://piza.2ch.net/tech/kako/967/967985026.html
乙〜
zuza
お前らちゃんと寝たのか?
>>1
乙カレサン
>>1
お疲れさま。
11デフォルトの名無しさん:02/09/07 09:35
新スレage
12デフォルトの名無しさん:02/09/07 09:44
二次元配列の先頭ポインタを返す関数はどう書けばよいのですか?
引数ならvoid h(int (*i)[5])のように書きますが。
13デフォルトの名無しさん:02/09/07 09:52
>>12 ↓これを参考にするといいと思うよ
http://www.catnet.ne.jp/kouno/c_faq/c1.html#21
1.21:
charへのポインターを返す関数へのポインターを返す関数へのポインターN個から
なる配列をどうやって宣言すればよいか。
14デフォルトの名無しさん:02/09/07 10:12
>>13
それを見ながら色々試してみましたができませんでした。
できないものだとあきらめます。
15デフォルトの名無しさん:02/09/07 10:27
わーい、WinMeのクラシックソリティアで300秒切ったー!!
1613:02/09/07 10:56
>>12 出来たような気がする・・・↓
----------------------------------------------
typedef int D2[][2];

D2 d2_a = {{1,2},{3,4},{5,6}};
D2 *
get_d2_a () {
return &d2_a;
}

main () {
D2 *d2 = get_d2_a ();
int i;
for (i = 0; i < 3; i++) {
printf ("%d,%d\n", (*d2)[i][0], (*d2)[i][1]);
}
}
----------------------------------------------
C:\WINDOWS\デスクトップ\aa>gcc a.c

C:\WINDOWS\デスクトップ\aa>a
1,2
3,4
5,6

C:\WINDOWS\デスクトップ\aa>
----------------------------------------------
17デフォルトの名無しさん:02/09/07 14:38
コメントをプロプロセッサが取り除いてもいいんですか?
プロプロでいいんですか?
1917:02/09/07 14:59
きちんと変換されたから気づかなかった(-_-;)
プリプロセッサ
int a=100;

if(!a)

とやると,ifはどう言うふうな条件になるの?
21デフォルトの名無しさん:02/09/07 15:05
>>20
どうって・・・aが偽なら真だろ?
具体的に言うとaの値が0なら。
>>21
ありがとん

if(!a && !b && c => d)

とかも可能?
memset(array,1==2,sizeof array/sizeof array[0]);
>>22
文法上はOK
2523:02/09/07 15:15
無意味なもの書いたうえに間違っているな・・・
sizeof arrayだけだ。わっちゃまずい。
2622:02/09/07 15:17
if(!a && !b && c >= d)

の間違いだった
c => d
ここは?
下げ進行?
2824:02/09/07 15:19
文法上OKじゃないな
=>を見落とした^^;
>>17
「取り除いてもいいんですか?」って言うけど、
じゃあ逆に取り除かれると、まずいの?
むしろ、取り除かれなくてもいいの?
typedef enum {
  false = 0,
  true = (!false)
} boolean;

とかやると幸せになれるだろうか…。
31デフォルトの名無しさん:02/09/07 15:55
>>30
なんで(!false)と括弧で括っているんだろう?
#defineならわかるが。
3231:02/09/07 15:56
というかtrue=1でいいのでは?
!0は必ず1を返すって聞いたよ。
33デフォルトの名無しさん:02/09/07 16:21
ていうか、
if(?)のとき?が 0なら偽、それ以外は真と考えろといわれたんだが、
この考え方で危ないと切ってある?
>>33
ない。
35デフォルトの名無しさん:02/09/07 16:37
>>33
それで正しい。でも!0のとき必ず1が帰ってくる仕様はとても便利
36デフォルトの名無しさん:02/09/07 16:43
>>34-35
それが仕様であるわけですね?
if()以外でも、たとえば A ? B : C でもこの考え方でOKでつか?
37デフォルトの名無しさん:02/09/07 16:48
int a = 10;

if ( 9 < a < 10)
printf("9 < a < 10");
else
printf("!(9 < a < 10");

これを実行したら, 9 < a < 10 と表示されました。
これはコンパイラのバグでしょうか?
>>37
それ、ちゃうねん…。
そういうコトがしたい時はこうする。

int a = 10;

if ( a < 9 && a > 10 ) {
    printf("9 < a < 10\n");
} else {
    printf("!(9 < a < 10)\n");
}
9 < a && a < 10
4038:02/09/07 16:55
>>39
ああ、そっちの方が分かりやすいな。無意識にやっちまったよ。
>>40
わかりやすいんじゃなくて>>39が正しい。
9 < a < 10

これは↓こんな感じ?

9 < a <10

1(true) < 10

1(true)
9 < a < 10
って左から結合するのかな
(9 < a) < 10
まぁ常に真だわな
うわ、遅れカブタ
4538:02/09/07 17:01
あ…条件式間違ってるんだね…欝死。
4637:02/09/07 17:03
なるほど、わかりました。
a = 10 として
9 < a && a < 10 って書くと
(9 < a) -> 1(true)
(a < 10) -> 0(false)
ってなって、
(9 < a && a < 10) -> (true && false) -> true
ってことですね。
>>46
ちょっとまて、なんでtrue&&falseがtrueになるんだよ(笑)
4837:02/09/07 17:05
いや、間違えた。
(9 < a) && a -> 1(true)
((9 < a) && a) < 10 -> (1 < 10) -> true
でいいんですね?
これでレベルが少し上がったかな。
>>48 ネタやめれ
本物の37は俺じゃー
オブ戦スレからコピーしてきただけ。
オブ船ってなに?
ヒーローものか?
52デフォルトの名無しさん:02/09/07 17:11
オブジェクト指向は戦場では必要なし
http://pc3.2ch.net/test/read.cgi/tech/1031028125/
オブ戦なんて言われてるんだ。
5437:02/09/07 17:14
本物の37です。このスレに投稿したつもりがオブ戦にいっていましたか。
時間を置いてみたらちゃんとあったのでちゃんとC俺に書き込んだと思っていたんですが。
ちなみに48は偽者です。
>>54
ネタ投稿じゃなくて誤爆だったのか(藁
C俺 と来たか
5755:02/09/07 17:18
違う、>>54もネタだ
見事に釣られた(ToT)
まあまあ、新しい略語もわかったことだし
てーか、まだ続いてたのね>>52のスレ
6037:02/09/07 17:26
じゃあ、本当の質問ね。
1 < a < 10 のときって左から順番に処理していくのって仕様なの?
本当はこれがききたかったの。
仕様です。
>>36
OK。
if か ? : かは関係ない。
>>60
実際に処理(評価)される順序と結合順はまた別の話。
結合という意味で書いたのなら、左から順番でOK。
むしろ、a < b <= c = d < ... < z みたいな
複合的な多項演算子?を許す言語ってあんのかしら
65デフォルトの名無しさん:02/09/07 18:11
Cを実務で使ってる方はやはり基本情報程度のC言語の問題なら10分少々で解けたりするんですか?
漏れは2か月前くらいからCを勉強しはじめて、一問解くのに1時間以上かかる事もあるのですが、、、、
>>65
2ヵ月で抱く疑問じゃないよそれ。1年やっても私これだけなんですがって
いうならわかるが。。。
基本情報のCの問題は実際にコンピュータ上で動かすのが難しいところが難点。
基本情報ってどんなの?
6967:02/09/07 18:22
できないって言っているわけじゃないよ。
同じ機能を持った実在する関数を探すのが大変ってこと。
7065:02/09/07 18:24
C言語自体はずぶの素人だったのですが去年まではFortranを多少かじった程度とはいえ使っていたので
プログラミング自体は全くの素人ではないんです。それに2か月間けっこう勉強したから、それでもこれだけ時間かかってしまうのは
センスないのかなー  って思ってしまいます。
再帰処理の問題ならクイックソートでも出せばいいのに、なんで図形描画なんだか・・・
ワイルドカードってなに?
73:02/09/07 18:56
*
75デフォルトの名無しさん:02/09/07 19:32
ワイルドアームってなに?
76デフォルトの名無しさん:02/09/07 19:35
Javaの質問もOKですか?
77ぼけ:02/09/07 19:37
>>76
Ja版で質問しろ
78 :02/09/07 20:17
ファイルって,どのくらい分割している?
一つのファイルに関数15個以上って,おかしいかな?
>78
類似機能単位に分けるべし。

関数の数が多い少ないだけで判断するのはイクナイ!
80デフォルトの名無しさん:02/09/07 20:41
CPUがPen3の750MHzなんですが、こんなへぼマシンでもC言語を使えますか?
81デフォルトの名無しさん:02/09/07 20:43
>>80
ネタならもっと上手く書け
82デフォルトの名無しさん:02/09/07 20:43
>>81
つっこむならもっと上手く書け
83DELL:02/09/07 20:50
extern HDC hDC;
void func(){
//....................
}

ってな感じで分割コンパイルでの外部クラスでデバイスコンテキストを指定すると
エラーになるんですが、対処方法を教えてください。

お願いします神様>>1
84デフォルトの名無しさん:02/09/07 20:54
>>83
何がどうエラーになるんだよ・・・
ネタならもっと上手く書け
85DELL:02/09/07 20:59
>84
いいからやってみ
bakaaho.c
bakaaho.c(1) : error C2061: 構文エラー : 識別子 'hDC' がシンタックスエラーを起こしました。
bakaaho.c(1) : error C2059: 構文エラー : ';'
87 :02/09/07 21:01
構文エラー';'がhDCの前に必要です。
予期せぬEOFが検出
88デフォルトの名無しさん:02/09/07 21:09
前スレがあがってるので。
>>85
あほか
9089:02/09/07 21:15
だめだ。消えた。そりゃそうか。
includeするように。
91デフォルトの名無しさん:02/09/07 21:35
プログラムのサイズをできるだけ小さくしたいのですが、何かこれは!ってのありませんか〜
92DELL:02/09/07 21:36
>89
インクルードしたらまともに動いた。
サンクス!
2chも役に立つもんだw
だからBCCは>>1に入れとけとあれほど…
>>91
バイナリエディタで機械語を手書き。
プログラム本体から付属ファイルを呼べるだけ呼ぶ。
あとは念力。
96デフォルトの名無しさん:02/09/07 22:16
>>91
余計な機能付けない。
GUIに凝らない。
97 :02/09/07 22:26
コメントつけない
空白作らない
>>91
ご飯は良く噛んで食べる
>>91
初期化コードなど二度と実行されない領域をワークエリアに
使うテクニックは試されましたか?
>91
それは簡単。機能を最小のサブセットに限定する。
>91
それは簡単。七行プログラミングスレに行く。
>91
PCのスペックをあげて相対的に小さくする。
つーか今時Cごときのコードを肥大化させる方が難しいよ。
毎回少しずつreallocを使って,サイズを増やしていく方法と,
連結方式をとる方法どっちがいいですか?
memcpyって処理が重いですか?
105デフォルトの名無しさん:02/09/07 23:17
>>103
内容による。毎回ってどのぐらいの頻度?

>>104
なにと比べて重いといっているの?
同じことを実現するのにこれ以上早い方法はCにはない
106デフォルトの名無しさん:02/09/07 23:18
取引先の会社でメチャメチャ長い変数名を使っている人がいるんですけど、
そういう人はエディターが特殊なんでしょうか?

変数名が FromOracleSequelToOffice とか
そういう変数名使ってるんで、わかりやすいといえばこれ以上無いくらいわかりやすいんですけど
ちょっと手直しするときにも、すごいめんどくさいんです。
こういうのってヒストリー機能付きのエディターとか使っているのでしょうか?
何かVCでも使えるいいアイディアがあったら教えてください。
107デフォルトの名無しさん:02/09/07 23:19
>>106
ネタ?
Ctrl-Space押してみろ
>>106
VCならCtrl+Spaceで補完が使えるはずだけど。
109108:02/09/07 23:20
カブ-タ
110106:02/09/07 23:21
悲しい・・・・ ネタじゃなかったですよぉ。
111107:02/09/07 23:21
うーむ。106は前スレの野球ゲーム君ほどのインパクトがないなぁ。
神降臨キボンヌ
112103:02/09/07 23:22
>>105
1〜300くらい
共用体がいまいちよくわかりません。
tp://www.ncad.co.jp/~komata/c-kouza7.htm
を見たんですが,なんで100じゃなくて,300になるのかとか,
どういう状態で共有しているのか等がわかりません。
共用体は各フィールドのメンバの先頭アドレスを揃えるだけのことしか
しません。エンディアンの問題はコンパイラが一切関知しませんので
ユーザの責任において使用する必要があります。
115105:02/09/07 23:31
>>112
1つづつ増えていくとすると300回realloc呼ぶ可能性があると?
それはリストにして追加していったほうがいい。
素人は(C歴1年半),手を出さない方がイイ?
バグったらいやだしなぁ
117デフォルトの名無しさん:02/09/07 23:34
アルゴリズムのお勧めの本は?
(初心者向きの)
118103:02/09/07 23:34
>>115
最大で300回。
しんどそうですが,リスト構造習います。
2時間ぐらいでなんとかなるか。
>> 118
最大値が決まっているならポインタの配列にすれば?
>>118
それらのデータは順次参照のみ?
途中への追加や削除はあるの?
>>119
次サイズ変えるときとかに,汎用性が・・・
まー配列にすればいいことはいいんだけどね
でもこれだと,いつ動的に配列確保を使うの?
122103:02/09/07 23:44
1つが1Mのビットマップなのですが
123デフォルトの名無しさん:02/09/07 23:47
char A=0;
A = A+1;

これは、 まず Aがint型にキャストされ、 int型で計算され、そのあと char型にキャストされるの?
それとも 1が(char)にキャストされchar型で計算されるの?

まさか実装依存なんてことは無いと思うが。
>>120
ないです。
配列として,for分とかで参照していきます。
>123
(・Α・)私のキヲクが確かならばぁ〜

計算時は器の大きいほうで計算。
代入時は左辺に合わせる。
>>125
(゚∀゚)サンクスコ
>>113
> なんで100じゃなくて,300になるのかとか,
作者が間違っているような気が...。

この作者、構造体の代入で...
> 多くのCコンパイラは代入は構造体のメンバー1つ1つをコピーします。
なんて書いてるぐらいだから、よほど古い処理系を使っているか、昔の知
識のままでとまっているか、Web の更新をしてないかのどれかだろうね。
128デフォルトの名無しさん:02/09/07 23:59
void *pData;
pData = (void*)"test data";

if(pData)
printf("%s\" , (char*)pData);

これはなにをやっているのでしょうか?
こんなの文法的に間違ってますよね。
129119:02/09/08 00:05
>>121
BITMAP *list[300];
int cur = 0;

// 追加
list[cur] = malloc( size );
++cur;
// 削除
free( list[n] );
--cur;
list[n] = list[cur];

順番が変わったら困るなら、リスト調べてくれ
ちょっと工夫すれば変わらないように出来るから。
130121:02/09/08 00:08
>>129
かなりイイですね
でも300回も別々に確保してたんじゃあ,マズーじゃあ?
>>128
文法的に間違ってるのは "%s\" ← ここだけだな。
>>128
うん、間違ってる。printf() のフォーマット文字列が閉じれてない。
ちなみに、printf("%s\n", (char*)pData); と修正して、実行すると
うちの処理系 (VC++6) では、"test data" と表示されたが、あなたの
処理系でどうなるかはわからない。
133デフォルトの名無しさん:02/09/08 00:16
>>128
なにをやってるって・・・みたまんまですが?
134119:02/09/08 00:24
>>130
すまん、言ってることが見えん
> 次サイズ変えるときとかに,汎用性が・・・
毎回サイズ変わるんだよな?
realloc はコピーコストが掛かるのを問題にしているんじゃないのか?
>>134
> 次サイズ変えるときとかに,汎用性が・・・
これは,今は300だけどそのうち500になるかもしれないしという事

>realloc はコピーコストが掛かるのを問題にしているんじゃないのか?
しちょります
情報隠蔽(カプセル化)をしたいのですが,
いまいち感覚がつかめません。
例えば,mapというファイルに,
static char map[100];
void InitMap(void);
void GetMapAdr(char *);
というふうにして,毎回呼び出し側の関数で,GetMapAdrでmapのアドレスを
得ながらやっていくのでしょうか?
こういう考えでいくと,5つの変数を使うときなどは,その関数の最初に
5回もアドレスを得なくてはいけません。
137119:02/09/08 00:46
>>135
> これは,今は300だけどそのうち500になるかもしれないしという事
そういうことか、
> でも300回も別々に確保してたんじゃあ,マズーじゃあ?
から読めんかったよ、ただあれは
> 最大で300回。
とあったから、サンプルとして書いただけで、、

つか、103=112=121=130=135 で合ってますか?
138デフォルトの名無しさん:02/09/08 00:47
>>136
まず日本語を以下略
139103:02/09/08 00:49
>>137
あってます
140デフォルトの名無しさん:02/09/08 00:55
>>103
そのわりにはいっていることが微妙に変わっている気がするのは...
141103:02/09/08 00:57
>>140
眠たいのと,動悸が激しいからです
142デフォルトの名無しさん:02/09/08 00:58
というより>>103は何をしたくて、そういう処理を考えてるのか
説明汁。
大きいのがほしくなったら
大きいのを取得して
コピーして
古くて小さいのを消す
144デフォルトの名無しさん:02/09/08 01:02
>>143
人はそれをreallocと呼ぶ
>>143
それはちょっと避けたくないか? パフォーマンスが悪すぎる.
146 :02/09/08 01:03
関数をメンバにいれるには,どのようにすればいいのでしょうか?
147デフォルトの名無しさん:02/09/08 01:06
>>146
1.クラス内に追加する。
2.関数を追加したいクラスを継承して追加する。

よそから提供されてcppファイルのないクラスなら2しかできない。
自分で作ったクラスなら1でいいと思う
2ちゃんねらーが朝銀問題で国相手に訴訟起こす模様

小泉の訪朝までには訴訟できるように弁護士と相談中とのことです

>実は今週早々、ある関係者の方から管理人の手元に衝撃的な証言が届いてしまいました。
>朝銀への公的資金投入問題で金融庁様がズルやっていた決定的証拠つきです。

こんなのもあり楽しみです

朝銀って何?公的資金って何?
http://chogin.parfait.ne.jp/

朝銀問題はやわかりFLASHムービー
http://www.geocities.co.jp/Playtown-Denei/8746/

                           
要お気に入り登録&コピペ
必要な知識が簡単にチェックできます
超党派議員名簿やマスコミへのメルアド集もあります
>>146
typedef struct{
void (*a);
}c;
いつからC++相談室になったんだ?
151149:02/09/08 01:16
これで実装できない?
c.a=func;
だめか?
152デフォルトの名無しさん:02/09/08 01:25
単純に、

struct{

  void (*func)();

}tag_str;

でいいだろ。
typedef structの場合は?
typedef struct{
}c;

だった場合,c.func()ってなるの?
戻り値の型が違ったりしているのも,メンバに含んでもイイのかな?
int calc(int x) {
return x * x;
}

typedef struct {
int (*func)(int x);
} crass;


int main(int argc, char **argv) {
crass t;
t.func = calc;

printf("%d\n", t.func(3));
}

こうかな。
>>154
これって、インスタンス毎に初期化するの?
Cだと構造体のメンバをstaticに出来ないんだね、今知ったよ。
156153:02/09/08 01:39
>>154
ありがとう
普通は,そういうプログラム組む人いないよね?
157154:02/09/08 01:51
>>155
Cだとできんだろうな、多分。

>>156
いや、俺も>>152見て書いただけだから、このコードが必要なんかどうかは分からん…(笑)。

VC++ 6.0では10KBくらいのDLLを作ることって、できますか?
小さなコードをDLLにしても、20KB以上の容量になるんで、
バイナリエディタで覗いたらNULLがいっぱい…
このNULL文字の列は何か意味があるんでしょうか?
MFCはスタティックライブラリを使用する設定になっています。
>>158
スレ違い
void showA(struct Monna *a, char* *id, int* position, char* *name)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
こういう
文字列リテラルの参照渡しっこんな感じでいいんすかね?
つーか、やっていいのかな?
161160:02/09/08 04:05
ズレた(`・ι・´)
はぁ・・・
>>160
つまり、
void showA(char **name)
{
 *name = "sage";
}
こういうことをやっても問題ないだろうか
ってこと?
そうなら、別に問題ない。
163160:02/09/08 04:25
>162

えっと、

void showA(char **name);
void showA(chae **name){
printf("%s\n",(*name))
}

void Main(){

char *name="microsystems";
showA(name);
}

みたいな感じです。よさそうっすね。
(゚∀゚)サンクスコ !
164160:02/09/08 04:34
#include<stdio.h>

void showA(char* *name,int* age);

void showA(char* *name,int* age){
printf("name:%s\nage:%d",(*name),(*age));
}

int main(){
int age=43;
char *name="microsystems";
showA(&name,&age);
return 0;
}


ちょっと上違ったけど、できました。
これって値渡しより、関数呼び出し時に、新しい変数領域が確保されないので
効率的なんすよね?
char* *name
とかって、普通に使われてるものなんでしょうか。
素朴な疑問なんですけども。
>>164
何ですか?これは?
163も164も、ポインタにして渡す必要はまったくない。
(ついでに 163 はうっかりミスが2ヶ所あるよ)

> これって値渡しより、関数呼び出し時に、新しい変数領域が確保されないので
> 効率的なんすよね?

渡すのが構造体/共用体ならともかく、整数では
効率が下がることはあっても、上がることは
(通常の処理系では)考えられない。

それどころか、呼び出し側の最適化を邪魔することに
なるので、ほとんどの場合、処理が遅くなってしまうはず。

Cの場合、参照渡しと言うよりも「ポインタの値渡し」なんだから、
引数用の領域(それがスタックであれレジスタであれ)が使われる
ことには変わりない。
168160:02/09/08 05:22
>167

>164が修正版っす。
やっぱり意味ないのですか〜
処理の負荷は上がって、メモリ効率はよいような気が。

引数の部分で(呼び出し元の変数がコピーされて)無駄に消費
されるのではないかな、と考えたわけですが。

上のようにポインタの値渡しをすれば、
引数用の領域には呼び出し元の変数へのpointerが格納されるのかと。

違うのかなぁ^^;そこら辺はコンパイラの最適化の範疇なんでしょうか。
169160:02/09/08 05:27
>165

呼び出し先で、呼び出し元の変数の値を変更(同期)したい場合
なんかによく使われるのでは。あ、コーディングスタイルの問題?
170寝不足でイライラ:02/09/08 05:36
>>164のコードは何でダブルポインタ使ってるのか分からん。const char* で十分でそ?
intがポインタになってるのも分からん。何なんだよ?
171167:02/09/08 05:47
>>168
> 上のようにポインタの値渡しをすれば、
> 引数用の領域には呼び出し元の変数へのpointerが格納されるのかと。

これだけは合ってるよ。

だから、(元の変数の領域とは別の) 引数用の領域に
char** と int* が入るか、
char* と int が入るか
の違いでしかない。
どちらも引数用の領域を必要とすることには変わりない。

その領域のサイズは処理系に依存するが、たとえば
UnixとかWin32なら 前者でも後者でも4*2バイトだね。

> そこら辺はコンパイラの最適化の範疇なんでしょうか。
最適化というより、呼び出し規則が決まってるのが普通。
実際のところ、どんな処理系を使ってるの?
172160:02/09/08 05:55
>171

Linuxでgcc3.2っす。
173167:02/09/08 06:09
>>172
だったら使われる引数用の領域のサイズにも違いはないよ。
32ビット整数で表現できるのに、それをわざわざポインタに
して渡してもメリットはない。
174160:02/09/08 06:38
今頃風呂上りです^^;

ここらへん見ると、
http://www.google.co.jp/search?q=cache:3suLwvNaZI0C:www.alfasystem.net/dojo/room5/LectureC/c09.htm
+%E5%BC%95%E6%95%B0%E3%80%80%E9%A0%98%E5%9F%9F%E3%80%80C%E8%A8%80%E8%AA%9E%E3%80%80%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%AE%E5%80%A4%E6%B8%A1%E3%81%97&hl=ja&ie=UTF-8
メモリアクセスで負荷はあがりそうっすね。

>170
参照ならぬ、ポインタの値渡しをしようと思ってのことです。
でも、素直に値渡しでよさげという結論になってきました。
175160:02/09/08 06:44
結論として、ポインタの値渡しを使う場面は、

1.配列、構造体などのサイズのでかいものを渡す時
2.呼び出し先で引数として受け取った変数を、呼び出し元と
同期させたい時

ということで宜しいのかな。まぁ、細かいとこでは他にもありそうだけど。
176 :02/09/08 06:59
>>175 当たり前の事を何を偉そうに結論しておるのかと小一時間
177160:02/09/08 07:29
>176

ううY(>_<、)Y 175みれば当たり前なんでハマってました。
他にも巧妙な使い方があるのかと、期待もして書いたわけですが。
178デフォルトの名無しさん:02/09/08 08:23
いつからこのスレはポインタスレになったんだ?
>>152
関数を追加するのと関数ポインタを追加するのは全然違うじゃない。
素直にできないと言いなよ
180デフォルトの名無しさん:02/09/08 10:52
>>179
言っている事が全然分からんが?

もし、関数の "実体" を構造体内に入れる事が出来たとして、
それが関数のポインタで代用(?)する場合と
実用上どういう風に「全然違う」のか是非説明してくれ。
(もしかして初期化するのが面倒だなんていいたいのか?
本当にそうならば、そんな事する前にその関数を構造体に
入れる "必要性" を教えてくれ)

もしかしてC++のメンバ関数なんかもナイーブに
class 内に "コピー" する事で実現されているなんて
思っちゃってるの? (プ
>>180
はいはい、くだらないことをいってるしったか君、ごくろーさま
>>179 >>181 釣り師ハケーン

ナンセンスな質問に無理に答えるとこうなる
>>180が正論。>>179が無知。

> もしかしてC++のメンバ関数なんかもナイーブに
> class 内に "コピー" する事で実現されているなんて
> 思っちゃってるの? (プ

そんなことになったら sizeofの結果が恐ろしいな。
184179:02/09/08 11:38
>>180
> もしかしてC++のメンバ関数なんかもナイーブに
> class 内に "コピー" する事で実現されているなんて
> 思っちゃってるの? (プ

そんなこと一言も言っていないが?
もしかして実体をコピーしなければいれることにはならないと思っているのか?
185184:02/09/08 11:40
構造体には関数は追加できない。だから関数ポインタで擬似的なことをする。
C++のクラスの場合はその実体が関数ポインタだとしても言語の仕様上関数を追加できるだろ?
C言語もメンバをstaticに出来れば、そんなことにはなりませんな。
>>180
関数へのポインタって変数だよ。分かっている?
188デフォルトの名無しさん:02/09/08 11:52
>>184
>もしかして実体をコピーしなければいれることにはならないと思っているのか?

お前の言う「いれる」の意味を問いたい。問い詰めたい。小1時間問い詰めたい。
お前、ただ "struct{void f(void){}}" って書きたいだけちゃうんかと。
189179:02/09/08 11:54
>>188
仕様上の話だってば。
190179:02/09/08 11:55
Cの構造体に関数を追加できるなんて言ったら大恥書くぞ。
ところで、C++のインライン関数ってまさに実体をコピーするんじゃないの?C++はよくしらないんだけど。
スレ違いでスマン。
>>190
「大恥 "書く" ぞ」
「C++のクラスの場合はその実体が関数ポインタだ」

なんて言う方がもっと恥をかくと思うが。。。
193デフォルトの名無しさん:02/09/08 12:02
int main __P((int, char *[]));


これはいったい何?
>>193
#define _P

なんで括弧が二重なんだ?(^_^;)
言う(話す)時は文字は使いません。と言ってみるテスト。
「言ってみる」という罠
197デフォルトの名無しさん:02/09/08 12:14
ポインタ変数の値をアドレスというと叩かれるけど、&ooの&はアドレス演算子っていいますよね?
なんでですか?
>>185
あんたの言ってることも間違っちゃいないさ。
でもな、そういうのを世間一般では
「単なる揚げ足取り」とか「無知」と呼ぶのさ。

Q) Cで文字列を表示するにはどうすればいいですか?

普通のA)
一例としては、stdio.hをincludeして printf を使え。

185のA)
C言語の仕様上の話では、文字列という概念はない。
よって不可能だ。
Cで文字列を扱えるなんて言ったら大恥かくぞ。
199197:02/09/08 12:15
ごめんなさい。
そう決まっているんだからしかたないですよね。
>>198
揚げ足取りならどっちもどっち。
Cならなんでもできる。
世界お金持ちクラブの歌 歌:ヘドロ
 おカネ おカネ おカネ おカネ おカネ おカネ おカネ おカネ
 お金さえあれば 何でも手に入る
 ドレス イヤリング 真珠の首飾り
 マンション 別荘 建て売りマイホーム
 車飛行機自家用潜水艦キャビアフォアグラ松茸に数の子
 お金さえあれば 幸せになれる 我ら世界お金持ちクラブ
>>200
どっちもどっちって、他方は誰のことを指してるの?
185が揚げ足取ってるだけに見えるが。

>>191
全然違うよ。

>>193
古いコンパイラでもコンパイルできるように
プロトタイプ宣言を使い分ける時の方法だね。

前もって
#define __P(x) x
と宣言すれば、
int main (int, char *[]);
と展開され、

#define __P(x)
と宣言すれば、
int main ();
と展開される。
204デフォルトの名無しさん:02/09/08 12:28
指定したディレクトリ内にあるファイル名を参照したいです。
どうすればいいですか?WinMeです。
205193:02/09/08 12:28
>>203
すごく分かり易い解説、ありがとうございまふ。
206デフォルトの名無しさん:02/09/08 12:30
>>203
たった一行を書き換えるためにわざわざマクロを使うの?
コンパイルオプションでマクロを定義して使うの?
207206:02/09/08 12:34
よく考えてみたらたった一行とかそういう問題じゃないか・・・
俺なら#if使うかな。
208デフォルトの名無しさん:02/09/08 12:36
>>202
師匠!

たった1分足らずの時間で
その様な素晴らしいレスを見つけ出す秘術を
是非とも僕に伝授してください。
209194です:02/09/08 12:38
>>203
なるほどねー
だから括弧が二重なんだ。
二重にしないとint main int,char *[];になっちゃうな。
210デフォルトの名無しさん:02/09/08 12:44
double data;
int dummy = 10;
dummy /= 50;
data = (double)dummy

printf("%f\n",data);

としても0が表示されます。なんで?
コンパイラのバグですか?
>>210 ネタだと言って欲しい
212203:02/09/08 12:45
>>206
たくさんの関数宣言がある時でないと意味がないね。

それらの宣言をすべて
int func __P((...));
のような形式で記述しておいて、
コンパイルする環境によってマクロだけを切り換える。

普通は、公開ソースで色々なプラットフォームに
対応したい時に使うものだと思う。

zlibなんかもこの方法を使ってるから、見てみるといいかもね。
ttp://www.gzip.org/zlib/
>>208 んー だって憶えてたんだもん
>>209
それ以前に、マクロ __P() の引数の数がおかしいと怒られるから、面倒だけど
二重括弧は必要。
>>210
0と表示されたらライブラリのバグ(藁
0.000000と表示されないと(藁
216デフォルトの名無しさん:02/09/08 13:27
alloc系でメモリを取得取得取得開放取得開放開放取得開放取得ってやってたら
ヒープがこまぎれずたずたになっちゃう気がするけど
OSはガーベッジコレクションとかちゃんとやってくれてるのかな?
とりあえずWinとかLinuxとかでの例を教えてほしいかも。
int a=0x10;
if ( a&0x10 == 0x10 ) printf("a==0x10\n");

としてもa==0x10が表示されてません。なんで?
コンパイラのバグですか?
昔、幼稚園児だったころ友達に「わかってることを聞く奴は馬鹿だ」
と言われたんですけど、僕は馬鹿だったんですかね
>>217
& より == の方が優先度高いから
if ( a & (0x10 == 0x10 ) )
と同義。キミのバグ。
>>218
キミは馬鹿じゃない。
>>218
馬鹿じゃなくてむかつくだけ。
人を試すってことだろ?
222デフォルトの名無しさん:02/09/08 13:36
・・・・・できません。なんで?
コンパイラのバグですか?

が今のはやりですか?
昨日の9<a<10とかさ。
教えてください.

int Q = 41;
Q -= 4 * 9 - 4 - 1;

なぜ結果が Q = 10 になるのでしょうか ?
私は今まで Q = Q - 4 * 9 - 4 - 1; と同じだと思っていたのですが ...
>>223
Q=Q-(4*9-4-1);だろ?
>> 222
ネタでしょ

>> 223
Q = Q - (4*9-4-1);

226たけ☆地球の王子♪:02/09/08 13:39
>>223
小学校からやり直せや
それとも小学生か?(稿
dummy /= 50;
ここで整数除算して桁落ち(0.0〜とかではなく、0としか入らない)、
小数点以下が切り捨てられてデータが残らない。
つまりdummyに0が入ってその後に、別のところでキャストしても0は0(復元不可能)。
>>226
小学校じゃ習わないぞ(ワラ
229たけ☆地球の王子♪:02/09/08 13:41
>>228
*から先に計算するって事は小学校で習いますです。はい。
>>229
問題はそこじゃない。
a-=bはbを先に計算してからaから引く。
>>224, >>225, >>226
ありがとうございました.
まるで気がつきませんでした.
232223:02/09/08 13:43
すみません, 途中で間違って投稿してしまいました.

なぜ Q = 10 になるのでしょうか ? なんで ?
コンパイラのバグですか ?
(4*9-4-1)=31
もうちょっとマトモなネタキボーン
int i;
for(i=0;i<10;i++) ;

無限ループになります。なんで?
コンパイラのバグですか?
>> 235
それはコンパイラのバグ

そういやIntelのコンパイラで
short i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("%d%d\n, i,j );
}
}
とやると、外側のループが1回しか実行されないバグがあったな
>>235
無限ループならコンパイラのバグです。
もうちょっとマトモなネタキボーン
238デフォルトの名無しさん:02/09/08 13:54
>>236
Intelだめじゃん!
ハード屋がつくるソフトってだめね。
Sunのあれとか。
>>236
short で、インクリメントできないってこと?
241236:02/09/08 14:01
>> 240
いや、2重ループが実行されない。
int なら平気。
short使う人の性格にバグが。
>>239
ソフト屋の作るソフトも人のことは言えないと思うが...
>>204
意味がよくわからんが、
とりあえずFindFirstFileでも使っとけ。

>>216
まずはCランタイムのヒープ管理ルーチンとよく相談しろ。
OS側の話はそれからだ。
245236:02/09/08 14:09
>> 242
俺は使ってねーよ。
コーデック系のプログラムだと、作ってんの学者だから
訳わかんねー事やってんのよ。
変数や関数名も数式のまんまだし。
246デフォルトの名無しさん:02/09/08 14:12
unsigned intをunsignedと略すのはやめた方がいいですか?
247246:02/09/08 14:13
というのもlong intは略してもunsigned intは略さない人が多いみたいですから。
面倒な人はtypedefでもするんでしょうが。
>>246
かまわん。
俺個人的にはuintでtypedefする方が好みだが。
>>246
intぐらい書いたほうがいいと思う。
250248:02/09/08 14:15
>>249
その理由を教えてくれ。
251246:02/09/08 14:16
>>248-249
うー、、、どっちにすべきなんだろう・・・・
typedefがベストですか?uintなら誰でも分かりそうですし。
252248:02/09/08 14:18
>>251
いや、俺はunsignedでもかまわんと思う。個人的な好みを言っただけ。
253246:02/09/08 14:21
じゃあ今まで通りunsignedでいきます。
254246:02/09/08 14:22
礼を忘れました・・・
ありがとうございました。
255デフォルトの名無しさん:02/09/08 14:52
>>236
以前無限ループになってしまって原因がわからなかったのですが、これもコンパイラのバグだったんですね。
もっとちゃんとしたコンパイラ買わないとだめかな。

unsigned char counter;

for(counter = 0; counter < 300 ; counter++) {
処理
}

>>255
コンパイラ何つかってんの
もうネタはいいよ
せめて、ちょっとマシなやつにしてくれ

void f( unsigned int i )
{
if ( i < -1 ) printf( "i<-1\n" );
}
int main()
{
f( 1 );
}
とか
「unsigned char が300まではないだろ」
って言ったら、
「俺のコンパイラはcharが9ビットなんだよ」
って返される見え見えのオチだな。

もうちょっとマトモなネタキボーン
×if ( i < -1 ) printf( "i<-1\n" );
○if ( i < -1 ) printf( "%d<-1\n", i );
260デフォルトの名無しさん:02/09/08 15:07
>>257
どのへんがましかがわからん。
261エディタ製作中@クソ初心者:02/09/08 15:37
すみません、質問いいですか?
懲りずにエディタ作ってる者です(汗

えっと、お聞きしたいんですけど、
文字列配列を、完全に初期化する方法ってありますか?
たとえば、配列すべてに\0で初期化したい場合はどうすればいいでしょう?
for文で配列一つ一つに\0を代入とか考えたんですが、
配列が1000とか2000になると、すごい処理効率が悪くなりますよね・・・。

何か、良い方法はないでしょうか・・・?
よろしくお願いします。
>>261
bzeroがあればその方が速いと聞いたことあるけど、素直にループかmemset使おうよ。
263エディタ製作中@クソ初心者:02/09/08 15:46
>>262
う〜ん、やっぱり普通にループ処理などでしかできないんでしょうかね・・・。
bzero・・? 関数ですか・・・?

うん、それでは素直にループで処理することにします。
ありがとうございました。
memsetって書いてるじゃん。
コンパイラによってはループを勝手に
memsetに置き換えてくれるかも知れんが。
>>261
文字列配列って書いてるけど、「文字列用の文字配列」の間違いじゃないか?
それはともかく、そんな'\0'埋め処理なんか、どういう状況で
必要になるのか全く想像できない。
266エディタ製作中@クソ初心者:02/09/08 15:54
>>264
あ、すみません!
memset関数っていう便利なのがあったんですね(汗
memset関数を使って初期化することにします。
ありがとうございました。
>>265
俺も。
単に長さ0に初期化しておきたいだけなら、文字配列の先頭の要素に'\0'を入れておけばいいだけだしね。
>>265
えっと、今作ってるエディタの仕様だと、
たとえば、改行すると、先頭文字に\0が入ります。
で、右にスクロールする時に先頭文字が切れて
\0がなくなりゴミが表示されてしまうのです・・・。
で、\0で埋めれば簡単に問題解決できるかな?と思いました。
とりあえず、FAQではこうなってるぞ↓

http://www.catnet.ne.jp/kouno/c_faq/c13.html#24
13.24:
古いプログラムを移植しようとしている。なぜ「未定義の外部シンボ ル」というエラーが出るのか。

A:

これから(左側に)挙げるルーチンはそれぞれ時代遅れである。代わり に右側のルーチンを使え。

index? strchrを使え。
rindex? strrchrを使え。
bcopy? 一番目の引数と二番目の引数を入れ替えてmemmoveを使え(質問11.25も参照のこと)。
bcmp? memcmpを使え。
bzero? 二番目の引数を0にしてmemsetを使え。
逆に、右側の列の関数が載っていない古いシステムを使っているのな ら、左側の関数を右側の関数を使って実装、あるいは代用することが できるかもしれない。
>>268
ごみは放って置いて、ごみの前に\0を入れるだけでいいんじゃないの?
文字配列としてではなく文字列として扱うだけなんでしょ?
>>268
なんじゃそりゃ。
つまり、いちいちstrlenして、表示開始桁と比較するのが面倒だっていうことか?
もしそうなら、一行の長さを管理したほうがいいに決まってる。
どうせ、5文字しかない行(char *)lineの6桁目から表示させようってときに、
(line + 6)からヌル終端まで表示、とかやってんじゃないのか?
スマソ、6桁目じゃなくて7桁目だな
>>269
ありがとうございます。
bzero関数ってのは、古い関数だったんですね。
その代わりとなるのが、memset関数だったってことですか。

>>270>>271
あッ!そっか!
今までが、文字列の最後か調べるためには、
for文のループなどで調べないといけないから処理効率が悪いと思ってましたが・・・
言われてみれば、そうですね・・・
strlenで、どこが文字列の最後かわかりますね・・・(汗
プログラム中にも、所々でstrlen関数使ってるのに、何故気づかなかったんだろ・・・(滝汗
すみませんでした。 ありがとうございました。
ごみが表示されるって、きっと\0がないんだよね?
それってprintf("%s\n",str);とかやったら場合によってはまずいことになるんじゃないか?(汗
>>272
そうです。そんな感じです。
う〜ん、ちょっとボケてました(汗
すみませんでした。
277203:02/09/08 16:12
ごめん、今さらだけど、俺間違ってるじゃん。
#define __P(x) x
ともう1つは
× #define __P(x)
○ #define __P(x) ()
だね。
>>275
はい。その辺の対策は・・・
いちよう、配列の一番最後に\0を入れてるので、
配列超えて何か表示されるってことは一応ないです。
279デフォルトの名無しさん:02/09/08 18:06
>>エディタ製作中@クソ初心者
仕様書をアップしてくれ
280223:02/09/08 18:11
>>279
ワラタ
>>279
そういえば、一部はフローチャートになってた。
まじめまじめ。おりこうおりこう。
(でも、書かないと検証できないというのは実際いかがなものか)
282エディタ製作中@クソ初心者:02/09/08 18:24
>>279
し・・・仕様書ッスか?
えっと、そんな大した物は作ってないです(汗
仕様は、いつもいつも、良い案があればコロコロ変わります・・・。
あまり良い作り方ではないとは思いますが、一応勉強のつもりで作り出したので、
仕様など考えず、こんな感じで作ればどうだろ?って感じでプログラムを打ち始めました。
仕様書はありませんが、ソースならあります(w

http://www.geocities.co.jp/SiliconValley-SanJose/9640/

ここに今現在の最新のソースを上げました。
再描写の新仕様のバグや、カーソル制御新仕様のバグなどを修正したばかりです。
読みにくいソースですが、こんなのでしたらどーぞ。

>>281
ええ、新仕様に変えようとしてフローチャート組んで考えたのですが・・・
かなり複雑な処理になってしまいました・・・。
もう少し修正できますので、修正してみます。
283デフォルトの名無しさん:02/09/08 18:32
>>282
SVGならzipで固めないでよ(ToT)
284283:02/09/08 18:34
しかもきちんとhtmlファイルまで入っているじゃない・・・・
なぜそれにリンクを貼らないんだろう。
285エディタ製作中@クソ初心者:02/09/08 18:35
>>283
すみませ〜ん(汗
それが、ジオサーバは、怪しげな拡張子ファイルを上げさせてもらえないんです(涙
最初、そのまま上げようとしたのですが・・・
拡張子SVGは、サーバに上がりませんでした・・・
やむなく、ZIP圧縮で上げる形になりました・・・。

それと、かなりスレ違い&私的な質問なんですが・・・
プログラムの開発は、Win2kで行ってます。
Win2k以外のOSでエディタ動かせます・・・?
>>285
ああそういうことか。なるほど。
ジオ逝ってよし!
Win95だが、動いたぞ。(マジ)
WinMeで動いたよ。
みんなが一致団結している
290エディタ製作中@クソ初心者:02/09/08 18:45
>>287
>>288
あ、動きました?
よかった・・・。
NT系OS以外は動かなかったりしたら、ちょっと悲しかったです。(w
教えてくれてありがとうございました。
がんばって、標準でついてるエディタを超えるようなエディタを作ります。
291デフォルトの名無しさん:02/09/08 18:47
>>290
変数の外部参照(extern int xとか)はヘッダーファイルに書いた方がよくないか?
292291:02/09/08 18:54
あ、もしかして変数宣言と外部参照宣言が同一ファイル内にあるとまずいと思っている?
それは大丈夫だよ。
293エディタ製作中@クソ初心者:02/09/08 18:57
>>292
あれ?
グローバル変数って、全部のファイルで宣言しててもいいんですか?
多重宣言とかって、エラーが出そうとか思ってました・・・(汗
もし、ヘッダーファイルに収めるなら、
別ヘッダーファイルに作ってそれに入れないとって思ってました・・・
・・・これも、基本的な事ですね・・・
もう少し入門書を読んで復習しなおす必要がありますね・・・(汗
294デフォルトの名無しさん:02/09/08 18:58
>>293
変数宣言はだめ。
外部参照宣言(extern int xみたいなやつ)はOK というかしないとそのファイル内で参照できない。
295294:02/09/08 19:00
ところで、外部参照宣言と言う言葉は正しいのかしら?(^_^;)
今まで当たり前のように使ってきたけど。
>>295
あ、それじゃ・・・
extern修飾子が付いてるのと、
普通のグローバル変数宣言との2つのヘッダーファイルを作って、
それで適切にインクルードするってことですね。

わかりました。 グローバル変数の所を整理してみます。
297294:02/09/08 19:05
訂正。
異なる値で初期化した同名のstaticでないグローバル変数の宣言は不可能。
初期化しなければOKだ。
>>296
違うって。
externなんとかってのをヘッダーファイル(あなたの場合はhead.h)に書いて、変数の宣言はどれかひとつのソースファイルに書くの。
>>295
extern宣言、外部宣言、外部変数宣言+外部関数プロトタイプ宣言
とかかな?

「変数宣言」というのはたぶんよくなくて、
「(グローバル)変数定義」だと思う。
>>299
変数定義ですか。
ありがとうございます。これからはその言葉を使わせていただきます。
ヘッダファイルをこんな風にしておいて、

#ifdef DEFINE_GLOBAL
int global;
#else
extern int global;
#endif

ソースファイル一つだけ

#define DEFINE_GLOBAL
#include "head.h"

なんてすればよいのでは?
>>301 ソース分割を放棄して、一体。。。
動作報告。
Linuxでgccだと、conio.hがないからコンパイルできんかった。
WinXP+VC6.0(SP済)では動いたよ。
>>298
なるほど。
すみません、今度こそ理解しました(汗
アドバイスありがとうございます。

>>301
えっと、またプリプロセッサ処理は、
includeと、defineの2つ以外はちゃんと覚えてないんです(汗
一度どこかで定義されてたら、
それ以降定義しないようにしたりできるってことは知ってますが・・・
その辺も、もう少し本見て勉強しておきます。
------------------------------------------------
extern char message[];
extern char message[];
extern char message[];
extern char message[];
extern char message[];
extern char message[];
char message[] = "Hello, extern declarations!";
main() { puts (message); }
------------------------------------------------
C:\WINDOWS\デスクトップ\c-test>gcc a.c

C:\WINDOWS\デスクトップ\c-test>a
Hello, extern declarations!

C:\WINDOWS\デスクトップ\c-test>
------------------------------------------------
>>303
ありがとうございます!
Linuxで動くか?っていうのは俺も少し考えてました・・・。
う〜ん、やっぱりコンパイルできないッスか・・・。
Linuxでなら、コンソールアプリも活躍できそう・・・。
>>305
extern修飾子が付いてる変数宣言は、
全部のファイルで宣言してても大丈夫ってことッスね。
グローバル変数宣言は、本体のedit.cで宣言して、
後はヘッダーからインクルードする事にします。
「変数宣言」も間違いではないけど、外部変数の宣言と区別する時は、
「変数定義」と呼んだ方がいい。と、個人的には思うぞ。

↓お約束のC-FAQ。これも共通のヘッダファイルにexternを置けと言ってる
http://www.catnet.ne.jp/kouno/c_faq/c1.html
1.7:
外部変数を宣言、定義する一番よい方法は。
>>308
ありがとうございます。
う〜ん、ANSI C規格以前のコンパイラでもOKとありました。
一般的な事だったんですね(汗
改めて再度入門書から読み直した方が良いと思いました・・・(滝汗
教えてくれてありがとうございました。
310OPENFILENAME ofn:02/09/09 00:12
char s[];
s=ofn.lpstrFile;

'char *' から 'char []' に変換することはできません。(新しい動作 ; ヘルプを参照)

と怒られるんですが,いろいろキャストしてもダメ.
sへ代入するにはどうしたら?
>>310
strcpy().......
312デフォルトの名無しさん:02/09/09 00:15
>>310
char s[];
のsのさしている先を書き換えてはいけない。
値をコピーしたいなら配列のsのサイズをきちんととっておいて
strcpyでもしとけ。
313OPENFILENAME ofn:02/09/09 00:20
ありがと
314デフォルトの名無しさん:02/09/09 00:21
数字の全角表示ってありましたっけ??
 例.
   1→1
 ASCIIコードにのってなかったんですけど・・・。
315312:02/09/09 00:22
>>310
自分で読んでてもわかりずらいから一応補足。
char s[100];
とかの配列で確保しているメモリの位置は固定されている。
s = ofn.lpstrFile;
見たいにsのさしているアドレスの先を書き換えるような真似はできない。
コピーしたいのがlpstrFileの文字列ならstrcpyを使えばいいし、
ポインタをコピーしたいなら、
char *s;
でポインタで宣言して代入しなきゃいけない。
そりゃASCIIコードには全角文字なんて載ってないだろうな。
>>310
そもそもchar s[];なんてかけるの?関数の仮引数ならchar *sと同じ意味でかけるけど。
318デフォルトの名無しさん:02/09/09 00:28
>316
  どうすればいいのですか??
>>316
そうなんですか?
じゃああれはジャパンオリジナル?
>>318
なにをどうしたい?
>>319
つか、そもそもgccですらコンパイルできないんだけど…。
>>317
俺も疑問に思ったんでコンパイルしてみた。↓って言われた。

error C2133: 'test' : サイズが不明です。

全然ダメじゃねーかよゴルァ!!
323318:02/09/09 00:35
 >320
  ただ数字の全角表示をしたいのれす。
>>322
だよねぇ。
もし関数の仮引数なら*sと同じ意味だから代入できるはずだし(もちろん文字列のコピーにはならないけど)。
325デフォルトの名無しさん:02/09/09 00:36
>>323
printf("1");

これじゃだめ?
>>323
char *double_byte_number = "0123456789";
327318:02/09/09 00:39
 >325
    scanfで数値を入力して
   printfで全角数字出力で
   お願いします。
    
   
>>327
switch(i){
case 1:
printf("1");
case 2:
printf("2");
}


からあげうまうまって人がもっとうまいコードを書いていたな・・・
たしかstrchrを使う方法で・・・
329328:02/09/09 00:41
breakわすれた(^_^;)
330318:02/09/09 00:43
>328
 え〜!こんな面倒くさいんですか!?
 でもありがとう。。
326じゃ、面倒だな。
char *dbn[] = {"0","1","2","3","4","5","6","7","8","9"};
使い方は自分で考えよう。
>>318
ただ半角数字→全角数字にしたいだけならそういう関数作れば?
333328:02/09/09 00:47
数値になっているから文字コードがどうとかなんて気にする必要はないか。
printf("%s",dbn[i]);ってとこか。
334 :02/09/09 00:51
>>323
void print(int n){
 if (n < 0)
  printf("−"), n = -n;
 if ((unsigned) n >= 10U)
  print((unsigned) n / 10U);
 printf("%.2s", "0123456789" + ((unsigned) n % 10U * 2U));
}
335318:02/09/09 00:54
 要するにswich文使うわけですね。
  scnaf("%d",&su);
su += ??;
 みたいのでできると思ってましたぁ。
void zenkakusuji(int n){
char buf[30];
char *dbn[] = {"0","1","2","3","4","5","6","7","8","9"};
int i=0;

sprintf(buf,"%d",n);
if(buf[i]=='-'){
printf("−"); i++;
}
for(;buf[i];i++)
printf("%s",dbn[buf[i]]);
}

337318:02/09/09 00:58
>334
 そんな関数が作れるほどスキルないんで・・・。
 つーかそれの意味わかんないし。
 
338336:02/09/09 01:01
×printf("%s",dbn[buf[i]]);
○printf("%s",dbn[atoi(buf[i])]);
339338:02/09/09 01:02
違う違う(汗
もういいや・・・
340 :02/09/09 01:03
>>338
atoiでもダメだろ。buf[i] - '0' じゃないか?
341339:02/09/09 01:03
ASCIIコードならbuf[i]-'0'でいけるかも・・・どうでもいいけど
>>337
関数記述できる程度をスキルとは言わんぞ。
君はもう少し色々と勉強してきなさい。
343341:02/09/09 01:05
>>340
えぇ、そうです・・・
恥ずかしい・・・
>>340
ASCIIとかの文字コード限定なら○
もっと具体的には文字モードじか書き。
345エディタ製作中@クソ初心者:02/09/09 02:14
すみません、また質問いいでしょうか・・・?(汗
今、一文字削除の機能を付けてるのですが・・・
不思議な警告で悩まされてます・・・。
内容は、「符号付き値と符号なし値の比較」という警告なんですが・・・
どこをunsignedでキャストしてやれば良いのか分らないんです・・・(涙

エラーが出る行は、98行目で、内容は・・・

98: for (i=1; (txt[sy+i] != '\0'); i++)
99:  strcpy(txt[sy+i], txt[sy+i+1]);

こんな感じです。
型は、iがunsigned intで定義。最初int型で定義してたのですが変更しました。
で、txt配列が2次元配列の、型がunsigned char型です。
・・・さっぱり意味不明です・・・(涙

よろしくお願いします。
'\0'はchar型でborland c++は標準でcharがsigned char
347エディタ製作中@クソ初心者:02/09/09 02:18
>>346
ええッ!?
そうなんですか!?
今まで、こんな警告出なかったのに・・・・
・・・でも一応、(unsigned)'\0' こんなやり方ですけどキャストしてみました。
それでも、警告でます・・・
キャストの仕方が悪いですか・・・?
>>エディタ製作中@クソ初心者
いきなりエディタ作成って無茶やなぁ。けど必ず身に付くものがあるから、最後まで頑張りなよ。
# で、実力付いたら反省を兼ねて作り直せば2度勉強できる、と。
>>347
がんばれ。失敗から学ぶことは多い。

signed / unsigned char 関係は、コンパイラオプションでごにょごにょできんかな?
350エディタ製作中@クソ初心者:02/09/09 02:25
>>348
そうなんです・・・
初心者がいきなりエディタ作るのって、結構無茶ありますね(汗
S-JISという文字コード規格に、どれだけ泣かされたか・・・(涙
再描写処理作るのに、どれだけイライラしたか・・・
考えると、泣けてきます・・・
でも、今作ってる一文字削除機能が付くと、
最初に思い描いていた機能すべてが付きます!
一応完成となります!
・・・がんばりました。
ここから、さらに機能を追加して行こうと思ってます。
>>347
unsignedはunsigned int
352エディタ製作中@クソ初心者:02/09/09 02:27
>>349
あ・・・コンパイラの設定で回避しないとダメなんですか・・・?
でも、おかしいですよね・・・
こんな比較、他でもしてるのに、それらは警告が出ない・・・
・・・なんだか、納得行かないです・・・(汗
353エディタ製作中@クソ初心者:02/09/09 02:29
>>351
ありがとうございます!
警告がなくなりました!

そうですね・・・unsignedだけだとint型になりますね・・・
これも、俺の不注意でした・・・
ありがとうございました。
354 :02/09/09 02:44
>>353
どう見ても、型が違うのだが。strcpyに渡してるってことは、
txt[sy+i]はchar*だろ?
355 :02/09/09 02:47
>>345
つーか、そもそもロジックが変だろ。
一文字削除なら、strcpy(&txt[sy][sx], &txt[sy][sx + 1]);
だけでできると思うのだが。
35660cm浮き上がるストレート:02/09/09 02:56
>>327
ShowZenkakuSuuzi(scanf("%d",suuti),space);

void ShowZenkakuSuuzi(int suuti,int space)
{
  int waru=10000;
  int showAtta=0;
  int absuuti=0;
  absuuti=abs(suuti);
  for(waru=10000;waru>0;waru/=10)
   &ndsp;if(absuuti/waru==0 && showAtta==0)
   &ndsp;  if(space>=waru) printf(" ");
   &ndsp;  else printf("");
   &ndsp;else
   &ndsp;{
   &ndsp;  if(showAtta==0) if(suuti<=-1) printf("−");
   &ndsp;    printf("%c%c",(absuuti%(waru*10)/waru+0x824f)>>8,absuuti%(waru*10)/waru+0x824f);
   &ndsp;   &ndsp;showAtta=1;
   &ndsp;}
}
35760cm浮き上がるストレート:02/09/09 03:01
ndsp>>nbsp

ShowZenkakuSuuzi(scanf("%d",suuti),space);

void ShowZenkakuSuuzi(int suuti,int space)
{
  int waru=10000;
  int showAtta=0;
  int absuuti=0;
  absuuti=abs(suuti);
  for(waru=10000;waru>0;waru/=10)
    if(absuuti/waru==0 && showAtta==0)
      if(space>=waru) printf(" ");
      else printf("");
    else
    {
      if(showAtta==0) if(suuti<=-1) printf("−");
        printf("%c%c",(absuuti%(waru*10)/waru+0x824f)>>8,absuuti%(waru*10)/waru+0x824f);
        showAtta=1;
    }
}
>>357
ndspって…w
┐(´ー`)┌
360エディタ製作中@クソ初心者:02/09/09 03:09
>>354
すみませんでした・・・
後々、その辺がバグとなって、それに気づきました・・・(汗
ご迷惑おかけしました。

>>355
あ・・・それでできますね・・・。
・・・う〜ん、もっとがんばって経験積みます(汗
なにぶん、クソ初心者ですんで・・・・(涙

一応、一文字削除機能も付いて当初の目的を果たしました。
またサーバにバイナリ&ソースを上げてますので・・・
もし、よかったら覗いてやってください。
また、何かお気づきの点やバグなどありましたら、
教えていただけるとありがたいッス・・・。

ここまで作れたのも、みなさんのおかげッス!
本当に感謝してます。沢山勉強になりました!
ありがとうございました!
361 :02/09/09 03:10
>>357
> ShowZenkakuSuuzi(scanf("%d",suuti),space);
この呼び方だと-1,0,1のどれかしか表示されないわけだが。
ネタにマジレス
カコワルイ
>60cm
だからお前のコードはゴミ水準だとあれほど。。。。
int main ()
{
  char ch;
  char ch2[3];

  scanf("%c", &ch);

  ch += 0x1f;

  ch2[0] = 0x82;
  ch2[1] = ch;
  ch2[2] = '\0';

  printf("%s", ch2);

  return 0;
}

・・・・・。
365364:02/09/09 05:24
>>364
間違えた・・・

×ch += 0x1f;
○ch = 0x1f;
36660cm浮き上がるストレート:02/09/09 05:30
>>357の訂正など
suutiは-32768~32767、spaceは0,10,100,1000,10000。
spaceはスペース。suutiが整数3桁でspaceが1000なら一桁分スペースが入る。

scanf("%d",&suuti);
ShowZenkakuSuuzi(suuti,space);

void ShowZenkakuSuuzi(int suuti,int space)
{
  int waru=10000;
  int showAtta=0;
  int absuuti=0;
  absuuti=abs(suuti);
  for(waru=10000;waru>0;waru/=10)
    if(absuuti/waru==0 && showAtta==0)
      if(space>=waru) printf(" ");
      else printf("");
    else
    {
      if(showAtta==0) if(suuti<=-1) printf("−");
        printf("%c%c",(absuuti%(waru*10)/waru+0x824f)>>8,absuuti%(waru*10)/waru+0x824f);
        showAtta=1;
    }
}
ゴミを増やすな!
>>355
重なり合う領域のstrcpyの結果は
保証されてなかったような気がするのだが。

間違ってたらごめんよ。
36960cm浮き上がるストレート:02/09/09 05:47
>>366の訂正

spaceは0,10,100,1000,10000。

spaceは1,10,100,1000,10000。

if(absuuti/waru==0 && showAtta==0)
にさらに
 && waru!=1
を追加。0オンリーを表示するためです。
370364-365:02/09/09 05:49
・・・ch=0x1fって要らないです。
もう間違えまくりだ・・・鬱
ZeroMemoryされた構造体が
本当に空(0で埋め尽くされている)かどうか
調べるにはどうしたらいいのでしょう・・・?
372 ◆k/Ubp.Kg :02/09/09 06:23
みんなテンパってるな…おつけち。
>>371
なんでそんなことする必要があるの?
ZeroMemoryはmemsetのマクロとして定義されている
のが普通だと思うが、このライブラリ関数が
信用できないとでも?
374651:02/09/09 07:04
C言語45秒クッキング
int check_zero( const void *source, size_t size)
{
 const char *p = (const char *)source;
 while( size-- > 0 ) { if( *p++ != 0 ) return 0; }
 return 1;
}
>373
コンストラクタでZeroMemoryした構造体に
もし何も代入されていなければ
即座にfalseを返すメンバ関数を作りたいんです
ゴメン、読み落とし

>374
それって構造体が8bitアライメントされてないと
おかしなことになりません?
というか、やっぱり自前で走査しないとダメなんですか・・・

ポインタとサイズ渡したらゼロクリアされてるか調べる
関数(マクロ)くらいあると思ってた・・・
>>375
その程度のことは人に頼らず自分でやれ
>それって構造体が8bitアライメントされてないと
>おかしなことになりません?

8bitアライメントって何。新語か?
>>376
それくらい自分で調べられないならC言語やめたほうがいいんでは?
                 ┌─┐
                 |も.|
                 |う |
                 │来│
                 │ね│
                 │え .|
                 │よ .|
      バカ    ゴルァ  │ !!.│
                 └─┤    プンプン
    ヽ(`Д´)ノ ヽ(`Д´)ノ  (`Д´)ノ    ( `Д)
    | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄  . ̄◎ ̄   ̄◎ ̄   ◎−>┘◎
381デフォルトの名無しさん:02/09/09 13:15
ANSIが標準規格を策定する以前はvoidというキーワードはなかったんですよね?
値を返さない関数はどう書いていたのですか?void *はchar *で代用していたらしいですが。
>>381
戻り型を省略。
初心者丸出しな質問ですが、
なぜCの標準ライブラリ関数やシステムコールやソケットなどの関数は
引数の並び方やエラーの場合の戻り値に統一性がないのですか?
途中で追加するにしても、たとえばエラーが-1なら-1で通すとか…
ソレが後方互換性というものです。
Javaマンセー(W
>>383
> なぜCの標準ライブラリ関数やシステムコールやソケットなどの関数は
> 引数の並び方やエラーの場合の戻り値に統一性がないのですか?
CはANSI-Cの規格が策定される前はC言語には仕様がないため乱立状態であった。
それをANSI-Cで互換性をもたしつつ、ある程度の統一性を持たしたある意味妥協の産物だ。

また、正確にはシステムコール、ソケットなどの仕様はPOSIXでありCの仕様ではない。
これもUnix乱立期に制定された仕様であり、多少の統一性がないのは仕方がない。

そしてこの仕様を変更するとそれに伴う混乱や過去の資産の変更が大きすぎる
残念ながら、マニュアルを注意深く読む習慣をつけるしかない。
>>385
とりあえずおいらは関数使うたびにmanしています。
387デフォルトの名無しさん:02/09/09 14:47
1?1?1?1?1?1?1?1?1?1?0:1:0:1:0:1:0:1:0:1:0;
388383:02/09/09 15:57
>>385
ありがとうございました。
それぞれに、実は深い意味があるのかなと思っていたので、助かりました。
>>386
それしかないのですか…残念。
>>386
たまに「この関数こんな戻り値返してたんだ」と新鮮な驚きを得ることあるよな。
390 ◆k/Ubp.Kg :02/09/09 16:08
>>389
分かる分かるw フッと細かい仕様が気になっていつもテキトーに使ってる関数とか見たりすると
謎の返値が….
関数名書くと、下の方にニョロっと引数と戻り値が出るエディタって
無かったっけ??

VBはできたよね...
IntelliSense?
ちなみにprintf()の返り値はintですが、
返り値を見ているプログラムは見たことありません。
lintで警告が出てきますが無視です。
394デフォルトの名無しさん:02/09/09 17:07
>>393
(void)printf("はろーわーるど\n");
こうすれば出なくなるかもしれないけど阿呆みたいだよな。
fprintfなら戻り値を見ることがあるかも。ないかも。
自分の始めての仕事は、lintに怒られないようにひたすらコード中に
キャスト入れてくって仕事でした。
#define printf (void)printf
>395
有用なようで無用な仕事だなそれ。
ちなみにマヌケなキャストをしてたところを憶えてたら公開キボンヌ
>>387
0
399デフォルトの名無しさん:02/09/09 20:57
以前、サンプルプログラム見ていて

int v1, a;
: /* 中略 */
v1 = !!(a == 100);

という式を見たときは唸ってしまった。
C++なら、operator!しか定義してなくて、
if( !!object )
みたいな事態が、、
以前、サンプルプログラム見ていて

  for(;!!!!! ~~~~~~ !!!! ~~~~~~!!!!i;) {
  }

というループを見たときはちびってしまった。
>387
#include <stdio.h>
main(){
printf("%d",1?1?1?1?1?1?1?1?1?1?0:1:0:1:0:1:0:1:0:1:0);
return 0;
}
============
OUTPUT : 0
>>400
#define if(expr) if(!!(expr))
#define unless(expr) if(!(expr))
まともなエディタ作るには1年はかかる
405 ◆k/Ubp.Kg :02/09/09 21:26
>>402
一々プログラム書かなくてもパッと見て分かるじゃん。三項演算子の条件式、全部真だよ?
ハンガリー記法でcharをcNumとかにしてもいいですか?
C南無。
>>406
ここはC言語のスレなので、ハンガリー記法の事を教えるスレではないと思われ。
>>407
ありがとん
>>408
ごめんね
お詫びにかつおぶしご飯,明日は食べるの我慢するよ
410デフォルトの名無しさん:02/09/09 23:32
C言語はどのくらいできればマスターしたといっていいのでしょうか。
僕は結構いい線いっていると思うのですが。
>>410
C言語の関数をすべて覚えて、
すべての関数の挙動を把握していればマスター。
あくまで、C言語マスター。

C言語マスターしたからって、プログラムがうまく作れるとは限らない。
412 ◆k/Ubp.Kg :02/09/09 23:37
>僕は結構いい線いっていると思うのですが。
と言う時点で痛いヤシ。一人でOS作れるくらいなら流石にマスターかと思うが(藁

# ネタニマジレス…カナ
>v1 = !!(a == 100);
って何やってるの?
v1 = (a == 100); と、どう違うのかマジ分からん
v1 = ((!!a) ^ (!!b)); なら分かるが
414あ〜、わかりません・・・:02/09/09 23:40
 「2002年の月と日を入力して、2002年1月1日から、
入力された月日までの日数を求めるプログラムを作成しなさい」

という問題で、
各月の日数でグループにわける
入力された月の前の月までは、各月の日数を1月から順に全部加えたら
いいのかな・・・と思ったんですが・・・・
思ったっだけで肝心のプログラムを書けませぬTT
 こんな複雑な問題、if文とwhile文ぐらいしか習ってない
私にはとけやしないよう〜と泣き叫びたいっす。

 簡単ですか?これ?我が儘をいわせて頂ければ、
プログラムを書いて貰って・・・参考書片手に研究したい・・・。
>>414
スレ違い。

宿題手伝いますYO!!
http://pc3.2ch.net/test/read.cgi/tech/1029422194/
416あ〜、わかりません・・・:02/09/09 23:50
>>415
 失礼しました。情報サンクスです
417デフォルトの名無しさん:02/09/09 23:52
>>409
お詫びならばマヨネーズご飯を食らえ
>>414
time()で通し秒数を求めて、3600で割ればいいだろ?
2002年1月1日からの。
localtime()とかこのへん使えば簡単にできる。
419あ〜、わかりません・・・:02/09/10 00:02
>>418
418さん、ヒントどうもです。
・・・しかしヒントを全く理解出来ていない私が情けない・・・。
time()localtime()とかってのは今まで見たことなくて。
なんせ週1の一時間授業では・・・12回しかしてないし。

 とりあえずは「簡単にできる」もんなんすね。
ブチブチ愚痴ってる間に調べようよ(笑)
何の為にインターネットへ繋いでるのよ

まぁたぶん>419はプログラマに向いてないよ
> time()で通し秒数を求めて、3600で割ればいいだろ?
24*3600の間違いですだ。ハイ。
422あ〜、わかりません・・・:02/09/10 00:57
>>420さん
 あい、言えてます。全く不向きでした。
自分が、英語アレルギーな時点で気づくべきでした。
しかしこの授業を取ってしまったからには、
最低の成績でも単位をもらいたい・・・。

421さん
 あ、わざわざどうもです
>>414
int nissuu2002(int m, int d)
{
  const int t[] = {0,31,59,90,120,151,181,212,243,273,304,334};
  return t[m-1]+d-1;
}
こんなので我慢しとけ。残りの処理は自分で作れ。
激しくスレ違いを承知で聞きたいんですが
エディタ作成者さんみたいにフローチャート描こうと思うと
やっぱりSVG対応ドロー系だと思うんですが、フリーで良いのないっすか?

調べてみたんですがビューワしか見つけられませんでした。
425420:02/09/10 01:06
>422
検索エンジンの使い方もしらないのかな・・・
ポインタくらい出しときゃよかったよ

http://tyrant.chem-eng.kyushu-u.ac.jp/2nd/Programming/Library/Main.asp

標準関数なんて英語できなくても
リファレンスはいっぱいあるよ
426 ◆k/Ubp.Kg :02/09/10 01:09
>>424
何もSVG対応が必須ではないと思われ。もちろん、可搬性の高いデータ形式だからSVG対応なのに越した事はないけど。
大抵のメジャーなソフトならプラグインあるから問題ないっしょ。多分一人で使うんだろうし。それよりも使い勝手を
重視する方が良いかと思われ。

# ドロー系ツールは使わないので具体的な意見が言えなくて申し訳ない
427デフォルトの名無しさん:02/09/10 01:16
>>424
Dynamic Draw + SVG Inp&Exp Plugin
ttp://www.molips.com/jp/
>>424
俺が使ってるツールは、すんごく使いやすいッス。
ヘルプ読まなくても、直感で使えますよ。
ただ、ちょっとキツイバグがいくつかありますが・・・
9月の中旬にバグを一掃したバージョンを公開予定らしいので・・・
かなり、お勧めです。

・・・ここで、URL公開すると作者さんに迷惑かな・・・?
429888:02/09/10 01:28
3元連立一次方程式をGauss-Jordan法で解けという問題がありまして、一応プログラムは書いたんですが、対角成分が0の時に他の行と入れ替える操作をがどうしてもできません。
どうしたらいいのでしょうか。ぜひ教えてくださいっ!!!
むずい
あと宿題スレではない
日本語の処理法について詳しく解説しているサイト教えてくれー
「c言語 日本語 処理」とかのキーワードで検索かけても
出版社の書籍紹介ページばかりヒットしやがる
> 日本語の処理法について詳しく解説しているサイト教えてくれー
このスレじゃ不満なのか?
434 :02/09/10 02:03
>>432
「日本語の処理」て何だ?
構文解析なのか、形態素解析なのか、コード変換なのか、
マルチバイト文字列の扱いなのか、その他なのか?
435424:02/09/10 02:07
皆さん、ありがとうございます。

>>426
ドロー系を使うときは花子を使っているんですが、
簡単な立体図はこれでOKなんですが・・・。

>>427
ダウンしてみました。かなり良い感じです。
ありがとうございました。

>>428
「h」抜きで・・・はダメっすかね(w
何か検索のヒントとなるようなものを・・・。
436デフォルトの名無しさん:02/09/10 02:13
fwriteを使って配列をファイルに書きこむ、26番目の要素から変な値が入ってしまいます。

8年ほど前、MSDOSとMS-Cを使用していたときにも、全く同じことがありました。
その時は、配列の値全てに0を入れていたはずなのに、書き込まれたファイルを見ると
26番目から謎の値が入っていました。2徹しても原因がつかめず、
あきらめてfprintfとループを使いました。
それ以降fwriteを使う機会がなかったのですが、今回8年ぶりに使ってみて
同じことが発生しました。
437432:02/09/10 02:15
>>434
マルチバイト文字列の扱い かな

プログラミングをするにあたって一般的に(?)使われている単語が身についていないんで
疑問、質問をうまく表現できないっつーか、なんと言うか
438 :02/09/10 02:16
>>436
使い方を間違えているか、プログラムがバグっている。
>>436
そうですか。了解しました。
440 :02/09/10 02:26
>>437
「マルチバイト文字 先頭バイト」あたりでぐぐってみ。
>>435
俺のエディタ置いてるHPに、何かあるかもしれません・・・(w
442432:02/09/10 02:37
>>440
さんきゅう
google先生に聞いて見ます
443プログラム歴2ヵ月:02/09/10 02:53
Cから始めたんですが難しすぎっす 
ポインター理解不可能
誰か教えてくれまつか?
頭わるい、むいてないはなしで
始めて2ヶ月なら理解できなくても不思議はない。
良い入門書でも読んで理解を深めてくれ。
char *h[26]={"a","b", ... ,"y","z"};
printf( h[i] );

formatでないものをprintfのformat部分に
渡すのは問題あるな。
>>446
おいおいなにいってんだ
printf関数は、char型ポインタを取ります。
>>446が正しい。
>>445を正しく動かしたければフォーマットをしていする。

printf("%c", h[i]);

ネタにマジレスですか?(w
449448:02/09/10 03:21
いや、ちょっと待て。
ポインタで定義してるじゃん・・・
漏れが悪かった。
450プログラム歴2ヵ月:02/09/10 03:22
最初に、VisualC++入門を買って意味解らずすてますた
探しまくって現在、初めてのC言語って本をなんとか読んでます
他に超簡単な入門書おしえて(ρ_;)
単に"%s", h[i]にしる、ってことでわ。
452デフォルトの名無しさん:02/09/10 03:50
ポインタで定義?format?いったい何の話なんだよ
漏まえらなんかきらいだー。・゚(≧Д⊂;゚・。
453436:02/09/10 04:25
配列を一気に全部書き込まずに、ループで一個ずつfwriteしても
同じでした。書き込みは正常に行われているみたいですが、
feofを使って調べてみた結果、26回目以降のfreadは
ファイル終端に達したと判断されて読み込んでいないみたいです。
なぜだ・・・
>>447

自分の参加しているプロジェクトのチームリーダー(30代後半)のプログラムをこの間覗いたんです。

そしたら・・

function(CString l_cstr)
{
CString cstr;
cstr.Format("%s", l_cstr);

何とか言ってやってください。
>>453
じれったい。
ネタはいいから早くタネを明かしてくれよ。
ネタじゃないなら該当のソースを見せろ。
456デフォルトの名無しさん:02/09/10 07:54
教えて下さい
以下のように宣言した場合

#define MAX 100
struct field{ int data;
struct field *pt;
}node[MAX],*head;

上記において、node[MAX]という変数はstruct fieldという型だとわかるんですが、
では *head はどういう型を持つ事になるんでしょう?これも同じ型ですか?
457デフォルトの名無しさん:02/09/10 07:55
>>454
なにがだめなの?
constの参照私じゃないから?
ちょく代入しないから?
たいした問題じゃないよ
458デフォルトの名無しさん:02/09/10 08:05
>>456
*headはただのポインタ。
char *pStr
と同じ。
>>456
char c, *p;
というふうに続けて書くと、
char c;
char *p;
と同じ意味になる。
struct field {...} node[MAX], *head;
の場合は、
struct field {...};
struct field node[MAX];
struct field *head;
と同じ。こういう省略はC言語特有のスタイルなのだが、嫌う人も多いと思う。
>>457
Cで言えば、strcpyを使うべき所で、
わざわざsprintf("%s", ...)してるという事ではないか
おっとsprintfの引数が。まいっか
462 :02/09/10 08:17
>>453
バイナリモードって知ってる?
463424=435:02/09/10 10:37
>>441
ありがとです。
464デフォルトの名無しさん:02/09/10 11:19
typedef struct{
char a1[3][3];
int a2;
int a3;
}A;

という構造体のサイズをsizeofを使って調べると20になってしまう。
本来なら17になると思うのですが。。(私の環境ではintは4バイト)
どなたかよきアドバイスを!
>>464
構造体のアライメント、で検索するよろし
>>464
パディングやアラインメント
をキーワードに今すぐgo!
>>464
俺の環境だとsizeof(A)は256になるね(sizeof(int)は4)
http://www.catnet.ne.jp/kouno/c_faq/c2.html#13
2.13:
構造体にsizeof演算子を使ったら、私が思っていたよりも大きな大きさを返して
きた。まるで、おしりに詰め物がしてあるようだ。
469デフォルトの名無しさん:02/09/10 11:29
>>465,466
産休!気になってしょうがなかった
470デフォルトの名無しさん:02/09/10 11:30
>>468
末尾に詰め物がされることはあっても、メンバー間に詰め物がされることはないんだっけ?
>>470
んなことはない。ネタだったらごめんよ。
472デフォルトの名無しさん:02/09/10 11:33
>>471
いや、マジ質問・・・
どこに詰め物がされても実際にプログラミングするうえでは困らないんだけど、ちょっと興味あるから。
たぶん、ビットフィールドにすればキッチリ詰まるのかな?
ビットフィールドか・・・
なんか構造体みたいな形だったような・・・それとマルチバイト文字のところは全然勉強していないな-_-;
475471:02/09/10 11:54
>>472
たとえば、464 の構造体の場合、
コンパイラのデフォルト設定では
char a1[3][3];
の直後に3バイトとか7バイトの隙間ができる方が
俺的な世界においては一般的だと思う。(もちろん処理系にもよる)
476473:02/09/10 11:57
なんか配列はビットフィールドにならないぽ
詰めたいと思う動機がサパーリわからんのですが
>>477
バイナリファイルに保存する時とか。
>464
(char)(char)(char)(----)
(char)(char)(char)(----)
(char)(char)(char)(----)
(    int      )
(    int      )
char : 1バイト
int : 4バイト
(----)の部分が埋められカウントされて20になるのでしょ。
(int)の長さに合わせる為になる。
というか、一番長い部分に合わせなかったっけ?(char,int longのレベルで)
構造体の大きさの計算はこんな感じになるはずだと思ったけれどね。
charのサイズを[2][4],[5][5],[4],[8],[9]とか替えてみれば
大体の法則性と言うものが見えてくると思うけれどね。
結果はsizeof(A)/sizeof(char)で出しているかな?
今回は悩むことも無いけれど、sizeof(int)で
割った数値を使ったりすることもあるからね。
>>479
> (----)の部分が埋められカウントされて20になるのでしょ。
ネ、ネタだと言ってくれ。頼む。
> 結果はsizeof(A)/sizeof(char)で出しているかな?
ネ、ネ 以下略。
>>479
配列の内部は断片にならないと思うぞ。マジレス
参考までに、MinGWのgccでchar a1[3][3]をsizeofしたら9と出た。
483456:02/09/10 14:12
464さん、激サンクス
gcc で x86 なら4バイトアラインメントだから、

(char)(char)(char)(char)
(char)(char)(char)(char)
(char)(--------------)
(------- int --------)
(------- int --------)

こうでしょ。
で、構造体を直接操る必要があって、かつプラットフォーム非依存にしたいときは、

typedef struct {
char a1[3][3];
char padding[3]; /* unused */
int a2;
int a3;
} A;

とかしておく。
............で、あってる?
>............で、あってる?
AAの部分だけは合ってるよ。他は×。
486484:02/09/10 14:30
>485
>AAの部分だけは合ってるよ。他は×。
まじ?......(´・ω・`)ショボ-ン
487デフォルトの名無しさん:02/09/10 14:32
ファイルからgetcで一文字ずつ読み込んで,読んだ文字によってifで処理を変更させる
プログラムを書いているんですけど,改行文字の直前に謎の文字が入っており,
処理がうまくいきません.printf等で表示させても何も見えません.
この謎の文字の正体は一体何なのですか??
488デフォルトの名無しさん:02/09/10 14:33
>>487
シラネーヨ
ソース出せ。
489485:02/09/10 14:33
>>486
あ、ごめん。
>gcc で
の箇所を見落としてたので謹んで訂正する。

前半は合ってるよ。
後半は×。
その方法ではプラットフォーム依存の解決にはならない。
490488:02/09/10 14:33
ソースじゃなくて読み込むファイルの中身か。。。
\r\n
>>491
ということはあいつ、バイナリモードで開いているのか・・・
つりし?
printfで数字列にすれば分かると思う。>>487
> printf等で表示させても何も見えません.

書式指定して数値で確かめろよ。
そうすれば13って表示されるよ。
495436=453:02/09/10 14:38
>>462
ありがとうございます!!!
8年越しの謎が解けました!!
大解決です!!
>>495
ま、まじで?
>>495
UNIX使え。
498487:02/09/10 14:45
>>491-494
解決しました.マジで助かりました.
ありがとうございます!
499デフォルトの名無しさん:02/09/10 15:44
srand()の種に、WindowsAPIのtimeGetTime()のようなミリ秒単位の値
をLinux上で使いたいのですが、代わりのようなものはあるでしょうか?
gettimeofday
502デフォルトの名無しさん:02/09/10 18:42
Rubyは?
>>502 釣り禁止
504デフォルトの名無しさん:02/09/10 20:04
MICROSOFTのVC++6.0のPROには、
最適化できる機能がありましたが、
VC++NETのStandard Editionには
最適化の機能がありますか?
そんな事知りませんよ。マイクロソフトに聞いて下さい。
Standardには常に無い
507デフォルトの名無しさん:02/09/10 20:29
関数の戻りを無視する時、
(void)foo();
とvoidにキャストするのは正義ですか?悪ですか?好みの問題ですか?

コードレビュー時に、後輩にどうアドバイスするか決めかねているので
仕様ではこうなってるなど、なにか良い根拠があれば教えてくださいませ。
>>507
正当だが悪。
509507:02/09/10 20:32
>>508
俺も嫌いな書き方なんだけど、例えばsplintは(void)つけないと警告出してくるので、
俺が悪なのかなぁと。

で、どうなの?
510Musasi:02/09/10 20:34
仕事がんばって見つけてください
age
何日か目を離しただけで、もう500オーバーしとる…
lintにかけるのはやめようよ・・
>>507
memsetやstrcpyも戻り値は存在するけどその返り値を見てますか?
514507:02/09/10 20:37
ふだんsplintなんて使ってられないけど、明日は指導するフリをしなきゃいけないんで………
>>509
社の方針に従え。
我が社では糞。
516507:02/09/10 20:38
>>513
なんか煽られ気味だなぁ。じゃぁ(void)なんて書くなヴォケ、死ねDQNと言っておきます。
>>513
strcat(s1,strcat(s2,s3));ってのがあったらしいぞ w
素直にsprintf使えって w
518指導する練習:02/09/10 20:44
>>517
snprintf (or equivalent) 使え
>>518
はい(´・ω・`)
lispっぽくていいじゃん。おれもそうやって書くことにします!
lispっぽいとイイのか。へえ
522デフォルトの名無しさん:02/09/10 21:43
すみません、ちょっと教えて欲しいんですが。
523デフォルトの名無しさん:02/09/10 21:52
>>522
ちょっと待ってね。
うんこがでません。どうしてですか?
>>524
知りません。

次の方ー
526522:02/09/10 22:23
すみません。そろそろ質問してもいいでしょうか?
駄目
528522:02/09/10 22:36
まんこって実在するの?
529522:02/09/10 22:45
そろそろ質問してもいいでしょうか?
530デフォルトの名無しさん:02/09/10 22:48
>>522
ん?全然面白くないぞ。
531522:02/09/10 22:50
すみませ〜ん、誰かいますか?
(-1: 荒らし)
>>522
質問があればぜひこちらでどうぞ。

http://pc3.2ch.net/test/read.cgi/tech/1029763932/
「質問してもいいか」という質問が再帰的に行われ、
その先には進めなくなると言ってみる。
536デフォルトの名無しさん:02/09/10 23:00
main関数の戻りはexitとreturnで返すのでは何か違いがあるんでしょうか?
537デフォルトの名無しさん:02/09/10 23:10
>>536
exitを使えばプログラムないのどこからでも強制的に終了できる。
return でexeを終了するにはmain関数からしかできない。
多田それだけ。
>>536
C-FAQでは基本的に違いは無いと言っている。
/bin/ladin
>>536
abortっつーのあるぞ。興味があれば調べれ。
raise()でSIGTERM送っても終了するんだったかな。
>>541
デフォルトの挙動では、な。
>>537-542
ありがとうございました。
544デフォルトの名無しさん:02/09/10 23:55
オーバーロードってどうやるんですか?
>>544
オーバーロード自体を知って訊いてるのかと小一時間
上書き?
オーバーマインドってどうやるんですか?
プリプロセッサで、言語自体が拡張できるとは、どういう意味でしょうか?
C言語はどんなに拡張してもC言語だと思うのですが。
C++はなしでお願いしますm(_ _)m
>>548
その話は忘れろ。
無かったことにしろ。
>>548
Pascalみたいにみせるマクロ群とか・・・
拡張しているわけではないけど。
http://www.pro.or.jp/~fuji/computerbooks/c/cprepro.hayashi.html
Cプリプロセッサ・パワー C言語の秘められた能力を解き放つ
552デフォルトの名無しさん:02/09/11 00:09
ま た 林 晴 比 古 か
>>548
そういうことに興味持つ香具師はちょっと勉強してC++でテンプレートメタプログラミング汁。
いまのところだれもテンプレートの悪用だとかなんだとか言ってないからよ(w

俺には理解できないのでsage
554548:02/09/11 00:23
>>549
え…そうなんですか?
>>550
そこまでできたら、確かに拡張した「っぽい」ですね。
>>551
参考になりました。
>>553
だからC++は…
555552:02/09/11 00:24
>>554
俺だけ無視かよ!
いいよもう!
教えてやんないから!
>>554
何でC++はあかんねん?
VBよりも遅いから。
おまえらにはりかいふのうだから
while(1)
{
 if( num[pos[cnt].y][pos[cnt].x] == 0 ) return;
 else{
  cnt++;
  if( cnt == max ) break;
 }
}

while文の中で,returnをするとやばいでしょうか?
どういう動作をするのでしょうか?
>>561
別にやばくない、関数の呼び出し元へ返るだけ
breakで抜けなくてもいいんだ。
うーむ。
他に問題があるようです。
がんばります。
バグの原因ハケーン。
&&じゃなくて,||だった。
これでも年収120万円もらってるのに・・・。
日本人の平均の1/3以下だ。気にスンナYO!>564
>564
ごめん、漏れ安心しちゃった(藁)
まだ下がいた
年収120万ってバイトだよね?
「0一つ抜けてた1200マソです」
という釣りではないか?
学生なら120マソでもいいと思うけどな。んま、漏れは学生んときでも3-400万は
貰ってた気がするが。
いや、実は 564はShowA師で、有名になって仕事が来たので
早速自慢してみた。
57260cm浮き上がるストレート:02/09/11 04:04
僕はゲームで、<conio.h>のgetch()とkbhit()を使い
2468でカーソル移動、+で決定、-でキャンセルを行えるようにしています。
そこで質問です。カーソルが
→名前の入力
の時決定ボタンの+を押すとscanf()かgets()を使ってゲームユーザーに
名前の入力をさせるのですが、scanf()やgets()に入るときに前に入力した
+が入力するところに入ってしまっています。
解消する方法を教えてください。
>>572
おまいは「2chで得た知識だけでゲームを作れるか」という壮大なネタを展開してるのか?
>>571
飲み物ですか?
// ヘッダ [hoge.h]
struct Data_monna_tag
{
char showa[100];
int age;
}

// グローバル領域 [hoge.c]
static struct Data_monna_tag Data_monna={"",-1};

hoge(){
---
---

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
エントリポイントがhoge.cにない場合(hoge.c->hoge.soとかで)で、
functionの中でなく、char *showaを初期化する方法ってこれしかないですか?
できれば文字列リテラル""による静的記憶域の消費を抑える為に
showa[0]に'\0'入れたいんですけど。
576デフォルトの名無しさん:02/09/11 09:57
↓これ、動く環境と動かない環境があるんですけど。
            __,,,,_
            /´      ̄`ヽ,
            / 〃  _,ァ---‐一ヘヽ
         i  /´       リ}
          |   〉.   -‐   '''ー {!
          |   |   ‐ー  くー |
           ヤヽリ ´゚  ,r "_,,>、 ゚'}
         ヽ_」     ト‐=‐ァ' !
          ゝ i、   ` `二´' 丿
              r|、` '' ー--‐f´
         _/ | \    /|\_
       / ̄/  | /`又´\|  |  ̄\
578デフォルトの名無しさん:02/09/11 10:10
↑つまり環境は、都内でも緑に囲まれて静かなところ。
>>575
> char showa[100];
文字列リテラル""による静的記憶域の消費は気にするのに
静的記憶域に配置した構造体変数のサイズは気にしないのは何故?
>>575
この場合、初期化されたData_monnaが用意されるだけで、それとは別に
文字列リテラル""が用意されることはないと思うんだが。
>>572
ちゃんとgetchして + を検出したのなら、
余計な + は入力バッファに残らんと思うのだが?

例:
if (kbhit() && getch() == '+') { ... }
58260cm浮き上がるストレート:02/09/11 15:33
>>581こんな感じのコードです。
#include <stdio.h>
#include <conio.h>
void ShowCursol(int *,int *,int,int,int,int,int,int,int);
void MakeInputName(void);
void main(void)
{
  int y=0,x=0,get=0;
  printf("\x01b[2J\x01b[>1h\x01b[>5h");
  printf("\x1b[3;1H→");
  printf("\x1b[23;73H終了");
  printf("\x1b[13;33H名前入力");
  printf("\x1b[14;33H<=16Bite");
  printf("\x1b[1;31H名前:名無し");
  printf("\x1b[25;27Hカーソル移動12346789 決定+");
  for(;;)
  {
    if(kbhit()!=0) get=getch();
    else get=-1;
    if(get>='1' && get<='9')
      ShowCursol(&y,&x,5,10,3,1,4,7,get);
    if(get=='+' && y==2 && x==3)
      MakeInputName();
    if(get=='+' && y==4 && x==7) return;
  }
}
58360cm浮き上がるストレート:02/09/11 15:34
>>582の続き
void ShowCursol(int *y,int *x,int yUp,int xUp,int yBasis,int xBasis,int yMax,int xMax,int get)
{
  printf("\x1b[%d;%dH  ",*y*yUp+yBasis,*x*xUp+xBasis);
  *y+=1-(get-49)/3;
  *x+=(get-49)%3-1;
  if(*y<=-1) *y=yMax;
  if(*y>yMax) *y=0;
  if(*x<=-1) *x=xMax;
  if(*x>xMax) *x=0;
  printf("\x1b[%d;%dH→",*y*yUp+yBasis,*x*xUp+xBasis);
}
void MakeInputName(void)
{
  static char name[17]="名無し";
  printf("\x1b[2;31H入力:");
  printf("\x1b[>5l");
  scanf("%s",name);
  printf("\x1b[>5h");
  printf("\x1b[1;37H                ");
  printf("\x1b[1;37H%s",name);
  printf("\x1b[2;31H                      ");
}
カーソルはcursor
>>411
いまさらだけど、こいつアホだ。
586デフォルトの名無しさん:02/09/11 15:57
>>585の方がもっとアホだ。
>>582
相変わらず見辛いコードだな
>>582
たしかにそういう現象が出た。(MinGWのgccのなんちゃってconio.h)
なんか、10年くらい前にも似たような状況に出くわした記憶があるような
気もするのだが、わからん。

それはそうと、荒いコードだな。
589デフォルトの名無しさん:02/09/11 18:35
DWORDの定義は
typdef unsigned long DWORD;
こんなカンジですか?
WORDはintより6倍遅い
                      と言ってみるテスト
> DWORDの定義は
何のDWORDの定義よ?
Win32ならそれでいいんじゃないの。
592DQN初心者2号:02/09/11 19:12
すみません。もし良かったらアドバイスください(´・ω・`)ショボーン

ノードによるリスト構造で、入力した数字を末尾に追加していく
プログラムを作ってみますた。そこで、数字を追加するたびに
malloc関数で領域を確保していくようにしますた。

実行してみると、動作は問題ないのですが

NULL pointer assignment
(ポインターがNULLを指し示している??????)
          

とかいうメッセージが実行後に出ます。
これは、何か問題があるのでしょうか?
うまくメモリが解放されていないということなのでしょうか?

もしよろしければ、おしえてください・・
longのサイズは環境依存、ワードサイズも環境依存
>>592 バグ。以上。
>>592
ソースを。
free(NULL);
>>595
いらない
>>592
> これは、何か問題があるのでしょうか?
リスト構造の解体をしてる箇所がおかしいのに1票

free()してる箇所をコメントアウトして
変なメッセージが出てこなくなるか試して見ろ。

599DQN初心者2号:02/09/11 19:31
>>592 のソースです。おながいします


前略
struct node{
    int num;
struct node *next;
};
typedef struct node NODE;
NODE *start =NULL;
int main(void){
int data;
while(1){
printf("数字をにゅうりょくしてください\n");
scanf("%d",&data);
if(data == 0)break;
writ(data);
disp();
}
delpointer();
return 0;
}
600DQN初心者2号:02/09/11 19:31
void writ(int data){
NODE *new,*p=start;
while(p->next != NULL){
p=p->next;
}
new= (NODE *)malloc(sizeof(NODE));
new->next=NULL;
new->num=data;
p->next = new;
if(start == NULL)start=new;
}
void disp(void){
NODE *p = start;
while(P != NULL){
printf("%d-",p->num);
p = p->next;
}
printf("\n");
}
void delpointer(void){
NODE *next,*p = start;
while( p != NULL){
next = p->next;
free(p);
p=next;
}
}
601DQN初心者2号:02/09/11 19:34
>>598
前と変わりませんですた。
> while(P != NULL){
なぜ大文字 P ?
void writ(int data){
NODE *new,*p=start;
while(p->next != NULL){
p=p->next;
}
...
if(start == NULL)start=new;

start == NULLなら、最初の p->nextで ぬるぽ。
うむ。たしかにページ違反が出るな。

コンパイル時に警告もわんさか
605DQN初心者2号:02/09/11 19:47
えっと・・・
(´・ω・`)ショボーン
そっか、警告はプロトタイプ宣言がなかったからだ。スマソ
607DQN初心者2号:02/09/11 19:56
前略した部分は

#include<stdio.h>
#include<stdlib.h>
void writ(int data);
void disp(void);
void delpointer(void);

としますた・・・
まあ、いろいろ考え方はあるけど、startの前にひとつダミーの要素を
くっつけとくとか、ポインタのポインタを使うとか
609デフォルトの名無しさん:02/09/11 19:59
NODE *start =NULL;
  ・
  ・
  ・
  NODE *new,*p=start;
  while(p->next != NULL)  ここだすね
普通は「末尾の要素へのポインタ」とかを持っておくものだと思うが、
そのへんはいーのか
611DQN初心者2号:02/09/11 20:03
うーんと・・・

アドバイスいただいたところを中心にもう一回やってみます。
夕飯時に有難うございますた。
ダミー要素を使う例:
NODE root = {-1, NULL};
...
void writ(int data){
NODE *new,*p = &root;
...
void disp(void){
NODE *p = root.next;
...
void delpointer(void){
NODE *next,*p = root.next;
...
ポインタのポインタを使う例:
void writ(int data){
NODE *new,**pp=&start;
while(*pp != NULL){
pp = &(*pp)->next;
}
new = (NODE *)malloc(sizeof(NODE));
new->next = NULL;
new->num = data;
*pp = new;
}
ちなみに、関数writは効率が悪いので、もし宿題ならやめたほうがいい。
末尾へのポインタを持っとけ
615DQN初心者2号:02/09/11 21:01
>>614
有難うございます。
大変参考になりますた。


追伸
宿題ではないです。perlを覚えたのでステップアップして
C言語勉強してます。只今、就職浪人中です(´・ω・`)ショボーン
616デフォルトの名無しさん:02/09/11 21:44
質問です。
エキスパートCプログラミング 知られざるCの深層
p321ページで、変数が符号付かどうかをチェックするプログラム
(マクロ)を書けというのがあります。

#define ISUNSIGNED(a) (a >= 0 && ~a >= 0)

では駄目みたいなのですが、正しいプログラムを
教えてください。
>>616
基本的には、ちゃんと動いたぞ?
まあ、マクロの書き方としては不十分だが。
--------------------------------------------------
#define ISUNSIGNED(a) (0 <= (a) && 0 <= ~(a))
main () {
  signed int s = 123;
  unsigned int u = 123;
  printf ("signed %d\n", ISUNSIGNED(s));
  printf ("unsigned %d\n", ISUNSIGNED(u));
}
--------------------------------------------------
signed 0
unsigned 1
--------------------------------------------------
618デフォルトの名無しさん:02/09/11 22:06
>>617

本文によると、K&R Cでしか動作せず、
ANSI Cでは新しい格上げ規則が適用されるため、
これではうまくいかない、とのことです。

ちなみに、ANSI Cではcharは符号付き、符号無し
どちらでもかまわないことになっているので、
そういったものを判定する際に用いるとのことです。
619デフォルトの名無しさん:02/09/11 22:10
>>616
なんのために使うマクロかさっぱりわからん。
同感
>>618
char だけなら...

#include <limit.h>
#define ISCHARSIGNED (CHAR_MIN != 0)
622デフォルトの名無しさん:02/09/11 22:18
CとC++だったらどっちをやったほうがいいですか?
自分的にはC++だと思うんですけど…
>>622
スレ違い。
C++
なら C++ やれば?
>>622
このスレではその質問にフェアな答えは出るまい
626622:02/09/11 22:20
C++に逝ってきます
フェアな答えはあるのだろうか、と。
C++の本ってCくらい分かっているものとして書かれているものが多いね。
CマガジンのC++講座もそうだし。
NOTがダメならXORでやればばよさそうだが。
#define ISUNSIGNED(a) ((a) >= 0 && ((a) ^ (unsigned)-1) >= 0)
630629:02/09/11 22:48
あ、超マヌケだ俺。
氏んできます。ごめんなさい。
お前ら、6chの投票で祭やらんのですか?

632デフォルトの名無しさん:02/09/12 00:10
仕事で必要なんですが、C言語を使って、Oracle,DB2,SQLserverに接続する仕方を知ってる方いらっしゃいましたら教えていただきたいのですが。
それぞれのベンダがインターフェース提供してるだろ。
OracleならPro*C/C++
634 :02/09/12 00:19
oo4o
>>632

>>635
つながりました!
ありがとうございます

これで今週末の納期に間に合うよ
637 :02/09/12 02:19
a=0;
b=0;
c=2;
( a == 0 || ( b == 1 || c == 2 ) )
この時の,
( x1 || ( x2 ) )
のx1,x2の評価はどういうふうに評価されますか?
x2がTRUEの場合,a == 0 || TRUE という事?
>>637
評価順に依存しないような素直なコードを書けばそんなのどうでもいい。
x2は評価されないんじゃ?
>>637
左から評価されて、true || x2 となる。
これはx2と関係なく常にtureなので、x2は評価されない。
>>637
&&と||は左オペランドから評価され、それにより真偽が判定される場合、
右オペランドは評価されない。らすぃ
>>637
> ( a == 0 || ( b == 1 || c == 2 ) )
aが0じゃなかったら(b == 1 || c == 2)が評価される。

> x2がTRUEの場合,a == 0 || TRUE という事?
なんかそのまま書き換えただけのように見えるが、何を考えてる?
>>637
そうか?大量のifのネストは嫌だぞ。
>>638-643
すんげー役に立ちました。
ありがとうb
>>643
そうッスか?
俺は多少大量になってもifをネストします。

ifの長文の条件式の方が見にくくて嫌いッスけど・・・。
言うまでもないが、実用上はこういう意義がある↓
int l = light(); // 軽い判定処理
int h = heavy(); // 重い判定処理
if (l && h) {...}
とやるよりは
if (light() && heavy()) {...}
のほうが、heavy を無駄に呼ばない分、効率的。
ただし、副作用がある場合には注意が必要。もちろん || でも同じ事。
>>646
あと、int同士でも
if(a && b && c){}
で、c(右)に行くほどfalseになることが滅多にない変数すると効率いいね。
648646:02/09/12 03:55
>>647
普段はそっちのほうが重要な。
このへんはさすがにコンパイラ任せには(今のところ)できない。
しかし>>646はふつう if の入れ子にするかもしれない罠
sprintfで変数の中身表示するときに
8bitは255までだからmax3桁
16bitは65535までだからmax5桁
・・・
と決め打ちしてchar temp[4];とかしてもOKですか?
(4なのは'\0'分余計に取ってるつもり)
>649
マイナスは考慮しなくていいの?
素直に snprintf 使った方がいいんじゃないかな?
>650
snprintfを知りませんでした。ありがとう。
>>649
いい。実際はもっと取った方がいいけど。
>>651
snprintfは(略)
653デフォルトの名無しさん:02/09/12 09:55
char a=255;
a++;

としたら、aが0になることは仕様として保証されてますか?
>>653
オーバーフローしてマイナスになるんじゃなかったっけ?
って言うか、signedのcharは、255まで行かない・・・。
って言うか、オーバーフローを期待する処理って見たことない・・・。
655デフォルトの名無しさん:02/09/12 10:13
>>653
いない。
char型が8bitである保証はない。
656653:02/09/12 10:25
>>654
おっと、unsigned char の間違いでした。
その場合は255の次は必ず0になりますかね?
>>655
K&Rを見たらchar型は1バイトと書いてあったから
(対してintは「自然な大きさ」と書かれている)
charのバイト数は省略して書かなかったんですが……。
一応char型が1byteだと仮定して話してます。
>>656
1byte = 8bit
とは規定されてないんじゃなかったっけ?
658プレゼント:02/09/12 10:49
TOTOのHP、この一番下の「便座・便ふたワンタッチ着脱」
のムービー見てみてよ。思わぬところに。。。(*´Д`)
http://www.toto.co.jp/products/toilet/t00016/02.htm
>>658
ゴチになりますた。
>>658
もっと刺激がほしかった・・・
661デフォルトの名無しさん:02/09/12 12:11
>>656,657
ANSI C言語辞典第一版の付録?のハードウェア特性一覧によれば
Hoheywell 600 のCHAR_BITマクロつまり1バイトのビット数は9だったそうな。

ANSIでCHAR_BITなんてマクロが定義されている以上は可変なんだろやっぱ。
int a;
としたとき
sizeof(int)

sizeof(a)

意味・処理ともに違いますか?
>>655
> char a=255;
char型に255の代入結果がどうなるかは処理系定義
コンパイラのマニュアルに聞け

>>662
結果は同じだが意味は
a += 1; a = a + 1;
と同じぐらい違う
664デフォルトの名無しさん:02/09/12 13:29
#include <stdio.h>
#define num 5

int main(void)
{
FILE *fp;
int num,i;

fp=fopen("test1.bin","rb");

if(fp==NULL){
printf("ファイルをオープンできませんでした\n");
return 1;
}

printf("何番目のデータを読み込みますか?(1〜5)\n");
scanf("%d",&i);

fseek(fp,(i-1)*sizeof(int),SEEK_SET);

fread(&num,sizeof(int),1,fp);

printf("%d番目のデータは%dです。\n",i,num);

fclose(fp);

return 0;
}

ある参考書にのってるソースなんですが、
コンパイル全然できません。何がおかしいんでしょうか?
厨房ですがお願いしますだ。
>>664
使用しているOS、コンパイラ、それに
どのような方法でコンパイルしてみて
どのような結果になるのかを書け。
>>664
#define num 5
を削除。

ど ん な エ ラ ー が 出 た の か く ら い 書 け よ 。
>>664
 1. コンパイラが入っていない。
 2. ソースを入力していない。
 3. コンパイルの仕方が判らない。
のどれかでしょう。つか、
> コンパイル全然できません。
だけで何が起こっているのか他人に判るとお思いか?
と思ったら何なのこれ?

>#define num 5

>int num,i;

ネタだったのか、くそ!
669デフォルトの名無しさん:02/09/12 13:43
いやネタじゃないっす。リア中です。
LSI-cで、コンパイルしたっす。
OSはウインドウズっす。

iが未定義と山ほどでたっす。

でも解決しました。
アホみたいなこと書いてすんません。
参考書のソース>ネタw
670デフォルトの名無しさん:02/09/12 14:31
突然ですが、質問があります。
C言語のプログラムで、キー認証を行うためのプログラムは、どのようにして組めばよいのでしょうか?
お答えいただければ幸いです。
char s[256];
puts("キーを入力してください >");
fgets(s,sizeof s, stdin);
if (strcmp(s,"1234")!=0) {
puts("キーが不正です");
exit(1);
}
672デフォルトの名無しさん:02/09/12 16:47
依存関係を示すインクルード文はどこに書いてる?
ヘッダ? ボディ?
#includeならコメントを除けば一番上に書いているけど。
実際そういう場合 sizeof(型) 派と sizeof(変数) 派ではどちらが多いのだろう。
>>674
どれに対するレスだよ。
>>662-663あたりに関して>>675
>>676
俺は型だな。
でも配列の要素数を求める時はsizeof 先頭の要素で割っている。
ソケットとか、Windowsの構造体とか、
ライブラリやAPIが要求する場合は型のサイズ、
それ以外は変数
679677:02/09/12 17:18
そういえば型だと変数の型をintからshort intに変えた時などにsizeofのところも変えないといけなくなるな・・・
>ソケットとか、Windowsの構造体とか
よろしければ理由も教えてもらえますか?
>>680
大抵ポインタだから。
なるほどその場合は明らかに両者の結果が違ってしまうケースなので
仕方がないですよね。基本的には sizeof(変数) ってことですね。
>>682
つられんなよ。ポインタでも sizeof *pでOKだろ。
684デフォルトの名無しさん:02/09/12 17:34
質問です。
横に40個並んだ数値データの列が100行あるデータファイルがあります。
データの一つ一つは5桁の整数で、これを配列に格納したいのです。
1 2 3 1 1.............(40個)
(100行)

いったいどうすればいいのでしょうか?
fscanf(fp,"40%5d" a[i][j] j=1,40);
なんていうのは無理なようですが......。

どなたかお助けを。
変数というか式になりますかその場合。
686デフォルトの名無しさん:02/09/12 17:36
>>684
一行に確実に40個数字があるの?それぞれの区切り文字は半角スペース?
というか、どちらでもいい。つまらん論争だな。
688デフォルトの名無しさん:02/09/12 17:42
>>686
数字は確実にあります。Fortranから吐かれたでーたで、半角スペースも
1桁とかぞえて、5桁です。
^^^24^^^12^^^^1.......
(^は半角スペースのつもり)
fscanf(fp,"%d%d%d%d.........(40個ならべ、それぞれ変数に格納しる)

というしかてがないのでしょうか?
>>684
俺ならfreadを使う。それとatoi系の関数。
>>689
fgetsとstrtolの方がよくない?多分strtolは数字のあとの空白で変換を終えてくれるとおもうから。
691690:02/09/12 17:47
strtolの第二引数をうまく使えばいいと思うんだよね。
692689:02/09/12 17:47
>>690
ありがと。書き込み時刻からわかると思うけど、
俺のレスは 684を読んだ時のものです。
693690:02/09/12 17:48
>>689
なぜfreadを薦めたのかわかった。
なるほどね(笑) よく>>688を読んだら分かった。
>>688
for(i = 0; i < 100; i++) {
  fgets(buf, sizeof buf, fp);
  for(j = 0; j < 40; j++) {
    sscanf(buf,"%d", a[i][j]);
  }
}
じゃ駄目なの?
695684:02/09/12 17:50
>>693
皆様、レスありがとうございます。

でもfreadを使う方がいいのか分からない........。
>>695
何桁だろうとスペースで補って5文字なんだろ?
ならfread使えばいい。
697684:02/09/12 17:55
>>696

fread使ったことがないですが、やってみます。
>>694
こちらの線も試してみます。

(Fortranはこういう時だけ便利なんだけどなあ。)
freadで5バイトずつ読みとってからatoiで数値にして変数に格納。これを40回繰り返してから改行文字を読み飛ばす。
という作業を100回繰り返せばよいのかな。
699698:02/09/12 17:59
×5バイトずつ
○5バイト
700684:02/09/12 18:01
>>698
改行文字を読み飛ばすのはどうするんですか?
>>700
fgetsとか・・・
まあ改行文字数分fseekしてもいいけど。
702684:02/09/12 18:04
>>701
ありがとう。
やってみます。
703698:02/09/12 18:06
あ、そうだ。
5バイト読みとったあとに終端に\0をつけないと。
最初にbuf[5]に\0を入れておいてもいいかな。
退屈です。仕事をください。
externのプロトタイプ宣言ってつけた場合とつけない場合とどう違うのですか?
extern宣言の場合、とあるプロジェクトのソース見たら引数が違ったのですが。
こんな感じで・・・

---a.c---
extern int hoge();
---------
---b.c---
int hoge( int hoge ){...}
---------
706デフォルトの名無しさん:02/09/12 22:16
memsetをつかうと警告で”プロトタイプ宣言の無い関数の呼び出し”
といわれてしまうのですが.........。
707デフォルトの名無しさん:02/09/12 22:19
>>705
デフォルトでexternだからつけてもつけなくても同じ

>>706
string.hをインクルード
708707:02/09/12 22:20
あくまでも「extern」を。だからね。
709デフォルトの名無しさん:02/09/12 22:22
いくら欲しい?
ちなみにプロトタイプ宣言の引数リストが省略されると関数呼び出しでどんな引数リストにしてもコンパイルでひっかからないはず。
711706:02/09/12 22:25
>>707>>710
ありがとう。スッキリしました。
712bloom:02/09/12 22:34
713705:02/09/12 22:38
>>707
そうなんですか。ありがとです

>>710
そいつは初耳ですた。
714デフォルトの名無しさん:02/09/12 22:54
おれの能力を100とすれば710の能力は30ぐらいだな。
C++厨がいる模様。
716684:02/09/12 23:23
freadの使い方はなんとなくわかったのですが....。
横40、縦126に並んだ5桁ずつのデータをmallocで動的に確保
した3次元配列に格納しようとしています。
イメージとしてはx[i][j][k]です。

for(i=0 ; j<1 ; i++) {
for (j=0; j < 128 ; j++ ){ // セクター範囲ループ
fread(x,sizeof(int),40,fp1); // レーダー雨量の読み込み
printf("%d\n",x);
}
}

メモリの確保は成功しているようなのですが、読み込むときに
”メモリがreadになることは出来ませんでした"といわれます。
なぜでしょうか(T_T)。
717684:02/09/12 23:24
>>716
コメント消し忘れた...鬱欝....。
> fread(x,sizeof(int),40,fp1)
fread(x[i][j],sizeof(int),40,fp1);

int x[2][128][40];
と仮定
719684:02/09/12 23:29
>>718
多謝!多謝!
720718:02/09/12 23:30
あれ?
int x[1][128][40];
か?
718は25くらいか
C++厨は可及的速やかに去ってください。
723デフォルトの名無しさん:02/09/12 23:36
>>716
そのxは何?(^_^;)
724684:02/09/12 23:36
>>720
本当は、i=720,j=128,k=40のデータなのです。
今は簡単のため、i=1にしています。

あっ!>>716

for(i=0 ; j<1 ; i++) {

になってた。
これ

for(i=0 ; i<1 ; i++) {

欝鬱蔚....。
725723:02/09/12 23:38
もしかして、xってint型?
freadの第一引数はvoid *だよ(^_^;)
>>716
一番外のループの判定はi使ってるよね?
727684:02/09/12 23:39
>>723
忘れて下され......(汗)
多分freadの機能を勘違いしているんだと思う。
729684:02/09/12 23:43
>>725
あ、私の勘違い。(xのデータの意味を聞かれているのかとおもった。)
え、ということは、型キャストかなにかしなければいけないのですか?
ネットで調べたら
double data[256];
fread( data, sizeof(double), 256, stream );
というように使ってあったのですが。

>>726
はい。iです。
>>729
いや、ポインタならいいんだけど、printfで%dなんてやっているからint型かと思った。
int x[720][128][40];
fread(x, sizeof(int), 720 * 128 * 40, fp1);
ひょっとしてこうか?
732デフォルトの名無しさん:02/09/12 23:49
#include <stdio.h>
int count_bits(unsigned int x){
int count = 0;
while (x){
if (x & 1U) count++;
x>>=1;
}
return (count);
}
int int_bits(void){
return (count_bits(~0U));
}
void print_bits(unsigned int x){
int i;
for (i=int_bits() - 1;i >= 0; i--)
putchar(((x>>i) & 1U) ? '1' : '0');
}
int main (void){
unsigned int nx;
printf("非負の整数を入力してください:");
scanf("%u",&nx);
print_bits(nx);
putchar('\n');
return 0;}
// --------------------------------
上記のプログラムでunsigned なら動くのですが
unsigned int を全て int に変えると動きません。
エラーメッセージも出ないので無限ループか何かに入ってるようです
なぜだかわかりますか?
↓なんか、やってること変わってない?

684 :デフォルトの名無しさん :02/09/12 17:34
質問です。
横に40個並んだ数値データの列が100行あるデータファイルがあります。
データの一つ一つは5桁の整数で、これを配列に格納したいのです。
1 2 3 1 1.............(40個)
(100行)
734732:02/09/12 23:50
ちなみに入力にはいづれの場合も正の整数を入力しています

環境は
コンパイラ:Borland C++
OS: Win2k
です
>>732
処理系によっては論理シフトが算術シフトになるから?
・・・・きっと的はずれなこと言っているな・・・・
736684:02/09/12 23:53
>>730
ありがとう。
>>731
え、そうなるんですか?
改行されているのですが、freadは無視して読み込んでゆくのですか?
>>733
データの列は100⇒128になりました。
freadがよいというのでやって見ているのですが.....どうも
うまくゆきません。
>>736
freadで5文字分をchar型の配列に読み込んでからatoiで変換するんだってば。
>>735
多分そう。
>>732
count_bits() のループ内で、x の値がどう変わっていくか調べると判ると思う。
最初にfreadを薦めた人の考えは、
「一行の構造が決まっているから、改行文字以前の部分は
一気に固定長の文字配列に読み込んでから変換すればいい」
って事だと思う。

それがなぜか、intの多次元配列に直接読み込んでる。
ご冗談を。。
740684:02/09/13 00:06
>>737
>>739
ああ、ワカリマスタ.....。
有難う、やってみます。

当方Fortran厨だったもので、Cの文字列の扱いがどうにも
苦手です。ただただ、データファイルの整数値を読みたいだけ
なのですが(涙)Fortranなら
 read(fp1,'40d5') a[i][i][k] k=1,40
でスミマスのに.......。
741デフォルトの名無しさん:02/09/13 00:07
C の 無 能 さ が ま た 証 明 さ れ ま し た
742684:02/09/13 00:10
>>741
いえ、私が無能なだけです(鬱
739は28だな。
char buf[40 * 5 + 1];
buf[40 * 5] = '\0'; // 末尾に車止め
...
for (i =...
  for (j =...
    fread(buf, sizeof(char), 40 * 5, fp1); // 5桁が40個
    for (k = 0; k < 40; k++)
      x[i][j][k] = atoi(buf[k * 5]);
...
こういう意味だよね?
いや、>>28は俺だ。
>>743 26ですが、何か
間違えた
> x[i][j][k] = atoi(buf[k * 5]);

x[i][j][k] = atoi(buf + k * 5);
または
x[i][j][k] = atoi(&buf[k * 5]);
でもまてよ、5桁の最上位が必ず空白であると仮定しているんだけど、
これって本当かな
749744=747 :02/09/13 00:19
改行の読み飛ばしは適当にやってね
>>748
仮定してないでしょ?
10000以上の数だったら空白はないはず。
>>750
そか、じゃあ、5文字ずつやんなきゃ駄目だね。
752684:02/09/13 00:23
>>744>>747
あ、なんか動き出しました。
いけそうな予感がします。
しかし”車止め"ってのは一体...。
>>748
実はそうなんです。
でも正直、「何も考えずにscanf(系)を使え」が正解だと思うのだが
>>752
ん?ということはある数をxとして、0 <= x <=9999か?
>>752
ありゃそうなのか。じゃああとは、改行の読み飛ばしだけか。
>>752
「車止め」というか null terminator とか何とかいうんだけど、
C言語の文字列は、末尾に 0 コードが入っていないといけない
757デフォルトの名無しさん:02/09/13 00:27
753は10ってとこだな。
758684:02/09/13 00:28
>>753
私も初めは
fscanf(fp,"%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d\n",a[i][j][1],a[i][j][2].....);
考えましたが、これはあまりにも......。
>>754
整数値はせいぜい3桁どまりです。

759 :02/09/13 00:29
車止め・・・・、初めて聞いた。
どこか地方の方言?
760732:02/09/13 00:29
>>735
>>738
なるほど、今助言から調べてみましたが
そうでした
ありがとうございました
761デフォルトの名無しさん:02/09/13 00:31
番兵ちゃうのん?
あんまり関係ないけど、
char (*token)[5] = buf;
という、5文字単位に切り直したポインタを使うと、
> x[i][j][k] = atoi(&buf[k * 5]);
これが
x[i][j][k] = atoi(token[k]);
となって、見やすいかもしれない。。。けどどうでもいいな、こりゃ

scanfマンセー
763デフォルトの名無しさん:02/09/13 00:43
東京は雨が降ってきたみたいです。
このスレは雨天休業です。
>761
ちゃう
765732:02/09/13 00:46
いややっぱり違うっぽいです
#include <stdio.h>
int main (void){
int x;
printf("非負の整数を入力してください:");
scanf("%d",&x);
x >>=5;
int i;
for (i=32-1 ;i >= 0; i--) // intは32bit
putchar(((x>>i) & 1U) ? '1' : '0');
putchar('\n');
return 0;
}
これを実行してみたところ(値は5ぐらいを代入)
全て0になりました。算術シフトはされていないようです。
766デフォルトの名無しさん:02/09/13 00:47
764は8か
767732:02/09/13 00:48
intの右シフトが算術シフトなら
上位ビットは1になるはずですよね?
しかも代入している値は正の数ばかりですので
最上位ビットも1ではありません。

どなたか間違いのわかるかた
よろしくお願いします
>765
たぶんそこじゃなくて count_bits() 関数のことを言ってたんだと思うけど......
>>767
いくつかあるループのうち、どこで無限ループになるのか書いてくれればバグの発見も早いわけだが。
> scanf("%d",&x);
> x >>=5;

えっと、32より小さな値は無視?
あ、64かな
773デフォルトの名無しさん:02/09/13 00:51
LEAVE命令とFPOデータではどのくらい処理速度が変わってくるのでしょうか。
概算でいいので教えていただけないでしょうか。
>>773
そんな命令(?)がCにあったっけ?
775732:02/09/13 00:52
>>769
x>>=1; の部分ですか?
それならこの方法でもわかると思いますが違うのでしょうか?

>>770

ちょっと試してみます
776732:02/09/13 00:53
>>771
右シフトすると上位が1になるか確かめるためです
とりあえず右にシフトしたかっただけで
5自体に特別な意味はありません
>>732
↓これの

int count_bits(unsigned int x){
int count = 0;
while (x){
if (x & 1U) count++;
x>>=1;
}

int cout_bits(unsigned int x)

int count_bits(int x)
にすると無限ループになるって話じゃないのかな(わかんないけど)?
778732:02/09/13 00:55
>>769
count_bits 関数のことでした
なぜここだけint にすると問題が出るのでしょう?
わからないです
FILE *fp;
int i,j,k;
int x[1][128][40];

fp = fopen("filename", "r");

for(i=0; i<1; i++)
for(j=0; j<128; j++)
for(k=0; k<40; k++)
fscanf(fp, "%d", &x[i][j][k]);

fclose(fp);

780732:02/09/13 00:55
>>777
そうです。そのとおりですが何がおかしいのかわかりません
算術シフトって、
「シフトすると最上位ビットが1になる」んじゃなくて、
「シフトしても最上位ビットは変わらない」だと思うが。

「算術シフトはされていない」という言葉の意味がわからなかったので、
よく読まずに書いてみるテスト
int型を受け取るcount_bitsにINT_MAXよりも大きな値を渡したら無限ループにならない?
>732
>>777 だけど、
x には 111.....111 が渡されるから
これをいくら算術シフトしても111....111のままで無限ループ
784732:02/09/13 01:05
確か算術シフトは最上位ビットで
シフトして動かした部分が埋め尽くされることだったと思います

>>777
での unsigned を除くとエラーがでることが不明です。。
>>784
算術シフトじゃなくて算術"右"シフトな。
どちらにしろ最上位ビット(符号ビット)は変わらないだろ。
786732:02/09/13 01:07
>>784
なるほど、完全にわかりました。
ありがとうございました
(-1 >> 1) == -1 であることを踏まえると、
x = -1 から初めて x >>= 1 を何度か繰り返しても、
決して x == 0 にはならない。
よって↓は無限ループに陥る

while (x){
  if (x & 1U) count++;
  x>>=1;
}
オソカッタ
ビット数が分かっているのなら指定回数ループすればいいのに。
790789:02/09/13 01:11
いや、この場合はきっと可変か・・・
791789:02/09/13 01:12
つっこまれそうなんで一応・・・
11000と1011000などで桁数が違うってこと。
792732:02/09/13 01:12
>>786>>783の間違いでした

>>787
ありがとうございました

>>789
いやbit数をだす練習もかねてのプログラムですから。。
>>779
それが正義というものだよな。
なんで三重配列なんだろう。
795684:02/09/13 01:23
>>779>>793
え!それでできるんですか?
(ちょっとやってみます)

>>794
(x,y,t)みたいなデータなのです。
796684:02/09/13 01:25
fread()のやりかたで結構うまくいっているのですが
データがずれて読み込まれています...。
(ああ、明日までに終わるか)

for (i=0 ; i < t ; i++){

buf[40 * 5] = '\0'; // 末尾に車止め
for (j=0; j < 128 ; j++ ){
fread(buf, sizeof(char), 40*5, fp1); // 5桁が40個
for (k = 0; k < 40; k++){
x[i][j][k] = atoi(&buf[k*5]);
dummy = x[i][j][k];
if( dummy > 0 ){
printf("%d %d %d\n",j,k,dummy);
}
}

}
}
>>796
だから「改行を読み飛ばしなさい」とあれほど。。。
fscanf(fp1, "\n"); とかでできるような気がする。嘘かもしれないが
あくまでもfreadなどの低レベルな関数に拘るなら、
fseek(fp1, 1, SEEK_CUR); または fseek(fp1, 2, SEEK_CUR);
で、改行コードの分だけ送り出す
>>796

freadで一行を一気に読み込んでどうするのよ。freadで5バイトずつ読めって言ったでしょ。
一行を一気に読み込むのならばfgetsでいいと思う。
800799:02/09/13 01:42
正確に言えば「freadで改行文字を除いた一行を一気に」だな。
> freadで5バイトずつ

それはどういう御利益があるのか
>>801
省メモリー
というかその方がわかりやすいでしょ・・・
> その方がわかりやすい

fscanfの方がわかりやすいもんねっ
>>803
それはまた別の話だよ。
freadを使った場合に限って。
200バイトを省メモリーって、ネタですよね?
>>805
うん。それはね。
関数呼び出しがけっこう増えるぞ
一行読み込んでもいいけれど、fgetsにしろっての。
809684:02/09/13 01:51
混乱してきました......。

とりあえず、freadの線でやっています。
改行を読み飛ばすすべを教えてください。
(fscanf(fp1, "\n"); では駄目でした)
>>809
freadじゃなくてfgetsで読めば改行の読み飛ばしなんて考えなくていい。
ただしバッファはもう少し多く取ること。
>>809
bufを少し大きくして、fread を fgets(buf, sizeof(buf), fp1) に置き換える
812684:02/09/13 01:55
>>810

わかりました。
fgetでやってみます。(もういわれるがまま.......。)

あと、みなさんも有難う。
fgetsでタイムアウトってねーの?
fgets(buf,sizeof(buf),fp1)じゃなくてfgets(buf,40*5+2,fp1)の方がいいかも。
確かバッファはmallocで獲得しているとか言っていたし・・・
fgetsで1行読み込み。
読み込んだ文字列に対して strtokで文字列切り出し。
切り出した文字列を atolなどで数字に変換。
を行数分繰り返す。

が楽だと思うけど。
Perlを使うのが楽だと思うけど。
while (x){ xだけは危険。
とか書いてみる。
strtok で、区切りは空白?
>684
>>779 じゃダメなの?
>>817
だね。\nを入れてもいいけど。意味無いけど。
820684:02/09/13 02:19
>>818
!!いけました.....ああ。
(なんということだ)

でも色々勉強になりました。
これを機に、文字列の扱いも勉強してみます。
有難うございます。
> strtok
切り出さなくても桁がそろってるそうだから、
atoi(&buf[k * 5])でいいらしい
822684:02/09/13 02:21
(でも、まだ終わりじゃないんです。)
823デフォルトの名無しさん:02/09/13 02:22
int main(void) {
  int *p, rt;
  rt = fnc_1(p);
  // その後fnc_1()で入った値を使う
}
int fnc_1(int *p) {
  int i; // 毎回iに違う値が入る.......
  p = (int *)malloc(i * sizeof(int));
  // pに適当な値が入る。 *p = 1;*(p + 1) = 2;.....
  return 1;
}
の場合、fnc_1()が終わった時点でmalloc()で確保した領域は開放されて
しまって、後でmainのほうでは値を見ることができないのでしょうか?
結論=やっぱり正義(scanf)は勝つ
>>823 ネタですよね?
>>823
> fnc_1()が終わった時点でmalloc()で確保した領域は開放
んなことはない。が、

> int i; // 毎回iに違う値が入る.......
> p = (int *)malloc(i * sizeof(int));
i を初期化せずに使って大丈夫なのか?
>>826 それは値が入るって書いてあるじゃん
>823
static i=0;
i++;
とかにしないと・・・
mainのpとfnc_1のpは別物だからね。
fnc_1内のそれらは、毎回初期化される。
iは使い物にならないと思うよ。
>>828 あーなるほど、そういう話だとすれば辻褄があうな
てか思いっきりメモリリーク
>>830
必ずしもそうではないと思うけど、議論は長くなりそうなので略。
>>830 俺も初めそれ疑ったけど、省略してあるので何ともいえん
833デフォルトの名無しさん:02/09/13 02:42
わかった。int **pp だ
int main(void) {
  int *p, rt;
  rt = fnc_1(&p);
  // その後fnc_1()で入った値を使う
}
int fnc_1(int **pp) {
  int i; // 毎回iに違う値が入る.......
  *pp = (int *)malloc(i * sizeof(int));
  // .....
  return 1;
}
もし引数によってアドレスを返したいなら、
「受け皿のポインタpへのポインタpp」が渡らなければならない
訂正:「受け皿のポインタpのアドレスpp」
837デフォルトの名無しさん:02/09/13 03:43
mod_cってなんですか?
838773:02/09/13 07:57
俺は放置プレイですか?
774を放置してるからでない?
>>839-840
晩婚
842773:02/09/13 08:15
774を見逃していた。
アセンブラの命令の話です。これもここでいいんだよね。
誰がそんなことを?
844最初のfread提案者:02/09/13 10:51
>>820
fgetsを使うくらいなら freadを使っておけ。
つーか、fgetsをすすめる奴らは
とりあえず動けばそれでいいのか?
例外時のケースも少しは考えろ。

それから、fseekは効率が悪いので、
fgetcで改行コードを確かめる方がベター。

はあ、昨日は退屈すぎて寝ちまったんだよ。仕事をください。
845684:02/09/13 10:56
初歩的な質問で申し訳ないのですが
48330000,山田川,59,129,177.0,3971.5,0.0,0.0
というデータを読み込むのに
fscanf(fp2,"%d,%s,%d,%d,%f,%f,%f,%f\n",&mesh,&sdummy,&range,§or,&fdummy,&fdummy,&fdummy,&fdummy);でだめなのはどうしてでしょう?
printf("%d\n",range);
とやると
4251844
という値が出てきてしまいます。
>>845
rangeじゃなくてsdummyの内容を確認してみれば、理由が分かると思う。
847684:02/09/13 11:06
>>846
printf("%s\n",sdummy);
とすると
山田川,59,129,177.0,3971.5,0.0,0.0
ということは.....。

>>844
こちらのやり方も今度マスターしてみます。
(いまのところ私にはむずかしすぎるようです)
848684:02/09/13 11:08
自己レスfscanf(fp2,"%d,%6s,%d,%d,%f,%f,%f,%f\n",&mesh,&sdummy,&range,§or,&fdummy,&fdummy,&fdummy,
&fdummy);
としてできました。ありがとう。
if(a != 0 && (b != 0 && c != 0) )
 continue;

の時に,
aがTRUEで,
bかcがFALSEの時は,continueが実行されません
continueが実行されるようにするためにはどうしたらいいのでしょうか?
%s
で、読み取る時に、','以降まで、読みとって整合性が無くなるのはよくある話し。
>>849
ifの行を削除。
真理値表書いてどの時、continueしたいのか書いたほうがいいかもしれないけど、
&&=>||でいいんじゃない?
aがTRUEって、a!=0がTRUEのこと?
a!=0がTRUEのことです
(b!=0,c!=0)

(T,T)(T,F)(F,T)(F,F)[T:TRUE,F:False]
の、どの時、continueしたいの?

さらに、A!=0がTRUEの時は、常にcontinueを、実行したいの?
if(a != 0 && !(b == 0 && c == 0) )
 continue;

で無理やり解決しました

>>851-852
ありがとう
>>854
a!=0がTRUEの時でも,
b == 0 と c == 0の片方がTRUEになった時に抜けるんじゃなく,
b == 0 と c == 0の両方がTRUEになった時に抜けるようにしたかったんです
!(b == 0 && c == 0) は ( b != 0 || c != 0 ) と等価なんだが。
↓まあまあ、そうツッコむなよ。
859858:02/09/13 11:30
くそ、一歩遅かった。
>>857
ってことは,
b == 0 と c == 0の両方がTRUEになった時でも
FALSEになると?
>>858-859
オモシロイ(w
if(a == 0 || (b == 0 && c == 0) )
の条件にならない時に,continueしたかったんですが
if(a == 0 || (b == 0 && c == 0) );
else continue;
や、
if(!(a==0 || (b == 0 && c == 0) ) )continue;
if( a!=0 && !(b== 0 && c == 0) )continue;
if( a!=0 && (b != 0 || c != 0) )continue;
などが等価だと思われます。
864684:02/09/13 11:58
すべてのデータが
39341725,山田川,66,83,198.0,4584.3,0.0,0.0
と思っていたら、ところどころ
39341726,-該当なし-,-,-,-,-,-,-
というデータが入っていました。
"-該当なし-"のデータは飛ばしたいのですが
上手い判定の仕方がわかりません。
予めbufに読み込んでから長さを測るのですか?
(カンマも含めて一行のデータの長さは固定です。)

結構膨大なデータなので時間がかかりそうな....。
>>864
Cでやってるならstrtokとかで
>>844
freadで一行を一気に読むコードを書いたやつに言えよ。
俺はfreadで一行を一気に読むくらいならfgetsを使えと言ったんだ。

ところで、例外ってどんな例外?
>>864
if(*dat[1]=="-該当なし-")
  continue;
じゃなくて?
該当なしの時、その後のデータにも'-'が入っているのなら
if(*dat[2]=='-')
  continue;
で、出来ないの?
その前に取りこんでから、isdigit等を使うのかもしれないけれど。
やっぱ、strtokがいいんじゃないの?
char *p;
gets(in);
p=strtok(in,",");
for(i=0; i<8; i++){
〜〜〜〜
 &nbswpp=strtok(NULL,",");
}
869デフォルトの名無しさん:02/09/13 13:37
int i;
*(&i)=0;
というコードがあったんですけど、i=0;とどう違うんですか・・・?
>>844
fread/fgets論は興味ないので見てないけど、
いまどき、これくらいの処理で効率を気にするか?

例外云々もこれがどういうところで使われるのかによるし。
数回手動で動かせばいい、問題あったらその場で手直しできる
ようなプログラムなら、とりあえず動けば全く問題なし。
871デフォルトの名無しさん:02/09/13 13:39
標準入力から読み込まれた
テキストの最初の12行だけを表示するのを作りたいんだけど
何かヒント下さい…。さっぱり分かりません…。

見た目と書く奴の神経が違うだけ。
873デフォルトの名無しさん:02/09/13 13:41
>>871
改行文字を数える。
874684:02/09/13 13:41
>>865
>>867

ありがとう。
できました。
>>869
見た感じ同じだと思うが、
書いた本人に意図を確認するのが一番確実だと思う。
>>870
お前の書いたプログラムはせいぜい学習用だけに
使ってくれ。間違っても外部に公開するな。
877デフォルトの名無しさん:02/09/13 13:43
なるほど…。
有り難うございます。
自分用の使い捨てプログラムにわざわざ様々なエラー処理を施すやつもあまりいないと思うよ(笑)
>>871
fgetsを12回。
>>878
同意。
>自分用の使い捨てプログラム
誰もそんなことは言ってないが?
882デフォルトの名無しさん:02/09/13 13:48
>>879
なるほど。どうもすみません。
あれだけしっかりとフォーマットの決まっているファイルなら、エラー処理なんていらないと思うんだが・・・
884871:02/09/13 13:51
えっとたびたびすいません、では、
実行プログラムの名前が myhead でそれがカレントディレクトリに存
在するとすると,
myhaed < ~/.cshrc
というコマンドの出力結果が
head -12 < ~/.cshrc
の出力結果と同じになるようなプログラム.
の場合はどうしたら良いでしょうか…?
885デフォルトの名無しさん:02/09/13 13:51
strが指す文字列が空かどうか判断するには、
if(*str=='\0')
/* 空 */ ;
else
/* 空でない */ ;

これが一番効率がいいですか?
コードのわかりやすさではif(strlen(str)==0)だと思うんですけど。
>>883
だめだ、お前ら話にならん。
初心者スレで実用を仮定した話をすること自体が
無理なんだろうな。
まあいいわ。俺が困るわけでもない。
>>883
他人が使うモノなら、正しいフォーマットが入ってくることを期待
するのはかなり危険(仕様外だとつっぱねることができるとしても)。
>>884
一文字ずつよみ取り表示しながら、\nを12回検知するかファイルの終端に達したら終わりにすれば?
889デフォルトの名無しさん:02/09/13 13:54
>>887
やつの最初の方の書き込みをよく見ろよ・・・
890871:02/09/13 13:55
>>888
なるほど、どうもありがとうございます、
さっそくやってみます!
>>886
無理というか、わざわざここでそういう話をする意味があるのか?
まぁ、注意を促すのは悪いことではないと思うけど。
限りなき初心者ですみませんが、

typedef struct {
int index;
char name[NAME_SIZE];
} Data;

というような構造体があったとして、main()の中で

Data array[ARRAY_MAX];

for(i = 0; i < ARRAY_MAX; i++) {
array[i].index = 0;
array[i].name = NULL;
}

ってやって初期化しよとしたら駄目でした。書き込んではいけないところに書き込もうとしたんでしょうか?
もしそうなら、どうやって初期化したらいいでしょうか?
お願いします。
この場合、正しいフォーマットを期待しなければfreadなんて使えないだろ(ワラ
894886:02/09/13 13:58
> 無理というか、わざわざここでそういう話をする意味があるのか?
あるに決まってるだろ。
895デフォルトの名無しさん:02/09/13 13:58
>>892
配列名は左辺値にならんでしょ。
>>894
じゃぁ、どこまで作り込めばいいと思う?
>>893
また初心者発見。
>>897
はぁ?
じゃあ5桁じゃなくてもfreadを使ってうまく動くのか?
>>898
freadでバッファに取り込んで、1文字ずつ自分で処理していくんじゃない?
ばかばかしいけど。
Perlを使え。
ということで684ネタはここで終了。
>>899

ファイルサイズを調べてからファイルの内容を全部ってことか・・・?
あほらしい。
902デフォルトの名無しさん:02/09/13 14:10
>>885
strlenも、すぐにループが終わるのでそんなに効率悪くないと思う。
903897ではないが:02/09/13 14:11
>>898
固定長で読み込めば仮にファイルの途中が破損しても
破損していないデータはすべて読み込むことができる。
fgetsでは破損個所以降のデータがすべてずれてしまう
可能性がある。この違いは大きい。

多分お前ファイル操作を根本的にわかってないよ。
>>903
で、破損していないデータだけ読み込んでどうしようってんだ?
getsにつづいてfgetsまでたたかれるようになったのね。
じゃあこれからは標準入力から読むときもfread使おう。
906905:02/09/13 14:19
バッファを満たすまで入力が終わらないと思うけど、それは仕様ということで。
907903:02/09/13 14:23
>>904
じゃあお前だけデータを全部失っとけ。
そしたらバックアップがどうとか書くんだろうな (プ
読んだだけでファイルって壊れるものなのか・・・知らなかった!!
だからfscanfを使えと
>>903って相当頭が固いみたいだな。
>892
array[i].*name = NULL;
は?
じゃあそろそろこの辺でまとめてよろしいか。

少しでも堅牢なプログラムの方がよいと思う人は freadを使え。
自分用の使い捨てと学校の課題レベルのプログラムしか
書いたことがない人、
または 1行が可変長のフォーマットを処理する時は fgetsを使え。

以上。
>>903
途中で余計な空白文字が入ってレコード長が変わっちゃったとかいう
場合にはfgetsのほうが融通きくと思うけど?
914892:02/09/13 14:37
>>895
なるほど。ありがとうございました。
>>911
あ、そうするのか…それでarray[i].nameの値がからっぽになればいいのかな?
ありがとうございました。
>>913
あんたファイルの仕組みを理解してないよ。
916903:02/09/13 14:38
>>913
安全よりも融通を優先するのか?(プ
まあお前はデータを全部失っとけ。
>>398
まじでワラタ
apacheもfgets使っているな・・・
これからは怖くて使えないや。
ところで、なぜfreadの方が安全なの?
>>919
破損したファイルをfgetsで読むとデータをすべて失うから。
>>920
影響は一行だけに留まらない?
>>921
あんたファイルの仕組みを理解してないよ。
ファイルの途中が破損しているわかった場合、
そのファイルの中のデータは既に信用ならないものに
なっていると思うが。
>あんたファイルの仕組みを理解してないよ。
このセリフは聞き飽きた
どうせならもっと建設的な意見述べてさっさとこの議論終わらせてくれよ
fgetsを使ったソフトなんていくらでもあると思うんだが。。。
それはみんな危険なんだろうか。
誤りのないバイナリデータの入力はfread、
何か誤りがありそうでテキスト入力ならfgets -> sscanf
ってやってたけど間違ってたのか。
>>923
だからお前はデータを全部失っとけ。
>>924
じゃあそろそろこの辺でまとめてよろしいか。

少しでも堅牢なプログラムの方がよいと思う人は freadを使え。
自分用の使い捨てと学校の課題レベルのプログラムしか
書いたことがない人、
または 1行が可変長のフォーマットを処理する時は fgetsを使え。

以上。
たとえばさ、一行100バイト(改行コード含む)という仕様のデータ
ファイルを処理するときに、fgetsで一行読み込んで途中で100バイ
ト以外の行があれば、とりあえずその行は捨てて、次の行から処理
を継続してるんだけど。何かまずい?
freadで100バイトづつ決めうちで読み込んだら途中でずれそうで恐い。

#1バイトずつ自分でパースしろって?
でもなんで読んだだけでデータを失うことになるのかなぁ?
ファイルってそんなにもろいのかなぁ?
931みんなC好きだねぇ:02/09/13 14:57
>>928
コピペは建設的ではないよぉぅ ・゚・(ノД`)・゚・。ウワァァン
903 がファイルの仕組みを理解してないってことでよろしいか。
>>929
そのデータの作成方法にもよるだろ。

> fgetsで一行読み込んで途中で100バイト以外の行があれば、
これが破損によるものなら、

> とりあえずその行は捨てて、次の行から処理
> を継続してるんだけど。
fgetsだとこの時点でデータがずれる。

が、破損でなくて、人間がエディタで直接作成したデータ
(作成時にその行の長さを間違えた、つまり可変長になっている)
だとしたらfgetsの方がいい。
一様乱数を作りたいんですが。
randでは無理ですよね?
array[i].name[0] = '\0';
>>933
ずれたとして、なんでそれだけでデータが失われるの?
そこが一番の疑問だYO!
>>936
データを取得するために新たにプログラムを作る必要がある。
だったら初めからそうしておけばいい話。
>>928 全然違う
テキストデータを1行ずつ処理したい場合はfgetsを使え。
固定長のバイナリデータを処理したい場合はfreadを使え。
少しでも堅牢なプログラムの方がよいと思う人はさらにferror()でチェックしろ。

freadの方がfgetsより堅牢と思いたい奴は気休めのためにfreadを使え。
939929:02/09/13 15:18
>>933
ああ、各行に関連性はないってことを書き忘れてた。
つまり、どこか行が抜けても、行の順番が入れ替わってても問題はない
データね。
extern a;
int a=10;

を同じファイル内に書いてもOK?
941デフォルトの名無しさん:02/09/13 15:20
>>940
もっちろん♪
でもextern int a;でしょ。
>>938
全然違う。テキストかバイナリかは直接関係ない。
書き直してみると↓こうなる。

可変長のテキストデータを1行ずつ処理したい場合はfgetsを使え。
固定長のデータを処理したい場合はfreadを使え。

少しでも堅牢なプログラムの方がよいと思う人はさらにferror()でチェックしろ。

テキストなら何でもfgetsの方がいいと思いこんでる奴は
気休めのためにfgetsを使え。
>>903みたいな人とは一緒に仕事したくないです! (;_;)
>>940
問題ない。
というか、大抵の場合は(*.hと*.cに分けて書いていても)おなじ
コンパイル単位に入ってる。
少しでも堅牢なプログラムのほうがよいと思う人は、読み込んだデータ
は全て疑え。
>>942
固定長のテキストデータを扱うプログラムを書いて、データを失うのがおち。
947903:02/09/13 15:28
>>943
つーかお前俺の部下だろ。まだ叩き込まれ足りないようだな。
948903:02/09/13 15:30
>>943
多分お前 俺の部下だろ。今さらやめたいってか?
ところでそろそろ950ゲットだ。
質問
FtpPutFileやFtpGetFileを使ってファイルをアップロード、ダウンロードする時に
プログレスバーに処理状況を表示したいのですが、方法がわからないので教えて下さい。
また、FtpPutFile等を途中で中断する方法も教えて下さい、。
>>950
スレ違う。ここはファイル処理の堅牢性について話すスレだよ!!
>>945
atoiは使うなってことですか?
おまいら、fgetsとかfreadとかで破損とかずれるとか、、
f g e t c で 1 文 字 づ つ 処 理 し ろ よ
↓もうその話は飽きたよう。
>>942
Cの知識も煽りのレベルも低いな。
  テキストなら何でもfgetsの方がいいと思いこんでる奴は
  馬鹿の一つ覚えのfgetsを使え。
この方が的確な煽りだろ?

確かにfreadは読み出し途中でエラーが発生すると読み込みを中断し、
fgetsは途中でエラーが発生しても中断はしない。
特に読み込みエラーになった場合にエラー場所から
リトライとかを行いたい場合、fgetsでは無理。

が、そんなケースの発生は希だし、今回のケースの場合は
せいぜいできることは何行目が読めないとかいうエラーメッセージを
出してプログラムを終了するぐらいだろ?
よって無理にfreadは使う必要など無い。
おいおい
上司 VS 部下 でもって2chかよ おめでてーな
>>952
atoiのかわりにstrtolで。
そんなに面倒じゃないから、もっとstrtol利用していいと思うけど。マジで。
958942:02/09/13 16:08
>>955
はあ?
お前はファイル内容が破損すると必ず読み込みエラーが
発生するとでも思ってんのか?
ファイル破損=メディアからの読み出しエラー
とは限らないんだが。
知ったかぶって書いた割にはレベルが低かったな。

たとえばバイト化けして'\0'が混じったらどうなる?
そういうことに対処するなら最初からfreadを使った方がマシ。
fgetsと比べてコーディングの手間がかかるわけでもない。

> 今回のケースの場合は
> せいぜいできることは何行目が読めないとかいうエラーメッセージを
> 出してプログラムを終了するぐらいだろ?
これも読み出しエラーしか想定してないのでボツ。
>>903とかはよっぽど上から流れてくるデータが酷いプロジェクトばっかり
携わってたんだろうな。言わばテロに必要以上に怯えている今のアメリカみたいなもんか。
960684:02/09/13 16:15
あの....お取込中すみませんが、どなたかそろそろパート<32>
を立てませんか?(私は" 俺に聞け!"というレベルじゃないので立てれません。)
>>959
こいつ自分の使ってるブラウザにさえデータ破損を
考慮した処理が入ってることを知らないんだろうな (プ
次スレはShow-A孫でたのむ。
963959:02/09/13 16:37
おや?俺は別に煽ったつもりはなかったんだけどなぁ・・気に障ったか?スマソ
964fread提案者:02/09/13 16:43
んじゃ、最終結論を出してよろしいか。

どうぞお前ら fgetsでもfreadでもfgetcでもfscanfでも
好きなのを使ってください。
それでどうなろうが俺の知ったことか。
あと、仕事をください。
>>964
Show-Aたん?????
>>970
次スレよろしく〜
967964:02/09/13 16:52
>>965
意味がわかりませんでした。
このスレを立てたのは私のせがれだと聞いてます。それが何か?
>>684 sscanfの書式に注目。
----------------------------------------------------
#include <stdio.h>
main () {
  char buf[1024];
  while (NULL != fgets (buf, sizeof (buf), stdin)) {
    char name[1024];
    int id, a, b;
    float c, d, e, f;
    int count = sscanf (buf, "%d,%[^,],%d,%d,%f,%f,%f,%f",
                        &id, name, &a, &b, &c, &d, &e, &f);
    if (count != 8) continue;
    printf ("id=%d name=%s (%d %d %f %f %f %f)\n",
            id, name, a, b, c, d, e, f);
  }
}
----------------------------------------------------
39341725,山田川,66,83,198.0,4584.3,0.0,0.0
39341726,-該当なし-,-,-,-,-,-,-
39341725,アイウエオ,66,83,198.0,4584.3,0.0,0.0
----------------------------------------------------
C:\WINDOWS\デスクトップ\c-test>a < str.txt
id=39341725 name=山田川 (66 83 198.000000 4584.299805 0.000000 0.000000)
id=39341725 name=アイウエオ (66 83 198.000000 4584.299805 0.000000 0.000000)
----------------------------------------------------
s c a n f マ ン セ ー !
969955:02/09/13 17:10
>>958

> たとえばバイト化けして'\0'が混じったらどうなる?
freadと同じ動作をしますが何か?少なくともbccのfgetsは'\0'を読む。
お前、教えて君やってないで自分で試してみろよ。

ところでお前は'\0'が混じってるデータをテキストデータと呼ぶのか?
あんたファイルの仕組みを理解してないよ。

> fgetsと比べてコーディングの手間がかかるわけでもない。
1行のバイト数が変わってしまった場合は?
例えばftpでしくじって\r\nが\nに化けた場合。

> これも読み出しエラーしか想定してないのでボツ。
他のエラーって何?バイト化けして'\0'が混じったデータなら
freadでも文字列のチェックは必要だろ?

> 知ったかぶって書いた割にはレベルが低かったな。
お前がな、捨てハン付けてまで、馬鹿丸出しの発言するなよ。
970よっしゃ:02/09/13 17:14
新スレ立てるけどファイル入力の話はこっちで完結させろよな<一部の粘着クン
971684:02/09/13 17:19
>>968
なるほど。sscanf一本でもいけるのですね。
しかしこんな書式知らなかった。
勉強になります。

972968:02/09/13 17:24
>>971
%[^,]=カンマ以外の文字列、という意味。
俺も調べて初めて知ったんだけど、色々あるみたいだね。とっつきにくいけど
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/scanf.3.html
こういう短い行ごとの処理なら、fgets+sscanfをうまく使えると思う
973SHOW-A孫:02/09/13 17:24
【コンパイラ】
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
>>973
貼る場所が違うぞ(藁
975SHOW-A孫:02/09/13 17:31
ぐはっ!なんか書き込まれてないと思ったら前スレの方に貼ってたのか(;´Д`)

ちなみに新スレ
http://pc3.2ch.net/test/read.cgi/tech/1031905402/
976955:02/09/13 17:38
>>970
> <一部の粘着クン
俺については了解。あっちではこの話題は出さない。
というかあの知ったか君の完全敗北で完結してるけどね。
なんだかんだ行ってもム板の顔だね、このスレは。
最近は1週間で使い切るし。
そうだよね〜。2、3日忙しくて目通せないと、すげーレスついてるし。
>>978
SHOW-Aのカリスマ性が関係してるとかしてないとか…
いや、関係はないわ ごめん
980デフォルトの名無しさん:02/09/13 17:56
                \ │ /
                 / ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ─( ゚ ∀ ゚ )< えふりどえふりど!
                 \_/   \_________
                / │ \
                    ∩ ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< えふりどえふりどえふりぃどぉ〜〜!
えふりぃど〜〜!   >( ゚∀゚ )/ |    / \__________
________/ |    〈 |   |
              / /\_」 / /\」
               ̄     / /
>>980
えいどりあん?
982958:02/09/13 18:45
>>969
ぎゃはは。全然意味がわかってないよお前。
> freadと同じ動作をしますが何か?少なくともbccのfgetsは'\0'を読む。

'\0'が混じった時に、どこまでが読み込んだデータの終端なのかを
どうやって判断するんだ?という意味なんだが。
(初心者が陥りそうな罠がまだ残ってるから反論には気をつけてね)

しかも'\0'というのは一例を挙げただけで、
もっと深刻な事態になる文字もあるわな。わかると思うけど。

だから
> そういうことに対処するなら最初からfreadを使った方がマシ。
> fgetsと比べてコーディングの手間がかかるわけでもない。
と書いてるんだよ。

> ところでお前は'\0'が混じってるデータをテキストデータと呼ぶのか?
> あんたファイルの仕組みを理解してないよ。
これはお話にならん。エラー時の話をしていたはずだが。
お前のところのテキストファイルは壊れようが何しようが
テキストデータしか存在しないのかもしれんが。

> 1行のバイト数が変わってしまった場合は?
> 例えばftpでしくじって\r\nが\nに化けた場合。
お前やっぱりファイルの仕組みを理解してないよ。
ファイルの破損とお前がftpを操作をしくじって
ファイル内容を書き換えるのでは意味が違う。
しくじった後のファイルは、あらかじめ決められた長さ
の固定長ファイルとは言えない。
freadならどこが終端なのかわかるのかな・・・
903とその信者は自分のつくったソフト以外は使うなってことだよな。
他人のつくったソフトにfgetsを使っているところがあって、データを失うようなことになったら困るもんな(藁
UNICODE(UTF16)テキストなら'0'が大量に入るわけだが。
俺が作ってるテキストエディタは、fgets関数を使用しております。
・・・今のままでいいのか、fread関数に変えるべきか・・・。
987982:02/09/13 19:18
だめだ俺、これ以上付き合うと
自分の性格が歪んでしまいそうなので辞退する。

>>969
ごめん。
この件について俺からはもう書くことは無いけど、
俺が間違ってたよ。
ところで「さいたまさいたまさいたま」の意味が良くわからん。
誰か教えれ。
>>986
固定長テキストエディタなんて要らんぞ
>>986
fread厨の言うことを真に受けるなよ。
>>989
その辺は大丈夫です。
ちゃんと、メモリ資源がつづく限りテキストを読めるよう改造する予定ッス。
どんなに改造しても、
自分の窓を持たないエディタなんて他の人に使ってもらえそうにないですけど・・・(涙
それでも、勉強のつもりで自分の限界まで改造してみます。

>>990
う〜ん、fgetsで大丈夫なんですかね〜・・・。
上の方で、ファイルを読み込んだだけでファイルが壊れる事があるってありますけど・・・
マジッスか!?
うっかりバイナリとかをfgetsで読みに行ってファイル壊れるってことありませんよね?(汗
読み込んだデータを書き込まなきゃ大丈夫
>>992
ですよね!
うん、安心しました・・・。
ありがとうございます。
1000!
1000?
fread派はもう言い残すことは何もありませんか?
1000逝く前に言いたいことがあればどうぞ。
struct res buf[1000];
fread (buf, sizeof (struct res), 1001);
あ、FILE*忘れた
999
1000955:02/09/13 20:46
>>982
> '\0'が混じった時に、どこまでが読み込んだデータの終端なのかを
> どうやって判断するんだ?という意味なんだが。
どこまでが読み込んだのかを判断する必要はない。
正しく読めたかを判断できればよい。
どっちにしろ堅牢なプログラムを作る必要があるのなら、
読み込んだデータは正しいフォーマットかどうかのチェックをするんだから
フォーマットのチェックで引っかかる。

> もっと深刻な事態になる文字もあるわな。
'\n'か?ところで、コントロール文字が化けるケースってあまり思いつかないんだけど
何するとコントロール文字が化けるの?
お前の作った糞プログラムを動かしたりするとか

> これはお話にならん。エラー時の話をしていたはずだが。
了解、テキストファイルが壊れてバイナリになってしまったケースだな
それならばなぜ

> しくじった後のファイルは、あらかじめ決められた長さ
> の固定長ファイルとは言えない。
とかぬかすんだ?自分で矛盾していること言ってることに気づいてないのか?
テキストファイルがバイナリファイルに化ける可能性は考慮して、
固定長ファイルの1レコード長が変わる可能性は考慮しないのか?

固定長ファイルの1レコード長が変わる可能性の方が遙かに高いと思うが?
freadの方が堅牢なんて恥ずかしい無知を晒した上に、
今度は自分の考えの浅さを露呈して楽しいか?
まぁ、世の中にはそういう変態がいることは知っているけどね。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。