2 :
デフォルトの名無しさん :02/07/20 19:20
3 :
デフォルトの名無しさん :02/07/20 19:21
今から考えると、僕の人生はvoidだった。 そう、何も作り出すことは出来なかった。 しかし、僕の中のstatic変数にはいろんな思い出がつまってる。 でももうダメだ。 いつの日からか発生したループは、スタックを食いつぶしながら 僕のメモリ領域をどんどん蝕んでいく。 もうダメだ・・・。 僕は決心して窓を開けた。 「このプログラムは不正な処理を行ったため・・・」
4 :
デフォルトの名無しさん :02/07/20 19:22
乙ー
セグメンテーション違反UZEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE!!!!!!!!!!!!!
namespace {
>>3 ; //翻訳単位に隔離しますた
}
9 :
デフォルトの名無しさん :02/07/20 20:03
10 :
デフォルトの名無しさん :02/07/20 20:04
>>3 auto変数の方が、後に何も残らなくてよいかと。
新スレオメオツ
C言語なら、俺に聞け! <27> ↑ navi2ch ではこんな風に見えているのですが気のせいですか?
&lt;27&gt; 失敗。↑こんな風に。
く27ゝ 失敗。↑こんな風に。
Chalice なら問題なく表示されています。
18 :
デフォルトの名無しさん :02/07/21 03:12
19 :
デフォルトの名無しさん :02/07/21 03:13
>>18 むむっ。俺的には何の問題もないと思うが。
20 :
デフォルトの名無しさん :02/07/21 03:14
>>19 >>18 は同人板から来たんだ。
1000を踏んだ奴だけ新スレをつくる権利がある。
それを知らない厨房がたたかれてた。
コンパイラー使わしてくれるサイトってないの?
うっさい
26 :
デフォルトの名無しさん :02/07/21 06:06
27 :
デフォルトの名無しさん :02/07/21 06:07
28 :
デフォルトの名無しさん :02/07/21 06:20
>>27 ネタを噛んでしまうと、見ていてとても痛いのですが…
29 :
デフォルトの名無しさん :02/07/21 09:47
toktokかxreaは使わせてくれただろ。確か。
if( a(&num) == TRUE && b(num) == TRUE ) これって可能? ちゃんと動作するかな?
>>31 TRUEの定義とその怪しげな関数たちによる。
a(&num),b(num)の順に実行されていくんですよね?
35 :
デフォルトの名無しさん :02/07/21 10:49
36 :
デフォルトの名無しさん :02/07/21 10:52
37 :
デフォルトの名無しさん :02/07/21 11:29
ハノイの塔のプログラムが理解できん 助けてくれ〜
>>34 順序は合ってるけど、常に b() が実行されるとは限らない。
バビル2世を呼んで来い
41 :
デフォルトの名無しさん :02/07/21 11:47
42 :
デフォルトの名無しさん :02/07/21 11:48
>>39 バビル二世をよぶCのソースはどういうかんじですか?
>>39 extern void Babel_II();
int main()
{
Babel_II();
return 0;
}
44 :
デフォルトの名無しさん :02/07/21 12:21
#include <stdio.h>
void hanoi(int n,int a,int b){
int c = 6-a-b;
if(n>1)hanoi(n-1,a,c);
printf("disk %d : %d -> %d\n",n,a,b);
if(n>1)hanoi(n-1,c,b);
}
main(){
hanoi(3, 1,2);
}
参考
ttp://web2.incl.ne.jp/yaoki/hanoi.htm
46 :
デフォルトの名無しさん :02/07/21 12:35
歩性丼は?
>47 それは海鮮丼とは違うのか?
(゚Д゚)鰻丼ウマーカッタ (゚*゚)梅干しスッパー
ポセイドンもある意味海の幸
{ ←ロプロス
こ こ は ネ タ ス レ で す か ?
は い そ う で す 。
54 :
デフォルトの名無しさん :02/07/21 19:17
とりあえず前スレより下にあるのはまずいだろ。
>51 (゚д゚)ウマー ワラタ
56 :
デフォルトの名無しさん :02/07/21 21:27
変数の内容が整数かどうか確認するにはどうすればいいか教えてくだされ。 is***** ってな感じで関数があるの?
>>56 int char long shortとそのunsignedは整数。
58 :
デフォルトの名無しさん :02/07/21 21:34
すみません、重要なところを書き忘れてました。 実数型変数の内容が整数かどうかを確認する方法です。 たとえば、3.1415と3.0000を振り分けるようなものがあるとありがたいんですが。
if (val == (int)val)
63 :
デフォルトの名無しさん :02/07/21 21:44
if( num == ((double)((int)num)) ) とかダメかな?。。。ダメか。
>66 いや、intにキャストしたら、小数点以下捨てられるから、それをdoubleに戻して。。。 最適化とかされるとマズいけど
あ。。。67は65の間違いです。ゴメンナサイ
69 :
デフォルトの名無しさん :02/07/21 21:50
(*´д`) 漏れのは議論の余地無しってこと?
>62 やってることは一緒ですね。でも、警告でるかも?大丈夫かな?
>>60 (val<ceil(val+0.5)+ε)&&(val>ceil(val+0.5)-ε)
>>62 さん、
>>65 さん
ありがとうございます、どちらの方法でも期待した結果が得られました。
ちなみにMS-Cです(警告が出るかもとのことでしたので…)。
>62 あ、大丈夫でした。アセンブリ見てみたけど何やってるかわかりません。 以下 int foo(double a) { return a == (int)a; } を gcc -O2 -Wall -S foo.c でコンパイルしたもの。 誰か解読して! _foo: pushl %ebp movl %esp,%ebp subl $24,%esp fldl 8(%ebp) fnstcw -2(%ebp) movw -2(%ebp),%dx orw $3072,%dx movw %dx,-4(%ebp) fldcw -4(%ebp) fistl -8(%ebp) movl -8(%ebp),%eax fldcw -2(%ebp) movl %eax,-8(%ebp) fildl -8(%ebp) fucompp fnstsw %ax andb $69,%ah cmpb $64,%ah sete %al movzbl %al,%eax movl %ebp,%esp popl %ebp ret なんで、こんな複雑になるんだろ?(アセンブラスレ逝けっていわれそうw)
>>76 オペランドの意味わかれば猿でもわかるだろ。
>77 キャストするアセンブリ(機械語)命令って無いみたいですね(あたりまえ?)。 アセンブリ言語は浮動小数点数つかったことないのでサッパリです。
>>74 εは適当な誤差精度の意
ていうか有理数を実装したほうがよい
typedef struct { int nume, int deno } rational ;
>>75 遅レスですが
double x,temp;
x=3.141592;
if(modf(x,&temp)==0)...
>80 そんな関数あったんだ。。。用意されてるならそれ使ったほうがよさそう 。。。てか、勉強不足。。。鬱氏
82 :
デフォルトの名無しさん :02/07/21 22:12
もう終わってたか…
蛇足ですが、単純に小数点以下の数値が0か非0かを 調べたい場合は、if(x == (double)(int)x) の方が速いです。 また、0か非0かではなく、73氏のようにイプシロン以下であるか 判定するのであれば、 if( fabs(fmod(x,&temp)) < e)... になるでしょう。
>>85 >if(x == (double)(int)x)
は、xがintの範囲外の時おかしくなりません?
相手にされなかった… っていうかいいのかそれで? 0.1を十回足しても1にはならんのだぞ
>>86 スマソ、見落とし。
60での前提により、せいぜい int の範囲内と思いこんでました。
>86 そんなでっかい値だったら、そもそも小数点以下まで保持されてないんじゃない?
>>90 だから、小数点以下はゼロと判定されるようでないとまずい
わけです。
あ、手元の資料によるとdoubleの仮数部は52ビット。 32ビットマシンだとlong使わないとダメか。謝罪m(__)m
えーと、だから、doubleに 11111....111(1が54個。2進数表現で) という数字を入れようとしても 11111....11(1が53個)×2 = 11111....110 という値に丸められてしまうということです。 つまり、doubleだからといって必ずしも小数点以下まで保持されてるわけじゃないですよね?
>>87 浮動小数点数でも整数を表すときは
誤差は生まれないと思うんだけど、どうなんだろう。
if (x == (int)x)
は、xが整数で有効桁数内に収まっていれば必ず成立するんじゃないかと。
そもそも誤差って、小数点以下を2^-1, 2^-2, ... で表すから生まれるんだよね?
誰か詳しく知ってる人がいたら教えてください。
>>94 有効桁数におさまるなら当然誤差はない
int i;double sum=0;
for(i=0;i<10;i++)sum+=0.1;
ならばおそらくsum!=1というような話
>>95 誤差は無いですか。
ありがとうございます。
誤差はないといっても非常に近い実数とそれを区別する方法はないけどね
98 :
デフォルトの名無しさん :02/07/21 23:52
固定小数で以下略
>>98 固定小数でどうすれば誤差がなくなるのですか?
10進数の0.1を、16進で表すと、0.199999...になる。 (0.1 = 1/16+9/256+9/4096+9/65536...) そのため、浮動小数点では、0.1を近似値としてしか表現できない。 固定少数点は、小数部に必要な桁数だけ下駄をはかせて、 整数であるかのように扱うため、上記の誤差は発生しない。 しかし、一般的に誤差といっても、浮動小数点形式に固有の誤差、 乗除算に伴う誤差、加減算に伴う誤差など多々あるので、 固定小数点を使えばすべての誤差がなくなるわけではない。
101 :
デフォルトの名無しさん :02/07/22 01:34
fflushがいまいちよくわかりません。 何かfflushの効果を一目で確認できるようなサンプルプログラムはありませんか?
>>101 main()
{
FILE *fp = fopen("xxx", "w");
fprintf(fp, "xxx");
fflush(fp);
*(char *)0 = 0;
}
>101 これでどう? fflushなし #include <stdio.h> int main(void) { printf( "Hello, World!" ); sleep( 5 ); return 0; } fflushあり #include <stdio.h> int main(void) { printf( "Hello, World!" ); fflush( stdout ); sleep( 5 ); return 0; }
>100 ワタシもおかしいと思いますわ
つーか浮動小数点誤差についてうんぬんいうまえに情報処理技術者試験の勉強をして下さい。
>>102 いくらなんでも例外で落とすのは(w
#include <stdio.h>
int main(int argc, char * argv[])
{
FILE *pf = fopen("tmp", "w");
fprintf(pf, "abc");
getchar(); /* ここで^Cをおすとfflushされないで終了する */
fflush(pf);
return 0;
}
^Cしたとき(実行を中断してfflushしなかったとき)と
enterをおしたとき(fflushして正常終了したとき)とでtmpの中身を比べてみよう。
abortすれ
>>110 始めはabortでいいんじゃないかと思った。けど、手元のabort(3)では、
>DESCRIPTION
> The abort() function causes abnormal program termination to occur, unless
> the signal SIGABRT is being caught and the signal handler does not
> return.
>
> Any open streams are flushed and closed.
てなってる。最後の行ね。
質問です。 値の連続入力するときに入力するたびに画面のクリアをしたいんですが そういった関数ってあるんですか?あったら教えてください。お願いします。 OSはWindows2000でコンパイラはVisual C++です。
>>112 意味がいまいちわからんな。
Editダイアログに文字が入力された時に飛んでくるメッセージを
捕まえればいいだろ。
>>112 コンソールアプリケーションなら、エスケープシーケンスを使ってみるとか。
>>113 すいません、書き方が悪かったですね。
while(1){
printf("データ入力せよ");
scanf("%d",&a);
}
と書くと
実行時に
データを入力せよ 1
データを入力せよ 2
データを入力せよ 3
データを入力せよ 4
こうなるじゃないですか?
これをひとつ入力するたびに画面をクリアしたいんです。
それと、エスケープシーケンスはだめでした。
これで意味通じたでしょうか?
お願いします。
cls
systemコールでclsでも呼ぶ。
みなさんありがとうございました。 おかげでfflushの効果が分かりました。出力バッファについてもきちんと理解できた気がします(setvbufの効果も確認できました)。 setvbufで_IONBFに設定されている時はバッファリングしない(すぐに書き込まれる)から、そのストリームに対してはfflushする必要性が生じることはないんですよね?
>115 printf("\rデータ入力せよ"); scanf("%d",&a);;
>>120 _IONBFに関してはそのとおり。
ただし、性能が著しく落ちるのでバッファリングしないことは、普通はやらない。
たくさん出力するプログラムを作ってバッファリングしたときと
しなかったときとの差を比べてみるとよいと思うよ。
123 :
デフォルトの名無しさん :02/07/22 19:26
stddef.hって標準ヘッダーですよね? 私が借りているサーバー(OSはLinux)には入っていないんですけど・・・ もちろんstdio.hやstring.hなどはあります。
>>123 /usr/includeの中を調べたんだと思うけど、Linuxではgcc自身が提供する
ヘッダファイルが別ディレクトリに置いてあるみたい。
Vine Linux2.5では/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/include/
にstddef.hがあった。
#includeのサーチパスには上の二つのディレクトリが両方とも含まれるので、
#include <stddef.h>は問題なく通るよ。
125 :
デフォルトの名無しさん :02/07/22 20:40
>>124 なるほど。そういうことでしたか。ありがとうございます。
> /usr/includeの中を調べたんだと思うけど
まさにそうです。他のディレクトリにあるとは思わなかったので・・・
> Linuxではgcc自身が提供する
ということは他のはgccが提供しているわけじゃないのか・・・OS自信が提供しているのかな。
126 :
デフォルトの名無しさん :02/07/22 20:44
fopenとopenの動作的な違いを教えてください
127 :
デフォルトの名無しさん :02/07/22 20:46
>>126 fopenはファイルポインタを返すが、(POSIXの)openはファイルディスクリプタを返す。
129 :
デフォルトの名無しさん :02/07/22 20:52
>>127 さん
すみませんUNIXのシステムコールの違いを評価するために
openとfopenで同じファイルを開いてread,fscanfで読み込み
closeとfloseで閉じる一連の動作に掛かる時間を比較しました
その結果ファイル容量が大きくなればなるほど
fopenは時間がかかるのですが
openは依存しないようです
この違いが何故なのか知りたいので「動作的な」と
表記してしまいました
>>128 さん
すみませんファイルディスクリプタって何ですか?
>>129 readとfscanfじゃなくて、readとfreadで比べろよ。
> ファイルディスクリプタって何ですか?
そのプロセス内でストリームにつけられた番号みたいなもの。
fopenも内部的にはopenを使っているよね? open -> fdopenみたいな感じで。
>>130 さん
わかりますた。
あとは何とかがんばってみます
ありがとうございました
133 :
デフォルトの名無しさん :02/07/22 21:41
>>129 システムコールの違い?
open はシステムコールだけど
fopen はライブラリ関数なのではないかしら。
134 :
デフォルトの名無しさん :02/07/22 22:15
C言語のアプリ(Windows版)で一定期間を過ぎたら起動しないように したいのですが、どのようにレジストリを追加したらいいのでしょうか? また、インストール時にシリアルを入力しないと先に進めないように認証 するには、どうするのでしょうか? 参考になる、URL等ご存知でしたらお願いします。
>>134 まさかその程度のことも自力で解決できずに
金を取ろうとしてるとか(呆)
しかもスレ違い。それはCの話題じゃなくてWindowsの話題だ。
ゴキブリを一匹見たら三十匹居ると思えというように、
>>134 みたいなのが少なくとも30人はいるんだろうな。
>>135 >それはCの話題じゃなくてWindowsの話題だ
これも違うだろw
>>134 正直、才能無い。
別の趣味なり仕事なり探した方が人生充実すると思う。
140 :
デフォルトの名無しさん :02/07/22 23:40
C言語の入門書には ほーら簡単でしょみたいにMS-DOSに"hello world"と表示させているのに ボクだけどうしても"hello world"ができませんもう死にたいです Cコンパイラのインストールの仕方や動かし方がよくわかりません
>>140 それぐらいで死にたいと思ったら人生生きていけませんよ.
まずはCコンパイラのインストールに命を懸けてみよう
>>140
>>143 自分で物考えられない奴がプログラムやっても伸びんだろ。
146 :
デフォルトの名無しさん :02/07/23 01:10
変数を2進数で表示するにはどうすれば言いの?
148 :
デフォルトの名無しさん :02/07/23 01:15
>>147 普通に、int型を画面に二進数で表示する方法がしりたいです
itoa(i,buf,2);
昔の仕様ってなんだ? (value, string, radix)じゃないの?
154 :
デフォルトの名無しさん :02/07/23 01:23
155 :
デフォルトの名無しさん :02/07/23 01:24
int i; char buf[20]; for(i=0;;i++){ itoa(i,buf,2); printf("%s\n",buf); }
buf[20]はまずいだろ char* buf; for(i=0;;i++) { buf = malloc((int)(log(i)/log(10))+1); itoa(i,buf,2); printf("%s\n",buf); free(buf); }
s/malloc((int)(log(i)/log(10))+1)/calloc((int)(log(i)/log(10))+2,1)/
buf[20]はすぐにオーバーフローしちゃうが
161 :
デフォルトの名無しさん :02/07/23 01:49
32ビット想定で[33]だな あと0をつめるのとかどうすれば・・・
buf[CHAR_BIT*sizeof(long)+1]
>>161 signedでやってもまともな答え出る?
>>163 何を言いたいのかわからんが、32bitなら32桁を越えることはないだろ。
165 :
デフォルトの名無しさん :02/07/23 01:53
char buf[33] = {}; atoi(i,buf,2);
167 :
デフォルトの名無しさん :02/07/23 01:53
atoi
>>156 をいかにも初心者がやりがちな
頭でっかちなコーディングだと笑ったら
まずいですか?
170 :
デフォルトの名無しさん :02/07/23 01:59
itoaってVC++のみ?BCBにもある?
あるよ
>>171 そっか。
2〜36進数まで扱えるstrtolの逆みたいな関数を標準関数にしてくれればよかったのに。
173 :
デフォルトの名無しさん :02/07/23 05:04
FILE *outfile; outfile = fopen(〜〜〜); ・・・ if (baff != 'ここを数字ならば,としたい' ) putc(baff, outfile); 上記のように, if ( baff != '0' ) putc(baff, outfile); とすれば,baffが0以外だった場合にputするのはわかるんですが, これが,0〜9の数字以外なら.としたいのですが,どのようにすればよいでしょうか? また,正規表現(\d や[0-9]といったやつ)は使えないのでしょうか?
baff・・・・ 正規表現は使えない。 char *nstr="0123456789"; if(!strchr(nstr,baff))とでもして。
string.hをインクルードしてネ
176 :
デフォルトの名無しさん :02/07/23 05:16
forってなんですか?
int (*n)[3]; n=(int(*)[3])calloc(5*3,sizeof(int)); free(n); free後のnって,(*n)[3]の状態に戻っているの?
>>176 forは
for(i=0;i<5;i++)
printf("i=%d\n",i);
とやると同じことを5回繰り返す
(`_ゝ´)フォォー
180 :
デフォルトの名無しさん :02/07/23 05:24
whileが正統でforは異端だと聞いたのですが、本当ですか?
int (*n)[3]; n=(int(*)[3])calloc(5*3,sizeof(int)); free(n); free後のnって,(*n)[3]の状態に戻っているの?
>>180 私は聞いたことがありません。
個人的にはC言語のforは自由度があり過ぎるとは思っていますが。
>>185 でも、Perl使いとかみたいに妙な使い方を追い求めたりはしてないな。
>>183 それで、どーゆーことがわかるんでしょうか??
>>187 printf("%p", n);
とすればポインタ n の値を表示してくれる。
callocとfreeの前後に入れてみれば、nの値の変化がわかる。
(*n)[3]の状態ってぇのがよくわからないんで、
当てずっぽうに答えただけ。
>>186 意図不明。
私はPerlわからないんで更に不明。
>>188 free(n); しても、nの値が変わるかどうかはわからないでしょ。nの指す
ヒープ領域は解放されるでしょうけど。
193 :
デフォルトの名無しさん :02/07/23 09:29
>>191 変わるかどうかわからないなら、試して表示してみればいいのでは?
fjにもこないで欲しいよ。 あのおっさん。
>>191 nが変わるわけは無いじゃん。
ポインタ自体はコピー渡しされてるんだから
>>198 う゛ぁか、せっかく自分で調べさせようとゆうどうしてるのに
200 :
デフォルトの名無しさん :02/07/23 14:09
structのなかで関数を定義しそれを使いたいのですがどうすればいいですか? typedef struct{ int i; void show(char n); これはなぜつかえないのか }Myclass; main() { Myclass x; x.show; } みたいな感じでつかいたいのですが・・・無理ですか?
>>200 そろそろC++を使う時期だね
どうしてもというなら関数ポインタにすれば?
>>200 > structのなかで関数を定義しそれを使いたいのですがどうすればいいですか?
Cでは無理です。
ただし、関数へのポインタを使用することはできます。
もちろんポインタなので使用する前に何かの関数を設定しておく必要があります。
typedef struct{
int i;
void (*func)(char n); これはなぜつかえないのか
}Myclass;
int main(void)
{
Myclass x;
char c = '?';
x.showp = show; // void show(char); へのポインタを設定
x.showp(c); // 設定された関数の呼び出し
retrun 0;
}
203 :
デフォルトの名無しさん :02/07/23 14:20
そうですか・・・わかりました。あと二次配列を関数に渡すとき int calc(int *x[]); main() { int z; int a[2][2] = {{1,2},{3,4}}; z = calc(a); } これでやった場合calc(a)がうまくいかない(aの二次配列がうまくわたせない) のですがどうしたらいいですか? charの場合の2次配列はうまくいくのですが・・・
int calc(int (*x)[2]); int calc(int x[][2]); int calc(int x[2][2]); どれでも同等。配列の要素数は必要。 それから"int *x[]"だとint*を保持する配列になるはず
205 :
デフォルトの名無しさん :02/07/23 14:38
ありがとうございます。たすかりました。
/*
*/
#if 0
#endif
210 :
デフォルトの名無しさん :02/07/23 18:49
やっぱりC++の方が便利なのか。
211 :
デフォルトの名無しさん :02/07/23 19:06
Cでオブジェクト指向は無理ですか?
212 :
デフォルトの名無しさん :02/07/23 19:09
>211 メモリをケチらざるを得ない状況で無い限りC++に移行したほうがメリット多いかと
>201 関数ポインタでがんがれ! でもCでクラスの実装は無謀だよ、と予め逝っておくテスト。
214 :
デフォルトの名無しさん :02/07/23 20:33
>>213 publicとprivateはexternとstaticで真似できる?クラスごとにファイルを作成しないといけないけど・・・
でも広域変数になっちゃうか・・・
staticじゃ複数のインスタンスが作れないじゃん
うるせーばか
むむ。externとかstaticって関数の可視性のことだと思ってたけど。 変数なの? 大域変数はクラス変数になると思ったけど。
>>218 /* 関数外 */
static int i; /* このファイルのみ */
int i; /* 他のファイルからも */
extern int i; /* いずれかのファイルで宣言されているものを参照 */
>>220 無論わかってる。短すぎたな。こんなことを考えてるのかなあということ。
---myclass.h
typedef struct _myclass MyClass;
struct _myclass {
MyClass *(* set)(MyClass *this, char *str);
MyClass *(* display)(MyClass *this);
void (* destroy)(MyClass *this);
char *str;
};
MyClass *MyClassNew(void);
---myclass.c
#include <stdio.h>
#include <stdlib.h>
#include "myclass.h"
static int count_instance = 0; /* クラス変数、ただしプライベート */
static MyClass *set(MyClass *this, char *str)
{
this->str = str;
return this;
}
static MyClass *display(MyClass *this)
{
if (this->str) {
puts(this->str);
}
return this;
}
void destroy(MyClass *this)
{
count_instance--;
free(this);
}
MyClass *MyClassNew(void)
{
MyClass *instance = malloc(sizeof(MyClass));
if (!instance) {
return NULL;
}
count_instance++;
instance->set = set;
instance->display = display;
instance->destroy = destroy;
instance->str = NULL;
return instance;
}
---使い方 #include "myclass.h" int main(int argc, char * argv[]) { MyClass *c; c = MyClassNew(); if (!c) { return 3; } c->set(c, "氏ね"); c->display(c); c->destroy(c); return 0; } --- 要するにCで無理やりクラスっぽいことをやらせようということで、 大域変数をstaticにするってのは、count_instanceみたいにクラス変数的な 使い方を想定してるってことなのかなあ、なんて考えてた。 にしても、C++ならthisポインタを暗黙のうちに渡してくれるのに、 Cだと明示的に自分自身を渡してやらなければならないから、 やっぱC++使ったほうがいいかもね。少なくともこの点は楽できる。
223 :
デフォルトの名無しさん :02/07/23 23:36
>>222 漏れもCで暮らすとか創ってみたことあったけど、
どうしてもthisが自前になってしまってかっこわるいのであきらめた。
CはCらしくが一番
自然が一番
225 :
デフォルトの名無しさん :02/07/23 23:47
無理しないのが一番。
>>223 うん、かっこ悪いんだよね。
さすがに構造体に関数へのポインタ埋め込むことはやったことないけど、
構造体の実体を隠して全部関数でやり取りさせるってライブラリは何度も作ったことある。
オブジェクト指向にかぶれたばかりのときにね、やってみた(w
stdioのFILE*をやり取りする関数群はそういう作りだということに後で気づいた(w
あ、ちなみに
>>221-222 はコンパイルできて実行できることをgccで確認してある(w
228 :
デフォルトの名無しさん :02/07/24 00:04
確実に一つしか作られないクラスなら(藁 static MyClass *this; とかでもいいんだけど、あんま意味ないし。
それじゃ、インスタンスが1こしか…
>>229 Singltonか。
C で は デ ザ イ ン パ タ ー ン も 思 い の ま ま で す 。
libjpegのソースがけっこう面白いYO (Cでオブジェクト指向)
www.ijg.org
234 :
デフォルトの名無しさん :02/07/24 12:05
a.c ------ static charfoo[1000] = "HOEHOE"; ・ ・ ・ b.c ------ extern char foo[1000]; ・ ・ ・ そしてソース内部の色々な個所で参照 コンパイルして出来たオブジェクトをリンクさせる。→Warning発生 開発者 「ワーニングが出ることもあるが、プログラムとしては何の問題もない」 俺の今まで学んできたC言語では、a.cでstatic宣言している以上、他のモジュールからは 参照できないはずなんだが、開発者は「これでテストもした、正常に動作している」と 言い張る。 さて、間違っているのはどっち?
ウォーニング
>234 a.c の static char foo[] は実は参照されていないという罠。
> static charfoo[1000] = "HOEHOE"; え、コンパイルエラーにならない?
charfoo
>>237 ならない。ワーニングになる。何故ならんのかわからんが。
>>236 だよな。一瞬俺の記憶が狂ってるのかと思ったのだよ
ついでにもひとつ質問 グローバル宣言で extern int inted; extern int wnted; ・ ・ ・ ・ int inted; と記述した場合、コンパイラはどう解釈するんだ? これもエラーが出ないらしい。ワーニングさえ。問題ないってことか・・・?
↑は ・ppp.hというヘッダでextern宣言されている ・ppp.cで実体宣言されている ・ppp.cで最初にppp.hをインクルードしているため、展開後の解釈が↑のようになる という意味です。
242 :
デフォルトの名無しさん :02/07/24 13:25
>>240 特に問題はないと思うが?
もしかしてwntedが宣言だけされていて定義されていないことか?
wntedがプログラム中に使用されていなければ、エラーにはならない。
使用されていればエラーになる。
>英語ちゃんができなくて分かりません 英語の前に日本語を勉強しろ。 あと、英語がわからないなら、日本製だけ使っとけ。
すいません OSはwindows98SEを使ってます それと英語ができなくてもつかえる日本製というのがあれば 教えていただけますか
しぬ?
>>246 コンピュータ英語出来ないのはプログラマとして致命的。
ああ、日本語LOGOとかめじろとかは国産だ。
>>249 > gccの場合、コンパイルエラーなどのエラーメッセージは全て英語だ。
いつの時代の話だ?gcc 3.1 は日本語がうざすぎるくらいだが。
>>237 なる。型名もしくは配列名が指定されていない。
俺の使っている2.9xは英語だが。
>>250 > いつの時代の話だ?
では、Cで可変長配列が使えないことも「いつの時代の話だ?」
と煽っていいんですね?
>>243 ん、問題なかったっけ。さんくす。
問題定義しているのは、
・externで外部参照宣言した後に、実体を宣言しても問題ないのか
ということね
256 :
デフォルトの名無しさん :02/07/24 14:28
>>255 外部参照宣言はどこかのファイルに存在するものを参照する。そのどこかには自らのファイルも含まれる。
s/参照する/参照することを宣言する/
>>253 でもそれってブロックの最初でしか・・・。
>>234 > static charfoo[1000] = "HOEHOE";
コンパイルしたら、エラーになったよ。
a.c:3: invalid initializer
まぁこれはミスなんだろうが…
実は更にc.cというファイルがあって、そこに実体があるという罠。
それでもwarningがでるのはおかしいけど…
これ以上はwarningを貼ってもらうしかないね。
>>249 ありがとうございます
チャレンジしてみます
261 :
デフォルトの名無しさん :02/07/24 15:03
くだらないことですいません。C言語っていくらですか?
262 :
デフォルトの名無しさん :02/07/24 15:03
>>261 void流煽り
> C言語っていくらですか?
いいえ、いくらではありません。:)
>>259 恐ろしいことに、昔のCとの互換性のために「型を省略したらint」が
適用されてしまって、static charfoo は static int charfoo と同じ
意味になってしまう。
invalid initializerになるのは、型が書いてないからじゃなくて、
intの変数を文字列で初期化しようとしたから。だから、
static charfoo[1000];
これはエラーにならなかったりする(warningくらいは出るが)。
もっと極端な話、
foo;
これだけでもint foo;と解釈されてエラーにならないんだよね。
>>265 ああそうだった。longがlong intと見なされると同じだね。
foo; これだけでもint foo;と解釈されてエラーにならないんだよね。 これはウソ
>>267 gccではエラーにならないんだけど、コンパイラによるのかも。
const/static等を付けた場合のみ暗黙でintになるんじゃないの? gcc2.9.4/gcc3.1/vc6/bcc5.5.1で通らなかったよ
関数の中だと式文と解釈されてしまってだめだね。 関数の外なら行けますた。 % cc -v Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/specs gcc version 2.95.3 20010315 (release) % cat foo.c foo; % cc -c foo.c foo.c:1: warning: data definition has no type or storage class % nm foo.o 00000004 C foo 00000000 t gcc2_compiled. %
271 :
タイピング初心者 :02/07/24 17:24
Cでタイピングソフトを作ろうと思うんですけど、 どっかにお手本になるソースファイルはありませんか? いろいろ探したんですけど、なかなか見つからなくて・・・
それくらい考えてみろよ
>>271 考える力のないものは再開発しかできないのか?
>>271 どんな環境でも使えるものを作るのは、Cだけでは大変だよ。
>>274 標準入出力が使えればそれが使える環境ではまぁ使えるか。
>>275 リターンキー押すまで入力されないタイピングソフトとかはつらかろう
>>277 どうやって?
Cの標準関数ではできないよ。
んなもん Java中間コードを出力するCコンパイラを作れば解決 Javaを使えというまっとうな意見は却下
>262 そうか?ANSIとかJISとか行って、 「Cの規格表ください」って言っても、 ロハではもらえないとおもうぞ。
C言語はロハ 規格書は有料
漏れも規格は有料だと思ってたけど、 JISは無料で閲覧できるように
なってるみたい。
http://www.jisc.go.jp/ ここからデータベース→JISとたどっていって規格番号を指定すれば、
PDFで見ることができる。ちなみにC言語はJIS X3010だ。
>>282 死ぬほど遅いんだけど...
PDFをダウンロードするのはマズイのかなぁ。
そうかな? サイトが重いとかそういうことはないみたいだけど。 ファイルはそれなりにでかいですよ。X3010は13MBくらい。
つまらんことなんだが、このスレ参考になるなぁ・・・と思ってる俺は知識不足?
>>284 ファイルgetした(w
やっちゃまずいんだろうけども、トラフィック浪費しちゃまずいと思ってさ。
287 :
専門学校1年生 :02/07/24 20:36
10進→16進変換のプログラムなんですが、うまく結果が表示されません。 変な記号がまじります。 添削お願いできませんでしょうか。 #include<stdio.h> void main() { char code[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; char hex[4]; int i,data; for(i=0;i<4;i++) hex[i]='0'; printf("データ入力:"); scanf("%d",&data); for(i=0;data>=16;i++){ hex[i]=code[data%16]; data/=16; } hex[i]=data; for(i=3;i>=0;i--) printf("%c",hex[i]); }
宿題?
>>287 俺は天才なので教える。
printf("%x",data);
>>287 後ろから4行目
> hex[i]=data;
hex[i]=code[data%16];
292 :
専門学校1年生 :02/07/24 21:01
>>288 宿題です。
>>289 すみません。そこの部分はプリントではデフォルト部分で・・
出題部分ではないのでかえられませんのです。
>>290 出来ました!♪
ありがとうございました(涙)
また教えてくださいませ。
sage忘れすいません。
294 :
デフォルトの名無しさん :02/07/24 21:06
書いた後で思ったけど、13MBっていまどきなら別にでかくないか。
>>286 IEだとダウンロードしながら表示できたと思ったけど、Linux上でMozillaだと
全部ダウンロードしてからAcrobatReaderが起動するんで、結局ファイルgetと
同じになっちゃうんだけど(w
いちおー、
http://www.jisc.go.jp/jis-act/reading.html によると「入手」は有料で購入、「閲覧」はご自由にという感じなんで
(その二つの差に意味があるのかという話はさておき)、それなりに節度を守って
利用しましょということで。
>>295 WindowsのNetscapeCommunicator4.78でみたらTEMPフォルダに残っていた。
またきました。 文字列のmojiaの12文字をmojibにコピーする作業なんですが、 またしても壁にぶつかっております。 おねがいします。 #include<stdio.h> void main() { char mojia[]="syunka syuutou haru itiban"; char mojib[13]; int i; for(i=0;i<12;i++); mojib[i]=mojia[i]; /*←これでは代入されてませんか?*/ mojib[12]='\0'; printf("コピーされた文字列は%sです。\n",mojib); printf("%c\n",mojib[1]); }
for(i=0;i<=12;i++) memcpy(mojib+i,mojia[i],1);
for(i=0;i<12;i++) に訂正
>>295 あああ。Mozilla使えばよかったのか。
IEで見てみたら変な小細工がしてあったんで、
ソース読んでこっちもいろいろ変な小細工してgetしちゃったよ。
恥ずかしい!(>_<; 出直してきます。 ありがとうございました。
IE(5.5)でも小細工するまでもなくGetできるじゃん・・・・ でも、これってわざと画質落としているのかな? それとも印刷物をスキャナーにとおしたのか? 有料で購入した物がこのレベルならマジシャレにならないな・・・・・
305 :
デフォルトの名無しさん :02/07/25 01:21
DOS7.0からMS-CでTCP/IP通信やりたいのです。 VC++やUNIXでなら、Winsockや標準のソケット関 数使って組んだことあるのですが、DOSは初めて です。MS-Cってソケット関数あるんでしょうか? MSのLANMANとか入れると使えるようになるとか なのでしょうか? 厨な質問ですみません。
IBMのWebBoyだっけ?
それくらい自分でつくれ
>>304 売ってる規格票はさすがにちゃんとした印刷になってるよ。
スキャンする際にかなり画質を落としてるんじゃないかな。
>> 306 あとPC/TCPとかパッケージはいくつか知っているのですが、それらを使わずに 何とかしてみたいのです。市販されているってことは(売り物になっていると いうことは)やはり技術的に難しいのですかね・・・。(T_T)
まずは、ブルーブック読む。
データのバイト数を調べるプログラムってどうかきますか?
どんなデータ?
追加です データを標準入力から読み込むプログラムと データをコマンドラインから読み込むプログラムはどう書きますか?
コマンドラインから読み込む程度の量のデータのバイト数を調べるの?
316 :
デフォルトの名無しさん :02/07/25 13:31
C言語で、スクリーンセイバーを作れといわれました、 当方VB・ASP・JAVAしかやったことがありません。 参考になるページか本ありませんか?
318 :
デフォルトの名無しさん :02/07/25 13:59
>>313 int main(void)
{
if(EOF == getc(stdin)) print("0\n"), return 0;
if(EOF == getc(stdin)) print("1\n"), return 0;
if(EOF == getc(stdin)) print("2\n"), return 0;
if(EOF == getc(stdin)) print("3\n"), return 0;
以下、調べたいデータの最大まで書いていく、
1行に書かれた2桁の2つの数の四則演算の式の値を求めることができるプログラムを作る。 というのなんですがCで作るのですがさっぱりわかりません。 だれか知識のある方作っていただけませんか? おねがいします。
320 :
デフォルトの名無しさん :02/07/25 18:45
>>322 はーい、あやちゃん。しーしましょうね。しー。
>>319 値を求めるだけなら。
int main(void)
{
int a = 10 + 20;
return 0;
}
四則演算って、和差積商全部求めるん?
式は標準入力から入るとして、 OSはgccのあるUnix系と仮定 バッファあふれとかはとりあえず無視。 int main(void) { char buf[80]; FILE *fp; gets(buf); fp = fopen("tmp.c", w); fprintf(fp, "#include <stdio.h>\nint main(void){printf(\"%d\n\", buf);return 0}"); fclose(fp); system("gcc tmp.c"); system("./a.out"); return 0; }
327 :
デフォルトの名無しさん :02/07/25 22:52
sample.cが大きくなったので,関数の部分を分けようと思い,foo.hとfoo.cを作って関数と 大域変数を以下のように書いたのですが,(A)の場所で「error C2159: 2 つ以上の記憶 クラスが指定されています。」というエラーがでてしまいます. extern を消すとコンパイルされるのですが,dictionaryの値がちゃんと保持されません. どうしたらよういのでしょうか. Windows2000でVC++6.0を使用しています. ○sample.c #include "foo.h" static int dictionary[200][100]; int WINAPI WinMain ( 略) ○foo.c #include "foo.h" extern static int dictionary[200][100]; <---(A) int WriteClip(HWND hwnd, int *Data) { (略) ○foo.h int WriteClip(HWND hwnd, int *Data);
とりあえずstaticをとったら?
>>327 staticは変数のスコープを現在の翻訳単位に制限してしまうので、
この場合はまずい。
330 :
デフォルトの名無しさん :02/07/25 23:02
>>327 意味もわからずにstaticなんてつけんじゃねーよヴォケ
>>330 まあまあ。
staticには二つの意味があるし許そうよ
332 :
デフォルトの名無しさん :02/07/25 23:16
extern static
もうしわけありません...プログラムを見直していたら気が付きました... 最初,関数内でdic配列を定義.大きな配列を指定するとスタックオーバーフロー をおこすので,static宣言をしました.その後,dicをローカル変数からグローバル変数に したが,staticを外すのを忘れておりました.そのため,dic配列がそのファイルに ローカルになっているのに気が付きませんでした...
いかん、long short とか unsigned signed とか試したくなってきた。
335 :
デフォルトの名無しさん :02/07/25 23:50
extern static unsigned signed near far huge long short i = 0;
なんか偽者がいますね・・・ 返事遅れましたがありがとうございました。
偽名もいるな。
338 :
デフォルトの名無しさん :02/07/26 00:45
return(age);
本名はいないな
340 :
デフォルトの名無しさん :02/07/26 00:49
MOV 2CH , age POP 2CH RET
341 :
デフォルトの名無しさん :02/07/26 01:04
#include<2CH> main() { for(スレ=1;スレ <=500; スレ++){ printf("(・∀・)イィ"); }}
342 :
デフォルトの名無しさん :02/07/26 01:35
すいませーーん!C勉強中のものなんですがポインタが わかりません!! どうすりゃいい??配列もちょいと微妙な感じ・・・。 ちなみに独学でやっとります!
じゃ、人に教えてもらわないで自分で解決するんだな
>342 速やかに入門書を購入してください
>>342 ポインタは指す物だ。
何かがあって、そのありかを指している、それがポインタだ。
ただそれだけのことだ。精進せよ、若人よ。
ポインタの仕組み自体はわかるんですけど、いざ演習問題で プログラムを組むときに手が止まってしまいます やっぱアルゴリズムがわかってないのかなぁ? それとも才能がない??
>>347 演習問題くらいだったら、才能より慣れだよ。
数学とプログラムは数こなした奴が勝つ
そうでもないよ
351 :
デフォルトの名無しさん :02/07/26 09:44
┗0=============0┛ \===========[_|_|_|_|_|_|_|_|_|_|_|_|_|_]===========/ /三三三三三三三三三三三三三三三三三三三三\ 0 │ |∞∞∞ |::|∞∞田田∞∞|::|∞∞∞ | ::| 0 [二] | ::| |::|┏━━━━┓|::| | ::l [二] ◎○@※◎○@※. |□|.│ |┌┬┐ |::|┃/ C \┃|::| ┌┬┐| ::|. |□| ◎○@※◎○@※ ii|iiii|iiii|iiii|iiii|iiii|iiii|iiii| `)三(´| ::|├┼┤ |::|┃ ∧_∧ ┃|::| ├┼┤| ::|`)三(´il|iiii|iiii|iiii|iiii|iiii|iiii|iiii| @※◎○@※◎○ | ::| | ::|└┴┘ |::|┃(´∀` ) ┃|::| └┴┘| ::| | ::| @※◎○@※◎○ ii|iiii|iiii|iiii|iiii|iiii|iiii|iiii|li┏━━━━━┓|::|┃(. つ┃|::|┏━━━━━┓ li|iiii|iiii|iiii|iiii|iiii|iiii|iiii|l ◎○@iiii※◎○@ ┣┳┳┳┳┳┫|::|┗━━━━┛|::|┣┳┳┳┳┳┫ ◎○@iiii※◎○@ ii|iiii|iiii|iiii|iiii|iiii|iiii|iiii|l ○ ● ∫∬∫∬ ● ○ ii|iiii|iiii|iiii|iiii|iiii|iiii|iiii|li ○○ ●● iiiii iii ii iiii ●● ○○ [ ̄ ̄] [ ̄ ̄] ( ̄ ̄ ̄ ̄ ̄) [ ̄ ̄] [ ̄ ̄] |_○_| .|_○_| |_____| |_○_| .|_○_| ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ( )( )(, )(,, ) ,,)( )( )(, )( ;) やっぱり糞言語だったんだ…… モナモナ ザワザワ 可哀想に ナモナモ...
>351
前から思っていたんだけど。 専門学校って「自力で勉強できない”ボクも〜ができたらイイなぁ〜”」って人が行くところ・・・で 間違ってないよね。
>>353 行ったこと無いから知らんが、そうでもないんじゃない?
>>353 そう言うつまらんことばっかり言ってるからろくな人間になれない。
>>353 行ったことあるけど、そうでもない。
けど、そういうのが多すぎて、そう見えても仕方がない。
>>357 バカを認識する能力よりそこ中のきらりとしたものを見つけ出す能力の方が有用だと思う。
優秀なやつもいるね。俺なんか負けっぱなし。 学校なんて関係ないな、と思わされた。
BOOL a( int num ) { int i; for(i=0;i<num;i++){ if( box[i] >= 1000 ) return TRUE; } return FALSE; } これは,ちゃんとTRUEが帰りますか? for分の中でreturnしても関数を抜けますよね?
362 :
デフォルトの名無しさん :02/07/27 11:15
>>361 なんだBOOLとかFALSEって・・・・
抜ける。試せ。
ところで、box[]はグローバル変数?
実はbox[]はchar box[]という罠
tempx=-5; tempy=10; kyori=abs(tempx)+abs(tempy); ちゃんと15になるかな?
マンハッタン距離?
>>365 > ちゃんと15になるかな?
何が?と意地悪を言ってみる。
tempx=-5; tempy=10; num=abs(tempx)+abs(tempy); ちゃんと15になるかな?
370 :
デフォルトの名無しさん :02/07/27 17:33
Cの中級者っていったら どんくらいのことできたら言えますか。 当方まだCをはじめて1ヶ月の厨房でござる。 あと、 #include <stdio.h> #define num 8 int main(void) { FILE *fp; int test[num]; int max,min; int i,j; fp = fopen("test3.txt","r"); if(fp==NULL){ printf("ファイルはオープンできませんでした\n"); return 1; ↑のreturn 1の意味がわかりませぬ。 これはなにしてんの?
>>370 まぁ、使えと言われて使えない機能はないってとこじゃないの?
後、OSにエラーであることを教えてるんだろ。
エラー終了じゃないの?
373 :
デフォルトの名無しさん :02/07/27 17:36
なるほど、ありがとうございます。 精進します。
あぼーん
376 :
デフォルトの名無しさん :02/07/27 18:21
000 001 002・・・と桁指定の連番書式はprintfにはないのですか? "000"+"%d"で右から抜き取る?
mainの戻り値はプログラムを呼び出したOSに渡されます(一般に0が正常を指すことが多いです)。
%3dだと"003"になりません" 3"になりますた
%03d
画面をクリアするにはどうしたらいいんでしょうか つまらん質問でスミマセン
385 :
デフォルトの名無しさん :02/07/27 23:21
>>384 printf("\n\n\n・・・・・\n");
clearのソースでも読んだらいいのでは?
エスケープシーケンス一覧の方が早いかと。
構造体同士で, kouzoutai a,b; いろいろな処理 a=b; と,代入をしたいのですが,memcpyの方がいいでしょうか? こっちの方が,速度的に早くて,安全なんでしょうか?
390 :
デフォルトの名無しさん :02/07/27 23:51
>>384 エイリアンを全部穴に埋めればクリアだよ
>>389 構造体のコピーでmemcpyなぞ使う奴は今の時代にいない(といいなぁ)。
typedef struct{ char a; char b; int num; BOOL b; }kouzoutai; です
>>393 ポインタがないなら、直接代入するよろし。安全確実。
>>395 ハァ?構造体のメンバにポインタがあると危険なの?
おまえダラ決定
memcpy使う奴はもっとダラ
>>397 シャローコピーして、片方の知らないところで、
片方だけfreeする馬鹿がいるんでしょ。
>>399 同意。
少なくとも同じものを指す構造体が2つできる。
ってことはそれらの排他処理なども考えなければ。
以前に不本意なコピーになることの方が多い。
>>395 構造体のメンバにポインタがあること自体が危険などと誰もいっていない
402 :
デフォルトの名無しさん :02/07/28 00:34
ダラってなんだ?
405 :
デフォルトの名無しさん :02/07/28 00:38
ダラ・・・○○地方の方言。
memcpy か代入文かって話で、
>>395 はおかしいだろ。
>>401 かなりダラだな。
「代入すると危険か?」って聞いてるくらい雰囲気で分かれ。
ポインタあると代入だと危険でmemcpyだと安全な理由教えてごせや。
409 :
デフォルトの名無しさん :02/07/28 00:54
必死のジエン
まあいえることは、memcpyなんか使うより代入しちゃったほうが 一般的に速いコードになるし、読みやすくもなるんだから 積極的に代入すれ、memcpyなんか使うなということだな。 あと違う話だが、memcpyなんか使わんでmemmove使えという話もある。
413 :
デフォルトの名無しさん :02/07/28 01:01
>>412 同じ変数でなければ領域が重なることなんてないだろ?
ディープコピーしませう。
>>416 違う話ではあるけどね。
どんなときでもmemmoveをつかえ、memcpyなんか使うな、って話はしてもいいと思うけど。
>>412 も違う話だと断ってるんだし。
尽き果てぬ、自尊心
419 :
デフォルトの名無しさん :02/07/28 02:41
int cmp_line(int *line1, int *line2, int size) { int i; for ( i = 0; i < size; i++ ) { if ( line1[i] != line2[i] ) { //printf("%d, %d\n", line1[i], line2[i]); return line1[i] - line2[i]; } } return 0; } というコードがあって、printf文のコメントをはずしたときと つけているときで戻り値が変わってしまいます。 (出力内容は関係ないみたいです、printf("") としても結果が変わってしまいました。) このコードだけ見てもなんともいえないかも知れませんが、 何か考えられる原因はありますか?
420 :
デフォルトの名無しさん :02/07/28 02:44
>>417 >どんなときでもmemmoveをつかえ
わかってなさ過。
>>421 どの辺が?
領域が重なってるか重なってないか考えなくてもいいのは大いに利点だよ。
逆に、memcpyはそういう判断をプログラマにさせるわけで、
速いコードになるけど現状の処理能力考えたらそんなもん誤差誤差。
むしろバグを入れる可能性を考えたら使う利点はないと考えてる。
という考えでmemmoveをいつも使えと言ってんだけどおかしいかな。
何か見落としてる?
>>419 本題とは関係ないんだけど、line1[i] の方が大きいときに正の
値を返したいの?だったらおかしいよ。そうでなかったらすまん。
>>419 貼り付けてあるコード自体は悪くなさそう。
なので、呼び出し側がおかしそうだけど。
面倒くさがらずにline1[i]とline2[i]を全部表示してみればいいと思うよ。
sizeがあまり大きくなければだけど。
>419 size が line1[],line2[]の要素数を越えているんじゃ?
>memcpyはそういう判断をプログラマにさせるわけで そういう判断をした上でmemcpyを使うんだから問題ないでしょ。 コピーするときって領域が重ならない場面の方が多いと思うし。 なんでもかんでも馬鹿に合わせる必要はない。 まあ、memcpy/memmove/bcopy の中身が全部同じなんてことも あるわけだけれども。
人にはmemmoveを薦めておき、自分はmemcpyを使うのが基本ですか?
「どんなときでもmemmoveをつかえ」 は 「バグはすべてアドホックな対応で良い」 って言ってるようなもんだ。 こわっ…
>>427 馬鹿に合わせるようなコードを書くのが基本だと思ってたけど。
誤解して欲しくないけど、馬鹿が書くようなコードじゃないよ(w
領域が重なるか重ならないか、それは当然コードを書いているときには判別がつくだろう。
だが後にメンテするとき、他人がそのコードを読んだとき、果たしてそれが明らかかどうか。
自分よりも優秀なやつがそのコードを読むかどうか。
デバッグしてるときに「どうもメモリブロックが壊されてる、ひょっとしてmemcpyの使い方が変?」
なんて心配するよりもmemmoveを使っておいたほうがはるかに楽になる。
ま、ライブラリのバグってのもありえないとはいえないけど、まず考えなくてもいいわな(w
その辺も含めてプログラマが判断しなくちゃならないと書いたつもりだ。
そのコストは、memcpyを使って得られるささやかな利点を補って余りあると思うよ。
無論絶対使うな、とまで言い切るつもりはないけどね。多分使うべき場合もあるだろう。
ただおれの経験ではmemmoveが使えない状況だと、memcpyさえも使えない、
性能に重大な問題がある場合だけだったけどもね。
だからmemcpyを使うべき状況というのはおれにはちょっと想像がつかない。
領域が重なっている時の動作が不安なので strcpyは使わずに、常に自作関数を使っています。 ってか。
ちょっと違ったな。 領域が重なっている時の動作が未定義なので strcpyは使うべきではありません。 領域が重なっていても正常に動作する自作の同等関数を作成し 常にそちらを用いるようにすべきです。
>>430 なるほどね。430はそう考えるか。
うーん。俺は逆だな・・。
memmove 使うのは転送領域が重なるからだろう、
fixする時には注意が必要かもしれない。と考える。
まぁ・・どっちにしてもコメントをいれてもらえると助かるかな。
自 己 防 衛 に 必 死 だ な
>「どうもメモリブロックが壊されてる、ひょっとしてmemcpyの使い方が変?」 はじめから領域が重なる可能性があるならmemmoveを使う必要があるんだし、 重なる可能性が(設計上)無いんなら、memmoveを使うと本当のバグの原因が 奥深く潜り込んでしまう罠。 「memmoveを使ってるけど、領域が重なる可能性があるのか?」なんて心配 するよりも(以下略
>>433 それ、最後に「ってか」がつくんだよね?
strmove()
printfは誤った引数を渡してしまう可能性があるので(以下略
>>434 このあたりは評価とかポリシーの差になるんで議論になるとは思ってた。
関数マクロの是非とか、構造化プログラミングって効率悪そうとか、
C++なんて無駄なコード吐くからCの方がよいとか、
いやそれならいっそアセンブラで書けとか。
そういう議論は過去に山ほどあったけど大抵は「馬鹿にわかるようなコードをかけ」という
ポリシーが大抵生き残っていると思う。勿論場合によるというエクスキューズがつくけど。
丁度今現在の性能を持つシステムでmemmoveとmemcpyを使うか使わないかというあたりは
議論が分かれそうだと思ってた。で、仕掛けてみた(w
>memmove 使うのは転送領域が重なるからだろう、
>fixする時には注意が必要かもしれない。と考える。
という視点はおれにとっても他人のコードを読むときに常に意識していることだったりする。
当然「そんなこと意識させんなよ」とかいらいらする自分もそこにいる(w
コメントについては賛成。
>>436 そういう視点があるとは思わなかった。
ちょっと自信が揺らいできたよ。
>>438 char *strmove(char *dst, const char *src)
{
return memmove(dst, src, strlen(src) + 1);
}
>>440 領域が重なっちゃったら絶対バグになるような場面でmemmoveは、やっぱり
使いたくない。
だって、積極的に「ここは重なってもいいようになってます」ってコメント
入れてるようなもんだから。
「領域が重なるのが仕様上ありえること」なのか、
「重なったとしたら、領域の計算にバグがある」のかが選択の基準。
重なることがありえないはずなら、好きなほう。
おれはそういうスタンスで指導してるよ。
memmoveとmemcpyの場合は微妙だけど、こういう時の考え方って、
もっとクリティカルな場面に生きてくるから。
>>440 C++は似非とはいえOOPを実現するためにやっていることで
programmerに新しいパラダイムを与える。
その議論はパラダイムレベルで投資するコストと対効果の話で
memcpyとmemmoveのようにシンプルな関数でその次元で
語るのはいささか微妙かと思われ。
そういう懐疑を持つことはいいと思うが・・memcpyを全部memmove
に置きかえるほど一般的かというと。
俺的にはコメントしてあればどちらでもいいけど
ひとつ覚えれば済むことなんで、どちらが良いかとかはわからないなぁ・・
(十分なテストが期待できなくて、バグがあっても、memmoveにしとけば、 とりあえずバグが表面化しない、って時に、後ろめたさを感じながら memmoveにすることは、たまにあるけど、ナイショ)
同じような文字列の時は領域が重なるんだったよね? 数字もそうでしたっけ? int型とか
誰か突っ込んでやれよ
449 :
二つ目のお気に入りとして :02/07/28 21:40
このサイトは世界一リンクの多い総合リンク
サイトを目指しています。しかも総合リンク
サイトとしては日本初のナビゲーションリン
ク機能を搭載して、全てのサイトを右フレー
ムに表示できるようにしてあり、あらゆるサ
イトをさくさく表示することができます。是
非ブックマークに登録して活用してください。
http://home9.highway.ne.jp/cym10262/
450 :
デフォルトの名無しさん :02/07/28 23:08
構造体のコピーがa=bで良しとして、比較はどうする? if(a!=b)とか考えたことないや。出来るのかな?
>>450 まずは比較する際の「意味」を考えれ。
struct Proc p, q; // プロセス構造体
if( p < q ) ・・・
もしこんな風に書けたとしても、
結局の所「何を」比較しているのか意味分かるか?
>>451 a==b・・・aとbが同じ
a!=b・・・aとbは違う。
>>451 レコードの比較。
違いがあるのかないのか。
等等の用途に。
比較したい時ってない?
メンバがいっぱいある時、一つずつ比較するのは面倒だろ。
1byte境界にしてmemcmpか? ちと嫌だ。鬱だ。
455 :
デフォルトの名無しさん :02/07/28 23:46
比較用の関数作れ。
>>454 C++で万事解決?
解説本でスパッと説明されているのを見たことないなあ。
入門編しか読んだことないからかな。
解説してくれるとうれしいです。
>>455 多種多様な構造体ごとに作るのは鬱にならないか?
指定された構造体が記録されているメモリブロックをユニークに
参照して、パディング位置が判別出来れば比較用関数1つで済むだろうが。
>>456 >指定された構造体が記録されているメモリブロックをユニークに
>参照して、パディング位置が判別出来れば比較用関数1つで済むだろうが。
そんな無茶苦茶な。アラインメントによる隙間だってあるかも知れんし
ポインタの参照先がデータ本体かも知れんし、上にもあったが
意味上の問題もあるし(リストの連結に利用するポインタの値が
違うからといって意味的に同値で無いとは限らんだろう?)
C++では演算子のオーバーロードが出来るし、ポリモーフィズムも
可能だから456の意向に近いことは出来ると思うがな
458 :
デフォルトの名無しさん :02/07/29 00:25
C++でもクラスごとにオーバーロード関数を自分で実装しないといけない罠。
459 :
デフォルトの名無しさん :02/07/29 02:22
ヘッダファイル内で関数定義をするにはどうすればいいのでしょうか。 普通に定義したら、複数のCファイルでそのヘッダファイルをinclude しているので、multiple definitionと言われる。
460 :
デフォルトの名無しさん :02/07/29 02:23
461 :
デフォルトの名無しさん :02/07/29 02:32
>>459 ヘッダファイルに関数定義を入れないといけない理由は?
462 :
名無しさん@XEmacs :02/07/29 02:38
>459 #ifdef xxxxx_h とかやって、回避してください。 具体的な方法は、標準的なヘッダファイルに同じことが 普通はかいてあります。 たとえは、stdio.h などにも、ちゃんと多重定義しないように そういう処理がかいてあるので参考にしてください
>462 459の犯してる誤ちはそういうことじゃない
>>461 に同意
単に外部参照したいだけ?
externで解決か?
>>461 ANSI Cの時間計測関数より正確に時間計測できる
関数ってOSによって異なってますよね。
それをラッピングするマクロがヘッダファイルに書いてあったんです。
しかし、そのままではどうしてもコンパイルが通らないんです。
よくよく調べてみたらマクロで定義できるほど単純ではないことに
気がついて、マクロではなく関数で定義しようとしたんです。
>495 未来からのメッセージですか? もう一度ヘッダファイルのなんたるかを再考してみよ
467 :
デフォルトの名無しさん :02/07/29 02:50
>465 とりあえず、問題のソースをはってみそ
469 :
デフォルトの名無しさん :02/07/29 02:57
>>465 ヘッダでは関数宣言、別途.cファイルで定義を記述。
がベストだろ。
#ifdef HOGE
関数定義
#else
関数宣言
#endif
として、どこか1つのソースだけで、このヘッダを読み込む前に
#define HOGE
する手もあるが、お勧めできない。
>>467 すいません、他人のソースなんで・・・
冷静に考えてみたら、素直な方法を
考え付きました。
アンニュイな午前3時。。
>>470 まさか、おれの知ってるやつじゃあるまいな。
そいつ、ヘッダに関数を定義するの得意だった。
473 :
デフォルトの名無しさん :02/07/29 04:00
テスト期間でこの宿題に時間をかけたくありません。助けてください!解けますか?問題の意味もいまいちわからないし。 3×3のマスの中にチェスのナイトが置かれている。 (1) 3×3の配列aを定義して、すべての要素を0に初期化。ナイトの位置は1で、空欄は0で配列に記録。 スクリーン上には、□で空欄を、★でナイトの現在位置を表示する。(ナイトの最初の位置はプログラマーが選択してよい) (2) チェスのナイトは、将棋の桂馬と同じ動きをするが、前だけでなく左右や後ろにも桂馬飛びができる。 そこで、3×3の配列bとcを宣言して、それぞれに現在位置(i,j)から移動できるマスの番号を2桁の整数で入力する。 移動できるマスが(3,1)ならば31と入力する。(この問題では移動できるマスは常に2つなので配列bとcを使います。) (3) 現在のナイトがいる配列bの要素を10で割った商と余りを利用して、移動できるマスを(i,j)の形でプリントする。 同様に、配列cの要素をプリントする。 (4) ユーザーからの入力を読み、上の(3)で求めた(i,j)のどちらかならばナイトを移動して、新しい状態をプリントする。 入力が-1,-1ならばプログラムを終了する。 (5) 上の(3)と(4)を繰りかえす。 条件:配列aを引数として、現在ナイトがいる場所をプリントする関数を作製すること。
なんか宿題スレに答えらしきもの(内容見てない) があったけど。
475 :
デフォルトの名無しさん :02/07/29 05:11
誰も解いてくれません^^;解いてくださいお願いします!
476 :
デフォルトの名無しさん :02/07/29 05:35
Pythonでなら、かいてあげるよ
477 :
デフォルトの名無しさん :02/07/29 05:58
> テスト期間でこの宿題に時間をかけたくありません。 こういう人のために時間をかけるのはどうなのだろうか。
というよりは普段勉強をしていないだけ。
問題を解くより、問題の正しい解釈を見つけるほうが時間かかりそう。
>>473 >問題の意味もいまいちわからないし。
つまり、俺らがめちゃくちゃな解答をしてあげても先生に
「できました!かんっぺきです!ボクは天才ですから!いやーハハハハ」
とかいって提出する可能性があるわけだな
482 :
おしえて〜 :02/07/29 16:07
質問!! a=2.0; b=3.0; c=5.0; c[0]=a+b+c; c[1]=a+b-c; c[2]=a+b*c; c[3]=a+b/c; c[3]=a-b+c; ・ ・ ・ 数値は同じで演算子だけを+、-、*、/の全ての組み合わせで計算したいのですが、全て書くのは大変です。 何とかこのソースを簡単に出来きませんか? 教えて下さい。
483 :
おしえて〜 :02/07/29 16:10
ソース間違えました a=2.0; b=3.0; c=5.0; d[0]=a+b+c; d[1]=a+b-c; d[2]=a+b*c; d[3]=a+b/c; d[4]=a-b+c; ・ ・ ・
>>483 そういうコードを生成するコードを書きなさい
485 :
おしえて〜 :02/07/29 16:31
>>458 #include <stdio.h>
int main()
{
int i;
const char op[] = "+-*/";
for(i = 0; i < 16; ++i) printf("d[%d]=a%cb%cc;\n", i, op[i/4], op[i%4]);
return 0;
}
487 :
おしえて〜 :02/07/29 16:40
ありがとうございました。
>>487 ここまで出たんだから、ソース吐かせずに
プログラム中で計算する方法を考えるべし
489 :
おしえて〜 :02/07/29 17:18
>>488 たびたびすいません。やっぱり分かりません。
486のソースをどお変えればよいのでしょうか?
初心者なので教えて頂けないでしょうか。
お願いします。
>>489 こんなもんかな。ただし演算子の優先順位は考慮してないよ。
#include <stdio.h>
static double add(double a, double b)
{
return a + b;
}
static double sub(double a, double b)
{
return a - b;
}
static double mul(double a, double b)
{
return a * b;
}
static double div(double a, double b)
{
return a / b;
}
int main()
{
int i;
double (* op[])(double, double) = {add, sub, mu\
l, div};
double d[16], a = 2.0, b = 3.0, c =&n\
bsp;5.0;
for(i = 0; i < 16; ++i)
d[i] = op[i/4](a, op[i%4](b, c));
return 0;
}
ごめん、ターミナルからコピペしたら折り返しのところに\が入った。スマソ こっちが正しい。 #include <stdio.h> static double add(double a, double b) { return a + b; } static double sub(double a, double b) { return a - b; } static double mul(double a, double b) { return a * b; } static double div(double a, double b) { return a / b; } int main() { int i; double (* op[])(double, double) = {add, sub, mul, div}; double d[16], a = 2.0, b = 3.0, c = 5.0; for(i = 0; i < 16; ++i) d[i] = op[i/4](a, op[i%4](b, c)); return 0; }
>>491 どうでもいいが、なんでそんなにエディタの幅がせまいの?
リロードしてなかった。すまそ
495 :
おしえて〜 :02/07/29 17:32
>>493 インデントがちゃんと見えるようにスペースを に置換してる。
んで、面倒なんで行頭のスペースだけじゃなくてソースにあるスペースを全部
に置換してるから、やたら幅を食う(笑)
ちなみにエディタというかターミナルの幅は95にしてる。
おしえて君、ここまでしてもらっているんだから ちょっとはその足りない脳みそ使ってみろよ
>>495 ありゃあ。一応こっちではコンパイル/実行してみてるんだけど。
実行できないというのはどのレベル?
・コンパイルできない
・コンパイルできたけど実行したら保護違反とかなんとか言われてしまう
・結果が表示されない
多分、結果の表示がなされてないとかいうことかな。してないな(w
mainのreturn 0;の前に
for (i = 0; i < 16; i++)
printf("d[%d] = %f\n", i, d[i]);
と入れてみてくれ。
499 :
おしえて〜 :02/07/29 17:46
>>498 実行すると、
『実行時エラー:不正なアドレス参照』とだけでます。
演算子の優先順位も考慮してみた #include <stdio.h> static double add(double a, double b) { return a + b; } static double sub(double a, double b) { return a - b; } static double mul(double a, double b) { return a * b; } static double div(double a, double b) { return a / b; } int main() { int i; double (* op[])(double, double) = {add, sub, mul, div}; char str[] = "+-*/"; double d[16], a = 2.0, b = 3.0, c = 5.0; for(i = 0; i < 16; ++i) if ( i/4 < 2 && i%4 > 1 ) d[i] = op[i/4](a, op[i%4](b, c)); else d[i] = op[i%4](op[i/4](a,b),c); for( i = 0; i < 16; i++ ) printf( "%f %c %f %c %f = %f\n", a, str[i/4], b, str[i%4], c, d[i] ); return 0; }
>>500 おおすばらしい。
でもこれなら、結局普通に式を16個書いたほうがいいね。
ぐふっ
502 :
おしえて〜 :02/07/29 17:59
>>500 実行すると
エラー:無題:4行目:パーサーエラー、・E は間違っています。
と出るんですが。
503 :
おしえて〜 :02/07/29 18:00
なかなかうまくできないですね〜
>>502 「コンパイル」と「実行」という言葉を使い分けよう
506 :
デフォルトの名無しさん :02/07/29 18:21
507 :
おしえて〜 :02/07/29 18:22
508 :
おしえて〜 :02/07/29 18:24
どうせ教えるなら、ちゃんと動くものを教えてください。 こっちも忙しいんです。
>>507 コンパイルエラーの出た行を貼ってくれ。(ソースの)
510 :
おしえて〜 :02/07/29 18:27
人を引き止めといて、、、
error C2018: 文字 '0x81' は認識できません。 error C2018: 文字 '0x40' は認識できません。 がいくつか出てくるのだが・・・
なんか親切な人がいるなぁ マターリイイ!
514 :
おしえて〜 :02/07/29 18:33
>>509 Cmachineが原因でKERNEL32.DLLにエラーが発生しました。Cmachineは終了します。
と出てCmachine強制終了してしまいます。
518 :
おしえて〜 :02/07/29 18:51
519 :
おしえて〜 :02/07/29 19:09
>>519 みんな分かっているから気にするな。
対象のソースを丸ごと貼ってくれい
521 :
おしえて〜 :02/07/29 19:14
>>520 すいません。ソース待ちだったんですか。
#include<stdio.h>
static double add(double a,double b){
return a+b;
}
static double sub(double a, double b){
return a-b;
}
static double mul(double a, double b){
return a*b;
}
static double div(double a, double b){
return a/b;
}
int main(){
int i;
double(* op[])(double,double)={add,sub,mul,div};
char str[]="+-*/";
double d[16],a=2.0,b=3.0,c=5.0;
for(i=0;i <16;i++)
if (i/4<2&&i%4>1)
d[i]=op[i/4](a,op[i%4](b,c));
else
d[i]=op[i%4](op[i/4](a,b),c);
for(i=0;i<16;i++)
printf("%f %c %f %c %f=%f\n",a,str[i/4],b,str[i%4],c,d[i]);
return 0;
}
522 :
おしえて〜 :02/07/29 19:17
>>521 まったくもんだいない。
Cmachineとやらの問題じゃないの?
>>522 Cmachineを使うのは初めてかい?
以前に違うソースは実行できた?
526 :
おしえて〜 :02/07/29 19:24
>>523 そうですか。どうしてもできません。プログラムを動かす基の部分が原因だと思うので諦めます。
ありがとうございました。
ひょっとして、Cmachineとやらって関数ポインタをうまく扱えないんじゃ。
バグ多そうだよ、Cmachine。初心者にはお(略)
あれは標準関数すらまともにサポートしていないよ。 printfとかstrcpy程度。
530 :
デフォルトの名無しさん :02/07/30 02:00
Cmachineってなに?
531 :
デフォルトの名無しさん :02/07/30 02:01
ミーンマシーンと関係ありますか?
533 :
デフォルトの名無しさん :02/07/30 02:34
質問です。 Cでは以下のように複数のファイルで 同一名のグローバル変数を定義しても C++とは違い、エラーになりませんが、 これは言語仕様でしょうか? file1.c int foo=3; file2.c int foo=7;
yes
file1.cの中でfooを参照すると3になり、 file2.cの中でfooを参照すると7になります。 staticを付けてないので両方のfooは外部リンケージ を持つのに 「外部リンケージを持つ変数はプログラム の中でただ一つの定義を持たなければならない」という 規則に違反しないんでしょうか?
>>535 externしなけりゃ外部リンケージ持たないとか?
staticにすると、externができなくなる、と。
>>521 解決できたのかな。とりあえず、そのCmachineとやらいう変な処理系捨てて、
まともな処理系、たとえばgccなりbccなりを使ってほしい。
じゃないと変な癖つくよ。まかり間違って職業プログラマになってしまって、
しかもCを書くようになったら、かなりの困ったチャンになってしまうよ。
http://pc.2ch.net/test/read.cgi/prog/1021560641/l50 このスレで晒されるような存在になってしまうこと必至(w
で、Cmachineを使わざるを得ないというのであれば、ちょっとだけヒントを。
ただ、これでも動くかどうかはわかんないけど、トリッキーなことやってないので、
多分動くのではないかと。
以下の関数をop[なんちゃら](かんちゃら, どうした)って呼んでる部分で
置き換えてみるとよい。evalの引数opはどうやって得るかは考えてね。
double eval(char op, double a, double b)
{
switch (op) {
case '+':
return a + b;
break;
case '-':
return a - b;
break;
case '*':
return a * b;
break;
case '/':
return a / b;
break;
}
}
538 :
デフォルトの名無しさん :02/07/30 08:46
gccでもVC++6.0(もちろんCとしてコンパイル)でもリンクエラーになるぞ。
Σ(゚Д゚) が、ガセなの?信じたのに
542 :
API学くん :02/07/30 11:09
すみません質問です。 void *HENSU という表現があったのですが、意味がわかりません。 ボイドへのポインタの意味を教えていただけないでしょうか。 voidは関数に付けて返り値のないものという認識だったのですが、 変数に付いてさらにポインタというところがわかりません。
543 :
デフォルトの名無しさん :02/07/30 11:18
vectorで文字列の配列を扱うときの宣言は どうしたらいいのでしょう? vector<char []> list; vector<char [256]> list; いずれもだめなようで vector<char *> list; とするとOKなのですが while (inifile.getline(ss,256)){ CorpusList.push_back(ss); AfxMessageBox(ss) //この段階では表示される } AfxMessageBox(CorpusList[0]);//あれれ・・・表示されない するとAfxMessageBox(MFCのダイアログ表示命令) になにも表示されません・・・
>>536 static指定されてない外部宣言は外部リンケージをもつ。
>>538 >>540 VC++6.0だとエラーと出るが実行できるぞ。(SPあててない)
BCC5.5.1だとエラーにならずに実行できるね。
gccは試してないけど、これが正しいのか?
546 :
デフォルトの名無しさん :02/07/30 11:26
547 :
デフォルトの名無しさん :02/07/30 11:29
>>545 VC++6.0でどんなオプションをつければ実行ファイルが作成されるの?
548 :
デフォルトの名無しさん :02/07/30 11:30
マウス・キーボードが動いたときの判定に if (message == WM_MOUSEMOVE || pMsg->message == WM_KEYDOWN 〜 こんな感じで、書いたんですが、マウスを動かして無くても if内に入ってしまいます。正しいマウスの判定の方法を教えてください。
549 :
デフォルトの名無しさん :02/07/30 11:31
>>542 void*ってのはvoidとは無関係で「任意のポインタ」って意味だよ。
malloc()の戻り値の型などがそうだね。
>>543 そりゃssは単なる「ポインタ値」だから、配列の要素は全て同じオブジェクトを指してるよ。
そういう場合はstd::stringを使っ他方がいいと思うよ。
あと、このスレは「C言語なら、俺に聞け!」だから、今後はC++スレで聞いてね。
>>548 if (0) {
if (message == WM_MOUSEMOVE || pMsg->message == WM_KEYDOWN 〜
}
あ、勘違いしないでよ。エラーが出ても実行ファイルが作成されるオプションという意味だよ。
554 :
デフォルトの名無しさん :02/07/30 11:39
>>542 汎用ポインタのことじゃないの?
malloc()なんかはvoid型のポインタを返してくるよ
>>551 すれ違いにレスすいません。
さっそく試してみます。
>>558 そもそもvoidは関数の戻り値がないという意味じゃないぞ。
型がないという意味。無効にすると言った方がいいか。
C言語だからDOS-Cじゃなくても C++でもちょっとした質問くらいならいいと思うのは折れだけか・・・ C言語(C,C++)でしょ? こんな事書くと糞レス扱いされるんだよな・・・
C++==C言語 説急浮上
>>560 それよりも、
> C言語だからDOS-Cじゃなくても
C言語==DOS-C説には突っ込まないのか?
そんなこと言い出したらJAVAだって・・・
if('C' && "C++" && 'JAVA') { printf("もうわけわかんねえや"); } else { printf("そりゃあそうだね"); { return ;
>>533 Cマガ見たけど、これ恐らくgccだからだよ。
つまり実装依存。本文にはC++では多重定義エラーに
なるが、Cではエラーにならんと書いてあるけど、
Cの規格ではエラーだよ。というのはね、外部リンケージ
を持つ外部変数の記憶割り当てには幾つかのモデルがあって、
Unix系統のものは、それ独自のモデルを採用している。
詳しくは、C Rationalの3.1.2.2に書いてある。
http://www.lysator.liu.se/c/rat/c1.html#3-1-2-4 なので、例えば以下のように、初期値がなくても各ファイル
のfooは定義であり、宣言ではない。-->リンクエラー
file1.c int foo;
file2.c int foo;
これはK&R Second Editionの付録を読めばリンクエラー
になることが理解できる。邦訳版 A10.2
>>566 なるほど、見てみます。
失礼。Cマガでは初期値なしでした。
file1.c
int foo;
file2.c
int foo;
初期値があってもBCC5.5.1ではリンクエラーとならずに
実行できてしまいます。
初期値なしだと、VC6.0でも通りますな。でも、やっぱ 規格には反してると思う。
569 :
デフォルトの名無しさん :02/07/30 14:12
#include <stdio.h> #include <math.h> main() { double x; x = log(64)/log(2); printf("%d \n", (int)x); } 答えが変になります。どのように訂正すればいいのでしょうか? 答えは整数で出したいです。
main関数を使って、変数を取って来たいのですが、 int main(int argc , char **argv){ int x; char name; x = atoi(argv[1]); name = argv[2]; とすると、int型はOKなのですが、char型がエラーになってしまいます。 char型の変数の保持方法を教えていただけないでしょうか?
*argv[2]
>>570 > char name;
char *name;
>569 別に何も変にはならんかったが? >570 argv[2] は char * 型だ。先頭の1文字でよいなら name = argv[2][0];
>>573 説明不足でした。
正確な答えは6ですが、プログラムの実行結果は5になるんです。
>>568 こういうときのためのMAPファイルだと思うんだが。
ちなみに両方とも初期値なしの場合、VC6.0では
Address Publics by Value Rva+Base Lib:Object
0003:0000266c _foo 0040866c <common>
という感じで共有の領域に取られるみたい。
>>574 キャスト後+1する。それで常に問題は起きない
>569 うちでは6になったが?コンパイラはgccだ
ハードウェアや浮動小数点ライブラリの関係で誤差が出て log(64)/log(2) が 5.999... あたりになっているのではないかと思うのだが。 一度 double のまま printf させてみることをすすめるよ。
VCだと doubleのまま6.0000... intにキャスト5
じゃ(int)(x + 0.5)しろ(正数のばあい)
>>581 四捨五入するとおかしくなるよ。
切り捨て+1が正しい
>>583 答えが整数にならんときに破綻するんじゃない?
>580 何桁で表示させた? 桁数が少なかったら意味ないんじゃない? 表示だけ整数になればいいのならキャストせず %0f ではどうだろう。
>>585 それがいいと思う。かってにまるめてくれるっぽいし
5.999999....になりますね。 結局、どうすればいいんでしょう?
>583 アフォか?それじゃgccな環境だと7になるぞ?
int main(int argc, char** argv) { int x; char name; if( argv[1]!=NULL) x = atoi(argv[1]); if( argv[2]!=NULL) strcpy(&name, argv[2]); strcpyでコピー
+.5だと63の時も6になっちゃうじゃん
>592 (゚д゚)ハァ?
log(x)/log(2) の x が整数に限定される条件のもとでは、 log なんか使わない方が簡単確実かもしれん。 と、言ってみるテスト。
>>596 xが整数かどうかは関係ないでしょ?
式全体が整数になるかならわかるがと言ってみるテスト
結局、64とか128が2の何乗かを計算できて、 計算結果が整数であればいいんです。 みなさん、どうもありがとうございました。
>>598 2のべきだけだけだったらlog使うまでも無いけどね。
600 :
デフォルトの名無しさん :02/07/30 15:51
>>598 ああ それなら前にトリッキースレかどこかで書いたと思う
( n and (n-1) )=0 なら 2のベキ乗だから
(n-1) を2進で表現した時の1の個数を数えるんだ
数え方はビットをシフトしながら加算する
>>599 ちと、わからないです。
そのプログラムをコピペして
いただけませんか?
>601 はいよ。xが2の何乗かを調べる関数。2のべき乗以外の数入れると-1かえす。 int log_2( int x ) { int ans = 0; if ( (x & x-1) != 0 ) return -1; --x; while ( x ) x >>= 1, ++ans; return ans; }
603 :
デフォルトの名無しさん :02/07/30 17:26
その whileの部分は
x = (x & 0x55555555) + (x >> 1 & 0x55555555);
x = (x & 0x33333333) + (x >> 2 & 0x33333333);
x = (x & 0x0f0f0f0f) + (x >> 4 & 0x0f0f0f0f);
x = (x & 0x00ff00ff) + (x >> 8 & 0x00ff00ff);
ans = (x & 0x0000ffff) + (x
>>16 & 0x0000ffff);
が格好いいぞ
>603 それ何するプログラム?
何って だから
int log_2( int x ) {
if ( (x & x-1) != 0 ) return -1;
--x;
x = (x & 0x55555555) + (x >> 1 & 0x55555555);
x = (x & 0x33333333) + (x >> 2 & 0x33333333);
x = (x & 0x0f0f0f0f) + (x >> 4 & 0x0f0f0f0f);
x = (x & 0x00ff00ff) + (x >> 8 & 0x00ff00ff);
return (x & 0x0000ffff) + (x
>>16 & 0x0000ffff);
}
でしょ? 実行してみて 問題ある?
あのさ、おまえらよ Cで作ったコンソールアプリを 実行してDOS窓がすぐ消える のを直す方法ってしってて言っ てるの?
>>608 NT系? 95系ならPIFを弄ればOK
ああホントだ unsigned にしないと駄目だな
>608 ???DOS窓開いてその上で実行したら大丈夫じゃない???よく知らんけど
>>611 この場合は 最初にマスクしてるから大丈夫
>603 ほよよ。そんなやり方知らんかったよ。どういう原理? それ使ったらなんかいいことある?
それはビット数を数える有名なテクニック
>>616 一時、ループ使うと、最後に予測分岐が外れて大きなペナルティを払ってたから
ループ使わないテクニックがいろいろ作られたんだ
どうせやるなら、(x & x-1)の結果で0/-1を作って (ただ要アセンブラか)
最後にor して return すれば 完全な定クロックルーチンに出来るぞ
>>607
>>617 は?
signedにはどっちにしろ適用できないじゃん
619 :
デフォルトの名無しさん :02/07/30 18:36
> どうせやるなら、(x & x-1)の結果で0/-1を作って (ただ要アセンブラか) 2の補数表現なら、 -!!(x & x-1) とか。
2の-n乗について誤解してないか?
622 :
デフォルトの名無しさん :02/07/30 18:50
2out-of5符号による表示。5ビットからなる符合で、その中の2ビットが1である 符号を2out-of5符号という。この条件を満足する符号語はちょうど10個存在するので、 0から9までの10種類の数字を表すことができる。たとえば数と符号を次のように対応 させる。 0=00011 1=00101 2=01001 3=10001 4=00110 5=01010 6=10010 7=01100 8=10100 9=11000 (1)ユーザーに、整数を2out-of5符号に変換するか、逆変換するかを尋ねる。(入力 が1ならば変換、2ならば逆変換とする。) (2)変換の場合:3桁の整数をユーザーに入力させて、それを変数xに代入します。 (3)10で割った商と余りを利用して、xを3つの整数に分離します。 (4)それぞれの整数を2out-of5符号に変換して表示する。ヒント:2次元配列 a[10][5]の中にそれぞれの数の2out-of5符号を0や1で0入れておくと便利です。 (5)逆変換の場合:5桁の2進数を読み込んで、配列yに代入する。(1桁ずつよんでよい。) (6)yの値を上の表と比較して、同じものがあればその数字をプリントする。該当する ものがなければ「2out-of5符号ではありません。」とプリントする。 条件 1.配列yを2out-of5符号の配列と比較する部分を関数にする。 上の文章が問題です。自分で考えても全然わかりません。 お願いします。
>622 マルチかよ!ゴルァ! 待ってろ、今書いてやるから
>622 これでええか? #include <stdio.h> static int a[][5] = { { 0, 0, 0, 1, 1 }, { 0, 0, 1, 0, 1 }, { 0, 1, 0, 0, 1 }, { 1, 0, 0, 0, 1 }, { 0, 0, 1, 1, 0 }, { 0, 1, 0, 1, 0 }, { 1, 0, 0, 1, 0 }, { 0, 1, 1, 0, 0 }, { 1, 0, 1, 0, 0 }, { 1, 1, 0, 0, 0 } }; void henkan( void ) { int x; int z[3]; int i; printf( "3桁の数を入力してください: " ); scanf( "%d", &x ); for ( i = 0; i < 3; i++ ) z[i] = x % 10, x /= 10; for ( i = 2; i >= 0; i-- ) { int j; printf( "%d:", z[i] ); for ( j = 0; j < 5; j++ ) printf( " %d", a[z[i]][j] ); putchar( '\n' ); } }
625 :
624(続き) :02/07/30 19:37
int hikaku( int y[] ) { int i; for ( i = 0; i < 10; i++ ) { int j; int match = 1; for ( j = 0; j < 5; j++ ) if ( y[j] != a[i][j] ) match = 0; if ( match == 1 ) return i; } return -1; } void gyakuhenkan( void ) { int i; int y[5]; int x; printf( "2out-of5符号を入力してください: " ); for ( i = 0; i < 5; i++ ) { y[i] = getchar() - '0'; printf( "%d", y[i] ); } printf( ": " ); x = hikaku( y ); if ( x == -1 ) puts( "2out-of5符号ではありません。" ); else printf( "%d\n", x ); } int main( void ) { int x; do { printf( "変換(1) 逆変換(2)?: " ); scanf( "%d", &x ); } while ( x != 1 && x != 2 ); getchar(); if ( x == 1 ) henkan(); else gyakuhenkan(); return 0; }
626 :
デフォルトの名無しさん :02/07/30 20:22
わかりません。誰か、プログラム作成してください!! 『4000未満の4桁のアラビア数字を読み込んでローマ数字に変換せよ。 入力された数字を10で割った時の商と余りを利用せよ。 尚、アラビア数字、ローマ数字は、順に1=T、5=X、10=]、50=L、100=C、500=D、1000=Mとなる。 たとえば、MMDCL]XTT=1000+1000+500+100+50+10+5+1+1=2667です。 また、桁の数が4、9の場合は、引き算を適用します。たとえば、TX=5−1=4、T]=10−1=9です。 対話的に入力しますので、その入力誤りに対しては、再度入力するように表示して再入力させます。 』
宿題は友達と一緒にやれよ。 このスレで簡単に答えられるようなレベルの質問じゃないだろ。
main() { int a; scanf("%d",&a); printf("\n%d,%d",(a/10),(a%10)); }
>>624 ありがとうございます!実行してみます.
>>624 実行してみたんですが4行目に使用できない文字がある、と出てきてコンパイル
できませんでした。どこが間違っているかわかりません。お願いします。
>>631 全角スペースを半角スペースに置換せよ。
633 :
デフォルトの名無しさん :02/07/30 21:05
複素数行列の積を求める関数と動作を確認するプログラムを作成せよ 行列積は、N*M行列とM*L行列の積を計算し、N*L行列を求める ものである。 複素数は次の構造体型定義したcomplex型を用いる。また、複素数の和 、積を求める関数を作成し、それらを用いること。 typedef struct{ double re; /*実数部*/ double im; /*虚数部*/ }complex; この問題がわかりません。よろしくお願いします。
後半はできた。 complex add(complex alpha, complex beta) { complex gamma; gamma.re = alpha.re + beta.re; gamma.im = alpha.im + beta.im; return gamma; } complex mul(complex alpha, complex beta) { complex gamma; gamma.re = alpha.re*beta.re - alpha.im*beta.im; gamma.im = alpha.im*beta.re + alpha.re*beta.im; return gamma; }
どうもありがとうございます。まだ、c言語初心者なので、できれば プログラム全部おしえていただけるとありがたいです。よろしく お願いします。
>>635 あまりいろいろな所で聞くとわけがわからなくなりそうなので、
できればここで教えてもらいたいのですが
こっちもいろいろなところで答えたくないので 「宿題」スレへ来てもらえると助かります。 話題的にもスレ違いなのは明らかだし。 今アドバイスしてくれそうな人が複数いるので、どうぞ。
639 :
デフォルトの名無しさん :02/07/30 21:46
わかりました。そちらへ行きます。
>>637 教えてもらう立場なのに、すげーわがまま。
>>632 ありがとうございました!無事に実行することができました。本当に助かりました。
宿題スレで冷たくするからこっちに流れてくるのか・・・
関数に引数を一つだけ渡したい時と,3つ渡したい時があるのですが, どのようにすればいいでしょうか? 引数を使って,一つだけの種類を調べたり,3つ調べたりしたいのです
645 :
デフォルトの名無しさん :02/07/31 00:27
>>644 A. 同じ型なら配列にする。
B. 二つ関数を作る。それぞれで同じような処理をするのなら
その処理を行うもう一つの関数を作ってそれぞれから呼び出す。
C. 3つ+1つの引数を受け取る関数を作って一つの引数でどちらの
処理を行うか場合分けする。
お勧めはAかB。
646 :
デフォルトの名無しさん :02/07/31 00:30
>>644 こんなのは?
enum arg_type
{
type_nil = 0, type_int, type_charp
};
void func(enum arg_type a_type, ...)
{
arg_type type;
va_list v;
va_start(v, a_type);
while ((type = va_arg(v, arg_type)) != type_nil) {
switch (type) {
case type_int:
...; break;
case type_charp:
...; break;
}
}
va_end(v);
}
func(type_int, 0, type_charp, "test", type_nil);
>>644 printf の宣言(がどうなっているのか)を調べれ。
void kan(int kan_a,int kan_b,int kan_c); マクロで a 1,0,0 b 1,2,3 とやろうかと思っているのですが,どうでしょうか? これは楽な方に逃げてるだけ?
D. 最初の引数で引数の個数を指定するような可変長引数の関数を作る。 int func(int n, ...) { /* 実装 */ } 素人にはお勧めできない。
651 :
デフォルトの名無しさん :02/07/31 00:35
E. C++使う。
653 :
デフォルトの名無しさん :02/07/31 01:21
すみません。誰か教えてください。お願いします。いちを少し自分でといてみました。できれば続きからお願いします。 データが0と1しか含まないと仮定して、以下の方法でプログラムを作成してください。 getcharコマンドで、入力データの1行目を読み取り、配列aに代入(1行に38文字あるが、最後の1文字は改行文字と仮定)してカウンターの値を1に初期化する。 <最初に読んだ文字(a[0]の値)が続いている間は、カウンターの値輪1ずつ増やして読んだ文字が今までと違った(文字の連続が終わっ た)時点でカウンターの値をプリントして1の場合にはそのまま数字をプリ ントして0の場合には、符号をマイナスにしてプリントする。カウンター の値を1に再初期化>して<>の間を繰り返す。2行目以降を同時に処理し てください。 条 件:・配列aを引数として、0または1の数をプリントする関数を作成してください。 ・サンプルデータは 0000000000000000111100000000000000000 0000000000011111111111111000000000000 0000000000001100000000110000000000000 0000000000000111000011100000000000000 0000000000000011100111000000000000000 0000000000000011100111000000000000000 0000000000000001111110000000000000000 0000000000000001111110000000000000000 0000000000000111111111100000000000000 0000000000011111000011111000000000000 0000000001111000000000011110000000000 0000000011100000000000000111000000000 0000001110000000000000000001110000000 0000111100000000000000000000111100000 0001111000000000000000000000011110000 0001111000000000000000000000011110000 0000111100000000000000000000111100000 0000001110000000000000000001110000000 0000000001111111111111111111000000000 0000000000000111111111100000000000000 0000000000000000000000000000000000000 #include<stdio.h> int main(void) { int i, j ,counter; int a[20][38]; char ch; for(i=0; i<21; i++){ for(j=0; j<38; j++){ a[i][j]=getchar(); }} for(i=0; i<21; i++){ for(j=0; j<38; j++){ printf("%c",a[i][j]); }}} このプログラムの後に1行目は0が16個、1が4個、0が17個であるので16,4,17というように表示したいのですがで きません。 16,4,17 11,14,12 : : : : と表示したいのです。どうぞお願いします。
>>653 いい加減にしとけよ。
宿題スレに(・∀・)カエレ!
655 :
デフォルトの名無しさん :02/07/31 02:01
次のプログラムを関数で表したいのですがコンパイルできません。訂正をお願いします! #include<stdio.h> int main(void){ int i,j,x,y,next; int a[3][3]={{1,0,0}, {0,0,0}, {0,0,0}}; int b[3][3]={{12,20,10}, {2,-1, 0}, {2, 0, 1}}; int c[3][3]={{21,22,21}, {22,-1,20}, {12, 2,10}}; while(1){ for(i=0;i<3;i++){ for(j=0;j<3;j++){ if(a[i][j]==0){ printf("□"); } else{ x=i; y=j; printf("★");} } printf("\n"); } for(i=0;i<3;i++){ for(j=0;j<3;j++){ if(a[i][j]==1) printf("(%d,%d)",b[i][j]/10,b[i][j]%10); } } printf("\n"); for(i=0;i<3;i++){ for(j=0;j<3;j++){ if(a[i][j]==1) printf("(%d,%d)",c[i][j]/10,c[i][j]%10); } } printf("\n next : "); scanf("%d",&next); if(next==b[x][y]){ a[x][y]=0; a[b[x][y]/10][b[x][y]%10]=1; }else if(next==c[x][y]){ a[x][y]=0; a[c[x][y]/10][c[x][y]%10]=1; }else if(next==-1)break; } return 0; }
656 :
デフォルトの名無しさん :02/07/31 02:04
関数で表したものが次のです。(655つづき) void naito(int z[3][3]) { int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++){ if(z[i][j]==0){ printf("□"); } else{ printf("★");} } printf("\n"); } }
657 :
デフォルトの名無しさん :02/07/31 02:12
今ある関数をつくっているのですが、エラー値を返すようにしたいんです。 でも戻り値は他のもっと大事なことに使うので使えません。 そこで広域変数にセットするかint *を渡してそこにセットする(0の場合はセットしない)かのどちらかにしようと思っています。 どちらがいいですかね? ちなみにエラーチェックはプログラムの中で一度すればOKなのでint *を渡す方法を使うのは気が引けるんです。
それと、その関数はメインルーティンとは別のファイルに書くのでstaticな広域変数は使えません。
660 :
デフォルトの名無しさん :02/07/31 02:22
どこがおかしいですか?訂正をお願いします!(655つづき)
661 :
デフォルトの名無しさん :02/07/31 02:23
>>660 VC++6.0でコンパイルできちゃうんだけど
662 :
デフォルトの名無しさん :02/07/31 02:25
>>657 本当に一度しかチェックしないのなら、エラーチェックする関数を別に作って
今ある関数を呼ぶ前に実行する。
663 :
デフォルトの名無しさん :02/07/31 02:27
えっ…Cマシーンじゃできないんですかね?
664 :
デフォルトの名無しさん :02/07/31 02:28
>>663 またしてもCMachineのバグ発覚か!?
ちなみにエラーメッセージは何?
665 :
デフォルトの名無しさん :02/07/31 02:29
3余り符号は、2進化10進符号に3を加えて得られる符号である。各符号は、次のような値をとる。 0=0011 1=0100 2=0101 3=0110 4=0111 5=1000 6=1001 7=1010 8=1011 9=1100 この符号を用いると、各桁の1と0を入れ替えたものが9の補数になる。 そこで、3桁の整数を読み込んで、3余り符号とその補数をプリントするプログラムを以下の方法で作製せよ。 (1)3桁の整数をユーザーに入力させて、それを変数xに代入します。 (2)10で割った商と余りを利用して、xを3つの整数に分離します。 (3)それぞれの整数を3余り符号変換して表示せよ。2次元配列a[10][4]の中に それぞれの数の3余り符号符号を0や1で0入れておくと便利です。 (4)9の補数を求めたい数字と配列を引数として、9の補数をプリントする関数 を作製せよ。たとえば1の補数は8で、各桁の1と0を入れ替えた数になって います。 (5)上の(4)で作製した関数を用いて、3余り符号の補数を2進数でプリントせよ。 条件 1.9の補数を求めたい数字と配列を引数として、9の補数をプリントする部分を関数に すること。 友達に聞いても誰もわかりませんでした。どうかこの問題を解いてください。お願いします。
667 :
デフォルトの名無しさん :02/07/31 02:35
エラーメッセージ? とにかくコンパイルができずに終了しなければいけなくなる^^;
668 :
デフォルトの名無しさん :02/07/31 02:39
>>667 これこれこうだからコンパイルできません。と出ない?
例えば変数iは宣言されていませんとか。
669 :
デフォルトの名無しさん :02/07/31 02:44
でません^^;エラーを送信するかしないか、デバックとかいうのが表示されます^^;
671 :
デフォルトの名無しさん :02/07/31 02:57
XPです!
Cマシンとかいうの使ったこと無いけど、プログラムが落ちてるんじゃない? とりあえず、違うコンパイラに変えることをすすめとく。
673 :
デフォルトの名無しさん :02/07/31 03:01
助言ありがとうございました^^
Win上ならBorlandのコンパイラがお勧め.
>>671 今落としてきて試したけど、ちゃんとコンパイルできるよ。
バージョンは何?こっちは2.02だが。
676 :
デフォルトの名無しさん :02/07/31 03:02
Rolandがいい
677 :
デフォルトの名無しさん :02/07/31 03:04
ファイルバージョン1.0.0.1です!
>>677 とりあえず新しいの落としてきたら?
XP+Cmachine2.02で実行できてる。
でも、できれば他のコンパイラに変えた方がいいと思うけど。
XPいいよなーVC.NETが動くもんなー
>>677 ごめん。ファイルバージョンは1.0.0.1で同じだった。
やっぱりBCCでもダウンロードしてみて。
C Machineなんか使わない方がいいと思うけどな。 ヘッダーファイルをみるとよくわかる。
Cでべき乗の計算をしたいのですが、 MSVC6.0では 2^5=7とでます。 2^5=2*2*2*2*2 ではないのですか? お願いします。
683 :
デフォルトの名無しさん :02/07/31 03:20
>>682 2^5は2と5のビットごとの排他的論理和
ベキ乗はmath.hをインクルードしてpow()を使って。
double pow(double x,double y);
>>683 できました!
デフォルトの名無しさん、
本当にありがとうございました。
>>685 デフォルトの名無しさん,の部分なら私もワラタ.
C machineは動作保証できません。 とでもテンプレに入れとくかぁ。
>>687 おれはここや宿題スレにコードを貼る前に必ずgccでチェックしてるんだけど、
こっちでうまく実行できてるのにあっち(質問者)の環境だとうまく動かないというのは
例外なくCmachineで動かしてる場合だけだったな。
「またかよ」って何度も思ったもの。
だから動作保証できないって1もしくは2あたりに入れるのは賛成だな。
Cmachineってそんなにいいものなんだろうか。どういったところがいいんだろう。
使ったことないし使う気もないんだけど、どうなんですか、使ってる諸氏?
690 :
デフォルトの名無しさん :02/07/31 07:02
漏れ、Cしか使ったことがないので、 C++やC#の存在が気になります。 Cと比べて、どういった利点や欠点があるかおせーてください。
C#はCの子孫じゃないぞ。
>>688 ソースコードを書いた後スタートボタンを押すだけでコンパイルと実行を行えるところじゃない?
VC++でも似たようなことができるけれど高いし。
俺は使っていないけど・・・
>>693 スタートボタンを押しても、メニューしか出てこないのですが・・・?
gcc-2.95.4@Linuxな環境です。 #include<stdio.h> int main() { char* p; fgets(p, 10, stdin); printf("p=%s\n", p); return 0; } これって普通に実行できるもんでしたっけ? segmentation fault させるつもりだったんですが普通に動いてしまって 「あれ?」という感じなんですが。
697 :
デフォルトの名無しさん :02/07/31 13:15
>>696 たまたま運がよかっただけ。
もう少し長く読み込んでみて。
期待通りに動くだろうから( ̄ー ̄)ニヤリ
長く読み込む必要はないか。 pの値は不定(なはず)なんだから。
>>696 > これって普通に実行できるもんでしたっけ?
「未定義」では普通に実行できても良いし、 segmentation faultしても良いし、
鼻から悪魔が出てきても良いです。
>>697-699 なるほど。ある程度長く読まないといけないんでしょうか。
fgets で読む量を増やしてみたら期待通りになりました。
ありがとうございました。
あんまり鼻から悪魔って言葉を使ってるとお里が知れるぞ(w
>>696 「未定義」の場合、ある1つを除いた、あらゆる動作に可能性があります。
「ある1つ」とは、もちろん、あなたの期待した動作です。
>>702 それは間違いです。
たまたま期待したように動作したとしてもいっこうにかまいません。
もちろん期待したとおりに動作しなくてもかまわないわけですが
まあ、パルプンテみたいナモのだと思えばいい。
質問です。 OSをMeから2000に変えてから system("cls"); による画面クリアができないんですがなぜでしょう? エスケープシーケンスでの画面クリアもできないしど うしたらいいんでしょうか?
706 :
デフォルトの名無しさん :02/07/31 15:49
それはCの話題なのだろうか。
それはageるほどのことなのだろうか
へきへき
709 :
デフォルトの名無しさん :02/07/31 16:24
演算子の優先順位について教えてください 下記を動かすと"123"と出力されます &&の法が優先順位が高く、||,&&とも左から結合なので、 "231"と出力されると思っていたのですが、 なにか見落としがあるのでしょうか? printf("1")<0||printf("2")&&printf("3")<0; 環境:SunOS5.7+gcc3.0
<より||のほうが強いとか?
んなわきゃないね。
うちのmingwのgcc(3)とVC6なら123になったよ
>>709 演算子の優先順位と結合方向は、評価の順番とは関係ありません。
>>709 適当に答えとくと、実行結果が演算されてるからなんじゃねーの?
>>714 この形で順序依存の副作用を期待する式は使用できないのですね
ありがとうございました
試しにやった四則演算も"123"となりました
printf("1")+printf("2")*printf("3");
言い訳しとくと7行スレチャレンジ厨です フツーに使う気はありませんです
>>716 ついでにいうと、&&、||、? :は、シーケンスポイントを作り、かつ、左が先に評価されることが保障されてる。
それから a が偽なら、b、c は評価されない。
優先順位とは a || b && c が a || (b && c) と評価されるってこと。
コンパイル後にする「リンク」とは何者なのでしょうか…あれこれ調べましたが今ひとつよくわかりません 誰か解説していただけないでしょうか
>それから a が偽なら、b、c は評価されない。 うそかいちった。 b が偽なら、c は評価されない。 です。
>>719 > コンパイル後にする「リンク」とは何者なのでしょうか
オブジェクトファイルをつなげて実行ファイルを作成する作業
>>722 つまり、ネイティブコードの群れをまとめ上げてヘッダをくっつけて実行可能にするる作業、と考えてよいのでしょうか
725 :
デフォルトの名無しさん :02/07/31 17:39
>>719 どの辺のアドレスにどう配置するかを決定する作業。
>>725 それはリロケーションと呼ばれる、リンク作業の一部。
>>725 なんか、それだけ読むとローダーの仕事の感じもする。
728 :
デフォルトの名無しさん :02/07/31 17:53
関数へのポインタ宣言で質問です #include <stdio.h> int num(int,int); int main() { int (*p)(); int a=1,b=2; p=num; a=(*p)(a,b); } 本ではこれで成り立つはずなんですが VC++でコンパイルするとエラーになります 変数宣言の部分で int (*p)(int,int) と引数の型と数を指定すればエラーにはならないのですが これは本が間違っているのかVC++の仕様なのかわかりません どなたか教えてください。
本がCとか?
>>728 正確にはVC++の仕様ではなくC++の仕様
Cの場合、func()はint func(...)と同じ意味だが、
C++の場合、func()はvoid func(void)と同じ意味
なるほどC++の仕様でコンパイルされているんですね VC++で完全にC言語の仕様でコンパイルする方法はありますでしょうか?
拡張子は今cpp?
ちなみに本はC言語の本です
CPPです
ありがとうございます コンパイルできました!!
>>728 ちなみにその本の名前は?
int (*)()にint (*)(int, in)を代入するなんて事を教えるのはおかしいよ。
739 :
デフォルトの名無しさん :02/07/31 18:53
C言語の名前の由来って、ナニ?
B言語を知らない世代が登場!
>739 Computer Language
Assembly B BCPL C
おぉ、懐かしい BCPL = BasiC Precompile Langageのことだよね 要するにBasicのソースコードを生成するプリコンパイル言語 昔はこれであの面倒なN88-Basicの行数を意識せずにBasicを作っていたものだ
>>744 は?脳内プログラマ?
BCPLとBasicは別物だよ
>>748 あ、分からない人に教えろとは言わないから
大丈夫。(プッ
Введение
でもLangageまでネタかどうかは微妙
755 :
デフォルトの名無しさん :02/07/31 22:38
int a=3; float b=3.0; のとき、 (a == (int)b) は常に真ですか? さっき調べたら、0〜16777216(floatの最大)までは真 だったんだけど、どうも自信がなくて。
>>755 自信が無かったらやめなよ。多分大丈夫だとは思うけど保証はない。
757 :
デフォルトの名無しさん :02/07/31 22:44
マイナスはどうなる?
printf("俺も最近c始めたんだけどむずいですね");
>>755 別に16777215がfloatの最大じゃないぞ。
たしか、そのくらいで精度が1.0f超えた気がしたが
型をdoubleにして 300 000 000 までやってみた。 全部真だった。 でもやっぱり自信がない。
>>755 IEEE754(現在のほとんどのCPUで採用されている浮動小数点フォーマット)
について調べてみるといいと思われ。
単精度(float)の仮数部は23bit、正規化されてるので事実上24bitあって、
2^24=1677216だから、
>>759 の言うとおり1677215までの整数なら
誤差なく表現できる。
>>760 倍精度(double)の仮数部は52bit(同様に正規化により事実上53bit)なので、
32bitの整数なら誤差なく表現可能。
>>761 正規化しただけで、1ビット増えるわけではないのだが。
>>763 761じゃないけど、正規化で1ビット省略されてる分
> 事実上24bit
というのは正しいと思ったんだけど違うの?
あ、意味わかりました。 ∧_∧ (´Д` ) 切腹しますた / y/ ヽ Σ(m)二フ ⊂[_ノ (ノノノ | | | l )  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
うちの環境(x86 + gcc + linux)ではfloatは16777216が上限っぽい、 なぜだ?
>>766 16777216と16777217.0Fも一致してないか?
769 :
デフォルトの名無しさん :02/08/01 04:45
すみません質問です。 ポインタのキャストの意味が良くわからないのですが、実際のプログラムでポインタのキャストなんて使うことはありますか? int dt[10]; char *p; p=(char *)dt; ポインタは先頭アドレスだけを指すんですよね? だったらこんな一時的にポインタをキャストしても仕方がないと思うのですが・・・ 厨房の質問ですみません。 どなたか返事をお願いします。
>>769 いろいろとキャストなんて使うことはあります
>>769 次のプログラムを試してみそ。(実行する前に結果を予想してみること。)
int dt[10];
char * p;
p = (char *)dt;
*dt = 1234;
printf("%d %d\n",*p, *(int*)p);
>>769 一番ポピュラーな使い方はmallocでメモリを確保するとき。
mallocはvoid*を返すので、たとえば
char *cp;
cp = (char *)malloc(16); // キャストする
というふうにキャストが必要になる。
他にも使わざるを得ない局面はあるんだけど、
説明するのが面倒なんで略する。
773 :
デフォルトの名無しさん :02/08/01 05:40
>770 >771 >772 レスありがとうございます。 >771 実行結果は -46 1234 でした。 *(int*)p の意味が良くわからなかったので (int*)p でやって見たら -46 1245016 という良くわからない結果が出ました。 予想と全然違いました。 もうちょっと悩んでみます。 >772 そっちも頑張ってやって見ます。 ありがとうございます。
エディターでソースを書いた後それの 拡張子を.cにしたいのですがどうすればよいのでしょうか
775 :
デフォルトの名無しさん :02/08/01 06:58
>774 右クリックで名前の変更。
>>775 そうやってみたんですけど
「ファイル名.c.txt」になってしまいます
777 :
デフォルトの名無しさん :02/08/01 07:59
じゃあ、Dosでやってみて。 rename file1 file2 で。
「"」でくくって "test.c" で保存してみそ
#define MACRO(x) \ do { \ ... \ ... \ } while (0) マクロで上のようなことをしているものを時々見るのですが、 これってどんな意味があるのですか? マクロで関係ない変数を書き換えてしまったりするのを防ぐためなのかな、、 とか思うのですが外してるかも。
あ、すみません。ブラウザだとバッククォートが消えてしまいますね。 navi2ch だと見えるんですが。
s/バッククォート/バックスラッシュ/ (恥
MACROが関数のように使えて便利。 whileの後に";"が必要だったりするし。
>>780 if (test)
MACRO(x);
って書いたときのことを考えてみな。
do〜whileでくくってある場合とそうじゃない場合と。
>>783 ステートメント使ってるから関数のようには使えないじゃん
>>784 それなら{〜}でいいじゃん
なんでdo{〜}while(0)
>>784 あ、なるほど。
くくってないと意味が変わってしまいますね。
すごくすっきりしました。ありがとうございます。
>>785 だめよん。
if (test)
MACRO(x);
else
foo();
なんてやったときに、{}でくくってあったらどうなる?
なかなかやるな そこまでしてマクロにする理由は何なんだ?
790 :
デフォルトの名無しさん :02/08/01 15:44
structの使い方についての質問です。例えば、 struct A { int i; float f; };のようなstructを定義して、 これをmain()の中で、A *a=new a[10];(あるいは、A a[10];) として、他の関数の中で使うには、その関数はどう定義 すればよいのでしょうか?void func(A* a[]){}ではダメでした。 ここでいうfunc()の中で、a[5]->iを使いたいのです。 よろしくお願いします。
>>789 > ・それ以外
関数で渡せる「値」以外のものを扱いたい場合は、マクロにせざるを得ないな。
名前とか、型とか、角度とか。
>>790 void func(A* a)
void func(A a[])
>>789 >言語の規格書をおもちゃにしながら
なるほどおもしろそうじゃん
>>791 そこまでやるか
794 :
デフォルトの名無しさん :02/08/01 16:02
typedef struct { int i; float f; } A;
796 :
デフォルトの名無しさん :02/08/01 23:49
goto文についてですが /*ここから*/ if(処理A) { 後始末; return FALSE; } /*ここまでが何回か続く*/ 後始末; return TRUE; な場合、 /*ここから*/ if(処理A) goto LABEL; /*ここまでが何回か続く*/ 後始末; return TRUE; LABEL: 後始末; return FALSE; のようにgoto文使った方がいいのでしょうか? それとも他に方法があるでしょうか? (要は何度も後始末の処理を書きたくない。(後始末は関数化するようなものでもない)) ちなみに、マクロはあとあと読みにくいので却下の方向で。
797 :
デフォルトの名無しさん :02/08/01 23:59
>>796 意味不明。
おまえはとりあえずCはやめておいたほうがイイゾと、忠告しておく。
>>796 そういうケースでgotoを使った方が分かりやすくなるなら、無理な書き方を
してまでgotoを避ける必要はないと思うよ。
>>797 意味不明かなあ? 言いたいことは一応理解できたが…。
>799 俺も意味不明なんだが?結局「後始末」2回書いてるし、前半と後半でどこが違うんだ?
801 :
デフォルトの名無しさん :02/08/02 00:12
>>796 は
if(.....) return TRUE;
else return FALSE;
と
if(......) return TRUE;
return FALSE;
をgotoをつかって悩むというつわものと見た。
おとなしくtry〜catch使いまつ‥‥
>>800 あー、確かにそう言われると例が変か。
int result = FALSE;
初期化A
if (初期化A失敗) goto fail_A;
初期化B
if (初期化B失敗) goto fail_B;
初期化C
if (初期化C失敗) goto fail_C;
何かの処理
result = TRUE:
Cの後始末
fail_C:
Bの後始末
fail_B:
Aの後始末
fail_A:
return result;
gotoを使った方がシンプルに済む例。
>>796 ヲイ。C++でいいのかよ(笑)。
C言語スレだからCの文法の範囲で解決する必要があるのかと思ったら。
>803 俺は↓こうするけどなあ。 初期化A if(初期化A成功) { 初期化B if(初期化B成功) { 初期化C if(初期化C成功) { 何かの処理 result = TRUE; } Cの後始末 } Bの後始末 } Aの後始末 return result;
>803 俺だったらこうだな。 int function(void) { 初期化A; if( !(初期化A成功?)) { Aの後始末; return FALSE; } 初期化B; if( !(初期化B成功?)) { Bの後始末; return FALSE; } 初期化C; if( !(初期化C成功?)) { Cの後始末; return FALSE; } 何かの処理; return TRUE; } >805 処理Zぐらいまであったら26重ネストになってまともにコード見れないじゃん。
>806 完全に勘違いしてると思われ >>処理Zぐらいまであったら26重ネストになってまともにコード見れないじゃん。 それはまあ確かにそうなんだが、 そもそもそんなコードはgoto使ったって読みにくいし、他に解決策を探すべきだろう
>806 てゆうか「何かの処理」にAもBもCも必要なんだろ? と一応つっ込んでおいてやる
>806 一瞬、みかかのソースかと思った(汗) ↓こんなの int function(void) { int status; int ret; status = TRUE; ret = 関数A; if(ret != FALSE) { Aの後始末; status = FALSE; } if (status != FALSE) { ret = 関数B; if(ret != FALSE) { Aの後始末; Bの後始末; status = FALSE; } } if (status != FALSE) { ret = 関数C; if(ret != FALSE) { Aの後始末; Bの後始末; Cの後始末; status = FALSE; } なんかの処理; if (status != FALSE) { ret = 関数D; if(ret != FALSE) { Aの後始末; Bの後始末; Cの後始末; Dの後始末; status = FALSE; } } } return status; } 実際はステータスが10個以上あるから、どこで何してるかサッパリ。
あう。 × if(ret != FALSE) { ○ if(ret == FALSE) { 普通、エラーチェックは if(ret != TRUE) { だろっ!っていうのも今回のツッコミどころです。
>809 まあ絶対マネしてはいけない例としてはよかったよ
>805 確かに完全に勘違いしてた。スマソ。 で、代わりにこんなの考えて見たけど typedef struct { void (init*)(void); void (after*)(void); } FUNCS; void init_a(void) { 初期化A; return Aの初期化成功?; } void after_a(void) { Aの後始末; } // 以下B,Cも同様に関数を定義 int function(void) { FUNCS f[]= { {NULL, NULL}, {init_a, after_a}, {init_b, after_b}, {init_c, after_c}, {NULL, NULL}, }; for(f++; f.init!= NULL; f++) { if(!f.init()) { for(;init!= NULL; f--) { f.after(); } return FALSE; } } 何かの処理; return TRUE; } ・・・変に関数大量に作らないといけないし、だめっぽいな。 俺は>803の方が良いと思う。 つーか元の話とずれて来るな。鬱。
ぅぁ、typoだ。 × >805 ○ >805=>807 × void (init*)(void); ○ int (init*)(void); × void init_a(void) { ○ int init_a(void) { スマソ。
>>810 > 普通、エラーチェックは
> if(ret != TRUE) {
> だろっ!っていうのも今回のツッコミどころです。
とか言っちゃうような香具師に文句言われたくないな。
815 :
デフォルトの名無しさん :02/08/02 02:36
ウェイトをかけるときにはどうすればいいのでしょうか? あと、関数表をダウンロードできるサイトがあったら教えてください。
>812==806 >>・・・変に関数大量に作らないといけないし、だめっぽいな。 うむ。しかも質問者は「後始末」は関数にしたくないと言うておるのに(^^;;;
>815 >>ウェイト sleep()またはusleep() >>関数表 知らん
820 :
デフォルトの名無しさん :02/08/02 02:55
>>817 ありがとうございます。sleep使ってもエラーが出ていたので聞いたのですが、コンパイラが悪かっただけのようです。
>>818 ありがとうございます。勉強します。
821 :
デフォルトの名無しさん :02/08/02 02:57
>>819 お金に余裕なんてありません(;´Д`)
>>819 せっかくコテハンやってるんだからもっとレアな本紹介してくれよ
期待して見ちゃったじゃねーか。
>>822 そう言われると辛い…w 入門用にはいいかと思って紹介したのですが.
>>815 標準的な方法はループとclock()を組み合わせる方法だけど、UNIX系ならsleepを、WindowsならSleepを使った方がよい。
>>820 sleepじゃなくてSleepにしてみたら?あ、windows.hをインクルードしてね。
ウィン厨の夏 2chの夏
DATA*p= 初期化(); if (p) { 処理(p); 後始末(p); }
828 :
デフォルトの名無しさん :02/08/02 10:35
typedef struct hoehoe { struct hoehoe *mode1; struct hoehoe *mode2; } STRUCT_HOEHOE; typedef struct hoge { STRUCT_HOEHOE hoe; long flg; intfrag; } STRUCT_HOGE; と宣言して、 STRUCT_HOGE ahya; というグローバル変数を確保して、 ahya.hoe->mode1 とか ahya.hoe->mode2 を参照した場合、何を参照していることになるの?
間違い。 struct hoehoe { struct hoehoe *mode1; struct hoehoe *mode2; } STRUCT_HOEHOE; typedef struct hoge { STRUCT_HOEHOE hoe; long flg; intfrag; } STRUCT_HOGE; と宣言して、 STRUCT_HOGE ahya; というグローバル変数を確保して、 ((STRUCT_HOEHOE *)(ahya.flg))->mode1 とか ((STRUCT_HOEHOE *)(ahya.flg))->mode2 という記述をした場合、何を参照していることになるの? 先輩のソースなんだけど何やってんのかさっぱりわからない コンパイル通るしワーニング出てないので正しいんだろうけどわからない
>>829 そりゃ、キャストすれば何でも通るよ。
コンパイラにもよるが、この場合flgやfragがmode1やmode2の
代わりに使われる*かもしれない*ね。
そうなのか。で、 typedef struct hoehoe { struct hoehoe *mode1; struct hoehoe *mode2; } STRUCT_HOEHOE; ここのmode1とmode2は何を指すの? あ、さっきはtypedef忘れてたんだけどね。
>>829 printf("%p\n", &(((STRUCT_HOEHOE *)(ahya.flg))->mode1));
ってな感じに片っ端からアドレスを表示してみたら。
typedef struct hoge { STRUCT_HOEHOE hoe; ←おそらくここのmode1,2を参照してるつもり long flg; intfrag; } STRUCT_HOGE;
fragなの?
その先輩はつるし上げたほうがいい。
>>834 fragなんじゃない。一応そういう単語あるみたいだし…
端数ということか
blowfishっていう暗号をC言語でしたいんですが
gcc-cygwinとgcc-mingwはどっちの方が優れてる? 実行速度やコンパイルされたファイルのサイズで。
同じ翻訳エンジンを使って居るんだから差はない。 cygwinのランタイムより速い物を自前で書けるなら、 mingwの方がいいかもしれない。
843 :
デフォルトの名無しさん :02/08/02 17:27
すみません。 char a[]="なんらかの文字列"; という長さ・内容不定の文字列があり、始めから1文字づつTextOutでウインドウに表示したいのですが、 たとえば”あ”と”a”ではバイト数がちがうので、 int i=0;///グローバル mainloop(){ TextOut(hdc,0,0,a,i); i++; } なんてやるとローマ字はちゃんと表示されますが”あ”などの日本語になるとゴミになってしまいます。 かといってi+=2とやると今度はローマ字のところがおかしくなります。 この違いを自動認識するにはどうすればよいのでしょう。
>>843 全然関係ないが
> int i=0;///グローバル
> mainloop(){
> TextOut(hdc,0,0,a,i);
> i++;
>}
なんで
mainloop(){
static int i=0;
TextOut(hdc,0,0,a,i);
i++;
}
にしない理由を小一時間問いただしたい。
>>845 おそらく先頭から出力しなおすとかやるんだろうが、それなら普通
struct hoge {
int i;
char *a;
};
struct hoge x = {0, "なんらかの文字列"};
mainloop(&x);
としそうなもんだが、なんせ3年間文字種判別をやったことがないという御仁
だから、構造体も使ったことがないのだろう。
すみません。 サンプルの関数は本モノを最小限に縮めて書いたものです。 ですから本来はあるクラスに DrawText(int dx,int dy,char* str,int n)というメソッドがあり、nに何文字出力するか指定します。
849 :
デフォルトの名無しさん :02/08/03 10:26
ある変数が整数型であるか、実数型であるかを 判別する標準ライブラリ関数ってありますか?
852 :
デフォルトの名無しさん :02/08/03 11:51
遅スレ(Aの初期化とかがメモリ確保とかなら) --- if(A初期化失敗 || B初期化失敗 || C初期化失敗){ if(Aが初期化されてる){ Aの後始末; } if(Bが初期化されてる){ Bの後始末; } if(Cが初期化されてる){ Cの後始末; } return FALSE; } 何らかの処理; ABCの後始末; return TRUE; --- で良いのではないのか? メモリ確保じゃなければ、 ABCそれぞれに初期化実施チェックフラグ 作ってチェックすればよいし。 後始末は関数に分けた方が、綺麗だと思うが。 激しく勘違いしてたらスマソ
質問です。 C言語ではDOSアプリケーションしか作れないのですか? 私はWin用のアプリケーションを作ろうと考えているのですが… どうでしょう?やはりC++じゃないとだめですか? それから、C言語でRPGを作ることは出来ますか?
854 :
デフォルトの名無しさん :02/08/03 12:45
Windowsの.iniファイルのようなフォーマットに もうすこし行順の制約や可変個数のパラメータを 持ち込んだようなファイルがあるのですが、 +SectionA arg1:param1 arg2:param2a,param2b,param2c +SectionB : : このファイルの読み込みに、lex/yaccを使うのは 変ですか? 或いは無理ですか? それとも、いたって普通の有りがちな実装方法ですか?
どうやればいいのですか?
>857 win32api あたりでぐーぐれば吉
>>858 ど、どういうこと?win32apiって何ですか?
>859 C言語でWindowsアプリ作りたいんでしょ?
Windowsアプリの入門者は "猫でもわかる" で検索しなさい。
862 :
デフォルトの名無しさん :02/08/03 14:50
ASPみたいなものをつくりたいです。
>859 あのね、 >858を解説するとね、 グーグルで「WIN32API 解説」という キーワードで検索してみれば? ということなのね。
>863 某ダウソ住人ハケーン
865 :
デフォルトの名無しさん :02/08/03 23:20
>>859 Win32APIとはマイクロソフトが開発している
XBOXと次期Windowsの共通開発言語です。
char (*h)[50]; h=(char(*)[50])calloc(10*50,sizeof(char)); hという配列を,関数にポインタで渡して使いたいのですが, void kan(char *hairetu[50]) { for(int i=0;i<10;i++) h[0][i]=5; } ではおかしいですよね どのようにすればいいのか教えてください
>>866 void kan(char (*hairetu)[50]) または void kan(char hairetu[][50])
>>866 void kan(char (*hairetu)[50])
kan(&h[0][0]); っていうふうに渡すのでしょうか?
871 :
デフォルトの名無しさん :02/08/03 23:31
>>866 そういうソースをかくひととは仲良くなりたくありません。
こたえるのはイヤ。
>>870 kan(h) または kan(&h[0])
873 :
デフォルトの名無しさん :02/08/03 23:41
866ですけど・・・
>>871 タンに教えて欲しいです(*´-`*)
>>870 ポインタについて修業し直せ。
C言語はポインタに始まりポインタに終わる
仮引数の型が分からないっていうのは char (*h)[50]; h=(char(*)[50])calloc(10*50,sizeof(char)); これ自体理解してないのではない?
877 :
デフォルトの名無しさん :02/08/04 00:30
とりあえずキモイコードである事には違いない。
別にキモクはないだろ。あるとすれば char (*h)[50]; h=(char(*)[50])calloc(10,sizeof(char[50])); のほうがよい
ポインタが理解できない初心者です。 char *strcpy(char *dest,const char *src) の↑にどうして*がないとだめなんですか? なんとなく配列はかえせないからポインタをかえすんだろうな というきはするんですが。 どなたかご教授お願いします。
880 :
デフォルトの名無しさん :02/08/04 01:52
>>880 ありがとうございます。
なかなか独学だと2,3回本呼んだだけで理解できないですね。
・・・・・がんばります。
>>879 厳密には配列というデータは存在しないという事は覚えておくといい。
このへん書いてある本少ないからしゃあないが。
「配列というデータ」?????????
ポインタ:データを置いてる場所を示す(ポイントする) char型のポインタ:char型のデータを置いている場所を示す この場合、char型のポインタとわかっていなければ該当アドレスにあるデータが何なのか分からないんでしょうか、 それとも何型のポインタとして用いるかはプログラマに任せられているのでしょうか char *chptr; chptr = "stringA"; int num; num = *chptr + *(chptr + 1); このようにすれば*chptrの指すデータ(s)と*(chptr + 1)の指すデータ(t)をint型と解釈して(それぞれ115,116)足すことになり、 numの値は231となるわけで… こう見ると後者(何型のポインタとして用いるかはプログラマに任せられている)が正しいように思えるのですが、どうなんでしょうか
>num = *chptr + *(chptr + 1); これはchar型で加算を行なって、その結果をintにキャストしています。 ので、charがsignedな環境では結果は負数になるはず。 >何型のポインタとして用いるかはプログラマに任せられている これは正しい
chptr が char* から int* になるわけではないよ。 > *chptr + *(chptr + 1) この両オペランドが演算時に char 型 から int 型に変換されるだけ。
ディレクトリを作る関数って何でしたっけ? system()を使うのは不可。
>>889 Linux(gcc), Win(Visual C)共に、mkdir(dir,attribute)で出来ました。
891 :
デフォルトの名無しさん :02/08/04 11:27
>>890 Windowsでは引数はひとつだぞ。direct.hをインクルードしないと文句言ってこないけど。
>>890 WinはAPIレベルではCreateDirectory。
>884 >ポインタ:データを置いてる場所を示す(ポイントする) データってなに?この考え方だと関数ポインタが説明できないよ。 関数がデータだっていうのならこれでもいいかもしれないが。 場所って言う言葉がでるあたりが理解してないんじゃないかなと感じるところ。 ポインタ:オブジェクトを指すオブジェクト。 ここでいうオブジェクトは名前付きのメモリ領域のこと。
質問です。 その1、clsを使うにはどのヘッダーファイルをインクルードすればよいのですか? その2、sleep()を使うにはどのヘッダーファイルをインクルードすればよいのですか? その3、DOS画面の背景の色を変えることは出来ますか?
1.外部コマンドならstdlib.hのsystem()を使って呼び出す 2.Unix?Windows(windows.h)のSleep()しかしらない。 3.MS-DOSならANSIエスケープシーケンスをサポートしてるから それでできるけども、Windowsのコンソールはどうだったか
>>895 って、出来ませんでした;
#include<stdlib.h>
main(){
system();
}
こういうことですか?
system("cls") ;
>>898 やった!できました!どうもありがとうございます!
900 :
デフォルトの名無しさん :02/08/04 15:57
Cをタダで手に入れる方法はありませんか?もし無いなら一番安い入手方を 教えてください
901 :
デフォルトの名無しさん :02/08/04 16:01
あります。
また質問です。 文字を画面の中心に表示させるにはどうすればいいのでしょうか。
908 :
デフォルトの名無しさん :02/08/04 16:12
コンソールプログラムをつくってるんだったら (80-半角で数えた文字列の長さ)/2個のスペースを入れればいいんじゃないの
また質問です。 文字の大きさを大きくすることは出来ますか?
>904 めんどい #include <stdio.h> #include <windows.h> #include <stdlib.h> int main() { HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE) ; COORD cPos = {30, 12} ; DWORD x ; system("cls") ; hConsole = GetStdHandle(STD_OUTPUT_HANDLE) ; SetConsoleCursorPosition(hConsole, cPos) ; printf("abcdf") ; WriteConsole(hConsole, "ghijk",5, &x, NULL) ;/*Win32API*/ return 0 ; }
>>909 おおきく・・・ですか?(*´Д`)はぁはぁ
913 :
デフォルトの名無しさん :02/08/04 17:08
えーっと、その… アプリケーションをですね…あのですね、 終了させるにはですね、あの、 えーっと…どうすれば、いいのだったかな?
右上のばってんをおせばいいんじゃないのかな?
917 :
デフォルトの名無しさん :02/08/04 17:35
コンセント・・(以下略
原子力発電所・・(以下略
質問です。 midファイルを再生させることは可能ですか。 もし可能なら、どうやるのですか。
>>913 配線ごと引き千切る。
(ヤマトの真田さん直伝)
次スレの1は圭子タン、キボンヌ
>923 自分ができないことを棚に上げて、他人に「できないのですか?」なんて言うなYO!
>920 検索するとできるようになるよ。
927 :
デフォルトの名無しさん :02/08/04 20:48
√を使おうとして #include <math.h> を使ったのですが コンパイルしようとすると ファイル名.obj(ファイル名): Undefined symbol :sqrt_ というエラーメッセージが出てプログラムがうまく動きません これはどうすればいいのでしょうか
928 :
no name :02/08/04 20:49
#include<stdio.h> int yukuri(int,int); main(){ int m,n; printf("???ツ?フ?????????ヘ?ケ?? ?,?"); scanf("%d,%d",&m,&n); printf("?ナ?????????ヘ%d?ナ?キ\n",yukuri(m,n)); } int yukuri(int m1,int n1){ /*???[?N???b?h?ン???@(???ォ?Z)*/ if(m1=n1){ return m1; } else if(m1>n1){ return yukuri(m1-n1,n1); } else{ return yukuri(m1,n1-m1); } } /*?P?Q?W?ニ?V?Q?ナ???チ?ト?ン?ス???セ?ッ?ヌ?、?ワ?ュ?「?ゥ?ネ?「???ナ?キ.HELP me!!*/
>>927 コンパイラ書かないバカには教えない。 -m
932 :
no name :02/08/04 21:01
#include<stdio.h> int yukuri(int,int); main(){ int m,n; printf("??ツ?フ???????ヘ?ケ???,?"); scanf("%d,%d",&m,&n); printf("?ナ??????ヘ%d?ナ?キ\n",yukuri(m,n)); } int yukuri(int m1,int n1){ /*???[?N???b?h?ン???@(??ォ?Z)*/ if(m1==n1){ return m1; } else if(m1>n1){ return yukuri(m1-n1,n1); } else{ return yukuri(m1,n1-m1); } } /*finish!!*/
>>932 いい加減SJISで書こうな。
man nkf
とかやってみ?
>>923 「C言語」にはMIDI再生機能はないよ
できるのはMIDIデバイスへデータを送信するくらいかなw
>>934 妙に簡単だけどね。タイミング考えないなら。
936 :
no name :02/08/04 21:07
nkf -sやってみました。 すんまそん
937 :
デフォルトの名無しさん :02/08/04 21:18
すいません
>>927 です
コンパイラは「lsic試食版」を使ってます
どうすればいいんでしょうか
>>938 -lmath かな? いや、知らないけど
>>942 > lcc aaa.c -lmath
というように、オプションをつけてみろってことでは?
>>943 こんどは
llb @link.i
llb: math.lib: No such file or directory
とつっぱねてきました
>>944 ちゃんと設定ファイルに LIBRARY のパスを設定してる?
>>944 ヘルプぐらい読もうね馬鹿チン
-lmathlib
>>946 おお!!
来ました!
ありがとうございました
ど素人なものでヘルプを読むとかそういう
考え方ができませんでした
すいません
今度からヘルプを参照してみます
948 :
デフォルトの名無しさん :02/08/04 22:08
今のレス見て思ったんですが、こんなに必要になる math.h が、
標準ライブラリに入っていない理由って、何でしょう。
外部の数値演算ライブラリをいろいろ使いたいからでしょうか?
コンパイラによってオプション指定がばらばらだから、
>>944 のような質問が後を絶たない気がします。
950 :
デフォルトの名無しさん :02/08/04 22:20
あんまり使わないよね
>>948 そりゃ、実行ファイルのサイズが大きくなるからだろ。
(´-`).。oO(つーか、今更LSI-Cかよ‥‥)
LSI-Cって何?
957 :
デフォルトの名無しさん :02/08/04 23:06
959 :
デフォルトの名無しさん :02/08/05 00:24
C言語 ファイルポインタを使って円の面積を計算するプログラム、教えてください。 ファイルポインタには半径1から10の数値があります。 出力結果は次のようになるようにして下さい 半径 面積 1 2 3 ・ ・ 10
960 :
デフォルトの名無しさん :02/08/05 00:26
なんでファイルポインタを使うのか良く分からん。 「ファイル上の10個の数値を使って・・・・」ならまだしも。
ファイル上の10個の数値を使って・・・・ということです。
962 :
デフォルトの名無しさん :02/08/05 00:28
それに数値の型も必要だ
数値はdouble型で
floatがいい
>>964 なぜわざわざC言語でfloatを使おうとするのか小一時間(略
floatの代わりにfroat使ってはいかが? typedef float froat;
ワラタ。不毛すぎw
968 :
デフォルトの名無しさん :02/08/05 01:03
969 :
デフォルトの名無しさん :02/08/05 01:07
ネタっぽいが ファイルの入出力、円周率の計算、表示 の全てを聞いているなら以下様々な洗礼を受けると思われ。
#include <stdio.h> #define PI 3.14 /* 円周率 */ main() { float r, S; scanf("%g", &r); S = r * r * PI; /* 円の面積 */ printf("%g\n", S); } こんな感じのを *fp使って、ファイルには1から10の数字は与えられている場合どうするの?
FILE *fp; を使いたいんだが
972 :
デフォルトの名無しさん :02/08/05 01:15
const charfilename[] = "ten_floats.dat"; float ten_float_ctrl[10] = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0},ten_float[10]; FILE*stream = NULL; stream = fopen( filename, "a+" ); if(stream){ //fwrite((void*)&ten_float_ctrl[0],sizeof (float),10,stream); fread((void*)&ten_float[0],sizeof (float),10,stream); fclose( stream ); } あとはデバッガで追っていじってちょ。
もう少しシンプルにならない? #include <stdio.h> main() { float r,s FILE *fp みたいな形で
もう少しシンプルにならない? #include <stdio.h> main() { float r,s FILE *fp みたいな形で
975 :
デフォルトの名無しさん :02/08/05 01:23
>>974 お前は数値を一個づつファイルから読ませたいのかと。
・・・以下略
main(){ FILE *fp=fopen("num-list","rt"); float r; char s[80]; fgets(s,78,fp); sscanf(s,"%f\n",&f); printf("%f\n",r*r*PI); }
>974 天然君? 972のプログラムが理解できないならプログラムしないほうがいいよたぶん。
>>970 1から10まで与えられていることが分かっているのであれば、
こうでいいんじゃないか?
#include <stdio.h>
main()
{
FILE *fp = stdout;
fprintf(fp, "1 3.14\n2 12.56\n3 28.26\n4 50.24\n5 78.5\n6 113.04\n7 153.86\n8 200.96\n9 254.34\n10 314.0\n");
}
ついでにどなたかご教授お願いします。 #include <stdio.h> main() { FILE *fp; char buf[100]; printf("ファイル名を入力しなさい"); gets(buf); /* getsならファイルに書き込みできるけど * fgets(buf,100,stdin)ならファイルに書き込みできません。 */ fp=fopen(buf,"w"); if(fp == NULL) { fprintf(stderr,"エラーです"); } fprintf(fp,"123"); fclose(fp); } (getsのbuf)と(fgetsのbuf)は、何がどう違うのですか?
#include <stdio.h> #define PI 3.14 /* 円周率 */ main() { float r, S; scanf("%g", &r); S = r * r * PI; printf("%g\n", S); } こんな感じのを *fp使って、ファイルには1から10の数字は与えられている場合どうするの?
面積計算は必要です。
出力は 1 3.14 2 3 ・ ・ な感じになるようにお願いします
>>979 getsとfgetsの仕様の違いに引掛ってるな。
getsは末尾の'\n'を取り除くが、fgetsは取り除かない。
だから、たとえば
fgets(buf, sizeof(buf));
の入力待ちで
hoge[cr]
したとき、bufに入ってる文字列は"hoge\n"だ。
"hoge\n"なんてファイル名は普通ないから、それで開けないのだろう。
末尾の\nを取り除くべし。
すまん、細かいところ間違えた。 fgets(buf, sizeof(buf)); /* × */ fgets(buf, sizeof(buf), stdin); /* ○ */ だったな。
この時間だと人少ないし、次スレ立てておくかね。
>>983 そうか!!
それを忘れてた!!!
ありがとうございます。
かれこれ5時間位なやんでました。
ん?
ん? 埋め立て DigDug
埋め立て〜
埋めるずら
ぺったんぺったんお餅つき
,,,,;;;;;;;;;;;;;;;;;;;;,,,,,, ,,;;;;;;;;;;;;;;;;;;;;;;---、;:;:;:;:;:,,, /;;;;;;;;;;,-'''" ゙'''ヽ;;;;;;ヽ /;;;;;;;;;''' ヽ;;;;l /;;;;;;;;;'" _ヽ、 r‐、'" ) i';;;;;;;;;;; ,,;;;;;;-=ヽ、 / / / |;;;;;;;;;;| ,,,,,;;;;;;;;;-、 ‐'"゙_,,,,,,,_\ r‐、' ヽ/ヽ/゙l |;;;;;;;;/ /-─'''''''"ヽ "‐=二 ̄ヽ、 い〜ち / ノ / /、ノ |;;;;;;| '",,,-==‐ ヽ " 、 ヽ に〜い /ヽ、/ヽ/ヽ/ / ,┴、;| ==ニ-‐'" , ヽ、 ゙i せんげっと /ヽ、/ / /、_/ |l |ヽl /l .)\ i / /--/、/_ / \|lノl /└-‐ヽ-‐' ヽ i / ─'''" ''、/ l、 ゙| / ,,---'ニ=メ i .| / / ヽ-i i' /-l「ヽ┼+// ;; / ./ ─-、__,,-- / ヽ、 ヽ=ヽ─++-''ノ /、 / / ̄ヽ ,,,,\ ヽ ゙‐─''''''"~ / ヾヽ、 / / ゙\____,,-''''" \ / ) ./ / l'" ヽ、 \ヽ、 / / l l __,,,,ノ \ ゙''ヽ 、,,,__,,;-'" / l ,,,-─''" ヽ、,,, ,,‐" 人 ,,,,,,─''" ゙゙゙'''''''''''''''"~ -‐''''"/
またーりげとー
( ´∀`)取ろうかなぁ
げげ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。