1 :
デフォルトの名無しさん :
2007/06/13(水) 20:48:18
2 :
デフォルトの名無しさん :2007/06/13(水) 20:51:07
3 :
デフォルトの名無しさん :2007/06/13(水) 20:57:12
4 :
デフォルトの名無しさん :2007/06/13(水) 22:41:12
オススメの書物教えて テンプレない?
do{}while()って書いてエラーを出した私が来ましたよ while(){}にはセミコロンいらないのに・・・
やっぱり上級者のミスじゃないね。
do { foo(); } while(hoge); と書いたら、do が見えない位置だと while が do-while の while か、それとも白文をとるだけの while か見分けがつきにくいので、 do { foo(); } while(hoge); か do { foo(); } while(hoge); と書け、という話なら聞くな。
インデント論争はやめような^^
>>8 >と書け、という話なら聞くな。
これは「聞かなくていい」という意味なのか「そういう話をよく聞く」の意味なのか
流れからだと後者だけど、そういうことでおk?
そもそもdo whileにしたい場面ってのにあんまり遭遇しないな
defineマクロが書かれてるときに結構見る気がする
教科書なんかだと入力を求めてそれが正しい範囲内じゃなければ再入力を求めるときに よく使われてるね。
たまにbreak使いたいだけでdo whikeっ使ってるのを みかけるな。あれはどーなんだ
break使いたいだけならwhile(1)でもよさそうな・・・
それだと最後にもかならずbreak入れなくちゃならないじゃない
breakするならwhile(1)のほうがいいだろ。 breakするかどうか判断した後while()でも判断するのは無駄としかいいようがない。
>>14 そういう目的外使用の変なコードを書くくらいならgotoを使うな。
どういう状況なのかわからんけど、そもそもそういうbreakが必要になるような
コードを書かないというのが正解じゃあるまいか。
どうしても必要ならgotoを。
>>19 goto使わず無駄にbreakとcontinueを大量に使ってる処理見ると疲れるよね。
gotoを使っちゃいけない理由を考えたことはないからなのかな?
>>20 うん疲れる。
だいたいbreakとかcontinueってのはgotoの一種で、
ループ内でよく使うものだからそれ専用に用意してあるんだよね。
なのでその目的から外れた使い方をしたらそれはgotoの乱用に近い
ひどいスパゲッティになるのは当然だったりする。
Tiny C(windows版)でリソースをリンクする方法はありませんか?
>>21 俺はそれに加えてreturnも同様に感じるんだが・・・
これには同意してくれない人もいるからひっそりと心の中にしまっているw
>>17 do { ... } while(0); のことだろ。
switch(0){}とかどうだろう いや、使わないけど
case 0: か default: もいるな。
あれ、switchで中にcaseやdefaultが無い場合って処理系依存? 深く考えたこと無かった・・・ 使わないし。
>>27 なんで処理系依存になる必要がある?
条件に該当するケースが存在しないってことでスルーするだけだろ。
>>28 ジャンプさせないから全部中を通過するもんだと思ってた
bccでコンパイルしたんだが、よく見たら「実行されないコード」って警告がでてる
でもswitch(0){printf("test");}ってやってもtestが出力されるし・・・よくわからん
continueやbreakは行き先がすぐわかるのに、 gotoは前に飛ぶか後ろに飛ぶか、すぐにわからない、 どこに飛ぶかラベルを探さなくちゃいけない。 だから嫌われてるんだろ?gotoって
うぜー他所でやれ
33 :
デフォルトの名無しさん :2007/06/14(木) 08:23:59
うぜー此所でやれ
ついでに言えば変数宣言の扱いが面倒になるから、switch よりは do-while(0) のがいいな。
なんか面倒なことってあったっけ?
case内での変数宣言のことだろう。
37 :
問題♀16歳 :2007/06/14(木) 15:21:44
実数を1つ入力して、小数点以下第一位を四捨五入して結果を表示する。 ただし、if文を使用すること。
{ } を付けるか、case より前で宣言し初期化はしないか、のどちらかだな。
40 :
問題♀16歳 :2007/06/14(木) 15:26:47
スレ汚しごめんなさい。 ホントは21歳♂です。
氏ね
>>29 アセンブリでみるとswitch(0)の部分の比較演算はしているがその後のジャンプ命令がなく
すぐにprintf("test");の命令が来る
case 文がある場合は比較の後にそれぞれへのジャンプ命令がくる
他のコンパイラがどういう挙動か知らないけど
コンパイラの問題な気が、やっぱりBCC
43 :
デフォルトの名無しさん :2007/06/14(木) 17:13:05
void main(){ unsigned char matrix[a][b][3]; foo(a, b, matrix) } foo(int a, int b, unsigned char matrix){ matrix[a][b][3]; } rawデータで縦a画素、横b画素、cの0〜2にはそれぞれRGBが対応していて、 こんな感じで3次元配列の受渡しをしたいのですが、 aとbは画像ごとに異なるので一定ではありません。 この場合は受け渡しはできないのでしょうか?
foo って何の略ですか?
foo / bar の foo 略ではない。RFC3092を見よう
47 :
43 :2007/06/14(木) 18:48:27
>>44 ありがとうございます。
書き忘れてしまったのですが、環境がVisual Studio 6.0なので
1次元配列にして扱うしかなさそうですね。
>>36 >>38 caseがひとつなら問題にならないんじゃない?これも処理系依存かもしれんが
>>42 試しにVS2005でやったらスルーした
bcc(と私の頭)がアレだったぽい
ifの中の書き方で質問です。 if( a==c && b==c ) は、 if( a==b==c ) と書いてもいいんでしょうか?
意味が違ってくるからダメ
51 :
49 :2007/06/14(木) 20:19:19
意味が違ってくるってどういうことですか?
いいわけねー a==b==cは a==bが1か0に評価され 1==c 0==c の判定が行われるからまず期待通りにはならないだろう
53 :
49 :2007/06/14(木) 20:27:18
コンパイルできるんですが、ダメなんですか?
>>53 コンパイル通ってるなら問題ないよ。全然OK。
53の馬耳東風っぷりにフイタ
58 :
デフォルトの名無しさん :2007/06/14(木) 21:04:12
if( a==b==c )はコンパイルできるか??
コンパイルは出来ると思うが。
括弧つけると if ((a == b) == c) こうなる
62 :
デフォルトの名無しさん :2007/06/15(金) 00:31:31
>>40 ゼミか何か?俺ほとんど歳同じだけどこれはできるw
63 :
デフォルトの名無しさん :2007/06/15(金) 01:20:14
すみません。質問です。 C言語で画像処理をおこなうプログラムを書いているんですが 、処理後の画像の数箇所で毎回違う計算結果がでてきます。 ビットシフトなどを多用してる複雑な計算をやらしてるんですが、 複雑な計算をやらしてると毎回違う答えがでたりするものなんですか? なぜ計算結果が毎回違うかよくわかりません。
ふーん。それからそれから。
・ どっかの変数の初期化忘れ ・ バッファオーバーラン のどっちかだろ、どうせ。
66 :
デフォルトの名無しさん :2007/06/15(金) 02:58:36
参考書を読んでてわからない箇所があるので宜しくお願い致します。 以下参考書依り抜粋 "もし、1要素で0,1,2の3値を表現できる「要素A」と 0,1,2,3の4値を表現できる「要素B」があったとする これらの要素を用いて1000通りの情報を表現するのに 必要な要素の数(桁数と言ってもよい)は、「要素A」では7個 「要素B」では5個であり、10ビット必要な2進数に比べて 桁数はすくない" ここでわからないのが、 "これらの要素を用いて1000通りの情報を表現するのに 必要な要素の数(桁数と言ってもよい)は、「要素A」では7個 「要素B」では5個”で、どうして7個と5個なんでしょうか?
3^6<1000<3^7 4^4<1000<4^5
68 :
66 :2007/06/15(金) 03:12:44
>>67 レス、ありがとうございます。
う〜ん、難しい・・・です。
どうして、3^6、又は4^4<なんでしょうか?
3の6乗が729で4の4乗が256なことに理由なんてない。 3進数で1000を表すと1101001で7桁、4進数だと33220で5桁になるってだけのこと。
70 :
66 :2007/06/15(金) 03:39:27
どうして、どこから "3の6乗が729で4の4乗が256" これが出てくるのでしょうか?
数字がひとけたにつき三通りあるから
10進数で考えると二桁の数ってのは10から99まで いいかえれば10^1<= n < 10^2 のときnが10進数で二桁であるということ。 729以上であるということは3進数で7桁以上であることを意味し、2187未満であることは3進数で7桁以下であることを 意味する。
73 :
デフォルトの名無しさん :2007/06/15(金) 04:15:02
詳しくありがとうごさあましたm(__)m
中学・高校の数学やり直した方がいい、煽りとかじゃなしに
数学の問題じゃなくて、理解力の問題。
いや、これは数学の問題だな。
どっちも
78 :
デフォルトの名無しさん :2007/06/15(金) 14:33:40
MinGWをインストールしました。 環境設定でコマンドプロンプトでコンパイルできるようにもしたのですが、 簡単なプログラムを書いて(メモ帳にtest.cの名で保存しました)"gcc test.c"と入力しても gcc:test.c:No such file or directry gcc:no input files と表示されてコンパイルされません。どうすれば正常にコンパイルできますか?
おいだれかカレントディレクトリから説明してやってくれ。
>>78 とりあえずコマンドラインで
dir
と打ってみて test.c があるかどうか確認。
test.c.txt ならあるのかも知れないけど
81 :
デフォルトの名無しさん :2007/06/15(金) 14:48:06
dirと打ってもでてきません。ファイルなのにディレクトリで出てくるんですか? 保存するときにはちゃんとテキストではなくすべてのファイルで保存しました。
コマンドプロンプトから notepad.exe test.c と打ってソースを入力して gcc test.c とやればいけるだろう。 さらに explorer "%cd%" とやればどこにファイルができているかもわかるだろう
そのファイルをもう一度メモ帳で読み出せる? それを名前をつけて保存、で出てくるフォルダは コマンドプロンプトで表示されてる場所と同じ? 表示されてなけりゃ、cd コマンドで表示される
84 :
デフォルトの名無しさん :2007/06/15(金) 14:59:39
なぜか奇跡的にもtest.cというファイルはないと表示されました。
スタート→検索でtest.cを検索すると確かにあるのですが…。
あと
http://www2.atwiki.jp/ccw/pages/5.html このサイトの下の方に正常かどうか確認するためとかいうので
コマンドプロンプトにgccと打つの正常らしい反応が返ってくるのですが
makeと打つとそのような…みたいなのが出てきます。
おそらく環境設定で何か間違えていると思うのですがわかりません。
わからないことばかりですみません。ちなみにD:\に保存してあります
>>84 このコマンドをどうぞ
D:
cd \
dir
GUIべったり生活を送っていると陥る罠だな。 # 窓の手いれて、任意フォルダからコマンドプロンプト開けるようにしといたら?
あ。 MinGW32 って cmd.exe ではない CUI が動いてるん?
そんなことはない
だが、MSYSを使うとそうにもできる
91 :
デフォルトの名無しさん :2007/06/15(金) 20:25:54
Cでvisual c++でhallo worldをコンパイルするとコマンドプロントが一瞬起動して終わるんですが、 ずっと起動することはできませんか?
デバッガを使わずに実行
>>91 コマンドプロンプトから起動しろ!!!!!!
以下その質問禁止!!!!!!!!!!!!!!!!!!!!!!!!!
>>91 getcharなどで入力待ちにするとか、
デバッグなしで実行するとか
Ctrl+F5
結果が見たいって事はデバッグしてないんだろうし デバッグ無しで実行が答えとしてはいいな Ctrl-F5で実行しろってテンプレに書いたほうがいいよね 何回この質問を見たことやら
98 :
デフォルトの名無しさん :2007/06/15(金) 20:56:51
できました。
ブレークポイント設定しろ
100 :
デフォルトの名無しさん :2007/06/15(金) 21:05:01
まああちこちのスレでこの質問が 飛び交ってるからなあ
103 :
デフォルトの名無しさん :2007/06/15(金) 21:34:26
プログラミング初心者がIDEで学習するようになったことの弊害かな
どっちかって言うとお前らの反応の方が10倍うざい。
そうね、華麗にスルーしとけばいいのに。
こういう奴のまとめって無いのかな。
まとめてもそういう連中はよまんだろ
108 :
デフォルトの名無しさん :2007/06/15(金) 23:27:20
≫85 D:コマンドのあとでdirコマンドをしたらtest.cが見つかりました。 そこでgcc test.cを打つと gcc: installation problem,cannot exec 'cc1':No such file or directry と出ました。少し進歩したような気はするのですが…まだ何か足りないようです…
109 :
デフォルトの名無しさん :2007/06/16(土) 00:41:18
入門書にハードウェアの事(依存している云々)が書いてあったのですが わかりません、スレ違いならすみません。 倫理フォーマットと、どういう意味でしょうか? 物理フォーマット(HDD)と違いますよね? 違うとしたら、どうう違うのか解説お願いします。
>>109 スレ違いです
あと倫理フォーマットは論理フォーマットの間違いではないですか?
>>109 「論理フォーマット 物理フォーマット ハードディスク」でググって、上のほうのページをいくつか見てみるとか。
112 :
デフォルトの名無しさん :2007/06/16(土) 00:52:36
ありがとうございまshた
>>108 gccが呼び出してるコンパイラ本体がみつからないとさ
ちゃんとインストールしたのか?
114 :
デフォルトの名無しさん :2007/06/17(日) 00:46:08
それがよくわからないんです…。できたのかどうか…。 ただ上に貼り付けたサイトの下の方にある確認方法みたいなやつでは gccと打つと正常な反応が返ってきますがmakeと打ってもなんかおかしい感じです
>>114 MinGW をインストールしたパスに空白や日本語が含まれているとまずいかもしれない
~~~~
C:\Program Files\MinGW
とか
116 :
デフォルトの名無しさん :2007/06/17(日) 01:13:29
大学でC言語を習い始めて今年度で2年目です。 1年後期で基本的なソート方法でアルゴリズムについて少し 2年前期(今)、プログラム設計ということで、仕様書など〜プログラミングまでやってます。 Cの入門〜ある程度のレベルまで網羅できる内容で ある程度のサンプルソースが載っている物、 ソースの書き方のマナーなども学べるような書籍は無いでしょうか?
117 :
デフォルトの名無しさん :2007/06/17(日) 01:18:40
>>115 そうなっているかどうかってのはどうやったら確かめられますか?
もう一度インストールしなおした方がいいですかね?
あんまり余計なことは打った記憶がないのでそういうことはないと思うのですが…
自分で打つところは保存先だけで保存先はD:\にしてあります
あきらめてCygwinにしとけ
Cygwin を空白を含むパスにインスコして質問に来る姿が目に浮かぶ
121 :
デフォルトの名無しさん :2007/06/17(日) 01:24:05
それが最初Cygwinにしようとしたんですけど自分で選択するところがいろいろありすぎて よくわからなかったんで諦めて今に至ってるわけなんですよ…
>>117 コマンドプロンプトで
echo %PATH%
と打って、出てきたパスの先のどこかにgccがあるはず
123 :
デフォルトの名無しさん :2007/06/17(日) 01:43:40
な、ないです…。 D:\MinGW\binとかいうのしかないです。 インストールし直すべきですよね?
124 :
デフォルトの名無しさん :2007/06/17(日) 01:48:53
>119 近所にでかい本屋がないんで・・・
>>124 なぜ大学の図書館を利用しようとしないのか?
なぜ
>>119 を読んでも↑の発想が浮かばないのか?
なぜ担当の講師に相談しようとしないのか?
なぜ友達に相談しようとしないのか?
図書館もない糞大学に通っていて、
書籍の相談すら受け付けてくれない糞講師が担当で、
友達がいない孤独人だったら謝る。
>>123 エクスプローラで
D:\MinGW\bin
の中を見ればあるんじゃない?
#include <stdio.h> int main(void){ int i; printf("1or0?\n"); while(scanf("%d", &i)){ printf("ループ\n"); printf("1or0?\n"); } すみません。上のプログラムで0を入力してもループから抜けられないのは何故でしょうか? どなたか教えてください。
>>128 while(scanf("%d", &i)){
ここに問題があるから
何がしたいのだか
>>128 #include <stdio.h>
int main(void){
int i, res;
while(1){
printf("1or0?\n");
scanf("%d", &i);
if (i == 0) { break; }
printf("ループ\n");
}
return 0;
}
>>128 scanfの返り値は入力要素の個数
0を入力したら1が返る=ループから抜けられない
134 :
デフォルトの名無しさん :2007/06/17(日) 02:39:00
<<127 ありました。あったのにコンパイルできないのはどうしてなんでしょうか? gcc以外にもいろいろ必要なものがあるってことですか?
>>134 D:\MinGW\libexec\gcc\mingw32\3.4.2\cc1.exe
136 :
デフォルトの名無しさん :2007/06/17(日) 02:50:26
なんだかよくわからないのですがそのコマンドを打ったら 改行されただけで特に変化はありませんでした。 何かインストール不足なような気がしてきました
>>136 cc1 はあるってことだから、
再起動してみてダメなら再インストールだね
OS とか MinGW のバージョンとか書いて欲しいもんだ
138 :
デフォルトの名無しさん :2007/06/17(日) 03:12:10
Windows Vista MinGW-5.1.3 です。 余談ですが今年から大学生でC言語とかも初めてです。 課題を家でできたらいいなぁという考えからコンパイラがほしいわけですので、 パソコンについての詳しいこととか、もちろんコンパイラについての知識もほとんどありません。
そんなら Visual Studio 2005 Express Edition ってのを落としたほうが早いかもな
Windows Vista は持ってないから、なんともいえないなぁ
141 :
デフォルトの名無しさん :2007/06/17(日) 04:45:18
#include<stdio.h> #include<ctype.h> int main (void) { int select; printf("1〜10を入力して下さい\n 又終了する時は0と入力して下さい:"); scanf("%d", &select); while(select <0 || select > 10 ){ printf("エラーです。もう一度入力して下さい:"); scanf("%d", &select); } printf("あなたが入力した数値は%dです\n",select); return 0; } 上記のプログラムで入力値が「A」のように文字の時も エラーにしたいのですが、どう書き直したらいいでしょうか? あと、「変数aが文字なら1を返す」って 関数はないでしょうか。 関数isalphaは、変数だと駄目でした。。。orz よろしくお願いします
scanf の戻り値
143 :
デフォルトの名無しさん :2007/06/17(日) 05:08:55
これでは駄目??? while(1){ scanf("%d", &select); if( select >=0 && select <=10)break; else printf("エラーです。もう一度入力して下さい:"); }
無茶苦茶言うな
>>141 #include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main (void) {
int select;
char buf[16];
do {
printf("1〜10を入力して下さい\n又終了する時は0と入力して下さい:");
fgets(buf,sizeof(buf)/sizeof(buf[0]),stdin);
if( !isdigit(buf[0]) ) printf("エラーです。もう一度入力して下さい:\n");
else select=atoi(buf);
}while(select <0 || select > 10);
printf("あなたが入力した数値は%dです\n",select);
return 0;
}
それだと select < 0 || select > 10 の時にエラー表示がないね。 まあ、その仕様で良いんならいいんだけど。
>>146 #include<stdio.h>
#include<stdlib.h>
int main (void)
{
int select;
printf("1〜10を入力して下さい\n 又終了する時は0と入力して下さい:");
while(1) {
int cnt;
cnt = scanf("%d", &select);
if(cnt == 0 || select < 0 || 10 < select) {
puts("エラーです。もう一度入力して下さい:");
if(cnt == 0) {
scanf("%*[^\n]s"); // 改行文字まで読み飛ばす
}
} else if(cnt == EOF || select == 0) {
puts("終了します");
return EXIT_FAILURE;
} else {
break;
}
}
printf("あなたが入力した数値は%dです\n", select);
return EXIT_SUCCESS;
}
>>141 入力に数値とアルファベットを続けて入力された時にエラーとして再入力を促す (入力例 1x)
余分な空白は読み飛ばす
1行に複数の単語を入力された場合には、1単語ずつ評価する (入力例 x 1)
#include<stdio.h>
#include<ctype.h>
int main(void){
unsigned char buf[9+1]; // '\0' を入れる為に +1
int select, index;
while(1){
printf("\n1〜10を入力して下さい\n 又終了する時は0と入力して下さい:");
scanf("%9s", buf);
select=-1; // sscanf での 文字->数値 の変換に失敗したら select は -1
sscanf(buf, "%d%n", &select, &index);
if(0<=select && select<=10 && buf[index]=='\0') break;
printf("エラーです。もう一度入力して下さい:\n");
}
printf("\nあなたが入力した数値は%dです\n", select);
return 0;
}
>>143 うぁ、やっぱり実行してみたら
文字が駄目だった。。。
スマソ。。&thx
>>147 本当だ。サンクス
Aだけ試して喜んでたw
>>145 改良してみるわ〜
新たな課題thx
>>148-149 thx
ちょっと分からんので
考えながら読んでみるぉ
>>150 んじゃこれで。先頭に数字があれば後ろに数字以外の文字があってもおkな仕様。
もし数字だけしか入力されていないのが条件なら、入力から受け付けた文字列をすべて
チェックして、数字以外が入っていたらだめぽなライブラリでも定義するこったね。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main (void) {
int select;
char buf[16];
do {
printf("1〜10を入力して下さい\n又終了する時は0と入力して下さい:");
fgets(buf,sizeof(buf)/sizeof(buf[0]),stdin);
select=atoi(buf);
if( isdigit(buf[0]) && (select >= 0 && select <= 10) ) break;
else printf("エラーです。もう一度入力して下さい:\n");
}while(1);
printf("あなたが入力した数値は%dです\n",select);
return 0;
}
152 :
デフォルトの名無しさん :2007/06/17(日) 06:55:52
すいません質問します。
ttp://homepage3.nifty.com/mmgames/c_guide/17-01.html#S4 このページの
#include <stdio.h>
int main(void)
{
int i;
FILE *file;
file = fopen("test.txt","r");
fscanf(file,"%d",&i);
fclose(file);
printf("%d\n",i);
return 0;
}
これでtest.txtファイルの中身が「test100」の場合プログラムの実行結果は
「100」ってなってるんですけど、なぜか自分のでは「1」と表示されます
(「test900」とかにしても)。
自分のパソコンが変なのかもしれませんがもしよければアドバイスお願いします。
>>152 > fscanf(file,"%d",&i);
これで test100 を %d の書式指定でint型のiに代入しても
適切に代入されへんよ。一度文字列として受け付けてから
atoiでiに代入してみては?
>>152 そんなページで勉強しちゃダメだってば。
>馴染みのscanf関数に似たfscanf関数があります。
こんなこと書いている時点でお察し。
155 :
デフォルトの名無しさん :2007/06/17(日) 09:12:34
ゲーム作ってみたんだけど、どうでしょうか? #include <stdio.h> #include <conio.h> #include <string.h> #define INPUT_MAX 15 #define STR_MAX 127 int main(void) { char m_number[] = "concatenation"; /* マジックナンバー */ char str[STR_MAX] = {0}; char c; int i,j,b; /* 文字列の数だけハイフンを表示 */ b = strlen(m_number); for(i = 0; i < b; i++) str[i] = '-'; printf(" 入力できる回数:%d\n %s\n",INPUT_MAX,str); /* 入力した文字列とマジックナンバーを比較 */ for(i = 0; i < INPUT_MAX; i++){ c = getche(); for(j = 0; j < b; j++){ if(m_number[j] == c) str[j] = c; } printf(" %s %2d\n",str,i+1); if(!strcmp(m_number,str)) break; } if(i == INPUT_MAX) printf(" 〜GAME OVER〜 (..、)ヾ(^^ )ヨシヨシ\n"); else printf(" YOU WIN!! (*^-゚)vィェィ♪\n"); return 0; }
どうと言われても いいんじゃないでしょうか
次はスーパーマリオにでもチャレンジしてみてはいかかでしょうか?
奥行きのあるペーパーまり尾でも
struct POINT2D{ double x; double y; }; /*---------------------------------------------------------- (二次元)ベクトルの大きさを求める ----------------------------------------------------------*/ double ScalarVector2D( POINT2D vec ){ return sqrt( vec.x * vec.x + vec.y * vec.y ); } /*---------------------------------------------------------- (二次元)任意のベクトルを単位ベクトル化 ----------------------------------------------------------*/ void Normalize2D( POINT2D *vec ){ double scalar; /* ベクトルのスカラーを求める */ scalar = ScalarVector2D( *vec ); /* ベクトルに大きさがない */ if( scalar == 0.0 ) return; /* 各成分をスカラーで割る */ vec->x /= scalar; vec->y /= scalar; } これで単位ベクトル求めようとして 下みたいにしたらエラーが出るんですが… ボスケテ POINT2D *pointA; cout << "input x1 > "; cin >> pointA->x; cout << "input y1 > "; cin >> pointA->y; cout << Normalize2D(pointA) << endl;
このスレから天才プログラマーが生まれるとは夢にも思っていなかったな
159に答えていただけませんか… こんなんじゃマイメロみたいにスッキリできない
>>159 > cout << Normalize2D(pointA) << endl;
なんでこんなことができると思ってんだ。心で濃いよ
なんで出来ないのかがわからんのです
165 :
デフォルトの名無しさん :2007/06/17(日) 09:41:03
153さん154さんありがとうございます!!そしてすいませんまた質問します。 読み込むファイルの中の文章の母音(a,b,c,d,e)を「−」に変えるプログラム (例えばテキストファイルの中身が「abcde」なら「-bcd-」になるテキストをつくる) をつくったんですけど最後に「-bcd-$жL!жD」みたいにバグ文字が入力 されてしまいます。バグを表示しないようにするアドバイスもしよければお願いします。 #include<stdio.h> int main(void){ FILE *fin,*fout; char stn[FILENAME_MAX],str[80],c; int i=0; printf("filename: \n"); scanf("%s",stn); fout=fopen("bou.txt","w"); if((fin=fopen(stn,"r"))==NULL)return (-1); while((c=getc(fin))!=EOF){ if(c=='a'||c=='o'||c=='e'||c=='i'||c=='u') str[i]='-'; else str[i]=c; i++;} fprintf(fout,"%s",str); fclose(fin); fclose(fout); return 0;}
勝手に作り変えてやんよ #include<stdio.h> int main(void){ FILE *fin,*fout; char stn[FILENAME_MAX],c; printf("filename: "); scanf("%s",stn); if((fin=fopen(stn,"r"))==NULL)return (-1); fout=fopen("bou.txt","w"); while((c=getc(fin))!=EOF) { if(c=='a'||c=='o'||c=='e'||c=='i'||c=='u') fputc('-',fout); else fputc(c,fout); } fclose(fin); fclose(fout); return 0;}
167 :
165 :2007/06/17(日) 11:08:19
>>166 ありがとうございます。166さんのはなぜかバグ文字が出ないですね、すごいw
なんで165のだとバグ文字がでるんだろう…。
もしよければ165でバグ文字でる原因のほうも教えてくれるとうれしいです。
あと165の2行目「母音(a,i,u,e,o)」でした…オレバカだorz
>>167 > fprintf(fout,"%s",str);
strの一番最後に文字列の終端を示す \0 を入れていないと
文字列の最後がおかしくなるよ。 str[i]='\0' (iはそれまで入れてきた文字列の最後の位置)
を入れてみては?
169 :
165 :2007/06/17(日) 11:23:51
あぁーそうだった!オレ、リアルにアホだ…。
作ってると細かい知識が飛び飛びになってしまうなぁ…。気をつけないと。
>>166 さん
>>168 さん、本当にありがとうございます!
if(strchr("aiueo", c))
171 :
ひろみつ :2007/06/17(日) 12:33:42
すみません。今から、C言語を勉強するメリットはありますか?
組み込みや講義・宿題、高速に処理するライブラリの作成等で学ぶ必要に迫られていないなら 今から学ぶメリットはかなり小さいといわざるを得ない。
>>172 どうもありがとうございます。 高速に処理するライブラリはつくるかもしれないので、 一応やっときます。
最近どこ行ってもJavaやらPHPやらで、俺寂しいんだぜ。
175 :
デフォルトの名無しさん :2007/06/17(日) 17:11:36
c言語ができる無料ソフトでおすすめはどれですか?
VCExp2005
初心者ならTeraPadとBCC
個人的には、初心者にはVC2005EEだと思うんだが。 なんていうか、設定が簡単。 C99非対応とか、規格からみて怪しいとかあるので、 基本以上のことするにはあまりオススメ出来ない
179 :
デフォルトの名無しさん :2007/06/17(日) 18:05:39
今LSI86をインスコしたのですが
>>176-178 さんがお勧めのほうを使ったほうがいいですかね?
両方入れとけ
今時LSICだけはないだろw
LSI入れるならBCCに汁
Z80CPU
今時 LSI-C とか異常
いまさらLSI-Cとか、ちょっとなぁ・・・
LSI-Cは16bitコンパイラだから、作成したバイナリが(コンパイラ自体もか?) Windows Vista で動かなかったりするんじゃないかな。 ビスタ持ってないから分からんが。
いや、かなり素直なDOSアプリだからたぶん動くだろうけど そういう問題じゃないんだよw
>>187 どういう問題?
intが16bitだとか?
別のコンパイラをさて使おうかと思った時に 変化が大きすぎるよな。
今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。
192 名前:デフォルトの名無しさん 投稿日:2007/06/17(日) 18:47:33 今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。 今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。 今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。 今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。 今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。 今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。 今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。
bcc を使うと
>>193 みたいな人になるのか。
貧乏人だと VC++ 2005 Express Edition を初心者でも使うのかw
何が違うんだ?
学習用としては十分だろ。 デフォルトでC++のプロジェクトになってしまうから、空のプロジェクトを作ってmain.cを追加する。 そのまま実行すると一瞬で消えてしまうから、Ctrl+F5で実行する。 これだけ知ってればとりあえず無問題。 ただstdbool, stdintあたりがないのは確かに辛い。 が、C99前提にしてるなら他をあたるべきだな。
折角 C99 覚えても、 VC で使えないからあまり意味がない。
んー・・・ていうか、C99流行ってないから覚えなくて良いと思う・・・
うんじゃVC2005EEで決まりだな。
>>200 __FUNCTION__って使えたら便利だなぁとか時々思うんだけどなぁ
Expressじゃなくてもいいけど簡単にデバッガ使える環境の方が理解がはるかに早いと思うよ。
CygwinについてるCコンパイラまじおすすめ
(205が)かわいそうだからgccだと脳内補完してあげようよ
>>198 拡張子cでも、IDEで作ったプロジェクトではデフォルトで/TP指定されていないか?
うん、gccは確かにお勧め。c以外もコンパイルできるからね。
211 :
デフォルトの名無しさん :2007/06/17(日) 20:46:59
初心者はボーランド5.5つかっとけ BCC developerだ
212 :
デフォルトの名無しさん :2007/06/17(日) 20:48:03
なぜならお手軽だからだ
後で C++ もやろうと思っても BCC は仕様古いからなあ。
>>29 BCC ってこんな事が起こるコンパイラだろ?
そこでcl.exeの出番です
C++ Builder 2007では直っているのかな?
>>42
仕様がどうなってるかをすっ飛ばして直ってるとか挙動がおかしいとか
>>218 仕様って
「実行されないコード」と警告吐きながら実際は実行されていることを「仕様です」で片付けるのか?
警告文のほうをなおすかもな
これで直ってなかったらある意味面白い だれかBCB6以上持ってない?
223 :
デフォルトの名無しさん :2007/06/17(日) 21:31:31
こんな警告が出たんだけどなんで? ./main.c:7: 警告: incompatible implicit declaration of built-in function ‘strcpy’
>>223 コンパイラ分からんけど、ちゃんとstring.hをincludeしてるか?
つ#include <string.h>
226 :
デフォルトの名無しさん :2007/06/17(日) 21:39:24
strcpyがstring.hで宣言されてるから
228 :
デフォルトの名無しさん :2007/06/17(日) 21:41:23
ビルトイン関数 'strcpy' と矛盾する宣言かもしんない 的な警告なの?
229 :
デフォルトの名無しさん :2007/06/17(日) 21:42:36
環境は FC5 で〜 gcc でコンパイルなの で〜、string.h インクルードしなくても動いたよ でも警告が出てたの
char型の配列に全角文字を格納したい場合はどのようにすればよいのでしょうか? char[0] = 'あ'; のようにやってもできなくて・・・
日本語は2バイトだから1バイトのcharには入らないので
>>231
>>226 strcpyという関数のプロトタイプ宣言はstring.hで記述されている。
それをincludeしなかった場合、int strcpy()と解釈される。
これが組み込み関数のstrcpyと互換の無い型だ、と判断されている警告。
(だったと思うが嘘だったらすまん)
gccは賢いので、勝手にライブラリからstrcpy探してきたり
組み込み関数のstrcpy使ったりして動作するように実行ファイルを作ってくれる。
Cって何でCっていうの?
Bの次だから
BCPLを調べてみよう
237 :
sage :2007/06/17(日) 23:09:09
わからないので至急教えてください。 次のようにすると整数値のスタックが実用できる。試してみよ。(mainに 適当にpush();pop();を書いて、スタックに積んだ順番と出来てきた 順数を比べよ。 実際には使うには足らないところがある。それはどこか? int srk0[100]; int stkp=0; void push(Iint i);{ stk0[stskp++]=+; } int pop(){ return sstko[--stkp]; main(){ /***具体的な実行本体***/ /***ここまでがプログラム***/ }
stk0[stskp++]=+;
>>237 sageはメル欄に。
>実用
実装じゃないか?
色々とドコから突っ込んで良いのか分からないが、書き間違いか?
急ぐのも分かるが、ちょっと落ち着け。
>実際には使うには足らないところがある。それはどこか?
書き間違いを全てスルーして、↑が質問だとすると、
多分スタックに保存されてる数値が100超えた時のエラー処理が無い、ということじゃないか?
237です。なんか課題で、自分もよくわかっていない。色々と突っ込んで くれるなら、よろしく。タイプミスはよくするので
>>237 あとはpushされていない(スタックにデータがない)ときにpopしたときの処理も
/***具体的な実行本体***/ /***ここまでがプログラム***/ に入れるみたい
>>240 じゃ、まぁヌクモリでもって一応突っ込んでおく。
今度からは先にコンパイル通して来いな。
void push(Iint i);{ /* ← セミコロン要らない。Iintは多分intの間違い*/
stk0[stskp++]=+; /* +は多分iの間違い */
}
int pop(){
return sstko[--stkp]; /* sstkoは多分srk0 */
/* ここに括弧の閉じ} が足りない */
main(){
/***具体的な実行本体***/
/***ここまでがプログラム***/
}
ありがとうございます /***具体的な実行本体***/ ← /***ここまでがプログラム***/ ←には何がはいるかわかりますか
>>244 値を表示して、pushする
popして、その値を表示する
>>242 のあれだとここでstskpの範囲チェックもする
>>245 値を表示してpushしてpopするのはわかるんですが
そのプログラムを作れないのです
>>243 さんが教えてくれたように直しましたが、pop内でのエラーが
出ました
stkなのかsrkなのかはっきりしろよ
stkなのかsrkなのかと言われてもわかりません。すいません。 かなりの初心者なので
お願いです。おしえてください。 自分で調べるには限界です
>>246 pushする数値はどうやって取得させたいんだ?
とりあえず乱数で
#include <stdio.h>
#include<stdlib.h> // srand() rand() のヘッダ
#include<time.h> // time()のヘッダ
int stk0[100];
int stkp=0;
void push(int i){
stk0[stkp++]=i;
}
int pop(void){
return stk0[--stkp];
}
int main(){
int a,i=0;
srand(time(NULL)); // 乱数初期化
printf("push\n");
for(;i<10;i++){
a=rand(); // 乱数生成
printf("%d\n",a);
push(a);
}
printf("\npop\n");
for(i=0;i<10;i++){
a=pop();
printf("%d\n",a);
}
return 0;
}
237のところに書いたようにしか聞いていないので正直 わかりません
いくらなんでもwww そこは勉強しなきゃ駄目なところだろwww
254 :
251 :2007/06/18(月) 00:15:00
>>246 pushする数値を手入力させたいんなら
#include<stdlib.h> // srand() rand() のヘッダ
#include<time.h> // time()のヘッダ
srand(time(NULL)); // 乱数初期化
a=rand(); // 乱数生成
これ消して
a=rand(); // 乱数生成
の部分に入力させるコードを書く
それと入力の終了条件も考える(負数入力で終了とか)
for文を10までにしたのは100やると「スタックに積んだ順番と出来てきた順数を比べよ」が面倒になるから
一画面で見えたほうがよいでしょと勝手にやった
10じゃなくて#defineで書いたほうが移植性はいいだろうからその辺は自分で
>>253 人のコード見るのも勉強かと
mainが書けないぐらいだし
>>254 フォローありがとうございます。
今回以外のは何とか自力でやってきましたが、今回はまったくわからな
かったので。
#defineはまだ習っていません
じゃあ今覚えろ
258 :
251 :2007/06/18(月) 00:25:23
>>250 技術は教わるものではない
技術は盗むものだ
って職人さんが言ってました
>>255 それはそうと乱数関係習った?
習ってないなら手入力か事前に配列かなんかで組み込んどくか
int data[100]={544,45,878,897,・・・・・・・・}; みたいに
手入力ならどうしたときに入力を終了させるかも考えなきゃいけないし
最大数以上の入力(この場合は100)があった場合どうするかも考える
#define だとか 移植性うんぬんは当面は考えなくていいとは思う
>>256 習ってないことは使わずに習ったものをうまく生かして(ry
まぁ最初はそれが難しかったりするんだろうけど
srand((unsigned)time(NULL)); NULLで乱数の種の初期化って、 一体どんな意味を指してるようになるの?
かなりエラーがでてしまいました
乱数関係は習っていませんが使っていいと思います。
そうか、srandじゃなくて、time関数にNULL入れてたのか これは失礼しました。
printf("\npop\n"); でエラーが出ます
なんで?
文法エラーです。タイプミスしていないのに
for(;i<10;i++)ここもエラー
>>266 printf();の前の関数か何かで ; が抜けてるとか
>267 いま見たから横やりだけど >for(;i<10;i++)ここもエラー そこは別にエラーにならないけど。 わかりやすいかどうかは別だけどもね。
#include <stdio.h> が抜けてるとか。
#include <stdio.h>は抜けていません。 警告とかも出ています。 printf("\npop\n"); とprintf("%d\n",a);です。 自分のリナックスだとインターネットが家からだとつなげなくて いちいちウィンドウズに再起動して書き込みしています。 そのせいでのタイプミスですかね?何度も確かめているのですが
めんどくせーことしてるな。 cygwinでコンパイル実行まで確認して、Linuxで確認とかやったほうがいい。
インデントに全角スペースとか使ってないよな?
cygwinってどうやれば使えますか? 全角は使っていません。
275 :
デフォルトの名無しさん :2007/06/18(月) 01:25:16
いまいちわからないことがあるので教えてください #include <stdio.h> int main(void) { char str[80] = "abcde"; printf("%s\n",str); *(str+3) = '1'; /* ここのポインタがよくわからない */ printf("%c\n",*(str+3)); printf("%s\n",str); return 0; } 実行結果 abcde 1 abc1e コメントの部分の*(str+3) = '1';とはstr[0]のアドレスに+3してそこに1を代入してるわけですよね? 配列で言うとstr[2]をさしてるわけではないんでしょうか? なんでdの部分が1に変わるのでしょうか?
>>271 vmwarePlayer でググると幸せになれるかも知れない
メモリが多めに必要になるのと、ファイル共有までたどり着くのが大変かもしれないが…
勘違いしてました 0,1,2,3でdであってますね すまそ
*(str+3) == str[3] *(str+2) == str[2] *(str+1) == str[1] *(str+0) == str[0]
vmwarePlayer でググると幸せになれるかも知れない って?
>>271 とりあえずエラーの内容を貼れ。
奇特な奴が答えるかもしれん。
printfがエラーですといわれても、雲をつかむような話だ。
282 :
デフォルトの名無しさん :2007/06/18(月) 01:29:59
リナックスのを手書きで書いてタイプするの面度くさいので cygwinのやり方教えてください
日本終わったな
そろそろスレ違いになってきたかな
リナックス立ち上げてから来るので少々お待ちください
スレ違いうぜ
ソフトウェアの使い方は、しかるべき板のしかるべきスレで聞いて来い。 そのあと出直せ。
うるせーハゲ
しね無能
for(;i<10;i++)は、文法エラー befor'(' token printf("\npop\n");は エラー before string constant 警告 built-in function 'printf' 警告 data definition has no type or storage class printf("%d\n",a);は エラー before string constant 警告 data definition has no type or storage class return0;は 警告 data definition has no type or storage class }は 文法エラー before'}' token です
見ずらくてすいません
Cのコンパイラのエラーメッセージはそんなフォーマットじゃないんだが。 勝手にアレンジしないでくれる?
error 文法エラー befor'(' token
って出ました
>>293 ありがとうございます
自分で考える気0だな。 人並みの知性を持っているならいちいち聞くほうが面倒な気もするんだが。
考えて限界がこの結果です。正直全くわかりません。 知性を持っていても何をいわれてもやるしかないんです
おおかた宿題なんだろ。 宿題スレがあるのになんでここでやってんの?
unsigned char Map[100][100]; /* Map[y][x]、グローバルデータを使う場合 */ void main() { InitMap(); LoadMapData(); /* 編集・表示などをする */ SaveMapData(); } int InitMap() { int x, y; for(y=0;y<100;y++){ for(x=0;x<100;x++){ Map[y][x]=(unsigned char)0; /* 初期化 */ } } return(0); }
int LoadMapData()
{
int x, y;
/* 例えば、ファイルからデータをセット */
for(y=0;y<100;y++){
for(x=0;x<100;x++){
Map[y][x] = getc();
if(feof(stdin)){ /* 標準入力から得た値でセット */
return(-1);
}
}
}
return(0);
}
int SaveMapData()
{
int x, y;
for(y=0;y<100;y++){
for(x=0;x<100;x++){
putc(Map[y][x]); /* 標準出力に書き出し */
}
}
return(0);
}
エラー E2451 002package.c 40: 未定義のシンボル stdin(関数 LoadMapData )
小俣光之:コンピューターのページ
ttp://www.ncad.co.jp/~komata/c-kouza2.htm より
BCCではだめなのか、WinXP,BCC5.5.1,CPad
宿題のところに行けば教えてくれるんですか?
それは知りませんが、 宿題ならここでは教えませんよ。
>>298 っ #include <stdio.h>
304 :
デフォルトの名無しさん :2007/06/18(月) 02:09:09
*p1++ = *p2++; は *p1 = *p2; p1++; p2--; と言う意味らしいですけど、優先順位は=よりも++や--の方が上なんじゃないんですか?
getc()ってそれでいいっけ?
getc もまずい筈だけど stdio.h を読み込んでいないから、 返り値が int の適当な関数としてコンパイラが解釈していると思われる
>>303 ありゃりゃ、サンクス
エラー E2219 002package.c 40: マクロ 'getc' の呼び出しにおける引数の個数が誤っている(関数 LoadMapData )
エラー E2188 002package.c 40: 式の構文エラー(関数 LoadMapData )
エラー E2219 002package.c 55: マクロ 'putc' の呼び出しにおける引数の個数が誤っている(関数 SaveMapData )
Map[y][x] = getc();
↓
Map[y][x] = getc(stdin);
エラー E2219 002package.c 55: マクロ 'putc' の呼び出しにおける引数の個数が誤っている(関数 SaveMapData )
putc(Map[y][x]);
代入すりゃいいのかな
言われたとおり宿題の方に行きました。 ありがとうございました
いっぱい質問。 1.++a,a++って先に計算、後に計算って読んだけど信用していいの? 2.b=++a;は先に計算してbに代入されるのは環境によらず保障されてるのかな? 3.後、別のところで見たんだけどwhile(*++a)は期待通り動かない可能性があるとあったがなぜ?
312 :
デフォルトの名無しさん :2007/06/18(月) 02:17:48
#include <stdio.h> int main(void) { int n1,n2,n3; int s; printf("台形の上底・下底・高さを入力してください\n"); printf("上底:"); scanf("%d",&n1); printf("下底:"); scanf("%d",&n2); printf("高さ:"); scanf("%d",&n3); s=(n1+n2)*n3/2; printf("台形の面積は%dです\n",s); return 0; } だとうまくいくのに #include <stdio.h> int main(void) { int n1,n2,n3; int s; s=(n1+n2)*n3/2; printf("台形の上底・下底・高さを入力してください\n"); printf("上底:"); scanf("%d",&n1); printf("下底:"); scanf("%d",&n2); printf("高さ:"); scanf("%d",&n3); printf("台形の面積は%dです\n",s); return 0; } だとうまくいかないのはなぜですか?
>>312 上底、下底、高さがまだ分からないのに
面積を計算しているから。。。
もしネタのつもりなら、少し頭をひねるような面白いネタがいい
>>311 1. 信用していい。
2. a += 1; b = a; の順で実行される可能性と
b = a + 1; a += 1; の順で実行される可能性があるが、
どちらにしろ結果的に違いが出るわけではないな。
ただし、a=++a; になると話は別。
a = a + 1; a += 1; と a += 1; a = a; では結果が変わる。
a = ++a; の結果がどうなるかは未定義であり、こういうことはやってはいけない。
3. 一番最初の項が使えないから、という意味じゃないの?
あと、VC5 を使ってる場合、
確か return 文内でインクリメントやデクリメントを使うと
おかしくなるバグがあった気がするな。
他にも何か条件があったかもしれないが・・・。
315 :
デフォルトの名無しさん :2007/06/18(月) 02:27:39
わかりました。 ありがとうございました
>>314 > a = a + 1; a += 1; と a += 1; a = a; では結果が変わる。
おお、ためになった。
>>314 代入と演算のどちらが先に行われるかは保証されないってことかな。
つーことは a = a++ はやってもいいのかな。代入して演算、演算して代入のどちらで結果は同じなんで。
わざわざそう書く意味ないけど。
ヘッダをほとんど使わず、mainの上部に多数のプロトタイプ宣言を書いて 関数を宣言しているソースをしばし目にするのですが どのようなメリットがあるのでしょうか?
>>319 そうかダメか。一気に代入は使わんことにするよ。a++;b=a; or b=a; a++; これで行くことにする。
悪魔出てこんよな。
>>318 可能性の一つ
12,3年前のコンピュータは今とは比べものにならないくらい処理速度が遅かった。
#include でヘッダをまるごと読み込むよりも、使う関数だけプロトタイプ宣言をすることで
コンパイル時間を大幅に短縮することができた。
但し、いまどきのPCでそんなことをしても体感できない程度
もう一つの可能性
ファイルスコープの関数は他から参照されることが無いので、
ヘッダファイルを使わずに本体に書いても問題無し
さらにもう一つの可能性
main から始まることで処理の流れを追いやすい
>>317 説明が難しいが、
tmp = a; a += 1; a = tmp; となるか、
tmp = a; a = tmp; a += 1; となるかの違いがあるはず。
>>321 ちゃんと読んでる?
b = ++a; や b = a++; は問題ないぞ。
ま、インクリメントを何かと混ぜて使うのは
分かりにくくなるからやめとけ、
と言う人もいるから、それはそれでいいんだが。
>>324 いやいや、bというのはaを含む全ての変数という意味で。b≠aの場合は期待した動作をするのは理解した。
でも使わんことに決めたのさ。
そういう事なら。
327 :
デフォルトの名無しさん :2007/06/18(月) 05:07:58
329 :
327 :2007/06/18(月) 09:31:30
330 :
デフォルトの名無しさん :2007/06/18(月) 10:33:10
#include <stdio.h> int main(void) { int t; int h; int m; int s; printf("時間を入力してください\n"); scanf("%d",&t); h=t/3600; m=(t-3600h)/60; s=t-3600h-60m; printf("入力した時間は%d時間%d分%d秒です\n",h,m,s); return 0; } どこがおかしいのでしょう?
331 :
デフォルトの名無しさん :2007/06/18(月) 10:47:41
ごめんなさい。 わかりました
333 :
デフォルトの名無しさん :2007/06/18(月) 14:02:28
1から10までの積(10の階乗 10!) を求めるプログラムの作り方教えてください。
>>333 エディタでソースを書き、コンパイラでコンパイルする。
何の勉強かによって書き方かわってきそうだな
336 :
デフォルトの名無しさん :2007/06/18(月) 14:07:17
int kaijyo (int N){ int s=1,i; for(i=0;i<N;i++)s*=(i+1); return s;}
337 :
デフォルトの名無しさん :2007/06/18(月) 14:25:06
>>335 C++のvoid main(void)で作っています。
338 :
デフォルトの名無しさん :2007/06/18(月) 14:27:10
int kaijyo (int N){ int s=1,i; for(i=0;i<N;i++)s*=(i+1); return s;} void main(void){ printf("10! = %d\n",kaijyo(10)); }
int kaijyo(int n) if(n > 0){ return kaijyo(n-1) * n; } else{ return 1; } } void main(void){ printf("10! = %d\n",kaijyo(10)); }
>for(i=0;i<N;i++)s*=(i+1); ダサすぎ。題意を反映したコーディングくらいできないもんかね。
ほんとに宿題スレと見間違えたかと思った
>>341 それ、実は次世代スタイルでかっこイイ!んだぜ?w
>>340 からかって書いたのかも
>>339 はメル欄
なんにせよ、丸投げには誘導だな。
その方が質問者の為だし
今さら…ならスマン
#include <stdlib.h>
#include <stdio.h>
int main (){
int c;
FILE *fp;
c =-1;
c = c
>>24 ;
fp = fopen("/tmp/testwrite.bin", "wb");
putc(c,fp);
fclose(fp);
return 0;
}
これを実行すると
$ hexdump -C /tmp/testwrite.bin
00000000 ff |.|
00000001
FFになるんですが、負の数の場合最上位ビットが1になることを
考えると80が書き込まれると思ったんですが、これは何が
間違ってるんでしょうか?
符号付整数の右シフトはアレなんですよ
347 :
345 :2007/06/18(月) 20:30:25
あ、わかりました。負の数に対する認識がおかしかったです。
宿題のレスってどこにある?
350 :
349 :2007/06/18(月) 21:37:32
あっ! レス?
sscanf(line,"%s: %d\n",buf,&num); line全部をbufに取られてしまって numに何も入らないんですけど、 こういう場合にはどう書けばいいですか?
>>351 line での %sと %d の区切りはなんだ?空白?カンマ?
>>351 line の内容がどんなのか分からないのでエスパー回答
sscanf(line, "%[^:]%d\n", buf, &num);
データの取り方がそもそもまずいと思う
355 :
353 :2007/06/19(火) 00:50:23
訂正 sscanf(line, "%[^:]:%d\n", buf, &num);
356 :
デフォルトの名無しさん :2007/06/19(火) 00:51:44
配列とポインタややっこしいです *p は一次配列の p[]と同じ使い方ができて *p[] は二次配列の p[][]と同じ使い方ができるであってますか?
合っていません。配列とポインタは全く異なるものです。 更に言うならば、配列とポインタは全く異なるものです。 まずこれを肝に銘じましょう。 その上で、文法上配列とポインタが同じ表記で扱える特別な場合があることを学びましょう。 最後に一つだけ忠告しておきます。 配列とポインタは全く異なるものです。 では頑張って学習してください。
メモリ上でどうなってるか紙に書いてみれば一発だよ。
配列名がポインタのように使えたり、 ポインタに対して、要素アクセス演算子[] が使えたりするのは、単なる構文糖
ちょっと古めの本を読むとlintがしばしば目にはいるのですが、新しい 目の本だと無いようです。今のgccの-Wallオプションなら十分と言うこ とでしょうか? 或いは寡聞にして聞かないのですが、lintに変わる物 が登場しているのでしょうか?
362 :
351 :2007/06/19(火) 01:20:06
どうもありがとうございます
>>352-355 ABC-DEF-GHI: 12345678
こういうのです。"%[^:]: %d\n"として、うまくできました。
配列の初期化について質問です。 char buf[10000]; @ for(i=0;i<10000;i++) buf[i]=0; A memset(buf,0,sizeof(buf)); @に比べてAの方が速度面で優れていますか? 他の面でメリットがありますか?
>>361 替わるものかどうかは分からないが、ユニットテストフレームワークなんか
でテストするのが今っぽいのかな。
lint 使うのもそれなりの意義はあるだろうけど、なんか機能が中途半端なんだよな。
>>363 char buf[10000]={0};
あってる間違ってるはおいといて、
>>356 は一言も、配列とポインタが同じものなんて言ってないと思うが
>>363 2の方が速度面で優れていることを期待してもいい。
勿論変わらないこともあり得るけど。
ライブラリコードは1のような単純ループで埋めるのではなく、
プロセッサの特性に合わせて最適化してある場合が多々ある。
もちろんそうでない場合もある。
他にもメリットはあって、2の方は何をやっているか一目瞭然だということがある。
>>356 は同じ使い方が出来るかどうかの質問であって
同じかどうかの質問じゃないよなw
どっちにしても、間違ってるけどな。
>>368 同じ使い方はできない。質問は「あってますか?」だから当然答は「間違い」
メモリ上でどうなってるか紙に書いてみれば一発だよ。
別スレでも書いたが、C/C++ に、char p[] とか、char p[][3]とか、 ましてや、char p[][] なんていう型はありません。
Good Luck
>>374 ファイルから入力した文字列(char配列)の文字(char)に対してキーとXORをとる。
これで暗号化。
もっかい同じキーでXORをとれば複合化。
要は、1文字ごとにXORとっていくんだと思うよ?
題意がわからないってことなんだが、これで伝わるよな?
>>374 のために一生懸命解説文書いてたんだけど、
よく見たら例題4−1に全部書いてあってげんなり
379 :
デフォルトの名無しさん :2007/06/19(火) 13:29:04
char str[3][3]; char *p[3][3]; printf("str=%d %d %d\n",&str[0][0],&str[0][1],&str[0][2]); printf("str=%d %d %d\n",&str[0][0],&str[1][0],&str[2][0]); printf(" *p=%d %d %d\n",&p[0][0],&p[0][1],&p[0][2]); printf(" *p=%d %d %d\n",&p[0][0],&p[1][0],&p[2][0]); これを実行するとstrはchar型なのでアドレスが1バイトずつ増えていくのを確認できたんですけど ポインタのPの方は同じ型なのに4バイトずつ増えていきましたが、何故1バイトじゃないんですか? OS XP コンパイラ Visual C++ 2005 Express Edition
>>379 charへのポインタが4バイトだから。
sizeof(char) => 1(バイト) sizeof(char*) => 4(バイト) ポインタは32ビットだろ・・・
ポインタ知りたかったらアセンブラお勧め
実数を4バイトの16進数に変換したいのですがどうしたらいいですか? たとえば1.0を0x3F800000のように。
384 :
デフォルトの名無しさん :2007/06/19(火) 17:29:08
簡単な電卓を作りたいのですが… #include <stdio.h> int main(void) { int n1,n3; char n2,pl,mi,mu,di; int x; scanf("%d",&n1); scanf("%s",&n2); scanf("%d",&n3); if (n2 == pl) x = n1 + n3; printf("%d",x); else if (n2 == mi) x = n1 - n3; printf("%d",x); else if (n2 == mu); x = n1 * n3; printf("%d",x); else if (n2 == di); x = n1 / n3; printf("%d",x); else printf("読み取れない記号が含まれています\n"); return 0; } このプログラムはどこがおかしいですか?
charで宣言した変数って、a[100]みたいに入力文字数を指定した気がするんだけど、気のせいかな? 多分、そこが間違ってるんだと思うけど、違ったらごめん。
>>383 union を使うかポインタをキャスト
387 :
デフォルトの名無しさん :2007/06/19(火) 17:55:53
>>385 エラーメッセージでelseの場所が違うといわれるのですが…。
でも他にもいろいろエラーがあるようなのでそれも直さないといけないかもしれません
ありがとうございます
>>388 追記:
ソースは、
if (n2 == pl) {
x = n1 + n3;
printf("%d",x);}
else if (n2 == mi) {
x = n1 - n3;
printf("%d",x); }
else if (n2 == mu) {
x = n1 * n3;
printf("%d",x); }
else if (n2 == di) {
x = n1 / n3;
printf("%d",x); }
else
printf("読み取れない記号が含まれています\n");
だと思う。
>>389 追記(連レス御免):
あと、plとかは""でくくった方が良いと思う。
>>386 こ、こうですか?
float f = 1.0;
char* p = (char*)&f;
for (int i = 0; i < sizeof(float); i++)
printf("%x\n",*(p+i));
実行結果
0
0
ffffff80
3f
なんでffffff80って余計なものが表示されるんでしょうか。
>>391 符号拡張だね。
unsigned charにすればとりあえず収まる
>>392 あ、そうか。符号なしのポインタにしたら収まりました。
ありがとー!
394 :
デフォルトの名無しさん :2007/06/19(火) 18:14:45
395 :
デフォルトの名無しさん :2007/06/19(火) 18:21:25
すみません このソースで 5 pl 5 としても読み取れない記号が・・・ってなります
pl = '+' とかにしては
>>384 char pl,mi,mu,di が初期化されてないけど。
さらにn2にplとか入れたかったら配列にしないと。
さらにcharの配列にしたら文字列同士の比較にif (n2 == pl)は使えない。
素人はscanf禁止
399 :
デフォルトの名無しさん :2007/06/19(火) 18:53:47
E-mail: 内容: 授業の課題やっている素人です。 目標として、三人の英語、国語、数学の得点を入力して科目ごとの総得点数と平均点を出すプログラムを作ろうとしました。 条件は配列のしようとの事だったので、組んだのが……。 #include <stdio.h> #define NUMBER 3 int main(void) { int i; int tensu[3][NUMBER]; int kokugo; int sugaku; int eigo;
宿題は宿題スレじぇ
401 :
デフォルトの名無しさん :2007/06/19(火) 18:56:07
puts("数学の得点を入力してください"); for(i=0; i<NUMBER; i++){ printf("%2d番 数学:",i+1); scanf("%d", &tensu[1][i]); } puts("英語の得点を入力してください"); for(i=0; i<NUMBER; i++){ printf("%2d番 英語:",i+1); scanf("%d", &tensu[2][i]); } puts("国語の得点を入力してください"); for(i=0; i<NUMBER; i++){ printf("%2d番 国語:",i+1); scanf("%d", &tensu[3][i]); } for(i=0, i<NUMBER, i++){ kokugo += tensu[1][i]; sugaku += tensu[2][i]; eigo += tensu[3][i]; }
402 :
デフォルトの名無しさん :2007/06/19(火) 18:57:36
printf("数学得点合計:%d 平均点:%d \n", sugaku, (sugaku/NUMBER)); printf("英語得点合計:%d 平均点:%d \n", eigo, (eigo/NUMBER)); printf("国語得点合計:%d 平均点:%d \n", kokugo, (kokugo/NUMBER)); return(0); } というプログラム。 当然のように動きません。 どの辺が、問題かもわかりません。 解決策を教えてください。 ちなみにこれ、 [新版]明解C言語 入門編 著者 柴田望洋 の演習6−11です。 プログラムは本当に難しいです。 手を貸してください。
>>402 >>401 >for(i=0, i<NUMBER, i++){ をちょこっといじればよろしい
インデックスは 1 からじゃなくて 0 から
iはちゃんと0から2になってんのに、なんでその前の1から3になってんだよ
406 :
デフォルトの名無しさん :2007/06/19(火) 20:06:56
ヒープとかスタックとか 具体的なイメージがわかない H/W的にどうなの?
下記は何が違うのでしょうか? 同じ意味ですか? int main(int argc, char* argv[]) int main(int argc, char** argv)
同じ意味です
>>406 > H/W的に
ということであれば、スタックは現在位置を管理するレジスタ(CPUコア内の記憶手段みたいなの)と、
スタックを操作する機械語命令が存在する(存在しないものもあるのかな?)。
ヒープはソフト管理(OS含む)。H/Wで特別な機能はない(アドレスガードぐらいはあるかも)。
配列かポインタかの違い
411 :
デフォルトの名無しさん :2007/06/19(火) 20:24:29
こんにちは、初投稿です。 マジ初心者です。(関数で行き詰った) オレでもいいですか?
>>410 配列とポインタの違いは下記だと考えています。
char a[4] = "abc";
char *b = "abc";
a[0] = 'z';
b[0] = 'z'; /* ダメ */
a = 0; /* ダメ */
b = 0;
関数の引数に指定された場合はどのような違いがあるのでしょう?
どういうプログラムが作られるようになれば、プロフェッショナルといえるかい?教えてプリーズ
関数の引数は、「特例」。 このコンテキストの場合だけ、a[] という記述が許されて、意味は *a とまったく同じになる。 これは他から類推できるものではなく、そういう特別ルールが設定されているだけ。
char a[4] = "abc"; char *b = "abc" b = a; b[0] = 'z'; /* OK */
>>414 そうでしたか。同じでしたか。質問ついでに最後もう一つだけ。
int main(int argc, char* argv[])
int main(int argc, char** argv)
上の書き方の方を良く見かけます。わざわざ[]を使うのはどのような場合が相応しいのでしょう。
argv[1]見たいに使われることが多い場合は[]を使うと考えていいでしょうか?
>>415 >>415 > b[0] = 'z'; /* OK */
そうなんですか。これはすみません。
ポインタとは配列の意味をもう一度思い出すべき。 よく理解していないなら、まずはそこを理解するべき。 シンタックスシュガーによる混同をみて、いらぬ混乱しているだけなんだ、大抵は。
×ポインタとは配列 ○ポインタと配列
>>417 b = a;
b[0] = 'z'; /* OK */
だ。b = a; を見落とすな。
>>418 char a[4] = "abc";
これは読み書き可能な領域に4Byteが確保され、それがabc\0に初期化される。
aはその領域の先頭アドレスを示し、const値。
char *b = "abc"
これは読み込み可能な領域に"abc\0"が確保され、bにはその先頭アドレスが入る。
そう思っていたのです。
>>417 argv で渡されるのが配列先頭へのポインタだから。
ポインタはメモリ上のどんなアドレスでも指し示すことができる、
とくに配列を指し示している場合に、使われる。
これは絶対的なルールではないけど、意味もなく a[] を使うのは
だめだろ。コンパイルエラーにはならないし、実行も問題ないが。
俺も日本語がおかしいな ポインタはメモリ上のどんなアドレスでも指し示すことができるが、 とくに配列を指し示している場合に a[] という表現が使われる。 だ。
>>421 ミスっただけだとは思うけど、a は const じゃない。
配列名はポインタじゃないよ。ただの名前付けラベル。 単独で使われた場合に、配列先頭アドレスに「置換」されるだけ。
>>425 あ、わかった。
a = b; みたいなことはできないよ、という事を言ってるのか。
それなら合ってる。
>>426 char * const a;
との違いはあるのかな。
違いは無いけど、コンパイラの中での処理のされ方が違うという意味かな。
・まったく一致している ・同義である。 ・同じとみなす。 すべて「同じ」だな。 言葉の定義があいまいだと、混乱する。
430 :
407 :2007/06/19(火) 21:15:22
>>420 これは見間違いました。すみません。
>>422 元データが配列ならば関数の引数に[]を使うのが良いということですか。
ありがとうございます。私の聞きたいことは完了しました。
>>429 ・まったく一致している
定義は知らんが完全に一致しているっていう時
・同義である。
定義的に同じな時
・同じとみなす。
同じものとして考える
じゃね?
初心者は、意味はそっちのけで、「同じ操作ができるかどうか」しか見えない。
同じとみなせる、かな? 限定的だが。
int a[5]; の場合は、defineのように置換という訳ではないでしょ。 a+1とか。int* const a そのものではないの?
>>438 何を言ってるか訳分からん。
>確かに結局は値を渡していますが…
値渡してるなら値渡しじゃないか。
俺は実質的に参照渡しと見ていいと思うが、 const にしとかないとポインタ自体の操作ができてしまうという違いが出てくるから、 そこを忘れないためにも敢えて値渡しだと言ってるんだろう。
そもそもC言語には「参照渡し」の概念が無いから、云々してもしょうがなくない? 参照渡ししかない言語で「参照渡しはポインタを渡してるんだよ」って言ってもしょうが無いと思うし。
>>439 「参照」 はどんな環境だろうが最終的には値になるだろ。
少なくとも内部的には。
Cのポインタは、それ自身がファーストクラスオブジェクトであるということも、 Cのポインタ渡しが参照渡しではなく「ポインタ」の値渡しと見なされる要因だと思う
444 :
438 :2007/06/19(火) 22:07:02
>>439 自分の中ではポインタ渡しは値渡しかつ参照渡しではないかと思っているんです
値渡しだから(値として演算できるから)参照渡しと認められないというのが納得いかなくて…
>>440 戒めとしてですか、なるほど
ポインタは「参照を言語的に値として扱えるようにしたもの」みたいなものだしな。 「値渡し」「参照渡し」なんて単純な表現で表そうとする事自体が間違いという気もする。
446 :
デフォルトの名無しさん :2007/06/19(火) 22:27:32
Visual C++ 2005 Express Editionのユーザーです。
プロジェクトの種類 ------ Win32
テンプレート ------------ Win32コンソールアプリケーション
ソリューションのディレクトリの作成 ---- (チェックを外す)
この環境で、
http://www.cybercom.net/%7Edcoffin/dcraw/dcraw.c このソースをコピペしました。あと、.hファイルも色々入れて、デバグすると、
1>c:\program files\microsoft platform sdk\include\basetsd.h(62) : error C2371: 'INT32' : 再定義されています。異なる基本型です。
1> c:\program files\microsoft platform sdk\include\jmorecfg.h(161) : 'INT32' の宣言を確認してください。
とエラーが出ました。
basetsd.hは元からあるヤツでjmorecfg.hは僕が入れたヤツです。
basetsd.hは
(62) typedef signed int INT32, *PINT32;
jmorecfg.hは
(161) typedef long INT32;
となっています。 どこをどういじったらいいでしょうか?
>>444 言葉遊びっぽいけど
参照渡しは渡されたものを変更すれば渡した側も変更されるのに対して
値渡しで渡されたポインタを変更しても渡された側のポインタ値は変わらない
ポインタの指すデータを変えれば渡された側のデータも変わるけど
それは二次的な操作によるもので、なんというか別の問題な気が・・・
>>446 jmorecfg.hの161行目を削除する。
つか
>>438 のWikipediaに書いてあるじゃん。
>しかしこれは、実際の変数領域を逸脱した部分をも参照できるので、
>あくまでも値渡しによる参照渡しのエミュレートである。
>参照渡しをサポートする言語でも内部的には同様の操作を行っているが、
>それは何らかの意味で言語の保護下にある参照となる。
ようはポインタ変数の中身が「参照」とは限らないから、か?
451 :
438 :2007/06/19(火) 23:23:45
言葉遊びじゃないかと言われると反論できません 納得が行かないからと言ってここに書き込むには不適当だったかもしれないですね、すみません
納得が行かないのは、ちゃんと本質が分かってるからだよ。
453 :
: :2007/06/20(水) 00:17:36
基本情報でCを選択しようと思ってるんだけど、基本情報レベルならC言語の参考書より 基本情報の参考書読んだほうが効率いいですか?まだ簡単な文法しか知らない初心者です。
>>453 基本情報のCってプログラムの知識ってより
処理を順序だてて構成できる能力(?)みたいなもののほうが重要に感じる。
基本情報の参考書で、過去問解いてわからない文法等あればネットで調べてみる。
ってのが俺はいいかな?って思う。
456 :
446 :2007/06/20(水) 00:27:13
>>448 >jmorecfg.hの161行目を削除する。
有り難うございました、了解しました。
main関数から関数Aに、x[i]( iは1〜100)の変数を受け渡したいのですがどうすればいいですか。 関数内では関数Aと同じ変数名で使いたいです。
>>457 1.グローバルにする→当然同じ配列名
2.配列の先頭アドレスを渡す→受け取り側で同じ変数を宣言すればOK
3.100個のint型を引数にもち、関数内で同名の配列に格納する
すまん、3は冗談だ
459 :
457 :2007/06/20(水) 01:07:00
超初心者でまだ配列は使い方がわからないのでグローバルでいきます。ありがとうございます! 3はやめときます!
>>459 慣れてきたら、グローバルを出来るだけ使わないようにするといいよ。
単位がとれればそれでいいっていうなら1.で十分。
講師によっては2.を強要するかもしらんが。
461 :
: :2007/06/20(水) 01:45:18
>>454 そうですか、わかりました。
>>455 基本情報はアセンブラやJAVAの方が簡単らしいんですが、C言語を習得
したいのでCで頑張ってみます
CPadを使っているときに ファイルを閉じる際、Ctrl+Wを押してしまいエクスプローラが起動。
463 :
446 :2007/06/20(水) 02:27:51
switch (type) { case 3: return (unsigned short) get2(); case 4: return (unsigned int) get4(); case 5: u.d = (unsigned int) get4(); return u.d / (unsigned int) get4(); case 8: return (signed short) get2(); case 9: return (signed int) get4(); case 10: u.d = (signed int) get4(); return u.d / (signed int) get4(); case 11: return int_to_float (get4()); case 12: rev = 7 * ((order == 0x4949) == (ntohs(0x1234) == 0x1234)); for (i=0; i < 8; i++) u.c[i ^ rev] = fgetc(ifp); return u.d; default: return fgetc(ifp); } ここの、 u.c[i ^ rev] = fgetc(ifp); と、 default: return fgetc(ifp); の行で 1>c:\virus\vs2005のデータ\projects\dcraw1\dcraw1.cpp(339) : error C3861: 'getc_unlocked': 識別子が見つかりませんでした 1>c:\virus\vs2005のデータ\projects\dcraw1\dcraw1.cpp(341) : error C3861: 'getc_unlocked': 識別子が見つかりませんでした とエラーが出ました、どう対応すればいいですか?
どうでもいいけどなんてディレクトリで作業しているんだ。
465 :
デフォルトの名無しさん :2007/06/20(水) 03:01:25
466 :
446 :2007/06/20(水) 03:01:47
>>464 すみません、
\virusとしておけばハックされたときに気味悪がって入って来ないんじゃないかと思ってのことですw
>>463 なんだろ。fgetc()は関数のはずなのに……
そのプロジェクトのどこかでfgetc()をgetc()に置き換えるようなマクロがあったりしない?
468 :
446 :2007/06/20(水) 03:37:05
469 :
446 :2007/06/20(水) 03:40:29
>error C3861: 'getc_unlocked': 識別子が見つかりませんでした つーか、このエラーが全部で19個出てます。
470 :
446 :2007/06/20(水) 03:46:11
で19個全部、fgetc()のところです。
471 :
デフォルトの名無しさん :2007/06/20(水) 04:13:45
いわゆる、宣教師と人食い狼の問題 (三匹の羊と狼を川の向こう岸に渡らせるときの最小手順を求める問題 ・船の定員は2匹 ・船の上、左岸、右岸共に、羊の数<狼の数となってはいけない ・船は最低1匹が乗らないと動かない ) を解くプログラムを作れ、という学校の課題です。 明日提出で、この時間までぎりぎり粘ったのですが、 どうしてもわからない問題が一つあるので、ご教授いただけませんでしょうか。 以下のソースなのですが、245行目を削除するとエラーが出ます。 ただ、printfを削除するだけで、なぜエラーが出るのかわかりません。 よろしくおねがいします。
で、ソースは?
473 :
471 :2007/06/20(水) 04:18:11
474 :
471 :2007/06/20(水) 04:21:33
構造体は一つに出来るだろ、とか 無駄な処理多い、とか コメント付けすぎ、とか その他いろいろ変な点はあるかと思いますが、それは見逃してください
475 :
446 :2007/06/20(水) 04:33:52
#ifndef DJGPP
#define fgetc getc_unlocked
#endif
>>467 >そのプロジェクトのどこかでfgetc()をgetc()に置き換えるようなマクロがあったりしない?
あはー、さすが隊長お目が高い、ソースの始めの方に↑のマクロがありました。
これって勝手にコメントアウトしちゃっていいんでしょうか?
>>471 とりあえずうちの環境ではエラーが出ない。
必要な情報はどんなエラーが出るのかだが、
実行時にエラーが発生するのであれば、
バッファオーバーラン(配列やポインタの操作をミスって、書きかえちゃ行けない領域を書きかえてしまうバグ)
があると、よく分からない変化でエラーが出たり出なかったりする傾向がある。
477 :
446 :2007/06/20(水) 04:54:47
478 :
471 :2007/06/20(水) 05:02:05
>>476 malloc絡みを調べてみたら、ボートの組み合わせ数nbを求める場所で、ミスを発見しました。
217行目のSHEEPをBOAT
218行目のWOLFをBOAT - s
219行目のs != 0 && w != 0をs != 0 || w != 0
に直したら、うちの環境でもエラーが出なくなりました。
これのせいで、どうやら、mallocする領域が足りてなかったようです。
ありがとうございました。単純なミスで、すいませんでした。
#メモリ関連のミスはどこが間違ってるかわかり辛いですね。。。
assert 文を使って範囲チェックをしたりするといいかもね。
あいや、assert 関数だな。
>>477 やっちゃっていいと思うよ。意味的には、djgpp以外ではgetc_unlockedで速度を稼ぎたいんだろうけど。
#今時、その程度で速度云々言っても。
482 :
446 :2007/06/20(水) 05:33:28
483 :
446 :2007/06/20(水) 05:48:47
さらに質問させて下さい。 void CLASS read_shorts (ushort *pixel, int count) { if (fread (pixel, 2, count, ifp) < count) derror(); if ((order == 0x4949) == (ntohs(0x1234) == 0x1234)) swab (pixel, pixel, count*2); } の、 swab (pixel, pixel, count*2); の行で、 error C2664: '_swab' : 1 番目の引数を 'UshORt *' から 'char *' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 とエラーが出ました。どう対応したらいいでしょうか?
reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です
485 :
デフォルトの名無しさん :2007/06/20(水) 08:12:59
あ
486 :
446 :2007/06/20(水) 11:06:21
つーか、ソースはdcraw.c ってなってるからC言語だと思うんだけど、 >void CLASS read_shorts (ushort *pixel, int count) このCLASSとか、reinterpret_castはC++の概念ってことはないですか?
487 :
446 :2007/06/20(水) 11:46:17
#define VERSION "8.75"
#define _GNU_SOURCE
#define _USE_MATH_DEFINES
それと、このdcraw.cの始めの方に、↑の文があります。
これがわかりません。なぜなら、↓にもあるように、
#define は 文字列1 を文字列2 で置き換える働きをします。
それなのに、↑は文字列1しかありません。
C言語に詳しい方、是非説明をお願いします。
http://www9.plala.or.jp/sgwr-t/c/sec18.html #define は 文字列1 を文字列2 で置き換える(これを「マクロ定義」と呼びます)ことができます。
488 :
446 :2007/06/20(水) 12:04:26
489 :
デフォルトの名無しさん :2007/06/20(水) 12:24:19
授業単元:C言語 環境:if文・for文・while文・do〜while文・switch〜case文 OS:Windows コンパイラ名とバージョン:borland 言語:C テーマ:数値配列の操作 整数配列 array[10]に値を入力後、昇順にソースして表示しなさい 実行画面 整数入力[0]==>8 整数入力[1]==>22 整数入力[2]==>10 整数入力[3]==>37 整数入力[4]==>16 整数入力[5]==>3 整数入力[6]==>25 整数入力[7]==>33 整数入力[8]==>8 整数入力[9]==>19 * * *ソート後 * * * 配列[0]:3 配列[1]:8 配列[2]:10 配列[3]:37 配列[4]:16 配列[5]:3 配列[6]:22 配列[7]:25 配列[8]:33 配列[9]:37 この問題どうしてもわからないので何方か分かる方がいましたら教えてください
>>487 defineされてるかどうかで分岐してるんだよ
それを使った部分を探せばわかるだろ。
他のも、疑問に思ったらソースたどってそれが使われてるところを調べてみようぜ
grep使えば一発だろ
491 :
446 :2007/06/20(水) 13:00:10
>>489 >整数配列 array[10]に値を入力後、昇順にソースして表示しなさい
ソースじゃなくて、ソープの間違いじゃない?
492 :
446 :2007/06/20(水) 13:01:55
>>490 ってことは↓はわざと意味のない状態にしてる、って事ですか?
#define VERSION "8.75"
#define _GNU_SOURCE
#define _USE_MATH_DEFINES
493 :
446 :2007/06/20(水) 13:04:08
>>490 ってことは↓はわざとdefineさせてない状態にしてる、って事ですか?
#define VERSION "8.75"
#define _GNU_SOURCE
#define _USE_MATH_DEFINES
>>493 おそらくはYes
#ifdef
#ifndef
とか調べて見れ
495 :
446 :2007/06/20(水) 13:13:06
>>489 つか、問題を写し間違えてるんじゃない?
なぜなら、↓が昇順にソートされてないから。
* * *ソート後 * * *
配列[0]:3
配列[1]:8
配列[2]:10
配列[3]:37
配列[4]:16
配列[5]:3
配列[6]:22
配列[7]:25
配列[8]:33
配列[9]:37
496 :
446 :2007/06/20(水) 13:14:54
>>496 ソースとか一切読んでないが、おそらく CLASSはどこかで #defineされている
何が実体か調べれば、宣言が#defineの置換後にどうなるか解るんではないかな?
498 :
446 :2007/06/20(水) 13:23:01
>>489 >整数配列 array[10]に値を入力後、昇順にソースして表示しなさい
ではなく、
整数配列 array[10]に適当な値を入力後、昇順にソートして表示するC言語のプログラムを書きなさい。
が、問題だったんだと思うよw
499 :
446 :2007/06/20(水) 13:37:38
>>497 http://www.cybercom.net/%7Edcoffin/dcraw/dcraw.c ソースは↑です。 で、CLASSで検索すると、まず、↓に当たります。
/* All global variables are defined here, and all functions that
access them are prefixed with "CLASS". Note that a thread-safe
C++ class cannot have non-const static local variables. */
機械翻訳では
すべてのグローバル変数はここで定義されます、そして(彼・それ)らにアクセスするすべての機能は「クラス」によって前接続されています。 1糸金庫それに気付いてください
C++ クラスが非 const のスタティックなローカルな変数を持っていることができません。
です。
で次に、#define CLASS です。
その次は、↓の関数に当たります。 でも、CLASSが何なのかさっぱりわかりません。
int CLASS fc (int row, int col)
{〜〜〜〜〜
500 :
デフォルトの名無しさん :2007/06/20(水) 13:41:32
ごめん ソートだった
#define CLASS によって、CLASS は 何も無い状態に置き換えられる つまり int CLASS fc (int row, int col) は int fc (int row, int col) になる。 頭が固いぞ
502 :
446 :2007/06/20(水) 13:44:17
#define CLASS ↑だけの状態だと、 CLASSという単語は何にも置き換わってないから、 CLASSはCLASSとして生きているわけですよね?
503 :
446 :2007/06/20(水) 13:45:32
>>501 ああ、なるほど、そう考えるんですか、了解です。
504 :
446 :2007/06/20(水) 13:47:40
では、これから寝ます。 また質問させて頂きますので、宜しくお願いします。
505 :
446 :2007/06/20(水) 13:59:30
あーうざかった・・・
507 :
446 :2007/06/20(水) 14:00:45
13:59:30 おや、同時の入力ですねw
>>489 ソート後ってあるけど、それは出てきて欲しい結果ということ?
それとも自分で作ってみたけど間違った結果ってこと?
とりあえず、バブルソートを使えばいいんじゃないかと思う
あれならアルゴリズムも理解しやすいだろう
509 :
508 :2007/06/20(水) 14:05:16
ってみんな書き込んでたか 寝ぼけてたから最新レスまで見てなかったぜ
こんな時間に寝ぼけられても困る
CLASSは記憶クラスの意味だったり。
>>508 いや、初心者でも最初は再帰Verのクイックソートから始めさせるべきじゃないか?これが出来たらソートと再帰の両方を勉強していることになると思う。
まぁ一石二鳥ってやつだな。
シェルソート最強!
514 :
447 :2007/06/20(水) 18:28:44
>>451 いや俺の説明が言葉遊びっぽい説明だけどって意味だよ
実際自分でも疑問に感じた時はあったしさ
printf関数はエラー発生時にint型の負値を返却するとありますが, 具体的に負値とはどんなものですか? EOFとは違いますか? どこに定義されてるのですか?
>>515 0未満であることが保障されてるだけで、具体的な値は定義されていない。
だから 0未満かどうかでを判断するだけ
>>516 stdio.cのprintf関数の返値を追っかけてみたんですが
printf←vfprintf←write←syscall
と結局syscall関数の返値がprintf関数まで登ってきてるようです
syscall関数にはなにやらアセンブラがウニウニ書かれてるますが読めません><;
っていうか大体、EOFってどんな値?以前クグってみたけど、よくわからなかった。
OSによるべ
ストリームが終了してるわけじゃないんだから、 EOF を返すという定義にはできんわな。
関数の再帰意味ワカンネ 挫折しそう
さいき【再帰】 二つ、あるいはそれ以上のもの、または事柄が、別のものでない何か事を 行おうとして、からだを動かすことし、またその動き・たちいふるまい・挙動・ 所作が移り変わってゆく、人や物事のある時期におけるありさまのあるもの の上に、他のものが添い加わること事物や事柄が、もとの場所、状態など にもどること。
a という関数の中で a という関数を呼ぶ必要があった、 ただそれだけのことだ。
そのうち再帰をループにばらしたコードのほうが読みにくくなるよ
それは関数言語厨だけ
夢の中でも寝て夢を見るのってなんか再帰っぽいよな
>>531 は32枚を動かすのに掛かる時間、余談すまそ。
階乗を求める関数を考える。 まず、階乗とはどういうものか。 N! = N × (N-1) × (N-2) × …… × 2 × 1 と考える? いや、こう考える事もできる。 N! = N × (N-1)! しかし、これは N が 0 の場合には成り立たない。(註: 0! は 1 であると定義されている) (-1)! なんて定義されてないからだ。 じゃあ、こうしてしまおう。 N! = N × (N-1)! ただし、N が 0 の時は N! = 1 OK。これが階乗だ。 次に、階乗の部分を関数で書いてみよう。 関数名は factorial とでもしよう。 factorial(N) = N × factorial(N-1) ただし、N が 0 の時は factorial(N) = 1 で、これを C 風に書き直してみよう。 int factorial(int n) { return n == 0 ? 1 : n * factorial(n - 1); } これで完成だ。 無理に処理の流れを考えようとするからハマる。 factorial という別の完成された関数があると考えて、 それを利用しているのと同じように考えればいい。基本的にはね。
printf文ばら撒きながらデバッガでステップ実行してみてまだよく分からなければ プログラミングはあきらめたほうがいいな
関数で2つの数値を関数に渡して、大きい方の値を返す関数はどのようにして作ることができるのでしょうか?
int max(int a, int b){ if(a >= b) return a; else return max(b, a); }
int max(int a, int b) { return (a > b) ? a : b; }
両方が等価だった場合は両方とも同じと知らせる機能はいらないんでしょうか?
ん? 最大値を返す関数の続きでか? ポインタ引数とるかね int max(int a, int b, int* isequal) { if (a > b) { *isequal = 0; return a; } else if (a < b) { *isequal = 0; return b; } /* a==b */ *iseqal = 1; return a; }
要らない 必要になったらそのとき考える
うあ。 文読み間違えた。 最大の値が等しくて複数存在しているときと、 最大の値が単体で存在しているときとで、後の処理が変わるようならあっても良い が、先に等しいかどうかをチェックして&分岐、のように 呼び出し側で制御させることが多いから、 最大値を求める関数自体には等しいかどうかを返すことはいらない と思う(多分
scanfで入力する値を入力して、その値をどういう風にして関数に持ってくの?
ポインタのポインタで、型宣言の*と、ポインタの*の意味の違いがわからないor
int i; scanf("%d", &i); printf("%d", i);
void f(int n){ ; } int n; scanf("%d",&n); f(n);
>scanfで入力する値を入力して、その値をどういう風にして関数に持ってくの? scanfの存在は知っているがもっとも簡単な使い方すら分からないという シチュエーションが正直想像不可能だな・・・
scanf の内部の処理に興味があるのではないだろうか。とエスパー。
フォーマット文字列をパースするのに1波乱 標準入力からやってくる文字列をパースするのに1波乱 可変引数関数での i番目の引数を引っ張ってくるのに1波乱 scanf/printf の中身は奥深い
nの階乗を作ってみたんだけど、こんな感じでええの? #include <stdio.h> int fact(int i); int t=1; int main(void) { int d; printf("数値を入力:"); scanf("%d",&d); printf("%d\n",fact(d)); return 0; } int fact(int i) { if(i > 0){ t *= i; fact(i-1); } return t; }
今日は変なのが多いな 答えるほうもやたら親切な気もするし。 入門篇だからこれでいいのかな
554 :
デフォルトの名無しさん :2007/06/20(水) 23:29:37
struct vertices { int num; int deg; int no; }; typedef struct vertices Vertices; と言う構造体を作り配列にして、R[]のなかで一番degの値が小さいもの (ただし0よりも大きい)をRmin[]に入れると言う関数を作りました。 これを走らせると、時々 R[0]の値が変わってしまうことがあります。 なぜそんなことが起こるのか、教えて頂ければ幸いです。 問題の関数は次に書きます。
555 :
デフォルトの名無しさん :2007/06/20(水) 23:31:31
void setRmin(Vertices Rmin[], const Vertices R[], char *G[]){ int i, j, minDegree, nowDegree; minDegree = R[0].deg; Rmin[0] = R[0]; for(i=1; i<N; i++){ nowDegree = R[i].deg; if(nowDegree == 0) break; if(minDegree > nowDegree){ minDegree = nowDegree; j = 0; Rmin[j] = R[i]; j++; } else if(minDegree == nowDegree){ Rmin[j] = R[i]; j++; } } for(j; j<N; j++){ Rmin[j].num = 0; Rmin[j].deg = 0; Rmin[j].no = 0; } return; }
>>553 親切な人がいる日と、あざけ笑う人がいる日があると思う
今日は親切日
>if(nowDegree == 0) >break; 0が見つかった時点で処理を終わらせてしまうのは、仕様なのか? コメントをつけてくれ。
R[0].deg == R[1].deg の場合 いきなり else else if(minDegree == nowDegree) に突入して 未初期化の j を使ってしまう
560 :
554 :2007/06/20(水) 23:43:26
>>557 はい、仕様です。
…、と思ってたけど、何かおかしい気がしてきました。
もしR[i].numが0だったらそれ以降の配列の要素は
全部0となるように作っていたので0が見つかった時点で終了
させるつもりでいましたが、必ずしもR[i].degが0でも
それ以降の配列の要素は0じゃないことに気づきました。
どうもありがとうございます。
561 :
554 :2007/06/21(木) 00:02:26
>>558-559 jが初期化されずに使われるパターンがあることにようやく気づきました。
ありがとうございます。
int main( void ) のmainを manko にしたいんですが、動きません。 どうしたらいいですか?
#define manko main
564 :
デフォルトの名無しさん :2007/06/21(木) 02:30:09
#include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]) { double pounds; pounds = atof(argv[1]) / 16.0; printf("%f ポンド",pounds); return 0; } 実行すると強制終了しちゃう なんで? OSはXP コンパイラはBorland C++ Compiler 5.5
コマンドライン引数なしに実行したに1票
>>567 独習C という本を読みながら勉強してるんですが
実行の仕方が書いてないんです
DOSプロントの表示された状態で実行しろと書いてあるんですが
意味不明です
DOSプロントを起動した状態でコンパイル実行するとDOSプロントがもう一つ起動されて
エラーで強制終了となります
>>564 の場合は、コマンドライン引数なしに実行するにはどうやるのか教えてください
どうやってコンパイルしてるのかワカランし 何をどうやって答えればいいのか
pounds = atof(argv[1]) / 16.0; の前に if(argc==1) return 0; とでも書いておきなさい
>>569 CPad for Borland C++Compiler というエディタつかってBorland C++ Compiler 5.5でコンパイルしてます
ファイル名はa.cです
CPad for Borland C++Compiler の画面に「コンパイル」というのがあるのでそれを押してコンパイルしてます
CPad for Borland C++Compiler の画面内にコマンドを入力し実行するスペースがあるので
そこにプログラム名 a.c を入力するとプロンプトが起動し D:\.C-proguram> とでるので
a.c と入力しエンターを押すとプログラムを書いたテキストが起動するだけで何も起こりません
ためしに a.c 12 などやってみましたが同じ結果でした
予想の斜め上だった… a.exe
>>571 a.c 12 ではなく、a 12 でいけるはず。
独習Cが悪いんじゃなくて、568の頭が悪いだけだから。
577 :
デフォルトの名無しさん :2007/06/21(木) 11:09:41
きときとのホームページにやり方書いてあるけどこれでわからなかったら諦めろ
578 :
ひろみつ :2007/06/21(木) 11:18:08
いや。独習Cが悪い。
579 :
デフォルトの名無しさん :2007/06/21(木) 12:36:42
俺も独習C持ってるけど説明文ちゃんと読んでないからそんなことになるんだよ?
独習Cはそんな悪くない本じゃないから大丈夫だよ
つーか、プロンプトの使い方なんてPCヲタくらいしか知らんし 独習Cはプログラムを学ぶには問題ないがプロンプトの使い方までは説明してないぞ
GUI全盛のこの時代DOSプロンプトなど使う機会なんてないから知らなくて当然や。 でも使い方がわからなきゃ調べるのは当たり前でべそ。
今はディレクトリ名がやたら長くなってるから これから始めるコンソールは面倒だろうなあw
VistaではさすがにProgram FilesだのDocument and Settingsは廃止されたけどなw
それを面倒だなと思って subst にたどり着ける人は期待度高し
587 :
ひろみつ :2007/06/21(木) 14:34:36
俺なんて、パソコン触ったことないときに、Javaを勉強しだして、 めちゃくちゃ苦労したww
>>585 俺は、XP時代から、長いファイル名は廃止していたぞ
インストール時からそう設定してある
俺なんて、おにゃの娘を触ったことないときに、エッ○の仕方を勉強して 実践しないまま30歳になろうとしているww
>>586 どちらかというとpromptにたどり着く横着者です
591 :
デフォルトの名無しさん :2007/06/21(木) 15:33:58
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char *argv[]) { if(argc != 4){ printf("エラーです\n"); exit(1); } if(!strcmp(argv[1],"add")) printf("%f + %f = %f\n",argv[2],argv[3],atof(argv[2]) + atof(argv[3])); else if(!strcmp(argv[1],"sub")) printf("%f - %f = %f\n",argv[2],argv[3],atof(argv[2]) - atof(argv[3])); else if(!strcmp(argv[1],"mul")) printf("%f * %f = %f\n",argv[2],argv[3],atof(argv[2]) * atof(argv[3])); else if(!strcmp(argv[1],"div")) printf("%f / %f = %f\n",argv[2],argv[3],atof(argv[2]) / atof(argv[3])); else printf("そんな引数はありましぇ〜ん\n"); return 0; } うまく動作しません 何処がダメなんですか?
文字列を%fで表示しようとしてる
あ、本とだw
>>589 日本のオタクの4分の1(3000万人)が激しく同意したが
4分の2が笑いものにした
もうすぐ魔法が使えるな
>>595 日本のオタクの4分の1で3000万人か
日本のオタク人口1億2千万人
日本人全員オタクかよ
#include <stdio.h> static char *search_r(char* s, char* p){ if(*p=='\0') return s; if(*s=='\0') return (char*)0; if(*p == *s && search_r(s+1, p+1)) return s; return search_r(s+1,p); } char *search(char* s, char* p){ if(!s || !p || *p=='\0') return (char*)0; return search_r(s, p); } int main(void) { char* x; x = search("nekodaisuki", "dai"); printf("%s\n", x); } これの if(!s || !p || *p=='\0') return (char*)0 はどういう意味でしょうか
s==NULLまたはp==NULL あるいは、p!=NULLで*p=='\0'ならchar*型の空ポインタを返す。
これと char *search(char* s, char* p){ if(!s || !p || *p=='\0') return (char*)0; return search_r(s, p); } これだと char *Search(char* s, char* p){ if(s==NULL) goto err; if(p==NULL) goto err; if(*p=='\0') goto err; return search_r(s, p); err: return NULL; } どっちが見やすい?
上ははしょりすぎだし(ハカーはこういうのを好むことが多いのだが)下は冗長すぎ。 if(s == 0 || p == 0 || *p == '\0') return 0; くらいにしとけ。
>>600 > if(!s || !p || *p=='\0') return (char*)0;
中途半端はイヤッ!
> if(!s || !p || !*p) return 0;
せめてここまで。
…つか、下のは最も醜く最も頭の悪い goto の例。論外。
char *search(char* s, char* p){ return (s && p && *p) ? search_r(s, p) : 0; }
goto使うとどっちみちあーだこーだ水掛け論になるからなー・・・ つかわねーのが無難だべ フヒヒ
フフフフフフ
if(*p == *s && search_r(s+1, p+1)) return s; この部分で *p == *sかつsearch_r(s+1, p+1) が真ならsのポインタを返すってことはわかるんですが search_r(s+1, p+1)が真ってどういうことですか?再帰ですよね?
___ ━┓ ___ ━┓ / ― \ ┏┛/ ―\ ┏┛ / (●) \ヽ ・. /ノ (●)\ ・ / (⌒ (●) /. | (●) ⌒)\ /  ̄ヽ__) / | (__ノ ̄ | /´ ___/ \ / | \ \ _ノ | | /´ `\..
>>606 聞きたいことがよく分からない
static char *search_r(char* s, char* p){
if(*p=='\0') return s;
if(*s=='\0') return (char*)0;
if(*p == *s && search_r(s+1, p+1)) return s;
return search_r(s+1,p);
}
>search_r(s+1, p+1)が真ってどういうことですか?
search_rが返す値が0以外なら真
>再帰ですよね?
再帰です
if(*p == *s && search_r(s+1, p+1)) return s; return search_r(s+1,p); が if(*p == *s){ if(search_r(s+1, p+1)) return s; } return search_r(s+1,p); ではダメなのですか?
scanf("%d",&abc); if(abc != 1||2)//←ここが違う { printf("error! \n"); exit(0); } かなり単純なんですけどキーボード入力したabcが 1でも2でもないときにerror!と出力にはどうすればいいんですかね? 教えてください
>>610 if(abc != 1 && abc !=2)
613 :
デフォルトの名無しさん :2007/06/21(木) 21:03:51
#include <stdio.h> #include <stdlib.h> #include <ctype.h> char *string_up(char *s,char *ps); int main(int argc,char *argv[]) { char str[127],*p; if(argc != 2){ printf("エラー\n"); exit(1); } p = argv[1]; printf("%s\n",string_up(str,p)); return 0; } char *string_up(char *s,char *ps) { int i; for(i = 0; *ps; i++) s[i] = toupper(*(ps+i)); s[i] = '\0'; return s; } もーさっぱりわかんね。誰かたすげて
何が分からんのかくらい書けよ
数値を渡して、その入力した数値の数だけ'@'を表示する関数はどうやってつくるんでしょうか?
引数で入力された文字列を大文字に変換したいんだけど 実行しても何も表示されないです 自作関数に問題があるのはわかるんですけど、どこが間違ってるのかがわからにゃい
>>613 for(i = 0; *ps; i++)
s[i] = toupper(*(ps+i));
ループの終了判定がおかしい
psの値は変化しないのに*psの値が0になることを期待している
>>615 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
void puta(int n)
{
char *p = (char *)malloc(n + 1);
memset(p, '@', n);
p[n] = 0;
puts(p);
free(p);
}
>>619 最初の段階なので、もっと簡単な方法はないでしょうか
include<stdio.h>は知ってるんですがstdlib.h等はまだならってないです
>>620 #include <stdio.h>
void puta(int n)
{
if (n == 0)
return;
putchar('@');
puta(n - 1);
}
まったくBIOSの更新に失敗で鯖落ちってアホかよマァヴ
>>621 外部シンボル'_main'が未解決です
っていうエラーが出てしまいました
>>623 #include <stdio.h>
void puta(int n)
{
if (n == 0)
return;
putchar('@');
puta(n - 1);
}
main()
{
puta(10);
}
>>624 それでも、エラーが 18行 関数は値を返すべき(関数 main)
とでました、ちなみにキーボードで値を入力するプログラムなので
scanf("%d",&n)
if〜〜
とすればよろしいのでしょうか
それはエラーじゃなくて警告じゃないだろうか
しつれいしました、警告です
>>624 int main(void)
{
int a;
scanf("%d",&a);
puta(a);
return 0;
}
いや関数使ってるじゃんw
?
635 :
デフォルトの名無しさん :2007/06/21(木) 23:47:09
80を2進数に直すと、01010000であってますでしょうか?
>>634 mainの部分ってmain()の下のところですか?
#include <stdio.h> void puta(int n) { if (n == 0) return; putchar('@'); puta(n - 1); } int main(void) { int a; scanf("%d",&a); puta(a); return 0; }
640 :
シャノン符号 :2007/06/21(木) 23:56:45
[1] 授業単元:情報論 [2] 問題文(含コード&リンク):• 起動させると,同じディレクトリにある圧縮前のファイル「srcdata.txt」を読み込み, Shannon符号を用いて圧縮を行い,符号化結果を「encoded.txt」 というファイル名で書き出す. • 次に,この「encoded.txt」ファイルを読み込んで,解凍処理を行い,復号結果を 「decoded.txt」というファイル名で書き出し,終了する. • 圧縮対象のファイルはテキストファイルとし,出現する可能性のある文字は,a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p の16文字の内の何れかである.ファイルの長さはまちまち で,一行だけである. • 圧縮されたファイルもテキストファイルとし,先頭の16行は,各文字に対する符号を 「0」,「1」を使って一行に一つずつ書く(符号を割り当てない場合は「-」を書く). 17行目に符号化された0,1系列を一行で書く. • 解凍されたファイルは,元の圧縮対象ファイルと同じになるように作る. なお、途中まで完成している。そのプログラムは次に書き込みます。 以下のプログラムの関数void Encodeとvoid Decodeを完成かさせていただきたいです(><) [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名gcc 3.4 [3.3] 言語: C、C++,C#いずれでも可 [4] 期限: ([2007年6月23日23:59まで] [5] その他の制限:標準ライブラリは使ってはいけない. 手法を考えてもその部分だけは実現には到りませんでした。。。 よろしくお願いします。
>>640 どこに誤爆してるんだよw
それともマルチか?
642 :
シャノン符号 :2007/06/22(金) 00:04:29
間違いました。。。。申し訳ありません
#include <stdio.h> #include <string.h> void insert(char **start, char **end, char **data){ char **p = start; *end = *data; while(start<end && 0<strcmp(*(end-1), *end)){ char *tmp=*end; *end=*(end-1);*(end-1)=tmp; end--; } } void to_up_str(char *s){ while(*s){ if(*s>='a'&&*s<='z') *s+='A'-'a'; s++; } } int main(int argc, char **argv){ if(argc<3){ printf("usage : program string1 string2 [string3....]\n"); return 1;} else{ int i; char *buf[30000] ={argv[1], }, **end = buf+1; to_up_str(argv[1]); for(i=2; i<argc; i++){ to_up_str(argv[i]); insert(buf, end, &argv[i]); end++; } for(i=0; buf[i]; i++) puts(buf[i]); } return 0; } 問題1 文字列配列 *a[10] を 10 個の英単語で最初に初期化し、サブルーチンで、10 個の中で辞書的に一番遅く現れる文字列を表示せよ. 簡略化できない?
それ、その問題の答えださないぞ。
宿題スレとなんかごっちゃになってきたな
printf("%c",a)をputcharで左の式とまんまの式はどのようにつくるんでしょうか
なんか酷い状態だな。 いくら入門篇とはいえ。
だって入門なんだもん
だって人間なんだもん
引数の質問なんだけど、例えば、 ./a.out 3 abcで実行した結果があって、その結果の順番を 逆にすることって出来るのでしょうか?
それは引数の質問なのか?
引数の・・・って書いてあるから 引数の質問なんじゃないの?でも、引数じゃないよね
出来るなら教えてあげれば? 俺は教えない主義だからさ
658 :
デフォルトの名無しさん :2007/06/22(金) 02:32:12
入力された関数が大文字なら1、小文字なら0を返す関数って作るの難しいですか?
脳内で5秒で完成
660 :
デフォルトの名無しさん :2007/06/22(金) 02:37:35
どうやりました?
まずは関数を入力する方法から考えようか
ええい、そうじれったいこといわんといて
変数じゃないのか?
ほんとは2秒ぐらいで完成したんだけど、「入力された関数が」でちょっと悩んだからでした。
いやはや、お手上げですわ
EBCDIC への対応を考えれば 2 秒で完成するわけがない。
int hoge(c) { return ('A' <= c && c <= 'Z') ? 1 : (('a' <= c && c <= 'z') ? 0 : -1); }
あ、やべ仮引数の型忘れた
inline int hoge(char x) { return 3 -(x/32); }
>>667 そこはctype.hのislower()とかを使うべきところなんじゃないのかなあ…
あと大文字と小文字以外で勝手に-1を返しているけどそれは元の仕様にない(抜けている)んだけど、それはいいの?
そこはってどこよ?
>>670 そのためだけに#include <ctype.h> すんのは正直無駄かな、と。
大文字小文字以外のが渡された時の返り値が不定じゃマズいかな、と。
ついでに、Cでinlineがつけられないなら気分的にはマクロにしたいところ #define hoge(c) (('A' <= (c) && (c) <= 'Z') ? 1 : (('a' <= (c) && (c) <= 'z') ? 0 : -1)) だからさっき引数の型忘れた、と言い訳
限られた条件でしか使えないという欠点はあるものの、
個人的には
>>669 に花マルをあげたい
何で無駄なんだよ。 そのための ctype.h だろう?
C の規格によれば、A〜Z の文字コードが連続しているという保証はない。
文字コードを規定するのは言語のお仕事じゃないと思うんですが
ANSII準拠なら問題ない ctype.hだって中でやってる事は同じ
っつか、ASCIIコード無視した環境ってどれよ?w
つ[EBCDIC]
ctype.h はテーブル処理してないか? ものによるかもしれんが。
>>677 でも 0〜9 の文字コードは連続してる事を要請してるんだぜ?
アルファベットが連続してコードに登録されていない環境はすごい
要するに、そんな環境を使っている香具師は きんもぉ〜★ なのさ♪
はい知りませんでしたって素直に言えばいいのにね。
よくいるよな、自分が知っていることを知らない奴を見つけると 得意気になって自慢したりそいつより優越感を感じる香具師ってw っつか、お前オッサンやろ?何年にIBMが提唱したコードだよ?w
頭のハゲた時代遅れのオッサン必死wwww
突っ込む方は複数人なのに、一人で顔真っ赤にして必死になるパターンか。 先日のどっかのスレのようだ。
1960年代・・・要するに50近いオッサンだろ?素直に言えやぁ どうせそんな時代遅れの環境を知っていたり、そういうのがあるよといって そんな環境のことも考えてプログラミングをしちゃうなんて、今の10代 20代じゃそんな考えはまずないからw もはや固有のハードの時代じゃないんだよ。 俺でもPC98は扱っていたけどさぁw WindowsっつーOSがあるんだよ 分かるかね、オッサン?どのハードもある規定に則って標準化されてんの。 ISO、ANSI準拠が重要になるのも分かるっしょ?時代遅れのオッサン?w
↓おいっ、お前頭がハゲてんぞ?
いくらがんばっても、知らなかった、って事実は覆らないんだが。。
ときどきでいいからUNIXのことも思い出してあげてください
EBCDIC環境でプログラミングしている人は、どうぞその環境でのことも考えて ソースコードを記述して下ちゃい、おながいします
>>693 おまいはどうしても知らなかったことにしたいんだろうけど
あれが釣りだということに気づいていないんだろうか?w
今もなおお前がしつこいくらいに お前知らなかったんだろ?
なぁなぁ、正直に言えやぁ、知らなかったって って迫ってくるところが
すでにお前が釣られている証拠。いやぁ、はげたオッサン笑えるw
問題はそんな環境でプログラミングしている香具師が今ここで 質問しているか?って話だが。話の分からんボケたオッサンは ほんっと困ったもんだ。時代遅れもここまで来ると痛々しい。 近年のIT技術の発展、進展はめまぐるしいからついていけないんだろ? 昔ぁ10年あっても大した進展は無かったもんな。けど、今日までの10年はすさまじい。 まぁ、こういった基本部分は大幅に変更されていないが、なんつってもCPUの高速化や メモリ、HDDの大容量化。お前ら時代遅れじゃ考えられない性能だもんな。 さらに64ビット環境への移行。普及は滞っているが、徐々に64ビット環境への 移行は進んでいる。そんな時代にプログラミングをする俺ら若い世代は 引退していくおっさんには興味がない。だって、本当に時代遅れなんだもん。 近年の発展からしたら、もう化石には用はないさw
同じく若輩者として、最近の若手がみんなこんな考えだと思われるのは困る 修羅場を潜り抜けて生き残ってきた先輩達はやはり経験が違う 先人に学ぶのも大事なことだよ
発展と言ってるのに、高速化と大容量化しか思いつかないようなヒトには、 どうか、ならないでください。
>>698 ×修羅場を潜り抜けて生き残ってきた先輩達
○給与泥棒と罵られながらもしがみついてきた寄生虫
マジで経験年数だけ豊富でろくに実力が伴ってないロートルがわんさともいるのも
否定できない事実なんだよ。特におまえさんが、採用面接にかかわるようになって
きたら絶対に経歴や肩書は当てにするなよ、それだと失敗するから。必ず自分の
目で相手の実力を確かめろよ。
>>699 っとだけとしか言っていないわけではないが、間違ってはいないだろ。
お前みたいな、相手の知らないことを揺さぶってあぶりだそうって
陰湿なやり方がきめぇ〜んだよ。分かるか?古い時代にあわせて
今後実装していく奴がいたら、笑えるw
>>699 ねぇねぇ、オッサン。ASCIIもEBCDICもハードウェアの発展と共に
何か進化してんのぉ〜〜?まぁ、HDDの大容量化はマジですげーよ。
もうとっくにリリースされているが、1TBの時代だしな。
10年前に買ったPC98に内蔵されていたHDDは1.2GBだったぜ。
今じゃDVD1枚にも、2GBを超えるメモリーカードにも負けるぜw
知らない事は恥ずかしくないんだよ。 知ってることが1つ増えた、それだけの事じゃん。 なんでそんなに頑張ってるんだい?
入門篇にキチガイが現れるのはいつものことだ。 放っとけ。
EBCDICを知っていることを自慢したいがために ASCIIコードに準じない環境の話を持ち出すオッサンきも杉でつ ><;
年齢に関係なく、知ってるやつは知ってるし、知ろうとしないやつは知りもしないだろ。
>>678 マルチバイト文字無視した簡易実装だと
最近の2chってスレタイ無視して昔話に走るおっさん多くてうんざりする。 もうちょっと年齢相応の分別ってものを身につけろや。
途中で送信しちった
>>678 マルチバイト無視した実装だと、[256]サイズのテーブル参照(本体はグローバル)で済ましてる
のもあるね
isupper でマルチバイト云々って影響あるの?
×昔話 ○歴史
is系でマルチバイトに対応してるのはwがついてて、引数もマルチバイトだよ 従来のは引数がchar型だから1byteでしか判定できないと思う
>>706 自分の年齢を詐称しなくて良いからさぁ。こんなスレに今集まるような
質問者のほとんどはそんな40年以上も前の環境にも対応させようと
ソースコードを書くなんてことしないからw
知らなかった事指摘されるのをひどく嫌うのはオッサンによく見られる症状である。
10年くらいまではそれなりに使われてたんだけどな。 最近は見ないだろうが。
暴れるごとに無知を晒すゆとりを眺めるスレはここですか?
最先端の技術でも何でも 全ては過去の積み重ねだ 知らないよりは知ってるほうがいい 喧嘩すな阿呆
まあテーブルから引くわけだし、 比較を二回やるよりはctype.hに用意されたマクロを使った方が速いよ。 わずかだけどもね、速いよ。 それに今の環境だとテーブルくらいは別にいいじゃんて感じ。 なにより、何をやってるか一目瞭然だよ。 せっかく規格で用意されているものなんだから使わなかったら損ですよw
マルチバイト文字の判定ってロケールの設定とかしなきゃならんのがややこしい
'A' <= ch <= 'Z' は比較1回に最適化できるよ。
正確に言えば減算1回と比較1回だな。
その辺はコンパイラがうまいことやってくれるんじゃないかな 最近のコンパイラ賢いし
初心者だろうが何だろうが、最初に技術的なことをを教える時に
「例外もあるよ」と認識させておくのは間違いではないと思うよ。
まぁASCIIコード使ってない処理系の話なんて
趣味でやってる分には要らない知識だが。
とりあえず
>>697 が組み込みマイコン系のことをバカにしてるのは分かった。
うぜぇ〜
未だに全銀手順で通信させられることもあるしなー
>>720 >'A' <= ch <= 'Z'
常に真。
いや、そのまま書くわけじゃないだろ
ほとんど一人だったな
729 :
デフォルトの名無しさん :2007/06/22(金) 14:40:59
#include <stdio.h> int rstrlen(char *s); int main(void) { char str[127]; printf("文字列を入力:"); gets(str); printf("文字数は %d です\n",rstrlen(str)); return 0; } int rstrlen(char *s) { if(*s){ s++; return 1+rstrlen(s); /*ここがよくわからない*/ } return 0; } sはstrの先頭アドレスでNULLまで再帰するのはわかるんですけど return 1+rstrlen(s);で何故文字列の文字数をカウントして返せるのかがわからないので その仕組みを教えてください
一文字につき1足してるだけだろ。
return 1+rstrlen(s); はreturn 1+1+1+1+1....NULLっ考えていいんですか?
rstrlen("abc") rstrlen("bc") rstrlen("c") rstrlen("") -> 0を返す -> 0 + 1 を返す -> 1 + 1 を返す -> 2 + 1 を返す 3が返る
これ、再帰の基本でありかつ本質。 これが一度分かればもう悩むことはなくなると思う。
個人的には return 0 は前にあったほうが分りやすいと思う int rstrlen(char *s) { if(*s=='\0') return 0; return 1 + rstrlen(s+1); }
>>736 再帰部本体が短いんならどっちでも良いけど、
長くなるようだったら 終端条件が頭に来るほうが好きだな。(さらに個人的
738 :
デフォルトの名無しさん :2007/06/22(金) 16:34:26
すいません リストを □ → □ → □ → □ ↓ □ → □ → □ みたいに作りたいんですが、どうすればいいのでしょうか?
それはツリーの一種ではないのか
ツリーになってるね
struct node_t { struct node_t *elder; struct node_t *child; void *data; }
再帰って数学やっていれば普通にでてくるよね。 f(f(f(f(f(f(x))))))
てか漸化式で再帰の考え方はやってるはずだ
再帰は使ってはいかん のろい、不安定になる
>再帰は使ってはいかん >のろい、不安定になる FORTRAN厨かw
717 名前:デフォルトの名無しさん 投稿日:2007/06/22(金) 07:58:31 最先端の技術でも何でも 全ては過去の積み重ねだ 知らないよりは知ってるほうがいい 喧嘩すな阿呆 廃れた規格については論外だぞw
Cでもだめだ 再帰は、関数を呼び出す前の状況を記録しなければいけない コンパイラに任せてはだめだ 自分で制御するのがいい
廃れた規格でもなぜ廃れたのかを知ってれば おなじマチガイをしないじゃない もっと知識には貪欲にいこうや 「もう古いから知る必要ない」ってのは使い走りの専門卒奴隷PGの言い草だぞ
ジジイしつこすぎ
>>749 古い規格に合わせたプログラミングでもしてろw
本来の知識の価値のなんたるかを知ろうとせぬ輩に何を言っても届かぬじゃろうて
いまさら廃れた規格に合わせた使い方をすることを教える香具師は時代遅れ。考えろボケ老人。
まぁわかった、それじゃ文字を判別するコードは今度っから、例えば あるライブラリが文字を char c で受け継いだ場合 c=='A'; || c=='B' || ・・・ || c=='Z' のように書いたライブラリを用いるんだね
廃れた規格とか、時代の流れとかいってるやつはだめ杉 再帰使うやつもだめ杉 使える機能を使えばいいだけ
ほんともう他所でやって。お願い。
>>755 だからいまさらEBCDICを使った環境でプログラミングをやれと?笑えるw
>>753 では現在のC99に従い、ctype.h に定義された is〜() を使って下さい。
お前ら、今後は英文字を判別するにはこのライブラリを使え、わかったな? #include <stdio.h> int isalph(char c) { if( c=='A' || c=='B' || c=='C' || c=='D' || c=='E' || c=='F' || c=='G' || c=='H' || c=='I' || c=='J' || c=='K' || c=='L' || c=='M' || c=='N' || c=='O' || c=='P' || c=='Q' || c=='R' || c=='S' || c=='T' || c=='U' || c=='V' || c=='W' || c=='X' || c=='Y' || c=='Z' || c=='a' || c=='b' || c=='c' || c=='d' || c=='e' || c=='f' || c=='g' || c=='h' || c=='i' || c=='j' || c=='k' || c=='l' || c=='m' || c=='n' || c=='o' || c=='p' || c=='q' || c=='r' || c=='s' || c=='t' || c=='u' || c=='v' || c=='w' || c=='x' || c=='y' || c=='z' ) return 1; return 0; } int main(void) { char c; printf("Input charactor > "); scanf("%c",&c); if( isalph(c) ) printf("%c は英文字でつね♪\n",c); else printf("ぼくちんが判別するライブラリでは\n%c は英文字じゃないでつ ><;",c); return 0; }
ctype.hのisalphaじゃ?駄目
>>759 標準ライブラリに含まれているものを態々自作するのは愚の骨頂。
>>762 その 標準 が何に基づいて 標準化 されているかによるぞ。
>>761 通用するように作られているから「標準」なんですよ。莫迦ですね。
>>764 でたーーー、おっさんの得意な言葉 馬鹿 莫迦w
>>765 =
>>764 おっさんレスはえぇ〜なぁw 時代遅れの莫迦に莫迦って言われたくねーしw
悪いが俺の手元にEBCDICが使える環境がないんで、やみってみなきゃ〜わからん。
通用したならしたという結果の報告を求む。ちゃんと本体の写真つきでな
標準ライブラリ使用禁止のプロジェクトも存在する
横レスすまそ > やみってみなきゃ〜わからん。 標準の意味ないじゃん もちろんEBCDICの環境でまともに標準へ準拠した処理系がないとかそういう しょーもないオチはないとして
770 :
デフォルトの名無しさん :2007/06/22(金) 20:32:42
以下に対するANSI Cの仕様を教えてください。 a,bが共に負の整数のとき、a%bの結果の符合はどうなるのですか? テキストでは「負になる」と書かれているものと、「処理系に依存する」と 書かれているものがあります。 どちらが本当なのですか?
>>770 a,bが共に負なら a%b == -((-a)%(-b))
あれ?標準ライブラリじゃEBCDICにも対応しているって話だが? いい加減、過去に何があったとか良いからさぁ、標準化されたものを 用いて幅広い環境で通用するコードを書く頭を持とうや、な?
まあ別に無理に幅広い環境で通用するプログラムを書こうと思う必要はないが、 結果的に移植性が高くなっていたら、いいおまけがついてきたくらいに思えばいいじゃない
だがC99の流行ってなさっぷりにはびっくりするわ。
VC++が完全サポートしてデフォルトでそっちでコンパイルするようになればわりとあっさり普及しそうに思う
まあ色々知ったかぶって言っているやつがいるが、 バレてないと思っているのは本人だけで、 他のほとんどの奴は「こいつは間抜けだ」とわかってるんだよね。 何せ実際にプログラマやってるんだからさ。 「おれってすげえ」と勝ち誇っているのに、 他の連中にせせら笑われているのは哀れだよね…
stdintとstdboolとかの言語仕様の変更に依存しない 便利ヘッダ・ライブラリをC89にバックポートしたプロジェクトとかないの? VC++とかいまだに標準で用意してないとかありえん。 もうMS的にはC潰したがってるのかね・・・
778 :
デフォルトの名無しさん :2007/06/22(金) 22:13:42
777
779 :
デフォルトの名無しさん :2007/06/22(金) 22:14:31
780 :
デフォルトの名無しさん :2007/06/22(金) 22:37:06
cで実行速度の速さ、処理速度の速さを見るにはどうしたらいいんでしょうか?
clock
>>780 こんな感じのやつ?
#include <stdio.h>
#include <time.h>
int main(void) {
clock_t s,e;
int i;
s=clock();
for(i=0; i<1000000000; i++);
e=clock();
printf("%d ms \n",e-s);
return 0;
}
785 :
デフォルトの名無しさん :2007/06/23(土) 00:24:52
C言語で○秒置きにprintf();で文字列を表示するにはどうすればいいんですか?
>>785 標準関数じゃないけど、sleep()は?
どの環境にも、sleep()相当の関数はあるとおもうよ。
#include <stdio.h> #include <time.h> int main(void) { int st,i,set; printf("Input > "); scanf("%d",&st); st*=1000; for(i=0; i<10; i++) { set=clock(); while( (clock()-set) < st ); printf("ぬるぽっ\n"); } return 0; }
>>787 CLOCKS_PER_SECつかえよ。
>>788 何が使えよだよ。double型にするのがめんどうくせーからやってんだろ、馬鹿じゃね?
自分基準でものをいうな。必要なら必要に応じてコードを書き直せ、ボケ老人
788 名前:デフォルトの名無しさん 投稿日:2007/06/23(土) 00:53:34
>>787 CLOCKS_PER_SECつかえよ。
CLOCKS_PER_SECつかえよ。
CLOCKS_PER_SECつかえよ。
CLOCKS_PER_SECつかえよ。
CLOCKS_PER_SECつかえよ。
>>789 なんでdoubleがでてくるんだ?
なんか勘違いしてないか?
clock() の戻りの単位は謎 だが入力の単位も謎単位で統一してて、自分で秒換算するなら、それが仕様だということだな
実数で計算するにしても、CLOCKS_PER_SECは必要だろ…
>>788 みたいな奴ってさぁ、昨日のEBCDICみたく
相手が知らないもんだと思い込んで、知らないのか?って
揺さぶって煽るタイプだろ。time.hに定義されていることなんて
知ってるわ。別に使わなくても良いだろ。マクロ定義されているのは1000で
特に問題ないんだし。いちいちうぜぇって、時代遅れのジジイw
マジックナンバーを埋め込む素人プログラマは害でしかない。
ここの必死な時代遅れ基地外プログラマー笑えるw おめーら一生まともなプログラマになれねーよw 時代遅れ過ぎるんだよ、あんたらの頭はw
どうせおめーらじゃ scanf("%d",&st); scanfなんて使うなよ って突っ込むんだろ?あぁ〜〜きめぇきめぇ。 分かっててやっていることに気づいていないんだねw
あるぇ、ぼくちんの環境だと time.h にはこう記述されていたYO! #define CLOCKS_PER_SEC 1000.0 < 最後の .0 に注目。 さすが、抜け目ないね、標準化する人たちって♪
うちの環境だと 100 になってるな。
#include <iostream> void show(int n) { std::cout << "int: " << n << std::endl; } void show(double n) { std::cout << "double: " << n << std::endl; } int main() { show(CLOCKS_PER_SEC); } int: 100 環境: g++ 4.0.1 (Intel Mac)
やはり人には謙虚さが必要だな。
VCだと1000だった
$ grep 'CLOCKS_PER_SEC' /usr/include/time.h #define CLOCKS_PER_SEC (__DARWIN_CLK_TCK) $ grep '#include' /usr/include/time.h #include <_types.h> #include <machine/_limits.h> /* Include file containing CLK_TCK. */ #include <sys/cdefs.h> #include <xlocale/_time.h> $less /usr/include/machine/_limits.h /* This is the `system' limits.h, independent of any particular compiler. GCC provides its own limits.h which can be found in /usr/lib/gcc, although it is not very informative. This file is public domain. */ #if defined (__ppc__) || defined (__ppc64__) #include <ppc/limits.h> #elif defined (__i386__) #include <i386/limits.h> #else #error architecture not supported #endif $ grep '__DARWIN_CLK_TCK' /usr/include/i386/_limits.h #define __DARWIN_CLK_TCK 100 /* ticks per second */ MacOSXだと100かよ 手間かけさせがって(´・ω・`)ぶちころすぞ
おまいら釣られ過ぎwwwwww
釣り宣言か…
だからね、EBCDICのときみたく、さまざまな環境があるから 標準化されたものを使えって話だろ?それを知ってて わざとやっているのに、噛み付いてきてくれるから面白いんよw
はいはいわろすわろす
810 :
デフォルトの名無しさん :2007/06/23(土) 14:32:25
AをBで割ったときに余りがある場合にいろいろ表すのは (A % B)ですよね? 余りがない場合にいろいろ表すにはどうすればいいのですか? 日本語がよくわからなくてすみません ここにいるみなさんなら理解してくれることを祈ってます
if(A % B) printf("余ってるよ\n"); if(A % B == 0) printf("余ってねーよ\n");
812 :
デフォルトの名無しさん :2007/06/23(土) 14:39:30
C言語のコマンド辞典買おうと思っているんですけど 何がいいですか?アマゾンで見たら沢山あってどれにしようか迷ってます
「C言語のコマンド」って何よ?
816 :
813 :2007/06/23(土) 14:58:09
>>814 これは文字出力。これは○○関数でなにをする。
というやつです。あまり詳しくないので伝わらないかもしれませんが・・
ちなみに「C言語 辞典」で検索しました。
アマゾン以外でもお勧めの本があれば教えてください。
よろしくお願いします。
現在流通していて、アマゾンで検索できないような本なんてないだろ。 中古が欲しいなら話は別だが。
>>816 まぁ関数リファレンスかな?
ネットのサイトとかじゃなくて本じゃないとダメなの?
819 :
813 :2007/06/23(土) 15:07:49
回答ありがとうございます。 やはり本にしたほうが便利で、勉強もしやすいので本を買うことにしました。
僕が想像していたのは関数リファレンスっていうのみたいですね。 この名前で探してみます。ありがとうございます。
821 :
デフォルトの名無しさん :2007/06/23(土) 15:55:48
ループの中でgets()やscanf()のどちらか単品で使う場合は問題ないのですが for(i = 0; i < COUNT; i++){ printf("moji="); gets(str); printf("suuji="); scanf("%d",&a); } のように一緒に使うと何故か二回目のループでgets()がエンターを受け取ってscanf()に行ってしまうんですが これは何でなんでしょうか? 回避する方法はありませんか?
>>821 scanf()は数字を取得した後の改行を喰い残すので、
文字列もscanf()で取得するか逆にfgets()で取得した行をsscanf()/atoi()/strtol()で数値化するようにする。
なお、gets()は使ってはいけない関数の代表なので要注意。
>>822 そうなんですか
gets便利だったんですが使わない方がいいんですね
どうもでした
くだらないことで申し訳ないんですが、 配列の型にキャストすることって不可能ですよね?
>>824 知る範囲では出来ないなぁ・・・。
というか、ポインタで十分だから深く調べたことが無い。
>>825 どうもです
intのポインタをsizeofでint配列のポインタにキャストして逆参照したら
普通にその配列のサイズになって、ついでに興味がわいたもので…
配列へのポインタにならキャストできるけど。
分割コンパイルの学習中なのですが、外部変数の宣言と定義について混乱しています。 C言語FAQに以下の文があります。 ============ 1.7 まず、一つのグローバル(厳密にいえば外部(external))変数や関数に、 たくさんの"宣言"が(たくさんの変換単位に) 存在してもいいが、"定義"はただ一つしか存在してはならない。(定義とは実際に場所を確保する宣言で、初期値があ るときは初期値を与える。) ============ このことから、変数にextern指定子を付けると宣言になり、付けないと実体が生成されるので定義(同時に宣言)になる、 と理解しました。実験的に、以下のように宣言と定義を連続して行うと、複数の定義が存在することになるので、コンパイ ルエラーになると思いきや、問題なく通過してしまいました(gcc 3.4.6)。因みに分割コンパイルでも結果は同じです。 int n; int n; ただし、以下のように初期値を指定すると、当初の想定通り redefinition エラーになりました。 int n=0; int n=0; ということは、変数に初期値を設定することをもって"定義"というのでしょうか?
>>828 gccは勝手に二重定義を解決してしまう。
コンパイル時に-Wallとか付けると警告が出てるかもしれない。
gccでコンパイル通っても、C言語としては間違えてることは多い。
>gccは勝手に二重定義を解決してしまう。 これってどういうメリットがあるの? gdgdなオプソプロジェクトで無理やりコンパイル通すため?
>>801 どうでもいいかもしれませんが
亀ですが
BCC5.0だと double: 1000 でした
>>801 んじゃ俺も
VC++6.0
int 1000
>>828 > ということは、変数に初期値を設定することをもって"定義"というのでしょうか?
だいたい合っている。
int n;のように初期化子が無い定義は、「仮定義」と言い、
同じ変数の仮定義は、1つの翻訳単位(#includeなどが済んだソース)にいくらあっても構わない。
最終的に翻訳単位の中で初期化子のある定義が現れなかった(仮定義しか現れなかった)場合、
コンパイラは、その変数の定義が初期化子の無いものだったと認識する。
(そして0初期化されるようにする)
>>829 の話は、複数の翻訳単位にそれぞれ変数の定義(もしくは仮定義)が現れた場合の話。
>>824 こういうこと?
char *p;
((*)[8])p;
>>829 コンパイルは通って当たり前だけど、リンクではエラーが起きるよね。
>>835 そこでエラーを起こさないというのが、828の「二重定義を解決してしまう」ということなんだろうが
>>834 いえ、イメージとしては(int [10])のように配列の型自体にです
そんなことができる必要性まず無いでしょうけど、単に可能か不可能かと
可能ならどう記述するのか知りたかったので
838 :
デフォルトの名無しさん :2007/06/23(土) 19:23:39
数字の書かれているテキストファイルを読み込んで、その数字に1を加えた数を テキストファイルに出力するプログラムを作成したいので質問します。 こんな感じの実行で↓ [xxx@C]% type count.txt 3 [xxx@C]% count.exe [xxx@C]% type count.txt 4 自分で作ったソースはこんな感じなんですけど ファイルから数字として読み込む方法がわからないのでうまくいきません…。 もしよければ数字として読み込む方法教えてほしいです。 #include <stdio.h> int main(void){ FILE *fp; int c; if((fp=fopen("count.txt","r+"))==NULL){return -1;} c=fgets("count.txt",256,fp); c=c+1; fprintf(fp,"%d",c); fclose(fp); return 0;}
フローチャートが全然わからないんですけど、数学の勉強みたいに 最初から教えてくれるようなイイ参考書って知りませんか?
((*)[8])p; ←カワイイ
>>838 #include<stdio.h>
#include<stdlib.h>
int main()
{
FILE * fp = fopen("count.txt", "r+");
if (fp == NULL) return EXIT_FAILURE;
int count;
if (fscanf("fp, "%d", & count) < 1) return EXIT_FAILURE;
rewind(fp);
fprintf(fp, "%d\n", count + 1);
if (fclose(fp) < 0) return EXIT_FAILURE;
return EXIT_SUCCESS;
}
>>842 さんレスありがとうございます。
けどC言語はじめたばかりなんで、もしよければソースの解説できたら
お願いしたいです。もしよければお願いします。
844 :
デフォルトの名無しさん :2007/06/23(土) 19:54:56
C言語では、ヘッダファイルを二重にインクルードしても大丈夫ですか? 例えば、funcset.hで -------------------- #include "hoge.h" -------------------- のようにヘッダをインクルードします。 そして関数を実装するhoge.cで -------------------- #include "hoge.h" #include "funcset.h" -------------------- のようにヘッダをインクルードしても問題はありませんか? funcset.hでもhoge.hをインクルードしていることから、実質的に -------------------- #include "hoge.h" #include "hoge.h" -------------------- のようになってしまうと思うのですが・・・ ※実際には、 ※hoge.hでは#defineによる定数定義があります ※funcset.hでは他のヘッダファイルのインクルードがあります
スタックとキューを使った中置記法から高知記法への変換をやっていたのですが 演算子の順番でちょっと疑問があります。 中置記法で1 + 2 - 3だとすると後置記法では 1 2 3 - + と 1 2 + 3 - のどちらでも正しいような気がするのですが上、あるいは下は間違いになりますか? どのタイミングで出したほうがいいのか悩み中です・・・
>>844 大丈夫じゃない。だから二回以上インクルードしてもいいようにガードする
#ifndef hoge_h
#define hoge_h
hoge.hの中身
#endif /* hoge_h */
>>844 こういう記述があるので問題ない
#ifndef ヘッダ名 ヘッダ名が定義されていない場合に
#define ヘッダ名 ヘッダ名を定義
・・・・ endifまでを定義
#endif ここまで
この流れで#pragma onceマジオススメと言ったら蹴られますか
>>845 ん?後置記法なら「1 2 + 3 -」じゃないか?
1と2を足して3を引く
1 2 + 3 −
プログラミングを始めようと考えています。言語はCです。独学よりも、プログラミングの講座があるスクールなどに通った方がいいですか?
>>850 年齢による。
定年退職後の趣味でプログラミングを始めるとかであれば、スクールに通ったほうがいいかも
金銭的に余裕あるだろうし。
>>845 1 2 + 3 -
こっちが正解よ
1 2 3 - +
こっちだと 1 入れて 2 入れて 3で計算・・・って演算子ないじゃん
1 2 + 3 -
こっちなら
(x)1 入れて (y)2 入れて +で足して(x+y 結果はxに) (y)3 入れて 引く(x-y)
>>850 オレは独学だったけど、最大の壁は、ソースをコンパイルして実行するって段階で、それがクリアできたら
あとは、本のコードをひたすら入力して実行してって感じでおぼえられた。
スクールってのがいくらくらいかかるのかしらないけど、本なら10冊買っても、3万前後。
>>850 PCの使い方、特にファイル管理周りとコマンドプロンプトでまず落とし穴にはまりまくるから
その辺サポートしてくれる人がいないなら通ったほうがいいかもね。
試しに入門書買うか図書館で本一冊借りるかして独学でやってみるのもいいかも。
>>849 ,852
1 + 2 * 3
が
1 2 3 * +
みたいなノリで大丈夫かなとか思ったんですけど下が正しいんですねえ
ありがとうございました
856 :
デフォルトの名無しさん :2007/06/23(土) 20:35:03
今度大学の試験でjavaのコード書く筆記試験あんだけど Cしかやってなくて授業にあんま出てないんだけどCのやつ書いたら 何割ぐらい正解するかな?結構同じだよね
>>856 大学のレベルによるけど、JavaとCで一番大きな違いはclassじゃないかな?
そこだけ短期集中で学習すりゃOK
休日に試験ってことはないだろうから、2日もあればかなり勉強できるでしょ
>>857 サンクス。教科書見てもほとんどCと同じだから安心です。
試験前に集中してやってみます。if,while,演算しか出ないので大丈夫そうです
860 :
デフォルトの名無しさん :2007/06/23(土) 21:07:26
>>847 ありがとうございます。
各実装ファイル(*.c)でfuncset.hをインクルードする場合は
必ず一番最後になるようにして、
--------------------
#ifdef "hoge.h"
#define "hoge.h"
#endif
#ifdef "hoge2.h"
#define "hoge2.h"
#endif
--------------------
とすれば他は同じで大丈夫なわけですね?
861 :
デフォルトの名無しさん :2007/06/23(土) 21:10:34
>>846 ありがとうございます。
(下から更新分を見ているのでレス順が逆になってすみません。)
hoge_h というのは何なのでしょうか?
#ifdef〜#endifの存在は初めて知ったので・・・
もう少し使い方を調べてみます。
862 :
860-861 :2007/06/23(土) 21:14:28
すみません。 もしかして、 -------------------- #ifdef _HOGE_H #define _HOGE_H #define "hoge.h" #endif /* _HOGE_H */ -------------------- ということですか? でもこれだと必ずここを通過するように思えるのですが・・・ 最初は_HOGE_Hが定義されていないので・・・
たぶんhoge.hのことだと思うよ
>>862 そう、最初の一回はそこの中を通る
しかし、2回目以降は通らない
それで2度同じことを書いてはいけない記述も安心して書けるというわけだ
865 :
デフォルトの名無しさん :2007/06/23(土) 23:05:56
#include <stdio.h> #define MEMB_MAX 9 int main(void) { char name[MEMB_MAX][127]; double ave,rate[MEMB_MAX]; int i,j,k; ave = 0.0; for(i = 0; i < MEMB_MAX; i++){ printf("%d人目\n名前を入力:",i+1); scanf("%s",&name[i]); printf("打率を入力:"); scanf("%lf",&rate[i]); ave += rate[i]; } j = k = 0; for(i = 1; i < MEMB_MAX; i++){ if(rate[j] < rate[i]){ j = i; }else if(rate[k] > rate[i]){ k = i; } } printf("最高打率 選手名:%s 打率:%.4lf\n",name[j],rate[j]); printf("最低打率 選手名:%s 打率:%.4lf\n",name[k],rate[k]); printf("チーム打率:%0.4lf\n",ave/MEMB_MAX); return 0; } 学校のc言語の課題なんだけど、もうちょっとうまくかけないですかね? 自分ではこれ限界です OS:XP コンパイラ:Borland C++ Compiler 5.5
hoge.hのほうに記述する #ifdef HOGE_H #define HOGE_H extern int hoge_var; void hoge_func(); #endif /* HOGE_H */ [EOF] 詳細はインクルードガードで検索しとけ。 それから_で始まるのはシステム予約だから勝手定義しちゃ遺憾。
#include <stdio.h> #define MEMB_MAX 9 int main(void) { char name[MEMB_MAX][127]; double ave,rate[MEMB_MAX]; double best,worst; やばいめんどくさい まずベストとワーストに1人目を入れておいて そこから比較していって 交換しつつ9人目まで行けば ループ一つで済む
ポインタで p++; と *p++; の違いがよくわからないので教えてください…
>>829 おお、Wallオプションのことをすっかり忘れていました。同時にMakeの
勉強もしていたのだけど、ルールの変更をすっかり失念していました。
どうもありがとう。どうりでいつもよりワーニングが少なかったわけだ。
ただし、Wallオプションを付けても結果は同じでしたが……
>>833 「仮定義」「翻訳単位」という言葉は初めて知りました。大変参考にな
りました。まだ勉強期間は浅いものの、それなりに本は読んでいるので
すが、見たことがなかったなあ(憶えていないだけかな)。
>>835 コンパイル後のアセンブラコードを見ると、何重に定義していても解決
されていました。なのでリンクではエラーは出ないと思われます。
>>870 アセンブラコードってコンパイル後じゃなくてリンク後に吐き出されるんじゃないのか?
>>869 p++はポインタアドレスを返してからポインタアドレスをひとつすすめる
*p++はポインタ先を返してからポインタアドレスをひとつすすめる
>>872 なるほど!理解できました!レスサンクスです!!
874 :
デフォルトの名無しさん :2007/06/24(日) 02:41:47
char str[2][3][4];などの多次元配列を自作関数、仮引数として渡すにはどうしたらいいんでしょうか? void test(char *p); int main(void) { char str[2][3][4]; test(str); これだとエラーが出てしまってどうしたらいいのか困ってます
875 :
870 :2007/06/24(日) 02:42:03
>>871 そう言われると自信が無くなるけど、流れとしては プリプロセス->
コンパイル->アセンブル->リンク では無いのでしたっけ?
>>874 void test(char p[][3][4]);
最近のコンパイラなら、ニーモニックの出力は、中間表現から逆アセンブルしてるかもしれない。 ロケーションの解決済みの物なら、リンク後の出力だろうとおもう。
gcc -ansi -pedantic -Wall でやれば、かなり規格に厳密になるよ。
gcc -std=c99 -Wall -pedantic -O3 -Sしてアセンブリ出力を読めば万全。
882 :
870 :2007/06/24(日) 04:26:50
みなさんサンクス! 何気ない質問のつもりが、どえらい 勉強になりました m(__)m
C89派 vs C99派 の予感
仮定義はC99で削除されたとは思えないけど C++ではなくなっているが
for(;; a b) って 評価される順って b, aだよね?
エラー
a,b ってことならaが咲2巻落ちてこねー
>>665 足引っ張ってないで答えろ
それとも質問の意味わかってねーのか?
いやはや、お手上げですわ
質問です。 char s[80]; などととしてたとえば標準入力から"abc34fg"を読み込んだ後、 int a[10]; に a[0] = 3, a[1] = 4 のように数字だけ入れるにはどうすればいいでしょうか atoi では無理のようでした。とりあえず a[0] = s[3] - 48;とかで無理やりやってみたんですが 環境しだいでちがくなるならこれじゃまずいような気がするんですがいい方法が思いつきませんorz
1文字ずつ見ていって、数字ならaに入れていけばいい
#include <stdio.h> #include <process.h> //exit用 int main() { FILE *fp; char str[256]; fp = fopen("test.txt","r"); if (fp == NULL){ printf("オープン失敗"); exit(-1); } //ファイルの最後に達するまで繰り返す。 while(fscanf(fp, "%s", str) != EOF) printf(str); fclose(fp); return 0; } test.txtを開くためのプログラムなのですが、 Visual C++ 2005 Express Editionのデバッグなしで開始 では正常にオープンできるのですが コマンドプロントから開くと オープン失敗となってしまいます。 これは何がいけないのでしょうか?
>>891 s[3] が 3 の時にそのままいれても文字コード?が入るのか 51 が入ってしまいます
なので無理やり48引いてみたんですが
もっとスマートな方法ってないんでしょうか
>>894 おお なるほど!!こんな方法があったとは・・・
これからも精進します
ありがとうございました!
>>892 >fp = fopen("test.txt","r");
"test.txt"をフルパスで指定すりゃ良いんじゃない?
>>892 test.txtがカレントに無いだけじゃね?
>>896-897 やはりだめでした
ここら辺をかじりはじめたばかりなのでもう少し試行錯誤してみます。
ありがとうございました
899 :
デフォルトの名無しさん :2007/06/24(日) 14:58:17
質問です! 自作関数の中でmain関数を終了させることってできますか? 自作関数の中でgoto END;って記述して main関数の最後にEND:って記述したんですができるはずもなく・・・orz なにか方法はありませんか?
return 0;
exit
>>899 やりたいことはexit(0);だと思われ。
903 :
デフォルトの名無しさん :2007/06/24(日) 15:05:09
>>902 それを自作関数の中に記述すればいいんですか?
>>903 実験するなり、調べるなりした?
stdlib.hをincludeすれば使えるよ。
たぶん、やりたい動作になるはず。
905 :
デフォルトの名無しさん :2007/06/24(日) 15:10:58
実験しました! できましたありがとうございます!!
いやもしかすると、ある意味ゾンビプロセス化みたいにして main()を終了させて自作関数だけはそのまま実行したいのかもしれないw #gccの独自拡張使えば終了直前に呼ばれる静的関数に飛べばいけるかもw
>>906 そんなことも出来るんですか。なんかウィルスみたいですね
>>908 まぁ環境がlinux&gccとは限らないわけだが。
いうても標準関数なら大体同じだろうけど、
getchみたいな変なのだと、返って混乱する可能性が。
このスレッドレベル低いですねぇ^^
>>909 カレントで何がおかしいのか教えて貰えない?
もらえない。
俺も意味がわからない。 current directory のことではないの???
>>912 カレントディレクトリってのは現在(作業中)の開いているディレクトリといった意味があるが
実行プログラムや扱うファイルが カレントディレクトリ にあるとは限らないし
パスを指定してやりゃ済むってこと。んで、あのプログラムだとファイルの指定は
ファイル名のみになっているから、言うんであればその実行プログラムと同じディレクトリに
扱うファイルがおかれていないんではないか?ってくらいのことは言えるかと。
ダウンロード を ダウン と略すくらい気持ち悪いだけ 普通に検索に使える単語を使って欲しい
>>915 でも、その説明ではいかにもカレントが間違っているよ的な指摘をしている>909の真意がわからない・・・
>>915 一般的なシェルだとカレントディレクトリに実行ファイルが無い状態で、パス指定で実行した場合、
実行プログラム内でファイル名のみだと、カレントディレクトリを探しに行くと思うんだけど。
>>917 検索にもカレントで問題なくね?
ググッたら会社名が一番にヒットしたが、2番目にはカレントディレクトリがヒットしてるし。
ディレクトリとフォルダを混在して使用しているとこだってあるし、そんなに気持ち悪いかなぁ?
wikipediaをwikiと略されても(´ω`)キニシナーイ
( ^ω^ )こころ広いお
923 :
すなくらげ :2007/06/24(日) 18:17:24
C言語で今壁にぶち当たっています(;_;) 現在windows2000を使っているんですが、エスケープシーケンスがうまく動きません。 printf("\x01b[2J"); /*画面クリア*/ を実行したら ↓x01b[2J という処理結果になります。 いろいろ調べてみたんですが何をどうやってもダメでした。 windows2000でエスケープシーケンスを使うのはあきらめたほうがよいのでしょうか? ちなみに初心者なんで。。。 是非ご教授ください。
>>919 いいえ。一般的なシェルプログラムではカレントディレクトリに実行ファイルがあろうとなかろうと、
ファイル名のみかどうかに関わらず、一切頓着しません。
#つーか、シェルが実行モジュールの挙動に影響与えるわけじゃないので。
>>917 ダウンロードは一つの単語ですが、カレントディレクトリは二つの単語です。
#つまり、ダウンロードの「ダウン」は「ダウン」という単語ではありません。
>>915 「実行プログラムと同じディレクトリに扱うファイルが置かれていない」というよりは、
プログラムを実行したディレクトリにファイルが置かれていない」という方が無難な希ガス。
あきらまえたほうがいいです
DOSプロンプトを操作する類いの API を呼ぶか、 面倒臭いなら system("cls"); だな。
>>923 初心者なら、諦めた方がいいでしょう。「あきらまえたほうが」いいかどうかは知りませんが。
>>923 Cygwinのbash&gccならエスケープシーケンス使える。
そうじゃないなら一応エスケープシーケンス相当のAPIはあるけど
そのままってわけじゃないのであきらめたほうが無難。
>>892 ですが、解決しました。
コマンドプロントで、プログラムを実行する場所に移動してから実行しないとだめでした。
(以後カレントディレクトリをカレントと省略します。)
例
プログラム(c.exeとする)がC:\にありカレントがC:\tmpにありtest.txtはC:\にあるとします。
C:\temp>C:\c.exe
オープン失敗
text.exeがC:\tempにあると
その中身を開きました。
それからフルパス?の指定方法がわからないので感覚で書いてみたのですが
fp = fopen("test.txt","r");
を
fp = fopen("C:\test.txt","r");
これでよいのでしょうか?
これだとまったく読み込めませんでした。
>>929 バックスラッシュを文字列リテラル中に記述するときは、もう一つのバックスラッシュでエスケープしないとならない。
#面倒だったらスラッシュで代替してしまうのも一つの手。
931 :
ぴっころ :2007/06/24(日) 18:29:04
はじめまして。ぴっころです。 Cとは少し違うかもしれませんが、キャリフラグとオーバフローフラグ の違いを教えて頂けないでしょうか?
933 :
ぴっころ :2007/06/24(日) 18:31:35
ありがとうございます。 そちらに行ってみます。
934 :
919 :2007/06/24(日) 18:40:23
>>924 じゃあ、プログラムはどうやって「プログラム内の相対パスの基点」を得るの?
てっきりシェルがプログラムに渡してるんだと思ってた。
カレントディレクトリが/home/usrの状態で、/home/usr/bin/a.outを実行した時、
a.out内で「fopen("test.txt","r");」をすると、/home/usr/test.txtがオープンされるんだけども。
>>929 > プログラムを実行する場所に移動
要するに、カレントディレクトリを実行プログラムと扱うファイルが置かれているディレクトリに
移動させたってことだよね?まぁそれが分かればおk。俺が言いたかったカレントディレクトリと
実行プログラムの場所については、それで説明がつく。
>>924 は
> プログラムを実行したディレクトリ
その実行(のコマンド入力をした作業中のディレクトリ)との意味が分かっていないようだし
C言語の初心者が回答するスレはこちらですか?
>>934 それはね、シェルプログラムのカレントディレクトリがそのa.outに引き継がれるからよ。
あ、それをやってくれるのはカーネルであって、シェルプログラムじゃないからね。
>>935 あなたは、プログラムを実行したディレクトリとそのプログラムの置かれているディレクトリの区別はつきますか?
>>924 >>915 には実行プログラムと扱うファイルの場所について書いてあるよ。無駄口叩いて
無知を晒すくらいなら黙ってろよw
言葉だけで説明するからややこしい。 例を使えばいいのに。
実際問題、カレントディレクトってどうやってプログラムに渡されるの? 環境変数を見ればわかるだろうけど、そっからもらってるの?
イクザンプルやアナロジをみて分かった気になるんじゃぁぁないッ!
とりあえず環境がwindowsと予測して簡単な解決法だけ挙げておく windowsならGetModuleNameとsplitpathで楽に取得できる筈 どっちもtcharマクロにも対応してるし、C++が使えるなら適当にクラス組んでやれば そいつを窓口にしてエラー処理も含めて手軽に出来る 結局Boostとかポータブルなライブラリ使わない限りOS依存になっちゃうけどなー C言語でそういうのは寡聞にして知らないけど…
945 :
919 :2007/06/24(日) 19:14:08
>>937 なるほど。
納得しました。
まぁ、多分正しく理解出来てるかどうかは微妙だけど。
あとは自分で調べてみる。
946 :
デフォルトの名無しさん :2007/06/24(日) 19:52:06
すみません。独習Cの練習問題をやっていたところ、100の位置を示すfloat型(4バイト)のポインタpがあるときp = p + 2が実行された後 p の値はどうなるか?という問題で、108になると思い、ソースを書いて実行したところ102になってしまいました。練習問題の答えには108になると書いてあります。 ソースは↓です。VC++6.0で勉強中です。 #include <stdio.h> int main(void) { float *p, f; p = &f; printf("%p ", p); p = p + 2; // 8 増加する printf("%p ", p); return 0; } 実行結果↓ 0012FF68 0012FF70 よろしくお願いしますm(-_-)m
949 :
946 :2007/06/24(日) 19:56:23
>>947-948 さん
どうもありがとうございます。。そうですね。16進数で計算するんでした。。
すみませんでした。助かりました。
一次元配列、if文、繰り返しを使って*を表示させるプログラムは どう作ればいいんでしょうか? 配列[0]=> 3 Enter 配列[1]=> 2 Enter 配列[2]=> 1 Enter で 実行画面が↓の様になるプログラムです * * * * * *
>>943 独り言的な内容。本筋とは異なる話題や愚痴等を記述する場合に使われることが多い。
由来はなんかの言語かスクリプトで#以降がコメント扱いになるからだと思われ。
プログラム系の掲示板ではちょくちょく見る。
あとはあれか、誤字やtypoをsed風に修正する奴 s/ふいんき/ふんいき/ みたいな
>>943 ハッチサイン(#)は、Unix系スクリプトで一般的にコメントを指す記号として使われている。
そこから転じて、インターネット普及以前から「余談だが」などの意味合いで使われることが多い。
実際のスクリプト処理系では2バイト文字で書くことを認めているわけではないから、その点では>906は間違い。
#詳細は適当に検索して勝手に納得してくれ。
955 :
デフォルトの名無しさん :2007/06/24(日) 20:44:44
2進数には変換指示文字が無いのですか?
957 :
デフォルトの名無しさん :2007/06/24(日) 20:49:43
えええ… じゃあ10進数を2進数にして表示せよ!なんてのは出来ないのか…
>>957 作ってもたいしたことないしあきらめれ。
2進表示なんて見にくすぎて課題以外じゃありえん。
10進数 and 0x0008 10進数 and 0x0004 10進数 and 0x0002 10進数 and 0x0001 少しキモイがこういうので出来るんじゃないか
右シフトしながら1とandとれよ。
// 汎用関数を作ってみた。 static char * ltos(int number, int base, char * buf) { static const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; if (number / base) { buf = ltos(number / base, base, buf); } buf[0] = digits[number % base]; return buf + 1; } void ltostr(int number, int base, char * buf) { if (number < 0) { buf[0] = '-'; ltostr(-number, base, buf + 1); } else { ltos(number, base, buf)[0] = '\0'; } } // 使い方は、char buf[65]; ltostr(123, 2, buf);で。
>>957 #include <stdio.h>
int to_n_sinsu(int k, int n) {
char *c,num[]="0123456789ABCDEF";
char a[32]={'0'};
int i;
if(k<0 || n<0) return 1;
for(i=0; ; i++) {
a[i]=num[k%n];
k/=n;
if(k==0) break;
}
for(; i>=0; i--) {
putchar(a[i]);
}
}
int main(void) {
int k,n;
printf("10進数で基数を入力 > ");
scanf("%d",&k);
printf("何進数にしやすか? > ");
scanf("%d",&n);
printf("%d を %d 進数で表すと ",k ,n );
to_n_sinsu(k,n);
return 0;
}
うーん、せめてbaseが2以上36以下であることを確認しておくべきだったか。
1進数なんて・・・どう表現したらええんやろ、なんて無駄なことを考えてみたりw 1加えられると桁が上がって・・・無限に広がる?2進数が0と1なら1進数は0のみ?w
0:0 1:00 2:000 3:0000
2進表示は使い道あると思うけどな。 ハードに近いところとか、通信プロトコルとかのダンプ見るのに標準であったら便利だなと思うことあるでしょ
やっぱ、ビット演算子を使ってANDでチェックやな
>>962 -number
これはだめだよ。
正負の表現できる範囲が異なるときに、オーバーフローする。
くっ、境界条件に負けた。
int i=0,*x; x=(int *)malloc(sizeof(int)*10); while(i<10){ x[i]=1; i++; } このコードの後に、free(x)をすると、コンパイルは通りますが実行時にエラーが発生して、Freeの直前で強制終了してしまいます。 while文の中身が、たとえば *x=1; x++; i++; ならfree(x)が駄目なのは調べて分かりましたが、最初の場合もfreeは使えないのでしょうか?
なんか別の原因じゃねえの?
強制終了するプログラムを全部書け。 長ければアップローダーを使え。
というか、アップロード準備のための問題を単純化する作業で解決することが多い。
>>968 1進数は
0:
1: 1
2: 11
3: 111
というものだよ。
丁度指を折りながら数える感じの数え方だな。
まあ、2進数以上とは別の定義になるんだが。
>>980 桁の無いところは自由に 0 で埋めることができることを忘れてると思う。
指折り数えるのが2進数だったら、 0〜1023 まで数えられるな・・・。
いやだから(ネタとして)それっぽいって話じゃなかったのか まさかソースがうんぬん言われるとは思わなかった
1進数は別にネタじゃないんだが・・・
同じ人だと思ってたんだけど、違うのか?
同じ人かどうかは知らないが、 あの流れでなんでマジレスしようと思うのかがわからん
吹いてるみたいだけど、 実際の1進数も似たようなもんなんだよ、という話なんだが。
991 :
デフォルトの名無しさん :2007/06/25(月) 06:05:39
え?何々、また数学的な議論?1進数ってどうなのかと妄想した俺が発端?w やってやって、じゃんじゃんありもしない憶測や推論を出してgdgdな結論の出ない議論を 続けてぼくちんを楽しませてくれちゃって結構よん♪ C言語の宿題のスレじゃ、 0の0乗 0^0 = ? についてgdgdと泥沼化した議論がされたがw
横から水を差すタイプの人か・・・
スレ違いの話題で延々と議論するタイプの人か・・・
995 :
デフォルトの名無しさん :2007/06/25(月) 06:16:45
え?俺はもう1進数については議論をするつもりはないよw ありもしない妄想をぶっこくキモイ香具師の屁理屈、曲解理論を見て楽しむだけw
>>991 0^0 を眺めてたらヘッドホンに見えてきた
998 :
デフォルトの名無しさん :2007/06/25(月) 06:35:53
└0^0┘ ちっちっち、甘いぜ?あっちじゃ メガネ だったぜ
どうもすいま1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。