C言語なら俺に聞け! Part 99

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

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

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

各種リンク、関連スレは>>2-13あたり

C言語なら俺に聞け! Part 98
http://pc5.2ch.net/test/read.cgi/tech/1104114259/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2デフォルトの名無しさん:05/01/11 23:45:41
【コンパイラ】
gcc
http://gcc.gnu.org/

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

【ライセンスや機能などに問題あり】
Microsoft C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/〜lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
Intel C++ Compiler for Linux
http://developer.intel.com/software/products/compilers/clin/noncom.htm
3デフォルトの名無しさん:05/01/11 23:46:15
【姉妹スレ】

C言語なら俺俺に聞け! Part 87
http://pc5.2ch.net/test/read.cgi/tech/1090652323/
4デフォルトの名無しさん:05/01/12 00:03:42
4様
5デフォルトの名無しさん:05/01/12 00:04:13
センスねえな・・・ C99だぞ??
6デフォルトの名無しさん:05/01/12 01:53:07
例えば __int64 ってのがあるコンパイラで
long long と記述してコンパイルできる方法はありますの?
7デフォルトの名無しさん:05/01/12 02:00:47
>>6
ないんですの。
8デフォルトの名無しさん:05/01/12 02:07:00
long longがint64とはかぎらんわな
9デフォルトの名無しさん:05/01/12 02:44:28
C++builder5でコンパイルしようとしたら以下のようなエラーがでてしまいました。
別のではできていたようなので理由がわかりません、教えてください。

[C++ エラー] File1.cpp(5): E2209 インクルードファイル 'ERR.H' をオープンできない
[C++ エラー] File1.cpp(14): E2221 マクロ引数の構文エラー
[C++ エラー] File1.cpp(115): E2268 未定義の関数 'warn' を呼び出した
[C++ エラー] File1.cpp(161): E2268 未定義の関数 'strcasecmp' を呼び出した
[C++ エラー] File1.cpp(166): E2268 未定義の関数 'dprintf' を呼び出した
[C++ エラー] File1.cpp(210): E2268 未定義の関数 'dprintf' を呼び出した
[C++ エラー] File1.cpp(219): E2268 未定義の関数 'strcasecmp' を呼び出した
[C++ エラー] File1.cpp(223): E2268 未定義の関数 'dprintf' を呼び出した
[C++ エラー] File1.cpp(263): E2451 未定義のシンボル __func__
[C++ エラー] File1.cpp(263): E2268 未定義の関数 'dprintf' を呼び出した
[C++ エラー] File1.cpp(410): E2268 未定義の関数 'warnx' を呼び出した
[C++ 警告] File1.cpp(463): W8066 実行されないコード
[C++ 警告] File1.cpp(492): W8066 実行されないコード


10デフォルトの名無しさん:05/01/12 02:46:44
>[C++ エラー] File1.cpp(5): E2209 インクルードファイル 'ERR.H' をオープンできない

そのまんまだる?
119:05/01/12 02:56:23
なぜ#include <err.h>が使えないかがわからないんです・・・
すいませんがよろしくおねがいします。
12デフォルトの名無しさん:05/01/12 02:57:37
err.hがあるのかね?
139:05/01/12 03:03:00
ない場合はどうしたらいれられるのでしょうか?
14デフォルトの名無しさん:05/01/12 03:06:55
>>13
err.hというファイルを手に入れろ
15デフォルトの名無しさん:05/01/12 03:09:25
>13
ほかに代用できそうなものがないかあたれ
16デフォルトの名無しさん:05/01/12 03:57:39
> 参考書とか読んでも本当に分かんないんです。 ごめんなさい

ならその本の名前書いてみろよ! かけないだろ? 本当は読んでないくせに。
17デフォルトの名無しさん:05/01/12 04:06:49
stricmpではなくstrcasecmpが用いられているところから
unix系のソースを無理矢理コンパイルしている予感
18デフォルトの名無しさん:05/01/12 04:45:40
Unix系なわけじゃなく、そっちが標準だろ?
19デフォルトの名無しさん:05/01/12 05:09:31
標準なんてありませんが。
DOS/Windows系ではstricmpもしくはstrcmpiしか用意されていませんが。
20デフォルトの名無しさん:05/01/12 05:11:18
> 標準なんてありませんが。

こいつぼけ
21デフォルトの名無しさん:05/01/12 05:13:02
それにしてもstrncmpの仕様って使いにくいとおもわん?
nに0渡したときは何返すべきだと思う?
22デフォルトの名無しさん:05/01/12 05:13:18
では、strcasecmpが標準な規格を教えてください。
POSIX等は、標準Cとは関係ないので却下です。
23デフォルトの名無しさん:05/01/12 05:15:03
POSIXがでてくるあたりでおまえぼけだな > 22
24デフォルトの名無しさん:05/01/12 05:15:28
POSIX好きはむしろBSD。あれのソースはstrlcpyありすぎ
25デフォルトの名無しさん:05/01/12 05:17:01
で、標準Cライブラリで「大文字小文字を区別しない文字列比較関数」が規定されているのは
どの規格ですか?

早く提示してください。
26デフォルトの名無しさん:05/01/12 05:23:35
ほーら もっと考えろ! > 25
googleしてもいいぞ ;-)
27デフォルトの名無しさん:05/01/12 05:36:55
いやあ、考えようと何しようと、規定されてないものはどうしようもないし。
28デフォルトの名無しさん:05/01/12 05:47:08
ところで10種類は?
29デフォルトの名無しさん:05/01/12 06:02:14
strcasecmpが標準ライブラリに含まれる規格は?

はやくだしてよ。ぼけちゃん。
30デフォルトの名無しさん:05/01/12 06:24:40
キャストをマークする目的で
#define cast(TYPE) (TYPE)
として使ってるのですが、これって一般的ですか?
31デフォルトの名無しさん:05/01/12 06:49:24
>>30
#define begin {
#define end }

と同じくらい一般的。
3230:05/01/12 06:51:55
要するにしない方が良いということでしょうか?
ありがとうございました。
33デフォルトの名無しさん:05/01/12 07:59:53
ふつう
#define begin {
#define end ;}
だろぼけ > 31
34デフォルトの名無しさん:05/01/12 08:04:07
>29
UNIX互換端末で
man strcasecmp
を読め!
35デフォルトの名無しさん:05/01/12 08:12:05
だから規格の名前を出せよ早く。いいかげんにしろよ。
ふざけるな。

この無知。
知ったかぶり。

寝ぼけてるんじゃないのか?
36デフォルトの名無しさん:05/01/12 08:15:32
それから、いいこと教えてやるよ。

知らないことがあったら、http://www.google.co.jp/に単語を入れて調べてみるといいよ
もしかしたら、教えてもらえるかもしれないよ。

どう?
勉強になったでしょ?

それから、strdupも標準じゃないんだよ。
知らなかったでしょ?
勉強になったでしょ?

それじゃあね。
もう少し勉強してから、偉そうなこと書こうね。
37デフォルトの名無しさん:05/01/12 08:18:40
あ、「man」なんて名前のC言語の規格は、googleで調べてもどこにもなかったよ。
「UNIX互換端末」という名前の規格もね。

ボク無知だから、C89とかC99とかANSI-CとかISO-Cとか言ってもらわないと分からないの。
もう少し詳しく教えてよ。
38デフォルトの名無しさん:05/01/12 08:27:36
素人はあきらめが早い。
39デフォルトの名無しさん:05/01/12 08:29:38
manはmanualの略だぜ
40デフォルトの名無しさん:05/01/12 08:31:42
> manはmanualの略だぜ

わー、すごーいー。
さすがー。
こんなすごいこと知ってる人が世の中にいたなんて。
感動しちゃった。

で、
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strncasecmp.3.html
どこに「標準C」と書いてあるのかな?
俺には読めないので教えてくれ。
41デフォルトの名無しさん:05/01/12 08:40:03
こんな投稿もあるな。
http://tsukuba.m17n.org/mule-ja-archive/1994-9/msg00029.html
「名前」という日本語がの意味が分からない人には理解できないだろうが。
42デフォルトの名無しさん:05/01/12 08:54:09
まあ、ぼけにつける薬は無いということで。
43デフォルトの名無しさん:05/01/12 09:08:43
00:02:ae:3d:2d:xx こういうMACアドレスを表示させたいのですが
型の宣言は何にすればいいのでしょうか?
あと  %dとか%sのようなフォーマットを何にすればいいのかも教えてください。
44デフォルトの名無しさん:05/01/12 09:15:31
UNIX「互換」端末なんていうものはない。
45デフォルトの名無しさん:05/01/12 09:16:03
>>43
%p
99ページを読め!
46デフォルトの名無しさん:05/01/12 09:17:58
>>41
懐かしいひとたちが...
47デフォルトの名無しさん:05/01/12 09:20:02
>>43
printf("%02d:%02d:%02d:%02d:%02d:%02d", a[5], a[4], a[3], a[2], a[1], a[0]);
48デフォルトの名無しさん:05/01/12 09:20:45
02dよりは02xだろうなあ。
4943:05/01/12 09:32:53
レスありがとうございます。
a[i]はint,long,charなどのどれにすればいいのですか?
50デフォルトの名無しさん:05/01/12 09:37:12
>49
charでぴったりサイズ
51デフォルトの名無しさん:05/01/12 10:01:48
>41
これが灯台レベルとしたら、大学の信頼ガタ落ちだな(k
52v(^o^i)d:05/01/12 12:07:30
お前ら落ち着け
53デフォルトの名無しさん:05/01/12 12:53:46
>>51
大学の授業なんか誰も当てにしてない。
54デフォルトの名無しさん:05/01/12 13:50:49
int main(int argc, char *argv[]){
FILE *fp;
char keyword[80];
char line[256];
char* sp;
int size = 0;

if( argc<3 || (fp=fopen(argv[1],"r") ) == NULL){
printf("can not open file");
exit(1);
}
strcpy(keyword,argv[2]);
size = strlen(keyword);

while(fgets(line,256,fp) !=NULL){
sp = strncmp(line,keyword,size);
if(sp==0){
printf("%s",line);
}
}

fclose(fp);
return 0;
}

----------------------------------------------------------------------
文字列処理のプログラムなんですが、keywordが1文字だった場合、
keywordに空白を追加して文字列比較(strncmp)の処理を行いたいのです。
どのようにすればよいでしょうか?
55デフォルトの名無しさん:05/01/12 13:51:58
>>54
strcat()
56デフォルトの名無しさん:05/01/12 14:12:45
>>54
memset(keyword+1, ' ', 追加する文字数)[追加する文字数] = '\0';
57デフォルトの名無しさん:05/01/12 14:32:24
if (trig==0)if ( Joy.Px > +65536/3 ) myx++;trig=1;
if ( Joy.Px > +65536/3 ) {trig=1;}else{trig=0;}

こいつをもう少し短くできないでしょうか?
5854:05/01/12 14:41:02
>>55>>56
ありがとうございました
59デフォルトの名無しさん:05/01/12 14:41:10
>>57
//if (trig==0)if ( Joy.Px > +65536/3 ) myx++;trig=1;
//if ( Joy.Px > +65536/3 ) {trig=1;}else{trig=0;}
でいかがか?
60デフォルトの名無しさん:05/01/12 14:44:47
>57
c=65536/3;
if(!trig&&Joy.Px>c)myx++;
trig=(Joy.Px>c);
6157:05/01/12 14:52:26
>>60
ありがとうございます。
短くなって見やすくなりました。
62デフォルトの名無しさん:05/01/12 15:57:18
二次元配列を全て1で初期化するにはどうすればいいですか?
6362:05/01/12 15:59:27
訂正。

二次元配列を宣言時に全て1で初期化するにはどうすればいいですか?
64デフォルトの名無しさん:05/01/12 16:03:15
1並べれば
65デフォルトの名無しさん:05/01/12 16:03:23
>>63
static宣言し0を1とみなす。
6663:05/01/12 16:10:59
>>64
時間かかる。

>>65
良く分からないのですが?
67デフォルトの名無しさん:05/01/12 16:15:48
>>66
馬鹿ですね。
68デフォルトの名無しさん:05/01/12 16:26:09
>>63
64の方法以外では無理。
69デフォルトの名無しさん:05/01/12 16:28:44
素直にmemset汁
7063:05/01/12 16:36:04
>>68
>>69
そうでしたか。お手数かけました。
71デフォルトの名無しさん:05/01/12 16:43:35
もうこのスレも99か。ジョブズ3世ってどこいった?
72デフォルトの名無しさん:05/01/12 16:44:36
俺が2ちゃん見始めた頃にこのスレ立ったんだよなあ。懐かしい。
73デフォルトの名無しさん:05/01/12 16:49:21
>>65
static宣言のところは満年齢を採用し他のところは数え年を使用していると考える。

74デフォルトの名無しさん:05/01/12 18:13:12
>>69
char [] にしか通じない罠。
75デフォルトの名無しさん:05/01/12 18:41:10
しょうがねーPascal->C++変換でも作るか
76デフォルトの名無しさん:05/01/12 18:46:28
質問します。
float や double は型を宣言するだけで速度が遅くなるんですか?
計算しないでも、型キャストなんてしてしまうと、それだけで極わずかの
遅延が発生するって事ですか?
教えて欲しいです。
77デフォルトの名無しさん:05/01/12 18:50:16
>>76
変数を宣言するだけなら普通何もしないのと同じだから遅くはならないと思うが。
78デフォルトの名無しさん:05/01/12 18:51:46
int型はサイズが小さくてCPUの中でもすぐに計算できるが、floatはそれより大きいし、int型などとはデータの構造が違う。変換に時間がかかって当たり前。
79デフォルトの名無しさん:05/01/12 18:55:18
float型 を int型が同じ4バイトという環境なんですが、
それでも型キャストぐらいなら問題ないですか?
80デフォルトの名無しさん:05/01/12 19:00:33
あ、データの構造が違うってことは、やっぱ遅れは発生するんでしょうね・・・
けど同じ4バイトだとしても、どうしてなのか不思議です。
計算して遅れが発生するのは納得がいくんですが。
81デフォルトの名無しさん:05/01/12 19:01:50
>79
スーパープログラマじゃあるまいし、そんなにミリ秒の遅延が気になるのか?
82デフォルトの名無しさん:05/01/12 19:15:59
>>81
ナノ秒ならともかく、
ミリ秒ならば、気にするべきかと・・・
83デフォルトの名無しさん:05/01/12 19:29:22
float a=4.0, b=8.0 ;
b/=a ;
とかの演算だったら int型に変換してくれるっていう最適化は
コンパイラに標準でありますか?
84デフォルトの名無しさん:05/01/12 19:32:08
ない、っつうか、bがfloatなのにintにしてどうする。
85デフォルトの名無しさん:05/01/12 19:34:13
>>83
そんなことしたら大変でしょ。
float型をfloat型で割ったものをint型に代入する、なんていう式が真っ当な物とは思えない。
86デフォルトの名無しさん:05/01/12 19:40:03
>>85
なんでだよ。
耐荷重M kgのエレベーターに、平均体重m kgの人が何人乗れるか、どうやって計算する?
87デフォルトの名無しさん:05/01/12 19:43:38
誤解してるね。
88デフォルトの名無しさん:05/01/12 19:43:41
ありがとうございます。
よく考えたらおかしいとわかりました。
89デフォルトの名無しさん:05/01/12 19:48:48
小数点の切り捨て ってどうやって行ってるんですか?
やっぱ、単にシフトしてるだけなんでしょうか?
90デフォルトの名無しさん:05/01/12 19:55:53
>>89
あの、えと、floatって浮動小数点数なんですが…
って、釣りですか。
91デフォルトの名無しさん:05/01/12 20:02:09
>83
C++でfloatの前にconst付けると最適化されうる
92デフォルトの名無しさん:05/01/12 20:10:37
>>91
なるほど!
93デフォルトの名無しさん:05/01/12 20:12:25
>>90
つまり単なるシフトじゃないって事ですね。
じゃどうやってるんですか? マスキングかなんかですか?
94デフォルトの名無しさん:05/01/12 20:14:39
93は忘れてください。
よく考えたらおかしいとわかりました。
95デフォルトの名無しさん:05/01/12 21:40:40
マクロでループ処理ってできないんすか
96デフォルトの名無しさん:05/01/12 21:50:16
>>95
出来るだろ。
9795:05/01/12 22:21:05
>>96
差し支えなければサンプル見せて下さい。簡単で良いです。
俺にはできんかったとです。
98デフォルトの名無しさん:05/01/12 22:25:59
>>97
マクロはただの文字列置換。
マクロ内にループ処理を入れれば、
そのループ処理に勝手に置換される。

> 俺にはできんかったとです。

マクロの基本から勉強し直せ。
99デフォルトの名無しさん:05/01/12 22:27:29
//古典的なやり方
#define REPEAT(stmt,n) REPEAT##n(stmt)
#define REPEAT0(stmt) #define REPEAT1(stmt) stmt
#define REPEAT2(stmt) \
do{stmt;stmt;}while(0)
#define REPEAT3(stmt) \
do{stmt;stmt;stmt;}while(0)
100デフォルトの名無しさん:05/01/12 22:27:41
>>97
#define ENDLESS_LOOP while(1)

int main( void )
{
  ENDLESS_LOOP;
  return 0;
}
101デフォルトの名無しさん:05/01/12 22:36:14
//近代的なヤツ
template<int n>
inline void loop(){
justDoIt();
loop(n-1);
}
inline void loop<0>(){}
102デフォルトの名無しさん:05/01/12 22:59:00
>>101
それ書くなら
template <int N>
inline void loop() {
justDoIt();
loop<N-1>();
}
template <>
inline void loop<0>() {}

スレ違いだし。
103デフォルトの名無しさん:05/01/13 00:50:30
K&Rで 0より大きいか等しく、1より小さい数の乱数を発生させるのに、
#define frand() ((double)rand()/(RAND_MAX+1))
をつかってますが、gccでコンパイルするとオーバーフローみたいな
エラーがでます。
どうすればよいのでしょう?
お願いします。
104デフォルトの名無しさん:05/01/13 01:00:20
>>103
なんか間違ってる
105デフォルトの名無しさん:05/01/13 01:01:35
RAND_MAX==UINT_MAXなんだろう
RAND_MAXもdaubleにキャストすりゃいい
106デフォルトの名無しさん:05/01/13 01:04:30
dauble
107デフォルトの名無しさん:05/01/13 01:35:31
strpbrk()のpbrkってなに?ピーブレイク?
108デフォルトの名無しさん:05/01/13 07:29:29
>>103
RAND_MAX+1.0
109デフォルトの名無しさん:05/01/13 07:59:21
>>103
じゃあ
#define frand() ((double)rand() / ((double)RAND_MAX + 1) )
にすればいいのでは?
110デフォルトの名無しさん:05/01/13 08:27:44
string pointer break 常識!
111デフォルトの名無しさん:05/01/13 08:39:37
StrikeBreaker
スト破り
112デフォルトの名無しさん:05/01/13 14:00:12
構造体の複数のmemberを参照する時に"."とか"->"ではなくて
配列で、[i]番目のmemberって感じで参照できないんでしょうか?
113デフォルトの名無しさん:05/01/13 14:05:40
>>112
Cではミリ
C++ならboost::tupleで代用できなくもないけど
114デフォルトの名無しさん:05/01/13 14:11:57
>>113
ありがとうございます。
なんか効率的じゃない気がしたもので・・

ということはwrite()/read()で構造体に入れてあるデータをファイルに
書き込み/読み込みする際も、その都度複数のmemberごとにbufferを./->で
指定しなきゃいけないってことですよね?
115デフォルトの名無しさん:05/01/13 14:16:43
>>114
そんなことはない
ただ構造体メンバにポインタが含まれている場合は
ポインタの参照先までちゃんと書き出す処理を自前で書かないといけない
116デフォルトの名無しさん:05/01/13 14:19:00
>>115
ありがとうございます。
そうすると、pointerがmemberに含まれていない構造体を一気に
write/readする時はどのようにすれば良いのでしょうか?
117デフォルトの名無しさん:05/01/13 14:21:55
構造体を一気にwrite/readすれば良い。
118デフォルトの名無しさん:05/01/13 14:24:33
>117
bufferの部分はなんと書けばよいのでしょう?
119デフォルトの名無しさん:05/01/13 14:28:25
intをfwrite/freadする時と全く同じに書けばよい。
120デフォルトの名無しさん:05/01/13 14:30:29
struct hoge {
 int a;
 char b;
 double c;
};

struct hoge buf;

// 書き込み
fwrite(&buf, sizeof(buf), 1, fp);

// 読み込み
fread(&buf, sizeof(buf), 1, fp);
121デフォルトの名無しさん:05/01/13 14:39:58
>>119-120
ありがとうございます。
ということは、↓ということでいいでしょうか。
一応エラーはないようでしたが、ファイルを直接見てみると
文字化けしてましたので・・。

struct Hoge hoge;

write(fd, &hoge, sizeof(hoge));
122デフォルトの名無しさん:05/01/13 14:41:58
文字化け…
文字列でも書き出そうとしてるんですかい?
struct Hoge hoge, hoge2;
として
hogeをwriteで書き出した後、hoge2にreadして値がちゃんと入ってるか調べてみては?
123デフォルトの名無しさん:05/01/13 14:44:04
一応書かせて頂きますと、open時は
fd = open("C:\\hogelist.text", O_RDWR | O_CREAT, S_IWRITE | S_IREAD);
としています。
124デフォルトの名無しさん:05/01/13 14:44:20
>>121
writeで書き出されるのはバイナリデータだから、エディタで開いても見えないよ
125デフォルトの名無しさん:05/01/13 14:48:20
>>123-124
とんでもない勘違いをしていました。
ご指摘ありがとうございました。

ところでアクセスモードだと思うのですが、
O_ROWとはなにを指しているのでしょうか?
Microsoft C の純正リファレンスのソースに載っていたのですが
説明がないのです・・。
126デフォルトの名無しさん:05/01/13 14:49:21
間違えました、O_RAWです。
127デフォルトの名無しさん:05/01/13 14:51:33
>>122
ありがとうございます、試してみたところ問題ないようでした^^
128デフォルトの名無しさん:05/01/13 14:51:59
>>125
RAWデータ(つまりバイナリデータ)モードでは?
#if C_MSC & MSDOS2
#include <fcntl.h>
#define O_RAW O_BINARY
#endif
↑こんな風になってるから、O_BINARYと等価かと
129デフォルトの名無しさん:05/01/13 15:00:45
>>128
ははぁ・・なるほど、そうでしたか。
大変助かりました、皆さんありがとうございました。
130デフォルトの名無しさん:05/01/13 18:15:17
1 なら 0
2 なら 1
4 なら 2
8 なら 3
16 なら 4
32 なら 5



という風に'x なら y'
というビットシフト値(y)を得たいのですが、
簡単な変換方法はないでしょうか?
131デフォルトの名無しさん:05/01/13 18:25:49
>>130
簡単じゃない方法って、
一体どういう奴の事?
132デフォルトの名無しさん:05/01/13 18:26:31
ちなみに今は

f(x) {
 int i=1,y=0;
 for (;i != 0x80000000;i*=2,y++) {
  if (i==x)
   return y;
 }
 return -1; // 一致しない
}

という関数でやってます。
これより良い方法があればご教授下さい。
133デフォルトの名無しさん:05/01/13 18:34:08
不一致の場合は-1を返さないとダメ?
134デフォルトの名無しさん:05/01/13 18:36:43
>>130
y = log((double)x) / log(2.0);
135デフォルトの名無しさん:05/01/13 18:39:10
>>132
なんでxを直接シフトしないのん?
136デフォルトの名無しさん:05/01/13 18:45:16
>>134
つまんね
137デフォルトの名無しさん:05/01/13 18:45:24
>>133
xが2のn乗とは限らない場合があるので。

>>134
y = (int)(log((double)x) / log(2.0));
としたあと
if (x == 1<<y)
で比較すれば正しいかわかりそうですね。
これでやってみます。
ありがとうございました。

>>135
xに何が入ってくるのかわからないからです。
138デフォルトの名無しさん:05/01/13 18:48:59
あー、>>134の方法ではだめでした。
x==8のときyが2でした。

以下テストコード
int x,y;
x = 1;
y = (int)(log((double)x) / log(2.0));
printf("x=%d y=%d %s\n",x,y,(x==1<<y)?"ok":"ng");
x = 2;
y = (int)(log((double)x) / log(2.0));
printf("x=%d y=%d %s\n",x,y,(x==1<<y)?"ok":"ng");
x = 3;
y = (int)(log((double)x) / log(2.0));
printf("x=%d y=%d %s\n",x,y,(x==1<<y)?"ok":"ng");
x = 4;
y = (int)(log((double)x) / log(2.0));
printf("x=%d y=%d %s\n",x,y,(x==1<<y)?"ok":"ng");
x = 5;
y = (int)(log((double)x) / log(2.0));
printf("x=%d y=%d %s\n",x,y,(x==1<<y)?"ok":"ng");
x = 8;
y = (int)(log((double)x) / log(2.0));
printf("x=%d y=%d %s\n",x,y,(x==1<<y)?"ok":"ng");
x = 16;
y = (int)(log((double)x) / log(2.0));
printf("x=%d y=%d %s\n",x,y,(x==1<<y)?"ok":"ng");
x = 32;
y = (int)(log((double)x) / log(2.0));
printf("x=%d y=%d %s\n",x,y,(x==1<<y)?"ok":"ng");
139デフォルトの名無しさん:05/01/13 18:50:23
結果

x=1 y=0 ok
x=2 y=1 ok
x=3 y=1 ng
x=4 y=2 ok
x=5 y=2 ng
x=8 y=2 ng
x=16 y=4 ok
140デフォルトの名無しさん:05/01/13 18:57:58
失礼しました。
ceilをはさんだらうまくいきましいた。

test(x) {
int y = (int)(ceil(log((double)x) / log(2.0)));
printf("x=%d y=%d %s\n",x,y,(x==1<<y)?"ok":"ng");
}
main() {
int i;
for (i=0; i<=64; i++) test(i);
}

x=0 y=0 ng
x=1 y=0 ok
x=2 y=1 ok
x=3 y=2 ng
x=4 y=2 ok
x=5 y=3 ng
x=6 y=3 ng
x=7 y=3 ng
x=8 y=3 ok
x=9 y=4 ng

x=15 y=4 ng
x=16 y=4 ok
x=17 y=5 ng

x=31 y=5 ng
x=32 y=5 ok
x=33 y=6 ng
141デフォルトの名無しさん:05/01/13 19:00:24
ちょっとは誤差とかも考えろよ。
log(x)/log(2.0) <- 両辺とも整数になりようがない
142デフォルトの名無しさん:05/01/13 19:02:38
浮動小数点使わない方法ないの?
143デフォルトの名無しさん:05/01/13 19:10:54
ある
144デフォルトの名無しさん:05/01/13 19:19:14
>>142
int numofbits5(long bits) {
 bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
 bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
 bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
 bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
 return (bits & 0x0000ffff) + (bits >>16 & 0x0000ffff);
}
145デフォルトの名無しさん:05/01/13 19:22:46
それはビットカウント
146デフォルトの名無しさん:05/01/13 19:24:43
>>144
それはビット数数えるだけでそ。
シフト数を調べたければ、(例外を弾いてあるとして)

int n=32, nb;
nb = numofbits5(~((unsigned long)0) + n;);

だろ
147デフォルトの名無しさん:05/01/13 19:25:17
かぶった orz
148デフォルトの名無しさん:05/01/13 20:38:54
いいねこれ。
いつ使えるかわかんねけど。

つーかどっかで見たな。
Cマガだったかな。
たしか何かの特集で得意げに紹介されてたよ。
小手先馬鹿だね。
149デフォルトの名無しさん:05/01/13 21:03:34
tp://www.nminoru.jp/~nminoru/programming/bitcount.html#leading-0bits
150デフォルトの名無しさん:05/01/13 21:16:10
エクセルでボタン作って、そこを押すとランダムに数字がでるプログラムをつくってもらえないですか
151デフォルトの名無しさん:05/01/13 21:23:50
>>150
スレ違い

ここのExcelスレで聞け
http://pc5.2ch.net/win/
152デフォルトの名無しさん:05/01/13 21:53:03
105>>かしこ
153デフォルトの名無しさん:05/01/13 21:55:13
ニュー速から来ました。
記念カキコ
154デフォルトの名無しさん:05/01/13 23:13:04
>>120
バグの温床になるから気をつけとけよ。
155デフォルトの名無しさん:05/01/13 23:19:40
関数へのポインタを返したいのですが
コンパイルエラーが出てしまいました

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

double*
get_func(void)
{
double (*fp)(double);
fp = sin;
return (double*)fp;
}

int
main(void)
{
double (*fp)(double);
fp = get_func();
// fp = sin; // これなら問題ない
printf("%g", fp(1));
return 0;
}

~ % gcc -g test.c
test.c: In function `main':
test.c:16: warning: assignment from incompatible pointer type
~ %

型が違っているようには思えないのですが
何かアドバイスいただけますか
156デフォルトの名無しさん:05/01/13 23:36:32
get_func()の返却値はdouble*
fpはdouble (*)(double) 
157デフォルトの名無しさん:05/01/13 23:38:49
何故get_func()の中でdouble *にキャストしているのだろう・・・
158デフォルトの名無しさん:05/01/13 23:48:36
>>155
void*返すようにしとけ。
159デフォルトの名無しさん:05/01/14 00:01:29
>>155
関数ポインタをそのままけ返せばいい
double (*get_func(void))(double)
{

return fp;
}
160デフォルトの名無しさん:05/01/14 00:07:37
>>155
汝、エラーと警告を混同するなかれ
161デフォルトの名無しさん:05/01/14 00:07:48
GCCとやらをインストールしたいんだがどうすればいいんだ?
OSはWinXPだ
162デフォルトの名無しさん:05/01/14 00:08:37
163デフォルトの名無しさん:05/01/14 00:09:37
>>156-159
ありがとうございます
以下のどちらでも期待した結果になりました

void* get_func(void)
{
double (*fp)(double);
fp = sin;
return fp;
}

double (*get_func(void))(double)
{
double (*fp)(double);
fp = sin;
return fp;
}

int main(void)
{
double (*fp)(double);
fp = get_func();
printf("%g\n", fp(1));
return 0;
}

修行してきます…
164デフォルトの名無しさん:05/01/14 00:12:18
>>160
a.exe できてたよ…
そして期待した結果になってたよ…
もっと落ち着くことを覚えたいと思います

陳謝
165デフォルトの名無しさん:05/01/14 00:13:40
英語なんか読めるか ぼけ
166デフォルトの名無しさん:05/01/14 00:26:55
ttp://49uper.com:8080/html/img-s/34183.zip

dllにコンパイルしたのですが何故か動かせず・・・
上のソースはネットから拾ってきたもので環境はvc++toolkit2003とSDKでやっております
コマンドプロンプトからtoolkit起動して
cl /c /O1 main.cpp
link /dll main.obj kernel.lib use32.lib /def;main.def

ちなみに上のソースはあるプログラムの拡張dllです
どなたかご教授願いします
167166:05/01/14 00:28:16
X link /dll main.obj kernel.lib use32.lib /def;main.def
○ link /dll main.obj kernel.lib use32.lib /def:main.def
です
168デフォルトの名無しさん:05/01/14 00:36:49
cl main.cpp main.def user32.lib

・・・・俺もヤキ回ったな・・・・ 何見てんだよまったく
169デフォルトの名無しさん:05/01/14 00:39:51
そういえば焼肉食べた。
170デフォルトの名無しさん:05/01/14 00:49:28
while (*s) {

k=char(*s);
k=k&0x000000ff;
h0+=k;
cout<<h0<<endl;
*s++;

}

このループってどうなるとループから出るんですか?
171デフォルトの名無しさん:05/01/14 00:59:12
sがオーバーフローして0に戻った時
172デフォルトの名無しさん:05/01/14 01:05:05
'\0'文字に出会ったとき、
つまり文字列の終端で終了

printf("%s", s);
と同じ
173デフォルトの名無しさん:05/01/14 01:06:56
ありがとうございます
174デフォルトの名無しさん:05/01/14 01:19:57
#ifdef DEBUG
#define DebugPrint(message, s...) printf(message, ##s)
#else
#define DebugPrint(message, s... )
#endif

このマクロの移植性はどんな感じでしょうか。

参考web
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.6.3.html
http://docs.hp.com/ja/5969-4432/ch01s01.html
175174:05/01/14 01:28:27
すみません。

#ifdef DEBUG
#define DebugPrint(message, ...) printf(message, ## __VA_ARGS__)
#else
#define DebugPrint(message, ... )
#endif

と、したほうが良いみたいですね。


http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Variadic-Macros.html#Variadic-Macros
176デフォルトの名無しさん:05/01/14 01:55:10
>>175
__VA_ARGS__はつい最近のコンパイラでしか使えないんだよなあ。
まあ正式な規格のものだから古いコンパイラに移植なんてことが
なかったらそれでいいけど。

古い奴も頭に入れる場合は、

#ifdef DEBUG
#define DebugPrint printf
#else
#define DebugPrint 0 && printf
#endif

とかやって最適化でprintf〜が消えることを期待する方法がある。
177デフォルトの名無しさん:05/01/14 05:18:33
19 188 とかの数字を 10のように最後が0になるよう変換したいんですが、
何かいい方法ないですか?
シフト演算とかビット演算みたいに簡単に変換したいくて、
割り算は使いたくないんです。
178デフォルトの名無しさん:05/01/14 05:20:07
179デフォルトの名無しさん:05/01/14 05:22:39
したくて、でしたね
180デフォルトの名無しさん:05/01/14 06:32:34
>>177
*10 でいいんでねーの?

本意じゃないだろうけど、その文じゃ意味不明。
181デフォルトの名無しさん:05/01/14 07:46:22
普通に理解できるだろ
19 →10 188→180
182デフォルトの名無しさん:05/01/14 08:12:18
>>177
int floor10(int val)
{
char buf[12];
sprintf(buf, "%d", val);
buf[strlen(buf) - 1] = '0';
return atoi(buf);
}
183デフォルトの名無しさん:05/01/14 08:12:53
さっぱりわからんが
/10*10ということでいいのか?
184デフォルトの名無しさん:05/01/14 08:24:45
除算禁止が条件らしい
>>182 も sprintf 内部じゃ10で割りまくりだから、だめだろ
185デフォルトの名無しさん:05/01/14 08:46:02
つーか181でやっとわかった
181はエスパーか?
186デフォルトの名無しさん:05/01/14 09:00:13
>>177
int floor10(int x){
 int y = 10;
 for (;y <= x; y+=10)
  if (x - y < 10)
   return y;
  return -1; // 解なし
}
割り算を使ってないというだけだが
187デフォルトの名無しさん:05/01/14 09:16:24
>>177
乗除算を使用するのが最も簡単。
何故、除算禁止にこだわるのか、理解に苦しむ。
188デフォルトの名無しさん:05/01/14 09:22:09
189186:05/01/14 09:34:00
>>186の方法の収束率を上げたやつ
int floor10(int x){
 int y = 10;
 for (;y <= x;) {
  int w = x - y;
  if (w < 10)
   return y;
  if (w > 1000000000) y+=1000000000;
  else if (w > 100000000) y+=100000000;
  else if (w > 10000000) y+=10000000;
  else if (w > 1000000) y+=1000000;
  else if (w > 100000) y+=100000;
  else if (w > 10000) y+=10000;
  else if (w > 1000) y+=1000;
  else if (w > 100) y+=100;
  else y+=10;
 }
 return -1; // 解なし
}

くだらなかったね
ニュートン法かなんかでもうちっと効率良いのってできなかったっけ
190デフォルトの名無しさん:05/01/14 11:13:23
先生、%は除算に入りますか?
191デフォルトの名無しさん:05/01/14 11:13:48
除算は300円まで
192デフォルトの名無しさん:05/01/14 11:16:16
8進数なら & ~7 でいいんだけどねぇ。
193デフォルトの名無しさん:05/01/14 12:18:13
Borland C++ Compiler 5.5ってWinXPでも動きますか?
194デフォルトの名無しさん:05/01/14 12:43:11
>>190
普通に考えれば入るだろう。
195デフォルトの名無しさん:05/01/14 13:12:57
>>193
動くよ
196デフォルトの名無しさん:05/01/14 14:05:26
ファイルがバイナリかどうかを調べる方法ってありますか?
197デフォルトの名無しさん:05/01/14 14:11:11
文字コードから外れているものがあるかどうか調べる
198デフォルトの名無しさん:05/01/14 14:55:50
人間がテキスト表示したものを見ると
エンコードミスによる文字化けなのかバイナリなのか結構わかるもんだけど
あれはどういう基準なんだろう
199デフォルトの名無しさん:05/01/14 14:59:23
秩序の有無や、過去に同じような文字化けを見たことがある、等じゃない?
詳しくは認知心理学でもやってくれ
200デフォルトの名無しさん:05/01/14 15:00:04
写真を見て、海か川かを判断できる事といっしょだ
201デフォルトの名無しさん:05/01/14 15:42:48
適当に改行が入っているか、適当に空白が入っているか、
読めない文字の並び方に連続性がないか適度に再現性があれば文字化け。
202デフォルトの名無しさん:05/01/14 16:55:10
>>177
long floor10(long d)
{
    static const int dtbl[] = {0, 6, 2, 8, 4, 0, 6, 2, 8, 4, 0, 6, 2, 8, 4, 0};
    int lastd = (d & 0xF);
    long val;
    if (lastd >= 10)
        lastd -= 10;
    for (val=(d>>4); val; val>>=4) {
        if ((lastd += dtbl[val & 0xF]) >= 10)
            lastd -= 10;
    }
    return d - lastd;
}
203デフォルトの名無しさん:05/01/14 18:08:46
双方向リストに文字列を蓄えたいんですが、

struct s{
char *name;
struct s *prev;
struct s *next;
}aiu;
・・・
aiu data;
char buf[100]

scanf("%s", buf);
data.name = buf;
addtail(data);
・・・
addtailはリストを作る関数です。
でこの三つの文をぐるぐる回していれていったんですが、表示するときに
最後に入れた文字列ばっかりが表示されます。文字列ではなくて一文字
だけとか、入力させずに、data.name="abc"というようにプログラム中でそ
のまま指定した場合は、そのとおりに表示されました。なので上のプログ
ラムがおかしいと思うのですが。
204デフォルトの名無しさん:05/01/14 18:18:42
>>203
data.name が指す領域は誰が確保して誰が解放するのか考えてみましょ
う。
205デフォルトの名無しさん:05/01/14 18:26:17
>>202
よく読んでないが、加減算とシフトを使って割り算を書いてるようにしか見えん。
206デフォルトの名無しさん:05/01/14 20:11:23
つか、それでいいんではw
割り算使うな=割り算えみゅれ
207デフォルトの名無しさん:05/01/14 20:11:56
>>205
やべーボクすごいとか思ってるんだからほっといてやれよ
208デフォルトの名無しさん:05/01/14 20:32:41
こういうことだろう

int waru10(int x)
{
return (x>>3)<<3+(x>>1)<<1;
}
たぶんね
209デフォルトの名無しさん:05/01/14 20:54:57
>>205
えーっと、4ビットずつBCD変換して、(最下桁の総和 mod 10) を
元の数から引いてます。ループは最大でも (sizeof long * 2) 回。

>>208
waru10() という関数名と処理が乖離しまくってますが。
210デフォルトの名無しさん:05/01/14 21:45:03
まあ、パズル的に解くのは楽しいけど
最近のプロセッサは整数の割り算なんか、全然重い処理じゃないしなあ。
211デフォルトの名無しさん:05/01/14 22:05:36
>>210
何サイクルくらい? 面積は??
212デフォルトの名無しさん:05/01/14 22:14:40
>>210
むしろ、最近のコンパイラは最適化があるから、
この程度のことでわざわざループやら加算の繰り返しやらを
行ったらどんなプロセッサでもまず間違いなくパフォーマンスが下がると思ふ。
よって、そのことについて言及するだけ無駄でしょう

しかし質問の意図が見えないよ・・・

>>211
前にPen4なら1サイクルと聞いたが・・・調べてないので保障しない
213デフォルトの名無しさん:05/01/14 22:18:15
いつもお世話になっております先輩ども

今回聞きたいのは「void*」って戻り値についてです
アレですよ 何だよコレ戻ってんのかYO! voidって何も戻らないんじゃないのかYO!
って話です ご教授宜しく哀愁
214デフォルトの名無しさん:05/01/14 22:19:21
>>212
もう一度聞く、何サイクル? 面積は??
215デフォルトの名無しさん:05/01/14 22:29:09
面白いと思って書き込んだ、渾身のネタなんだろうな。
216デフォルトの名無しさん:05/01/14 22:40:10
>>213
void*はなにを指してるのかわかんないけどとにかく何かを指してる(かもしれない)ポインタの型です。
なにを指してるのか不明なのでこの型のポインタはポインタ演算のほとんどができません。

プログラマはこの型のポインタがなにを指しているのか知ってることが期待され、
その型にキャストして使います。
217デフォルトの名無しさん:05/01/14 23:02:30
Cでプロセス間通信に共有メモリを使っているのですが、共有メモリで
2次元配列型のデータを扱うことはできるのでしょうか。
218デフォルトの名無しさん:05/01/14 23:20:53
>>217
もちろんだ
219186:05/01/14 23:22:42
皆さま、様々なご解答ありがとうございました。
特に、>>202さんの解答には驚きました。

x=floor10(99988883) ;

とか送った場合、わずか6回のループで済んじゃったわけですが、
これが、>>189さんのおっしゃるニュートン法ってやつなんですか?
検索してみたところで、数学が苦手でさっぱり訳がわかりませんでした。
どういう考えの元で、このようなやり方を思いついたのですか?
半分不可能と思っていただけに、ホント驚きました。
ありがとうです。
220デフォルトの名無しさん:05/01/14 23:24:13
あ、>>209の方が解説してくれてますね。
すいません、少し焦っちゃいました。
221デフォルトの名無しさん:05/01/14 23:31:17
ループ=分岐が入る
この時点で、実行速度的に(もちろんサイズ的にも)かなり不利になるけどね
222217:05/01/14 23:38:17
例えばa[3][3]という2次元配列を共有メモリで使いたい場合、
変数宣言とshmgetとshmatの記述はどのようにすればいいのでしょうか。
223デフォルトの名無しさん:05/01/14 23:41:58
多次元配列へのポインタ
>>1のリンクを読む
224デフォルトの名無しさん:05/01/14 23:44:48
>>222
>shmgetとshmatの記述は
この部分はスレ違い。

a[3][3]を指すポインタは(仮にcharだとして)

char (*p)[3];

になる。
225217:05/01/14 23:53:50
どうもありがとうございました。
大変参考になりました。
226デフォルトの名無しさん:05/01/15 00:21:18
宣言できる配列の要素数はメモリの量によって変わるんですか?
227デフォルトの名無しさん:05/01/15 00:21:56
>>226
いいえ。
228デフォルトの名無しさん:05/01/15 00:28:28
>>227
ハー・・・・・・・
229226:05/01/15 00:29:32
>>227
intの要素数を100000位使いたいのですが、出来ますか?
230デフォルトの名無しさん:05/01/15 00:35:28
>>229
スタックサイズによります。
大体1MBほど使えるかもしれませんが、実装やいろいろな設定で変わってくるでしょう。
もし、多くの領域を使いたいのであれば、ヒープ領域から確保するべきです。
そうすれば、安心できるでしょう?
231デフォルトの名無しさん:05/01/15 01:03:33
>>219
それより、除算禁止の理由は?
232229:05/01/15 01:19:48
>>230
調べてみます。
233デフォルトの名無しさん:05/01/15 01:30:28
>>232
具体的に言えば、例えば、
int a[10000];
int i;
for(i = 0; i < 10000; i++)a[i]=0;
とするところを、
int* a;
int i;
a = (int*)malloc(sizeof(int)*10000);//ヒープ領域に使用領域を確保。その先頭番地のポインタ。
for(i = 0; i < 10000; i++)a[i]=0;
free(a);//確保したら開放しないとダメ。メモリは再利用…
234デフォルトの名無しさん:05/01/15 01:32:55
>>231
90000/10 だとコンピュータ内部だと、9000回10を引いているのだと
思っているからです
235デフォルトの名無しさん:05/01/15 01:34:07
だと
236デフォルトの名無しさん:05/01/15 01:39:26
>>234
ハー・・・・・・・
237デフォルトの名無しさん:05/01/15 01:41:45
はふはふ
238デフォルトの名無しさん:05/01/15 01:46:17
さっきから考えてみてたんですが、>>202さんのって
BCDコードに変換してる訳じゃないんですね。
239デフォルトの名無しさん:05/01/15 01:48:54
ぱふぱふ
240デフォルトの名無しさん:05/01/15 01:51:49
さすがに>>234は本人じゃないだろ。あまりにも・・・過ぎる。
もし本人なら、真面目に考えた人が浮かばれん。
俺はパズル以外に意義を見いだせなかったから、全然考えてないけどな。
241232:05/01/15 01:58:56
>>233
ありがとうございます。

a = (int*)malloc(sizeof(int)*100000);

これだと400kb位?使っている事になるんですよね?

242デフォルトの名無しさん:05/01/15 02:24:12
>>240
では問いますが、除算はどのように実現されているので?
除算回路なんて一般のCPUに組み込まれているんですか?
その辺はよくわからんですが、普通加算回路しか入ってないと思ってるんですけど。
いや、ほんとよくわからないんですけど。
あまりにも・・・過ぎて申し訳ありませんねぇ
243デフォルトの名無しさん:05/01/15 02:29:22
いわゆる筆算と同じ方式でやってるんじゃなかった?
引き戻し法とか
244デフォルトの名無しさん:05/01/15 02:34:42
なんで割り算ごときでBCD変換だのループだの出てくるわけ?
コードが美しいわけでもない、速度は遅い、無駄に変数使う。。。
そのアルゴリズムの優れている点はどこなの?
勉強したての人がそういうの見てお手本にしたら可哀想だろうに……
245デフォルトの名無しさん:05/01/15 02:35:51
だからBCD変換じゃないって・・・
246デフォルトの名無しさん:05/01/15 02:37:19
コード読んでないけど、>>209でなんか言ってるじゃん。
247デフォルトの名無しさん:05/01/15 02:45:41
>俺はパズル以外に意義を見いだせなかったから、全然考えてないけどな。
>コード読んでないけど

同一人物でつか?
248デフォルトの名無しさん:05/01/15 02:49:26
ちげえよバカ。>>244=>>246だよ
249デフォルトの名無しさん:05/01/15 02:51:59
もう、何がなんだか
250デフォルトの名無しさん:05/01/15 02:54:32
> コードが美しいわけでもない

自分は結構美しいコードだと感じたけど。
251デフォルトの名無しさん:05/01/15 02:55:42
>>247
同一っつーか、俺はこの話題については>>210>>221>>240位しか書き込んでないよ。

で、プロセッサの除算は、いわゆる筆算のアルゴリズムを使うが、
最近のプロセッサは、テーブルを使って一発で結果を出す方法も併用していると思う。
少し前にPentiumのバグで回収騒ぎがあっただろ?
あれは浮動小数の方だけど。
252デフォルトの名無しさん:05/01/15 03:03:52
>>250
いくらなんでもそれはないだろう
253デフォルトの名無しさん:05/01/15 03:08:07
なるほど、とんだ馬鹿な思い込みだったみたいですね。
少し前にPentiumのバグで回収騒ぎなんて話題も知りませんでした。
じゃあ、普通に割り算してたほうが早かった、って事か・・・

けど、ホント勉強になったんです。問題考えてくださった方はありがとございました。

あとついでと言っちゃあ何ですけど、static const int の static がもしなかったら、
関数が呼ばれるたびに初期値が代入されて無駄が発生するって見解は正しいですか?
254デフォルトの名無しさん:05/01/15 03:11:34
正しいよ
255デフォルトの名無しさん:05/01/15 03:14:25
よかった。ありがとうっす
256デフォルトの名無しさん:05/01/15 03:15:36
goto文使うともっと速いらしいぞ
257デフォルトの名無しさん:05/01/15 03:16:46
いまどきのコンパイラちゃんなら最適化してくれそうな気もしなくもない
258デフォルトの名無しさん:05/01/15 03:18:11
真面目に考えてた人、ご愁傷様でした。
259デフォルトの名無しさん:05/01/15 03:25:37
昔、除算命令で商と余り一度に取れたよね。いまのはどうなんだろ。
260デフォルトの名無しさん:05/01/15 03:34:14
今もそうよ。
標準ライブラリにldivというのもある。
261デフォルトの名無しさん:05/01/15 03:52:43
ファイルをオープンして書き込みするってのは処理としては早い?遅い?。
ゲーム作っててデバッグ用にどこの場所を通ってるか調べるのにLOGを
とりたいんだけどゲームみたいに中で一定の速さが必要なものを作る時
ファイルの書き込みを使ってもスピードに支障はでないレベルでしょうか?
ファイル操作+速度に関して知っておられる方おりましたら助言よろしくです。
262デフォルトの名無しさん:05/01/15 04:08:16
ディスクのシーク+回転待ちでかかる時間が5-15ms程度。
OSやファイルシステムにも依るが、書き込みはこれを数回繰り返す。が、
・全部同期で書き込む
・ジャーナリング等の情報だけを同期で、データ本体は非同期で書き込む
・全部非同期で書き込む
等々があって、実際のwriteでどの程度かかるかは環境依存。

その上、Cライブラリのレベルでバッファリングしているから
fwriteやfprintfで実際にシステムコールが呼び出されるかはわからない。

ログの量がある程度以下と想定できるなら、
setvbufによって、事実上ディスクアクセスをfclose時だけにすることも可能。
263デフォルトの名無しさん:05/01/15 07:09:03
>>261
速度を保証する必要があるならファイル操作ではなく物理ディスク
264デフォルトの名無しさん:05/01/15 07:29:02
↑バカ
265デフォルトの名無しさん:05/01/15 08:35:08
h = _open( "sakenosakana.txt", O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE ) ;
fp = fopen( argv[1], "r" ) ;
fscanf( fp, "%s" ,buf ) ;
_write( h, buf, 10 ) ;

ちょっと省略しますが、こんな感じで新規のファイルを作ろうと思いました。
しかし、出来上がる場所が実行ファイルと同じ場所と思ってたんですが、そうでも
ないみたい。なぜ??
どうにかして、場所を指定できないですか?
266デフォルトの名無しさん:05/01/15 08:42:16
>>265
普通ファイル名だけを指定するとカレントディレクトリを指定したものと見なされる。
どこかから実行ファイルの場所を得て、そこへファイル名をくっつけて使え。
267デフォルトの名無しさん:05/01/15 08:55:47
おぉ! なんとか出来ました。

けど、
> 普通ファイル名だけを指定するとカレントディレクトリを指定したものと見なされる。
自分も、そう思ったんですけど、出来上がる場所はなぜか
C:\Program Files\Common Files\System\Mapi\1041
これは _write とかの仕様なんですかね。
268202:05/01/15 09:30:04
一応、
  1. プロセッサが除算をサポートしていないか、あってもコストが高い
  2. 実行速度を最優先
というつもりで書いたんだけど
>>253
あぁそうでつか…orz
269デフォルトの名無しさん:05/01/15 11:31:35
270デフォルトの名無しさん:05/01/15 11:34:03
>>267
たぶんおまえのプログラムの他の処理でカレントディレクトリを
移動しっぱなしの処理があるんだろ
271デフォルトの名無しさん:05/01/15 12:34:51
> free(a);//確保したら開放しないとダメ。メモリは再利用…

するなよぼけ > 開放
するなら「解放」だぼけ。
272デフォルトの名無しさん:05/01/15 13:17:11
>>226
ふつうに int array[100000]; で確保すればいい
どっかのぼけが「多くの領域」を定義せずにヒープがどうのと言っているが
そういう井の中の蛙は free についても人のコードを自分の環境に合わさせようと画策するから
言うこと1つずつうざいくら疑ってかかれ
決してああなるな
273デフォルトの名無しさん:05/01/15 13:29:43
>>272
・・・すげーネタレスだな、おい。
最低限、 size_t 型で表現できる分の配列しか
宣言できないぐらいの事は書けよ。

>>226
言うこと1つずつうざいくら疑ってかかれ
決して >>272 の様になるな
274デフォルトの名無しさん:05/01/15 13:33:27
>size_t 型で表現できる分の配列しか

アホ
275デフォルトの名無しさん:05/01/15 13:42:57
とんだアフォ>>273 がいるもんだなぁ
276デフォルトの名無しさん:05/01/15 13:46:42
なに?>>272-273は自演釣りですか?
277デフォルトの名無しさん:05/01/15 13:48:29
>>271からの流れがワンダホーな世界だ
278デフォルトの名無しさん:05/01/15 20:19:50
10進数を2進数にする、一番簡単で短いプログラムってどんなのですか?
279デフォルトの名無しさん:05/01/15 20:21:14
>>278
二進数にするとは、どのような意味だ?
280デフォルトの名無しさん:05/01/15 20:21:43
また三田レベルが来たか
281デフォルトの名無しさん:05/01/15 20:24:21
282デフォルトの名無しさん:05/01/15 21:00:20
>278
x86汗ではAAD命令。
283デフォルトの名無しさん:05/01/15 22:07:12
int x=5,y=6;
int st[(x*y)];

こんな風にしたいんですけど、エラーでちゃいますよね。
どうしたらいいんですか?
284デフォルトの名無しさん:05/01/15 22:09:11
>>283
malloc
285デフォルトの名無しさん:05/01/15 22:10:08
>>283
C止めろ。
286デフォルトの名無しさん:05/01/15 22:10:43
>>1を読むかC99準拠のコンパイラを使う
287デフォルトの名無しさん:05/01/15 22:10:58
>>283
C99ならできるよ。
おたくのコンパイラが古いだけ。
288283:05/01/15 22:20:57
ぅありがとぉう
289デフォルトの名無しさん:05/01/15 22:25:04
>>287
仮想の代物であるC99完全対応のコンパイラなんて、現時点に於いて期待する方がおかしい。
290デフォルトの名無しさん:05/01/15 22:27:42
mallocで二次元配列を確保できますか?
291290:05/01/15 22:30:17
解決しました。
292デフォルトの名無しさん:05/01/15 23:14:32
>>290
a[i][j]のようにアクセスできる領域は作れる
293デフォルトの名無しさん:05/01/15 23:20:59
最初っから要素数がわかってる場合は簡単。
そうでない場合は>>292の言ってるように少しややこしい
294デフォルトの名無しさん:05/01/15 23:21:39
>>292-293
解決したって書いてあるだろうがボケ
295デフォルトの名無しさん:05/01/16 01:18:52
>>294
おまいがボケ
296デフォルトの名無しさん:05/01/16 01:32:05
>>295
なんだと、このやろ
297デフォルトの名無しさん:05/01/16 01:34:09
>>296
素敵
298ミスターポポ:05/01/16 03:33:57
喧嘩、良くない
299デフォルトの名無しさん:05/01/16 05:55:59
ミスターポポの口でイマラチオしたい
300デフォルトの名無しさん:05/01/16 06:42:14
> 仮想の代物であるC99完全対応のコンパイラなんて

あ、またVC厨がわいてでた ;-)
301デフォルトの名無しさん:05/01/16 07:16:25
10種類は?
302デフォルトの名無しさん:05/01/16 12:36:34
unsigned long long intの使えるコンパイラー10種類なんて、すぐに名前あげられそうなもんなのに。
なんでそんなにひっぱるんだろ。
303デフォルトの名無しさん:05/01/16 12:47:42
いまんところ1種類も出てないわけだから、C99完全対応のコンパイラ
は仮想とするのは、このスレ的に真
304デフォルトの名無しさん:05/01/16 12:50:07
part99だし、C99使ってもいいか。
305デフォルトの名無しさん:05/01/16 13:25:36
> いまんところ1種類も出てないわけだから、C99完全対応のコンパイラ

このお題目をとなえれば、VCの存在が正当化されるとでもおもってるんだろうなあ。
毎回これしかいわないんだもの ;-)
306デフォルトの名無しさん:05/01/16 13:26:44
使えなものを使えという理不尽さ。
307デフォルトの名無しさん:05/01/16 13:28:41
実際には存在するんだから「1種類もない」は大うそだな。
つぎは「少ないから」とかいいそう。

最初は「long longなんて使えるコンパイラーはないから」だったのが

「…少ないから」 にかわって、大概のコンパイラーで使えるようになった数年前からは

「それはつかえるかもしれんが、C99の機能全部をサポートしたコンパイラーはないから」(理由になってない)
になってきたわけだが、それが

「C99の機能を全部サポートしたコンパイラーは数少ないから」
になってしまって、
その「から」のあとに何が続くのか...
「だからVCつかってるのは正しいんだ!」って、かなり無理があるなあ。

まあ無理があるからあえて後半を書かないわけだが。
308デフォルトの名無しさん:05/01/16 13:31:16
302と303をみれば一目瞭然!
302の人は
> unsigned long long intの使えるコンパイラー10種類なんて、すぐに
と言ってるのに、
303のやつは
> いまんところ1種類も出てないわけだから、C99完全対応のコンパイラは
と、
「unsigned long long intが使えるコンパイラー」と言ってるのを
あえて「きこえないふり」をして「C99完全対応しているコンパイラーは」とすりかえた
つもりになって、それでごまかせてるつもりになってるのがいかにもVC厨だなあ。
309デフォルトの名無しさん:05/01/16 13:32:16
あのー いまどき VCでもunsigned long long intぐらい使えるんですが(って最近ですが)、
実際私は使っているのですが、
その、あなたのいう「VC厨」っていう人たちは何をこわがってるんでしょうか?
310デフォルトの名無しさん:05/01/16 13:35:56
↑309
おまえみたいに正規版を買ってるやつはいいが、
ここにいるVC厨は、イリーガルコピー品なので、まだ古いVCつかってるんだよ!
311デフォルトの名無しさん:05/01/16 13:36:30
>>310
そんなわけないじゃん。妄想癖?
312デフォルトの名無しさん:05/01/16 13:37:58
っていうかそもそも、たとえば一番多く使われている「gcc」。
こいつのどこが「C99に対応していない」かを知っているVC厨はほとんどいない。

「どうやらC99完全対応じゃないらしい」とだけ聞きかじって、実際にどこがどうかとか
までは知らないので、いわれてもでてこないんだよな。だめすぎ。

完全対応しているコンパイラーは私の知る限りでは2種類だけだ(2004年夏の時点で)
313デフォルトの名無しさん:05/01/16 13:38:32
> そんなわけないじゃん。

ひっしだな!
314デフォルトの名無しさん:05/01/16 13:39:11
やーい > VC厨
315デフォルトの名無しさん:05/01/16 13:39:24
うんこー!!
316デフォルトの名無しさん:05/01/16 13:39:25
誰もVCなぞ話題にしてないのだが。VCの素晴らしさがそんなにくやしいですか?
317デフォルトの名無しさん:05/01/16 13:39:47
みんな!!!うんこトークしようぜ!!!!!
318デフォルトの名無しさん:05/01/16 13:40:16
>>312
で、10種類は?
319デフォルトの名無しさん:05/01/16 13:40:33
まあ、たしかに gcc -std=c99 で何も不便は感じないな。
おれの知ってるかぎりのC99の機能は使っているが。
320デフォルトの名無しさん:05/01/16 13:41:36
まずstdbool
321デフォルトの名無しさん:05/01/16 13:42:56
-std=C99すれば、#include <stdbool.h> して、なーんにも問題なく
boolもtrueもfalseも使えるぞ。

おまえ使ったこともないのか? > 320
やーい。ぼけすぎ
322デフォルトの名無しさん:05/01/16 13:43:19
*p++=*q++
323デフォルトの名無しさん:05/01/16 13:44:29
Cの基本だな > *p++ = *q++;
昔のCから一番かわってない部分。
324デフォルトの名無しさん:05/01/16 13:45:08
>>321
a-ha、so 10 of compilers, you know?
325デフォルトの名無しさん:05/01/16 13:46:14
その前に80種類のコンパイラーだろ?
326デフォルトの名無しさん:05/01/16 13:46:20
ofじゃないな
327デフォルトの名無しさん:05/01/16 13:48:18
うんこー!!! おいしいよこのうんこ!!
328デフォルトの名無しさん:05/01/16 13:48:47
^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D
329デフォルトの名無しさん:05/01/16 13:49:25
>>326
おまえ英語の成績悪いだろ?
330デフォルトの名無しさん:05/01/16 13:49:43
なんや。このスレも結局HSPスレと同レベルやん。
331デフォルトの名無しさん:05/01/16 13:50:33
VC厨がおおいからね
332デフォルトの名無しさん:05/01/16 13:50:40
今ごろ気付くなって・・・
333デフォルトの名無しさん:05/01/16 13:51:04
>>331
いや、多分一人しかいない
334デフォルトの名無しさん:05/01/16 13:51:47
つまり、gccなりなんなりの普通のコンパイラーで、どこがC99準拠に足りてないか
さえしらないわけ > お題目をとなえれば受難が通りすぎるとおもっているVC厨
335デフォルトの名無しさん:05/01/16 13:51:52
週末当番ご苦労様であります!!!!!!
336デフォルトの名無しさん:05/01/16 13:52:10
>>332
私はCプログラマというよりも数学方面の人間だから。。
337デフォルトの名無しさん:05/01/16 13:52:42
333
じゃあ、その1人が毎回「C99に完全対応しているコンパイラーなんてほとんどないのだから」
と書いてるのかー。
338デフォルトの名無しさん:05/01/16 13:53:19
>>337
でも、その「C99に完全対応しているやつはあまりない」がいいわけになると
思っているんだからすごいよね。
339デフォルトの名無しさん:05/01/16 13:53:55
> というよりも数学方面の人間だから。。

消防署のほうからきました。
340デフォルトの名無しさん:05/01/16 13:55:10
> GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
これを
> GUIなどの標準C99ではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
にしちゃえばいいね
341デフォルトの名無しさん:05/01/16 13:55:41
>>340
だね。
よろしく! > 次スレたてるひと
342デフォルトの名無しさん:05/01/16 13:56:44
Hello worldの次はどんなプログラムを作れば良いんだ?
本にはHelloworldの後はもう簡単な説明してくれないから、
前に進めないよ orz...
343デフォルトの名無しさん:05/01/16 13:56:57
一人芝居ご苦労様であります!!!!!!
344デフォルトの名無しさん:05/01/16 13:57:26
>>342
ここで聞くと頭悪くなるよ
345デフォルトの名無しさん:05/01/16 13:59:10
>>344
ここはC言語のスレじゃないの?
なんかよくわからんが俺も頭悪いので、
素直に言うこと聴いて、探してみます。
手取り足取りとは言わないまでも、
あまりにも基本的なことを質問できるスレってどこかあります?
346デフォルトの名無しさん:05/01/16 13:59:25
大原ゆきなら長々と説明してくれるよ!
347デフォルトの名無しさん:05/01/16 13:59:34
> Hello worldの次はどんなプログラムを作れば良いんだ

hello kittyです。それができないようでは先にすすめない。
348デフォルトの名無しさん:05/01/16 14:00:18
> 本にはHelloworldの後はもう簡単な説明してくれないから、

これウソ。まるで読んでいる本が悪いかのように言っているが、こいつはどの本も読んでない。
読んでたら本の名前書けるはずだもんなあ。
349デフォルトの名無しさん:05/01/16 15:51:39
class TestA{
public:
TestA() {
a = new int;
}
~TestA() {
delete a;
}
int *a;
};
class TestB : public TestA{
public:
TestB() {
b = new int;
}
TestB(const TestB& B) {
b = new int;
*b = *B.b;
}
~TestB() {
delete b;
}
int *b;
};
main() {
TestB a;
TestB b = a;
}

というプログラムで何故コピーコンストラクタでTestAクラスのメンバのaに別のアドレスを割り当てなくても大丈夫なのでしょうか?
350デフォルトの名無しさん:05/01/16 15:52:24
スレ違い
351デフォルトの名無しさん:05/01/16 16:27:22
>342
時間割やアスキーコード表など何でもいいから、テキストかHTMLの表を出力するプログラムを書け。
352デフォルトの名無しさん:05/01/16 18:14:14
int hoge;
の値によって処理を分岐させたいのですが、

ifとelse ifでネストさせて分岐させるのと
switch(hoge)で分岐させるのでは、
処理速度に差が出ますでしょうか?

将来的に分岐が増えそうなので
switchを利用したいと思っているのですが、
両者に大きな処理速度の違いがあるのか疑問に思いました。
353デフォルトの名無しさん:05/01/16 18:15:12
>>352
実際にコード書いて試してみようとはしないのか。
354デフォルトの名無しさん:05/01/16 18:17:15
>352
確率に大きな偏りがなければ、迷わずswitchを使え。
355デフォルトの名無しさん:05/01/16 18:19:33
定期的に出るな。このネタ
356デフォルトの名無しさん:05/01/16 18:20:57
>>352
関数ポインタは頭にないか?
357352:05/01/16 18:39:56
>>356
なるほどー
関数ポインタという手もあったんですね。
勉強になりました。

>>354
switchが可読性が良いので、そっちを利用する
という意見があるようですね。

ありがとうございました。
あと、Part98にも同じ質問がありましたね…
すみませんでした(´・ω・`)
358デフォルトの名無しさん:05/01/16 21:30:47
またいつもの方が来てたのね
359デフォルトの名無しさん:05/01/16 22:15:04
> switchが可読性が良いので

それうそ
360デフォルトの名無しさん:05/01/16 22:15:32
Win厨 Tシャツをつくっておまえらに着させようかな
361デフォルトの名無しさん:05/01/16 22:18:01
関数名("hoge");

と言う書き方で文字列を一つずつ画面に表示する関数は作れますか?
362デフォルトの名無しさん:05/01/16 22:20:55
何をやろうとしているのかよく分からないが
たぶん作れる。
363デフォルトの名無しさん:05/01/16 22:51:33
>361
f(char*p){int i=0;
while(p[i]){
putchar(p[i++]); putchar('\a');
sleep(100);
}}
364デフォルトの名無しさん:05/01/16 22:54:52
ぴー、ぴー、ぴー
365デフォルトの名無しさん:05/01/16 23:08:39
int i;
for(i=0;i<15;i++){if(n&&n%3&&n%9){putchar('\a');}sleep(1000);
}
366デフォルトの名無しさん:05/01/16 23:11:21
>>363
できました!ありがとうございます!
書き方自体は物凄く簡単なんですね。
次からは聞かなくても作れるように頑張ります!
367デフォルトの名無しさん:05/01/17 00:41:13
linux redhatつかってます。
例えばこういうプログラムをつくりました。
#include <stdio.h>
int main(void){
printf("Hello");
return 0;
}

この時、gcc uuuu.cでコンパイルできても、
./a.outとしても、何も表示されずに終了します。
プログラムが変なんでしょうか?設定がおかしいのでしょうか?
良く分かりません。gccを入れ直してもダメでした。。
368デフォルトの名無しさん:05/01/17 00:43:03
改行してないからプロンプトに上書きされてたりして。
#詳細は該当スレにて。
369デフォルトの名無しさん:05/01/17 00:52:33
プロンプトの左に出てなきゃ、'\r'で上書きされてるんだろうな。
370デフォルトの名無しさん:05/01/17 00:55:19
>>368
改行したら、確かにできました。
そうなんですね。。
ありがとうございました。
371デフォルトの名無しさん:05/01/17 01:17:30
C言語を用いたMPIによる並列化コードを作成について質問させて下さい。
以下のような擬似コードをデッドロックさせないで動作完了を保障する送信命令はないのでしょうか。

----------------------------
if( proc1 ){
x = 1;
send(x) [ => proc2 ]
recv(y) [ <= proc2 ]
print(x+y);
}
if( proc2 ){
y=2;
send(y) [ => proc1 ]
recv(x) [ <= proc1 ]
print(x+y);
}
----------------------------

特に上記の擬似コードのSendにMP_Send命令を用いても環境によっては動作するのですが、
これはMPIの規定を無視したコーディングになっています。確実な動作を保障できるSend命令はないでしょうか
よろしくお願いします。
372デフォルトの名無しさん:05/01/17 01:46:45
373デフォルトの名無しさん:05/01/17 01:48:57
またまた>>368です。
今度は文字を一つ違う文字に変えるプログラムを(AがB、4が5)作りました。
#include <stdio.h>

int main(void)
{ char t[44];
char *s;
s = t;
int j = 0;
int o = 0;
scanf("%s", t);
while('\0'!= *s){
j++;
}
s =s - j;
while(j != o){
*s++;
s++;
o++;
}
printf("%s \n", *s);
return 0;
}
それが、どうやらscanfで止まってしまうようで、
文字をいれてリターンをいれても、また入力待ち状態になってしまいます。
なぜなんでしょうか。。。
374デフォルトの名無しさん:05/01/17 01:50:09
scanf使うな
fgets+sscanf推薦
375デフォルトの名無しさん:05/01/17 01:51:39
なぜscanfがダメなのかは>>1のFAQ読め
376デフォルトの名無しさん:05/01/17 01:54:33
whileの部分間違えてました。
while('\0'!= *s){
j++;
s++;
}
377デフォルトの名無しさん:05/01/17 01:55:33
(`_ゝ´)アッソ
378デフォルトの名無しさん:05/01/17 01:56:10
>>374
>>375
よんでみます。。。
379デフォルトの名無しさん:05/01/17 02:10:55
while(*s != '\0'){
(*s)++;
s++;
}
s =s - j;
printf("%s \n", s);
380デフォルトの名無しさん:05/01/17 02:11:23
>>373
やりたいのはこんなの?

#include <stdio.h>

int main(void)
{
char t[256];
int i;

fgets(t, 256, stdin);
for(i=0; t[i] != '\n'; i++)
t[i] += 1;

printf("%s", t);

return 0;
}
381デフォルトの名無しさん:05/01/17 02:55:34
どなたかこの問題お願いします。

(問)ガウス法のプログラムを作成し、次の方程式を解け。
  3X1 + 2X2 + X3 = 10
  2X1 + 5X2 + 2X3 = 18
  X1 + 4X2 + X3 = 12

#include <stdio.h>
#define n 3

main()
{
int i,j,k;
double a[n][n+1]={{3,2,1,10},{2,5,2,18},{1,4,1,12}};
double d;

この続きをお願いします。言語はCです。
382デフォルトの名無しさん:05/01/17 03:05:52
宿題は(ry
383デフォルトの名無しさん:05/01/17 03:19:23
>>381
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/80.txt

ピボット選択無しの最も単純なバージョン。
384デフォルトの名無しさん:05/01/17 03:29:54
385デフォルトの名無しさん:05/01/17 03:31:00
>>384
みれますよ
386デフォルトの名無しさん:05/01/17 03:41:09
>>385
見れました。ありがとうございました。
387デフォルトの名無しさん:05/01/17 06:42:40
> それが、どうやらscanfで止まってしまうようで、


だから使うなっていっただろ ぼけ
388デフォルトの名無しさん:05/01/17 11:21:50
使わざる者食うべからず
389デフォルトの名無しさん:05/01/17 11:42:49
↑意味不明
それを言うなら
触らぬ神に祟りなし
だろ
390デフォルトの名無しさん:05/01/17 12:07:12
三次元配列の配列幅を多くしたときに、プログラムが回るようにするにはどうしたらいいですか?
回してみようとしたところ、スタックのオーバーフローが起こってしまいました。
ちなみに、エラーメッセージは以下の通りでした。

Pid 6548 received a SIGSEGV for stack growth failure.
Possible causes: insuficient memory or swap space,
or stack size exceeded maxssiz.
391デフォルトの名無しさん:05/01/17 12:28:00
>>390
1.スタックサイズを大きくする
2.配列をスタックに取らない。

お好きな方法をどうぞ。
392デフォルトの名無しさん:05/01/17 12:57:06
構造体のファイル間での書き込み/読み込みなのですが、write()でエラーが
返ってきます。どこが間違っているのでしょうか?

#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <sys\types.h>
#include <sys\stat.h>
#define STUDENTS 2

typedef struct {
int sub1;
int sub2;
} Scorelist;

void ip_scorelist(FILE *fp, Scorelist *scorelist)
{
char buf[256];
int i;

for (i = 0; i < STUDENTS; i++) {
/* sub1のスコアを入力 */
printf("sub1(student #%d?)\n", i + 1);
fgets(buf, sizeof(buf), fp);
sscanf(buf, "%d", &scorelist[i].sub1);
/* sub2のスコアを入力 */
printf("sub2(student #%d?)\n", i + 1);
fgets(buf, sizeof(buf), fp);
sscanf(buf, "%d", &scorelist[i].sub2);
}
}
393デフォルトの名無しさん:05/01/17 12:58:12
void op_scorelist(FILE *fp, Scorelist *scorelist)
{
int i;

for (i = 0; i < STUDENTS; i++) {
printf("sub1(student #%d): %d\n", i + 1, scorelist[i].sub1);
printf("sub2(student #%d): %d\n", i + 1, scorelist[i].sub2);
}
}

int main(void)
{
int fd;
Scorelist scorelist[STUDENTS];

fd = open("C:\\fooscore",
O_RDWR | O_CREAT | O_RAW, S_IWRITE | S_IREAD);
if (fd = -1)
fprintf(stderr, "The file couldn't be opened.\n");
else
printf("The file was opened.\n");

/* 構造体へ入力 */
ip_scorelist(stdin, &scorelist[0]);

/* 構造体の出力 */
op_scorelist(stdout, &scorelist[0]);

/* ファイルへの書き込み */
if (write(fd, &scorelist[0], sizeof(scorelist)) < 0)
fprintf(stderr, "couldn't be written.\n");
394デフォルトの名無しさん:05/01/17 12:58:54
lseek(fd, 0, SEEK_SET);

fd = open("C:\\fooscore", O_RDONLY);
if (fd = -1)
fprintf(stderr, "The file couldn't be opened.\n");
else
printf("The file was opened.\n");

/* ファイルから読み込み */
if (read(fd, &scorelist, sizeof(scorelist)) < 0)
fprintf(stderr, "couldn't be read.\n");

/* 構造体の出力 */
op_scorelist(stdout, &scorelist[0]);

close(fd);

return 0;
}
395デフォルトの名無しさん:05/01/17 13:00:58
↑すいませんlseek()下のopen()関連は無視して下さい
396デフォルトの名無しさん:05/01/17 13:03:42
人のプログラム見て思ったんですが、
#define XXX 0x0036
とか、全部16進表記してあるんです。
これってなんかメリットあるんですか?
コンパイル時間が短くなるとか。自分的にはただ見づらいだけだと思うんですが。
397デフォルトの名無しさん:05/01/17 13:22:11
>396
hex1桁=4bits.
fh=1111(2).
ちなみに俺様の場合、8進数の方が見やすい。
398デフォルトの名無しさん:05/01/17 13:23:54
>>396
書いたヤシに聞け。
おそらく、16進数の方がわかりやすいからだと思うが。
399デフォルトの名無しさん:05/01/17 13:32:01
>>392
何のエラーだよ。

>>396
bit毎に変化がある値が読みやすくなる。
コンピュータ相手の場合は2^n進表現にすると色々と都合が良い。
コンパイル時間はあまり関係ない。
ただし16進文字列だとn<<=4で桁の繰り上げができるので、
10進の掛け算(n *= 10)よりは効率が良い。
8進はn<<=3、2進はn<<=1。
400デフォルトの名無しさん:05/01/17 13:33:28
>>396
それはあなたの思考パターンに人間らしさが残っているから
401デフォルトの名無しさん:05/01/17 13:37:16
>>397
> ちなみに俺様の場合、8進数の方が見やすい。

PDP世代の生き残りですか?
402390:05/01/17 13:47:31
>>390にて質問をさせていただいたものです。

スタックサイズを大きくする、との助言を頂きました。
UNIXを使用して、メモリを限界まで上げて演算を行っているのですが、
(最初に記述すべきでした。すいません。)
それ以上に引き上げる方法はあるのでしょうか。
調べてはみたのですが情報が見つからなくて・・。
403デフォルトの名無しさん:05/01/17 13:48:49
>>399
if (write(fd, &scorelist[0], sizeof(scorelist)) < 0)
fprintf(stderr, "couldn't be written.\n");
ここで < 0 が成り立ってしまうんです。
404デフォルトの名無しさん:05/01/17 13:55:12
>>392は読んでないが、システムコールとか入出力関連でエラーが起きたら、
迷わず perror しろ。
if (... < 0) perror("write");
405デフォルトの名無しさん:05/01/17 13:59:27
>402
スタックじゃなくて、ヒープから(mallocで)切り出すか、システムコールで仮想メモリを得るか、ファイルで仮想メモリをバリバリ実装するか、使わないブロックを圧縮する方法がある。コンパイラのオプションは何だ?
406392:05/01/17 14:03:30
>>404
perror("write")だと実行時にfile descripterがだめだと出てしまいます。
引数に"write"と書くだけではないのでしょうか?
407デフォルトの名無しさん:05/01/17 14:09:10
>392
なんかわかりにくいから
単純なテストコード書いて試してみれば?
openしてwriteしてcloseするだけのやつ
408デフォルトの名無しさん:05/01/17 14:09:24
>406
だったらfdを疑え。本当に開かれてるのか?
409392:05/01/17 14:09:36
勘違いしてました・・。
つまりfd自体に問題があるってことなんですよね・・。
410392:05/01/17 14:12:59
>>407-408
すいません、アホでした。
しっかりファイルが開けないと出てました。
fd = open("C:\\fooscore",
O_RDWR | O_CREAT | O_RAW, S_IWRITE | S_IREAD);
↑どこが間違っているのでしょうか?
411392:05/01/17 14:16:38
度々すみません・・・・・
if (fd = -1) → fd == -1
ここを直したら開けていると出ました。
ということはfdの何に問題があるのでしょうか?^^;
412デフォルトの名無しさん:05/01/17 14:18:32
>411
代入じゃダメだろ
413デフォルトの名無しさん:05/01/17 15:26:15
定数は左に書くよ派の人が現れないね。
414デフォルトの名無しさん:05/01/17 15:56:09
>>413
http://www.kouno.jp/home/c_faq/c17.html#4
それにどうせ変数同士の比較の時には意味無い。
415396:05/01/17 18:04:26
ご教授ありがとうございました。
416デフォルトの名無しさん:05/01/17 18:18:48
char *p ;
p=(char *)malloc(1);
とかするんですけど、(void*)型で、しかも同じ8バイトなのに、
大体こうやるのはなぜですか?
ただ見やすいからなのでしょうか?
417デフォルトの名無しさん:05/01/17 18:25:20
>416
voidは文法チェックのため、後から導入された型。char*をvoid*と同じ意味で使うのは時代遅れか、やっつけ仕事の時のみ。
418デフォルトの名無しさん:05/01/17 18:27:31
>>416
char*型というのは(大抵)1byteごとに1増えるの。
int*型というのは(大抵)4byteごとに1増えるの。
void*型はchar*型とは違う型なの。
419デフォルトの名無しさん:05/01/17 18:30:34
つまりは、キャストしないと、>>416の p には char* 型で入ったまま
という事でしょうか?
アドレスとは単なる数値の羅列とはちがうのですか?
420デフォルトの名無しさん:05/01/17 18:36:56
>419
試してみろ
cout << &(((char*)0)[1]) << endl << &(((short*)0)[1]) << endl << &(((long*)0)[1]) << endl;
421デフォルトの名無しさん:05/01/17 18:39:18
>>416
>しかも同じ8バイトなのに

何が 8 バイトだと言うのかね?
422デフォルトの名無しさん:05/01/17 18:46:34
4バイトでしたか

>>420
試したとして、なにがわかるのでしょうか??
おそらくC++なのでしょうか? よくわかりません。
423デフォルトの名無しさん:05/01/17 18:48:44
>420
C++で失礼。
printf("%p\n", ...);
で調べてみ
424デフォルトの名無しさん:05/01/17 18:53:49
>>422
>4バイトでしたか

何が 4 バイトよ?
425デフォルトの名無しさん:05/01/17 18:56:23
lintって今は使われてないんでしょうか?
gccといっしょに使えるやつがあったら教えてください。
426デフォルトの名無しさん:05/01/17 18:57:38
環境によるのでしたか

>>423
すみません。訂正していただき嬉しいです。
printf("%p\n",&(((char*)0)[1]));
で、いいですか?
見る限りではアドレスの移動量が違うって感じですか。
いま試せる環境がないので、あとで試そうと思います。
427デフォルトの名無しさん:05/01/17 18:58:55
64bitではsizeof(void*)==8.
32bitでは4.
void*pv;と宣言するとpv[1]は文法的にダメ。
428デフォルトの名無しさん:05/01/17 18:59:51
>>426
>環境によるのでしたか

「何が」環境によるのよ?
429デフォルトの名無しさん:05/01/17 19:01:11
アドレス。
Windowsでは32ビット・・・
430デフォルトの名無しさん:05/01/17 19:01:30
>426
そう。答えは1,2,4だろう。
431デフォルトの名無しさん:05/01/17 19:08:58
>>427
なぜ駄目なのでしょう?
やはり文法チェックのためだけに作られた型だからですか?
pv[1]は容量が確保できないって良いのでしょうか?
432デフォルトの名無しさん:05/01/17 19:18:42
いいって
433デフォルトの名無しさん:05/01/17 19:19:05
>431
void*はあらゆるポインタ型を抽象化した型で、あらゆるポインタをキャストせずに代入できる。
f(void*p);という関数はf(char*)と互換だが、逆は不可。
sizeof(pv[1])==sizeof(void)==???
434デフォルトの名無しさん:05/01/17 19:22:43
てすと
435デフォルトの名無しさん:05/01/17 19:40:15 ,
このようにvoidの使用は不便な点も便利な点もある。何か質問がなければ答えない。
436デフォルトの名無しさん:05/01/17 20:24:15
>>433
エラーと警告を混同してる香具師ハケーン
437デフォルトの名無しさん:05/01/17 20:45:21
>436
どこに派遣するの?
438デフォルトの名無しさん:05/01/17 20:51:13
やーい、反論できねえ (プ
439デフォルトの名無しさん:05/01/17 20:57:54
詭弁の特徴その13
勝利宣言をする
http://bio-diversity.hp.infoseek.co.jp/kiben.html
440デフォルトの名無しさん:05/01/17 21:02:40
そもそも勝負なんかできなかったヒヨッ子がなにをか言わんや
441デフォルトの名無しさん:05/01/17 21:11:14
ピーターパン症候群になりやすい性格と診断されたので気を付けて>438-439
442デフォルトの名無しさん:05/01/17 21:12:36
非GPLなgetoptのソースってない?
443デフォルトの名無しさん:05/01/17 21:15:21
>>436
どこにエラーとか警告とかについて言及しているの?
444デフォルトの名無しさん:05/01/17 21:24:04
>>443
うん、してる
ああ、おまえもわかんねえのかw
445デフォルトの名無しさん:05/01/17 21:27:21
>>444
何も言わないで理解してもらおうなんて、考えが甘いんじゃない?
446デフォルトの名無しさん:05/01/17 21:28:20
>>444
その調子で、誰も理解してくれないからって、引き篭ってきたんとちゃうの?
447デフォルトの名無しさん:05/01/17 21:32:14
>>445
別に俺が言う必要ねえんだよ
ISO が言ってくれてるから
448デフォルトの名無しさん:05/01/17 21:32:38
こらー、仲良くしなさーい!
449デフォルトの名無しさん:05/01/17 21:34:47
8:知能障害を起こす
って起せるものなのか?
450デフォルトの名無しさん:05/01/17 21:36:47
>>449
わりと簡単。
451デフォルトの名無しさん:05/01/17 21:37:53
>449
君の頭、外科手術したげるね
452デフォルトの名無しさん:05/01/17 21:40:03
なーるほど
453デフォルトの名無しさん:05/01/17 21:42:41
>>442
BSDライセンスでよければ、FreeBSDとかにでも入ってるでしょ
454デフォルトの名無しさん:05/01/17 23:09:21
ほっ、ほぁーっ! ほぁーっ!! ぬるぽ
455デフォルトの名無しさん:05/01/17 23:19:51
finally {
    >>454ガッ
}
456デフォルトの名無しさん:05/01/17 23:23:21
>>455
syntax error
ここはCスレですよ
457デフォルトの名無しさん:05/01/17 23:31:40
>>455
error: unexpected character { near finally
458デフォルトの名無しさん:05/01/18 00:39:05
あるサンプルプログラム(.cpp)をテキストで開いたら
一行がすごく長くてところどころに↑矢印みたいなやつが入ってるんですけど、
この矢印ごとに簡単に改行する方法はありますか?

それとも今はテキストでしか見てないのですが、
他のエディタであれば正常通り見られますかね?
459デフォルトの名無しさん:05/01/18 00:40:47
>.cpp
スレ違い
460デフォルトの名無しさん:05/01/18 00:44:18
>>458
具体的に開いたエディタを上げてみそ。

ちなみに俺の勘によれば、たぶん改行コードがLFだけになっているのでしょう。
であるので、見るだけならWebブラウザでも見れますし、
ちょっと気の利いたエディタならたいがいちゃんと編集もできるでしょう。
461デフォルトの名無しさん:05/01/18 03:18:03
IEブラウザなら見れるんじゃね?
462458:05/01/18 09:26:30
IEブラウザで正常にみることができました。

スレ違い申し訳ないです。ありがとうございました。
463デフォルトの名無しさん:05/01/18 10:47:19
ダブルポインタで確保した多重配列の現在のサイズを
取得したいのですがいい方法はありませんでしょうか?

ソースは以下のようになっています。

  // 200バイトを10列分確保 (buffer[10][200])
  char** buffer;

  buffer = (char**)malloc(sizeof(char*)*10);
  for(int i=0;i<10;i++)
  {
    buffer[i] = (char*)malloc(200 * sizeof(char));
    memset(buffer[i], 0, 200);
  }

  // freeや必要な処理はこのあとで
464デフォルトの名無しさん:05/01/18 10:54:02
>>463
ありません
465デフォルトの名無しさん:05/01/18 11:01:35
printf("\x1b[2A");
と書いてもカーソルが移動しないで"2A"と表示されてしまう
んですけどなんか間違ってます?
466デフォルトの名無しさん:05/01/18 11:02:22
>463
小学生に掛け算教えてもらえ。
callocや#define talloc(n,type)
使えば簡単なのに
467デフォルトの名無しさん:05/01/18 11:06:37
>>465
質問するスレから間違ってます。
OSやコンパイラくらい書いてくれ。
468デフォルトの名無しさん:05/01/18 11:14:57
>465
NT系か9x系か知らないが、コンソール端末で
C:\> adddrv ansi.sys
を実行した後、その端末でプログラムを実行してみろ。
469465:05/01/18 11:17:07
>>467
OS:WINDOWS 2000
コンパイラ:visual C++ 6.0
です。
これってC言語だけのエスケープシーケンスじゃないんですか?
470デフォルトの名無しさん:05/01/18 11:19:52
>>469
C言語とは関係ありません。
2000でソレをやりたかったら
CONFIG.NTにANSI.SYSを追加して16bitコードを吐くコンパイラを
使用しないとダメ。VC6.0ではprintfではできません。
471465:05/01/18 11:21:05
>>468
コマンドプロンプトでC:\>adddrv ansi.sysを実行するという意味でしょうか?
試してみましたが、その後プログラムを実行してもやはり同じでした・・。
472デフォルトの名無しさん:05/01/18 11:23:41
NT系だと、dosx使う方法もあるが(ry
473465:05/01/18 11:26:34
>>470
え・・そうなんですか。
なんで課題で出たんだろう・・・、学校もVC6.0なのに。
では現在の環境で、カーソルを移動させる手段が他にあるのでしょうか?
現在時刻を同じ場所で上書きして表示させるプログラムを書きたいのですが・・
474デフォルトの名無しさん:05/01/18 11:28:49
>473
'\r'出力か、<conio.h>使えば〜?
475465:05/01/18 11:43:41
>>474
"表示するフォーマット\r"でできました、ありがとうございました。
476デフォルトの名無しさん:05/01/18 11:48:54
>470
dosx使えば32bitの混合コードも受け付けるんじゃなかった?
突然教えてちゃんでごめんなさい
なりふり構ってられなくて、、><;

問題
与えられたグラフGに対しKruskalの算法をもちい最小木を求めるプログラムを作る。
条件1・採用した辺からできる部分グラフの連結成分を保持するデータ構造において、
linkを行う際にunion by rank だけ取り入れたものとunion by rank と path compression を
併用したものの両方を作成。
条件2・四則演算、比較、代入の総数を計測し、最小木とともにその総数を出力すること
478デフォルトの名無しさん:05/01/18 11:53:08
>>477
>>1を読んで下さい
479デフォルトの名無しさん:05/01/18 12:02:40
>477
落ち着いてテキスト読め。グラフ理論の用語が分からないなら数学板に行け。グラフを表すデータ構造が分からないなら聞くがよい。
480デフォルトの名無しさん:05/01/18 12:12:04
いや、ここで聞くな。宿題スレ逝け。
481デフォルトの名無しさん:05/01/18 12:17:08
>>463
「ダブルポインタ」とかいう一般的でない言葉を使うのはやめれ。

で、「200」とか「10」とかいう数字をキミのプログラムは知っている
ではないか。それをどこかに保存すればいいんですよ。
482デフォルトの名無しさん:05/01/18 12:40:55
>>463
ついでに言うと、それは正確には多重配列とは言わない。
483デフォルトの名無しさん:05/01/18 13:55:03
( ´∀`)ダブルぬるぽ
484デフォルトの名無しさん:05/01/18 14:08:27
>>483
いやまて、最初のぬるぽは
次のぬるぽを指してはいないぞ。
485デフォルトの名無しさん:05/01/18 14:15:21
いずれにせよ
          | |
          | | ガガッ
  ( ・∀・)   .人
 と    )  <  >_∧∩
   Y /ノ    .人`Д´)/ ←>>483
    / )    <  >_∧∩
  _/し' //. V`Д´)/ ←>>484
 (_フ彡       /
486463:05/01/18 15:37:41
>>466
配列全体のサイズではなく要素数を取得したかったです。
質問が間違っていました。

>>481
一般的いでない言葉は使わないようにしておきます。
200、10(要素数)を静的に保存するのはヘボくないですか?
スマートに任意のタイミングで計測できないかが知りたいです。

>>482
はい分かっています。
487デフォルトの名無しさん:05/01/18 16:04:50
>一般的いでない言葉は使わないようにしておきます。
×ダブルポインタ
○ポポインタ
488デフォルトの名無しさん:05/01/18 16:09:03
>>486
どういうわけか、malloc() した領域のサイズを取る手段って標準では
ないんですよね。ライブラリ内でサイズを保持してない訳ないのに。
なので、ヘボくても仕方ないので自分で記録するしかないです。

typedef struct {
int num;
char elem[];
} foo_t;

typedef struct {
int num;
foo_t *foo[];
} buffer_t;

buffer_t *buffer;
buffer = malloc(sizeof(buffer_t) + sizeof(foo_t *) * N1);
buffer->num = N1;
for (int i = 0; i < N1; i++) {
buffer->foo[i] = malloc(sizeof(foo_t) + sizeof(char) * N2);
buffer->foo[i]->num = N2;
memset(&buffer->foo[i]->elem, 0, sizeof(char) * N2);
}

みたいなー。
489デフォルトの名無しさん:05/01/18 17:02:20
>488
吐きそう。ゲー。その上、こんな低次元の処理で構造体使うか? calloc,_msize…、やめた、どうせ人の忠告聞かないんだから。
490デフォルトの名無しさん:05/01/18 17:08:59
>>489
VCしか知らない奴は黙ってろ
491デフォルトの名無しさん:05/01/18 17:12:09
>490
_msizeのポートもできないくせに生
492デフォルトの名無しさん:05/01/18 17:14:11
>490
こいつはxmallocもVCも知らないぼけ
493デフォルトの名無しさん:05/01/18 17:19:37
>490
なめんなよ
494デフォルトの名無しさん:05/01/18 17:31:33
>490
おまいは簡単な変数の加算もできないのか
495デフォルトの名無しさん:05/01/18 17:44:52
自分で割り当てたメモリサイズは自分で管理汁。

                           それが標準Cクオリティ
       http://pc5.2ch.net/test/read.cgi/tech/1105454700/l50
496デフォルトの名無しさん:05/01/18 18:55:12
ヘボくても仕方ないよね
497デフォルトの名無しさん:05/01/18 19:40:00
>>490
ヒマ人に合わせてらんねーの
おぢさんたちわ
498デフォルトの名無しさん:05/01/18 20:01:30
>>497
やめとけ。
499デフォルトの名無しさん:05/01/18 20:08:19
> ダブルポインタで確保した多重配列の現在のサイズを取得したい
する必要はない。
500デフォルトの名無しさん:05/01/18 20:17:31
>>486
mallocで領域確保する時の要素数は変数の値が多いから無問題
501デフォルトの名無しさん:05/01/18 20:24:52
あらかじめ全体のサイズを計算していれば、malloc一回呼ぶだけでも二次配列のようなものは確保可能。
502デフォルトの名無しさん:05/01/18 20:33:13
VCが相当羨ましいようだな
503デフォルトの名無しさん:05/01/18 20:34:43
VCの問題なの?
504デフォルトの名無しさん:05/01/18 20:41:09
暇だったら>501のマクロか関数を書いてくんろ
505デフォルトの名無しさん:05/01/18 22:03:15
typedef char row_t[200];
row_t *buf1;
char (*buf2)[200];
buf1 = (row_t *)malloc(10*sizeof(row_t));
buf2 = (char(*)[200])malloc(10*200*sizeof(char));
506デフォルトの名無しさん:05/01/18 22:08:01
どなたかちょっと前(Part98だったかな?)
「これは左辺値ですか?」
「違います」
って感じのやりとりがあったと思うんです。あそこらのキャッシュ持ってないでしょうか?
持ってたらぜひにでも、あっぷお願いします。
507左辺値がわかった人:05/01/18 22:17:46
508デフォルトの名無しさん:05/01/18 22:58:10
>>507
ご親切にありがとうございます!
無事ダウンロードさせて頂きました。
本当にありがとう!
509デフォルトの名無しさん:05/01/19 03:06:17
文字列の最後に改行を入れたいのですが
a[30]="\0"
とやっても改行が入らないのですがどうすればいいんでしょうか?
510デフォルトの名無しさん:05/01/19 03:09:37
そりゃあ改行は \n だからな。入れ方にも問題あるし。
511デフォルトの名無しさん:05/01/19 03:10:06
>>509
a[30] = '\n'; a[31] = '\0';
つーか、それエラーだろ。
512デフォルトの名無しさん:05/01/19 03:11:18
>改行

\0 は NUL
513デフォルトの名無しさん:05/01/19 04:21:43
pu
514デフォルトの名無しさん:05/01/19 04:41:37
だね。 > 512
0x00 NUL 0x10 DLE 0x20 SP
0x01 SOH 0x11 DC1
0x02 STX 0x12 DC2
0x03 ETX 0x13 DC3
0x04 EOT 0x14 DC4
0x05 ENQ 0x15 NAK
0x06 ACK 0x16 SYN
0x07 BEL 0x17 ETB
0x08 BS 0x18 CAN
0x09 HT 0x19 EM
0x0a LF 0x1a SUB
0x0b VT 0x1b ESC
0x0c FF 0x1c FS
0x0d CR 0x1d GS
0x0e SO 0x1e RS
0x0f SI 0x1f US 0x7f DEL
これぐらいは基本だ。おぼえとけ ぼけ
515デフォルトの名無しさん:05/01/19 04:42:18
513はかなりのしろーとの知ったかぶり ;-)
516デフォルトの名無しさん:05/01/19 04:47:49
man asciiすりゃ出てくるものを意気揚々と書かれてもなあ…
517デフォルトの名無しさん:05/01/19 04:54:09
はあ? それさもしらないやつが2人もいたから書いたわけだろ? やっぱり516のぼけは
自分のぼけをごまかせるとでも思っているようだ ;-)
518デフォルトの名無しさん:05/01/19 04:59:56
えーと516なんですが、私が他になにを書いたと?
519デフォルトの名無しさん:05/01/19 05:13:48
最近のがきはうざい、報告書は簡潔にね
520デフォルトの名無しさん:05/01/19 06:50:59
ようは、まぬけをさらしたのをごまかすために相手にケチをつけたかったのね ;-) > 519
521デフォルトの名無しさん:05/01/19 09:17:58
非公開関数って知ってます?
どんなの知ってます?
522デフォルトの名無しさん:05/01/19 09:22:54
>512
何の?
523デフォルトの名無しさん:05/01/19 09:23:33
>>433
Cの場合はvoid*はあらゆるポインタ型にキャスト無しで代入できるのですが.
524デフォルトの名無しさん:05/01/19 09:25:24
>522
誤爆。
>521
何の?
525デフォルトの名無しさん:05/01/19 09:33:14
>521
例えば公開ヘッダーの関数宣言を意図的に削ったり、関数定義にstaticを付ければ非公開だろ
526デフォルトの名無しさん:05/01/19 09:47:53
>>525
宣言を削っても非公開にはできないわけだが。
527デフォルトの名無しさん:05/01/19 11:08:55
>523 は本当?
けどキャストはした方がいくない?
528デフォルトの名無しさん:05/01/19 11:11:52
>521
_lock とか _unlock はマイクロソフトの非公開関数だよ ;-)
529デフォルトの名無しさん:05/01/19 11:23:09
すんません、初心者OKですか…?
入門書にて勉強中、やはりポインタで唸ってますが、
基本的な部分で疑問が生まれ、どこ読んでも書いてないもので…。

変数の宣言と代入なのですが、

int a=5;
int b=6;

または、

int a;
int b;
a=5;
b=5;

という記述はOKで、

int a;
a=5;
int b;
b=6;

という記述はなぜNGなんでしょうか?

諸先輩方、教えてくださいませ。お願いいたします。
530デフォルトの名無しさん:05/01/19 11:26:05
そんなはずはないよ
間違っているのは君の入門書だ。
531デフォルトの名無しさん:05/01/19 11:26:42
>529
int a=1;
は初期化を伴う宣言だ。代入文ではない。なお、C++では可
532デフォルトの名無しさん:05/01/19 11:28:00
>530
こいつの頭はC++
533デフォルトの名無しさん:05/01/19 11:28:52
>>529
Cでは
ローカル変数はスコープ(関数)の入り口の最初にしか
書けないことになっているから

C++だとどちらのやり方も書ける。
534デフォルトの名無しさん:05/01/19 11:29:31
C99ならNGじゃないよ。
535デフォルトの名無しさん:05/01/19 11:35:36
あ、ごめんなさい。

NGのやり方で記述すると、コンパイルエラーが起きるのです。

●コード
1 #include<stdio.h>
2 int main(void)
3 {
4int a;
5a=3;
6int b;
7b=5;
8
9printf("%dと%d\n",a,b);
10
11return 0;
12 }


●コンパイルエラー
6:parse error before 'int'
7:'b' undeclared (first use in this function)
7:(each undeclared identifier is reported only once
7:for each function it appears in.)

こんな感じです…。
536529:05/01/19 11:39:13
>>531

初期化と代入を理解してませんでした。
ありがとうございます。


>>533

「最初に書け!」
というルールなのですね。
ありがとうございます。

今のところ「こういうルールだから」
というものには丸暗記で対応していこうと思っています。


みなさま、ありがとうございます。
537デフォルトの名無しさん:05/01/19 11:41:00
>>535
Cでは
ローカル変数はスコープ(関数(main))の入り口の最初にしか
書けないことになっているから

C++だとどちらのやり方も書ける。
538デフォルトの名無しさん:05/01/19 11:44:10
スレチガイ
すまん
539デフォルトの名無しさん:05/01/19 12:25:44
int a=1;
は初期化を伴う宣言だ。代入文ではない。なお、C++では可

激しく嘘 Cでも可 ;-)
540デフォルトの名無しさん:05/01/19 12:39:38
>>539
>int a=1;
>は初期化を伴う宣言だ。代入文ではない。なお、C++では可

>激しく嘘 Cでも可 ;-)

どこに嘘が?
Cで不可とはどこにも書いてないと思うのだが。
541デフォルトの名無しさん:05/01/19 12:43:10
>C++では可
Cでは不可ととれる
542デフォルトの名無しさん:05/01/19 12:55:26
昔のCではダメ。今のCではOK。
543デフォルトの名無しさん:05/01/19 12:59:21
>>542
なにこの人
544527:05/01/19 13:01:24
だれか>>527に答えてください
545デフォルトの名無しさん:05/01/19 13:05:31
>>527
本当ですよ。
malloc() の返り値とかキャストするのは大マヌケ。
546デフォルトの名無しさん:05/01/19 13:08:10
よい。
というか最近のコンパイラ(MSCだけど)はキャストしないと
えらーにならなかったっけ。
547デフォルトの名無しさん:05/01/19 13:09:50
普通のコンパイラのディフォルトだと、mallocのvoid*型返値をキャストしなければvoid*以外に代入すべきでない。少なくとも警告かエラーになる。>523は間違い
548デフォルトの名無しさん:05/01/19 13:11:48
>>545
malloc()はvoid*を返すからvoid*で受け取ればキャストしないのは
あたりまえ。
でも、例えばそのメモリを構造体のタグを使って参照するんだったら
その構造体のポインタに直接ぶち込めば言い訳で、
そのときにキャストするのはあたりまえ。
549デフォルトの名無しさん:05/01/19 13:19:29
>>523には「Cの場合は」と書いているが何時のCかで変わってくるんじゃ?
550デフォルトの名無しさん:05/01/19 13:19:58
>>523は根本的に間違い
CASTを使えばvoid*うんぬん関係なく
あらゆるポインタ型に代入できる。
極端な話、
char a = 'C';
float *p = (float*)a;
なんかも可能なわけだ。
551デフォルトの名無しさん:05/01/19 13:24:05
このスレの信頼性が下がった…orz
552デフォルトの名無しさん:05/01/19 13:24:36
「データ入力及びデータの表示を行なうプログラムを作りなさい。一件分の入力処理は
input_data()で、表示はdisplay_data()と処理を関数で分けて行ないなさい」
という問題があるのですが、「一件分の入力処理はinput_data()で、表示はすべてdisplay_data()で
処理しなさい」ということですか??
553デフォルトの名無しさん:05/01/19 13:27:38
中途半端な知識の人が多いのね。
void * の値を void * 以外のポインタにキャストなしで代入しようと
すると、
C では問題なし
C++ ではエラー
だよもん。
554デフォルトの名無しさん:05/01/19 13:28:57
input_data()という関数に入力処理のコードを書いて
display_data()という関数に表示処理のコードを書け!!
と その問題作成者の先生はおっしゃっているのじゃ。
555デフォルトの名無しさん:05/01/19 13:31:56
誰もお前の環境の場合を聞いてない。できることとやってもいいことは違う。
556デフォルトの名無しさん:05/01/19 13:36:47
>>551
そもそも2chに信頼を求めるのはあかんでぇ〜
参考程度にしときやぁ〜
557551:05/01/19 14:39:18
おいっす
558デフォルトの名無しさん:05/01/19 18:27:05
Cで組んだプログラムを可視化したいのですが
(a[x][y]=1(1なら赤)みたいな感じで…)
なんか方法ないですか?;;

559デフォルトの名無しさん:05/01/19 18:59:58
>>558
可視化とはプログラムが見えないとな!?
冗談はさておき、環境を書かないことにはどうにもならない
WinかUn*xかエディタ上なのかHTMLに吐き出すのか

数字の中で1を赤くするのはあんまり意義が感じられないけど・・・
とりあえず定数化するべきなんじゃ
560デフォルトの名無しさん:05/01/19 19:02:29
561デフォルトの名無しさん:05/01/19 19:07:19
>>558
何がしたいのか、さっぱり理解出来ない... orz
562デフォルトの名無しさん:05/01/19 19:08:59
プログラムのコードを可視化したいのか、aに格納されたデータを可視化したいのか
563デフォルトの名無しさん:05/01/19 19:12:13
>>559
レスどもです
え〜と、プログラム走らせてるのはLinux上です
セルオートマトンのプログラムなんですが
#define M 50
#define N 50
main(){
・・・
for(i=0;i<M;i++){
for(j=0;<j<N;j++){
 printf("a[i][[j]=%d\n",a[i][j])
今はこんな感じで結果を出しているのですが
画像でだしたいなぁと思ってるのです;;
すごく見難いので
564デフォルトの名無しさん:05/01/19 19:14:15
>>563
スレ違い
565デフォルトの名無しさん:05/01/19 19:42:23
566デフォルトの名無しさん:05/01/19 20:01:19
>>563
ソースを色分けするんじゃなかったのかよorz
567デフォルトの名無しさん:05/01/19 20:01:26
質問です。

メンバが数値型変数のみで構成される構造体を初期化する場合、
memset で char 配列を初期化する方法を流用して、

memset( &abc, '\0', sizeof(abc));

こんな感じにするのは、どうなんでしょうか?
領域が 0 埋めになるわけだから、一応初期化にはなるのですが。
568デフォルトの名無しさん:05/01/19 20:11:39
>>567
かなり一般的。
確か厳密には仕様違反のはずだけど、移植性はかなり高い

569デフォルトの名無しさん:05/01/19 20:19:16
>>567
0で埋めていいのならそれで構わないが、
memset(&abc, 0, sizeof(abc));
にしとけ。
570デフォルトの名無しさん:05/01/19 20:22:23
>>547
エラーが出るという「普通の」コンパイラを教えてください
571デフォルトの名無しさん:05/01/19 20:23:22
>>567
宣言とともに初期化するなら
struct A a = { 0 };
もあり。
572デフォルトの名無しさん:05/01/19 20:56:41
使用違反なの?
ポインタ型以外はオールゼロビット=0だしC++
みたいに仮想関数とかもないPODだから別に
仕様的にも問題ないと思ってたけど
573567:05/01/19 20:59:42
>>568 >>569 >>571
ありがとうございます。

char と long が混在している構造体を今まで特に気にせず
memset の初期化してましたが、気になったので。
>571 の方法は恥ずかしながら知りませんでした。

memset とか memcpy って、柔軟に使っちゃっていいんですかね?
574デフォルトの名無しさん:05/01/19 21:01:05
文字列(123.45 とか -0.123456789 とか 1.3e-9 とか)をlong doubleに
変換したいのですが、どのような方法がよいでしょうか?
575568:05/01/19 21:04:44
うう・・記憶違いだった模様
規格上は問題ありませんね
>>572
ポインタ以外に浮動小数点型についてもオールビット0=0が
保障されてはいないとの事
576デフォルトの名無しさん:05/01/19 21:05:32
strtod
577デフォルトの名無しさん:05/01/19 21:06:24
>>575
なんで「との事」で終わっちゃうの?
578デフォルトの名無しさん:05/01/19 21:07:34
char *p;
p = &abc;
for(i=0;i<sizeof(abc);i++){
*(p + i) = 0;
}
579デフォルトの名無しさん:05/01/19 22:00:23
char a[3],int(2byte) b; の構造体があって、2バイトごとに管理していた場合
そういうときに>>567では a[3] へアクセスすることとなり、違反になる可能性もあるかもしれない。
580デフォルトの名無しさん:05/01/19 22:10:27
>>579
詰物にアクセスするのは違反なの?
581デフォルトの名無しさん:05/01/19 22:37:13
配列の場合は配列の要素数を一個超えたところへのアクセスに限っては
大丈夫じゃなかったっけ?
582デフォルトの名無しさん:05/01/19 22:39:23
ただし書き込みは出来ないけどな
583デフォルトの名無しさん:05/01/19 22:39:46
そんな馬鹿な。
584デフォルトの名無しさん:05/01/19 22:41:58
変数aが2の場合で、

w = a++;

って言ったら3じゃないんでしょうか?教えてください
585デフォルトの名無しさん:05/01/19 22:42:48
>>584
bは3かもしれないな
586デフォルトの名無しさん:05/01/19 22:46:54
>>584
a は 3 だな(w
587デフォルトの名無しさん:05/01/19 22:47:05
b?
588デフォルトの名無しさん:05/01/19 22:48:53
>584
やればわかる。拘置所++
589デフォルトの名無しさん:05/01/19 22:51:08
> ディフォルト

プ
590デフォルトの名無しさん:05/01/19 22:51:36
デイフォールト
591デフォルトの名無しさん:05/01/19 22:54:36
wは3じゃないんですか?どうしてwは2なんでしょうか・・・
592デフォルトの名無しさん:05/01/19 22:56:54
ディフォルート
593デフォルトの名無しさん:05/01/19 22:58:25
あと置きは後で評価するから
594デフォルトの名無しさん:05/01/19 22:59:53
>>589
世間知らず
595デフォルトの名無しさん:05/01/19 23:02:42
なるほど、てことはw = ++a;だとwは3ですね。
あとW = a>b;だとなぜ0になるんでしょうか?
596デフォルトの名無しさん:05/01/19 23:03:26
>>591
入門書に書いてる
597ほ、ほーっ、ホアアーッ!! ホアーッ!!:05/01/19 23:04:05
>>591
後置き ++ は、インクリメント前の値を返す。
w = ++a; の場合は w は 3 になる。
598デフォルトの名無しさん:05/01/19 23:04:30
>>595
お前が知的障害者だと言うことがわかった。
599ほ、ほーっ、ホアアーッ!! ホアーッ!!:05/01/19 23:05:37
>>595
a > b は、a が b より大きければ 1 を、そうでなければ 0 を返す。
w にはその結果が代入される。
600デフォルトの名無しさん:05/01/19 23:09:22
ほんまありがとう
601デフォルトの名無しさん:05/01/19 23:09:35
>>593
優先順位は=より高いのに?
602デフォルトの名無しさん:05/01/19 23:15:37
後置インクリメントと言え

変数に対して+1加算は行われるが、式の値は加算される前の値。

mov eax [ebp+i]  ; 式の値を作成
inc [EBP+i]     ; 変数を加算

というだけ。
603デフォルトの名無しさん:05/01/19 23:17:12
> 後置インクリメントと言え

やだ。
604デフォルトの名無しさん:05/01/19 23:23:31
>>602
なるほど、そーゆー世代ですか
605デフォルトの名無しさん:05/01/19 23:38:26
2行に分ければ確実。
1行増えるだけで、迷わなくて済む
606デフォルトの名無しさん:05/01/19 23:54:27
>>601
後で評価されるという言い方はおかしいね。
先に評価され、そのままの値が返る。
607デフォルトの名無しさん:05/01/20 00:01:27
>>581
アクセスはだめです。一個超えたところのポインタ値を生成するのは合法です。

char a[8];
char *p = a;

p += 8; /* 末尾より一個超えてるけど合法 */
*p; /* 参照はダメ */
608デフォルトの名無しさん:05/01/20 00:01:30
>>606
日本語やや不自由さんですか?
609デフォルトの名無しさん:05/01/20 00:03:57
> *p; /* 参照はダメ */

read 要求も write 要求もしてないのに
どんなアクセスが生じるんだ?
610デフォルトの名無しさん:05/01/20 00:07:53
*演算子禁止ってことだろ
611デフォルトの名無しさん:05/01/20 00:09:38
>>609
Cの文法において*pは、pが指しているところをcharとして評価するってことですから、
最適化などによって実際に読み出さないとか、そういうのには関係なく違法ですよ。
612デフォルトの名無しさん:05/01/20 00:15:22
>>607
while(*p++)なんてやってもいいようにそうなっているんだよな
613デフォルトの名無しさん:05/01/20 00:19:00
範囲指定を
[first, last)
にすると便利なことが多いしな
614デフォルトの名無しさん:05/01/20 00:19:38
>>608
ん?何がおかしい?
615デフォルトの名無しさん:05/01/20 00:29:52
>>612
歴史的にはそういうコードがたくさんあるから合法にした、ということのようです。
これが合法になったためにコンパイラ作ってる人が
「じゃあ配列の末尾が生成できるアドレスMAXだったらどうすんじゃいわれ!!」
と憤ってるところを見たことがありますw
616デフォルトの名無しさん:05/01/20 00:36:31
>Cの文法において*pは、pが指しているところをcharとして評価するってことです
本当?
どっかに書いてるなら教えて。
617デフォルトの名無しさん:05/01/20 00:46:18
よくエラーチェックしない人が、アドレス0付近にアクセスしてるけど、
その辺データにアクセスして危険って事あるの?
環境依存で運が悪ければ、なのかな…
618デフォルトの名無しさん:05/01/20 00:47:38
> 「じゃあ配列の末尾が生成できるアドレスMAXだったらどうすんじゃいわれ!!」

そんなところまで配列はつくれないようにする!
簡単だね。
619デフォルトの名無しさん:05/01/20 00:48:19
>>611
だから、その「評価」とは具体的に何だと聞いている
アドレスバスに出力するときの R/nW はどっちだ
620デフォルトの名無しさん:05/01/20 00:56:58
>>619
アドレスバスというのはこのスレでは扱いません
621デフォルトの名無しさん:05/01/20 01:02:05
>>620
こいつぼけ。知らないからってごまかそうとしても無駄ですよ ;-)
622デフォルトの名無しさん:05/01/20 01:02:31
>>617
危険な場合はあるよ。
もっとも、ちゃんとした環境で運がよければプログラム落ちたりするけどね。
いいかげんな環境だったり、運が悪かったりすれば何も起こらない。
623デフォルトの名無しさん:05/01/20 01:10:15
int *p;
p=(int *)malloc(sizeof(int)*3);

*(p+0) = 10
*(P+1) = 11
printf(%d %d\n",*(p+0),*(p+0));


みたいにしたとき、freeはfree(p)だけでいいの?

624デフォルトの名無しさん:05/01/20 01:12:33
いいよ
625デフォルトの名無しさん:05/01/20 01:12:38
ハイインピーという主張を期待していたのだがw
626デフォルトの名無しさん:05/01/20 01:15:13
なんか滅茶苦茶だ
int *p;
p=(int *)malloc(sizeof(int)*3);

*(p+0) = 10
*(p+1) = 11
printf(%d %d\n",*(p+0),*(p+1));

>>624
ありがとう
627デフォルトの名無しさん:05/01/20 01:31:28
>>626
>>624じゃないが、; は抜けてるし、
*(p+1) じゃなくて p[1] って書かんか?
628デフォルトの名無しさん:05/01/20 01:51:53
>>619
実装上の仕組みと、文法上の問題は切り離して考えろ。
実際にメモリ上の値から読み込んできたり、書き込んだりすることはC言語とは関係ない領域。
*p; というコードがあった場合、コンパイラが完全に無視して、アクセスは起こらない。これが実装上。
だけど文法的には、 *p というのは評価され、値「*p」をとる。だから、この時点でpが領域外を指す事は
許されない。これが文法上。
629デフォルトの名無しさん:05/01/20 02:02:18
>>618
コトはそう簡単じゃありません。配列の配置を決めるのはリンカの仕事である場合もあるわけでして。
630デフォルトの名無しさん:05/01/20 02:31:11
開発環境は Win2k、 Visual C++6.0 です。

Win32 console apprication のコーディングで、
以下のような初歩のループプログラムを記述したんですが、

while( ( c = getchar() ) != EOF ){
// 任意の処理
}

WindowsのEOFコマンドである ctrl+Z を入力しても
エンドオブファイルと認識されず、ループを抜けられません。
もちろん、UNIXの ctrl+D でもダメでした。^Zとは表示されるんですが・・・。
何か根本的に知識がないような予感がしますが、
どうにかしてEOFを返せる方法がありましたら、どうかご教示ください。
631デフォルトの名無しさん:05/01/20 02:35:45
>>630
Ctrl+Zでエンター押してるんだろうね
cはint型になってるかい?
632630:05/01/20 02:51:21
>>631
一行目のご解答を見て思うところがあり、
^Z単独でエンターを押してみたところ、スルッと抜けました。
getchar関数はエンターを押すまでEOFと見なされないんだ・・・
ctrl+Zを押した直後に抜けるものかと勘違いしていました。これは恥ずかしい。

おかげさまで、問題は解決しました。どうもありがとうございました。
633デフォルトの名無しさん:05/01/20 03:00:03
int*型ににはint型のアドレスを格納することができるよな
んじゃあint*型のアドレスを格納できるint**型ってのは存在するのか?
634デフォルトの名無しさん:05/01/20 03:08:42
存在します
635デフォルトの名無しさん:05/01/20 03:36:20
ポインタポインタ続いてゆく
ポインタポインタどこまでも
636デフォルトの名無しさん:05/01/20 04:21:34
単にwarningレベルの話に過ぎない事にいつまでもうだうだ言うなよ
637デフォルトの名無しさん:05/01/20 04:25:52
>>636
お前はいつまでうだうだ言ってるんだよ
638デフォルトの名無しさん:05/01/20 04:26:47
何の話だろう?って感じなんだが
639デフォルトの名無しさん:05/01/20 04:31:06
こんな時間に・・・みんな暇なんだね
640デフォルトの名無しさん:05/01/20 04:32:37
オマエモナー
641デフォルトの名無しさん:05/01/20 04:38:35
もしかしたら、中途半端な知識の知ったか無改行君かな。
642デフォルトの名無しさん:05/01/20 04:42:47
ちなみにあちしは朝日vsNHK祭りの記事やスレを読んでました。
643デフォルトの名無しさん:05/01/20 04:46:18
朝日は結局
慰安婦問題を追及したいのか
NHKを攻撃したいのか
政府に反抗したいだけなのかよくわからん
ポイントは絞った方がいい
644デフォルトの名無しさん:05/01/20 04:58:16
ほんとに詳しい人、見てるんなら最初っから発言してよ。
中途半端な人がぐだぐだ言い出す -> 詳しい人登場
           ↑ここの部分いらないです。
645デフォルトの名無しさん:05/01/20 05:36:57
>>644
仕様です
646デフォルトの名無しさん:05/01/20 07:27:11
その仕様けずれませんかね
647デフォルトの名無しさん:05/01/20 07:47:44
struct A{
int a;
};
struct B{
struct A *AAA;
int b;
};

int WinMain(~~~){
struct B *BBB = ( struct B * )malloc( sizeof( struct B ));
B->AAA = ( struct A * )malloc( sizeof( struct A ));
free( B );
return 0;
}
のようなプログラムがあった場合、AAAの確保した領域というのは解放されますか?
648デフォルトの名無しさん:05/01/20 07:49:13
間違い
free( B ) → free( BBB )
649デフォルトの名無しさん:05/01/20 08:59:07
単純に数を数えればいい
mallocが2回でfreeが1回
つまりどこかが解放されてない
650デフォルトの名無しさん:05/01/20 10:08:59
>>647
される訳がない。
malloc()やcalloc()などで確保した領域は、
必ず明示的に解放しなければ、プロセス終了まで生き残る。
651デフォルトの名無しさん:05/01/20 10:30:32
>641
ID見ろぼけ
652デフォルトの名無しさん:05/01/20 10:48:41
質問します。
C言語のみで以下のことは可能でしょうか?
(Windows 環境下です。すなわち DOS 窓から起動します)

1.起動されたプログラムのフルパスを取得する

2.あるフォルダ内の全ファイル名を取得する

3.あるファイルのコピーを作成する


1.については、argv[0] にフルパスが渡される処理系なら、それを使えばいいような気がしますが、
もしファイル名のみの処理系の場合、どのようにしたらいいのですか?
そもそも、argv[0] を使うのはマズイですか?

2.ですが、これは system 関数で DOS の dir コマンドを実行し、それをファイルに取り、
そこから引っぱり出す、というくらいしか思いつきません。

3.は、Cにはファイル削除とリネームの関数はあるのに、なぜファイルコピーが
無いのだろう、と疑問でした。fopen と while と fget などで自力コピーするしか
方法はないのかな?


長文すみません。よろしくお願いします。
653デフォルトの名無しさん:05/01/20 11:05:53
できる
654デフォルトの名無しさん:05/01/20 11:26:31
>>652
ファイルそのものが存在しない環境もあるので、
C のみで完全に行う事は不可能。
655デフォルトの名無しさん:05/01/20 11:37:05
Windows環境って書いてあるだろ
656デフォルトの名無しさん:05/01/20 11:55:46
>>655
C のみって書いてあるだろ。
Windows API や Windows のコマンド等は、
当然のごとく C じゃないぞ。
657デフォルトの名無しさん:05/01/20 13:08:29
for(in_cnt = 0 ; in_cnt <3 ; in_cnt++)
{
while(1)
{
printf("input number%d: ",in_cnt);
scanf("%d",&num[in_cnt]);

if(in_cnt == 1)
{
if(num[in_cnt] != num[in_cnt-1])
{
break;
}
}
else if(in_cnt == 2)
{
if(num[in_cnt] != num[in_cnt-1] && num[in_cnt] !=num[in_cnt-2])
{
break;
}
}
else if(in_cnt == 0)
{
break;
}
printf("\nSorry. This is already existent number\n\n");
}
}
return 0;
}
このプログラムをもう少しコンパクとに記述するにはどうすればよいのでしょうか??
658デフォルトの名無しさん:05/01/20 13:59:31
変数を一文字にする。メッセージを短くする、かな?
659デフォルトの名無しさん:05/01/20 14:04:05
さらに、インデント、改行は使うな
660デフォルトの名無しさん:05/01/20 14:04:52
for (in_cnt = 0 ; in_cnt <3 ; in_cnt++) {
while (1) {
printf("input number%d: ",in_cnt);
scanf("%d",&num[in_cnt]);
if(in_cnt == 1) {
if(num[in_cnt] != num[in_cnt-1]) {
break;
}
} else if (in_cnt == 2) {
if(num[in_cnt] != num[in_cnt-1] && num[in_cnt] !=num[in_cnt-2]) {
break;
}
} else if (in_cnt == 0) {
break;
}
printf("\nわるいけどもうこの数字使っちゃってるから。\n");
}
}
return 0;
}
661デフォルトの名無しさん:05/01/20 14:08:50
for (in_cnt = 0 ; in_cnt <3 ; in_cnt++) {
while (1) {
printf("input number%d: ",in_cnt);
scanf("%d",&num[in_cnt]);
if(in_cnt == 1) {
if(num[in_cnt] != num[in_cnt-1])
break;
} else if (in_cnt == 2) {
if(num[in_cnt] != num[in_cnt-1] && num[in_cnt] !=num[in_cnt-2])
break;
} else if (in_cnt == 0)
break;
printf("\n既存数字不可使用\n");
}
}
return 0;
}
662デフォルトの名無しさん:05/01/20 14:10:18
論理式を否定して無駄なif,breakを削る。
in_cnt→i.
num→an.
663デフォルトの名無しさん:05/01/20 14:12:37
>659
変なこと教えるなよ
664デフォルトの名無しさん:05/01/20 14:13:50
二重ループをなんとかしろ
665デフォルトの名無しさん:05/01/20 14:14:15
次スレからはスレタイを
「Cなら俺に訊け」
に戻した方がいいよ。
あれの方が善かった。
666デフォルトの名無しさん:05/01/20 14:18:47
ifの連続を&&と||で連結した後、forを展開し、添字の式を簡略化した上でルーチンを一般化し、再びループに直す
667デフォルトの名無しさん:05/01/20 14:23:41
ネタはさておきこんなもんかね。
for(in_cnt = 0 ; in_cnt <3 ; in_cnt++) {
while(1) {
printf("input number%d: ",in_cnt);
scanf("%d",&num[in_cnt]);
switch (in_cnt) {
case 2:
if (num[in_cnt] == num[in_cnt - 2]) {
continue;
}
case 1:
if (num[in_cnt] == num[in_cnt - 1]) {
continue;
}
case 0:
goto OutOfWhile;
}
printf("\nSorry. This is already existent number\n\n");
}
OutOfWhile:
}
668デフォルトの名無しさん:05/01/20 14:28:24
>>652

1.
C:\>debug \winnt\system32\winver.exe
-d80,9f
2CE3:0080 00 0D 5C 77 69 6E 6E 74-5C 73 79 73 74 65 6D 33 ..\winnt\system3
2CE3:0090 32 5C 77 69 6E 76 65 72-2E 65 78 65 0D 20 6F 66 2\winver.exe. of
-q


2.と3.は
DOSのシステムコール使えばよい
(system()じゃなくてINT21の方ね)
669デフォルトの名無しさん:05/01/20 14:32:10
>>664 
for( in_cnt = 0; in_cnt < 3; )
{
printf("input number%d: ",in_cnt);
scanf("%d",&num[in_cnt]);
if( in_cnt == 2 && num[in_cnt] != num[in_cnt-1] && num[in_cnt] != num[in_cnt-2])
in_cnt++;
else if( in_cnt == 1 && num[in_cnt] != num[in_cnt-1])
in_cnt++;
else if( in_cnt == 0)
in_cnt++;
else
printf("\nSorry. This is already existent number\n\n");
}
return 0;
670デフォルトの名無しさん:05/01/20 15:01:34
>>668
C のみじゃないじゃん。
671デフォルトの名無しさん:05/01/20 15:03:04
#define a printf("#%d",in_cnt);scanf("%d",num[in_cnt]);
#define b(j,k) p[k]==p[j]||(puts("err"),goto
int*p=num;a
e:a b(0,1) e);
f:a b(0,2) f);b(1,2) f);
return 0;
672デフォルトの名無しさん:05/01/20 15:03:14
そうだね、反則だね、レッドカードだね。
673652:05/01/20 15:05:06
>>668
ありがとうございます。
1はつまりバイナリでオープンして、パスがあるところを読み出せ、ということですね。
2と3はやはり INT21 ですか、うーむ。共用体 AX とか AL に設定してコール、っていう
あれですね。
ファイルコピーは自力でもいいとして、フォルダ内ファイル一覧取得については、
C++ の勉強を兼ねてクラスとして作ってみようと思います(>652 に書いたやり方で)
674デフォルトの名無しさん:05/01/20 15:05:31
>671
++を忘れてたorz
675657:05/01/20 15:13:59
みなさんありがとうございます。
感謝します。
676デフォルトの名無しさん:05/01/20 15:14:00
>>657
超大人気だな!!!
677デフォルトの名無しさん:05/01/20 19:24:18
while(in_cnt<=3) {
printf("input number%d: ",in_cnt);
scanf("%d",&num[in_cnt]);

for(i = 0 :i <=int_cnt;i++){
if(num[in_cnt] == num[i]){
printf("\nSorry. This is already existent number\n\n");
continue;
}
}
int_cnt++;
}

あかん?
678デフォルトの名無しさん:05/01/20 19:32:40
遅いし、:と;間違い
679デフォルトの名無しさん:05/01/20 19:56:58
こういうのになったとたん書き込みが増えるな
680デフォルトの名無しさん:05/01/20 20:17:10
>>628
俺べつに実装上の仕組みの話なんかしてないぜ
アドレスバスという用語に気を取られてしどろもどろな発言すると恥の上塗りだぞ
読めとも書けとも言ってないのに何をどう「コンパイラが完全に無視」するって言うんだよ
ちょっとヒントやるからよく考えて答えろな
0;
681デフォルトの名無しさん:05/01/20 20:32:58
ポインタ=アドレスと勘違いしてるやつが多いな。
682デフォルトの名無しさん:05/01/20 20:41:01
>>657
{と}の数合ってますか?
683デフォルトの名無しさん:05/01/20 21:05:18
>>681
え?
違うの?
684デフォルトの名無しさん:05/01/20 21:08:00
>>680
おまえバカか?無視って言葉の意味わからないの? *p; ってのがまったく相手にされないってことだよ?
そのヒントとやらも言語上は評価されるんだよ?わかる?
685デフォルトの名無しさん:05/01/20 21:12:37
ポインタとポインタ変数を混同してる奴が多いな。
686デフォルトの名無しさん:05/01/20 21:13:41
>>628によると 評価する!=読み書きする と言っていて、
>>680によると 評価する==読み書きする って言ってるわけですよね。
結局どっちが正しいんですか?
687デフォルトの名無しさん:05/01/20 21:16:42
>686
マニュアル見て自分で判断
688デフォルトの名無しさん:05/01/20 21:20:49
>>684
りんご
689デフォルトの名無しさん:05/01/20 21:23:16
>>687
わからないんで教えてください
690デフォルトの名無しさん:05/01/20 21:25:43
void ってコンパイラの中では *(NULL *)で定義されてるんだっけ?
691デフォルトの名無しさん:05/01/20 21:26:20
違った

NULL ってコンパイラの中では *(void 0)で定義されてるんだっけ?
692デフォルトの名無しさん:05/01/20 21:27:17
NULL は stdio.h の中で、((void *)0) と定義されています

http://www1.cts.ne.jp/~clab/hsample/File/File01/File01.html
693628:05/01/20 21:31:34
アドレスバスに出力とか言い出したのお前さんじゃないか。
そういうこと言い出した時点で実装の話になっちゃうんだっての。
694デフォルトの名無しさん:05/01/20 21:33:32
695628:05/01/20 21:36:13
>>694
メール欄の意味がわからんので、教えてくれ。レスを無視すればいいのか?
696デフォルトの名無しさん:05/01/20 21:37:32
>686
文法の評価と式の評価の混同。最適化されると無視されるかも知れない。完全にコンパイラとプリプロセサの状態に依存する。
「遊んでないで仕事しろ!」
697デフォルトの名無しさん:05/01/20 21:39:34
>>695
>>695

>>696
シンタックスとセマンティクスを一緒にしてるのはオマエだ
698デフォルトの名無しさん:05/01/20 21:40:23
パーサ書いてるつもりでコードジェネレータ作るタイプな
699デフォルトの名無しさん:05/01/20 21:45:31
>>696
なんかよくわからないです。コンパイラとプリプロセッサってことは実装に依存するってことですか?
700デフォルトの名無しさん:05/01/20 21:49:08
>699
何が?
701デフォルトの名無しさん:05/01/20 21:50:51
おまえらキモヲタばかりだなwww
702デフォルトの名無しさん:05/01/20 21:53:45
>>700
よくわからないんでやっぱり取り消してください。わからないなりに考えると
>>607は、アクセスが起こるかどうかはやってみないとわからないけど、評価はされるってことですか?
703デフォルトの名無しさん:05/01/20 21:55:32
>702
何が評価?
704デフォルトの名無しさん:05/01/20 21:56:34
*p; って部分です
705デフォルトの名無しさん:05/01/20 22:00:19
>704
その部分の値か?それとも式か?
706デフォルトの名無しさん:05/01/20 22:03:43
式とされた結果、値が出てくるんじゃないですか?
ひょっとして勘違いしてますかね?
707デフォルトの名無しさん:05/01/20 22:07:21
>704
その式に副作用はあるのか
708デフォルトの名無しさん:05/01/20 22:10:19
ないと思います
709デフォルトの名無しさん:05/01/20 22:16:27
なんかわかってきたような気がします。 while(1); とか書けますよね。
ということは、1は式としてみなされてるってことですよね。
ということは、 1; ってのは、 a=1; とかと同じように式とされるってことですか?
710デフォルトの名無しさん:05/01/20 22:19:59

いまどきC言語なんかできても自慢になりません。
プログラマ?(ププ…って時代だしw
俺はSE。おまいらから見れば超上級職だろうなw

711デフォルトの名無しさん:05/01/20 22:42:56
>1; ってのは、 a=1; とかと同じように式とされるってことですか?

式ってとこはあってるが、動詞の有無は違う
712デフォルトの名無しさん:05/01/20 22:44:16
>>710
あなたは、その実態が「単価が高くて使いにくいプログラマ」だったりするSEなんですね?(Y/y)
713デフォルトの名無しさん:05/01/20 22:46:00
>>712
× 使いにくい
○ 機能しない
714デフォルトの名無しさん:05/01/20 22:47:48
>>710
お前が超上級職であるSEだという証拠を見せろ。
715デフォルトの名無しさん:05/01/20 22:48:36
while(1.0); とか書けますか
716デフォルトの名無しさん:05/01/20 22:50:44
ぬ る ぽ
717デフォルトの名無しさん:05/01/20 22:52:43
で、結局だれが正しいんだ
718デフォルトの名無しさん:05/01/20 22:53:01
typedef struct {
    void* p;
} NullPointerException;

C99でもこんな構造体ないの?
719デフォルトの名無しさん:05/01/20 22:58:15
>>718
ないガッ?
720デフォルトの名無しさん:05/01/20 22:59:16
>>715
while (1,0);  ならOK。
721デフォルトの名無しさん:05/01/20 23:03:03
>>710
雑用係はマ板へ。
722デフォルトの名無しさん:05/01/20 23:10:46
SEも同程度に負け組
723デフォルトの名無しさん:05/01/20 23:19:07
IT自体が負け(プギャヒャラ
724デフォルトの名無しさん:05/01/20 23:21:48
>>723
勝ち組のつもりでこの世界に入るアフォは痛杉
しょせんベンチャー
鉄くず泥棒どもは開き直ってなんぼだよ
725デフォルトの名無しさん:05/01/20 23:23:07
なんでみんな>>910に釣られてるの?低レベルだから?

>>607はまず実行結果をここに貼り付けてみろ
オマエの画面はどうなってる?
726デフォルトの名無しさん:05/01/20 23:25:42
所詮日本は文系の社会

実力のある奴はみんな米国だよ
727デフォルトの名無しさん:05/01/20 23:29:03
>>910の責任がいやが上にも高まった
728デフォルトの名無しさん:05/01/20 23:30:24
二桁最後のスレなんだからマターリしろ
729デフォルトの名無しさん:05/01/20 23:38:31
勝ちとか負けとか、んなことバッカいってるショウもない奴は
ママのおっぱいでもしゃぶってろ
730デフォルトの名無しさん:05/01/20 23:40:21
>>729
ママのおっぱいしゃぶりながら言わないでくれ
731デフォルトの名無しさん:05/01/20 23:41:43
うわ、キモッ・・・
732デフォルトの名無しさん:05/01/20 23:50:22
char cycleno[10]    = "1234567890";

if (strlen(cycleno) > sizeof(cycleno)) {        
        printf("strlen(cycleno) %d\n",strlen(cycleno));
        printf("sizeof(cycleno) %d\n",sizeof(cycleno));
        printf("cycleno %s\n",cycleno);
}

/********* 出力 *********/
strlen(cycleno) 16
sizeof(cycleno) 10
cycleno 1234567890�慎


質問です。
上記の様に、strlen()で末尾にNULL文字の無い文字列を調べた時
訳分からん値が返ってくる件についてなんすが
これってNULL文字が検出されるまで
メモリ内の無関係な隣りの領域まで読み込んでるって解釈でよいのですか
また、%s出力に関しても同義ですか

あと、上記の解釈で正しいとすれば、仮にNULL文字がたまたまずっと
検出されなかったとすると、永久に読み込みが走るのですか





733デフォルトの名無しさん:05/01/20 23:51:41
>>732
その前にアクセス違反で落ちる
734デフォルトの名無しさん:05/01/20 23:54:23
>>733
会社のHP-UXと自宅のRedHatは落ちなかったとですよ
735デフォルトの名無しさん:05/01/20 23:55:18
> 俺はSE。おまいらから見れば超上級職だろうな

...
736デフォルトの名無しさん:05/01/20 23:57:37
> メモリ内の無関係な隣りの領域まで読み込んでるって解釈でよいのですか

そんなに疑問なら、
cycleno[0]
cycleno[1]
cycleno[2]
...
cycleno[9]
cycleno[10]
...
cycleno[14]
cycleno[15]
cycleno[16]
を出力してみればいいだろうに。
頭悪いなあ。
737デフォルトの名無しさん:05/01/21 00:03:43
で、本人は>>736のを試してみたか?

どうなった?
738732:05/01/21 00:08:11
for (i=0; i < strlen(cycleno); i++) {
        printf(" %c, ",cycleno[i]);
}

/******* 実行結果 **********/
1,  2,  3,  4,  5,  6,  7,  8,  9,  0,  ,  B,  F,  ,  , ,


>>736-737
やってみた。
ら、なおさらわかんなくなりました。
間にちらほらNULL文字っぽいの入っとる。

739デフォルトの名無しさん:05/01/21 00:12:08
>>738
%2x にしてみれ
740デフォルトの名無しさん:05/01/21 00:21:02
で、本人は>>739のを試してみたか?

どうなった?
741732:05/01/21 00:22:50
for (i=0; i <= strlen(cycleno); i++) {
    printf("%2x, ",cycleno[i]);
}

31, 32, 33, 34, 35, 36, 37, 38, 39, 30,  1, 42, 46, ffffff83,  4,  8,  0,

>>739-740
NULL文字かと思ったら別の制御文字だったです。
やっぱ隣りの無関係領域の'\0'出るまで読み込みでビンゴだったようです。
どうもありがとうです。

つまり
終端がNULL文字でない文字列にstrlenや%sをかけるのは不正アクセスを
引き起こすので普通やっちゃいけない、
・・・って結論でよいですかね ´∀`
742デフォルトの名無しさん:05/01/21 00:25:18
くだらん質問○投げスンナ
743デフォルトの名無しさん:05/01/21 00:25:34
>>741
OK
744デフォルトの名無しさん:05/01/21 00:26:39
たったこの程度のこと理解するのにどれだけ
時間かかってんだよ
745デフォルトの名無しさん:05/01/21 00:29:21
人生こんなもんだ
746デフォルトの名無しさん:05/01/21 00:36:52
> printf("�%c,�",cycleno[i]);


ぼけ %c でやって見えるわけねーだろ! ぼけ
%02 が常識 > ぼけ

さっさと> printf("�%02x,�",cycleno[i] & 0xff); しろ
747デフォルトの名無しさん:05/01/21 00:37:36
おまえぼけか?

> 終端がNULL文字でない文字列にstrlenや%sをかけるのは不正アクセスを
> 引き起こすので普通やっちゃいけない、

strlenして、何を得たいわけ?
748デフォルトの名無しさん:05/01/21 00:45:59
>>747
今まで気づかなかったおまえが一番ボケ
749デフォルトの名無しさん:05/01/21 00:52:27
別のスレッドで個人的に面白いのあったんだけど、他の言語分からないのでこれをC言語に直してください。

http://pc5.2ch.net/test/read.cgi/tech/1090227743/550
http://pc5.2ch.net/test/read.cgi/tech/1090227743/558

よろしくです。
750デフォルトの名無しさん:05/01/21 02:01:05
int main(int argc, char **argv)
{

日下部先生


}
751デフォルトの名無しさん:05/01/21 08:07:43
せっかくここ3年ほどよりつかなくなったのに、呼ぶんじゃねーよ!
752デフォルトの名無しさん:05/01/21 08:40:21
グーグルの検索後のURLみたいに%12%34...となっているようなのを表示したいんですけど、printfで普通に表示しようとしても数字に置き換えられてしまいます
何とか表示する方法はないでしょうか?
753デフォルトの名無しさん:05/01/21 08:54:32
>752
sscanf(buf,"%%%02x",&c)
754デフォルトの名無しさん:05/01/21 08:56:45
buf2[i++]=c;
755デフォルトの名無しさん:05/01/21 08:57:55
printf("%s\n",buf2);
756デフォルトの名無しさん:05/01/21 09:13:51
#include <stdio.h>
int main(){
char string[] = "日本語?";
int i = 0;
while (string[i]!='\0') printf("%%%02X", 0xff & string[i++]);
return 0;
}
757デフォルトの名無しさん:05/01/21 15:21:31
ランダムでファイルから一行ぬきだすのって
どうやるんですか?教えてください
758デフォルトの名無しさん:05/01/21 15:23:53
rand()でどれか一行選べばいい
759デフォルトの名無しさん:05/01/21 15:42:58
カレントディレクトリに指定した名前のファイルが存在するか調べてくれるような関数はありますか?
760デフォルトの名無しさん:05/01/21 15:47:32
>>759
環境依存。標準関数ではない。
761759:05/01/21 15:53:52
>>760
そうですか・・・・。
例えばWindowsならどんな関数がありますか?
762デフォルトの名無しさん:05/01/21 15:55:16
>>761
Windowsは知らん。ググれば解かると思うが。
763759:05/01/21 15:55:44
>>762
分かりました。
764デフォルトの名無しさん:05/01/21 15:58:50
すみません質問の仕方が不適切でした
タイピングもどきを作ってるんですけど、ファイルから
ランダムに一行ぬいて、キーボードでうちこんで、strcmpで正誤判定
ってのを作ってて、ファイルを上から読んでいく事はできたんですけど
rand()って0〜指定した数字までをランダムに指定するってものですよね?
これをどう用いればファイルからの抜き出しができるんですか?
初心者なものでお願いします
765デフォルトの名無しさん:05/01/21 16:02:38
>>759
一般的に、stat()は割りと環境を問わずあると思う。
また、読めることを以って存在すると仮定していいのなら、fopen()してみればいい。
766デフォルトの名無しさん:05/01/21 16:05:18
>>764
一旦、メモリに読み込むのが常套手段かと。
767759:05/01/21 16:06:26
>>765
ありがとうございます。
調べてみます。
768デフォルトの名無しさん:05/01/21 16:08:00
>>764

char** str;
str=(char**)malloc(〜…

行番号=(int)((double)行数*((double)rand()/RAND_MAX));
printf("%s",str[行番号]);//なんなりと
769デフォルトの名無しさん:05/01/21 16:17:28
引数って何でつか?
770デフォルトの名無しさん:05/01/21 16:25:22
void mian(void)
の括弧の中へvoidをなぜ書かなきゃならんとでつか?
771デフォルトの名無しさん:05/01/21 16:28:25
>>770
main(void)は引数がないことを意味し、
main()だと引数は不定だということを意味する。
ちなみにC++だと共に前者の意味になる。
772デフォルトの名無しさん:05/01/21 16:29:12
なあんだ、誰も応えられないんでつね
773デフォルトの名無しさん:05/01/21 16:32:49
>>771
サンクスコ。
voidを明記しないと不貞の浮気者になるんでつね。
774デフォルトの名無しさん:05/01/21 16:57:29
善意に甘えるついでにさらに質問させてもらいまつ。

プロトタイプ宣言で
void function(void)
と宣言していても、下のほうでvoidを記述しなくてもいいんでつか?
void funtion()
{
printf("ほにゃらら");
}
こんな感じで。
775デフォルトの名無しさん:05/01/21 17:17:28
>>774
OK。2つは合成される。
ところでmain関数の戻り値はintが正しい。
776デフォルトの名無しさん:05/01/21 17:32:38
>>775
そうでなくてはいけないわけでもないけれど、その方がいろんな面で有益。
777デフォルトの名無しさん:05/01/21 17:39:18
うんとね、setMessage(String s)と書いとけば、
後はmainメソッドに書いてるように
method1.setMessage("ええんか");のように
括弧の中に具体的な値を好きなようにかけるんですよね?
778デフォルトの名無しさん:05/01/21 17:39:48
>>775-776
ありがとさん。

プロトタイプ宣言でvoidを書いておけば
下のほうで書かなくてもいいんでつね。

で775のmainの戻り値をintでってのはなぜでつか?
779デフォルトの名無しさん:05/01/21 17:52:46
終了コードも知らんのか。いやはや世も末だ
780デフォルトの名無しさん:05/01/21 18:51:19
余談だけど、ファーム系だと void main() だったりすることもあったりする。
781デフォルトの名無しさん:05/01/21 20:00:11
>>780
それはシェル使わんし、Mainを終わることは電源切るときだけだから。
782デフォルトの名無しさん:05/01/21 20:02:38
>>781
馬鹿はすっこんでろ
783デフォルトの名無しさん:05/01/21 20:09:20
782:デフォルトの名無しさん:05/01/21 20:02:38
>>781
馬鹿はすっこんでろ
784デフォルトの名無しさん:05/01/21 20:13:11
なんかまた始まったな。読んだことないやつはC99の5.1.2.2.3でも読んどけ。
785デフォルトの名無しさん:05/01/21 20:14:37
>>784
リンクぐらい張っとけ。
786デフォルトの名無しさん:05/01/21 20:16:25
だな、そこまでググル気にもならんし
787デフォルトの名無しさん:05/01/21 20:23:53
788デフォルトの名無しさん:05/01/21 20:44:37
質問です。
2つ以上のソースファイルからなるプログラムで、異なるソースファイルで同じ関数名や変数名を使っても
大丈夫な方法ってありますか?
どうしてもエラーになってしまうのですが・・・。
789デフォルトの名無しさん:05/01/21 20:45:11
同じ関数名や変数名を使わなければいい。
790デフォルトの名無しさん:05/01/21 20:45:38
781 名前:デフォルトの名無しさん[sage] 投稿日:05/01/21 20:00:11
>>780
それはシェル使わんし、Mainを終わることは電源切るときだけだから。
791デフォルトの名無しさん:05/01/21 20:46:57
main関数の戻り値はintが正しい。
792デフォルトの名無しさん:05/01/21 20:47:47
>>788
全部大文字にするとか?
793デフォルトの名無しさん:05/01/21 20:48:11
Mが大文字なのは、ファームだから?
794デフォルトの名無しさん:05/01/21 20:48:42
>>788
static
795デフォルトの名無しさん:05/01/21 20:49:08
CでCGIの勉強をしようと思っているのですが、
#include<stdio.h>
int main()
{
printf("Content-type:text/html\n\n");
printf("<HTML>\n");
printf("<HEAD>\n");
printf("<TITLE>cgi01</TITLE>\n");
printf("</HEAD>\n");
printf("<BODY>\n");
printf("TEST\n");
printf("</BODY>\n");
printf("</HTML>\n");

return 0;
}
このソースをVisualC++でコンパイルし、拡張子を.cgiに変えてUP、パーミッションを変更しました。
そしてアクセスすると何故かCGIWrap Error: Script Execution Failedと表示され実行できません。
なぜですか?
796デフォルトの名無しさん:05/01/21 20:49:55
>>788
オブジェクトのシンボルテーブル弄ればいけるんじゃない?
797デフォルトの名無しさん:05/01/21 20:50:58
>>795
exeに変えとけ。
798デフォルトの名無しさん:05/01/21 20:51:15
>>788
関数名衝突させるなよ
799デフォルトの名無しさん:05/01/21 20:53:19
>>793
リンカーのため、つい、mainはデバッグ用、Mainは商用と分けてる
800788:05/01/21 21:01:46
>>794
有難う御座いました、解決しました!
本当に助かりました。
801794:05/01/21 21:16:28
>>800
一番の解決方法は、名前を分ける事なのだが、
それをしない理由はなんだ?
802デフォルトの名無しさん:05/01/21 23:00:22


名前と入力番号の降順を自作関数で処理するプログラムを作ったのですが、
名前の降順がうまくいきません。

void sort_data(struct person *pdata,int i_cnt)
{
int cnt1;
int cnt2;
int temp;
char temp2[STRING_SIZE];
for(cnt1 = 0 ; cnt1 < i_cnt ; cnt1++)
{
for(cnt2 = cnt1+1 ; cnt2 < i_cnt+1 ; cnt2++)
{
if((pdata+cnt1)->point < (pdata+cnt2)->point)
{
temp =(pdata+cnt1)->point;
temp2[0] =(pdata+cnt1)->name[STRING_SIZE];
(pdata+cnt1)->point = (pdata+cnt2)->point;
(pdata+cnt1)->name[0] = (pdata+cnt2)->name[STRING_SIZE];
(pdata+cnt2)->point = temp;
(pdata+cnt2)->name[0] = temp2[STRING_SIZE];
}
}
}
}
どこを修正すればうまく処理されるのでしょうか??
803デフォルトの名無しさん:05/01/21 23:38:06
if((pdata+cnt1)->point < (pdata+cnt2)->point)
{
 struct person temp;
 temp = pdata[cnt1];
 pdata[cnt1] = pdata[cnt2];
 pdata[cnt2] = temp;
}

ソートキーは番号ですか名前ですか。
文字列の比較には strcmp() を使います。
文字列のコピーには strcpy() を使います。
804デフォルトの名無しさん:05/01/22 00:34:44
>>803
そんなCがだぁいすきv(^-^=)
805710:05/01/22 00:42:23
>>712
まあ、確かに俺は単価の高いSEだな。
毎日9時-17時で退社。月給手取りで約60万。
「単価が安くて使えるプログラマ」なおまいらは毎日深夜まで残業…。
でも手取りで30も貰えてないだろ(プ…かわいそうにwww
806デフォルトの名無しさん:05/01/22 00:50:38
参考書でvoid main()を見かけることの何と多いことか。。。
大学の講義ページでも堂々と使ってるの見たよ。
807デフォルトの名無しさん:05/01/22 00:51:08
30円くらいはもらえるよ。
808デフォルトの名無しさん:05/01/22 00:56:50
>>806
よくない、ほんとよくない、講義ですね。
809デフォルトの名無しさん:05/01/22 00:57:34
>>806
よくない本と、よくない講義ですね。
810デフォルトの名無しさん:05/01/22 03:57:55
精度がよく実行速度がはやい積分方法で、おすすめのありませんか?
811デフォルトの名無しさん:05/01/22 04:42:33
>>810
ニュートン法でいいじゃん
812デフォルトの名無しさん:05/01/22 04:51:25
>>811
適当な事言ってんじゃねーよバカ。
813810:05/01/22 05:27:03
>>811
しらないなら別にいいよ
814デフォルトの名無しさん:05/01/22 05:32:32
積み上げ法がいいと思うよ
815デフォルトの名無しさん:05/01/22 08:32:30
ともかくスレちがい
816デフォルトの名無しさん:05/01/22 11:29:23
>>809
耳従ってない青二才の典型
1つ気になることがあると
そこに気を取られるばかりで話に入れない
結果として自分と大差ない人からだけ聞いた
偏った知識のまま大成することなく歳を取る
筋の悪い「素材」だ
817810:05/01/22 11:51:10
>>815
あんたには聞いてないから
818デフォルトの名無しさん:05/01/22 11:51:48
>>816
君の言っている事は全く理にかなっていないよ。
単なる経験則でしょ。
無意味な自己満足のレス付けて楽しい??

>>806はただ参考書や講義で使われているのを良くみると書いているだけで、
そう書くことの利点については全く言及していない。
819802:05/01/22 12:22:17
>>804
大変参考になります。
ありがとうございます。

それとソートキーは番号です。

820デフォルトの名無しさん:05/01/22 12:25:28
> 大学の講義ページでも堂々と使ってるの見たよ。

よくみたらJavaの講義だった...っていうオチでは?
821デフォルトの名無しさん:05/01/22 12:26:58
>>818
アンカーもロクに読めてないようだな
822デフォルトの名無しさん:05/01/22 12:29:59
> 月給手取りで約60万。

やす,,,。ってそれ自慢できる収入かぁ?
823デフォルトの名無しさん:05/01/22 12:37:50
年齢による
824デフォルトの名無しさん:05/01/22 12:40:25
そかなあ。20台後半でそれだったら、すくなすぎだぞ
825デフォルトの名無しさん:05/01/22 12:41:51
>>821
まず、根本的に、君は文を読んでいないし、議論にもなっていない。

# どうせ釣りだのなんだのと言いたいのだろうが、こっちは釣られても全然恥だとは
# 思っていないし、必死だといわれても恥とは思わない。
826デフォルトの名無しさん:05/01/22 12:42:19
地域にもよるな
田舎で60なら自慢できるだろwww
827デフォルトの名無しさん:05/01/22 12:43:14
おまえら、給料のこと書くんだったらマ板池。糞共
828デフォルトの名無しさん:05/01/22 12:46:02
ふゆのそなた
829デフォルトの名無しさん:05/01/22 12:49:53
>>825
では聞くが void main() という断片から、大学や講義の何がわかるんだ?
君ならちゃんと「理にかなった」説明ができるなら拝聴しようか。
830デフォルトの名無しさん:05/01/22 12:59:59
>>829
決まっているだろ。
void main()という書き方をしたという事実だよ。
サンプルでそう書いたのだから、推奨したということだろう。

ところで、>>809は私ではない。
831デフォルトの名無しさん:05/01/22 13:00:12
Javaの講義では
int main だったりして
832デフォルトの名無しさん:05/01/22 13:01:18
> では聞くが void main() という断片から、大学や講義の何がわかるんだ

その講義が「だめだめ」だということだな。
hello, worldを出力して改行するサンプルで、バックスラッシュじゃなくて、円記号で
ホワイトボードに書くような講義もだめだめ
833デフォルトの名無しさん:05/01/22 13:06:55
円記号なんて使わないだろ。普通。
834デフォルトの名無しさん:05/01/22 13:07:26
>>830
うまく逃げたな
こっちも深追いする理由は特にない

>>832
説得力ゼロだな
観測事実と結論が何ら関連づけられていないばかりか
結論に使っている独自の用語を定義していない
835デフォルトの名無しさん:05/01/22 13:08:14
>>834
あはは あほだー
836デフォルトの名無しさん:05/01/22 13:09:30
おこちゃまはお外で遊んでおいで
837デフォルトの名無しさん:05/01/22 13:11:34
> 円記号なんて使わないだろ。普通。

だよねえ。ふつう (まっとうな大学なら)

なのに使って、さらにその表記にnをつづけたもの(ようするに改行)を「えんえぬ」とか
口頭で読んでる講師って、どうだ? (実在する)
838デフォルトの名無しさん:05/01/22 13:12:56
>>837
若くて美人できょにゅうならゆるす!
839デフォルトの名無しさん:05/01/22 13:13:59
確かに美人なら許せるな。
840デフォルトの名無しさん:05/01/22 13:14:25
>>838

虚乳でむさいおやじです。どうする?
841デフォルトの名無しさん:05/01/22 13:14:37
ヌッコロ
842デフォルトの名無しさん:05/01/22 13:16:23
技術系で若くて美人なんているか?
843デフォルトの名無しさん:05/01/22 13:17:19
大学にいなさそう > 技術系で若くて美人なんているか?

でも、以前話題にでてた「えんえぬ」先生は、
専門学校で若くて美人だったはず
844デフォルトの名無しさん:05/01/22 13:19:07
>>843
たしか日下部が教えた専門学校の学生が書いてたんじゃなかったっけ
で、CじゃなくてJavaの講師だったはず > えんえぬと読むけど美人
845デフォルトの名無しさん:05/01/22 13:20:36
> 技術系で若くて美人なんているか

大学の講師とかではいないだそうが(みたことない!)、
現場ではけっこうみかける(ときどき)。
少なくともここ九州北部のH系の会社では
1人は (っていうか、この1人で10人分ぐらい美人なのだが!) いる
846デフォルトの名無しさん:05/01/22 13:21:11
>>844
VBだったら最高だったのにな(えんえぬはないけど)
847デフォルトの名無しさん:05/01/22 13:21:59
> 参考書でvoid main()を見かけることの何と多いことか。。。

そんなだめ本はむしろ少ない (って、まあ全体の1/3以下だっていうだけのことで、1/100以下だって
いうわけではない)

まともな本使えばいいだけでは?
848デフォルトの名無しさん:05/01/22 13:22:44
>>847
たとえばどんな本だ?
849デフォルトの名無しさん:05/01/22 13:23:21
読んで分かるC言語プログラミング
850デフォルトの名無しさん:05/01/22 13:30:32
たしかに「void main()」とかは「絶対」かいてなさそうな
著者を、少なくとも1人は知ってるな ;-)
851デフォルトの名無しさん:05/01/22 13:31:04
>>850
誰だよ?
852デフォルトの名無しさん:05/01/22 13:31:34
returnに括弧をつけちゃう著者も ;-)
853デフォルトの名無しさん:05/01/22 13:31:41
>>846
VBなど今どき専門学校でおしえるかよ ぼけ
あったらよほどだめな学校だ。
854デフォルトの名無しさん:05/01/22 13:34:24
>>851
voidさん
855デフォルトの名無しさん:05/01/22 13:34:32
>>837
>口頭で読んでる講師って、どうだ? (実在する)

実際に会って確認するしかねえだろ
そんなこともわからん奴らしいぼけ発言だな
856デフォルトの名無しさん:05/01/22 13:35:29
ところでみんなはindentは-krそれとも-gnu?
857デフォルトの名無しさん:05/01/22 13:36:02
> 実際に会って確認するしかねえだろ

意味不明。なにを確認するんだか
858デフォルトの名無しさん:05/01/22 13:36:44
>>857
顔に決まっているだろ。
859デフォルトの名無しさん:05/01/22 13:38:33
>>857
それは 837 に聞いてくれ
860デフォルトの名無しさん:05/01/22 13:46:02
わたしはだんぜん-krだな
861デフォルトの名無しさん:05/01/22 13:47:22
勝手にインデントするな。
862デフォルトの名無しさん:05/01/22 13:51:01
インデントみたいなプロトコルを1つしかサポートできないことを自慢するアフォが多いな
863デフォルトの名無しさん:05/01/22 14:29:17
インデントってプロトコルか?
864デフォルトの名無しさん:05/01/22 14:55:11
GNU indentのタブ幅設定は-ts3だよな?
865デフォルトの名無しさん:05/01/22 15:40:41
>>845
技術系で若くて美人がいたが糞に蠅がたかる状態だった。
おぼっちゃんがゲットしました。
866デフォルトの名無しさん:05/01/22 15:42:16
それはつまり

糞=若くて美人
蠅=そこらの男

ってことか?
867デフォルトの名無しさん:05/01/22 15:46:31
-gnuは醜すぎ
はよなくなれ
868デフォルトの名無しさん:05/01/22 16:19:24
>>863
プロトコルは元来人間同士の儀礼
マシン間の通信規約を指さなくとも何ら問題はない
869デフォルトの名無しさん:05/01/22 16:43:28
とっても単純な質問なのですが、
#include<stdio.h>
int main(void)
{
int num;
printf("input : ");
scanf("\n%d",&num);

printf("\n%d",num);

return 0; /*正常終了 */
}
このプログラムでは実数値を入力しても、整数値が出力されます。
実数値を出力するにはどこを修正すればいいのでしょうか。
870デフォルトの名無しさん:05/01/22 16:53:29
>869
printfとscanfをヘルプで見ろ
871デフォルトの名無しさん:05/01/22 17:01:44
>>869

>>871をヘルプで見ろ
#include<stdio.h> 
int main(void) 

    double num;
    printf("input : ");
    scanf("%lf", &num);
    printf("%d\n", num);
    return 0;
}
872デフォルトの名無しさん:05/01/22 17:04:10

質問です。

void main()
{
char* aaa;
scanf("%d",&aaa);

if (aaa == "abc")
     printf("OK\n");
else
printf("NO\n");

return;
}

このプログラムで入力文字が"abc"だったらOKと表示させたいんですが、
abcと入力してもONを表示されてしまいます。
どうしたらいいでしょうか?

それともif文は文字列判定はできないのでしょうか?

どうかよろしくお願いいたします
873デフォルトの名無しさん:05/01/22 17:09:19
>>872
そのコードはポインタを比較しています。
ポインタが指している文字列を比較しているのではありません。
874デフォルトの名無しさん:05/01/22 17:09:27
>>872
#include <stdio.h>
#include <string.h>
int main(void) {
    char buf[256]; 
    if (scanf("%256s", buf) != 1) return 1;
    if (strcmp(buf, "abc") == 0) puts("OK");
    else puts("NO");
    return 0;
}
875デフォルトの名無しさん:05/01/22 17:10:21
>>872
void mainじゃなくてint mainな.

if文は文字列判定できないっていうより,Cの==演算子は文字列には適用できない.
JavaとかC++ならクラスを使ってできるんだけどね.
だからstring.hにあるstrcmpってやつを使う.
ぐぐったら出てくるから調べてみ.
876デフォルトの名無しさん:05/01/22 17:16:23
>>873
>>874
>>875
ご教授ありがとうございます。
ちょっとした謎が解けました。
ありがとうございました。
877デフォルトの名無しさん:05/01/22 17:22:33
>>872
それより今きづいたが,
scanf("%d",&aaa); はまずい気がする.
scanf("%s",aaa);にしとけ.
上のままだと,たぶんヌル文字が入らないと思うけど.
教えてエロい人!
878デフォルトの名無しさん:05/01/22 17:33:14
strcpy(fname, argv[1]);
len = strlen(fname);
if((fname[len - 1] == ".") && (fname[len] == "c")) //ここでwarning

fnameの最後に".c"がついてるかどうかを知りたいのですが
if((fname[len - 1] == ".") && (fname[len] == "c"))のところで
ポインタに関してのwarningがでます。何が間違っているのでしょうか。
879デフォルトの名無しさん:05/01/22 17:34:15
オレはエロくない
880デフォルトの名無しさん:05/01/22 17:37:49
>>878
ダブル区ぉーとじゃなくてシングル区ぉーとを使え.
fname[len]はまずいと思うが.
881デフォルトの名無しさん:05/01/22 17:38:56
>878
いわゆる負の添字参照バグ。もはやa[-1]のような式は使うべきでない。環境(32or64-bit)が変わる度にバグとなる。また、len==0の場合は?
882デフォルトの名無しさん:05/01/22 17:40:47
>>881
ctype.h のよくある実装も否定されます?
883デフォルトの名無しさん:05/01/22 17:43:27
>882
環境ごとに最適化すればいい
884878:05/01/22 17:44:13
>>880
レスありがとうございます。
>>fname[len]はまずいと思うが
lenは\0を入れない文字列の長さだから
fname[len-2]=='.'、fname[len-1]=='c'ということですよね??(;;
885デフォルトの名無しさん:05/01/22 17:45:48
fname[0-2]
886デフォルトの名無しさん:05/01/22 17:49:12
1000
887デフォルトの名無しさん:05/01/22 17:51:08
>>884
そうだけど,>>881がいうように,
len==0だとまずいから,一応if(len>1)を入れておいた方がいいね.
888878:05/01/22 17:55:01
>>881
>>884
あっ、なるほど。早とちりしてました。
わかりやすい解説ありがとうございました。
889デフォルトの名無しさん:05/01/22 18:29:25
>>872
本当にそのソースで「ON」と表示されたのか?
890デフォルトの名無しさん:05/01/22 18:35:45
>>889
どんな天才が作ってもONとは表示されないだろ
891デフォルトの名無しさん:05/01/22 18:40:06
>890
天才を侮辱するな
-Delse=puts("ON");
#define else puts("ON");
892デフォルトの名無しさん:05/01/22 18:41:41
>>890
void main なので、原理的にはありうる。
893デフォルトの名無しさん:05/01/22 18:41:46
先輩!何回実行させても「OK」か「NO」しか出ません
894デフォルトの名無しさん:05/01/22 18:42:19
int foo[] = { 100, 200 } ;
int bar[] = { 0, 1 } ;
: //略
printf( "%3d\n" ,foo[ bar[ 0 ] ] ) ;

自分たまにこんなの使ったりしてますが、これって実際どうなんですか?
環境依存とか、そういういけないやり方ですか?
教えてください。
895デフォルトの名無しさん:05/01/22 18:42:53
ところでなんでONになるんだろう...
896デフォルトの名無しさん:05/01/22 18:46:23
puts("buf overflow\rON");
897デフォルトの名無しさん:05/01/22 18:47:55
>>894
何の問題もない。もっとひどくしてbar[0][foo]と書く事もできる。
898デフォルトの名無しさん:05/01/22 18:48:59
>894
配列[int型]に問題ない
899デフォルトの名無しさん:05/01/22 19:02:17
>>897
>>898
レスありがとうございます。
bar[0][foo]とした場合の解釈の仕方としてはどういう感じなんでしょうか?
900デフォルトの名無しさん:05/01/22 19:06:56
以下のようなことを実現したいときに、どのようにしたら良いか悩んでおります。
//まず、処理をするかしないかユーザーに問う。
//しないなら終了、するなら処理へ。一つの処理が終わったら、再びユーザに問う
もちろん、処理の内容はとりあえず何でも良いです。
コードを短くするためには、ループだろうと考え、こんな感じで作ってみましたが、うまくいきません。

#include<stdio.h>
int main(void)
{
char handan;
int a;
for(;;)
{
printf("実行はyを 、終了するならそれ以外のキー\n");
handan=getchar();
if(handan!='y') break;
printf("数字を入力してください\n");
scanf("%d",&a);
printf("入力された数字は%dです\n",a);
}
return 0;}

1回目のy入力→処理、までは問題ないのですが、
なぜか2回目に入ると、「実行はyを、〜〜」を表示して、終了してしまうのです…。
どこがおかしいか、先輩諸氏、ご教唆をお願いします。
また、我が儘を申し上げれば、今回のような設問時には、みなさんはどのような手法を取るか、
教えていただければ幸いです。
901900:05/01/22 19:08:34
すみません。
「改行が多い!」が出たんで、減らしたた見にくくなっちゃいました。
インデントもなくなってるし…。
902デフォルトの名無しさん:05/01/22 19:16:19
12行目>scanf("%d%*c",&a);
903デフォルトの名無しさん:05/01/22 19:19:07
>900
scanfはstdinを汚す。
直後にrewindを呼べ。
904デフォルトの名無しさん:05/01/22 19:21:59

>>900
>今回のような設問時には、みなさんはどのような手法を取るか、
>教えていただければ幸いです。

scanf を使わない。
905デフォルトの名無しさん:05/01/22 19:22:26
>>900
fgetsあたりで一行読み込んだ後、その行を処理するのが定石。
906デフォルトの名無しさん:05/01/22 19:23:20
rewind を知らないだけのアフォが吠えてるぜw
907デフォルトの名無しさん:05/01/22 19:28:05
俺はいつも
gets(tmp);
a=atoi(tmp);
rewind(stdin);
で書いてるけど。
908デフォルトの名無しさん:05/01/22 19:28:39
>>906
一番のアホはお前
909デフォルトの名無しさん:05/01/22 19:31:50
>>906
昔、いろいろ実験した挙句、
何となく rewind を入れてみたら
なぜか上手くいった。

俺はその時の感動が
今でも忘れられないんだよ、
とかいう人?
910デフォルトの名無しさん:05/01/22 19:32:41
海外のプログラミング学習サイトのサンプルコードに入っていたのを見つけて、やみつきになった>rewind
911デフォルトの名無しさん:05/01/22 19:32:45
>>906
そうだ、お前がアホだ。
912デフォルトの名無しさん:05/01/22 19:34:55
お前ら、いつまでそんなレガシー関数使ってんだよ。恥ずかしいなーもー。
913900:05/01/22 19:35:17
先輩諸氏、ありがとうございます。
rewind、fgets・・・、まだ知らない単語でした。
勉強を進めて参ります。

現状では、
>902さん
のやり方でうまくいきました。ありがとうございます。
914デフォルトの名無しさん:05/01/22 19:36:15
rewind を知らないだけってのは買いかぶり過ぎだったか
たかが scanf 程度のものでさえ仕様をちゃんと理解して使えない
適性の最も低い層から今日も漏れ聞こえる慟哭かw

そんなのとは比較にもならない複雑怪奇なものを次から次へと理解せにゃならんのがPGだというのに
915デフォルトの名無しさん:05/01/22 19:36:48
stdin に rewind をかけるというのが
正当な解法だと考えるセンスは
いかがなものかと。
916デフォルトの名無しさん:05/01/22 19:38:05
#include<stdio.h>
int main()
{
char* a="a%" ;
printf(a) ;
return 0 ;
}
とすると % が出力されないのに、printf("%s",a) ;とすると%が出力されるの
はなぜでつか?
917デフォルトの名無しさん:05/01/22 19:38:50
>>915
確かにセンスねえな
知ってればいいってものでもない
918デフォルトの名無しさん:05/01/22 19:39:23
まぁ、用意されている関数を覚えている、というのは別にすごいことでもなんでも
ないわけだが。逆に言うと、覚えていなくても別に大して恥ずかしいことでもない。
基礎を知っているなら、別に大きな問題ではないね。
919デフォルトの名無しさん:05/01/22 19:40:31
あ、基礎というのは言語仕様の事ではないよ。
920デフォルトの名無しさん:05/01/22 19:42:50
>>915
ファイルリダイレクトして渡したりしたらえらいことになりそうな気がする。
921デフォルトの名無しさん:05/01/22 19:44:25
>そんなのとは比較にもならない複雑怪奇なものを次から次へと理解せにゃならんのがPGだというのに

と、学生が吠えておりますが
922デフォルトの名無しさん:05/01/22 19:44:59
>>921
元メインフレーム屋ですが何か?
923デフォルトの名無しさん:05/01/22 19:45:00
すいません、初心者なんですが>>902の「%*c」が意味するものを教えてください。
924デフォルトの名無しさん:05/01/22 19:45:22
>916
%おいちいからprintfにたべらりちゃふの。でも%%は%になるの。putsはたべないけれどね
925デフォルトの名無しさん:05/01/22 19:46:12
>>923
実行してみたの?していないの?していないなら実行してから質問ね。
926デフォルトの名無しさん:05/01/22 19:46:24
>>922
Cは向いていない気が。
927デフォルトの名無しさん:05/01/22 19:48:15
遅レスだが

>>768
rand==RAND_MAXの場合困らない?

>>806
うちの大学の教授もvoid mainの人が居た
int mainなのは、C言語の仕様決めた人が、main関数は下の2つのどっちか。って決めたから、どちらにせよintだと聞いた
「int main(void)」
「int main(int c,char *argv[])」
argvの後に引数付けてもOKだけど、これは環境依存でOKだっただけなんだろうな。

>>901
2ch書く時に、先頭のインデントは半角スペースだと消える。
全角に直して(置換)書き込みすれば良いよ
(どうせエディタで書いたのをコピペだろうから、エディタで置換させれば楽)
928デフォルトの名無しさん:05/01/22 19:48:25
>>926
ああ、自分は適性が高いとはこれっぽっちも感じないね
コード書けば金もらえる
それだけだ
929デフォルトの名無しさん:05/01/22 19:48:31
>>916
釣りならもう一回ネタを練り直して来い
釣りじゃないならprintfが何をする関数なのか調べて来い
930デフォルトの名無しさん:05/01/22 19:48:55
Cのどこが複雑怪奇なんだか・・・
931デフォルトの名無しさん:05/01/22 19:49:05
・標準入力にrewind()
>920の指摘などの問題。
・scanf()
使いこなせていないとバッファオーバランの危険。
・gets()
常にバッファオーバランの危険。使用禁止。

>>916
printf()の第一パラメータは常にフォーマット文字列として解釈されるので、
%を出力するには%%と書く必要がある。
例えば、char *a = "%s" だったりすると大変危険。
932デフォルトの名無しさん:05/01/22 19:50:21
>>922
>元メインフレーム屋ですが何か?

いや、なるほど。納得した。

さすがは・・・(ry
933デフォルトの名無しさん:05/01/22 19:50:43
>>928
そんなんだから複雑怪奇だと思っちゃうんだよ。
rewindに限らず「よくわかんないけど動けばいいや」って感じなんでしょ。
934デフォルトの名無しさん:05/01/22 19:53:28
>>931
すいません、それなら数字や文字列を入力する時はどの関数を使えば良いんでしょうか。
fgetsだと改行も入ってしまうんですが…
935デフォルトの名無しさん:05/01/22 19:53:52
>>930
Cというか、最近はソフトとはそもそも何かというところで悩んでる
それこそ学生時代にしっかり押さえたはずのことが今になってアバランシェ
・・・大パニックがかえって楽しいけどね
936デフォルトの名無しさん:05/01/22 19:55:24
文字列→sscanf
    →atoiなど
937デフォルトの名無しさん:05/01/22 19:55:24
void main(void)

私は美しい・・・・・・・・・
938デフォルトの名無しさん:05/01/22 20:00:14
何でコードを短くとか考えるのよ?その前にバグを減らす方を考えろよ
939デフォルトの名無しさん:05/01/22 20:00:23
>>936
つまり、fgetsでchar変数に値を与えてからsscanfやatoiで直せば良いんですね。
教えていただいて有難うございます。m(_ _)m
fgetsならstdinは汚れませんよね?
940デフォルトの名無しさん:05/01/22 20:02:01
>>938
短くすればバグも減る。
941デフォルトの名無しさん:05/01/22 20:03:02
>>939
しゅくふくのつえを持っているのにベホイミを唱えるようなもの
942デフォルトの名無しさん:05/01/22 20:05:10
「汚れる」がどういう状態を指すのかわからんけど、
stdinに変なデータを書き込まれたりということはない。
943デフォルトの名無しさん:05/01/22 20:06:04
>>935
>Cというか、最近はソフトとはそもそも何かというところで悩んでる
>それこそ学生時代にしっかり押さえたはずのことが今になってアバランシェ

もしかして学校ではバッチ処理の事しか教えてもらえなかったのでは?

まともな学校ならば、SICP のようにしっかりした教科書を使うから、
そんなことにはならないと思う。
944デフォルトの名無しさん:05/01/22 20:08:27
結局>>906は話をそらして遁走か
945デフォルトの名無しさん:05/01/22 20:09:03
>>944
話したければどうぞ
946デフォルトの名無しさん:05/01/22 20:09:51
>>943
ホレリスカードね
947943:05/01/22 20:12:30
>>946
>ホレリスカードね

おいおい・・・
学校って、「何時」の学校だよ(w
948869:05/01/22 20:13:28
>>871

大変参考になりました。
ありがとうございます
949869:05/01/22 20:14:42
>>871
大変参考になりました。
ありがとうございます。
950デフォルトの名無しさん:05/01/22 20:14:43
char str[4]="str";
str[0,2]='d';

みたいに、カンマで区切ってもエラーにならないんですけど、なぜでしょうか?
(2行目は、0,2です)
何か使い所があるから、OKって事になってるかと思ったんですが…
951デフォルトの名無しさん:05/01/22 20:17:01
>>950
そこでD言語ですよ
952デフォルトの名無しさん:05/01/22 20:23:11
>>950
0, 2が式として評価されるから。
カンマで区切った式は左から順番に評価され、
最後に評価された値が帰ることになる。
953デフォルトの名無しさん:05/01/22 20:23:12
>>950
「式 + 式」が「式」なのと同じように、
「式, 式」は「式」だから。
954デフォルトの名無しさん:05/01/22 20:23:40
(0,2)==2.
(0,1,7)==7.
(0,2,4,8)==8.
955デフォルトの名無しさん:05/01/22 20:24:25
文法書嫁よ。あー釣られた
956デフォルトの名無しさん:05/01/22 20:25:00
>>950
for(n = 0, m = 0; m < max; m++)
のように使うときのカンマと同じ。
957デフォルトの名無しさん:05/01/22 20:25:36
>>955
釣られても気にするな。君は思った意見を言っただけだ。
正しいものは正しいと胸を張って生きよう。
958デフォルトの名無しさん:05/01/22 20:49:05
>>931
改行は、消すか無視すれば問題ないだろ。
なんで、その程度で悩む?
959デフォルトの名無しさん :05/01/22 21:18:59
jacobi法を使用して

行列Aに対して
 Axベクトル = λxベクトル
を満たす
 ベクトルx(固有ベクトル)と
 値λ (固有値)と
組を求める。

のプログラムを作ってください。
960デフォルトの名無しさん:05/01/22 21:25:39










 ____
. \ _, ,_ /∩   ソニック!ソニック!
  ( `Д´)彡  ∽
  (  ⊂彡        ∽
   |   | 
   し ⌒J










961デフォルトの名無しさん:05/01/22 21:27:25
板違い、帰れ
962デフォルトの名無しさん:05/01/22 21:30:22
>959
数学板に戻りなさい
963デフォルトの名無しさん:05/01/22 21:33:19
>>959
ここから、ヤコビ法のコードを拾え。

http://oku.edu.mie-u.ac.jp/~okumura/algo/archive/

そして今度からは、
わざわざ他人に作ってもらおうとする前には必ず、
ここにそのコードがない事を確認してから依頼しれ。
964デフォルトの名無しさん:05/01/22 22:40:26
>>899
a[b]とb[a]は同じ。
aにfoo、bにbar[0]を当てはめてみるとfoo[bar[0]]とbar[0][foo]になり、問題ないということになる。
965デフォルトの名無しさん:05/01/22 22:49:23
>>964
便乗質問です。

型Tの配列aがあったとして、
a[b] の解釈は
*(a + sizeof(T) * b) になると思います。
とすると、同様にb[a]は
*(b + sizeof(T) * b)
と解釈されると考えました。

この条件でa[b] == b[a]となるのは、
sizeof(T) == 1 つまりTがcharだけの場合に限る

と考えたのですが、間違いでしょうか?
966デフォルトの名無しさん:05/01/22 22:50:16
b + sizeof(T) * b → b + sizeof(T) * a
でした… orz
967 ◆DRAGONS/66 :05/01/22 22:52:25
> *(a + sizeof(T) * b) になると思います。
ならない。
*(a+b)
968デフォルトの名無しさん:05/01/22 22:54:22
>>965
おまいの発想だと後者は
*(b + sizeof(b) * a)
になるんじゃねーのか?アァ?
969デフォルトの名無しさん:05/01/22 22:54:30
>>967
即レスありがとうございます。
ポインタ演算の基礎を忘れて混同してました…
スレ汚し失礼しました^^;
970デフォルトの名無しさん:05/01/22 23:00:34
return(0);
と書いている参考書を買ってしまったのですが
まずいですか?
971デフォルトの名無しさん:05/01/22 23:01:39
>>970
その辺がどっちが良いかは完全に宗教論争だから、どっちでもいいんじゃね?
972デフォルトの名無しさん:05/01/22 23:02:16
>970
ちと古い。
973デフォルトの名無しさん:05/01/22 23:03:49
>>971
別にあってもなくてもいいという感じで
とらえておけばいいでしょうか?

まだ初学者なのに
いきなり駄目な参考書に当たっちゃったかなあと思いましたが
他の部分は読みやすそうなので気にするのをやめます

ありがとうございました
974デフォルトの名無しさん:05/01/22 23:05:14
>>972
99年12月30日発行でした
975デフォルトの名無しさん:05/01/22 23:05:51
>>974
ミレニアムまで待てなかったのか
976デフォルトの名無しさん:05/01/22 23:07:58
>>974
ギリギリC99が載ってなさそうな日付じゃん…
977デフォルトの名無しさん:05/01/22 23:08:50
C99準拠の参考書ってどれぐらいあるんだろう?
978デフォルトの名無しさん:05/01/22 23:10:18
プログラミング言語CのC99版ってまだ出ないの?
979デフォルトの名無しさん:05/01/22 23:10:38
なんとしても90年代に出したかった必死さが伝わってくるようだ。
980デフォルトの名無しさん:05/01/22 23:10:47
C99ってなんやねん
981デフォルトの名無しさん:05/01/22 23:12:21
>>980
この業界にいて知らないのはヤバい
982無理だったので誰か次スレ立てて☆:05/01/22 23:12:35
【板名】 プログラム技術
【板のURL】 http://pc5.2ch.net/tech/
【タイトル】↓
C言語なら俺に聞け! Part 100
【名前】 v(^o^i)d
【メール欄(省略可)】
【本文】↓
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

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

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

各種リンク、関連スレは>>2-13あたり

C言語なら俺に聞け! Part 99
http://pc5.2ch.net/test/read.cgi/tech/1105454700/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
983デフォルトの名無しさん:05/01/22 23:12:58
別にC99なんて使わないっしょ
984デフォルトの名無しさん:05/01/22 23:13:41
>>982
このタイミングでそのコピペが出る意味がわからない
985デフォルトの名無しさん:05/01/22 23:14:02
>>981
すいません、業界の者ではないです
ヴァージョンみたいな認識でOK?
986デフォルトの名無しさん:05/01/22 23:15:35
>>985
プログラミング言語Cの「現在の」標準規格
正式にはISO/IEC 9899:1999-Programming Language C
987デフォルトの名無しさん:05/01/22 23:16:40
ついでに書籍プログラミング言語C第2版のはC90
988デフォルトの名無しさん:05/01/22 23:16:41
>>980
タダでさえこのスレまで99なのに知らないってのは釣りか…

http://seclan.dll.jp/c99d/c99d01.htm#dt19990319
989デフォルトの名無しさん:05/01/22 23:17:13
ドイツ語の正書法みたいなもんですね
理解しました
990デフォルトの名無しさん:05/01/22 23:18:43
みなさんはどのくらいC言語が書けるんですか?
991デフォルトの名無しさん:05/01/22 23:20:02
突然失礼します。
#include <stdio.h>
#include <string.h>
void main()
{
char data[65535];
int i, len;
scanf("%s", data);
len = strlen(data);
i = len - 1;
while(i >= 0)
{
printf("%c", data[i]);
i = i - 1;
}
}
これで文字列を反転できたんですが、その反転したやつをもとの文字列の
後ろにくっつけるにはどうしたらいいでしょうか。
strcatを使おうとしたんですがいまいちうまくいかなくて…
よろしくお願いします。


992デフォルトの名無しさん:05/01/22 23:20:26
>>990
仕事が出来るくらい。ここ数年C++ばっかだけど。
993デフォルトの名無しさん:05/01/22 23:21:06
994デフォルトの名無しさん:05/01/22 23:21:49
なんとなく、標準化委員会の努力と
世のニーズがずれていたような・・・
995デフォルトの名無しさん:05/01/22 23:22:09
> ついでに書籍プログラミング言語C第2版のはC90

というかC89だ。
996デフォルトの名無しさん:05/01/22 23:23:00
>>995
おっと失敬
997デフォルトの名無しさん:05/01/22 23:24:03
1000Get
998デフォルトの名無しさん:05/01/22 23:25:34
>>997
フライング。
999デフォルトの名無しさん:05/01/22 23:26:47
999
1000デフォルトの名無しさん:05/01/22 23:27:16
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。