1 :
v(^o^i)d :
05/01/11 23:45:00
2 :
デフォルトの名無しさん :05/01/11 23:45:41
3 :
デフォルトの名無しさん :05/01/11 23:46:15
4 :
デフォルトの名無しさん :05/01/12 00:03:42
4様
5 :
デフォルトの名無しさん :05/01/12 00:04:13
センスねえな・・・ C99だぞ??
例えば __int64 ってのがあるコンパイラで long long と記述してコンパイルできる方法はありますの?
7 :
デフォルトの名無しさん :05/01/12 02:00:47
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 実行されないコード
>[C++ エラー] File1.cpp(5): E2209 インクルードファイル 'ERR.H' をオープンできない そのまんまだる?
なぜ#include <err.h>が使えないかがわからないんです・・・ すいませんがよろしくおねがいします。
err.hがあるのかね?
ない場合はどうしたらいれられるのでしょうか?
>13 ほかに代用できそうなものがないかあたれ
16 :
デフォルトの名無しさん :05/01/12 03:57:39
> 参考書とか読んでも本当に分かんないんです。 ごめんなさい ならその本の名前書いてみろよ! かけないだろ? 本当は読んでないくせに。
stricmpではなくstrcasecmpが用いられているところから unix系のソースを無理矢理コンパイルしている予感
18 :
デフォルトの名無しさん :05/01/12 04:45:40
Unix系なわけじゃなく、そっちが標準だろ?
標準なんてありませんが。 DOS/Windows系ではstricmpもしくはstrcmpiしか用意されていませんが。
20 :
デフォルトの名無しさん :05/01/12 05:11:18
> 標準なんてありませんが。 こいつぼけ
21 :
デフォルトの名無しさん :05/01/12 05:13:02
それにしてもstrncmpの仕様って使いにくいとおもわん? nに0渡したときは何返すべきだと思う?
では、strcasecmpが標準な規格を教えてください。 POSIX等は、標準Cとは関係ないので却下です。
23 :
デフォルトの名無しさん :05/01/12 05:15:03
POSIXがでてくるあたりでおまえぼけだな > 22
24 :
デフォルトの名無しさん :05/01/12 05:15:28
POSIX好きはむしろBSD。あれのソースはstrlcpyありすぎ
で、標準Cライブラリで「大文字小文字を区別しない文字列比較関数」が規定されているのは どの規格ですか? 早く提示してください。
26 :
デフォルトの名無しさん :05/01/12 05:23:35
ほーら もっと考えろ! > 25 googleしてもいいぞ ;-)
いやあ、考えようと何しようと、規定されてないものはどうしようもないし。
28 :
デフォルトの名無しさん :05/01/12 05:47:08
ところで10種類は?
strcasecmpが標準ライブラリに含まれる規格は? はやくだしてよ。ぼけちゃん。
キャストをマークする目的で #define cast(TYPE) (TYPE) として使ってるのですが、これって一般的ですか?
>>30 #define begin {
#define end }
と同じくらい一般的。
要するにしない方が良いということでしょうか? ありがとうございました。
33 :
デフォルトの名無しさん :05/01/12 07:59:53
ふつう #define begin { #define end ;} だろぼけ > 31
34 :
デフォルトの名無しさん :05/01/12 08:04:07
>29 UNIX互換端末で man strcasecmp を読め!
だから規格の名前を出せよ早く。いいかげんにしろよ。 ふざけるな。 この無知。 知ったかぶり。 寝ぼけてるんじゃないのか?
あ、「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
まあ、ぼけにつける薬は無いということで。
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
46 :
デフォルトの名無しさん :05/01/12 09:17:58
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だろうなあ。
レスありがとうございます。 a[i]はint,long,charなどのどれにすればいいのですか?
50 :
デフォルトの名無しさん :05/01/12 09:37:12
>49 charでぴったりサイズ
>41 これが灯台レベルとしたら、大学の信頼ガタ落ちだな(k
52 :
v(^o^i)d :05/01/12 12:07:30
お前ら落ち着け
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)の処理を行いたいのです。 どのようにすればよいでしょうか?
>>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;} こいつをもう少し短くできないでしょうか?
>>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);
>>60 ありがとうございます。
短くなって見やすくなりました。
62 :
デフォルトの名無しさん :05/01/12 15:57:18
二次元配列を全て1で初期化するにはどうすればいいですか?
訂正。 二次元配列を宣言時に全て1で初期化するにはどうすればいいですか?
1並べれば
65 :
デフォルトの名無しさん :05/01/12 16:03:23
素直にmemset汁
もうこのスレも99か。ジョブズ3世ってどこいった?
俺が2ちゃん見始めた頃にこのスレ立ったんだよなあ。懐かしい。
73 :
デフォルトの名無しさん :05/01/12 16:49:21
>>65 static宣言のところは満年齢を採用し他のところは数え年を使用していると考える。
しょうがねーPascal->C++変換でも作るか
76 :
デフォルトの名無しさん :05/01/12 18:46:28
質問します。 float や double は型を宣言するだけで速度が遅くなるんですか? 計算しないでも、型キャストなんてしてしまうと、それだけで極わずかの 遅延が発生するって事ですか? 教えて欲しいです。
>>76 変数を宣言するだけなら普通何もしないのと同じだから遅くはならないと思うが。
78 :
デフォルトの名無しさん :05/01/12 18:51:46
int型はサイズが小さくてCPUの中でもすぐに計算できるが、floatはそれより大きいし、int型などとはデータの構造が違う。変換に時間がかかって当たり前。
79 :
デフォルトの名無しさん :05/01/12 18:55:18
float型 を int型が同じ4バイトという環境なんですが、 それでも型キャストぐらいなら問題ないですか?
あ、データの構造が違うってことは、やっぱ遅れは発生するんでしょうね・・・ けど同じ4バイトだとしても、どうしてなのか不思議です。 計算して遅れが発生するのは納得がいくんですが。
81 :
デフォルトの名無しさん :05/01/12 19:01:50
>79 スーパープログラマじゃあるまいし、そんなにミリ秒の遅延が気になるのか?
>>81 ナノ秒ならともかく、
ミリ秒ならば、気にするべきかと・・・
float a=4.0, b=8.0 ; b/=a ; とかの演算だったら int型に変換してくれるっていう最適化は コンパイラに標準でありますか?
ない、っつうか、bがfloatなのにintにしてどうする。
>>83 そんなことしたら大変でしょ。
float型をfloat型で割ったものをint型に代入する、なんていう式が真っ当な物とは思えない。
>>85 なんでだよ。
耐荷重M kgのエレベーターに、平均体重m kgの人が何人乗れるか、どうやって計算する?
誤解してるね。
ありがとうございます。 よく考えたらおかしいとわかりました。
89 :
デフォルトの名無しさん :05/01/12 19:48:48
小数点の切り捨て ってどうやって行ってるんですか? やっぱ、単にシフトしてるだけなんでしょうか?
>>89 あの、えと、floatって浮動小数点数なんですが…
って、釣りですか。
91 :
デフォルトの名無しさん :05/01/12 20:02:09
>83 C++でfloatの前にconst付けると最適化されうる
92 :
デフォルトの名無しさん :05/01/12 20:10:37
93 :
デフォルトの名無しさん :05/01/12 20:12:25
>>90 つまり単なるシフトじゃないって事ですね。
じゃどうやってるんですか? マスキングかなんかですか?
93は忘れてください。 よく考えたらおかしいとわかりました。
95 :
デフォルトの名無しさん :05/01/12 21:40:40
マクロでループ処理ってできないんすか
>>96 差し支えなければサンプル見せて下さい。簡単で良いです。
俺にはできんかったとです。
>>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)
>>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>(){}
>>101 それ書くなら
template <int N>
inline void loop() {
justDoIt();
loop<N-1>();
}
template <>
inline void loop<0>() {}
スレ違いだし。
K&Rで 0より大きいか等しく、1より小さい数の乱数を発生させるのに、 #define frand() ((double)rand()/(RAND_MAX+1)) をつかってますが、gccでコンパイルするとオーバーフローみたいな エラーがでます。 どうすればよいのでしょう? お願いします。
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
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 常識!
StrikeBreaker スト破り
112 :
デフォルトの名無しさん :05/01/13 14:00:12
構造体の複数のmemberを参照する時に"."とか"->"ではなくて 配列で、[i]番目のmemberって感じで参照できないんでしょうか?
>>112 Cではミリ
C++ならboost::tupleで代用できなくもないけど
114 :
デフォルトの名無しさん :05/01/13 14:11:57
>>113 ありがとうございます。
なんか効率的じゃない気がしたもので・・
ということはwrite()/read()で構造体に入れてあるデータをファイルに
書き込み/読み込みする際も、その都度複数のmemberごとにbufferを./->で
指定しなきゃいけないってことですよね?
>>114 そんなことはない
ただ構造体メンバにポインタが含まれている場合は
ポインタの参照先までちゃんと書き出す処理を自前で書かないといけない
116 :
デフォルトの名無しさん :05/01/13 14:19:00
>>115 ありがとうございます。
そうすると、pointerがmemberに含まれていない構造体を一気に
write/readする時はどのようにすれば良いのでしょうか?
構造体を一気にwrite/readすれば良い。
118 :
デフォルトの名無しさん :05/01/13 14:24:33
>117 bufferの部分はなんと書けばよいのでしょう?
intをfwrite/freadする時と全く同じに書けばよい。
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));
文字化け… 文字列でも書き出そうとしてるんですかい? 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); としています。
>>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 ありがとうございます、試してみたところ問題ないようでした^^
>>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)を得たいのですが、 簡単な変換方法はないでしょうか?
>>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; // 一致しない } という関数でやってます。 これより良い方法があればご教授下さい。
不一致の場合は-1を返さないとダメ?
134 :
デフォルトの名無しさん :05/01/13 18:36:43
>>130 y = log((double)x) / log(2.0);
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
ちょっとは誤差とかも考えろよ。 log(x)/log(2.0) <- 両辺とも整数になりようがない
浮動小数点使わない方法ないの?
ある
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);
}
それはビットカウント
>>144 それはビット数数えるだけでそ。
シフト数を調べたければ、(例外を弾いてあるとして)
int n=32, nb;
nb = numofbits5(~((unsigned long)0) + n;);
だろ
かぶった orz
いいねこれ。 いつ使えるかわかんねけど。 つーかどっかで見たな。 Cマガだったかな。 たしか何かの特集で得意げに紹介されてたよ。 小手先馬鹿だね。
tp://www.nminoru.jp/~nminoru/programming/bitcount.html#leading-0bits
150 :
デフォルトの名無しさん :05/01/13 21:16:10
エクセルでボタン作って、そこを押すとランダムに数字がでるプログラムをつくってもらえないですか
152 :
デフォルトの名無しさん :05/01/13 21:53:03
105>>かしこ
153 :
デフォルトの名無しさん :05/01/13 21:55:13
ニュー速から来ました。 記念カキコ
154 :
デフォルトの名無しさん :05/01/13 23:13:04
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 ~ % 型が違っているようには思えないのですが 何かアドバイスいただけますか
get_func()の返却値はdouble* fpはdouble (*)(double)
何故get_func()の中でdouble *にキャストしているのだろう・・・
>>155 関数ポインタをそのままけ返せばいい
double (*get_func(void))(double)
{
〜
return fp;
}
160 :
デフォルトの名無しさん :05/01/14 00:07:37
GCCとやらをインストールしたいんだがどうすればいいんだ? OSはWinXPだ
>>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;
}
修行してきます…
>>160 a.exe できてたよ…
そして期待した結果になってたよ…
もっと落ち着くことを覚えたいと思います
陳謝
英語なんか読めるか ぼけ
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です
どなたかご教授願いします
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 ・・・・俺もヤキ回ったな・・・・ 何見てんだよまったく
そういえば焼肉食べた。
170 :
デフォルトの名無しさん :05/01/14 00:49:28
while (*s) { k=char(*s); k=k&0x000000ff; h0+=k; cout<<h0<<endl; *s++; } このループってどうなるとループから出るんですか?
sがオーバーフローして0に戻った時
'\0'文字に出会ったとき、 つまり文字列の終端で終了 printf("%s", s); と同じ
173 :
デフォルトの名無しさん :05/01/14 01:06:56
ありがとうございます
>>175 __VA_ARGS__はつい最近のコンパイラでしか使えないんだよなあ。
まあ正式な規格のものだから古いコンパイラに移植なんてことが
なかったらそれでいいけど。
古い奴も頭に入れる場合は、
#ifdef DEBUG
#define DebugPrint printf
#else
#define DebugPrint 0 && printf
#endif
とかやって最適化でprintf〜が消えることを期待する方法がある。
19 188 とかの数字を 10のように最後が0になるよう変換したいんですが、 何かいい方法ないですか? シフト演算とかビット演算みたいに簡単に変換したいくて、 割り算は使いたくないんです。
したくて、でしたね
180 :
デフォルトの名無しさん :05/01/14 06:32:34
>>177 *10 でいいんでねーの?
本意じゃないだろうけど、その文じゃ意味不明。
普通に理解できるだろ 19 →10 188→180
>>177 int floor10(int val)
{
char buf[12];
sprintf(buf, "%d", val);
buf[strlen(buf) - 1] = '0';
return atoi(buf);
}
さっぱりわからんが /10*10ということでいいのか?
除算禁止が条件らしい
>>182 も sprintf 内部じゃ10で割りまくりだから、だめだろ
つーか181でやっとわかった 181はエスパーか?
>>177 int floor10(int x){
int y = 10;
for (;y <= x; y+=10)
if (x - y < 10)
return y;
return -1; // 解なし
}
割り算を使ってないというだけだが
>>177 乗除算を使用するのが最も簡単。
何故、除算禁止にこだわるのか、理解に苦しむ。
>>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
先生、%は除算に入りますか?
除算は300円まで
8進数なら & ~7 でいいんだけどねぇ。
Borland C++ Compiler 5.5ってWinXPでも動きますか?
ファイルがバイナリかどうかを調べる方法ってありますか?
文字コードから外れているものがあるかどうか調べる
人間がテキスト表示したものを見ると エンコードミスによる文字化けなのかバイナリなのか結構わかるもんだけど あれはどういう基準なんだろう
秩序の有無や、過去に同じような文字化けを見たことがある、等じゃない? 詳しくは認知心理学でもやってくれ
写真を見て、海か川かを判断できる事といっしょだ
適当に改行が入っているか、適当に空白が入っているか、 読めない文字の並び方に連続性がないか適度に再現性があれば文字化け。
>>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;
}
双方向リストに文字列を蓄えたいんですが、 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"というようにプログラム中でそ のまま指定した場合は、そのとおりに表示されました。なので上のプログ ラムがおかしいと思うのですが。
>>203 data.name が指す領域は誰が確保して誰が解放するのか考えてみましょ
う。
>>202 よく読んでないが、加減算とシフトを使って割り算を書いてるようにしか見えん。
つか、それでいいんではw 割り算使うな=割り算えみゅれ
>>205 やべーボクすごいとか思ってるんだからほっといてやれよ
こういうことだろう
int waru10(int x)
{
return (x
>>3 )<<3+(x
>>1 )<<1;
}
たぶんね
>>205 えーっと、4ビットずつBCD変換して、(最下桁の総和 mod 10) を
元の数から引いてます。ループは最大でも (sizeof long * 2) 回。
>>208 waru10() という関数名と処理が乖離しまくってますが。
まあ、パズル的に解くのは楽しいけど 最近のプロセッサは整数の割り算なんか、全然重い処理じゃないしなあ。
211 :
デフォルトの名無しさん :05/01/14 22:05:36
>>210 むしろ、最近のコンパイラは最適化があるから、
この程度のことでわざわざループやら加算の繰り返しやらを
行ったらどんなプロセッサでもまず間違いなくパフォーマンスが下がると思ふ。
よって、そのことについて言及するだけ無駄でしょう
しかし質問の意図が見えないよ・・・
>>211 前にPen4なら1サイクルと聞いたが・・・調べてないので保障しない
いつもお世話になっております先輩ども 今回聞きたいのは「void*」って戻り値についてです アレですよ 何だよコレ戻ってんのかYO! voidって何も戻らないんじゃないのかYO! って話です ご教授宜しく哀愁
214 :
デフォルトの名無しさん :05/01/14 22:19:21
>>212 もう一度聞く、何サイクル? 面積は??
面白いと思って書き込んだ、渾身のネタなんだろうな。
>>213 void*はなにを指してるのかわかんないけどとにかく何かを指してる(かもしれない)ポインタの型です。
なにを指してるのか不明なのでこの型のポインタはポインタ演算のほとんどができません。
プログラマはこの型のポインタがなにを指しているのか知ってることが期待され、
その型にキャストして使います。
Cでプロセス間通信に共有メモリを使っているのですが、共有メモリで 2次元配列型のデータを扱うことはできるのでしょうか。
219 :
186 :05/01/14 23:22:42
皆さま、様々なご解答ありがとうございました。
特に、
>>202 さんの解答には驚きました。
x=floor10(99988883) ;
とか送った場合、わずか6回のループで済んじゃったわけですが、
これが、
>>189 さんのおっしゃるニュートン法ってやつなんですか?
検索してみたところで、数学が苦手でさっぱり訳がわかりませんでした。
どういう考えの元で、このようなやり方を思いついたのですか?
半分不可能と思っていただけに、ホント驚きました。
ありがとうです。
あ、
>>209 の方が解説してくれてますね。
すいません、少し焦っちゃいました。
ループ=分岐が入る この時点で、実行速度的に(もちろんサイズ的にも)かなり不利になるけどね
例えばa[3][3]という2次元配列を共有メモリで使いたい場合、 変数宣言とshmgetとshmatの記述はどのようにすればいいのでしょうか。
>>222 >shmgetとshmatの記述は
この部分はスレ違い。
a[3][3]を指すポインタは(仮にcharだとして)
char (*p)[3];
になる。
どうもありがとうございました。 大変参考になりました。
226 :
デフォルトの名無しさん :05/01/15 00:21:18
宣言できる配列の要素数はメモリの量によって変わるんですか?
229 :
226 :05/01/15 00:29:32
>>227 intの要素数を100000位使いたいのですが、出来ますか?
>>229 スタックサイズによります。
大体1MBほど使えるかもしれませんが、実装やいろいろな設定で変わってくるでしょう。
もし、多くの領域を使いたいのであれば、ヒープ領域から確保するべきです。
そうすれば、安心できるでしょう?
>>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);//確保したら開放しないとダメ。メモリは再利用…
>>231 90000/10 だとコンピュータ内部だと、9000回10を引いているのだと
思っているからです
だと
はふはふ
さっきから考えてみてたんですが、
>>202 さんのって
BCDコードに変換してる訳じゃないんですね。
ぱふぱふ
さすがに
>>234 は本人じゃないだろ。あまりにも・・・過ぎる。
もし本人なら、真面目に考えた人が浮かばれん。
俺はパズル以外に意義を見いだせなかったから、全然考えてないけどな。
>>233 ありがとうございます。
a = (int*)malloc(sizeof(int)*100000);
これだと400kb位?使っている事になるんですよね?
>>240 では問いますが、除算はどのように実現されているので?
除算回路なんて一般のCPUに組み込まれているんですか?
その辺はよくわからんですが、普通加算回路しか入ってないと思ってるんですけど。
いや、ほんとよくわからないんですけど。
あまりにも・・・過ぎて申し訳ありませんねぇ
いわゆる筆算と同じ方式でやってるんじゃなかった? 引き戻し法とか
なんで割り算ごときでBCD変換だのループだの出てくるわけ? コードが美しいわけでもない、速度は遅い、無駄に変数使う。。。 そのアルゴリズムの優れている点はどこなの? 勉強したての人がそういうの見てお手本にしたら可哀想だろうに……
だからBCD変換じゃないって・・・
コード読んでないけど、
>>209 でなんか言ってるじゃん。
>俺はパズル以外に意義を見いだせなかったから、全然考えてないけどな。 >コード読んでないけど 同一人物でつか?
もう、何がなんだか
> コードが美しいわけでもない 自分は結構美しいコードだと感じたけど。
>>247 同一っつーか、俺はこの話題については
>>210 >>221 >>240 位しか書き込んでないよ。
で、プロセッサの除算は、いわゆる筆算のアルゴリズムを使うが、
最近のプロセッサは、テーブルを使って一発で結果を出す方法も併用していると思う。
少し前にPentiumのバグで回収騒ぎがあっただろ?
あれは浮動小数の方だけど。
なるほど、とんだ馬鹿な思い込みだったみたいですね。 少し前にPentiumのバグで回収騒ぎなんて話題も知りませんでした。 じゃあ、普通に割り算してたほうが早かった、って事か・・・ けど、ホント勉強になったんです。問題考えてくださった方はありがとございました。 あとついでと言っちゃあ何ですけど、static const int の static がもしなかったら、 関数が呼ばれるたびに初期値が代入されて無駄が発生するって見解は正しいですか?
正しいよ
よかった。ありがとうっす
goto文使うともっと速いらしいぞ
いまどきのコンパイラちゃんなら最適化してくれそうな気もしなくもない
真面目に考えてた人、ご愁傷様でした。
昔、除算命令で商と余り一度に取れたよね。いまのはどうなんだろ。
今もそうよ。 標準ライブラリにldivというのもある。
261 :
デフォルトの名無しさん :05/01/15 03:52:43
ファイルをオープンして書き込みするってのは処理としては早い?遅い?。 ゲーム作っててデバッグ用にどこの場所を通ってるか調べるのにLOGを とりたいんだけどゲームみたいに中で一定の速さが必要なものを作る時 ファイルの書き込みを使ってもスピードに支障はでないレベルでしょうか? ファイル操作+速度に関して知っておられる方おりましたら助言よろしくです。
ディスクのシーク+回転待ちでかかる時間が5-15ms程度。 OSやファイルシステムにも依るが、書き込みはこれを数回繰り返す。が、 ・全部同期で書き込む ・ジャーナリング等の情報だけを同期で、データ本体は非同期で書き込む ・全部非同期で書き込む 等々があって、実際のwriteでどの程度かかるかは環境依存。 その上、Cライブラリのレベルでバッファリングしているから fwriteやfprintfで実際にシステムコールが呼び出されるかはわからない。 ログの量がある程度以下と想定できるなら、 setvbufによって、事実上ディスクアクセスをfclose時だけにすることも可能。
263 :
デフォルトの名無しさん :05/01/15 07:09:03
>>261 速度を保証する必要があるならファイル操作ではなく物理ディスク
↑バカ
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 ) ; ちょっと省略しますが、こんな感じで新規のファイルを作ろうと思いました。 しかし、出来上がる場所が実行ファイルと同じ場所と思ってたんですが、そうでも ないみたい。なぜ?? どうにかして、場所を指定できないですか?
>>265 普通ファイル名だけを指定するとカレントディレクトリを指定したものと見なされる。
どこかから実行ファイルの場所を得て、そこへファイル名をくっつけて使え。
おぉ! なんとか出来ました。 けど、 > 普通ファイル名だけを指定するとカレントディレクトリを指定したものと見なされる。 自分も、そう思ったんですけど、出来上がる場所はなぜか C:\Program Files\Common Files\System\Mapi\1041 これは _write とかの仕様なんですかね。
一応、
1. プロセッサが除算をサポートしていないか、あってもコストが高い
2. 実行速度を最優先
というつもりで書いたんだけど
>>253 あぁそうでつか…orz
>>267 たぶんおまえのプログラムの他の処理でカレントディレクトリを
移動しっぱなしの処理があるんだろ
271 :
デフォルトの名無しさん :05/01/15 12:34:51
> free(a);//確保したら開放しないとダメ。メモリは再利用… するなよぼけ > 開放 するなら「解放」だぼけ。
272 :
デフォルトの名無しさん :05/01/15 13:17:11
>>226 ふつうに int array[100000]; で確保すればいい
どっかのぼけが「多くの領域」を定義せずにヒープがどうのと言っているが
そういう井の中の蛙は free についても人のコードを自分の環境に合わさせようと画策するから
言うこと1つずつうざいくら疑ってかかれ
決してああなるな
>>272 ・・・すげーネタレスだな、おい。
最低限、 size_t 型で表現できる分の配列しか
宣言できないぐらいの事は書けよ。
>>226 言うこと1つずつうざいくら疑ってかかれ
決して
>>272 の様になるな
274 :
デフォルトの名無しさん :05/01/15 13:33:27
>size_t 型で表現できる分の配列しか アホ
278 :
デフォルトの名無しさん :05/01/15 20:19:50
10進数を2進数にする、一番簡単で短いプログラムってどんなのですか?
また三田レベルが来たか
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)]; こんな風にしたいんですけど、エラーでちゃいますよね。 どうしたらいいんですか?
>>283 C99ならできるよ。
おたくのコンパイラが古いだけ。
ぅありがとぉう
>>287 仮想の代物であるC99完全対応のコンパイラなんて、現時点に於いて期待する方がおかしい。
290 :
デフォルトの名無しさん :05/01/15 22:27:42
mallocで二次元配列を確保できますか?
解決しました。
>>290 a[i][j]のようにアクセスできる領域は作れる
最初っから要素数がわかってる場合は簡単。
そうでない場合は
>>292 の言ってるように少しややこしい
喧嘩、良くない
ミスターポポの口でイマラチオしたい
300 :
デフォルトの名無しさん :05/01/16 06:42:14
> 仮想の代物であるC99完全対応のコンパイラなんて あ、またVC厨がわいてでた ;-)
10種類は?
302 :
デフォルトの名無しさん :05/01/16 12:36:34
unsigned long long intの使えるコンパイラー10種類なんて、すぐに名前あげられそうなもんなのに。 なんでそんなにひっぱるんだろ。
いまんところ1種類も出てないわけだから、C99完全対応のコンパイラ は仮想とするのは、このスレ的に真
part99だし、C99使ってもいいか。
305 :
デフォルトの名無しさん :05/01/16 13:25:36
> いまんところ1種類も出てないわけだから、C99完全対応のコンパイラ このお題目をとなえれば、VCの存在が正当化されるとでもおもってるんだろうなあ。 毎回これしかいわないんだもの ;-)
使えなものを使えという理不尽さ。
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つかってるんだよ!
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厨
うんこー!!
誰もVCなぞ話題にしてないのだが。VCの素晴らしさがそんなにくやしいですか?
みんな!!!うんこトークしようぜ!!!!!
319 :
デフォルトの名無しさん :05/01/16 13:40:33
まあ、たしかに gcc -std=c99 で何も不便は感じないな。 おれの知ってるかぎりのC99の機能は使っているが。
まずstdbool
321 :
デフォルトの名無しさん :05/01/16 13:42:56
-std=C99すれば、#include <stdbool.h> して、なーんにも問題なく boolもtrueもfalseも使えるぞ。 おまえ使ったこともないのか? > 320 やーい。ぼけすぎ
*p++=*q++
323 :
デフォルトの名無しさん :05/01/16 13:44:29
Cの基本だな > *p++ = *q++; 昔のCから一番かわってない部分。
>>321 a-ha、so 10 of compilers, you know?
その前に80種類のコンパイラーだろ?
326 :
デフォルトの名無しさん :05/01/16 13:46:20
ofじゃないな
うんこー!!! おいしいよこのうんこ!!
^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
なんや。このスレも結局HSPスレと同レベルやん。
331 :
デフォルトの名無しさん :05/01/16 13:50:33
VC厨がおおいからね
今ごろ気付くなって・・・
334 :
デフォルトの名無しさん :05/01/16 13:51:47
つまり、gccなりなんなりの普通のコンパイラーで、どこがC99準拠に足りてないか さえしらないわけ > お題目をとなえれば受難が通りすぎるとおもっているVC厨
週末当番ご苦労様であります!!!!!!
>>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...
一人芝居ご苦労様であります!!!!!!
345 :
デフォルトの名無しさん :05/01/16 13:59:10
>>344 ここはC言語のスレじゃないの?
なんかよくわからんが俺も頭悪いので、
素直に言うこと聴いて、探してみます。
手取り足取りとは言わないまでも、
あまりにも基本的なことを質問できるスレってどこかあります?
大原ゆきなら長々と説明してくれるよ!
347 :
デフォルトの名無しさん :05/01/16 13:59:34
> Hello worldの次はどんなプログラムを作れば良いんだ hello kittyです。それができないようでは先にすすめない。
348 :
デフォルトの名無しさん :05/01/16 14:00:18
> 本にはHelloworldの後はもう簡単な説明してくれないから、 これウソ。まるで読んでいる本が悪いかのように言っているが、こいつはどの本も読んでない。 読んでたら本の名前書けるはずだもんなあ。
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に別のアドレスを割り当てなくても大丈夫なのでしょうか?
スレ違い
351 :
デフォルトの名無しさん :05/01/16 16:27:22
>342 時間割やアスキーコード表など何でもいいから、テキストかHTMLの表を出力するプログラムを書け。
352 :
デフォルトの名無しさん :05/01/16 18:14:14
int hoge; の値によって処理を分岐させたいのですが、 ifとelse ifでネストさせて分岐させるのと switch(hoge)で分岐させるのでは、 処理速度に差が出ますでしょうか? 将来的に分岐が増えそうなので switchを利用したいと思っているのですが、 両者に大きな処理速度の違いがあるのか疑問に思いました。
>>352 実際にコード書いて試してみようとはしないのか。
354 :
デフォルトの名無しさん :05/01/16 18:17:15
>352 確率に大きな偏りがなければ、迷わずswitchを使え。
定期的に出るな。このネタ
356 :
デフォルトの名無しさん :05/01/16 18:20:57
>>356 なるほどー
関数ポインタという手もあったんですね。
勉強になりました。
>>354 switchが可読性が良いので、そっちを利用する
という意見があるようですね。
ありがとうございました。
あと、Part98にも同じ質問がありましたね…
すみませんでした(´・ω・`)
またいつもの方が来てたのね
359 :
デフォルトの名無しさん :05/01/16 22:15:04
> switchが可読性が良いので それうそ
360 :
デフォルトの名無しさん :05/01/16 22:15:32
Win厨 Tシャツをつくっておまえらに着させようかな
関数名("hoge"); と言う書き方で文字列を一つずつ画面に表示する関数は作れますか?
何をやろうとしているのかよく分からないが たぶん作れる。
363 :
デフォルトの名無しさん :05/01/16 22:51:33
>361 f(char*p){int i=0; while(p[i]){ putchar(p[i++]); putchar('\a'); sleep(100); }}
ぴー、ぴー、ぴー
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); }
>>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を入れ直してもダメでした。。
改行してないからプロンプトに上書きされてたりして。 #詳細は該当スレにて。
プロンプトの左に出てなきゃ、'\r'で上書きされてるんだろうな。
>>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命令はないでしょうか よろしくお願いします。
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で止まってしまうようで、
文字をいれてリターンをいれても、また入力待ち状態になってしまいます。
なぜなんでしょうか。。。
scanf使うな fgets+sscanf推薦
whileの部分間違えてました。 while('\0'!= *s){ j++; s++; }
(`_ゝ´)アッソ
while(*s != '\0'){ (*s)++; s++; } s =s - j; printf("%s \n", s);
>>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です。
宿題は(ry
384 :
デフォルトの名無しさん :05/01/17 03:29:54
386 :
デフォルトの名無しさん :05/01/17 03:41:09
387 :
デフォルトの名無しさん :05/01/17 06:42:40
> それが、どうやらscanfで止まってしまうようで、 だから使うなっていっただろ ぼけ
388 :
デフォルトの名無しさん :05/01/17 11:21:50
使わざる者食うべからず
↑意味不明 それを言うなら 触らぬ神に祟りなし だろ
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.
>>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進数の方が見やすい。
>>396 書いたヤシに聞け。
おそらく、16進数の方がわかりやすいからだと思うが。
>>392 何のエラーだよ。
>>396 bit毎に変化がある値が読みやすくなる。
コンピュータ相手の場合は2^n進表現にすると色々と都合が良い。
コンパイル時間はあまり関係ない。
ただし16進文字列だとn<<=4で桁の繰り上げができるので、
10進の掛け算(n *= 10)よりは効率が良い。
8進はn<<=3、2進はn<<=1。
>>396 それはあなたの思考パターンに人間らしさが残っているから
>>397 > ちなみに俺様の場合、8進数の方が見やすい。
PDP世代の生き残りですか?
402 :
390 :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 が成り立ってしまうんです。
>>392 は読んでないが、システムコールとか入出力関連でエラーが起きたら、
迷わず perror しろ。
if (... < 0) perror("write");
405 :
デフォルトの名無しさん :05/01/17 13:59:27
>402 スタックじゃなくて、ヒープから(mallocで)切り出すか、システムコールで仮想メモリを得るか、ファイルで仮想メモリをバリバリ実装するか、使わないブロックを圧縮する方法がある。コンパイラのオプションは何だ?
406 :
392 :05/01/17 14:03:30
>>404 perror("write")だと実行時にfile descripterがだめだと出てしまいます。
引数に"write"と書くだけではないのでしょうか?
>392 なんかわかりにくいから 単純なテストコード書いて試してみれば? openしてwriteしてcloseするだけのやつ
408 :
デフォルトの名無しさん :05/01/17 14:09:24
>406 だったらfdを疑え。本当に開かれてるのか?
409 :
392 :05/01/17 14:09:36
勘違いしてました・・。 つまりfd自体に問題があるってことなんですよね・・。
410 :
392 :05/01/17 14:12:59
>>407-408 すいません、アホでした。
しっかりファイルが開けないと出てました。
fd = open("C:\\fooscore",
O_RDWR | O_CREAT | O_RAW, S_IWRITE | S_IREAD);
↑どこが間違っているのでしょうか?
411 :
392 :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
定数は左に書くよ派の人が現れないね。
ご教授ありがとうございました。
char *p ; p=(char *)malloc(1); とかするんですけど、(void*)型で、しかも同じ8バイトなのに、 大体こうやるのはなぜですか? ただ見やすいからなのでしょうか?
417 :
デフォルトの名無しさん :05/01/17 18:25:20
>416 voidは文法チェックのため、後から導入された型。char*をvoid*と同じ意味で使うのは時代遅れか、やっつけ仕事の時のみ。
>>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;
>>416 >しかも同じ8バイトなのに
何が 8 バイトだと言うのかね?
4バイトでしたか
>>420 試したとして、なにがわかるのでしょうか??
おそらくC++なのでしょうか? よくわかりません。
423 :
デフォルトの名無しさん :05/01/17 18:48:44
>420 C++で失礼。 printf("%p\n", ...); で調べてみ
>>422 >4バイトでしたか
何が 4 バイトよ?
425 :
デフォルトの名無しさん :05/01/17 18:56:23
lintって今は使われてないんでしょうか? gccといっしょに使えるやつがあったら教えてください。
環境によるのでしたか
>>423 すみません。訂正していただき嬉しいです。
printf("%p\n",&(((char*)0)[1]));
で、いいですか?
見る限りではアドレスの移動量が違うって感じですか。
いま試せる環境がないので、あとで試そうと思います。
64bitではsizeof(void*)==8. 32bitでは4. void*pv;と宣言するとpv[1]は文法的にダメ。
>>426 >環境によるのでしたか
「何が」環境によるのよ?
アドレス。 Windowsでは32ビット・・・
430 :
デフォルトの名無しさん :05/01/17 19:01:30
>426 そう。答えは1,2,4だろう。
431 :
デフォルトの名無しさん :05/01/17 19:08:58
>>427 なぜ駄目なのでしょう?
やはり文法チェックのためだけに作られた型だからですか?
pv[1]は容量が確保できないって良いのでしょうか?
いいって
433 :
デフォルトの名無しさん :05/01/17 19:19:05
>431 void*はあらゆるポインタ型を抽象化した型で、あらゆるポインタをキャストせずに代入できる。 f(void*p);という関数はf(char*)と互換だが、逆は不可。 sizeof(pv[1])==sizeof(void)==???
てすと
このようにvoidの使用は不便な点も便利な点もある。何か質問がなければ答えない。
436 :
デフォルトの名無しさん :05/01/17 20:24:15
>>433 エラーと警告を混同してる香具師ハケーン
437 :
デフォルトの名無しさん :05/01/17 20:45:21
>436 どこに派遣するの?
438 :
デフォルトの名無しさん :05/01/17 20:51:13
やーい、反論できねえ (プ
440 :
デフォルトの名無しさん :05/01/17 21:02:40
そもそも勝負なんかできなかったヒヨッ子がなにをか言わんや
441 :
デフォルトの名無しさん :05/01/17 21:11:14
ピーターパン症候群になりやすい性格と診断されたので気を付けて>438-439
非GPLなgetoptのソースってない?
>>436 どこにエラーとか警告とかについて言及しているの?
444 :
デフォルトの名無しさん :05/01/17 21:24:04
>>443 うん、してる
ああ、おまえもわかんねえのかw
>>444 何も言わないで理解してもらおうなんて、考えが甘いんじゃない?
>>444 その調子で、誰も理解してくれないからって、引き篭ってきたんとちゃうの?
447 :
デフォルトの名無しさん :05/01/17 21:32:14
>>445 別に俺が言う必要ねえんだよ
ISO が言ってくれてるから
448 :
デフォルトの名無しさん :05/01/17 21:32:38
こらー、仲良くしなさーい!
8:知能障害を起こす って起せるものなのか?
451 :
デフォルトの名無しさん :05/01/17 21:37:53
>449 君の頭、外科手術したげるね
なーるほど
>>442 BSDライセンスでよければ、FreeBSDとかにでも入ってるでしょ
ほっ、ほぁーっ! ほぁーっ!! ぬるぽ
>>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ブラウザでも見れますし、
ちょっと気の利いたエディタならたいがいちゃんと編集もできるでしょう。
IEブラウザなら見れるんじゃね?
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や必要な処理はこのあとで
465 :
デフォルトの名無しさん :05/01/18 11:01:35
printf("\x1b[2A"); と書いてもカーソルが移動しないで"2A"と表示されてしまう んですけどなんか間違ってます?
466 :
デフォルトの名無しさん :05/01/18 11:02:22
>463 小学生に掛け算教えてもらえ。 callocや#define talloc(n,type) 使えば簡単なのに
>>465 質問するスレから間違ってます。
OSやコンパイラくらい書いてくれ。
468 :
デフォルトの名無しさん :05/01/18 11:14:57
>465 NT系か9x系か知らないが、コンソール端末で C:\> adddrv ansi.sys を実行した後、その端末でプログラムを実行してみろ。
469 :
465 :05/01/18 11:17:07
>>467 OS:WINDOWS 2000
コンパイラ:visual C++ 6.0
です。
これってC言語だけのエスケープシーケンスじゃないんですか?
>>469 C言語とは関係ありません。
2000でソレをやりたかったら
CONFIG.NTにANSI.SYSを追加して16bitコードを吐くコンパイラを
使用しないとダメ。VC6.0ではprintfではできません。
471 :
465 :05/01/18 11:21:05
>>468 コマンドプロンプトでC:\>adddrv ansi.sysを実行するという意味でしょうか?
試してみましたが、その後プログラムを実行してもやはり同じでした・・。
472 :
デフォルトの名無しさん :05/01/18 11:23:41
NT系だと、dosx使う方法もあるが(ry
473 :
465 :05/01/18 11:26:34
>>470 え・・そうなんですか。
なんで課題で出たんだろう・・・、学校もVC6.0なのに。
では現在の環境で、カーソルを移動させる手段が他にあるのでしょうか?
現在時刻を同じ場所で上書きして表示させるプログラムを書きたいのですが・・
474 :
デフォルトの名無しさん :05/01/18 11:28:49
>473 '\r'出力か、<conio.h>使えば〜?
475 :
465 :05/01/18 11:43:41
>>474 "表示するフォーマット\r"でできました、ありがとうございました。
>470 dosx使えば32bitの混合コードも受け付けるんじゃなかった?
突然教えてちゃんでごめんなさい なりふり構ってられなくて、、><; 問題 与えられたグラフGに対しKruskalの算法をもちい最小木を求めるプログラムを作る。 条件1・採用した辺からできる部分グラフの連結成分を保持するデータ構造において、 linkを行う際にunion by rank だけ取り入れたものとunion by rank と path compression を 併用したものの両方を作成。 条件2・四則演算、比較、代入の総数を計測し、最小木とともにその総数を出力すること
479 :
デフォルトの名無しさん :05/01/18 12:02:40
>477 落ち着いてテキスト読め。グラフ理論の用語が分からないなら数学板に行け。グラフを表すデータ構造が分からないなら聞くがよい。
いや、ここで聞くな。宿題スレ逝け。
>>463 「ダブルポインタ」とかいう一般的でない言葉を使うのはやめれ。
で、「200」とか「10」とかいう数字をキミのプログラムは知っている
ではないか。それをどこかに保存すればいいんですよ。
>>463 ついでに言うと、それは正確には多重配列とは言わない。
( ´∀`)ダブルぬるぽ
>>483 いやまて、最初のぬるぽは
次のぬるぽを指してはいないぞ。
いずれにせよ
| |
| | ガガッ
( ・∀・) .人
と ) < >_∧∩
Y /ノ .人`Д´)/ ←
>>483 / ) < >_∧∩
_/し' //. V`Д´)/ ←
>>484 (_フ彡 /
>>466 配列全体のサイズではなく要素数を取得したかったです。
質問が間違っていました。
>>481 一般的いでない言葉は使わないようにしておきます。
200、10(要素数)を静的に保存するのはヘボくないですか?
スマートに任意のタイミングで計測できないかが知りたいです。
>>482 はい分かっています。
>一般的いでない言葉は使わないようにしておきます。 ×ダブルポインタ ○ポポインタ
>>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);
}
みたいなー。
>488 吐きそう。ゲー。その上、こんな低次元の処理で構造体使うか? calloc,_msize…、やめた、どうせ人の忠告聞かないんだから。
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 おまいは簡単な変数の加算もできないのか
ヘボくても仕方ないよね
497 :
デフォルトの名無しさん :05/01/18 19:40:00
>>490 ヒマ人に合わせてらんねーの
おぢさんたちわ
> ダブルポインタで確保した多重配列の現在のサイズを取得したい する必要はない。
500 :
デフォルトの名無しさん :05/01/18 20:17:31
>>486 mallocで領域確保する時の要素数は変数の値が多いから無問題
501 :
デフォルトの名無しさん :05/01/18 20:24:52
あらかじめ全体のサイズを計算していれば、malloc一回呼ぶだけでも二次配列のようなものは確保可能。
VCが相当羨ましいようだな
VCの問題なの?
暇だったら>501のマクロか関数を書いてくんろ
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));
どなたかちょっと前(Part98だったかな?) 「これは左辺値ですか?」 「違います」 って感じのやりとりがあったと思うんです。あそこらのキャッシュ持ってないでしょうか? 持ってたらぜひにでも、あっぷお願いします。
>>507 ご親切にありがとうございます!
無事ダウンロードさせて頂きました。
本当にありがとう!
509 :
デフォルトの名無しさん :05/01/19 03:06:17
文字列の最後に改行を入れたいのですが a[30]="\0" とやっても改行が入らないのですがどうすればいいんでしょうか?
そりゃあ改行は \n だからな。入れ方にも問題あるし。
>>509 a[30] = '\n'; a[31] = '\0';
つーか、それエラーだろ。
>改行 \0 は NUL
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はかなりのしろーとの知ったかぶり ;-)
man asciiすりゃ出てくるものを意気揚々と書かれてもなあ…
517 :
デフォルトの名無しさん :05/01/19 04:54:09
はあ? それさもしらないやつが2人もいたから書いたわけだろ? やっぱり516のぼけは 自分のぼけをごまかせるとでも思っているようだ ;-)
えーと516なんですが、私が他になにを書いたと?
最近のがきはうざい、報告書は簡潔にね
520 :
デフォルトの名無しさん :05/01/19 06:50:59
ようは、まぬけをさらしたのをごまかすために相手にケチをつけたかったのね ;-) > 519
521 :
デフォルトの名無しさん :05/01/19 09:17:58
非公開関数って知ってます? どんなの知ってます?
522 :
デフォルトの名無しさん :05/01/19 09:22:54
>512 何の?
>>433 Cの場合はvoid*はあらゆるポインタ型にキャスト無しで代入できるのですが.
524 :
デフォルトの名無しさん :05/01/19 09:25:24
>522 誤爆。 >521 何の?
525 :
デフォルトの名無しさん :05/01/19 09:33:14
>521 例えば公開ヘッダーの関数宣言を意図的に削ったり、関数定義にstaticを付ければ非公開だろ
>>525 宣言を削っても非公開にはできないわけだが。
527 :
デフォルトの名無しさん :05/01/19 11:08:55
>523 は本当? けどキャストはした方がいくない?
>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なんでしょうか? 諸先輩方、教えてくださいませ。お願いいたします。
そんなはずはないよ 間違っているのは君の入門書だ。
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++だとどちらのやり方も書ける。
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.) こんな感じです…。
536 :
529 :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
スレチガイ すまん
int a=1; は初期化を伴う宣言だ。代入文ではない。なお、C++では可 激しく嘘 Cでも可 ;-)
>>539 >int a=1;
>は初期化を伴う宣言だ。代入文ではない。なお、C++では可
>激しく嘘 Cでも可 ;-)
どこに嘘が?
Cで不可とはどこにも書いてないと思うのだが。
>C++では可 Cでは不可ととれる
542 :
デフォルトの名無しさん :05/01/19 12:55:26
昔のCではダメ。今のCではOK。
544 :
527 :05/01/19 13:01:24
>>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;
なんかも可能なわけだ。
このスレの信頼性が下がった…orz
「データ入力及びデータの表示を行なうプログラムを作りなさい。一件分の入力処理は input_data()で、表示はdisplay_data()と処理を関数で分けて行ないなさい」 という問題があるのですが、「一件分の入力処理はinput_data()で、表示はすべてdisplay_data()で 処理しなさい」ということですか??
中途半端な知識の人が多いのね。 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に信頼を求めるのはあかんでぇ〜
参考程度にしときやぁ〜
おいっす
Cで組んだプログラムを可視化したいのですが (a[x][y]=1(1なら赤)みたいな感じで…) なんか方法ないですか?;;
>>558 可視化とはプログラムが見えないとな!?
冗談はさておき、環境を書かないことにはどうにもならない
WinかUn*xかエディタ上なのかHTMLに吐き出すのか
数字の中で1を赤くするのはあんまり意義が感じられないけど・・・
とりあえず定数化するべきなんじゃ
560 :
デフォルトの名無しさん :05/01/19 19:02:29
>>558 何がしたいのか、さっぱり理解出来ない... orz
プログラムのコードを可視化したいのか、aに格納されたデータを可視化したいのか
>>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])
今はこんな感じで結果を出しているのですが
画像でだしたいなぁと思ってるのです;;
すごく見難いので
565 :
デフォルトの名無しさん :05/01/19 19:42:23
>>563 ソースを色分けするんじゃなかったのかよorz
567 :
デフォルトの名無しさん :05/01/19 20:01:26
質問です。 メンバが数値型変数のみで構成される構造体を初期化する場合、 memset で char 配列を初期化する方法を流用して、 memset( &abc, '\0', sizeof(abc)); こんな感じにするのは、どうなんでしょうか? 領域が 0 埋めになるわけだから、一応初期化にはなるのですが。
>>567 かなり一般的。
確か厳密には仕様違反のはずだけど、移植性はかなり高い
>>567 0で埋めていいのならそれで構わないが、
memset(&abc, 0, sizeof(abc));
にしとけ。
570 :
デフォルトの名無しさん :05/01/19 20:22:23
>>547 エラーが出るという「普通の」コンパイラを教えてください
>>567 宣言とともに初期化するなら
struct A a = { 0 };
もあり。
使用違反なの? ポインタ型以外はオールゼロビット=0だしC++ みたいに仮想関数とかもないPODだから別に 仕様的にも問題ないと思ってたけど
>>568 >>569 >>571 ありがとうございます。
char と long が混在している構造体を今まで特に気にせず
memset の初期化してましたが、気になったので。
>571 の方法は恥ずかしながら知りませんでした。
memset とか memcpy って、柔軟に使っちゃっていいんですかね?
文字列(123.45 とか -0.123456789 とか 1.3e-9 とか)をlong doubleに 変換したいのですが、どのような方法がよいでしょうか?
うう・・記憶違いだった模様
規格上は問題ありませんね
>>572 ポインタ以外に浮動小数点型についてもオールビット0=0が
保障されてはいないとの事
strtod
577 :
デフォルトの名無しさん :05/01/19 21:06:24
char *p; p = &abc; for(i=0;i<sizeof(abc);i++){ *(p + i) = 0; }
char a[3],int(2byte) b; の構造体があって、2バイトごとに管理していた場合
そういうときに
>>567 では a[3] へアクセスすることとなり、違反になる可能性もあるかもしれない。
配列の場合は配列の要素数を一個超えたところへのアクセスに限っては 大丈夫じゃなかったっけ?
ただし書き込みは出来ないけどな
そんな馬鹿な。
584 :
デフォルトの名無しさん :05/01/19 22:41:58
変数aが2の場合で、 w = a++; って言ったら3じゃないんでしょうか?教えてください
586 :
デフォルトの名無しさん :05/01/19 22:46:54
b?
588 :
デフォルトの名無しさん :05/01/19 22:48:53
>584 やればわかる。拘置所++
> ディフォルト プ
デイフォールト
591 :
デフォルトの名無しさん :05/01/19 22:54:36
wは3じゃないんですか?どうしてwは2なんでしょうか・・・
ディフォルート
593 :
デフォルトの名無しさん :05/01/19 22:58:25
あと置きは後で評価するから
594 :
デフォルトの名無しさん :05/01/19 22:59:53
595 :
デフォルトの名無しさん :05/01/19 23:02:42
なるほど、てことはw = ++a;だとwは3ですね。 あとW = a>b;だとなぜ0になるんでしょうか?
597 :
ほ、ほーっ、ホアアーッ!! ホアーッ!! :05/01/19 23:04:05
>>591 後置き ++ は、インクリメント前の値を返す。
w = ++a; の場合は w は 3 になる。
>>595 お前が知的障害者だと言うことがわかった。
599 :
ほ、ほーっ、ホアアーッ!! ホアーッ!! :05/01/19 23:05:37
>>595 a > b は、a が b より大きければ 1 を、そうでなければ 0 を返す。
w にはその結果が代入される。
600 :
デフォルトの名無しさん :05/01/19 23:09:22
ほんまありがとう
後置インクリメントと言え 変数に対して+1加算は行われるが、式の値は加算される前の値。 mov eax [ebp+i] ; 式の値を作成 inc [EBP+i] ; 変数を加算 というだけ。
> 後置インクリメントと言え やだ。
604 :
デフォルトの名無しさん :05/01/19 23:23:31
2行に分ければ確実。 1行増えるだけで、迷わなくて済む
>>601 後で評価されるという言い方はおかしいね。
先に評価され、そのままの値が返る。
>>581 アクセスはだめです。一個超えたところのポインタ値を生成するのは合法です。
char a[8];
char *p = a;
p += 8; /* 末尾より一個超えてるけど合法 */
*p; /* 参照はダメ */
609 :
デフォルトの名無しさん :05/01/20 00:03:57
> *p; /* 参照はダメ */ read 要求も write 要求もしてないのに どんなアクセスが生じるんだ?
*演算子禁止ってことだろ
>>609 Cの文法において*pは、pが指しているところをcharとして評価するってことですから、
最適化などによって実際に読み出さないとか、そういうのには関係なく違法ですよ。
612 :
デフォルトの名無しさん :05/01/20 00:15:22
>>607 while(*p++)なんてやってもいいようにそうなっているんだよな
範囲指定を [first, last) にすると便利なことが多いしな
>>612 歴史的にはそういうコードがたくさんあるから合法にした、ということのようです。
これが合法になったためにコンパイラ作ってる人が
「じゃあ配列の末尾が生成できるアドレスMAXだったらどうすんじゃいわれ!!」
と憤ってるところを見たことがありますw
>Cの文法において*pは、pが指しているところをcharとして評価するってことです 本当? どっかに書いてるなら教えて。
よくエラーチェックしない人が、アドレス0付近にアクセスしてるけど、 その辺データにアクセスして危険って事あるの? 環境依存で運が悪ければ、なのかな…
618 :
デフォルトの名無しさん :05/01/20 00:47:38
> 「じゃあ配列の末尾が生成できるアドレスMAXだったらどうすんじゃいわれ!!」 そんなところまで配列はつくれないようにする! 簡単だね。
619 :
デフォルトの名無しさん :05/01/20 00:48:19
>>611 だから、その「評価」とは具体的に何だと聞いている
アドレスバスに出力するときの R/nW はどっちだ
>>619 アドレスバスというのはこのスレでは扱いません
>>620 こいつぼけ。知らないからってごまかそうとしても無駄ですよ ;-)
>>617 危険な場合はあるよ。
もっとも、ちゃんとした環境で運がよければプログラム落ちたりするけどね。
いいかげんな環境だったり、運が悪かったりすれば何も起こらない。
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)だけでいいの?
いいよ
625 :
デフォルトの名無しさん :05/01/20 01:12:38
ハイインピーという主張を期待していたのだがw
なんか滅茶苦茶だ
int *p;
p=(int *)malloc(sizeof(int)*3);
*(p+0) = 10
*(p+1) = 11
printf(%d %d\n",*(p+0),*(p+1));
>>624 ありがとう
>>626 >>624 じゃないが、; は抜けてるし、
*(p+1) じゃなくて p[1] って書かんか?
>>619 実装上の仕組みと、文法上の問題は切り離して考えろ。
実際にメモリ上の値から読み込んできたり、書き込んだりすることはC言語とは関係ない領域。
*p; というコードがあった場合、コンパイラが完全に無視して、アクセスは起こらない。これが実装上。
だけど文法的には、 *p というのは評価され、値「*p」をとる。だから、この時点でpが領域外を指す事は
許されない。これが文法上。
>>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を返せる方法がありましたら、どうかご教示ください。
>>630 Ctrl+Zでエンター押してるんだろうね
cはint型になってるかい?
>>631 一行目のご解答を見て思うところがあり、
^Z単独でエンターを押してみたところ、スルッと抜けました。
getchar関数はエンターを押すまでEOFと見なされないんだ・・・
ctrl+Zを押した直後に抜けるものかと勘違いしていました。これは恥ずかしい。
おかげさまで、問題は解決しました。どうもありがとうございました。
int*型ににはint型のアドレスを格納することができるよな んじゃあint*型のアドレスを格納できるint**型ってのは存在するのか?
存在します
ポインタポインタ続いてゆく ポインタポインタどこまでも
636 :
デフォルトの名無しさん :05/01/20 04:21:34
単にwarningレベルの話に過ぎない事にいつまでもうだうだ言うなよ
何の話だろう?って感じなんだが
こんな時間に・・・みんな暇なんだね
オマエモナー
もしかしたら、中途半端な知識の知ったか無改行君かな。
ちなみにあちしは朝日vsNHK祭りの記事やスレを読んでました。
朝日は結局 慰安婦問題を追及したいのか NHKを攻撃したいのか 政府に反抗したいだけなのかよくわからん ポイントは絞った方がいい
ほんとに詳しい人、見てるんなら最初っから発言してよ。 中途半端な人がぐだぐだ言い出す -> 詳しい人登場 ↑ここの部分いらないです。
その仕様けずれませんかね
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の確保した領域というのは解放されますか?
間違い free( B ) → free( BBB )
単純に数を数えればいい mallocが2回でfreeが1回 つまりどこかが解放されてない
>>647 される訳がない。
malloc()やcalloc()などで確保した領域は、
必ず明示的に解放しなければ、プロセス終了まで生き残る。
651 :
デフォルトの名無しさん :05/01/20 10:30:32
>641 ID見ろぼけ
質問します。 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
できる
>>652 ファイルそのものが存在しない環境もあるので、
C のみで完全に行う事は不可能。
Windows環境って書いてあるだろ
>>655 C のみって書いてあるだろ。
Windows API や Windows のコマンド等は、
当然のごとく C じゃないぞ。
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; } このプログラムをもう少しコンパクとに記述するにはどうすればよいのでしょうか??
変数を一文字にする。メッセージを短くする、かな?
さらに、インデント、改行は使うな
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 変なこと教えるなよ
二重ループをなんとかしろ
次スレからはスレタイを 「Cなら俺に訊け」 に戻した方がいいよ。 あれの方が善かった。
666 :
デフォルトの名無しさん :05/01/20 14:18:47
ifの連続を&&と||で連結した後、forを展開し、添字の式を簡略化した上でルーチンを一般化し、再びループに直す
ネタはさておきこんなもんかね。 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: }
>>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;
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;
そうだね、反則だね、レッドカードだね。
>>668 ありがとうございます。
1はつまりバイナリでオープンして、パスがあるところを読み出せ、ということですね。
2と3はやはり INT21 ですか、うーむ。共用体 AX とか AL に設定してコール、っていう
あれですね。
ファイルコピーは自力でもいいとして、フォルダ内ファイル一覧取得については、
C++ の勉強を兼ねてクラスとして作ってみようと思います(>652 に書いたやり方で)
>671 ++を忘れてたorz
みなさんありがとうございます。 感謝します。
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
遅いし、:と;間違い
こういうのになったとたん書き込みが増えるな
680 :
デフォルトの名無しさん :05/01/20 20:17:10
>>628 俺べつに実装上の仕組みの話なんかしてないぜ
アドレスバスという用語に気を取られてしどろもどろな発言すると恥の上塗りだぞ
読めとも書けとも言ってないのに何をどう「コンパイラが完全に無視」するって言うんだよ
ちょっとヒントやるからよく考えて答えろな
0;
ポインタ=アドレスと勘違いしてるやつが多いな。
682 :
デフォルトの名無しさん :05/01/20 20:41:01
>>680 おまえバカか?無視って言葉の意味わからないの? *p; ってのがまったく相手にされないってことだよ?
そのヒントとやらも言語上は評価されるんだよ?わかる?
ポインタとポインタ変数を混同してる奴が多いな。
686 :
デフォルトの名無しさん :05/01/20 21:13:41
>>628 によると 評価する!=読み書きする と言っていて、
>>680 によると 評価する==読み書きする って言ってるわけですよね。
結局どっちが正しいんですか?
687 :
デフォルトの名無しさん :05/01/20 21:16:42
>686 マニュアル見て自分で判断
689 :
デフォルトの名無しさん :05/01/20 21:23:16
void ってコンパイラの中では *(NULL *)で定義されてるんだっけ?
違った NULL ってコンパイラの中では *(void 0)で定義されてるんだっけ?
693 :
628 :05/01/20 21:31:34
アドレスバスに出力とか言い出したのお前さんじゃないか。 そういうこと言い出した時点で実装の話になっちゃうんだっての。
>>694 メール欄の意味がわからんので、教えてくれ。レスを無視すればいいのか?
696 :
デフォルトの名無しさん :05/01/20 21:37:32
>686 文法の評価と式の評価の混同。最適化されると無視されるかも知れない。完全にコンパイラとプリプロセサの状態に依存する。 「遊んでないで仕事しろ!」
697 :
デフォルトの名無しさん :05/01/20 21:39:34
698 :
デフォルトの名無しさん :05/01/20 21:40:23
パーサ書いてるつもりでコードジェネレータ作るタイプな
699 :
デフォルトの名無しさん :05/01/20 21:45:31
>>696 なんかよくわからないです。コンパイラとプリプロセッサってことは実装に依存するってことですか?
700 :
デフォルトの名無しさん :05/01/20 21:49:08
>699 何が?
おまえらキモヲタばかりだな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; とかと同じように式とされるってことですか? 式ってとこはあってるが、動詞の有無は違う
>>710 あなたは、その実態が「単価が高くて使いにくいプログラマ」だったりするSEなんですね?(Y/y)
713 :
デフォルトの名無しさん :05/01/20 22:46:00
>>710 お前が超上級職であるSEだという証拠を見せろ。
while(1.0); とか書けますか
ぬ る ぽ
717 :
デフォルトの名無しさん :05/01/20 22:52:43
で、結局だれが正しいんだ
typedef struct { void* p; } NullPointerException; C99でもこんな構造体ないの?
SEも同程度に負け組
IT自体が負け(プギャヒャラ
724 :
デフォルトの名無しさん :05/01/20 23:21:48
>>723 勝ち組のつもりでこの世界に入るアフォは痛杉
しょせんベンチャー
鉄くず泥棒どもは開き直ってなんぼだよ
なんでみんな
>>910 に釣られてるの?低レベルだから?
>>607 はまず実行結果をここに貼り付けてみろ
オマエの画面はどうなってる?
726 :
デフォルトの名無しさん :05/01/20 23:25:42
所詮日本は文系の社会 実力のある奴はみんな米国だよ
728 :
デフォルトの名無しさん :05/01/20 23:30:24
二桁最後のスレなんだからマターリしろ
勝ちとか負けとか、んなことバッカいってるショウもない奴は ママのおっぱいでもしゃぶってろ
>>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文字がたまたまずっと 検出されなかったとすると、永久に読み込みが走るのですか
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 のを試してみたか?
どうなった?
738 :
732 :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文字っぽいの入っとる。
740 :
デフォルトの名無しさん :05/01/21 00:21:02
で、本人は
>>73 9のを試してみたか?
どうなった?
741 :
732 :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をかけるのは不正アクセスを
引き起こすので普通やっちゃいけない、
・・・って結論でよいですかね ´∀`
くだらん質問○投げスンナ
たったこの程度のこと理解するのにどれだけ 時間かかってんだよ
人生こんなもんだ
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して、何を得たいわけ?
750 :
デフォルトの名無しさん :05/01/21 02:01:05
int main(int argc, char **argv) { 日下部先生 }
751 :
デフォルトの名無しさん :05/01/21 08:07:43
せっかくここ3年ほどよりつかなくなったのに、呼ぶんじゃねーよ!
グーグルの検索後の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);
#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
カレントディレクトリに指定した名前のファイルが存在するか調べてくれるような関数はありますか?
761 :
759 :05/01/21 15:53:52
>>760 そうですか・・・・。
例えばWindowsならどんな関数がありますか?
>>761 Windowsは知らん。ググれば解かると思うが。
763 :
759 :05/01/21 15:55:44
764 :
デフォルトの名無しさん :05/01/21 15:58:50
すみません質問の仕方が不適切でした タイピングもどきを作ってるんですけど、ファイルから ランダムに一行ぬいて、キーボードでうちこんで、strcmpで正誤判定 ってのを作ってて、ファイルを上から読んでいく事はできたんですけど rand()って0〜指定した数字までをランダムに指定するってものですよね? これをどう用いればファイルからの抜き出しができるんですか? 初心者なものでお願いします
>>759 一般的に、stat()は割りと環境を問わずあると思う。
また、読めることを以って存在すると仮定していいのなら、fopen()してみればいい。
>>764 一旦、メモリに読み込むのが常套手段かと。
>>765 ありがとうございます。
調べてみます。
>>764 char** str;
str=(char**)malloc(〜…
行番号=(int)((double)行数*((double)rand()/RAND_MAX));
printf("%s",str[行番号]);//なんなりと
引数って何でつか?
void mian(void) の括弧の中へvoidをなぜ書かなきゃならんとでつか?
>>770 main(void)は引数がないことを意味し、
main()だと引数は不定だということを意味する。
ちなみにC++だと共に前者の意味になる。
なあんだ、誰も応えられないんでつね
>>771 サンクスコ。
voidを明記しないと不貞の浮気者になるんでつね。
善意に甘えるついでにさらに質問させてもらいまつ。 プロトタイプ宣言で void function(void) と宣言していても、下のほうでvoidを記述しなくてもいいんでつか? void funtion() { printf("ほにゃらら"); } こんな感じで。
>>774 OK。2つは合成される。
ところでmain関数の戻り値はintが正しい。
>>775 そうでなくてはいけないわけでもないけれど、その方がいろんな面で有益。
うんとね、setMessage(String s)と書いとけば、 後はmainメソッドに書いてるように method1.setMessage("ええんか");のように 括弧の中に具体的な値を好きなようにかけるんですよね?
>>775-776 ありがとさん。
プロトタイプ宣言でvoidを書いておけば
下のほうで書かなくてもいいんでつね。
で775のmainの戻り値をintでってのはなぜでつか?
終了コードも知らんのか。いやはや世も末だ
余談だけど、ファーム系だと void main() だったりすることもあったりする。
>>780 それはシェル使わんし、Mainを終わることは電源切るときだけだから。
783 :
デフォルトの名無しさん :05/01/21 20:09:20
782:デフォルトの名無しさん:05/01/21 20:02:38
>>781 馬鹿はすっこんでろ
なんかまた始まったな。読んだことないやつはC99の5.1.2.2.3でも読んどけ。
785 :
デフォルトの名無しさん :05/01/21 20:14:37
だな、そこまでググル気にもならんし
788 :
デフォルトの名無しさん :05/01/21 20:44:37
質問です。 2つ以上のソースファイルからなるプログラムで、異なるソースファイルで同じ関数名や変数名を使っても 大丈夫な方法ってありますか? どうしてもエラーになってしまうのですが・・・。
同じ関数名や変数名を使わなければいい。
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が正しい。
Mが大文字なのは、ファームだから?
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と表示され実行できません。 なぜですか?
>>788 オブジェクトのシンボルテーブル弄ればいけるんじゃない?
798 :
デフォルトの名無しさん :05/01/21 20:51:15
>>793 リンカーのため、つい、mainはデバッグ用、Mainは商用と分けてる
800 :
788 :05/01/21 21:01:46
>>794 有難う御座いました、解決しました!
本当に助かりました。
>>800 一番の解決方法は、名前を分ける事なのだが、
それをしない理由はなんだ?
名前と入力番号の降順を自作関数で処理するプログラムを作ったのですが、 名前の降順がうまくいきません。 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]; } } } } どこを修正すればうまく処理されるのでしょうか??
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
805 :
710 :05/01/22 00:42:23
>>712 まあ、確かに俺は単価の高いSEだな。
毎日9時-17時で退社。月給手取りで約60万。
「単価が安くて使えるプログラマ」なおまいらは毎日深夜まで残業…。
でも手取りで30も貰えてないだろ(プ…かわいそうにwww
参考書で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
精度がよく実行速度がはやい積分方法で、おすすめのありませんか?
積み上げ法がいいと思うよ
ともかくスレちがい
816 :
デフォルトの名無しさん :05/01/22 11:29:23
>>809 耳従ってない青二才の典型
1つ気になることがあると
そこに気を取られるばかりで話に入れない
結果として自分と大差ない人からだけ聞いた
偏った知識のまま大成することなく歳を取る
筋の悪い「素材」だ
>>816 君の言っている事は全く理にかなっていないよ。
単なる経験則でしょ。
無意味な自己満足のレス付けて楽しい??
>>806 はただ参考書や講義で使われているのを良くみると書いているだけで、
そう書くことの利点については全く言及していない。
>>804 大変参考になります。
ありがとうございます。
それとソートキーは番号です。
820 :
デフォルトの名無しさん :05/01/22 12:25:28
> 大学の講義ページでも堂々と使ってるの見たよ。 よくみたらJavaの講義だった...っていうオチでは?
821 :
デフォルトの名無しさん :05/01/22 12:26:58
822 :
デフォルトの名無しさん :05/01/22 12:29:59
> 月給手取りで約60万。 やす,,,。ってそれ自慢できる収入かぁ?
年齢による
824 :
デフォルトの名無しさん :05/01/22 12:40:25
そかなあ。20台後半でそれだったら、すくなすぎだぞ
>>821 まず、根本的に、君は文を読んでいないし、議論にもなっていない。
# どうせ釣りだのなんだのと言いたいのだろうが、こっちは釣られても全然恥だとは
# 思っていないし、必死だといわれても恥とは思わない。
地域にもよるな 田舎で60なら自慢できるだろwww
おまえら、給料のこと書くんだったらマ板池。糞共
828 :
デフォルトの名無しさん :05/01/22 12:46:02
ふゆのそなた
829 :
デフォルトの名無しさん :05/01/22 12:49:53
>>825 では聞くが void main() という断片から、大学や講義の何がわかるんだ?
君ならちゃんと「理にかなった」説明ができるなら拝聴しようか。
>>829 決まっているだろ。
void main()という書き方をしたという事実だよ。
サンプルでそう書いたのだから、推奨したということだろう。
ところで、
>>809 は私ではない。
Javaの講義では int main だったりして
832 :
デフォルトの名無しさん :05/01/22 13:01:18
> では聞くが void main() という断片から、大学や講義の何がわかるんだ その講義が「だめだめ」だということだな。 hello, worldを出力して改行するサンプルで、バックスラッシュじゃなくて、円記号で ホワイトボードに書くような講義もだめだめ
円記号なんて使わないだろ。普通。
834 :
デフォルトの名無しさん :05/01/22 13:07:26
>>830 うまく逃げたな
こっちも深追いする理由は特にない
>>832 説得力ゼロだな
観測事実と結論が何ら関連づけられていないばかりか
結論に使っている独自の用語を定義していない
836 :
デフォルトの名無しさん :05/01/22 13:09:30
おこちゃまはお外で遊んでおいで
837 :
デフォルトの名無しさん :05/01/22 13:11:34
> 円記号なんて使わないだろ。普通。 だよねえ。ふつう (まっとうな大学なら) なのに使って、さらにその表記にnをつづけたもの(ようするに改行)を「えんえぬ」とか 口頭で読んでる講師って、どうだ? (実在する)
838 :
デフォルトの名無しさん :05/01/22 13:12:56
839 :
デフォルトの名無しさん :05/01/22 13:13:59
確かに美人なら許せるな。
840 :
デフォルトの名無しさん :05/01/22 13:14:25
ヌッコロ
技術系で若くて美人なんているか?
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
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
852 :
デフォルトの名無しさん :05/01/22 13:31:34
returnに括弧をつけちゃう著者も ;-)
853 :
デフォルトの名無しさん :05/01/22 13:31:41
>>846 VBなど今どき専門学校でおしえるかよ ぼけ
あったらよほどだめな学校だ。
854 :
デフォルトの名無しさん :05/01/22 13:34:24
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
859 :
デフォルトの名無しさん :05/01/22 13:38:33
860 :
デフォルトの名無しさん :05/01/22 13:46:02
わたしはだんぜん-krだな
勝手にインデントするな。
862 :
デフォルトの名無しさん :05/01/22 13:51:01
インデントみたいなプロトコルを1つしかサポートできないことを自慢するアフォが多いな
インデントってプロトコルか?
864 :
デフォルトの名無しさん :05/01/22 14:55:11
GNU indentのタブ幅設定は-ts3だよな?
865 :
デフォルトの名無しさん :05/01/22 15:40:41
>>845 技術系で若くて美人がいたが糞に蠅がたかる状態だった。
おぼっちゃんがゲットしました。
それはつまり 糞=若くて美人 蠅=そこらの男 ってことか?
-gnuは醜すぎ はよなくなれ
868 :
デフォルトの名無しさん :05/01/22 16:19:24
>>863 プロトコルは元来人間同士の儀礼
マシン間の通信規約を指さなくとも何ら問題はない
とっても単純な質問なのですが、 #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をヘルプで見ろ
>>869 >>871 をヘルプで見ろ
#include<stdio.h>
int main(void)
{
double num;
printf("input : ");
scanf("%lf", &num);
printf("%d\n", num);
return 0;
}
質問です。 void main() { char* aaa; scanf("%d",&aaa); if (aaa == "abc") printf("OK\n"); else printf("NO\n"); return; } このプログラムで入力文字が"abc"だったらOKと表示させたいんですが、 abcと入力してもONを表示されてしまいます。 どうしたらいいでしょうか? それともif文は文字列判定はできないのでしょうか? どうかよろしくお願いいたします
>>872 そのコードはポインタを比較しています。
ポインタが指している文字列を比較しているのではありません。
>>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ってやつを使う.
ぐぐったら出てくるから調べてみ.
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 環境ごとに最適化すればいい
884 :
878 :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]
1000
887 :
デフォルトの名無しさん :05/01/22 17:51:08
>>884 そうだけど,
>>881 がいうように,
len==0だとまずいから,一応if(len>1)を入れておいた方がいいね.
888 :
878 :05/01/22 17:55:01
>>881 >>884 あっ、なるほど。早とちりしてました。
わかりやすい解説ありがとうございました。
>>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");
>>890 void main なので、原理的にはありうる。
893 :
デフォルトの名無しさん :05/01/22 18:41:46
先輩!何回実行させても「OK」か「NO」しか出ません
int foo[] = { 100, 200 } ; int bar[] = { 0, 1 } ; : //略 printf( "%3d\n" ,foo[ bar[ 0 ] ] ) ; 自分たまにこんなの使ったりしてますが、これって実際どうなんですか? 環境依存とか、そういういけないやり方ですか? 教えてください。
895 :
デフォルトの名無しさん :05/01/22 18:42:53
ところでなんでONになるんだろう...
puts("buf overflow\rON");
>>894 何の問題もない。もっとひどくしてbar[0][foo]と書く事もできる。
898 :
デフォルトの名無しさん :05/01/22 18:48:59
>894 配列[int型]に問題ない
>>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を、〜〜」を表示して、終了してしまうのです…。 どこがおかしいか、先輩諸氏、ご教唆をお願いします。 また、我が儘を申し上げれば、今回のような設問時には、みなさんはどのような手法を取るか、 教えていただければ幸いです。
901 :
900 :05/01/22 19:08:34
すみません。 「改行が多い!」が出たんで、減らしたた見にくくなっちゃいました。 インデントもなくなってるし…。
12行目>scanf("%d%*c",&a);
903 :
デフォルトの名無しさん :05/01/22 19:19:07
>900 scanfはstdinを汚す。 直後にrewindを呼べ。
>>900 >今回のような設問時には、みなさんはどのような手法を取るか、
>教えていただければ幸いです。
scanf を使わない。
>>900 fgetsあたりで一行読み込んだ後、その行を処理するのが定石。
906 :
デフォルトの名無しさん :05/01/22 19:23:20
rewind を知らないだけのアフォが吠えてるぜw
俺はいつも gets(tmp); a=atoi(tmp); rewind(stdin); で書いてるけど。
>>906 昔、いろいろ実験した挙句、
何となく rewind を入れてみたら
なぜか上手くいった。
俺はその時の感動が
今でも忘れられないんだよ、
とかいう人?
海外のプログラミング学習サイトのサンプルコードに入っていたのを見つけて、やみつきになった>rewind
お前ら、いつまでそんなレガシー関数使ってんだよ。恥ずかしいなーもー。
913 :
900 :05/01/22 19:35:17
先輩諸氏、ありがとうございます。 rewind、fgets・・・、まだ知らない単語でした。 勉強を進めて参ります。 現状では、 >902さん のやり方でうまくいきました。ありがとうございます。
914 :
デフォルトの名無しさん :05/01/22 19:36:15
rewind を知らないだけってのは買いかぶり過ぎだったか たかが scanf 程度のものでさえ仕様をちゃんと理解して使えない 適性の最も低い層から今日も漏れ聞こえる慟哭かw そんなのとは比較にもならない複雑怪奇なものを次から次へと理解せにゃならんのがPGだというのに
stdin に rewind をかけるというのが 正当な解法だと考えるセンスは いかがなものかと。
#include<stdio.h> int main() { char* a="a%" ; printf(a) ; return 0 ; } とすると % が出力されないのに、printf("%s",a) ;とすると%が出力されるの はなぜでつか?
917 :
デフォルトの名無しさん :05/01/22 19:38:50
>>915 確かにセンスねえな
知ってればいいってものでもない
まぁ、用意されている関数を覚えている、というのは別にすごいことでもなんでも ないわけだが。逆に言うと、覚えていなくても別に大して恥ずかしいことでもない。 基礎を知っているなら、別に大きな問題ではないね。
あ、基礎というのは言語仕様の事ではないよ。
>>915 ファイルリダイレクトして渡したりしたらえらいことになりそうな気がする。
>そんなのとは比較にもならない複雑怪奇なものを次から次へと理解せにゃならんのがPGだというのに と、学生が吠えておりますが
922 :
デフォルトの名無しさん :05/01/22 19:44:59
すいません、初心者なんですが
>>902 の「%*c」が意味するものを教えてください。
924 :
デフォルトの名無しさん :05/01/22 19:45:22
>916 %おいちいからprintfにたべらりちゃふの。でも%%は%になるの。putsはたべないけれどね
>>923 実行してみたの?していないの?していないなら実行してから質問ね。
遅レスだが
>>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 ああ、自分は適性が高いとはこれっぽっちも感じないね
コード書けば金もらえる
それだけだ
>>916 釣りならもう一回ネタを練り直して来い
釣りじゃないならprintfが何をする関数なのか調べて来い
Cのどこが複雑怪奇なんだか・・・
・標準入力にrewind()
>920の指摘などの問題。
・scanf()
使いこなせていないとバッファオーバランの危険。
・gets()
常にバッファオーバランの危険。使用禁止。
>>916 printf()の第一パラメータは常にフォーマット文字列として解釈されるので、
%を出力するには%%と書く必要がある。
例えば、char *a = "%s" だったりすると大変危険。
>>922 >元メインフレーム屋ですが何か?
いや、なるほど。納得した。
さすがは・・・(ry
>>928 そんなんだから複雑怪奇だと思っちゃうんだよ。
rewindに限らず「よくわかんないけど動けばいいや」って感じなんでしょ。
>>931 すいません、それなら数字や文字列を入力する時はどの関数を使えば良いんでしょうか。
fgetsだと改行も入ってしまうんですが…
935 :
デフォルトの名無しさん :05/01/22 19:53:52
>>930 Cというか、最近はソフトとはそもそも何かというところで悩んでる
それこそ学生時代にしっかり押さえたはずのことが今になってアバランシェ
・・・大パニックがかえって楽しいけどね
文字列→sscanf →atoiなど
937 :
デフォルトの名無しさん :05/01/22 19:55:24
void main(void) 私は美しい・・・・・・・・・
何でコードを短くとか考えるのよ?その前にバグを減らす方を考えろよ
>>936 つまり、fgetsでchar変数に値を与えてからsscanfやatoiで直せば良いんですね。
教えていただいて有難うございます。m(_ _)m
fgetsならstdinは汚れませんよね?
941 :
デフォルトの名無しさん :05/01/22 20:03:02
>>939 しゅくふくのつえを持っているのにベホイミを唱えるようなもの
「汚れる」がどういう状態を指すのかわからんけど、 stdinに変なデータを書き込まれたりということはない。
>>935 >Cというか、最近はソフトとはそもそも何かというところで悩んでる
>それこそ学生時代にしっかり押さえたはずのことが今になってアバランシェ
もしかして学校ではバッチ処理の事しか教えてもらえなかったのでは?
まともな学校ならば、SICP のようにしっかりした教科書を使うから、
そんなことにはならないと思う。
945 :
デフォルトの名無しさん :05/01/22 20:09:03
946 :
デフォルトの名無しさん :05/01/22 20:09:51
>>946 >ホレリスカードね
おいおい・・・
学校って、「何時」の学校だよ(w
>>871 大変参考になりました。
ありがとうございます
>>871 大変参考になりました。
ありがとうございます。
char str[4]="str"; str[0,2]='d'; みたいに、カンマで区切ってもエラーにならないんですけど、なぜでしょうか? (2行目は、0,2です) 何か使い所があるから、OKって事になってるかと思ったんですが…
>>950 0, 2が式として評価されるから。
カンマで区切った式は左から順番に評価され、
最後に評価された値が帰ることになる。
>>950 「式 + 式」が「式」なのと同じように、
「式, 式」は「式」だから。
954 :
デフォルトの名無しさん :05/01/22 20:23:40
(0,2)==2. (0,1,7)==7. (0,2,4,8)==8.
文法書嫁よ。あー釣られた
>>950 for(n = 0, m = 0; m < max; m++)
のように使うときのカンマと同じ。
>>955 釣られても気にするな。君は思った意見を言っただけだ。
正しいものは正しいと胸を張って生きよう。
>>931 改行は、消すか無視すれば問題ないだろ。
なんで、その程度で悩む?
jacobi法を使用して 行列Aに対して Axベクトル = λxベクトル を満たす ベクトルx(固有ベクトル)と 値λ (固有値)と 組を求める。 のプログラムを作ってください。
____ . \ _, ,_ /∩ ソニック!ソニック! ( `Д´)彡 ∽ ( ⊂彡 ∽ | | し ⌒J
板違い、帰れ
962 :
デフォルトの名無しさん :05/01/22 21:30:22
>959 数学板に戻りなさい
>>899 a[b]とb[a]は同じ。
aにfoo、bにbar[0]を当てはめてみるとfoo[bar[0]]とbar[0][foo]になり、問題ないということになる。
>>964 便乗質問です。
型Tの配列aがあったとして、
a[b] の解釈は
*(a + sizeof(T) * b) になると思います。
とすると、同様にb[a]は
*(b + sizeof(T) * b)
と解釈されると考えました。
この条件でa[b] == b[a]となるのは、
sizeof(T) == 1 つまりTがcharだけの場合に限る
と考えたのですが、間違いでしょうか?
b + sizeof(T) * b → b + sizeof(T) * a でした… orz
967 :
◆DRAGONS/66 :05/01/22 22:52:25
> *(a + sizeof(T) * b) になると思います。 ならない。 *(a+b)
>>965 おまいの発想だと後者は
*(b + sizeof(b) * a)
になるんじゃねーのか?アァ?
>>967 即レスありがとうございます。
ポインタ演算の基礎を忘れて混同してました…
スレ汚し失礼しました^^;
970 :
デフォルトの名無しさん :05/01/22 23:00:34
return(0); と書いている参考書を買ってしまったのですが まずいですか?
>>970 その辺がどっちが良いかは完全に宗教論争だから、どっちでもいいんじゃね?
972 :
デフォルトの名無しさん :05/01/22 23:02:16
>970 ちと古い。
>>971 別にあってもなくてもいいという感じで
とらえておけばいいでしょうか?
まだ初学者なのに
いきなり駄目な参考書に当たっちゃったかなあと思いましたが
他の部分は読みやすそうなので気にするのをやめます
ありがとうございました
975 :
デフォルトの名無しさん :05/01/22 23:05:51
>>974 ギリギリC99が載ってなさそうな日付じゃん…
C99準拠の参考書ってどれぐらいあるんだろう?
プログラミング言語CのC99版ってまだ出ないの?
979 :
デフォルトの名無しさん :05/01/22 23:10:38
なんとしても90年代に出したかった必死さが伝わってくるようだ。
C99ってなんやねん
982 :
無理だったので誰か次スレ立てて☆ :05/01/22 23:12:35
別にC99なんて使わないっしょ
>>982 このタイミングでそのコピペが出る意味がわからない
>>981 すいません、業界の者ではないです
ヴァージョンみたいな認識でOK?
>>985 プログラミング言語Cの「現在の」標準規格
正式にはISO/IEC 9899:1999-Programming Language C
ついでに書籍プログラミング言語C第2版のはC90
ドイツ語の正書法みたいなもんですね 理解しました
みなさんはどのくらい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を使おうとしたんですがいまいちうまくいかなくて… よろしくお願いします。
>>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だ。
1000Get
999
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。