C言語なら、オレに聞け! <4>

このエントリーをはてなブックマークに追加
1ジョブス3.1世
おれは26才、4年間プログラムを一生懸命作ってきた。
C言語しか知らないがC言語なら誰にも負けない...
なんでも俺に聞くが良い。
だが、FAQに載ってる質問すると煽るぞ、ゴラア!!
それに勘違いするな、俺は貴様の宿題を解いてやるほど暇じゃない。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/C-faq/C-faq-00.html

前スレ、関連スレは >>2
2ジョブス3.1世:2001/06/12(火) 23:51
独断と偏見で選んだ関連スレだ。

関連スレ
・( ゚Д゚)ノ ギコ猫のプログラム相談室part5
http://piza.2ch.net/test/read.cgi?bbs=tech&key=980521175

・お兄ちゃんの宿題、私が答えるよ
http://piza.2ch.net/test/read.cgi?bbs=tech&key=982853418

・VisualC++相談室 2
http://piza.2ch.net/test/read.cgi?bbs=tech&key=981630730

・C++Builder相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=969458279

・C++相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=980175292

・C#相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=977112364

・ネットワークプログラミング相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=970344582

過去スレ
・C言語なら、オレに聞け!
http://piza.2ch.net/test/read.cgi?bbs=tech&key=979529893

・C言語なら、オレに聞け! <3>
http://piza.2ch.net/test/read.cgi?bbs=tech&key=989929288
3ジョブス3.1世:2001/06/12(火) 23:52
さあ、どうぞ
4デフォルトの名無しさん:2001/06/12(火) 23:54
お疲れ様>1
5デフォルトの名無しさん:2001/06/12(火) 23:57
次はジョブス3.14世になるのだろうか・・・
6デフォルトの名無しさん:2001/06/12(火) 23:59
んで、どうなの?偶数に丸め込むのが正しいの?
信号処理でも0近傍は0に丸め込んだほうが量子化ノイズが抑え
られるので正しいような気がするが…
7デフォルトの名無しさん:2001/06/13(水) 00:02
>>6
正しい正しくないは無い。
自分の作成するプログラムにとって必要と思えば採用すればいい。

組み込み系で、細かいデータの集積が必要とかいうなら入れればいいし、
一回一回のデータは単発で累積してどうこうってわけでもないなら入れなくてもいいし、
統計的に誤差を無くす手法なわけだから、そこらへんは設計者として判断しろ。
8たっくん:2001/06/13(水) 00:18
質問します。
DIBのデータ構造はウインドウズでもリナック巣でもマックでも
同じ構造をしているのでしょうか?
9デフォルトの名無しさん:2001/06/13(水) 00:31
>>8
意味が分からない。
何のデータ構造?ファイル?
10中途半端くん:2001/06/13(水) 00:35
DIBってこれのこと?
http://www.sm.rim.or.jp/~shishido/dib1.html
11デフォルトの名無しさん:2001/06/13(水) 00:46
>>1のFAQってリンク切れてない?
ところで日本語FAQに載っている曜日を計算するサンプルの
アルゴリズムが理解できない。誰か解説キボンヌ。
dayofweek(y, m, d) /* 0 = Sunday */
int y, m, d; /* 1 <= m <= 12, y > 1752 or so */
{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
12デフォルトの名無しさん:2001/06/13(水) 01:11
>>5
いや、3.11 か 95 だと思われる。
13中途半端くん:2001/06/13(水) 01:14
>>11
ツェラーの公式を少し手抜きしたものでしょう

こういうの(y,m,d,wはint型で)
if(m<2){y--;m+=12;}
w = ( y+y/4-y/100+y/400+(13*m+8)/5+d ) % 7;
14中途半端くん:2001/06/13(水) 01:16
>>13
まちがえた!!m<2 じゃなくて m<3ね

if(m<3){y--;m+=12;}
w = ( y+y/4-y/100+y/400+(13*m+8)/5+d ) % 7;
15デフォルトの名無しさん:2001/06/13(水) 04:03
三点からなる集合X={x,y,z}においていくつの位相を定めることができるか?

この問題を解くプログラム誰か作ってください。
16デフォルトの名無しさん:2001/06/13(水) 07:04
ファイルのサイズを調べるにはどうしたらいいでしょうか?

fp = fopen( hogehoge, "rb");
fseek( fp, 0, SEEK_END);
ftell( fp);

簡単に思いつくのはこれなんですが
unix 以外では正しくないんだとか
古いのはみんな切り捨ててもいいんですけども
stat か GetFileInformationByHandle ... めんどうくさいです
17デフォルトの名無しさん:2001/06/13(水) 07:20
>>16
DOSでもWinでもその方法やってきた。
正しくないことはないだろ、原始的だけど
18デフォルトの名無しさん:2001/06/13(水) 10:39
WinだったらAPI使えよ
19デフォルトの名無しさん:2001/06/13(水) 10:39
C言語の現在の需要ってどのくらいあるのでしょうか?
それと、C言語の仕事ってどんなものがあるのでしょうか?
20初めての・・・:2001/06/13(水) 10:57
スレ違いだったらすいません。
「C/C++できる人」というのは、
CとC++、両方できる人のことですか?
確かCとC++は別物だったハズ・・・

将来のためにC始めようと思うのですが。
良かったら教えてください。
21jini:2001/06/13(水) 11:04
>>20
> 将来のためにC始めようと思うのですが。
とてもいいことです
まともな物が書けるようになるまでは
C++は触らないほうが無難です。
22デフォルトの名無しさん:2001/06/13(水) 11:13
>>16
stat(2)のstat構造体にファイルサイズがそのままあるだろ
23ネタにマジレス:2001/06/13(水) 11:21
>>22
stat(2)はCの標準関数にはない

ちなみにC FAQ 19.12:では
http://www.catnet.ne.jp/kouno/c_faq/c19.html
> もしも"ファイルの大きさ"が、C言語を使ってファイルから読むこと
> のできる文字の数ということであれば、一般にはこの数を前もって知
> ることは不可能である。
とある。
24ネタにマジレス:2001/06/13(水) 11:32
>>23 補足
> ftell()はバイナリーファイルを除いては正しくバイト数を返すとは限らない。
>>16 の例は
バイナリモードで開いているので正しいバイト数を返してくれる
すなわちファイルサイズを返してくれる。
と期待して良いと思う。
25デフォルトの名無しさん:2001/06/13(水) 11:35
>>19
需要:かなり有る
仕事:いろいろある
26デフォルトの名無しさん:2001/06/13(水) 11:41
>>23
POSIX.1にはあるんで、現状WinNTやフツーのUnixなら問題無いんでは?
27とし:2001/06/13(水) 12:01
memsetを高速化するにはどうしたら良いですか?
28デフォルトの名無しさん:2001/06/13(水) 12:16
>>27
アルゴリズムを練り上げるべし
29デフォルトの名無しさん:2001/06/13(水) 21:01
age とこう。にしても part 3 は速かったなぁ
30デフォルトの名無しさん:2001/06/13(水) 21:02
memset
memmove
memcpy
strcpy
strcmp
これを関数使わずにCで書ける人、やってみてください。
31デフォルトの名無しさん:2001/06/13(水) 21:03
>>30
自分でやれ
宿題か?
32デフォルトの名無しさん:2001/06/13(水) 21:12
>>30
#pragma intrinsic( memset, memcpy, strcpy, strcmp)
ほら、4/5はできたぞ。あとはmemmoveだけだな(ワラ
33デフォルトの名無しさん:2001/06/13(水) 21:19
>>20
CとC++の間にJavaを入れとくといいと思う
34デフォルトの名無しさん:2001/06/13(水) 21:52
関数atoiを使わずに『数字→数値』変換するのに一番適しているのは、
for&ifかswitchかmemcmpのどれがいいと思いますか?

>1 前回から一ヶ月も経っていないのに4かぁ〜。
  がんばれ
35デフォルトの名無しさん:2001/06/13(水) 22:14
>>34
sscanf
36デフォルトの名無しさん:2001/06/13(水) 22:22
>>34
flex
37デフォルトの名無しさん:2001/06/13(水) 22:30
int main()
{
 int a = 10;
 int b = 12;
 cout << a << b << endl;
 return 0;
}

エラーがでるのですがどうしてでしょう?
本に書いてあるとうりに打ち込んだのですが。
38デフォルトの名無しさん:2001/06/13(水) 22:32
再帰を用いたプログラムと再帰を用いないプログラムでは、
プログラムの読みやすさや、計算にかかる手間などは
どう違うんでしょうか?
39デフォルトの名無しさん:2001/06/13(水) 22:34
2つの n 次正方行列の積って、

/***** c[n][n] は予め0で初期化 *****/
for (i = 0; i < n; ++i)
    for (j = 0; j < n; ++j)
        c[i][j] += a[i][j] * b[i][j];

こんなんでいいの??
無い頭をどう捻ってもこれで行列の積が求まるとは
思えないんだけど…
40デフォルトの名無しさん:2001/06/13(水) 22:39
>>15
ていうかお前位相の定義わかってるか?
わかってないならその単位はあきらめろ。
位相がわかってないやつに数学科を卒業させてやるわけにはいかない。

わかってるならそれをちゃんと説明して、
プログラムでどう実装すればいいか聞いてみろ。

#純粋数学やってないひとに単に位相って言うと、波の位相だと
#思われるのがオチ。
4115:2001/06/13(水) 22:42
>>40
おまえに卒業させてもらうわけじゃないぞ
こたえる気ないのならだーってろ!!
42Perl厨房:2001/06/13(水) 22:42
>>37
#include <iostream.h>
43デフォルトの名無しさん:2001/06/13(水) 22:42
>>39
b[i][j]をb[j][i]と間違ってるか
bがあらかじめ転置行列にしてあるのかどっちかじゃない?
4437:2001/06/13(水) 22:46
>>42
それは入れてます。でもエラーがでるんですが...
45デフォルトの名無しさん:2001/06/13(水) 22:48
>>44
とりあえず、どんなエラーが出たか、書けや。
46デフォルトの名無しさん:2001/06/13(水) 22:48
>>41 残念ながらここはCのスレッドであって数学の専門家はあまりいないんだな。
その一言はきっと数学知識のある貴重なプログラマの反感を買ったのだな。
47デフォルトの名無しさん:2001/06/13(水) 22:49
>>41
アッヒャッヒャッヒャhyaハ
48デフォルトの名無しさん:2001/06/13(水) 23:23
>>11
fj.comp.lang.c で訊けば、坂本氏本人が教えてくれるかもね。
49デフォルトの名無しさん:2001/06/13(水) 23:23
ライブラリのqsort,bsearchとかってvoid型ポインタから
どうやってポインタが指す内容を操作してるの?
voidのままではポインタ操作できないのでキャストしなければ
いけないと思うけど、キャストする型が判別できないし・・・
50へたれ:2001/06/13(水) 23:37
>>37
>>44
本の通りに打ち込んだということから言語に触れて間もないと思う。
インクルードファイルのフォルダ指定が間違ってるとか・・・。
使ってるソフトとかは何かな?VC++とか使ってるならそれは無いと思うけど。
で、endl って何?C++はほとんど知らんし・・・。
一応うつしてやってみたけど問題なく終了。実は;が:になってるとか・・・。
何はともあれエラーがわからなければ、何がおかしいかわかんないよ。

>>38
連結リスト(であってると思う)を使う時は
再帰使ったほうが解放させるときの処理が簡単に書けるから再帰使ってる。
俺の意見は参考にならんと思うけど一応。
51sage:2001/06/13(水) 23:41
>>49
三番目の引数と四番目の引数が
なにを意味するか考えてみるべし < qsort
52デフォルトの名無しさん:2001/06/13(水) 23:41
>>37
Cには、そんな命令(関数)はありません。
もし、あなたの環境がCなら出来なくて当然ですし、
C++なら、スレ違いなので、そっちに行って聞いて下さい。
53デフォルトの名無しさん:2001/06/14(木) 00:26
>>39
+= なの? ただの = でいいんじゃない。
5416:2001/06/14(木) 02:49
>>17,18,22,23
レスありがとうございます。statつかえばいいのですけど system-depend な
定義に少し食傷気味といいますか、、なんとか C 標準で書けないものかと
お知恵拝借いたしました次第です。
C の規格自体がもう古いので何かしようとするとキツイ制限にはまって
しまいますが、かといって広い環境でサポートされて高速に動くのは C
くらいしかないかなとジレンマに陥ります。

>>24
バイナリストリームなら期待したように動作するのでしょうか?
それなら解決です。でも何やら気になる一文があるのですが...
これってバイナリやステート依存なストリームには SEEK_END は undefined
behavior なのでしょうか...? (英文は苦手です・涙)

>>26
やはり POSIX を標準として書くべきでしょうか..
スレッドもマップトファイルも C 標準ではもはや無理ですし..

規格書の気になる一文(ISO-C99N896 302p)
>211Setting the file position indicator to end-of-file, as
>  with fseek(file, 0, SEEK_END), has undefined behavior for
>  a binary stream (because of possible trailing null
>  characters) or for any stream with state-dependent
>  encoding that does not assuredly end in the initial shift
>  state.
55デフォルトの名無しさん:2001/06/14(木) 07:26
>>54
一般のストリームと言うことになるとSEEK_ENDは未定義かもしれんが、
まぁファイルなら大丈夫だろう、と言ってみるけどよく知らん。
56デフォルトの名無しさん:2001/06/14(木) 11:10
ファイルに書かれた数字を行ごとに2次元配列に読み込むには
どうすればいいのでしょう?
ファイルは
12,45,30,11,0,.....
2,6,4,100,55...
3,41,67....
こんな形で、カンマがあってうまくいきません。
たすけて。
57デフォルトの名無しさん:2001/06/14(木) 11:20
>>56
> ファイルに書かれた数字を行ごとに2次元配列に読み込むには
> どうすればいいのでしょう?
次元数が決まっているなら
fscanf(fp, "%d,%d,%d\n", ary[n][0], ary[n][1], ary[n][2]);

決まっていないなら
fgets, strtok, atoiなどを駆使して自分で書け
58デフォルトの名無しさん:2001/06/14(木) 11:23
>>56
どんな風に格納するかわからんが
fscanf(fp,"%d,%d,・・・",&a[0][0],&a[0][1]・・・);
が一番簡単
59デフォルトの名無しさん:2001/06/14(木) 11:32
>57,>58
解決しそうです
ありがとうございます
6057:2001/06/14(木) 11:41
>>57
しくじった。初歩的なミスだ(;_;)
> ary[n][0]
&ary[n][0]

鬱だ、今日は調子が悪い
61デフォルトの名無しさん:2001/06/14(木) 14:16
そんな簡単なカンマの読み方が!!!!
Cを5年やってて気付かなかったYO・・・

死なないとダメかな?
でも今死ぬと3億のプロジェクトが・・・・うみゅー
62荒らし:2001/06/14(木) 14:45
荒らすぞ
63荒らし:2001/06/14(木) 14:45
ああ
64荒らし:2001/06/14(木) 14:45
ああ
65荒らし:2001/06/14(木) 14:45
ああ
66荒らし:2001/06/14(木) 14:45
ああ
67荒らし:2001/06/14(木) 14:45
ああ
68荒らし:2001/06/14(木) 14:45
ああ
69荒らし:2001/06/14(木) 14:45
ああ
70デフォルトの名無しさん:2001/06/14(木) 14:51
プログラムなんかつくてるやつ
しねや
71デフォルトの名無しさん:2001/06/14(木) 14:51
プログラムなんかつくてるやつ
しねや
72デフォルトの名無しさん:2001/06/14(木) 14:51
プログラムなんかつくてるやつ
しねや
73デフォルトの名無しさん:2001/06/14(木) 14:51
プログラムなんかつくてるやつ
しねや
74デフォルトの名無しさん:2001/06/14(木) 14:51
プログラムなんかつくてるやつ
しねや
75デフォルトの名無しさん:2001/06/14(木) 15:42
課題丸投げ厨が逆ギレか。わかりやすいぞ>>62-74=15
7615:2001/06/14(木) 15:46
うるせーぞ
わりーかよー
やめてほしかったら問題とけよー
77デフォルトの名無しさん:2001/06/14(木) 16:08
おもしろいからもっとヤレ
78デフォルトの名無しさん:2001/06/14(木) 16:11
>>76
荒らしてるヒマがあったら勉強しろ。
79デフォルトの名無しさん:2001/06/14(木) 16:11
8015:2001/06/14(木) 16:14
>>79
うっせーなー
おめーなんかにきーてねーよ
81デフォルトの名無しさん:2001/06/14(木) 16:21
>>85
うっせーなー
おめーなんかにようはねーよー
もーくんなよー
たんいおとしてくびになっちまえよー
82デフォルトの名無しさん:2001/06/14(木) 16:24
>>80
邪魔だから消えろ
83デフォルトの名無しさん:2001/06/14(木) 16:49
C++について聞いたら怒る?
84デフォルトの名無しさん:2001/06/14(木) 17:06
>>83
スレ違い
85デフォルトの名無しさん:2001/06/14(木) 21:15
>>81
わかりました
逝ってきます
8615:2001/06/14(木) 23:47
このスレのやつは自分のわからないことにや答えられないときは
怒ってごまかすからむかつく。
自分もできないって素直に言えないのかなー
87デフォルトの名無しさん:2001/06/14(木) 23:48
>>86
ごめんなさい
できないです
だから ここにこなくてもいいです
サヨウナラ
88デフォルトの名無しさん:2001/06/15(金) 00:15
>>86
答えが返ってこない=わからない
としか考えられない想像力の欠如した人間はこの板には不要です。
さっさと回線切って首吊ってください。
89デフォルトの名無しさん:2001/06/15(金) 00:17
>>86
1.簡単すぎて答えるまでもない
2.答えを書いてしまうとネタとして面白くない
3.課題を他人にやってもらうような奴に単位をやる必要はない
90デフォルトの名無しさん:2001/06/15(金) 01:25
>>86
まず自分が率先してやりましょうね
91デフォルトの名無しさん:2001/06/15(金) 01:41
数値を文字定数/文字列に変換するのってどうやるんでしょうか?
いや、ASCIIコードとかでなくて、7→'7'/"7"みたいな。
厨房な質問ですんまそん
92デフォルトの名無しさん:2001/06/15(金) 01:56
man sprintf
93デフォルトの名無しさん:2001/06/15(金) 01:58
>>91
int i = 7;
char c = '0' + i; /* あまり行儀はよくない */
char s[2];
sprintf(s, "%d", i);
94>>92:2001/06/15(金) 02:03
どもっす!助かりました〜
9591,94:2001/06/15(金) 02:09
>>93
2つの方法っすよね?
両方覚えといて使ってみます〜
どもです
96デフォルトの名無しさん:2001/06/15(金) 05:30
>>93

>char c = '0' + i; /* あまり行儀はよくない */

なぜこれが行儀良くないの?普通では?
97デフォルトの名無しさん:2001/06/15(金) 05:40
>>96
文字コード体系に依存するから。
'0'の次が'1'であることは言語仕様としては保証できっこない。
98デフォルトの名無しさん:2001/06/15(金) 06:05
char numbers[] = "0123456789abcdef...";
char c = numbers[i];
9996:2001/06/15(金) 06:35
>>97

------------- X3010 5.2.1 文字集合 (一部抜粋)---------
10個の10進数字, 0 1 2 3 4 5 6 7 8 9 について
0の右側に並んでいる各文字の値は,一つ左側にある文字の値に
比べ1だけ大きくなければならない。
------------------------------------------------------
ってなことが規格で決まってるよ。つまり数字の値は連続している
と決め付けていい。

ただし、アルファベットは連続しているとは限らない。
たとえばEBCDICではアルファベットは切れている。でも
数字はやはり連続している。

K&Rの28pにも「幸いこれはどの文字セットにも当てはまる」
と書いてある。
100デフォルトの名無しさん:2001/06/15(金) 06:56
>>91
ざっと見た所では、98が1番良いように見える。
これなら、10進数以外にも適用出来るし…。
ただ、一度でも、printf系を使用しているプログラムで、
それ程、高速性を求めないのなら、sprintfでも良いかと…。
10196:2001/06/15(金) 07:10
#define quote(n) #n

でいいんじゃないの?

98のは10進数なら

const char numbers[10] = "0123456789";

だな。
102デフォルトの名無しさん:2001/06/15(金) 10:31
すぐ機種依存だからダメとか言うやついるけど、
相手が特別な環境を指定してない限り
そこまでこだわらなくてもいいと思うんだが?

個人が趣味や勉強、仕事でちょこっとやる程度のもので
環境依存をごちゃごちゃ言うのはみっともないと思うのは俺だけか?

・・間違ってはいないとは思うが、そこまで言う必要はないと思うということでね
103デフォルトの名無しさん:2001/06/15(金) 10:50
>>102
> 個人が趣味や勉強、仕事でちょこっとやる程度のもので
> 環境依存をごちゃごちゃ言うのはみっともないと思うのは俺だけか?
趣味や勉強が高じてプログラマとなった場合、
環境依存を考慮しないプログラマ、動けば良いと考えるプログラマは困る。

また、ある質問から議論が派生するのは有意義だとは思わないかい?
# 議論はスレッドを分離すべきだとかいう意見はともかく
104デフォルトの名無しさん:2001/06/15(金) 10:53
意見ありがとうー

有意義だとは思うし、将来のためではあると思うけど、
なんか全体に「考えないやつはダメ人間」みたいな口調が
多い気がして・・・考えすぎか?

意見交換になっている部分は勉強になるし、俺知らなかった!と
いうのもあるから嬉しいんだけど
105デフォルトの名無しさん:2001/06/15(金) 11:10
【質問】
Linuxで標準入力バッファをクリア(破棄)する方法をご存知の方が
いればアドバイスをお願いします。
106デフォルトの名無しさん:2001/06/15(金) 11:45
char c;

scanf("%*c", &c);
107デフォルトの名無しさん:2001/06/15(金) 11:48
コード領域に読み込まれたコードを書き換える事はどうやっても出来ませんか?
108デフォルトの名無しさん:2001/06/15(金) 11:52
>>107 マシンとOSによる
109デフォルトの名無しさん:2001/06/15(金) 13:32
>個人が趣味や勉強、仕事でちょこっとやる程度のもので
>環境依存をごちゃごちゃ言うのはみっともないと思うのは俺だけか?

普段の生活でズボラなコードを書いているからこそ、こういう
オープンな場で話したりするときくらいはしっかり高尚にやるべき、
って気がする。個人の趣味(MFCの好き嫌い)とかはともかく、規格に
書かれてることとかはさ。
11020:2001/06/15(金) 13:40
>>21,33
レスどうもです。
C→Java→C++の順が理想みたいですね、ありがとうございます。

ところで、賛否両論ありそうですが、ソフトは何を使った方がいいんでしょうか?
VC++買えばCとC++両方できるって聞いたんですが・・・
教えていただけるとありがたいです。

・・・Javaをやるなら、それも買わなきゃいけないんですねぇ・・・金が・・・
111デフォルトの名無しさん:2001/06/15(金) 13:47
>>104
の主張もわかる。
 オレが仕事で関わっている環境も、至れり尽くせりなので
ここで論じられている慎重で繊細なコードも参考程度に過ぎ
ない。でも、未知の世界を知る上で重宝しているし勉強になる。
また、2chでの投げやりでツッケンドンな発言は、方言のような
感覚で慣れてしまった。メールアドレスを原則的に公開する掲
示板ならもっと紳士的なところもある。
112デフォルトの名無しさん:2001/06/15(金) 14:46
>>110
BCCかGCCならタダだよ。
CもC++もできる。

Javaもタダでできますよ。
11320:2001/06/15(金) 15:09
>>112
GCCってなんですか?
聞いたことがないのですが
114デフォルトの名無しさん:2001/06/15(金) 15:13
C言語のお手本のようなソースってどこかにありませんか?
こーゆー書き方こそ理想だって感じの
115デフォルトの名無しさん:2001/06/15(金) 15:17
いや考えないやつはダメだろう、やっぱ。
少なくともプログラマとしては。
116デフォルトの名無しさん:2001/06/15(金) 15:23
宗教論争開始の予感...
117デフォルトの名無しさん:2001/06/15(金) 15:31
118デフォルトの名無しさん:2001/06/15(金) 15:32
>>113
gccをキーワードにして検索エンジンで検索をしてみよう
検索しないと「教えて君」のレッテルを貼られるぞ。
http://www.sra.co.jp/wingnut/gcc/

>>114
> C言語のお手本のようなソースってどこかにありませんか?
K&Rにのってるソース
C言語を作った人が書いたソースなので一番信頼できると思う。
119デフォルトの名無しさん:2001/06/15(金) 19:02
でもほんと言うと、ソースコードを大量に読みまくる中で
自然に (経験的に) 良いコードと悪いコードを見分けられる
ようになるのが理想だったりしますか?
120デフォルトの名無しさん:2001/06/15(金) 20:31
ProCもわかる?
ワカルなら教えて!!
121デフォルトの名無しさん:2001/06/15(金) 21:01
良いコードと悪いコードを見分けられるとそりゃ嬉しいかもしれんが、
本当に参考にしたい情報に選択肢が無いこともある。

MSのSDKのサンプルも、ものによって設計思想やら書き方やらが違うので、
調べたい件についてのサンプルが自分とは根本的に違うスタイルだったりして、
泣きそうになりつつもそれを解析する羽目になったり。
122デフォルトの名無しさん:2001/06/16(土) 05:20
>113
GlobalComunicationClub
>114
#include<stdio.h>
int main()
{
printf("aho\n");
return 0;
}
123デフォルトの名無しさん:2001/06/16(土) 16:08
getchar()について質問します。
stdin ストリームからの 1 バイトの取得 とのことなんですが、
以下のプログラムではa,bの値を入力からとって、その和をcに入れ、
リターンを入力してからcを表示させ、リターンを入力させて終了させたいのですが、
getchar()がそのように動いてくれないのは何故ですか?
それからこれを回避するにはどうすればよいでしょうか?

main(){

int a,b,c;

printf("Input a b ");
scanf("%d %d",&a,&b);

c = a + b;

getchar();
printf("%d + %d = %d\n",a,b,c);

getchar();
printf("end\n");

}
124デフォルトの名無しさん:2001/06/16(土) 17:11
scanfしても\nはバッファ残っているので
c=a+b
の下に
fflush(stdin);
を入れましょう。
125デフォルトの名無しさん:2001/06/16(土) 17:46
stdinとstdoutはどう違うのでしょうか
厨房な質問ですいません
126デフォルトの名無しさん:2001/06/16(土) 17:47
>>125
スタンダードインプット?
スタンダードアウトプット?
みたいな?
て感じ?
127デフォルトの名無しさん:2001/06/16(土) 19:42
stdinが標準入力で
stdoutが標準出力です

何も指定していなければ、
stdinはキーボード、stdoutは画面をさす事が多いです。

組み込み系は……とかいう話はおいといて。
128デフォルトの名無しさん:2001/06/16(土) 20:47
>>124
fflush()は出力ストリームに対して使うものであり,
入力ストリームには使えません. 規格では, 入力ストリームに
対するfflush()の動作は未定義になっています.
(完全征覇79ページ)

…ってことらしい。
129デフォルトの名無しさん:2001/06/16(土) 22:41
>>128
入力ストリームに対しては,その効果は不定である。

   プログラミング言語C 第2版 より
130124:2001/06/16(土) 23:12
>>128-129
ありがとう。
勉強になった。
131sage:2001/06/16(土) 23:41
>>123
scanf("%d %d",&a,&b);
じゃなく
scanf("%d %d ",&a,&b);
にしとこうね
132名無し:2001/06/16(土) 23:46
>>123
1回目のgetcharはこれで代替できるでしょ?
scanf("%d %d\n",&a,&b);
2回目のは・・・
133デフォルトの名無しさん:2001/06/17(日) 00:23
カッコ悪いけど
2回getcharしておいたら?

ちなみに、VC++だとfflushはstdin
でもOKのはず。ヘルプ見たけどちゃんと
定義されてた。

BCCでも試したけどこれもOKだった。
134デフォルトの名無しさん:2001/06/17(日) 01:23
前に出たのと同じ質問なんですけど、
入門書を読み終わった後に読むのに適した
ソースコードってどっかにありませんかね?

入門書にのってるやつはちょっと短すぎる気が・・・
135sage:2001/06/17(日) 01:30
>>134
良い心行きだね。

libcあたりのコードでも読んでみるといいかも。

精読は無理だし無駄だから、
自分の理解できそうなコードを探して読もう。

それぞれの関数の仕様は、infoなりmanなりMSDNなりに
載っているから、あとは、コードを読むだけだよ。
136>39:2001/06/17(日) 01:36
/***** c[n][n] は予め0で初期化 *****/
for (i = 0; i < n; ++i)
  for (j = 0; j < n; ++j)
    for (k =0; k < n; ++k)
      c[i][j] += a[i][k] * b[k][j];

じゃなかったっけ?
137デフォルトの名無しさん:2001/06/17(日) 01:43
googleあたりで、
ゲーム ソース C とか
ゲーム ソース トランプ とか
適当に検索するとソース付きのが結構あるよ。
カードゲームとか簡単なのを見つけて、
ちょっとずついじってみるのが楽しいと思う。
実際に動かせるってのは何より楽しいから。
138134:2001/06/17(日) 03:37
>>135
素早い解答ありがとうございます。
しかし、libcあたりのコードといわれてもよくわからんのですが・・・
googleで検索かけてみたんですけどイマイチです。
厨房ですみません。

>>137
どうも。確かにけっこうありますね。
こんなの見てるとテトリスでも作ってみたくなりました。
でも何を勉強すればいいんだろうか。
139123:2001/06/17(日) 09:05
で、結局どうすればいいんでしょう?
fflush(stdin)がscanfの入力にかかわらずきちんと動いてくれるのですが…
140デフォルトの名無しさん:2001/06/17(日) 14:19
#define N 5
を使わずに、入力して、5を入れるのは、どうすればよいのでしょう?
int N;っているのかな?
141sage:2001/06/17(日) 15:06
>>134 =138
http://nephtys.lip6.fr/ftp/pub/linux/mips/libc/src/

たとえばだけど、ここにあるのが GNU版libc(glibc) のソース。
でかいからといって躊躇せず、
落として、読んでみよう。

memcpyとかstrcpyとかprintfとか
普段君が使っていそうな関数のソースが入っているぞ。
142デフォルトの名無しさん:2001/06/17(日) 15:29
そうなると *BSD をインストールする方が早いかも
143デフォルトの名無しさん:2001/06/17(日) 15:34
>>138
カーネルのソースを読んでみよう。
そんなに難しい、ものでもない
ソースの入手も簡単だし。
144デフォルトの名無しさん:2001/06/17(日) 15:46
カーネル?
145sage:2001/06/17(日) 15:49
いきなりカーネルもいいけど、基底技術を先に身につけとかないと
カーネルのソースを読んだくらいで↓↓みたいな恥ずかしいやつになっちゃうよ

http://mentai.2ch.net/test/read.cgi?bbs=prog&key=992037045

>>144
OSの中心にある機能だよ。
146デフォルトの名無しさん:2001/06/17(日) 15:58
>>140
コンパイル時に
-dN=5
147デフォルトの名無しさん:2001/06/17(日) 16:04
>>146
-DN=5
じゃなくて?
148デフォルトの名無しさん:2001/06/17(日) 16:12
>>147
ああ、そうかも
149デフォルトの名無しさん:2001/06/17(日) 16:29
>>143
マジレス。

kernel のソースを読むためには、計算機アーキテクチャに関する
知識と OS 一般の知識が必要。MMU ってなんですか、って人間に
は仮想記憶サブシステムは読めないし、例外発生時の CPU の動
作を知らないとプロセス管理サブシステムは読めない。

それに kernel は処理の流れが一様ではなくて、非同期にいろいろ
なイベントが発生するのが前提だから、慣れないと読むのは大変だ
と思う。

あと、最近の *BSD や Linux kernel のように規模が大きいプログラ
ムだと「実装」から「設計」を把握するのは辛いも。コードを読む前に、
適当な書籍やら論文やらで「設計」を知らないと、見通し悪くて挫折
するよ。

個人的には kernel 読むのが初めてって人間には *BSD, Linux の
kernel は勧めない。まずは計算機アーキテクチャを勉強して、次に
小規模な kernel (UNIX V6, MINIX, L4) を読むのがお勧め。
150デフォルトの名無しさん:2001/06/17(日) 22:14
ちょっと気になったんだが >>143 >>145 って、ホントに kernel のソース
コード読んだことあるの?
151デフォルトの名無しさん:2001/06/17(日) 22:24
>>150
あるよ。ちょっとだけど。
152sage=144:2001/06/17(日) 22:24
>>150
Linux, FreeBSD, WinCEのカーネルなら実際に読んだよ
得るものは余りなし。
153143:2001/06/17(日) 22:27
キャラクタデバイスのとこなら大体読んだ。
あと、init起動するところとか。
154sage!=134 && sage==145:2001/06/17(日) 22:30
ごめん、144じゃない、145だった。

カーネルコードを実際に読むより、
カーネルに関する解説書を読むほうがためになるよ
155デフォルトの名無しさん :2001/06/17(日) 22:37
>おれは26才、4年間プログラムを一生懸命作ってきた。
>C言語しか知らないがC言語なら誰にも負けない...
ってどんなシステムのどんなプログラム作ってきたわけ?
デバイスドライバとかか?
156デフォルトの名無しさん:2001/06/17(日) 22:43
>>155
4年間 って短いな・・・
長くやってりゃいいって訳でもないけど、期間だけで言ったら
オレは30歳で20年間プログラムを書き続けてるんだけど・・・
157デフォルトの名無しさん:2001/06/17(日) 23:02
いいスレだ
158デフォルトの名無しさん:2001/06/17(日) 23:17
>>155
過去スレのC言語なら俺に聞けをみればわかる
ジョブスが何者なのかも
なぜ3.1世なのかも
159ジョブス3.1世:2001/06/17(日) 23:26
>>155-156
デバドラもやったし、μITRONをフルスクラッチもした。
データベースも構築したぞ。
俺にとり4年は十分過ぎる年月だ。
お前らには負けない。
160デフォルトの名無しさん:2001/06/17(日) 23:29
>>159
>μITRONをフルスクラッチ
すなおにすごいと思う。尊敬できるかもしれない。
161sage:2001/06/17(日) 23:32
うん、すごいすごい
かないません
162デフォルトの名無しさん:2001/06/17(日) 23:41
>>159
参考までに、μITRONの勉強をしたいんだけど
いいサイトがあったら教えてくれないか?

今度作らされそうなんだが、とっかかりが全然つかめない。
一を聞いて十知るつもりなんで一だけ教えてほしい。
163ジョブス3.1世:2001/06/17(日) 23:56
>>162
なぜ作る?俺の時とは違い、今時μITRONが実装されていない
CPUを探す方が難しかろう。そんなに徹夜したいのか?

今あるか知らんが、パソコン用のNORTiがソースコードつきで
配布されているんでキーワードを頼りに検索しろ。
じゃ無ければ買え。
164デフォルトの名無しさん:2001/06/18(月) 18:46
Win+C言語でグラフィックを学びたいです。どうすれば?
165デフォルトの名無しさん:2001/06/18(月) 18:47
デスクトップに三角形を書くプログラムを教えてください。
166デフォルトの名無しさん:2001/06/18(月) 19:24
油性ペンを買ってくる。
画面に向かう。
三角を書く。
167デフォルトの名無しさん:2001/06/18(月) 21:11
>>164
書店に行って「プログラミング Windows 第五版」買ってきて読め。
168165:2001/06/18(月) 21:51
>>166
ありがとうございます。苦労しましたが、何とかできました

次は、画面に描いた三角を消したいんですが、どうすればいいですか?
169デフォルトの名無しさん:2001/06/18(月) 22:03
>>168
お好み焼きかなにかで使うヘラで削りましょう。
それでもだめなときは
シンナーに浸した布で拭くと落ちるそうです。
170デフォルトの名無しさん:2001/06/18(月) 23:43
>>167
どうも。
171デフォルトの名無しさん:2001/06/19(火) 10:53
>>169
画面のスイッチを切るほうが早いと思われ
172デフォルトの名無しさん:2001/06/19(火) 11:01
>>171
油性ペンで書いたものは、スイッチを切っても消えません(藁
173デフォルトの名無しさん:2001/06/19(火) 11:23
揮発性ペンで書かれた不揮発な記録。
174デフォルトの:2001/06/19(火) 12:27
DLLからメモリアーロック、フリーするソフト(C++、malloc)なんですが
Win95/NT/2000では正常終了するのですが、98だけが異常終了します。
OSにもどる情報を書き換えてしまっているようなんですが。
なぜ98だけで起こるのでしょうか。
開発環境は、VS6(S3)です。
175デフォルトの名無しさん:2001/06/19(火) 13:10
>>174
> DLLからメモリアーロック、フリーするソフト(C++、malloc)
ネタか?俺の知ってるmallocは
「DLL」からメモリを「アーロック」しないし、
「ソフト」でもないぞ。

mallocの機能をまともに言えん奴はmallocなぞ使うな。
176>174:2001/06/19(火) 13:35
その問題は、SP2で解決しているはず・・・。
http://www.microsoft.com/japan/support/kb/articles/J046/3/30.htm
177デフォルトの名無しさん:2001/06/19(火) 14:06
>>175
偉そうなことは何かアドバイスしてから言っとけ
このバカ
178デフォルトの名無しさん:2001/06/19(火) 14:30
>>177
> 偉そうなことは何かアドバイスしてから言っとけ
オマエモナー
# 目糞、鼻糞を煽る
179デフォルトの名無しさん:2001/06/19(火) 14:33
>>1
自分の能力の高さを自慢したいだけの人に
聞くのって、聞いた方がバカをみるよね。
180デフォルトの名無しさん:2001/06/19(火) 14:48
>>178
典型的なヴァカ
181デフォルトの名無しさん:2001/06/19(火) 16:19
>>179
情報源なんてなんでもいいさ。
使えるものは犬でも使うさ。
182デフォルトの名無しさん:2001/06/19(火) 16:24
>>179
C言語なら俺に聞けの初代スレをみればギャグだってわかるのに。
183デフォルトの名無しさん:2001/06/19(火) 22:55
>>179
たぶんこのスレの<1>〜<4>の1は全て別人。
>>159も別人。
184デフォルトの名無しさん:2001/06/20(水) 11:36
すいませんがお聞きします。
配列などを初期化するとき
for(i = 0;i < 255;i++ )
 counts[i] = 0;
}
ってやるのと
memset(counts,0,sizeof(counts));
ってやるのとどちらがいいのですか?
185デフォルトの名無しさん:2001/06/20(水) 11:39
>>184
どっちも何もmemsetしかないじゃん
forを固定回数でまわすなよ。わら
186デフォルトの名無しさん:2001/06/20(水) 11:45
むかし、countがfloatとかdoubleとかだとmemset では問題かも〜
ってきいたことがあるよ。個人的には、
double counts[128] = {0};
とかかな。
187 :2001/06/20(水) 11:52
#if defined
individual
#pragma
#if!defined
#use
unsigned
using std::FILE;
template <class charT,class traits>
#undef
Struct
using NAMA std;
class NAMA1 :public locale::facet
class NAMA2 :public NAME1{
Static size_t rand_ =0;
Static struct tm* tmb=0;
#define NAME1 (NAME2)
#define NAME (NAME | PARAMETER)
int _RTLENTRY _EXPFUNC printf(const char * __format,...);
typedef
wchar_t
#define FOPEN_MAX (_NFILE_)
extern "C"{

各々わかんない、.libファイルと.hファイルの関係と作り方トLCCLIB.EXEのありか
188デフォルトの名無しさん:2001/06/20(水) 12:29
>>186
>double counts[128] = {0};

これだと、counts[0]以外は未定義状態だなあ
189デフォルトの名無しさん:2001/06/20(水) 12:38
>>184
普通はmemsetの方が速い。

>>186
全ビット0が0.0にならない処理系の場合。
IEEE形式なら問題なし。

最初の要素は0.0が代入されると思われるが、
それ以降はmemset相当のコードになるはず。
190デフォルトの名無しさん:2001/06/20(水) 12:49
>>189
普通は memset の方が早いが、たいていは初期化部分のコードよ
りも実際に配列を操作する部分のコードの方が実行時間に効いてく
る。初期化部分がボトルネックになっていることが明確でない限り、
わざわざ移植性を落としてまで初期化部分で時間稼がなくて良し。

ただし移植性がそもそもない場合、たとえば Win32 only の構造体
を初期化するような場合は、どっちでも良い。構造体の要素を個別
に初期化してると、定義が変わったときに初期化漏れが出る可能性
もあるしね。
191デフォルトの名無しさん:2001/06/20(水) 13:19
>構造体の要素を個別
>に初期化してると、定義が変わったときに初期化漏れが出る可能性
>もあるしね。

わしこれでチョンボやった経験あり。
192デフォルトの名無しさん:2001/06/20(水) 13:52
printf("input to count file name : ");fflush(stdin);
fgets(filename,256,stdin);

fp = fopen(filename,"rb");
if(fp == NULL) {
  printf("can't open file : %s",filename);
  exit(-1);


ちゃんと存在しているファイルなのに開いてくれません。
なぜでしょうか? }
193デフォルトの名無しさん:2001/06/20(水) 13:54
filenameの宣言が見たい
194デフォルトの名無しさん:2001/06/20(水) 13:59
>>192
> fgets(filename,256,stdin);

こんなふうにした場合、おしまいにリターンが付いてきそうな気がする。
195デフォルトの名無しさん:2001/06/20(水) 14:14
fflush()については
>>128-129参照

ってなんでfflush()?
196デフォルトの名無しさん:2001/06/20(水) 14:14
C言語
197デフォルトの名無しさん:2001/06/20(水) 14:18
TestDlg.obj :
 error LNK2001: unresolved external symbol "void __stdcall・・・"

このエラーの意味って何?
198デフォルトの名無しさん:2001/06/20(水) 14:21
>>192
ここを
> printf("can't open file : %s",filename);
printf("can't open file : [%s]",filename);
こう修正後に実行してみて、
can't open file : [filename
]
と表示されるようなら>>194が理由。
199デフォルトの名無しさん:2001/06/20(水) 14:33
>>197
宿題は手伝わないって言ったでしょ
200197:2001/06/20(水) 14:38
>>199
お願いビーム!
201197:2001/06/20(水) 14:44
>>199
宿題じゃなく仕事なんだ。
先に進めなくて・・・納期が・・・。
202197:2001/06/20(水) 14:49
っていうかスレ違いだった。
VC++でのエラーだった。
203デフォルトの名無しさん:2001/06/20(水) 14:49
>>201 に笑った。別の職業につけ。
204197:2001/06/20(水) 14:54
はーい
205192:2001/06/20(水) 14:59
みなさま、アリガトウございました。
ご指摘のとうりリターンがついてました。
206デフォルトの名無しさん:2001/06/20(水) 15:30
俺だったら、納品するプログラムで
> fgets(filename,256,stdin);
こんな入力方法とる奴はクビにするね。
207デフォルトの名無しさん:2001/06/20(水) 15:32
>>206

>>192>>197は違う人じゃない?
208206:2001/06/20(水) 15:35
>>207
御意誤爆鬱死。

でも>>197みたいな質問を2chに書く奴はやっぱりクビにしたい(w
209デフォルトの名無しさん:2001/06/20(水) 15:41
>>206
> こんな入力方法とる奴はクビにするね。
理由書けや。
どーせ256みたいな定数でなくsizeof(filename)とか
エラーチェックしろとか細かいツッコミだろ?
210206:2001/06/20(水) 15:50
>>209
fool proofについて考慮されてないって事だよ。
211197:2001/06/20(水) 16:39
あー。もう面倒だから、辞表提出してきた。
これでもおれ、チーフだったから、開発メンバー
みんなめちゃくちゃ混乱してた。ワハハノハ。
212デフォルトの名無しさん:2001/06/20(水) 16:43
>>211
マジ?
ネタ?
213192:2001/06/20(水) 16:48
>俺だったら、納品するプログラムで
>> fgets(filename,256,stdin);
>こんな入力方法とる奴はクビにするね。

たびたびすいません。なにがいけないのでしょうか?
勉強中なのでおしえてもらえませんか
214デフォルトの名無しさん:2001/06/20(水) 16:54
>>213
プログラム中に「定数」をばらまいてはいけない。
Cならマクロ、C++ならばconstを使うべし。
215デフォルトの名無しさん:2001/06/20(水) 16:58
>>214
そうか?
時と場合によるんじゃないのか?一回しかでないもので
絶対変更のないものならいいんじゃないの?
この場合はどうかしれんが
216デフォルトの名無しさん:2001/06/20(水) 17:00
>>211
ネタにしても寒いな。
マジだったら、そんな奴をチーフにしてる会社はさっさとつぶれてくれた方が社会のためだ。
217デフォルトの名無しさん:2001/06/20(水) 19:18
--1--
1本100円のボールペン
10本以上買うと、
A店 10%OFF
B店 8本ごとに1本おまけ
購入数を入力して
単価の安いほうを出力


9 同じ
15 A店
30 B店

--2--
価格を入力してポイントを出力する
100円以上の商品に対して
10円ごとに1ポイント


80 0
100 1
110 2
200 11

--3--
駐車場の使用時間を入力して料金を出力
基本料金 500円
(1時間)
1時間超えると、10分につき100円課金

53 500
62 600
70 600
71 700

コーディングしてください。
218デフォルトの名無しさん:2001/06/20(水) 19:27
>コーディングしてください。

あまりの大胆さにちょっとワロタ
219デフォルトの名無しさん:2001/06/20(水) 19:51
>>217
> それに勘違いするな、俺は貴様の宿題を解いてやるほど暇じゃない。
220217:2001/06/20(水) 20:03
#include <stdio.h>
void main(void)
{
int ne,kazu,a,b,g;
printf("購入数=");
scanf("%d",&kazu);
ne=100;
a=0;
b=0;
g=kazu*ne;
if (kazu>=10) {
a=g*0.1/kazu;
b=g/(kazu+kazu/8);
}
if (a<b) {
printf("A");
}
else if (a>b) {
printf("B");
}
else {
printf("同じ");
}
}
221デフォルトの名無しさん:2001/06/20(水) 20:16
(゜д゜)<宿題は別スレでやれ
222217:2001/06/20(水) 20:20
ここはプログラム作成ウィザードスレではないのですか?
223デフォルトの名無しさん:2001/06/20(水) 20:29
>>220
バグリスト
・kazuが0の場合、多分プログラムが落ちる
・kasuが1〜9の場合、「同じ」と表示される。
・どんなkazuを入力しても「A」と表示される。
下記の計算部分がバグっている。

> g=kazu*ne;
> if (kazu>=10) {
> a=g*0.1/kazu;
> b=g/(kazu+kazu/8);
> }
224整数定数:2001/06/20(水) 20:32
>>214

整数定数なら enum を使えと,カーニハン先生はおっしゃってました.

enum { BUFSIZ=4096 };
225217:2001/06/20(水) 20:57
小数点が使えないのかなあ?
226デフォルトの名無しさん:2001/06/20(水) 20:59
>>225
intって何ですか?
227デフォルトの名無しさん:2001/06/20(水) 21:11
>>217
激しくスレ違い。麻衣ちゃんに頭下げて教えて貰え。
228デフォルトの名無しさん:2001/06/20(水) 21:13
229デフォルトの名無しさん:2001/06/20(水) 21:59
(゜д゜)<age
230デフォルトの名無しさん:2001/06/20(水) 21:59
だがしかし、思わずチャレンジしたくなる宿題は許可したいぞ。
231デフォルトの名無しさん:2001/06/20(水) 22:52
>>226
こんなの見ちゃっていいのかしら・・・
わあ! これなんて intのCですよ、先輩
232デフォルトの名無しさん:2001/06/20(水) 22:53
いや、だからチャレンジするのはかまわないけど宿題スレでやれよって話。
やるなとは言ってない。
233麻衣:2001/06/20(水) 22:55
待ってるわよ
234デフォルトの名無しさん:2001/06/20(水) 23:25
>>231
おお 懐かしい
随分マニアなシーン持ってくるね(笑)
235224:2001/06/21(木) 02:14
カーニハン先生って何?
236デフォルトの名無しさん:2001/06/21(木) 02:36
>>235
をい。
今すぐgoogleへ逝ってこい。
237デフォルトの名無しさん:2001/06/21(木) 03:37
ゴーグル
238デフォルトの名無しさん:2001/06/21(木) 04:23
ガグル
239デフォルトの名無しさん:2001/06/21(木) 08:05
ガーゴイル
240デフォルトの名無しさん:2001/06/21(木) 12:15
ゴール
241デフォルトの名無しさん:2001/06/22(金) 01:43
void のポインタの並びを動的に確保したいんですけど、
void ** が出てきて困るんです。

void **storage = calloc (capacity, sizeof (void *));

で、こうしようと思うんですが、

void *p, *q;
/* p にどこかで値を入れる */
char **storage= calloc (capacity, sizeof (char *));
storage[n] = (char *) p;
q = (void *) storage[n];

これは合法なんでしょうか?
242デフォルトの名無しさん:2001/06/22(金) 01:51
go for
243デフォルトの名無しさん:2001/06/22(金) 04:14
>>241
char**はよくてvoid**が困る理由が分からんが、
void*へ/からの代入はキャストも不要だろ。
244デフォルトの名無しさん:2001/06/23(土) 02:03
> char**はよくてvoid**が困る理由が分からんが、

C FAQ 日本語訳を読んでいると、4.9 で void ** はダメっぽいふうに
書いてあるので困りました。いろんな型へのポインタの並びを
管理しようとして、const void * で引数をもらっています。
それならと、void ** 以外で処理することにしたんですが、
他の環境に持っていった時に、異なる型へのポインタでは
サイズが変わるかも、と考えて書き込みました。
けれど考えてみたら、ポインタをキャストできるんだから、
どんな型へのポインタでもサイズは変わらないんですよね?
ということで、

void *p, **storage = calloc (capacity, sizeof (void *));
storage[n] = 何らかの void *;
p = storage[n];

を使ってもいいものかどうかについてお願いします。
ダメなら、char ** などを使ってみようと思います。

> void*へ/からの代入はキャストも不要だろ。

7.7 に書かれているようなコードで覚えたので、
void * もキャストするものと思っていました。
でも、読んですぐなものでまだ癖が抜けません。
245243:2001/06/23(土) 02:48
>>244
規格上ポインタのサイズが同じであることは要求されてなかったと思うけど、
そういう処理系ではchar**でもやっぱりダメだろうからvoid**使っとけば。

> void *p, **storage = calloc (capacity, sizeof (void *));
> storage[n] = 何らかの void *;
> p = storage[n];
>
> を使ってもいいものかどうかについてお願いします。
いいもなにも、このコードは暗黙のキャストもまったくないじゃん。
「何らかの void *」とpが他の型へのポインタなら話は分かるけど、
やっぱり正しいコード。C++だとキャストが必要だけど。
246デフォルトの名無しさん:2001/06/23(土) 07:34
>>245

C FAQ 4.9 の

> C 言語には汎用のポインターへのポインター型は存在しない。

を誤解していたようです。
void ** を使ってデータ操作すること自体が、ダメなんだと思ってしまいました。

void sample (void **arg);
int *p;
sample (&p); /* p をなんとかしてほしい */

のようなことがダメだと言っているんですよね?

私の場合は、既に void * でもらっているポインタの値を出し入れするだけなので、
関係なかったんですね。
247デフォルトの名無しさん:2001/06/23(土) 07:39
それは void のサイズが分からないからだめなのでは?

void array[10];

と同じ理屈。
248C初心者:2001/06/23(土) 10:30
初心者な質問で申し訳ないのですが……。

標準関数の読み方って、なにか決まりがありますか?

strcpy ストリングコピー? エスティーアールコピー? ストルコンプ?
strcmp ストリングコンプ? ストリングコンペア?

熟練プログラマの皆さん方、どう発音されてますか?
249デフォルトの名無しさん:2001/06/23(土) 10:48
すとらこぴー。すとらこんぷ。
何て呼んでもいいと思うけど?変な読み方だとおもろいし(笑)
250デフォルトの名無しさん:2001/06/23(土) 12:49
strcpy → スーピー
strcmp → スープー
strcat → スッチー
251デフォルトの名無しさん:2001/06/23(土) 12:52
stdio → スタイオ
stdlib → スタリブ
string → スリン
stderr → スァ
252デフォルトの名無しさん:2001/06/23(土) 15:42
読み方と命名規則は一ヶ月に一度は話題になるな。
ローカルルールに追加しない?
253デフォルトの名無しさん:2001/06/23(土) 16:29
人に言うときは
stdio → スタンダードアイオー
っていったほうがいいけど心の中ではなんでもいいと思う
254sage:2001/06/23(土) 17:16
心の中ではスタジオ
でも、口に出すときはエスティーディーアイオー

なんでもいいよ。もう。
255デフォルトの名無しさん:2001/06/23(土) 18:47
そういや、たまに本当にスタジオって言ってるおっさんいるよなー
256デフォルトの名無しさん:2001/06/23(土) 18:49
俺もスタジオヘッダに一票。

スタンダードアイオーなんて知ったかぶりっ子っぽくてイヤン。
257デフォルトの名無しさん:2001/06/23(土) 18:54
どうせstudioと勘違いしてるなら、「すてゅーでぃおう」と言ってほしいね。

そういえば、マイクロソフトの製品で
ビジュアル・スタディオ
というのがあったな。変なの。
258デフォルトの名無しさん:2001/06/23(土) 19:52
>>256
知ったかぶりじゃなくて、そのものなんだが・・・
余程昔辛い目にあったんだろうねえ
259デフォルトの名無しさん:2001/06/23(土) 22:31
独学でやっている人にはスタンダードインプットアウトプットが
正式だと知らない人がまれにいる。でもプログラマーとしての
技術は十分あるのでバカにもできない。
だから好きによんでいいと思うよ。実力さえあれば。
260マジレスさん:2001/06/23(土) 23:36
下のプログラムを、実行すると答えの桁数の所に、
整数どうしの足し算でも
小数点が付き、.0000となりますが、
.0000を消すにはどこに何を付け加えればいいですか?
#include <stdio.h>
int main(void)
{
float var1,var2,answer;
int op,flg;

printf("値1\n");
scanf("%f",&var1);

printf("値2\n");
scanf("%f",&var2);
printf("1、足し算 2、引き算 3、掛け算 4,割り算\n");
scanf("%d",&op);
if(op == 1){
answer = var1 + var2;
flg = 0;
}
else if(op == 2){
answer = var1 - var2;
flg = 0;
}
else if(op == 3){
answer = var1 * var2;
flg = 0;
}
else if(op == 4){
answer = var1 / var2;
flg = 0;
}
else{
flg = -1;
}
if(flg == 0){
printf("答え %f",answer);
}
else{
printf("計算方法の指定が間違っています");
}
return 0;
}


261デフォルトの名無しさん:2001/06/23(土) 23:38
モットprintfシラベロ
262デフォルトの名無しさん:2001/06/23(土) 23:40
>>259
独学だとしてもstdioがstandard input/outputの略だと気付かない
奴はバカでしょ。他にstdlibとかstdargとか、stdがstandardと
気付くためのヒントはいくらでもあるし。
263デフォルトの名無しさん:2001/06/23(土) 23:42
>>260
キミの頭にC言語に関する基礎知識を加えればいいですよ
264マジレスさん:2001/06/24(日) 00:16
>>263
そんな冷たい事言わずに、教えて。
265中途半端くん:2001/06/24(日) 00:20
>>260
%d
266259:2001/06/24(日) 00:27
>>262
そうなんだけどどう呼んでてもプログラムができれば
かまわないというはなしで
267デフォルトの名無しさん:2001/06/24(日) 00:36
char* ps = (char*)malloc(100);
memset(ps, '\0', 100);
ps = "50,50,50,50,50";
siri.SendHexNumber( ps );
free(ps);
こういうやり方は、やっぱり違反なのでしょうか?
教えてください
268中途半端くん:2001/06/24(日) 00:39
>>267
合法
269デフォルトの名無しさん:2001/06/24(日) 00:43
>>267
oioi
>ps = "50,50,50,50,50";
>free(ps);
自分でなにしてるかわかってる?
270デフォルトの名無しさん:2001/06/24(日) 00:54
intはなんて読めばいいの?
271デフォルトの名無しさん:2001/06/24(日) 00:56
>>267
free(ps)のときにはpsはスタティックな領域を指しているので、
おそらくSEGVかなんかで落ちる環境も多い。
ps = "..."じゃなくてstrcpy(ps, "...")ってしたいんじゃないの。
272デフォルトの名無しさん:2001/06/24(日) 00:57
>>267
strcpy

VBとかから入った人はこんなの書くね
273デフォルトの名無しさん:2001/06/24(日) 00:59
>>270

1. イント
2. インテ
3. インテジャ

エラボウ
274デフォルトの名無しさん:2001/06/24(日) 01:12
>>267
malloc&freeは、もう少しポインタの事を勉強して、
そのコードが何を意味するか、分かってから使った方が良いかと…。
275デフォルトの名無しさん:2001/06/24(日) 01:34
>>270
アイティーン
276デフォルトの名無しさん:2001/06/24(日) 01:48
(i)インター(n)ネット(t)テクノロジー
277デフォルトの名無しさん:2001/06/24(日) 01:50
mallocの使い方まずいの?
ps = "50,50,50,50,50";
が違法というか、一般的かどうかを聞きたかったんだけど
278デフォルトの名無しさん:2001/06/24(日) 01:54
私が得をする情報をタダでください。
それによって私は大変な恩恵に預かりますが、あなたには何の
メリットもありません。
でも、いいじゃないですか? どうせ情報なんてタダでしょ?

とても困っているので、情報を知っている人は私を助けなければ
いけません。これは義務です。
初心者にも分かるように説明してください。
私は、ごく普通の人間なので、パソコンのわけの分からない知識は
ありません。勉強するつもりもありません。時間の無駄です。
検索するなんて面倒です。どうしてそんな面倒な事するの?
知ってる人に聞けばいいじゃん。どうせタダだし。

マルチとか質問スレというのはヲタクのルールです。
私は普通の人間なのでヲタクのルールなど知ったこっちゃありません。
早く教えてください!
早く教えろ!
早く!
これだけ言ってもまだ教えねーのか?!
279デフォルトの名無しさん:2001/06/24(日) 01:56
>>277
malloc/freeを使う意味が無い。
文字列コピーでもしたかったのか?
280デフォルトの名無しさん:2001/06/24(日) 01:59
ソースから、抜き出したんで、あまり的確じゃなかったかも
すまん
281デフォルトの名無しさん:2001/06/24(日) 01:59
>>270
インタラプト
282デフォルトの名無しさん:2001/06/24(日) 02:16
漏れは今、独学でCやってるんよ。
それで、先日「独習C」って本買ったんだけど
この本の内容は何日(何ヶ月)くらいでマスターできるんかな?
すでに、初級本の「C言語〜はじめてのCプログラミング〜」はマスター済みです。
現在は学校には行ってません。

あと、「独習C」マスターしたらC++に進んじゃって大丈夫やろか?
283デフォルトの名無しさん:2001/06/24(日) 02:19
言語だけマスターしても意味がないんじゃ・・・
一つの言葉を覚えたら徹底的に使うことが大事だと思うよ
284デフォルトの名無しさん:2001/06/24(日) 02:21
>>277
mallocの使い方と
ps = "50,50,50,50,50";
は、それ程、問題無いが、その後の、
free(ps);
が問題がありすぎる。
その為、そのコードが合法か聞かれた場合は、
それしか目が行かない。
ちなみに、freeが無い場合、大抵の処理系では合法で、
(見た事はありませんが、(聞いた事ならある))
exit時にメモリを開放しない処理系では、違法。
285デフォルトの名無しさん:2001/06/24(日) 02:22
>>282
野球のルールを知ってるだけじゃ、甲子園には行けないぞ。
286282:2001/06/24(日) 02:23
>>283

マスターってのは
その本の内容を理解したって意味で使いましたっす。

C++を勉強しようとしたら全く解らんのでCから始めたんやけど…
287282:2001/06/24(日) 02:29
>>285

とりあえず今は、勉強するしかないかな〜と思ってます。
まだ、独学で始めて1ヶ月なんですよ。

実践で使いこまなきゃ話にならんで〜
…ってことは勉強してると良くわかります。
だって、問題出されたり質問されたりしても全然答えられんもん。
288デフォルトの名無しさん:2001/06/24(日) 02:29
>>284
あるクラスのメンバー関数の中の一部なんだけど
freeしちゃだめなの?
289282:2001/06/24(日) 02:31
ちなみに、趣味でゲーム作ろう思ったのが勉強始めたきっかけっす。
290デフォルトの名無しさん:2001/06/24(日) 02:41
>>284
あんまり問題なくないぞ。
何の為にmallocしてんのかわからん。
291デフォルトの名無しさん:2001/06/24(日) 02:53
>>290
mallocはもういいんで、他にいろんな処理してる関数の抜き出しなんで
適切じゃなかった、
で、なんでfreeしちゃだめなの?
292デフォルトの名無しさん:2001/06/24(日) 02:56
>>291
あっはっは。
freeの引数にはmallocで確保した領域の先頭アドレス
(つまり、最初にmallocしたときのpsだな)を入れなきゃ。
いまのままじゃ"50.・・・"の文字列の先頭アドレスだから
狂っちゃうよ。
293デフォルトの名無しさん:2001/06/24(日) 02:59
>>291
malloc(), realloc() を介して確保したメモリ以外は free() してはいけない。
そういう前提で free() は書いてあるので、文字列定数へのポインタを渡す
と、困った事態になる。

たいていはメモリアクセス保護違反で異常終了するが、環境によっては
その時にはエラーが出ずにメモリ上のデータを壊す(そして後で変数の
値がおかしくなっていることに気づく)かもしれないし、OS が暴走するか
もしれない。
294デフォルトの名無しさん:2001/06/24(日) 03:14
相も変わらずアホな議論をしておるな
295デフォルトの名無しさん:2001/06/24(日) 03:17
これは議論なのか??
>>293がC言語のイロハを厨房に教えている教室かと思った。
296デフォルトの名無しさん:2001/06/24(日) 09:14
>>267の話題で
>>292 >>293
以外はダメダメ。
メモリに展開されているインスタンスをイメージできればこんなミスはしなくなる。
297デフォルトの名無しさん:2001/06/24(日) 09:31
>>267
ヒープとスタックの違いは理解してる?
298デフォルトの名無しさん:2001/06/24(日) 09:53
>>293
>malloc(), realloc() を介して確保したメモリ以外は free() してはいけない。

では、callocで確保したメモリはどうやって解放するの?
299デフォルトの名無しさん :2001/06/24(日) 10:08
初歩的な質問ですみません。
ゲームを高速化するために、VC++6.0Pro で、MMX命令を使った
プログラムを書きたいのですが、インラインアセンブラ
以外の方法で画像のスプライト処理などをする
ライブラリなどはありませんでしょうか。
どなたか教えてください。
300デフォルトの名無しさん:2001/06/24(日) 10:17
>>297
ヒープとデータセグメント
>>267にとっては同じようなもんだろうが(藁
301デフォルトの名無しさん:2001/06/24(日) 10:39
>>267の話題で
>>292 >>293
は親切すぎてダメダメ。そんなの267以外は分かってるちゅうねん。
コンパイルでエラーが出ないからっていって、やっていいことと悪いことがある。
それまでのヒントで、自力で調べるくらいじゃないとな。

>>298
callocは中でmallocを出してるって、MSDNにも書いてあるだろ。
それくらいも見ないのか?
302224:2001/06/24(日) 12:32
>>301
alloca()と間違えたのでは?

>>235
カーニハン先生はひとことでいうとC言語の権威です.
もとの発言の文脈に依存した言い方だと,
カーニハン先生は「プログラミング作法」という書籍の著者であり,
その本の中で整数定数をenumで書くことを推奨しているのです.
「プログラミング作法」はカーニハン先生ご自身の名著である
「プログラミング書法」と「ソフトウェア作法」を
最新の言語に即して書きなおしたというところでしょうか?

#残念ながら「ソフトウェア作法」の原題でもある「Software tools」という
#考え方についてはあまり触れられていません.

[Amazonでの紹介]
http://www.amazon.co.jp/exec/obidos/ASIN/4756136494/t/249-9249061-2910751
303デフォルトの名無しさん:2001/06/24(日) 12:42
ソープってなんですか?
気持ちいいんですか?
304デフォルトの名無しさん:2001/06/24(日) 12:45
ソープ? 石鹸のことだよね。
気持ちいいって・・・まあ、そりゃあ身体や顔洗えばスッキリするけどさあ。
305デフォルトの名無しさん:2001/06/24(日) 12:52
SOAPのことと思われ
306デフォルトの名無しさん:2001/06/24(日) 13:50
Hop Soap Proffecer
307デフォルトの名無しさん:2001/06/24(日) 16:35
if (条件) {
}
else {
}
か、
if (条件)
else
ですか?

{ }
はいりますか?
308デフォルトの名無しさん:2001/06/24(日) 16:41
>>307
デフォルトで{}をつける癖をつけろ
309デフォルトの名無しさん:2001/06/24(日) 16:53
>>307
308に同意。
しかし、

if( a == 0 ) {
a++
}
else {
continue;
}

とかする馬鹿はすぐ殺せ。
310デフォルトの名無しさん:2001/06/24(日) 17:07
そもそも、不用意にcontinue使う奴はクビ。
311デフォルトの名無しさん:2001/06/24(日) 17:09
continueっていかんの?
312デフォルトの名無しさん:2001/06/24(日) 17:11
>>311
いけない理由はgotoとほぼ同じ。
313デフォルトの名無しさん:2001/06/24(日) 18:48
if (p != NULL)
  debug_printf("fclose シヨーヨ\n");
  fclose(fp);

「なんか、NULL pointer assignment とかいって止まるんですけど、
コンパイラがバグってるんでしょうか?」
314デフォルトの名無しさん:2001/06/24(日) 18:49
同様の理由でreturn乱用も死罪だ。
315デフォルトの名無しさん:2001/06/24(日) 18:49
>>313
ネタ?
>>308
316デフォルトの名無しさん:2001/06/24(日) 19:38
>>313
pって何?
317デフォルトの名無しさん:2001/06/24(日) 20:21
>>313
あなたがバグってマス
318デフォルトの名無しさん:2001/06/24(日) 20:33
なんでcontinueがだめなの?
使い方しだいだと思うけど。
そんなふうに硬直した思考してると
世の中から置いてきぼりを食っちゃうぞ
319学生:2001/06/24(日) 20:33
KL展開のプログラムを作っているのですが、
固有ベクトル以外に作らなければならないプログラムがわかりません。
画像の入出力はできます。教えてください。
320デフォルトの名無しさん:2001/06/24(日) 20:37
>>318 ”不用意に”って書いてあるじゃん。煽りたいだけ?
321デフォルトの名無しさん:2001/06/24(日) 21:08
>>318
使い方しだい、か。例を挙げてくれないか?
今まで、continueを使ってたソースで「こいつ何考えてんだ?」と
思わなかったことが無いのでな。
322デフォルトの名無しさん:2001/06/24(日) 21:09
>321
同じく。おれもcontinueは必要だと思うが。
323310:2001/06/24(日) 21:44
>>318
そう、使い方次第だよ。だから>>312と書いた。gotoだって使い方次第だ。
gotoでは多重ループから一気に抜けるときとかの例があるだろ。
continueが有効な例てのをあげてくれ。
324デフォルトの名無しさん:2001/06/24(日) 22:31
あーあ、みんなムキになっちゃって。
あたま弱いんだね
325sage:2001/06/24(日) 22:52
どれがお好み?

while (fgets(buf, sizeof(buf), fp) != NULL) {
  if (buf[0] == ';') {  // skip comment line
    goto continue_loop;
  }

  /* normal task */

continue_loop:
  ;
}


while (fgets(buf, sizeof(buf), fp) != NULL) {
  if (buf[0] == ';') {  // skip comment line
    continue;
  }
  else
  {
    /* normal task */
  }
}

while (fgets(buf, sizeof(buf), fp) != NULL) {
  if (buf[0] != ';') {  // skip comment line
    /* normal task */
  }
}

while (fgets(buf, sizeof(buf), fp) != NULL) {
  if (buf[0] == ';') {  // skip comment line
    continue;
  }

  /* normal task */
}
326デフォルトの名無しさん:2001/06/24(日) 22:52
>>323
gotoだと、コピペが難しくなるのが問題なんじゃないか?
327デフォルトの名無しさん:2001/06/24(日) 23:05
>>325
2番目のは continue が要らない典型的な例だと思う。
328デフォルトの名無しさん:2001/06/24(日) 23:15
>>325
自分で書く時は絶対3番目。
329デフォルトの名無しさん:2001/06/24(日) 23:18
インデントの深さと真偽のわかり易さによって3か4のどちらか
330デフォルトの名無しさん:2001/06/24(日) 23:20
>>325
自分で書く時は絶対4番目。
331デフォルトの名無しさん:2001/06/24(日) 23:20
個人的にはcontinueを使った人のプログラムを引き継ぐのは嫌かも。
continueを多用する人はループの記述にwhileを好む傾向にあると思う。
反対にforの方を好む人はcontinueを嫌うのかな?
どちらにしろ宗教だからあまり熱く語らないほうが良いと思うよ。
332sage:2001/06/24(日) 23:40
ああ、二番目、馬鹿だね、これ。

if (buf[0] == ';') {
  /* skip */
}
else {
  :
  :
の間違い。
333デフォルトの名無しさん:2001/06/24(日) 23:44
で、どれがcontinueが要る例なんだ?
選ばせるんじゃなくてお前が必要だと思うのを書けっつってんだよ
334デフォルトの名無しさん:2001/06/24(日) 23:47
4だろ。あほ?
335sage:2001/06/24(日) 23:55
よけいな部分外してるけど、>>325が何をやりたいコードかわかるよね?
にもっと複雑な処理を加えていったときにどうなるか
適当に想像してみよう。

こういうのを定型的に書くとき、1, 2, 3 番で書くのがもっともスマートだと思うなら
止めないから、それでやってね。
336デフォルトの名無しさん:2001/06/25(月) 01:48
何かCのバーチャルマシンって有りませんでしょうか?
処理系とstdio.h程度で良いのですけれど。
あれば弄って遊びたいのです。教えてください。
337デフォルトの名無しさん:2001/06/25(月) 02:26
>>336
インタプリタか?
CINTで検索してみ。
338333:2001/06/25(月) 02:30
>>334
キミ、バカ? != 使えばいいじゃないか。
必要性のあるものを書け、と言ったんだよ。
やっても意味ねーことを書いてどうするんだよ? バカ。
339デフォルトの名無しさん:2001/06/25(月) 02:37
>>338
それは >>325 の 3 番目のコードを使え、という意味だよね? 4 番目を
忌避する理由って何?
340デフォルトの名無しさん:2001/06/25(月) 02:41
>>339
ネストマニアなんだよ。
括弧が10段くらいついてるとカコイイと思ってるんだ
341デフォルトの名無しさん:2001/06/25(月) 02:42
continueもbreakもgotoも全部やってるこた同じじゃ!
制御構文破綻してしまった時の対処療法。
342デフォルトの名無しさん:2001/06/25(月) 02:43
>>338
空行読み飛ばしのロジックを追加したくなったとき
やっぱり、
if(!(buf[0]==';' || buf[0]=='\n')) {
なんですか?

カコイイ!
343デフォルトの名無しさん:2001/06/25(月) 02:44
>>341
returnも中身にいれとくれよ
344デフォルトの名無しさん:2001/06/25(月) 02:47
>>343
忘れてた!thanx
関数がまだ途中なのに出てくる、
頭クラクラしてくるアレね。
345デフォルトの名無しさん:2001/06/25(月) 02:50
>>341
使っていいのは for, while, do - while, if (else) のみという主張? 根拠
を示してくれよ。

continue の使い途については >>342 が代表的なところだが、ほかでも
「原則として処理するが例外的にスキップする」というロジックには、非常
に相性が良い。条件式が単純なものではなくて、副作用のある複数の
操作を途中で挟む場合には 3 のパターンは使いにくいし。
346デフォルトの名無しさん:2001/06/25(月) 02:51
>>341
破綻するような設計ダサイよ

それいうなら、
while, do while, for, if goto
ループ構造書く意味ではどれも同じだよ

で、ifとgotoで制御構造書いても怒らないの?
347341:2001/06/25(月) 03:10
なるべく簡単な制御構文の関数を沢山作るように設計していけば、
自然と処理手順のワープは無くせるって意味だよ。

制御構文こねくり回して複雑にして、破綻の恐怖に怯えながら
仕事するのは嫌だからね。

人に薦められてこういう作り方に変えていったんだけど、
とりあえず簡単な制御構文だけで10年以上メシ食ってるから、
騙されてはいなかったかなと思っている。

まあ、先にいっとくけど、必ず解のある方法論じゃないんだけどね。
仕様によっては、設計の段階でかなり悩むこともあるが、
後で苦しむよりは正解と思う。
348名無しさん:2001/06/25(月) 03:12
fflush(stdio); を使うとエラーになってしまうんですけど、なんで?

エラー E2451 chotto.c 117: 未定義のシンボル stdio(関数 input_file )
エラー E2451 chotto.c 131: 未定義のシンボル stdio(関数 input_line )
349ズバット解決!:2001/06/25(月) 03:13
>>348
stdioが未定義
350デフォルトの名無しさん:2001/06/25(月) 03:14
>>248
s/stdio/stdout/
351名無しさん:2001/06/25(月) 03:18
>>349
本のやつを丸写ししたんだけど、本のやつはstdio定義してないんだよね
352デフォルトの名無しさん:2001/06/25(月) 03:20
>>351
その本晒しキボンヌ
353名無しさん:2001/06/25(月) 03:23
>>352
アスキー・ラーニングシステム実習C言語 三田典玄著
ISBN4-7561-1787-2
354デフォルトの名無しさん:2001/06/25(月) 03:23
>>347
continueは簡単でないですか?
355デフォルトの名無しさん:2001/06/25(月) 03:25
その本ダメだってバヨ
Cの参考書はK&Rにはじまり、ANSI/ISO企画書に移り、
そしてまたK&Rに終わるのだ。

その他の本はすべてK&Rの劣悪な焼き直し。
356名無しさん:2001/06/25(月) 03:28
>>350はどういう意味なんでしょうか?
357338:2001/06/25(月) 03:31
ifとgotoさえありゃ何でもできるんじゃボケ
while()もfor()もdo{} whlie()も必要ねーんだよ!

returnなんか無駄だ
全部mainで書けばいいだろ? バカ
358デフォルトの名無しさん:2001/06/25(月) 03:34
>>357
突き詰めれば、確かにその通りだ。
359348:2001/06/25(月) 03:36
で結局僕が悪いんでしょうか。それとも、本?
360デフォルトの名無しさん:2001/06/25(月) 03:39
>>359
誰もが一度はやるミスなんで、悪くないですよ。

asciiの本に間違いが載ってるのはあたりまえなんです。
361デフォルトの名無しさん:2001/06/25(月) 03:41
>>357
生産性と保守性を考えないなら、それでもいいですね。
でもどうせならアセンブラでやってください。
362デフォルトの名無しさん:2001/06/25(月) 03:43
>>357
mainはどうやって呼ばれるんだろう・・・
363デフォルトの名無しさん:2001/06/25(月) 03:44
>>356
sed.exe というテキスト変換ツールのコマンドだとおもう。
>s/stdio/stdout/
stdioをstdoutに置き換えるコマンド(だったかな?)
昔やった記憶がある。
364348:2001/06/25(月) 03:44
>>360
そうですか。ありがとうございました。それにしてもこの本、改訂3版って書いてあるのに...
365デフォルトの名無しさん:2001/06/25(月) 03:58
>>364
C言語の仕様が何度かかわっているので
それにあわせて何カ所か書き換えてるんだと思います。

決して、誤字脱字を直すための改訂はしてないと思います。
366デフォルトの名無しさん:2001/06/25(月) 09:39
>>365
「決して」ですか?(ワラ
それって出版社の方針?
367デフォルトの名無しさん:2001/06/25(月) 10:29
>>357
> ifとgotoさえありゃ何でもできるんじゃボケ
> while()もfor()もdo{} whlie()も必要ねーんだよ!

> returnなんか無駄だ
> 全部mainで書けばいいだろ? バカ
素晴らしい、その信念を貫きとおしてくれ。

ただし、そのソースは俺に見せるなよ。
猥褻物陳列罪で射殺するかもしれないから。
368真338:2001/06/25(月) 12:25
>>357
偽者を名乗るなら、せめて話の流れが通じるようにしてくれ
369デフォルトの名無しさん:2001/06/25(月) 14:25
関数の最初に必要のある処理かどうかを判定して、
必要なければreturnで返しちゃうのってだめなんですか?
370デフォルトの名無しさん:2001/06/25(月) 15:23
>>369
状況わかんないしな・・・。
オーバーヘッドとか気になるなら先に判定して呼べばいいんでは。
・・・とかって、一概には言えないと思うけれども。
インライン展開されたら関係ないし(笑)
それか、もっと別の問題を言ってるのかな。
371デフォルトの名無しさん:2001/06/25(月) 15:25
いちおあげ
372デフォルトの名無しさん:2001/06/25(月) 15:30
俺は好きだが。
「複数のリターンはいかん!」と言う人は、

foo(args) {
 if (is_argument_error(args)) {
  return ARGUMENT_ERROR;
 }
 if (!need_this_func(args)) {
  return CONDITION_ERROR;
 }

 /* 通常処理 */

 return SUCCESS;
}
みたいなコードも拒否するのかな?
373369:2001/06/25(月) 15:38
>>372
僕もそういう書き方をよくします。
でも上のほうの書き込みをよむと、
だめのような感じだったので聞いてみたのですが
他の人はどうなんでしょうか?
374デフォルトの名無しさん:2001/06/25(月) 15:49
構造化プログラミングの主張に、「関数の出口は一つにする」がある。
375デフォルトの名無しさん:2001/06/25(月) 15:55
>>374
それを守ると、一体どういう御利益があるのでしょう?

良く、int return_codeとかの変数を使って、無理やり関数の最後でリターンする
ようなものを見ますけど(しかもインデントが深い)、そのような構造より>>372
ようなコードの方が見やすいと思いますけど。
376デフォルトの名無しさん:2001/06/25(月) 16:26
>>375
賛成
関数の出口を一つにするなんてのはよっぽどのばかしかやってないよ
377デフォルトの名無しさん:2001/06/25(月) 16:33
上の方であったエラーの場合の処理も含んで…
トラップとか、アボートとかを目的にした場合は、その方が分かりやすいと思う。
仕様変更とかでごちゃごちゃになることも考えにくいし。
ただ、それを前提とした設計の是非が問われるところだが、
代替案があればってところでしょう。

要求された仕様を実現するためにまず制御構文から設計するような手法だと、
仕様変更の度に制御構文を設計し直すハメになりやすい。
仕様を満たす手法をなるべく一般化する方向で設計し、
制御構文はその手法を満たす単なる手段でしかないと思っておけば
今日も安心して眠れるってことでしょう。
それこそ>>357=偽338のいう冗談じゃないけど、if文だけで実現したって
いいんじゃないすか?趣味の範囲内にはして欲しいけど。

あと、誰も触れなかったけど、switch()中のbreak;を書くなという突っ込みなら、
少し話しが違う。
378RIP_MAPIRO:2001/06/25(月) 17:27
ちゃんとコメント入れれば複数の制御分岐でもいけると思うけどな。
というか複雑なアルゴリズムを実現するには、多少の制御分岐は
必要になるわけで、函数の階層化&分散 と 函数当りの制御分
岐数 は反比例な関係にあるわけで、どちらも度が過ぎれば可読
性は極端に落ちる。
あと、複雑なコードを書く必要性がでたらC++への移行も考えてい
いんじゃないかな。
379デフォルトの名無しさん:2001/06/25(月) 17:42
int a[3][5];
a[0][0] = data;



みたいに
int **p;
p[0][0] = data;



で実現したいんですけど、どうやってメモリを確保してやればいいんでしょう?
380アナルサイコー:2001/06/25(月) 17:45
>>379
**じゃなく*でいい
malloc(sizeof(int)*3*5)
381RIP_MAPIRO:2001/06/25(月) 17:45
>>379
本屋に走ってCMagazineを買いなさい。
382デフォルトの名無しさん:2001/06/25(月) 17:46
>>381
・・・Cマガはいかんだろ
383379:2001/06/25(月) 17:50
と思ったけど
実現できました。失礼しました。
384デフォルトの名無しさん:2001/06/25(月) 18:26
>>382
今月号はポインタ特集らしいからじゃないの
385デフォルトの名無しさん:2001/06/25(月) 18:43
>>372
今の職場、

int hogehoge( int a )
{
a = get_nanka();

switch( a )
{
case 0: return( 0 );
case 1: inc( a ); return( a );
case 2: return( 2 );
}

b = get_nanika();
for( i = 0; i < MAX_VALUE; i++ )
{
if( b == 100 ) return( -1 );
b += check_nantoka();
}

return( 0 );
}

みたいなことをする人が山のようにいるのだが
これは問題ないと思いますか?
386デフォルトの名無しさん:2001/06/25(月) 18:46
returnに
カッコをつけるなYO!!
387デフォルトの名無しさん:2001/06/25(月) 18:51
>>386
本題はそれじゃないだろ
388デフォルトの名無しさん:2001/06/25(月) 18:57
>>385
渡された引数を局所変数に転用するのはいただけない。
389デフォルトの名無しさん:2001/06/25(月) 19:14
>>385
たかがループ変数をグローバルで定義すんなYO!!
390385:2001/06/25(月) 20:12
どうやらここには、読解力のないバカしかいなかったようだな・・・
今の職場がどれだけ恵まれているかわかったよ!
パパ!ママ!僕はこの腐った職場で花を咲かせるよう!!
391デフォルトの名無しさん:2001/06/25(月) 20:22
>>390
>>389のメールアドレスはどうなってる?おバカちゃん。
392デフォルトの名無しさん:2001/06/25(月) 20:47
>>390
>>386-389はどう見てもネタ。
393sage:2001/06/25(月) 21:33
>>385
そのコードで開発・保守をやってて
利益がでてるなら、それでいいんじゃない?

でもね、最初に書くときに一般化とわかりやすさのための工夫をすることで
後に発生するであろう様々な無駄な工程が、今よりも、圧縮できるってことを
君が偉くなったときに思い出してね。
そのための手法は、広く公開されているし、特別な投資がいるわけでもないよ。
394デフォルトの名無しさん:2001/06/25(月) 21:41
>>372
その書き方は、昔からよくあるパターンだし、別にいいんでないの?

でも、新規で書くときは使わないな。
emacsとかのマクロで、関数入り口, 出口にどかっと
enter/leaveログを吐くコードとか書き足せるほうが楽でしょ。
395デフォルトの名無しさん:2001/06/25(月) 23:42
教えてぇ〜
どうすれば、PCIバスの情報取得できるの?
本屋立ち読みしたけど、わからな〜い
396デフォルトの名無しさん:2001/06/25(月) 23:43
ユーザーに入力させた文章を、ある関数で受け取り、また他の関数に渡すなんて処理をするとき
一般的な、常識のあるプログラマはどのようにするのでしょうか?
受け取るとき何で受け取り、渡すとき何で渡すのか教えてください。
397デフォルトの名無しさん:2001/06/25(月) 23:44
>>396
ポインタたらい回しの術
398デフォルトの名無しさん:2001/06/25(月) 23:47
ポインタたらい回しは、あくまで見せる、だけだから気をつけてね

んじゃ!
399385(本物):2001/06/25(月) 23:59
>>393
いや、これじゃあダメだと今年入った新卒の僕らが反論しているんですが
先輩は「社会ではこれが常識だ、趣味の世界と一緒にするな」と言ってくるんですよ。
ですから、これが社会で常識のコードなのか知りたくて・・・
400デフォルトの名無しさん:2001/06/26(火) 00:01
>>399
すごい会社だね。辞表の書き方は本屋さんに行けば
わかるから明日有給とって買いにいこう。
401デフォルトの名無しさん:2001/06/26(火) 00:20
ここはC言語のスレだからかもしれないけど、
ここ数年はthrowで飛ばしてcatchで受けるっつうプログラムばっか書いてたから、
385みたいなプログラムは、凄く懐かしい香りがするよ。
復帰値はエラーコードっていうのが、なんだかなつかしいよ。
402デフォルトの名無しさん:2001/06/26(火) 00:37
<4>も早えぇな。議題は相変わらず不毛だが…
403kkIP1A0019.hkd.mesh.ad.jp:2001/06/26(火) 01:29
#include <stdio.h>
main(void)
{
printf("氏ねや");
}
404kkIP1A0019.hkd.mesh.ad.jp:2001/06/26(火) 01:34
#include <stdio.h>
main(void)
{
int a,b;
{
printf("input number n!\n");
b=1;
for(a=1;a<=10;a++)
{
b=b*a;
printf("kekka%2d=%10d\n",a,b);
}
}
}
405デフォルトの名無しさん:2001/06/26(火) 02:09
これをお願いします。別のスレでも聴いたのでですが、
分からなかったので…。
学校の授業で以下のプログラムを説明せよという宿題が出たのですが、
病気で休学していたので、さっぱりです。
どなたか簡単にせつめいしていただけないでしょうか。
まことにぶしつけなのは承知ですがどうかお願いします
分かっていることは、ペイントソフトのプログラムみたいです。



void_fastcall TForm1::BtnCLsClick(TObject *Sender)
{
Image1->Picture->Bitmap->Width=320;
Image1->Picture->Bitmap->Height=240;
Image1->Picture->Bitmap->Canvas->Pen->Color=clWhite;
Image1->Picture->Bitmap->Canvas->Brush->Color=clWhite;
Image1->Picture->Bitmap->Canvas->Rectangle(0,0,320,240);
PaintBox1->Canvas->CopyRect(ClientRect,Image1->Picture->Bitmap
->Canvas,ClientRect);
}
406デフォルトの名無しさん:2001/06/26(火) 02:14
学校でマルチポストは好まれないと教えるべき。
407デフォルトの名無しさん:2001/06/26(火) 02:15
>>405
全ての行を日本語にしてみればすぐわかるよ。
408デフォルトの名無しさん:2001/06/26(火) 05:58
>>408
ネタ?
引数のSenderは何しとるん?
409デフォルトの名無しさん:2001/06/26(火) 06:34
>>408
??
410日本語化バッチ:2001/06/26(火) 10:09
空_急いで呼ぶ TForm1::ボタン消しクリック(TObject*送信器)
{
1つ目の絵>-絵>-ビットマップ>-幅=320;
1つ目の絵>-絵>-ビットマップ>-高さ=240;
1つ目の絵>-絵>-ビットマップ>-キャンバス>-ペン>-色=clWhite;
1つ目の絵>-絵>-ビットマップ>-キャンバス>-ブラシ>-色=clWhite;
1つ目の絵>-絵>-ビットマップ>-キャンバス>-長方形(0、0,320,240);
1つ目の塗る箱->キャンバス->CopyRect(ClientRect、1つ目の絵―絵>>-ビットマップ>-キャンバス、ClientRect);
}
411ハジメテミタ:2001/06/26(火) 10:29
piped = errno==ESPIPE;

errno29のilligal seekですが、この記述の意味がわかりません。。
if(errno==ESPIPE) piped = ESPIPE;
って意味?
piped は int です。
412デフォルトの名無しさん:2001/06/26(火) 10:34
>>411
piped = (errno==ESPIPE ? 1 : 0);

または
if(errno==ESPIPE)
  piped = 1;
else
  piped = 0;
413中途半端くん:2001/06/26(火) 10:35
>>411
piped = ( errno == ESPIPE );
414411:2001/06/26(火) 10:49
>>412,413
ありがとうございます。
UNIXのコマンドのソースを読んでみたら、こんな記述が出てきて戸惑いました。。
もうひとつ教えてください。
char stdbuf[SIZEBUF];
setbuf(stdout, stdbuf);
なのですが、
ストリームのバッファリングがいまいちわかりません。。。
というより、バッファリングがいまいちわからないのですが、簡単に教えていただけますか?
あと、この記述のあと、stdbufは使われていませんが、
ここでは何をやってるのでしょうか?
415411=414:2001/06/26(火) 10:51

標準出力のときstdbufに格納してから、出力しているってことでしょうか?
416デフォルトの名無しさん:2001/06/26(火) 11:53
>>411
一時的にデータを格納する領域。
417デフォルトの名無しさん:2001/06/26(火) 12:40
>>414
> setbuf(stdout, stdbuf);
通常ストリームはBUFSIZ分のバッファを用意しているが、
それを変えたい場合、上記の関数を使用する。

> バッファリングがいまいちわからないのですが、簡単に教えていただけますか?
例えば、ベルトコンベアから次々と荷物が送られてくるとする。
荷物を運ぶコストが非常に大きい場合、1個1個荷物を運ぶよりも
ある程度まとまった荷物を一気に運んだ方が効率が良い。
その荷物を格納しておく場所をバッファといい、手法をバッファリングという。
418デフォルトの名無しさん:2001/06/26(火) 13:29
、下のCプログラムを書き換えてpivot=0やとても小さい数でもちゃんと計算できる
ように下のプログラムを完全なものに
したいのですが・・・
どうやったらいいのですか?
ここをこうかえる、というように具体的に教えて下さい。
マジでお願いします。

#include <stdio.h>
#define IMAX 3
#define JMAX 4


double array[IMAX][JMAX]={

{ 2, 1,-1, 5 },

{-3, 3, 2, 1 },

{ 1,-2,-2,-1 },

};


void PrintMat(void){
int i,j;
for(i=0;i<IMAX;i++){
for(j=0;j<JMAX;j++){
printf("%5.2f ",array[i][j]);
}
putchar('\n');
}
putchar('\n');
}


void SweepOut(void){
int i,j,axis;
double pivot,aik;
for(axis=0;axis<IMAX;axis++){
pivot=array[axis][axis];
for(j=axis;j<JMAX;j++){
array[axis][j]/=pivot;
}
for(i=0;i<IMAX;i++){
if(i!=axis){
aik=array[i][axis];
for(j=0;j<JMAX;j++){
array[i][j]-=array[axis][j]*aik;
}
}
}
}
}


main(){
PrintMat();
SweepOut();
PrintMat();
}
4191:2001/06/26(火) 14:05
age
420411=414:2001/06/26(火) 14:11
>>416,417
ありがとうございます。
理解できました。
421デフォルトの名無しさん:2001/06/26(火) 14:14
ホンをよんでいたら
strName = "test";
って感じで文字列を代入していたのですが
こんなことが許されるのでしょうか?
422デフォルトの名無しさん:2001/06/26(火) 14:17
>>421
strNameの型を書け。
423デフォルトの名無しさん:2001/06/26(火) 14:37
>>421
問題ない。許される。
424新米PG:2001/06/26(火) 14:46
シリアル通信がうまくいかない!

VC6.0でデータ受信がうまくいっていません
調査した所、ReadFileの読み込みで1024バイト以降のデータ
が異常なデータになっていました。
なにか設定が足りないのだと思いますがわかりません。。。
熟練の皆様お願いします。
425辣腕PG :2001/06/26(火) 15:05
>424
ネタ?

たったそれだけ書いて何をどうしろと?
426デフォルトの名無しさん:2001/06/26(火) 15:11
>>425
1を聞いて10を知る練習をしろ、と言っているのでは?
実際こういう質問をしやがるプログラマは多いからな。
427デフォルトの名無しさん:2001/06/26(火) 15:20
>>425
わからないのところは創造で補うべし。創造だぞ。
428新米PG:2001/06/26(火) 15:38
>>425
すみません、素人さんにはわからない説明をしてるので
ごめんなさい。
429デフォルトの名無しさん:2001/06/26(火) 15:41
文字列を右端と左端の空白部分を計算する
ことで、中央にそろえるプログラムを勉強
しますが、本には下のように書いて
いました。しかし、これだとrigのほうが
上手くいきません。(printfで調べました。)
この記述は間違っているのでしょうか?

n=strlen(s);//
for(i=0;i<n;i++)
if(! isspace(s[i])) break;
lef=i;
for(i=n-1;i>=0;i--)
if(! isspace(s[i])) break
rig=n-i-1 ;
k=(lef+rig)/2;

(C言語集中ゼミ softbank刊 P174)
430デフォルトの名無しさん:2001/06/26(火) 15:54
>>428
あんまなめんな。
素人じゃなくたってわかんねーよ。
せめてCreateFileのパラメータくらい全部かいとけやゴルァ!
431民生:2001/06/26(火) 16:14
S−JIS ⇔ EUC の変換をするにはどうすればいいですか?
432デフォルトの名無しさん:2001/06/26(火) 16:18
>>431
Winなら秀丸に食わせて、s-jisで保存したりeucで保存したりします
Linux/Unixならnkfに食わせます
system関数を使うとよいでしょう
433デフォルトの名無しさん:2001/06/26(火) 16:37
>>431
system("nkf -S -e <sjisfile >eucfile");
system("nkf -E -s <eucfile >sjisfile");
434新米PG:2001/06/26(火) 16:39
>>430
すみません、ちょっとかじった人にもわからない説明をしてるので
ごめんなさい。
435民生:2001/06/26(火) 16:45
>>433

まじ助かります。ありがとうございます。
436民生:2001/06/26(火) 16:47
>>433

変数レベルで変換するにはどうしたらいいですか?
437デフォルトの名無しさん:2001/06/26(火) 16:48
>>431
そんなもん検索すればいくらでも出てくるだろうに。
http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/
438デフォルトの名無しさん:2001/06/26(火) 16:50
>>434
再現可能な情報をくれ。
5W1Hって知ってるか?
厨房じゃなきゃ意味わかるよな?

Read時ってことは送られてくる情報が1024bytesで切れてて、
あとはゴミッちゅう可能性もあるが、相手にもよるよな。
439デフォルトの名無しさん:2001/06/26(火) 17:07
>>434
少なくともお前より経験も実績もあるが何か?
「設定が足りないんだと思います」とか書いておきながらその肝心の設定を
何一つ書いてなけりゃ答えようがねえよ。
440デフォルトの名無しさん:2001/06/26(火) 17:08
>>428 >>434
>>424には「説明」らしきものは何も書いてないんだが。
441デフォルトの名無しさん:2001/06/26(火) 17:26
>>439
経験と実績だけの方ですね、なんの実績だか・・・(冷汗)
経験豊富なあなたもごめんなさい。
>>440
>428の理由により、ごめんなさい。

たまに出来る人が混じってる2ちゃんですが
今回はみんなはずれみたいなので、終了します。
442デフォルトの名無しさん:2001/06/26(火) 17:50
なんだ真厨か。
443デフォルトの名無しさん:2001/06/26(火) 18:24
const int MAX = 100 ;
const int * pMAX = &MAX ;
int i = 50 ;
pMAX = &i ;

のとき、*pMAXの値は何か?
プログラムせずに答えよ。

と言われて困っています。

pMAX が const だから
pMAX = &i ;は出来ないんじゃないかと思うので

*pMAXは 100だと思うんだけどあってる?
444デフォルトの名無しさん:2001/06/26(火) 18:30
>>443
50
445デフォルトの名無しさん:2001/06/26(火) 18:33
なぜでしょうか?

pMAX = &i ;

がどうして可能なのか分かりません。const指定してるのに。
446デフォルトの名無しさん:2001/06/26(火) 18:36
>>445
int const* pMAX =&MAX;
なら、
pMAX = &i;
はできない。
447デフォルトの名無しさん:2001/06/26(火) 18:36
>>445
50
448445:2001/06/26(火) 18:37
?>446
どこが違うのでせう!?
449445:2001/06/26(火) 18:40
constキーワード指定の場合、派生の順序がよくわかっていません。>俺
450デフォルトの名無しさん:2001/06/26(火) 18:42
int * const p; // const な 「intへのポインタ」
const int * p; // 「const int」へのポインタ
451新米PG:2001/06/26(火) 18:43
追記
直りました、やはりあの書き込みで説明不足って事はなかったみたいです。
他の掲示板にも意見を求めたらあっさり解決。
ちょっと2ちゃんにはがっかり。
452厨房PG:2001/06/26(火) 18:44
>>451
何が原因だったの?
僕も同じようなことをやるかもしれないから
参考までに教えてほしいです
453デフォルトの名無しさん:2001/06/26(火) 18:46
>>452
ほっとけ。ただの煽りだ。
454445:2001/06/26(火) 18:52
>int * const p; // const な 「intへのポインタ」
>const int * p; // 「const int」へのポインタ

うーん、では
const * int p と
int const * p はどうよむのでしょうか(日本語訳!?すると)?
455sage:2001/06/26(火) 18:55
>>454
K&R読んで勉強しとけ

int main()
{
int a = 0;
const int *p1 = &a; /* 変更不可能な, intを指すポインタ */
int const *p2 = &a; /* 変更不可能な, intを指すポインタ */
int * const p3 = &a; /* intを指す, 変更不可能なポインタ */

*p1 = 1; /* error */
*p2 = 1; /* error */
*p3 = 1;

p1++;
p2++;
p3++; /* error */

return 0;
}
456445:2001/06/26(火) 18:59
>>455
446さんは
*p1 = &a; /* ok */
*p2 = &a; /* error */
と言ってるのですが!?
457sage:2001/06/26(火) 19:00
const int *p1 = &a; /* 変更不可能なintを指すポインタ */
int const *p2 = &a; /* 変更不可能なintを指すポインタ */
int * const p3 = &a; /* intを指す変更不可能なポインタ */
のほうがわかりやすいか。
おまけ
const int * const p4 = &a; /* 変更不可能なintを指す変更不可能なポインタ */
458新米PG:2001/06/26(火) 19:01
>>452
DCBでした。
気をつけてね。
>>453
勉強しましょうね。
459445最後の質問:2001/06/26(火) 19:04
>>457
有難うございました。「おまけ」で納得できました。

最後に
const int
int const
どっちを先に書いても同じなのですね?質問ばかりですいません。
460445:2001/06/26(火) 19:07
同じだとすると446さんは間違えたのだろうか。
461デフォルトの名無しさん:2001/06/26(火) 19:12
>>458
痛い煽り(w
DCBなのはわかりきってるだろ。DCBのどのメンバだよ(w
知ってる単語並べりゃいいってもんじゃねえだろ(プ
462デフォルトの名無しさん:2001/06/26(火) 19:40
>>460
そゆこと。
463460:2001/06/26(火) 19:57
>>460 >>462
御意。
正しくはconst* int 〜だったね。
宇津出汁脳。
464445:2001/06/26(火) 20:24
>>460
いや、ご回答頂いただけでも感謝してます。マジで。

でもsage.
465デフォルトの名無しさん:2001/06/26(火) 20:37
画像処理での、「輪郭線(境界線)追跡」を行うプログラムが書けません。
誰か教えて下さい。お願いします。
466デフォルトの名無しさん:2001/06/26(火) 20:40
>>465
追跡か?
ある点から周りを見渡して現在の点と最も近い値を持つ点に移動。
これを繰り返す。

「ある点」は輪郭抽出とかであらかじめ探しておく。
467465:2001/06/26(火) 23:09
>>466
よくわかりません。
468デフォルトの名無しさん:2001/06/26(火) 23:14
>>465
http://www.gctv.ne.jp/~tsugu/sotuken/binedge/

よく知らんが検索かけたらうじゃうじゃ出てくるぞ。
あとマルチポストは止めろよな。Cとも関係ないしな。
469デフォルトの名無しさん:2001/06/26(火) 23:18
>>467
とりあえず、この板の住人はマルチポストするような厨房に教えてくれるほどお人好しでも暇人でもないって事だ。
470デフォルトの名無しさん:2001/06/27(水) 00:45
>>468
マルチポストに対する注意はマルチポストしていいの?
471デフォルトの名無しさん:2001/06/27(水) 00:53
放置しとけ
472デフォルトの名無しさん:2001/06/27(水) 01:13
>>429
breakの後に;を忘れている。
473デフォルトの名無しさん:2001/06/27(水) 01:18
>>472
おいおいそのくらい大目に見ようぜ
474デフォルトの名無しさん:2001/06/27(水) 10:10
2次元配列を動的に用意するのはどうすればよいのよ!
475デフォルトの名無しさん:2001/06/27(水) 10:11
>>474
動的にメモリ確保
476初心者:2001/06/27(水) 11:04

下記のソースがまともに動きません。なぜでしょうか?
コンパイラはエラー0,警告0で通ります。
Nを1000にすると問題なく動くのですが。
sizeof(int)は2です。

#include <stdio.h>
#include <stdlib.h>

#define N 10000

main()
{
int i,d[N];

for ( i=0 ; i<N ; i++ )
{
printf ( "%d ",d[i]=rand() );
}

return 0;
}

環境:Duron800/128M/HD60G/Windows98SE(DOS窓)
言語:LSI-C86試食版
477デフォルトの名無しさん:2001/06/27(水) 11:08
>476
スタックがあふれているから。int d[N]をmainの上に持っていくと動くはず。
478よお:2001/06/27(水) 11:11
AIXでは、動いてるぞ
おそらくLSI-C86の何らかの制限に引っ掛かってると思うけど
479初心者:2001/06/27(水) 11:22

ありがとうございます。
int d[N]をmain()の上に持っていくと動きました。
Nを30000にしても動きました。
スタックがあふれるなんて、再帰的なことをしない限り
気にすることないと思っていたのですが、勉強不足でした。
480デフォルトの名無しさん:2001/06/27(水) 11:51
>>479
> スタックがあふれるなんて、再帰的なことをしない限り
> 気にすることないと思っていたのですが、勉強不足でした。
LSIC86はかなり古いコンパイラだからな。
# intが2byteだし、near, farポインタがあるし...

LSIC86ではSモデルでは2500byteのスタックをデフォルトで用意する。
必要なスタックを確保したい場合、コンパイルオプションに
-k'-s 2000'を追加する。これで8kのスタックが確保できる。

詳しい話はマニュアルLSIC86.manの3.9 スタックの大きさ
を見てみよう。
481デフォルトの名無しさん:2001/06/27(水) 12:12
関数でmemset関数とmemcpy関数の機能がついてないのでmemsetとmemcpyの
サブルーチンを作らなくてはいけないのですが、ソースは具体的にいうとどのようになるのでしょうか?
初心者なので難しいです。

void *memset(void *s,int c,size_t)
{
void *a[size_t];
int b = 0;
strcpy(a,b);
return(a);
}

まさかこんなソースになるわけないし。。。
482>481:2001/06/27(水) 12:16
システムコール使っていいのか?
483デフォルトの名無しさん:2001/06/27(水) 12:24
>>481
新卒で、先輩から
「Cの勉強がてら、memsetとmemcpyを自力で作ってみ」
と言われたとかいうことじゃないよな?
484デフォルトの名無しさん:2001/06/27(水) 12:25
>>481
memcpyがなくてstrcpyがある・・・どういう環境だ?
485デフォルトの名無しさん:2001/06/27(水) 12:39
>>481
/* ネタ用memset */
void *memset(void *s,int c,size_t n)
{
  return memmove(s, c, n);
}

/* 先輩が予期しているmemset */
void *memset(void *s,int c,size_t n)
{
  unsigned char *p = s;
  int i;
  for(i = 0; i < n; n++) {
    p[i] = c;
  }
  return s;
}

memcpyはこれを参考にして自分で作れ
486デフォルトの名無しさん:2001/06/27(水) 12:43
>>481
たのむからK&Rくらい読んでくれ。
487デフォルトの名無しさん:2001/06/27(水) 12:46
お前は次に 「K&Rってなに?」 と言う!
488デフォルトの名無しさん:2001/06/27(水) 13:02
481さん、ありがとうございます。
大変恥ずかしいっす。。。
489デフォルトの名無しさん:2001/06/27(水) 13:10
>>485
i++だよな?
490デフォルトの名無しさん :2001/06/27(水) 13:12
K&Rってなに?
491デフォルトの名無しさん:2001/06/27(水) 13:16
ちなみに
for(i = 0; i < n; i++) {
ですよね?
492デフォルトの名無しさん:2001/06/27(水) 13:30
VCのプログラムを高速化をしたいので
ソースのどの部分がオーバーヘッドになっているのかを調べたいです
確か、各関数の実行時間を調べる関数があったと思いますが・・・
教えて下さい
493デフォルトの名無しさん:2001/06/27(水) 13:32
void *memset(void *s,int c,size_t n)
{
  unsigned char *p = s;
  int i;
  for(i = 0; i < n; i++) {
    p[i] = c;
  }
  return p;
}
494デフォルトの名無しさん:2001/06/27(水) 13:33
>>489, >>491
yes しくじった。
495デフォルトの名無しさん:2001/06/27(水) 14:05
戻り値は、
return p;
ではないのですか?
496デフォルトの名無しさん:2001/06/27(水) 14:09
497496:2001/06/27(水) 14:11
498デフォルトの名無しさん:2001/06/27(水) 14:14
>>492
関数?
profilingでなくて?
499デフォルトの名無しさん :2001/06/27(水) 23:11
会社でボーナス査定システムを作成することになりました。今年のボーナスは
ボーナス=(基本給*2.3)+能力給+ボーナスポイント
という計算で求める。基本給とボーナスポイントは下の通り。
勤務年数    基本給    ボーナスポイント
0−5年    80000  10000
6−10年  100000  12000
10−15年 120000  15000
16年以上  150000  18000
ランク  能力給
 A   基本給*3      
 B   基本給*2.5
 C   基本給*2
 D   基本給*1
という問題があるんですが、自分で作ったプログラムが下にあるのですが、
エラーが1つあるのですが、どこかわかりません。自分では完璧だと思うですが。
だれか、教えてください。

基本給=kihon 能力給=nou ボーナスポイント=point 勤務年数=nennsu
ランク=rank ボーナス(答え)=answer
#include <stdio.h>
int main(void)
{
int nennsu,kihon,nou,point,answer;
char rank;
printf("勤務年数は?");
scanf("%d",&nennsu);
printf("ランクは?");
scanf("%s",rank);
if(nennsu>=16){
kihon = 150000;
point = 18000;
}
else if(nennsu>=11){
kihon = 120000;
point = 15000;
}
else if(nennsu>=6){
kihon = 100000;
point = 12000;
}
else{
kihon = 80000;
point = 10000;
}
if(rank= 'a'){
nou = kihon * 3;
}
else if(rank = 'b'){
nou = kihon * 2.5;
}
else if(rank = 'c'){
nou = kihon * 2;
}
else (rank = 'd'){
nou = kihon * 1;
}
answer = (kihon * 2.3) + nou + point;
printf("あなたのボーナスは、%dです",answer);
return 0;
}
500中途半端くん:2001/06/27(水) 23:33
>>499
エラーは2点
・ifがいっかしょぬけてる
・ださいこーどかくな
501デフォルトの名無しさん:2001/06/27(水) 23:45
どこ?抜けてないよ。
初心者なの、ださくてごめん
502デフォルトの名無しさん:2001/06/27(水) 23:46
>>429は何が問題なの?
503デフォルトの名無しさん:2001/06/27(水) 23:48
>>502
うまく動かないのならだめってことだよ。
504デフォルトの名無しさん:2001/06/27(水) 23:58
>>429
sが何のときうまく動かないの?
505デフォルトの名無しさん:2001/06/28(木) 00:05
要素数が100の整数型配列aを定義し、for文を利用して配列の要素を
すべて0にする文を示しなさい。

こんな問題があるんですけど、配列の要素をすべて0にするという意味がわかりません。
わかる方いたら何方か教えてください。
506中途半端くん:2001/06/28(木) 00:07
>>505
int a[100],i;
for(i=0;i<100;i++)a[i]=0;
507デフォルトの名無しさん:2001/06/28(木) 00:09
>>499
ifの中の代入式って…。
それとswitch使おうね。
というか、Cの教科書読もう。
508デフォルトの名無しさん:2001/06/28(木) 00:10
>>505-506
宿題スレでやれ。
509デフォルトの名無しさん:2001/06/28(木) 00:17
int a[100];
bzero((sizeof int)*100);
510デフォルトの名無しさん:2001/06/28(木) 00:18
>>509
int a[100];
bzero(a,(sizeof int)*100);
511デフォルトの名無しさん:2001/06/28(木) 00:27
>>510
先生に怒られるんじゃないの?
512504:2001/06/28(木) 00:33
>>504
放置しないで(><;)
513デフォルトの名無しさん:2001/06/28(木) 00:34
>>511

int a[100];
for (a[0]=1;a[0];){
bzero(a,(sizeof int)*100);
}
514デフォルトの名無しさん:2001/06/28(木) 00:47
int a[100];
for(a[0]=1;;a++){
if(a[0]==99){
a[0]=0;
break;
}
a[a[0]]=0;
}
515デフォルトの名無しさん:2001/06/28(木) 00:49
int a[100];
for (bzero(a,(sizeof int)*100);0;);
516デフォルトの名無しさん:2001/06/28(木) 00:50
sのなかみが長さゼロの文字列の時何が起こる?
>>512
517デフォルトの名無しさん:2001/06/28(木) 00:55
>>507
技術評論社の「C言語によるはじめてのプログラムレッスン1」の一番最後の問題
なんだけど、問題集の答えだと、たくさん行があり、この一冊をやった知識で
自分で作成したプログラム。だから、答えが無いし、初心者だから、エラーになって
しまう理由を教えて。
518デフォルトの名無しさん:2001/06/28(木) 01:02
typedef struct sHOGE{
int a[100];
}HOGE;
HOGE i={0};
int a[100];
*(HOGE*)a=i;
519デフォルトの名無しさん:2001/06/28(木) 01:04
typedef struct sHOGE{
int a[100];
}HOGE;
HOGE i={0};
int a[100];
for(*(HOGE*)a=i;0;);
520512:2001/06/28(木) 01:08
>>516
(?_?;)
長さが0だとlefもrigも0でいいのかなぁ・・・?
521名無し:2001/06/28(木) 01:08
>>514
配列宣言した a を a++ は違うだろ

むかしZ80のコードでいかにして64Kすべてをクリアするかという
問題があった。プログラム自信も消してしまうのだ
522デフォルトの名無しさん:2001/06/28(木) 01:16
>>521
あうー
a[0]++の間違いっす。
523sage:2001/06/28(木) 01:22
こういうの書いたことあるなあ。

とりあえず、コンパイラのエラーと警告文をすべて読んで、理由を調べてみること。
がんばれ。
524デフォルトの名無しさん:2001/06/28(木) 01:34
もしかして
strlen("")が返す値は未定義(._ .;?
525デフォルトの名無しさん:2001/06/28(木) 01:40
>>524
なんで?
0だろう?
526524:2001/06/28(木) 01:42
んなわけないか(;^_^
527デフォルトの名無しさん:2001/06/28(木) 01:46
じゃ、n==0だと、

n=strlen(s);

for(i=0;i<n;i++)
 if(! isspace(s[i])) break;
lef=i;

for(i=n-1;i>=0;i--)
 if(! isspace(s[i])) break

rig=n-i-1 ;

k=(lef+rig)/2;

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

for(i=0;i<0;i++)
 if(! isspace(s[i])) break;
lef=i;

for(i=0-1;i>=0;i--)
 if(! isspace(s[i])) break

rig=0-i-1 ;

k=(lef+rig)/2;
528sage:2001/06/28(木) 01:48
>>524
とくに、sがNULLの時以外は平気みたいだね。

s = " "; /* 空白三つ */
のとき
lef, rig が共に3にならない?
529デフォルトの名無しさん:2001/06/28(木) 01:50
nが0でもいいと思うけどな〜

for(i=0;i<0;i++)
 if(! isspace(s[i])) break;
lef=i;   // i == 0 なので lef == 0

for(i=0-1;i>=0;i--)
 if(! isspace(s[i])) break;
rig=0-i-1; // i == -1 なので rig == 0

k=(lef+rig)/2;
530デフォルトの名無しさん:2001/06/28(木) 02:06
>>528
sが空白3つの時、lefとrigは3になりますが、
それは意図した動きだと思います。

sがNULLだと駄目ですね。
>>429
strlenで失敗するから、rig以前の問題・・・?
429さんは何の文字列でチェックしたのかな〜(・_・ )
531sage:2001/06/28(木) 02:28
fgetでとってきてて
\r\nがついてるのに一票
532デフォルトの名無しさん:2001/06/28(木) 02:51
c言語の質問ってわけではないですが・・・。

再帰を解説する書籍やページにはよく、クイックソートがのっていますよね。
だいたいの本は「これを再帰を使わずに書くとかなり厄介なことになるので・・・」
などと書いていますが、実際にどんなプログラムになるのか書いているのはすくないです。
そこで、自分で繰り返し版に直してみようと思ったんですが玉砕しました。

どう書けばいいんでしょう?また、どこかにソースがのっているページってありますか?
533デフォルトの名無しさん:2001/06/28(木) 02:59
>>532
その時点で目的は達成されてるんじゃないのか?
「かなり厄介なことになる」というのは体感できたんだろ?
534デフォルトの名無しさん:2001/06/28(木) 03:14
>>533
532はどんなプログラムになるのかを知りたいのであって、
どんな結果になるのかを知りたいのじゃないから
目的は達成されてないだろ・・
535デフォルトの名無しさん:2001/06/28(木) 03:27
>>532
そういえば俺も見たことないなあ。
ゼロから作るとしたら、元データと同量のワークエリアを
確保していいのならすぐできそうだけどね。
536デフォルトの名無しさん:2001/06/28(木) 03:35
>>532
厄介でもないよ。

int *quick_sort(int *a, int n)
{
 int pivot, h, l, *high, *low, sp;

 high = (int*)malloc(sizeof(int)*stack_size(n));
 low = (int*)malloc(sizeof(int)*stack_size(n));

 high[0] = n - 1;
 low[0] = 0;
 sp = 1;

 while(sp > 0){
  sp--;
  h = high[sp];
  l = low[sp];

  if(h <= l)
   ;
  else{
   pivot = partition(a, h, l);

   high[sp++] = h;
   low[sp++] = pivot + 1;
   high[sp] = pivot - 1;
   low[sp] = l;
  }
 }
}

partition()とかは自分で作れ。バグあったらごめん。
537デフォルトの名無しさん:2001/06/28(木) 03:50
>>532
ちゃんと書こうとすると多少やっかいかな。
再帰で引き渡す引数を保管しとかないといけないですから。
引数になる値を配列なんかに入れてとすれば
あとはオーバーフローさせないようにすればいいだけか。
一日悩めば出来るでしょう。

どっかの本で見たような記憶もあるけど何だったか忘れた。
538532:2001/06/28(木) 04:22
>>533 - 537
いろいろ、ありがとうございます。

ただ、c言語(というよりプログラミング)を勉強しつつやっているもんで
あんまりややこしいことはまだできないですが・・・。がんばって、やってみます。


アルゴリズムの勉強っておもしろいですね。文法覚えるよりずっと楽しいです。
C言語の入門書は山ほどあるのに、アルゴリズムの本って少ないようなきがしますが、
いいのはありますか?(っていうのはスレ違いかな)
539デフォルトの名無しさん:2001/06/28(木) 05:12
>538
おすすめなのかはよく分からんけど
アルゴリズム辞典(奥村晴彦著)だとバグフィックスされたソースが
ネット上ですべて手に入るからいいかもしれない。
540536:2001/06/28(木) 06:09
return a; 忘れたよ……。
541デフォルトの名無しさん:2001/06/28(木) 06:51
>>539
どっからに手に入るの?
542532:2001/06/28(木) 07:00
>>539
多分これです

http://www.vector.co.jp/soft/data/prog/se002453.html

>>536
せっかく書いていただいたのに、解読できません。
もっと基本的なことからやらないといけないのかも・・・。
しっかりやります。
543532:2001/06/28(木) 07:02
すいません。間違いです
× >>539
>>541
544デフォルトの名無しさん:2001/06/28(木) 08:56
>>539
アルゴリズム事典は初心者にはだめだろ。
あれは説明がわかりずらいぞ。
Cプログラマのためのアルゴリズムとデータ構造
SOFTBANK
から始めるのがいいんじゃないの
545デフォルトの名無しさん:2001/06/28(木) 09:48
C言語でURLエンコード・デコードする関数を教えてちょ
546デフォルトの名無しさん:2001/06/28(木) 10:14
自分で作れ。
547デフォルトの名無しさん:2001/06/28(木) 11:34
char input[256];
char output[256];

int enUML(char* MOTO,char* HENKANGO){
     write(1,"後は任せた!!\n",13);
}
548デフォルトの名無しさん:2001/06/28(木) 12:01
bitset関数とbitget関数の環境がないので自作するように言われてるけど
アルゴリズムが・・・

void *bitset(A,bit)
{
int *d=A;
int i = d + bit;
int m;
while(*d>0){
m = (*d)%2;
*d=m;
if(i==d)
*d++;
d++;
}
}

これだと、駄目な気がします。誰か教えてください。
549ぶっふばると:2001/06/28(木) 12:20
>>548
int bitset( int A, int bit )
{ return A | 1<<bit ; }

int bitget( int A, int bit )
{ return A>>bit | 1 ; }
550けろ:2001/06/28(木) 12:24
>>549
下は & だよね
551ぶっふばると:2001/06/28(木) 12:31
>>550
わざとです(>>548への愛のムチ)

うそです。すみません。てきとうにかいてました。
552デフォルトの名無しさん:2001/06/29(金) 00:45
>>549
int bitset( int A, int bit )
{ return A | (1<<bit) ; }

優先度注意。
553デフォルトの名無しさん:2001/06/29(金) 00:51
欝だ。あってた。氏のう。
554デフォルトの名無しさん:2001/06/29(金) 02:43
>>549
bitset(int A, int bit)
が A の bit目のビットを1にするってのなら
int bitset(int A, int bit)
{ return A | (1<<bit-1); }
じゃないんですか?
555デフォルトの名無しさん:2001/06/29(金) 02:46
(bit-1)
556shige:2001/06/29(金) 03:01
通常の表現:
ブッ殺してやる!


ていねい語表現:
死にますよ〜
557shige:2001/06/29(金) 03:20
まだCなんて使ってるんですか (嘲笑)

君らにはrubyなんて理解も出来ないと思うけどね。
558デフォルトの名無しさん:2001/06/29(金) 03:22
自爆だね(w
559どーでもいいことだが:2001/06/29(金) 03:34
>>554
ふつー、MLB が 0。
560初心者:2001/06/29(金) 03:45
>>552
<<,>>の方が | よりも優先度が上。覚えとこう。
だけど、誤解を招かない、という意味で括弧を記述するのなら良し。
561デフォルトの名無しさん:2001/06/29(金) 04:16
>>557
大抵のRubyユーザはUNIX野郎なのでCをカリカリ書きますよう。
大体RubyのソースはCで書かれているし……
562shige:2001/06/29(金) 06:38
熊ヒゲの誘惑・触れ合う体毛モンゴル相撲の巻
563デフォルトの名無しさん:2001/06/29(金) 08:59
何? 職場でいじめられたの?
564865:2001/06/29(金) 10:02
>>559
MLBって何?MSBの間違いでしょ。
それにどっちが0かはエンディアンネス次第。
リトルエンディアンだと普通はLSBが0ビットだよ。
565デフォルトの名無しさん:2001/06/29(金) 11:20
>>564
いや、エンディアンに関わらずLSBが0だろ。
566564:2001/06/29(金) 12:13
>>565
ビッグエンディアンだとMSBが0ビットって書いてある事多いよ。
567デフォルトの名無しさん:2001/06/29(金) 12:22
バイトを反転させて受け取るdatget関数と反転させてセットするdatset関数を
作っているけど他の型に対応させるのが難しいです。

char *datget(char *d,int n)
{
int i;
char *dd;
dd = d;
for (i = 0; i < n; i++)
dd[i] = d[n-i-1];
dd[n] = '\0'
return(dd);
}

じゃ、違うと思うし・・・。誰かわかりますか?
568デフォルトの名無しさん:2001/06/29(金) 12:38
こんなとこか?

char *datget(char *d, int n)
{
int i;
for(i=0; i<n/2; i++) {
char dd;
dd = d[i];
d[i] = d[n-i-1];
d[n-i-1] = dd;
}
return dd;
}
569568:2001/06/29(金) 12:41
鬱だ。

誤 return dd;
正 return d;
570デフォルトの名無しさん:2001/06/29(金) 12:47
>>567
> 他の型に対応させるのが難しいです。
void *datget(void *d,int n)
にして、関数内部ではunsigned char *で扱え。

> dd[i] = d[n-i-1];
2つの値(a, b)の交換を行う為にはもう一つ変数(t)がいる。
xorとか変なテクニックを使わない限り
t = a; a = b; b = t;
としないと交換できない。

また、d = "1234567", n = 7の場合
dの0番目とdの4番目を交換d = "7234561"
dの1番目とdの3番目を交換d = "7634521"
dの2番目とdの4番目を交換d = "7654321"
dの3番目以降は交換する必要はない。

ヒントは以上、検討を祈る
571デフォルトの名無しさん:2001/06/29(金) 13:32
void ludcmp(float **a,int n,int *indx,float *d)
をmain関数で呼出したいのですが、引数をどのようにしたら
いいのか、わかりません。多分 a は配列だと思うのですが、
どなたか分かる方よろしくお願いします。
572中途半端くん:2001/06/29(金) 13:40
>>571
float **a,*d;
int n,*indx;
ludcmp(a,n,indx,d);
573デフォルトの名無しさん:2001/06/29(金) 13:52
>>567
datgetとdatset何が違うの?同じでいいと思うんだが
ソースを見る限りだと汎用のbyteswap関数作れば事足りる

>>570
void *は賛成だけどunsigned char *にする必要はないと思われ
つーか、どっちでもいいと思う
574デフォルトの名無しさん:2001/06/29(金) 13:53
>>566
手元にある数種類のプロセッサのマニュアル見てみた。

ちなみにMC68000、SH3、H8/300、TMS320DSPすべてビッグエンディアンだが
MSBが0になってるのはひとっつも無いぞ。。
575デフォルトの名無しさん:2001/06/29(金) 14:03
>>573
> void *は賛成だけどunsigned char *にする必要はないと思われ
void *dだとd[i]とするとは文法エラー。
dはなんらかの型にcastする必要がある。
byte単位に処理を行う仕様なのでchar *, unsigned char *が適切。
unsigned char *としたのは俺の趣味
576デフォルトの名無しさん:2001/06/29(金) 16:50
567ですが、これでは無理でしょうか?

char *datget(void *d, int n)
{
int i;
unsigned char *dd;
for(i=0; i<=(n-i-1); i++) {
dd = d[i];
d[i] = d[n-i-1];
d[n-i-1] = dd;
}
return d;
}
577573:2001/06/29(金) 17:28
>>575
言葉不足でした。unsigned char *にする必要ないってのは
無駄に長くなるから、char *でも大丈夫ってこと。

結果はどっちでも一緒でしょ?
578デフォルトの名無しさん:2001/06/29(金) 17:33
>>576
とりあえずコンパイル*だけ*は通すようにする
論理的なエラーは自分で見つけよう
> char *datget(void *d, int n)
char *datget(void *d, int n)

> unsigned char *dd;
char dd;

上記2個所を修正し、さらに
int main(void){
  char s[] = "123456789";
  char *p;
  p = dataset(s, strlen(s));
  printf("%s\n", p);
}
を付けて自分の思っている通りに動くかどうか確認しろ。
"987654321"と出力できれば正常だろう。

他の型に対応するのはまずこれができてからだ。
579573:2001/06/29(金) 17:48
>>576
要素数が奇数の時に一回無駄にループする。

void *datget(void *d, int n)
{
char *p1 = (char *)d;
char *p2 = (char *)d + n;
while (p1 < p2) {
char t = *p1;
*p1++ = *--p2;
*p2 = t;
}
return d;
}
580デフォルトの名無しさん:2001/06/29(金) 18:30
>>564
MLBは間違えた。LSBだな。Least Bit。
エンディアンは関係ないよ。メモリとレジスタをごっちゃにしないこと。
581デフォルトの名無しさん:2001/06/29(金) 18:53
>>576
void *datget(void *d, int n)
{
char *p1 = (char *)d;
char *p2 = (char *)d + n;
while (p1 < p2) {
*p1 ^= *--p2;
*p2 = *p1^*p2;
*p1++ ^= *p2;
}
return d;
}
とか。
582581:2001/06/29(金) 18:58
>>581
しかし効率わるいね(^^;
583デフォルトの名無しさん:2001/06/29(金) 19:38
配列で宣言の時に要素数を指定せずにその最大値を
途中で変更したりしたいのですがどうしたらいいですか。
584デフォルトの名無しさん:2001/06/29(金) 19:56
>>583 こうやればいい
#include <stdlib.h>

int main()
{
  int i;
  int* p;

  p = (int*)malloc( sizeof(int) * 10 );
  if( p == NULL )return 1;

  for( i=0; i<10; i++ ){
    p[i] = i;
    printf( "p[%d]=%d\n", i, p[i] );
  }


  p = (int*)realloc( p, sizeof(int) * 20 );
  if( p == NULL )return 1;

  for( i=0; i<20; i++ ){
    p[i] = i;
    printf( "p[%d]=%d\n", i, p[i] );
  }

  free( p );

  return 0;
}
585デフォルトの名無しさん:2001/06/29(金) 20:53
すいません。下のダイクストラのアルゴリズムで最短経路を始点から表示させる方法が
どうしても解りません。どうか教えてください。すいません。

include <stdio.h>
#define s 10000
#define v 30
#define YES 1
#define NO 0

int main(void);
int Min(int, int);
int MinSearch(int l[v], int c[v],int);
int n;
int main(void)
{
int i, j,k;
int sel[v], chk[v], distance[v];
int weight[v][v];
 printf("頂点の数を入力せよ");
scanf("%d",&n);
printf("各頂点間の距離を入力せよ\n");
 for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
printf("%d-%d:\n",i,j);
scanf("%d",&weight[i][j]);
}
}

for(i=1;i<=n;i++){
chk[i] = NO;
distance[i] = s;
}
printf("始点となる頂点を入力せよ : \n", n );
scanf("%d", &sel[0]);
chk[sel[0]] = YES;
distance[sel[0]] = 0;

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



if(chk[j] == NO){
distance[j] = Min(distance[j], distance[sel[i-1]] + weight[sel[i-1]][j]);

}
}
sel[i] = MinSearch(distance, chk,n);

chk[sel[i]] = YES;
}


for (i = 1; i <=n; i++) {
printf("頂点%dから頂点%dまでの最短距離は%d \n", sel[0], i, distance[i]);

}
}
586デフォルトの名無しさん:2001/06/29(金) 20:54
続きです
int Min(int a, int b)
{
if (a < b)
return(a);
else
return(b);
}

int MinSearch(int l[v], int c[v],int n)
{
int i, min, num;

min = s;
for (i = 1; i <= n; i++) {
if (c[i] == NO && l[i] < min) {
min = l[i];
num = i;
}
}
return(num);
}
587583:2001/06/29(金) 20:58
さんくす。
2次元以上の配列はどうしたらいいでしょうか?
588デフォルトの名無しさん:2001/06/29(金) 20:59
587は584に対してです。
589デフォルトの名無しさん:2001/06/30(土) 00:37
>>587
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int i,j;
int**p,**q;

q=p=(int**)malloc(sizeof(int)*10);
for (i=0;i<10;i++){
q[i]=p[i] = (int*)malloc( sizeof(int) * 10);
if( p == NULL )return 1;
}
for( i=0; i<10; i++ ){
for( j=0; j<10; j++ ){
p[i][j] = i*10 +j;
printf( "p[%d][%d]=%d\n", i, j, p[i][j] );
}
}

p=(int**)malloc(sizeof(int)*20);
for (i=0;i<20;i++){
p[i] = (int*)malloc( sizeof(int) * 20);
if( p == NULL )return 1;
}
for( i=0; i<20; i++ ){
for( j=0; j<20; j++ ){
p[i][j] = i*20 +j;
printf( "p[%d][%d]=%d\n", i, j, p[i][j] );
}
}
for (i=0; i<10;i++){
free(q[i]);
}
free( q );
for (i=0; i<20;i++){
free(p[i]);
}
free( p );
return 0;
}
590デフォルトの名無しさん:2001/06/30(土) 01:31
>>589
ご苦労さま。でもメモリリークしてるよ。
n次元配列に対応できる記述ってあるのかな?
591shige:2001/06/30(土) 01:41
  ハハハ
  ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ( ^∀^)<  あほか
 ( つ ⊂ ) \_________
  .)  ) )
 (__)_)     (^∀^)ゲラゲラ


ruby >>>>>>>>>>>>>>>>>>>>>>> C
592564:2001/06/30(土) 02:02
>>580
説明しにくいんだけど、MSB FirstとLSB Firstってのは、普通はバイト
の並び順だけど、実際にはビットの並び順とも考えられると思う。

もしメモリをバイト配列じゃなくて、ビット配列として扱えたとすると、
例えば32ビットの値はリトルエンディアンならLSBが0番目でMSBが31番目、
ビッグエンディアンならMSBが0番目でLSBが31番目という感じになる。

俺はこんな風に解釈してるんだけど、どんなもんでしょ?
593デフォルトの名無しさん:2001/06/30(土) 02:35
こんな風にして文字列入れるの邪道かな。

char str[100];
int i = 0;

while((str[i++] = "sage"[i]) != 0);

すなおに

char str[100] = "sage";

って書けって。
そりゃそうだ。
594デフォルトの名無しさん:2001/06/30(土) 02:39
>>593
正道じゃない?
最初から入れたい文字列が決定しているわけじゃないときは
それなりに有効だと思う。

!=0 はいらないけど
595593:2001/06/30(土) 03:50
>>593
そうですね。
!= 0
いりませんね。

邪道かなと思ったのは
"sage"[i]とするのはどうなのかなと。
596デフォルトの名無しさん:2001/06/30(土) 03:55
#include<stdio.h>
#include<string.h>

#define SIZE 256

int main(void)
{
char buf[SIZE];

printf("input?");
while( fgets(buf, SIZE, stdin) != NULL){
buf[strlen(buf)-1] = '\0';
printf("]%s\n", buf);
printf("input?");
}
printf("end");

return 0;
}
とするして、input?Ctr+Z を入力すると最後のendが表示されません。
どうしてなんでしょう?
printf("\nend");
にすると
input?end

printf("\n\nend");
にすると
input?
end
になりました。
597デフォルトの名無しさん:2001/06/30(土) 03:58
strcpy 使わないのが邪道ってこと?
それとも "sage"[i] のこと?
後者なら、
char hex[9];
for ( int lpc = 0; 8 > lpc; lpc++, i >>= 4 )
hex[ 7 - lpc ] = "0123456789ABCDEF"[ i % 16 ];
hex[8] = 0;

という程度なら邪道とは言えないのでは?

より邪道っぽいのは以下。

char mes[100];
int i = 0;
while ( i++[mes] = i["test"] );
598580:2001/06/30(土) 04:36
>>592
世の中広いから、もしかしたら MSB が 0 番目ってマニュアルに書いてある
CPUがあるかもしれないけど、ふつーは、LSB が 0 じゃない?

8 ビットや 16 ビットで考えたとき、1 にしたいなら
MSB が 0 だと 8 ビットで 7, 16 ビットで 15 を指定しないといけない。
だけど、LSB が 0 なら CPU のビット数に関係なく 0 を指定できるし。
ちなみに MSB が 0 ではビットの重みと番号が一致しないのでばらばらに
なってしまう。

まず、レジスタでそう定義すると (MSB 31 .... 0 LSB )
エンディアンは関係しないのです。
勿論、メモリ上に読み書きするとエンディアンに応じたビットパターンが
書き出されるけど、それは別の話。レジスタに出し入れする段階で
自動的に処理されるから問題ないよね。
599デフォルトの名無しさん:2001/06/30(土) 06:48
>>592
ビッグエンディアンはデータバスの最下位ビットがより上位のアドレスにマッピング
されるのでやっぱりLSBは0なのよ。
600デフォルトの名無しさん:2001/06/30(土) 07:10
>>597
どうでも良いけど、[ i % 16 ]; は [ i&0x0f ]; にした方が良さげ。
601デフォルトの名無しさん:2001/06/30(土) 07:16
>>600
iをunsigned intにするとi % 16と書いても出てくるコードが
i & 0xfになるコンパイラはあります。
602デフォルトの名無しさん:2001/06/30(土) 09:04
16は0x10なのでわ?
603デフォルトの名無しさん:2001/06/30(土) 09:09
>>602
あほらしすぎて突っ込む気にもなれん…
15 & 16はいくつだ?
15 % 16はいくつだ?
604デフォルトの名無し:2001/06/30(土) 09:28
>>601
>>597 だけど、>>600 はマイナスの場合を恐れていると思われ。
だからつまり、unsigned にすることで解決なのであってるんだけど。
もちろんコンパイルテストの時は unsigned にしたさ。
宣言部が落ちたのは申し訳も無し。
605デフォルトの名無しさん:2001/06/30(土) 11:41
フルカラーを256色にきれいに減色する方法をおしえてください。
急いでいます。お願いします。
606デフォルトの名無しさん:2001/06/30(土) 12:00
>>605
モノクロにする
607605:2001/06/30(土) 13:32
>>606
カラーのままきれいにしたいのですが。
お願いします。
608デフォルトの名無しさん:2001/06/30(土) 14:11
>>605
解像度を縦4倍、横4倍にする。
609デフォルトの名無しさん:2001/06/30(土) 14:13
>>605
減色用アルゴリズムはいくらでも手にはいるし
ライブラリだって多く市販されている。

Cの話題じゃないからどっかいけ
610605:2001/06/30(土) 15:28
>>609
おめーがどっかいけ!
611デフォルトの名無しさん:2001/06/30(土) 15:41
>>605
よし、じゃあ1から教えてやるから必ず実行しろ。

1.丈夫なヒモを用意する。長さは2〜3m程度でよい。
2.直径50cm程度の輪を作る。
3.輪が地上2mくらいになるよう、高いところから吊す。
4.輪の中に自分の頭を突っ込んで思いきりぶら下がる。

これでお前が抱えているすべての問題は解決する。
612デフォルトの名無しさん:2001/06/30(土) 16:23
>iをunsigned intにするとi % 16と書いても出てくるコードが
>i & 0xfになるコンパイラはあります。

intでもi%16uだったらOK?
613デフォルトの名無しさん:2001/06/30(土) 16:27
>>601
それは最適化がかかってるだけ。勘違いしない方がいい
614605:2001/06/30(土) 16:35
>>611
おまえがやれよ。ばっかじゃないのか
615デフォルトの名無しさん:2001/06/30(土) 16:41
>>605
フルカラーな色データをRGBそれぞれ上位ビットだけ取り出して
616デフォルトの名無しさん:2001/06/30(土) 16:51
>>605
マジメにやるなら色ヒストグラム出して代表色にク
ラスタ分け。が時間がないなら 615 の単純量子化で
緑に重みがけくらいが一番よいかな?
617デフォルトの名無しさん:2001/06/30(土) 17:20
>>613
何も指示しなくてもこの程度の最適化はやってくれる、という例なんだけど。
618デフォルトの名無しさん:2001/06/30(土) 17:21
>>614
教えて君のくせに偉そうな口を叩くな。死ね。
619デフォルトの名無しさん:2001/06/30(土) 17:23
>>593
str[5]からstr[99]の内容が、
・前者のやり方だと、ごみ
・後者のやり方だと、'\0'
になるんじゃなかったっけ。
あんまり意味ない領域だから、別にどうでもいいけど…。
620ユニホームな七資産:2001/06/30(土) 17:24
>>618
611がネタ振ったつもりだったら煽られたくらいで乗るなバカ。
本気で言ってたんなら俺からも言わせて貰う。他人の苦しみを
理解できないおまえは生きてる資格がない。氏ね。
621アンドレザジャイアント:2001/06/30(土) 17:57
>>611
何も起こらんじゃねーか、どーしてくれる
622デフォルトの名無しさん:2001/06/30(土) 18:00
>>620
誰が苦しんでるんだバカ(藁
623デフォルトの名無しさん:2001/06/30(土) 18:02
>>621
肉体派カコイイ
624デフォルトの名無しさん:2001/06/30(土) 18:07
>>621
あなたの場合は、充分太いワイヤーで直径80cmほどの輪を作り、
地上4m位の高さに吊す必要があります。
もちろん充分に頑丈な梁か枝に吊しましょう。
625593:2001/06/30(土) 21:30
>>597
そうですね。
while(str[i++] = *("sage" + i));
なんてのも考えたんですけど、
そちらのほうが邪道っぽいですね。

>>619
そのとおりです。
まあ、メモリが0でクリアされてないとダメなときって
そう無いでしょうから。
あったらあったで0で埋めてからやればいいんだし。
626デフォルトの名無しさん:2001/06/30(土) 22:04
argc, argvの読み方がわかりません。
627心の中では:2001/06/30(土) 22:07
オーグシー
オーグブイ
628あははのは:2001/06/30(土) 22:08
>>622
629sage:2001/06/30(土) 22:57
あーぐしー
あーぐぶい
630デフォルトの名無しさん:2001/06/30(土) 23:13
argc,argvって何の略?
631sage:2001/06/30(土) 23:14
argument counter
argument vector
632NANASI:2001/06/30(土) 23:21
[0.0, 1.0) の非負 倍精度 浮動小数点実数の乱数返す関数教えてください。

drand48( )以外でおねげーしますだ。
633#include <nanasi.h>:2001/06/30(土) 23:33
>>632
そんなこと人に聞かないでマニュアル読め。
634632:2001/06/30(土) 23:49
マニュアルにあるか?
標準関数ではないでしょ。

double drand48(void){
  double ans;
  ans=((double)(rand()))/32768;

  return(ans);
}

とりあえず自分ではこのくらいしか思いつかん。
635デフォルトの名無しさん:2001/06/30(土) 23:52
>  ans=((double)(rand()))/32768;

即値32768は何とかなりませんか。
636???:2001/07/01(日) 00:42

下記のソースを実行すると、

Welcome to the real world.
27

Welcome to the real world.
4

と表示されます。なぜでしょうか?
文字数+'\0'=27ですから2行目の27は納得できますが
関数にポインタ渡しをすると配列のサイズが4になってしまいます???
Visual C++6です。

#include <stdio.h>

void Sub ( char *Text );

int main( void )
{
  char Text[] = "Welcome to the real world.";

  printf ( "%s\n", Text );
  printf ( "%d\n\n", sizeof Text );

  Sub ( Text );
 
  return 0;
}

void Sub ( char *Text )
{
  printf ( "%s\n", Text );
  printf ( "%d\n\n", sizeof Text );
}
637632:2001/07/01(日) 00:49
>>635
なりますね・・・。
double drand48 ( void ) {
  double ans;
  ans = ( (double ) ( rand( ) ) ) / ( RAND_MAX + 1 );

  return ( ans );
}

どうでしょう?
638デフォルトの名無しさん:2001/07/01(日) 00:51
コールバック関数というものがよく理解できません。
こういうプログラムがあった場合、prt関数はコールバック関数といえるのでしょうか?
全然違う?

#include <stdio.h>

void function( void (*p) ( void ) )
{
  p();
}

void prt( void )
{
  printf( "hello, world" );
}

int main()
{
  function( prt );

  return 0;
}
639デフォルトの名無しさん:2001/07/01(日) 00:55
>>636
char *Text は配列ではありません。
char型データをさすポインタです。

だから、char *Textと宣言されているときのsizeof Textは、
VCのポインタのサイズである4になったのでしょう。

char Text[] = "xxxxx"
は、charの配列 "xxxxx"を初期値として持つ配列型変数です。
配列型変数に対して sizeof 演算子を適用すると、
配列の要素数*配列の要素のサイズ が得られることが決まっています。

配列と、ポインタ変数は、似て異なるものです。
640デフォルトの名無しさん:2001/07/01(日) 00:57
>>638
大体あってます。
641>639:2001/07/01(日) 01:02

636です。
詳しいレスありがとうございます。
しかし、Cは奥が深いですね・・・。
勉強し直します。
642デフォルトの名無しさん:2001/07/01(日) 01:17
>>638
通常あるイベントに対し呼び出されるためにポインタとして登録される、
関数をコールバック関数といいます。以下典型的な例。
#include <stdio.h>
#include <stdlib.h>

void hehe(void){
printf("hehe\r\n");
}
void huhu(void){
printf("huhu\r\n");
}
void hihi(void){
printf("hihi\r\n");
}

void (*function[])(void)={
hehe,
huhu,
hihi,
NULL
};

int main(int argc, char* argv[]){
int i;

for(i=0;*function[i]!=NULL;i++){
(function[i])();
}
return 0;
}
643デフォルトの名無しさん:2001/07/01(日) 01:18
>>641
君が浅いだけです.K&R全然薄いジャン.
644デフォルトの名無しさん:2001/07/01(日) 01:19
>>643
わざわざ追い打ちかけるな
645638:2001/07/01(日) 01:32
>>640、642
レスありがとうございます。
でも642さんのプログラムって関数ポインタを使って関数を呼んでるだけですよね?
そういうのをコールバック関数っていうんですか?
646デフォルトの名無しさん:2001/07/01(日) 01:39
たとえばWindowsの世界でいうコールバック関数でも
やっぱり関数ポインタを使って関数を呼び出しているだけです。

引数、戻り値、リンケージのタイプなどに取り決めがあって、
実行時に呼び出し先を登録、変更したりできるものを
コールバックといいます。

C言語的にいえば、ただの関数ポインタを使った関数よびだし
になる場合が多いと思います。
647デフォルトの名無しさん:2001/07/01(日) 02:27
>>645
もう少し具体的に書くと下のサンプルのようになります。
hoge()は0,1のイベントに対応する関数を登録すると引数に指定した
方の関数をコールバックします。
これらの応用でステートマシン等が簡単に記述できます。
#include <stdio.h>
void hehe(void){
printf("hehe\r\n");
}
void huhu(void){
printf("huhu\r\n");
}
void hoge(int i,void (*function1)(void),void (*function2)(void)){
printf("event=%d ",i);
if(i) (*function1)();
else (*function2)();
}
int main(int argc, char* argv[]){
hoge(0,hehe,huhu);/*イベントに0を与える*/
hoge(1,hehe,huhu);/*イベントに1を与える*/
return 0;
}
648デフォルトの名無しさん:2001/07/01(日) 05:45
↓のヲ教えてくだされ!!
全体的にわかりません

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

extern void jump_to_toplevel(int);
jmp_buf toplevel;

main(int argc, char *argv[])
{
void (*sig)(int);

if (setjmp(toplevel) == 0) {
sig = signal(SIGINT, jump_to_toplevel);
printf("You have five seconds.\n");
sleep(5);
} else {
signal(SIGINT, sig);
printf("Inturrupted!\n");
return 1;
}
printf("Done!\n");
return 0;
}

void
jump_to_toplevel(int x)
{
longjmp(toplevel, 1);
}
649デフォルトの名無しさん:2001/07/01(日) 05:49
>>648
ざっと見た感じだと、たとえばCtrl+Cのようなシグナルを受けたら
割り込み入ったら教えてくれるようなものかな?
実行すればわかるだろうけど・・・
650sage:2001/07/01(日) 05:57
大域jumpだな

setjumpを呼ぶと0が帰ってくるので
SIGINT割り込みのハンドラにjump_to_toplevelをセット、
その後五秒待機する。

何も起こらなければ5秒後に、Done!を表示して終わり。

SIGINTが発生すれば、
jump_to_toplevelが呼ばれる。
ここで、longjumpで、setjumpを呼んだところまで制御を戻し、
setjumpが0でない値を返したように振る舞う。

で、SIGINTを元の割り込みハンドラに戻して、
mainが1を返して終了する。
651638:2001/07/01(日) 12:37
>>646,647
レスありがとうございます。
関数のポインタを渡すことによって、渡した先でその関数を呼べるようなものと理解しました。
イベントによって呼ばれる関数のような、自分が直接呼ばない関数を記述するのに向いているわけですね。
652デフォルトの名無しさん:2001/07/01(日) 12:50
あの・・・
コールバック関数は、OSから呼び出される
ユーザープログラムと教わったのですが、
たとえば、Cではmain関数で、Windowsプログラミングでは
WinMainとウィンドウプロシージャが
コールバックだと・・・・
あれは嘘だったんですね?
653638:2001/07/01(日) 13:18
>>652
コールバック関数の使い道として「OSから呼びださせる」というのがあると理解すればいいのではないでしょうか。
654デフォルトの名無しさん:2001/07/01(日) 13:21
MFCなどのフレームワークからも、でしょうね。
655デフォルトの名無しさん:2001/07/01(日) 13:38
OSからだろうがライブラリからだろうが、(擬似)非同期で処理をする
時に使うもんだよ。
あ、でも非同期ってのも分からないんだろうな…
656638:2001/07/01(日) 13:50
どちらかというと、「非同期で処理をさせるのに向いている」だと思うのですが。
657ただのばか:2001/07/01(日) 13:53
イメージ的には「○×が起こったら、このボタン押してね」って
感じですね。ボタンがコールバック関数にあたります。
658デフォルトの名無しさん:2001/07/01(日) 14:13
>>ただのばか
あたらねーよ.ボタンにつけるハンドラがソレだろ.
659shige:2001/07/01(日) 14:21
ばーかばーか
660デフォルトの名無しさん:2001/07/01(日) 14:32
>>656
勝手に思っとけよ.
661デフォルトの名無しさん:2001/07/01(日) 14:36
>>658-660
初心者が読むんだから少しは自重しろボケ
662デフォルトの名無しさん:2001/07/01(日) 14:40
>>661
何のカンケーがあんだ?
663C初心者:2001/07/01(日) 15:52
ビット演算、シフト演算がいまいちピンときません。
2進数、16進数などの良い参考書をご存知でしたら教えて下さい。
初心者なお願いで申し訳ないです。
664デフォルトの名無しさん:2001/07/01(日) 16:09
86でもいいからアッセンブラを使って
プログラムしてみる。そうするとイメージが湧く。
665663:2001/07/01(日) 16:49
>>664
すいません。アセンブラできません。

10進数や16進数を2進数(0と1の並び)で表示する関数を
自作して、それで勉強していますが、何かわかりやすい解説の載っている
本があればと思いまして。
666デフォルトの名無しさん:2001/07/01(日) 16:53
>>665
自分でいろいろ試す、それが一番わかりやすいよ。

~,^,|,&,>>,<<
ビット演算子はこれで全部と思うよ
667デフォルトの名無しさん:2001/07/01(日) 17:08
>>665
n 進法で l 桁の数 α = a_l a_(l-1) ..... a_1 a_0 は

  l
α=Σ a_k * n^i
  k=0

これじゃあかんの?
668デフォルトの名無しさん:2001/07/01(日) 17:09
間違えた
n^i -> n^k です。

激しく鬱。
669デフォルトの名無しさん:2001/07/01(日) 22:47
いや、付随して覚えることも多いでしょ。
例えば2の補数表現とか、データ型によって
シフト演算の意味が違うとか。

情報処理の問題集で練習ってのもありかな。

その辺は、クリアしてたらゴメン。
670デフォルトの名無しさん:2001/07/02(月) 00:37
その内自然にできるようになるっしょ。
671 :2001/07/02(月) 20:31
キーボードから文字をCtrl-Dで終了するまで読み取り、
アルファベット、数字、その他に分類してそれぞれの数を数えて、
表示するプログラムを作る方法を教えてください。
改行文字も「その他」で数えてください。
672デフォルトの名無しさん:2001/07/02(月) 20:33
>>671
>>1 をよく読めタコ

>だが、FAQに載ってる質問すると煽るぞ、ゴラア!!
>それに勘違いするな、俺は貴様の宿題を解いてやるほど暇じゃない。
673デフォルトの名無しさん:2001/07/02(月) 21:17
while((c=getchar())!=EOF)isalpha(c)?a++:isdigit(c)?d++:e++;
ほれ。もう来るなよ。
674デフォルトの名無しさん:2001/07/02(月) 21:42
邪悪なCソースコンテストみたい。
675デフォルトの名無しさん:2001/07/02(月) 22:16
676デフォルトの名無しさん:2001/07/02(月) 22:24
>>675
そのスレ見て思ったんだけど。。。
2ch って思ったより優しいオニイタマが多いのね。
677デフォルトの名無しさん:2001/07/02(月) 22:26
そうね、いろいろ(間違ったのもあるけど)ヒント
あるのに自分でやる気一切なし、って感じ。
環境聞いても答えないし。
678デフォルトの名無しさん:2001/07/02(月) 22:36
友達がintは4バイトではないとか言っているんですが
ばかですよね。sizeofで調べても4バイトになるのに。
笑い飛ばしてもいいですか?
679デフォルトの名無しさん:2001/07/02(月) 22:38
int はそのマシンで処理するのに最も適したサイズになります。
従って自分を笑い飛ばしなさい。
680デフォルトの名無しさん:2001/07/02(月) 22:38
ネタですか?

そうでないとしたら、
環境すっ飛ばしてintのサイズってわからないです。
681おじいさん:2001/07/02(月) 22:41
わしがわかいころはのー int っていったら 2bytes
だったんだがのー、さいきんのやつはせちがらいのー
682678:2001/07/02(月) 22:42
知らなかった。
683デフォルトの名無しさん:2001/07/02(月) 22:49
おいおい
684初心者:2001/07/02(月) 23:42
C++BuilderでPaintのプログラムを打ってるんですが、
Imageコンポーネントって具体的に言って、どういう働きをして
どういうことができるんですか?
あと、ビットマップとはなんですか?
685デフォルトの名無しさん:2001/07/02(月) 23:52
>>684
ここまでスレ違いなのも逆に珍しい。
686初必者:2001/07/03(火) 00:11
64bit処理系でgcc 使ってるのですが、ビットシフト演算は
32 以上は無理なんでしょうか? 対象はlong longです。
asm で書くしかない?
687デフォルトの名無しさん:2001/07/03(火) 00:21
>>686
頑張ればできる。
688デフォルトの名無しさん:2001/07/03(火) 00:45
>>686
やり方はいくらでもあると思われ。
一例

#include <stdio.h>
#include <math.h>

long shiftleft(long long i,long j){
return i*(long long)(pow(2.0,(double)j));
}
long shiftright(long long i,long j){
return i/(long long)(pow(2.0,(double)j));
}
int main(int argc, char* **argv){
long long x=0xaa55ff00aa55ff00;
printf ("num=%x result=%x\r\n",x,shiftleft(x,45));
printf ("num=%x result=%x\r\n",x,shiftright(x,45));
return 0;
}
689初必者:2001/07/03(火) 00:46
>>687
腕立て何回やれば....

じゃなくてやっぱり inline で asm で作るのが正解でしょうか?
690688:2001/07/03(火) 00:49
げ、バグだらけ。これでどだ。

#include <stdio.h>
#include <math.h>

long long shiftleft(long long i,long j){
return i*(long long)(pow(2.0,(double)j));
}
long long shiftright(long long i,long j){
return i/(long long)(pow(2.0,(double)j));
}
int main(int argc, char **argv){
long long x=0xaa55ff00aa55ff00;
printf ("num=%x result=%x\r\n",x,shiftleft(x,45));
printf ("num=%x result=%x\r\n",x,shiftright(x,45));
return 0;
}
691初必者:2001/07/03(火) 01:08
遅そう。
692デフォルトの名無しさん:2001/07/03(火) 01:18
見掛け上、べき乗計算と乗除になってるけど
コンパイラは、ちゃんとシフト演算にしてくれ
るのですか?
693初必者:2001/07/03(火) 01:23
>>692
なりません。関数なんだから。

それと細かいことですが、printf内部は %Lx にしておかない
と64bit表示にならないかと。
694デフォルトの名無しさん:2001/07/03(火) 01:27
>>692
そのような最適化はしてくれません。
pow()はこの場合2のべき乗の整数演算ですので64個の配列による
ルックアップテーブルで高速化できます。
他にもlongのシフト演算に分けて計算する方法もあります。
インラインasmもモチロン選択肢に入れてよいでしょう。
695デフォルトの名無しさん:2001/07/03(火) 01:28
つまり、そう言う最適化はコンパイラには期待できない
ってことですね。ありがとうございました。
696初必者:2001/07/03(火) 01:29
速度要求が厳しいので inline になりそうです。
やっぱ楽は出来ませんね。
697shige:2001/07/03(火) 04:30
こうやってPerlユーザが馬鹿にされて、コケにされて、侮辱されて、(当然のことだ)
顔を真っ赤にして耐えている姿を想像するだけで俺の気分は爽快になる。

Ruby万歳。俺にこんな快楽を与えてくれたRubyに幸いあれ。
698デフォルトの名無しさん:2001/07/03(火) 04:55
とことん呆れた。Rubyユーザは板から出ていけ。
699デフォルトの名無しさん:2001/07/03(火) 04:59
ローカルの配列の確保できる大きさの限界を知りたいのですが、どうしたらよい
でしょうか?
700デフォルトの名無しさん:2001/07/03(火) 09:04
>>699
おそらくそのマシンの機械語命令のディスプレースメント値
の上限次第だろうが、ローカル配列はスタック上に取られる
ので、あんまりデカイの使うのは感心しない。

という書き方は不親切だろうか?
701デフォルトの名無しさん:2001/07/03(火) 13:09
>>699
allocaで確保し続けてSEGV捕らえてサイズを計算
702デフォルトの名無しさん:2001/07/03(火) 13:25
alloca で割り当てられるサイズはマシン依存するので、
増分(いや減分か)をちゃんとしらべてな。
というかアドレスを表示すればいいのか。

それと、大抵はSEGVまでやらんでも alloca が NULL 返
すはず。
703701:2001/07/03(火) 13:49
>>702
allocaってきちんとNULL返すの?少なくともVC++の_allocaは
例外飛ばすって書いてあるよ。UNIX系の方は処理系依存でしょ

サイズも4KBずつとかで失敗するまで確保し続ければわかる
704デフォルトの名無しさん:2001/07/03(火) 15:21
俺の若い頃はintは4bitだった。
705 :2001/07/03(火) 16:23
.libファイルってなんですか?
706 :2001/07/03(火) 16:24
.hファイルで関数作れると言っておきながら
.libはどうなるんだよぉん〜
707:2001/07/03(火) 16:32
>>704
つまり、アナタはもうすぐ米寿ってことですね?
708デフォルトの名無しさん:2001/07/03(火) 16:36
質問。C言語の文法について。

externは「外部ファイルで定義されてるよ」という宣言。
グローバルスコープにあるstaticは「内部ファイルでのみ参照するよ」という宣言。

で、俺の認識は間違ってないでしょうか?
詳しい定義を知っている人は教えて下さい。

#どうでもいいがC言語の予約語の使い回しは何とかならないものか
709デフォルトの名無しさん:2001/07/03(火) 16:40
>>708
間違ってないと思う。

予約語を使い回したいの?
710708:2001/07/03(火) 16:42
>>709
レスサンクス。
>予約語を使い回したいの?
ではなくて、同じ予約語が複数の意味を持つのが嫌だ。
void func()と(void*)とか、今回のstaticとか。
711デフォルトの名無しさん:2001/07/03(火) 17:48
>>708
C言語ではメモリも演算子も使い回しです
i = 10 * 10;
*p = &i;
とか
つまり、そーゆものだと割り切りましょう。
712デフォルトの名無しさん:2001/07/03(火) 21:19
>>708
C++ではさらにstaticの意味が増えてるぞ。
713デフォルトの名無しさん:2001/07/03(火) 21:27
予約語に振り回されるのが嫌ならlisp使いなさい
714710:2001/07/03(火) 21:35
なにげにexternとか、ある用法を知らない人がいそうだ。
int i=3;
void func(){extern int i;printf("%d==3",i);}

>>712
クラスのstatic変数/関数、という意味?
他にもC++でstaticって拡張されたっけ
715デフォルトの名無しさん:2001/07/03(火) 22:44
>>714
関数の中でexternを使うのは意見Cと互換性がありそうだけど、必ずextern "C++"
になってしまうんだよね。extern "C"とかやろうと思ってもエラーになってしまう。
716714:2001/07/03(火) 22:50
>715
ごめん、詳しく教えて。
extern "C"って外部のアセンブラプログラムを
宣言するときの、「おまじない」程度にしか知らないので
717デフォルトの名無しさん:2001/07/03(火) 23:24
>>716
extern "C"は見てのとおりリンケージをCの規則にするよ、ってことだべ.
なんで仕様書を参照せんのだ.
718デフォルトの名無しさん:2001/07/03(火) 23:41
>>717
ばーか、スレタイトル見ろよ。氏ね。
719714:2001/07/04(水) 00:02
おい殺すな(汗)

>>717
いや全然見ての通りじゃないと思うのですが。
まぁ自分で調べますけど、その説明でexternを
知らない人が解るはずがないと思います。
720デフォルトの名無しさん:2001/07/04(水) 00:07
>>718は口が悪いと思うが、
externを知らない>>714は頭が悪いな。
721デフォルトの名無しさん:2001/07/04(水) 01:03
>>718
仕様書を見た上での話じゃないのか?
まぬけだな。
722デフォルトの名無しさん:2001/07/04(水) 13:38
連結リストをソートするのにいい方法ってありませんか?
ソートは一通りわかるんですが、連結リストだとなんか大変なんで。
723デフォルトの名無しさん:2001/07/04(水) 13:54
>>722
マージソート
724デフォルトの名無しさん:2001/07/04(水) 16:05
> 722

ケースによっては2分木にデータ構造を変更する。
ソートの必要がなくなる。
725715:2001/07/04(水) 22:38
>>719
仕方ないので少しコメントするよ。
C++の外部リンケージはデフォルトではextern "C++"になる。このリンケージでは、
リンカに渡すことになるシンボルが、関数の引数情報を処理系依存の方法で関数名
に追加した形式になるのに対して、C言語との互換のためにあるextern "C"では、
そうした型情報がシンボルに反映されない。

関数内でextern宣言した場合、extern "言語"のような宣言をすることが許されな
いので、C++式の型情報を含んだシンボルしか参照することができない。
通常、extern "C"とextern "C++"の違いは関数に対するものだけど、処理系はオブジ
ェクト型に対しても、その型情報をシンボルに含めることができる。実際Visual C++
などではそうなっているような感じ。

つまり、extern "C++"以外のリンケージについては、必ず関数の外で宣言しないと
いけないということ。namespaceについても似た状況がある。
726デフォルトの名無しさん:2001/07/04(水) 22:44
Cスレでなにいってんの、このひと?
727725:2001/07/04(水) 22:55
>>726
Cで作成した成果物を有効利用するために必要なノウハウだよ。
728デフォルトの名無しさん:2001/07/04(水) 22:57
Cスレでなにいってんの、このひと?
729デフォルトの名無しさん:2001/07/05(木) 00:35
725 の内容はCスレだからこそ大切なことだと思う。
#何故かわからない人はシステムの include ファイルの中を見てみよ
#う。見ても「こんなのC++のためだろが!」とか言ってる奴はこ
#の世では既に必要とされない人間だ。

古巣のいごごちの良さに味をしめ、巣を飛び出せない弱虫カコワルイ。
目を覚ませ。
730デフォルトの名無しさん:2001/07/05(木) 01:04
signed int の値 n を b ビット右シフトした
値を 0 に向かって丸める式を教えて下さい。
例えば、n = -1, b = 1 ans = 0

n >> b; じゃだめみたいです。
731デフォルトの名無しさん:2001/07/05(木) 01:07
わかりづらいのでもうすこし。
1 ビット右シフトするということは 2 で割ることに近似するので
-1 / 2 = -0.5。 -0.5 は 0 に向かって丸めると 0。
答えは 0。
綺麗な式になるんでしょうか?うーん…
732730:2001/07/05(木) 01:11
あ、でもこんなのはナシです。
return (signed int)( (float)n / (float)pow(2,b) );
733フツー:2001/07/05(木) 01:22
これでいいかな?
return (n + (n < 0)) >> b;
734デフォルトの名無しさん:2001/07/05(木) 02:03
>733
ありがとうございます。えっと…これでいいのかな。
ちょっと検算しています。(^^;
735734:2001/07/05(木) 03:24
b=1のときはいいのですが b=0 や b=2 以上になったとき
ちょっと合わないみたいです。
n=-32767 b=2 ans = -32767/4= -8191.75= -8191
(n+(n<0))>>2=-8192
なかなか難しいです…。
736デフォルトの名無しさん:2001/07/05(木) 05:03
n / (1 << b) じゃだめなの?
737デフォルトの名無しさん:2001/07/05(木) 06:52
>>735
こんなんは、どうや?
return ( (n<0) ? ((signed int)-((unsigned int)-n>>b)) : (n>>b) ) ;
738デフォルトの名無しさん:2001/07/05(木) 07:05
0に向かって丸める方法

 正なら単に右算術シフトだけすればいい

 負数なら 色々あると思う。
思いついたのは
  1)符号反転して処理した後符号反転する
if(n<0) return -(-n>>b); else n>>b;

  2) (1<<b)-1を加算してから右算術シフトする
retur ( n +( (1<<b) -1 )&(n>>32 ) )>>b;
739デフォルトの名無しさん:2001/07/05(木) 10:34
>>715
externの使用方法がextern "C", extern "C++"しかない知らん厨房逝ってよし!

C++でも>>714の書き方は正当な書き方で、もちろん
int i=3;
int main(void) { extern int i; cout << i; return 0; }
と書いても正当だ。

また、ここでexternを省略し、
int i=3;
int main(void) { int i; cout << i; return 0; }
とすると動作が変わってしまう。

結論:715は知ったか厨房 なんか反論ある?
740初必者:2001/07/05(木) 10:40
>>739
凄く恥ずかしいよ、君。あれリンケージタイプの話だぞ。
741デフォルトの名無しさん:2001/07/05(木) 10:43
extern の仕組みがわかってない消防逝って良し!
と言われないように、謝るか、釈明するかしてくれ。
742デフォルトの名無しさん:2001/07/05(木) 11:00
>>740
> あれリンケージタイプの話だぞ。
確かに>>725はリンケージタイプの話であり特にこちらも異存はないが、
C++ではexternはリンケージタイプの指定だけに使われる予約語ではないし、
Cではexternはリンケージタイプの指定に使われる予約語ではない。

ここまで言えば>>715
> 凄く恥ずかしいよ、
ってゆーのがわかるだろ?
743初必者:2001/07/05(木) 11:17
わからんな。
>>715 が言ってるのはローカルスコープではリンケージタイプが
選べんので賛否両論あるだろうと言う話で、別に>>714を否定して
いる訳ではない(思いっきりtypoってるので真意は測れないが)。
キーワードはローカルでの関数の extern 宣言だ。mangled-name
にならんように出来んって話だと思う。

まあ715が舌足らずなのは確かだが、プログラマならそれくらい
理解できんか?
744デフォルトの名無しさん:2001/07/05(木) 11:37
C/C++習得度の問題というより日本語習得度の問題になってるね。
何故彼らは相手を攻撃するだけが目的の自分の幼稚な文章自体が、一番
厨房臭く見えてしまうことに気付かないんだろう?
745デフォルトの名無しさん:2001/07/05(木) 11:42
>>744
真実よりも勝ち負けを優先するのは受験戦争を勝ち抜くための
鉄則です(w
746739:2001/07/05(木) 12:08
>>743
> >>715 が言ってるのはローカルスコープではリンケージタイプが
> 選べんので賛否両論あるだろうと言う話で、別に>>714を否定して
> いる訳ではない
うん、否定はしていないが飛躍はしている
Cでは通常externとは外部参照を指定する予約語なのに
何故、C++のリンケージの指定というものを言い始めたのだろう。
話が飛躍しすぎ

この疑問の仮説として思い浮かんだのが
「externの使用方法がextern "C", extern "C++"しかない知らん厨房」

>>744
> 何故彼らは相手を攻撃するだけが目的の自分の幼稚な文章自体が、一番
> 厨房臭く見えてしまうことに気付かないんだろう?
同意。ところで、1バイト情報の無い書込みをageる奴も厨房臭くない?

# 厨房って自分の厨房臭さに気づかないから厨房でいられるんだね。
747デフォルトの名無しさん:2001/07/05(木) 12:13
こりゃだめだ。全然わかってない。
相手にするな>初必者
748デフォルトの名無しさん:2001/07/05(木) 12:14
>>746
リンクの仕組みも知らん厨房逝ってよし
749初必者:2001/07/05(木) 12:21
>>747 了解。
750744:2001/07/05(木) 12:28
>>746
なにが「同意」だ。あほか。おまえのこと言ったんだよ。
751739:2001/07/05(木) 13:03
>>748,他以下の疑問に答えてくれ

int foo(void) { return 1; }
int main(void) { extern int foo; cout << i; return 0; }
上記の場合>>725の理由により駄目だろう。が、
int i = 3;
int main(void) { extern int i; cout << i; return 0; }
の場合、extern宣言したのは関数でもないし、構造体でもない。
それでも駄目なのか?その場合、何故駄目なのか?

>>750
> あほか。おまえのこと言ったんだよ。
何故>>750は相手を攻撃するだけが目的の幼稚な文章をageるんだい?
やっぱりオヤジ臭と一緒で自分の厨房臭って解らないみたいだね。
752学生:2001/07/05(木) 14:54
ちょっと話がそれちゃうけどいいですか?
CマガにC++入門講座って言うアセンブラのコードも
眺めながら学んでいこうって感じで連載やってるんですが、
このアセンブラのコードを自分で見たいときはどうやって見るんですか?

コンパイラはbccしか持ってないです。
753デフォルトの名無しさん:2001/07/05(木) 15:06
マニュアル読め.
どうせこぴ物で持ってねーんだろ.
754735:2001/07/05(木) 15:09
>>736
単純な割算なので可能なら除算は…
>>737-738
-(-n>>b) は INT_MIN あたりの挙動が難しいのでキャストが
必要になりそうです。分岐はちょっとネックになるかもしれないです。
キャストや(1<<b)-1をあらかじめ加算するのはテクニカルですよね。
これ以上高速な方法は…ないですね、たぶん。(^^;)
脳に汗かきました。(^^;) ありがとうございます。
755デフォルトの名無しさん:2001/07/05(木) 15:12
>>753
つか、フリーの bcc の話でしょ?

>>752
-S

つーか、引数無しで起動すると option の説明でるやん。
756初必者:2001/07/05(木) 15:18
>>752
bcc についてるのかどうか知らないんだけどデバッカが
あればそれで動作を追っかけると非常に勉強になります。
良かったらお試しあれ。
757デフォルトの名無しさん:2001/07/05(木) 15:30
ちなみに何に使うの?ホントにINT_MINとかMAXも必要なの?
758学生:2001/07/05(木) 15:52
>>755 >>756
ありがとー。出来たよー。

それと、4月号のこの連載のFig.1っておかしくないんでしょうか。
759デフォルトの名無しさん:2001/07/05(木) 16:20
どんな絵?どっかに上げてよ.
760デフォルトの名無しさん:2001/07/05(木) 17:06
>>751
int i = 3;
int main(void) { extern "C" int i; cout << i; return 0; }
って書けたらいーねってことじゃね?

>上記の場合>>725の理由により駄目だろう。が、
へ?
761学生:2001/07/05(木) 17:18
int foo;
int bar;

これをgccでC++としてコンパイルすると
上の方省略
.globl foo
.bss
.align 4
.type foo,@object
.size foo,4
foo:
.zero 4
.globl bar
.type bar,@object
.size bar,1

どこがおかしいと思ったかは、一番下はsize bar,4じゃないの?かです。
アセンブラは全く分からないので.bss .align .zero あたりも
怪しい気がするけど、こんなもんかな程度に気に止めてます。
762739:2001/07/05(木) 17:49
>>760
> int main(void) { extern "C" int i; cout << i; return 0; }
> って書けたらいーねってことじゃね?
もし可能ならば
int main(void) { extern "C"{ int i; } cout << i; return 0; }
だろうな。
C/C++では関数内で関数が定義できないんで別に関数内でリンケージ指定の
externはできなくとも違和感は感じない。
763初必者:2001/07/05(木) 18:09
>>760
腹立ったのだろうがエサをやるな。
762を見れば程度はわかるだろう。
764760:2001/07/05(木) 18:21
>>762
extern "C"とかってのが、以前のexternの拡張ってのは理解してる?

例えば、
 extern void f();
ってのは、
 extern {
  void f();
 }
と等価。書き方のスタイルの問題といわれればそれまでだけども。

Cで言う
 extern [型宣言文];
ってのがC++では、
 extern "言語りてらる" [型宣言文];
って書けるようになったの。
つまり、externでいままでどおり外部リンケージを指定すると共に、
"C"などを指定することで名前解体をしないことをコンパイラに教えてるの。
だから、もし可能ならextern "C" int i;でへーきだと思うけろも。
この場合の{}は複文を一度にextern宣言する意味しかないよ。

例えばC++での
 extern "C" int i;
は、Cで
 extern int i;
と書いた場合と同様のリンケージ動作を期待して書くの。
たぶん、この辺でわからなくなってるんだと思うけど。。。
765デフォルトの名無しさん:2001/07/05(木) 18:23
>>763
だって、かわいそうで見てられないのよ、なんか(笑
766初必者:2001/07/05(木) 18:24
>760
やめとけ。何度かやったが、その度に自分に都合の良いように
意見を変えるタイプだから、また君の発言から得た情報で頓珍
漢な反論をしてくるだけだぞ。
767デフォルトの名無しさん:2001/07/05(木) 18:26
>>766
むぅ、そうかも。。。(-_-;;
768760:2001/07/05(木) 18:33
ちなみに、
>"C"などを指定することで名前解体をしないことをコンパイラに教えてるの。
って書いてるけど、
もちろん"C++"って書くと名前解体されるよ。突っ込まないでね(++
769初必者:2001/07/05(木) 18:34
>>761
余計なことでゴチャゴチャしちゃってゴメンね。

.size bar 1 がメモリ確保のディレクティブなのかな?
なら確かに変ですね。.align に付いてはプロセッサが
大きなデータを読むときの境界を指定するものです。
データ・アラインメントとかのキーワードで調べてみて
下さい。
770デフォルトの名無しさん:2001/07/05(木) 21:37
Ada、BCPL、C、C++の次はDelphiか…
771デフォルトの名無しさん:2001/07/05(木) 21:46
>>770
バカ
(ちょっとワラタけど)
772sage:2001/07/06(金) 00:27
だからあんたたち、Cスレで何書いてるの?

つっこみどころ多すぎて笑える
773デフォルトの名無しさん:2001/07/06(金) 00:35
どうも 739 は理論で勝てなくなると必死になってこの手を使うようだ。
そういえば上のほうにもあったな。
774sage:2001/07/06(金) 00:43
739じゃないよ。
でも上の人たち739と同じくらい勘違いしてるって気づかない?
775デフォルトの名無しさん:2001/07/06(金) 00:52
気付かないからちゃんとどこが勘違いか書けよ。
場合によっては認めるから。
776sage:2001/07/06(金) 00:59
C++の話題はスレ違いだっていってるんだけどな。
いいや、今からここはC++スレだ。
777デフォルトの名無しさん:2001/07/06(金) 01:00
>>776
あのさあ、ちゃんとこのスレ読んでる?適当にこの辺だけ読んでるのか?
778sage:2001/07/06(金) 01:03
ちゃんと1からこのスレ読んでる?

いや、でもいいよ。C++スレだから。
779デフォルトの名無しさん:2001/07/06(金) 01:05
やっぱおまえ739だろ。
780デフォルトの名無しさん:2001/07/06(金) 01:14
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| extern "C"とextern "C++"はリンク時に影響するからな
\__  _________________
━━━∨━━━━━━━━━━━━━

     _Mona
     Mona@ItteyoshiChubodomo

  iii■∧  /
━ (,,゚Д゚) / ━━━━━ ∧∧━━    ∧∧
   |   つ ∇      ( ゚Д゚)     (゚Д゚; )
   |  |┌─┐   /⊂   ヽ    /⊂  ヽ
 〜|  ||□|  √ ̄ (___ノ〜 √ ̄ (___ノ〜
   ∪∪ |   |  ||   ━┳┛  ||   ━┳┛
 ̄ ̄ ̄ ̄|   | ====∧==========
    / ̄ ̄ ̄ ̄ ̄ ̄ ̄   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    | Cスレでなにいってんの、この人
    \____           ∧
         / ̄ ̄ ̄ ̄ ̄ ̄ ̄ . ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
         |  引っ込みつかなくなってんだよ、きっと
         \_______________________
781初必者:2001/07/06(金) 01:16
はぁ。。。AA出した時点で負けを認めたようなものだよ。
782デフォルトの名無しさん:2001/07/06(金) 01:17
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| やっぱおまえ739だろ
\__  _________________
━━━∨━━━━━━━━━━━━━

     _Mona
     Mona@ItteyoshiChubodomo

  iii■∧  /
━ (,,゚Д゚) / ━━━━━ ∧∧━━    ∧∧
   |   つ ∇      ( ゚Д゚)     (゚Д゚; )
   |  |┌─┐   /⊂   ヽ    /⊂  ヽ
 〜|  ||□|  √ ̄ (___ノ〜 √ ̄ (___ノ〜
   ∪∪ |   |  ||   ━┳┛  ||   ━┳┛
 ̄ ̄ ̄ ̄|   | ====∧==========
    / ̄ ̄ ̄ ̄ ̄ ̄ ̄   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    | まるで野獣だよ
    \____           ∧
         / ̄ ̄ ̄ ̄ ̄ ̄ ̄ . ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
         |  氷魚が休みだからなあ。今日は。
         \_______________________
783デフォルトの名無しさん:2001/07/06(金) 01:23
あら、図星でしたか。これは失礼。
784デフォルトの名無しさん:2001/07/06(金) 02:20
785デフォルトの名無しさん:2001/07/06(金) 04:01
確かにここはCスレだけど、
間違ってることほったらかしたままでいいわけがない。
いろんな人が読むのよ。
まぁ、スレ移動して続けるのも手だけれども、もう終わってるけど(笑)

モナー貼ってイヤミ言うくらいなら、だまってろ。スペースが無駄。
786学生:2001/07/06(金) 08:12
>>769
親切に答えてくれてありがとー。
スレ違いみたいだしまた来ますね。
787デフォルトの名無しさん:2001/07/06(金) 12:15
分類学的にいえばC++は、Cから派生したものでCであるといえるが、
CはC++であるとはいえない。
よってCに関わるC++の話題は良し。
788739:2001/07/06(金) 12:22
>>714, >>初必者
> extern "C"とかってのが、以前のexternの拡張ってのは理解してる?
知らなかった...。

> externの使用方法がextern "C", extern "C++"しかない知らん厨房逝ってよし!
> C++ではexternはリンケージタイプの指定だけに使われる予約語ではないし、
> Cではexternはリンケージタイプの指定に使われる予約語ではない。
この発言は撤回する。
また、自分が無知なのを気づかず>>714を厨房呼ばわりしたことを謝罪する。m(_ _)m スイマセン
あと、初必者に無礼な口を利いていたことを謝罪する。m(_ _)m モウシマセン
あっ、>>750には無礼な口を利くのは当然なので謝らない。

あと、C++の話題はスレ違いだっていってる奴とかAA貼り付けてる奴と
同一人物だと思われているようだが人違いだ。

で、これからの話題は議論ではない、純粋な質問。
(続く)
789デフォルトの名無しさん:2001/07/06(金) 12:42
>>788
> あっ、>>750には無礼な口を利くのは当然なので謝らない。

君さ、そんなことだから何時までたっても”厨房”なんて呼ばれるんだよ。
文体からしてかなり若そうだけど、君が言われるのは「精神が厨房」なんだ。

純粋な質問などと能天気なことしようと思ってるらしいけどさ、態度を
改めるのがさきじゃないか?
790739:2001/07/06(金) 13:18
>>788
> 714は>>715の誤り

>>789
> 態度を改めるのがさきじゃないか?
俺が先に無礼な口を利いた人には謝罪し、態度を改めた(と自分では思っている)
煽り目的に無礼な口を利いた奴には謝る必要がない(と自分では思っている)

715や初必者には謝る必要があると思ったが、750には謝る必要性が感じられない。
791739:2001/07/06(金) 13:27
やはり、質問しようとしていろいろ調べてみたが、
C++全体に関する自分の知識不足を痛感した。

もう少し調べる時間が欲しいので今回のやりとりはこれで終わりにしたい。

>>789
750について謝る必要があるかどうか、
まだ続けたいんだったらその話題は別スレッドにしてくれ。
多分、スレ違いなので...。
792デフォルトの名無しさん:2001/07/06(金) 13:56
>>790
> 715や初必者には謝る必要があると思ったが、750には謝る必要性が感じられない。

だから餓鬼だって言われるんだ。
そう感じられないんだったら口に出すな(これくらいのことも分からんのか)。
793750:2001/07/06(金) 14:01
>>792
おいおい。あんたももうやめんさい。彼も少しは成長したんだから
いいじゃん。
794デフォルトの名無しさん:2001/07/06(金) 14:06
>>793
情けないねぇ。
俺が739をやりこめようとしてるとでも思ったのか?
795デフォルトの名無しさん:2001/07/06(金) 14:13
>>794
新しく作ってみた、こっちでやってくれ
http://piza.2ch.net/test/read.cgi?bbs=tech&key=994396298
796デフォルトの名無しさん:2001/07/06(金) 14:29
俺は「技術板の利用方法」などという大それた議論をやりたいわけじゃない。

表面上反省したかに見える(こう言われてもしかたないのだぞ)739のような
書き込みを放っておくべきではないと思ったから、忠告しただけだ。

トリガーとなる発言さえ少なくなればよいのだ。
797デフォルトの名無しさん:2001/07/06(金) 14:48
おいおい、ガキの喧嘩はよそでやってくれ。

技術問題で、お互いの思想をぶつけ合った喧嘩は
たとえその思想が幼稚なものであってもそれなりに面白いけど、
単なる口喧嘩はここでやる必要は無し。
798デフォルトの名無しさん:2001/07/06(金) 14:50
ギャハハハハ、煽りうまいね、チミ。
799デフォルトの名無しさん:2001/07/07(土) 00:24
自作自演
800C初心者:2001/07/07(土) 15:54
248,663で質問した者です。みなさんありがとうございました。
801C初心者その2:2001/07/08(日) 01:08
Win2000のDOS窓用ソフトを動かすのに
バックスラッシュ、|、/、を同じ場所で連続表示させて、くるくる回ってるみたいな
ものを表示してみたいのですが、どんな方法があり得ますか?
802デフォルトの名無しさん:2001/07/08(日) 01:13
>>801
ちょっとウェイトした後バックスペースで消して表示、を繰り返す
803デフォルトの名無しさん:2001/07/08(日) 02:12
>>801
サンプル

#include <stdio.h>
int main(int argc, char** argv){
long i,j;
char c[4]={'|','/','-','\\'};
for(i=0;1;printf("%c\b",c[i=(i++)%4]))for(j=0;j<10000000;j++);
return 0;
}
804デフォルトの名無しさん:2001/07/08(日) 02:15
>>803
えーん
最適化最強にしたら空ループが消えちゃったよ〜
805デフォルトの名無しさん:2001/07/08(日) 02:22
>>803
はんぱじゃないくらいバグバグだね...
#include <stdio.h>

int main()
{
for (int i = 0; ; i++) {
putchar("|/-\\"[i % 4]);
for (volatile int j = 0; j < 10000000; j++)
;
putchar('\b');
fflush(stdout);
}
}
806デフォルトの名無しさん:2001/07/08(日) 02:23
あぁ、fflush()と\b逆だな...
807デフォルトの名無しさん:2001/07/08(日) 02:24
/**/#include <stdio.h>
/**/
/**/int main()
/**/{
/**/ for (int i = 0; ; i++) {
/**/ putchar("|/-\\"[i % 4]);
/**/ fflush(stdout);
/**/ for (volatile int j = 0; j < 10000000; j++)
/**/ ;
/**/ putchar('\b');
/**/ }
/**/}
808デフォルトの名無しさん:2001/07/08(日) 02:25
くそっ、タコのこと胃炎な…鬱
/**/#include <stdio.h>
/**/
/**/int main()
/**/{
/**/ for (int i = 0; ; i++) {
/**/ putchar("|/-\\"[i % 4]);
/**/ fflush(stdout);
/**/ for (volatile int j = 0; j < 10000000; j++)
/**/ ;
/**/ putchar('\b');
/**/ }
/**/}
809デフォルトの名無しさん:2001/07/08(日) 02:26
/**/#include <stdio.h>
/**/
/**/int main()
/**/{
/**/ for (int i = 0; ; i++) {
/**/ putchar("|/-\\"[i % 4]);
/**/ fflush(stdout);
/**/ for (volatile int j = 0; j < 10000000; j++)
/**/ ;
/**/ putchar('\b');
/**/ }
/**/}
810デフォルトの名無しさん:2001/07/08(日) 02:26
a b
<pre>
a b
</pre>
811デフォルトの名無しさん:2001/07/08(日) 02:30
>>809
forの中に変数宣言をするのは止めて・・・
812デフォルトの名無しさん:2001/07/08(日) 02:32
ヤダ
813デフォルトの名無しさん:2001/07/08(日) 02:55
>>809
intが16bitで無限ループになると見た。
814デフォルトの名無しさん:2001/07/08(日) 03:00
>>813
int main()で書くなら戻り値を書くべき。
ワーニングが出るぞ。
815デフォルトの名無しさん:2001/07/08(日) 03:02
失礼。814は809へ。
816デフォルトの名無しさん:2001/07/08(日) 03:44
>>813
そんな環境は存在しない.
817デフォルトの名無しさん:2001/07/08(日) 03:54
>>814
カタカナで書くならウォーニングだぞ…
CDワークマンでもいいのか?
まったく恥ずかしいな.
プレイステーションアワードも同じくらい恥ずかしいが.
818デフォルトの名無しさん:2001/07/08(日) 03:55
>>817
ワーニングであってるよ
819デフォルトの名無しさん:2001/07/08(日) 04:08
>>817
命名、古寺の小僧。
820デフォルトの名無しさん:2001/07/08(日) 04:26
>>819
どういう意味?C言語系?
821デフォルトの名無しさん:2001/07/08(日) 04:37
>>817
いまだにそんなこと言ってる君のほうが100倍恥ずかしいんだけど
822819:2001/07/08(日) 05:51
>>820
現代訳を探したら、小寺の小僧だった。
鬱だ…。

http://www.d1.dion.ne.jp/~y_kiuchi/setuwa/konj28-8.htm
823801:2001/07/08(日) 06:19
801です。
DOSプログラミングな本を見たら座標が云々で、点を打つ関数がどーのこーのと書いてあってサパーリ
でしたが、こんな方法で実現できたんですね。
そもそもなんでこんなことを思ったかといえば、Linuxの起動時にスキャンディスク
の様なのがはじまって、パーセント表示と共に、この棒がくるくる回っててどうやって
ルンダろうと思ったのです。
コードの量から些細なことみたいですが感動しました。
824デフォルトの名無しさん:2001/07/08(日) 11:42
>>817は、ウォークマンをwarkmanと思っている厨房。
825デフォルトの名無しさん:2001/07/08(日) 15:29
>>822
あぁ、814もその程度のレベルがあればいんだけどね…
826デフォルトの名無しさん:2001/07/08(日) 15:32
>>824
warkならワークでいーだろがボケ.辞書くらい轢いてからにしろ.
827初級者:2001/07/08(日) 15:44
あの、上の方にあったんですが、
i = (i++) % 4
ってiの値は変わりませんよね?
それとも仕様上不貞なのでしょうか?
828デフォルトの名無しさん:2001/07/08(日) 15:47
(1) % 4 = 1
(2) % 4 = 2
(3) % 4 = 3
(4) % 4 = 0
(1) % 4 = 1
:
:
829デフォルトの名無しさん:2001/07/08(日) 15:51
>>828
そうはならない っていってるじゃん
830デフォルトの名無しさん:2001/07/08(日) 15:52
>>826
warkなんて単語あるのか?
831sage:2001/07/08(日) 15:56
>>827
仕様上は不定なので、
なにが起こるかわかりません。

んなわけはないんだけど
たとえばそのコードでプログラムが止まっちゃうようなコンパイラがあったとしても
よいことになってます。
832sage:2001/07/08(日) 16:05
>>830
だから辞書くらい引いてからにしろって.
ホントにバカ丸出しだな.
833デフォルトの名無しさん:2001/07/08(日) 16:16
>>831
不定は不定だが、それはありえんだろ.
834デフォルトの名無しさん:2001/07/08(日) 16:17
>>809
iがオーバーフローして負数になった時表示が不正になるとみた。
835中級車:2001/07/08(日) 16:20
>>834
やってから言うなって.
836sage:2001/07/08(日) 16:36
837デフォルトの名無しさん:2001/07/08(日) 16:43
>>826
ウォークマンはworkmanだろ(w
意味わかってんのか? ボーケ
838デフォルトの名無しさん:2001/07/08(日) 16:48
>>837

ボケがいまいち。2点
839デフォルトの名無しさん:2001/07/08(日) 16:50
warsman の方が強いと思われ
840デフォルトの名無しさん:2001/07/08(日) 17:05
>>827
アセンブラレベルまで考えれる人間には何の問題もないのは一目
瞭然。言語論で遊んでるトイプログラマ達は勝手にやってて、っ
て感じ。
でも自分はそーゆーコードは書かない、ってとこだな。
841デフォルトの名無しさん:2001/07/08(日) 17:38
>>sage
warkなんて単語うちの辞書には載ってないぞ。
だから意味を教えてくれ。
842初級者:2001/07/08(日) 17:51
>>836
とりあえずANSI C的には未定義のようですね。
バカなアセンブラ上がりのまぬけなコードにぶつからないように
祈るバカりですね…
843デフォルトの名無しさん:2001/07/08(日) 17:56
いつの間にか目的と手段が入れ替わるバカが多いな。
844ふぇ:2001/07/08(日) 17:58
ANSIバカはCの歴史を思い出せ
845初級者:2001/07/08(日) 18:01
>>844
う〜ん、複数のコンパイラでマトモに動くものを作るには
ANSI等の標準規格に依存するしかないと思うのですが?
どんな歴史ですか?
846デフォルトの名無しさん:2001/07/08(日) 18:25
>>827
1行にコードを集積する事が良い訳ではない。
847デフォルトの名無しさん:2001/07/08(日) 18:29
???
それを言うにはちと例題が悪いのでは?
848デフォルトの名無しさん:2001/07/08(日) 18:54
>>840
そういうコードは書かないという根拠が、
ANSI/ISO規格なんじゃないの?
849デフォルトの名無しさん:2001/07/08(日) 21:56
>>805-からこっち書いてある事がでたらめばかりじゃないの?
24時間常駐している奴が約1名居るようだしな。
ANSIの規格がどーたらと言った難しい話の前に、早くwarkの意味を書けよ。
850デフォルトの名無しさん:2001/07/08(日) 22:40
>>849
相変わらずバカ丸出しだな。
851sage:2001/07/08(日) 22:43
なんでどうでもいい揚げ足取りするかな。
別に規格に関することは難しくもなんともないよ。

http://www.google.com/search?sourceid=navclient&q=warkman
852デフォルトの名無しさん:2001/07/08(日) 22:44
>>849
http://www.google.com/search?q=wark
意外といろいろあるようです
853デフォルトの名無しさん:2001/07/08(日) 22:45
ttp://www.geocities.co.jp/HiTeens-Penguin/5233/profile.html

MD warkmanも実際にあるようです。
854rms:2001/07/08(日) 23:06
いろんな環境で動くコードを書きたければ、
GNU autoconfをヨロシク。
http://www.gnu.org/software/autoconf/autoconf.html
855デフォルトの名無しさん:2001/07/08(日) 23:09
>>854
ピンぼけだねぇ。
それとも最近のautoconfはi=i++をどこでも同じに動くことを保証して
くれんのか?
856デフォルトの名無しさん:2001/07/08(日) 23:12
>>855
i=i++;

i++;
って、たいていの場合は同じだよな。
でも、そんなの書くな。
857デフォルトの名無しさん:2001/07/08(日) 23:15
i++,i=i
と同じ場合もあるし、そうでない場合もあるんだってば
858デフォルトの名無しさん:2001/07/08(日) 23:23
>>851
>>804辺りからあげ足の取り合いスレになっているから自然な
流れなのでは?

>>852
Warkmanという人名はあるみたいだね。
でもwalkやworkと間違えているお間抜けな人が凄くHITするのは
気のせい?

>>853
良く判らないけれど、そのサイトの高校生はSONYのwalkmanを
warkmanと間違ってるんじゃないの?
SONYのサイトで検索してもwarkmanはヒットしないし。
まぁバッタもので有るかも知れないね。
859デフォルトの名無しさん:2001/07/08(日) 23:34
>>855 >>857
そんなコード書かなきゃいいだろ
i=i++の結果を保証して欲しけりゃJavaに逝け
860C初心者:2001/07/08(日) 23:38

auto型char配列

 char str[10];

があるとします。この時、以下のコードは全て同じ意味(結果)になりますか?

A: memset( str, 0x00, strlen(str));
B: memset( str, '\0', strlen(str));
C: memset( str, 0, strlen(str));
D: str[0] = '\0';
E: str[0] = 0;
F: str[0] = NULL;
G: strcpy( str, "");

要は初期化です。
また、AからGまでどれも同じ結果が得られる場合、一般的に
どれが良いコードでしょうか。
それとも、auto型は初期化しないのが普通ですか?
初心者な質問ですみません。よろしくお願いします。
861デフォルトの名無しさん:2001/07/08(日) 23:41
>>860
A-Cはそもそも初期化されていない配列に対する strlenが未定義なので
同じかどうか以前にダメ。

D-Gはおなじ。

どっちかっつーと Dがまともな書き方。
E, FはUNIX系に多いタイプ量を減らした書き方。
Gはたぶん馬鹿にされるからやめとけ。
862デフォルトの名無しさん:2001/07/08(日) 23:43
>>860
これに答えたらまたあげあし取りする気?
最近のこのスレのパターンだしね。
マジに知りたいのなら初心者スレで聞く事をお勧めする。
863デフォルトの名無しさん:2001/07/08(日) 23:43
>>860
結果は同じには、ならない。
使う時は、どんな初期化が必要化考えてから、
好きに初期化すれば良い。
864デフォルトの名無しさん:2001/07/08(日) 23:44
Gはなんで馬鹿にされるんですか?
865デフォルトの名無しさん:2001/07/08(日) 23:46
Fもダメだろ。
866デフォルトの名無しさん:2001/07/08(日) 23:48
>>860
strlenじゃなくsizeofならば、A−Cの中ではBが一番まともかな。
全クリアでね。
DはA−Cとはまた違う意味で初期化。
Fは厳密に言うと間違い。
Gは無駄。
867デフォルトの名無しさん:2001/07/08(日) 23:49
>>860
結果は同じになる。
行頭に全角文字があるから全てコンパイルエラー。
エラーメッセージが違うけどな。
868デフォルトの名無しさん:2001/07/08(日) 23:51
Gは効率は悪いけど読みやすい。俺は良く使う。
869デフォルトの名無しさん:2001/07/08(日) 23:52
>>865
Fは、厳密にはいいみたい。
でも、かっこわるいから、やめといた方がいいね。
870C初心者:2001/07/08(日) 23:59
すばやい回答ありがとうございます。

>>861
>A-Cはそもそも初期化されていない配列に対する strlenが未定義なので
>同じかどうか以前にダメ。

つまり、変数に何か入れる前には strlen は使えない、と言う事でしょうか?
strlen の戻り値が10になる保証は無い、という意味ですか?

Fはまれに NULL が ((void *)0) と定義されている場合があるようですが……。
Gは他人のコードに書いてあった記述なのですが、
見た時ちょっと違和感があったので。
やはりDが無難でしょうか。

>>862
そのような気は毛頭ありません。本当に初心者です。以前にもこのスレで
お世話になりました。
871デフォルトの名無しさん:2001/07/09(月) 00:01
860は何処に行った?
872デフォルトの名無しさん:2001/07/09(月) 00:03
そゆこと。
873デフォルトの名無しさん:2001/07/09(月) 00:11
862だが申し訳ない。疑心はよくないね。

strを文字列として使う限りGは不正じゃないですよ。
Fは#define NULL -1である処理系も有り得ますからNGです。
866の言うように全初期化が紛れがなくて良いと思います。
874デフォルトの名無しさん:2001/07/09(月) 00:13
>>870
>つまり、変数に何か入れる前には strlen は使えない、と言う事でしょうか?
strlenが、どのような関数なのか考えて下さい。
>Fはまれに NULL が ((void *)0) と定義されている場合があるようですが……。
それを知っているなら、使うべきではない。
>Gは他人のコードに書いてあった記述なのですが、
>見た時ちょっと違和感があったので。
問題はない。ただ、そんな事で関数を使うべきでもない。
>やはりDが無難でしょうか。
Dか、strlen(str)をsizeof(str)に換えたB。
使う時は、どちらが必要なのかを考えて。
875デフォルトの名無しさん:2001/07/09(月) 00:14
揚げ足取るつもりじゃないけど、
NULL != 0な処理系ってどんなの?
876デフォルトの名無しさん:2001/07/09(月) 00:15
>>873
>Fは#define NULL -1である処理系も有り得ますからNGです。
その、処理系がNGだと思うのは俺だけ?
877デフォルトの名無しさん:2001/07/09(月) 00:17
処理系に依存せずNULLポインタは常に0だよね。
その上で NULL という名前のマクロを 0 以外に定義する処理系は
NGだとおもう
878デフォルトの名無しさん:2001/07/09(月) 00:18
>>875
0番地付近にレジスタをアサインしている処理系は保護のため
NULL=-1として逃げている場合が多いようです。
879デフォルトの名無しさん:2001/07/09(月) 00:20
NULLポインタの実体(アドレス値)が0でなくてもいいのはしってたけど
実際の定義が0でないのは初耳。
thx
880デフォルトの名無しさん:2001/07/09(月) 00:20
Gの場合は""という文字列が確保され、その文字列がstrにコピー
されると思うのですが、確保された""はどうなるのでしょうか?
881デフォルトの名無しさん:2001/07/09(月) 00:21
>>878
それは、コンパイル後のコードの問題であって、
Cの中で、NULLポインタが0でないものは、NGだと思う。
882デフォルトの名無しさん:2001/07/09(月) 00:21
>>877
整数として評価されたときに0になるだけだよ。
883C初心者:2001/07/09(月) 00:22
>>873
ありがとうございます。
結論としては、

memset( str, 0x00, sizeof(str));

これがベストということでOKですか?
「全初期化が紛れがなくて良い」とおっしゃるのは、str[0]からstr[9]までの
10バイトがすべて0になるから、先頭だけ0にするより安全、と
いうことですよね。
884デフォルトの名無しさん:2001/07/09(月) 00:22
プログラムの静的領域に "" の形で置かれます。
動的に確保されるわけじゃなくて、プログラムのデータ領域をロードしたときに
すでにそこにある、と思ってください。
885デフォルトの名無しさん:2001/07/09(月) 00:24
>>880
'\0'
886デフォルトの名無しさん:2001/07/09(月) 00:27
正数として評価というのが果てしなく謎なんだけど、
ポインタが 0 と等しいかどうか比較する
ポインタが 0 と等しくないことを比較する
ポインタに 0 を代入する
だけ、Cは特別扱いしてるだけだよ?

中に何の数字が入っているかどうかは、処理系依存。

でも、上に上げた比較の都合で、不定ポインタをNULLという
名前で定義してるわけだから、
0以外の値になってるってのは、その処理系がおかしいと思うなあ。

ダメプログラマが勝手に定義した値じゃなくて?
887デフォルトの名無しさん:2001/07/09(月) 00:35
>>883
個人的には、「0x00」ではなく、「'\0'」の方が良いと思う…。
ついでに、「0x00」を使うなら、「0」と等価なので、
他の定数を使ってるなら、それらと合わせた方が、見やすいかも…。
888デフォルトの名無しさん:2001/07/09(月) 00:37
おもしろいからマターリ論議しようね。
889C初心者:2001/07/09(月) 00:53
訂正します。

memset( str, '\0', sizeof(str));

これがベストのようですね。
皆さん、ありがとうございました。

>888
とても勉強になるので、マターリしたいのはやまやまなのですが、
眠くなってまいりました……。
890デフォルトの名無しさん:2001/07/09(月) 01:11
returnで帰ってくる値を日本語で表す場合、
ポピュラーなのは「返り値」「戻り値」「リターン値」のどれですか。
上にない他の言い方でもOKですので、教えて下さい。
891デフォルトの名無しさん:2001/07/09(月) 01:15
返り血
戻り血
痢痰血
892デフォルトの名無しさん:2001/07/09(月) 01:18
(・∀・)血でソースを検索するとイパーイ出てくるよ!
893デフォルトの名無しさん:2001/07/09(月) 01:23
>>890
どれでもいいんでないの?
あまり一般的ではないけど「関数値」という言い方もあるね。
894デフォルトの名無しさん:2001/07/09(月) 01:31
>>891
全くつまらんな.0点.

>>890
かえりちだな.
895デフォルトの名無しさん:2001/07/09(月) 01:39
>>890
復帰値
896890:2001/07/09(月) 01:56
>>891-895
こうやってみると、呼び方は沢山あるようですが、
ポピュラーな呼び方は、ないようですね。
これからは、周りに合わせて適当に呼ぶようにします。(日本人的考え)
どうもありがとうございました。
897デフォルトの名無しさん:2001/07/09(月) 02:07
>>896
まぁその3つがその順でポピュラーじゃないか?
それ以外は業界の変人だ!
898デフォルトの名無しさん:2001/07/09(月) 02:17
業界の変人は、世の中では普通の人間?
899デフォルトの名無しさん:2001/07/09(月) 02:24
>>898
いいえ。もっと変人です。さらにその中の変人が天才と呼ばれます。
900デフォルトの名無しさん:2001/07/09(月) 02:36
漏れの上司はリータンヴァリュウといいます。
聞こえるたびに思考が途切れて困ります。
901デフォルトの名無しさん:2001/07/09(月) 02:46
>>900
リターン値よりはマシと思われ.
902デフォルトの名無しさん:2001/07/09(月) 10:34
>>890
もどりね
903デフォルトの名無しさん:2001/07/09(月) 10:55
クイックソートを作るって課題がでました。ちょっとわからないので
皆さんお願いします。
さー、みんなで考えよー
904デフォルトの名無しさん:2001/07/09(月) 10:58
>>903
次スレッドに持ち越しだな。
新スレ立ててくれたら考えてあげるよ
905デフォルトの名無しさん:2001/07/09(月) 11:14
>>849
英辞郎 on the Webにはエントリーがありました。発音は不明。
http://www.alc.co.jp/
wark
【名】 痛み
【自動】 痛む

アメリカのOn line dictionaryのサイトをいくつかわまってみましたが、
エントリーのあるdictionaryは見つからず。

ただ、大物のOxfordが会員制(無料?)のため調べることができず。
906デフォルトの名無しさん:2001/07/09(月) 13:46
質問があるのですが
4(1-1/3+1/5-1/7+・・・・・・・)
を求めるプログラムで()の中を
つくろうとしたのですが

#include<stdio.h>

int i;
double a,b;

main()
{
a=1;
b=1;
for (i=1;i<100;i++){
b = b+2;
a = a + 1/b * pow(-1,i-1);
}
printf("a= %d",a);
}

じゃうまくいきいません。
どこがいけないのでしょうか?
907デフォルトの名無しさん:2001/07/09(月) 13:52
>>906
powなんてつかうな
908デフォルトの名無しさん:2001/07/09(月) 15:35
じゃあ何をつかえばいいんですか??
909デフォルトの名無しさん:2001/07/09(月) 15:39
>>908
階乗なんてどこにあるの?
910デフォルトの名無しさん:2001/07/09(月) 15:42
項ごとに符号がかわるとこがよくわかんなくて・・・・
911デフォルトの名無しさん:2001/07/09(月) 15:42
(i%2)*2-1
912デフォルトの名無しさん:2001/07/09(月) 15:44
i&1?1:-1
913デフォルトの名無しさん:2001/07/09(月) 15:51
powのかわりに(i%2)*2-1でいいんですか?
超初心者ですいません。
914中途半端くん:2001/07/09(月) 15:55
>>910
動くかな?

double a=0,b,f=1;
for(b=1;b<200;b=b+2)
{
 a=a+1/b*f;
 f=-f;
}
a=a*4;
printf("a=%f\n",a);
915デフォルトの名無しさん:2001/07/09(月) 15:57
あー、どういう仕組みか解らんのなら使わん方が良いよ

c=1 と置いてループ中に c=c*-1 するも良し
偶数項と奇数項でループをわけるでも良し
916デフォルトの名無しさん:2001/07/09(月) 16:00
a=0,b=1;
for(i=1;i<100;i++){
 a=a+1/b-1/(b+2);
 b=b+4;
}
とかね
917デフォルトの名無しさん:2001/07/10(火) 12:55
age
918デフォルトの名無しさん:2001/07/10(火) 22:38
偶数か奇数の判定をしたいのですがどのような方法がありますか?
2で割ったあまりを調べる以外に。
919中途半端くん:2001/07/10(火) 22:38
>>918
最下位ビットとか?
920918:2001/07/10(火) 22:42
>>919
大量に調べる場合はそっちの方が早いんでしょうか?
921デフォルトの名無しさん:2001/07/10(火) 22:43
他になんか手あるの?
922中途半端くん:2001/07/10(火) 22:46
>>920
つまり、 if(a%2) と if(a&1) とどっちが速いか?
923sage:2001/07/10(火) 22:49
>>922
自分で計ってみなさい
924中途半端くん:2001/07/10(火) 22:54
>>923
オレが測るの? たぶん a&1 の方が速い?
925sage:2001/07/10(火) 23:03
>>924
ごめん、誤爆。

俺もbit演算だと思うけど、結局どっちも同じになる環境ってあるかもね。
実際にやって、はかって、納得してみるのがいいよ>>920
926ひよこ:2001/07/10(火) 23:20
ふと疑問に思ったので質問させていただきます。
関数を作る時、 sample(int a, int b); のように
引数を作ると思うのですが
printf(); 関数などは引数が使用者によっていくらでも増やすことが
できますよね?
このような関数はどうしたら作れるのでしょうか
927デフォルトの名無しさん:2001/07/10(火) 23:23
...
だっけ?
928中途半端くん:2001/07/10(火) 23:25
>>926
K&R本の可変引数リストの項を読めばいいんじゃない?
929sage:2001/07/10(火) 23:26
#include <stdarg.h>

int monaprintf(char *p, ...)
{
int rc;
va_list ap;
va_start(ap, p);
rc = vprintf(fmt, p);
va_end(ap);
return rc;
}

int main()
{

}
930918:2001/07/11(水) 00:36
ありがとうございました。
計測してみます。
931デフォルトの名無しさん:2001/07/11(水) 22:29
int main()
{
int i;
double data[10];

for(i = 0;i < 10;i++) {
printf("%d番目の数字を入力してください : ",i+1);
scanf("%f",&data[i]);
}
printf("\n入力されたデータは以下になります。\n");
for(i = 0;i < 10;i++)
printf("%f\n",data[i]);
printf("\n");

return 0;
}
実行して数字を入力すると、変な数字が表示されるのですが
なにが悪いのでしょうか?
932デフォルトの名無しさん:2001/07/11(水) 22:35
どっか悪いところあるか?チキショウ!

#include <stdio.h>

#define MAX_NUM_DATA 100
#define MAX_NUM_HIST 10
#define FILENAME "prog8_d.txt"

int read_data( char *filename, int *data, int N);
void print_hist( int n );


main(){
int data[MAX_NUM_DATA];
int hist[MAX_NUM_HIST];
int n;
int i;
int idx;

n = read_data( FILENAME, data, MAX_NUM_DATA );
for( i=0 ; i<10 ; i++ ){
hist[i]=0;
}

for( i=0 ; i<n ; i++ ){
idx=data[i]/10;
if(idx==10)idx=9;
hist[idx]=hist[idx]+1;
}


for( i=0 ; i<MAX_NUM_HIST ; i++ ){
print_hist(hist[i]);
}
}


int read_data( char *filename, int *data, int max_data ){
FILE *fp;
int n;
int d;

if( ! (fp=fopen(filename, "rb")) ){
fprintf(stderr,"could not open file %s\n", filename);
return(-1);
}
n = 0;
while( n<max_data && fscanf(fp,"%d",&d)==1 )
data[n++] = d;

return(n);
}


void print_hist( int n ){
int i;
for( i=0 ; i<n ; i++ )
putchar('*');
putchar('\n');
}
933デフォルトの名無しさん:2001/07/11(水) 22:50
>>931
float data[10];
にしてみよ。さすれば汝救われれれれ.
934デフォルトの名無しさん:2001/07/11(水) 22:55
>>933
というより、むしろ…まあ、いいや
935デフォルトの名無しさん:2001/07/11(水) 23:31
>>932
一応つっこんでおこう
#define MAX_NUM_HIST 10
の意味がないところがあるぞ…
936932@研修期間:2001/07/11(水) 23:46
くっそ〜…それだけですか?
なんか、prog8_d.txt読み込めないぜ!

クビがかかってるからアセるぜ〜…
937デフォルトの名無しさん:2001/07/11(水) 23:49
>>936
というか、社会人が宿題以下の問題を持ち込んだのは
あんたがはじめてだよ。(大爆笑)
938デフォルトの名無しさん:2001/07/11(水) 23:53
あのー、ちょっとおたずねしたいのですが、

-- qwe.h --
typedef struct QWE {
 :
} Qwe;

-- asd.h --
typedef struct QWE Qwe;
struct ASD {
 Qwe *pQwe;
 :
}

-- asd.c --
#include "qwe.h"
#include "asd.h"
 :
-- any.c --
#include "asd.h"
 :

とかやると、asd.c では、同じtypedefを二回やることに
なりますよね。
今使っているコンパイラでは全然警告も出ずに、
これでいけてるんですけど、これって規格上でも
おっけーなんでしょうか。
939デフォルトの名無しさん:2001/07/11(水) 23:55
>>938
いやなら#ifdefでククレカレー
940932@研修期間&鬱:2001/07/11(水) 23:57
>>937

くっそぉ〜…!!

営業で入射したんだけどね…
いつのまにか、プログラマーの新人に回されたのさ!
自分はメールくらいしか出来ないんだけど、何でやねん!

とりあえず、第一関門でクビになったら給料半月分しか出ないッスよ。(泣)
941デフォルトの名無しさん:2001/07/11(水) 23:58
fp=fopen("0.txt","r");

0.txt〜29.txtまでをランダムで開きたいのですがどうすれば良いでしょうか?

i=rand()%30
fp=fopen(%d".txt","r",i);
これじゃだめですよねぇ

どうすればいいのでしょうか?
942デフォルトの名無しさん:2001/07/12(木) 00:00
>>941
sprintf が便利
943デフォルトの名無しさん:2001/07/12(木) 00:02
sprintf ってもんがあるでしょー >>941
944932@研修期間&鬱:2001/07/12(木) 00:04
このスレの人達は
漏れに半月分の給料で
ガマンしろとおっしゃっている。ああ、おっしゃっているとも!

エラー0だけど、何で読み込めないんだ〜!!
945デフォルトの名無しさん:2001/07/12(木) 00:06
>>944
あのさ、nも0だろ、たぶん
946デフォルトの名無しさん:2001/07/12(木) 00:06
sprintfですか?
Cやり始めて3ヶ月でまだ使ったことがない文ですが
早速今から試してみようと思います
ありがとうございます
947デフォルトの名無しさん:2001/07/12(木) 00:06
>>944
prog8_d.txt
の中身がわからんのに答えられるか。
scanfは実務じゃ使わないがな。
948932@研修期間&鬱:2001/07/12(木) 00:12
>>947

ぐお!すいません!

12
46
76
23
65
34
9
57
4
…(中略)
20
63

数字の間は「・」みたいので区切られてる。
コピペしたら改行された…くっそ〜!
949デフォルトの名無しさん:2001/07/12(木) 00:15
>>948
>数字の間は「・」みたいので区切られてる。
それが原因だよ(大爆笑)
950デフォルトの名無しさん:2001/07/12(木) 00:16
>>948
ファイルを一括で読みこんでstrtokで「・」を抜け
951デフォルトの名無しさん:2001/07/12(木) 00:17
>>948
「・」
改行の化けだろう
952932@研修期間&鬱:2001/07/12(木) 00:18
>>949
え?じゃあどうすれば…

爆笑されまくってるな…くそ!営業マンはつらいヨ
953デフォルトの名無しさん:2001/07/12(木) 00:21
i=rand()%30
sprintf(motxt,"%d.txt",i);
これで1〜30.txtをランダムで出せるようになりましたが
ファイルオープンの仕方が良く分かりません
自分ではこうしてみましたが
fp=fopen(%s,"r",motxt);
コンパイルできません
何処が間違ってるのでしょうか?
954932@研修期間&鬱解消ぎみ:2001/07/12(木) 00:23
しがない営業マンに
やさしくしてくれたみなさん、ありがとうございます。

ドキュソな私にも理解できそうな
気がしてきたので、あとは自力でがんばります。
(くっそ〜…あと、9問もあるぜ〜。もっと難しいのが)
955デフォルトの名無しさん:2001/07/12(木) 00:24
>>953
君はイチからやりなおしだ。
956デフォルトの名無しさん:2001/07/12(木) 00:27
>>953
fopen の仕様ってちゃんと見た?(大爆笑)
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fopen.3.html
957デフォルトの名無しさん:2001/07/12(木) 00:27
>>953
それだと0〜29.txtだね(大爆笑)
958デフォルトの名無しさん:2001/07/12(木) 00:28
>>955
ぎゃあ
fp=fopen(motxt,"r");
良く見たらこうでした

この先不安だ(ポインタとか)
959デフォルトの名無しさん:2001/07/12(木) 00:29
>>957
i=rand()%30+1
すんまそん
960デフォルトの名無しさん:2001/07/12(木) 00:49
>>932
でも、チミのコードは比較的素直で読みやすい
961修士一年:2001/07/12(木) 04:02
さあ問題
int i;
int b[90];

for(i=0;i<10;i++)
b[i]=i*10;


さあ,b[0]〜b[9]までの数字を文字化けせずに
どうディレクトリ内の"result.dat"に書き込むにはどうすればよいか?
簡単すぎるよな。やっぱり。
962デフォルトの名無しさん:2001/07/12(木) 04:42
>>961
「文字化けせずに」というのが分かりません。
普通にテキストファイルで書き出せばいいの?

「ディレクトリ内」というのはカレントディレクトリですよね?
963デフォルトの名無しさん:2001/07/12(木) 05:20
>>961
copy con result.dat
0
10
20
30
40
50
60
70
80
90
^D
964デフォルトの名無しさん:2001/07/12(木) 06:39
>>962
「自分でやってみたら文字化けした(しかも自分では理由はわかっていない)」に1500カノッサ
965デフォルトの名無しさん:2001/07/12(木) 07:12
自分でやってみたがうまくいかなかった、はよい傾向。
age
966デフォルトの名無しさん:2001/07/12(木) 07:48
>>961&963-965
文字列ではないものに対して、文字化けするって、どういうことだ?
967デフォルトの名無しさん:2001/07/12(木) 07:59
おおかた値を直接書き出したんだろう
fprintfでも使え>>961
968ジョブス2世
新しいスレッドを立てた、よろしく!

C言語なら、オレに聞け! <5>
http://piza.2ch.net/test/read.cgi?bbs=tech&key=994908590